Merge "Separate select() parameter summary from detail"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 1 Aug 2014 22:49:36 +0000 (22:49 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 1 Aug 2014 22:49:36 +0000 (22:49 +0000)
721 files changed:
.jscsrc
CREDITS
RELEASE-NOTES-1.24
api.php
docs/export-0.9.xsd [new file with mode: 0644]
docs/export-demo.xml
docs/hooks.txt
docs/kss/Makefile
docs/kss/styleguide-template/index.html
docs/kss/styleguide-template/public/kss.less
img_auth.php
includes/AjaxDispatcher.php
includes/AjaxResponse.php
includes/AutoLoader.php
includes/Block.php
includes/CacheHelper.php [deleted file]
includes/CategoryViewer.php
includes/Categoryfinder.php
includes/ChangeTags.php
includes/Collation.php
includes/Cookie.php
includes/DefaultSettings.php
includes/EditPage.php
includes/Export.php
includes/Fallback.php
includes/Feed.php
includes/FeedUtils.php
includes/GitInfo.php
includes/GlobalFunctions.php
includes/HistoryBlob.php
includes/Hooks.php
includes/Html.php
includes/HtmlFormatter.php
includes/HttpFunctions.php
includes/Import.php
includes/Licenses.php
includes/Linker.php
includes/MWTimestamp.php
includes/MediaWiki.php
includes/Message.php
includes/OutputPage.php
includes/Pager.php
includes/Preferences.php
includes/PrefixSearch.php
includes/ProtectionForm.php
includes/Revision.php
includes/Sanitizer.php
includes/Setup.php
includes/SiteStats.php
includes/Skin.php
includes/SkinTemplate.php
includes/SquidPurgeClient.php
includes/Status.php
includes/StubObject.php
includes/Title.php
includes/User.php
includes/UserArrayFromResult.php
includes/UserMailer.php
includes/WebRequest.php
includes/WebResponse.php
includes/WebStart.php
includes/Xml.php
includes/actions/CachedAction.php
includes/actions/CreditsAction.php
includes/actions/HistoryAction.php
includes/actions/RawAction.php
includes/actions/RollbackAction.php
includes/api/ApiDelete.php
includes/api/ApiEditPage.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatJson.php
includes/api/ApiImageRotate.php
includes/api/ApiMain.php
includes/api/ApiParse.php
includes/api/ApiQuery.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryFilearchive.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiResult.php
includes/api/ApiRollback.php
includes/api/ApiUndelete.php
includes/cache/CacheDependency.php
includes/cache/CacheHelper.php [new file with mode: 0644]
includes/cache/LocalisationCache.php
includes/cache/MessageCache.php
includes/changes/EnhancedChangesList.php
includes/changes/RecentChange.php
includes/clientpool/RedisConnectionPool.php
includes/config/ConfigException.php
includes/config/ConfigFactory.php
includes/config/GlobalVarConfig.php
includes/content/ContentHandler.php
includes/content/CssContentHandler.php
includes/content/JavaScriptContentHandler.php
includes/content/MessageContent.php
includes/content/TextContent.php
includes/content/WikitextContent.php
includes/context/ContextSource.php
includes/context/DerivativeContext.php
includes/context/RequestContext.php
includes/db/Database.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/DatabaseSqlite.php
includes/db/DatabaseUtility.php
includes/db/IORMTable.php
includes/db/LBFactory.php
includes/db/LBFactoryMulti.php
includes/db/LoadBalancer.php
includes/db/ORMTable.php
includes/deferred/DataUpdate.php
includes/deferred/DeferredUpdates.php
includes/deferred/LinksUpdate.php
includes/deferred/SqlDataUpdate.php
includes/deferred/ViewCountUpdate.php
includes/diff/DifferenceEngine.php
includes/exception/BadTitleError.php
includes/exception/ErrorPageError.php
includes/externalstore/ExternalStore.php
includes/filebackend/FSFile.php
includes/filebackend/FSFileBackend.php
includes/filebackend/FileBackendStore.php
includes/filebackend/SwiftFileBackend.php
includes/filebackend/filejournal/FileJournal.php
includes/filebackend/lockmanager/DBLockManager.php
includes/filebackend/lockmanager/LockManagerGroup.php
includes/filebackend/lockmanager/MemcLockManager.php
includes/filebackend/lockmanager/RedisLockManager.php
includes/filerepo/FileRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/RepoGroup.php
includes/filerepo/file/ArchivedFile.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/filerepo/file/OldLocalFile.php
includes/gallery/ImageGalleryBase.php
includes/gallery/PackedImageGallery.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/HTMLSelectField.php
includes/installer/CliInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.php
includes/installer/LocalSettingsGenerator.php
includes/installer/MysqlInstaller.php
includes/installer/MysqlUpdater.php
includes/installer/PostgresInstaller.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerOutput.php
includes/installer/WebInstallerPage.php
includes/installer/i18n/ar.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/bn.json
includes/installer/i18n/br.json
includes/installer/i18n/bto.json
includes/installer/i18n/ca.json
includes/installer/i18n/ce.json
includes/installer/i18n/cs.json
includes/installer/i18n/de.json
includes/installer/i18n/en.json
includes/installer/i18n/es.json
includes/installer/i18n/fa.json
includes/installer/i18n/fi.json
includes/installer/i18n/fr.json
includes/installer/i18n/he.json
includes/installer/i18n/ia.json
includes/installer/i18n/it.json
includes/installer/i18n/ja.json
includes/installer/i18n/ko.json
includes/installer/i18n/lb.json
includes/installer/i18n/mk.json
includes/installer/i18n/ms.json
includes/installer/i18n/pl.json
includes/installer/i18n/pt.json
includes/installer/i18n/qqq.json
includes/installer/i18n/ru.json
includes/installer/i18n/sc.json
includes/installer/i18n/sco.json
includes/installer/i18n/sv.json
includes/installer/i18n/uk.json
includes/installer/i18n/zh-hans.json
includes/installer/i18n/zh-hant.json
includes/interwiki/Interwiki.php
includes/jobqueue/Job.php
includes/jobqueue/JobQueueFederated.php
includes/jobqueue/JobQueueRedis.php
includes/jobqueue/JobRunner.php [new file with mode: 0644]
includes/jobqueue/aggregator/JobQueueAggregatorMemc.php
includes/jobqueue/aggregator/JobQueueAggregatorRedis.php
includes/jobqueue/jobs/DuplicateJob.php
includes/jobqueue/jobs/NullJob.php
includes/jobqueue/jobs/UploadFromUrlJob.php
includes/libs/CSSJanus.php
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/logging/LogPage.php
includes/logging/LogPager.php
includes/media/Bitmap.php
includes/media/BitmapMetadataHandler.php
includes/media/DjVu.php
includes/media/DjVuImage.php
includes/media/Exif.php
includes/media/FormatMetadata.php
includes/media/IPTC.php
includes/media/Jpeg.php
includes/media/JpegMetadataExtractor.php
includes/media/MediaHandler.php
includes/media/MediaTransformOutput.php
includes/media/PNG.php
includes/media/PNGMetadataExtractor.php
includes/media/SVG.php
includes/media/XCF.php
includes/media/XMP.php
includes/objectcache/BagOStuff.php
includes/objectcache/SqlBagOStuff.php
includes/objectcache/WinCacheBagOStuff.php
includes/page/Article.php
includes/page/ImagePage.php
includes/page/WikiFilePage.php
includes/page/WikiPage.php
includes/parser/DateFormatter.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor_Hash.php
includes/password/BcryptPassword.php [new file with mode: 0644]
includes/password/EncryptedPassword.php [new file with mode: 0644]
includes/password/InvalidPassword.php [new file with mode: 0644]
includes/password/LayeredParameterizedPassword.php [new file with mode: 0644]
includes/password/MWOldPassword.php [new file with mode: 0644]
includes/password/MWSaltedPassword.php [new file with mode: 0644]
includes/password/ParameterizedPassword.php [new file with mode: 0644]
includes/password/Password.php [new file with mode: 0644]
includes/password/PasswordError.php [new file with mode: 0644]
includes/password/PasswordFactory.php [new file with mode: 0644]
includes/password/Pbkdf2Password.php [new file with mode: 0644]
includes/poolcounter/PoolCounter.php
includes/poolcounter/PoolCounterRedis.php
includes/profiler/Profiler.php
includes/profiler/ProfilerMwprof.php
includes/profiler/ProfilerStandard.php
includes/rcfeed/RCFeedEngine.php
includes/resourceloader/DerivativeResourceLoaderContext.php [new file with mode: 0644]
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderFilePath.php [new file with mode: 0644]
includes/resourceloader/ResourceLoaderLanguageNamesModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/revisiondelete/RevisionDeleter.php
includes/search/SearchHighlighter.php
includes/search/SearchResult.php
includes/site/MediaWikiSite.php
includes/site/Site.php
includes/site/SiteList.php
includes/site/SiteSQLStore.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/QueryPage.php
includes/specialpage/SpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialAllPages.php
includes/specials/SpecialBlock.php
includes/specials/SpecialCategories.php
includes/specials/SpecialChangePassword.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialExpandTemplates.php
includes/specials/SpecialExport.php
includes/specials/SpecialFileDuplicateSearch.php
includes/specials/SpecialFilepath.php
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListgrouprights.php
includes/specials/SpecialListusers.php
includes/specials/SpecialLog.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialMyLanguage.php [new file with mode: 0644]
includes/specials/SpecialPageLanguage.php
includes/specials/SpecialPagesWithProp.php
includes/specials/SpecialRandomInCategory.php
includes/specials/SpecialRandompage.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRecentchangeslinked.php
includes/specials/SpecialRedirect.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialRunJobs.php
includes/specials/SpecialSearch.php
includes/specials/SpecialTrackingCategories.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUploadStash.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWantedfiles.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
includes/title/MediaWikiPageLinkRenderer.php
includes/title/MediaWikiTitleCodec.php
includes/title/PageLinkRenderer.php
includes/title/TitleFormatter.php
includes/title/TitleParser.php
includes/title/TitleValue.php
includes/upload/UploadBase.php
includes/upload/UploadFromChunks.php
includes/upload/UploadStash.php
includes/utils/ArrayUtils.php
includes/utils/Cdb.php
includes/utils/CdbPHP.php
includes/utils/IP.php
includes/utils/MWCryptHKDF.php
includes/utils/MWCryptRand.php
includes/utils/MWFunction.php
includes/utils/StringUtils.php
includes/utils/UIDGenerator.php
includes/utils/ZipDirectoryReader.php
languages/Language.php
languages/classes/LanguageIu.php
languages/classes/LanguageKk.php
languages/classes/LanguageKu.php
languages/classes/LanguageShi.php
languages/classes/LanguageSr.php
languages/i18n/af.json
languages/i18n/ar.json
languages/i18n/arq.json
languages/i18n/ast.json
languages/i18n/az.json
languages/i18n/ba.json
languages/i18n/bar.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/cdo.json
languages/i18n/ce.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/egl.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gan-hant.json
languages/i18n/gl.json
languages/i18n/hak.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/ilo.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/kk-cyrl.json
languages/i18n/ko.json
languages/i18n/ku-latn.json
languages/i18n/la.json
languages/i18n/lb.json
languages/i18n/lrc.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/mzn.json
languages/i18n/nan.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/ru.json
languages/i18n/sc.json
languages/i18n/sco.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/szl.json
languages/i18n/ta.json
languages/i18n/th.json
languages/i18n/tr.json
languages/i18n/uk.json
languages/i18n/vi.json
languages/i18n/wuu.json
languages/i18n/yi.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesCrh_cyrl.php
languages/messages/MessagesCrh_latn.php
languages/messages/MessagesCs.php
languages/messages/MessagesDsb.php
languages/messages/MessagesEn.php
languages/messages/MessagesFa.php
languages/messages/MessagesFrp.php
languages/messages/MessagesHsb.php
languages/messages/MessagesKk_arab.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKk_latn.php
languages/messages/MessagesKsh.php
languages/messages/MessagesLzh.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesOs.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSv.php
languages/messages/MessagesTt_cyrl.php
languages/messages/MessagesTt_latn.php
maintenance/README
maintenance/archives/patch-il_from_namespace.sql [new file with mode: 0644]
maintenance/archives/patch-pl_from_namespace.sql [new file with mode: 0644]
maintenance/archives/patch-tl_from_namespace.sql [new file with mode: 0644]
maintenance/compareParserCache.php
maintenance/deleteEqualMessages.php
maintenance/dictionary/mediawiki.dic
maintenance/doMaintenance.php
maintenance/edit.php
maintenance/eraseArchivedFile.php
maintenance/fixDoubleRedirects.php
maintenance/generateJsonI18n.php
maintenance/importDump.php
maintenance/importTextFile.php [deleted file]
maintenance/install.php
maintenance/language/generateCollationData.php
maintenance/populateBacklinkNamespace.php [new file with mode: 0644]
maintenance/postgres/tables.sql
maintenance/purgeChangedPages.php
maintenance/resources/update-oojs-ui.sh
maintenance/resources/update-oojs.sh
maintenance/runJobs.php
maintenance/tables.sql
maintenance/wrapOldPasswords.php [new file with mode: 0644]
mw-config/index.php
resources/Resources.php
resources/lib/jquery/jquery.cookie.js
resources/lib/oojs-ui/i18n/ast.json
resources/lib/oojs-ui/i18n/ca.json
resources/lib/oojs-ui/i18n/en.json
resources/lib/oojs-ui/i18n/es.json
resources/lib/oojs-ui/i18n/ilo.json
resources/lib/oojs-ui/i18n/ms.json
resources/lib/oojs-ui/i18n/nb.json
resources/lib/oojs-ui/i18n/om.json
resources/lib/oojs-ui/i18n/qqq.json
resources/lib/oojs-ui/i18n/sl.json
resources/lib/oojs-ui/i18n/tr.json
resources/lib/oojs-ui/i18n/yi.json
resources/lib/oojs-ui/i18n/zh-hant.json
resources/lib/oojs-ui/images/anchor.svg
resources/lib/oojs-ui/images/icons/accept.svg
resources/lib/oojs-ui/images/icons/add-item.svg
resources/lib/oojs-ui/images/icons/advanced.svg
resources/lib/oojs-ui/images/icons/alert.svg
resources/lib/oojs-ui/images/icons/arched-arrow-ltr.svg
resources/lib/oojs-ui/images/icons/arched-arrow-rtl.svg
resources/lib/oojs-ui/images/icons/clear.svg
resources/lib/oojs-ui/images/icons/close.svg
resources/lib/oojs-ui/images/icons/collapse.svg
resources/lib/oojs-ui/images/icons/comment.svg
resources/lib/oojs-ui/images/icons/expand.svg
resources/lib/oojs-ui/images/icons/help.svg
resources/lib/oojs-ui/images/icons/history.svg
resources/lib/oojs-ui/images/icons/info.svg
resources/lib/oojs-ui/images/icons/link.svg
resources/lib/oojs-ui/images/icons/menu.svg
resources/lib/oojs-ui/images/icons/move-ltr.svg
resources/lib/oojs-ui/images/icons/move-rtl.svg
resources/lib/oojs-ui/images/icons/picture.svg
resources/lib/oojs-ui/images/icons/remove-item.svg
resources/lib/oojs-ui/images/icons/remove.svg
resources/lib/oojs-ui/images/icons/search.svg
resources/lib/oojs-ui/images/icons/settings.svg
resources/lib/oojs-ui/images/icons/tag.svg
resources/lib/oojs-ui/images/icons/window.svg
resources/lib/oojs-ui/images/indicators/alert.svg
resources/lib/oojs-ui/images/indicators/arrow-down.svg
resources/lib/oojs-ui/images/indicators/arrow-up.svg
resources/lib/oojs-ui/oojs-ui-agora.css
resources/lib/oojs-ui/oojs-ui-agora.rtl.css [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui-apex.css
resources/lib/oojs-ui/oojs-ui-apex.rtl.css [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/oojs-ui.rtl.css [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui.svg.css
resources/lib/oojs-ui/oojs-ui.svg.rtl.css [new file with mode: 0644]
resources/lib/oojs/oojs.jquery.js [new file with mode: 0644]
resources/lib/oojs/oojs.js [deleted file]
resources/src/jquery.ui-themes/vector/images/close.png [deleted file]
resources/src/jquery.ui-themes/vector/images/titlebar-fade.png [deleted file]
resources/src/jquery.ui-themes/vector/images/ui-anim_basic_16x16.gif [deleted file]
resources/src/jquery.ui-themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png [deleted file]
resources/src/jquery.ui-themes/vector/images/ui-bg_flat_70_000000_40x100.png [deleted file]
resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png [deleted file]
resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png [deleted file]
resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png [deleted file]
resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png [deleted file]
resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png [deleted file]
resources/src/jquery.ui-themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png [deleted file]
resources/src/jquery.ui-themes/vector/images/ui-icons_2694e8_256x240.png [deleted file]
resources/src/jquery.ui-themes/vector/images/ui-icons_2e83ff_256x240.png [deleted file]
resources/src/jquery.ui-themes/vector/images/ui-icons_3d80b3_256x240.png [deleted file]
resources/src/jquery.ui-themes/vector/images/ui-icons_666666_256x240.png [deleted file]
resources/src/jquery.ui-themes/vector/images/ui-icons_72a7cf_256x240.png [deleted file]
resources/src/jquery.ui-themes/vector/images/ui-icons_ffffff_256x240.png [deleted file]
resources/src/jquery.ui-themes/vector/jquery.ui.accordion.css [deleted file]
resources/src/jquery.ui-themes/vector/jquery.ui.autocomplete.css [deleted file]
resources/src/jquery.ui-themes/vector/jquery.ui.button.css [deleted file]
resources/src/jquery.ui-themes/vector/jquery.ui.core.css [deleted file]
resources/src/jquery.ui-themes/vector/jquery.ui.datepicker.css [deleted file]
resources/src/jquery.ui-themes/vector/jquery.ui.dialog.css [deleted file]
resources/src/jquery.ui-themes/vector/jquery.ui.progressbar.css [deleted file]
resources/src/jquery.ui-themes/vector/jquery.ui.resizable.css [deleted file]
resources/src/jquery.ui-themes/vector/jquery.ui.selectable.css [deleted file]
resources/src/jquery.ui-themes/vector/jquery.ui.slider.css [deleted file]
resources/src/jquery.ui-themes/vector/jquery.ui.tabs.css [deleted file]
resources/src/jquery.ui-themes/vector/jquery.ui.theme.css [deleted file]
resources/src/jquery/jquery.accessKeyLabel.js
resources/src/jquery/jquery.colorUtil.js
resources/src/jquery/jquery.makeCollapsible.js
resources/src/jquery/jquery.textSelection.js
resources/src/mediawiki.action/mediawiki.action.edit.editWarning.js
resources/src/mediawiki.language/languages/la.js
resources/src/mediawiki.less/mediawiki.ui/mixins.less
resources/src/mediawiki.page/mediawiki.page.image.pagination.js
resources/src/mediawiki.skinning/content.parsoid.less
resources/src/mediawiki.special/mediawiki.special.userlogin.common.js
resources/src/mediawiki.ui/components/anchors.less [new file with mode: 0644]
resources/src/mediawiki.ui/components/buttons.less
resources/src/mediawiki.ui/components/checkbox.less [new file with mode: 0644]
resources/src/mediawiki.ui/components/forms.less
resources/src/mediawiki.ui/components/images/checked.png [new file with mode: 0644]
resources/src/mediawiki.ui/components/images/checked.svg [new file with mode: 0644]
resources/src/mediawiki.ui/components/inputs.less [new file with mode: 0644]
resources/src/mediawiki.ui/components/utilities.less
resources/src/mediawiki.ui/default.less
resources/src/mediawiki/mediawiki.feedback.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.user.js
skins/MonoBook/i18n/ast.json
skins/MonoBook/i18n/da.json
skins/MonoBook/i18n/et.json
skins/MonoBook/i18n/he.json
skins/MonoBook/i18n/hi.json
skins/MonoBook/i18n/ilo.json [new file with mode: 0644]
skins/MonoBook/i18n/ms.json
skins/MonoBook/main.css
skins/Vector/Vector.php
skins/Vector/VectorTemplate.php
skins/Vector/components/common.less
skins/Vector/components/notifications.less [deleted file]
skins/Vector/components/tabs.less
skins/Vector/i18n/ast.json
skins/Vector/i18n/bs.json
skins/Vector/i18n/bto.json [new file with mode: 0644]
skins/Vector/i18n/da.json
skins/Vector/i18n/et.json
skins/Vector/i18n/he.json
skins/Vector/i18n/hi.json
skins/Vector/i18n/hy.json
skins/Vector/i18n/ilo.json
skins/Vector/i18n/lv.json
skins/Vector/i18n/ms.json
skins/Vector/i18n/mt.json
skins/Vector/i18n/sc.json
skins/Vector/i18n/sl.json
skins/Vector/skinStyles/jquery.tipsy.less [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/images/close.png [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/images/titlebar-fade.png [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/images/ui-anim_basic_16x16.gif [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/images/ui-bg_flat_15_cd0a0a_40x100.png [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/images/ui-bg_flat_70_000000_40x100.png [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_100_ffffff_1x100.png [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_25_ffef8f_1x100.png [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/images/ui-bg_inset-hard_100_f0f0f0_1x100.png [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/images/ui-icons_2694e8_256x240.png [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/images/ui-icons_2e83ff_256x240.png [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/images/ui-icons_3d80b3_256x240.png [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/images/ui-icons_666666_256x240.png [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/images/ui-icons_72a7cf_256x240.png [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/images/ui-icons_ffffff_256x240.png [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/jquery.ui.accordion.css [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/jquery.ui.autocomplete.css [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/jquery.ui.button.css [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/jquery.ui.core.css [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/jquery.ui.datepicker.css [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/jquery.ui.dialog.css [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/jquery.ui.progressbar.css [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/jquery.ui.resizable.css [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/jquery.ui.selectable.css [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/jquery.ui.slider.css [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/jquery.ui.tabs.css [new file with mode: 0644]
skins/Vector/skinStyles/jquery.ui/jquery.ui.theme.css [new file with mode: 0644]
skins/Vector/skinStyles/mediawiki.notification.less [new file with mode: 0644]
skins/Vector/skinStyles/mediawiki.special.less [new file with mode: 0644]
skins/Vector/skinStyles/mediawiki.special.preferences.less [new file with mode: 0644]
skins/Vector/special.less [deleted file]
skins/Vector/special.preferences.less [deleted file]
skins/common/commonElements.css
skins/common/config.css
skins/common/shared.css
tests/TestsAutoLoader.php
tests/browser/README.mediawiki
tests/frontend/Gruntfile.js
tests/frontend/package.json
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/parserTests.php
tests/phpunit/LessFileCompilationTest.php
tests/phpunit/MediaWikiPHPUnitTestListener.php
tests/phpunit/MediaWikiPasswordTestCase.php [new file with mode: 0644]
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/ArrayUtilsTest.php
tests/phpunit/includes/EditPageTest.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php
tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php
tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php
tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php
tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php
tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php
tests/phpunit/includes/GlobalFunctions/wfParseUrlTest.php
tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php
tests/phpunit/includes/GlobalFunctions/wfShellExecTest.php [new file with mode: 0644]
tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php
tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
tests/phpunit/includes/HtmlFormatterTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/ImportTest.php
tests/phpunit/includes/LinksUpdateTest.php
tests/phpunit/includes/MWNamespaceTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/MimeMagicTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/PasswordTest.php [new file with mode: 0644]
tests/phpunit/includes/SanitizerValidateEmailTest.php
tests/phpunit/includes/StatusTest.php
tests/phpunit/includes/TimeAdjustTest.php
tests/phpunit/includes/TitleMethodsTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/WebRequestTest.php
tests/phpunit/includes/actions/ActionTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/format/ApiFormatJsonTest.php
tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
tests/phpunit/includes/changes/OldChangesListTest.php [new file with mode: 0644]
tests/phpunit/includes/changes/RCCacheEntryFactoryTest.php
tests/phpunit/includes/changes/TestRecentChangesHelper.php [new file with mode: 0644]
tests/phpunit/includes/config/ConfigFactoryTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/debug/MWDebugTest.php
tests/phpunit/includes/diff/ArrayDiffFormatterTest.php
tests/phpunit/includes/exception/MWExceptionHandlerTest.php
tests/phpunit/includes/filerepo/RepoGroupTest.php
tests/phpunit/includes/filerepo/file/FileTest.php
tests/phpunit/includes/filerepo/files/FileTest.php [deleted file]
tests/phpunit/includes/libs/CSSJanusTest.php
tests/phpunit/includes/media/DjVuTest.php
tests/phpunit/includes/media/MediaWikiMediaTestCase.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/includes/password/BcryptPasswordTest.php [new file with mode: 0644]
tests/phpunit/includes/password/LayeredParameterizedPasswordTest.php [new file with mode: 0644]
tests/phpunit/includes/password/Pbkdf2PasswordTest.php [new file with mode: 0644]
tests/phpunit/includes/poolcounter/PoolCounterTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/site/TestSites.php
tests/phpunit/includes/specials/SpecialListFilesTest.php
tests/phpunit/includes/specials/SpecialMyLanguageTest.php [new file with mode: 0644]
tests/phpunit/includes/title/MediaWikiPageLinkRendererTest.php
tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/maintenance/MaintenanceTest.php
tests/phpunit/maintenance/fetchTextTest.php
tests/phpunit/phpunit.php
tests/phpunit/structure/ResourcesTest.php
tests/phpunit/suites/UploadFromUrlTestSuite.php
tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
tests/testHelpers.inc
thumb.php

diff --git a/.jscsrc b/.jscsrc
index 0da9aa5..b9139b2 100644 (file)
--- a/.jscsrc
+++ b/.jscsrc
@@ -1,94 +1,10 @@
 {
-    "requireCurlyBraces": [
-        "if",
-        "else",
-        "for",
-        "while",
-        "do",
-        "try",
-        "catch"
-    ],
-    "requireSpaceAfterKeywords": [
-        "if",
-        "else",
-        "for",
-        "while",
-        "do",
-        "switch",
-        "return",
-        "try",
-        "catch",
-        "function"
-    ],
-    "requireSpaceBeforeBlockStatements": true,
-    "requireParenthesesAroundIIFE": true,
-    "requireSpacesInConditionalExpression": true,
-    "disallowSpacesInNamedFunctionExpression": {
-        "beforeOpeningRoundBrace": true
-    },
-    "disallowSpacesInFunctionDeclaration": {
-        "beforeOpeningRoundBrace": true
-    },
-    "requireMultipleVarDecl": "onevar",
-    "requireBlocksOnNewline": 1,
-    "disallowEmptyBlocks": true,
-    "requireSpacesInsideObjectBrackets": "all",
-    "disallowSpaceAfterObjectKeys": true,
-    "requireCommaBeforeLineBreak": true,
-    "disallowSpaceAfterPrefixUnaryOperators": [
-        "++",
-        "--",
-        "+",
-        "-",
-        "~",
-        "!"
-    ],
-    "disallowSpaceBeforePostfixUnaryOperators": [
-        "++",
-        "--"
-    ],
-    "disallowSpaceBeforeBinaryOperators": [
-        ","
-    ],
-    "requireSpaceBeforeBinaryOperators": [
-        "=",
-        "+",
-        "-",
-        "/",
-        "*",
-        "==",
-        "===",
-        "!=",
-        "!==",
-        ">",
-        ">=",
-        "<",
-        "<="
-    ],
-    "requireSpaceAfterBinaryOperators": [
-        "=",
-        "+",
-        "-",
-        "/",
-        "*",
-        "==",
-        "===",
-        "!=",
-        "!==",
-        ">",
-        ">=",
-        "<",
-        "<="
-    ],
-    "disallowKeywords": [ "with" ],
-    "disallowMultipleLineBreaks": true,
-    "validateLineBreaks": "LF",
-    "validateQuoteMarks": "'",
-    "disallowMixedSpacesAndTabs": true,
-    "disallowTrailingWhitespace": true,
-    "disallowTrailingComma": true,
-    "requireLineFeedAtFileEnd": true,
-    "requireCapitalizedConstructors": true,
-    "requireDotNotation": true,
-    "disallowYodaConditions": true
+       "preset": "wikimedia",
+
+       "disallowDanglingUnderscores": null,
+       "disallowKeywordsOnNewLine": null,
+       "disallowQuotedKeysInObjects": null,
+       "requireCamelCaseOrUpperCaseIdentifiers": null,
+       "requireSpacesInsideArrayBrackets": null,
+       "validateIndentation": null
 }
diff --git a/CREDITS b/CREDITS
index cf222a0..776e51b 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -131,6 +131,7 @@ following names for their contribution to the product.
 * Elvis Stansvik
 * Eranroz
 * Erwin Dokter
+* Étienne Beaulé
 * Federico Leva
 * FunPika
 * fomafix
@@ -157,6 +158,7 @@ following names for their contribution to the product.
 * Kim Hyun-Joon
 * Lee Worden
 * Lejonel
+* Leon Liesener
 * liangent
 * Louperivois
 * Lucas Garczewski
index dbc1214..ec4bc0f 100644 (file)
@@ -12,6 +12,11 @@ production.
 * MediaWiki will no longer run if register_globals is enabled. It has been
   deprecated for 5 years now, and was removed in PHP 5.4. For more information
   about why, see <https://www.mediawiki.org/wiki/register_globals>.
+* MediaWiki now requires PHP's iconv extension. openSUSE users may need to
+  install the php5-iconv package. Users of other systems may need to add
+  extension=iconv.so to php.ini or recompile PHP without --without-iconv.
+* MediaWiki will no longer function if magic quotes are enabled. It has
+  been deprecated for 5 years now, and was removed in PHP 5.4.
 * The server's canonical hostname is available as $wgServerName, which is
   exposed in both mw.config and ApiQuerySiteInfo.
 * Introduced $wgPagePropsHaveSortkey as a backwards-compatibility switch,
@@ -37,6 +42,9 @@ production.
   configurations are $wgDeletedDirectory and $wgHashedUploadDirectory.
 * The deprecated $wgUseCommaCount variable has been removed.
 * $wgEnableSorbs and $wgSorbsUrl have been removed.
+* The UserCryptPassword and UserComparePassword hooks are no longer called. Any extensions
+  using them must be updated to use the Password Hashing API.
+* $wgCompiledFiles has been removed.
 
 === New features in 1.24 ===
 * Added a new hook, "WhatLinksHereProps", to allow extensions to annotate
@@ -115,7 +123,24 @@ production.
 * (bug 67042) Added support for the HTML5 <rtc> tag for East Asian typography.
 * Upgrade Sinon.JS to 1.10.3.
 * Added the es5-shim polyfill for older or non-compliant javascript engines.
-* Upgrade jQuery Cookie to v1.2.0.
+* Upgrade jQuery Cookie to v1.3.1.
+* (bug 20476) Add a "viewsuppressed" user right to be able to view
+  suppressed content but not suppress it ("suppressrevision" right).
+* (bug 66440) The MediaWiki web installer will now allow you to choose the skins
+  to enable (from the ones included in download tarball) and decide which one
+  should be the default.
+* (bug 68085) Links of the form [[localInterwikiPrefix:languageCode:pageTitle]],
+  where localInterwikiPrefix is a member of the $wgLocalInterwikis array, will
+  no longer be displayed in the sidebar when $wgInterwikiMagic is true.
+* New special page, MyLanguages, to redirect users to subpages with localised
+  versions of a page. (Integrated from Extension:Translate)
+* MediaWiki now supports multiple password types, including bcrypt and PBKDF2.
+  The default type can be changed with $wgPasswordDefault and the type
+  configurations can be changed with $wgPasswordConfig.
+* Skins can now define custom styles for default ResourceLoader modules using
+  the $wgResourceModuleSkinStyles global. See the Vector skin for examples.
+* (bug 4488) There is now a preference to watch pages where the user has
+  rollbacked an edit by default.
 
 === Bug fixes in 1.24 ===
 * (bug 49116) Footer copyright notice is now always displayed in user language
@@ -142,6 +167,9 @@ production.
 * (bug 65757) MSSQL: Update script drops unnamed constraints to be prepared
   for future updates. Because it's doing so heuristically, it may fail or drop
   wrong constraints.
+* (bug 67870) wfShellExec() cuts off stdout at multiples of 8192 bytes.
+* $wgRunJobsAsync now works with private wikis (e.g. read requires login).
+* (bugs 57238, 65206) Blank pages can now be directly created.
 
 === Web API changes in 1.24 ===
 * action=parse API now supports prop=modules, which provides the list of
@@ -249,6 +277,20 @@ changes to languages because of Bugzilla reports.
 * Removed AjaxAddScript which has been obsolete since ResourceLoader and
   is unused by any modern extension.
 * Removed maintenance/nextJobDB.php; no longer in use.
+* Removed global function wfViewPrevNext(). (deprecated since 1.19)
+* Removed global function xmlsafe() from Export.php. (moved to OAIRepo extension)
+* Removed Title::userCanRead(). (deprecated since 1.19)
+* Removed maintenance script importTextFile.php. Use edit.php script instead.
+* A _from_namespace field has been added to the templatelinks, pagelinks,
+  and filelinks tables. Run update.php to apply this change to the schema.
+* Removed File::sha1Base36(). (deprecated since 1.19)
+* Removed File::getPropsFromPath(). (deprecated since 1.19)
+* Removed functions blockedPage(), noCreatePermission(), readOnlyPage() and
+  userNotLoggedInPage() from EditPage.php. (deprecated since 1.19)
+* Removed functions getContent(), getPreloadedText(), mergeChangesInto() and
+  setPreloadedText() from EditPage.php. (deprecated since 1.21)
+* Removed global functions wfArrayLookup(), wfArrayMerge(), wfDebugDieBacktrace()
+  and wfTime(). (deprecated since 1.22)
 
 ==== Renamed classes ====
 * CLDRPluralRuleConverter_Expression to CLDRPluralRuleConverterExpression
@@ -293,6 +335,10 @@ changes to languages because of Bugzilla reports.
 * WatchlistEditor - Use SpecialEditWatchlist directly
 * FormatExif - Use FormatMetadata directly
 * RevertFileAction - Use RevertAction directly
+* HistoryPage - Use HistoryAction directly
+* RawPage - Use RawAction directly
+* StubContLang - Use Language::factory() instead
+* XMLReader2 - Use XMLReader directly
 
 == Compatibility ==
 
diff --git a/api.php b/api.php
index e8a911e..2a6a095 100644 (file)
--- a/api.php
+++ b/api.php
@@ -104,12 +104,17 @@ if ( $wgAPIRequestLog ) {
                wfTimestamp( TS_MW ),
                $endtime - $starttime,
                $wgRequest->getIP(),
-               $_SERVER['HTTP_USER_AGENT']
+               $wgRequest->getHeader( 'User-agent' )
        );
        $items[] = $wgRequest->wasPosted() ? 'POST' : 'GET';
        if ( $processor ) {
-               $module = $processor->getModule();
-               if ( $module->mustBePosted() ) {
+               try {
+                       $manager = $processor->getModuleManager();
+                       $module = $manager->getModule( $wgRequest->getVal( 'action' ), 'action' );
+               } catch ( Exception $ex ) {
+                       $module = null;
+               }
+               if ( !$module || $module->mustBePosted() ) {
                        $items[] = "action=" . $wgRequest->getVal( 'action' );
                } else {
                        $items[] = wfArrayToCgi( $wgRequest->getValues() );
diff --git a/docs/export-0.9.xsd b/docs/export-0.9.xsd
new file mode 100644 (file)
index 0000000..d5e7b99
--- /dev/null
@@ -0,0 +1,292 @@
+<?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.
+
+       Version 0.7 adds a unique identity constraint for both page and
+       revision identifiers. See also bug 4220.
+       Fix type for <ns> from "positiveInteger" to "nonNegativeInteger" to allow 0
+       Moves <logitem> to its right location.
+       Add parentid to revision.
+       Fix type for <id> within <contributor> to "nonNegativeInteger"
+
+       Version 0.8 adds support for a <model> and a <format> tag for
+       each revision. See contenthandler.txt.
+
+       Version 0.9 adds the database name to the site information.
+
+       The canonical URL to the schema document is:
+       http://www.mediawiki.org/xml/export-0.9.xsd
+
+       Use the namespace:
+       http://www.mediawiki.org/xml/export-0.9/
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+               xmlns:mw="http://www.mediawiki.org/xml/export-0.9/"
+               targetNamespace="http://www.mediawiki.org/xml/export-0.9/"
+               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">
+               <!-- Page ID contraint, see bug 4220 -->
+               <unique name="PageIDConstraint">
+                       <selector xpath="mw:page" />
+                       <field xpath="mw:id" />
+               </unique>
+               <!-- Revision ID contraint, see bug 4220 -->
+               <unique name="RevIDConstraint">
+                       <selector xpath="mw:page/mw:revision" />
+                       <field xpath="mw:id" />
+               </unique>
+       </element>
+
+       <complexType name="MediaWikiType">
+               <sequence>
+                       <element name="siteinfo" type="mw:SiteInfoType"
+                                        minOccurs="0" maxOccurs="1" />
+                       <element name="page" type="mw:PageType"
+                                        minOccurs="0" maxOccurs="unbounded" />
+                       <element name="logitem" type="mw:LogItemType"
+                                        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="dbname" 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="RedirectType">
+               <simpleContent>
+                       <extension base="string">
+                               <attribute name="title" type="string" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <simpleType name="ContentModelType">
+               <restriction base="string">
+                       <pattern value="[a-zA-Z][-+./a-zA-Z0-9]*" />
+               </restriction>
+       </simpleType>
+
+       <simpleType name="ContentFormatType">
+               <restriction base="string">
+                       <pattern value="[a-zA-Z][-+.a-zA-Z0-9]*/[a-zA-Z][-+.a-zA-Z0-9]*" />
+               </restriction>
+       </simpleType>
+
+       <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="nonNegativeInteger" />
+
+                       <!-- optional page ID number -->
+                       <element name="id" type="positiveInteger" />
+
+                       <!-- flag if the current revision is a redirect -->
+                       <element name="redirect" type="mw:RedirectType" minOccurs="0" maxOccurs="1" />
+
+                       <!-- 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" />
+                       </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" />
+                       <element name="parentid" type="positiveInteger" minOccurs="0" />
+                       <element name="timestamp" type="dateTime" />
+                       <element name="contributor" type="mw:ContributorType" />
+                       <element name="minor" minOccurs="0" maxOccurs="1" />
+                       <element name="comment" type="mw:CommentType" minOccurs="0" maxOccurs="1" />
+                       <element name="text" type="mw:TextType" />
+                       <element name="sha1" type="string" />
+                       <element name="model" type="mw:ContentModelType" />
+                       <element name="format" type="mw:ContentFormatType" />
+               </sequence>
+       </complexType>
+
+       <complexType name="LogItemType">
+               <sequence>
+                       <element name="id" type="positiveInteger" />
+                       <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:LogTextType" minOccurs="0" maxOccurs="1" />
+                       <element name="logtitle" type="string" minOccurs="0" maxOccurs="1" />
+                       <element name="params" type="mw:LogParamsType" minOccurs="0" maxOccurs="1" />
+               </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="LogTextType">
+               <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="LogParamsType">
+               <simpleContent>
+                       <extension base="string">
+                               <attribute ref="xml:space" use="optional" default="preserve" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <complexType name="ContributorType">
+               <sequence>
+                       <element name="username" type="string" minOccurs="0" />
+                       <element name="id" type="nonNegativeInteger" 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 'File:' 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>
index 591f675..fd47d13 100644 (file)
@@ -1,15 +1,18 @@
-<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.8/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.8/ http://www.mediawiki.org/xml/export-0.8.xsd" version="0.8" xml:lang="en">
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.9/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.9/ http://www.mediawiki.org/xml/export-0.9.xsd" version="0.9" xml:lang="en">
   
   <!-- Optional global configuration info -->
   <siteinfo>
     <!-- Site name, as set in $wgSitename -->
     <sitename>DemoWiki</sitename>
+
+    <!-- Database name, as set in $wgDBname -->
+    <dbname>demowiki</dbname>
     
     <!-- Forgot where you got this set? -->
     <base>http://example.com/wiki/Main_Page</base>
     
     <!-- Source software version -->
-    <generator>MediaWiki 1.20</generator>
+    <generator>MediaWiki 1.24</generator>
     
     <!-- Title case sensitivity options of the wiki this data came from -->
     <!-- May be 'first-letter', 'case-sensitive', or 'case-insensitive' -->
index 065c7d3..25f5ad8 100644 (file)
@@ -2780,26 +2780,9 @@ messages!" message, return false to not delete it.
 $user: User (object) that will clear the message
 $oldid: ID of the talk page revision being viewed (0 means the most recent one)
 
-'UserComparePasswords': Called when checking passwords, return false to
-override the default password checks.
-&$hash: String of the password hash (from the database)
-&$password: String of the plaintext password the user entered
-&$userId: Integer of the user's ID or Boolean false if the user ID was not
-  supplied
-&$result: If the hook returns false, this Boolean value will be checked to
-  determine if the password was valid
-
 'UserCreateForm': change to manipulate the login form
 $template: SimpleTemplate instance for the form
 
-'UserCryptPassword': Called when hashing a password, return false to implement
-your own hashing method.
-&$password: String of the plaintext password to encrypt
-&$salt: String of the password salt or Boolean false if no salt is provided
-&$wgPasswordSalt: Boolean of whether the salt is used in the default hashing
-  method
-&$hash: If the hook returns false, this String will be used as the hash
-
 'UserEffectiveGroups': Called in User::getEffectiveGroups().
 $user: User to get groups for
 &$groups: Current effective groups
index 374bab2..7d2ee3b 100644 (file)
@@ -6,7 +6,7 @@ kss: nodecheck
 # Generates CSS of mediawiki.ui and mediawiki.ui.button using ResourceLoader, then applies it to the
 # KSS style guide
        $(eval KSS_RL_TMP := $(shell mktemp /tmp/tmp.XXXXXXXXXX))
-       @curl -sG "${MEDIAWIKI_LOAD_URL}?modules=mediawiki.legacy.shared|mediawiki.legacy.commonPrint|mediawiki.ui|mediawiki.ui.button&only=styles" > $(KSS_RL_TMP)
+       @curl -sG "${MEDIAWIKI_LOAD_URL}?modules=mediawiki.ui.anchor|mediawiki.ui.checkbox|mediawiki.ui.input|mediawiki.legacy.shared|mediawiki.legacy.commonPrint|mediawiki.ui|mediawiki.ui.button&only=styles" > $(KSS_RL_TMP)
        @node_modules/.bin/kss-node ../../resources/src/mediawiki.ui static/ --css $(KSS_RL_TMP) -t styleguide-template
        @rm $(KSS_RL_TMP)
 
index cb95197..b6036b2 100644 (file)
@@ -2,61 +2,68 @@
 <html class="no-js" lang="en">
 <head>
        <meta charset="utf-8">
-       <title>MediaWiki Living Styleguide</title>
+       <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta name="description" content="">
        <meta name="generator" content="kss-node" />
-       <meta name="viewport" content="width=device-width">
+
+       <title>MediaWiki Living Styleguide</title>
+
        <link rel="stylesheet" href="public/kss.css">
        <link rel="stylesheet" href="public/style.css">
 </head>
 <body><div id="kss-wrapper">
        <header id="kss-header">
-               <hgroup><h1>MediaWiki Living Styleguide</h1></hgroup>
+               <div class="container">
+                       <hgroup><h1>Mediawiki.UI</h1></hgroup>
+               </div>
        </header>
-       <nav class="content">
-               <ul>
-               <li><a href="index.html">0.0: Overview</a></li>
-               {{#eachRoot}}
-               <li>
-                       <a href="section-{{reference}}.html">{{reference}}.0: {{header}}</a>
-               </li>
-               {{/eachRoot}}
-               </ul>
-       </nav>
-       <article>
-               {{#if overview}}
-                       {{html overview}}
-               {{else}}
-                       {{#eachSection rootNumber}}
-                       <section>
-                               {{#whenDepth 1}}
-                                       <h1>{{ reference }}.0 - {{ header }}</h1>
-                               {{else}}
-                                       {{#whenDepth 2}}
-                                       <h2>{{ reference }} - {{ header }}</h2>
-                                       {{/whenDepth}}
-                                       {{#whenDepth 3}}
-                                       <h3>{{ reference }} - {{ header }}</h3>
+
+       <div class="container">
+               <nav class="content">
+                       <ul>
+                               <li><a href="index.html"><span>0.0</span> Overview</a></li>
+                               {{#eachRoot}}
+                                       <li><a href="section-{{reference}}.html"><span>{{reference}}.0</span> {{header}}</a></li>
+                               {{/eachRoot}}
+                       </ul>
+               </nav>
+
+               <article>
+                       {{#if overview}}
+                               {{html overview}}
+                       {{else}}
+                               {{#eachSection rootNumber}}
+                               <section>
+                                       {{#whenDepth 1}}
+                                               <h1>{{ reference }}.0 {{ header }}</h1>
+                                       {{else}}
+                                               {{#whenDepth 2}}
+                                               <h2>{{ reference }} {{ header }}</h2>
+                                               {{/whenDepth}}
+                                               {{#whenDepth 3}}
+                                               <h3>{{ reference }} {{ header }}</h3>
+                                               {{/whenDepth}}
                                        {{/whenDepth}}
-                               {{/whenDepth}}
-                               {{#ifAny markup modifiers}}
-                                               <div>{{html description}}</div>
-                                               <h4>Default styling</h4>
-                                               <blockquote>{{modifierMarkup}}</blockquote>
-                                               {{#eachModifier}}
-                                                       <h4>{{name}}</h4>
-                                                       {{html description}}
-                                                       <blockquote>{{modifierMarkup}}</blockquote>
-                                               {{/eachModifier}}
-                                               <pre class="prettyprint lang-html">{{markup}}</pre>
-                               {{else}}
-                                               {{#if description}}
-                                                       {{html description}}
-                                               {{/if}}
-                               {{/ifAny}}
-                       </section>
-                       {{/eachSection}}
-               {{/if}}
-       </article>
+                                       {{#ifAny markup modifiers}}
+                                                       <div>{{html description}}</div>
+                                                       <div class="example">
+                                                               <pre class="prettyprint lang-html">{{markup}}</pre>
+                                                               <blockquote>{{modifierMarkup}}</blockquote>
+                                                       </div>
+                                                       {{#eachModifier}}
+                                                               <h4>{{name}}</h4>
+                                                               {{html description}}
+                                                               <blockquote>{{modifierMarkup}}</blockquote>
+                                                       {{/eachModifier}}
+                                       {{else}}
+                                                       {{#if description}}
+                                                               {{html description}}
+                                                       {{/if}}
+                                       {{/ifAny}}
+                               </section>
+                               {{/eachSection}}
+                       {{/if}}
+               </article>
+       </div>
 </div></body>
 </html>
index 431303d..9e850a3 100644 (file)
-header {
-       padding: .8em 16px 0;
+body {
+       margin: 0;
+       padding: 0;
+       padding-top: 3px;
+       padding-bottom: 40px;
+
+       // FIXME: Remove when typography module in mediawiki-ui
+       font-family: "Nimbus Sans L", "Liberation Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
 }
 
-nav {
-       float: left;
-       width: 200px;
+.content.kss-no-margin {
+       margin: 0;
 }
 
-article {
-       margin-left: 250px;
+.container {
+       width: 960px;
+       margin: 0 auto;
+       display: -webkit-flex;
+       display: flex;
+
 }
 
-.content.kss-no-margin {
+header {
+       padding: 0;
        margin: 0;
+       border-bottom: 1px solid #eee;
+
+       hgroup {
+               min-width: 149px;
+
+               h1 {
+                       padding: 16px 28px;
+                       font-size: 15px;
+                       text-transform: uppercase;
+                       margin: 0;
+                       width: 92px;
+                       border-right: 1px solid #eee;
+               }
+       }
 }
 
-// FIXME: Remove when typography module in mediawiki-ui
-body {
-       font-family: "Nimbus Sans L", "Liberation Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
+nav {
+       -webkit-flex: initial;
+       flex: initial;
+       min-width: 139px;
+       margin-top: 25px;
+
+       ul {
+               list-style: none;
+               padding: 0;
+
+               li {
+                       margin-left: 10px;
+                       margin-bottom: 20px;
+
+                       a {
+                               text-transform: uppercase;
+                               color: #aaa;
+                               font-size: 12px;
+                               font-weight: bold;
+                               text-decoration: none;
+
+                               &:hover {
+                                       color: #538DF8;
+                               }
+
+                               span {
+                                       display: inline-block;
+                                       width: 35px;
+                               }
+                       }
+               }
+       }
 }
-h1,h2,h3,h4,h5 {
-       font-family: "DejaVu Serif", Georgia, serif;
+
+article {
+       -webkit-flex: 1;
+       flex: 1;
+       margin-left: 30px;
+
+       h1, h2, h3, h4, h5, h6, p {
+               margin-left: 20px;
+       }
+
+       p {
+               width: 338px;
+       }
+
+       h1 {
+               margin-bottom: 0;
+       }
+
+       .example {
+               display: -webkit-flex;
+               display: flex;
+               flex-wrap: wrap;
+
+               pre {
+                       -webkit-flex: initial;
+                       flex: initial;
+                       background: #f8f8f8;
+                       padding: 20px;
+                       color: #999;
+                       width: 338px;
+                       word-wrap: break-word;
+                       // word-wrap in pre not affecting Firefox, so add white-space.
+                       white-space: pre-wrap;
+                       float: left;
+                       margin: 0;
+                       margin-right: 22px;
+               }
+
+               blockquote {
+                       -webkit-flex: 1;
+                       flex: 1;
+                       display: block;
+                       margin: 0;
+                       margin-left: 20px;
+                       min-width: 360px;
+               }
+       }
+}
+
+@media (max-width: 960px) {
+       .container {
+               width: 100%;
+       }
+
+       nav {
+               display: none;
+       }
+
+       article {
+               .example {
+                       blockquote {
+                               margin-top: 20px;
+                       }
+               }
+       }
 }
index 6f449c6..55f17ac 100644 (file)
@@ -114,7 +114,7 @@ function wfImageAuthMain() {
        // be under a folder that has the source file name.
        if ( $zone === 'thumb' || $zone === 'transcoded' ) {
                $name = wfBaseName( dirname( $path ) );
-               $filename = $repo->getZonePath( $zone ) . substr( $path, strlen( "/".$zone ) );
+               $filename = $repo->getZonePath( $zone ) . substr( $path, strlen( "/" . $zone ) );
                // Check to see if the file exists
                if ( !$repo->fileExists( $filename ) ) {
                        wfForbidden( 'img-auth-accessdenied', 'img-auth-nofile', $filename );
index c9ca128..dde8467 100644 (file)
@@ -55,7 +55,7 @@ class AjaxDispatcher {
 
                $this->mode = "";
 
-               if ( ! empty( $_GET["rs"] ) ) {
+               if ( !empty( $_GET["rs"] ) ) {
                        $this->mode = "get";
                }
 
@@ -66,7 +66,7 @@ class AjaxDispatcher {
                switch ( $this->mode ) {
                        case 'get':
                                $this->func_name = isset( $_GET["rs"] ) ? $_GET["rs"] : '';
-                               if ( ! empty( $_GET["rsargs"] ) ) {
+                               if ( !empty( $_GET["rsargs"] ) ) {
                                        $this->args = $_GET["rsargs"];
                                } else {
                                        $this->args = array();
@@ -74,7 +74,7 @@ class AjaxDispatcher {
                                break;
                        case 'post':
                                $this->func_name = isset( $_POST["rs"] ) ? $_POST["rs"] : '';
-                               if ( ! empty( $_POST["rsargs"] ) ) {
+                               if ( !empty( $_POST["rsargs"] ) ) {
                                        $this->args = $_POST["rsargs"];
                                } else {
                                        $this->args = array();
@@ -105,7 +105,7 @@ class AjaxDispatcher {
 
                wfProfileIn( __METHOD__ );
 
-               if ( ! in_array( $this->func_name, $wgAjaxExportList ) ) {
+               if ( !in_array( $this->func_name, $wgAjaxExportList ) ) {
                        wfDebug( __METHOD__ . ' Bad Request for unknown function ' . $this->func_name . "\n" );
 
                        wfHttpError(
index a3808a5..41cbd24 100644 (file)
@@ -132,7 +132,7 @@ class AjaxResponse {
         * @param string $text
         */
        function addText( $text ) {
-               if ( ! $this->mDisabled && $text ) {
+               if ( !$this->mDisabled && $text ) {
                        $this->mText .= $text;
                }
        }
@@ -141,7 +141,7 @@ class AjaxResponse {
         * Output text
         */
        function printText() {
-               if ( ! $this->mDisabled ) {
+               if ( !$this->mDisabled ) {
                        print $this->mText;
                }
        }
index 016886b..9fa0c13 100644 (file)
@@ -38,7 +38,6 @@ $wgAutoloadLocalClasses = array(
        'Autopromote' => 'includes/Autopromote.php',
        'BaseTemplate' => 'includes/SkinTemplate.php',
        'Block' => 'includes/Block.php',
-       'CacheHelper' => 'includes/CacheHelper.php',
        'Category' => 'includes/Category.php',
        'Categoryfinder' => 'includes/Categoryfinder.php',
        'CategoryViewer' => 'includes/CategoryViewer.php',
@@ -46,6 +45,7 @@ $wgAutoloadLocalClasses = array(
        'ChannelFeed' => 'includes/Feed.php',
        'Collation' => 'includes/Collation.php',
        'CollationCkb' => 'includes/Collation.php',
+       'CollationEt' => 'includes/Collation.php',
        'ConcatenatedGzipHistoryBlob' => 'includes/HistoryBlob.php',
        'Cookie' => 'includes/Cookie.php',
        'CookieJar' => 'includes/Cookie.php',
@@ -106,7 +106,6 @@ $wgAutoloadLocalClasses = array(
        'HTMLTextAreaField' => 'includes/htmlform/HTMLTextAreaField.php',
        'HTMLTextField' => 'includes/htmlform/HTMLTextField.php',
        'Http' => 'includes/HttpFunctions.php',
-       'ICacheHelper' => 'includes/CacheHelper.php',
        'IcuCollation' => 'includes/Collation.php',
        'IdentityCollation' => 'includes/Collation.php',
        'ImportStreamSource' => 'includes/Import.php',
@@ -131,7 +130,6 @@ $wgAutoloadLocalClasses = array(
        'MWNamespace' => 'includes/MWNamespace.php',
        'OutputPage' => 'includes/OutputPage.php',
        'Pager' => 'includes/Pager.php',
-       'PasswordError' => 'includes/User.php',
        'PathRouter' => 'includes/PathRouter.php',
        'PathRouterPatternReplacer' => 'includes/PathRouter.php',
        'PhpHttpRequest' => 'includes/HttpFunctions.php',
@@ -166,7 +164,6 @@ $wgAutoloadLocalClasses = array(
        'Status' => 'includes/Status.php',
        'StreamFile' => 'includes/StreamFile.php',
        'StringPrefixSearch' => 'includes/PrefixSearch.php',
-       'StubContLang' => 'includes/StubObject.php',
        'StubObject' => 'includes/StubObject.php',
        'StubUserLang' => 'includes/StubObject.php',
        'TablePager' => 'includes/Pager.php',
@@ -195,7 +192,6 @@ $wgAutoloadLocalClasses = array(
        'Xml' => 'includes/Xml.php',
        'XmlDumpWriter' => 'includes/Export.php',
        'XmlJsCode' => 'includes/Xml.php',
-       'XMLReader2' => 'includes/Import.php',
        'XmlSelect' => 'includes/Xml.php',
 
        # includes/actions
@@ -207,14 +203,12 @@ $wgAutoloadLocalClasses = array(
        'FormlessAction' => 'includes/actions/FormlessAction.php',
        'FormAction' => 'includes/actions/FormAction.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',
        'RevisiondeleteAction' => 'includes/actions/RevisiondeleteAction.php',
@@ -336,6 +330,7 @@ $wgAutoloadLocalClasses = array(
        # includes/cache
        'BacklinkCache' => 'includes/cache/BacklinkCache.php',
        'CacheDependency' => 'includes/cache/CacheDependency.php',
+       'CacheHelper' => 'includes/cache/CacheHelper.php',
        'ConstantDependency' => 'includes/cache/CacheDependency.php',
        'DependencyWrapper' => 'includes/cache/CacheDependency.php',
        'FileCacheBase' => 'includes/cache/FileCacheBase.php',
@@ -343,6 +338,7 @@ $wgAutoloadLocalClasses = array(
        'GenderCache' => 'includes/cache/GenderCache.php',
        'GlobalDependency' => 'includes/cache/CacheDependency.php',
        'HTMLFileCache' => 'includes/cache/HTMLFileCache.php',
+       'ICacheHelper' => 'includes/cache/CacheHelper.php',
        'LCStore' => 'includes/cache/LocalisationCache.php',
        'LCStoreAccel' => 'includes/cache/LocalisationCache.php',
        'LCStoreCDB' => 'includes/cache/LocalisationCache.php',
@@ -641,6 +637,7 @@ $wgAutoloadLocalClasses = array(
        'JobQueueGroup' => 'includes/jobqueue/JobQueueGroup.php',
        'JobQueueFederated' => 'includes/jobqueue/JobQueueFederated.php',
        'JobQueueRedis' => 'includes/jobqueue/JobQueueRedis.php',
+       'JobRunner' => 'includes/jobqueue/JobRunner.php',
        'JobSpecification' => 'includes/jobqueue/JobSpecification.php',
 
        # includes/jobqueue/jobs
@@ -830,6 +827,19 @@ $wgAutoloadLocalClasses = array(
        'Preprocessor_Hash' => 'includes/parser/Preprocessor_Hash.php',
        'StripState' => 'includes/parser/StripState.php',
 
+       # includes/password
+       'BcryptPassword' => 'includes/password/BcryptPassword.php',
+       'InvalidPassword' => 'includes/password/InvalidPassword.php',
+       'LayeredParameterizedPassword' => 'includes/password/LayeredParameterizedPassword.php',
+       'MWSaltedPassword' => 'includes/password/MWSaltedPassword.php',
+       'MWOldPassword' => 'includes/password/MWOldPassword.php',
+       'ParameterizedPassword' => 'includes/password/ParameterizedPassword.php',
+       'Password' => 'includes/password/Password.php',
+       'PasswordError' => 'includes/password/PasswordError.php',
+       'PasswordFactory' => 'includes/password/PasswordFactory.php',
+       'Pbkdf2Password' => 'includes/password/Pbkdf2Password.php',
+       'EncryptedPassword' => 'includes/password/EncryptedPassword.php',
+
        # includes/profiler
        'Profiler' => 'includes/profiler/Profiler.php',
        'ProfilerMwprof' => 'includes/profiler/ProfilerMwprof.php',
@@ -853,10 +863,13 @@ $wgAutoloadLocalClasses = array(
        'MachineReadableRCFeedFormatter' => 'includes/rcfeed/MachineReadableRCFeedFormatter.php',
 
        # includes/resourceloader
+       'DerivativeResourceLoaderContext' =>
+               'includes/resourceloader/DerivativeResourceLoaderContext.php',
        'ResourceLoader' => 'includes/resourceloader/ResourceLoader.php',
        'ResourceLoaderContext' => 'includes/resourceloader/ResourceLoaderContext.php',
        'ResourceLoaderFileModule' => 'includes/resourceloader/ResourceLoaderFileModule.php',
        'ResourceLoaderFilePageModule' => 'includes/resourceloader/ResourceLoaderFilePageModule.php',
+       'ResourceLoaderFilePath' => 'includes/resourceloader/ResourceLoaderFilePath.php',
        'ResourceLoaderLESSFunctions' => 'includes/resourceloader/ResourceLoaderLESSFunctions.php',
        'ResourceLoaderModule' => 'includes/resourceloader/ResourceLoaderModule.php',
        'ResourceLoaderNoscriptModule' => 'includes/resourceloader/ResourceLoaderNoscriptModule.php',
@@ -1010,6 +1023,7 @@ $wgAutoloadLocalClasses = array(
        'SpecialLog' => 'includes/specials/SpecialLog.php',
        'SpecialMergeHistory' => 'includes/specials/SpecialMergeHistory.php',
        'SpecialMycontributions' => 'includes/specials/SpecialMyRedirectPages.php',
+       'SpecialMyLanguage' => 'includes/specials/SpecialMyLanguage.php',
        'SpecialMypage' => 'includes/specials/SpecialMyRedirectPages.php',
        'SpecialMytalk' => 'includes/specials/SpecialMyRedirectPages.php',
        'SpecialMyuploads' => 'includes/specials/SpecialMyRedirectPages.php',
@@ -1148,6 +1162,7 @@ $wgAutoloadLocalClasses = array(
        'FixExtLinksProtocolRelative' => 'maintenance/fixExtLinksProtocolRelative.php',
        'LoggedUpdateMaintenance' => 'maintenance/Maintenance.php',
        'Maintenance' => 'maintenance/Maintenance.php',
+       'PopulateBacklinkNamespace' => 'maintenance/populateBacklinkNamespace.php',
        'PopulateCategory' => 'maintenance/populateCategory.php',
        'PopulateImageSha1' => 'maintenance/populateImageSha1.php',
        'PopulateFilearchiveSha1' => 'maintenance/populateFilearchiveSha1.php',
@@ -1186,7 +1201,7 @@ class AutoLoader {
        /**
         * autoload - take a class name and attempt to load it
         *
-        * @param string $className name of class we're looking for.
+        * @param string $className Name of class we're looking for.
         */
        static function autoload( $className ) {
                global $wgAutoloadClasses, $wgAutoloadLocalClasses,
index c393a79..45bae28 100644 (file)
@@ -347,7 +347,7 @@ class Block {
        /**
         * Given a database row from the ipblocks table, initialize
         * member variables
-        * @param ResultWrapper $row A row from the ipblocks table
+        * @param stdClass $row A row from the ipblocks table
         */
        protected function initFromRow( $row ) {
                $this->setTarget( $row->ipb_address );
@@ -382,7 +382,7 @@ class Block {
 
        /**
         * Create a new Block object from a database row
-        * @param ResultWrapper $row Row from the ipblocks table
+        * @param stdClass $row Row from the ipblocks table
         * @return Block
         */
        public static function newFromRow( $row ) {
@@ -967,7 +967,7 @@ class Block {
 
                $method = __METHOD__;
                $dbw = wfGetDB( DB_MASTER );
-               $dbw->onTransactionIdle( function() use ( $dbw, $method ) {
+               $dbw->onTransactionIdle( function () use ( $dbw, $method ) {
                        $dbw->delete( 'ipblocks',
                                array( 'ipb_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ), $method );
                } );
@@ -1104,13 +1104,13 @@ class Block {
         *  - Other softblocks are chosen over autoblocks
         *  - If there are multiple exact or range blocks at the same level, the one chosen
         *    is random
-
+        *
         * @param array $ipChain List of IPs (strings). This is used to determine how "close"
         *        a block is to the server, and if a block matches exactly, or is in a range.
         *        The order is furthest from the server to nearest e.g., (Browser, proxy1, proxy2,
         *        local-squid, ...)
         * @param array $block Array of blocks
-        * @return Block|null the "best" block from the list
+        * @return Block|null The "best" block from the list
         */
        public static function chooseBlock( array $blocks, array $ipChain ) {
                if ( !count( $blocks ) ) {
@@ -1123,7 +1123,7 @@ class Block {
 
                // Sort hard blocks before soft ones and secondarily sort blocks
                // that disable account creation before those that don't.
-               usort( $blocks, function( Block $a, Block $b ) {
+               usort( $blocks, function ( Block $a, Block $b ) {
                        $aWeight = (int)$a->isHardblock() . (int)$a->prevents( 'createaccount' );
                        $bWeight = (int)$b->isHardblock() . (int)$b->prevents( 'createaccount' );
                        return strcmp( $bWeight, $aWeight ); // highest weight first
diff --git a/includes/CacheHelper.php b/includes/CacheHelper.php
deleted file mode 100644 (file)
index 695eac3..0000000
+++ /dev/null
@@ -1,386 +0,0 @@
-<?php
-/**
- * Cache of various elements in a single cache entry.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @license GNU GPL v2 or later
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-
-/**
- * Interface for all classes implementing CacheHelper functionality.
- *
- * @since 1.20
- */
-interface ICacheHelper {
-       /**
-        * Sets if the cache should be enabled or not.
-        *
-        * @since 1.20
-        * @param bool $cacheEnabled
-        */
-       function setCacheEnabled( $cacheEnabled );
-
-       /**
-        * Initializes the caching.
-        * Should be called before the first time anything is added via addCachedHTML.
-        *
-        * @since 1.20
-        *
-        * @param int|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
-        * @param bool|null $cacheEnabled Sets if the cache should be enabled or not.
-        */
-       function startCache( $cacheExpiry = null, $cacheEnabled = null );
-
-       /**
-        * Get a cached value if available or compute it if not and then cache it if possible.
-        * The provided $computeFunction is only called when the computation needs to happen
-        * and should return a result value. $args are arguments that will be passed to the
-        * compute function when called.
-        *
-        * @since 1.20
-        *
-        * @param {function} $computeFunction
-        * @param array|mixed $args
-        * @param string|null $key
-        *
-        * @return mixed
-        */
-       function getCachedValue( $computeFunction, $args = array(), $key = null );
-
-       /**
-        * Saves the HTML to the cache in case it got recomputed.
-        * Should be called after the last time anything is added via addCachedHTML.
-        *
-        * @since 1.20
-        */
-       function saveCache();
-
-       /**
-        * Sets the time to live for the cache, in seconds or a unix timestamp
-        * indicating the point of expiry...
-        *
-        * @since 1.20
-        *
-        * @param int $cacheExpiry
-        */
-       function setExpiry( $cacheExpiry );
-}
-
-/**
- * Helper class for caching various elements in a single cache entry.
- *
- * To get a cached value or compute it, use getCachedValue like this:
- * $this->getCachedValue( $callback );
- *
- * To add HTML that should be cached, use addCachedHTML like this:
- * $this->addCachedHTML( $callback );
- *
- * The callback function is only called when needed, so do all your expensive
- * computations here. This function should returns the HTML to be cached.
- * It should not add anything to the PageOutput object!
- *
- * Before the first addCachedHTML call, you should call $this->startCache();
- * After adding the last HTML that should be cached, call $this->saveCache();
- *
- * @since 1.20
- */
-class CacheHelper implements ICacheHelper {
-       /**
-        * The time to live for the cache, in seconds or a unix timestamp indicating the point of expiry.
-        *
-        * @since 1.20
-        * @var int
-        */
-       protected $cacheExpiry = 3600;
-
-       /**
-        * List of HTML chunks to be cached (if !hasCached) or that where cached (of hasCached).
-        * If not cached already, then the newly computed chunks are added here,
-        * if it as cached already, chunks are removed from this list as they are needed.
-        *
-        * @since 1.20
-        * @var array
-        */
-       protected $cachedChunks;
-
-       /**
-        * Indicates if the to be cached content was already cached.
-        * Null if this information is not available yet.
-        *
-        * @since 1.20
-        * @var bool|null
-        */
-       protected $hasCached = null;
-
-       /**
-        * If the cache is enabled or not.
-        *
-        * @since 1.20
-        * @var bool
-        */
-       protected $cacheEnabled = true;
-
-       /**
-        * Function that gets called when initialization is done.
-        *
-        * @since 1.20
-        * @var callable
-        */
-       protected $onInitHandler = false;
-
-       /**
-        * Elements to build a cache key with.
-        *
-        * @since 1.20
-        * @var array
-        */
-       protected $cacheKey = array();
-
-       /**
-        * Sets if the cache should be enabled or not.
-        *
-        * @since 1.20
-        * @param bool $cacheEnabled
-        */
-       public function setCacheEnabled( $cacheEnabled ) {
-               $this->cacheEnabled = $cacheEnabled;
-       }
-
-       /**
-        * Initializes the caching.
-        * Should be called before the first time anything is added via addCachedHTML.
-        *
-        * @since 1.20
-        *
-        * @param int|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
-        * @param bool|null $cacheEnabled Sets if the cache should be enabled or not.
-        */
-       public function startCache( $cacheExpiry = null, $cacheEnabled = null ) {
-               if ( is_null( $this->hasCached ) ) {
-                       if ( !is_null( $cacheExpiry ) ) {
-                               $this->cacheExpiry = $cacheExpiry;
-                       }
-
-                       if ( !is_null( $cacheEnabled ) ) {
-                               $this->setCacheEnabled( $cacheEnabled );
-                       }
-
-                       $this->initCaching();
-               }
-       }
-
-       /**
-        * Returns a message that notifies the user he/she is looking at
-        * a cached version of the page, including a refresh link.
-        *
-        * @since 1.20
-        *
-        * @param IContextSource $context
-        * @param bool $includePurgeLink
-        *
-        * @return string
-        */
-       public function getCachedNotice( IContextSource $context, $includePurgeLink = true ) {
-               if ( $this->cacheExpiry < 86400 * 3650 ) {
-                       $message = $context->msg(
-                               'cachedspecial-viewing-cached-ttl',
-                               $context->getLanguage()->formatDuration( $this->cacheExpiry )
-                       )->escaped();
-               } else {
-                       $message = $context->msg(
-                               'cachedspecial-viewing-cached-ts'
-                       )->escaped();
-               }
-
-               if ( $includePurgeLink ) {
-                       $refreshArgs = $context->getRequest()->getQueryValues();
-                       unset( $refreshArgs['title'] );
-                       $refreshArgs['action'] = 'purge';
-
-                       $subPage = $context->getTitle()->getFullText();
-                       $subPage = explode( '/', $subPage, 2 );
-                       $subPage = count( $subPage ) > 1 ? $subPage[1] : false;
-
-                       $message .= ' ' . Linker::link(
-                               $context->getTitle( $subPage ),
-                               $context->msg( 'cachedspecial-refresh-now' )->escaped(),
-                               array(),
-                               $refreshArgs
-                       );
-               }
-
-               return $message;
-       }
-
-       /**
-        * Initializes the caching if not already done so.
-        * Should be called before any of the caching functionality is used.
-        *
-        * @since 1.20
-        */
-       protected function initCaching() {
-               if ( $this->cacheEnabled && is_null( $this->hasCached ) ) {
-                       $cachedChunks = wfGetCache( CACHE_ANYTHING )->get( $this->getCacheKeyString() );
-
-                       $this->hasCached = is_array( $cachedChunks );
-                       $this->cachedChunks = $this->hasCached ? $cachedChunks : array();
-
-                       if ( $this->onInitHandler !== false ) {
-                               call_user_func( $this->onInitHandler, $this->hasCached );
-                       }
-               }
-       }
-
-       /**
-        * Get a cached value if available or compute it if not and then cache it if possible.
-        * The provided $computeFunction is only called when the computation needs to happen
-        * and should return a result value. $args are arguments that will be passed to the
-        * compute function when called.
-        *
-        * @since 1.20
-        *
-        * @param {function} $computeFunction
-        * @param array|mixed $args
-        * @param string|null $key
-        *
-        * @return mixed
-        */
-       public function getCachedValue( $computeFunction, $args = array(), $key = null ) {
-               $this->initCaching();
-
-               if ( $this->cacheEnabled && $this->hasCached ) {
-                       $value = null;
-
-                       if ( is_null( $key ) ) {
-                               $itemKey = array_keys( array_slice( $this->cachedChunks, 0, 1 ) );
-                               $itemKey = array_shift( $itemKey );
-
-                               if ( !is_integer( $itemKey ) ) {
-                                       wfWarn( "Attempted to get item with non-numeric key while " .
-                                               "the next item in the queue has a key ($itemKey) in " . __METHOD__ );
-                               } elseif ( is_null( $itemKey ) ) {
-                                       wfWarn( "Attempted to get an item while the queue is empty in " . __METHOD__ );
-                               } else {
-                                       $value = array_shift( $this->cachedChunks );
-                               }
-                       } else {
-                               if ( array_key_exists( $key, $this->cachedChunks ) ) {
-                                       $value = $this->cachedChunks[$key];
-                                       unset( $this->cachedChunks[$key] );
-                               } else {
-                                       wfWarn( "There is no item with key '$key' in this->cachedChunks in " . __METHOD__ );
-                               }
-                       }
-               } else {
-                       if ( !is_array( $args ) ) {
-                               $args = array( $args );
-                       }
-
-                       $value = call_user_func_array( $computeFunction, $args );
-
-                       if ( $this->cacheEnabled ) {
-                               if ( is_null( $key ) ) {
-                                       $this->cachedChunks[] = $value;
-                               } else {
-                                       $this->cachedChunks[$key] = $value;
-                               }
-                       }
-               }
-
-               return $value;
-       }
-
-       /**
-        * Saves the HTML to the cache in case it got recomputed.
-        * Should be called after the last time anything is added via addCachedHTML.
-        *
-        * @since 1.20
-        */
-       public function saveCache() {
-               if ( $this->cacheEnabled && $this->hasCached === false && !empty( $this->cachedChunks ) ) {
-                       wfGetCache( CACHE_ANYTHING )->set(
-                               $this->getCacheKeyString(),
-                               $this->cachedChunks,
-                               $this->cacheExpiry
-                       );
-               }
-       }
-
-       /**
-        * Sets the time to live for the cache, in seconds or a unix timestamp
-        * indicating the point of expiry...
-        *
-        * @since 1.20
-        *
-        * @param int $cacheExpiry
-        */
-       public function setExpiry( $cacheExpiry ) {
-               $this->cacheExpiry = $cacheExpiry;
-       }
-
-       /**
-        * Returns the cache key to use to cache this page's HTML output.
-        * Is constructed from the special page name and language code.
-        *
-        * @since 1.20
-        *
-        * @return string
-        * @throws MWException
-        */
-       protected function getCacheKeyString() {
-               if ( $this->cacheKey === array() ) {
-                       throw new MWException( 'No cache key set, so cannot obtain or save the CacheHelper values.' );
-               }
-
-               return call_user_func_array( 'wfMemcKey', $this->cacheKey );
-       }
-
-       /**
-        * Sets the cache key that should be used.
-        *
-        * @since 1.20
-        *
-        * @param array $cacheKey
-        */
-       public function setCacheKey( array $cacheKey ) {
-               $this->cacheKey = $cacheKey;
-       }
-
-       /**
-        * Rebuild the content, even if it's already cached.
-        * This effectively has the same effect as purging the cache,
-        * since it will be overridden with the new value on the next request.
-        *
-        * @since 1.20
-        */
-       public function rebuildOnDemand() {
-               $this->hasCached = false;
-       }
-
-       /**
-        * Sets a function that gets called when initialization of the cache is done.
-        *
-        * @since 1.20
-        *
-        * @param callable $handlerFunction
-        */
-       public function setOnInitializedHandler( $handlerFunction ) {
-               $this->onInitHandler = $handlerFunction;
-       }
-}
index cd9eaa9..22eb3d1 100644 (file)
@@ -54,6 +54,9 @@ class CategoryViewer extends ContextSource {
        /** @var array */
        protected $nextPage;
 
+       /** @var array */
+       protected $prevPage;
+
        /** @var array */
        protected $flip;
 
@@ -288,6 +291,12 @@ class CategoryViewer extends ContextSource {
                        'subcat' => null,
                        'file' => null,
                );
+               $this->prevPage = array(
+                       'page' => null,
+                       'subcat' => null,
+                       'file' => null,
+               );
+
                $this->flip = array( 'page' => false, 'subcat' => false, 'file' => false );
 
                foreach ( array( 'page', 'subcat', 'file' ) as $type ) {
@@ -344,6 +353,9 @@ class CategoryViewer extends ContextSource {
                                        $this->nextPage[$type] = $humanSortkey;
                                        break;
                                }
+                               if ( $count == $this->limit ) {
+                                       $this->prevPage[$type] = $humanSortkey;
+                               }
 
                                if ( $title->getNamespace() == NS_CATEGORY ) {
                                        $cat = Category::newFromRow( $row, $title );
@@ -458,7 +470,17 @@ class CategoryViewer extends ContextSource {
         */
        private function getSectionPagingLinks( $type ) {
                if ( isset( $this->until[$type] ) && $this->until[$type] !== null ) {
-                       return $this->pagingLinks( $this->nextPage[$type], $this->until[$type], $type );
+                       // The new value for the until parameter should be pointing to the first
+                       // result displayed on the page which is the second last result retrieved
+                       // from the database.The next link should have a from parameter pointing
+                       // to the until parameter of the current page.
+                       if ( $this->nextPage[$type] !== null ) {
+                               return $this->pagingLinks( $this->prevPage[$type], $this->until[$type], $type );
+                       } else {
+                               // If the nextPage variable is null, it means that we have reached the first page
+                               // and therefore the previous link should be disabled.
+                               return $this->pagingLinks( null, $this->until[$type], $type );
+                       }
                } elseif ( $this->nextPage[$type] !== null
                        || ( isset( $this->from[$type] ) && $this->from[$type] !== null )
                ) {
@@ -708,7 +730,7 @@ class CategoryViewer extends ContextSource {
                        // quick due to the small number of entries.
                        $totalcnt = $rescnt;
                        $category = $this->cat;
-                       wfGetDB( DB_MASTER )->onTransactionIdle( function() use ( $category ) {
+                       wfGetDB( DB_MASTER )->onTransactionIdle( function () use ( $category ) {
                                $category->refreshCounts();
                        } );
                } else {
index b9cbc9a..a5415af 100644 (file)
@@ -61,7 +61,7 @@ class Categoryfinder {
        /** @var array */
        protected $name2id = array();
 
-       /** @var  "AND" or "OR" */
+       /** @var string "AND" or "OR" */
        protected $mode;
 
        /** @var DatabaseBase Read-DB slave */
@@ -96,7 +96,7 @@ class Categoryfinder {
        /**
         * Iterates through the parent tree starting with the seed values,
         * then checks the articles if they match the conditions
-        * @return array of page_ids (those given to seed() that match the conditions)
+        * @return array Array of page_ids (those given to seed() that match the conditions)
         */
        function run() {
                $this->dbr = wfGetDB( DB_SLAVE );
index f51a5a8..94b7b7a 100644 (file)
@@ -63,7 +63,7 @@ class ChangeTags {
        /**
         * Get a short description for a tag
         *
-        * @param string $tag tag
+        * @param string $tag Tag
         *
         * @return string Short description of the tag from "mediawiki:tag-$tag" if this message exists,
         *   html-escaped version of $tag otherwise
@@ -77,15 +77,15 @@ class ChangeTags {
         * Add tags to a change given its rc_id, rev_id and/or log_id
         *
         * @param string|array $tags Tags to add to the change
-        * @param int|null $rc_id rc_id of the change to add the tags to
-        * @param int|null $rev_id rev_id of the change to add the tags to
-        * @param int|null $log_id Log_id of the change to add the tags to
-        * @param string $params params to put in the ct_params field of table 'change_tag'
+        * @param int|null $rc_id The rc_id of the change to add the tags to
+        * @param int|null $rev_id The rev_id of the change to add the tags to
+        * @param int|null $log_id The log_id of the change to add the tags to
+        * @param string $params Params to put in the ct_params field of table 'change_tag'
         *
         * @throws MWException
-        * @return bool false if no changes are made, otherwise true
+        * @return bool False if no changes are made, otherwise true
         *
-        * @exception MWException when $rc_id, $rev_id and $log_id are all null
+        * @exception MWException When $rc_id, $rev_id and $log_id are all null
         */
        public static function addTags( $tags, $rc_id = null, $rev_id = null,
                $log_id = null, $params = null
@@ -236,7 +236,7 @@ class ChangeTags {
        /**
         * Build a text box to select a change tag
         *
-        * @param string $selected tag to select by default
+        * @param string $selected Tag to select by default
         * @param bool $fullForm
         *        - if false, then it returns an array of (label, form).
         *        - if true, it returns an entire form around the selector.
index 71adb09..1c2c2db 100644 (file)
@@ -49,6 +49,8 @@ abstract class Collation {
                                return new IcuCollation( 'root' );
                        case 'xx-uca-ckb':
                                return new CollationCkb;
+                       case 'xx-uca-et':
+                               return new CollationEt;
                        default:
                                $match = array();
                                if ( preg_match( '/^uca-([a-z@=-]+)$/', $collationName, $match ) ) {
@@ -160,7 +162,7 @@ class IcuCollation extends Collation {
        /** @var Collator */
        private $mainCollator;
 
-       /** @var  */
+       /** @var string */
        private $locale;
 
        /** @var Language */
@@ -253,7 +255,7 @@ class IcuCollation extends Collation {
                'el' => array(),
                'eo' => array( "Ĉ", "Ĝ", "Ĥ", "Ĵ", "Ŝ", "Ŭ" ),
                'es' => array( "Ñ" ),
-               'et' => array( "Š", "Ž", "Õ", "Ä", "Ö", "Ü" ),
+               'et' => array( "Š", "Ž", "Õ", "Ä", "Ö", "Ü", "W" ), // added W for CollationEt (xx-uca-et)
                'eu' => array( "Ñ" ),
                'fo' => array( "Á", "Ð", "Í", "Ó", "Ú", "Ý", "Æ", "Ø", "Å" ),
                'fur' => array( "À", "Á", "Â", "È", "Ì", "Ò", "Ù" ),
@@ -365,7 +367,12 @@ class IcuCollation extends Collation {
                }
 
                $cache = wfGetCache( CACHE_ANYTHING );
-               $cacheKey = wfMemcKey( 'first-letters', $this->locale, $this->digitTransformLanguage->getCode() );
+               $cacheKey = wfMemcKey(
+                       'first-letters',
+                       $this->locale,
+                       $this->digitTransformLanguage->getCode(),
+                       self::getICUVersion()
+               );
                $cacheEntry = $cache->get( $cacheKey );
 
                if ( $cacheEntry && isset( $cacheEntry['version'] )
@@ -597,3 +604,42 @@ class CollationCkb extends IcuCollation {
                $this->digitTransformLanguage = Language::factory( 'ckb' );
        }
 }
+
+/**
+ * Workaround for incorrect collation of Estonian language ('et') in ICU (bug 54168).
+ *
+ * 'W' and 'V' should not be considered the same letter for the purposes of collation in modern
+ * Estonian. We work around this by replacing 'W' and 'w' with 'ᴡ' U+1D21 'LATIN LETTER SMALL
+ * CAPITAL W' for sortkey generation, which is collated like 'W' and is not tailored to have the
+ * same primary weight as 'V' in Estonian.
+ */
+class CollationEt extends IcuCollation {
+       function __construct() {
+               parent::__construct( 'et' );
+       }
+
+       private static function mangle( $string ) {
+               return str_replace(
+                       array( 'w', 'W' ),
+                       'ᴡ', // U+1D21 'LATIN LETTER SMALL CAPITAL W'
+                       $string
+               );
+       }
+
+       private static function unmangle( $string ) {
+               // Casing data is lost…
+               return str_replace(
+                       'ᴡ', // U+1D21 'LATIN LETTER SMALL CAPITAL W'
+                       'W',
+                       $string
+               );
+       }
+
+       function getSortKey( $string ) {
+               return parent::getSortKey( self::mangle( $string ) );
+       }
+
+       function getFirstLetter( $string ) {
+               return self::unmangle( parent::getFirstLetter( self::mangle( $string ) ) );
+       }
+}
index b8d34e2..8b5906a 100644 (file)
@@ -90,13 +90,15 @@ class Cookie {
         * @return bool
         */
        public static function validateCookieDomain( $domain, $originDomain = null ) {
-               // Don't allow a trailing dot
-               if ( substr( $domain, -1 ) == '.' ) {
+               $dc = explode( ".", $domain );
+
+               // Don't allow a trailing dot or addresses without a or just a leading dot
+               if ( substr( $domain, -1 ) == '.' ||
+                        count( $dc ) <= 1 ||
+                        count( $dc ) == 2 && $dc[0] === '' ) {
                        return false;
                }
 
-               $dc = explode( ".", $domain );
-
                // Only allow full, valid IP addresses
                if ( preg_match( '/^[0-9.]+$/', $domain ) ) {
                        if ( count( $dc ) != 4 ) {
index 7785c7e..dea6e71 100644 (file)
@@ -1238,7 +1238,7 @@ $wgThumbnailBuckets = null;
  * If we want to render a thumbnail of width 220px, the 512px bucket will be used,
  * because 220 + 50 = 270 and the closest bucket bigger than 270px is 512.
  */
-$wgThumbnailMinimumBucketDistance = 0;
+$wgThumbnailMinimumBucketDistance = 50;
 
 /**
  * Default parameters for the "<gallery>" tag
@@ -2960,25 +2960,28 @@ $wgValidateAllHtml = false;
 /**
  * Default skin, for new users and anonymous visitors. Registered users may
  * change this to any one of the other available skins in their preferences.
- * This has to be completely lowercase; see the "skins" directory for the list
- * of available skins.
  */
 $wgDefaultSkin = 'vector';
 
 /**
- * Specify the name of a skin that should not be presented in the list of
- * available skins.  Use for blacklisting a skin which you do not want to
- * remove from the .../skins/ directory
+ * Fallback skin used when the skin defined by $wgDefaultSkin can't be found.
  *
- * @deprecated since 1.23; use $wgSkipSkins instead
+ * @since 1.24
  */
-$wgSkipSkin = '';
+$wgFallbackSkin = 'vector';
 
 /**
- * Array for more like $wgSkipSkin.
+ * Specify the names of skins that should not be presented in the list of
+ * available skins in user preferences. If you want to remove a skin entirely,
+ * remove it from the skins/ directory and its entry from LocalSettings.php.
  */
 $wgSkipSkins = array();
 
+/**
+ * @deprecated since 1.23; use $wgSkipSkins instead
+ */
+$wgSkipSkin = '';
+
 /**
  * Allow user Javascript page?
  * This enables a lot of neat customizations, but may
@@ -3190,6 +3193,111 @@ $wgEnableCanonicalServerLink = false;
  */
 $wgResourceModules = array();
 
+/**
+ * Skin-specific styles for resource modules.
+ *
+ * These are later added to the 'skinStyles' list of the existing module. The 'styles' list can
+ * not be modified or disabled.
+ *
+ * For example, here is a module "bar" and how skin Foo would provide additional styles for it.
+ *
+ * @par Example:
+ * @code
+ *   $wgResourceModules['bar'] = array(
+ *     'scripts' => 'resources/bar/bar.js',
+ *     'styles' => 'resources/bar/main.css',
+ *   );
+ *
+ *   $wgResourceModuleSkinStyles['foo'] = array(
+ *     'bar' => 'skins/Foo/bar.css',
+ *   );
+ * @endcode
+ *
+ * This is mostly equivalent to:
+ *
+ * @par Equivalent:
+ * @code
+ *   $wgResourceModules['bar'] = array(
+ *     'scripts' => 'resources/bar/bar.js',
+ *     'styles' => 'resources/bar/main.css',
+ *     'skinStyles' => array(
+ *       'foo' => skins/Foo/bar.css',
+ *     ),
+ *   );
+ * @endcode
+ *
+ * If the module already defines its own entry in `skinStyles` for a given skin, then
+ * $wgResourceModuleSkinStyles is ignored.
+ *
+ * If a module defines a `skinStyles['default']` the skin may want to extend that instead
+ * of replacing them. This can be done using the `+` prefix.
+ *
+ * @par Example:
+ * @code
+ *   $wgResourceModules['bar'] = array(
+ *     'scripts' => 'resources/bar/bar.js',
+ *     'styles' => 'resources/bar/basic.css',
+ *     'skinStyles' => array(
+ *       'default' => 'resources/bar/additional.css',
+ *     ),
+ *   );
+ *   // Note the '+' character:
+ *   $wgResourceModuleSkinStyles['+foo'] = array(
+ *     'bar' => 'skins/Foo/bar.css',
+ *   );
+ * @endcode
+ *
+ * This is mostly equivalent to:
+ *
+ * @par Equivalent:
+ * @code
+ *   $wgResourceModules['bar'] = array(
+ *     'scripts' => 'resources/bar/bar.js',
+ *     'styles' => 'resources/bar/basic.css',
+ *     'skinStyles' => array(
+ *       'default' => 'resources/bar/additional.css',
+ *       'foo' => array(
+ *         'resources/bar/additional.css',
+ *         'skins/Foo/bar.css',
+ *       ),
+ *     ),
+ *   );
+ * @endcode
+ *
+ * In other words, as a module author, use the `styles` list for stylesheets that may not be
+ * disabled by a skin. To provide default styles that may be extended or replaced,
+ * use `skinStyles['default']`.
+ *
+ * As with $wgResourceModules, paths default to being relative to the MediaWiki root.
+ * You should always provide a localBasePath and remoteBasePath (or remoteExtPath/remoteSkinPath).
+ * Either for all skin styles at once (first example below) or for each module separately (second
+ * example).
+ *
+ * @par Example:
+ * @code
+ *   $wgResourceModuleSkinStyles['foo'] = array(
+ *     'bar' => 'bar.css',
+ *     'quux' => 'quux.css',
+ *     'remoteSkinPath' => 'Foo',
+ *     'localBasePath' => __DIR__,
+ *   );
+ *
+ *   $wgResourceModuleSkinStyles['foo'] = array(
+ *     'bar' => array(
+ *       'bar.css',
+ *       'remoteSkinPath' => 'Foo',
+ *       'localBasePath' => __DIR__,
+ *     ),
+ *     'quux' => array(
+ *       'quux.css',
+ *       'remoteSkinPath' => 'Foo',
+ *       'localBasePath' => __DIR__,
+ *     ),
+ *   );
+ * @endcode
+ */
+$wgResourceModuleSkinStyles = array();
+
 /**
  * Extensions should register foreign module sources here. 'local' is a
  * built-in source that is not in this array, but defined by
@@ -4016,6 +4124,7 @@ $wgActiveUserDays = 30;
 
 /**
  * For compatibility with old installations set to false
+ * @deprecated since 1.24 will be removed in future
  */
 $wgPasswordSalt = true;
 
@@ -4032,6 +4141,65 @@ $wgMinimalPasswordLength = 1;
  */
 $wgInvalidPasswordReset = true;
 
+/**
+ * Default password type to use when hashing user passwords
+ *
+ * @since 1.24
+ */
+$wgPasswordDefault = 'B';
+
+/**
+ * Configuration for built-in password types. Maps the password type
+ * to an array of options. The 'class' option is the Password class to
+ * use. All other options are class-dependent.
+ *
+ * An advanced example:
+ * @code
+ * $wgPasswordConfig['bcrypt-peppered'] = array(
+ *     'class' => 'EncryptedPassword',
+ *     'underlying' => 'bcrypt',
+ *     'secrets' => array(),
+ *     'cipher' => MCRYPT_RIJNDAEL_256,
+ *     'mode' => MCRYPT_MODE_CBC,
+ *     'cost' => 5,
+ * );
+ * @endcode
+ *
+ * @since 1.24
+ */
+$wgPasswordConfig = array(
+       'A' => array(
+               'class' => 'MWOldPassword',
+       ),
+       'B' => array(
+               'class' => 'MWSaltedPassword',
+       ),
+       'pbkdf2-legacyA' => array(
+               'class' => 'LayeredParameterizedPassword',
+               'types' => array(
+                       'A',
+                       'pbkdf2',
+               ),
+       ),
+       'pbkdf2-legacyB' => array(
+               'class' => 'LayeredParameterizedPassword',
+               'types' => array(
+                       'B',
+                       'pbkdf2',
+               ),
+       ),
+       'bcrypt' => array(
+               'class' => 'BcryptPassword',
+               'cost' => 9,
+       ),
+       'pbkdf2' => array(
+               'class' => 'Pbkdf2Password',
+               'algo' => 'sha256',
+               'cost' => '10000',
+               'length' => '128',
+       ),
+);
+
 /**
  * Whether to allow password resets ("enter some identifying data, and we'll send an email
  * with a temporary password you can use to get back into the account") identified by
@@ -4126,6 +4294,7 @@ $wgDefaultUserOptions = array(
        'watchlisthideown' => 0,
        'watchlisthidepatrolled' => 0,
        'watchmoves' => 0,
+       'watchrollback' => 0,
        'wllimit' => 250,
        'useeditwarning' => 1,
        'prefershttps' => 1,
@@ -4400,6 +4569,8 @@ $wgGroupPermissions['bureaucrat']['noratelimit'] = true;
 #$wgGroupPermissions['suppress']['hideuser'] = true;
 // To hide revisions/log items from users and Sysops
 #$wgGroupPermissions['suppress']['suppressrevision'] = true;
+// To view revisions/log items hidden from users and Sysops
+#$wgGroupPermissions['suppress']['viewsuppressed'] = true;
 // For private suppression log access
 #$wgGroupPermissions['suppress']['suppressionlog'] = true;
 
@@ -4998,6 +5169,13 @@ $wgDebugDBTransactions = false;
  */
 $wgDebugDumpSql = false;
 
+/**
+ * Trim logged SQL queries to this many bytes. Set 0/false/null to do no
+ * trimming.
+ * @since 1.24
+ */
+$wgDebugDumpSqlLength = 500;
+
 /**
  * Map of string log group names to log destinations.
  *
@@ -6047,13 +6225,12 @@ $wgParserOutputHooks = array();
 $wgEnableParserLimitReporting = true;
 
 /**
- * List of valid skin names.
+ * List of valid skin names
+ *
  * The key should be the name in all lower case, the value should be a properly
- * cased name for the skin. This value will be prefixed with "Skin" to create the
- * class name of the skin to load, and if the skin's class cannot be found through
- * the autoloader it will be used to load a .php file by that name in the skins directory.
- * The default skins will be added later, by Skin::getSkinNames(). Use
- * Skin::getSkinNames() as an accessor if you wish to have access to the full list.
+ * cased name for the skin. This value will be prefixed with "Skin" to create
+ * the class name of the skin to load. Use Skin::getSkinNames() as an accessor
+ * if you wish to have access to the full list.
  */
 $wgValidSkinNames = array();
 
@@ -6882,12 +7059,12 @@ $wgShellLocale = 'en_US.utf8';
  */
 
 /**
- * Timeout for HTTP requests done internally
+ * Timeout for HTTP requests done internally, in seconds.
  */
 $wgHTTPTimeout = 25;
 
 /**
- * Timeout for Asynchronous (background) HTTP requests
+ * Timeout for Asynchronous (background) HTTP requests, in seconds.
  */
 $wgAsyncHTTPTimeout = 25;
 
@@ -7083,12 +7260,6 @@ $wgSiteTypes = array(
        'mediawiki' => 'MediaWikiSite',
 );
 
-/**
- * Formerly a list of files for HipHop compilation
- * @deprecated since 1.22
- */
-$wgCompiledFiles = array();
-
 /**
  * Whether the page_props table has a pp_sortkey column. Set to false in case
  * the respective database schema change was not applied.
@@ -7122,6 +7293,14 @@ $wgHKDFAlgorithm = 'sha256';
  */
 $wgPageLanguageUseDB = false;
 
+/**
+ * Enable use of the *_namespace fields of the pagelinks, redirect, and templatelinks tables.
+ * Set this only if the fields are fully populated. This may be removed in 1.25.
+ * @var bool
+ * @since 1.24
+ */
+$wgUseLinkNamespaceDBFields = false;
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index 88c49a7..6454cfa 100644 (file)
@@ -66,11 +66,6 @@ class EditPage {
         */
        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
         */
@@ -104,7 +99,7 @@ class EditPage {
        const AS_NO_CREATE_PERMISSION = 223;
 
        /**
-        * Status: user tried to create a blank page
+        * Status: user tried to create a blank page and wpIgnoreBlankArticle == false
         */
        const AS_BLANK_ARTICLE = 224;
 
@@ -129,11 +124,6 @@ class EditPage {
         */
        const AS_MAX_ARTICLE_SIZE_EXCEEDED = 229;
 
-       /**
-        * not used
-        */
-       const AS_OK = 230;
-
        /**
         * Status: WikiPage::doEdit() was unsuccessful
         */
@@ -254,6 +244,12 @@ class EditPage {
        /** @var bool */
        protected $allowBlankSummary = false;
 
+       /** @var bool */
+       protected $blankArticle = false;
+
+       /** @var bool */
+       protected $allowBlankArticle = false;
+
        /** @var string */
        protected $autoSumm = '';
 
@@ -421,7 +417,7 @@ class EditPage {
         *
         * @param string $modelId The ID of the content model to test. Use CONTENT_MODEL_XXX constants.
         * @return bool
-        * @throws MWException if $modelId has no known handler
+        * @throws MWException If $modelId has no known handler
         */
        public function isSupportedContentModel( $modelId ) {
                return $this->allowNonTextContent ||
@@ -643,26 +639,6 @@ class EditPage {
                }
        }
 
-       /**
-        * Show a read-only error
-        * Parameters are the same as OutputPage:readOnlyPage()
-        * Redirect to the article page if redlink=1
-        * @deprecated since 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.
-                       // Redirect to the article page and let them click the edit tab if
-                       // they really want a permission error.
-                       $wgOut->redirect( $this->mTitle->getFullURL() );
-               } else {
-                       $wgOut->readOnlyPage( $source, $protected, $reasons, $action );
-               }
-       }
-
        /**
         * Should we show a preview when the edit form is first shown?
         *
@@ -720,7 +696,7 @@ class EditPage {
         * Subclasses may override this to replace the default behavior, which is
         * to check ContentHandler::supportsSections.
         *
-        * @return bool true if this edit page supports sections, false otherwise.
+        * @return bool True if this edit page supports sections, false otherwise.
         */
        protected function isSectionEditSupported() {
                $contentHandler = ContentHandler::getForTitle( $this->mTitle );
@@ -860,6 +836,8 @@ class EditPage {
                        }
 
                        $this->autoSumm = $request->getText( 'wpAutoSummary' );
+
+                       $this->allowBlankArticle = $request->getBool( 'wpIgnoreBlankArticle' );
                } else {
                        # Not a posted form? Start with nothing.
                        wfDebug( __METHOD__ . ": Not a posted form.\n" );
@@ -980,29 +958,6 @@ class EditPage {
                return true;
        }
 
-       /**
-        * Fetch initial editing page content.
-        *
-        * @param string|bool $def_text
-        * @return string|bool string on success, $def_text for invalid sections
-        * @private
-        * @deprecated since 1.21, get WikiPage::getContent() instead.
-        */
-       function getContent( $def_text = false ) {
-               ContentHandler::deprecated( __METHOD__, '1.21' );
-
-               if ( $def_text !== null && $def_text !== false && $def_text !== '' ) {
-                       $def_content = $this->toEditContent( $def_text );
-               } else {
-                       $def_content = false;
-               }
-
-               $content = $this->getContentObject( $def_content );
-
-               // Note: EditPage should only be used with text based content anyway.
-               return $this->toEditText( $content );
-       }
-
        /**
         * @param Content|null $def_content The default value to return
         *
@@ -1190,20 +1145,6 @@ class EditPage {
                }
        }
 
-       /**
-        * Use this method before edit() to preload some text into the edit box
-        *
-        * @param string $text
-        * @deprecated since 1.21, use setPreloadedContent() instead.
-        */
-       public function setPreloadedText( $text ) {
-               ContentHandler::deprecated( __METHOD__, "1.21" );
-
-               $content = $this->toEditContent( $text );
-
-               $this->setPreloadedContent( $content );
-       }
-
        /**
         * Use this method before edit() to preload some content into the edit box
         *
@@ -1215,25 +1156,6 @@ class EditPage {
                $this->mPreloadContent = $content;
        }
 
-       /**
-        * Get the contents to be preloaded into the box, either set by
-        * an earlier setPreloadText() or by loading the given page.
-        *
-        * @param string $preload representing the title to preload from.
-        *
-        * @return string
-        *
-        * @deprecated since 1.21, use getPreloadedContent() instead
-        */
-       protected function getPreloadedText( $preload ) {
-               ContentHandler::deprecated( __METHOD__, "1.21" );
-
-               $content = $this->getPreloadedContent( $preload );
-               $text = $this->toEditText( $content );
-
-               return $text;
-       }
-
        /**
         * Get the contents to be preloaded into the box, either set by
         * an earlier setPreloadText() or by loading the given page.
@@ -1331,7 +1253,7 @@ class EditPage {
         * If the variable were set on the server, it would be cached, which is unwanted
         * since the post-edit state should only apply to the load right after the save.
         *
-        * @param $statusValue int The status value (to check for new article status)
+        * @param int $statusValue The status value (to check for new article status)
         */
        protected function setPostEditCookie( $statusValue ) {
                $revisionId = $this->mArticle->getLatest();
@@ -1353,7 +1275,7 @@ class EditPage {
        /**
         * Attempt submission
         * @throws UserBlockedError|ReadOnlyError|ThrottledError|PermissionsError
-        * @return bool false if output is done, true if the rest of the form should be displayed
+        * @return bool False if output is done, true if the rest of the form should be displayed
         */
        public function attemptSave() {
                global $wgUser;
@@ -1373,7 +1295,7 @@ class EditPage {
         * @param array|bool $resultDetails
         *
         * @throws ErrorPageError
-        * @return bool false, if output is done, true if rest of the form should be displayed
+        * @return bool False, if output is done, true if rest of the form should be displayed
         */
        private function handleStatus( Status $status, $resultDetails ) {
                global $wgUser, $wgOut;
@@ -1400,6 +1322,7 @@ class EditPage {
                        case self::AS_TEXTBOX_EMPTY:
                        case self::AS_MAX_ARTICLE_SIZE_EXCEEDED:
                        case self::AS_END:
+                       case self::AS_BLANK_ARTICLE:
                                return true;
 
                        case self::AS_HOOK_ERROR:
@@ -1435,10 +1358,6 @@ class EditPage {
                                $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;
@@ -1777,7 +1696,9 @@ class EditPage {
                                $defaultText = '';
                        }
 
-                       if ( $this->textbox1 === $defaultText ) {
+                       if ( !$this->allowBlankArticle && $this->textbox1 === $defaultText ) {
+                               $this->blankArticle = true;
+                               $status->fatal( 'blankarticle' );
                                $status->setResult( false, self::AS_BLANK_ARTICLE );
                                wfProfileOut( __METHOD__ );
                                return $status;
@@ -2017,7 +1938,7 @@ class EditPage {
 
                        // Do this in its own transaction to reduce contention...
                        $dbw = wfGetDB( DB_MASTER );
-                       $dbw->onTransactionIdle( function() use ( $dbw, $title, $watch, $wgUser, $fname ) {
+                       $dbw->onTransactionIdle( function () use ( $dbw, $title, $watch, $wgUser, $fname ) {
                                $dbw->begin( $fname );
                                WatchAction::doWatchOrUnwatch( $watch, $title, $wgUser );
                                $dbw->commit( $fname );
@@ -2025,28 +1946,6 @@ class EditPage {
                }
        }
 
-       /**
-        * Attempts to merge text content with base and current revisions
-        *
-        * @param string $editText
-        *
-        * @return bool
-        * @deprecated since 1.21, use mergeChangesIntoContent() instead
-        */
-       function mergeChangesInto( &$editText ) {
-               ContentHandler::deprecated( __METHOD__, "1.21" );
-
-               $editContent = $this->toEditContent( $editText );
-
-               $ok = $this->mergeChangesIntoContent( $editContent );
-
-               if ( $ok ) {
-                       $editText = $this->toEditText( $editContent );
-                       return true;
-               }
-               return false;
-       }
-
        /**
         * Attempts to do 3-way merge of edit content with a base revision
         * and current content, in case of edit conflict, in whichever way appropriate
@@ -2324,7 +2223,7 @@ class EditPage {
         * @param Content|null|bool|string $content
         * @return string The editable text form of the content.
         *
-        * @throws MWException if $content is not an instance of TextContent and
+        * @throws MWException If $content is not an instance of TextContent and
         *   $this->allowNonTextContent is not true.
         */
        protected function toEditText( $content ) {
@@ -2356,7 +2255,7 @@ class EditPage {
         * @return Content The content object created from $text. If $text was false
         *   or null, false resp. null will be  returned instead.
         *
-        * @throws MWException if unserializing the text results in a Content
+        * @throws MWException If unserializing the text results in a Content
         *   object that is not an instance of TextContent and
         *   $this->allowNonTextContent is not true.
         */
@@ -2527,10 +2426,16 @@ class EditPage {
 
                $wgOut->addHTML( $this->editFormTextBeforeContent );
 
-               if ( !$this->isCssJsSubpage && $showToolbar && $wgUser->getOption( 'showtoolbar' ) ) {
+               if ( $this->contentModel === CONTENT_MODEL_WIKITEXT &&
+                       $showToolbar && $wgUser->getOption( 'showtoolbar' ) )
+               {
                        $wgOut->addHTML( EditPage::getEditToolbar() );
                }
 
+               if ( $this->blankArticle ) {
+                       $wgOut->addHTML( Html::hidden( 'wpIgnoreBlankArticle', true ) );
+               }
+
                if ( $this->isConflict ) {
                        // In an edit conflict bypass the overridable content form method
                        // and fallback to the raw wpTextbox1 since editconflicts can't be
@@ -2600,7 +2505,7 @@ class EditPage {
         * Extract the section title from current section text, if any.
         *
         * @param string $text
-        * @return string|bool string or false
+        * @return string|bool String or false
         */
        public static function extractSectionTitle( $text ) {
                preg_match( "/^(=+)(.+)\\1\\s*(\n|$)/i", $text, $matches );
@@ -2659,6 +2564,10 @@ class EditPage {
                                $wgOut->wrapWikiMsg( "<div id='mw-missingcommentheader'>\n$1\n</div>", 'missingcommentheader' );
                        }
 
+                       if ( $this->blankArticle ) {
+                               $wgOut->wrapWikiMsg( "<div id='mw-blankarticle'>\n$1\n</div>", 'blankarticle' );
+                       }
+
                        if ( $this->hookError !== '' ) {
                                $wgOut->addWikiText( $this->hookError );
                        }
@@ -2846,7 +2755,7 @@ class EditPage {
        }
 
        /**
-        * @param bool $isSubjectPreview true if this is the section subject/title
+        * @param bool $isSubjectPreview True if this is the section subject/title
         *   up top, or false if this is the comment summary
         *   down below the textarea
         * @param string $summary The text of the summary to display
@@ -2877,7 +2786,7 @@ class EditPage {
        }
 
        /**
-        * @param bool $isSubjectPreview true if this is the section subject/title
+        * @param bool $isSubjectPreview True if this is the section subject/title
         *   up top, or false if this is the comment summary
         *   down below the textarea
         * @param string $summary The text of the summary to display
@@ -3897,40 +3806,6 @@ HTML
                echo $s;
        }
 
-       /**
-        * Call the stock "user is blocked" page
-        *
-        * @deprecated since 1.19; throw an exception directly instead
-        */
-       function blockedPage() {
-               wfDeprecated( __METHOD__, '1.19' );
-               global $wgUser;
-
-               throw new UserBlockedError( $wgUser->getBlock() );
-       }
-
-       /**
-        * Produce the stock "please login to edit pages" page
-        *
-        * @deprecated since 1.19; throw an exception directly instead
-        */
-       function userNotLoggedInPage() {
-               wfDeprecated( __METHOD__, '1.19' );
-               throw new PermissionsError( 'edit' );
-       }
-
-       /**
-        * Show an error page saying to the user that he has insufficient permissions
-        * to create a new page
-        *
-        * @deprecated since 1.19; throw an exception directly instead
-        */
-       function noCreatePermission() {
-               wfDeprecated( __METHOD__, '1.19' );
-               $permission = $this->mTitle->isTalkPage() ? 'createtalk' : 'createpage';
-               throw new PermissionsError( $permission );
-       }
-
        /**
         * Creates a basic error page which informs the user that
         * they have attempted to edit a nonexistent section.
index 21fcd5a..43dfd17 100644 (file)
@@ -69,7 +69,7 @@ class WikiExporter {
         * @return string
         */
        public static function schemaVersion() {
-               return "0.8";
+               return "0.9";
        }
 
        /**
@@ -507,8 +507,17 @@ class XmlDumpWriter {
                return Xml::element( 'mediawiki', array(
                        'xmlns'              => "http://www.mediawiki.org/xml/export-$ver/",
                        'xmlns:xsi'          => "http://www.w3.org/2001/XMLSchema-instance",
+                       /*
+                        * When a new version of the schema is created, it needs staging on mediawiki.org.
+                        * This requires a change in the operations/mediawiki-config git repo.
+                        *
+                        * Create a changeset like https://gerrit.wikimedia.org/r/#/c/149643/ in which
+                        * you copy in the new xsd file.
+                        *
+                        * After it is reviewed, merged and deployed (sync-docroot), the index.html needs purging.
+                        * echo "http://www.mediawiki.org/xml/index.html" | mwscript purgeList.php --wiki=aawiki
+                        */
                        'xsi:schemaLocation' => "http://www.mediawiki.org/xml/export-$ver/ " .
-                               #TODO: how do we get a new version up there?
                                "http://www.mediawiki.org/xml/export-$ver.xsd",
                        'version'            => $ver,
                        'xml:lang'           => $wgLanguageCode ),
@@ -523,6 +532,7 @@ class XmlDumpWriter {
        function siteInfo() {
                $info = array(
                        $this->sitename(),
+                       $this->dbname(),
                        $this->homelink(),
                        $this->generator(),
                        $this->caseSetting(),
@@ -540,6 +550,14 @@ class XmlDumpWriter {
                return Xml::element( 'sitename', array(), $wgSitename );
        }
 
+       /**
+        * @return string
+        */
+       function dbname() {
+               global $wgDBname;
+               return Xml::element( 'dbname', array(), $wgDBname );
+       }
+
        /**
         * @return string
         */
@@ -1552,23 +1570,3 @@ class DumpMultiWriter {
                return $filenames;
        }
 }
-
-/**
- * @param string $string
- * @return string
- * @todo FIXME: Only used in OAI extension. Move over there.
- */
-function xmlsafe( $string ) {
-       wfProfileIn( __FUNCTION__ );
-
-       /**
-        * 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.
-        */
-       $string = UtfNormal::cleanUp( $string );
-
-       $string = htmlspecialchars( $string );
-       wfProfileOut( __FUNCTION__ );
-       return $string;
-}
index e38bdf1..8e7f4b7 100644 (file)
  */
 class Fallback {
 
-       /**
-        * @param string $from
-        * @param string $to
-        * @param string $string
-        * @return string
-        */
-       public static function iconv( $from, $to, $string ) {
-               if ( substr( $to, -8 ) == '//IGNORE' ) {
-                       $to = substr( $to, 0, strlen( $to ) - 8 );
-               }
-               if ( strcasecmp( $from, $to ) == 0 ) {
-                       return $string;
-               }
-               if ( strcasecmp( $from, 'utf-8' ) == 0 ) {
-                       return utf8_decode( $string );
-               }
-               if ( strcasecmp( $to, 'utf-8' ) == 0 ) {
-                       return utf8_encode( $string );
-               }
-               return $string;
-       }
-
        /**
         * Fallback implementation for mb_substr, hardcoded to UTF-8.
         * Attempts to be at least _moderately_ efficient; best optimized
@@ -174,8 +152,8 @@ class Fallback {
         * Fallback implementation of mb_strrpos, hardcoded to UTF-8.
         * @param string $haystack
         * @param string $needle
-        * @param string $offset optional start position
-        * @param string $encoding optional encoding; ignored
+        * @param string $offset Optional start position
+        * @param string $encoding Optional encoding; ignored
         * @return int
         */
        public static function mb_strrpos( $haystack, $needle, $offset = 0, $encoding = '' ) {
index 1674b13..58f3ebd 100644 (file)
@@ -174,7 +174,7 @@ class FeedItem {
        /**
         * Quickie hack... strip out wikilinks to more legible form from the comment.
         *
-        * @param string $text wikitext
+        * @param string $text Wikitext
         * @return string
         */
        public static function stripComment( $text ) {
index 83ce755..6937c32 100644 (file)
@@ -48,7 +48,7 @@ class FeedUtils {
        /**
         * Check whether feeds can be used and that $type is a valid feed type
         *
-        * @param string $type feed type, as requested by the user
+        * @param string $type Feed type, as requested by the user
         * @return bool
         */
        public static function checkFeedOutput( $type ) {
index acf1bf6..7052820 100644 (file)
@@ -274,7 +274,7 @@ class GitInfo {
 
        /**
         * Get the URL of the remote origin.
-        * @return string|bool string if a URL is available or false otherwise.
+        * @return string|bool String if a URL is available or false otherwise.
         */
        protected function getRemoteUrl() {
                if ( !isset( $this->cache['remoteURL'] ) ) {
index cb5b7fd..4c2b772 100644 (file)
@@ -35,16 +35,6 @@ if ( !defined( 'MEDIAWIKI' ) ) {
  * PHP extensions may be included here.
  */
 
-if ( !function_exists( 'iconv' ) ) {
-       /**
-        * @codeCoverageIgnore
-        * @return string
-        */
-       function iconv( $from, $to, $string ) {
-               return Fallback::iconv( $from, $to, $string );
-       }
-}
-
 if ( !function_exists( 'mb_substr' ) ) {
        /**
         * @codeCoverageIgnore
@@ -186,21 +176,6 @@ function wfArrayDiff2_cmp( $a, $b ) {
        }
 }
 
-/**
- * Array lookup
- * Returns an array where the values in array $b are replaced by the
- * values in array $a with the corresponding keys
- *
- * @deprecated since 1.22; use array_intersect_key()
- * @param array $a
- * @param array $b
- * @return array
- */
-function wfArrayLookup( $a, $b ) {
-       wfDeprecated( __FUNCTION__, '1.22' );
-       return array_flip( array_intersect( array_flip( $a ), array_keys( $b ) ) );
-}
-
 /**
  * Appends to second array if $value differs from that in $default
  *
@@ -219,27 +194,6 @@ function wfAppendToArrayIfNotDefault( $key, $value, $default, &$changed ) {
        }
 }
 
-/**
- * Backwards array plus for people who haven't bothered to read the PHP manual
- * XXX: will not darn your socks for you.
- *
- * @deprecated since 1.22; use array_replace()
- *
- * @param array $array1 Initial array to merge.
- * @param array [$array2,...] Variable list of arrays to merge.
- * @return array
- */
-function wfArrayMerge( $array1 /*...*/ ) {
-       wfDeprecated( __FUNCTION__, '1.22' );
-       $args = func_get_args();
-       $args = array_reverse( $args, true );
-       $out = array();
-       foreach ( $args as $arg ) {
-               $out += $arg;
-       }
-       return $out;
-}
-
 /**
  * Merge arrays in the style of getUserPermissionsErrors, with duplicate removal
  * e.g.
@@ -256,7 +210,7 @@ function wfArrayMerge( $array1 /*...*/ ) {
  *             array( 'y' )
  *     )
  *
- * @param array [$array1,...]
+ * @param array $array1,...
  * @return array
  */
 function wfMergeErrorArrays( /*...*/ ) {
@@ -1189,7 +1143,7 @@ function wfDeprecated( $function, $version = false, $component = false, $callerO
  * Send a warning either to the debug log or in a PHP error depending on
  * $wgDevelopmentWarnings. To log warnings in production, use wfLogWarning() instead.
  *
- * @param string $msg message to send
+ * @param string $msg Message to send
  * @param int $callerOffset Number of items to go back in the backtrace to
  *        find the correct caller (1 = function calling wfWarn, ...)
  * @param int $level PHP error level; defaults to E_USER_NOTICE;
@@ -1448,7 +1402,7 @@ function wfGetLangObj( $langcode = false ) {
  * This function replaces all old wfMsg* functions.
  *
  * @param string $key Message key
- * @param mixed [$params,...] Normal message parameters
+ * @param mixed $params,... Normal message parameters
  * @return Message
  *
  * @since 1.17
@@ -1469,7 +1423,7 @@ function wfMessage( $key /*...*/ ) {
  * for the first message which is non-empty. If all messages are empty then an
  * instance of the first message key is returned.
  *
- * @param string|string[] [$keys,...] Message keys
+ * @param string|string[] $keys,... Message keys
  * @return Message
  *
  * @since 1.18
@@ -1489,7 +1443,7 @@ function wfMessageFallback( /*...*/ ) {
  *
  * @deprecated since 1.18
  *
- * @param string $key lookup key for the message, usually
+ * @param string $key Lookup key for the message, usually
  *    defined in languages/Language.php
  *
  * Parameters to the message, which can be used to insert variable text into
@@ -1674,7 +1628,7 @@ function wfMsgReplaceArgs( $message, $args ) {
  * @deprecated since 1.18
  *
  * @param string $key
- * @param string [$args,...] Parameters
+ * @param string $args,... Parameters
  * @return string
  */
 function wfMsgHtml( $key ) {
@@ -1695,7 +1649,7 @@ function wfMsgHtml( $key ) {
  * @deprecated since 1.18
  *
  * @param string $key
- * @param string [$args,...] Parameters
+ * @param string $args,... Parameters
  * @return string
  */
 function wfMsgWikiHtml( $key ) {
@@ -1817,19 +1771,6 @@ function wfEmptyMsg( $key ) {
        return MessageCache::singleton()->get( $key, /*useDB*/true, /*content*/false ) === false;
 }
 
-/**
- * Throw a debugging exception. This function previously once exited the process,
- * but now throws an exception instead, with similar results.
- *
- * @deprecated since 1.22; just throw an MWException yourself
- * @param string $msg Message shown when dying.
- * @throws MWException
- */
-function wfDebugDieBacktrace( $msg = '' ) {
-       wfDeprecated( __FUNCTION__, '1.22' );
-       throw new MWException( $msg );
-}
-
 /**
  * Fetch server name for use in error reporting etc.
  * Use real server name if available, so we know which machine
@@ -1883,7 +1824,7 @@ function wfReportTime() {
        $responseTime = round( ( microtime( true ) - $wgRequestTime ) * 1000 );
        $reportVars = array( 'wgBackendResponseTime' => $responseTime );
        if ( $wgShowHostnames ) {
-               $reportVars[ 'wgHostname' ] = wfHostname();
+               $reportVars['wgHostname'] = wfHostname();
        }
        return Skin::makeVariablesScript( $reportVars );
 }
@@ -2028,36 +1969,6 @@ function wfShowingResults( $offset, $limit ) {
        return wfMessage( 'showingresults' )->numParams( $limit, $offset + 1 )->parse();
 }
 
-/**
- * Generate (prev x| next x) (20|50|100...) type links for paging
- *
- * @param string $offset
- * @param int $limit
- * @param string $link
- * @param string $query Optional URL query parameter string
- * @param bool $atend Optional param for specified if this is the last page
- * @return string
- * @deprecated since 1.19; use Language::viewPrevNext() instead
- */
-function wfViewPrevNext( $offset, $limit, $link, $query = '', $atend = false ) {
-       wfDeprecated( __METHOD__, '1.19' );
-
-       global $wgLang;
-
-       $query = wfCgiToArray( $query );
-
-       if ( is_object( $link ) ) {
-               $title = $link;
-       } else {
-               $title = Title::newFromText( $link );
-               if ( is_null( $title ) ) {
-                       return false;
-               }
-       }
-
-       return $wgLang->viewPrevNext( $title, $offset, $limit, $query, $atend );
-}
-
 /**
  * @todo document
  * @todo FIXME: We may want to blacklist some broken browsers
@@ -2156,16 +2067,6 @@ function wfEscapeWikiText( $text ) {
        return $text;
 }
 
-/**
- * Get the current unix timestamp with microseconds.  Useful for profiling
- * @deprecated since 1.22; call microtime() directly
- * @return float
- */
-function wfTime() {
-       wfDeprecated( __FUNCTION__, '1.22' );
-       return microtime( true );
-}
-
 /**
  * Sets dest to source and returns the original value of dest
  * If source is NULL, it just returns the value, it doesn't set the variable
@@ -2316,7 +2217,7 @@ function wfClearOutputBuffers() {
  * factors
  *
  * @param string $accept
- * @param string $def default
+ * @param string $def Default
  * @return float[] Associative array of string => float pairs
  */
 function wfAcceptToPrefs( $accept, $def = '*/*' ) {
@@ -2741,7 +2642,7 @@ function wfIniGetBool( $setting ) {
  * Also fixes the locale problems on Linux in PHP 5.2.6+ (bug backported to
  * earlier distro releases of PHP)
  *
- * @param string [$args,...]
+ * @param string $args,...
  * @return string
  */
 function wfEscapeShellArg( /*...*/ ) {
@@ -2825,7 +2726,9 @@ function wfShellExecDisabled() {
  * Execute a shell command, with time and memory limits mirrored from the PHP
  * configuration if supported.
  *
- * @param string $cmd Command line, properly escaped for shell.
+ * @param string|string[] $cmd If string, a properly shell-escaped command line,
+ *   or an array of unescaped arguments, in which case each value will be escaped
+ *   Example:   [ 'convert', '-font', 'font name' ] would produce "'convert' '-font' 'font name'"
  * @param null|mixed &$retval Optional, will receive the program's exit code.
  *   (non-zero is usually failure). If there is an error from
  *   read, select, or proc_open(), this will be set to -1.
@@ -2874,6 +2777,15 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(),
                        $envcmd .= "$k=" . escapeshellarg( $v ) . ' ';
                }
        }
+       if ( is_array( $cmd ) ) {
+               // Command line may be given as an array, escape each value and glue them together with a space
+               $cmdVals = array();
+               foreach ( $cmd as $val ) {
+                       $cmdVals[] = wfEscapeShellArg( $val );
+               }
+               $cmd = implode( ' ', $cmdVals );
+       }
+
        $cmd = $envcmd . $cmd;
 
        $useLogPipe = false;
@@ -2950,19 +2862,28 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(),
                $fds[(int)$pipe] = $fd;
        }
 
-       while ( true ) {
-               $status = proc_get_status( $proc );
-               if ( !$status['running'] ) {
-                       break;
+       $running = true;
+       $timeout = null;
+       $numReadyPipes = 0;
+
+       while ( $running === true || $numReadyPipes !== 0 ) {
+               if ( $running ) {
+                       $status = proc_get_status( $proc );
+                       // If the process has terminated, switch to nonblocking selects
+                       // for getting any data still waiting to be read.
+                       if ( !$status['running'] ) {
+                               $running = false;
+                               $timeout = 0;
+                       }
                }
-               $status = false;
 
                $readyPipes = $pipes;
 
                // Clear last error
                // @codingStandardsIgnoreStart Generic.PHP.NoSilencedErrors.Discouraged
                @trigger_error( '' );
-               if ( @stream_select( $readyPipes, $emptyArray, $emptyArray, null ) === false ) {
+               $numReadyPipes = @stream_select( $readyPipes, $emptyArray, $emptyArray, $timeout );
+               if ( $numReadyPipes === false ) {
                        // @codingStandardsIgnoreEnd
                        $error = error_get_last();
                        if ( strncmp( $error['message'], $eintrMessage, strlen( $eintrMessage ) ) == 0 ) {
@@ -3010,7 +2931,7 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(),
 
        // Use the status previously collected if possible, since proc_get_status()
        // just calls waitpid() which will not return anything useful the second time.
-       if ( $status === false ) {
+       if ( $running ) {
                $status = proc_get_status( $proc );
        }
 
@@ -3051,7 +2972,7 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(),
  * @param string $cmd Command line, properly escaped for shell.
  * @param null|mixed &$retval Optional, will receive the program's exit code.
  *   (non-zero is usually failure)
- * @param array $environ optional environment variables which should be
+ * @param array $environ Optional environment variables which should be
  *   added to the executed command environment.
  * @param array $limits Optional array with limits(filesize, memory, time, walltime)
  *   this overwrites the global wgMaxShell* limits.
@@ -3499,7 +3420,7 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1,
 /**
  * Check if there is sufficient entropy in php's built-in session generation
  *
- * @return bool true = there is sufficient entropy
+ * @return bool True = there is sufficient entropy
  */
 function wfCheckEntropy() {
        return (
@@ -3605,7 +3526,7 @@ function wfGetPrecompiledData( $name ) {
 /**
  * Get a cache key
  *
- * @param string [$args,...]
+ * @param string $args,...
  * @return string
  */
 function wfMemcKey( /*...*/ ) {
@@ -3622,7 +3543,7 @@ function wfMemcKey( /*...*/ ) {
  *
  * @param string $db
  * @param string $prefix
- * @param string [$args,...]
+ * @param string $args,...
  * @return string
  */
 function wfForeignMemcKey( $db, $prefix /*...*/ ) {
@@ -3694,7 +3615,7 @@ function &wfGetDB( $db, $groups = array(), $wiki = false ) {
 /**
  * Get a load balancer object.
  *
- * @param string|bool $wiki wiki ID, or false for the current wiki
+ * @param string|bool $wiki Wiki ID, or false for the current wiki
  * @return LoadBalancer
  */
 function wfGetLB( $wiki = false ) {
@@ -3714,7 +3635,7 @@ function &wfGetLBFactory() {
  * Find a file.
  * Shortcut for RepoGroup::singleton()->findFile()
  *
- * @param string $title or Title object
+ * @param string $title String or Title object
  * @param array $options Associative array of options:
  *     time:           requested time for an archived image, or false for the
  *                     current version. An image object will be returned which was
@@ -3781,7 +3702,7 @@ function wfScript( $script = 'index' ) {
 /**
  * Get the script URL.
  *
- * @return string script URL
+ * @return string Script URL
  */
 function wfGetScriptUrl() {
        if ( isset( $_SERVER['SCRIPT_NAME'] ) ) {
@@ -3828,11 +3749,15 @@ function wfGetNull() {
  * in maintenance scripts, to avoid causing too much lag.  Of course, this is
  * a no-op if there are no slaves.
  *
- * @param int|bool $maxLag (deprecated)
+ * @param float|null $ifWritesSince Only wait if writes were done since this UNIX timestamp
  * @param string|bool $wiki Wiki identifier accepted by wfGetLB
  * @param string|bool $cluster Cluster name accepted by LBFactory. Default: false.
+ * @return bool Success (able to connect and no timeouts reached)
  */
-function wfWaitForSlaves( $maxLag = false, $wiki = false, $cluster = false ) {
+function wfWaitForSlaves( $ifWritesSince = false, $wiki = false, $cluster = false ) {
+       // B/C: first argument used to be "max seconds of lag"; ignore such values
+       $ifWritesSince = ( $ifWritesSince > 1e9 ) ? $ifWritesSince : false;
+
        if ( $cluster !== false ) {
                $lb = wfGetLBFactory()->getExternalLB( $cluster );
        } else {
@@ -3842,14 +3767,22 @@ function wfWaitForSlaves( $maxLag = false, $wiki = false, $cluster = false ) {
        // bug 27975 - Don't try to wait for slaves if there are none
        // Prevents permission error when getting master position
        if ( $lb->getServerCount() > 1 ) {
+               if ( $ifWritesSince && !$lb->hasMasterConnection() ) {
+                       return true; // assume no writes done
+               }
                $dbw = $lb->getConnection( DB_MASTER, array(), $wiki );
+               if ( $ifWritesSince && $dbw->lastDoneWrites() < $ifWritesSince ) {
+                       return true; // no writes since the last wait
+               }
                $pos = $dbw->getMasterPos();
                // The DBMS may not support getMasterPos() or the whole
                // load balancer might be fake (e.g. $wgAllDBsAreLocalhost).
                if ( $pos !== false ) {
-                       $lb->waitForAll( $pos );
+                       return $lb->waitForAll( $pos, PHP_SAPI === 'cli' ? 86400 : null );
                }
        }
+
+       return true;
 }
 
 /**
@@ -4053,7 +3986,7 @@ function wfRunHooks( $event, array $args = array(), $deprecatedVersion = null )
  * Also be careful when using this function to read unsigned 32 bit integer
  * because php might make it negative.
  *
- * @throws MWException if $data not long enough, or if unpack fails
+ * @throws MWException If $data not long enough, or if unpack fails
  * @return array Associative array of the extracted data
  */
 function wfUnpack( $format, $data, $length = false ) {
index d0cae36..d2be9e9 100644 (file)
@@ -202,7 +202,7 @@ class HistoryBlobStub {
        /** @var string */
        public $mHash;
 
-       /** @var  */
+       /** @var string */
        public $mRef;
 
        /**
@@ -593,7 +593,7 @@ class DiffHistoryBlob implements HistoryBlob {
         * the bytes backwards and initialised with 0 instead of 1. See bug 34428.
         *
         * @param string $s
-        * @return string|bool false if the hash extension is not available
+        * @return string|bool False if the hash extension is not available
         */
        function xdiffAdler32( $s ) {
                if ( !function_exists( 'hash' ) ) {
index 77486b2..2928748 100644 (file)
@@ -64,10 +64,10 @@ class Hooks {
         * Clears hooks registered via Hooks::register(). Does not touch $wgHooks.
         * This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
         *
-        * @param string $name the name of the hook to clear.
+        * @param string $name The name of the hook to clear.
         *
         * @since 1.21
-        * @throws MWException if not in testing mode.
+        * @throws MWException If not in testing mode.
         */
        public static function clear( $name ) {
                if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
@@ -123,7 +123,7 @@ class Hooks {
         * Finally, process the return value and return/throw accordingly.
         *
         * @param string $event Event name
-        * @param array $args  Array of parameters passed to hook functions
+        * @param array $args Array of parameters passed to hook functions
         * @param string|null $deprecatedVersion Optionally, mark hook as deprecated with version number
         * @return bool True if no handler aborted the hook
         *
index 5f4655c..ce439cb 100644 (file)
@@ -114,7 +114,7 @@ class Html {
         * shaved off the HTML output as well.
         *
         * @param string $element The element's name, e.g., 'a'
-        * @param array $attribs  Associative array of attributes, e.g., array(
+        * @param array $attribs Associative array of attributes, e.g., array(
         *   'href' => 'http://www.mediawiki.org/' ). See expandAttributes() for
         *   further documentation.
         * @param string $contents The raw HTML contents of the element: *not*
@@ -414,7 +414,7 @@ class Html {
         *   you can omit the key, e.g., array( 'checked' ) instead of
         *   array( 'checked' => 'checked' ) or such.
         *
-        * @throws MWException if an attribute that doesn't allow lists is set to an array
+        * @throws MWException If an attribute that doesn't allow lists is set to an array
         * @return string HTML fragment that goes between element name and '>'
         *   (starting with a space if at least one attribute is output)
         */
@@ -502,7 +502,7 @@ class Html {
 
                                // Remove duplicates and create the string
                                $value = implode( ' ', array_unique( $value ) );
-                       } else if ( is_array( $value ) ) {
+                       } elseif ( is_array( $value ) ) {
                                throw new MWException( "HTML attribute $key can not contain a list of values" );
                        }
 
@@ -654,6 +654,64 @@ class Html {
                return self::element( 'input', $attribs );
        }
 
+       /**
+        * Convenience function to produce a checkbox (input element with type=checkbox)
+        *
+        * @param string $name Name attribute
+        * @param bool $checked Whether the checkbox is checked or not
+        * @param array $attribs Array of additional attributes
+        */
+       public static function check( $name, $checked = false, array $attribs = array() ) {
+               if ( isset( $attribs['value'] ) ) {
+                       $value = $attribs['value'];
+                       unset( $attribs['value'] );
+               } else {
+                       $value = 1;
+               }
+
+               if ( $checked ) {
+                       $attribs[] = 'checked';
+               }
+
+               return self::input( $name, $value, 'checkbox', $attribs );
+       }
+
+       /**
+        * Convenience function to produce a checkbox (input element with type=checkbox)
+        *
+        * @param string $name Name attribute
+        * @param bool $checked Whether the checkbox is checked or not
+        * @param array $attribs Array of additional attributes
+        */
+       public static function radio( $name, $checked = false, array $attribs = array() ) {
+               if ( isset( $attribs['value'] ) ) {
+                       $value = $attribs['value'];
+                       unset( $attribs['value'] );
+               } else {
+                       $value = 1;
+               }
+
+               if ( $checked ) {
+                       $attribs[] = 'checked';
+               }
+
+               return self::input( $name, $value, 'radio', $attribs );
+       }
+
+       /**
+        * Convenience function for generating a label for inputs.
+        *
+        * @param string $label Contents of the label
+        * @param string $id ID of the element being labeled
+        * @param array $attribs Additional attributes
+        */
+       public static function label( $label, $id, array $attribs = array() ) {
+               $attribs += array(
+                       'for' => $id
+               );
+               return self::element( 'label', $attribs, $label );
+       }
+
        /**
         * Convenience function to produce an input element with type=hidden
         *
index 38aa392..ccbfba8 100644 (file)
@@ -130,7 +130,7 @@ class HtmlFormatter {
        /**
         * Removes content we've chosen to remove.  The text of the removed elements can be
         * extracted with the getText method.
-        * @return array of removed DOMElements
+        * @return array Array of removed DOMElements
         */
        public function filterContent() {
                wfProfileIn( __METHOD__ );
@@ -138,7 +138,7 @@ class HtmlFormatter {
 
                // Bail out early if nothing to do
                if ( array_reduce( $removals,
-                       function( $carry, $item ) {
+                       function ( $carry, $item ) {
                                return $carry && !$item;
                        },
                        true
@@ -209,7 +209,7 @@ class HtmlFormatter {
        /**
         * Removes a list of elelments from DOMDocument
         * @param array|DOMNodeList $elements
-        * @return array of removed elements
+        * @return array Array of removed elements
         */
        private function removeElements( $elements ) {
                $list = $elements;
@@ -237,7 +237,7 @@ class HtmlFormatter {
        private function fixLibXML( $html ) {
                wfProfileIn( __METHOD__ );
                static $replacements;
-               if ( ! $replacements ) {
+               if ( !$replacements ) {
                        // We don't include rules like '&#34;' => '&amp;quot;' because entities had already been
                        // normalized by libxml. Using this function with input not sanitized by libxml is UNSAFE!
                        $replacements = new ReplacementArray( array(
index c9dd0c0..1eb8ca5 100644 (file)
@@ -36,8 +36,8 @@ class Http {
         * Perform an HTTP request
         *
         * @param string $method HTTP method. Usually GET/POST
-        * @param string $url full URL to act on. If protocol-relative, will be expanded to an http:// URL
-        * @param array $options options to pass to MWHttpRequest object.
+        * @param string $url Full URL to act on. If protocol-relative, will be expanded to an http:// URL
+        * @param array $options Options to pass to MWHttpRequest object.
         *      Possible keys for the array:
         *    - timeout             Timeout length in seconds
         *    - connectTimeout      Timeout for connection, in seconds (curl only)
@@ -772,7 +772,7 @@ class CurlHttpRequest extends MWHttpRequest {
 
                if ( $this->followRedirects && $this->canFollowRedirects() ) {
                        wfSuppressWarnings();
-                       if ( ! curl_setopt( $curlHandle, CURLOPT_FOLLOWLOCATION, true ) ) {
+                       if ( !curl_setopt( $curlHandle, CURLOPT_FOLLOWLOCATION, true ) ) {
                                wfDebug( __METHOD__ . ": Couldn't set CURLOPT_FOLLOWLOCATION. " .
                                        "Probably safe_mode or open_basedir is set.\n" );
                                // Continue the processing. If it were in curl_setopt_array,
index 177d023..e6b5dc2 100644 (file)
@@ -45,7 +45,7 @@ class WikiImporter {
        function __construct( ImportStreamSource $source ) {
                $this->reader = new XMLReader();
 
-               if ( !in_array(  'uploadsource', stream_get_wrappers() ) ) {
+               if ( !in_array( 'uploadsource', stream_get_wrappers() ) ) {
                        stream_wrapper_register( 'uploadsource', 'UploadSourceAdapter' );
                }
                $id = UploadSourceAdapter::registerSource( $source );
@@ -395,8 +395,8 @@ class WikiImporter {
 
        /**
         * Retrieves the contents of the named attribute of the current element.
-        * @param string $attr the name of the attribute
-        * @return string the value of the attribute or an empty string if it is not set in the current element.
+        * @param string $attr The name of the attribute
+        * @return string The value of the attribute or an empty string if it is not set in the current element.
         */
        public function nodeAttribute( $attr ) {
                return $this->reader->getAttribute( $attr );
@@ -533,7 +533,7 @@ class WikiImporter {
        private function handleSiteInfo() {
                // Site info is useful, but not actually used for dump imports.
                // Includes a quick short-circuit to save performance.
-               if ( ! $this->mSiteInfoCallback ) {
+               if ( !$this->mSiteInfoCallback ) {
                        $this->reader->next();
                        return true;
                }
@@ -1050,30 +1050,6 @@ class UploadSourceAdapter {
        }
 }
 
-class XMLReader2 extends XMLReader {
-
-       /**
-        * @return bool|string
-        */
-       function nodeContents() {
-               if ( $this->isEmptyElement ) {
-                       return "";
-               }
-               $buffer = "";
-               while ( $this->read() ) {
-                       switch ( $this->nodeType ) {
-                       case XmlReader::TEXT:
-                       case XmlReader::SIGNIFICANT_WHITESPACE:
-                               $buffer .= $this->value;
-                               break;
-                       case XmlReader::END_ELEMENT:
-                               return $buffer;
-                       }
-               }
-               return $this->close();
-       }
-}
-
 /**
  * @todo document (e.g. one-sentence class description).
  * @ingroup SpecialPage
@@ -1503,6 +1479,7 @@ class WikiRevision {
                $linkCache->clear();
 
                $page = WikiPage::factory( $this->title );
+               $page->loadPageData( 'fromdbmaster' );
                if ( !$page->exists() ) {
                        # must create the page...
                        $pageId = $page->insertOn( $dbw );
index 54b779e..0bcbc91 100644 (file)
@@ -199,7 +199,7 @@ class License {
        public $text;
 
        /**
-        * @param string $str license name??
+        * @param string $str License name??
         */
        function __construct( $str ) {
                list( $text, $template ) = explode( '|', strrev( $str ), 2 );
index 7d88f25..9f578a9 100644 (file)
@@ -25,7 +25,7 @@
  * for primarily page content: links, embedded images, table of contents. Links
  * are also used in the skin.
  *
- * @todo: turn this into a legacy interface for HtmlPageLinkRenderer and similar services.
+ * @todo turn this into a legacy interface for HtmlPageLinkRenderer and similar services.
  *
  * @ingroup Skins
  */
@@ -272,7 +272,7 @@ class Linker {
         * Returns the Url used to link to a Title
         *
         * @param Title $target
-        * @param array $query query parameters
+        * @param array $query Query parameters
         * @param array $options
         * @return string
         */
@@ -937,7 +937,7 @@ class Linker {
                $query = '', $unused1 = '', $unused2 = '', $time = false
        ) {
                global $wgEnableUploads, $wgUploadMissingFileUrl, $wgUploadNavigationUrl;
-               if ( ! $title instanceof Title ) {
+               if ( !$title instanceof Title ) {
                        return "<!-- ERROR -->" . htmlspecialchars( $label );
                }
                wfProfileIn( __METHOD__ );
@@ -1379,7 +1379,7 @@ class Linker {
                                                . '<span dir="auto">' . $auto . $post . '</span>';
                                }
                                return $comment;
-               },
+                       },
                        $comment
                );
        }
@@ -1418,7 +1418,11 @@ class Linker {
 
                                # fix up urlencoded title texts (copied from Parser::replaceInternalLinks)
                                if ( strpos( $match[1], '%' ) !== false ) {
-                                       $match[1] = str_replace( array( '<', '>' ), array( '&lt;', '&gt;' ), rawurldecode( $match[1] ) );
+                                       $match[1] = str_replace(
+                                               array( '<', '>' ),
+                                               array( '&lt;', '&gt;' ),
+                                               rawurldecode( $match[1] )
+                                       );
                                }
 
                                # Handle link renaming [[foo|text]] will show link as "text"
index ad3228d..bc59588 100644 (file)
@@ -401,7 +401,7 @@ class MWTimestamp {
         *
         * @since 1.22
         * @param bool|string $ts Timestamp to set, or false for current time
-        * @return MWTimestamp the local instance
+        * @return MWTimestamp The local instance
         */
        public static function getLocalInstance( $ts = false ) {
                global $wgLocaltimezone;
@@ -415,7 +415,7 @@ class MWTimestamp {
         *
         * @since 1.22
         * @param bool|string $ts Timestamp to set, or false for current time
-        * @return MWTimestamp the instance
+        * @return MWTimestamp The instance
         */
        public static function getInstance( $ts = false ) {
                return new self( $ts );
index a8bafa3..1b014f6 100644 (file)
@@ -38,7 +38,9 @@ class MediaWiki {
         */
        public function request( WebRequest $x = null ) {
                $old = $this->context->getRequest();
-               $this->context->setRequest( $x );
+               if ( $x ) {
+                       $this->context->setRequest( $x );
+               }
                return $old;
        }
 
@@ -48,7 +50,9 @@ class MediaWiki {
         */
        public function output( OutputPage $x = null ) {
                $old = $this->context->getOutput();
-               $this->context->setOutput( $x );
+               if ( $x ) {
+                       $this->context->setOutput( $x );
+               }
                return $old;
        }
 
@@ -198,7 +202,9 @@ class MediaWiki {
                // 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 );
+               $permErrors = $title->isSpecial( 'RunJobs' )
+                       ? array() // relies on HMAC key signature alone
+                       : $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
@@ -558,7 +564,7 @@ class MediaWiki {
                                        // to fail due to post data being lost, but let's try anyway
                                        // and just log the instance.
                                        //
-                                       // @todo @fixme See if we could issue a 307 or 308 here, need
+                                       // @todo FIXME: See if we could issue a 307 or 308 here, need
                                        // to see how clients (automated & browser) behave when we do
                                        wfDebugLog( 'RedirectedPosts', "Redirected from HTTP to HTTPS: $oldUrl" );
                                }
@@ -660,9 +666,9 @@ class MediaWiki {
                }
 
                if ( !$wgRunJobsAsync ) {
-                       // If running jobs asynchronously has been disabled, run the job here
-                       // while the user waits
-                       SpecialRunJobs::executeJobs( $n );
+                       // Fall back to running the job here while the user waits
+                       $runner = new JobRunner();
+                       $runner->run( array( 'maxJobs'  => $n ) );
                        return;
                }
 
@@ -695,7 +701,8 @@ class MediaWiki {
                if ( !$sock ) {
                        wfDebugLog( 'runJobs', "Failed to start cron API (socket error $errno): $errstr\n" );
                        // Fall back to running the job here while the user waits
-                       SpecialRunJobs::executeJobs( $n );
+                       $runner = new JobRunner();
+                       $runner->run( array( 'maxJobs'  => $n ) );
                        return;
                }
 
index 950bcd5..931a3f9 100644 (file)
@@ -291,7 +291,7 @@ class Message {
         * @since 1.17
         *
         * @param string|string[] $key Message key or array of keys.
-        * @param mixed [$param,...] Parameters as strings.
+        * @param mixed $param,... Parameters as strings.
         *
         * @return Message
         */
@@ -308,7 +308,7 @@ class Message {
         *
         * @since 1.18
         *
-        * @param string|string[] [$keys,...] Message keys, or first argument as an array of all the
+        * @param string|string[] $keys,... Message keys, or first argument as an array of all the
         * message keys.
         *
         * @return Message
@@ -332,7 +332,7 @@ class Message {
         *
         * @since 1.17
         *
-        * @param mixed [$params,...] Parameters as strings, or a single argument that is
+        * @param mixed $params,... Parameters as strings, or a single argument that is
         * an array of strings.
         *
         * @return Message $this
@@ -355,7 +355,7 @@ class Message {
         *
         * @since 1.17
         *
-        * @param mixed [$params,...] Raw parameters as strings, or a single argument that is
+        * @param mixed $params,... Raw parameters as strings, or a single argument that is
         * an array of raw parameters.
         *
         * @return Message $this
@@ -377,7 +377,7 @@ class Message {
         *
         * @since 1.18
         *
-        * @param mixed [$param,...] Numeric parameters, or a single argument that is
+        * @param mixed $param,... Numeric parameters, or a single argument that is
         * an array of numeric parameters.
         *
         * @return Message $this
@@ -399,7 +399,7 @@ class Message {
         *
         * @since 1.22
         *
-        * @param int|int[] [$param,...] Duration parameters, or a single argument that is
+        * @param int|int[] $param,... Duration parameters, or a single argument that is
         * an array of duration parameters.
         *
         * @return Message $this
@@ -421,7 +421,7 @@ class Message {
         *
         * @since 1.22
         *
-        * @param string|string[] [$param,...] Expiry parameters, or a single argument that is
+        * @param string|string[] $param,... Expiry parameters, or a single argument that is
         * an array of expiry parameters.
         *
         * @return Message $this
@@ -443,7 +443,7 @@ class Message {
         *
         * @since 1.22
         *
-        * @param int|int[] [$param,...] Time period parameters, or a single argument that is
+        * @param int|int[] $param,... Time period parameters, or a single argument that is
         * an array of time period parameters.
         *
         * @return Message $this
@@ -465,7 +465,7 @@ class Message {
         *
         * @since 1.22
         *
-        * @param int|int[] [$param,...] Size parameters, or a single argument that is
+        * @param int|int[] $param,... Size parameters, or a single argument that is
         * an array of size parameters.
         *
         * @return Message $this
@@ -487,7 +487,7 @@ class Message {
         *
         * @since 1.22
         *
-        * @param int|int[] [$param,...] Bit rate parameters, or a single argument that is
+        * @param int|int[] $param,... Bit rate parameters, or a single argument that is
         * an array of bit rate parameters.
         *
         * @return Message $this
index 6163a8d..85d101f 100644 (file)
@@ -100,7 +100,7 @@ class OutputPage extends ContextSource {
        protected $mStatusCode;
 
        /**
-        * @ var string mLastModified and mEtag are used for sending cache control.
+        * @var string Variable mLastModified and mEtag are used for sending cache control.
         *   The whole caching system should probably be moved into its own class.
         */
        protected $mLastModified = '';
@@ -355,8 +355,8 @@ class OutputPage extends ContextSource {
         * Add a new "<meta>" tag
         * To add an http-equiv meta tag, precede the name with "http:"
         *
-        * @param string $name tag name
-        * @param string $val tag value
+        * @param string $name Tag name
+        * @param string $val Tag value
         */
        function addMeta( $name, $val ) {
                array_push( $this->mMetatags, array( $name, $val ) );
@@ -367,20 +367,20 @@ class OutputPage extends ContextSource {
         *
         * Note: use setCanonicalUrl() for rel=canonical.
         *
-        * @param array $linkarr associative array of attributes.
+        * @param array $linkarr Associative array of attributes.
         */
-       function addLink( $linkarr ) {
+       function addLink( array $linkarr ) {
                array_push( $this->mLinktags, $linkarr );
        }
 
        /**
         * Add a new \<link\> with "rel" attribute set to "meta"
         *
-        * @param array $linkarr associative array mapping attribute names to their
+        * @param array $linkarr Associative array mapping attribute names to their
         *                 values, both keys and values will be escaped, and the
         *                 "rel" attribute will be automatically added
         */
-       function addMetadataLink( $linkarr ) {
+       function addMetadataLink( array $linkarr ) {
                $linkarr['rel'] = $this->getMetadataAttribute();
                $this->addLink( $linkarr );
        }
@@ -412,7 +412,7 @@ class OutputPage extends ContextSource {
        /**
         * Add raw HTML to the list of scripts (including \<script\> tag, etc.)
         *
-        * @param string $script raw HTML
+        * @param string $script Raw HTML
         */
        function addScript( $script ) {
                $this->mScripts .= $script . "\n";
@@ -421,7 +421,7 @@ class OutputPage extends ContextSource {
        /**
         * Register and add a stylesheet from an extension directory.
         *
-        * @param string $url path to sheet.  Provide either a full url (beginning
+        * @param string $url Path to sheet.  Provide either a full url (beginning
         *             with 'http', etc) or a relative path from the document root
         *             (beginning with '/').  Otherwise it behaves identically to
         *             addStyle() and draws from the /skins folder.
@@ -442,9 +442,9 @@ class OutputPage extends ContextSource {
        /**
         * Add a JavaScript file out of skins/common, or a given relative path.
         *
-        * @param string $file filename in skins/common or complete on-server path
+        * @param string $file Filename in skins/common or complete on-server path
         *              (/foo/bar.js)
-        * @param string $version style version of the file. Defaults to $wgStyleVersion
+        * @param string $version Style version of the file. Defaults to $wgStyleVersion
         */
        public function addScriptFile( $file, $version = null ) {
                global $wgStylePath, $wgStyleVersion;
@@ -484,11 +484,11 @@ class OutputPage extends ContextSource {
         * Filter an array of modules to remove insufficiently trustworthy members, and modules
         * which are no longer registered (eg a page is cached before an extension is disabled)
         * @param array $modules
-        * @param string|null $position if not null, only return modules with this position
+        * @param string|null $position If not null, only return modules with this position
         * @param string $type
         * @return array
         */
-       protected function filterModules( $modules, $position = null,
+       protected function filterModules( array $modules, $position = null,
                $type = ResourceLoaderModule::TYPE_COMBINED
        ) {
                $resourceLoader = $this->getResourceLoader();
@@ -647,8 +647,8 @@ class OutputPage extends ContextSource {
        /**
         * Add or replace an header item to the output
         *
-        * @param string $name item name
-        * @param string $value raw HTML
+        * @param string $name Item name
+        * @param string $value Raw HTML
         */
        public function addHeadItem( $name, $value ) {
                $this->mHeadItems[$name] = $value;
@@ -667,7 +667,7 @@ class OutputPage extends ContextSource {
        /**
         * Set the value of the ETag HTTP header, only used if $wgUseETag is true
         *
-        * @param string $tag value of "ETag" header
+        * @param string $tag Value of "ETag" header
         */
        function setETag( $tag ) {
                $this->mETag = $tag;
@@ -815,7 +815,7 @@ class OutputPage extends ContextSource {
        /**
         * Override the last modified timestamp
         *
-        * @param string $timestamp new timestamp, in a format readable by
+        * @param string $timestamp New timestamp, in a format readable by
         *        wfTimestamp()
         */
        public function setLastModified( $timestamp ) {
@@ -825,7 +825,7 @@ class OutputPage extends ContextSource {
        /**
         * Set the robot policy for the page: <http://www.robotstxt.org/meta.html>
         *
-        * @param string $policy the literal string to output as the contents of
+        * @param string $policy The literal string to output as the contents of
         *   the meta tag.  Will be parsed according to the spec and output in
         *   standardized form.
         * @return null
@@ -859,7 +859,7 @@ class OutputPage extends ContextSource {
         * Set the follow policy for the page, but leave the index policy un-
         * touched.
         *
-        * @param string $policy either 'follow' or 'nofollow'.
+        * @param string $policy Either 'follow' or 'nofollow'.
         * @return null
         */
        public function setFollowPolicy( $policy ) {
@@ -873,7 +873,7 @@ class OutputPage extends ContextSource {
         * Set the new value of the "action text", this will be added to the
         * "HTML title", separated from it with " - ".
         *
-        * @param string $text new value of the "action text"
+        * @param string $text New value of the "action text"
         */
        public function setPageTitleActionText( $text ) {
                $this->mPageTitleActionText = $text;
@@ -892,7 +892,7 @@ class OutputPage extends ContextSource {
         * "HTML title" means the contents of "<title>".
         * It is stored as plain, unescaped text and will be run through htmlspecialchars in the skin file.
         *
-        * @param string $name
+        * @param string|Message $name
         */
        public function setHTMLTitle( $name ) {
                if ( $name instanceof Message ) {
@@ -968,7 +968,7 @@ class OutputPage extends ContextSource {
        /**
         * Replace the subtitle with $str
         *
-        * @param string|Message $str new value of the subtitle. String should be safe HTML.
+        * @param string|Message $str New value of the subtitle. String should be safe HTML.
         */
        public function setSubtitle( $str ) {
                $this->clearSubtitle();
@@ -979,7 +979,7 @@ class OutputPage extends ContextSource {
         * Add $str to the subtitle
         *
         * @deprecated since 1.19; use addSubtitle() instead
-        * @param string|Message $str to add to the subtitle
+        * @param string|Message $str String or Message to add to the subtitle
         */
        public function appendSubtitle( $str ) {
                $this->addSubtitle( $str );
@@ -988,7 +988,7 @@ class OutputPage extends ContextSource {
        /**
         * Add $str to the subtitle
         *
-        * @param string|Message $str to add to the subtitle. String should be safe HTML.
+        * @param string|Message $str String or Message to add to the subtitle. String should be safe HTML.
         */
        public function addSubtitle( $str ) {
                if ( $str instanceof Message ) {
@@ -1085,7 +1085,7 @@ class OutputPage extends ContextSource {
         * for the new version
         * @see addFeedLink()
         *
-        * @param bool $show true: add default feeds, false: remove all feeds
+        * @param bool $show True: add default feeds, false: remove all feeds
         */
        public function setSyndicated( $show = true ) {
                if ( $show ) {
@@ -1101,7 +1101,7 @@ class OutputPage extends ContextSource {
         * for the new version
         * @see addFeedLink()
         *
-        * @param string $val query to append to feed links or false to output
+        * @param string $val Query to append to feed links or false to output
         *        default links
         */
        public function setFeedAppendQuery( $val ) {
@@ -1121,7 +1121,7 @@ class OutputPage extends ContextSource {
        /**
         * Add a feed link to the page header
         *
-        * @param string $format feed type, should be a key of $wgFeedClasses
+        * @param string $format Feed type, should be a key of $wgFeedClasses
         * @param string $href URL
         */
        public function addFeedLink( $format, $href ) {
@@ -1142,7 +1142,7 @@ class OutputPage extends ContextSource {
 
        /**
         * Return URLs for each supported syndication format for this page.
-        * @return array associating format keys with URLs
+        * @return array Associating format keys with URLs
         */
        public function getSyndicationLinks() {
                return $this->mFeedLinks;
@@ -1209,7 +1209,7 @@ class OutputPage extends ContextSource {
         * @param array $newLinkArray Associative array mapping language code to the page
         *                      name
         */
-       public function addLanguageLinks( $newLinkArray ) {
+       public function addLanguageLinks( array $newLinkArray ) {
                $this->mLanguageLinks += $newLinkArray;
        }
 
@@ -1219,7 +1219,7 @@ class OutputPage extends ContextSource {
         * @param array $newLinkArray Associative array mapping language code to the page
         *                      name
         */
-       public function setLanguageLinks( $newLinkArray ) {
+       public function setLanguageLinks( array $newLinkArray ) {
                $this->mLanguageLinks = $newLinkArray;
        }
 
@@ -1235,9 +1235,9 @@ class OutputPage extends ContextSource {
        /**
         * Add an array of categories, with names in the keys
         *
-        * @param array $categories mapping category name => sort key
+        * @param array $categories Mapping category name => sort key
         */
-       public function addCategoryLinks( $categories ) {
+       public function addCategoryLinks( array $categories ) {
                global $wgContLang;
 
                if ( !is_array( $categories ) || count( $categories ) == 0 ) {
@@ -1266,11 +1266,8 @@ class OutputPage extends ContextSource {
                # Add the results to the link cache
                $lb->addResultToCache( LinkCache::singleton(), $res );
 
-               # Set all the values to 'normal'. This can be done with array_fill_keys in PHP 5.2.0+
-               $categories = array_combine(
-                       array_keys( $categories ),
-                       array_fill( 0, count( $categories ), 'normal' )
-               );
+               # Set all the values to 'normal'.
+               $categories = array_fill_keys( array_keys( $categories ), 'normal' );
 
                # Mark hidden categories
                foreach ( $res as $row ) {
@@ -1287,11 +1284,12 @@ class OutputPage extends ContextSource {
                        foreach ( $categories as $category => $type ) {
                                $origcategory = $category;
                                $title = Title::makeTitleSafe( NS_CATEGORY, $category );
+                               if ( !$title ) {
+                                       continue;
+                               }
                                $wgContLang->findVariantLink( $category, $title, true );
-                               if ( $category != $origcategory ) {
-                                       if ( array_key_exists( $category, $categories ) ) {
-                                               continue;
-                                       }
+                               if ( $category != $origcategory && array_key_exists( $category, $categories ) ) {
+                                       continue;
                                }
                                $text = $wgContLang->convertHtml( $title->getText() );
                                $this->mCategories[] = $title->getText();
@@ -1303,9 +1301,9 @@ class OutputPage extends ContextSource {
        /**
         * Reset the category links (but not the category list) and add $categories
         *
-        * @param array $categories mapping category name => sort key
+        * @param array $categories Mapping category name => sort key
         */
-       public function setCategoryLinks( $categories ) {
+       public function setCategoryLinks( array $categories ) {
                $this->mCategoryLinks = array();
                $this->addCategoryLinks( $categories );
        }
@@ -1403,7 +1401,7 @@ class OutputPage extends ContextSource {
         * @param array $attribs
         * @param string $contents
         */
-       public function addElement( $element, $attribs = array(), $contents = '' ) {
+       public function addElement( $element, array $attribs = array(), $contents = '' ) {
                $this->addHTML( Html::element( $element, $attribs, $contents ) );
        }
 
@@ -1640,6 +1638,8 @@ class OutputPage extends ContextSource {
                $this->addModuleStyles( $parserOutput->getModuleStyles() );
                $this->addModuleMessages( $parserOutput->getModuleMessages() );
                $this->addJsConfigVars( $parserOutput->getJsConfigVars() );
+               $this->mPreventClickjacking = $this->mPreventClickjacking
+                       || $parserOutput->preventClickjacking();
 
                // Template versioning...
                foreach ( (array)$parserOutput->getTemplateIds() as $ns => $dbks ) {
@@ -1852,7 +1852,7 @@ class OutputPage extends ContextSource {
        /**
         * Add an HTTP header that will influence on the cache
         *
-        * @param string $header header name
+        * @param string $header Header name
         * @param array|null $option
         * @todo FIXME: Document the $option parameter; it appears to be for
         *        X-Vary-Options but what format is acceptable?
@@ -1967,6 +1967,16 @@ class OutputPage extends ContextSource {
                $this->mPreventClickjacking = false;
        }
 
+       /**
+        * Get the prevent-clickjacking flag
+        *
+        * @since 1.24
+        * @return boolean
+        */
+       public function getPreventClickjacking() {
+               return $this->mPreventClickjacking;
+       }
+
        /**
         * Get the X-Frame-Options header value (without the name part), or false
         * if there isn't one. This is used by Skin to determine whether to enable
@@ -2174,7 +2184,7 @@ class OutputPage extends ContextSource {
        /**
         * Actually output something with print.
         *
-        * @param string $ins the string to output
+        * @param string $ins The string to output
         * @deprecated since 1.22 Use echo yourself.
         */
        public function out( $ins ) {
@@ -2195,8 +2205,8 @@ class OutputPage extends ContextSource {
         * indexing, clear the current text and redirect, set the page's title
         * and optionally an custom HTML title (content of the "<title>" tag).
         *
-        * @param string|Message $pageTitle will be passed directly to setPageTitle()
-        * @param string|Message $htmlTitle will be passed directly to setHTMLTitle();
+        * @param string|Message $pageTitle Will be passed directly to setPageTitle()
+        * @param string|Message $htmlTitle Will be passed directly to setHTMLTitle();
         *                   optional, if not passed the "<title>" attribute will be
         *                   based on $pageTitle
         */
@@ -2249,10 +2259,10 @@ class OutputPage extends ContextSource {
        /**
         * Output a standard permission error page
         *
-        * @param array $errors error message keys
-        * @param string $action action that was denied or null if unknown
+        * @param array $errors Error message keys
+        * @param string $action Action that was denied or null if unknown
         */
-       public function showPermissionsErrorPage( $errors, $action = null ) {
+       public function showPermissionsErrorPage( array $errors, $action = null ) {
                // 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
@@ -2334,7 +2344,7 @@ class OutputPage extends ContextSource {
        /**
         * Display an error page noting that a given permission bit is required.
         * @deprecated since 1.18, just throw the exception directly
-        * @param string $permission key required
+        * @param string $permission Key required
         * @throws PermissionsError
         */
        public function permissionRequired( $permission ) {
@@ -2357,7 +2367,7 @@ class OutputPage extends ContextSource {
         * @param string $action Action that was denied or null if unknown
         * @return string The wikitext error-messages, formatted into a list.
         */
-       public function formatPermissionsErrorMessage( $errors, $action = null ) {
+       public function formatPermissionsErrorMessage( array $errors, $action = null ) {
                if ( $action == null ) {
                        $text = $this->msg( 'permissionserrorstext', count( $errors ) )->plain() . "\n\n";
                } else {
@@ -2410,7 +2420,7 @@ class OutputPage extends ContextSource {
         * @throws ReadOnlyError
         */
        public function readOnlyPage( $source = null, $protected = false,
-               $reasons = array(), $action = null
+               array $reasons = array(), $action = null
        ) {
                $this->setRobotPolicy( 'noindex,nofollow' );
                $this->setArticleRelated( false );
@@ -2529,7 +2539,7 @@ $templates
         * @param string $text Text of the link (input is not escaped)
         * @param array $options Options array to pass to Linker
         */
-       public function addReturnTo( $title, $query = array(), $text = null, $options = array() ) {
+       public function addReturnTo( $title, array $query = array(), $text = null, $options = array() ) {
                $link = $this->msg( 'returnto' )->rawParams(
                        Linker::link( $title, $text, array(), $query, $options ) )->escaped();
                $this->addHTML( "<p id=\"mw-returnto\">{$link}</p>\n" );
@@ -2714,8 +2724,8 @@ $templates
                        $extraQuery['target'] = $this->mTarget;
                }
 
-               // Create keyed-by-group list of module objects from modules list
-               $groups = array();
+               // Create keyed-by-source and then keyed-by-group list of module objects from modules list
+               $sortedModules = array();
                $resourceLoader = $this->getResourceLoader();
                foreach ( $modules as $name ) {
                        $module = $resourceLoader->getModule( $name );
@@ -2725,141 +2735,133 @@ $templates
                                        && $only == ResourceLoaderModule::TYPE_SCRIPTS )
                                || ( $module->getOrigin() > $this->getAllowedModules( ResourceLoaderModule::TYPE_STYLES )
                                        && $only == ResourceLoaderModule::TYPE_STYLES )
+                               || ( $module->getOrigin() > $this->getAllowedModules( ResourceLoaderModule::TYPE_COMBINED )
+                                       && $only == ResourceLoaderModule::TYPE_COMBINED )
                                || ( $this->mTarget && !in_array( $this->mTarget, $module->getTargets() ) )
                        ) {
                                continue;
                        }
 
-                       $group = $module->getGroup();
-                       if ( !isset( $groups[$group] ) ) {
-                               $groups[$group] = array();
-                       }
-                       $groups[$group][$name] = $module;
+                       $sortedModules[$module->getSource()][$module->getGroup()][$name] = $module;
                }
 
-               foreach ( $groups as $group => $grpModules ) {
-                       // Special handling for user-specific groups
-                       $user = null;
-                       if ( ( $group === 'user' || $group === 'private' ) && $this->getUser()->isLoggedIn() ) {
-                               $user = $this->getUser()->getName();
-                       }
+               foreach ( $sortedModules as $source => $groups ) {
+                       foreach ( $groups as $group => $grpModules ) {
+                               // Special handling for user-specific groups
+                               $user = null;
+                               if ( ( $group === 'user' || $group === 'private' ) && $this->getUser()->isLoggedIn() ) {
+                                       $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 ) );
-
-                       // Extract modules that know they're empty
-                       foreach ( $grpModules as $key => $module ) {
-                               // Inline empty modules: since they're empty, just mark them as 'ready' (bug 46857)
-                               // If we're only getting the styles, we don't need to do anything for empty modules.
-                               if ( $module->isKnownEmpty( $context ) ) {
-                                       unset( $grpModules[$key] );
-                                       if ( $only !== ResourceLoaderModule::TYPE_STYLES ) {
-                                               $links['states'][$key] = 'ready';
+                               // 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 ) );
+
+                               // Extract modules that know they're empty
+                               foreach ( $grpModules as $key => $module ) {
+                                       // Inline empty modules: since they're empty, just mark them as 'ready' (bug 46857)
+                                       // If we're only getting the styles, we don't need to do anything for empty modules.
+                                       if ( $module->isKnownEmpty( $context ) ) {
+                                               unset( $grpModules[$key] );
+                                               if ( $only !== ResourceLoaderModule::TYPE_STYLES ) {
+                                                       $links['states'][$key] = 'ready';
+                                               }
                                        }
                                }
-                       }
 
-                       // If there are no non-empty modules, skip this group
-                       if ( count( $grpModules ) === 0 ) {
-                               continue;
-                       }
+                               // If there are no non-empty modules, skip this group
+                               if ( count( $grpModules ) === 0 ) {
+                                       continue;
+                               }
 
-                       // 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
-                       // properly use them as dependencies (bug 30914)
-                       if ( $group === 'private' ) {
-                               if ( $only == ResourceLoaderModule::TYPE_STYLES ) {
-                                       $links['html'] .= Html::inlineStyle(
-                                               $resourceLoader->makeModuleResponse( $context, $grpModules )
-                                       );
-                               } else {
-                                       $links['html'] .= Html::inlineScript(
-                                               ResourceLoader::makeLoaderConditionalScript(
+                               // 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
+                               // properly use them as dependencies (bug 30914)
+                               if ( $group === 'private' ) {
+                                       if ( $only == ResourceLoaderModule::TYPE_STYLES ) {
+                                               $links['html'] .= Html::inlineStyle(
                                                        $resourceLoader->makeModuleResponse( $context, $grpModules )
-                                               )
-                                       );
+                                               );
+                                       } else {
+                                               $links['html'] .= Html::inlineScript(
+                                                       ResourceLoader::makeLoaderConditionalScript(
+                                                               $resourceLoader->makeModuleResponse( $context, $grpModules )
+                                                       )
+                                               );
+                                       }
+                                       $links['html'] .= "\n";
+                                       continue;
                                }
-                               $links['html'] .= "\n";
-                               continue;
-                       }
 
-                       // Special handling for the user group; because users might change their stuff
-                       // on-wiki like user pages, or user preferences; we need to find the highest
-                       // timestamp of these user-changeable 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;
-                               foreach ( $grpModules as $module ) {
-                                       $timestamp = max( $timestamp, $module->getModifiedTime( $context ) );
+                               // Special handling for the user group; because users might change their stuff
+                               // on-wiki like user pages, or user preferences; we need to find the highest
+                               // timestamp of these user-changeable 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;
+                                       foreach ( $grpModules as $module ) {
+                                               $timestamp = max( $timestamp, $module->getModifiedTime( $context ) );
+                                       }
+                                       // Add a version parameter so cache will break when things change
+                                       $query['version'] = wfTimestamp( TS_ISO_8601_BASIC, $timestamp );
                                }
-                               // Add a version parameter so cache will break when things change
-                               $version = wfTimestamp( TS_ISO_8601_BASIC, $timestamp );
-                       }
 
-                       $url = ResourceLoader::makeLoaderURL(
-                               array_keys( $grpModules ),
-                               $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 ) {
-                                       $link = Html::inlineStyle( $esi );
-                               } else {
-                                       $link = Html::inlineScript( $esi );
-                               }
-                       } else {
-                               // Automatically select style/script elements
-                               if ( $only === ResourceLoaderModule::TYPE_STYLES ) {
-                                       $link = Html::linkedStyle( $url );
-                               } elseif ( $loadCall ) {
-                                       $link = Html::inlineScript(
-                                               ResourceLoader::makeLoaderConditionalScript(
-                                                       Xml::encodeJsCall( 'mw.loader.load', array( $url, 'text/javascript', true ) )
-                                               )
-                                       );
+                               $query['modules'] = ResourceLoader::makePackedModulesString( array_keys( $grpModules ) );
+                               $moduleContext = new ResourceLoaderContext( $resourceLoader, new FauxRequest( $query ) );
+                               $url = $resourceLoader->createLoaderURL( $source, $moduleContext, $extraQuery );
+
+                               if ( $useESI && $wgResourceLoaderUseESI ) {
+                                       $esi = Xml::element( 'esi:include', array( 'src' => $url ) );
+                                       if ( $only == ResourceLoaderModule::TYPE_STYLES ) {
+                                               $link = Html::inlineStyle( $esi );
+                                       } else {
+                                               $link = Html::inlineScript( $esi );
+                                       }
                                } else {
-                                       $link = Html::linkedScript( $url );
-
-                                       // For modules requested directly in the html via <link> or <script>,
-                                       // tell mw.loader they are being loading to prevent duplicate requests.
-                                       foreach ( $grpModules as $key => $module ) {
-                                               // Don't output state=loading for the startup module..
-                                               if ( $key !== 'startup' ) {
-                                                       $links['states'][$key] = 'loading';
+                                       // Automatically select style/script elements
+                                       if ( $only === ResourceLoaderModule::TYPE_STYLES ) {
+                                               $link = Html::linkedStyle( $url );
+                                       } elseif ( $loadCall ) {
+                                               $link = Html::inlineScript(
+                                                       ResourceLoader::makeLoaderConditionalScript(
+                                                               Xml::encodeJsCall( 'mw.loader.load', array( $url, 'text/javascript', true ) )
+                                                       )
+                                               );
+                                       } else {
+                                               $link = Html::linkedScript( $url );
+
+                                               // For modules requested directly in the html via <link> or <script>,
+                                               // tell mw.loader they are being loading to prevent duplicate requests.
+                                               foreach ( $grpModules as $key => $module ) {
+                                                       // Don't output state=loading for the startup module..
+                                                       if ( $key !== 'startup' ) {
+                                                               $links['states'][$key] = 'loading';
+                                                       }
                                                }
                                        }
                                }
-                       }
 
-                       if ( $group == 'noscript' ) {
-                               $links['html'] .= Html::rawElement( 'noscript', array(), $link ) . "\n";
-                       } else {
-                               $links['html'] .= $link . "\n";
+                               if ( $group == 'noscript' ) {
+                                       $links['html'] .= Html::rawElement( 'noscript', array(), $link ) . "\n";
+                               } else {
+                                       $links['html'] .= $link . "\n";
+                               }
                        }
                }
 
@@ -2871,7 +2873,7 @@ $templates
         * @param array $links
         * @return string HTML
         */
-       protected static function getHtmlFromLoaderLinks( Array $links ) {
+       protected static function getHtmlFromLoaderLinks( array $links ) {
                $html = '';
                $states = array();
                foreach ( $links as $link ) {
@@ -2961,7 +2963,7 @@ $templates
         * @return string
         */
        function getScriptsForBottomQueue( $inHead ) {
-               global $wgUseSiteJs, $wgAllowUserJs;
+               global $wgAllowUserJs;
 
                // Scripts and messages "only" requests marked for bottom inclusion
                // If we're in the <head>, use load() calls rather than <script src="..."> tags
@@ -3227,7 +3229,7 @@ $templates
        }
 
        /**
-        * @return array in format "link name or number => 'link html'".
+        * @return array Array in format "link name or number => 'link html'".
         */
        public function getHeadLinksArray() {
                global $wgUniversalEditButton, $wgFavicon, $wgAppleTouchIcon, $wgEnableAPI,
@@ -3484,9 +3486,9 @@ $templates
         * Meant primarily for internal use...
         *
         * @param string $style URL to the file
-        * @param string $media to specify a media type, 'screen', 'printable', 'handheld' or any.
-        * @param string $condition for IE conditional comments, specifying an IE version
-        * @param string $dir set to 'rtl' or 'ltr' for direction-specific sheets
+        * @param string $media To specify a media type, 'screen', 'printable', 'handheld' or any.
+        * @param string $condition For IE conditional comments, specifying an IE version
+        * @param string $dir Set to 'rtl' or 'ltr' for direction-specific sheets
         */
        public function addStyle( $style, $media = '', $condition = '', $dir = '' ) {
                $options = array();
@@ -3524,7 +3526,7 @@ $templates
         * @return string
         */
        public function buildCssLinks() {
-               global $wgUseSiteCss, $wgAllowUserCss, $wgAllowUserCssPrefs, $wgContLang;
+               global $wgAllowUserCss, $wgContLang;
 
                $this->getSkin()->setupSkinUserCss( $this );
 
@@ -3581,7 +3583,7 @@ $templates
                        $group = $module->getGroup();
                        // Modules in groups different than the ones listed on top (see $styles assignment)
                        // will be placed in the "other" group
-                       $styles[ isset( $styles[$group] ) ? $group : 'other' ][] = $name;
+                       $styles[isset( $styles[$group] ) ? $group : 'other'][] = $name;
                }
 
                // We want site, private and user styles to override dynamically added
@@ -3640,7 +3642,7 @@ $templates
         * @param array $options Option, can contain 'condition', 'dir', 'media' keys
         * @return string HTML fragment
         */
-       protected function styleLink( $style, $options ) {
+       protected function styleLink( $style, array $options ) {
                if ( isset( $options['dir'] ) ) {
                        if ( $this->getLanguage()->getDir() != $options['dir'] ) {
                                return '';
@@ -3801,7 +3803,7 @@ $templates
         * @since 1.16
         * @deprecated since 1.17
         */
-       public function includeJQuery( $modules = array() ) {
+       public function includeJQuery( array $modules = array() ) {
                return array();
        }
 
index 5f05460..c7de8c1 100644 (file)
@@ -69,7 +69,7 @@ interface Pager {
  *      last page depending on the dir parameter.
  *
  *  Subclassing the pager to implement concrete functionality should be fairly
- *  simple, please see the examples in HistoryPage.php and
+ *  simple, please see the examples in HistoryAction.php and
  *  SpecialBlockList.php. You just need to override formatRow(),
  *  getQueryInfo() and getIndexField(). Don't forget to call the parent
  *  constructor if you override it.
index fdb1a9d..084d6ab 100644 (file)
@@ -108,7 +108,7 @@ class Preferences {
         * @throws MWException
         * @param User $user
         * @param IContextSource $context
-        * @param array defaultPreferences to load values for
+        * @param array $defaultPreferences Array to load values for
         * @return array|null
         */
        static function loadPreferenceValues( $user, $context, &$defaultPreferences ) {
@@ -207,7 +207,7 @@ class Preferences {
         * @return void
         */
        static function profilePreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               global $wgAuth, $wgContLang, $wgParser, $wgCookieExpiration, $wgLanguageCode,
+               global $wgAuth, $wgContLang, $wgParser, $wgLanguageCode,
                        $wgDisableLangConversion, $wgMaxSigChars,
                        $wgEnableEmail, $wgEmailConfirmToEdit, $wgEnableUserEmail, $wgEmailAuthentication,
                        $wgEnotifWatchlist, $wgEnotifUserTalk, $wgEnotifRevealEditorAddress,
@@ -750,7 +750,6 @@ class Preferences {
                        'type' => 'select',
                        'section' => 'rendering/advancedrendering',
                        'options' => $stubThresholdOptions,
-                       'size' => 20,
                        'label-raw' => $context->msg( 'stub-threshold' )->text(), // Raw HTML message. Yay?
                );
 
@@ -990,10 +989,15 @@ class Preferences {
                        $watchTypes['read'] = 'watchcreations';
                }
 
+               if ( $user->isAllowed( 'rollback' ) ) {
+                       $watchTypes['rollback'] = 'watchrollback';
+               }
+
                foreach ( $watchTypes as $action => $pref ) {
                        if ( $user->isAllowed( $action ) ) {
                                // Messages:
                                // tog-watchdefault, tog-watchmoves, tog-watchdeletion, tog-watchcreations
+                               // tog-watchrollback
                                $defaultPreferences[$pref] = array(
                                        'type' => 'toggle',
                                        'section' => 'watchlist/advancedwatchlist',
@@ -1023,7 +1027,7 @@ class Preferences {
         */
        static function searchPreferences( $user, IContextSource $context, &$defaultPreferences ) {
                foreach ( MWNamespace::getValidNamespaces() as $n ) {
-                       $defaultPreferences[ 'searchNs' . $n ] = array(
+                       $defaultPreferences['searchNs' . $n] = array(
                                'type' => 'api',
                        );
                }
index f794b2a..35be2a9 100644 (file)
@@ -29,7 +29,7 @@
 abstract class PrefixSearch {
        /**
         * Do a prefix search of titles and return a list of matching page names.
-        * @deprecated: Since 1.23, use TitlePrefixSearch or StringPrefixSearch classes
+        * @deprecated Since 1.23, use TitlePrefixSearch or StringPrefixSearch classes
         *
         * @param string $search
         * @param int $limit
index 456e4e6..853e2cc 100644 (file)
@@ -338,20 +338,12 @@ class ProtectionForm {
         * @return string HTML form
         */
        function buildForm() {
-               global $wgUser, $wgLang, $wgOut;
-
-               $mProtectreasonother = Xml::label(
-                       wfMessage( 'protectcomment' )->text(),
-                       'wpProtectReasonSelection'
-               );
-               $mProtectreason = Xml::label(
-                       wfMessage( 'protect-otherreason' )->text(),
-                       'mwProtect-reason'
-               );
+               global $wgUser, $wgLang, $wgOut, $wgCascadingRestrictionLevels;
 
                $out = '';
                if ( !$this->disabled ) {
                        $wgOut->addModules( 'mediawiki.legacy.protect' );
+                       $wgOut->addJsConfigVars( 'wgCascadeableLevels', $wgCascadingRestrictionLevels );
                        $out .= Xml::openElement( 'form', array( 'method' => 'post',
                                'action' => $this->mTitle->getLocalURL( 'action=protect' ),
                                'id' => 'mw-Protect-Form', 'onsubmit' => 'ProtectionForm.enableUnchainedInputs(true)' ) );
@@ -362,6 +354,9 @@ class ProtectionForm {
                        Xml::openElement( 'table', array( 'id' => 'mwProtectSet' ) ) .
                        Xml::openElement( 'tbody' );
 
+               $scExpiryOptions = wfMessage( 'protect-expiry-options' )->inContentLanguage()->text();
+               $showProtectOptions = $scExpiryOptions !== '-' && !$this->disabled;
+
                // Not all languages have V_x <-> N_x relation
                foreach ( $this->mRestrictions as $action => $selected ) {
                        // Messages:
@@ -373,15 +368,6 @@ class ProtectionForm {
                        Xml::openElement( 'table', array( 'id' => "mw-protect-table-$action" ) ) .
                                "<tr><td>" . $this->buildSelector( $action, $selected ) . "</td></tr><tr><td>";
 
-                       $reasonDropDown = Xml::listDropDown( 'wpProtectReasonSelection',
-                               wfMessage( 'protect-dropdown' )->inContentLanguage()->text(),
-                               wfMessage( 'protect-otherreason-op' )->inContentLanguage()->text(),
-                               $this->mReasonSelection,
-                               'mwProtect-reason', 4 );
-                       $scExpiryOptions = wfMessage( 'protect-expiry-options' )->inContentLanguage()->text();
-
-                       $showProtectOptions = $scExpiryOptions !== '-' && !$this->disabled;
-
                        $mProtectexpiry = Xml::label(
                                wfMessage( 'protectexpiry' )->text(),
                                "mwProtectExpirySelection-$action"
@@ -482,6 +468,22 @@ class ProtectionForm {
 
                # Add manual and custom reason field/selects as well as submit
                if ( !$this->disabled ) {
+                       $mProtectreasonother = Xml::label(
+                               wfMessage( 'protectcomment' )->text(),
+                               'wpProtectReasonSelection'
+                       );
+
+                       $mProtectreason = Xml::label(
+                               wfMessage( 'protect-otherreason' )->text(),
+                               'mwProtect-reason'
+                       );
+
+                       $reasonDropDown = Xml::listDropDown( 'wpProtectReasonSelection',
+                               wfMessage( 'protect-dropdown' )->inContentLanguage()->text(),
+                               wfMessage( 'protect-otherreason-op' )->inContentLanguage()->text(),
+                               $this->mReasonSelection,
+                               'mwProtect-reason', 4 );
+
                        $out .= Xml::openElement( 'table', array( 'id' => 'mw-protect-table3' ) ) .
                                Xml::openElement( 'tbody' );
                        $out .= "
@@ -606,9 +608,6 @@ class ProtectionForm {
        }
 
        function buildCleanupScript() {
-               global $wgCascadingRestrictionLevels, $wgOut;
-
-               $cascadeableLevels = $wgCascadingRestrictionLevels;
                $options = array(
                        'tableId' => 'mwProtectSet',
                        'labelText' => wfMessage( 'protect-unchain-permissions' )->plain(),
@@ -616,8 +615,8 @@ class ProtectionForm {
                        'existingMatch' => count( array_unique( $this->mExistingExpiry ) ) === 1,
                );
 
-               $wgOut->addJsConfigVars( 'wgCascadeableLevels', $cascadeableLevels );
                $script = Xml::encodeJsCall( 'ProtectionForm.init', array( $options ) );
+
                return Html::inlineScript( ResourceLoader::makeLoaderConditionalScript( $script ) );
        }
 
index de69827..a6148c7 100644 (file)
@@ -952,7 +952,7 @@ class Revision implements IDBAccessObject {
        }
 
        /**
-        * @param int $field one of DELETED_* bitfield constants
+        * @param int $field One of DELETED_* bitfield constants
         *
         * @return bool
         */
@@ -1569,7 +1569,7 @@ class Revision implements IDBAccessObject {
         * operations and other such meta-modifications.
         *
         * @param DatabaseBase $dbw
-        * @param int $pageId: ID number of the page to read from
+        * @param int $pageId ID number of the page to read from
         * @param string $summary Revision's summary
         * @param bool $minor Whether the revision should be considered as minor
         * @param User|null $user User object to use or null for $wgUser
@@ -1658,19 +1658,20 @@ class Revision implements IDBAccessObject {
         */
        public static function userCanBitfield( $bitfield, $field, User $user = null ) {
                if ( $bitfield & $field ) { // aspect is deleted
-                       if ( $bitfield & self::DELETED_RESTRICTED ) {
-                               $permission = 'suppressrevision';
-                       } elseif ( $field & self::DELETED_TEXT ) {
-                               $permission = 'deletedtext';
-                       } else {
-                               $permission = 'deletedhistory';
-                       }
-                       wfDebug( "Checking for $permission due to $field match on $bitfield\n" );
                        if ( $user === null ) {
                                global $wgUser;
                                $user = $wgUser;
                        }
-                       return $user->isAllowed( $permission );
+                       if ( $bitfield & self::DELETED_RESTRICTED ) {
+                               $permissions = array( 'suppressrevision', 'viewsuppressed' );
+                       } elseif ( $field & self::DELETED_TEXT ) {
+                               $permissions = array( 'deletedtext' );
+                       } else {
+                               $permissions = array( 'deletedhistory' );
+                       }
+                       $permissionlist = implode( ', ', $permissions );
+                       wfDebug( "Checking for $permissionlist due to $field match on $bitfield\n" );
+                       return call_user_func_array( array( $user, 'isAllowedAny' ), $permissions );
                } else {
                        return true;
                }
index ec17a08..b173ae9 100644 (file)
@@ -715,7 +715,7 @@ class Sanitizer {
         * - Invalid id attributes are re-encoded
         *
         * @param array $attribs
-        * @param array $whitelist list of allowed attribute names
+        * @param array $whitelist List of allowed attribute names
         * @return array
         *
         * @todo Check for legal values where the DTD limits things.
@@ -1081,7 +1081,7 @@ class Sanitizer {
         * @see http://www.whatwg.org/html/elements.html#the-id-attribute
         *   HTML5 definition of id attribute
         *
-        * @param string $id id to escape
+        * @param string $id Id to escape
         * @param string|array $options String or array of strings (default is array()):
         *   'noninitial': This is a non-initial fragment of an id, not a full id,
         *       so don't pay attention if the first character isn't valid at the
@@ -1228,7 +1228,7 @@ class Sanitizer {
         * attribs regex matches.
         *
         * @param array $set
-        * @throws MWException when tag conditions are not met.
+        * @throws MWException When tag conditions are not met.
         * @return string
         */
        private static function getTagAttributeCallback( $set ) {
index 040aba5..03c529e 100644 (file)
@@ -169,7 +169,6 @@ $wgLockManagers[] = array(
  * Initialise $wgLocalFileRepo from backwards-compatible settings
  */
 if ( !$wgLocalFileRepo ) {
-       $deletedHashLevel = $wgHashedUploadDirectory ? 3 : 0;
        $wgLocalFileRepo = array(
                'class' => 'LocalRepo',
                'name' => 'local',
@@ -181,7 +180,7 @@ if ( !$wgLocalFileRepo ) {
                'thumbScriptUrl' => $wgThumbnailScriptPath,
                'transformVia404' => !$wgGenerateThumbnailOnParse,
                'deletedDir' => $wgDeletedDirectory,
-               'deletedHashLevels' => $deletedHashLevel
+               'deletedHashLevels' => $wgHashedUploadDirectory ? 3 : 0
        );
 }
 /**
@@ -488,7 +487,7 @@ if ( !$wgHTCPRouting && $wgHTCPMulticastAddress ) {
 }
 
 // Back compatibility for $wgRateLimitLog deprecated with 1.23
-if ( $wgRateLimitLog && ! array_key_exists( 'ratelimit', $wgDebugLogGroups ) ) {
+if ( $wgRateLimitLog && !array_key_exists( 'ratelimit', $wgDebugLogGroups ) ) {
        $wgDebugLogGroups['ratelimit'] = $wgRateLimitLog;
 }
 
index e5c1e17..3dc1793 100644 (file)
@@ -170,7 +170,7 @@ class SiteStats {
 
        /**
         * Find the number of users in a given user group.
-        * @param string $group name of group
+        * @param string $group Name of group
         * @return int
         */
        static function numberingroup( $group ) {
@@ -373,7 +373,7 @@ class SiteStatsInit {
         * @param DatabaseBase|bool $database
         * - Boolean: whether to use the master DB
         * - DatabaseBase: database connection to use
-        * @param array $options of options, may contain the following values
+        * @param array $options Array of options, may contain the following values
         * - views Boolean: when true, do not update the number of page views (default: true)
         * - activeUsers Boolean: whether to update the number of active users (default: false)
         */
index 35e1ef8..fd737c0 100644 (file)
@@ -145,25 +145,28 @@ abstract class Skin extends ContextSource {
 
        /**
         * Normalize a skin preference value to a form that can be loaded.
-        * If a skin can't be found, it will fall back to the configured
-        * default, or the hardcoded default if that's broken.
+        *
+        * If a skin can't be found, it will fall back to the configured default ($wgDefaultSkin), or the
+        * hardcoded default ($wgFallbackSkin) if the default skin is unavailable too.
+        *
         * @param string $key 'monobook', 'vector', etc.
         * @return string
         */
        static function normalizeKey( $key ) {
-               global $wgDefaultSkin;
+               global $wgDefaultSkin, $wgFallbackSkin;
 
                $skinNames = Skin::getSkinNames();
 
                // Make keys lowercase for case-insensitive matching.
                $skinNames = array_change_key_case( $skinNames, CASE_LOWER );
                $key = strtolower( $key );
-               $default = strtolower( $wgDefaultSkin );
+               $defaultSkin = strtolower( $wgDefaultSkin );
+               $fallbackSkin = strtolower( $wgFallbackSkin );
 
                if ( $key == '' || $key == 'default' ) {
                        // Don't return the default immediately;
                        // in a misconfiguration we need to fall back.
-                       $key = $default;
+                       $key = $defaultSkin;
                }
 
                if ( isset( $skinNames[$key] ) ) {
@@ -173,7 +176,7 @@ abstract class Skin extends ContextSource {
                // Older versions of the software used a numeric setting
                // in the user preferences.
                $fallback = array(
-                       0 => $default,
+                       0 => $defaultSkin,
                        2 => 'cologneblue'
                );
 
@@ -183,10 +186,10 @@ abstract class Skin extends ContextSource {
 
                if ( isset( $skinNames[$key] ) ) {
                        return $key;
-               } elseif ( isset( $skinNames[$default] ) ) {
-                       return $default;
+               } elseif ( isset( $skinNames[$defaultSkin] ) ) {
+                       return $defaultSkin;
                } else {
-                       return 'vector';
+                       return $fallbackSkin;
                }
        }
 
@@ -196,7 +199,7 @@ abstract class Skin extends ContextSource {
         * @return Skin
         */
        static function &newFromKey( $key ) {
-               global $wgStyleDirectory;
+               global $wgStyleDirectory, $wgFallbackSkin;
 
                $key = Skin::normalizeKey( $key );
 
@@ -216,7 +219,9 @@ abstract class Skin extends ContextSource {
                                # except by SQL manipulation if a previously valid skin name
                                # is no longer valid.
                                wfDebug( "Skin class does not exist: $className\n" );
-                               $className = 'SkinVector';
+
+                               $fallback = $skinNames[ Skin::normalizeKey( $wgFallbackSkin ) ];
+                               $className = "Skin{$fallback}";
                        }
                }
                $skin = new $className( $key );
@@ -815,7 +820,7 @@ abstract class Skin extends ContextSource {
         * @return string
         */
        function getCopyright( $type = 'detect' ) {
-               global $wgRightsPage, $wgRightsUrl, $wgRightsText, $wgContLang;
+               global $wgRightsPage, $wgRightsUrl, $wgRightsText;
 
                if ( $type == 'detect' ) {
                        if ( !$this->isRevisionCurrent()
@@ -991,8 +996,8 @@ abstract class Skin extends ContextSource {
 
        /**
         * Returns an HTML link for use in the footer
-        * @param string $desc i18n message key for the link text
-        * @param string $page i18n message key for the page to link to
+        * @param string $desc The i18n message key for the link text
+        * @param string $page The i18n message key for the page to link to
         * @return string HTML anchor
         */
        public function footerLink( $desc, $page ) {
index faf71aa..52e72e8 100644 (file)
@@ -294,8 +294,7 @@ class SkinTemplate extends Skin {
         * @return QuickTemplate The template to be executed by outputPage
         */
        protected function prepareQuickTemplate() {
-               global $wgContLang, $wgScript, $wgStylePath,
-                       $wgMimeType, $wgJsMimeType, $wgXhtmlNamespaces, $wgHtml5Version,
+               global $wgContLang, $wgScript, $wgStylePath, $wgMimeType, $wgJsMimeType,
                        $wgDisableCounters, $wgSitename, $wgLogo, $wgMaxCredits,
                        $wgShowCreditsIfMax, $wgPageShowWatchingUsers, $wgArticlePath,
                        $wgScriptPath, $wgServer;
@@ -764,7 +763,7 @@ class SkinTemplate extends Skin {
        /**
         * Builds an array with tab definition
         *
-        * @param Title $title page Where the tab links to
+        * @param Title $title Page Where the tab links to
         * @param string|array $message Message key or an array of message keys (will fall back)
         * @param bool $selected Display the tab as selected
         * @param string $query Query string attached to tab URL
@@ -1198,7 +1197,7 @@ class SkinTemplate extends Skin {
 
        /**
         * an array of edit links by default used for the tabs
-        * @param $content_navigation
+        * @param array $content_navigation
         * @return array
         */
        private function buildContentActionUrls( $content_navigation ) {
@@ -1797,9 +1796,9 @@ abstract class BaseTemplate extends QuickTemplate {
         * Makes a link, usually used by makeListItem to generate a link for an item
         * in a list used in navigation lists, portlets, portals, sidebars, etc...
         *
-        * @param string $key usually a key from the list you are generating this
+        * @param string $key Usually a key from the list you are generating this
         * link from.
-        * @param array $item contains some of a specific set of keys.
+        * @param array $item Contains some of a specific set of keys.
         *
         * The text of the link will be generated either from the contents of the
         * "text" key in the $item array, if a "msg" key is present a message by
@@ -1820,7 +1819,7 @@ abstract class BaseTemplate extends QuickTemplate {
         *
         * If you don't want an accesskey, set $item['tooltiponly'] = true;
         *
-        * @param array $options can be used to affect the output of a link.
+        * @param array $options Can be used to affect the output of a link.
         * Possible options are:
         *   - 'text-wrapper' key to specify a list of elements to wrap the text of
         *   a link in. This should be an array of arrays containing a 'tag' and
index c790bb7..824dd06 100644 (file)
@@ -343,7 +343,6 @@ class SquidPurgeClient {
 
        /**
         * @param string $line
-        * @return
         */
        protected function processStatusLine( $line ) {
                if ( !preg_match( '!^HTTP/(\d+)\.(\d+) (\d{3}) (.*)$!', $line, $m ) ) {
@@ -397,7 +396,7 @@ class SquidPurgeClient {
 }
 
 class SquidPurgeClientPool {
-       /** @var array of SquidPurgeClient */
+       /** @var array Array of SquidPurgeClient */
        protected $clients = array();
 
        /** @var int */
index 77bf4a8..1a72968 100644 (file)
@@ -64,7 +64,7 @@ class Status {
        /**
         * Factory function for fatal errors
         *
-        * @param string|Message $message message name or object
+        * @param string|Message $message Message name or object
         * @return Status
         */
        static function newFatal( $message /*, parameters...*/ ) {
index fb9b3e4..73952da 100644 (file)
@@ -134,7 +134,7 @@ class StubObject {
         * @param string $name Name of the method called in this object.
         * @param int $level Level to go in the stack trace to get the function
         *   who called this function.
-        * @return The unstubbed version of itself
+        * @return object The unstubbed version of itself
         * @throws MWException
         */
        function _unstub( $name = '_unstub', $level = 2 ) {
@@ -163,35 +163,6 @@ class StubObject {
        }
 }
 
-/**
- * Stub object for the content language of this wiki. This object have to be in
- * $wgContLang global.
- *
- * @deprecated since 1.18
- */
-class StubContLang extends StubObject {
-
-       function __construct() {
-               wfDeprecated( __CLASS__, '1.18' );
-               parent::__construct( 'wgContLang' );
-       }
-
-       function __call( $name, $args ) {
-               return $this->_call( $name, $args );
-       }
-
-       /**
-        * @return Language
-        */
-       function _newObject() {
-               global $wgLanguageCode;
-               $obj = Language::factory( $wgLanguageCode );
-               $obj->initEncoding();
-               $obj->initContLang();
-               return $obj;
-       }
-}
-
 /**
  * Stub object for the user language. It depends of the user preferences and
  * "uselang" parameter that can be passed to index.php. This object have to be
index 746ffab..2481178 100644 (file)
@@ -95,7 +95,7 @@ class Title {
        /** @var array Array of groups allowed to edit this article */
        public $mRestrictions = array();
 
-       /** @var bool  */
+       /** @var bool */
        protected $mOldRestrictions = false;
 
        /** @var bool Cascade restrictions on this page to included templates and images? */
@@ -608,7 +608,7 @@ class Title {
         * 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.
         *
-        * @todo: move this into MediaWikiTitleCodec
+        * @todo move this into MediaWikiTitleCodec
         *
         * @return string Regex string
         */
@@ -853,7 +853,7 @@ class Title {
        /**
         * Get a TitleValue object representing this Title.
         *
-        * @note: Not all valid Titles have a corresponding valid TitleValue
+        * @note Not all valid Titles have a corresponding valid TitleValue
         * (e.g. TitleValues cannot represent page-local links that have a
         * fragment but no title text).
         *
@@ -979,7 +979,7 @@ class Title {
                try {
                        $formatter = self::getTitleFormatter();
                        return $formatter->getNamespaceName( $this->mNamespace, $this->mDbkeyform );
-               } catch ( InvalidArgumentException $ex )  {
+               } catch ( InvalidArgumentException $ex ) {
                        wfDebug( __METHOD__ . ': ' . $ex->getMessage() . "\n" );
                        return false;
                }
@@ -1094,7 +1094,7 @@ class Title {
        /**
         * Returns true if the title is inside one of the specified namespaces.
         *
-        * @param ...$namespaces The namespaces to check for
+        * @param int $namespaces,... The namespaces to check for
         * @return bool
         * @since 1.19
         */
@@ -1643,9 +1643,11 @@ class Title {
         * $wgServer is prepended to make an absolute URL.
         *
         * @see self::getFullURL to always get an absolute URL.
+        * @see self::getLinkURL to always get a URL that's the simplest URL that will be
+        *  valid to link, locally, to the current Title.
         * @see self::newFromText to produce a Title object.
         *
-        * @param string|array $query an optional query string,
+        * @param string|array $query An optional query string,
         *   not used for interwiki links. Can be specified as an associative array as well,
         *   e.g., array( 'action' => 'edit' ) (keys and values will be URL-escaped).
         *   Some query patterns will trigger various shorturl path replacements.
@@ -1835,17 +1837,6 @@ class Title {
                return $this->mWatched;
        }
 
-       /**
-        * Can $wgUser read this page?
-        *
-        * @deprecated since 1.19; use userCan(), quickUserCan() or getUserPermissionsErrors() instead
-        * @return bool
-        */
-       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
@@ -1889,11 +1880,11 @@ class Title {
         *
         * @todo FIXME: This *does not* check throttles (User::pingLimiter()).
         *
-        * @param string $action action that permission needs to be checked for
+        * @param string $action Action that permission needs to be checked for
         * @param User $user User to check
         * @param bool $doExpensiveQueries Set this to false to avoid doing unnecessary
         *   queries by skipping checks for cascading protections and user blocks.
-        * @param array $ignoreErrors of Strings Set this to a list of message keys
+        * @param array $ignoreErrors Array of Strings Set this to a list of message keys
         *   whose corresponding errors may be ignored.
         * @return array Array of arguments to wfMessage to explain permissions problems.
         */
@@ -1917,7 +1908,7 @@ class Title {
        /**
         * Permissions checks that fail most often, and which are easiest to test.
         *
-        * @param string $action the action to check
+        * @param string $action The action to check
         * @param User $user User to check
         * @param array $errors List of current errors
         * @param bool $doExpensiveQueries Whether or not to perform expensive queries
@@ -2575,7 +2566,7 @@ class Title {
        /**
         * Does the title correspond to a protected article?
         *
-        * @param string $action the action the page is protected from,
+        * @param string $action The action the page is protected from,
         * by default checks all actions.
         * @return bool
         */
@@ -2983,7 +2974,7 @@ class Title {
 
                $method = __METHOD__;
                $dbw = wfGetDB( DB_MASTER );
-               $dbw->onTransactionIdle( function() use ( $dbw, $method ) {
+               $dbw->onTransactionIdle( function () use ( $dbw, $method ) {
                        $dbw->delete(
                                'page_restrictions',
                                array( 'pr_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ),
@@ -3825,13 +3816,31 @@ class Title {
                        $log->addRelations( 'pr_id', $logRelationsValues, $logId );
                }
 
+               // Update *_from_namespace fields as needed
+               if ( $this->getNamespace() != $nt->getNamespace() ) {
+                       $dbw->update( 'pagelinks',
+                               array( 'pl_from_namespace' => $nt->getNamespace() ),
+                               array( 'pl_from' => $pageid ),
+                               __METHOD__
+                       );
+                       $dbw->update( 'templatelinks',
+                               array( 'tl_from_namespace' => $nt->getNamespace() ),
+                               array( 'tl_from' => $pageid ),
+                               __METHOD__
+                       );
+                       $dbw->update( 'imagelinks',
+                               array( 'il_from_namespace' => $nt->getNamespace() ),
+                               array( 'il_from' => $pageid ),
+                               __METHOD__
+                       );
+               }
+
                # Update watchlists
-               $oldnamespace = MWNamespace::getSubject( $this->getNamespace() );
-               $newnamespace = MWNamespace::getSubject( $nt->getNamespace() );
                $oldtitle = $this->getDBkey();
                $newtitle = $nt->getDBkey();
-
-               if ( $oldnamespace != $newnamespace || $oldtitle != $newtitle ) {
+               $oldsnamespace = MWNamespace::getSubject( $this->getNamespace() );
+               $newsnamespace = MWNamespace::getSubject( $nt->getNamespace() );
+               if ( $oldsnamespace != $newsnamespace || $oldtitle != $newtitle ) {
                        WatchedItem::duplicateEntries( $this, $nt );
                }
 
@@ -4667,7 +4676,7 @@ class Title {
                $method = __METHOD__;
                $dbw = wfGetDB( DB_MASTER );
                $conds = $this->pageCond();
-               $dbw->onTransactionIdle( function() use ( $dbw, $conds, $method ) {
+               $dbw->onTransactionIdle( function () use ( $dbw, $conds, $method ) {
                        $dbw->update(
                                'page',
                                array( 'page_touched' => $dbw->timestamp() ),
index fc2b351..a21119a 100644 (file)
  * @file
  */
 
-/**
- * Int Number of characters in user_token field.
- * @ingroup Constants
- */
-define( 'USER_TOKEN_LENGTH', 32 );
-
-/**
- * Int Serialized record version.
- * @ingroup Constants
- */
-define( 'MW_USER_VERSION', 9 );
-
 /**
  * String Some punctuation to prevent editing from broken text-mangling proxies.
  * @ingroup Constants
  */
 define( 'EDIT_TOKEN_SUFFIX', '+\\' );
 
-/**
- * Thrown by User::setPassword() on error.
- * @ingroup Exception
- */
-class PasswordError extends MWException {
-       // NOP
-}
-
 /**
  * The User object encapsulates all of the user-specific settings (user_id,
  * name, rights, password, email address, options, last login time). Client
@@ -58,18 +38,31 @@ class PasswordError extends MWException {
  */
 class User implements IDBAccessObject {
        /**
-        * Global constants made accessible as class constants so that autoloader
+        * @const int Number of characters in user_token field.
+        */
+       const TOKEN_LENGTH = 32;
+
+       /**
+        * Global constant made accessible as class constants so that autoloader
         * magic can be used.
         */
-       const USER_TOKEN_LENGTH = USER_TOKEN_LENGTH;
-       const MW_USER_VERSION = MW_USER_VERSION;
        const EDIT_TOKEN_SUFFIX = EDIT_TOKEN_SUFFIX;
 
+       /**
+        * @const int Serialized record version.
+        */
+       const VERSION = 10;
+
        /**
         * Maximum items in $mWatchedItems
         */
        const MAX_WATCHED_ITEMS_CACHE = 100;
 
+       /**
+        * @var PasswordFactory Lazily loaded factory object for passwords
+        */
+       private static $mPasswordFactory = null;
+
        /**
         * Array of Strings List of member variables which are saved to the
         * shared cache (memcached). Any operation which changes the
@@ -81,16 +74,12 @@ class User implements IDBAccessObject {
                'mId',
                'mName',
                'mRealName',
-               'mPassword',
-               'mNewpassword',
-               'mNewpassTime',
                'mEmail',
                'mTouched',
                'mToken',
                'mEmailAuthenticated',
                'mEmailToken',
                'mEmailTokenExpires',
-               'mPasswordExpires',
                'mRegistration',
                'mEditCount',
                // user_groups table
@@ -175,6 +164,7 @@ class User implements IDBAccessObject {
                'userrights-interwiki',
                'viewmyprivateinfo',
                'viewmywatchlist',
+               'viewsuppressed',
                'writeapi',
        );
 
@@ -356,7 +346,7 @@ class User implements IDBAccessObject {
 
        /**
         * Load user table data, given mId has already been set.
-        * @return bool false if the ID does not exist, true otherwise
+        * @return bool False if the ID does not exist, true otherwise
         */
        public function loadFromId() {
                global $wgMemc;
@@ -368,7 +358,7 @@ class User implements IDBAccessObject {
                // Try cache
                $key = wfMemcKey( 'user', 'id', $this->mId );
                $data = $wgMemc->get( $key );
-               if ( !is_array( $data ) || $data['mVersion'] < MW_USER_VERSION ) {
+               if ( !is_array( $data ) || $data['mVersion'] != self::VERSION ) {
                        // Object is expired, load from DB
                        $data = false;
                }
@@ -409,7 +399,7 @@ class User implements IDBAccessObject {
                foreach ( self::$mCacheVars as $name ) {
                        $data[$name] = $this->$name;
                }
-               $data['mVersion'] = MW_USER_VERSION;
+               $data['mVersion'] = self::VERSION;
                $key = wfMemcKey( 'user', 'id', $this->mId );
                global $wgMemc;
                $wgMemc->set( $key, $data );
@@ -752,7 +742,7 @@ class User implements IDBAccessObject {
         * Given unvalidated password input, return error message on failure.
         *
         * @param string $password Desired password
-        * @return bool|string|array true on success, string or array of error message on failure
+        * @return bool|string|array True on success, string or array of error message on failure
         */
        public function getPasswordValidity( $password ) {
                $result = $this->checkPasswordValidity( $password );
@@ -917,8 +907,9 @@ class User implements IDBAccessObject {
                        return false;
                }
 
-               // Clean up name according to title rules
-               $t = ( $validate === 'valid' ) ?
+               // Clean up name according to title rules,
+               // but only when validation is requested (bug 12654)
+               $t = ( $validate !== false ) ?
                        Title::newFromText( $name ) : Title::makeTitle( NS_USER, $name );
                // Check for invalid titles
                if ( is_null( $t ) ) {
@@ -996,10 +987,13 @@ class User implements IDBAccessObject {
        public function loadDefaults( $name = false ) {
                wfProfileIn( __METHOD__ );
 
+               $passwordFactory = self::getPasswordFactory();
+
                $this->mId = 0;
                $this->mName = $name;
                $this->mRealName = '';
-               $this->mPassword = $this->mNewpassword = '';
+               $this->mPassword = $passwordFactory->newFromCiphertext( null );
+               $this->mNewpassword = $passwordFactory->newFromCiphertext( null );
                $this->mNewpassTime = null;
                $this->mEmail = '';
                $this->mOptionOverrides = null;
@@ -1138,7 +1132,7 @@ class User implements IDBAccessObject {
         * Load user and user_group data from the database.
         * $this->mId must be set, this is how the user is identified.
         *
-        * @param integer $flags Supports User::READ_LOCKING
+        * @param int $flags Supports User::READ_LOCKING
         * @return bool True if the user exists, false if the user is anonymous
         */
        public function loadFromDatabase( $flags = 0 ) {
@@ -1189,6 +1183,7 @@ class User implements IDBAccessObject {
         */
        public function loadFromRow( $row, $data = null ) {
                $all = true;
+               $passwordFactory = self::getPasswordFactory();
 
                $this->mGroups = null; // deferred
 
@@ -1222,9 +1217,31 @@ class User implements IDBAccessObject {
                }
 
                if ( isset( $row->user_password ) ) {
-                       $this->mPassword = $row->user_password;
-                       $this->mNewpassword = $row->user_newpassword;
+                       // Check for *really* old password hashes that don't even have a type
+                       // The old hash format was just an md5 hex hash, with no type information
+                       if ( preg_match( '/^[0-9a-f]{32}$/', $row->user_password ) ) {
+                               $row->user_password = ":A:{$this->mId}:{$row->user_password}";
+                       }
+
+                       try {
+                               $this->mPassword = $passwordFactory->newFromCiphertext( $row->user_password );
+                       } catch ( PasswordError $e ) {
+                               wfDebug( 'Invalid password hash found in database.' );
+                               $this->mPassword = $passwordFactory->newFromCiphertext( null );
+                       }
+
+                       try {
+                               $this->mNewpassword = $passwordFactory->newFromCiphertext( $row->user_newpassword );
+                       } catch ( PasswordError $e ) {
+                               wfDebug( 'Invalid password hash found in database.' );
+                               $this->mNewpassword = $passwordFactory->newFromCiphertext( null );
+                       }
+
                        $this->mNewpassTime = wfTimestampOrNull( TS_MW, $row->user_newpass_time );
+                       $this->mPasswordExpires = wfTimestampOrNull( TS_MW, $row->user_password_expires );
+               }
+
+               if ( isset( $row->user_email ) ) {
                        $this->mEmail = $row->user_email;
                        $this->mTouched = wfTimestamp( TS_MW, $row->user_touched );
                        $this->mToken = $row->user_token;
@@ -1234,7 +1251,6 @@ class User implements IDBAccessObject {
                        $this->mEmailAuthenticated = wfTimestampOrNull( TS_MW, $row->user_email_authenticated );
                        $this->mEmailToken = $row->user_email_token;
                        $this->mEmailTokenExpires = wfTimestampOrNull( TS_MW, $row->user_email_token_expires );
-                       $this->mPasswordExpires = wfTimestampOrNull( TS_MW, $row->user_password_expires );
                        $this->mRegistration = wfTimestampOrNull( TS_MW, $row->user_registration );
                } else {
                        $all = false;
@@ -1285,6 +1301,26 @@ class User implements IDBAccessObject {
                }
        }
 
+       /**
+        * Load the user's password hashes from the database
+        *
+        * This is usually called in a scenario where the actual User object was
+        * loaded from the cache, and then password comparison needs to be performed.
+        * Password hashes are not stored in memcached.
+        *
+        * @since 1.24
+        */
+       private function loadPasswords() {
+               if ( $this->getId() !== 0 && ( $this->mPassword === null || $this->mNewpassword === null ) ) {
+                       $this->loadFromRow( wfGetDB( DB_MASTER )->selectRow(
+                                       'user',
+                                       array( 'user_password', 'user_newpassword', 'user_newpass_time', 'user_password_expires' ),
+                                       array( 'user_id' => $this->getId() ),
+                                       __METHOD__
+                               ) );
+               }
+       }
+
        /**
         * Add the user to the group if he/she meets given criteria.
         *
@@ -1384,7 +1420,7 @@ class User implements IDBAccessObject {
                foreach ( SearchEngine::searchableNamespaces() as $nsnum => $nsname ) {
                        $defOpt['searchNs' . $nsnum] = !empty( $wgNamespacesToBeSearchedDefault[$nsnum] );
                }
-               $defOpt['skin'] = $wgDefaultSkin;
+               $defOpt['skin'] = Skin::normalizeKey( $wgDefaultSkin );
 
                wfRunHooks( 'UserGetDefaultOptions', array( &$defOpt ) );
 
@@ -2033,7 +2069,7 @@ class User implements IDBAccessObject {
         * @see getNewtalk()
         * @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
         * @param string|int $id User's IP address for anonymous users, User ID otherwise
-        * @param bool $fromMaster true to fetch from the master, false for a slave
+        * @param bool $fromMaster True to fetch from the master, false for a slave
         * @return bool True if the user has new messages
         */
        protected function checkNewtalk( $field, $id, $fromMaster = false ) {
@@ -2150,7 +2186,7 @@ class User implements IDBAccessObject {
         *
         * Called implicitly from invalidateCache() and saveSettings().
         */
-       private function clearSharedCache() {
+       public function clearSharedCache() {
                $this->load();
                if ( $this->mId ) {
                        global $wgMemc;
@@ -2175,7 +2211,7 @@ class User implements IDBAccessObject {
                        $userid = $this->mId;
                        $touched = $this->mTouched;
                        $method = __METHOD__;
-                       $dbw->onTransactionIdle( function() use ( $dbw, $userid, $touched, $method ) {
+                       $dbw->onTransactionIdle( function () use ( $dbw, $userid, $touched, $method ) {
                                // Prevent contention slams by checking user_touched first
                                $encTouched = $dbw->addQuotes( $dbw->timestamp( $touched ) );
                                $needsPurge = $dbw->selectField( 'user', '1',
@@ -2223,7 +2259,7 @@ class User implements IDBAccessObject {
         * a new password is set, for instance via e-mail.
         *
         * @param string $str New password to set
-        * @throws PasswordError on failure
+        * @throws PasswordError On failure
         *
         * @return bool
         */
@@ -2266,16 +2302,16 @@ class User implements IDBAccessObject {
         *  through the web interface.
         */
        public function setInternalPassword( $str ) {
-               $this->load();
                $this->setToken();
 
+               $passwordFactory = self::getPasswordFactory();
                if ( $str === null ) {
-                       // Save an invalid hash...
-                       $this->mPassword = '';
+                       $this->mPassword = $passwordFactory->newFromCiphertext( null );
                } else {
-                       $this->mPassword = self::crypt( $str );
+                       $this->mPassword = $passwordFactory->newFromPlaintext( $str );
                }
-               $this->mNewpassword = '';
+
+               $this->mNewpassword = $passwordFactory->newFromCiphertext( null );
                $this->mNewpassTime = null;
        }
 
@@ -2302,7 +2338,7 @@ class User implements IDBAccessObject {
        public function setToken( $token = false ) {
                $this->load();
                if ( !$token ) {
-                       $this->mToken = MWCryptRand::generateHex( USER_TOKEN_LENGTH );
+                       $this->mToken = MWCryptRand::generateHex( self::TOKEN_LENGTH );
                } else {
                        $this->mToken = $token;
                }
@@ -2322,7 +2358,7 @@ class User implements IDBAccessObject {
                        $this->mNewpassword = '';
                        $this->mNewpassTime = null;
                } else {
-                       $this->mNewpassword = self::crypt( $str );
+                       $this->mNewpassword = self::getPasswordFactory()->newFromPlaintext( $str );
                        if ( $throttle ) {
                                $this->mNewpassTime = wfTimestampNow();
                        }
@@ -2373,8 +2409,8 @@ class User implements IDBAccessObject {
                if ( $str == $this->mEmail ) {
                        return;
                }
-               $this->mEmail = $str;
                $this->invalidateEmail();
+               $this->mEmail = $str;
                wfRunHooks( 'UserSetEmail', array( $this, &$this->mEmail ) );
        }
 
@@ -2623,7 +2659,7 @@ class User implements IDBAccessObject {
         * @param IContextSource $context
         * @param array $options Assoc. array with options keys to check as keys.
         *   Defaults to $this->mOptions.
-        * @return array the key => kind mapping data
+        * @return array The key => kind mapping data
         */
        public function getOptionKinds( IContextSource $context, $options = null ) {
                $this->loadOptions();
@@ -2907,7 +2943,7 @@ class User implements IDBAccessObject {
 
        /**
         * Get the user's edit count.
-        * @return int|null null for anonymous users
+        * @return int|null Null for anonymous users
         */
        public function getEditCount() {
                if ( !$this->getId() ) {
@@ -3410,6 +3446,7 @@ class User implements IDBAccessObject {
                global $wgAuth;
 
                $this->load();
+               $this->loadPasswords();
                if ( wfReadOnly() ) {
                        return;
                }
@@ -3419,15 +3456,15 @@ class User implements IDBAccessObject {
 
                $this->mTouched = self::newTouchedTimestamp();
                if ( !$wgAuth->allowSetLocalPassword() ) {
-                       $this->mPassword = '';
+                       $this->mPassword = self::getPasswordFactory()->newFromCiphertext( null );
                }
 
                $dbw = wfGetDB( DB_MASTER );
                $dbw->update( 'user',
                        array( /* SET */
                                'user_name' => $this->mName,
-                               'user_password' => $this->mPassword,
-                               'user_newpassword' => $this->mNewpassword,
+                               'user_password' => $this->mPassword->toString(),
+                               'user_newpassword' => $this->mNewpassword->toString(),
                                'user_newpass_time' => $dbw->timestampOrNull( $this->mNewpassTime ),
                                'user_real_name' => $this->mRealName,
                                'user_email' => $this->mEmail,
@@ -3489,6 +3526,7 @@ class User implements IDBAccessObject {
        public static function createNew( $name, $params = array() ) {
                $user = new User;
                $user->load();
+               $user->loadPasswords();
                $user->setToken(); // init token
                if ( isset( $params['options'] ) ) {
                        $user->mOptions = $params['options'] + (array)$user->mOptions;
@@ -3500,8 +3538,8 @@ class User implements IDBAccessObject {
                $fields = array(
                        'user_id' => $seqVal,
                        'user_name' => $name,
-                       'user_password' => $user->mPassword,
-                       'user_newpassword' => $user->mNewpassword,
+                       'user_password' => $user->mPassword->toString(),
+                       'user_newpassword' => $user->mNewpassword->toString(),
                        'user_newpass_time' => $dbw->timestampOrNull( $user->mNewpassTime ),
                        'user_email' => $user->mEmail,
                        'user_email_authenticated' => $dbw->timestampOrNull( $user->mEmailAuthenticated ),
@@ -3551,6 +3589,7 @@ class User implements IDBAccessObject {
         */
        public function addToDatabase() {
                $this->load();
+               $this->loadPasswords();
                if ( !$this->mToken ) {
                        $this->setToken(); // init token
                }
@@ -3564,8 +3603,8 @@ class User implements IDBAccessObject {
                        array(
                                'user_id' => $seqVal,
                                'user_name' => $this->mName,
-                               'user_password' => $this->mPassword,
-                               'user_newpassword' => $this->mNewpassword,
+                               'user_password' => $this->mPassword->toString(),
+                               'user_newpassword' => $this->mNewpassword->toString(),
                                'user_newpass_time' => $dbw->timestampOrNull( $this->mNewpassTime ),
                                'user_email' => $this->mEmail,
                                'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
@@ -3716,12 +3755,12 @@ class User implements IDBAccessObject {
 
        /**
         * Check to see if the given clear-text password is one of the accepted passwords
-        * @param string $password user password.
-        * @return bool True if the given password is correct, otherwise False.
+        * @param string $password User password
+        * @return bool True if the given password is correct, otherwise False
         */
        public function checkPassword( $password ) {
                global $wgAuth, $wgLegacyEncoding;
-               $this->load();
+               $this->loadPasswords();
 
                // Certain authentication plugins do NOT want to save
                // domain passwords in a mysql database, so we should
@@ -3736,19 +3775,27 @@ class User implements IDBAccessObject {
                        // Auth plugin doesn't allow local authentication for this user name
                        return false;
                }
-               if ( self::comparePasswords( $this->mPassword, $password, $this->mId ) ) {
-                       return true;
-               } elseif ( $wgLegacyEncoding ) {
-                       // Some wikis were converted from ISO 8859-1 to UTF-8, the passwords can't be converted
-                       // Check for this with iconv
-                       $cp1252Password = iconv( 'UTF-8', 'WINDOWS-1252//TRANSLIT', $password );
-                       if ( $cp1252Password != $password
-                               && self::comparePasswords( $this->mPassword, $cp1252Password, $this->mId )
-                       ) {
-                               return true;
+
+               $passwordFactory = self::getPasswordFactory();
+               if ( !$this->mPassword->equals( $password ) ) {
+                       if ( $wgLegacyEncoding ) {
+                               // Some wikis were converted from ISO 8859-1 to UTF-8, the passwords can't be converted
+                               // Check for this with iconv
+                               $cp1252Password = iconv( 'UTF-8', 'WINDOWS-1252//TRANSLIT', $password );
+                               if ( $cp1252Password === $password || !$this->mPassword->equals( $cp1252Password ) ) {
+                                       return false;
+                               }
+                       } else {
+                               return false;
                        }
                }
-               return false;
+
+               if ( $passwordFactory->needsUpdate( $this->mPassword ) ) {
+                       $this->mPassword = $passwordFactory->newFromPlaintext( $password );
+                       $this->saveSettings();
+               }
+
+               return true;
        }
 
        /**
@@ -3763,7 +3810,8 @@ class User implements IDBAccessObject {
                global $wgNewPasswordExpiry;
 
                $this->load();
-               if ( self::comparePasswords( $this->mNewpassword, $plaintext, $this->getId() ) ) {
+               $this->loadPasswords();
+               if ( $this->mNewpassword->equals( $plaintext ) ) {
                        if ( is_null( $this->mNewpassTime ) ) {
                                return true;
                        }
@@ -3778,7 +3826,7 @@ class User implements IDBAccessObject {
         * Alias for getEditToken.
         * @deprecated since 1.19, use getEditToken instead.
         *
-        * @param string|array $salt of Strings Optional function-specific data for hashing
+        * @param string|array $salt Array of Strings Optional function-specific data for hashing
         * @param WebRequest|null $request WebRequest object to use or null to use $wgRequest
         * @return string The new edit token
         */
@@ -3795,7 +3843,7 @@ class User implements IDBAccessObject {
         *
         * @since 1.19
         *
-        * @param string|array $salt of Strings Optional function-specific data for hashing
+        * @param string|array $salt Array of Strings Optional function-specific data for hashing
         * @param WebRequest|null $request WebRequest object to use or null to use $wgRequest
         * @return string The new edit token
         */
@@ -3805,7 +3853,7 @@ class User implements IDBAccessObject {
                }
 
                if ( $this->isAnon() ) {
-                       return EDIT_TOKEN_SUFFIX;
+                       return self::EDIT_TOKEN_SUFFIX;
                } else {
                        $token = $request->getSessionData( 'wsEditToken' );
                        if ( $token === null ) {
@@ -3815,7 +3863,7 @@ class User implements IDBAccessObject {
                        if ( is_array( $salt ) ) {
                                $salt = implode( '|', $salt );
                        }
-                       return md5( $token . $salt ) . EDIT_TOKEN_SUFFIX;
+                       return md5( $token . $salt ) . self::EDIT_TOKEN_SUFFIX;
                }
        }
 
@@ -3856,7 +3904,7 @@ class User implements IDBAccessObject {
         *
         * @param string $val Input value to compare
         * @param string $salt Optional function-specific data for hashing
-        * @param WebRequest|null $request object to use or null to use $wgRequest
+        * @param WebRequest|null $request Object to use or null to use $wgRequest
         * @return bool Whether the token matches
         */
        public function matchEditTokenNoSuffix( $val, $salt = '', $request = null ) {
@@ -4013,6 +4061,7 @@ class User implements IDBAccessObject {
                $this->mEmailToken = null;
                $this->mEmailTokenExpires = null;
                $this->setEmailAuthenticationTimestamp( null );
+               $this->mEmail = '';
                wfRunHooks( 'InvalidateEmailComplete', array( $this ) );
                return true;
        }
@@ -4362,7 +4411,7 @@ class User implements IDBAccessObject {
         * Returns an array of the groups that a particular group can add/remove.
         *
         * @param string $group The group to check for whether it can add/remove
-        * @return array array( 'add' => array( addablegroups ),
+        * @return array Array( 'add' => array( addablegroups ),
         *     'remove' => array( removablegroups ),
         *     'add-self' => array( addablegroups to self),
         *     'remove-self' => array( removable groups from self) )
@@ -4432,7 +4481,7 @@ class User implements IDBAccessObject {
 
        /**
         * Returns an array of groups that this user can add and remove
-        * @return array array( 'add' => array( addablegroups ),
+        * @return array Array( 'add' => array( addablegroups ),
         *  'remove' => array( removablegroups ),
         *  'add-self' => array( addablegroups to self),
         *  'remove-self' => array( removable groups from self) )
@@ -4549,22 +4598,6 @@ class User implements IDBAccessObject {
                return $msg->isBlank() ? $right : $msg->text();
        }
 
-       /**
-        * Make an old-style password hash
-        *
-        * @param string $password Plain-text password
-        * @param string $userId User ID
-        * @return string Password hash
-        */
-       public static function oldCrypt( $password, $userId ) {
-               global $wgPasswordSalt;
-               if ( $wgPasswordSalt ) {
-                       return md5( $userId . '-' . md5( $password ) );
-               } else {
-                       return md5( $password );
-               }
-       }
-
        /**
         * Make a new-style password hash
         *
@@ -4572,23 +4605,12 @@ class User implements IDBAccessObject {
         * @param bool|string $salt Optional salt, may be random or the user ID.
         *  If unspecified or false, will generate one automatically
         * @return string Password hash
+        * @deprecated since 1.24, use Password class
         */
        public static function crypt( $password, $salt = false ) {
-               global $wgPasswordSalt;
-
-               $hash = '';
-               if ( !wfRunHooks( 'UserCryptPassword', array( &$password, &$salt, &$wgPasswordSalt, &$hash ) ) ) {
-                       return $hash;
-               }
-
-               if ( $wgPasswordSalt ) {
-                       if ( $salt === false ) {
-                               $salt = MWCryptRand::generateHex( 8 );
-                       }
-                       return ':B:' . $salt . ':' . md5( $salt . '-' . md5( $password ) );
-               } else {
-                       return ':A:' . md5( $password );
-               }
+               wfDeprecated( __METHOD__, '1.24' );
+               $hash = self::getPasswordFactory()->newFromPlaintext( $password );
+               return $hash->toString();
        }
 
        /**
@@ -4600,26 +4622,24 @@ class User implements IDBAccessObject {
         * @param string|bool $userId User ID for old-style password salt
         *
         * @return bool
+        * @deprecated since 1.24, use Password class
         */
        public static function comparePasswords( $hash, $password, $userId = false ) {
-               $type = substr( $hash, 0, 3 );
-
-               $result = false;
-               if ( !wfRunHooks( 'UserComparePasswords', array( &$hash, &$password, &$userId, &$result ) ) ) {
-                       return $result;
+               wfDeprecated( __METHOD__, '1.24' );
+
+               // Check for *really* old password hashes that don't even have a type
+               // The old hash format was just an md5 hex hash, with no type information
+               if ( preg_match( '/^[0-9a-f]{32}$/', $hash ) ) {
+                       global $wgPasswordSalt;
+                       if ( $wgPasswordSalt ) {
+                               $password = ":B:{$userId}:{$hash}";
+                       } else {
+                               $password = ":A:{$hash}";
+                       }
                }
 
-               if ( $type == ':A:' ) {
-                       // Unsalted
-                       return md5( $password ) === substr( $hash, 3 );
-               } elseif ( $type == ':B:' ) {
-                       // Salted
-                       list( $salt, $realHash ) = explode( ':', substr( $hash, 3 ), 2 );
-                       return md5( $salt . '-' . md5( $password ) ) === $realHash;
-               } else {
-                       // Old-style
-                       return self::oldCrypt( $password, $userId ) === $hash;
-               }
+               $hash = self::getPasswordFactory()->newFromCiphertext( $hash );
+               return $hash->equals( $password );
        }
 
        /**
@@ -4823,6 +4843,20 @@ class User implements IDBAccessObject {
                $dbw->insert( 'user_properties', $insert_rows, __METHOD__, array( 'IGNORE' ) );
        }
 
+       /**
+        * Lazily instantiate and return a factory object for making passwords
+        *
+        * @return PasswordFactory
+        */
+       public static function getPasswordFactory() {
+               if ( self::$mPasswordFactory === null ) {
+                       self::$mPasswordFactory = new PasswordFactory();
+                       self::$mPasswordFactory->init( RequestContext::getMain()->getConfig() );
+               }
+
+               return self::$mPasswordFactory;
+       }
+
        /**
         * Provide an array of HTML5 attributes to put on an input element
         * intended for the user to enter a new password.  This may include
@@ -4891,16 +4925,12 @@ class User implements IDBAccessObject {
                        '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_password_expires',
                        'user_registration',
                        'user_editcount',
                );
index dd67acd..fb533d0 100644 (file)
@@ -27,7 +27,7 @@ class UserArrayFromResult extends UserArray implements Countable {
        /** @var int */
        public $key;
 
-       /** @var  */
+       /** @var bool|stdClass */
        public $current;
 
        /**
index c9db90f..913b430 100644 (file)
@@ -151,13 +151,14 @@ class UserMailer {
         * array of parameters. It requires PEAR:Mail to do that.
         * Otherwise it just uses the standard PHP 'mail' function.
         *
-        * @param MailAddress $to Recipient's email (or an array of them)
+        * @param MailAddress|MailAddress[] $to Recipient's email (or an array of them)
         * @param MailAddress $from Sender's email
         * @param string $subject Email's subject.
         * @param string $body Email's text or Array of two strings to be the text and html bodies
         * @param MailAddress $replyto Optional reply-to email (default: null).
         * @param string $contentType Optional custom Content-Type (default: text/plain; charset=UTF-8)
         * @throws MWException
+        * @throws Exception
         * @return Status
         */
        public static function send( $to, $from, $subject, $body, $replyto = null,
@@ -396,7 +397,7 @@ class UserMailer {
                        if ( self::$mErrorString ) {
                                wfDebug( "Error sending mail: " . self::$mErrorString . "\n" );
                                return Status::newFatal( 'php-mail-error', self::$mErrorString );
-                       } elseif ( ! $sent ) {
+                       } elseif ( !$sent ) {
                                // mail function only tells if there's an error
                                wfDebug( "Unknown error sending mail\n" );
                                return Status::newFatal( 'php-mail-error-unknown' );
@@ -553,7 +554,7 @@ class EmailNotification {
                                // Update wl_notificationtimestamp for all watching users except the editor
                                $fname = __METHOD__;
                                $dbw->onTransactionIdle(
-                                       function() use ( $dbw, $timestamp, $watchers, $title, $fname ) {
+                                       function () use ( $dbw, $timestamp, $watchers, $title, $fname ) {
                                                $dbw->update( 'watchlist',
                                                        array( /* SET */
                                                                'wl_notificationtimestamp' => $dbw->timestamp( $timestamp )
index ce9fecd..a1fa0eb 100644 (file)
@@ -25,8 +25,8 @@
 
 /**
  * The WebRequest class encapsulates getting at data passed in the
- * URL or via a POSTed form, handling remove of "magic quotes" slashes,
- * stripping illegal input characters and normalizing Unicode sequences.
+ * URL or via a POSTed form stripping illegal input characters and
+ * normalizing Unicode sequences.
  *
  * Usually this is used via a global singleton, $wgRequest. You should
  * not create a second WebRequest object; make a FauxRequest object if
@@ -57,10 +57,9 @@ class WebRequest {
        protected $protocol;
 
        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
-               ///        demand; but currently we have no wrapper for $_SERVER etc.
-               $this->checkMagicQuotes();
+               if ( function_exists( 'get_magic_quotes_gpc' ) && get_magic_quotes_gpc() ) {
+                       throw new MWException( "MediaWiki does not function when magic quotes are enabled." );
+               }
 
                // POST overrides GET data
                // We don't use $_REQUEST here to avoid interference from cookies...
@@ -271,51 +270,6 @@ class WebRequest {
                return array();
        }
 
-       /**
-        * Recursively strips slashes from the given array;
-        * used for undoing the evil that is magic_quotes_gpc.
-        *
-        * @param array $arr will be modified
-        * @param bool $topLevel 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, $topLevel = true ) {
-               $clean = array();
-               foreach ( $arr as $key => $val ) {
-                       if ( is_array( $val ) ) {
-                               $cleanKey = $topLevel ? stripslashes( $key ) : $key;
-                               $clean[$cleanKey] = $this->fix_magic_quotes( $arr[$key], false );
-                       } else {
-                               $cleanKey = stripslashes( $key );
-                               $clean[$cleanKey] = stripslashes( $val );
-                       }
-               }
-               $arr = $clean;
-               return $arr;
-       }
-
-       /**
-        * If magic_quotes_gpc option is on, run the global arrays
-        * through fix_magic_quotes to strip out the stupid slashes.
-        * WARNING: This should only be done once! Running a second
-        * time could damage the values.
-        */
-       private function checkMagicQuotes() {
-               $mustFixQuotes = function_exists( 'get_magic_quotes_gpc' )
-                       && get_magic_quotes_gpc();
-               if ( $mustFixQuotes ) {
-                       $this->fix_magic_quotes( $_COOKIE );
-                       $this->fix_magic_quotes( $_ENV );
-                       $this->fix_magic_quotes( $_GET );
-                       $this->fix_magic_quotes( $_POST );
-                       $this->fix_magic_quotes( $_REQUEST );
-                       $this->fix_magic_quotes( $_SERVER );
-               }
-       }
-
        /**
         * Recursively normalizes UTF-8 strings in the given array.
         *
@@ -746,7 +700,7 @@ class WebRequest {
 
        /**
         * Take an arbitrary query and rewrite the present URL to include it
-        * @param string $query query string fragment; do not include initial '?'
+        * @param string $query Query string fragment; do not include initial '?'
         *
         * @return string
         */
@@ -818,7 +772,7 @@ class WebRequest {
         * Return the path to the temporary file where PHP has stored the upload.
         *
         * @param string $key
-        * @return string|null string or null if no such file.
+        * @return string|null String or null if no such file.
         */
        public function getFileTempname( $key ) {
                $file = new WebRequestUpload( $this, $key );
@@ -845,7 +799,7 @@ class WebRequest {
         * Other than this the name is not verified for being a safe filename.
         *
         * @param string $key
-        * @return string|null string or null if no such file.
+        * @return string|null String or null if no such file.
         */
        public function getFileName( $key ) {
                $file = new WebRequestUpload( $this, $key );
@@ -914,7 +868,7 @@ class WebRequest {
 
        /**
         * Get a request header, or false if it isn't set
-        * @param string $name case-insensitive header name
+        * @param string $name Case-insensitive header name
         *
         * @return string|bool False on failure
         */
@@ -1015,7 +969,7 @@ HTML;
        /**
         * Parse the Accept-Language header sent by the client into an array
         *
-        * @return array array( languageCode => q-value ) sorted by q-value in
+        * @return array Array( languageCode => q-value ) sorted by q-value in
         *   descending order then appearing time in the header in ascending order.
         * May contain the "language" '*', which applies to languages other than those explicitly listed.
         * This is aligned with rfc2616 section 14.4
@@ -1298,7 +1252,7 @@ class FauxRequest extends WebRequest {
        private $session = array();
 
        /**
-        * @param array $data of *non*-urlencoded key => value pairs, the
+        * @param array $data Array of *non*-urlencoded key => value pairs, the
         *   fake GET/POST values
         * @param bool $wasPosted Whether to treat the data as POST
         * @param array|null $session Session array or null
index 75efce5..adccf9c 100644 (file)
@@ -29,8 +29,8 @@ class WebResponse {
 
        /**
         * Output a HTTP header, wrapper for PHP's header()
-        * @param string $string header to output
-        * @param bool $replace replace current similar header
+        * @param string $string Header to output
+        * @param bool $replace Replace current similar header
         * @param null|int $http_response_code Forces the HTTP response code to the specified value.
         */
        public function header( $string, $replace = true, $http_response_code = null ) {
@@ -39,8 +39,8 @@ class WebResponse {
 
        /**
         * Set the browser cookie
-        * @param string $name name of cookie
-        * @param string $value value to give cookie
+        * @param string $name Name of cookie
+        * @param string $value Value to give cookie
         * @param int|null $expire Unix timestamp (in seconds) when the cookie should expire.
         *        0 (the default) causes it to expire $wgCookieExpiration seconds from now.
         *        null causes it to be a session cookie.
@@ -123,8 +123,8 @@ class FauxResponse extends WebResponse {
 
        /**
         * Stores a HTTP header
-        * @param string $string header to output
-        * @param bool $replace replace current similar header
+        * @param string $string Header to output
+        * @param bool $replace Replace current similar header
         * @param null|int $http_response_code Forces the HTTP response code to the specified value.
         */
        public function header( $string, $replace = true, $http_response_code = null ) {
@@ -171,10 +171,10 @@ class FauxResponse extends WebResponse {
        /**
         * @todo document. It just ignore optional parameters.
         *
-        * @param string $name name of cookie
-        * @param string $value value to give cookie
-        * @param int $expire number of seconds til cookie expires (Default: 0)
-        * @param array $options ignored
+        * @param string $name Name of cookie
+        * @param string $value Value to give cookie
+        * @param int $expire Number of seconds til cookie expires (Default: 0)
+        * @param array $options Ignored
         */
        public function setcookie( $name, $value, $expire = 0, $options = null ) {
                $this->cookies[$name] = $value;
index 71454f0..e137628 100644 (file)
@@ -41,11 +41,7 @@ header( 'X-Content-Type-Options: nosniff' );
 
 $wgRequestTime = microtime( true );
 # getrusage() does not exist on the Microsoft Windows platforms, catching this
-if ( function_exists ( 'getrusage' ) ) {
-       $wgRUstart = getrusage();
-} else {
-       $wgRUstart = array();
-}
+$wgRUstart = function_exists( 'getrusage' ) ? getrusage() : array();
 unset( $IP );
 
 # Valid web server entry point, enable includes.
@@ -61,11 +57,7 @@ define( 'MEDIAWIKI', true );
 # if we don't have permissions on parent directories.
 $IP = getenv( 'MW_INSTALL_PATH' );
 if ( $IP === false ) {
-       if ( realpath( '.' ) ) {
-               $IP = realpath( '.' );
-       } else {
-               $IP = dirname( __DIR__ );
-       }
+       $IP = realpath( '.' ) ?: dirname( __DIR__ );
 }
 
 # Start the autoloader, so that extensions can derive classes from core files
index 6fb5380..7761ecc 100644 (file)
@@ -233,7 +233,7 @@ class Xml {
         * @param string $inLanguage The ISO code of the language to display the select list in (optional)
         * @param array $overrideAttrs Override the attributes of the select tag (since 1.20)
         * @param Message|null $msg Label message key (since 1.20)
-        * @return array containing 2 items: label HTML and select list HTML
+        * @return array Array containing 2 items: label HTML and select list HTML
         */
        public static function languageSelector( $selected, $customisedOnly = true,
                $inLanguage = null, $overrideAttrs = array(), Message $msg = null
index 32efc68..bc4df34 100644 (file)
@@ -110,7 +110,7 @@ abstract class CachedAction extends FormlessAction implements ICacheHelper {
         *
         * @since 1.20
         *
-        * @param {function} $computeFunction
+        * @param callable $computeFunction
         * @param array|mixed $args
         * @param string|null $key
         *
@@ -128,7 +128,7 @@ abstract class CachedAction extends FormlessAction implements ICacheHelper {
         *
         * @since 1.20
         *
-        * @param {function} $computeFunction
+        * @param callable $computeFunction
         * @param array $args
         * @param string|null $key
         */
index 2bb1be4..dd5195d 100644 (file)
@@ -60,7 +60,7 @@ class CreditsAction extends FormlessAction {
         *
         * @param int $cnt Maximum list of contributors to show
         * @param bool $showIfMax Whether to contributors if there more than $cnt
-        * @return string html
+        * @return string Html
         */
        public function getCredits( $cnt, $showIfMax = true ) {
                wfProfileIn( __METHOD__ );
@@ -104,7 +104,7 @@ class CreditsAction extends FormlessAction {
         * Get a list of contributors of $article
         * @param int $cnt Maximum list of contributors to show
         * @param bool $showIfMax Whether to contributors if there more than $cnt
-        * @return string html
+        * @return string Html
         */
        protected function getContributors( $cnt, $showIfMax ) {
                global $wgHiddenPrefs;
index c946184..4992313 100644 (file)
@@ -214,7 +214,7 @@ class HistoryAction extends FormlessAction {
         *
         * @param int $limit The limit number of revisions to get
         * @param int $offset
-        * @param int $direction Either HistoryPage::DIR_PREV or HistoryPage::DIR_NEXT
+        * @param int $direction Either self::DIR_PREV or self::DIR_NEXT
         * @return ResultWrapper
         */
        function fetchRevisions( $limit, $offset, $direction ) {
@@ -225,9 +225,9 @@ class HistoryAction extends FormlessAction {
 
                $dbr = wfGetDB( DB_SLAVE );
 
-               if ( $direction == HistoryPage::DIR_PREV ) {
+               if ( $direction === self::DIR_PREV ) {
                        list( $dirs, $oper ) = array( "ASC", ">=" );
-               } else { /* $direction == HistoryPage::DIR_NEXT */
+               } else { /* $direction === self::DIR_NEXT */
                        list( $dirs, $oper ) = array( "DESC", "<=" );
                }
 
@@ -251,7 +251,7 @@ class HistoryAction extends FormlessAction {
        /**
         * Output a subscription feed listing recent edits to this page.
         *
-        * @param string $type feed type
+        * @param string $type Feed type
         */
        function feed( $type ) {
                global $wgFeedClasses, $wgFeedLimit;
@@ -273,7 +273,7 @@ class HistoryAction extends FormlessAction {
                $limit = $request->getInt( 'limit', 10 );
                $limit = min( max( $limit, 1 ), $wgFeedLimit );
 
-               $items = $this->fetchRevisions( $limit, 0, HistoryPage::DIR_NEXT );
+               $items = $this->fetchRevisions( $limit, 0, self::DIR_NEXT );
 
                // Generate feed elements enclosed between header and footer.
                $feed->outHeader();
@@ -303,7 +303,7 @@ class HistoryAction extends FormlessAction {
         * Borrows Recent Changes' feed generation functions for formatting;
         * includes a diff to the previous revision (if any).
         *
-        * @param stdClass|array $row database row
+        * @param stdClass|array $row Database row
         * @return FeedItem
         */
        function feedItem( $row ) {
@@ -776,18 +776,21 @@ class HistoryPager extends ReverseChronologicalPager {
        /**
         * Create a diff-to-previous link for this revision for this page.
         *
-        * @param Revision $prevRev The previous revision
-        * @param mixed $next The newer revision
+        * @param Revision $prevRev The revision being displayed
+        * @param stdClass|string|null $next The next revision in list (that is
+        *        the previous one in chronological order).
+        *        May either be a row, "unknown" or null.
         * @return string
         */
        function lastLink( $prevRev, $next ) {
                $last = $this->historyPage->message['last'];
-               # $next may either be a Row, null, or "unknown"
-               $nextRev = is_object( $next ) ? new Revision( $next ) : $next;
-               if ( is_null( $next ) ) {
+
+               if ( $next === null ) {
                        # Probably no next row
                        return $last;
-               } elseif ( $next === 'unknown' ) {
+               }
+
+               if ( $next === 'unknown' ) {
                        # Next row probably exists but is unknown, use an oldid=prev link
                        return Linker::linkKnown(
                                $this->getTitle(),
@@ -798,21 +801,25 @@ class HistoryPager extends ReverseChronologicalPager {
                                        'oldid' => 'prev'
                                )
                        );
-               } elseif ( !$prevRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
+               }
+
+               $nextRev = new Revision( $next );
+
+               if ( !$prevRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
                        || !$nextRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
                ) {
                        return $last;
-               } else {
-                       return Linker::linkKnown(
-                               $this->getTitle(),
-                               $last,
-                               array(),
-                               array(
-                                       'diff' => $prevRev->getId(),
-                                       'oldid' => $next->rev_id
-                               )
-                       );
                }
+
+               return Linker::linkKnown(
+                       $this->getTitle(),
+                       $last,
+                       array(),
+                       array(
+                               'diff' => $prevRev->getId(),
+                               'oldid' => $next->rev_id
+                       )
+               );
        }
 
        /**
@@ -879,18 +886,3 @@ class HistoryPager extends ReverseChronologicalPager {
                return $this->preventClickjacking;
        }
 }
-
-/**
- * Backwards-compatibility alias
- */
-class HistoryPage extends HistoryAction {
-       // @codingStandardsIgnoreStart Needed "useless" override to make it public.
-       public function __construct( Page $article ) {
-               parent::__construct( $article );
-       }
-       // @codingStandardsIgnoreEnd
-
-       public function history() {
-               $this->onView();
-       }
-}
index a212915..37e6e66 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright © 2004 Gabriel Wicke <wicke@wikidev.net>
  * http://wikidev.net/
  *
- * Based on HistoryPage and SpecialExport
+ * Based on HistoryAction and SpecialExport
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -205,10 +205,11 @@ class RawAction extends FormlessAction {
                switch ( $this->getRequest()->getText( 'direction' ) ) {
                        case 'next':
                                # output next revision, or nothing if there isn't one
+                               $nextid = 0;
                                if ( $oldid ) {
-                                       $oldid = $this->getTitle()->getNextRevisionID( $oldid );
+                                       $nextid = $this->getTitle()->getNextRevisionID( $oldid );
                                }
-                               $oldid = $oldid ? $oldid : -1;
+                               $oldid = $nextid ?: -1;
                                break;
                        case 'prev':
                                # output previous revision, or nothing if there isn't one
@@ -216,8 +217,8 @@ class RawAction extends FormlessAction {
                                        # get the current revision so we can get the penultimate one
                                        $oldid = $this->page->getLatest();
                                }
-                               $prev = $this->getTitle()->getPreviousRevisionID( $oldid );
-                               $oldid = $prev ? $prev : -1;
+                               $previd = $this->getTitle()->getPreviousRevisionID( $oldid );
+                               $oldid = $previd ?: -1;
                                break;
                        case 'cur':
                                $oldid = 0;
@@ -252,40 +253,3 @@ class RawAction extends FormlessAction {
                return $ctype;
        }
 }
-
-/**
- * Backward compatibility for extensions
- *
- * @deprecated since 1.19
- */
-class RawPage extends RawAction {
-       public $mOldId;
-
-       /**
-        * @param Page $page
-        * @param WebRequest|bool $request The WebRequest (default: false).
-        */
-       function __construct( Page $page, $request = false ) {
-               wfDeprecated( __CLASS__, '1.19' );
-               parent::__construct( $page );
-
-               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();
-       }
-}
index 617f1c9..76d70d7 100644 (file)
@@ -39,6 +39,7 @@ class RollbackAction extends FormlessAction {
                $details = null;
 
                $request = $this->getRequest();
+               $user = $this->getUser();
 
                $result = $this->page->doRollback(
                        $request->getVal( 'from' ),
@@ -97,6 +98,11 @@ class RollbackAction extends FormlessAction {
                $new = Linker::revUserTools( $target );
                $this->getOutput()->addHTML( $this->msg( 'rollback-success' )->rawParams( $old, $new )
                        ->parseAsBlock() );
+
+               if ( $user->getBoolOption( 'watchrollback' ) ) {
+                       $user->addWatch( $this->page->getTitle(), WatchedItem::IGNORE_USER_RIGHTS );
+               }
+
                $this->getOutput()->returnToMain( false, $this->getTitle() );
 
                if ( !$request->getBool( 'hidediff', false ) &&
index 2fa4518..35555bc 100644 (file)
@@ -104,8 +104,8 @@ class ApiDelete extends ApiBase {
         *
         * @param Page|WikiPage $page Page or WikiPage object to work on
         * @param User $user User doing the action
-        * @param string $token delete token (same as edit token)
-        * @param string|null $reason reason for the deletion. Autogenerated if null
+        * @param string $token Delete token (same as edit token)
+        * @param string|null $reason Reason for the deletion. Autogenerated if null
         * @return Status|array
         */
        public static function delete( Page $page, User $user, $token, &$reason = null ) {
index 884306a..8a0c280 100644 (file)
@@ -252,7 +252,8 @@ class ApiEditPage extends ApiBase {
                        'format' => $contentFormat,
                        'model' => $contentHandler->getModelID(),
                        'wpEditToken' => $params['token'],
-                       'wpIgnoreBlankSummary' => ''
+                       'wpIgnoreBlankSummary' => '',
+                       'wpIgnoreBlankArticle' => true
                );
 
                if ( !is_null( $params['summary'] ) ) {
index 82d303f..b3a9d83 100644 (file)
@@ -42,8 +42,10 @@ class ApiExpandTemplates extends ApiBase {
                $this->requireMaxOneParameter( $params, 'prop', 'generatexml' );
 
                if ( $params['prop'] === null ) {
-                       $this->setWarning( 'Because no values have been specified for the prop parameter, a legacy format has been used for the output.'
-                                . ' This format is deprecated, and in the future, a default value will be set for the prop parameter, causing the new format to always be used.' );
+                       $this->setWarning( 'Because no values have been specified for the prop parameter, a ' .
+                               'legacy format has been used for the output. This format is deprecated, and in ' .
+                               'the future, a default value will be set for the prop parameter, causing the new' .
+                               'format to always be used.' );
                        $prop = array();
                } else {
                        $prop = array_flip( $params['prop'] );
@@ -159,9 +161,12 @@ class ApiExpandTemplates extends ApiBase {
                        'prop' => array(
                                'Which pieces of information to get',
                                ' wikitext   - The expanded wikitext',
-                               ' categories - Any categories present in the input that are not represented in the wikitext output',
-                               ' volatile   - Whether the output is volatile and should not be reused elsewhere within the page',
-                               ' ttl        - The maximum time after which caches of the result should be invalidated',
+                               ' categories - Any categories present in the input that are not represented in ' .
+                                       'the wikitext output',
+                               ' volatile   - Whether the output is volatile and should not be reused ' .
+                                       'elsewhere within the page',
+                               ' ttl        - The maximum time after which caches of the result should be ' .
+                                       'invalidated',
                                ' parsetree  - The XML parse tree of the input',
                                'Note that if no values are selected, the result will contain the wikitext,',
                                'but the output will be in a deprecated format.',
index 848d129..5d20005 100644 (file)
@@ -354,7 +354,7 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
         * Call this method to initialize output data. See execute()
         * @param ApiResult $result
         * @param object $feed An instance of one of the $wgFeedClasses classes
-        * @param array $feedItems of FeedItem objects
+        * @param array $feedItems Array of FeedItem objects
         */
        public static function setResult( $result, $feed, $feedItems ) {
                // Store output in the Result data.
index e2c6b9a..6c5ad38 100644 (file)
@@ -66,7 +66,9 @@ class ApiFormatJson extends ApiFormatBase {
                $callback = $params['callback'];
                if ( $callback !== null ) {
                        $callback = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $callback );
-                       $this->printText( "$callback($json)" );
+                       # Prepend a comment to try to avoid attacks against content
+                       # sniffers, such as bug 68187.
+                       $this->printText( "/**/$callback($json)" );
                } else {
                        $this->printText( $json );
                }
index c932a74..fa7524f 100644 (file)
@@ -26,10 +26,10 @@ class ApiImageRotate extends ApiBase {
 
        /**
         * Add all items from $values into the result
-        * @param array $result output
-        * @param array $values values to add
-        * @param string $flag the name of the boolean flag to mark this element
-        * @param string $name if given, name of the value
+        * @param array $result Output
+        * @param array $values Values to add
+        * @param string $flag The name of the boolean flag to mark this element
+        * @param string $name If given, name of the value
         */
        private static function addValues( array &$result, $values, $flag = null, $name = null ) {
                foreach ( $values as $val ) {
index a5873e6..4a75f3c 100644 (file)
@@ -861,7 +861,7 @@ class ApiMain extends ApiBase {
        /**
         * Check POST for external response and setup result printer
         * @param ApiBase $module An Api module
-        * @param array $params an array with the request parameters
+        * @param array $params An array with the request parameters
         */
        protected function setupExternalResponse( $module, $params ) {
                if ( !$this->getRequest()->wasPosted() && $module->mustBePosted() ) {
index b906b59..2e993e3 100644 (file)
@@ -213,7 +213,7 @@ class ApiParse extends ApiBase {
                        }
 
                        if ( $this->section !== false ) {
-                               $this->content = $this->getSectionContent( $this->content, $titleObj->getText() );
+                               $this->content = $this->getSectionContent( $this->content, $titleObj->getPrefixedText() );
                        }
 
                        if ( $params['pst'] || $params['onlypst'] ) {
@@ -450,7 +450,7 @@ class ApiParse extends ApiBase {
                if ( $this->section !== false && $this->content !== null ) {
                        $this->content = $this->getSectionContent(
                                $this->content,
-                               !is_null( $pageId ) ? 'page id ' . $pageId : $page->getTitle()->getText()
+                               !is_null( $pageId ) ? 'page id ' . $pageId : $page->getTitle()->getPrefixedText()
                        );
 
                        // Not cached (save or load)
@@ -470,6 +470,10 @@ class ApiParse extends ApiBase {
                return $pout;
        }
 
+       /**
+        * @param Content $content
+        * @param string $what Identifies the content in error messages, e.g. page title.
+        */
        private function getSectionContent( Content $content, $what ) {
                // Not cached (save or load)
                $section = $content->getSection( $this->section );
index f4b28fa..606012c 100644 (file)
@@ -180,7 +180,7 @@ class ApiQuery extends ApiBase {
        /**
         * Get the array mapping module names to class names
         * @deprecated since 1.21, use getModuleManager()'s methods instead
-        * @return array array(modulename => classname)
+        * @return array Array(modulename => classname)
         */
        public function getModules() {
                wfDeprecated( __METHOD__, '1.21' );
@@ -191,7 +191,7 @@ class ApiQuery extends ApiBase {
        /**
         * Get the generators array mapping module names to class names
         * @deprecated since 1.21, list of generators is maintained by ApiPageSet
-        * @return array array(modulename => classname)
+        * @return array Array(modulename => classname)
         */
        public function getGenerators() {
                wfDeprecated( __METHOD__, '1.21' );
@@ -348,29 +348,29 @@ class ApiQuery extends ApiBase {
                $pageSet = $this->getPageSet();
                $result = $this->getResult();
 
-               // We don't check for a full result set here because we can't be adding
-               // more than 380K. The maximum revision size is in the megabyte range,
-               // and the maximum result size must be even higher than that.
+               // We can't really handle max-result-size failure here, but we need to
+               // check anyway in case someone set the limit stupidly low.
+               $fit = true;
 
                $values = $pageSet->getNormalizedTitlesAsResult( $result );
                if ( $values ) {
-                       $result->addValue( 'query', 'normalized', $values );
+                       $fit = $fit && $result->addValue( 'query', 'normalized', $values );
                }
                $values = $pageSet->getConvertedTitlesAsResult( $result );
                if ( $values ) {
-                       $result->addValue( 'query', 'converted', $values );
+                       $fit = $fit && $result->addValue( 'query', 'converted', $values );
                }
                $values = $pageSet->getInterwikiTitlesAsResult( $result, $this->mParams['iwurl'] );
                if ( $values ) {
-                       $result->addValue( 'query', 'interwiki', $values );
+                       $fit = $fit && $result->addValue( 'query', 'interwiki', $values );
                }
                $values = $pageSet->getRedirectTitlesAsResult( $result );
                if ( $values ) {
-                       $result->addValue( 'query', 'redirects', $values );
+                       $fit = $fit && $result->addValue( 'query', 'redirects', $values );
                }
                $values = $pageSet->getMissingRevisionIDsAsResult( $result );
                if ( $values ) {
-                       $result->addValue( 'query', 'badrevids', $values );
+                       $fit = $fit && $result->addValue( 'query', 'badrevids', $values );
                }
 
                // Page elements
@@ -426,12 +426,21 @@ class ApiQuery extends ApiBase {
                                // json treats all map keys as strings - converting to match
                                $pageIDs = array_map( 'strval', $pageIDs );
                                $result->setIndexedTagName( $pageIDs, 'id' );
-                               $result->addValue( 'query', 'pageids', $pageIDs );
+                               $fit = $fit && $result->addValue( 'query', 'pageids', $pageIDs );
                        }
 
                        $result->setIndexedTagName( $pages, 'page' );
-                       $result->addValue( 'query', 'pages', $pages );
+                       $fit = $fit && $result->addValue( 'query', 'pages', $pages );
                }
+
+               if ( !$fit ) {
+                       $this->dieUsage(
+                               'The value of $wgAPIMaxResultSize on this wiki is ' .
+                                       'too small to hold basic result information',
+                               'badconfig'
+                       );
+               }
+
                if ( $this->mParams['export'] ) {
                        $this->doExport( $pageSet, $result );
                }
@@ -441,7 +450,7 @@ class ApiQuery extends ApiBase {
         * This method is called by the generator base when generator in the smart-continue
         * mode tries to set 'query-continue' value. ApiQuery stores those values separately
         * until the post-processing when it is known if the generation should continue or repeat.
-        * @deprecated @since 1.24
+        * @deprecated since 1.24
         * @param ApiQueryGeneratorBase $module Generator module
         * @param string $paramName
         * @param mixed $paramValue
index fb88201..ebfd8b2 100644 (file)
@@ -610,7 +610,12 @@ abstract class ApiQueryBase extends ApiBase {
         * @return bool
         */
        public function userCanSeeRevDel() {
-               return $this->getUser()->isAllowedAny( 'deletedhistory', 'deletedtext', 'suppressrevision' );
+               return $this->getUser()->isAllowedAny(
+                       'deletedhistory',
+                       'deletedtext',
+                       'suppressrevision',
+                       'viewsuppressed'
+               );
        }
 }
 
index 6994cd4..4f77078 100644 (file)
@@ -210,7 +210,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        // check it again just in case)
                        if ( !$user->isAllowed( 'deletedhistory' ) ) {
                                $bitmask = Revision::DELETED_USER;
-                       } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+                       } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
                                $bitmask = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
                        } else {
                                $bitmask = 0;
index 25e1f38..a94b4fa 100644 (file)
@@ -129,7 +129,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                // Exclude files this user can't view.
                if ( !$user->isAllowed( 'deletedtext' ) ) {
                        $bitmask = File::DELETED_FILE;
-               } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+               } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
                        $bitmask = File::DELETED_FILE | File::DELETED_RESTRICTED;
                } else {
                        $bitmask = 0;
index 4b49a80..a214610 100644 (file)
@@ -534,7 +534,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
         *
         * If this is >= TRANSFORM_LIMIT, you should probably stop processing images.
         *
-        * @return int count
+        * @return int Count
         */
        static function getTransformCount() {
                return self::$transformCount;
index 3aad785..7cd8aac 100644 (file)
@@ -204,7 +204,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
                                $titleBits = LogPage::DELETED_ACTION;
                                $userBits = LogPage::DELETED_USER;
-                       } elseif ( !$this->getUser()->isAllowed( 'suppressrevision' ) ) {
+                       } elseif ( !$this->getUser()->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
                                $titleBits = LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED;
                                $userBits = LogPage::DELETED_USER | LogPage::DELETED_RESTRICTED;
                        } else {
@@ -403,7 +403,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                        $vals['user'] = $row->user_name === null ? $row->log_user_text : $row->user_name;
                                }
                                if ( $this->fld_userid ) {
-                                       $vals['userid'] = $row->log_user;
+                                       $vals['userid'] = intval( $row->log_user );
                                }
 
                                if ( !$row->log_user ) {
index c35d39b..cb4e3e8 100644 (file)
@@ -47,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 array(tokenname => function)
+        * @return array Array(tokenname => function)
         */
        protected function getTokenFunctions() {
                // Don't call the hooks twice
@@ -105,7 +105,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
        /**
         * Sets internal state to include the desired properties in the output.
-        * @param array $prop associative array of properties, only keys are used here
+        * @param array $prop Associative array of properties, only keys are used here
         */
        public function initProperties( $prop ) {
                $this->fld_comment = isset( $prop['comment'] );
@@ -329,7 +329,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
                        if ( !$user->isAllowed( 'deletedhistory' ) ) {
                                $bitmask = Revision::DELETED_USER;
-                       } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+                       } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
                                $bitmask = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
                        } else {
                                $bitmask = 0;
@@ -342,7 +342,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        // LogPage::DELETED_ACTION hides the affected page, too.
                        if ( !$user->isAllowed( 'deletedhistory' ) ) {
                                $bitmask = LogPage::DELETED_ACTION;
-                       } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+                       } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
                                $bitmask = LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED;
                        } else {
                                $bitmask = 0;
index 3ff6805..582f61e 100644 (file)
@@ -318,7 +318,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                                // Paranoia: avoid brute force searches (bug 17342)
                                if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
                                        $bitmask = Revision::DELETED_USER;
-                               } elseif ( !$this->getUser()->isAllowed( 'suppressrevision' ) ) {
+                               } elseif ( !$this->getUser()->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
                                        $bitmask = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
                                } else {
                                        $bitmask = 0;
index 089ce04..30201fc 100644 (file)
@@ -242,7 +242,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['articlepath'] = $config->get( 'ArticlePath' );
                $data['scriptpath'] = $config->get( 'ScriptPath' );
                $data['script'] = $config->get( 'Script' );
-               $data['variantarticlepath'] = $config->get( 'VariantArticlePath'  );
+               $data['variantarticlepath'] = $config->get( 'VariantArticlePath' );
                $data['server'] = $config->get( 'Server' );
                $data['servername'] = $config->get( 'ServerName' );
                $data['wikiid'] = wfWikiID();
@@ -262,8 +262,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $data['imagelimits'][$k] = array( 'width' => $limit[0], 'height' => $limit[1] );
                }
 
-                $favicon = $config->get( 'Favicon' );
-                if ( !empty( $favicon ) ) {
+               $favicon = $config->get( 'Favicon' );
+               if ( !empty( $favicon ) ) {
                        // wgFavicon can either be a relative or an absolute path
                        // make sure we always return an absolute path
                        $data['favicon'] = wfExpandUrl( $favicon, PROTO_RELATIVE );
@@ -314,7 +314,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
        protected function appendNamespaceAliases( $property ) {
                global $wgContLang;
-               $aliases = array_merge( $this->getConfig()->get( 'NamespaceAliases' ), $wgContLang->getNamespaceAliases() );
+               $aliases = array_merge( $this->getConfig()->get( 'NamespaceAliases' ),
+                       $wgContLang->getNamespaceAliases() );
                $namespaces = $wgContLang->getNamespaces();
                $data = array();
                foreach ( $aliases as $title => $ns ) {
@@ -420,7 +421,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        }
 
                        $val['url'] = wfExpandUrl( $row['iw_url'], PROTO_CURRENT );
-                       if (substr( $row['iw_url'], 0, 2) == '//') {
+                       if ( substr( $row['iw_url'], 0, 2 ) == '//' ) {
                                $val['protorel'] = '';
                        }
                        if ( isset( $row['iw_wikiid'] ) ) {
index 5f93071..29d0300 100644 (file)
@@ -193,7 +193,7 @@ class ApiQueryContributions extends ApiQueryBase {
                // see the username.
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $bitmask = Revision::DELETED_USER;
-               } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+               } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
                        $bitmask = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
                } else {
                        $bitmask = 0;
index 506fb59..b1b84d8 100644 (file)
@@ -224,7 +224,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
                        if ( !$user->isAllowed( 'deletedhistory' ) ) {
                                $bitmask = Revision::DELETED_USER;
-                       } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+                       } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
                                $bitmask = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
                        } else {
                                $bitmask = 0;
@@ -238,7 +238,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                // entirely from the watchlist, or someone could guess the title.
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $bitmask = LogPage::DELETED_ACTION;
-               } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+               } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
                        $bitmask = LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED;
                } else {
                        $bitmask = 0;
index ac64cf0..97b74e5 100644 (file)
@@ -597,7 +597,7 @@ class ApiResult extends ApiBase {
                                        $this->getMain()->getRequest()->getValues(),
                                        array_flip( $this->generatorParams )
                                );
-                       } else if ( $this->generatorContinuationData ) {
+                       } elseif ( $this->generatorContinuationData ) {
                                // All the generator-using modules are complete, but the
                                // generator isn't. Continue the generator and restart the
                                // generator-using modules
index 80e09b6..1bba715 100644 (file)
@@ -61,7 +61,13 @@ class ApiRollback extends ApiBase {
                        $this->dieUsageMsg( reset( $retval ) );
                }
 
-               $this->setWatch( $params['watchlist'], $titleObj );
+               $watch = 'preferences';
+               if ( isset( $params['watchlist'] ) ) {
+                       $watch = $params['watchlist'];
+               }
+
+               // Watch pages
+               $this->setWatch( $watch, $titleObj, 'watchrollback' );
 
                $info = array(
                        'title' => $titleObj->getPrefixedText(),
index 332ed51..7d6a7e4 100644 (file)
@@ -60,7 +60,7 @@ class ApiUndelete extends ApiBase {
                $retval = $pa->undelete(
                        ( isset( $params['timestamps'] ) ? $params['timestamps'] : array() ),
                        $params['reason'],
-                       array(),
+                       $params['fileids'],
                        false,
                        $this->getUser()
                );
@@ -70,7 +70,7 @@ class ApiUndelete extends ApiBase {
 
                if ( $retval[1] ) {
                        wfRunHooks( 'FileUndeleteComplete',
-                               array( $titleObj, array(), $this->getUser(), $params['reason'] ) );
+                               array( $titleObj, $params['fileids'], $this->getUser(), $params['reason'] ) );
                }
 
                $this->setWatch( $params['watchlist'], $titleObj );
@@ -105,6 +105,10 @@ class ApiUndelete extends ApiBase {
                                ApiBase::PARAM_TYPE => 'timestamp',
                                ApiBase::PARAM_ISMULTI => true,
                        ),
+                       'fileids' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
                        'watchlist' => array(
                                ApiBase::PARAM_DFLT => 'preferences',
                                ApiBase::PARAM_TYPE => array(
@@ -120,10 +124,19 @@ class ApiUndelete extends ApiBase {
        public function getParamDescription() {
                return array(
                        'title' => 'Title of the page you want to restore',
-                       'token' => 'An undelete token previously retrieved through list=deletedrevs',
+                       'token' => array(
+                               'An undelete token previously retrieved through list=deletedrevs, or ',
+                               'a delete token retrieved through action=tokens.'
+                       ),
                        'reason' => 'Reason for restoring',
-                       'timestamps' => 'Timestamps of the revisions to restore. If not set, all ' .
-                               'revisions will be restored.',
+                       'timestamps' => array(
+                               'Timestamps of the revisions to restore.',
+                               'If both timestamps and fileids are empty, all will be restored.',
+                       ),
+                       'fileids' => array(
+                               'IDs of the file revisions to restore.',
+                               'If both timestamps and fileids are empty, all will be restored.',
+                       ),
                        'watchlist' => 'Unconditionally add or remove the page from your ' .
                                'watchlist, use preferences or do not change watch',
                );
@@ -143,7 +156,8 @@ class ApiUndelete extends ApiBase {
        public function getDescription() {
                return array(
                        'Restore certain revisions of a deleted page. A list of deleted revisions ',
-                       '(including timestamps) can be retrieved through list=deletedrevs.'
+                       '(including timestamps) can be retrieved through list=deletedrevs, and a list',
+                       'of deleted file ids can be retrieved through list=filearchive.'
                );
        }
 
index 15d7c89..9b48ecb 100644 (file)
@@ -156,7 +156,7 @@ class FileDependency extends CacheDependency {
        /**
         * Create a file dependency
         *
-        * @param string $filename the name of the file, preferably fully qualified
+        * @param string $filename The name of the file, preferably fully qualified
         * @param null|bool|int $timestamp The unix last modified timestamp, or false if the
         *        file does not exist. If omitted, the timestamp will be loaded from
         *        the file.
diff --git a/includes/cache/CacheHelper.php b/includes/cache/CacheHelper.php
new file mode 100644 (file)
index 0000000..401c2b9
--- /dev/null
@@ -0,0 +1,386 @@
+<?php
+/**
+ * Cache of various elements in a single cache entry.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @license GNU GPL v2 or later
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+
+/**
+ * Interface for all classes implementing CacheHelper functionality.
+ *
+ * @since 1.20
+ */
+interface ICacheHelper {
+       /**
+        * Sets if the cache should be enabled or not.
+        *
+        * @since 1.20
+        * @param bool $cacheEnabled
+        */
+       function setCacheEnabled( $cacheEnabled );
+
+       /**
+        * Initializes the caching.
+        * Should be called before the first time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        *
+        * @param int|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
+        * @param bool|null $cacheEnabled Sets if the cache should be enabled or not.
+        */
+       function startCache( $cacheExpiry = null, $cacheEnabled = null );
+
+       /**
+        * Get a cached value if available or compute it if not and then cache it if possible.
+        * The provided $computeFunction is only called when the computation needs to happen
+        * and should return a result value. $args are arguments that will be passed to the
+        * compute function when called.
+        *
+        * @since 1.20
+        *
+        * @param callable $computeFunction
+        * @param array|mixed $args
+        * @param string|null $key
+        *
+        * @return mixed
+        */
+       function getCachedValue( $computeFunction, $args = array(), $key = null );
+
+       /**
+        * Saves the HTML to the cache in case it got recomputed.
+        * Should be called after the last time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        */
+       function saveCache();
+
+       /**
+        * Sets the time to live for the cache, in seconds or a unix timestamp
+        * indicating the point of expiry...
+        *
+        * @since 1.20
+        *
+        * @param int $cacheExpiry
+        */
+       function setExpiry( $cacheExpiry );
+}
+
+/**
+ * Helper class for caching various elements in a single cache entry.
+ *
+ * To get a cached value or compute it, use getCachedValue like this:
+ * $this->getCachedValue( $callback );
+ *
+ * To add HTML that should be cached, use addCachedHTML like this:
+ * $this->addCachedHTML( $callback );
+ *
+ * The callback function is only called when needed, so do all your expensive
+ * computations here. This function should returns the HTML to be cached.
+ * It should not add anything to the PageOutput object!
+ *
+ * Before the first addCachedHTML call, you should call $this->startCache();
+ * After adding the last HTML that should be cached, call $this->saveCache();
+ *
+ * @since 1.20
+ */
+class CacheHelper implements ICacheHelper {
+       /**
+        * The time to live for the cache, in seconds or a unix timestamp indicating the point of expiry.
+        *
+        * @since 1.20
+        * @var int
+        */
+       protected $cacheExpiry = 3600;
+
+       /**
+        * List of HTML chunks to be cached (if !hasCached) or that where cached (of hasCached).
+        * If not cached already, then the newly computed chunks are added here,
+        * if it as cached already, chunks are removed from this list as they are needed.
+        *
+        * @since 1.20
+        * @var array
+        */
+       protected $cachedChunks;
+
+       /**
+        * Indicates if the to be cached content was already cached.
+        * Null if this information is not available yet.
+        *
+        * @since 1.20
+        * @var bool|null
+        */
+       protected $hasCached = null;
+
+       /**
+        * If the cache is enabled or not.
+        *
+        * @since 1.20
+        * @var bool
+        */
+       protected $cacheEnabled = true;
+
+       /**
+        * Function that gets called when initialization is done.
+        *
+        * @since 1.20
+        * @var callable
+        */
+       protected $onInitHandler = false;
+
+       /**
+        * Elements to build a cache key with.
+        *
+        * @since 1.20
+        * @var array
+        */
+       protected $cacheKey = array();
+
+       /**
+        * Sets if the cache should be enabled or not.
+        *
+        * @since 1.20
+        * @param bool $cacheEnabled
+        */
+       public function setCacheEnabled( $cacheEnabled ) {
+               $this->cacheEnabled = $cacheEnabled;
+       }
+
+       /**
+        * Initializes the caching.
+        * Should be called before the first time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        *
+        * @param int|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
+        * @param bool|null $cacheEnabled Sets if the cache should be enabled or not.
+        */
+       public function startCache( $cacheExpiry = null, $cacheEnabled = null ) {
+               if ( is_null( $this->hasCached ) ) {
+                       if ( !is_null( $cacheExpiry ) ) {
+                               $this->cacheExpiry = $cacheExpiry;
+                       }
+
+                       if ( !is_null( $cacheEnabled ) ) {
+                               $this->setCacheEnabled( $cacheEnabled );
+                       }
+
+                       $this->initCaching();
+               }
+       }
+
+       /**
+        * Returns a message that notifies the user he/she is looking at
+        * a cached version of the page, including a refresh link.
+        *
+        * @since 1.20
+        *
+        * @param IContextSource $context
+        * @param bool $includePurgeLink
+        *
+        * @return string
+        */
+       public function getCachedNotice( IContextSource $context, $includePurgeLink = true ) {
+               if ( $this->cacheExpiry < 86400 * 3650 ) {
+                       $message = $context->msg(
+                               'cachedspecial-viewing-cached-ttl',
+                               $context->getLanguage()->formatDuration( $this->cacheExpiry )
+                       )->escaped();
+               } else {
+                       $message = $context->msg(
+                               'cachedspecial-viewing-cached-ts'
+                       )->escaped();
+               }
+
+               if ( $includePurgeLink ) {
+                       $refreshArgs = $context->getRequest()->getQueryValues();
+                       unset( $refreshArgs['title'] );
+                       $refreshArgs['action'] = 'purge';
+
+                       $subPage = $context->getTitle()->getFullText();
+                       $subPage = explode( '/', $subPage, 2 );
+                       $subPage = count( $subPage ) > 1 ? $subPage[1] : false;
+
+                       $message .= ' ' . Linker::link(
+                               $context->getTitle( $subPage ),
+                               $context->msg( 'cachedspecial-refresh-now' )->escaped(),
+                               array(),
+                               $refreshArgs
+                       );
+               }
+
+               return $message;
+       }
+
+       /**
+        * Initializes the caching if not already done so.
+        * Should be called before any of the caching functionality is used.
+        *
+        * @since 1.20
+        */
+       protected function initCaching() {
+               if ( $this->cacheEnabled && is_null( $this->hasCached ) ) {
+                       $cachedChunks = wfGetCache( CACHE_ANYTHING )->get( $this->getCacheKeyString() );
+
+                       $this->hasCached = is_array( $cachedChunks );
+                       $this->cachedChunks = $this->hasCached ? $cachedChunks : array();
+
+                       if ( $this->onInitHandler !== false ) {
+                               call_user_func( $this->onInitHandler, $this->hasCached );
+                       }
+               }
+       }
+
+       /**
+        * Get a cached value if available or compute it if not and then cache it if possible.
+        * The provided $computeFunction is only called when the computation needs to happen
+        * and should return a result value. $args are arguments that will be passed to the
+        * compute function when called.
+        *
+        * @since 1.20
+        *
+        * @param callable $computeFunction
+        * @param array|mixed $args
+        * @param string|null $key
+        *
+        * @return mixed
+        */
+       public function getCachedValue( $computeFunction, $args = array(), $key = null ) {
+               $this->initCaching();
+
+               if ( $this->cacheEnabled && $this->hasCached ) {
+                       $value = null;
+
+                       if ( is_null( $key ) ) {
+                               $itemKey = array_keys( array_slice( $this->cachedChunks, 0, 1 ) );
+                               $itemKey = array_shift( $itemKey );
+
+                               if ( !is_integer( $itemKey ) ) {
+                                       wfWarn( "Attempted to get item with non-numeric key while " .
+                                               "the next item in the queue has a key ($itemKey) in " . __METHOD__ );
+                               } elseif ( is_null( $itemKey ) ) {
+                                       wfWarn( "Attempted to get an item while the queue is empty in " . __METHOD__ );
+                               } else {
+                                       $value = array_shift( $this->cachedChunks );
+                               }
+                       } else {
+                               if ( array_key_exists( $key, $this->cachedChunks ) ) {
+                                       $value = $this->cachedChunks[$key];
+                                       unset( $this->cachedChunks[$key] );
+                               } else {
+                                       wfWarn( "There is no item with key '$key' in this->cachedChunks in " . __METHOD__ );
+                               }
+                       }
+               } else {
+                       if ( !is_array( $args ) ) {
+                               $args = array( $args );
+                       }
+
+                       $value = call_user_func_array( $computeFunction, $args );
+
+                       if ( $this->cacheEnabled ) {
+                               if ( is_null( $key ) ) {
+                                       $this->cachedChunks[] = $value;
+                               } else {
+                                       $this->cachedChunks[$key] = $value;
+                               }
+                       }
+               }
+
+               return $value;
+       }
+
+       /**
+        * Saves the HTML to the cache in case it got recomputed.
+        * Should be called after the last time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        */
+       public function saveCache() {
+               if ( $this->cacheEnabled && $this->hasCached === false && !empty( $this->cachedChunks ) ) {
+                       wfGetCache( CACHE_ANYTHING )->set(
+                               $this->getCacheKeyString(),
+                               $this->cachedChunks,
+                               $this->cacheExpiry
+                       );
+               }
+       }
+
+       /**
+        * Sets the time to live for the cache, in seconds or a unix timestamp
+        * indicating the point of expiry...
+        *
+        * @since 1.20
+        *
+        * @param int $cacheExpiry
+        */
+       public function setExpiry( $cacheExpiry ) {
+               $this->cacheExpiry = $cacheExpiry;
+       }
+
+       /**
+        * Returns the cache key to use to cache this page's HTML output.
+        * Is constructed from the special page name and language code.
+        *
+        * @since 1.20
+        *
+        * @return string
+        * @throws MWException
+        */
+       protected function getCacheKeyString() {
+               if ( $this->cacheKey === array() ) {
+                       throw new MWException( 'No cache key set, so cannot obtain or save the CacheHelper values.' );
+               }
+
+               return call_user_func_array( 'wfMemcKey', $this->cacheKey );
+       }
+
+       /**
+        * Sets the cache key that should be used.
+        *
+        * @since 1.20
+        *
+        * @param array $cacheKey
+        */
+       public function setCacheKey( array $cacheKey ) {
+               $this->cacheKey = $cacheKey;
+       }
+
+       /**
+        * Rebuild the content, even if it's already cached.
+        * This effectively has the same effect as purging the cache,
+        * since it will be overridden with the new value on the next request.
+        *
+        * @since 1.20
+        */
+       public function rebuildOnDemand() {
+               $this->hasCached = false;
+       }
+
+       /**
+        * Sets a function that gets called when initialization of the cache is done.
+        *
+        * @since 1.20
+        *
+        * @param callable $handlerFunction
+        */
+       public function setOnInitializedHandler( $handlerFunction ) {
+               $this->onInitHandler = $handlerFunction;
+       }
+}
index 9dc3dc3..cf87129 100644 (file)
@@ -536,7 +536,7 @@ class LocalisationCache {
        /**
         * Read a JSON file containing localisation messages.
         * @param string $fileName Name of file to read
-        * @throws MWException if there is a syntax error in the JSON file
+        * @throws MWException If there is a syntax error in the JSON file
         * @return array Array with a 'messages' key, or empty array if the file doesn't exist
         */
        public function readJSONFile( $fileName ) {
@@ -1157,7 +1157,7 @@ class LCStoreDB implements LCStore {
 
        /** @var DatabaseBase */
        private $dbw;
-       /** @var Array */
+       /** @var array */
        private $batch = array();
 
        private $readOnly = false;
@@ -1186,7 +1186,7 @@ class LCStoreDB implements LCStore {
 
                // We must keep a separate connection to MySQL in order to avoid breaking
                // main transactions. However, SQLite deadlocks when using two connections.
-               // @TODO: get this trick to work on PostgreSQL too
+               // @todo get this trick to work on PostgreSQL too
                if ( wfGetDB( DB_MASTER )->getType() == 'mysql' ) {
                        $lb = wfGetLBFactory()->newMainLB();
                        $this->dbw = $lb->getConnection( DB_MASTER );
index e5afd21..e34961c 100644 (file)
@@ -699,9 +699,9 @@ class MessageCache {
         *   - If boolean and false, create object from the current users language
         *   - If boolean and true, create object from the wikis content language
         *   - If language object, use it as given
-        * @param bool $isFullKey specifies whether $key is a two part key "msg/lang".
+        * @param bool $isFullKey Specifies whether $key is a two part key "msg/lang".
         *
-        * @throws MWException when given an invalid key
+        * @throws MWException When given an invalid key
         * @return string|bool False if the message doesn't exist, otherwise the
         *   message (which can be empty)
         */
index 0c073c6..b471ea5 100644 (file)
@@ -40,7 +40,7 @@ class EnhancedChangesList extends ChangesList {
                        // @todo: deprecate constructing with Skin
                        $context = $obj->getContext();
                } else {
-                       if ( ! $obj instanceof IContextSource ) {
+                       if ( !$obj instanceof IContextSource ) {
                                throw new MWException( 'EnhancedChangesList must be constructed with a '
                                        . 'context source or skin.' );
                        }
index 8fa6ed9..cfebf40 100644 (file)
@@ -179,7 +179,7 @@ class RecentChange {
        /**
         * Obtain the recent change with a given rc_id value
         *
-        * @param int $rcid rc_id value to retrieve
+        * @param int $rcid The rc_id value to retrieve
         * @return RecentChange
         */
        public static function newFromId( $rcid ) {
index d2c504a..dc95727 100644 (file)
@@ -346,7 +346,7 @@ class RedisConnectionPool {
         * Adjust or reset the connection handle read timeout value
         *
         * @param Redis $conn
-        * @param integer $timeout Optional
+        * @param int $timeout Optional
         */
        public function resetTimeout( Redis $conn, $timeout = null ) {
                $conn->setOption( Redis::OPT_READ_TIMEOUT, $timeout ?: $this->readTimeout );
index 368ca5a..75cd5ee 100644 (file)
@@ -25,4 +25,5 @@
  *
  * @since 1.23
  */
-class ConfigException extends MWException {}
+class ConfigException extends MWException {
+}
index b09316b..ff2f403 100644 (file)
@@ -57,8 +57,8 @@ class ConfigFactory {
         * Register a new config factory function
         * Will override if it's already registered
         * @param string $name
-        * @param callable $callback that takes this ConfigFactory as an argument
-        * @throws InvalidArgumentException if an invalid callback is provided
+        * @param callable $callback That takes this ConfigFactory as an argument
+        * @throws InvalidArgumentException If an invalid callback is provided
         */
        public function register( $name, $callback ) {
                if ( !is_callable( $callback ) ) {
@@ -70,10 +70,10 @@ class ConfigFactory {
        /**
         * Create a given Config using the registered callback for $name.
         * If an object was already created, the same Config object is returned.
-        * @param string $name of the extension/component you want a Config object for
+        * @param string $name Name of the extension/component you want a Config object for
         *                     'main' is used for core
-        * @throws ConfigException if a factory function isn't registered for $name
-        * @throws UnexpectedValueException if the factory function returns a non-Config object
+        * @throws ConfigException If a factory function isn't registered for $name
+        * @throws UnexpectedValueException If the factory function returns a non-Config object
         * @return Config
         */
        public function makeConfig( $name ) {
index 0d7f3f0..0841a00 100644 (file)
@@ -72,7 +72,7 @@ class GlobalVarConfig implements Config {
                if ( !array_key_exists( $var, $GLOBALS ) ) {
                        throw new ConfigException( __METHOD__ . ": undefined variable: '$var'" );
                }
-               return $GLOBALS[ $var ];
+               return $GLOBALS[$var];
        }
 
        /**
@@ -80,9 +80,9 @@ class GlobalVarConfig implements Config {
         *
         * @param string $prefix Prefix to use on the variable
         * @param string $name Variable name without prefix
-        * @param mixed $value value to set
+        * @param mixed $value Value to set
         */
        protected function setWithPrefix( $prefix, $name, $value ) {
-               $GLOBALS[ $prefix . $name ] = $value;
+               $GLOBALS[$prefix . $name] = $value;
        }
 }
index e077c77..c8a9f1e 100644 (file)
@@ -709,7 +709,7 @@ abstract class ContentHandler {
         * typically based on the namespace or some other aspect of the title, such as a special suffix
         * (e.g. ".svg" for SVG content).
         *
-        * @note: this calls the ContentHandlerCanBeUsedOn hook which may be used to override which
+        * @note this calls the ContentHandlerCanBeUsedOn hook which may be used to override which
         * content model can be used where.
         *
         * @param Title $title The page's title.
@@ -821,6 +821,11 @@ abstract class ContentHandler {
                                ->inContentLanguage()->text();
                }
 
+               // New blank article auto-summary
+               if ( $flags & EDIT_NEW && $newContent->isEmpty() ) {
+                       return wfMessage( 'autosumm-newblank' )->inContentLanguage()->text();
+               }
+
                // If we reach this point, there's no applicable auto-summary for our
                // case, so our auto-summary is empty.
                return '';
@@ -837,7 +842,7 @@ abstract class ContentHandler {
         * @return mixed String containing deletion reason or empty string, or
         *    boolean false if no revision occurred
         *
-        * @XXX &$hasHistory is extremely ugly, it's here because
+        * @todo &$hasHistory is extremely ugly, it's here because
         * WikiPage::getAutoDeleteReason() and Article::generateReason()
         * have it / want it.
         */
index 85059a8..fd326f0 100644 (file)
@@ -65,7 +65,7 @@ class CssContentHandler extends TextContentHandler {
         * @param Title $title
         * @param Content $content
         *
-        * @return Language wfGetLangObj( 'en' )
+        * @return Language Return of wfGetLangObj( 'en' )
         *
         * @see ContentHandler::getPageLanguage()
         */
@@ -79,7 +79,7 @@ class CssContentHandler extends TextContentHandler {
         * @param Title $title
         * @param Content $content
         *
-        * @return Language wfGetLangObj( 'en' )
+        * @return Language Return of wfGetLangObj( 'en' )
         *
         * @see ContentHandler::getPageViewLanguage()
         */
index 2e98976..122003f 100644 (file)
@@ -65,7 +65,7 @@ class JavaScriptContentHandler extends TextContentHandler {
         * @param Title $title
         * @param Content $content
         *
-        * @return Language wfGetLangObj( 'en' )
+        * @return Language Return of wfGetLangObj( 'en' )
         *
         * @see ContentHandler::getPageLanguage()
         */
@@ -79,7 +79,7 @@ class JavaScriptContentHandler extends TextContentHandler {
         * @param Title $title
         * @param Content $content
         *
-        * @return Language wfGetLangObj( 'en' )
+        * @return Language Return of wfGetLangObj( 'en' )
         *
         * @see ContentHandler::getPageViewLanguage()
         */
index b601344..abaac53 100644 (file)
@@ -126,7 +126,7 @@ class MessageContent extends AbstractContent {
        }
 
        /**
-        * @return Content. A copy of this object
+        * @return Content A copy of this object
         *
         * @see Content::copy
         */
index c3daf83..d292880 100644 (file)
@@ -132,7 +132,7 @@ class TextContent extends AbstractContent {
         * Returns attempts to convert this content object to wikitext,
         * and then returns the text string. The conversion may be lossy.
         *
-        * @note: this allows any text-based content to be transcluded as if it was wikitext.
+        * @note this allows any text-based content to be transcluded as if it was wikitext.
         *
         * @return string|bool The raw text, or false if the conversion failed.
         */
@@ -257,7 +257,7 @@ class TextContent extends AbstractContent {
         * This default implementation returns an HTML-escaped version
         * of the raw text content.
         *
-        * @note: The functionality of this method should really be implemented
+        * @note The functionality of this method should really be implemented
         * in getHtml(), and subclasses should override getHtml() if needed.
         * getHighlightHtml() is kept around for backward compatibility with
         * extensions that already override it.
index cdf5962..237029b 100644 (file)
@@ -170,7 +170,7 @@ class WikitextContent extends TextContent {
        /**
         * Extract the redirect target and the remaining text on the page.
         *
-        * @note: migrated here from Title::newFromRedirectInternal()
+        * @note migrated here from Title::newFromRedirectInternal()
         *
         * @since 1.23
         *
@@ -315,7 +315,7 @@ class WikitextContent extends TextContent {
         * @param int $revId Revision to pass to the parser (default: null)
         * @param ParserOptions $options (default: null)
         * @param bool $generateHtml (default: true)
-        * @param &$output ParserOutput representing the HTML form of the text,
+        * @param ParserOutput &$output ParserOutput representing the HTML form of the text,
         *           may be manipulated or replaced.
         */
        protected function fillParserOutput( Title $title, $revId,
index d0c0bdc..076504e 100644 (file)
@@ -34,9 +34,9 @@ abstract class ContextSource implements IContextSource {
        private $context;
 
        /**
-        * Get the RequestContext object
+        * Get the base IContextSource object
         * @since 1.18
-        * @return RequestContext
+        * @return IContextSource
         */
        public function getContext() {
                if ( $this->context === null ) {
index d78f420..b8966f0 100644 (file)
@@ -296,8 +296,7 @@ class DerivativeContext extends ContextSource {
         * it would set only the original context, and not take
         * into account any changes.
         *
-        * @param String Message name
-        * @param Variable number of message arguments
+        * @param mixed $args,... Arguments to wfMessage
         * @return Message
         */
        public function msg() {
index efdc6db..2c051ba 100644 (file)
@@ -154,18 +154,14 @@ class RequestContext implements IContextSource {
         * @return bool
         */
        public function canUseWikiPage() {
-               if ( $this->wikipage !== null ) {
-                       # If there's a WikiPage object set, we can for sure get it
+               if ( $this->wikipage ) {
+                       // If there's a WikiPage object set, we can for sure get it
                        return true;
                }
+               // Only pages with legitimate titles can have WikiPages.
+               // That usually means pages in non-virtual namespaces.
                $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();
-               }
+               return $title ? $title->canExist() : false;
        }
 
        /**
@@ -261,7 +257,7 @@ class RequestContext implements IContextSource {
                $code = strtolower( $code );
 
                # Validate $code
-               if ( empty( $code ) || !Language::isValidCode( $code ) || ( $code === 'qqq' ) ) {
+               if ( !$code || !Language::isValidCode( $code ) || $code === 'qqq' ) {
                        wfDebug( "Invalid user language code\n" );
                        $code = $wgLanguageCode;
                }
index b02ee30..62d64eb 100644 (file)
@@ -600,7 +600,18 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @return bool
         */
        public function doneWrites() {
-               return $this->mDoneWrites;
+               return (bool)$this->mDoneWrites;
+       }
+
+       /**
+        * Returns the last time the connection may have been used for write queries.
+        * Should return a timestamp if unsure.
+        *
+        * @return int|float UNIX timestamp or false
+        * @since 1.24
+        */
+       public function lastDoneWrites() {
+               return $this->mDoneWrites ?: false;
        }
 
        /**
@@ -1017,13 +1028,13 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *     for a successful read query, or false on failure if $tempIgnore set
         */
        public function query( $sql, $fname = __METHOD__, $tempIgnore = false ) {
-               global $wgUser, $wgDebugDBTransactions;
+               global $wgUser, $wgDebugDBTransactions, $wgDebugDumpSqlLength;
 
                $this->mLastQuery = $sql;
-               if ( !$this->mDoneWrites && $this->isWriteQuery( $sql ) ) {
+               if ( $this->isWriteQuery( $sql ) ) {
                        # Set a flag indicating that writes have been done
                        wfDebug( __METHOD__ . ': Writes done: ' . DatabaseBase::generalizeSQL( $sql ) . "\n" );
-                       $this->mDoneWrites = true;
+                       $this->mDoneWrites = microtime( true );
                }
 
                # Add a comment for easy SHOW PROCESSLIST interpretation
@@ -1091,7 +1102,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        static $cnt = 0;
 
                        $cnt++;
-                       $sqlx = substr( $commentedSql, 0, 500 );
+                       $sqlx = $wgDebugDumpSqlLength ? substr( $commentedSql, 0, $wgDebugDumpSqlLength )
+                               : $commentedSql;
                        $sqlx = strtr( $sqlx, "\t\n", '  ' );
 
                        $master = $isMaster ? 'master' : 'slave';
@@ -1122,7 +1134,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        if ( $this->ping() ) {
                                global $wgRequestTime;
                                wfDebug( "Reconnected\n" );
-                               $sqlx = substr( $commentedSql, 0, 500 );
+                               $sqlx = $wgDebugDumpSqlLength ? substr( $commentedSql, 0, $wgDebugDumpSqlLength )
+                                       : $commentedSql;
                                $sqlx = strtr( $sqlx, "\t\n", '  ' );
                                $elapsed = round( microtime( true ) - $wgRequestTime, 3 );
                                if ( $elapsed < 300 ) {
@@ -1770,9 +1783,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                # All newlines, tabs, etc replaced by single space
                $sql = preg_replace( '/\s+/', ' ', $sql );
 
-               # All numbers => N
+               # All numbers => N,
+               # except the ones surrounded by characters, e.g. l10n
                $sql = preg_replace( '/-?\d+(,-?\d+)+/s', 'N,...,N', $sql );
-               $sql = preg_replace( '/-?\d+/s', 'N', $sql );
+               $sql = preg_replace( '/(?<![a-zA-Z])-?\d+(?![a-zA-Z])/s', 'N', $sql );
 
                return $sql;
        }
@@ -1887,7 +1901,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *   DatabaseBase::tableName().
         * @param array $a Array of rows to insert
         * @param string $fname Calling function name (use __METHOD__) for logs/profiling
-        * @param array $options of options
+        * @param array $options Array of options
         *
         * @return bool
         */
@@ -2082,11 +2096,11 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Build a partial where clause from a 2-d array such as used for LinkBatch.
         * The keys on each level may be either integers or strings.
         *
-        * @param array $data organized as 2-d
+        * @param array $data Organized as 2-d
         *    array(baseKeyVal => array(subKeyVal => [ignored], ...), ...)
         * @param string $baseKey Field name to match the base-level keys to (eg 'pl_namespace')
         * @param string $subKey Field name to match the sub-level keys to (eg 'pl_title')
-        * @return string|bool string SQL fragment, or false if no items in array.
+        * @return string|bool SQL fragment, or false if no items in array
         */
        public function makeWhereFrom2d( $data, $baseKey, $subKey ) {
                $conds = array();
@@ -2372,7 +2386,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Gets an array of aliased table names
         *
-        * @param array $tables array( [alias] => table )
+        * @param array $tables Array( [alias] => table )
         * @return string[] See tableNameWithAlias()
         */
        public function tableNamesWithAlias( $tables ) {
@@ -2406,7 +2420,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Gets an array of aliased field names
         *
-        * @param array $fields array( [alias] => field )
+        * @param array $fields Array( [alias] => field )
         * @return string[] See fieldNameWithAlias()
         */
        public function fieldNamesWithAlias( $fields ) {
@@ -2907,9 +2921,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * DELETE query wrapper.
         *
         * @param array $table Table name
-        * @param string|array $conds of conditions. See $conds in DatabaseBase::select()
+        * @param string|array $conds Array of conditions. See $conds in DatabaseBase::select()
         *   for the format. Use $conds == "*" to delete all rows
-        * @param string $fname name of the calling function
+        * @param string $fname Name of the calling function
         * @throws DBUnexpectedError
         * @return bool|ResultWrapper
         */
@@ -3198,7 +3212,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param DBMasterPos $pos
         * @param int $timeout The maximum number of seconds to wait for
         *   synchronisation
-        * @return int Zzero if the slave was past that position already,
+        * @return int Zero if the slave was past that position already,
         *   greater than zero if we waited for some period of time, less than
         *   zero if we timed out.
         */
@@ -3275,7 +3289,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        protected function runOnTransactionIdleCallbacks() {
                $autoTrx = $this->getFlag( DBO_TRX ); // automatic begin() enabled?
 
-               $e = null; // last exception
+               $e = $ePrior = null; // last exception
                do { // callbacks may add callbacks :)
                        $callbacks = $this->mTrxIdleCallbacks;
                        $this->mTrxIdleCallbacks = array(); // recursion guard
@@ -3286,6 +3300,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                                        call_user_func( $phpCallback );
                                        $this->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
                                } catch ( Exception $e ) {
+                                       if ( $ePrior ) {
+                                               MWExceptionHandler::logException( $ePrior );
+                                       }
+                                       $ePrior = $e;
                                }
                        }
                } while ( count( $this->mTrxIdleCallbacks ) );
@@ -3301,7 +3319,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @since 1.22
         */
        protected function runOnTransactionPreCommitCallbacks() {
-               $e = null; // last exception
+               $e = $ePrior = null; // last exception
                do { // callbacks may add callbacks :)
                        $callbacks = $this->mTrxPreCommitCallbacks;
                        $this->mTrxPreCommitCallbacks = array(); // recursion guard
@@ -3310,6 +3328,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                                        list( $phpCallback ) = $callback;
                                        call_user_func( $phpCallback );
                                } catch ( Exception $e ) {
+                                       if ( $ePrior ) {
+                                               MWExceptionHandler::logException( $ePrior );
+                                       }
+                                       $ePrior = $e;
                                }
                        }
                } while ( count( $this->mTrxPreCommitCallbacks ) );
@@ -4139,7 +4161,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Encode an expiry time into the DBMS dependent format
         *
-        * @param string $expiry timestamp for expiry, or the 'infinity' string
+        * @param string $expiry Timestamp for expiry, or the 'infinity' string
         * @return string
         */
        public function encodeExpiry( $expiry ) {
index be01f1a..c2f5b6d 100644 (file)
@@ -743,7 +743,7 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * UPDATE wrapper. Takes a condition array and a SET array.
         *
-        * @param string $table name of the table to UPDATE. This will be passed through
+        * @param string $table Name of the table to UPDATE. This will be passed through
         *                DatabaseBase::tableName().
         *
         * @param array $values An array of values to SET. For each array element,
@@ -787,7 +787,7 @@ class DatabaseMssql extends DatabaseBase {
 
        /**
         * Makes an encoded list of strings from an array
-        * @param array $a containing the data
+        * @param array $a Containing the data
         * @param int $mode Constant
         *      - LIST_COMMA:          comma separated, no field names
         *      - LIST_AND:            ANDed WHERE clause (without the WHERE). See
@@ -1177,7 +1177,7 @@ class DatabaseMssql extends DatabaseBase {
        }
 
        /**
-        * @param array $options an associative array of options to be turned into
+        * @param array $options An associative array of options to be turned into
         *   an SQL query, valid keys are listed in the function.
         * @return array
         */
index cf37736..5ad7c78 100644 (file)
@@ -806,8 +806,8 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Check to see if a named lock is available. This is non-blocking.
         *
-        * @param string $lockName name of lock to poll
-        * @param string $method name of method calling us
+        * @param string $lockName Name of lock to poll
+        * @param string $method Name of method calling us
         * @return bool
         * @since 1.20
         */
@@ -901,7 +901,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
 
        /**
         * @param bool $value
-        * @return mixed null|bool|ResultWrapper
+        * @return null|bool|ResultWrapper
         */
        public function setBigSelects( $value = true ) {
                if ( $value === 'default' ) {
@@ -1241,7 +1241,7 @@ class MySQLMasterPos implements DBMasterPos {
        /** @var string */
        public $file;
 
-       /** @var int timestamp */
+       /** @var int Timestamp */
        public $pos;
 
        function __construct( $file, $pos ) {
index 7686010..f031f78 100644 (file)
@@ -1000,7 +1000,7 @@ class DatabaseOracle extends DatabaseBase {
        }
 
        /**
-        * @return string wikitext of a link to the server software's web site
+        * @return string Wikitext of a link to the server software's web site
         */
        public function getSoftwareLink() {
                return '[{{int:version-db-oracle-url}} Oracle]';
index fe5fa1f..f5fdca1 100644 (file)
@@ -827,7 +827,7 @@ __INDEXATTR__;
         * In Postgres when using FOR UPDATE, only the main table and tables that are inner joined
         * can be locked. That means tables in an outer join cannot be FOR UPDATE locked. Trying to do
         * so causes a DB error. This wrapper checks which tables can be locked and adjusts it accordingly.
-        * 
+        *
         * MySQL uses "ORDER BY NULL" as an optimization hint, but that syntax is illegal in PostgreSQL.
         */
        function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__,
@@ -1235,7 +1235,7 @@ __INDEXATTR__;
         * @see getSearchPath()
         * @see setSearchPath()
         * @since 1.19
-        * @return array list of actual schemas for the current sesson
+        * @return array List of actual schemas for the current sesson
         */
        function getSchemas() {
                $res = $this->query( "SELECT current_schemas(false)", __METHOD__ );
@@ -1322,7 +1322,7 @@ __INDEXATTR__;
         * Return schema name fore core MediaWiki tables
         *
         * @since 1.19
-        * @return string core schema name
+        * @return string Core schema name
         */
        function getCoreSchema() {
                return $this->mCoreSchema;
@@ -1546,7 +1546,7 @@ SQL;
        /**
         * Various select options
         *
-        * @param array $options an associative array of options to be turned into
+        * @param array $options An associative array of options to be turned into
         *   an SQL query, valid keys are listed in the function.
         * @return array
         */
index 3e063c6..9a03a33 100644 (file)
@@ -342,9 +342,9 @@ class DatabaseSqlite extends DatabaseBase {
         */
        function numFields( $res ) {
                $r = $res instanceof ResultWrapper ? $res->result : $res;
-               if ( is_array($r) && count( $r ) > 0 ){
+               if ( is_array( $r ) && count( $r ) > 0 ) {
                        // The size of the result array is twice the number of fields. (Bug: 65578)
-                       return count( $r[0] ) / 2 ;
+                       return count( $r[0] ) / 2;
                } else {
                        // If the result is empty return 0
                        return 0;
@@ -666,7 +666,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @return string wikitext of a link to the server software's web site
+        * @return string Wikitext of a link to the server software's web site
         */
        public function getSoftwareLink() {
                return "[{{int:version-db-sqlite-url}} SQLite]";
index 36d218a..3923241 100644 (file)
@@ -107,7 +107,7 @@ class ResultWrapper implements Iterator {
        /** @var int */
        protected $pos = 0;
 
-       /** @var */
+       /** @var object|null */
        protected $currentRow = null;
 
        /**
index ab1ab79..bf49bbb 100644 (file)
@@ -107,7 +107,7 @@ interface IORMTable {
         * @param string|null $functionName
         *
         * @return ORMResult The result set
-        * @throws DBQueryError if the query failed (even if the database was in ignoreErrors mode)
+        * @throws DBQueryError If the query failed (even if the database was in ignoreErrors mode)
         */
        public function select( $fields = null, array $conditions = array(),
                array $options = array(), $functionName = null );
@@ -123,7 +123,7 @@ interface IORMTable {
         * @param array $options
         * @param string|null $functionName
         *
-        * @return array of self
+        * @return array Array of self
         */
        public function selectObjects( $fields = null, array $conditions = array(),
                array $options = array(), $functionName = null );
@@ -139,7 +139,7 @@ interface IORMTable {
         * @param null|string $functionName
         *
         * @return ResultWrapper
-        * @throws DBQueryError if the query failed (even if the database was in ignoreErrors mode)
+        * @throws DBQueryError If the query failed (even if the database was in ignoreErrors mode)
         */
        public function rawSelect( $fields = null, array $conditions = array(),
                array $options = array(), $functionName = null );
@@ -164,7 +164,7 @@ interface IORMTable {
         * @param bool $collapse Set to false to always return each result row as associative array.
         * @param string|null $functionName
         *
-        * @return array of array
+        * @return array Array of array
         */
        public function selectFields( $fields = null, array $conditions = array(),
                array $options = array(), $collapse = true, $functionName = null );
index 168d846..73456e2 100644 (file)
@@ -59,7 +59,7 @@ abstract class LBFactory {
         * Returns the LBFactory class to use and the load balancer configuration.
         *
         * @param array $config (e.g. $wgLBFactoryConf)
-        * @return string class name
+        * @return string Class name
         */
        public static function getLBFactoryClass( array $config ) {
                // For configuration backward compatibility after removing
@@ -142,7 +142,7 @@ abstract class LBFactory {
        /**
         * Get a cached (tracked) load balancer for external storage
         *
-        * @param string $cluster external storage cluster, or false for core
+        * @param string $cluster External storage cluster, or false for core
         * @param bool|string $wiki Wiki ID, or false for the current wiki
         * @return LoadBalancer
         */
index bda3dd6..bac9652 100644 (file)
@@ -263,7 +263,7 @@ class LBFactoryMulti extends LBFactory {
        }
 
        /**
-        * @param string $cluster external storage cluster, or false for core
+        * @param string $cluster External storage cluster, or false for core
         * @param bool|string $wiki Wiki ID, or false for the current wiki
         * @return LoadBalancer
         */
index 5353288..db4ed60 100644 (file)
@@ -43,7 +43,7 @@ class LoadBalancer {
        private $mLoadMonitorClass, $mLoadMonitor;
 
        /**
-        * @param array $params with keys:
+        * @param array $params Array with keys:
         *   servers           Required. Array of server info structures.
         *   loadMonitor       Name of a class used to fetch server lag and load.
         * @throws MWException
@@ -331,17 +331,23 @@ class LoadBalancer {
        /**
         * Set the master wait position and wait for ALL slaves to catch up to it
         * @param DBMasterPos $pos
+        * @param int $timeout Max seconds to wait; default is mWaitTimeout
+        * @return bool Success (able to connect and no timeouts reached)
         */
-       public function waitForAll( $pos ) {
+       public function waitForAll( $pos, $timeout = null ) {
                wfProfileIn( __METHOD__ );
                $this->mWaitForPos = $pos;
                $serverCount = count( $this->mServers );
+
+               $ok = true;
                for ( $i = 1; $i < $serverCount; $i++ ) {
                        if ( $this->mLoads[$i] > 0 ) {
-                               $this->doWait( $i, true );
+                               $ok = $this->doWait( $i, true, $timeout ) && $ok;
                        }
                }
                wfProfileOut( __METHOD__ );
+
+               return $ok;
        }
 
        /**
@@ -363,11 +369,12 @@ class LoadBalancer {
 
        /**
         * Wait for a given slave to catch up to the master pos stored in $this
-        * @param int $index
-        * @param bool $open
+        * @param int $index Server index
+        * @param bool $open Check the server even if a new connection has to be made
+        * @param int $timeout Max seconds to wait; default is mWaitTimeout
         * @return bool
         */
-       protected function doWait( $index, $open = false ) {
+       protected function doWait( $index, $open = false, $timeout = null ) {
                # Find a connection to wait on
                $conn = $this->getAnyOpenConnection( $index );
                if ( !$conn ) {
@@ -386,7 +393,8 @@ class LoadBalancer {
                }
 
                wfDebug( __METHOD__ . ": Waiting for slave #$index to catch up...\n" );
-               $result = $conn->masterPosWait( $this->mWaitForPos, $this->mWaitTimeout );
+               $timeout = $timeout ?: $this->mWaitTimeout;
+               $result = $conn->masterPosWait( $this->mWaitForPos, $timeout );
 
                if ( $result == -1 || is_null( $result ) ) {
                        # Timed out waiting for slave, use master instead
@@ -948,6 +956,14 @@ class LoadBalancer {
                }
        }
 
+       /**
+        * @return bool Whether a master connection is already open
+        * @since 1.24
+        */
+       function hasMasterConnection() {
+               return $this->isOpen( $this->getWriterIndex() );
+       }
+
        /**
         * Determine if there are any pending changes that need to be rolled back
         * or committed.
index 51b81da..24fa68c 100644 (file)
@@ -220,8 +220,8 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @param array $options
         * @param string|null $functionName
         *
-        * @return array of row objects
-        * @throws DBQueryError if the query failed (even if the database was in ignoreErrors mode).
+        * @return array Array of row objects
+        * @throws DBQueryError If the query failed (even if the database was in ignoreErrors mode).
         */
        public function selectObjects( $fields = null, array $conditions = array(),
                array $options = array(), $functionName = null
@@ -247,7 +247,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @param array $options
         * @param null|string $functionName
         * @return ResultWrapper
-        * @throws DBQueryError if the query failed (even if the database was in
+        * @throws DBQueryError If the query failed (even if the database was in
         *   ignoreErrors mode).
         */
        public function rawSelect( $fields = null, array $conditions = array(),
@@ -314,7 +314,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @param bool $collapse Set to false to always return each result row as associative array.
         * @param string|null $functionName
         *
-        * @return array of array
+        * @return array Array of array
         */
        public function selectFields( $fields = null, array $conditions = array(),
                array $options = array(), $collapse = true, $functionName = null
@@ -648,7 +648,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         *
         * @see LoadBalancer::reuseConnection
         *
-        * @param DatabaseBase $db the database
+        * @param DatabaseBase $db
         *
         * @since 1.20
         */
index 53990bf..ed12c60 100644 (file)
@@ -25,9 +25,9 @@
  * Abstract base class for update jobs that do something with some secondary
  * data extracted from article.
  *
- * @note: subclasses should NOT start or commit transactions in their doUpdate() method,
- *        a transaction will automatically be wrapped around the update. If need be,
- *        subclasses can override the beginTransaction() and commitTransaction() methods.
+ * @note subclasses should NOT start or commit transactions in their doUpdate() method,
+ *       a transaction will automatically be wrapped around the update. If need be,
+ *       subclasses can override the beginTransaction() and commitTransaction() methods.
  */
 abstract class DataUpdate implements DeferrableUpdate {
        /**
@@ -73,7 +73,7 @@ abstract class DataUpdate implements DeferrableUpdate {
         * This allows for limited transactional logic across multiple backends for storing
         * secondary data.
         *
-        * @param array $updates a list of DataUpdate instances
+        * @param array $updates A list of DataUpdate instances
         * @throws Exception|null
         */
        public static function runUpdates( $updates ) {
index 5cf0d2b..2178281 100644 (file)
@@ -76,7 +76,7 @@ class DeferredUpdates {
        /**
         * Do any deferred updates and clear the list
         *
-        * @param string $commit set to 'commit' to commit after every update to
+        * @param string $commit Set to 'commit' to commit after every update to
         *   prevent lock contention
         */
        public static function doUpdates( $commit = '' ) {
index 0789b21..45d2664 100644 (file)
@@ -31,7 +31,7 @@ class LinksUpdate extends SqlDataUpdate {
        /** @var int Page ID of the article linked from */
        public $mId;
 
-       /** @var Title object of the article linked from */
+       /** @var Title Title object of the article linked from */
        public $mTitle;
 
        /** @var ParserOutput */
@@ -52,7 +52,7 @@ class LinksUpdate extends SqlDataUpdate {
        /** @var array Map of category names to sort keys */
        public $mCategories;
 
-       /** @var array ap of language codes to titles */
+       /** @var array Map of language codes to titles */
        public $mInterlangs;
 
        /** @var array Map of arbitrary name to value */
@@ -358,6 +358,7 @@ class LinksUpdate extends SqlDataUpdate {
                        foreach ( $diffs as $dbk => $id ) {
                                $arr[] = array(
                                        'pl_from' => $this->mId,
+                                       'pl_from_namespace' => $this->mTitle->getNamespace(),
                                        'pl_namespace' => $ns,
                                        'pl_title' => $dbk
                                );
@@ -379,6 +380,7 @@ class LinksUpdate extends SqlDataUpdate {
                        foreach ( $diffs as $dbk => $id ) {
                                $arr[] = array(
                                        'tl_from' => $this->mId,
+                                       'tl_from_namespace' => $this->mTitle->getNamespace(),
                                        'tl_namespace' => $ns,
                                        'tl_title' => $dbk
                                );
@@ -400,6 +402,7 @@ class LinksUpdate extends SqlDataUpdate {
                foreach ( $diffs as $iname => $dummy ) {
                        $arr[] = array(
                                'il_from' => $this->mId,
+                               'il_from_namespace' => $this->mTitle->getNamespace(),
                                'il_to' => $iname
                        );
                }
@@ -521,7 +524,7 @@ class LinksUpdate extends SqlDataUpdate {
         * is present in the database (as indicated by $wgPagePropsHaveSortkey).
         * The sortkey value is currently determined by getPropertySortKeyValue().
         *
-        * @note: this assumes that $this->mProperties[$prop] is defined.
+        * @note this assumes that $this->mProperties[$prop] is defined.
         *
         * @param string $prop The name of the property.
         *
@@ -550,8 +553,8 @@ class LinksUpdate extends SqlDataUpdate {
         * This will return $value if it is a float or int,
         * 1 or resp. 0 if it is a bool, and null otherwise.
         *
-        * @note: In the future, we may allow the sortkey to be specified explicitly
-        *        in ParserOutput::setProperty.
+        * @note In the future, we may allow the sortkey to be specified explicitly
+        *       in ParserOutput::setProperty.
         *
         * @param mixed $value
         *
index 121af04..9c58503 100644 (file)
  * Abstract base class for update jobs that put some secondary data extracted
  * from article content into the database.
  *
- * @note: subclasses should NOT start or commit transactions in their doUpdate() method,
- *        a transaction will automatically be wrapped around the update. Starting another
- *        one would break the outer transaction bracket. If need be, subclasses can override
- *        the beginTransaction() and commitTransaction() methods.
+ * @note subclasses should NOT start or commit transactions in their doUpdate() method,
+ *       a transaction will automatically be wrapped around the update. Starting another
+ *       one would break the outer transaction bracket. If need be, subclasses can override
+ *       the beginTransaction() and commitTransaction() methods.
  */
 abstract class SqlDataUpdate extends DataUpdate {
        /** @var DatabaseBase Database connection reference */
@@ -46,7 +46,7 @@ abstract class SqlDataUpdate extends DataUpdate {
        /**
         * Constructor
         *
-        * @param bool $withTransaction whether this update should be wrapped in a
+        * @param bool $withTransaction Whether this update should be wrapped in a
         *   transaction (default: true). A transaction is only started if no
         *   transaction is already in progress, see beginTransaction() for details.
         */
index ddd2e09..8282295 100644 (file)
@@ -49,23 +49,32 @@ class ViewCountUpdate implements DeferrableUpdate {
                $dbw = wfGetDB( DB_MASTER );
 
                if ( $wgHitcounterUpdateFreq <= 1 || $dbw->getType() == 'sqlite' ) {
-                       $dbw->update(
-                               'page', array( 'page_counter = page_counter + 1' ),
-                               array( 'page_id' => $this->id ),
-                               __METHOD__
-                       );
-
+                       $id = $this->id;
+                       $method = __METHOD__;
+                       $dbw->onTransactionIdle( function () use ( $dbw, $id, $method ) {
+                               try {
+                                       $dbw->update( 'page',
+                                               array( 'page_counter = page_counter + 1' ),
+                                               array( 'page_id' => $id ),
+                                               $method
+                                       );
+                               } catch ( DBError $e ) {
+                                       MWExceptionHandler::logException( $e );
+                               }
+                       } );
                        return;
                }
 
                # Not important enough to warrant an error page in case of failure
                try {
+                       // Since `hitcounter` is non-transactional, the contention is minimal
                        $dbw->insert( 'hitcounter', array( 'hc_id' => $this->id ), __METHOD__ );
                        $checkfreq = intval( $wgHitcounterUpdateFreq / 25 + 1 );
                        if ( rand() % $checkfreq == 0 && $dbw->lastErrno() == 0 ) {
                                $this->collect();
                        }
                } catch ( DBError $e ) {
+                       MWExceptionHandler::logException( $e );
                }
        }
 
@@ -75,7 +84,6 @@ class ViewCountUpdate implements DeferrableUpdate {
                $dbw = wfGetDB( DB_MASTER );
 
                $rown = $dbw->selectField( 'hitcounter', 'COUNT(*)', array(), __METHOD__ );
-
                if ( $rown < $wgHitcounterUpdateFreq ) {
                        return;
                }
@@ -83,14 +91,13 @@ class ViewCountUpdate implements DeferrableUpdate {
                wfProfileIn( __METHOD__ . '-collect' );
                $old_user_abort = ignore_user_abort( true );
 
-               $dbw->lockTables( array(), array( 'hitcounter' ), __METHOD__, false );
-
                $dbType = $dbw->getType();
                $tabletype = $dbType == 'mysql' ? "ENGINE=HEAP " : '';
                $hitcounterTable = $dbw->tableName( 'hitcounter' );
                $acchitsTable = $dbw->tableName( 'acchits' );
                $pageTable = $dbw->tableName( 'page' );
 
+               $dbw->lockTables( array(), array( 'hitcounter' ), __METHOD__, false );
                $dbw->query( "CREATE TEMPORARY TABLE $acchitsTable $tabletype AS " .
                        "SELECT hc_id,COUNT(*) AS hc_n FROM $hitcounterTable " .
                        'GROUP BY hc_id', __METHOD__ );
index 3aad389..661330d 100644 (file)
@@ -98,9 +98,9 @@ class DifferenceEngine extends ContextSource {
 
        /**
         * Constructor
-        * @param IContextSource $context context to use, anything else will be ignored
-        * @param int $old old ID we want to show and diff with.
-        * @param string|int $new either revision ID or 'prev' or 'next'. Default: 0.
+        * @param IContextSource $context Context to use, anything else will be ignored
+        * @param int $old Old ID we want to show and diff with.
+        * @param string|int $new Either revision ID or 'prev' or 'next'. Default: 0.
         * @param int $rcid Deprecated, no longer used!
         * @param bool $refreshCache If set, refreshes the diff cache
         * @param bool $unhide If set, allow viewing deleted revs
@@ -823,8 +823,8 @@ class DifferenceEngine extends ContextSource {
         *
         * @todo move this to TextDifferenceEngine, make DifferenceEngine abstract. At some point.
         *
-        * @param string $otext old text, must be already segmented
-        * @param string $ntext new text, must be already segmented
+        * @param string $otext Old text, must be already segmented
+        * @param string $ntext New text, must be already segmented
         *
         * @return bool|string
         */
@@ -972,7 +972,7 @@ class DifferenceEngine extends ContextSource {
                }
 
                // Sanity: don't show the notice if too many rows must be scanned
-               // @TODO: show some special message for that case
+               // @todo show some special message for that case
                $nEdits = $this->mNewPage->countRevisionsBetween( $oldRev, $newRev, 1000 );
                if ( $nEdits > 0 && $nEdits <= 1000 ) {
                        $limit = 100; // use diff-multi-manyusers if too many users
index 2da3775..e62f8bd 100644 (file)
@@ -29,7 +29,7 @@
 class BadTitleError extends ErrorPageError {
        /**
         * @param string|Message $msg A message key (default: 'badtitletext')
-        * @param array $params parameter to wfMessage()
+        * @param array $params Parameter to wfMessage()
         */
        public function __construct( $msg = 'badtitletext', $params = array() ) {
                parent::__construct( 'badtitle', $msg, $params );
index 7cd198b..3631a34 100644 (file)
@@ -32,7 +32,7 @@ class ErrorPageError extends MWException {
         *
         * @param string|Message $title Message key (string) for page title, or a Message object
         * @param string|Message $msg Message key (string) for error text, or a Message object
-        * @param array $params with parameters to wfMessage()
+        * @param array $params Array with parameters to wfMessage()
         */
        public function __construct( $title, $msg, $params = array() ) {
                $this->title = $title;
index 9e09b22..688130e 100644 (file)
@@ -178,7 +178,7 @@ class ExternalStore {
         * itself. It also fails-over to the next possible clusters
         * as provided in the first parameter.
         *
-        * @param array $tryStores refer to $wgDefaultExternalStore
+        * @param array $tryStores Refer to $wgDefaultExternalStore
         * @param string $data
         * @param array $params Associative array of ExternalStoreMedium parameters
         * @return string|bool The URL of the stored data item, or false on error
index 4575e7c..47bacb5 100644 (file)
@@ -98,7 +98,7 @@ class FSFile {
         * Get an associative array containing information about
         * a file with the given storage path.
         *
-        * @param mixed $ext The file extension, or true to extract it from the filename.
+        * @param string|bool $ext The file extension, or true to extract it from the filename.
         *             Set it to false to ignore the extension.
         *
         * @return array
@@ -237,8 +237,8 @@ class FSFile {
        /**
         * Get an associative array containing information about a file in the local filesystem.
         *
-        * @param string $path absolute local filesystem path
-        * @param mixed $ext The file extension, or true to extract it from the filename.
+        * @param string $path Absolute local filesystem path
+        * @param string|bool $ext The file extension, or true to extract it from the filename.
         *   Set it to false to ignore the extension.
         * @return array
         */
index e7c1f6f..b99ffb6 100644 (file)
@@ -213,7 +213,7 @@ class FSFileBackend extends FileBackendStore {
                                wfEscapeShellArg( $this->cleanPathSlashes( $tempFile->getPath() ) ),
                                wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
                        ) );
-                       $handler = function( $errors, Status $status, array $params, $cmd ) {
+                       $handler = function ( $errors, Status $status, array $params, $cmd ) {
                                if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
                                        $status->fatal( 'backend-fail-create', $params['dst'] );
                                        trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
@@ -252,7 +252,7 @@ class FSFileBackend extends FileBackendStore {
                                wfEscapeShellArg( $this->cleanPathSlashes( $params['src'] ) ),
                                wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
                        ) );
-                       $handler = function( $errors, Status $status, array $params, $cmd ) {
+                       $handler = function ( $errors, Status $status, array $params, $cmd ) {
                                if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
                                        $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
                                        trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
@@ -310,7 +310,7 @@ class FSFileBackend extends FileBackendStore {
                                wfEscapeShellArg( $this->cleanPathSlashes( $source ) ),
                                wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
                        ) );
-                       $handler = function( $errors, Status $status, array $params, $cmd ) {
+                       $handler = function ( $errors, Status $status, array $params, $cmd ) {
                                if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
                                        $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
                                        trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
@@ -370,7 +370,7 @@ class FSFileBackend extends FileBackendStore {
                                wfEscapeShellArg( $this->cleanPathSlashes( $source ) ),
                                wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
                        ) );
-                       $handler = function( $errors, Status $status, array $params, $cmd ) {
+                       $handler = function ( $errors, Status $status, array $params, $cmd ) {
                                if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
                                        $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
                                        trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
@@ -415,7 +415,7 @@ class FSFileBackend extends FileBackendStore {
                                wfIsWindows() ? 'DEL' : 'unlink',
                                wfEscapeShellArg( $this->cleanPathSlashes( $source ) )
                        ) );
-                       $handler = function( $errors, Status $status, array $params, $cmd ) {
+                       $handler = function ( $errors, Status $status, array $params, $cmd ) {
                                if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
                                        $status->fatal( 'backend-fail-delete', $params['src'] );
                                        trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
@@ -828,7 +828,7 @@ abstract class FSFileBackendList implements Iterator {
        protected $params = array();
 
        /**
-        * @param string $dir file system directory
+        * @param string $dir File system directory
         * @param array $params
         */
        public function __construct( $dir, array $params ) {
@@ -849,7 +849,7 @@ abstract class FSFileBackendList implements Iterator {
        /**
         * Return an appropriate iterator object to wrap
         *
-        * @param string $dir file system directory
+        * @param string $dir File system directory
         * @return Iterator
         */
        protected function initIterator( $dir ) {
index ee9a49d..495ac3c 100644 (file)
@@ -69,7 +69,7 @@ abstract class FileBackendStore extends FileBackend {
                $this->mimeCallback = isset( $config['mimeCallback'] )
                        ? $config['mimeCallback']
                        : function ( $storagePath, $content, $fsPath ) {
-                               // @TODO: handle the case of extension-less files using the contents
+                               // @todo handle the case of extension-less files using the contents
                                return StreamFile::contentTypeFromPath( $storagePath ) ?: 'unknown/unknown';
                        };
                $this->memCache = new EmptyBagOStuff(); // disabled by default
@@ -1696,7 +1696,7 @@ abstract class FileBackendStore extends FileBackend {
                if ( !$this->memCache->add( $key, $val, $ttl ) && !empty( $val['latest'] ) ) {
                        $this->memCache->merge(
                                $key,
-                               function( BagOStuff $cache, $key, $cValue ) use ( $val ) {
+                               function ( BagOStuff $cache, $key, $cValue ) use ( $val ) {
                                        return ( is_array( $cValue ) && empty( $cValue['latest'] ) )
                                                ? $val // update the stat cache with the lastest info
                                                : false; // do nothing (cache is salted or some error happened)
@@ -1819,7 +1819,7 @@ abstract class FileBackendStore extends FileBackend {
         * @param string $storagePath
         * @param string|null $content File data
         * @param string|null $fsPath File system path
-        * @return MIME type
+        * @return string MIME type
         */
        protected function getContentType( $storagePath, $content, $fsPath ) {
                return call_user_func_array( $this->mimeCallback, func_get_args() );
index 9ef23f8..e9c8883 100644 (file)
@@ -1521,7 +1521,7 @@ class SwiftFileBackend extends FileBackendStore {
                                        'mtime' => $this->convertSwiftDate( $rhdrs['last-modified'], TS_MW ),
                                        // Empty objects actually return no content-length header in Ceph
                                        'size'  => isset( $rhdrs['content-length'] ) ? (int)$rhdrs['content-length'] : 0,
-                                       'sha1'  => $rhdrs[ 'x-object-meta-sha1base36'],
+                                       'sha1'  => $rhdrs['x-object-meta-sha1base36'],
                                        // Note: manifiest ETags are not an MD5 of the file
                                        'md5'   => ctype_xdigit( $rhdrs['etag'] ) ? $rhdrs['etag'] : null,
                                        'xattr' => array( 'metadata' => $metadata, 'headers' => $headers )
@@ -1791,7 +1791,7 @@ abstract class SwiftFileBackendList implements Iterator {
         *
         * @param string $container Resolved container name
         * @param string $dir Resolved path relative to container
-        * @param string $after null
+        * @param string $after
         * @param int $limit
         * @param array $params
         * @return Traversable|array
index 20c7c35..c065148 100644 (file)
@@ -132,7 +132,7 @@ abstract class FileJournal {
        /**
         * Get the position ID of the latest journal entry at some point in time
         *
-        * @param int|string $time timestamp
+        * @param int|string $time Timestamp
         * @return int|bool
         */
        final public function getPositionAtTime( $time ) {
@@ -224,7 +224,7 @@ class NullFileJournal extends FileJournal {
 
        /**
         * @see FileJournal::doGetPositionAtTime()
-        * @param int|string $time timestamp
+        * @param int|string $time Timestamp
         * @return int|bool
         */
        protected function doGetPositionAtTime( $time ) {
index b58e901..450ccc8 100644 (file)
@@ -108,7 +108,7 @@ abstract class DBLockManager extends QuorumLockManager {
                $this->session = wfRandomString( 31 );
        }
 
-       // @TODO: change this code to work in one batch
+       // @todo change this code to work in one batch
        protected function getLocksOnServer( $lockSrv, array $pathsByType ) {
                $status = Status::newGood();
                foreach ( $pathsByType as $type => $paths ) {
index ecf396a..19fc4fe 100644 (file)
@@ -34,7 +34,7 @@ class LockManagerGroup {
 
        protected $domain; // string; domain (usually wiki ID)
 
-       /** @var array of (name => ('class' => ..., 'config' => ..., 'instance' => ...)) */
+       /** @var array Array of (name => ('class' => ..., 'config' => ..., 'instance' => ...)) */
        protected $managers = array();
 
        /**
index f7ffb2d..9bb01c2 100644 (file)
@@ -49,7 +49,7 @@ class MemcLockManager extends QuorumLockManager {
        /** @var array (server name => bool) */
        protected $serversUp = array();
 
-       /** @var string random UUID */
+       /** @var string Random UUID */
        protected $session = '';
 
        /**
index ff4cba5..90e0581 100644 (file)
@@ -51,7 +51,7 @@ class RedisLockManager extends QuorumLockManager {
        /** @var array Map server names to hostname/IP and port numbers */
        protected $lockServers = array();
 
-       /** @var string random UUID */
+       /** @var string Random UUID */
        protected $session = '';
 
        /**
index 8598005..a45fb7a 100644 (file)
@@ -1055,7 +1055,7 @@ class FileRepo {
         * Returns a FileRepoStatus object with the file Virtual URL in the value,
         * file can later be disposed using FileRepo::freeTemp().
         *
-        * @param string $originalName the base name of the file as specified
+        * @param string $originalName The base name of the file as specified
         *   by the user. The file extension will be maintained.
         * @param string $srcPath The current location of the file.
         * @return FileRepoStatus Object with the URL in the value.
index 3f7adb0..96c8803 100644 (file)
@@ -369,7 +369,7 @@ class LocalRepo extends FileRepo {
         * Get an array or iterator of file objects for files that have a given
         * SHA-1 content hash.
         *
-        * @param string $hash a sha1 hash to look for
+        * @param string $hash A sha1 hash to look for
         * @return array
         */
        function findBySha1( $hash ) {
index 65637df..fce3f78 100644 (file)
@@ -272,7 +272,7 @@ class RepoGroup {
        /**
         * Find all instances of files with this key
         *
-        * @param string $hash base 36 SHA-1 hash
+        * @param string $hash Base 36 SHA-1 hash
         * @return array Array of File objects
         */
        function findBySha1( $hash ) {
@@ -292,7 +292,7 @@ class RepoGroup {
        /**
         * Find all instances of files with this keys
         *
-        * @param array $hashes base 36 SHA-1 hashes
+        * @param array $hashes Base 36 SHA-1 hashes
         * @return array Array of array of File objects
         */
        function findBySha1s( array $hashes ) {
@@ -420,7 +420,7 @@ class RepoGroup {
         * Split a virtual URL into repo, zone and rel parts
         * @param string $url
         * @throws MWException
-        * @return array containing repo, zone and rel
+        * @return array Containing repo, zone and rel
         */
        function splitVirtualUrl( $url ) {
                if ( substr( $url, 0, 9 ) != 'mwrepo://' ) {
index 1eee6a2..735bf8a 100644 (file)
@@ -27,7 +27,7 @@
  * @ingroup FileAbstraction
  */
 class ArchivedFile {
-       /** @var int filearchive row ID */
+       /** @var int Filearchive row ID */
        private $id;
 
        /** @var string File name */
@@ -42,7 +42,7 @@ class ArchivedFile {
        /** @var int File size in bytes */
        private $size;
 
-       /** @var int size in bytes */
+       /** @var int Size in bytes */
        private $bits;
 
        /** @var int Width */
index e970e38..c6da1f1 100644 (file)
@@ -127,7 +127,7 @@ abstract class File {
        /** @var string Relative path including trailing slash */
        protected $hashPath;
 
-       /** @var string number of pages of a multipage document, or false for
+       /** @var string Number of pages of a multipage document, or false for
         *    documents which aren't multipage documents
         */
        protected $pageCount;
@@ -583,7 +583,7 @@ abstract class File {
         *
         * Currently used to add a warning to the image description page
         *
-        * @return bool false if the main image is both animated
+        * @return bool False if the main image is both animated
         *   and the thumbnail is not. In all other cases must return
         *   true. If image is not renderable whatsoever, should
         *   return true.
@@ -1178,7 +1178,7 @@ abstract class File {
                        return false;
                }
 
-               $this->tmpBucketedThumbCache[ $bucket ] = $tmpFile->getPath();
+               $this->tmpBucketedThumbCache[$bucket] = $tmpFile->getPath();
                // For the caching to work, we need to make the tmp file survive as long as
                // this object exists
                $tmpFile->bind( $this );
@@ -1189,7 +1189,7 @@ abstract class File {
        /**
         * Returns the most appropriate source image for the thumbnail, given a target thumbnail size
         * @param array $params
-        * @return array source path and width/height of the source
+        * @return array Source path and width/height of the source
         */
        public function getThumbnailSource( $params ) {
                if ( $this->repo
@@ -1204,8 +1204,8 @@ abstract class File {
                        }
 
                        // Try to avoid reading from storage if the file was generated by this script
-                       if ( isset( $this->tmpBucketedThumbCache[ $bucket ] ) ) {
-                               $tmpPath = $this->tmpBucketedThumbCache[ $bucket ];
+                       if ( isset( $this->tmpBucketedThumbCache[$bucket] ) ) {
+                               $tmpPath = $this->tmpBucketedThumbCache[$bucket];
 
                                if ( file_exists( $tmpPath ) ) {
                                        return array(
@@ -1606,7 +1606,7 @@ abstract class File {
         *
         * @param string $zone Name of requested zone
         * @param bool|string $suffix If not false, the name of a file in zone
-        * @return string path
+        * @return string Path
         */
        function getZoneUrl( $zone, $suffix = false ) {
                $this->assertRepoDefined();
@@ -1623,7 +1623,7 @@ abstract class File {
         * Get the URL of the thumbnail directory, or a particular file if $suffix is specified
         *
         * @param bool|string $suffix If not false, the name of a thumbnail file
-        * @return string path
+        * @return string Path
         */
        function getThumbUrl( $suffix = false ) {
                return $this->getZoneUrl( 'thumb', $suffix );
@@ -1633,7 +1633,7 @@ abstract class File {
         * Get the URL of the transcoded directory, or a particular file if $suffix is specified
         *
         * @param bool|string $suffix If not false, the name of a media file
-        * @return string path
+        * @return string Path
         */
        function getTranscodedUrl( $suffix = false ) {
                return $this->getZoneUrl( 'transcoded', $suffix );
@@ -1741,7 +1741,7 @@ abstract class File {
         * @param int $flags A bitwise combination of:
         *   File::DELETE_SOURCE    Delete the source file, i.e. move rather than copy
         * @param array $options Optional additional parameters
-        * @return FileRepoStatus object. On success, the value member contains the
+        * @return FileRepoStatus On success, the value member contains the
         *   archive name, or an empty string if it was a new file.
         *
         * STUB
@@ -2072,44 +2072,6 @@ abstract class File {
                return true;
        }
 
-       /**
-        * Get an associative array containing information about a file in the local filesystem.
-        *
-        * @param string $path Absolute local filesystem path
-        * @param string|bool $ext The file extension, or true to extract it from
-        *   the filename. Set it to false to ignore the extension.
-        *
-        * @return array
-        * @deprecated since 1.19
-        */
-       static function getPropsFromPath( $path, $ext = true ) {
-               wfDebug( __METHOD__ . ": Getting file info for $path\n" );
-               wfDeprecated( __METHOD__, '1.19' );
-
-               $fsFile = new FSFile( $path );
-
-               return $fsFile->getProps();
-       }
-
-       /**
-        * 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 string $path
-        * @return bool|string False on failure
-        * @deprecated since 1.19
-        */
-       static function sha1Base36( $path ) {
-               wfDeprecated( __METHOD__, '1.19' );
-
-               $fsFile = new FSFile( $path );
-
-               return $fsFile->getSha1Base36();
-       }
-
        /**
         * @return array HTTP header name/value map to use for HEAD/GET request responses
         */
index 1f2defe..1eff1df 100644 (file)
@@ -49,10 +49,10 @@ class LocalFile extends File {
        /** @var bool Does the file exist on disk? (loadFromXxx) */
        protected $fileExists;
 
-       /** @var int image width */
+       /** @var int Image width */
        protected $width;
 
-       /** @var int image height */
+       /** @var int Image height */
        protected $height;
 
        /** @var int Returned by getimagesize (loadFromXxx) */
@@ -166,7 +166,7 @@ class LocalFile extends File {
         * Create a LocalFile from a SHA-1 key
         * Do not call this except from inside a repo class.
         *
-        * @param string $sha1 base-36 SHA-1
+        * @param string $sha1 Base-36 SHA-1
         * @param LocalRepo $repo
         * @param string|bool $timestamp MW_timestamp (optional)
         * @return bool|LocalFile
@@ -437,7 +437,7 @@ class LocalFile extends File {
        /**
         * @param DatabaseBase $dbr
         * @param string $fname
-        * @return array|false
+        * @return array|bool
         */
        private function loadFieldsWithTimestamp( $dbr, $fname ) {
                $fieldMap = false;
@@ -833,7 +833,7 @@ class LocalFile extends File {
        /**
         * Get all thumbnail names previously generated for this file
         * @param string|bool $archiveName Name of an archive file, default false
-        * @return array first element is the base dir, then files in that base dir.
+        * @return array First element is the base dir, then files in that base dir.
         */
        function getThumbnails( $archiveName = false ) {
                if ( $archiveName ) {
@@ -1848,7 +1848,7 @@ class LocalFile extends File {
         * Start a transaction and lock the image for update
         * Increments a reference counter if the lock is already held
         * @throws MWException Throws an error if the lock was not acquired
-        * @return bool success
+        * @return bool Success
         */
        function lock() {
                $dbw = $this->repo->getMasterDB();
index ca92496..0adcc73 100644 (file)
@@ -79,7 +79,7 @@ class OldLocalFile extends LocalFile {
         * Create a OldLocalFile from a SHA-1 key
         * Do not call this except from inside a repo class.
         *
-        * @param string $sha1 base-36 SHA-1
+        * @param string $sha1 Base-36 SHA-1
         * @param LocalRepo $repo
         * @param string|bool $timestamp MW_timestamp (optional)
         *
@@ -130,7 +130,7 @@ class OldLocalFile extends LocalFile {
         * @param Title $title
         * @param FileRepo $repo
         * @param string $time Timestamp or null to load by archive name
-        * @param string $archiveName archive name or null to load by timestamp
+        * @param string $archiveName Archive name or null to load by timestamp
         * @throws MWException
         */
        function __construct( $title, $repo, $time, $archiveName ) {
index 837a731..53c2e10 100644 (file)
 abstract class ImageGalleryBase extends ContextSource {
        /**
         * @var array Gallery images
-        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        * @deprecated since 1.23 (was declared "var") and will be removed in 1.24
         */
        public $mImages;
 
        /**
         * @var bool Whether to show the filesize in bytes in categories
-        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        * @deprecated since 1.23 (was declared "var") and will be removed in 1.24
         */
        public $mShowBytes;
 
        /**
         * @var bool Whether to show the filename. Default: true
-        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        * @deprecated since 1.23 (was declared "var") and will be removed in 1.24
         */
        public $mShowFilename;
 
        /**
         * @var string Gallery mode. Default: traditional
-        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        * @deprecated since 1.23 (was declared "var") and will be removed in 1.24
         */
        public $mMode;
 
        /**
         * @var bool|string Gallery caption. Default: false
-        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        * @deprecated since 1.23 (was declared "var") and will be removed in 1.24
         */
        public $mCaption = false;
 
        /**
         * @var bool Hide blacklisted images?
-        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        * @deprecated since 1.23 (was declared "var") and will be removed in 1.24
         */
        public $mHideBadImages;
 
index bb55c89..b004a95 100644 (file)
@@ -76,7 +76,7 @@ class PackedImageGallery extends TraditionalImageGallery {
        }
 
        /**
-        * @param MediaTransformOutput|bool $thumb the thumbnail, or false if no
+        * @param MediaTransformOutput|bool $thumb The thumbnail, or false if no
         *   thumb (which can happen)
         * @return float
         */
index df6582c..6cf8d0a 100644 (file)
@@ -352,7 +352,7 @@ class HTMLForm extends ContextSource {
         * @param array $descriptor Input Descriptor, as described above
         *
         * @throws MWException
-        * @return HTMLFormField subclass
+        * @return HTMLFormField Instance of a subclass of HTMLFormField
         */
        public static function loadInputFromParameters( $fieldname, $descriptor ) {
                $class = self::getClassFromDescriptor( $fieldname, $descriptor );
@@ -622,7 +622,7 @@ class HTMLForm extends ContextSource {
        /**
         * Add footer text, inside the form.
         *
-        * @param string $msg complete text of message to display
+        * @param string $msg Complete text of message to display
         * @param string|null $section The section to add the footer text to
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
@@ -741,8 +741,8 @@ class HTMLForm extends ContextSource {
         * Only useful when the method is "post".
         *
         * @since 1.24
-        * @param string|array Salt to use
-        * @return HTMLForm $this for chaining calls
+        * @param string|array $salt Salt to use
+        * @return HTMLForm $this For chaining calls
         */
        public function setTokenSalt( $salt ) {
                $this->mTokenSalt = $salt;
@@ -760,7 +760,7 @@ class HTMLForm extends ContextSource {
         *
         * @param bool|string|array|Status $submitResult Output from HTMLForm::trySubmit()
         *
-        * @return Nothing, should be last call
+        * @return void Nothing, should be last call
         */
        function displayForm( $submitResult ) {
                $this->getOutput()->addHTML( $this->getHTML( $submitResult ) );
@@ -980,7 +980,7 @@ class HTMLForm extends ContextSource {
        /**
         * Format a stack of error messages into a single HTML string
         *
-        * @param array $errors of message keys/values
+        * @param array $errors Array of message keys/values
         *
         * @return string HTML, a "<ul>" list of errors
         */
@@ -1010,7 +1010,7 @@ class HTMLForm extends ContextSource {
        /**
         * Set the text for the submit button
         *
-        * @param string $t plaintext.
+        * @param string $t Plaintext
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -1024,12 +1024,15 @@ class HTMLForm extends ContextSource {
         * Set the text for the submit button to a message
         * @since 1.19
         *
-        * @param string $msg Message key
+        * @param string|Message $msg Message key or Message object
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
        public function setSubmitTextMsg( $msg ) {
-               $this->setSubmitText( $this->msg( $msg )->text() );
+               if ( !$msg instanceof Message ) {
+                       $msg = $this->msg( $msg );
+               }
+               $this->setSubmitText( $msg->text() );
 
                return $this;
        }
@@ -1143,12 +1146,15 @@ class HTMLForm extends ContextSource {
         * this message as its "<legend>" element.
         * @since 1.19
         *
-        * @param string $msg Message key
+        * @param string|Message $msg Message key or Message object
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
        public function setWrapperLegendMsg( $msg ) {
-               $this->setWrapperLegend( $this->msg( $msg )->text() );
+               if ( !$msg instanceof Message ) {
+                       $msg = $this->msg( $msg );
+               }
+               $this->setWrapperLegend( $msg->text() );
 
                return $this;
        }
@@ -1370,7 +1376,7 @@ class HTMLForm extends ContextSource {
         *
         * @param array $data
         *
-        * @return
+        * @return array
         */
        function filterDataForSubmit( $data ) {
                return $data;
index 1fcc866..7e4b15b 100644 (file)
@@ -35,7 +35,7 @@ abstract class HTMLFormField {
         * the input object itself.  It should not implement the surrounding
         * table cells/rows, or labels/help messages.
         *
-        * @param string $value the value to set the input to; eg a default
+        * @param string $value The value to set the input to; eg a default
         *     text for a text input.
         *
         * @return string Valid HTML.
@@ -125,7 +125,7 @@ abstract class HTMLFormField {
         *
         * @param array $alldata
         * @param array $params
-        * @return boolean
+        * @return bool
         */
        protected function isHiddenRecurse( array $alldata, array $params ) {
                $origParams = $params;
@@ -250,7 +250,7 @@ abstract class HTMLFormField {
         * @param string|array $value The value the field was submitted with
         * @param array $alldata The data collected from the form
         *
-        * @return bool true to cancel the submission
+        * @return bool True to cancel the submission
         */
        function cancelSubmit( $value, $alldata ) {
                return false;
@@ -264,7 +264,7 @@ abstract class HTMLFormField {
         * @param string|array $value The value the field was submitted with
         * @param array $alldata The data collected from the form
         *
-        * @return bool|string true on success, or String error to display, or
+        * @return bool|string True on success, or String error to display, or
         *   false to fail validation without displaying an error.
         */
        function validate( $value, $alldata ) {
index 2bf9f8b..a198037 100644 (file)
@@ -29,7 +29,7 @@ class HTMLSelectField extends HTMLFormField {
 
                $allowedParams = array( 'tabindex', 'size' );
                $customParams = $this->getAttributes( $allowedParams );
-               foreach( $customParams as $name => $value ) {
+               foreach ( $customParams as $name => $value ) {
                        $select->setAttribute( $name, $value );
                }
 
index c6939a8..1c7762b 100644 (file)
@@ -179,11 +179,16 @@ class CliInstaller extends Installer {
        public function showHelpBox( $msg /*, ... */ ) {
        }
 
-       /**
-        * @param Status $status
-        */
        public function showStatusMessage( Status $status ) {
-               parent::showStatusMessage( $status );
+               $warnings = array_merge( $status->getWarningsArray(),
+                       $status->getErrorsArray() );
+
+               if ( count( $warnings ) !== 0 ) {
+                       foreach ( $warnings as $w ) {
+                               call_user_func_array( array( $this, 'showMessage' ), $w );
+                       }
+               }
+
                if ( !$status->isOk() ) {
                        echo "\n";
                        exit( 1 );
index 28dac46..b25ea09 100644 (file)
@@ -72,6 +72,7 @@ abstract class DatabaseUpdater {
                'PopulateImageSha1',
                'FixExtLinksProtocolRelative',
                'PopulateFilearchiveSha1',
+               'PopulateBacklinkNamespace'
        );
 
        /**
index 7c67ee8..7d77416 100644 (file)
@@ -119,7 +119,6 @@ abstract class Installer {
                'envCheckRegisterGlobals',
                'envCheckBrokenXML',
                'envCheckMagicQuotes',
-               'envCheckMagicSybase',
                'envCheckMbstring',
                'envCheckSafeMode',
                'envCheckXML',
@@ -137,6 +136,7 @@ abstract class Installer {
                'envCheckLibicu',
                'envCheckSuhosinMaxValueLength',
                'envCheckCtype',
+               'envCheckIconv',
                'envCheckJSON',
        );
 
@@ -218,6 +218,7 @@ abstract class Installer {
                '_LicenseCode' => 'none',
                '_CCDone' => false,
                '_Extensions' => array(),
+               '_Skins' => array(),
                '_MemCachedServers' => '',
                '_UpgradeKeySupplied' => false,
                '_ExistingDBSettings' => false,
@@ -351,17 +352,10 @@ abstract class Installer {
        abstract public function showError( $msg /*, ... */ );
 
        /**
-        * Shows messages to the user through a Status object
+        * Show a message to the installing user by using a Status object
         * @param Status $status
         */
-       public function showStatusMessage( Status $status ) {
-               $errors = array_merge( $status->getErrorsArray(), $status->getWarningsArray() );
-               if ( $errors ) {
-                       foreach ( $errors as $error ) {
-                               call_user_func( 'showMessage', $error );
-                       }
-               }
-       }
+       abstract public function showStatusMessage( Status $status );
 
        /**
         * Constructor, always call this from child classes.
@@ -535,6 +529,13 @@ abstract class Installer {
        public static function getExistingLocalSettings() {
                global $IP;
 
+               // You might be wondering why this is here. Well if you don't do this
+               // then some poorly-formed extensions try to call their own classes
+               // after immediately registering them. We really need to get extension
+               // registration out of the global scope and into a real format.
+               // @see https://bugzilla.wikimedia.org/67440
+               global $wgAutoloadClasses;
+
                wfSuppressWarnings();
                $_lsExists = file_exists( "$IP/LocalSettings.php" );
                wfRestoreWarnings();
@@ -760,31 +761,19 @@ abstract class Installer {
        }
 
        /**
-        * Environment check for magic_quotes_runtime.
+        * Environment check for magic_quotes_(gpc|runtime|sybase).
         * @return bool
         */
        protected function envCheckMagicQuotes() {
-               if ( wfIniGetBool( "magic_quotes_runtime" ) ) {
-                       $this->showError( 'config-magic-quotes-runtime' );
-
-                       return false;
-               }
-
-               return true;
-       }
-
-       /**
-        * Environment check for magic_quotes_sybase.
-        * @return bool
-        */
-       protected function envCheckMagicSybase() {
-               if ( wfIniGetBool( 'magic_quotes_sybase' ) ) {
-                       $this->showError( 'config-magic-quotes-sybase' );
-
-                       return false;
+               $status = true;
+               foreach ( array( 'gpc', 'runtime', 'sybase' ) as $magicJunk ) {
+                       if ( wfIniGetBool( "magic_quotes_$magicJunk" ) ) {
+                               $this->showError( "config-magic-quotes-$magicJunk" );
+                               $status = false;
+                       }
                }
 
-               return true;
+               return $status;
        }
 
        /**
@@ -1206,6 +1195,19 @@ abstract class Installer {
                return true;
        }
 
+       /**
+        * @return bool
+        */
+       protected function envCheckIconv() {
+               if ( !function_exists( 'iconv' ) ) {
+                       $this->showError( 'config-iconv' );
+
+                       return false;
+               }
+
+               return true;
+       }
+
        /**
         * @return bool
         */
@@ -1279,8 +1281,8 @@ abstract class Installer {
         *
         * Used only by environment checks.
         *
-        * @param string $path path to search
-        * @param array $names of executable names
+        * @param string $path Path to search
+        * @param array $names Array of executable names
         * @param array|bool $versionInfo False or array with two members:
         *   0 => Command to run for version check, with $1 for the full executable name
         *   1 => String to compare the output with
@@ -1426,17 +1428,20 @@ abstract class Installer {
        }
 
        /**
-        * Finds extensions that follow the format /extensions/Name/Name.php,
+        * Finds extensions that follow the format /$directory/Name/Name.php,
         * and returns an array containing the value for 'Name' for each found extension.
         *
+        * Reasonable values for $directory include 'extensions' (the default) and 'skins'.
+        *
+        * @param string $directory Directory to search in
         * @return array
         */
-       public function findExtensions() {
+       public function findExtensions( $directory = 'extensions' ) {
                if ( $this->getVar( 'IP' ) === null ) {
                        return array();
                }
 
-               $extDir = $this->getVar( 'IP' ) . '/extensions';
+               $extDir = $this->getVar( 'IP' ) . '/' . $directory;
                if ( !is_readable( $extDir ) || !is_dir( $extDir ) ) {
                        return array();
                }
index 100dd10..c0ba300 100644 (file)
@@ -49,6 +49,7 @@ class LocalSettingsGenerator {
                $this->installer = $installer;
 
                $this->extensions = $installer->getVar( '_Extensions' );
+               $this->skins = $installer->getVar( '_Skins' );
 
                $db = $installer->getDBInstaller( $installer->getVar( 'wgDBtype' ) );
 
@@ -129,13 +130,26 @@ class LocalSettingsGenerator {
 
        /**
         * Return the full text of the generated LocalSettings.php file,
-        * including the extensions
+        * including the extensions and skins.
         *
         * @return string
         */
        public function getText() {
                $localSettings = $this->getDefaultText();
 
+               if ( count( $this->skins ) ) {
+                       $localSettings .= "
+# Enabled skins.
+# The following skins were automatically enabled:\n";
+
+                       foreach ( $this->skins as $skinName ) {
+                               $encSkinName = self::escapePhpString( $skinName );
+                               $localSettings .= "require_once \"\$IP/skins/$encSkinName/$encSkinName.php\";\n";
+                       }
+
+                       $localSettings .= "\n";
+               }
+
                if ( count( $this->extensions ) ) {
                        $localSettings .= "
 # Enabled Extensions. Most extensions are enabled by including the base extension file here
@@ -146,9 +160,12 @@ class LocalSettingsGenerator {
                                $encExtName = self::escapePhpString( $extName );
                                $localSettings .= "require_once \"\$IP/extensions/$encExtName/$encExtName.php\";\n";
                        }
+
+                       $localSettings .= "\n";
                }
 
-               $localSettings .= "\n\n# End of automatically generated settings.
+               $localSettings .= "
+# End of automatically generated settings.
 # Add more configuration options below.\n\n";
 
                return $localSettings;
@@ -220,6 +237,8 @@ class LocalSettingsGenerator {
                                                wfBoolToStr( $perm ) . ";\n";
                                }
                        }
+                       $groupRights .= "\n";
+
                        if ( ( isset( $this->groupPermissions['*']['edit'] ) &&
                                        $this->groupPermissions['*']['edit'] === false )
                                && ( isset( $this->groupPermissions['*']['createaccount'] ) &&
@@ -227,12 +246,12 @@ class LocalSettingsGenerator {
                                && ( isset( $this->groupPermissions['*']['read'] ) &&
                                        $this->groupPermissions['*']['read'] !== false )
                        ) {
-                               $noFollow = "\n# Set \$wgNoFollowLinks to true if you open up your wiki to editing by\n"
+                               $noFollow = "# Set \$wgNoFollowLinks to true if you open up your wiki to editing by\n"
                                        . "# the general public and wish to apply nofollow to external links as a\n"
                                        . "# deterrent to spammers. Nofollow is not a comprehensive anti-spam solution\n"
                                        . "# and open wikis will generally require other anti-spam measures; for more\n"
                                        . "# information, see https://www.mediawiki.org/wiki/Manual:Combating_spam\n"
-                                       . "\$wgNoFollowLinks = false;";
+                                       . "\$wgNoFollowLinks = false;\n\n";
                        }
                }
 
@@ -352,10 +371,6 @@ ${serverSetting}
 # web installer while LocalSettings.php is in place
 \$wgUpgradeKey = \"{$this->values['wgUpgradeKey']}\";
 
-## Default skin: you can change the default skin. Use the internal symbolic
-## names, ie 'vector', 'monobook':
-\$wgDefaultSkin = \"{$this->values['wgDefaultSkin']}\";
-
 ## For attaching licensing metadata to pages, and displaying an
 ## appropriate copyright notice / icon. GNU Free Documentation
 ## License and Creative Commons licenses are supported so far.
@@ -367,6 +382,9 @@ ${serverSetting}
 # Path to the GNU diff3 utility. Used for conflict resolution.
 \$wgDiff3 = \"{$this->values['wgDiff3']}\";
 
-{$groupRights}{$noFollow}";
+{$groupRights}{$noFollow}## Default skin: you can change the default skin. Use the internal symbolic
+## names, ie 'vector', 'monobook':
+\$wgDefaultSkin = \"{$this->values['wgDefaultSkin']}\";
+";
        }
 }
index 10f6692..b82e611 100644 (file)
@@ -120,7 +120,7 @@ class MysqlInstaller extends DatabaseInstaller {
                if ( !strlen( $newValues['_InstallUser'] ) ) {
                        $status->fatal( 'config-db-username-empty' );
                }
-               if (!strlen( $newValues['_InstallPassword'] ) ) {
+               if ( !strlen( $newValues['_InstallPassword'] ) ) {
                        $status->fatal( 'config-db-password-empty', $newValues['_InstallUser'] );
                }
                if ( !$status->isOK() ) {
index 853ee0b..dcf37b6 100644 (file)
@@ -256,6 +256,9 @@ class MysqlUpdater extends DatabaseUpdater {
                        array( 'dropField', 'recentchanges', 'rc_cur_time', 'patch-drop-rc_cur_time.sql' ),
                        array( 'addIndex', 'watchlist', 'wl_user_notificationtimestamp', 'patch-watchlist-user-notificationtimestamp-index.sql' ),
                        array( 'addField', 'page', 'page_lang', 'patch-page_lang.sql' ),
+                       array( 'addField', 'pagelinks', 'pl_from_namespace', 'patch-pl_from_namespace.sql' ),
+                       array( 'addField', 'templatelinks', 'tl_from_namespace', 'patch-tl_from_namespace.sql' ),
+                       array( 'addField', 'imagelinks', 'il_from_namespace', 'patch-il_from_namespace.sql' ),
                );
        }
 
index 89a6978..4caf902 100644 (file)
@@ -84,7 +84,7 @@ class PostgresInstaller extends DatabaseInstaller {
        function submitConnectForm() {
                // Get variables from the request
                $newValues = $this->setVarsFromRequest( array(
-                       'wgDBserver', 'wgDBport','wgDBname', 'wgDBmwschema',
+                       'wgDBserver', 'wgDBport', 'wgDBname', 'wgDBmwschema',
                        '_InstallUser', '_InstallPassword'
                ) );
 
index 8404c2d..9e8ee94 100644 (file)
@@ -415,6 +415,9 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgIndex', 'page_props', 'pp_propname_sortkey_page',
                                        '( pp_propname, pp_sortkey, pp_page ) WHERE ( pp_sortkey IS NOT NULL )' ),
                        array( 'addPgField', 'page', 'page_lang', 'TEXT default NULL' ),
+                       array( 'addPgField', 'pagelinks', 'pl_from_namespace', 'INTEGER NOT NULL DEFAULT 0' ),
+                       array( 'addPgField', 'templatelinks', 'tl_from_namespace', 'INTEGER NOT NULL DEFAULT 0' ),
+                       array( 'addPgField', 'imagelinks', 'il_from_namespace', 'INTEGER NOT NULL DEFAULT 0' ),
                );
        }
 
@@ -694,7 +697,7 @@ END;
                        $this->output( "...column '$table.$field' is already of type '$newtype'\n" );
                } else {
                        $this->output( "Purging data from cache table '$table'\n" );
-                       $this->db->query("DELETE from $table" );
+                       $this->db->query( "DELETE from $table" );
                        $this->output( "Changing column type of '$table.$field' from '{$fi->type()}' to '$newtype'\n" );
                        $sql = "ALTER TABLE $table ALTER $field TYPE $newtype";
                        if ( strlen( $default ) ) {
index cf3f065..ab5ab7d 100644 (file)
@@ -134,6 +134,9 @@ class SqliteUpdater extends DatabaseUpdater {
                        array( 'dropField', 'recentchanges', 'rc_cur_time', 'patch-drop-rc_cur_time.sql' ),
                        array( 'addIndex', 'watchlist', 'wl_user_notificationtimestamp', 'patch-watchlist-user-notificationtimestamp-index.sql' ),
                        array( 'addField', 'page', 'page_lang', 'patch-page-page_lang.sql' ),
+                       array( 'addField', 'pagelinks', 'pl_from_namespace', 'patch-pl_from_namespace.sql' ),
+                       array( 'addField', 'templatelinks', 'tl_from_namespace', 'patch-tl_from_namespace.sql' ),
+                       array( 'addField', 'imagelinks', 'il_from_namespace', 'patch-il_from_namespace.sql' ),
                );
        }
 
index ea86231..68c2ebe 100644 (file)
@@ -148,7 +148,7 @@ class WebInstaller extends Installer {
        /**
         * Main entry point.
         *
-        * @param array[] $session initial session array
+        * @param array[] $session Initial session array
         *
         * @return array[] New session array
         */
@@ -729,6 +729,16 @@ class WebInstaller extends Installer {
                $this->output->addHTML( $html );
        }
 
+       /**
+        * @param Status $status
+        */
+       public function showStatusMessage( Status $status ) {
+               $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.
@@ -950,6 +960,7 @@ class WebInstaller extends Installer {
         *      var:             The variable to be configured (required)
         *      label:           The message name for the label (required)
         *      itemLabelPrefix: The message name prefix for the item labels (required)
+        *      itemLabels:      List of message names to use for the item labels instead of itemLabelPrefix, keyed by values
         *      values:          List of allowed values (required)
         *      itemAttribs:     Array of attribute arrays, outer key is the value name (optional)
         *      commonAttribs:   Attribute array applied to all items
@@ -960,23 +971,49 @@ class WebInstaller extends Installer {
         * @return string
         */
        public function getRadioSet( $params ) {
-               if ( !isset( $params['controlName'] ) ) {
-                       $params['controlName'] = 'config_' . $params['var'];
-               }
-
-               if ( !isset( $params['value'] ) ) {
-                       $params['value'] = $this->getVar( $params['var'] );
-               }
+               $items = $this->getRadioElements( $params );
 
                if ( !isset( $params['label'] ) ) {
                        $label = '';
                } else {
                        $label = $params['label'];
                }
+
+               if ( !isset( $params['controlName'] ) ) {
+                       $params['controlName'] = 'config_' . $params['var'];
+               }
+
                if ( !isset( $params['help'] ) ) {
                        $params['help'] = "";
                }
+
                $s = "<ul>\n";
+               foreach ( $items as $value => $item ) {
+                       $s .= "<li>$item</li>\n";
+               }
+               $s .= "</ul>\n";
+
+               return $this->label( $label, $params['controlName'], $s, $params['help'] );
+       }
+
+       /**
+        * Get a set of labelled radio buttons. You probably want to use getRadioSet(), not this.
+        *
+        * @see getRadioSet
+        *
+        * @return array
+        */
+       public function getRadioElements( $params ) {
+               if ( !isset( $params['controlName'] ) ) {
+                       $params['controlName'] = 'config_' . $params['var'];
+               }
+
+               if ( !isset( $params['value'] ) ) {
+                       $params['value'] = $this->getVar( $params['var'] );
+               }
+
+               $items = array();
+
                foreach ( $params['values'] as $value ) {
                        $itemAttribs = array();
 
@@ -993,19 +1030,17 @@ class WebInstaller extends Installer {
                        $itemAttribs['id'] = $id;
                        $itemAttribs['tabindex'] = $this->nextTabIndex();
 
-                       $s .=
-                               '<li>' .
+                       $items[$value] =
                                Xml::radio( $params['controlName'], $value, $checked, $itemAttribs ) .
                                '&#160;' .
                                Xml::tags( 'label', array( 'for' => $id ), $this->parse(
-                                       wfMessage( $params['itemLabelPrefix'] . strtolower( $value ) )->plain()
-                               ) ) .
-                               "</li>\n";
+                                       isset( $params['itemLabels'] ) ?
+                                               wfMessage( $params['itemLabels'][$value] )->plain() :
+                                               wfMessage( $params['itemLabelPrefix'] . strtolower( $value ) )->plain()
+                               ) );
                }
 
-               $s .= "</ul>\n";
-
-               return $this->label( $label, $params['controlName'], $s, $params['help'] );
+               return $items;
        }
 
        /**
@@ -1041,7 +1076,11 @@ class WebInstaller extends Installer {
                $newValues = array();
 
                foreach ( $varNames as $name ) {
-                       $value = trim( $this->request->getVal( $prefix . $name ) );
+                       $value = $this->request->getVal( $prefix . $name );
+                       // bug 30524, do not trim passwords
+                       if ( stripos( $name, 'password' ) === false ) {
+                               $value = trim( $value );
+                       }
                        $newValues[$name] = $value;
 
                        if ( $value === null ) {
index 97f4830..174120f 100644 (file)
@@ -126,7 +126,6 @@ class WebInstallerOutput {
        public function getCSS() {
                // Horrible, horrible hack: the installer is currently hardcoded to use the Vector skin, so load
                // it here. Include instead of require, as this will work without it, it will just look bad.
-               global $wgResourceModules;
                global $wgStyleDirectory;
                include_once "$wgStyleDirectory/Vector/Vector.php";
 
index 677af4f..9fdee76 100644 (file)
@@ -145,11 +145,12 @@ abstract class WebInstallerPage {
 
        /**
         * @param string $var
+        * @param mixed $default
         *
         * @return mixed
         */
-       public function getVar( $var ) {
-               return $this->parent->getVar( $var );
+       public function getVar( $var, $default = null ) {
+               return $this->parent->getVar( $var, $default );
        }
 
        /**
@@ -163,7 +164,7 @@ abstract class WebInstallerPage {
        /**
         * Get the starting tags of a fieldset.
         *
-        * @param string $legend message name
+        * @param string $legend Message name
         *
         * @return string
         */
@@ -948,6 +949,7 @@ class WebInstallerOptions extends WebInstallerPage {
         */
        public function execute() {
                if ( $this->getVar( '_SkipOptional' ) == 'skip' ) {
+                       $this->submitSkins();
                        return 'skip';
                }
                if ( $this->parent->request->wasPosted() ) {
@@ -1025,6 +1027,38 @@ class WebInstallerOptions extends WebInstallerPage {
                        $this->getFieldSetEnd()
                );
 
+               $skins = $this->parent->findExtensions( 'skins' );
+               $skinHtml = $this->getFieldSetStart( 'config-skins' );
+
+               if ( $skins ) {
+                       $skinNames = array_map( 'strtolower', $skins );
+
+                       $radioButtons = $this->parent->getRadioElements( array(
+                               'var' => 'wgDefaultSkin',
+                               'itemLabels' => array_fill_keys( $skinNames, 'config-skins-use-as-default' ),
+                               'values' => $skinNames,
+                               'value' => $this->getVar( 'wgDefaultSkin', $this->getDefaultSkin( $skinNames ) ),
+                       ) );
+
+                       foreach ( $skins as $skin ) {
+                               $skinHtml .=
+                                       '<div class="config-skins-item">' .
+                                       $this->parent->getCheckBox( array(
+                                               'var' => "skin-$skin",
+                                               'rawtext' => $skin,
+                                               'value' => $this->getVar( "skin-$skin", true ), // all found skins enabled by default
+                                       ) ) .
+                                       '<div class="config-skins-use-as-default">' . $radioButtons[strtolower( $skin )] . '</div>' .
+                                       '</div>';
+                       }
+               } else {
+                       $skinHtml .= $this->parent->getWarningBox( wfMessage( 'config-skins-missing' )->plain() );
+               }
+
+               $skinHtml .= $this->parent->getHelpBox( 'config-skins-help' ) .
+                       $this->getFieldSetEnd();
+               $this->addHTML( $skinHtml );
+
                $extensions = $this->parent->findExtensions();
 
                if ( $extensions ) {
@@ -1220,6 +1254,40 @@ class WebInstallerOptions extends WebInstallerPage {
                $this->addHTML( $this->getCCDoneBox() );
        }
 
+       /**
+        * Returns a default value to be used for $wgDefaultSkin: the preferred skin, if available among
+        * the installed skins, or any other one otherwise.
+        *
+        * @param string[] $skinNames Names of installed skins.
+        * @return string
+        */
+       public function getDefaultSkin( array $skinNames ) {
+               $defaultSkin = $GLOBALS['wgDefaultSkin'];
+               if ( in_array( $defaultSkin, $skinNames ) ) {
+                       return $defaultSkin;
+               } else {
+                       return $skinNames[0];
+               }
+       }
+
+       /**
+        * If the user skips this installer page, we still need to set up the default skins, but ignore
+        * everything else.
+        *
+        * @return bool
+        */
+       public function submitSkins() {
+               $skins = $this->parent->findExtensions( 'skins' );
+               $this->parent->setVar( '_Skins', $skins );
+
+               if ( $skins ) {
+                       $skinNames = array_map( 'strtolower', $skins );
+                       $this->parent->setVar( 'wgDefaultSkin', $this->getDefaultSkin( $skinNames ) );
+               }
+
+               return true;
+       }
+
        /**
         * @return bool
         */
@@ -1228,7 +1296,7 @@ class WebInstallerOptions extends WebInstallerPage {
                        'wgEnableEmail', 'wgPasswordSender', 'wgEnableUploads', 'wgLogo',
                        'wgEnableUserEmail', 'wgEnotifUserTalk', 'wgEnotifWatchlist',
                        'wgEmailAuthentication', 'wgMainCacheType', '_MemCachedServers',
-                       'wgUseInstantCommons' ) );
+                       'wgUseInstantCommons', 'wgDefaultSkin' ) );
 
                $retVal = true;
 
@@ -1263,6 +1331,27 @@ class WebInstallerOptions extends WebInstallerPage {
                        $this->setVar( 'wgRightsIcon', '' );
                }
 
+               $skinsAvailable = $this->parent->findExtensions( 'skins' );
+               $skinsToInstall = array();
+               foreach ( $skinsAvailable as $skin ) {
+                       $this->parent->setVarsFromRequest( array( "skin-$skin" ) );
+                       if ( $this->getVar( "skin-$skin" ) ) {
+                               $skinsToInstall[] = $skin;
+                       }
+               }
+               $this->parent->setVar( '_Skins', $skinsToInstall );
+
+               if ( !$skinsToInstall && $skinsAvailable ) {
+                       $this->parent->showError( 'config-skins-must-enable-some' );
+                       $retVal = false;
+               }
+               $defaultSkin = $this->getVar( 'wgDefaultSkin' );
+               $skinsToInstallLowercase = array_map( 'strtolower', $skinsToInstall );
+               if ( $skinsToInstall && array_search( $defaultSkin, $skinsToInstallLowercase ) === false ) {
+                       $this->parent->showError( 'config-skins-must-enable-default' );
+                       $retVal = false;
+               }
+
                $extsAvailable = $this->parent->findExtensions();
                $extsToInstall = array();
                foreach ( $extsAvailable as $ext ) {
index 1c0af17..7edb97c 100644 (file)
        "config-help-restart": "هل تريد إزالة البيانات المحفوظة التي قد قمت بإدخالها وإعادة تشغيل عملية التثبيت؟",
        "config-restart": "نعم، إعادة التشغيل",
        "config-env-php": "بي إتش بي $1 مثبت.",
-       "config-env-php-toolow": "بي إتش بي $1 مثبت.\nومع ذلك، يتطلب ميدياويكي بي إتش بي $2 أو أعلى.",
        "config-db-type": "نوع قاعدة البيانات:",
        "config-db-wiki-settings": "حدِّد هذا الويكي",
+       "config-db-name": "اسم قاعدة البيانات",
        "config-db-username": "اسم مستخدم قاعدة البيانات:",
        "config-db-password": "كلمة سر قاعدة البيانات:",
        "config-db-port": "منفذ قاعدة البيانات:",
+       "config-db-schema": "سكيما لميدياويكي",
        "config-type-mysql": "ماي إس كيو إل",
        "config-type-postgres": "بوستجر إس كيو إل",
        "config-type-sqlite": "إس كيو لايت",
        "config-type-oracle": "أوراكل",
+       "config-header-mysql": "إعدادات MySQL",
+       "config-header-postgres": "إعدادات PostgreSQL",
+       "config-header-sqlite": "إعدادات SQLite",
+       "config-header-oracle": "إعدادات أوراكل",
+       "config-invalid-db-type": "نوع قاعدة بيانات غير صحيح",
+       "config-mysql-engine": "محرك التخزين",
+       "config-mysql-innodb": "إنو دي بي",
+       "config-mysql-myisam": "ماي إسام",
+       "config-mysql-binary": "ثنائي",
+       "config-mysql-utf8": "يو تي إف-8",
        "config-site-name": "اسم الويكي:",
+       "config-site-name-blank": "أدخل اسم موقع.",
+       "config-project-namespace": "نطاق المشروع:",
+       "config-ns-generic": "المشروع",
+       "config-ns-site-name": "مثل اسم الويكي: $1",
+       "config-ns-other": "أخرى (حدد)",
+       "config-ns-other-default": "ماي ويكي",
+       "config-admin-box": "حساب إداري",
        "config-admin-name": "اسم المستخدم:",
        "config-admin-password": "كلمة السر:",
        "config-admin-password-confirm": "كلمة المرور مرة أخرى:",
+       "config-admin-name-blank": "أدخل اسم مستخدم لإداري.",
        "config-admin-email": "عنوان البريد الإلكتروني:",
        "config-optional-continue": "اسألني المزيد من الأسئلة",
        "config-optional-skip": "إنني أشعر بالملل بالفعل، فقط قم بتثبيت الويكي",
+       "config-profile": "ملف صلاحيات المستخدم:",
        "config-profile-wiki": "افتح ويكي",
+       "config-profile-no-anon": "إنشاء الحساب مطلوب",
        "config-profile-private": "ويكي خاص",
+       "config-license": "حقوق النسخ والترخيص:",
+       "config-license-none": "لا تذييل ترخيص",
+       "config-license-cc-by-sa": "المشاع الإبداعي النسبة للمؤلف المشاركة بالمثل",
+       "config-license-cc-by": "المشاع الإبداعي النسبة للمؤلف",
+       "config-license-cc-by-nc-sa": "المشاع الإبداعي النسبة للمؤلف غير تجاري المشاركة بالمثل",
        "config-license-pd": "ملكية عامة",
        "config-email-settings": "إعدادات البريد الإلكتروني",
+       "config-email-usertalk": "فعل إخطارات صفحات نقاش المستخدمين",
        "config-email-watchlist": "تمكين إشعارات قائمة المراقبة",
+       "config-email-sender": "يرجع عنوان البريد الإلكتروني:",
+       "config-upload-settings": "الصور وتحميل الملفات",
        "config-upload-enable": "تمكين تحميل الملفات",
+       "config-logo": "مسار الشعار:",
        "config-cc-again": "اختر مجددًا",
+       "config-advanced-settings": "ضبط متقدم",
        "config-extensions": "امتدادات",
+       "config-skins": "الواجهات",
+       "config-skins-use-as-default": "استخدم هذه الواجهة كافتراضية",
        "config-install-step-done": "نفذ",
        "config-install-step-failed": "فشل",
+       "config-install-extensions": "متضمنا الامتدادات",
+       "config-install-database": "إنشاء قاعدة البيانات",
+       "config-install-schema": "إنشاء السكيما",
+       "config-install-user": "إنشاء مستخدم قاعدة البيانات",
+       "config-install-user-alreadyexists": "المستخدم \"$1\" موجود بالفعل",
+       "config-install-user-create-failed": "إنشاء مستخدم \"$1\" فشل:$2",
+       "config-install-tables": "إنشاء الجداول",
+       "config-install-keys": "توليد المفاتيح السرية",
        "config-help": "مساعدة",
        "mainpagetext": "'''تم تثبيت ميدياويكي بنجاح.'''",
        "mainpagedocfooter": "استشر [//meta.wikimedia.org/wiki/Help:Contents دليل المستخدم] لمعلومات حول استخدام برنامج الويكي.\n\n== البداية ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings قائمة إعدادات الضبط]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ أسئلة متكررة حول ميدياويكي]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce القائمة البريدية الخاصة بإصدار ميدياويكي]"
index 376a227..79e16f1 100644 (file)
@@ -51,7 +51,6 @@
        "config-env-good": "Асяродзьдзе было праверанае.\nВы можаце ўсталёўваць MediaWiki.",
        "config-env-bad": "Асяродзьдзе было праверанае.\nУсталяваньне MediaWiki немагчымае.",
        "config-env-php": "Усталяваны PHP $1.",
-       "config-env-php-toolow": "Усталяваны PHP $1.\nАле MediaWiki патрабуе PHP вэрсіі $2 ці навейшай.",
        "config-unicode-using-utf8": "Выкарыстоўваецца бібліятэка Unicode-нармалізацыі Браяна Вібэра",
        "config-unicode-using-intl": "Выкарыстоўваецца [http://pecl.php.net/intl intl пашырэньне з PECL] для Unicode-нармалізацыі",
        "config-unicode-pure-php-warning": "'''Папярэджаньне''': [http://pecl.php.net/intl Пашырэньне intl з PECL] — ня слушнае для Unicode-нармалізацыі, цяпер выкарыстоўваецца марудная PHP-рэалізацыя.\nКалі ў Вас сайт з высокай наведваемасьцю, раім пачытаць пра [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-нармалізацыю].",
@@ -59,7 +58,8 @@
        "config-no-db": "Немагчыма знайсьці адпаведны драйвэр базы зьвестак. Вам неабходна ўсталяваць драйвэр базы зьвестак для PHP.\nПадтрымліваюцца наступныя тыпы базаў зьвестак: $1.\n\nКалі вы скампілявалі PHP самастойна, зьмяніце канфігурацыю, каб уключыць кліента базы зьвестак, напрыклад, з дапамогай <code>./configure --with-mysqli</code>.\nКалі вы ўсталявалі 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>.'''\n'''Адключыце яе, калі можаце.'''\nMediaWiki будзе працаваць, але гэта панізіць узровень бясьпекі сэрвэра.",
+       "config-register-globals-error": "<strong>Памылка: парамэтар PHP <code>[http://php.net/register_globals register_globals]</code> уключаны.\nЁн павінен быць адключаны, каб працягнуць усталяваньне.</strong>\nГлядзіце [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] дзеля дапамогі, як зрабіць гэта.",
+       "config-magic-quotes-gpc": "<strong>Непапраўная памылка: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] актываваны!</strong>\nГэтая функцыя псуе ўвод зьвестак непрадказальным чынам.\nВы ня можаце ўсталяваць або выкарыстоўваць MediaWiki, пакуль гэтая функцыя ня будзе адключаная.",
        "config-magic-quotes-runtime": "'''Фатальная памылка: уключаная опцыя PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]!'''\nГэтая опцыя псуе ўводны паток зьвестак непрадказальным чынам.\nПрацяг усталяваньня альбо выкарыстаньне MediaWiki без адключэньня гэтай опцыі немагчымыя.",
        "config-magic-quotes-sybase": "'''Фатальная памылка: рэжым [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] уключаны!'''\nГэты рэжым шкодзіць уваходныя зьвесткі непрадказальным чынам.\nПрацяг усталяваньня альбо выкарыстаньне MediaWiki немагчымыя, пакуль рэжым ня будзе выключаны.",
        "config-mbstring": "'''Фатальная памылка: рэжым [http://www.php.net/manual/en/ref.info.php#mbstring.overload mbstring.func_overload] уключаны!'''\nГэты рэжым выклікае памылкі і можа шкодзіць зьвесткі непрадказальным чынам.\nПрацяг усталяваньня альбо выкарыстаньне MediaWiki немагчымыя, пакуль рэжым ня будзе выключаны.",
@@ -70,6 +70,7 @@
        "config-memory-raised": "Абмежаваньне на даступную для PHP памяць <code>memory_limit</code> было падвышанае з $1 да $2.",
        "config-memory-bad": "'''Папярэджаньне:''' памер PHP <code>memory_limit</code> складае $1.\nВерагодна, гэта вельмі мала.\nУсталяваньне можа быць няўдалым!",
        "config-ctype": "'''Фатальная памылка''': PHP мусіць быць скампіляваны з падтрымкай [http://www.php.net/manual/en/ctype.installation.php пашырэньня Ctype].",
+       "config-iconv": "<strong>Непапраўная памылка:</strong> PHP мусіць быць скампіляваны з падтрымкай [http://www.php.net/manual/en/iconv.installation.php пашырэньня iconv].",
        "config-json": "<strong>Крытычная памылка:</strong> PHP быў скампіляваны без падтрымкі JSON.\nВы павінныя ўсталяваць або пашырэньне PHP JSON, або пашырэньне [http://pecl.php.net/package/jsonc PECL jsonc] перад усталёўкай MediaWiki.\n* Пашырэньне PHP уваходзіць у Red Hat Enterprise Linux (CentOS) 5 і 6, пры гэтым павінна быць падключана ў <code>/etc/php.ini</code> або <code>/etc/php.d/json.ini</code>.\n* Некаторыя дыстрыбутывы Linux, выдадзеныя пасьля траўня 2013 году, ня маюць пашырэньня PHP, замест яго пакуюць пашырэньне PECL як <code>php5-json</code> або <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] усталяваны",
        "config-apc": "[http://www.php.net/apc APC] усталяваны",
        "config-license-gfdl": "GNU Free Documentation License 1.3 ці болей позьняя",
        "config-license-pd": "Грамадзкі набытак",
        "config-license-cc-choose": "Выберыце іншую ліцэнзію Creative Commons",
-       "config-license-help": "Шматлікія адкрытыя вікі публікуюць увесь унёсак у праект на ўмовах [http://freedomdefined.org/Definition вольнай ліцэнзіі].\nГэта дазваляе ствараць эфэкт супольнай уласнасьці і садзейнічае доўгатэрміноваму ўнёску.\nДля прыватных і карпаратыўных вікі гэта не зьяўляецца неабходнасьцю.\n\nКалі Вы жадаеце выкарыстоўваць тэкст зь Вікіпэдыі, і жадаеце, каб Вікіпэдыя магла прымаць тэксты, скапіяваныя з Вашай вікі, Вам неабходна выбраць ліцэнзію '''Creative Commons Attribution Share Alike'''.\n\nРаней Вікіпэдыя выкарыстоўвала ліцэнзію GNU Free Documentation.\nЯна ўсё яшчэ дзейнічае, але яна ўтрымлівае некаторыя моманты,\nякія ўскладняюць паўторнае выкарыстоўваньне і інтэрпрэтацыю матэрыялаў.",
+       "config-license-help": "Шматлікія адкрытыя вікі публікуюць увесь унёсак у праект на ўмовах [http://freedomdefined.org/Definition вольнай ліцэнзіі].\nГэта дазваляе ствараць эфэкт супольнай уласнасьці і садзейнічае доўгатэрміноваму ўнёску.\nДля прыватных і карпаратыўных вікі гэта не зьяўляецца неабходнасьцю.\n\nКалі Вы жадаеце выкарыстоўваць тэкст зь Вікіпэдыі, і жадаеце, каб Вікіпэдыя магла прымаць тэксты, скапіяваныя з Вашай вікі, Вам неабходна выбраць ліцэнзію <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nРаней Вікіпэдыя выкарыстоўвала ліцэнзію GNU Free Documentation.\nЯна ўсё яшчэ дзейнічае, але яна ўтрымлівае некаторыя моманты, якія ўскладняюць паўторнае выкарыстаньне і інтэрпрэтацыю матэрыялаў.",
        "config-email-settings": "Налады электроннай пошты",
        "config-enable-email": "Дазволіць выходзячыя электронныя лісты",
        "config-enable-email-help": "Калі Вы жадаеце, каб працавала электронная пошта, неабходна сканфігураваць PHP [http://www.php.net/manual/en/mail.configuration.php адпаведным чынам].\nКалі Вы не жадаеце выкарыстоўваць магчымасьці электроннай пошты, Вы можаце яе адключыць.",
        "config-memcache-badport": "Нумар порту Memcached павінен быць паміж $1 і $2",
        "config-extensions": "Пашырэньні",
        "config-extensions-help": "Пашырэньні пададзеныя вышэй, былі знойдзеныя ў Вашай дырэкторыі <code>./extensions</code>.\n\nЯны могуць патрабаваць дадатковых наладаў, але іх можна ўключыць зараз",
+       "config-skins": "Тэмы афармленьня",
+       "config-skins-help": "Пералічаныя вышэй тэмы афармленьня знойдзеныя ў вашай тэчцы <code>./skins</code>. Вы мусіце ўключыць як мінімум адну, а таксама абраць тэму па змоўчаньні.",
        "config-install-alreadydone": "'''Папярэджаньне:''' здаецца, што Вы ўжо ўсталёўвалі MediaWiki і спрабуеце зрабіць гэтай зноў.\nКалі ласка, перайдзіце на наступную старонку.",
        "config-install-begin": "Пасьля націску кнопкі «{{int:config-continue}}» пачнецца ўсталяваньне MediaWiki.\nКалі Вы жадаеце што-небудзь зьмяніць, націсьніце кнопку «{{int:config-back}}».",
        "config-install-step-done": "зроблена",
index 1192e2c..880e974 100644 (file)
@@ -56,9 +56,9 @@
        "config-header-sqlite": "এসকিউলাইট সেটিংস",
        "config-header-oracle": "ওরাকল সেটিংস",
        "config-invalid-db-type": "ডেটাবেজের ধরন অগ্রহযোগ্য",
-       "config-missing-db-name": "আপনাকে অবশ্যই \"ডেটাবেজ নাম\"-এর জন্য একটি মান প্রবেশ করাতে হবে",
-       "config-missing-db-host": "আপনাকে অবশ্যই \"ডেটাবেজ হোস্ট\"-এর জন্য একটি মান প্রবেশ করাতে হবে",
-       "config-missing-db-server-oracle": "আপনাকে অবশ্যই \"ডেটাবেজ টিএনএস\"-এর জন্য একটি মান প্রবেশ করাতে হবে",
+       "config-missing-db-name": "আপনাকে অবশ্যই \"{{int:config-db-name}}\"-এর জন্য একটি মান প্রবেশ করাতে হবে।",
+       "config-missing-db-host": "আপনাকে অবশ্যই \"{{int:config-db-host}}\"-এর জন্য একটি মান প্রবেশ করাতে হবে।",
+       "config-missing-db-server-oracle": "আপনাকে অবশ্যই \"{{int:config-db-host-oracle}}\"-এর জন্য একটি মান প্রবেশ করাতে হবে।",
        "config-connection-error": "$1।\n\n\nদয়া করে প্রস্তাবকারী, ব্যবহারকারী নাম ও শব্দচাবি দেখুন এবং পুনরায় চেষ্টা করুন।",
        "config-mysql-engine": "সংরক্ষণ ইঞ্জিন:",
        "config-mysql-innodb": "ইনোডিবি",
index f4b75db..c2aaf64 100644 (file)
        "config-env-good": "Gwiriet eo bet an endro.\nGallout a rit staliañ MediaWiki.",
        "config-env-bad": "Gwiriet eo bet an endro.\nNe c'hallit ket staliañ MediaWiki.",
        "config-env-php": "Staliet eo PHP $1.",
-       "config-env-php-toolow": "Staliet eo PHP $1.\nNemet eo rekis PHP $2 pe nevesoc'h evit MediaWiki.",
        "config-unicode-using-utf8": "Oc'h implijout utf8_normalize.so gant Brion Vibber evit ar reolata Unicode.",
        "config-unicode-using-intl": "Oc'h implijout [http://pecl.php.net/intl an astenn PECL intl] evit ar reolata Unicode.",
        "config-unicode-pure-php-warning": "'''Diwallit''' : N'haller ket kaout an [http://pecl.php.net/intl intl PECL astenn] evit merañ reoladur Unicode, a zistro d'ar stumm gorrek emplementet e-PHP.\nMa lakait da dreiñ ul lec'hienn darempredet-stank e vo mat deoc'h lenn un tammig bihan diwar-benn se war [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization]. (e saozneg)",
        "config-unicode-update-warning": "'''Diwallit''': ober a ra stumm staliet endalc'her skoueriekaat Unicode gant ur stumm kozh eus [http://site.icu-project.org/ levraoueg meziantoù ar raktres ICU].\nDleout a rafec'h [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations hizivaat] ma seblant deoc'h bezañ pouezus ober gant Unicode.",
        "config-no-db": "N'eus ket bet gallet kavout ur sturier diazoù roadennoù a zere ! Ret eo deoc'h staliañ ur sturier diazoù roadennoù evit PHP.\nSkoret eo an diazoù roadennoù da-heul : $1.\n\nMa rit gant un herberc'hiañ kenrannet, goulennit digant ho herberc'hier staliañ ur sturier diaz roadennoù azas.\nMa kempunit PHP c'hwi hoc'h-unan, adkeflugnit-eñ en ur weredekaat un arval diaz roadennoù, da skouer en ur ober gant <code>./configure --mysql</code>.\nM'hoc'h eus staliet PHP adalek ur pakad Debian pe Ubuntu, eo ret deoc'h staliañ ar vodulenn php5-mysql ivez.",
        "config-no-fts3": "'''Diwallit ''': Kempunet eo SQLite hep ar [//sqlite.org/fts3.html vodulenn FTS3]; ne vo ket posupl ober gant an arc'hwelioù klask er staliadur-mañ",
-       "config-register-globals": "'''Diwallit : Gweredekaet eo dibarzh <code>[http://php.net/register_globals register_globals]</code> PHP.'''\n'''Diweredekait anezhañ ma c'hallit.'''\nMont a raio MediaWiki en-dro met fazioù surentez a c'hallo c'hoari war ho servijer",
        "config-magic-quotes-runtime": "'''Fazi groñs : gweredekaet eo [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] !'''\nBreinañ a ra an dibarzh-mañ ar roadennoù en ur mod dic'hortoz.\nN'hallit ket staliañ pe ober gant MediaWiki e-keit ha m'eo gweredekaet an dibarzh-se.",
        "config-magic-quotes-sybase": "'''Fazi groñs : gweredekaet eo [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] !'''\nBreinañ a ra an dibarzh-mañ ar roadennoù en ur mod dic'hortoz.\nN'hallit ket staliañ pe ober gant MediaWiki e-keit ha m'eo gweredekaet an dibarzh-se.",
        "config-mbstring": "'''Fazi groñs : gweredekaet eo [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] !'''\nDegas a ra an dibarzh-mañ fazioù ha gallout a ra breinañ ar roadennoù en ur mod dic'hortoz.\nN'hallit ket staliañ pe ober gant MediaWiki e-keit ha m'eo gweredekaet an dibarzh-se.",
        "config-memcache-badport": "Niverennoù porzh Memcached a zlefe bezañ etre $1 ha $2.",
        "config-extensions": "Astennoù",
        "config-extensions-help": "N'eo ket bet detektet an astennoù rollet a-us en ho kavlec'h <code>./astennoù</code>.\n\nMarteze e vo ezhomm kefluniañ pelloc'h met gallout a rit o gweredekaat bremañ.",
+       "config-skins": "Gwiskadurioù",
+       "config-skins-use-as-default": "Implijout ar gwiskadur-mañ dre ziouer",
+       "config-skins-must-enable-some": "Ret eo deoc'h dibab da nebautañ ur gwiskadur da weredekaat.",
+       "config-skins-must-enable-default": "Ar gwiskadur dre ziouer dibabet a rank bezañ gweredekaet.",
        "config-install-alreadydone": "'''Diwallit''': Staliet hoc'h eus MediaWiki dija war a seblant hag emaoc'h o klask e staliañ c'hoazh.\nKit d'ar bajenn war-lerc'h, mar plij.",
        "config-install-begin": "Pa vo bet pouezet ganeoc'h war \"{{int:config-continue}}\"  e krogo staliadur MediaWiki.\nPouezit war \"{{int:config-back}}\" mar fell deoc'h cheñch tra pe dra.",
        "config-install-step-done": "graet",
index c1960fb..e8db404 100644 (file)
@@ -5,9 +5,30 @@
                ]
        },
        "config-information": "Impormasyon",
+       "config-your-language": "A kanimong sarita:",
+       "config-wiki-language": "Sarita ka Wiki:",
+       "config-back": "← Bumalik",
+       "config-continue": "Magpadagos →",
+       "config-page-language": "Sarita",
        "config-page-welcome": "Dagos sa MediaWiki!",
        "config-page-name": "Ngaran",
+       "config-page-options": "Mga pipilian",
+       "config-page-install": "Ikabit",
+       "config-page-complete": "Tapos!",
+       "config-page-readme": "Basahon ako",
+       "config-page-copying": "Kinokopya",
        "config-restart": "Amo, uliton adi",
+       "config-diff3-bad": "Diri nataurakan a GNU diff3.",
+       "config-db-type": "Klase ka database:",
+       "config-db-host": "Host ka database:",
+       "config-db-host-oracle": "Database ka TNS:",
+       "config-db-wiki-settings": "Mibdiron adin wiki",
+       "config-db-name": "Ngaran ka database:",
+       "config-db-port": "Port ka database:",
+       "config-db-schema": "Skema para sa MediaWiki:",
+       "config-sqlite-dir": "Direktoryo ka data sa SQLite:",
+       "config-oracle-def-ts": "Dating tablescape:",
+       "config-oracle-temp-ts": "Temporaryong tablescape:",
        "config-profile-wiki": "Bukas na wiki",
        "config-profile-private": "Pribadong wiki",
        "config-logo": "URL ko logo:",
index 3870ef9..5d65f2d 100644 (file)
        "config-diff3-bad": "No s'ha trobat el GNU diff3.",
        "config-git": "S'ha trobat el programari de control de versions Git: <code>$1</code>.",
        "config-git-bad": "No s'ha trobat el programari de control de versions Git.",
+       "config-no-scaling": "No s'ha pogut trobar la biblioteca GD o ImageMagick.\nS'inhabilitaran les miniatures de les imatges.",
        "config-no-uri": "'''Error:''' No s'ha pogut determinar l'URI actual. S'ha interromput la instal·lació.",
        "config-no-cli-uri": "'''Avís:''' No s'ha especificat un <code>--scriptpath</code>. S'utilitza el valor per defecte: <code>$1</code>.",
        "config-using-server": "S'utilitza el nom del servidor «<nowiki>$1</nowiki>».",
        "config-using-uri": "S'utilitza l'URL del servidor «<nowiki>$1$2</nowiki>».",
+       "config-uploads-not-safe": "<strong>Avís:</strong> El directori de càrregues per defecte <code>$1</code> és vulnerable a l'execució d'scripts arbitraris.\nEncara que el MediaWiki comprova tots els fitxers que es carreguen davant d'amenaces de seguretat, és molt recomanable [//www.mediawiki.org/ wiki/Special:MyLanguage/Manual:Security#Upload_security tancar aquesta vulnerabilitat de seguretat] abans d'habilitar les càrregues.",
        "config-db-type": "Tipus de base de dades:",
        "config-db-host": "Servidor de la base de dades:",
        "config-db-wiki-settings": "Identifica aquest wiki",
@@ -92,6 +94,7 @@
        "config-missing-db-name": "Heu d'introduir un valor per a «{{int:config-db-name}}».",
        "config-missing-db-host": "Heu d'introduir un valor per a «{{int:config-db-host}}».",
        "config-missing-db-server-oracle": "Heu d’introduir un valor per a «{{int:config-db-host-oracle}}».",
+       "config-db-sys-user-exists-oracle": "El compte d’usuari «$1» ja existeix. SYSDBA només es pot fer servir per crear comptes nous.",
        "config-sqlite-readonly": "El fitxer <code>$1</code> no es pot escriure.",
        "config-sqlite-cant-create-db": "No s'ha pogut crear el fitxer de base de dades <code>$1</code>.",
        "config-upgrade-done-no-regenerate": "S'ha completat l'actualització.\n\nJa podeu [$1 començar a utilitzar el wiki].",
        "config-upload-deleted": "Directori pels arxius suprimits:",
        "config-logo": "URL del logo:",
        "config-instantcommons": "Habilita Instant Commons",
+       "config-cc-error": "El selector de llicència Creative Commons no ha donat cap resultat.\nIntroduïu la llicència manualment.",
        "config-cc-again": "Torneu-ho a triar...",
        "config-cc-not-chosen": "Trieu quina llicència Creative Commons voleu i feu clic a «procedeix».",
        "config-advanced-settings": "Configuració avançada",
        "config-cache-options": "Configuració per a la memòria cau dels objectes:",
+       "config-cache-help": "L'encauament d'objectes s'utilitza per a millorar la rapidesa del MediaWiki afegint a la memòria cau les dades que s'utilitzen de forma freqüent. És recomanable que els llocs web mitjans o grans ho habilitin. També els llocs web petits en veuran els beneficis.",
+       "config-cache-none": "Sense encauament (no se suprimeix cap funcionalitat, però la velocitat pot veure's afectada en els llocs wiki més grans)",
        "config-memcached-servers": "Servidors de Memcache:",
        "config-extensions": "Extensions",
        "config-install-step-done": "fet",
        "config-install-extensions": "S'estan incloent les extensions",
        "config-install-database": "S'està configurant la base de dades",
        "config-install-schema": "S'està creant l'esquema",
+       "config-install-pg-schema-not-exist": "No existeix un esquema PostgreSQL.",
+       "config-install-pg-schema-failed": "La creació de les taules ha fallat.\nAssegureu-vos que l'usuari «$1» pot escriure a l'esquema «$2».",
        "config-install-pg-commit": "S'estan trametent els canvis",
        "config-install-user": "S'està creant l'usuari de la base de dades",
        "config-install-user-alreadyexists": "L'usuari «$1» ja existeix",
index 56b2732..0cffa94 100644 (file)
        "config-enable-email": "Латае дӀайохьуьйту e-mail",
        "config-upload-deleted": "ДӀаяхна файлийн директори:",
        "config-cc-again": "Хьаржа кхин цӀа…",
+       "config-skins": "Кечяран тема",
+       "config-skins-use-as-default": "ХӀара тема Ӏад йитарца лелае",
+       "config-skins-must-enable-some": "Ахьа цхьаъ мукъа тема латина йита езаш ю.",
+       "config-skins-must-enable-default": "Ӏад йитарца йолу тема латина хила еза.",
        "config-install-user": "Декъашхочун хаамийн база кхоллар",
        "config-install-user-alreadyexists": "Декъашхо «$1» хӀинцале волуш ву",
        "config-install-user-create-failed": "Декъашхо «$1» кхолла цаделира: $2",
index 307faf3..0510bfc 100644 (file)
@@ -60,6 +60,7 @@
        "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-error": "<strong>Chyba: PHP nastavení <code>[http://php.net/register_globals register_globals]</code> je zapnuto. Pro pokračování v instalaci musí být vypnuto.</strong>\nRady, jak toho dosáhnout, najdete na [https://www.mediawiki.org/wiki/Register_globals https://www.mediawiki.org/wiki/register_globals].",
+       "config-magic-quotes-gpc": "<strong>Kritická chyba: Je zapnuto [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc]!</strong>\nToto nastavení nepředvídatelně poškozuje vstupní data.\nMediaWiki nelze nainstalovat ani používat, dokud není toto nastavení vypnuto.",
        "config-magic-quotes-runtime": "'''Kritická chyba: Je zapnuto [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]!'''\nToto nastavení nepředvídatelně poškozuje vstupní data.\nMediaWiki 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]!'''\nToto nastavení nepředvídatelně poškozuje vstupní data.\nMediaWiki 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]!'''\nToto nastavení způsobuje chyby a může nepředvídatelně poškozovat vstupní data.\nMediaWiki nelze nainstalovat ani používat, dokud není toto nastavení vypnuto.",
@@ -70,6 +71,7 @@
        "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.\nTo je pravděpodobně příliš málo.\nInstalace 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-iconv": "'''Kritická chyba''': PHP musí být přeloženo s podporou pro [http://www.php.net/manual/en/iconv.installation.php rozšíření iconv].",
        "config-json": "'''Kritická chyba:''' PHP bylo přeloženo bez podpory JSON.\nPřed instalací MediaWiki musíte buď nainstalovat rozšíření PHP JSON nebo rozšíření [http://pecl.php.net/package/jsonc PECL jsonc].\n* Rozšíření PHP je součástí Red Hat Enterprise Linux (CentOS) 5 a 6, avšak musí se povolit v <code>/etc/php.ini</code> nebo <code>/etc/php.d/json.ini</code>.\n* V některých linuxových distribucích vydaných po květnu 2013 může toto rozšíření PHP chybět a místo toho mohou používat rozšíření PECL jako <code>php5-json</code> nebo <code>php-pecl-jsonc</code>.",
        "config-xcache": "Je nainstalována [http://xcache.lighttpd.net/ XCache]",
        "config-apc": "Je nainstalováno [http://www.php.net/apc APC]",
        "config-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í].\nTo pomáhá vytvořit duch komunitního vlastnictví a povzbuzuje dlouhodobé přispívání.\nTo obecně není potřeba u soukromé nebo firemní wiki.\n\nPokud 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'''.\n\nDříve Wikipedie používala GNU Free Documentation License.\nGFDL je platná licence, ale složité jí porozumět.\nTaké je komplikované používat obsah licencovaný pod GFDL.",
+       "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í].\nTo pomáhá vytvořit duch komunitního vlastnictví a povzbuzuje dlouhodobé přispívání.\nTo obecně není potřeba u soukromé nebo firemní wiki.\n\nPokud 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 <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nDříve Wikipedie používala GNU Free Documentation License.\nGFDL je platná licence, ale složité jí porozumět.\nTaké 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].\nPokud nechcete žádné e-mailové funkce, můžete je zde vypnout.",
        "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>.\n\nMohou vyžadovat dodatečnou konfiguraci, ale teď je můžete povolit.",
+       "config-skins": "Vzhledy",
+       "config-skins-help": "Ve vašem adresáři <code>./skins</code> byly nalezeny výše uvedené vzhledy. Musíte nejméně jeden z nich povolit a některý vybrat jako výchozí.",
+       "config-skins-use-as-default": "Tento vzhled používat jako výchozí",
+       "config-skins-missing": "Nebyly nalezeny žádné vzhledy; MediaWiki bude používat nouzový vzhled, dokud nenainstalujete nějaké plnohodnotné.",
+       "config-skins-must-enable-some": "Musíte povolit alespoň jeden vzhled.",
+       "config-skins-must-enable-default": "Vzhled vybraný jako výchozí musí být povolen.",
        "config-install-alreadydone": "'''Upozornění:''' Vypadá to, že jste MediaWiki již nainstalovali a teď se o to pokoušíte znovu.\nPokračujte na další stránku.",
        "config-install-begin": "Stisknutím „{{int:config-continue}}“ spustíte instalaci MediaWiki.\nPokud ještě chcete udělat nějaké změny, stiskněte „{{int:config-back}}“.",
        "config-install-step-done": "hotovo",
index f172355..532d7c1 100644 (file)
@@ -66,6 +66,7 @@
        "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, sodass keine Suchfunktionen für dieses Datenbanksystem zur Verfügung stehen werden.",
        "config-register-globals-error": "<strong>Fehler: Die PHP-Option <code>[http://php.net/register_globals register_globals]</code> ist aktiviert.\nSie muss deaktiviert sein, um mit der Installation fortzufahren.</strong>\nSiehe [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] für Hilfe.",
+       "config-magic-quotes-gpc": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] ist aktiv!</strong>\nDiese Option beschädigt eingegebene Daten unvorhersehbar.\nDu kannst MediaWiki nicht installieren oder verwenden, bis diese Option deaktiviert ist.",
        "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!'''\nDiese Einstellung führt zu unvorhersehbaren Problemen bei der Dateneingabe.\nMediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
        "config-magic-quotes-sybase": "<strong>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!</strong>\nDiese Einstellung führt zu unvorhersehbaren Problemen bei der Dateneingabe.\nMediaWiki 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!'''\nDiese Einstellung verursacht Fehler und führt zu unvorhersehbaren Problemen bei der Dateneingabe.\nMediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
@@ -76,6 +77,7 @@
        "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.\nDieser Wert ist wahrscheinlich zu niedrig.\nDer Installationsvorgang könnte eventuell 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-iconv": "<strong>Fatal:</strong> PHP muss mit Support für die [http://www.php.net/manual/en/iconv.installation.php iconv-Erweiterung] kompiliert werden.",
        "config-json": "<strong>Fataler Fehler:</strong> PHP wurde ohne Unterstützung für JSON kompiliert.\nVor der Installation von MediaWiki muss entweder die PHP-JSON- oder die [http://pecl.php.net/package/jsonc PECL-jsonc]-Erweiterung installieren werden.\n* Die PHP-Erweiterung ist in Red Hat Enterprise Linux (CentOS) 5 und 6 enthalten, muss jedoch in <code>/etc/php.ini</code> oder <code>/etc/php.d/json.ini</code> aktiviert werden.\n* Einige Linux-Distributionen, die nach Mai 2013 veröffentlicht wurden, nutzen nicht mehr die PHP-Erweiterung, sondern stattdessen die PECL-Erweiterung als <code>php5-json</code> oder <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] ist installiert",
        "config-apc": "[http://www.php.net/apc APC] ist installiert",
        "config-license-gfdl": "GNU-Lizenz für freie Dokumentation 1.3 oder höher",
        "config-license-pd": "Gemeinfreiheit",
        "config-license-cc-choose": "Eine benutzerdefinierte Creative-Commons-Lizenz auswählen",
-       "config-license-help": "Viele öffentliche Wikis publizieren alle Beiträge unter einer [http://freedomdefined.org/Definition/De freien Lizenz.]\nDies trägt dazu bei, ein Gefühl von Gemeinschaft zu schaffen, und ermutigt zu längerfristiger Mitarbeit.\nHingegen ist im Allgemeinen eine freie Lizenz auf geschlossenen Wikis nicht notwendig.\n\nSofern man Texte aus der Wikipedia verwenden möchte und umgekehrt, sollte die ''Creative-Commons''-Lizenz „Namensnennung – Weitergabe unter gleichen Bedingungen“ gewählt werden.\n\nDie Wikipedia nutzte vormals die GNU-Lizenz für freie Dokumentation (GFDL).\nDie GFDL ist eine gültige Lizenz, die allerdings schwer zu verstehen ist.\nEs ist zudem schwierig, gemäß dieser Lizenz lizenzierte Inhalte wiederzuverwenden.",
+       "config-license-help": "Viele öffentliche Wikis publizieren alle Beiträge unter einer [http://freedomdefined.org/Definition/De freien Lizenz.]\nDies trägt dazu bei, ein Gefühl von Gemeinschaft zu schaffen, und ermutigt zu längerfristiger Mitarbeit.\nHingegen ist im Allgemeinen eine freie Lizenz auf geschlossenen Wikis nicht notwendig.\n\nSofern man Texte aus der Wikipedia verwenden möchte und umgekehrt, sollte die Lizenz {{int:config-license-cc-by-sa}} gewählt werden.\n\nDie Wikipedia nutzte vormals die GNU-Lizenz für freie Dokumentation (GFDL).\nDie GFDL ist eine gültige Lizenz, die allerdings schwer zu verstehen ist.\nEs ist zudem schwierig, gemäß dieser Lizenz lizenzierte Inhalte wiederzuverwenden.",
        "config-email-settings": "E-Mail-Einstellungen",
        "config-enable-email": "Ausgehende E-Mails ermöglichen",
        "config-enable-email-help": "Sofern die E-Mail-Funktionen genutzt werden sollen, müssen die entsprechenden [http://www.php.net/manual/en/mail.configuration.php PHP-E-Mail-Einstellungen] richtig konfiguriert werden.\nFür den Fall, dass die E-Mail-Funktionen nicht benötigt werden, können sie hier deaktiviert werden.",
        "config-memcache-badport": "Der Ports für den Memcached Cacheserver sollten zwischen $1 und $2 liegen",
        "config-extensions": "Erweiterungen",
        "config-extensions-help": "Die obig angegebenen Erweiterungen wurden im Verzeichnis <code>./extensions</code> gefunden.\n\nEs könnten zusätzliche Konfigurierungen zu einzelnen Erweiterungen erforderlich sein, dennoch können sie aber bereits jetzt aktiviert werden.",
+       "config-skins": "Benutzeroberflächen",
+       "config-skins-help": "Die oben aufgeführten Benutzeroberflächen wurden im Verzeichnis <code>./skins</code> gefunden. Du musst mindestens eine aktivieren und als Standard auswählen.",
+       "config-skins-use-as-default": "Diese Benutzeroberfläche als Standard verwenden",
+       "config-skins-missing": "Es wurden keine Benutzeroberflächen gefunden. MediaWiki wird eine Fallback-Benutzeroberfläche verwenden, bis du andere Benutzeroberflächen installierst.",
+       "config-skins-must-enable-some": "Du musst mindestens eine zu aktivierende Benutzeroberfläche auswählen.",
+       "config-skins-must-enable-default": "Die ausgewählte Standard-Benutzeroberfläche muss aktiviert sein.",
        "config-install-alreadydone": "'''Warnung:''' Es wurde eine vorhandene MediaWiki-Installation gefunden.\nEs 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.\nSofern Änderungen vorgenommen werden sollen, kann man auf „{{int:config-back}}“ klicken.",
        "config-install-step-done": "erledigt",
index b6606a6..bd76ada 100644 (file)
@@ -52,6 +52,7 @@
        "config-outdated-sqlite": "<strong>Warning:</strong> you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.",
        "config-no-fts3": "<strong>Warning:</strong> SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
        "config-register-globals-error": "<strong>Error: PHP's <code>[http://php.net/register_globals register_globals]</code> option is enabled.\nIt must be disabled to continue with the installation.</strong>\nSee [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] for help on how to do so.",
+       "config-magic-quotes-gpc": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] is active!</strong>\nThis option corrupts data input unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
        "config-magic-quotes-runtime": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] is active!'</strong>\nThis option corrupts data input unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
        "config-magic-quotes-sybase": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] is active!</strong>\nThis option corrupts data input unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
        "config-mbstring": "<strong>Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is active!</strong>\nThis option causes errors and may corrupt data unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
@@ -62,6 +63,7 @@
        "config-memory-raised": "PHP's <code>memory_limit</code> is $1, raised to $2.",
        "config-memory-bad": "<strong>Warning:</strong> PHP's <code>memory_limit</code> is $1.\nThis is probably too low.\nThe installation may fail!",
        "config-ctype": "<strong>Fatal:</strong> PHP must be compiled with support for the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].",
+       "config-iconv": "<strong>Fatal:</strong> PHP must be compiled with support for the [http://www.php.net/manual/en/iconv.installation.php iconv extension].",
        "config-json": "<strong>Fatal:</strong> PHP was compiled without JSON support.\nYou must install either the PHP JSON extension or the [http://pecl.php.net/package/jsonc PECL jsonc] extension before installing MediaWiki.\n* The PHP extension is included in Red Hat Enterprise Linux (CentOS) 5 and 6, though must be enabled in <code>/etc/php.ini</code> or <code>/etc/php.d/json.ini</code>.\n* Some Linux distributions released after May 2013 omit the PHP extension, instead packaging the PECL extension as <code>php5-json</code> or <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] is installed",
        "config-apc": "[http://www.php.net/apc APC] is installed",
        "config-memcache-badport": "Memcached port numbers should be between $1 and $2.",
        "config-extensions": "Extensions",
        "config-extensions-help": "The extensions listed above were detected in your <code>./extensions</code> directory.\n\nThey may require additional configuration, but you can enable them now.",
+       "config-skins": "Skins",
+       "config-skins-help": "The skins listed above were detected in your <code>./skins</code> directory. You must enable at least one, and choose the default.",
+       "config-skins-use-as-default": "Use this skin as default",
+       "config-skins-missing": "No skins were found; MediaWiki will use a fallback skin until you install some proper ones.",
+       "config-skins-must-enable-some": "You must choose at least one skin to enable.",
+       "config-skins-must-enable-default": "The skin chosen as default must be enabled.",
        "config-install-alreadydone": "<strong>Warning:</strong> You seem to have already installed MediaWiki and are trying to install it again.\nPlease proceed to the next page.",
        "config-install-begin": "By pressing \"{{int:config-continue}}\", you will begin the installation of MediaWiki.\nIf you still want to make changes, press \"{{int:config-back}}\".",
        "config-install-step-done": "done",
index 99555cb..135a32b 100644 (file)
@@ -22,7 +22,9 @@
                        "Ihojose",
                        "Seb35",
                        "McDutchie",
-                       "Miguel2706"
+                       "Miguel2706",
+                       "Macofe",
+                       "AVIADOR"
                ]
        },
        "config-desc": "El instalador de MediaWiki",
@@ -74,6 +76,8 @@
        "config-no-db": "¡No fue posible encontrar un controlador adecuado para la base de datos! Necesitas instalar un controlador de base de datos para PHP.\nLos siguientes sistemas gestores de bases de datos están soportados: $1.\n\nSi compilaste PHP tú mismo, debes reconfigurarlo habilitando un cliente de base de datos, por ejemplo, usando <code>./configure --with-mysqli</code>.\nSi instalaste PHP desde un paquete Debian o Ubuntu, entonces también necesitas instalar, por ejemplo, el paquete <code>php5-mysql</code>.",
        "config-outdated-sqlite": "''' Advertencia ''': tiene la versión SQLite $1, que es inferior a la mínima versión requerida: $2 . SQLite no estará disponible.",
        "config-no-fts3": "'''Advertencia''': SQLite está compilado sin el [//sqlite.org/fts3.html módulo FTS3]. Las funcionalidades de búsqueda no estarán disponibles en esta instalación.",
+       "config-register-globals-error": "<strong>Error: la opción de PHP <code>[http://php.net/register_globals register_globals]</code> está activada.\nDebe estar desactivada para continuar con la instalación.</strong>\nVea [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] para obtener ayuda sobre cómo hacerlo.",
+       "config-magic-quotes-gpc": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] está activa!</strong>\nEsta opción corrompe la entrada de datos de forma impredecible.\nUsted no puede instalar o utilizar MediaWiki a menos que esta opción esté deshabilitada.",
        "config-magic-quotes-runtime": "'''Fatal: ¡[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está activada!'''\nEsta opción causa la imprevisible corrupción de la entrada de datos.\nNo puedes instalar o utilizar MediaWiki a menos que esta opción esté inhabilitada.",
        "config-magic-quotes-sybase": "'''Fatal: ¡[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está activada!'''\nEsta opción causa la imprevisible corrupción de la entrada de datos.\nNo puedes instalar o utilizar MediaWiki a menos que esta opción esté inhabilitada.",
        "config-mbstring": "'''Fatal: La opción [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está activada!'''\nEsta opción causa errores y puede corromper los datos de una forma imprevisible.\nNo se puede instalar o usar MediaWiki a menos que esta opción sea desactivada.",
@@ -84,6 +88,7 @@
        "config-memory-raised": "el parámetro <code>memory_limit</code> de PHP es $1, aumentada a $2.",
        "config-memory-bad": "'''Advertencia:''' El parámetro <code>memory_limit</code> de PHP es $1.\nProbablemente este valor es demasiado bajo.\n¡La instalación podrá fallar!",
        "config-ctype": "'''Fatal''': Se necesita compilar PHP con compatibilidad para la [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].",
+       "config-iconv": "<strong>Fatal:</strong> PHP debe ser compilado con soporte para la [http://www.php.net/manual/en/iconv.installation.php extensión iconv].",
        "config-json": "'''Fatal:''' PHP fue compilado sin soporte para JSON.\nDebes instalar la extensión JSON o la extensión [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar MediaWiki.\n* La extensión PHP se incluye en Red Hat Enterprise Linux (CentOS) 5 y 6, aunque debe habilitarse en <code>/etc/php.ini</code> o <code>/etc/php.d/json.ini</code>.\n* Algunas distribuciones Linux liberadas después de mayo del 2013 omiten la extensión PHP, y en su lugar disponen de la extensión PECL en el paquete <code>php5-json</code> o <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] está instalado",
        "config-apc": "[http://www.php.net/apc APC] está instalado",
        "config-license-gfdl": "Licencia de documentación libre de GNU 1.3 o posterior",
        "config-license-pd": "Dominio Público",
        "config-license-cc-choose": "Selecciona una licencia personalizada de Creative Commons",
-       "config-license-help": "Muchos wikis públicos ponen todas las contribuciones bajo una [http://freedomdefined.org/Definition licencia libre].\nEsto ayuda a crear un sentido de propiedad comunitaria y alienta la contribución a largo plazo.\nEsto no es generalmente necesario para un wiki privado o corporativo.\n\nSi desea poder utilizar texto de Wikipedia, y desea que Wikipedia pueda aceptar el texto copiado de tu wiki, debe elegir '''Creative Commons Reconocimiento Compartir Igual'''.\n\nWikipedia utilizaba anteriormente la licencia de documentación libre de GNU (GFDL).\nLa GFDL es una licencia válida, pero es difícil de entender.\nTambién es difícil reutilizar el contenido licenciado bajo la GFDL.",
+       "config-license-help": "Muchos wikis públicos ponen todas las contribuciones bajo una [http://freedomdefined.org/Definition licencia libre].\nEsto ayuda a crear un sentido de propiedad comunitaria y alienta la contribución a largo plazo.\nEsto no es generalmente necesario para un wiki privado o corporativo.\n\nSi deseas poder utilizar texto de Wikipedia, y deseas que Wikipedia pueda aceptar el texto copiado de tu wiki, debes elegir <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nWikipedia utilizaba anteriormente la licencia de documentación libre de GNU (GFDL).\nLa GFDL es una licencia válida, pero es difícil de entender.\nTambién es difícil reutilizar el contenido licenciado bajo la GFDL.",
        "config-email-settings": "Configuración de correo electrónico",
        "config-enable-email": "Activar el envío de correos electrónicos",
        "config-enable-email-help": "Si quieres que el correo electrónico funcione, la [http://www.php.net/manual/en/mail.configuration.php configuración PHP de correo electrónico] debe ser la correcta.\nSi no quieres la funcionalidad de correo electrónico, puedes desactivarla aquí.",
        "config-memcache-badport": "Los números de puerto de Memcached deben estar entre  $1  y  $2.",
        "config-extensions": "Extensiones",
        "config-extensions-help": "Se ha detectado en tu directorio <code>./extensions</code>  las extensiones listadas arriba.\n\nPuede que necesiten configuraciones adicionales, pero puedes habilitarlas ahora.",
+       "config-skins": "Apariencias",
+       "config-skins-help": "Las apariencias mencionadas anteriormente fueron detectadas en tu directorio <code>./skins</code>. Debes habilitar al menos una y elegir la predeterminada.",
+       "config-skins-use-as-default": "Utilizar esta apariencia como predeterminada",
+       "config-skins-missing": "No se encontró ninguna apariencia; MediaWiki utilizará una apariencia anterior hasta que instales unas apariencias adecuadas.",
+       "config-skins-must-enable-some": "Debes seleccionar al menos una apariencia para activar.",
+       "config-skins-must-enable-default": "La apariencia elegida como predeterminada debe estar habilitada.",
        "config-install-alreadydone": "'''Aviso:''' Parece que ya habías instalado MediaWiki y estás intentando instalarlo nuevamente.\nPasa a la próxima página, por favor.",
        "config-install-begin": "Al pulsar en «{{int:config-continue}}» comenzará el proceso de instalación de MediaWiki.\nSi quieres realizar algún cambio, pulsa en «{{int:config-back}}».",
        "config-install-step-done": "hecho",
        "config-nofile": "El archivo \"$1\" no se pudo encontrar. ¿Se ha eliminado?",
        "config-extension-link": "¿Sabías que tu wiki admite [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nPuedes navegar por las [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category categorías] o visitar el [//www.mediawiki.org/wiki/Extension_Matrix centro de extensiones] para ver una lista completa.",
        "mainpagetext": "'''MediaWiki ha sido instalado con éxito.'''",
-       "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Help:Contents/es Guía del usuario] para obtener información sobre el uso del software wiki.\n\n== Empezando ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [//www.mediawiki.org/wiki/Manual:FAQ/es FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Regionalizar MediaWiki para tu idioma]"
+       "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Help:Contents/es guía del usuario] para obtener información sobre el uso del software wiki.\n\n== Primeros pasos ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [//www.mediawiki.org/wiki/Manual:FAQ/es Preguntas frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de publicación de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducir MediaWiki en tu idioma]"
 }
index ccebf08..d619cff 100644 (file)
@@ -59,6 +59,7 @@
        "config-outdated-sqlite": "''' هشدار:''' شما اس‌کیولایت $1 دارید، که پایین‌تر از حداقل نسخهٔ $2 مورد نیاز است.اس‌کیولایت در دسترس نخواهد بود.",
        "config-no-fts3": "'''هشدار:''' اس‌کیولایت بدون [//sqlite.org/fts3.html FTS3 module] تهیه شده‌است ، جستجوی ویژگی‌ها در این بخش پیشین در دسترس نخواهد‌بود.",
        "config-register-globals-error": "<strong>خطا:  پی‌اچ‌پی<code>[http://php.net/register_globals register_globals]</code> گزینه فعال است.\nبرای ادامه نصب باید غیر فعال باشد.</strong>\n[Https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] را برای کمک در مورد نحوه انجام این کار ببینید.",
+       "config-magic-quotes-gpc": "<strong>هشدار مهم: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] فعال شده‌است!</strong>\nاین گزینه اطلاعات داده شده به رایانه را به طور غیر‌قابل پیش‌بینی از بین می‌برد.\nشما نمی‌توانید مدیاویکی را نصب یا استفاده کنید مگر اینکه این گزینه غیر‌فعال باشد.",
        "config-magic-quotes-runtime": "'''مخرب: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] فعال است.\nاین گزینه اطلاعات داده شده به رایانه را به طور غیر‌قابل پیش‌بینی از بین می‌برد.\nشما نمی‌توانید مدیاویکی را نصب یا استفاده کنید مگر اینکه این گزینه غیر‌فعال باشد.",
        "config-magic-quotes-sybase": "'''مخرب: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] فعال است.\nاین گزینه اطلاعات داده شده به رایانه را به طور غیر‌قابل پیش‌بینی از بین می‌برد.\nشما نمی‌توانید مدیاویکی را نصب یا استفاده کنید مگر اینکه این گزینه غیر‌فعال باشد.",
        "config-mbstring": "''' مخرب:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] فعال است.\nاین گزینه باعث ایجاد خطا می‌شود و ممکن است اطلاعات را به طور غیر‌قابل پیش‌بینی از بین ببرد.\nشما نمی‌توانید مدیاویکی را نصب یا استفاده کنید مگر اینکه این گزینه غیر‌فعال باشد.",
@@ -69,6 +70,7 @@
        "config-memory-raised": "PHP's <code>memory_limit</code>, نسخهٔ $1 است، به نسخهٔ $2 ارتقاء داده شده‌است.",
        "config-memory-bad": "'''هشدار:''' PHP's <code>memory_limit</code> نسخهٔ $1 است.\nاین ممکن است خیلی پایین باشد.\nممکن است نصب با مشکل رو‌به‌رو شود.",
        "config-ctype": "'''مخرب:''' پی‌اچ‌پی باید با پشتیبانی برای [http://www.php.net/manual/en/ctype.installation.php Ctype extension] تهیه شده‌باشد.",
+       "config-iconv": "<strong>خطای اساسی:</strong> پی‌اچ‌پی باید کامپایل‌شده باشد برای پشتیبانی از [http://www.php.net/manual/en/iconv.installation.php افزونهٔ iconv].",
        "config-json": "'''مخرب:''' پی‌اچ‌پی بدون پشتیبانی جِی‌اس‌اُ‌ان تهیه شده‌بود.\nشما باید قبل از نصب مدیاویکی یا بسط  جِی‌اس‌اُ‌ان پی‌اچ‌پی یا بسط [http://pecl.php.net/package/jsonc PECL jsonc] را نصب کنید.\n* بسط پی‌اچ‌پی شامل لینوکس اینترپرایز رد هت (سِنت‌اُاِس) 5 یا 6 است، هرچند باید در <code>/etc/php.ini</code> یا <code>/etc/php.d/json.ini</code> فعال باشد.\n*  به‌جای بسته‌بندی کردن بسط پی‌ایی‌سی‌اِل مانند <code>php5-json</code> یا <code>php-pecl-jsonc</code>، توزیع‌های برخی لینوکس پس از ماه می ۲۰۱۳ با حذف بسط پی‌اچ‌پی افزایش پیدا کرد.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] نصب شده‌است.",
        "config-apc": "[http://www.php.net/apc APC] نصب شده‌است.",
        "config-license-cc-by-nc-sa": "اشتراک گذاری یکجور استناد رایج سازندهٔ غیر تجاری",
        "config-license-cc-0": "مبداء عوام سازنده (حیطهٔ عمومی)",
        "config-license-gfdl": "مجوز اسنادومدارک آزاد جی‌ان‌یو ۱.۳ یا بالاتر",
-       "config-license-pd": "دامنه عمومی",
+       "config-license-pd": "مالکیت عمومی",
        "config-license-cc-choose": "انتخاب یک مجوز سفارشی عوام خلاق",
-       "config-license-help": "بسیاری از وبگاه‌ها ویرایش‌های ها را با  [http://freedomdefined.org/Definition اجازه‌نامهٔ آزاد] منتشر می‌کنند.\nاین کار به داشتن حس مالکیت جمعی کمک می‌کند و ویرایش‌های طولانی مدت را اشاعه می‌دهد.\nاین برای ویکی‌های خصوصی یا سازمانی الزامی نیست.\n\nاگر شما می‌خواهید از متون ویکی‌پدیا استفاده کنید، یا اینکه به ویکی‌پدیا اجازه دهید از متون شما استفاده کند باید متون خود را با '''Creative Commons Attribution Share Alike''' منتشر کنید.\n\nویکی‌پدیا در گذشته از اجازه‌نامهٔ داده‌های آزاد گنو استفاده می‌کرد.\nاین اجازه‌نامه مورد قبول است، ولی فهم آن آسان نیست.\nهمچنین استفادهٔ دوباره از متون تحت اجازه‌نامهٔ داده‌های آزاد گنو به سختی انجام می‌گیرد.",
+       "config-license-help": "بسیاری از وبگاه‌ها ویرایش‌های ها را با  [http://freedomdefined.org/Definition اجازه‌نامهٔ آزاد] منتشر می‌کنند.\nاین کار به داشتن حس مالکیت جمعی کمک می‌کند و ویرایش‌های طولانی مدت را اشاعه می‌دهد.\nاین برای ویکی‌های خصوصی یا سازمانی الزامی نیست.\n\nاگر شما می‌خواهید از متون ویکی‌پدیا استفاده کنید، یا اینکه به ویکی‌پدیا اجازه دهید از متون شما استفاده کند باید متون خود را با <strong>{{int:config-license-cc-by-sa}}</strong> منتشر کنید.\n\nویکی‌پدیا در گذشته از اجازه‌نامهٔ داده‌های آزاد گنو استفاده می‌کرد.\nاین اجازه‌نامه مورد قبول است، ولی فهم آن آسان نیست.\nهمچنین استفادهٔ دوباره از متون تحت اجازه‌نامهٔ داده‌های آزاد گنو به سختی انجام می‌گیرد.",
        "config-email-settings": "تنظیمات رایانامه",
        "config-enable-email": "فعال‌سازی رایانامهٔ خروجی",
        "config-enable-email-help": "اگر برای کار کردن رایانامه می‌خواهید [http://www.php.net/manual/en/mail.configuration.php PHP's mail settings] نیازمند پیکربندی صحیح است.\nاگر هیچ ویژگی رایانامه را نمی‌خواهید، می‌توانید آنها را اینجا غیر‌فعال کنید.",
        "config-memcache-badport": "اعداد درگاه ممکچد باید بین $1 و $2 باشد.",
        "config-extensions": "افزونه‌ها",
        "config-extensions-help": "لیست وسیع بالا در فهرست <code>./extensions</code> شما یافت شد.\nممکن است نیازمند پیکربندی اضافه باشند، اما اکنون می‌توانید آنها را فعال کنید.",
+       "config-skins": "پوسته‌ها",
+       "config-skins-help": "پوسته های ذکر شده در بالا در <code>./skins</code> پوشهٔ شما شناسایی شده است. شما باید حداقل یکی را فعال و پیش فرض کنید.",
+       "config-skins-use-as-default": "این پوست را به عنوان پیش فرض استفاده کنید",
+       "config-skins-missing": "هیچ پوسته‌ای انتخاب نشده‌است‌‌، تا زمانی که یک پوستهٔ مناسب نصب کنید مدیاویکی از پوسته ذخیره‌شده استفاده می‌کند",
+       "config-skins-must-enable-some": "شما باید حداقل یک پوست برای فعال کردن انتخاب کنید.",
+       "config-skins-must-enable-default": "پوست انتخاب شده به عنوان پیش فرض باید فعال شده باشد.",
        "config-install-alreadydone": "'''هشدار:''' به نظر می‌رسد در حال حاضر شما مدیاویکی را نصب کرده‌اید و دوباره سعی میکنید آن را نصب کنید.\nلطفاً به صفحهٔ بعدی بروید.",
        "config-install-begin": "با فشاردادن \"{{int:config-continue}}\"، نصب مدیاویکی را آغاز خواهید‌کرد.\nاگر هنوز می‌خواهید تغییرات ایجاد کنید، \"{{int:config-back}}\" را فشار دهید.",
        "config-install-step-done": "انجام شد",
index 3aa0e84..0835f41 100644 (file)
@@ -56,7 +56,6 @@
        "config-env-good": "Asennusympäristö on tarkastettu.\nVoit asentaa MediaWikin.",
        "config-env-bad": "Asennusympäristö on tarkastettu.\nEt voi asentaa MediaWikiä.",
        "config-env-php": "PHP $1 on asennettu.",
-       "config-env-php-toolow": "PHP $1 on asennettu.\nMediaWiki vaatii PHP:n version $2 tai uudemman.",
        "config-no-db": "Sopivaa tietokanta-ajuria ei löytynyt! Sinun täytyy asentaa tietokanta-ajurit PHP:lle.\nSeuraavat tietokantatyypit ovat tuettuja: $1.",
        "config-outdated-sqlite": "<strong>Varoitus:</strong> sinulla on käytössä SQLite $1, joke on vanhempi kuin vähintään vaadittava versio $2. SQLite ei ole saatavilla.",
        "config-safe-mode": "'''Varoitus:''' PHP:n [http://www.php.net/features.safe-mode safe mode] -tila on aktiivinen.\nSe voi aiheuttaa ongelmia erityisesti tiedostojen tallentamisen ja matemaattisten kaavojen kanssa.",
        "config-cc-again": "Valitse uudelleen...",
        "config-extensions": "Laajennukset",
        "config-extensions-help": "Yllä luetellut laajennukset löytyvät <code>./extensions</code> hakemistosta.\n\nNe saattavat vaatia lisäasetuksia, mutta voit ottaa ne käyttöön nyt.",
+       "config-skins": "Ulkoasut",
+       "config-skins-must-enable-some": "Sinut täytyy valita ainakin yksi ulkoasu.",
        "config-install-alreadydone": "<strong>Varoitus:</strong> MediaWiki on jo asennettu ja yrität asentaa sitä uudestaan.\nSiirry seuraavalle sivulle.",
        "config-install-begin": "Painamalla \"{{int:config-continue}}\", aloitetaan MediaWikin asentaminen. \nJos haluat vielä tehdä muutoksia, paina \"{{int:config-back}}\".",
        "config-install-step-done": "valmis",
index 42e5e77..57d7444 100644 (file)
@@ -74,6 +74,7 @@
        "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-error": "<strong>Erreur : L’option <code>[http://php.net/register_globals register_globals]</code> de PHP est activée.\nElle doit être désactivée pour poursuivre l’installation.</strong>\nVoyez [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] pour avoir de l’aide sur la manière de faire cela.",
+       "config-magic-quotes-gpc": "<strong>Ereur critique : [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] est actif !</strong>\nCette option corrompt les entrées de donnée de façon imprévisible.\nVous ne pouvez pas installer ou utiliser MédiaWiki tant que cette option n’est pas désactivée.",
        "config-magic-quotes-runtime": "'''Erreur fatale : [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] est activé !'''\nCette option corrompt les données de manière imprévisible.\nVous ne pouvez pas installer ou utiliser MediaWiki tant que cette option est activée.",
        "config-magic-quotes-sybase": "'''Erreur fatale : [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybasee] est activé !'''\nCette option corrompt les données de manière imprévisible.\nVous ne pouvez pas installer ou utiliser MediaWiki tant que cette option est activée.",
        "config-mbstring": "'''Erreur fatale : [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] est activé !'''\nCette option provoque des erreurs et peut corrompre les données de manière imprévisible.\nVous ne pouvez pas installer ou utiliser MediaWiki tant que cette option est activée.",
@@ -84,6 +85,7 @@
        "config-memory-raised": "Le paramètre <code>memory_limit</code> de PHP était à $1, porté à $2.",
        "config-memory-bad": "'''Attention :''' Le paramètre <code>memory_limit</code> de PHP est à $1.\nCette valeur est probablement trop faible.\nIl 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-iconv": "<strong>Erreur critique :</strong> PHP doit être compilé avec le support de l’[http://www.php.net/manual/en/iconv.installation.php extension iconv].",
        "config-json": "'''Erreur fatale :''' PHP a été compilé sans le support de JSON.\nVous devez soit installez l’extension JSON de PHP ou l’extension [http://pecl.php.net/package/jsonc PECL jsonc] avant d’installer MediaWiki.\n* L’extension PHP est comprise dans Red Hat Enterprise Linux (CentOS) 5 et 6, mais doit être activée dans <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.\n* Certaines distributions Linux après mai 2013 ne comprennent pas l’extension PHP, mais ont mis à la place l’extension PECL sous la forme <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] est installé",
        "config-apc": "[http://www.php.net/apc APC] est installé",
        "config-license-gfdl": "GNU Free Documentation License 1.3 ou ultérieure",
        "config-license-pd": "Domaine public",
        "config-license-cc-choose": "Sélectionner une licence Creative Commons personnalisée",
-       "config-license-help": "Beaucoup de wikis publics mettent l'ensemble des contributions sous [http://freedomdefined.org/Definition/Fr licence libre].\nCela contribue à créer un sentiment d'appartenance dans leur communauté et encourage les contributions sur le long terme.\nCe n'est généralement pas nécessaire pour un wiki privé ou d'entreprise.\n\nSi vous souhaitez utiliser des textes de Wikipédia, et souhaitez que Wikipédia réutilise des textes de votre wiki, vous devriez choisir la licence ''Creative Commons Attribution Share Alike''].\n\nWikipédia utilisait auparavent la ''GNU Free Documentation License'' (GFDL).\nC'est une licence valide, mais elle est difficile à comprendre. \nDe plus, elle possède des caractéristiques qui rendent difficile la réutilisation.sour GFDL des contenus.",
+       "config-license-help": "Beaucoup de wikis publics mettent l’ensemble des contributions sous une [http://freedomdefined.org/Definition/Fr licence libre].\nCela contribue à créer un sentiment d’appartenance à une communauté et encourage les contributions sur le long terme.\nCe n’est généralement pas nécessaire pour un wiki privé ou d’entreprise.\n\nSi vous souhaitez utiliser des textes de Wikipédia, et souhaitez que Wikipédia puisse réutiliser des textes copiés depuis votre wiki, vous devriez choisir <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nWikipédia utilisait auparavant la Licence de Documentation Libre GNU (GFDL).\nC’est une licence valide, mais difficile à comprendre. \nIl est aussi difficile de réutiliser du contenu sous la licence GFDL.",
        "config-email-settings": "Paramètres de courriel",
        "config-enable-email": "Activer les courriels sortants",
        "config-enable-email-help": "Si vous souhaitez utiliser le courriel, vous devez [http://www.php.net/manual/en/mail.configuration.php configurer des paramètres PHP] (texte en anglais).\nSi vous ne voulez pas du service de courriel, vous pouvez le désactiver ici.",
        "config-memcache-badport": "Les numéros de port de Memcached sont situés entre $1 et $2.",
        "config-extensions": "Extensions",
        "config-extensions-help": "Les extensions énumérées ci-dessus ont été détectées dans votre répertoire <code>./extensions</code>.\n\nElles peuvent nécessiter une configuration supplémentaire, mais vous pouvez les activer maintenant",
+       "config-skins": "Habillages",
+       "config-skins-help": "Les habillages listés ci-dessous ont été détectés dans votre répertoire <code>./skins</code>. Vous devez en activer au moins un, et choisir celui par défaut.",
+       "config-skins-use-as-default": "Utiliser cet habillage par défaut",
+       "config-skins-missing": "Aucun habillage trouvé ; MédiaWiki utilisera un habillage de secours jusqu’à ce que vous en installiez un approprié.",
+       "config-skins-must-enable-some": "Vous devez choisir au moins un habillage à activer.",
+       "config-skins-must-enable-default": "L’habillage choisi par défaut doit être activé.",
        "config-install-alreadydone": "'''Attention''': Vous semblez avoir déjà installé MediaWiki et tentez de l'installer à nouveau.\nS'il vous plaît, allez à la page suivante.",
        "config-install-begin": "En appuyant sur {{int:config-continue}}, vous commencerez l'installation de MediaWiki.\nSi vous voulez encore apporter des modifications, appuyez sur \"{{int:config-back}}\".",
        "config-install-step-done": "fait",
index acede93..57e3c94 100644 (file)
@@ -59,6 +59,7 @@
        "config-outdated-sqlite": "'''אזהרה''': במערכת מתוקן SQLite $1. גרסה זו לא נתמכת ולשימוש ב־SQLite נדרשת גרסה $2 לפחות. SQLlite לא יהיה זמין.",
        "config-no-fts3": "'''אזהרה''': SQLite מקומפל ללא [//sqlite.org/fts3.html מודול FTS]. יכולות חיפוש לא יהיו זמינות בהתקנה הזאת.",
        "config-register-globals-error": "<strong>שגיאה: האפשרות <code>[http://php.net/register_globals register_globals]</code> של PHP מופעלת.\nצריך לכבות אותה כדי להמשיך בהתקנה.</strong>\nר' [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] להסבר איך לעשות את זה.",
+       "config-magic-quotes-gpc": "<strong>סופני: האפשרות [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] פעילה!</strong>\nהאפשרות הזאת מקלקלת נתוני קלט באופן בלתי־ניתן לחיזוי.\nלא ניתן להתקין את מדיה־ויקי אם האפשרות הזאת אינה כבויה.",
        "config-magic-quotes-runtime": "<strong>שגיאה סופנית: האפשרות [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] פעילה!</strong>\nהאפשרות הזאת מעוותת את נתוני הקלט באופן בלתי־צפוי.\nלא ניתן להתקין את מדיה־ויקי אלא אם האפשרות הזאת תכובה.",
        "config-magic-quotes-sybase": "'''שגיאה סופנית''': האפשרות [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] פעילה!'''\nהאפשרות הזאת מעוותת את נתוני הקלט באופן בלתי־צפוי.\nלא ניתן להתקין את מדיה־ויקי או להשתמש בה אלא אם האפשרות הזאת תכובה.",
        "config-mbstring": "'''שגיאה סופנית''': האפשרות [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] פעילה!'''\nהאפשרות הזאת גורמת לשגיאות ומעוותת את נתוני הקלט באופן בלתי־צפוי.\nלא ניתן להתקין את מדיה־ויקי או להשתמש בה אלא אם האפשרות הזאת תכובה.",
@@ -69,6 +70,7 @@
        "config-memory-raised": "ערך האפשרות <code>memory_limit</code> של PHP הוא $1, הועלה ל־$2.",
        "config-memory-bad": "'''אזהרה:''' ערך האפשרות <code>memory_limit</code> של PHP הוא $1.\nזה כנראה נמוך מדי.\nההתקנה עשויה להיכשל!",
        "config-ctype": "<strong>שגיאה סופנית</strong>: נדרשת גרסת PHP שתומכת בהרחבה [http://www.php.net/manual/en/ctype.installation.php Ctype].",
+       "config-iconv": "<strong>סופני:</strong> חובה לקמפל את PHP עם תמיכה ב[הרחבה http://www.php.net/manual/en/iconv.installation.php iconv].",
        "config-json": "'''שגיאה סופנית:''' PHP קומפל ללא תמיכה ב־JSON.\nיש להתקין את ההרחהב JSON ב־PHP או את ההרחבה [http://pecl.php.net/package/jsonc PECL jsonc] לפני התקנת מדיה־ויקי.\n* ההרחבה ל־PHP כלולה ב־Red Hat Enterprise Linux (ו־CentOS), אך יש להפעיל אותה ב־<code dir=\"ltr\">/etc/php.ini</code> או ב־<code dir=\"ltr\">/etc/php.d/json.ini</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] מותקן",
        "config-apc": "[http://www.php.net/apc APC] מותקן",
        "config-license-gfdl": "רישיון חופשי למסמכים של גנו גרסה 1.3 או חדשה יותר",
        "config-license-pd": "נחלת הכלל",
        "config-license-cc-choose": "בחירת רישיון קריאייטיב קומונז מותאם אישית",
-       "config-license-help": "אתרי ויקי ציבוריים רבים מפרסמים את כל התרומות [http://freedomdefined.org/Definition ברישיון חופשי].\nזה עוזר ליצור תחושה של בעלות קהילתית ומעודד תרומה לאורך זמן.\nזה בדרך כלל לא נחוץ לאתר ויקי פרטי או אתר של חברה מסחרית.\n\nאם האפשרות להשתמש בטקסט מוויקיפדיה והאפשרות שוויקיפדיה תוכל תקבל עותקים של טקסטים מהוויקי שלך חשובות לך, כדאי לבחור ב'''רישיון קריאייטיב קומונז ייחוס–שיתוף זהה''' (CC BY-SA).\n\nויקיפדיה השתמשה בעבר ברישיון החופשי למסמכים של גנו (GNU FDL או GFDL).\nהוא עדיין רישיון תקין, אבל קשה להבנה.\nכמו־כן, קשה לעשות שימוש חוזר ביצירות שפורסמו לפי GFDL.",
+       "config-license-help": "אתרי ויקי ציבוריים רבים מפרסמים את כל התרומות [http://freedomdefined.org/Definition ברישיון חופשי].\nזה עוזר ליצור תחושה של בעלות קהילתית ומעודד תרומה לאורך זמן.\nזה בדרך כלל לא נחוץ לאתר ויקי פרטי או אתר של חברה מסחרית.\n\nאם האפשרות להשתמש בטקסט מוויקיפדיה והאפשרות שוויקיפדיה תוכל תקבל עותקים של טקסטים מהוויקי שלך חשובות לך, כדאי לבחור ב<strong>{{int:config-license-cc-by-sa}}</strong>.\n\nויקיפדיה השתמשה בעבר ברישיון החופשי למסמכים של גנו (GNU FDL או GFDL).\nהוא עדיין רישיון תקין, אבל קשה להבנה.\nכמו־כן, קשה לעשות שימוש חוזר ביצירות שפורסמו לפי GFDL.",
        "config-email-settings": "הגדרות דוא״ל",
        "config-enable-email": "להפעיל דוא״ל יוצא",
        "config-enable-email-help": "אם אתם רוצים שדוא״ל יעבוד, [http://www.php.net/manual/en/mail.configuration.php אפשרויות הדוא״ל של PHP] צריכות להיות מוגדרות נכון.\nאם אינכם רוצים להפעיל שום אפשרויות דוא״ל, כבו אותן כאן ועכשיו.",
        "config-memcache-badport": "מספרי פתחה של Memcached צריכים להיות בין $1 ל־$2",
        "config-extensions": "הרחבות",
        "config-extensions-help": "ההרחבות ברשימה לעיל התגלו בתיקיית <span dir=\"ltr\"><code>./extensions</code></span> שלכם.\n\nייתכן שזה ידרוש הגדרות נוספות, אבל תוכלו להפעיל אותן עכשיו.",
+       "config-skins": "עיצובים",
+       "config-skins-help": "העיצובים לעיל נמצאו בתיקיית ה־<code dir=\"ltr\">./skins</code> שלך. חובה להפעיל לפחות אחת ולבחור בררת מחדל.",
+       "config-skins-use-as-default": "להשתמש בזה בתור בררת מחדל",
+       "config-skins-missing": "לא נמצאו עיצובים; מדיה־ויקי תשתמש בעיצוב גיבוי עד התקנת משהו מתאים.",
+       "config-skins-must-enable-some": "חובה לבחור לפחות עיצוב אחד שיופעל.",
+       "config-skins-must-enable-default": "העיצוב שנבחר בתור בררת מחדל חייב להיות מופעל.",
        "config-install-alreadydone": "'''אזהרה:''' נראה שכבר התקנתם את מדיה־ויקי ואתם מנסים להתקין אותה שוב.\nאנה התקדמו לדף הבא.",
        "config-install-begin": "כשתלחצו על \"{{int:config-continue}}\", תתחילו את ההתקנה של מדיה־ויקי.\nאם אתם עדיין רוצים לשנות משהו, לחצו על \"{{int:config-back}}\".",
        "config-install-step-done": "בוצע",
index 5c0e9db..62afb44 100644 (file)
@@ -47,7 +47,6 @@
        "config-env-good": "Le ambiente ha essite verificate.\nTu pote installar MediaWiki.",
        "config-env-bad": "Le ambiente ha essite verificate.\nTu non pote installar MediaWiki.",
        "config-env-php": "PHP $1 es installate.",
-       "config-env-php-toolow": "PHP $1 es installate.\nNonobstante, MediaWiki require PHP $2 o plus recente.",
        "config-unicode-using-utf8": "utf8_normalize.so per Brion Vibber es usate pro le normalisation Unicode.",
        "config-unicode-using-intl": "Le [http://pecl.php.net/intl extension PECL intl] es usate pro le normalisation Unicode.",
        "config-unicode-pure-php-warning": "'''Aviso''': Le [http://pecl.php.net/intl extension PECL intl] non es disponibile pro exequer le normalisation Unicode; le systema recurre al implementation lente in PHP pur.\nSi tu sito ha un alte volumine de traffico, tu deberea informar te un poco super le [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalisation Unicode].",
@@ -55,7 +54,7 @@
        "config-no-db": "Non poteva trovar un driver appropriate pro le base de datos! Es necessari installar un driver de base de datos pro PHP.\nLe sequente typos de base de datos es supportate: $1.\n\nSi tu compilava PHP tu mesme, reconfigura lo con un cliente de base de datos activate, per exemplo usante <code>./configure --with-mysqli</code>.\nSi tu installava PHP ex un pacchetto Debian o Ubuntu, tu debe installar equalmente, per exemplo, le modulo <code>php5-mysql</code>.",
        "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.'''\n'''Disactiva lo si tu pote.'''\nMediaWiki functionara, ma tu servitor es exponite a potential vulnerabilitates de securitate.",
+       "config-register-globals-error": "<strong>Error: Le option <code>[http://php.net/register_globals register_globals]</code> de PHP es active.\nIllo debe esser disactivate pro continuar le installation.</strong>\nVide [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] pro obtener adjuta sur como facer lo.",
        "config-magic-quotes-runtime": "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] es active!'''\nIste option corrumpe le entrata de datos imprevisibilemente.\nTu non pote installar o usar MediaWiki si iste option non es disactivate.",
        "config-magic-quotes-sybase": "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] es active!'''\nIste option corrumpe le entrata de datos imprevisibilemente.\nTu non pote installar o usar MediaWiki si iste option non es disactivate.",
        "config-mbstring": "'''Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] es active!'''\nIste option causa errores e pote corrumper datos imprevisibilemente.\nTu non pote installar o usar MediaWiki si iste option non es disactivate.",
index 101c19a..908d282 100644 (file)
@@ -55,7 +55,6 @@
        "config-env-good": "L'ambiente è stato controllato.\nÈ possibile installare MediaWiki.",
        "config-env-bad": "L'ambiente è stato controllato.\nNon è possibile installare MediaWiki.",
        "config-env-php": "PHP $1 è installato.",
-       "config-env-php-toolow": "PHP $1 è installato.\nTuttavia, MediaWiki richiede PHP $2 o superiore.",
        "config-unicode-using-utf8": "Usa Brion Vibber's utf8_normalize.so per la normalizzazione Unicode.",
        "config-unicode-using-intl": "Usa [http://pecl.php.net/intl l'estensione PECL intl] per la normalizzazione Unicode.",
        "config-unicode-pure-php-warning": "'''Attenzione:''' [http://pecl.php.net/intl l'estensione PECL intl] non è disponibile per gestire la normalizzazione Unicode, così si usa la lenta implementazione in puro PHP.\nSe esegui un sito ad alto traffico, dovresti leggere alcune considerazioni sulla [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizzazione Unicode].",
@@ -63,7 +62,6 @@
        "config-no-db": "Impossibile trovare un driver adatto per il database! È necessario installare un driver per PHP.\nI seguenti formati di database sono supportati: $1.\n\nSe compili PHP autonomamente, riconfiguralo attivando un client database, per esempio utilizzando <code>./configure --with-mysqli</code>.\nQualora avessi installato PHP per mezzo di un pacchetto Debian o Ubuntu, allora devi installare anche il pacchetto <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Attenzione''': è presente SQLite $1 mentre è richiesta la versione $2, SQLite non sarà disponibile.",
        "config-no-fts3": "'''Attenzione''': SQLite è compilato senza il [//sqlite.org/fts3.html modulo FTS3], le funzionalità di ricerca non saranno disponibili su questo backend.",
-       "config-register-globals": "'''Attenzione: le variabili PHP <code>[http://php.net/register_globals register globals]</code> sono attivate.'''\n'''Disattivale se possibile.''' MediaWiki funzionerà, ma il server sarà esposto a potenziali vulnerabilità di sicurezza.",
        "config-magic-quotes-runtime": "'''Errore: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] è attivato!''' Questa opzione interferisce in modo imprevedibile con l'inserimento dei dati. Non è possibile installare o utilizzare MediaWiki a meno che questa opzione non sia disabilitata.",
        "config-magic-quotes-sybase": "'''Errore: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] è attivato!''' Questa opzione interferisce in modo imprevedibile con l'inserimento dei dati. Non è possibile installare o utilizzare MediaWiki a meno che questa opzione non sia disabilitata.",
        "config-mbstring": "'''Errore: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] è attivato!''' Questa opzione causa errori e può interferire in modo imprevedibile coi dati. Non è possibile installare o utilizzare MediaWiki a meno che questa opzione non sia disabilitata.",
        "config-license-gfdl": "GNU Free Documentation License 1.3 o versioni successive",
        "config-license-pd": "Pubblico dominio",
        "config-license-cc-choose": "Seleziona una delle licenze Creative Commons",
-       "config-license-help": "Molti wiki pubblici rilasciano i loro contributi con una [http://freedomdefined.org/Definition licenza libera]. Questo aiuta a creare un senso di proprietà condivisa nella comunità e incoraggia a contribuire a lungo termine. Non è generalmente necessario per un wiki privato o aziendale.\n\nSe vuoi usare testi da Wikipedia, o desideri che Wikipedia possa essere in grado di accettare testi copiati dal tuo wiki, dovresti scegliere '''Creative Commons Attribution Share Alike'''.\n\nIn precedenza Wikipedia ha utilizzato la GNU Free Documentation License. La GFDL è una licenza valida, ma è di difficile comprensione e complica il riutilizzo dei contenuti.",
+       "config-license-help": "Molti wiki pubblici rilasciano i loro contributi con una [http://freedomdefined.org/Definition licenza libera]. Questo aiuta a creare un senso di proprietà condivisa nella comunità e incoraggia a contribuire a lungo termine. Non è generalmente necessario per un wiki privato o aziendale.\n\nSe vuoi usare testi da Wikipedia, o desideri che Wikipedia possa essere in grado di accettare testi copiati dal tuo wiki, dovresti scegliere <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nIn precedenza Wikipedia ha utilizzato la GNU Free Documentation License. La GFDL è una licenza valida, ma è di difficile comprensione e complica il riutilizzo dei contenuti.",
        "config-email-settings": "Impostazioni email",
        "config-enable-email": "Abilita la posta elettronica in uscita",
        "config-email-user": "Abilita invio email fra utenti",
index 02ff624..80b8a09 100644 (file)
@@ -11,7 +11,8 @@
                        "Whym",
                        "Yanajin66",
                        "青子守歌",
-                       "아라"
+                       "아라",
+                       "Shield-9"
                ]
        },
        "config-desc": "MediaWiki のインストーラー",
@@ -56,7 +57,6 @@
        "config-env-good": "環境を確認しました。\nMediaWiki をインストールできます。",
        "config-env-bad": "環境を確認しました。\nMediaWiki のインストールはできません。",
        "config-env-php": "PHP $1がインストールされています。",
-       "config-env-php-toolow": "PHP $1 がインストールされています。\nしかし、MediaWikiには PHP $2 以上が必要です。",
        "config-unicode-using-utf8": "Unicode正規化に、Brion Vibberのutf8_normalize.soを使用。",
        "config-unicode-using-intl": "Unicode正規化に[http://pecl.php.net/intl intl PECL 拡張機能]を使用。",
        "config-unicode-pure-php-warning": "<strong>警告:</strong> Unicode 正規化の処理に [http://pecl.php.net/intl intl PECL 拡張機能]を利用できないため、処理が遅いピュア PHP の実装を代わりに使用しています。\n高トラフィックのサイトを運営する場合は、[//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode 正規化]をお読みください。",
@@ -64,7 +64,6 @@
        "config-no-db": "適切なデータベース ドライバーが見つかりませんでした! PHP にデータベース ドライバーをインストールする必要があります。\n以下の種類のデータベースに対応しています: $1\n\nPHP を自分でコンパイルした場合は、例えば <code>./configure --with-mysqli</code> を実行して、データベース クライアントを使用できるように再設定してください。\nDebian または Ubuntu のパッケージから PHP をインストールした場合は、モジュール (例: <code>php5-mysql</code>) もインストールする必要があります。",
        "config-outdated-sqlite": "<strong>警告:</strong> あなたは SQLite $1 を使用していますが、最低限必要なバージョン $2 より古いバージョンです。SQLite は利用できません。",
        "config-no-fts3": "<strong>警告:</strong> SQLite は [//sqlite.org/fts3.html FTS3] モジュールなしでコンパイルされており、このバックエンドでは検索機能は利用できなくなります。",
-       "config-register-globals": "<strong>警告: PHP の <code>[http://php.net/register_globals register_globals]</code> オプションが有効になっています。\n可能なら無効化してください。</strong>\nMediaWiki は動作しますが、サーバーの潜在的なセキュリティ脆弱性が露呈されます。",
        "config-magic-quotes-runtime": "<strong>致命的エラー: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] が動作しています!</strong>\nこのオプションは、予期せずデータ入力を破壊します。\nこのオプションを無効化しない限り、MediaWiki のインストールや使用はできません。",
        "config-magic-quotes-sybase": "<strong>致命的エラー: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] が動作しています!</strong>\nこのオプションは、予期せずデータ入力を破壊します。\nこのオプションを無効化しない限り、MediaWiki のインストールや使用はできません。",
        "config-mbstring": "<strong>致命的エラー: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] が動作しています!</strong>\nこのオプションは、エラーを引き起こし、予期せずデータを破壊するおそれがあります。\nこのオプションを無効化しない限り、MediaWiki のインストールや使用はできません。",
        "config-license-gfdl": "GNU フリー文書利用許諾契約書 1.3 以降",
        "config-license-pd": "パブリック・ドメイン",
        "config-license-cc-choose": "その他のクリエイティブ・コモンズ・ライセンスを選択する",
-       "config-license-help": "多くの公開ウィキでは、すべての寄稿物が[http://freedomdefined.org/Definition フリーライセンス]のもとに置かれています。\nこうすることにより、コミュニティによる共有の感覚が生まれ、長期的な寄稿が促されます。\n私的ウィキや企業のウィキでは、通常、フリーライセンスにする必要はありません。\n\nウィキペディアにあるテキストをあなたのウィキで利用し、逆にあなたのウィキにあるテキストをウィキペディアに複製することを許可したい場合には、<strong>クリエイティブ・コモンズ 表示-継承</strong>を選択するべきです。\n\nウィキペディアは以前、GNUフリー文書利用許諾契約書(GFDL)を使用していました。\nGFDLは有効なライセンスですが、内容を理解するのは困難です。\nまた、GFDLのもとに置かれているコンテンツの再利用も困難です。",
+       "config-license-help": "多くの公開ウィキでは、すべての寄稿物が[http://freedomdefined.org/Definition フリーライセンス]のもとに置かれています。\nこうすることにより、コミュニティによる共有の感覚が生まれ、長期的な寄稿が促されます。\n私的ウィキや企業のウィキでは、通常、フリーライセンスにする必要はありません。\n\nウィキペディアにあるテキストをあなたのウィキで利用し、逆にあなたのウィキにあるテキストをウィキペディアに複製することを許可したい場合には、<strong>{{int:config-license-cc-by-sa}}</strong>を選択するべきです。\n\nウィキペディアは以前、GNUフリー文書利用許諾契約書(GFDL)を使用していました。\nGFDLは有効なライセンスですが、内容を理解するのは困難です。\nまた、GFDLのもとに置かれているコンテンツの再利用も困難です。",
        "config-email-settings": "メールの設定",
        "config-enable-email": "メール送信を有効にする",
        "config-enable-email-help": "メールを使用したい場合は、[http://www.php.net/manual/en/mail.configuration.php PHP のメール設定]が正しく設定されている必要があります。\nメールの機能を使用しない場合は、ここで無効にすることができます。",
        "config-memcache-badport": "Memcached のポート番号は $1 から $2 の範囲にしてください。",
        "config-extensions": "拡張機能",
        "config-extensions-help": "<code>./extensions</code> ディレクトリ内で、上に列挙した拡張機能を検出しました。\n\nこれらの拡張機能には追加の設定が必要な場合がありますが、今すぐ有効化できます。",
+       "config-skins": "外装",
+       "config-skins-use-as-default": "この外装をデフォルトとして使う",
+       "config-skins-must-enable-some": "少なくとも1つの有効化する外装を選択する必要があります。",
+       "config-skins-must-enable-default": "デフォルトとして選択された外装は有効である必要があります。",
        "config-install-alreadydone": "<strong>警告:</strong> 既にMediaWikiがインストール済みで、再びインストールし直そうとしています。\n次のページへ進んでください。",
        "config-install-begin": "「{{int:config-continue}}」を押すと、MediaWiki のインストールを開始できます。\n変更したい設定がある場合は、「{{int:config-back}}」を押してください。",
        "config-install-step-done": "実行",
index 72619bc..b2221a5 100644 (file)
        "config-license-gfdl": "GNU 자유 문서 사용 허가서 1.3 이상",
        "config-license-pd": "퍼블릭 도메인",
        "config-license-cc-choose": "다른 크리에이티브 커먼즈 라이선스 선택",
-       "config-license-help": "많은 공개 위키는 모든 기여를 [http://freedomdefined.org/Definition 자유 라이선스]에 따르도록 합니다.\n이렇게 하면 커뮤니티에 대한 소유권을 이해할 수 있도록 하고 장기적인 기여를 장려합니다.\n일반적으로 개인 또는 회사 위키에게는 필요하지 않습니다.\n\n위키백과의 텍스트를 사용할 수 있도록 하고 위키백과가 위키에서 복사한 텍스트를 사용할 수 있도록 원한다면 '''크리에이티브 커먼즈 저작자표시-동일조건변경허락'''으로 선택해야 합니다.\n\n위키백과는 이전에 GNU 자유 문서 사용 허가서(GFDL)를 사용했습니다.\nGFDL은 유효한 라이선스이지만 내용을 이해하기 어렵습니다.\nGFDL에 따라 사용이 허가된 내용을 재사용하는 것도 어렵습니다.",
+       "config-license-help": "많은 공개 위키는 모든 기여를 [http://freedomdefined.org/Definition 자유 라이선스]에 따르도록 합니다.\n이렇게 하면 커뮤니티에 대한 소유권을 이해할 수 있도록 하고 장기적인 기여를 장려합니다.\n일반적으로 개인 또는 회사 위키에게는 필요하지 않습니다.\n\n위키백과의 텍스트를 사용할 수 있도록 하고 위키백과가 위키에서 복사한 텍스트를 사용할 수 있도록 원한다면 <strong>{{int:config-license-cc-by-sa}}</strong>으로 선택해야 합니다.\n\n위키백과는 이전에 GNU 자유 문서 사용 허가서(GFDL)를 사용했습니다.\nGFDL은 유효한 라이선스이지만 내용을 이해하기 어렵습니다.\nGFDL에 따라 사용이 허가된 내용을 재사용하는 것도 어렵습니다.",
        "config-email-settings": "이메일 설정",
        "config-enable-email": "발신 이메일 활성화",
        "config-enable-email-help": "이메일을 작동하려면 [http://www.php.net/manual/en/mail.configuration.php PHP의 메일 설정]을 올바르게 설정해야 합니다.\n이메일 기능을 사용하지 않으려면 이를 비활성화할 수 있습니다.",
        "config-memcache-badport": "Memcached 포트 번호는 $1(와)과 $2 사이여야 합니다.",
        "config-extensions": "확장 기능",
        "config-extensions-help": "위에 나열된 확장 기능이 <code>./extensions</code>에서 발견되었습니다.\n\n추가적인 설정이 필요할 수 있습니다만 지금 활성화시킬 수 있습니다.",
+       "config-skins": "스킨",
+       "config-skins-use-as-default": "이 스킨을 기본값으로 사용",
        "config-install-alreadydone": "'''경고:''' 이미 미디어위키를 설치했고 다시 설치하려고 합니다.\n다음 페이지로 진행하세요.",
        "config-install-begin": "\"{{int:config-continue}}\"을 누르면 미디어위키의 설치를 시작합니다.\n그래도 바꾸는 것을 원한다면 \"{{int:config-back}}\"를 누르세요.",
        "config-install-step-done": "완료",
index 08526f4..9941442 100644 (file)
        "config-env-good": "Den Environement gouf nogekuckt.\nDir kënnt MediaWiki installéieren.",
        "config-env-bad": "Den Environnement gouf iwwerpréift.\nDir kënnt MediWiki net installéieren.",
        "config-env-php": "PHP $1 ass installéiert.",
-       "config-env-php-toolow": "PHP $1 ass installéiert.\nAwer MediaWiki brauch PHP $2 oder méi héich.",
        "config-unicode-using-utf8": "Fir d'Unicode-Normalisatioun gëtt dem Brion Vibber säin <code>utf8_normalize.so</code> benotzt.",
        "config-no-db": "Et konnt kee passenden Datebank-Driver fonnt ginn! Dir musst een Datebank-Driver fir PHP installéieren.\nDës Datebank-Type ginn ënnerstëtzt: $1.\n\nWann Dir PHP selwer compiléiert hutt, da rekonfiguréiert en mat dem ageschalten Datebank-Client, zum Beispill an deem Dir <code>./configure --with-mysql</code> benotzt.\nWann Dir PHP vun engem Debian oder Ubuntu Package aus installéiert hutt, da musst Dir och den php5-mysql Modul installéieren.",
        "config-outdated-sqlite": "'''Warnung:''' SQLite $1 ass installéiert. Allerdengs brauch MediaWiki SQLite $2 oder méi nei. SQLite ass dofir net disponibel.",
        "config-memory-bad": "'''Opgepasst:''' De Parameter <code>memory_limit</code> vu PHP ass $1.\nDat ass wahrscheinlech ze niddreg.\nD'Installatioun kéint net funktionéieren.",
+       "config-iconv": "<strong>Fatal:</strong> PHP muss mat Support fir d'[http://www.php.net/manual/en/iconv.installation.php iconv-Erweiderung] kompiléiert ginn.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] ass installéiert",
        "config-apc": "[http://www.php.net/apc APC] ass installéiert",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ass installéiert",
        "config-diff3-bad": "GNU diff3 gouf net fonnt.",
        "config-git": "D'Software Git fir d'Kontroll vu Versioune gouf fonnt: <code>$1</code>.",
+       "config-git-bad": "D'Software fir d'Kontroll vun de Versiounen 'Git' gouf net fonnt.",
        "config-no-uri": "'''Feeler:''' Déi aktuell URI konnt net festgestallt ginn.\nInstallatioun ofgebrach.",
        "config-using-server": "De Servernumm \"<nowiki>$1</nowiki>\" gëtt benotzt.",
        "config-using-uri": "D'Server URL  \"<nowiki>$1$2</nowiki>\" gëtt benotzt.",
        "config-cc-again": "Nach eng kéier eraussichen...",
        "config-advanced-settings": "Erweidert Astellungen",
        "config-extensions": "Erweiderungen",
+       "config-skins": "Ausgesinn",
+       "config-skins-help": "D'Ausgesinn déi hei driwwer stinn goufen am Repertoire <code>./skins</code> fonnt. Dir musst mindestens eent aktivéieren an de Standard eraussichen.",
+       "config-skins-use-as-default": "Dëst Ausgesinn als Standard benotzen",
+       "config-skins-missing": "Et goufe keen Ausgesinn (Skin) fonnt; MediaWiki benotzt e Fallback-Ausgesinnbis Dir anerer installéiert.",
+       "config-skins-must-enable-some": "Dir musst mindestens een Ausgesinn fir z'aktivéieren eraussichen.",
+       "config-skins-must-enable-default": "Dat als Standard erausgesichten Ausgesinn muss aktivéiert sinn.",
        "config-install-step-done": "fäerdeg",
        "config-install-step-failed": "huet net funktionéiert",
        "config-install-extensions": "Mat den Ereiderungen",
index b67f62f..74359b2 100644 (file)
@@ -55,6 +55,7 @@
        "config-outdated-sqlite": "'''Предупредување''': имате SQLite $1. Најстарата допуштена верзија е $2. Затоа, SQLite ќе биде недостапен.",
        "config-no-fts3": "'''Предупредување''': SQLite iе составен без модулот [//sqlite.org/fts3.html FTS3] - за оваа база нема да има можност за пребарување.",
        "config-register-globals-error": "<strong>Грешка: Вклучена е можноста <code>[http://php.net/register_globals register_globals]</code> за PHP.\nМора да се исклучи за да продолжите со воспоставката.</strong>\nКако да го направите тоа можете да прочитате на [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals].",
+       "config-magic-quotes-gpc": "<strong>Кобно: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] е ективно!</strong>\nОваа можност непредвидливо го расипува вносот на податоци.\nОваа можност мора да е исклучена. Во спротивно нема да можете да го воспоставите и користите МедијаВики.",
        "config-magic-quotes-runtime": "'''Кобно: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] е активно!'''\nОваа можност непредвидливо го расипува вносот на податоци.\nОваа можност мора да е исклучена. Во спротивно нема да можете да го воспоставите и користите МедијаВики.",
        "config-magic-quotes-sybase": "'''Кобно: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] е активно!'''\nОваа можност непредвидливо го расипува вносот на податоци.\nОваа можност мора да е исклучена. Во спротивно нема да можете да го воспоставите и користите МедијаВики.",
        "config-mbstring": "'''Кобно: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] е активно!'''\nОваа можност предизвикува грешки и може непредвидиво да го расипува вносот на податоци.\nОваа можност мора да е исклучена. Во спротивно нема да можете да го воспоставите и користите МедијаВики.",
@@ -65,6 +66,7 @@
        "config-memory-raised": "<code>memory_limit</code> за PHP изнесува $1, зголемен на $2.",
        "config-memory-bad": "'''Предупредување:''' <code>memory_limit</code> за PHP изнесува $1.\nОва е веројатно премалку.\nВоспоставката може да не успее!",
        "config-ctype": "'''Фатална грешка''': PHP мора да се состави со поддршка за [http://www.php.net/manual/en/ctype.installation.php додатокот Ctype].",
+       "config-iconv": "<strong>Кобно:</strong> PHP мора да се срочува со поддршка за [http://www.php.net/manual/en/iconv.installation.php додатокот iconv].",
        "config-json": "'''Кобно:''' PHP беше срочен без поддршка од JSON.\nЌе мора да го воспоставите додатокот за JSON во PHP, или додатокот [http://pecl.php.net/package/jsonc PECL jsonc] пред да го воспоставите МедијаВики.\n* Додатокот за PHP е вклучен во верзиите 5 и 6 на Linux (од Red Hat Enterprise) (CentOS), но мора да се активира во <code>/etc/php.ini</code> или <code>/etc/php.d/json.ini</code>.\n* Некои варијанти на Linux излезени по мај 2013 г. не го содржат додатокот за PHP, туку го пакуваат додатокот PECL како <code>php5-json</code> или <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] е воспоставен",
        "config-apc": "[http://www.php.net/apc APC] е воспоставен",
        "config-license-gfdl": "ГНУ-ова лиценца за слободна документација 1.3 или понова",
        "config-license-pd": "Јавна сопственост",
        "config-license-cc-choose": "Одберете друга лиценца на Криејтив комонс по ваш избор",
-       "config-license-help": "Многу јавни викија ги ставаат сите придонеси под [http://freedomdefined.org/Definition слободна лиценца].\nСо ова се создава атмосфера на општа сопственост и поттикнува долгорочно учество.\nОва не е неопходно за викија на поединечни физички или правни лица.\n\nАко сакате да користите текст од Википедија, и сакате Википедија да прифаќа текст прекопиран од вашето вики, тогаш треба да ја одберете лиценцата '''Криејтив комонс НаведиИзвор СподелиПодИстиУслови'''.\n\nГНУ-овата лиценца за слободна документација (ГЛСД) е старата лиценца на Википедија.\nОваа лиценца сè уште важи, но е тешка за разбирање.\nИсто така треба да се има на ум дека пренамената на содржините под ГЛСД не е лесна.",
+       "config-license-help": "Многу јавни викија ги ставаат сите придонеси под [http://freedomdefined.org/Definition слободна лиценца].\nСо ова се создава атмосфера на општа сопственост и поттикнува долгорочно учество.\nОва не е неопходно за викија на поединечни физички или правни лица.\n\nАко сакате да користите текст од Википедија, и сакате Википедија да прифаќа текст прекопиран од вашето вики, тогаш треба да ја одберете лиценцата <strong>{{int:config-license-cc-by-sa}}</strong>..\n\nГНУ-овата лиценца за слободна документација (ГЛСД) е старата лиценца на Википедија.\nОваа лиценца сè уште важи, но е тешка за разбирање.\nИсто така треба да се има на ум дека пренамената на содржините под ГЛСД не е лесна.",
        "config-email-settings": "Нагодувања за е-пошта",
        "config-enable-email": "Овозможи излезна е-пошта",
        "config-enable-email-help": "Ако сакате да работи е-поштата, [http://www.php.net/manual/en/mail.configuration.php поштенските нагодувања на PHP] треба да се правилно наместени.\nАко воопшто не сакате никакви функции за е-пошта, тогаш можете да ги оневозможите тука.",
        "config-memcache-badport": "Бројките за портата на Memcached треба да бидат помеѓу $1 и $2",
        "config-extensions": "Додатоци",
        "config-extensions-help": "Во вашата папка <code>./extensions</code> беа востановени горенаведените додатоци.\n\nЗа ова може да треба дополнително нагодување, но можете да ги овозможите сега",
+       "config-skins": "Рува",
+       "config-skins-help": "Во вашата папка <code>./skins</code> се утврдени горенаведените рува. Ќе мора да овозможите барем едно и да го изберете основното.",
+       "config-skins-use-as-default": "Користи го како основно",
+       "config-skins-missing": "Не пронајдов ниедно руво. МедијаВики ќе користи резервно руво сè додека не воспоставите други.",
+       "config-skins-must-enable-some": "Ќе треба да изберете барем едно руво.",
+       "config-skins-must-enable-default": "Рувото што го избравте како основно мора да се овозможи.",
        "config-install-alreadydone": "'''Предупредување:''' Изгледа дека веќе го имате воспоставено МедијаВики и сега сакате да го воспоставите повторно.\nПродолжете на следната страница.",
        "config-install-begin": "Стискајќи на „{{int:config-continue}}“ ќе ја започнете воспоставката на МедијаВики.\nАко сакате да направите измени во досегашното, стиснете на „{{int:config-back}}“.",
        "config-install-step-done": "готово",
index 26f1cc7..2f2825d 100644 (file)
@@ -16,7 +16,7 @@
        "config-localsettings-badkey": "Kunci yang anda berikan tidak betul.",
        "config-upgrade-key-missing": "Pemasangan yang sedia ada MediaWiki telah dikesan.\nUntuk menaik taraf pemasangan, Sila letakkan baris berikut di bahagian bawah <code>LocalSettings.php</code> anda:\n\n$1",
        "config-localsettings-incomplete": "<code>LocalSettings.php</code> sedia ada nampaknya tidak lengkap.\nPemboleh ubah $1 tidak disetkan.\nSila tukar <code>LocalSettings.php</code> supaya pemboleh ubah ini disetkan, dan klik \"{{int:Config-terus}}\".",
-       "config-localsettings-connection-error": "Ralat berlaku semasa semasa menyambung ke dalam pangkalan data yang menggunakan seting yang dinyatakan dalam <code>LocalSettings.php</code> atau <code>AdminSettings.php</code>. Sila betulkan tetapan ini dan cuba lagi.\n\n$1",
+       "config-localsettings-connection-error": "Ralat berlaku semasa menyambung ke pangkalan data dengan menggunakan tetapan yang dinyatakan dalam <code>LocalSettings.php</code>. Sila betulkan tetapan tersebut dan cuba lagi.\n\n$1",
        "config-session-error": "Ralat ketika memulakan sesi: $1",
        "config-session-expired": "Data sesi anda seolah-olah telah tamat tempoh.\nSesi dikonfigurasi untuk seumur hidup sebanyak $1.\nAnda boleh menambah ini dengan menetapkan <code>session.gc_maxlifetime</code> di php.ini.\nMemulakan semula proses pemasangan.",
        "config-no-session": "Data sesi anda telah hilang!\nSemak php.ini anda dan pastikan <code>session.save_path</code> disetkan kepada satu direktori yang sesuai.",
        "config-env-good": "Persekitaran telah diperiksa.\nAnda boleh memasang MediaWiki.",
        "config-env-bad": "Persekitaran telah diperiksa. \nAnda tidak boleh memasang MediaWiki.",
        "config-env-php": "PHP $1 dipasang.",
-       "config-env-php-toolow": "PHP $1 dipasang.\nBagaimanapun, MediaWiki memerlukan PHP $2 ke atas.",
        "config-unicode-using-utf8": "utf8_normalize.so oleh Brion Vibber digunakan untuk penormalan Unicode.",
        "config-unicode-using-intl": "[http://pecl.php.net/intl Sambungan intl PECL] digunakan untuk penormalan Unicode.",
        "config-unicode-update-warning": "<strong>Amaran:</strong> Versi pembalut penormalan Unicode yang terpasang menggunakan perpustakaan [http://site.icu-project.org/ projek ICU] dalam versi yang lampau.\nAnda harus [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations menaik taraf] jika Unicode penting bagi anda.",
        "config-no-fts3": "<strong>Amaran:</strong> SQLite disusun tanpa [//sqlite.org/fts3.html modil FTS3], maka ciri-ciri pencarian tidak akan disediakan pada backend ini.",
-       "config-register-globals": "<strong>Amaran: Pilihan <code>[http://php.net/register_globals register_globals]</code> PHP dihidupkan.\nMatikannya jika boleh.</strong>\nMediaWiki boleh digunakan, tetapi pelayan anda akan terdedah kepada kemungkinan kerentanan keselamatan.",
        "config-mbstring": "<strong>Amaran keras: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] sedang aktif!</strong>\nOpsyen ini menyebabkan ralat dan mungkin mencemari data secara tanpa diduga.\nAnda tidak boleh memasang atau menggunakan MediaWiki melainkan opsyen ini dinyahdayakan.",
        "config-pcre-old": "<strong>Amaran keras:</strong> PCRE $1 ke atas diperlukan.\nBinari PHP anda berpaut dengan PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Keterangan lanjut].",
        "config-memory-bad": "<strong>Amaran:</strong> <code>memory_limit</code> (Had memori) PHP adalah $1.\nIni mungkin terlalu rendah.\nPemasangan mungkin akan gagal!",
        "config-ctype": "<strong>Amaran keras:</strong> PHP mesti disusun dengan sokongan untuk [http://www.php.net/manual/en/ctype.installation.php sambungan Ctype].",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] dipasang",
+       "config-apc": "[http://www.php.net/apc APC] dipasang",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] dipasang",
        "config-no-cli-uri": "<strong>Amaran:</strong> Tiada <code>--scriptpath</code> dinyatakan, maka digunakannya yang asali: <code>$1</code>.",
+       "config-using-server": "Sedang menggunakan nama pelayan \"<nowiki>$1</nowiki>\".",
+       "config-using-uri": "Sedang menggunakan URL pelayan \"<nowiki>$1$2</nowiki>\".",
        "config-no-cli-uploads-check": "<strong>Amaran:</strong> Direktori asali anda untuk muat naikan (<code>$1</code>) belum diperiksa untuk kerentanan\nkepada pelaksanaan skrip yang menyeleweng sewaktu pemasangan CLI.",
        "config-db-charset": "Peranggu aksara pangkalan data",
        "config-pg-test-error": "Tidak boleh bersambung dengan pangkalan data <strong>$1</strong>: $2",
index eb16d0d..a856301 100644 (file)
@@ -16,7 +16,8 @@
                        "Pan Cube",
                        "WTM",
                        "Alan ffm",
-                       "Matik7"
+                       "Matik7",
+                       "Pio387"
                ]
        },
        "config-desc": "Instalator MediaWiki",
@@ -79,6 +80,7 @@
        "config-memory-raised": "PHP <code>memory_limit</code> było ustawione na $1, zostanie zwiększone do $2.",
        "config-memory-bad": "'''Uwaga:''' PHP <code>memory_limit</code> jest ustawione na $1.\nTo jest prawdopodobnie zbyt mało.\nInstalacja może się nie udać!",
        "config-ctype": "''' Krytyczny ''': PHP musi być skompilowany z obsługą [http://www.php.net/manual/en/ctype.installation.php rozszerzenia Ctype].",
+       "config-iconv": "<strong>Błąd krytyczny:</strong> PHP musi być skompilowane z obsługą [http://www.php.net/manual/en/iconv.installation.php rozszerzenia iconv].",
        "config-json": "'''Błąd krytyczny:''' PHP skompilowano bez obsługa JSON.\nPrzed zainstalowaniem oprogramowania MediaWiki musisz zainstalować rozszerzenie PHP JSON albo rozszerzenie [http://pecl.php.net/package/jsonc PECL jsonc].\n* Rozszerzenie PHP jest zawarte w Red Hat Enterprise Linux (CentOS) 5 i 6, jednak musi zostać włączone w <code>/etc/php.ini</code> or <code>/etc/php.d/json.ini</code>.\n* Niektóre dystrybucje Linuksa, wydane po maju 2013, nie używają rozszerzenia PHP, lecz rozszerzenie PECL, jako <code>php5-json</code> lub <code>php-pecl-jsonc</code>.",
        "config-xcache": "[Http://trac.lighttpd.net/xcache/ XCache] jest zainstalowany",
        "config-apc": "[Http://www.php.net/apc APC] jest zainstalowany",
        "config-sqlite-cant-create-db": "Nie można utworzyć pliku bazy danych <code>$1</code>.",
        "config-sqlite-fts3-downgrade": "Brak wsparcia FTS3 dla PHP. Tabele zostały cofnięte",
        "config-can-upgrade": "W bazie danych są już tabele MediaWiki.\nAby uaktualnić je do MediaWiki $1, kliknij '''Dalej'''.",
-       "config-upgrade-done": "Uaktualnienie kompletne.\n\nMożna teraz [ $1  rozpocząć korzystanie z wiki].\n\nJeśli chcesz ponownie wygenerować plik <code>LocalSettings.php</code>, kliknij przycisk poniżej.\nJest to '''nie zalecane''', chyba że występują problemy z twoją wiki.",
+       "config-upgrade-done": "Uaktualnienie kompletne.\n\nMożna teraz [$1 rozpocząć korzystanie z wiki].\n\nJeśli chcesz ponownie wygenerować plik <code>LocalSettings.php</code>, kliknij przycisk poniżej.\nJest to <strong>niezalecane</strong>, chyba że występują problemy z twoją wiki.",
        "config-upgrade-done-no-regenerate": "Aktualizacja zakończona.\n\nMożesz teraz [$1 zacząć korzystać ze swojej wiki].",
        "config-regenerate": "Ponowne generowanie LocalSettings.php →",
        "config-show-table-status": "Zapytanie „<code>SHOW TABLE STATUS</code>” nie powiodło się!",
        "config-memcache-badport": "Numery portu Memcached powinny zawierać się pomiędzy $1 i $2.",
        "config-extensions": "Rozszerzenia",
        "config-extensions-help": "Rozszerzenia wyżej wymienione zostały wykryte w katalogu <code>./extensions</code>.\n\nMogą one wymagać dodatkowych czynności konfiguracyjnych, ale można je teraz włączyć",
+       "config-skins": "Skórki",
+       "config-skins-help": "Powyższe skórki zostały wykryte w twoim katalogi <code>./skins</code>. Należy włączyć co najmniej jedną i wybrać domyślną.",
+       "config-skins-use-as-default": "Użyj tej skórki jako domyślnej",
+       "config-skins-missing": "Nie znaleziono skórki; MediaWiki będzie używać rezerwowej skórki do czasu zainstalowania odpowiednich.",
+       "config-skins-must-enable-some": "Musisz wybrać co najmniej jedną skórkę, aby ją włączyć.",
+       "config-skins-must-enable-default": "Skórka wybrana jako domyślna musi być włączona.",
        "config-install-alreadydone": "'''Uwaga''' – wydaje się, że MediaWiki jest już zainstalowane, a obecnie próbujesz zainstalować je ponownie.\nPrzejdź do następnej strony.",
        "config-install-begin": "Po naciśnięciu \"{{int:config-continue}}\", rozpocznie się instalacja MediaWiki.\nJeśli nadal chcesz dokonać zmian, naciśnij \"{{int:config-back}}\".",
        "config-install-step-done": "gotowe",
index a547edc..114839e 100644 (file)
@@ -59,7 +59,6 @@
        "config-env-good": "O ambiente foi verificado.\nPode instalar o MediaWiki.",
        "config-env-bad": "O ambiente foi verificado.\nNão pode instalar o MediaWiki.",
        "config-env-php": "O PHP $1 está instalado.",
-       "config-env-php-toolow": "O PHP $1 está instalado.\nNo entanto, o MediaWiki requer o PHP $2 ou superior.",
        "config-unicode-using-utf8": "A usar o utf8_normalize.so, por Brion Vibber, para a normalização Unicode.",
        "config-unicode-using-intl": "A usar a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.",
        "config-unicode-pure-php-warning": "'''Aviso''': A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode. Irá recorrer-se à implementação em PHP puro, que é mais lenta.\nSe o seu site tem alto volume de tráfego, devia informar-se um pouco sobre a [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/pt normalização Unicode].",
@@ -67,7 +66,6 @@
        "config-no-db": "Não foi possível encontrar um controlador ''(driver)'' apropriado da base de dados! Precisa de instalar um controlador da base de dados para o PHP. São aceites os seguintes tipos de base de dados: $1.\n\nSe fez a compilação do PHP, reconfigure-o com um cliente de base de dados ativado; por exemplo, usando <code>./configure --with-mysql</code>.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então precisa de instalar também, por exemplo, o pacote <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Aviso''': Tem a versão $1 do SQLite, que é anterior à versão mínima necessária, a $2. O SQLite não estará disponível.",
        "config-no-fts3": "'''Aviso''': O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
-       "config-register-globals": "'''Aviso: A opção <code>[http://php.net/register_globals register_globals]</code> do PHP está ativada.'''\n'''Desative-a, se puder.'''\nO MediaWiki funciona mesmo assim, mas o seu servidor está exposto a potenciais vulnerabilidades de segurança.",
        "config-magic-quotes-runtime": "'''Erro fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está ativa!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
        "config-magic-quotes-sybase": "'''Erro fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está ativa!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
        "config-mbstring": "'''Erro fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativa!'''\nEsta opção causa erros e pode corromper os dados de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
        "config-license-gfdl": "GNU Free Documentation License 1.3 ou posterior",
        "config-license-pd": "Domínio Público",
        "config-license-cc-choose": "Selecionar uma licença personalizada Creative Commons",
-       "config-license-help": "Muitas wikis de acesso público licenciam todas as colaborações com uma [http://freedomdefined.org/Definition licença livre].\nIsto ajuda a criar um sentido de propriedade da comunidade e encoraja as colaborações a longo prazo.\nTal não é geralmente necessário nas wikis privadas ou corporativas.\n\nSe pretende que seja possível usar textos da Wikipédia na sua wiki e que seja possível a Wikipédia aceitar textos copiados da sua wiki, deve escolher a licença Creative Commons - Atribuição - Partilha nos Mesmos Termos.\n\nA licença anterior da Wikipédia era a licença GNU Free Documentation License.\nA GFDL é uma licença válida, mas de difícil compreensão.\nTambém é difícil reutilizar conteúdos licenciados com a GFDL.",
+       "config-license-help": "Muitas wikis de acesso público licenciam todas as colaborações com uma [http://freedomdefined.org/Definition licença livre].\nIsto ajuda a criar um sentido de propriedade da comunidade e encoraja as colaborações a longo prazo.\nTal não é geralmente necessário nas wikis privadas ou corporativas.\n\nSe pretende que seja possível usar textos da Wikipédia na sua wiki e que seja possível a Wikipédia aceitar textos copiados da sua wiki, deve escolher a licença <strong>{{int:config-license-cc-by-sa}}</strong>..\n\nA licença anterior da Wikipédia era a licença GNU Free Documentation License.\nA GFDL é uma licença válida, mas de difícil compreensão.\nTambém é difícil reutilizar conteúdos licenciados com a GFDL.",
        "config-email-settings": "Definições do correio electrónico",
        "config-enable-email": "Ativar mensagens eletrónicas de saída",
        "config-enable-email-help": "Se quer que o correio eletrónico funcione, as [http://www.php.net/manual/en/mail.configuration.php definições de correio eletrónico do PHP] têm de estar configuradas corretamente.\nSe não pretende viabilizar qualquer funcionalidade de correio eletrónico, pode desativá-lo aqui.",
        "config-memcache-badport": "Os números das portas do Memcached devem estar entre $1 e $2.",
        "config-extensions": "Extensões",
        "config-extensions-help": "Foi detectada a existência das extensões listadas acima, no seu diretório <code>./extensions</code>.\n\nEstas talvez necessitem de configurações adicionais, mas pode ativá-las agora",
+       "config-skins": "Temas",
+       "config-skins-help": "Os temas listados abaixo foram detetados no seu diretório <code>./skins</code>. Deverá ativar pelo menos um e escolher qual o escolhido por padrão.",
+       "config-skins-use-as-default": "Usar este tema como padrão",
+       "config-skins-must-enable-some": "Deve escolher pelo menos um tema para ativar.",
+       "config-skins-must-enable-default": "O tema escolhido como padrão deve ser ativado.",
        "config-install-alreadydone": "'''Aviso:''' Parece que já instalou o MediaWiki e está a tentar instalá-lo novamente.\nPasse para a próxima página, por favor.",
        "config-install-begin": "Ao clicar \"{{int:config-continue}}\", vai iniciar a instalação do MediaWiki.\nSe quiser fazer mais alterações, clique \"{{int:config-back}}\".",
        "config-install-step-done": "terminado",
index d0a37a7..0735574 100644 (file)
@@ -70,6 +70,7 @@
        "config-outdated-sqlite": "Used as warning. Parameters:\n* $1 - the version of SQLite that has been installed\n* $2 - minimum version",
        "config-no-fts3": "A \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.",
        "config-register-globals-error": "Error message in the MediaWiki installer environment checks.",
+       "config-magic-quotes-gpc": "{{Related|Config-fatal}}",
        "config-magic-quotes-runtime": "{{Related|Config-fatal}}",
        "config-magic-quotes-sybase": "{{Related|Config-fatal}}",
        "config-mbstring": "{{Related|Config-fatal}}",
@@ -80,6 +81,7 @@
        "config-memory-raised": "Parameters:\n* $1 is the configured <code>memory_limit</code>.\n* $2 is the value to which <code>memory_limit</code> was raised.",
        "config-memory-bad": "Parameters:\n* $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.\n{{Related|Config-fatal}}",
+       "config-iconv": "Message if support for [http://www.php.net/manual/en/iconv.installation.php iconv] is missing from PHP.\n{{Related|Config-fatal}}",
        "config-json": "Message if support for [[wikipedia:JSON|JSON]] is missing from PHP.\n* \"[[wikipedia:Red Hat Enterprise Linux|Red Hat Enterprise Linux]]\" (RHEL) and \"[[wikipedia:CentOS|CentOS]]\" refer to two almost-identical Linux distributions. \"5 and 6\" refers to version 5 or 6 of either distribution. Because RHEL 7 likely will not include the PHP extension, do not translate as \"5 or newer\".\n* \"The [http://www.php.net/json PHP extension]\" is the JSON extension included with PHP 5.2 and newer.\n* \"The [http://pecl.php.net/package/jsonc PECL extension]\" is based on the PHP extension, though excludes code some distributions have found unacceptable (see [[bugzilla:47431]]).\n{{Related|Config-fatal}}",
        "config-xcache": "Message indicates if this program is available",
        "config-apc": "Message indicates if this program is available",
        "config-memcache-badport": "Used as error message. Parameters:\n* $1 - 1 (hard-coded)\n* $2 - 65535 (hard-coded)\nSee also:\n* {{msg-mw|Config-memcache-badip}}\n* {{msg-mw|Config-memcache-noport}}",
        "config-extensions": "{{Identical|Extension}}",
        "config-extensions-help": "{{doc-important|Do not translate <code>./extensions</code>.}}\nUsed in help box.",
+       "config-skins": "{{Identical|Skin}}",
+       "config-skins-help": "{{doc-important|Do not translate <code>./skins</code>.}}\nUsed in help box.",
+       "config-skins-use-as-default": "Label shown next to skin names.",
+       "config-skins-missing": "Warning message shown when there are no skins to install.",
+       "config-skins-must-enable-some": "Error message shown when the user does silly things.",
+       "config-skins-must-enable-default": "Error message shown when the user does silly things.",
        "config-install-alreadydone": "Error message shown to users visiting the installer when the wiki appears to already be set up.",
        "config-install-begin": "Prompt at the end of the initial configuration options screen before the wiki software is installed.",
        "config-install-step-done": "{{Identical|Done}}",
index 3203df7..b5441c1 100644 (file)
@@ -70,6 +70,7 @@
        "config-outdated-sqlite": "'''Предупреждение''': у Вас установлен SQLite  $1, версия которого ниже требуемой $2 . SQLite будет недоступен.",
        "config-no-fts3": "'''Внимание''': SQLite собран без модуля [//sqlite.org/fts3.html FTS3] — поиск не будет работать для этой базы данных.",
        "config-register-globals-error": "<strong>Ошибка: Параметр PHP <code>[http://php.net/register_globals register_globals]</code> включен.\nОн должен быть отключен для того, чтобы можно было продолжить установку.</strong>\nПолучить справку о том, как это сделать, можно по адресу [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals].",
+       "config-magic-quotes-gpc": "'''Проблема: включена опция PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc]!'''\nЭто приводит к непредсказуемой порче вводимых данных.\nУстановка и использование MediaWiki без выключения этой опции невозможно.",
        "config-magic-quotes-runtime": "'''Проблема: включена опция PHP [http://www.php.net/manual/ru/function.magic-quotes-runtime.php magic_quotes_runtime]!'''\nЭто приводит к непредсказуемой порче вводимых данных.\nУстановка и использование MediaWiki без выключения этой опции невозможно.",
        "config-magic-quotes-sybase": "'''Проблема: включена опция PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]!'''\nЭто приводит к непредсказуемой порче вводимых данных.\nУстановка и использование MediaWiki без выключения этой опции невозможно.",
        "config-mbstring": "'''Проблема: включена опция PHP [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''\nЭто приводит к ошибкам и непредсказуемой порче вводимых данных.\nУстановка и использование MediaWiki без выключения этой опции невозможно.",
@@ -80,6 +81,7 @@
        "config-memory-raised": "Ограничение на доступную PHP память (<code>memory_limit</code>) поднято с $1 до $2.",
        "config-memory-bad": "'''Внимание:''' размер PHP <code>memory_limit</code> составляет $1.\nВероятно, этого слишком мало.\nУстановка может потерпеть неудачу!",
        "config-ctype": "'''Фатальная ошибка:''' PHP должен быть скомпилирован с поддержкой [http://www.php.net/manual/ru/ctype.installation.php расширения Ctype].",
+       "config-iconv": "<strong>Фатальная ошибка:</strong> PHP должен быть скомпилирован с поддержкой [http://www.php.net/manual/en/iconv.installation.php расширения iconv].",
        "config-json": "'''Фатальная ошибка:''' PHP был скомпилирован без поддержка JSON.\nВам необходимо установить либо расширение PHP JSON, либо расширение [http://pecl.php.net/package/jsonc PECL jsonc] перед установкой MediaWiki.\n* PHP-расширение входит в состав Red Hat Enterprise Linux (CentOS) 5 и 6, хотя должна быть включено в <code>/etc/php.ini</code> или <code>/etc/php.d/json.ini</code>.\n* Некоторые дистрибутивы Linux, выпущенные после мая 2013 года, не включают расширение PHP, вместо того, чтобы упаковывать расширение PECL как <code>php5-json</code> или <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] установлен",
        "config-apc": "[http://www.php.net/apc APC] установлен",
        "config-license-gfdl": "GNU Free Documentation License 1.3 или более поздняя",
        "config-license-pd": "Общественное достояние",
        "config-license-cc-choose": "Выберите одну из лицензий Creative Commons",
-       "config-license-help": "Многие общедоступные вики разрешают использовать свои материалы на условиях [http://freedomdefined.org/Definition/Ru свободных лицензий].\nЭто помогает созданию чувства общности, стимулирует долгосрочное участие.\nНо в этом нет необходимости для частных или корпоративных вики.\n\nЕсли вы хотите использовать тексты из Википедии или хотите, что в Википедию можно было копировать тексты из вашей вики, вам следует выбрать '''Creative Commons Attribution Share Alike'''.\n\nВикипедия ранее использовала лицензию GNU Free Documentation License.\nGFDL может быть использована, но она сложна для понимания и осложняет повторное использование материалов.",
+       "config-license-help": "Многие общедоступные вики разрешают использовать свои материалы на условиях [http://freedomdefined.org/Definition/Ru свободных лицензий].\nЭто помогает созданию чувства общности, стимулирует долгосрочное участие.\nНо в этом нет необходимости для частных или корпоративных вики.\n\nЕсли вы хотите использовать тексты из Википедии или хотите, что в Википедию можно было копировать тексты из вашей вики, вам следует выбрать <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nВикипедия ранее использовала лицензию GNU Free Documentation License.\nGFDL может быть использована, но она сложна для понимания и осложняет повторное использование материалов.",
        "config-email-settings": "Настройки электронной почты",
        "config-enable-email": "Включить исходящие e-mail",
        "config-enable-email-help": "Если вы хотите, чтобы электронная почта работала, необходимо выполнить [http://www.php.net/manual/ru/mail.configuration.php соответствующие настройки PHP].\nЕсли вы не хотите использовать возможности электронной почты в вики, вы можете её отключить.",
        "config-memcache-badport": "Номера портов Memcached должны лежать в пределах от $1 до $2.",
        "config-extensions": "Расширения",
        "config-extensions-help": "Расширения MediaWiki, перечисленные выше, были найдены в каталоге <code>./extensions</code>.\n\nОни могут потребовать дополнительные настройки, но их можно включить прямо сейчас",
+       "config-skins": "Темы оформления",
+       "config-skins-help": "Перечисленные выше темы оформления были обнаружены в вашем каталоге <code>./skins</code>. Вам необходимо включить по крайней мере один из них и выбрать тот, что будет по умолчанию.",
+       "config-skins-use-as-default": "Использовать по умолчанию эту тему оформления",
+       "config-skins-missing": "Темы оформления не найдены. MediaWiki будет использовать резервную тему до тех пор, пока вы не установите что-нибудь подходящее.",
+       "config-skins-must-enable-some": "Вы должны оставить включённой как минимум одну тему оформления.",
+       "config-skins-must-enable-default": "Тема оформления, выбранная по умолчанию, должна быть включена.",
        "config-install-alreadydone": "'''Предупреждение:''' Вы, кажется, уже устанавливали MediaWiki и пытаетесь произвести повторную установку.\nПожалуйста, перейдите на следующую страницу.",
        "config-install-begin": "Нажав «{{int:config-continue}}», вы начнёте установку MediaWiki.\nЕсли вы хотите внести изменения, нажмите «{{int:config-back}}».",
        "config-install-step-done": "выполнено",
index 681e8ee..40f0902 100644 (file)
@@ -2,11 +2,12 @@
        "@metadata": {
                "authors": [
                        "Andria",
-                       "L2212"
+                       "L2212",
+                       "Uharteko"
                ]
        },
        "config-page-language": "Limba",
        "config-page-name": "Nùmene",
        "config-page-options": "Preferèntzias",
-       "mainpagetext": "'''MediaWiki est stadu installadu in modu currègidu.'''"
+       "mainpagetext": "'''MediaWiki est istadu installadu bene.'''"
 }
index 40d0876..4d44735 100644 (file)
@@ -48,7 +48,6 @@
        "config-env-good": "The environment haes been checked.\nYe can install MediaWiki.",
        "config-env-bad": "The environment haes been checked.\nYe canna install MediaWiki.",
        "config-env-php": "PHP $1 is instâlled.",
-       "config-env-php-toolow": "PHP $1 is instâlled.\nHoue'er, MediaWiki requires PHP $2 or heier.",
        "config-unicode-using-utf8": "Uising Brion Vibber's utf8_normalize.so fer Unicode normalization.",
        "config-unicode-using-intl": "Uising the [http://pecl.php.net/intl intl PECL extension] fer Unicode normalization.",
        "config-unicode-pure-php-warning": "<strong>Warnishment:</strong> The [http://pecl.php.net/intl intl PECL extension] is no available tae haunle Unicode normalisation, fawin back tae slaw pure-PHP implementation.\nGif ye rin ae hei-traffic steid, ye shid read ae wee bit oan [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].",
@@ -56,7 +55,7 @@
        "config-no-db": "Coudna fynd ae suitable database driver! Ye need tae instaw ae database driver fer PHP.\nThe follaein database types ar supported: $1.\n\nGif ye compiled PHP yersel, reconfeegure it wi ae database client enabled, fer example, uising <code>./confeegure --wi-mysqli</code>.\nGif ye installed PHP fae ae Debian or Ubuntu package, than ye need tae instaw forby, fer example, the <code>php5-mysql</code> package.",
        "config-outdated-sqlite": "<strong>Warnishment:</strong> ye have SQLite $1, this is lower than minimum required version $2. SQLite will be onavailable.",
        "config-no-fts3": "<strong>Warnishment:</strong> SQLite is compiled wioot the [//sqlite.org/fts3.html FTS3 module], rake features will be onavailable oan this backend.",
-       "config-register-globals": "<strong>Warnishment: PHP's <code>[http://php.net/register_globals register_globals]</code> optie is enabled.\nDisable it gif ye can.</strong>\nMediaWiki will wark, but yer server is exposed til poteential securitie vulnerabeelities.",
+       "config-magic-quotes-gpc": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] is active!</strong>\nThis option corrupts data input unpredictably.\nYe cannae install or uise MediaWiki unless this option is disabled.",
        "config-magic-quotes-runtime": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] is active!'</strong>\nThis optie rots data input onpredictably.\nYe canna install or uise MediaWiki onless this optie is disabled.",
        "config-magic-quotes-sybase": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] is active!</strong>\nThis optie rots data input onpredictably.\nYe canna install or uise MediaWiki onless this optie is disabled.",
        "config-mbstring": "<strong>Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is active!</strong>\nThis optie causes mistaks an can rot data onpredictably.\nYe canna install or uise MediaWiki onless this optie is disabled.",
        "config-license-gfdl": "GNU Free Documentâtion License 1.3 or later",
        "config-license-pd": "Public Domain",
        "config-license-cc-choose": "Select ae custym Creative Commyns license",
-       "config-license-help": "Monie publeec wikis pit aw contreebutions unner ae [http://freedomdefined.org/Defineetion free license].\nThis heelps tae cræft ae sense o communitie ainership n encoorages lang-term contreebution.\nIt's naw generallie necessarie fer ae private or corporate wiki.\n\nGif ye wish tae be able tae uise tex fae Wikipedia, n ye want Wikipedia tae be able tae accept tex copied fae yer wiki, ye shid chuise <strong>Creative Commyns Attribution Shair Alike</strong>.\n\nWikipædia preeveeooslie uised the GNU Free Documentation License.\nThe GFDL is ae valid license, but it's difficult tae unnerstaunn.\nIt's difficult tae reuise content licensed unner the GFDL ava.",
+       "config-license-help": "Monie publeec wikis pit aw contreebutions unner ae [http://freedomdefined.org/Defineetion free license].\nThis heelps tae creaut ae sense o communitie ainership n encoorages lang-term contreebution.\nIt's naw generallie necessair fer ae preevate or corporate wiki.\n\nGif ye wish tae be able tae uise tex fae Wikipædia, n ye want Wikipædia tae be able tae accept tex copied fae yer wiki, than ye shid chuise <strong>Creative Commons Attribution Shair Alike</strong>.\n\nWikipædia preeveeooslie uised the GNU Free Documentation License.\nThe GFDL is ae valid license, but it's difficult tae unnerstaunn.\nMairower, it's difficult tae reuise content licensed unner the GFDL.",
        "config-email-settings": "Wab-mail settins",
        "config-enable-email": "Enable ootboond wab-mail",
        "config-enable-email-help": "Gif ye want wab-mail tae wark, [http://www.php.net/manual/en/mail.configuration.php PHP's mail settins] need tae be confeegured jyst richt.\nGif ye dinna want oni wab-mail features, ye can disable theim here.",
index 4cb5442..fc078c9 100644 (file)
        "config-memcache-badport": "Memcached-portnummer bör vara mellan $1 och $2.",
        "config-extensions": "Tillägg",
        "config-extensions-help": "Tilläggen ovan upptäcktes i din <code>./extensions</code>-katalog.\n\nDe kan kräva ytterligare konfiguration, men du kan aktivera dem nu.",
+       "config-skins": "Utseenden",
+       "config-skins-help": "Utseenden som listas upp ovan identifierades i din filkatalog <code>./skins</code>. Du måste aktivera minst en och välja ett som standard.",
+       "config-skins-use-as-default": "Använd detta utseende som standard",
+       "config-skins-missing": "Ingen utseenden hittades; MediaWiki använder ett reservutseende tills du installerar några.",
+       "config-skins-must-enable-some": "Du måste välja minst ett utseende att aktivera.",
+       "config-skins-must-enable-default": "Utseendet som valdes som standard måste aktiveras.",
        "config-install-alreadydone": "''' Varning:''' Du verkar redan ha installerat MediaWiki och försöker installera det igen.\nVänligen fortsätt till nästa sida.",
        "config-install-begin": "Genom att trycka på \"{{int:config-continue}}\", påbörjar du installationen av MediaWiki.\nOm du fortfarande vill göra ändringar tryck på \"{{int:config-back}}\".",
        "config-install-step-done": "klar",
index 2065352..001a0f8 100644 (file)
@@ -55,7 +55,6 @@
        "config-env-good": "Перевірку середовища успішно завершено.\nВи можете встановити MediaWiki.",
        "config-env-bad": "Було проведено перевірку середовища. Ви не можете встановити MediaWiki.",
        "config-env-php": "Встановлено версію PHP: $1.",
-       "config-env-php-toolow": "Встановлено PHP $1.\nНатомість MediaWiki вимагає PHP $2 і вище.",
        "config-unicode-using-utf8": "Використовувати utf8_normalize.so Брайона Віббера для нормалізації Юнікоду.",
        "config-unicode-using-intl": "Використовувати [http://pecl.php.net/intl міжнародне розширення PECL] для нормалізації Юнікоду.",
        "config-unicode-pure-php-warning": "'''Увага''': [http://pecl.php.net/intl міжнародне розширення PECL] не може провести нормалізацію Юнікоду.\nЯкщо ваш сайт має високий трафік, вам варто почитати про [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations нормалізацію Юнікоду].",
@@ -63,7 +62,8 @@
        "config-no-db": "Не вдалося знайти відповідний драйвер бази даних! Вам необхідно встановити драйвер бази даних для PHP. Підтримуються такі типи баз даних: $1.\n\nЯкщо ви скомпілювали PHP самостійно, переналаштуйте його з включенням клієнта бази даних, наприклад за допомогою <code>./configure --with-mysqli</code>.\n\nЯкщо установлено 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> увімкнена.'''\n'''Вимкніть її, якщо це можливо.'''\nMediaWiki буде працювати, але Ваш сервер буде більш вразливим до потенційного проникнення зовні.",
+       "config-register-globals-error": "<strong>Помилка: Опція PHP <code>[http://php.net/register_globals register_globals]</code> увімкнена.\nЩоб продовжити це встановлення, її треба вимкнути.</strong>\nДив. довідку, як це зробити, на [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals].",
+       "config-magic-quotes-gpc": "'''Фатальна помилка: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] увімкнена!'''\nЦя опція призводить до непередбачуваного пошкодження даних.\nВи не можете встановити і використовувати MediaWiki, поки не буде вимкнено цю опцію.",
        "config-magic-quotes-runtime": "'''Проблема: Опція PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] увімкнена!'''\nЦя опція призводить до непередбачуваного пошкодження даних.\nВи не можете встановити і використовувати MediaWiki, поки не буде вимкнено цю опцію.",
        "config-magic-quotes-sybase": "'''Проблема: Опція PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] увімкнена!'''\nЦя опція призводить до непередбачуваного пошкодження даних.\nВи не можете встановити і використовувати MediaWiki, поки не буде вимкнено цю опцію.",
        "config-mbstring": "'''Проблема: Опція PHP [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] увімкнена!'''\nЦя опція призводить до непередбачуваного пошкодження даних.\nВи не можете встановити і використовувати MediaWiki, поки не буде вимкнено цю опцію.",
@@ -74,6 +74,7 @@
        "config-memory-raised": "Обмеження пам'яті PHP (<code>memory_limit</code>) $1, піднято до $2.",
        "config-memory-bad": "'''Увага:''' Розмір пам'яті PHP (<code>memory_limit</code>) становить $1.\nІмовірно, це замало.\nВстановлення може не вдатись!",
        "config-ctype": "'''Помилка''': PHP має бути зібраним з підтримкою [http://www.php.net/manual/en/ctype.installation.php розширення Ctype].",
+       "config-iconv": "'''Фатальна помилка''': PHP має бути зібраним з підтримкою [http://www.php.net/manual/en/iconv.installation.php розширення iconv].",
        "config-json": "'''Fatal:''' PHP був скомпільований без підтримки JSON.\nВам потрібно встановити або розширення PHP JSON або розширення[http://pecl.php.net/package/jsonc PECL jsonc] перед встановлення Медіавікі.\n* Розширення PHP включено у Red Hat Enterprise Linux (CentOS) 5 та 6, хоча має бути доступним у  <code>/etc/php.ini</code> або <code>/etc/php.d/json.ini</code>.\n* Деякі дистрибутиви Лінукса, випущені після травня 2013, пропустили розширення PHP, натомість упакували розширення  PECL як <code>php5-json</code> або <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] встановлено",
        "config-apc": "[http://www.php.net/apc APC] встановлено",
        "config-license-gfdl": "GNU Free Documentation License 1.3 або пізніша",
        "config-license-pd": "Суспільне надбання (Public Domain)",
        "config-license-cc-choose": "Виберіть одну з ліцензій Creative Commons",
-       "config-license-help": "Чимало загальнодоступних вікі публікують увесь свій вміст під [http://freedomdefined.org/Definition вільною ліцензією]. Це розвиває відчуття спільної власності і заохочує довготривалу участь. У загальному випадку для приватної чи корпоративної вікі у цьому немає необхідності.\n\nЯкщо Ви хочете мати змогу використовувати текст з Вікіпедії і дати Вікіпедії змогу використовувати текст, скопійований з Вашої вікі, вам необхідно обрати '''Creative Commons Attribution Share Alike'''.\n\nРаніше Вікіпедія використовувала GNU Free Documentation License.\nGFDL — допустима ліцензія, але у ній важко розібратися, а контент під GFDL важко використовувати повторно.",
+       "config-license-help": "Чимало загальнодоступних вікі публікують увесь свій вміст під [http://freedomdefined.org/Definition вільною ліцензією]. Це розвиває відчуття спільної власності і заохочує довготривалу участь. У загальному випадку для приватної чи корпоративної вікі у цьому немає необхідності.\n\nЯкщо Ви хочете мати змогу використовувати текст з Вікіпедії і дати Вікіпедії змогу використовувати текст, скопійований з Вашої вікі, вам необхідно обрати <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nРаніше Вікіпедія використовувала GNU Free Documentation License.\nGFDL — допустима ліцензія, але у ній важко розібратися, а контент під GFDL важко використовувати повторно.",
        "config-email-settings": "Налаштування електронної пошти",
        "config-enable-email": "Увімкнути вихідну електронну пошту",
        "config-enable-email-help": "Якщо Ви хочете, що електронна пошта працювала, необхідно виставити коректні [http://www.php.net/manual/en/mail.configuration.php налаштування пошти у PHP].\nЯкщо Вам не потрібні жодні можливості електронної пошти у вікі, можете тут їх відключити.",
        "config-memcache-badport": "Номери портів Memcached повинні лежати в межах від $1 до $2.",
        "config-extensions": "Розширення",
        "config-extensions-help": "Розширення, перераховані вище, були знайдені у папці <code>./extensions</code>.\n\nВони можуть потребувати додаткових налаштувань, але Ви можете увімкнути їх зараз.",
+       "config-skins": "Оформлення",
+       "config-skins-help": "Перераховані вище теми оформлення було знайдено у Вашій папці <code>./skins</code>. Ви маєте увімкнути хоча б одну, і обрати тему за замовчуванням.",
+       "config-skins-use-as-default": "Використовувати цю тему за замовчуванням",
+       "config-skins-missing": "Не було знайдено жодних тем; MediaWiki буде використовувати резервну тему, поки Ви не встановите власні.",
+       "config-skins-must-enable-some": "Потрібно вибрати принаймні одну тему, щоб увімкнути.",
+       "config-skins-must-enable-default": "Тема, обрана за замовчуванням, повинна бути увімкнена.",
        "config-install-alreadydone": "'''Увага:''' Здається, Ви вже встановлювали MediaWiki і зараз намагаєтесь встановити її знову.\nБудь ласка, перейдіть на наступну сторінку.",
        "config-install-begin": "Натискаючи \"{{int:config-continue}}\", Ви розпочинаєте встановлення MediaWiki.\nЯкщо Ви все ще хочете внести зміни, натисніть \"{{int:config-back}}\".",
        "config-install-step-done": "виконано",
index 9c2d37e..82dd202 100644 (file)
@@ -20,7 +20,8 @@
                        "Kuailong",
                        "Zjzengdongyang",
                        "Mywood",
-                       "Impersonator 1"
+                       "Impersonator 1",
+                       "Fengchao"
                ]
        },
        "config-desc": "MediaWiki安装程序",
@@ -72,6 +73,8 @@
        "config-no-db": "找不到合适的数据库驱动!您需要为PHP安装数据库驱动。目前支持以下数据库:$1。如果您是自己编译的PHP,请重新配置他与数据库客户端将其启用,诸如,使用<code>./configure --with-mysqli</code>。如果您从Debian或Ubuntu包安装了PHP,之后您仍需要安装诸如<code>php5-mysql</code>包。",
        "config-outdated-sqlite": "'''警告''':您已安装SQLite $1,但是它的版本低于最低要求版本$2。因此您无法选择SQLite。",
        "config-no-fts3": "'''警告''':已编译的SQLite不包含[//sqlite.org/fts3.html FTS3模块],后台搜索功能将不可用。",
+       "config-register-globals-error": "<strong>错误:PHP<code>[http://php.net/register_globals register_globals]</code>选项被启用。必须禁用它才能继续安装。</strong>关于如何禁用,参见[https://www.mediawiki.org/wiki/register_globals mediawiki.org此页]。",
+       "config-magic-quotes-gpc": "<strong>致命错误:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc]已启用!</strong>此选项会无法挽回的破坏输入数据。除非此选项被禁用否则您不能安装或使用MediaWiki。",
        "config-magic-quotes-runtime": "'''毁灭性错误:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]已启用!'''\n此选项会无法预测地破坏输入的数据,请将其禁用,否则您将不能安装或使用MediaWiki。",
        "config-magic-quotes-sybase": "'''毁灭性错误:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase]已启用!'''\n此选项会无法预测地破坏输入的数据,请将其禁用,否则您将不能安装或使用MediaWiki。",
        "config-mbstring": "'''毁灭性错误:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]已启用!'''\n此选项会导致错误并不可预测地破坏数据,请将其禁用,否则您将不能安装或使用MediaWiki。",
@@ -82,6 +85,7 @@
        "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-iconv": "<strong>致命错误:</strong>PHP必须编译支持[http://www.php.net/manual/en/iconv.installation.php iconv拓展]。",
        "config-json": "'''致命问题:''' PHP编译没有附带JSON支持。\n在安装MediaWiki前,你必须安装PHP JSON扩展或者[http://pecl.php.net/package/jsonc PECL jsonc]扩展。\n* PHP扩展已包含在Red Hat Enterprise Linux (CentOS) 5和6中,但必须在<code>/etc/php.ini</code>或<code>/etc/php.d/json.ini</code>中启用。\n* 部分在2013年5月后发行的Linux发行版省略了PHP扩展,而将PECL扩展打包成了<code>php5-json</code>或<code>php-pecl-jsonc</code>。",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache]已安装",
        "config-apc": "[http://www.php.net/apc APC]已安装",
        "config-profile-help": "如果您允许尽量多的人编写wiki,网站上的内容会更加丰富。在MediaWiki中,您可以轻松地审查最近更改,并轻易回退掉新手或破坏者造成的损害。\n\n然而,许多人觉得让MediaWiki存在多种角色将更加好用;同时,要说服所有人都愿以wiki的方式作贡献并非一件易事。因此,您可以有以下选择:\n\n'''{{int:config-profile-wiki}}'''允许包括未登录用户在内的所有人编辑。'''{{int:config-profile-no-anon}}'''的wiki需要额外的注册流程,这有可能会阻碍随意贡献者。\n\n'''{{int:config-profile-fishbowl}}'''模式只允许获批准的用户编辑,但对公众开放页面浏览(包括历史记录)。'''{{int:config-profile-private}}'''则只允许获批准的用户浏览、编辑页面。\n\n安装完成后,您还可以对用户权限进行更多、更复杂的配置,参见[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights 相关的使用手册]。",
        "config-license": "版权和许可证:",
        "config-license-none": "页脚无许可证",
-       "config-license-cc-by-sa": "ç\9f¥è¯\86å\85±äº«ç½²å\90\8d\9b¸å\90\8cæ\96¹å¼\8få\88\86享",
+       "config-license-cc-by-sa": "ç\9f¥è¯\86å\85±äº«ç½²å\90\8d\9b¸å\90\8cæ\96¹å¼\8få\85±享",
        "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,这并非必要条件。\n\n如果您希望使用来自维基百科的内容,并希望维基百科能接受复制自您的wiki的内容,您应当选择<strong>知识共享-署名-相同方式共享</strong>。\n\nGNU自由文档许可证是维基百科曾经使用过的许可证,并迄今有效。然而,该许可证难以理解,并会增加重用内容的难度。",
+       "config-license-help": "许多公共wiki将所有用户贡献置于[http://freedomdefined.org/Definition 自由许可证]之下。这有助于构建社区的主人翁意识,并鼓励长期贡献。对于非公共wiki或公司wiki,这并非必要条件。\n\n如果您希望使用来自维基百科的内容,并希望维基百科能接受复制自您的wiki的内容,您应当选择<strong>{{int:config-license-cc-by-sa}}</strong>\n\nGNU自由文档许可证是维基百科曾经使用过的许可证,并迄今有效。然而,该许可证难以理解,并会增加重用内容的难度。",
        "config-email-settings": "电子邮件设置",
        "config-enable-email": "启用出站电子邮件",
        "config-enable-email-help": "如果您希望使用电子邮件功能,请正确配置[http://www.php.net/manual/en/mail.configuration.php PHP的邮件设定]。如果您不需要任何电子邮件功能,请在此处禁用它。",
        "config-memcache-badport": "Memcached的端口号应该在$1到$2之间。",
        "config-extensions": "扩展程序",
        "config-extensions-help": "已在您的<code>./extensions</code>目录中发现下列扩展。\n\n您可能要对它们进行额外的配置,但您现在可以启用它们。",
+       "config-skins": "皮肤",
+       "config-skins-help": "在您的<code>./skins</code>目录中检测到上面列出的皮肤。您必须选择至少一个,并选择一个默认值。",
+       "config-skins-use-as-default": "使用此皮肤作为默认皮肤",
+       "config-skins-missing": "没有找到皮肤;MediaWiki将使用备选皮肤直到您自行安装一个后。",
+       "config-skins-must-enable-some": "您必须选择至少一个皮肤以起用。",
+       "config-skins-must-enable-default": "默认选择的皮肤必须启用。",
        "config-install-alreadydone": "'''警告:'''您似乎已经安装了MediaWiki,并试图重新安装它。请前往下一个页面。",
        "config-install-begin": "点击“{{int:config-continue}}”后,您将开始安装MediaWiki。如果您还想对配置作一些修改,请点击“{{int:config-back}}”。",
        "config-install-step-done": "完成",
index a6e87cf..ed7c44b 100644 (file)
@@ -10,7 +10,9 @@
                        "아라",
                        "Liuxinyu970226",
                        "Xiaomingyan",
-                       "Cwlin0416"
+                       "Cwlin0416",
+                       "S8321414",
+                       "LNDDYL"
                ]
        },
        "config-desc": "MediaWiki 安裝程式",
@@ -55,7 +57,6 @@
        "config-env-good": "環境檢查已完成。\n您可以安裝 MediaWiki。",
        "config-env-bad": "環境檢查已完成。\n您無法安裝 MediaWiki。",
        "config-env-php": "PHP $1 已安裝。",
-       "config-env-php-toolow": "已安裝 PHP $1。\n但 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": "<strong>警告:</strong> 無法使用 [http://pecl.php.net/intl intl PECL 擴充套件] 處理 Unicode 正規化,故回退使用純 PHP 實作的正規化程式,此方式處理速度較緩慢。\n\n如果您的網站瀏覽人次很高,您應先閱讀 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/zh Unicode 正規化]。",
@@ -63,7 +64,7 @@
        "config-no-db": "找不到合適的資料庫驅動程式!您需要安裝 PHP 資料庫驅動程式。\n目前支援以下類型的資料庫: $1 。\n\n如果您是自行編譯 PHP,您必須重新設定並開啟資料庫客戶端,例:使用 <code>./configure --with-mysqli</code> 指令參數。\n如果您是使用 Debian 或 Ubuntu 的套件安裝,您則需要額外安裝,例:<code>php5-mysql</code> 套件。",
        "config-outdated-sqlite": "<strong>警告:</strong>您已安裝 SQLite $1,但是它的版本低於最低需求版本 $2。 因此您無法使用 SQLite。",
        "config-no-fts3": "<strong>警告:</strong> SQLite 編譯時未包含 [//sqlite.org/fts3.html FTS3 模組],後台搜尋功能將無法使用。",
-       "config-register-globals": "<strong>警告:PHP 的<code>[http://php.net/register_globals register_globals]</code>選項已開啟,如果可以請關閉該選項。</strong>\nMediaWiki 仍可正常執行,但您的伺服器將會有潛藏的安全性問題。",
+       "config-register-globals-error": "<strong>錯誤:PHP 的 <code>[http://php.net/register_globals register_globals]</code> 選項已開啟。\n要繼續安裝程序必須關閉該選項。</strong>\n請參考 [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] 以取得操作說明。",
        "config-magic-quotes-runtime": "<strong>嚴重:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] 選項被開啟!</strong>\n此選項會導致資料在無法預測的情況下損壞。\n您必須將開選項關閉方可繼續安裝 MediaWiki。",
        "config-magic-quotes-sybase": "<strong>嚴重:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] 選項被開啟!</strong>\n此選項會導致資料在無法預測的情況下損壞。\n您必須將開選項關閉方可繼續安裝 MediaWiki。",
        "config-mbstring": "<strong>嚴重:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] 選項被開啟!</strong>\n此選項會導致資料在無法預測的情況下損壞。\n您必須將開選項關閉方可繼續安裝 MediaWiki。",
        "config-admin-password-blank": "輸入管理員帳號密碼。",
        "config-admin-password-mismatch": "兩次輸入的密碼並不相同。",
        "config-admin-email": "電子郵件位址:",
-       "config-admin-email-help": "在此輸入的電子郵件信箱可用來接收 Wiki 上其他使用者所發送的訊息、重設您的密碼與通知監視列表中頁面更動。您可將此欄位留空。",
+       "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-admin-error-bademail": "您輸入了不正確的電子郵件址。",
        "config-subscribe": "訂閱 [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 發佈公告郵寄清單]。",
        "config-subscribe-help": "這是一個用於發佈公告的低郵件量郵寄清單,內容包括重要的安全公告。\n您應該訂閱它並在 MediaWiki 發佈新版的時候更新系統。",
-       "config-subscribe-noemail": "您正嘗試不填寫電子郵件地址訂閱發佈公告郵寄清單。 \n請如果您希望訂閱郵寄清單,請提供一個有效的電子郵件地址。",
+       "config-subscribe-noemail": "您正嘗試不填寫電子郵件位址訂閱發佈公告郵寄清單。 \n請如果您希望訂閱郵寄清單,請提供一個有效的電子郵件位址。",
        "config-almost-done": "您快要完成了!\n您現在可以跳過其餘的設定項目並且立即安裝 Wiki。",
        "config-optional-continue": "多問我一些問題吧。",
        "config-optional-skip": "我已經不耐煩了,請趕緊安裝 Wiki。",
        "config-license-gfdl": "GNU 自由文件授權條款 1.3 或更高版本",
        "config-license-pd": "公共領域",
        "config-license-cc-choose": "請選擇一個自訂的創作共用授權條款",
-       "config-license-help": "許多開放式 Wiki 會以 [http://freedomdefined.org/Definition 自由授權條款] 的方式釋放出編者的所有貢獻,這有助於構建社群的所有權,並且能鼓勵長期貢獻。對於封閉式的 Wiki 或公司 Wiki,則是非必要的。\n\n如果您希望使用來自維基百科(Wikipedia)的內容,並希望維基百科能接受您的 Wiki 內容,請應選擇 <strong>創作共用 Attribution Share Alike</strong> 授權條款。\n\n維基百科̽(Wikipedia)先前是使用 GNU 自由文件授權條款,\n但該授權條款的內容較難理解,因此較難再利用在該條款底下的內容。",
+       "config-license-help": "許多開放式 Wiki 會以 [http://freedomdefined.org/Definition 自由授權條款] 的方式釋放出編者的所有貢獻,這有助於構建社群的所有權,並且能鼓勵長期貢獻。對於封閉式的 Wiki 或公司 Wiki 則是非必要的。\n\n如果您希望使用來自維基百科(Wikipedia)的內容,並希望維基百科能接受您的 Wiki 內容,請應選擇 <strong>{{int:config-license-cc-by-sa}}</strong> 授權條款。\n\n維基百科̽(Wikipedia)先前是使用 GNU 自由文件授權條款,\n但該授權條款的內容較難理解,因此較難再利用在該條款底下的內容。",
        "config-email-settings": "E-mail 設定",
        "config-enable-email": "開啟外寄電子郵件",
        "config-enable-email-help": "如果您要使用電子郵件功能,請正確設定 [http://www.php.net/manual/en/mail.configuration.php PHP 的郵件設定]。\n如果您不需要使用電子郵件功能,請在此處關閉。",
        "config-email-user": "開啟使用者對使用者間的電子郵件互通",
-       "config-email-user-help": "若使用者在個人偏好開啟了此功能,則可允許使用者間相互發送郵件。",
+       "config-email-user-help": "若使用者在個人偏好設定開啟了此功能,則可允許使用者間相互傳送郵件。",
        "config-email-usertalk": "開啟使用者討論頁面通知",
        "config-email-usertalk-help": "若使用者在個人偏好開啟了此功能,則可收到使用者討論頁面被修改的通知。",
-       "config-email-watchlist": "開啟監視列表通知",
+       "config-email-watchlist": "開啟監視清單通知",
        "config-email-watchlist-help": "若使用者在個人偏好開啟了此功能,允許使用者收到與其監視列表有關的通知。",
        "config-email-auth": "開啟電子郵件身份認證",
        "config-email-auth-help": "若開啟此選項,使用者不論設定或者更改電子郵件地址,都必須透過收信的方式確認沒有問題。\n只有驗證過的電子郵件地址可以收到來自其他使用者或修改通知的信件。\n公開的 Wiki 會 <strong>建議</strong> 設定此選項,以防使用者濫用電子郵件功能。",
-       "config-email-sender": "電子郵件回覆址:",
+       "config-email-sender": "電子郵件回覆址:",
        "config-email-sender-help": "請輸入要用來做為外寄郵件的電子郵件回覆地址。\n該郵件地址會收到被拒收的信件。\n許多郵件伺服器會要求使用有效的網域名稱。",
        "config-upload-settings": "圖片和檔案上傳",
        "config-upload-enable": "開啟檔案上傳",
        "config-memcache-badport": "Memcached 埠號應介於 $1 到 $2 之間。",
        "config-extensions": "擴充套件",
        "config-extensions-help": "已在您的 <code>./extensions</code> 目錄中發現下列擴充套件。\n\n這些擴充套件可能需要做額外的設定,但您可以現在先開啟功能。",
+       "config-skins": "外觀",
+       "config-skins-use-as-default": "使用這種外觀作為預設",
+       "config-skins-missing": "沒有發現任何外觀;MediaWiki在您安裝一些恰當的外觀前將會使用備用外觀。",
+       "config-skins-must-enable-some": "您必須至少選擇一個外觀以啟用。",
+       "config-skins-must-enable-default": "必須啟用選為預設的外觀。",
        "config-install-alreadydone": "<strong>警告:</strong>您已經安裝 MediaWiki,並且試圖重新安裝。\n請點繼續前往下一個頁面。",
        "config-install-begin": "請點選 \"{{int:config-continue}}\" 開始安裝 MediaWiki。\n若您還想要修改設定,請點選 \"{{int:config-back}}\"。",
        "config-install-step-done": "完成",
index 09283f2..55b2506 100644 (file)
@@ -45,7 +45,7 @@ class Interwiki {
         */
        protected $mWikiID;
 
-       /** @var bool whether the wiki is in this project */
+       /** @var bool Whether the wiki is in this project */
        protected $mLocal;
 
        /** @var bool Whether interwiki transclusions are allowed */
@@ -118,7 +118,7 @@ class Interwiki {
         * @note More logic is explained in DefaultSettings.
         *
         * @param string $prefix Interwiki prefix
-        * @return Interwiki object
+        * @return Interwiki
         */
        protected static function getInterwikiCached( $prefix ) {
                $value = self::getInterwikiCacheEntry( $prefix );
index 35b4f13..ee3f2c2 100644 (file)
@@ -279,7 +279,7 @@ abstract class Job implements IJobSpecification {
 
        /**
         * Insert a single job into the queue.
-        * @return bool true on success
+        * @return bool True on success
         * @deprecated since 1.21
         */
        public function insert() {
@@ -291,7 +291,7 @@ abstract class Job implements IJobSpecification {
         * @return string
         */
        public function toString() {
-               $truncFunc = function( $value ) {
+               $truncFunc = function ( $value ) {
                        $value = (string)$value;
                        if ( mb_strlen( $value ) > 1024 ) {
                                $value = "string(" . mb_strlen( $value ) . ")";
index d6f9560..c4301ee 100644 (file)
@@ -64,7 +64,7 @@ class JobQueueFederated extends JobQueue {
        const CACHE_TTL_LONG = 300; // integer; seconds to cache info that is kept up to date
 
        /**
-        * @params include:
+        * @param array $params Possible keys:
         *  - sectionsByWiki      : A map of wiki IDs to section names.
         *                          Wikis will default to using the section "default".
         *  - partitionsBySection : Map of section names to maps of (partition name => weight).
@@ -80,7 +80,6 @@ class JobQueueFederated extends JobQueue {
         *                          different partition queues. This improves availability
         *                          during failure, at the cost of added latency and somewhat
         *                          less reliable job de-duplication mechanisms.
-        * @param array $params
         * @throws MWException
         */
        protected function __construct( array $params ) {
@@ -282,7 +281,7 @@ class JobQueueFederated extends JobQueue {
                        }
                        if ( $ok ) {
                                $key = $this->getCacheKey( 'empty' );
-                               $this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
+                               $this->cache->set( $key, 'false', self::CACHE_TTL_LONG );
                        } else {
                                if ( !$partitionRing->ejectFromLiveRing( $partition, 5 ) ) { // blacklist
                                        throw new JobQueueError( "Could not insert job(s), no partitions available." );
@@ -304,7 +303,7 @@ class JobQueueFederated extends JobQueue {
                        }
                        if ( $ok ) {
                                $key = $this->getCacheKey( 'empty' );
-                               $this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
+                               $this->cache->set( $key, 'false', self::CACHE_TTL_LONG );
                        } else {
                                if ( !$partitionRing->ejectFromLiveRing( $partition, 5 ) ) { // blacklist
                                        throw new JobQueueError( "Could not insert job(s), no partitions available." );
@@ -317,13 +316,6 @@ class JobQueueFederated extends JobQueue {
        }
 
        protected function doPop() {
-               $key = $this->getCacheKey( 'empty' );
-
-               $isEmpty = $this->cache->get( $key );
-               if ( $isEmpty === 'true' ) {
-                       return false;
-               }
-
                $partitionsTry = $this->partitionRing->getLiveLocationWeights(); // (partition => weight)
 
                $failed = 0;
@@ -352,7 +344,8 @@ class JobQueueFederated extends JobQueue {
                }
                $this->throwErrorIfAllPartitionsDown( $failed );
 
-               $this->cache->set( $key, 'true', JobQueueDB::CACHE_TTL_LONG );
+               $key = $this->getCacheKey( 'empty' );
+               $this->cache->set( $key, 'true', self::CACHE_TTL_LONG );
 
                return false;
        }
index 522bae1..3519eac 100644 (file)
@@ -73,7 +73,7 @@ class JobQueueRedis extends JobQueue {
        protected $key;
 
        /**
-        * @params include:
+        * @param array $params Possible keys:
         *   - redisConfig : An array of parameters to RedisConnectionPool::__construct().
         *                   Note that the serializer option is ignored as "none" is always used.
         *   - redisServer : A hostname/port combination or the absolute path of a UNIX socket.
@@ -83,7 +83,6 @@ class JobQueueRedis extends JobQueue {
         *   - daemonized  : Set to true if the redisJobRunnerService runs in the background.
         *                   This will disable job recycling/undelaying from the MediaWiki side
         *                   to avoid redundance and out-of-sync configuration.
-        * @param array $params
         */
        public function __construct( array $params ) {
                parent::__construct( $params );
diff --git a/includes/jobqueue/JobRunner.php b/includes/jobqueue/JobRunner.php
new file mode 100644 (file)
index 0000000..9a4073f
--- /dev/null
@@ -0,0 +1,296 @@
+<?php
+/**
+ * Job queue runner utility methods
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Job queue runner utility methods
+ *
+ * @ingroup JobQueue
+ * @since 1.24
+ */
+class JobRunner {
+       /** @var callable|null Debug output handler */
+       protected $debug;
+
+       /**
+        * @param callable $debug Optional debug output handler
+        */
+       public function setDebugHandler( $debug ) {
+               $this->debug = $debug;
+       }
+
+       /**
+        * Run jobs of the specified number/type for the specified time
+        *
+        * The response map has a 'job' field that lists status of each job, including:
+        *   - type   : the job type
+        *   - status : ok/failed
+        *   - error  : any error message string
+        *   - time   : the job run time in ms
+        * The response map also has:
+        *   - backoffs : the (job type => seconds) map of backoff times
+        *   - elapsed  : the total time spent running tasks in ms
+        *   - reached  : the reason the script finished, one of (none-ready, job-limit, time-limit)
+        *
+        * This method outputs status information only if a debug handler was set.
+        * Any exceptions are caught and logged, but are not reported as output.
+        *
+        * @param array $options
+        * @return array Summary response that can easily be JSON serialized
+        */
+       public function run( array $options ) {
+               $response = array( 'jobs' => array(), 'reached' => 'none-ready' );
+
+               $type = isset( $options['type'] ) ? $options['type'] : false;
+               $maxJobs = isset( $options['maxJobs'] ) ? $options['maxJobs'] : false;
+               $maxTime = isset( $options['maxTime'] ) ? $options['maxTime'] : false;
+               $noThrottle = isset( $options['throttle'] ) && !$options['throttle'];
+
+               $group = JobQueueGroup::singleton();
+               // Handle any required periodic queue maintenance
+               $count = $group->executeReadyPeriodicTasks();
+               if ( $count > 0 ) {
+                       $this->runJobsLog( "Executed $count periodic queue task(s)." );
+               }
+
+               // Flush any pending DB writes for sanity
+               wfGetLBFactory()->commitMasterChanges();
+
+               $backoffs = $this->loadBackoffs(); // map of (type => UNIX expiry)
+               $startingBackoffs = $backoffs; // avoid unnecessary writes
+               $backoffExpireFunc = function ( $t ) {
+                       return $t > time();
+               };
+
+               $jobsRun = 0; // counter
+               $timeMsTotal = 0;
+               $flags = JobQueueGroup::USE_CACHE;
+               $startTime = microtime( true ); // time since jobs started running
+               $lastTime = microtime( true ); // time since last slave check
+               do {
+                       $backoffs = array_filter( $backoffs, $backoffExpireFunc );
+                       $blacklist = $noThrottle ? array() : array_keys( $backoffs );
+                       if ( $type === false ) {
+                               $job = $group->pop( JobQueueGroup::TYPE_DEFAULT, $flags, $blacklist );
+                       } elseif ( in_array( $type, $blacklist ) ) {
+                               $job = false; // requested queue in backoff state
+                       } else {
+                               $job = $group->pop( $type ); // job from a single queue
+                       }
+                       if ( $job ) { // found a job
+                               $jType = $job->getType();
+
+                               $this->runJobsLog( $job->toString() . " STARTING" );
+
+                               // Run the job...
+                               wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
+                               $t = microtime( true );
+                               try {
+                                       ++$jobsRun;
+                                       $status = $job->run();
+                                       $error = $job->getLastError();
+                                       wfGetLBFactory()->commitMasterChanges();
+                               } catch ( MWException $e ) {
+                                       MWExceptionHandler::rollbackMasterChangesAndLog( $e );
+                                       $status = false;
+                                       $error = get_class( $e ) . ': ' . $e->getMessage();
+                                       MWExceptionHandler::logException( $e );
+                               }
+                               $timeMs = intval( ( microtime( true ) - $t ) * 1000 );
+                               wfProfileOut( __METHOD__ . '-' . get_class( $job ) );
+                               $timeMsTotal += $timeMs;
+
+                               // Mark the job as done on success or when the job cannot be retried
+                               if ( $status !== false || !$job->allowRetries() ) {
+                                       $group->ack( $job ); // done
+                               }
+
+                               if ( $status === false ) {
+                                       $this->runJobsLog( $job->toString() . " t=$timeMs error={$error}" );
+                               } else {
+                                       $this->runJobsLog( $job->toString() . " t=$timeMs good" );
+                               }
+
+                               $response['jobs'][] = array(
+                                       'type'   => $jType,
+                                       'status' => ( $status === false ) ? 'failed' : 'ok',
+                                       'error'  => $error,
+                                       'time'   => $timeMs
+                               );
+
+                               // Back off of certain jobs for a while (for throttling and for errors)
+                               $ttw = $this->getBackoffTimeToWait( $job );
+                               if ( $status === false && mt_rand( 0, 49 ) == 0 ) {
+                                       $ttw = max( $ttw, 30 );
+                               }
+                               if ( $ttw > 0 ) {
+                                       $backoffs[$jType] = isset( $backoffs[$jType] ) ? $backoffs[$jType] : 0;
+                                       $backoffs[$jType] = max( $backoffs[$jType], time() + $ttw );
+                               }
+
+                               // Break out if we hit the job count or wall time limits...
+                               if ( $maxJobs && $jobsRun >= $maxJobs ) {
+                                       $response['reached'] = 'job-limit';
+                                       break;
+                               } elseif ( $maxTime && ( microtime( true ) - $startTime ) > $maxTime ) {
+                                       $response['reached'] = 'time-limit';
+                                       break;
+                               }
+
+                               // Don't let any of the main DB slaves get backed up
+                               $timePassed = microtime( true ) - $lastTime;
+                               if ( $timePassed >= 5 || $timePassed < 0 ) {
+                                       wfWaitForSlaves( $lastTime );
+                                       $lastTime = microtime( true );
+                               }
+                               // Don't let any queue slaves/backups fall behind
+                               if ( $jobsRun > 0 && ( $jobsRun % 100 ) == 0 ) {
+                                       $group->waitForBackups();
+                               }
+
+                               // Bail if near-OOM instead of in a job
+                               $this->assertMemoryOK();
+                       }
+               } while ( $job ); // stop when there are no jobs
+
+               // Sync the persistent backoffs for the next runJobs.php pass
+               $backoffs = array_filter( $backoffs, $backoffExpireFunc );
+               if ( $backoffs !== $startingBackoffs ) {
+                       $this->syncBackoffs( $backoffs );
+               }
+
+               $response['backoffs'] = $backoffs;
+               $response['elapsed'] = $timeMsTotal;
+
+               return $response;
+       }
+
+       /**
+        * @param Job $job
+        * @return int Seconds for this runner to avoid doing more jobs of this type
+        * @see $wgJobBackoffThrottling
+        */
+       private function getBackoffTimeToWait( Job $job ) {
+               global $wgJobBackoffThrottling;
+
+               if ( !isset( $wgJobBackoffThrottling[$job->getType()] ) ||
+                       $job instanceof DuplicateJob // no work was done
+               ) {
+                       return 0; // not throttled
+               }
+
+               $itemsPerSecond = $wgJobBackoffThrottling[$job->getType()];
+               if ( $itemsPerSecond <= 0 ) {
+                       return 0; // not throttled
+               }
+
+               $seconds = 0;
+               if ( $job->workItemCount() > 0 ) {
+                       $exactSeconds = $job->workItemCount() / $itemsPerSecond;
+                       // use randomized rounding
+                       $seconds = floor( $exactSeconds );
+                       $remainder = $exactSeconds - $seconds;
+                       $seconds += ( mt_rand() / mt_getrandmax() < $remainder ) ? 1 : 0;
+               }
+
+               return (int)$seconds;
+       }
+
+       /**
+        * Get the previous backoff expiries from persistent storage
+        *
+        * @return array Map of (job type => backoff expiry timestamp)
+        */
+       private function loadBackoffs() {
+               $section = new ProfileSection( __METHOD__ );
+
+               $backoffs = array();
+               $file = wfTempDir() . '/mw-runJobs-backoffs.json';
+               if ( is_file( $file ) ) {
+                       $handle = fopen( $file, 'rb' );
+                       flock( $handle, LOCK_SH );
+                       $content = stream_get_contents( $handle );
+                       flock( $handle, LOCK_UN );
+                       fclose( $handle );
+                       $backoffs = json_decode( $content, true ) ? : array();
+               }
+
+               return $backoffs;
+       }
+
+       /**
+        * Merge the current backoff expiries from persistent storage
+        *
+        * @param array $backoffs Map of (job type => backoff expiry timestamp)
+        */
+       private function syncBackoffs( array $backoffs ) {
+               $section = new ProfileSection( __METHOD__ );
+
+               $file = wfTempDir() . '/mw-runJobs-backoffs.json';
+               $handle = fopen( $file, 'wb+' );
+               flock( $handle, LOCK_EX );
+               $content = stream_get_contents( $handle );
+               $cBackoffs = json_decode( $content, true ) ? : array();
+               foreach ( $backoffs as $type => $timestamp ) {
+                       $cBackoffs[$type] = isset( $cBackoffs[$type] ) ? $cBackoffs[$type] : 0;
+                       $cBackoffs[$type] = max( $cBackoffs[$type], $backoffs[$type] );
+               }
+               ftruncate( $handle, 0 );
+               fwrite( $handle, json_encode( $backoffs ) );
+               flock( $handle, LOCK_UN );
+               fclose( $handle );
+       }
+
+       /**
+        * Make sure that this script is not too close to the memory usage limit.
+        * It is better to die in between jobs than OOM right in the middle of one.
+        * @throws MWException
+        */
+       private function assertMemoryOK() {
+               static $maxBytes = null;
+               if ( $maxBytes === null ) {
+                       $m = array();
+                       if ( preg_match( '!^(\d+)(k|m|g|)$!i', ini_get( 'memory_limit' ), $m ) ) {
+                               list( , $num, $unit ) = $m;
+                               $conv = array( 'g' => 1073741824, 'm' => 1048576, 'k' => 1024, '' => 1 );
+                               $maxBytes = $num * $conv[strtolower( $unit )];
+                       } else {
+                               $maxBytes = 0;
+                       }
+               }
+               $usedBytes = memory_get_usage();
+               if ( $maxBytes && $usedBytes >= 0.95 * $maxBytes ) {
+                       throw new MWException( "Detected excessive memory usage ($usedBytes/$maxBytes)." );
+               }
+       }
+
+       /**
+        * Log the job message
+        * @param string $msg The message to log
+        */
+       private function runJobsLog( $msg ) {
+               if ( $this->debug ) {
+                       call_user_func_array( $this->debug, array( wfTimestamp( TS_DB ) . " $msg\n" ) );
+               }
+               wfDebugLog( 'runJobs', $msg );
+       }
+}
index d733a42..ae266ef 100644 (file)
@@ -34,11 +34,10 @@ class JobQueueAggregatorMemc extends JobQueueAggregator {
        protected $cacheTTL; // integer; seconds
 
        /**
-        * @params include:
+        * @param array $params Possible keys:
         *   - objectCache : Name of an object cache registered in $wgObjectCaches.
         *                   This defaults to the one specified by $wgMainCacheType.
         *   - cacheTTL    : Seconds to cache the aggregate data before regenerating.
-        * @param array $params
         */
        protected function __construct( array $params ) {
                parent::__construct( $params );
index df9ae39..db9e764 100644 (file)
@@ -36,20 +36,20 @@ class JobQueueAggregatorRedis extends JobQueueAggregator {
        protected $servers;
 
        /**
-        * @params include:
+        * @param array $params Possible keys:
         *   - redisConfig  : An array of parameters to RedisConnectionPool::__construct().
         *   - redisServers : Array of server entries, the first being the primary and the
         *                    others being fallback servers. Each entry is either a hostname/port
         *                    combination or the absolute path of a UNIX socket.
         *                    If a hostname is specified but no port, the standard port number
         *                    6379 will be used. Required.
-        * @param array $params
         */
        protected function __construct( array $params ) {
                parent::__construct( $params );
                $this->servers = isset( $params['redisServers'] )
                        ? $params['redisServers']
                        : array( $params['redisServer'] ); // b/c
+               $params['redisConfig']['serializer'] = 'none';
                $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
        }
 
@@ -94,18 +94,16 @@ class JobQueueAggregatorRedis extends JobQueueAggregator {
                        return array();
                }
                try {
-                       $conn->multi( Redis::PIPELINE );
-                       $conn->exists( $this->getReadyQueueKey() );
-                       $conn->hGetAll( $this->getReadyQueueKey() );
-                       list( $exists, $map ) = $conn->exec();
+                       $map = $conn->hGetAll( $this->getReadyQueueKey() );
 
-                       if ( $exists ) { // cache hit
+                       if ( is_array( $map ) && isset( $map['_epoch'] ) ) {
+                               unset( $map['_epoch'] ); // ignore
                                $pendingDBs = array(); // (type => list of wikis)
                                foreach ( $map as $key => $time ) {
                                        list( $type, $wiki ) = $this->dencQueueName( $key );
                                        $pendingDBs[$type][] = $wiki;
                                }
-                       } else { // cache miss
+                       } else {
                                // Avoid duplicated effort
                                $rand = wfRandomString( 32 );
                                $conn->multi( Redis::MULTI );
@@ -120,7 +118,7 @@ class JobQueueAggregatorRedis extends JobQueueAggregator {
 
                                $conn->multi( Redis::PIPELINE );
                                $now = time();
-                               $map = array();
+                               $map = array( '_epoch' => time() ); // dummy key for empty Redis collections
                                foreach ( $pendingDBs as $type => $wikis ) {
                                        $conn->hSetNx( $this->getQueueTypesKey(), $type, 'enabled' );
                                        foreach ( $wikis as $wiki ) {
@@ -189,14 +187,14 @@ class JobQueueAggregatorRedis extends JobQueueAggregator {
         * @return string
         */
        private function getReadyQueueKey() {
-               return "jobqueue:aggregator:h-ready-queues:v1"; // global
+               return "jobqueue:aggregator:h-ready-queues:v2"; // global
        }
 
        /**
         * @return string
         */
        private function getQueueTypesKey() {
-               return "jobqueue:aggregator:h-queue-types:v1"; // global
+               return "jobqueue:aggregator:h-queue-types:v2"; // global
        }
 
        /**
index b0a6ef7..1fa6cef 100644 (file)
@@ -31,7 +31,7 @@ final class DuplicateJob extends Job {
         * Callers should use DuplicateJob::newFromJob() instead
         *
         * @param Title $title
-        * @param array $params job parameters
+        * @param array $params Job parameters
         */
        function __construct( $title, $params ) {
                parent::__construct( 'duplicate', $title, $params );
index b2d6a9a..66291e9 100644 (file)
@@ -47,7 +47,7 @@
 class NullJob extends Job {
        /**
         * @param Title $title
-        * @param array $params job parameters (lives, usleep)
+        * @param array $params Job parameters (lives, usleep)
         */
        function __construct( $title, $params ) {
                parent::__construct( 'null', $title, $params );
index 480246b..a09db15 100644 (file)
@@ -155,8 +155,8 @@ class UploadFromUrlJob extends Job {
         * Store a result in the session data. Note that the caller is responsible
         * for appropriate session_start and session_write_close calls.
         *
-        * @param string $result the result (Success|Warning|Failure)
-        * @param string $dataKey the key of the extra data
+        * @param string $result The result (Success|Warning|Failure)
+        * @param string $dataKey The key of the extra data
         * @param mixed $dataValue The extra data itself
         */
        protected function storeResultInSession( $result, $dataKey, $dataValue ) {
index 4f0651d..30b92c7 100644 (file)
@@ -301,7 +301,7 @@ class CSSJanus {
                // (We can't just negate the value with unary minus due to the units.)
                $flipSign = function ( $cssValue ) {
                        // Don't mangle zeroes
-                       if ( intval( $cssValue ) === 0 ) {
+                       if ( floatval( $cssValue ) === 0.0 ) {
                                return $cssValue;
                        } elseif ( $cssValue[0] === '-' ) {
                                return substr( $cssValue, 1 );
index 4ce8070..4dc25ef 100644 (file)
@@ -355,9 +355,13 @@ class LogEventsList extends ContextSource {
                // Don't show useless checkbox to people who cannot hide log entries
                if ( $user->isAllowed( 'deletedhistory' ) ) {
                        $canHide = $user->isAllowed( 'deletelogentry' );
+                       $canViewSuppressedOnly = $user->isAllowed( 'viewsuppressed' ) &&
+                               !$user->isAllowed( 'suppressrevision' );
+                       $entryIsSuppressed = self::isDeleted( $row, LogPage::DELETED_RESTRICTED );
+                       $canViewThisSuppressedEntry = $canViewSuppressedOnly && $entryIsSuppressed;
                        if ( $row->log_deleted || $canHide ) {
                                // Show checkboxes instead of links.
-                               if ( $canHide && $this->flags & self::USE_REVDEL_CHECKBOXES ) {
+                               if ( $canHide && $this->flags & self::USE_REVDEL_CHECKBOXES && !$canViewThisSuppressedEntry ) {
                                        // If event was hidden from sysops
                                        if ( !self::userCan( $row, LogPage::DELETED_RESTRICTED, $user ) ) {
                                                $del = Xml::check( 'deleterevisions', false, array( 'disabled' => 'disabled' ) );
@@ -380,8 +384,8 @@ class LogEventsList extends ContextSource {
                                                );
                                                $del = Linker::revDeleteLink(
                                                        $query,
-                                                       self::isDeleted( $row, LogPage::DELETED_RESTRICTED ),
-                                                       $canHide
+                                                       $entryIsSuppressed,
+                                                       $canHide && !$canViewThisSuppressedEntry
                                                );
                                        }
                                }
@@ -437,20 +441,19 @@ class LogEventsList extends ContextSource {
         */
        public static function userCanBitfield( $bitfield, $field, User $user = null ) {
                if ( $bitfield & $field ) {
-                       if ( $bitfield & LogPage::DELETED_RESTRICTED ) {
-                               $permission = 'suppressrevision';
-                       } else {
-                               $permission = 'deletedhistory';
-                       }
-                       wfDebug( "Checking for $permission due to $field match on $bitfield\n" );
                        if ( $user === null ) {
                                global $wgUser;
                                $user = $wgUser;
                        }
-
-                       return $user->isAllowed( $permission );
+                       if ( $bitfield & LogPage::DELETED_RESTRICTED ) {
+                               $permissions = array( 'suppressrevision', 'viewsuppressed' );
+                       } else {
+                               $permissions = array( 'deletedhistory' );
+                       }
+                       $permissionlist = implode( ', ', $permissions );
+                       wfDebug( "Checking for $permissionlist due to $field match on $bitfield\n" );
+                       return call_user_func_array( array( $user, 'isAllowedAny' ), $permissions );
                }
-
                return true;
        }
 
index 0139c4a..92985f3 100644 (file)
@@ -112,7 +112,7 @@ class LogFormatter {
         * 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 int $audience self::FOR_THIS_USER or self::FOR_PUBLIC
+        * @param int $audience Const self::FOR_THIS_USER or self::FOR_PUBLIC
         */
        public function setAudience( $audience ) {
                $this->audience = ( $audience == self::FOR_THIS_USER )
@@ -163,7 +163,7 @@ class LogFormatter {
         * Even uglier hack to maintain backwards compatibilty with IRC bots
         * (bug 34508).
         * @see getActionText()
-        * @return string text
+        * @return string Text
         */
        public function getIRCActionComment() {
                $actionComment = $this->getIRCActionText();
@@ -184,7 +184,7 @@ class LogFormatter {
         * Even uglier hack to maintain backwards compatibilty with IRC bots
         * (bug 34508).
         * @see getActionText()
-        * @return string text
+        * @return string Text
         */
        public function getIRCActionText() {
                $this->plaintext = true;
@@ -482,8 +482,7 @@ class LogFormatter {
         *     * number: Format value as number
         * @param string $value The parameter value that should
         *                      be formated
-        * @return string|Message::numParam|Message::rawParam
-        *         Formated value
+        * @return string|array Formated value
         * @since 1.21
         */
        protected function formatParameterValue( $type, $value ) {
@@ -652,7 +651,7 @@ class LogFormatter {
        }
 
        /**
-        * @return array of titles that should be preloaded with LinkBatch.
+        * @return array Array of titles that should be preloaded with LinkBatch
         */
        public function getPreloadTitles() {
                return array();
index 1b7e677..be7931d 100644 (file)
@@ -87,7 +87,7 @@ class LogPage {
        }
 
        /**
-        * @return int log_id of the inserted log entry
+        * @return int The log_id of the inserted log entry
         */
        protected function saveContent() {
                global $wgLogRestrictions;
@@ -192,7 +192,7 @@ class LogPage {
        /**
         * Get the list of valid log types
         *
-        * @return array of strings
+        * @return array Array of strings
         */
        public static function validTypes() {
                global $wgLogTypes;
@@ -234,7 +234,7 @@ class LogPage {
         * Get the log header for the given log type
         *
         * @todo handle missing log types
-        * @param string $type logtype
+        * @param string $type Logtype
         * @return string Header text of this logtype
         * @deprecated since 1.19, warnings in 1.21. Use getDescription()
         */
@@ -250,12 +250,12 @@ class LogPage {
         * Generate text for a log entry.
         * Only LogFormatter should call this function.
         *
-        * @param string $type log type
-        * @param string $action log action
+        * @param string $type Log type
+        * @param string $action Log action
         * @param Title|null $title Title object or null
         * @param Skin|null $skin Skin object or null. If null, we want to use the wiki
         *   content language, since that will go to the IRC feed.
-        * @param array $params parameters
+        * @param array $params Parameters
         * @param bool $filterWikilinks Whether to filter wiki links
         * @return string HTML
         */
@@ -440,14 +440,14 @@ class LogPage {
        /**
         * Add a log entry
         *
-        * @param string $action one of '', 'block', 'protect', 'rights', 'delete',
+        * @param string $action One of '', 'block', 'protect', 'rights', 'delete',
         *   'upload', 'move', 'move_redir'
         * @param Title $target Title object
-        * @param string $comment description associated
-        * @param array $params parameters passed later to wfMessage function
+        * @param string $comment Description associated
+        * @param array $params Parameters passed later to wfMessage function
         * @param null|int|User $doer The user doing the action. null for $wgUser
         *
-        * @return int log_id of the inserted log entry
+        * @return int The log_id of the inserted log entry
         */
        public function addEntry( $action, $target, $comment, $params = array(), $doer = null ) {
                global $wgContLang;
index 399c799..256934e 100644 (file)
@@ -175,7 +175,7 @@ class LogPager extends ReverseChronologicalPager {
                $user = $this->getUser();
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::DELETED_USER ) . ' = 0';
-               } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+               } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
                        $this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::SUPPRESSED_USER ) .
                                ' != ' . LogPage::SUPPRESSED_USER;
                }
@@ -207,6 +207,18 @@ class LogPager extends ReverseChronologicalPager {
                $ns = $title->getNamespace();
                $db = $this->mDb;
 
+               $doUserRightsLogLike = false;
+               if ( $this->types == array( 'rights' ) ) {
+                       global $wgUserrightsInterwikiDelimiter;
+                       $parts = explode( $wgUserrightsInterwikiDelimiter, $title->getDBKey() );
+                       if ( count( $parts ) == 2 ) {
+                               list( $name, $database ) = array_map( 'trim', $parts );
+                               if ( strstr( $database, '*' ) ) { // Search for wildcard in database name
+                                       $doUserRightsLogLike = true;
+                               }
+                       }
+               }
+
                # 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
@@ -218,12 +230,19 @@ class LogPager extends ReverseChronologicalPager {
                # use the page_time index.  That should have no more than a few hundred
                # log entries for even the busiest pages, so it can be safely scanned
                # in full to satisfy an impossible condition on user or similar.
-               if ( $pattern && !$wgMiserMode ) {
-                       $this->mConds['log_namespace'] = $ns;
-                       $this->mConds[] = 'log_title ' . $db->buildLike( $title->getDBkey(), $db->anyString() );
+               $this->mConds['log_namespace'] = $ns;
+               if ( $doUserRightsLogLike ) {
+                       $params = array( $name . $wgUserrightsInterwikiDelimiter );
+                       foreach ( explode( '*', $database ) as $databasepart ) {
+                               $params[] = $databasepart;
+                               $params[] = $db->anyString();
+                       }
+                       array_pop( $params ); // Get rid of the last % we added.
+                       $this->mConds[] = 'log_title' . $db->buildLike( $params );
+               } elseif ( $pattern && !$wgMiserMode ) {
+                       $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)
index 9a3e927..b2802dd 100644 (file)
@@ -329,7 +329,7 @@ class BitmapHandler extends ImageHandler {
                $animation_post = array();
                $decoderHint = array();
                if ( $params['mimeType'] == 'image/jpeg' ) {
-                       $qualityVal = isset( $params['quality'] ) ? (string) $params['quality'] : null;
+                       $qualityVal = isset( $params['quality'] ) ? (string)$params['quality'] : null;
                        $quality = array( '-quality', $qualityVal ?: '80' ); // 80%
                        # Sharpening, see bug 6193
                        if ( ( $params['physicalWidth'] + $params['physicalHeight'] )
@@ -366,7 +366,7 @@ class BitmapHandler extends ImageHandler {
                        // background colour. After merging we reset the background
                        // to be white for the default background colour setting
                        // in the PNG image (which is used in old IE)
-                       $animation_post = array(
+                       $animation_pre = array(
                                '-background', 'transparent',
                                '-layers', 'merge',
                                '-background', 'white',
@@ -382,7 +382,7 @@ class BitmapHandler extends ImageHandler {
                                // bug 66323 - Greyscale images not rendered properly.
                                // So only take the "red" channel.
                                $channelOnly = array( '-channel', 'R', '-separate' );
-                               $animation_post = array_merge( $animation_post, $channelOnly );
+                               $animation_pre = array_merge( $animation_pre, $channelOnly );
                        }
                }
 
@@ -458,7 +458,7 @@ class BitmapHandler extends ImageHandler {
                                        list( $radius, $sigma ) = explode( 'x', $wgSharpenParameter );
                                        $im->sharpenImage( $radius, $sigma );
                                }
-                               $qualityVal = isset( $params['quality'] ) ? (string) $params['quality'] : null;
+                               $qualityVal = isset( $params['quality'] ) ? (string)$params['quality'] : null;
                                $im->setCompressionQuality( $qualityVal ?: 80 );
                        } elseif ( $params['mimeType'] == 'image/png' ) {
                                $im->setCompressionQuality( 95 );
index 2a393db..053c586 100644 (file)
@@ -97,7 +97,7 @@ class BitmapMetadataHandler {
        /** Add misc metadata. Warning: atm if the metadata category
         * doesn't have a priority, it will be silently discarded.
         *
-        * @param array $metaArray array of metadata values
+        * @param array $meta Array of metadata values
         * @param string $type Type. defaults to other. if two things have the same type they're merged
         */
        function addMetadata( $metaArray, $type = 'other' ) {
@@ -149,9 +149,9 @@ class BitmapMetadataHandler {
 
        /** Main entry point for jpeg's.
         *
-        * @param string $filename filename (with full path)
+        * @param string $filename Filename (with full path)
         * @return array Metadata result array.
-        * @throws MWException on invalid file.
+        * @throws MWException On invalid file.
         */
        static function Jpeg( $filename ) {
                $showXMP = function_exists( 'xml_parser_create_ns' );
@@ -224,7 +224,7 @@ class BitmapMetadataHandler {
         * They don't really have native metadata, so just merges together
         * XMP and image comment.
         *
-        * @param string $filename full path to file
+        * @param string $filename Full path to file
         * @return array Metadata array
         */
        public static function GIF( $filename ) {
index 200d526..daeb475 100644 (file)
@@ -73,7 +73,7 @@ class DjVuHandler extends ImageHandler {
         * @return bool
         */
        function validateParam( $name, $value ) {
-               if ( $name === 'page' && trim( $value ) !== (string) intval( $value ) ) {
+               if ( $name === 'page' && trim( $value ) !== (string)intval( $value ) ) {
                        // Extra junk on the end of page, probably actually a caption
                        // e.g. [[File:Foo.djvu|thumb|Page 3 of the document shows foo]]
                        return false;
@@ -188,7 +188,7 @@ class DjVuHandler extends ImageHandler {
                if ( $image->getSize() >= 1e7 ) { // 10MB
                        $work = new PoolCounterWorkViaCallback( 'GetLocalFileCopy', sha1( $image->getName() ),
                                array(
-                                       'doWork' => function() use ( $image ) {
+                                       'doWork' => function () use ( $image ) {
                                                return $image->getLocalRefPath();
                                        }
                                )
index 099375b..6ff19c9 100644 (file)
@@ -88,7 +88,7 @@ class DjVuImage {
                // something that explicitly initializes local variables.
                extract( unpack( 'a4magic/a4chunk/NchunkLength', $header ) );
                /** @var string $chunk
-                *  @var string $chunkLength */
+                * @var string $chunkLength */
                echo "$chunk $chunkLength\n";
                $this->dumpForm( $file, $chunkLength, 1 );
                fclose( $file );
@@ -107,7 +107,7 @@ class DjVuImage {
                        // something that explicitly initializes local variables.
                        extract( unpack( 'a4chunk/NchunkLength', $chunkHeader ) );
                        /** @var string $chunk
-                        *  @var string $chunkLength */
+                        * @var string $chunkLength */
                        echo str_repeat( ' ', $indent * 4 ) . "$chunk $chunkLength\n";
 
                        if ( $chunk == 'FORM' ) {
@@ -143,9 +143,9 @@ class DjVuImage {
                        extract( unpack( 'a4magic/a4form/NformLength/a4subtype', $header ) );
 
                        /** @var string $magic
-                        *  @var string $subtype
-                        *  @var string $formLength
-                        *  @var string $formType */
+                        * @var string $subtype
+                        * @var string $formLength
+                        * @var string $formType */
                        if ( $magic != 'AT&T' ) {
                                wfDebug( __METHOD__ . ": not a DjVu file\n" );
                        } elseif ( $subtype == 'DJVU' ) {
@@ -173,7 +173,7 @@ class DjVuImage {
                        extract( unpack( 'a4chunk/Nlength', $header ) );
 
                        /** @var string $chunk
-                        *  @var string $length */
+                        * @var string $length */
                        return array( $chunk, $length );
                }
        }
@@ -249,12 +249,12 @@ class DjVuImage {
                # Newer files have rotation info in byte 10, but we don't use it yet.
 
                /** @var string $width
-                *  @var string $height
-                *  @var string $major
-                *  @var string $minor
-                *  @var string $resolution
-                *  @var string $length
-                *  @var string $gamma */
+                * @var string $height
+                * @var string $major
+                * @var string $minor
+                * @var string $resolution
+                * @var string $length
+                * @var string $gamma */
                return array(
                        'width' => $width,
                        'height' => $height,
index b39e042..d285c0c 100644 (file)
@@ -442,7 +442,7 @@ class Exif {
         * Do userComment tags and similar. See pg. 34 of exif standard.
         * basically first 8 bytes is charset, rest is value.
         * This has not been tested on any shift-JIS strings.
-        * @param string $prop prop name.
+        * @param string $prop Prop name
         */
        private function charCodeString( $prop ) {
                if ( isset( $this->mFilteredExifData[$prop] ) ) {
@@ -470,8 +470,6 @@ class Exif {
                                        $charset = "";
                                        break;
                        }
-                       // This could possibly check to see if iconv is really installed
-                       // or if we're using the compatibility wrapper in globalFunctions.php
                        if ( $charset ) {
                                wfSuppressWarnings();
                                $val = iconv( $charset, 'UTF-8//IGNORE', $val );
@@ -731,8 +729,8 @@ class Exif {
        /**
         * Validates if a tag has a legal value according to the Exif spec
         *
-        * @param string $section section where tag is located.
-        * @param string $tag the tag to check.
+        * @param string $section Section where tag is located.
+        * @param string $tag The tag to check.
         * @param mixed $val The value of the tag.
         * @param bool $recursive True if called recursively for array types.
         * @return bool
@@ -842,7 +840,7 @@ class Exif {
        /**
         * Convenience function for debugging output
         *
-        * @param string $fname the name of the function calling this function
+        * @param string $fname The name of the function calling this function
         * @param bool $io Specify whether we're beginning or ending
         */
        private function debugFile( $fname, $io ) {
index 4200541..4356953 100644 (file)
@@ -72,7 +72,7 @@ class FormatMetadata extends ContextSource {
         *
         * This is the usual entry point for this class.
         *
-        * @param array $tags the Exif data to format ( as returned by
+        * @param array $tags The Exif data to format ( as returned by
         *   Exif::getFilteredData() or BitmapMetadataHandler )
         * @param bool|IContextSource $context Context to use (optional)
         * @return array
@@ -92,7 +92,7 @@ class FormatMetadata extends ContextSource {
         * value which most of the time are plain integers. This function
         * formats Exif (and other metadata) values into human readable form.
         *
-        * @param array $tags the Exif data to format ( as returned by
+        * @param array $tags The Exif data to format ( as returned by
         *   Exif::getFilteredData() or BitmapMetadataHandler )
         * @return array
         * @since 1.23
@@ -1006,7 +1006,7 @@ class FormatMetadata extends ContextSource {
        /**
         * Flatten an array, using the user language for any messages.
         *
-        * @param array $vals array of values
+        * @param array $vals Array of values
         * @param string $type Type of array (either lang, ul, ol).
         *   lang = language assoc array with keys being the lang code
         *   ul = unordered list, ol = ordered list
@@ -1031,7 +1031,7 @@ class FormatMetadata extends ContextSource {
         *
         * This is public on the basis it might be useful outside of this class.
         *
-        * @param array $vals array of values
+        * @param array $vals Array of values
         * @param string $type Type of array (either lang, ul, ol).
         *     lang = language assoc array with keys being the lang code
         *     ul = unordered list, ol = ordered list
@@ -1706,7 +1706,7 @@ class FormatMetadata extends ContextSource {
         *
         * @param File $file File to use
         * @param array $extendedMetadata
-        * @param int $maxCacheTime hook handlers might use this parameter to override cache time
+        * @param int $maxCacheTime Hook handlers might use this parameter to override cache time
         *
         * @return array [<property name> => ['value' => <value>]], or [] on error
         * @since 1.23
@@ -1741,7 +1741,7 @@ class FormatMetadata extends ContextSource {
         * If the value is not a multilang array, it is returned unchanged.
         * See mediawiki.org/wiki/Manual:File_metadata_handling#Multi-language_array_format
         * @param mixed $value
-        * @return mixed value in best language, null if there were no languages at all
+        * @return mixed Value in best language, null if there were no languages at all
         * @since 1.23
         */
        protected function resolveMultilangValue( $value ) {
index 503b968..478249f 100644 (file)
@@ -34,7 +34,7 @@ class IPTC {
         *
         * @see http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf
         *
-        * @param string $rawData app13 block from jpeg containing iptc/iim data
+        * @param string $rawData The app13 block from jpeg containing iptc/iim data
         * @return array IPTC metadata array
         */
        static function parse( $rawData ) {
@@ -470,7 +470,7 @@ class IPTC {
        /**
         * take the value of 1:90 tag and returns a charset
         * @param string $tag 1:90 tag.
-        * @return string charset name or "?"
+        * @return string Charset name or "?"
         * Warning, this function does not (and is not intended to) detect
         * all iso 2022 escape codes. In practise, the code for utf-8 is the
         * only code that seems to have wide use. It does detect that code.
index 918d4ae..fbdbdfe 100644 (file)
@@ -51,8 +51,8 @@ class JpegHandler extends ExifBitmapHandler {
        }
 
        /** Validate and normalize quality value to be between 1 and 100 (inclusive).
-        * @param int $value quality value, will be converted to integer or 0 if invalid
-        * @return bool true if the value is valid
+        * @param int $value Quality value, will be converted to integer or 0 if invalid
+        * @return bool True if the value is valid
         */
        private static function validateQuality( $value ) {
                return $value === 'low';
index a0f8524..8c5b46b 100644 (file)
@@ -43,9 +43,9 @@ class JpegMetadataExtractor {
         * but gis doesn't support having multiple app1 segments
         * and those can't extract xmp on files containing both exif and xmp data
         *
-        * @param string $filename name of jpeg file
-        * @return array of interesting segments.
-        * @throws MWException if given invalid file.
+        * @param string $filename Name of jpeg file
+        * @return array Array of interesting segments.
+        * @throws MWException If given invalid file.
         */
        static function segmentSplitter( $filename ) {
                $showXMP = function_exists( 'xml_parser_create_ns' );
@@ -193,7 +193,7 @@ class JpegMetadataExtractor {
         *
         * This should generally be called by BitmapMetadataHandler::doApp13()
         *
-        * @param string $app13 photoshop psir app13 block from jpg.
+        * @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. One of 'iptc-no-hash',
         *   'iptc-good-hash', 'iptc-bad-hash'.
index 2612685..e8f8360 100644 (file)
@@ -124,7 +124,7 @@ abstract class MediaHandler {
         *  first page.
         *
         * @param File $image The image object, or false if there isn't one
-        * @param string $path the filename
+        * @param string $path The filename
         * @return array Follow the format of PHP getimagesize() internal function.
         *   See http://www.php.net/getimagesize. MediaWiki will only ever use the
         *   first two array keys (the width and height), and the 'bits' associative
@@ -308,7 +308,7 @@ abstract class MediaHandler {
         * @param string $ext Extension of original file
         * @param string $mime MIME type of original file
         * @param array $params Handler specific rendering parameters
-        * @return array thumbnail extension and MIME type
+        * @return array Thumbnail extension and MIME type
         */
        function getThumbType( $ext, $mime, $params = null ) {
                $magic = MimeMagic::singleton();
@@ -689,7 +689,7 @@ abstract class MediaHandler {
         * relevant errors.
         *
         * @param string $fileName The local path to the file.
-        * @return Status object
+        * @return Status
         */
        function verifyUpload( $fileName ) {
                return Status::newGood();
@@ -843,8 +843,8 @@ abstract class MediaHandler {
        /**
         * Returns whether or not this handler supports the chained generation of thumbnails according
         * to buckets
-        * @return boolean
-        * @since  1.24
+        * @return bool
+        * @since 1.24
         */
        public function supportsBucketing() {
                return false;
index d8d56a4..bc9e917 100644 (file)
@@ -32,7 +32,7 @@ abstract class MediaTransformOutput {
         */
        public $responsiveUrls = array();
 
-       /** @var File object */
+       /** @var File */
        protected $file;
 
        /** @var int Image width */
@@ -71,7 +71,7 @@ abstract class MediaTransformOutput {
        }
 
        /**
-        * @return File file
+        * @return File
         */
        public function getFile() {
                return $this->file;
index d879c12..7b3ddb5 100644 (file)
@@ -100,7 +100,7 @@ class PNGHandler extends BitmapHandler {
        /**
         * We do not support making APNG thumbnails, so always false
         * @param File $image
-        * @return bool false
+        * @return bool False
         */
        function canAnimateThumbnail( $image ) {
                return false;
index 30376f1..bccd36c 100644 (file)
@@ -413,7 +413,7 @@ class PNGMetadataExtractor {
         *
         * @param resource $fh The file handle
         * @param int $size Size in bytes.
-        * @throws Exception if too big.
+        * @throws Exception If too big
         * @return string The chunk.
         */
        private static function read( $fh, $size ) {
index e28b38f..9245d42 100644 (file)
@@ -185,7 +185,40 @@ class SvgHandler extends ImageHandler {
                }
 
                $srcPath = $image->getLocalRefPath();
-               $status = $this->rasterize( $srcPath, $dstPath, $physicalWidth, $physicalHeight, $lang );
+               if ( $srcPath === false ) { // Failed to get local copy
+                       wfDebugLog( 'thumbnail',
+                               sprintf( 'Thumbnail failed on %s: could not get local copy of "%s"',
+                                       wfHostname(), $image->getName() ) );
+
+                       return new MediaTransformError( 'thumbnail_error',
+                               $params['width'], $params['height'],
+                               wfMessage( 'filemissing' )->text()
+                       );
+               }
+
+               // Make a temp dir with a symlink to the local copy in it.
+               // This plays well with rsvg-convert policy for external entities.
+               // https://git.gnome.org/browse/librsvg/commit/?id=f01aded72c38f0e18bc7ff67dee800e380251c8e
+               $tmpDir = wfTempDir() . '/svg_' . wfRandomString( 24 );
+               $lnPath = "$tmpDir/" . basename( $srcPath );
+               $ok = mkdir( $tmpDir, 0771 ) && symlink( $srcPath, $lnPath );
+               $cleaner = new ScopedCallback( function() use ( $tmpDir, $lnPath ) {
+                       wfSuppressWarnings();
+                       unlink( $lnPath );
+                       rmdir( $tmpDir );
+                       wfRestoreWarnings();
+               } );
+               if ( !$ok ) {
+                       wfDebugLog( 'thumbnail',
+                               sprintf( 'Thumbnail failed on %s: could not link %s to %s',
+                                       wfHostname(), $lnPath, $srcPath ) );
+                       return new MediaTransformError( 'thumbnail_error',
+                               $params['width'], $params['height'],
+                               wfMessage( 'thumbnail-temp-create' )->text()
+                       );
+               }
+
+               $status = $this->rasterize( $lnPath, $dstPath, $physicalWidth, $physicalHeight, $lang );
                if ( $status === true ) {
                        return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
                } else {
@@ -446,7 +479,7 @@ class SvgHandler extends ImageHandler {
        }
 
        /**
-        * @param array $params name=>value pairs of parameters
+        * @param array $params Name=>value pairs of parameters
         * @return string Filename to use
         */
        function makeParamString( $params ) {
index b303a01..04099c3 100644 (file)
@@ -93,7 +93,7 @@ class XCFHandler extends BitmapHandler {
         * @author Hashar
         *
         * @param string $filename Full path to a XCF file
-        * @return bool|array metadata array just like PHP getimagesize()
+        * @return bool|array Metadata Array just like PHP getimagesize()
         */
        static function getXCFMetaData( $filename ) {
                # Decode master structure
@@ -165,7 +165,7 @@ class XCFHandler extends BitmapHandler {
                        // Try to be consistent with the names used by PNG files.
                        // Unclear from base media type if it has an alpha layer,
                        // so just assume that it does since it "potentially" could.
-                       switch( $header['base_type'] ) {
+                       switch ( $header['base_type'] ) {
                        case 0:
                                $metadata['colorType'] = 'truecolour-alpha';
                                break;
index a74b701..154c85d 100644 (file)
@@ -406,7 +406,7 @@ class XMPReader {
         *
         * @param XMLParser $parser XMLParser reference to the xml parser
         * @param string $data Character data
-        * @throws MWException on invalid data
+        * @throws MWException On invalid data
         */
        function char( $parser, $data ) {
 
@@ -726,7 +726,7 @@ class XMPReader {
         * this should always be <rdf:Bag>
         *
         * @param string $elm Namespace . ' ' . tag
-        * @throws MWException if we have an element that's not <rdf:Bag>
+        * @throws MWException If we have an element that's not <rdf:Bag>
         */
        private function startElementModeBag( $elm ) {
                if ( $elm === self::NS_RDF . ' Bag' ) {
@@ -741,7 +741,7 @@ class XMPReader {
         * this should always be <rdf:Seq>
         *
         * @param string $elm Namespace . ' ' . tag
-        * @throws MWException if we have an element that's not <rdf:Seq>
+        * @throws MWException If we have an element that's not <rdf:Seq>
         */
        private function startElementModeSeq( $elm ) {
                if ( $elm === self::NS_RDF . ' Seq' ) {
@@ -768,7 +768,7 @@ class XMPReader {
         * we don't care about.
         *
         * @param string $elm Namespace . ' ' . tag
-        * @throws MWException if we have an element that's not <rdf:Alt>
+        * @throws MWException If we have an element that's not <rdf:Alt>
         */
        private function startElementModeLang( $elm ) {
                if ( $elm === self::NS_RDF . ' Alt' ) {
@@ -963,7 +963,7 @@ class XMPReader {
         *
         * @param string $elm Namespace . ' ' . tagname
         * @param array $attribs Attributes. (needed for BAGSTRUCTS)
-        * @throws MWException if gets a tag other than <rdf:li>
+        * @throws MWException If gets a tag other than <rdf:li>
         */
        private function startElementModeLi( $elm, $attribs ) {
                if ( ( $elm ) !== self::NS_RDF . ' li' ) {
index dca5f32..6f8f9af 100644 (file)
@@ -46,10 +46,10 @@ abstract class BagOStuff {
        protected $lastError = self::ERR_NONE;
 
        /** Possible values for getLastError() */
-       const ERR_NONE        = 0; // no error
+       const ERR_NONE = 0; // no error
        const ERR_NO_RESPONSE = 1; // no response
        const ERR_UNREACHABLE = 2; // can't connect
-       const ERR_UNEXPECTED  = 3; // response gave some error
+       const ERR_UNEXPECTED = 3; // response gave some error
 
        /**
         * @param bool $bool
@@ -251,7 +251,7 @@ abstract class BagOStuff {
         * Batch insertion
         * @param array $data $key => $value assoc array
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
-        * @return bool success
+        * @return bool Success
         * @since 1.24
         */
        public function setMulti( array $data, $exptime = 0 ) {
@@ -330,9 +330,9 @@ abstract class BagOStuff {
         * This will create the key with value $init and TTL $ttl if not present
         *
         * @param string $key
-        * @param integer $ttl
-        * @param integer $value
-        * @param integer $init
+        * @param int $ttl
+        * @param int $value
+        * @param int $init
         * @return bool
         * @since 1.24
         */
index 0c91dab..32996ac 100644 (file)
@@ -145,7 +145,7 @@ class SqlBagOStuff extends BagOStuff {
                        } else {
                                // We must keep a separate connection to MySQL in order to avoid deadlocks
                                // However, SQLite has an opposite behavior.
-                               // @TODO: get this trick to work on PostgreSQL too
+                               // @todo get this trick to work on PostgreSQL too
                                if ( wfGetDB( DB_MASTER )->getType() == 'mysql' ) {
                                        $lb = wfGetLBFactory()->newMainLB();
                                        $db = $lb->getConnection( DB_MASTER );
@@ -244,6 +244,9 @@ class SqlBagOStuff extends BagOStuff {
                                                // We do not want to flush the TRX as that can break callers.
                                                $db->trxLevel() ? array( 'LOCK IN SHARE MODE' ) : array()
                                        );
+                                       if ( $res === false ) {
+                                               continue;
+                                       }
                                        foreach ( $res as $row ) {
                                                $row->serverIndex = $serverIndex;
                                                $row->tableName = $tableName;
@@ -579,7 +582,7 @@ class SqlBagOStuff extends BagOStuff {
                                                        $conds,
                                                        __METHOD__,
                                                        array( 'LIMIT' => 100, 'ORDER BY' => 'exptime' ) );
-                                               if ( !$rows->numRows() ) {
+                                               if ( $rows === false || !$rows->numRows() ) {
                                                        break;
                                                }
                                                $keys = array();
index a6c7d9c..2a882ac 100644 (file)
@@ -52,7 +52,7 @@ class WinCacheBagOStuff extends BagOStuff {
         * Store a value in the WinCache object cache
         *
         * @param string $key Cache key
-        * @param mixed $valueObject to store
+        * @param mixed $valueObject Value to store
         * @param int $expire Expiration time
         * @return bool
         */
index 2f27826..436f148 100644 (file)
@@ -703,7 +703,9 @@ class Article implements Page {
                                        $this->mParserOutput = $poolArticleView->getParserOutput();
                                        $outputPage->addParserOutput( $this->mParserOutput );
                                        if ( $content->getRedirectTarget() ) {
-                                               $outputPage->addSubtitle( wfMessage( 'redirectpagesub' )->parse() );
+                                               $outputPage->addSubtitle(
+                                                       "<span id=\"redirectsub\">" . wfMessage( 'redirectpagesub' )->parse() . "</span>"
+                                               );
                                        }
 
                                        # Don't cache a dirty ParserOutput object
@@ -858,7 +860,7 @@ class Article implements Page {
         * @param string $action The action= GET parameter
         * @param ParserOutput|null $pOutput
         * @return array The policy that should be set
-        * @todo: actions other than 'view'
+        * @todo actions other than 'view'
         */
        public function getRobotPolicy( $action, $pOutput = null ) {
                global $wgArticleRobotPolicies, $wgNamespaceRobotPolicies, $wgDefaultRobotPolicy;
@@ -1240,7 +1242,7 @@ class Article implements Page {
 
                $hookResult = wfRunHooks( 'BeforeDisplayNoArticleText', array( $this ) );
 
-               if ( ! $hookResult ) {
+               if ( !$hookResult ) {
                        return;
                }
 
@@ -1268,7 +1270,7 @@ class Article implements Page {
         * If the revision requested for view is deleted, check permissions.
         * Send either an error message or a warning header to the output.
         *
-        * @return bool true if the view is allowed, false if not.
+        * @return bool True if the view is allowed, false if not.
         */
        public function showDeletedRevisionHeader() {
                if ( !$this->mRevision->isDeleted( Revision::DELETED_TEXT ) ) {
@@ -1655,11 +1657,12 @@ class Article implements Page {
        public function confirmDelete( $reason ) {
                wfDebug( "Article::confirmDelete\n" );
 
+               $title = $this->getTitle();
                $outputPage = $this->getContext()->getOutput();
-               $outputPage->setPageTitle( wfMessage( 'delete-confirm', $this->getTitle()->getPrefixedText() ) );
-               $outputPage->addBacklinkSubtitle( $this->getTitle() );
+               $outputPage->setPageTitle( wfMessage( 'delete-confirm', $title->getPrefixedText() ) );
+               $outputPage->addBacklinkSubtitle( $title );
                $outputPage->setRobotPolicy( 'noindex,nofollow' );
-               $backlinkCache = $this->getTitle()->getBacklinkCache();
+               $backlinkCache = $title->getBacklinkCache();
                if ( $backlinkCache->hasLinks( 'pagelinks' ) || $backlinkCache->hasLinks( 'templatelinks' ) ) {
                        $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
                                'deleting-backlinks-warning' );
@@ -1681,10 +1684,10 @@ class Article implements Page {
                } else {
                        $suppress = '';
                }
-               $checkWatch = $user->getBoolOption( 'watchdeletion' ) || $user->isWatched( $this->getTitle() );
+               $checkWatch = $user->getBoolOption( 'watchdeletion' ) || $user->isWatched( $title );
 
                $form = Xml::openElement( 'form', array( 'method' => 'post',
-                       'action' => $this->getTitle()->getLocalURL( 'action=delete' ), 'id' => 'deleteconfirm' ) ) .
+                       'action' => $title->getLocalURL( 'action=delete' ), 'id' => 'deleteconfirm' ) ) .
                        Xml::openElement( 'fieldset', array( 'id' => 'mw-delete-table' ) ) .
                        Xml::tags( 'legend', null, wfMessage( 'delete-legend' )->escaped() ) .
                        Xml::openElement( 'table', array( 'id' => 'mw-deleteconfirm-table' ) ) .
@@ -1743,7 +1746,7 @@ class Article implements Page {
                        Xml::closeElement( 'fieldset' ) .
                        Html::hidden(
                                'wpEditToken',
-                               $user->getEditToken( array( 'delete', $this->getTitle()->getPrefixedText() ) )
+                               $user->getEditToken( array( 'delete', $title->getPrefixedText() ) )
                        ) .
                        Xml::closeElement( 'form' );
 
@@ -1762,9 +1765,7 @@ class Article implements Page {
 
                $deleteLogPage = new LogPage( 'delete' );
                $outputPage->addHTML( Xml::element( 'h2', null, $deleteLogPage->getName()->text() ) );
-               LogEventsList::showLogExtract( $outputPage, 'delete',
-                       $this->getTitle()
-               );
+               LogEventsList::showLogExtract( $outputPage, 'delete', $title );
        }
 
        /**
@@ -1818,7 +1819,7 @@ class Article implements Page {
         * output to the client that is necessary for this request.
         * (that is, it has sent a cached version of the page)
         *
-        * @return bool true if cached version send, false otherwise
+        * @return bool True if cached version send, false otherwise
         */
        protected function tryFileCache() {
                static $called = false;
@@ -1894,7 +1895,7 @@ class Article implements Page {
         * Override the ParserOptions used to render the primary article wikitext.
         *
         * @param ParserOptions $options
-        * @throws MWException if the parser options where already initialized.
+        * @throws MWException If the parser options where already initialized.
         */
        public function setParserOptions( ParserOptions $options ) {
                if ( $this->mParserOptions ) {
index 89ca241..380252f 100644 (file)
@@ -363,7 +363,7 @@ class ImagePage extends Article {
                                                // it can be denoted as the current size being shown.
                                                // Vectorized images are "infinitely" big, so all thumb
                                                // sizes are shown.
-                                               if ( ( ($size[0] <= $width_orig && $size[1] <= $height_orig)
+                                               if ( ( ( $size[0] <= $width_orig && $size[1] <= $height_orig )
                                                                || $this->displayImg->isVectorized() )
                                                        && $size[0] != $width && $size[1] != $height
                                                ) {
@@ -430,6 +430,8 @@ class ImagePage extends Article {
 
                                        if ( $page > 1 ) {
                                                $label = $out->parse( wfMessage( 'imgmultipageprev' )->text(), false );
+                                               // on the client side, this link is generated in ajaxifyPageNavigation()
+                                               // in the mediawiki.page.image.pagination module
                                                $link = Linker::linkKnown(
                                                        $this->getTitle(),
                                                        $label,
@@ -1061,12 +1063,12 @@ EOT
         *  of the dimensions are bigger than the max, or if the
         *  image is vectorized.
         *
-        * @param $maxWidth integer Max width to display at
-        * @param $maxHeight integer Max height to display at
-        * @param $width integer Actual width of the image
-        * @param $height integer Actual height of the image
+        * @param int $maxWidth Max width to display at
+        * @param int $maxHeight Max height to display at
+        * @param int $width Actual width of the image
+        * @param int $height Actual height of the image
         * @throws MWException
-        * @return Array (width, height)
+        * @return array Array (width, height)
         */
        protected function getDisplayWidthHeight( $maxWidth, $maxHeight, $width, $height ) {
                if ( !$maxWidth || !$maxHeight ) {
@@ -1100,9 +1102,9 @@ EOT
         * Get alternative thumbnail sizes.
         *
         * @note This will only list several alternatives if thumbnails are rendered on 404
-        * @param $origWidth Actual width of image
-        * @param $origHeight Actual height of image
-        * @return Array An array of [width, height] pairs.
+        * @param int $origWidth Actual width of image
+        * @param int $origHeight Actual height of image
+        * @return array An array of [width, height] pairs.
         */
        protected function getThumbSizes( $origWidth, $origHeight ) {
                global $wgImageLimits;
index 87cc7ba..bfcd4c3 100644 (file)
@@ -201,7 +201,7 @@ class WikiFilePage extends WikiPage {
                $title = $this->mTitle;
                $file = $this->mFile;
 
-               if ( ! $file instanceof LocalFile ) {
+               if ( !$file instanceof LocalFile ) {
                        wfDebug( __CLASS__ . '::' . __METHOD__ . " is not supported for this file\n" );
                        return TitleArray::newFromResult( new FakeResultWrapper( array() ) );
                }
index 31f0ed0..be5ce3f 100644 (file)
@@ -530,7 +530,7 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Loads page_touched and returns a value indicating if it should be used
-        * @return bool true if not a redirect
+        * @return bool True if not a redirect
         */
        public function checkTouched() {
                if ( !$this->mDataLoaded ) {
@@ -563,7 +563,7 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Get the page_latest field
-        * @return int rev_id of current revision
+        * @return int The rev_id of current revision
         */
        public function getLatest() {
                if ( !$this->mDataLoaded ) {
@@ -663,7 +663,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Get the content of the current revision. No side-effects...
         *
-        * @param int $audience int One of:
+        * @param int $audience One of:
         *   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
@@ -743,7 +743,7 @@ class WikiPage implements Page, IDBAccessObject {
         *   Revision::RAW              get the text regardless of permissions
         * @param User $user User object to check for, only if FOR_THIS_USER is passed
         *   to the $audience parameter
-        * @return int user ID for the user that made the last article revision
+        * @return int User ID for the user that made the last article revision
         */
        public function getUser( $audience = Revision::FOR_PUBLIC, User $user = null ) {
                $this->loadLastEdit();
@@ -781,7 +781,7 @@ class WikiPage implements Page, IDBAccessObject {
         *   Revision::RAW              get the text regardless of permissions
         * @param User $user User object to check for, only if FOR_THIS_USER is passed
         *   to the $audience parameter
-        * @return string username of the user that made the last article revision
+        * @return string Username of the user that made the last article revision
         */
        public function getUserText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
                $this->loadLastEdit();
@@ -968,7 +968,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Get the Title object or URL this page redirects to
         *
-        * @return bool|Title|string false, Title of in-wiki target, or string with URL
+        * @return bool|Title|string False, Title of in-wiki target, or string with URL
         */
        public function followRedirect() {
                return $this->getRedirectURL( $this->getRedirectTarget() );
@@ -979,7 +979,7 @@ class WikiPage implements Page, IDBAccessObject {
         * objects for same-wiki, non-special redirects and URLs for everything
         * else.
         * @param Title $rt Redirect target
-        * @return bool|Title|string false, Title object of local target, or string with URL
+        * @return bool|Title|string False, Title object of local target, or string with URL
         */
        public function getRedirectURL( $rt ) {
                if ( !$rt ) {
@@ -1295,7 +1295,7 @@ class WikiPage implements Page, IDBAccessObject {
         *   Giving 0 indicates the new page flag should be set on.
         * @param bool $lastRevIsRedirect If given, will optimize adding and
         *   removing rows in redirect table.
-        * @return bool true on success, false on failure
+        * @return bool True on success, false on failure
         */
        public function updateRevisionOn( $dbw, $revision, $lastRevision = null,
                $lastRevIsRedirect = null
@@ -1357,7 +1357,7 @@ class WikiPage implements Page, IDBAccessObject {
         *   or NULL if this is not a redirect
         * @param null|bool $lastRevIsRedirect If given, will optimize adding and
         *   removing rows in redirect table.
-        * @return bool true on success, false on failure
+        * @return bool True on success, false on failure
         * @private
         */
        public function updateRedirectOn( $dbw, $redirectTitle, $lastRevIsRedirect = null ) {
@@ -1433,7 +1433,7 @@ class WikiPage implements Page, IDBAccessObject {
         * must exist and must not be deleted
         * @param Revision $undo
         * @param Revision $undoafter Must be an earlier revision than $undo
-        * @return mixed string on success, false on failure
+        * @return mixed String on success, false on failure
         * @since 1.21
         * Before we had the Content object, this was done in getUndoText
         */
@@ -1448,7 +1448,7 @@ class WikiPage implements Page, IDBAccessObject {
         * must exist and must not be deleted
         * @param Revision $undo
         * @param Revision $undoafter Must be an earlier revision than $undo
-        * @return string|bool string on success, false on failure
+        * @return string|bool String on success, false on failure
         * @deprecated since 1.21: use ContentHandler::getUndoContent() instead.
         */
        public function getUndoText( Revision $undo, Revision $undoafter = null ) {
@@ -1563,7 +1563,7 @@ class WikiPage implements Page, IDBAccessObject {
         * or 'new' for a new section.
         * @param Content $sectionContent New content of the section.
         * @param string $sectionTitle New section's subject, only if $section is "new".
-        * @param string $baseRevId integer|null
+        * @param int|null $baseRevId
         *
         * @throws MWException
         * @return Content New complete article content, or null if error.
@@ -1603,7 +1603,7 @@ class WikiPage implements Page, IDBAccessObject {
                                $oldContent = $rev->getContent();
                        }
 
-                       if ( ! $oldContent ) {
+                       if ( !$oldContent ) {
                                wfDebug( __METHOD__ . ": no page text\n" );
                                wfProfileOut( __METHOD__ );
                                return null;
@@ -1666,7 +1666,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @param User $user The user doing the edit
         *
         * @throws MWException
-        * @return Status object. Possible errors:
+        * @return Status Possible errors:
         *   edit-hook-aborted: The ArticleSave hook aborted the edit but didn't
         *     set the fatal flag of $status
         *   edit-gone-missing: In update mode, but the article didn't exist.
@@ -1728,7 +1728,7 @@ class WikiPage implements Page, IDBAccessObject {
         *   database.
         *
         * @throws MWException
-        * @return Status object. Possible errors:
+        * @return Status Possible errors:
         *     edit-hook-aborted: The ArticleSave hook aborted the edit but didn't
         *       set the fatal flag of $status.
         *     edit-gone-missing: In update mode, but the article didn't exist.
@@ -2047,7 +2047,7 @@ class WikiPage implements Page, IDBAccessObject {
                wfRunHooks( 'PageContentSaveComplete', $hook_args );
 
                // Promote user to any groups they meet the criteria for
-               $dbw->onTransactionIdle( function() use ( $user ) {
+               $dbw->onTransactionIdle( function () use ( $user ) {
                        $user->addAutopromoteOnceGroups( 'onEdit' );
                } );
 
@@ -2313,7 +2313,7 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @param Content $content Content submitted
         * @param User $user The relevant user
-        * @param string $comment comment submitted
+        * @param string $comment Comment submitted
         * @param string $serialisation_format Format for storing the content in the database
         * @param bool $minor Whereas it's a minor modification
         */
@@ -2739,7 +2739,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @param bool $commit Defaults to true, triggers transaction end
         * @param array &$error Array of errors to append to
         * @param User $user The deleting user
-        * @return bool true if successful
+        * @return bool True if successful
         */
        public function doDeleteArticle(
                $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
@@ -2780,7 +2780,7 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                $user = is_null( $user ) ? $wgUser : $user;
-               if ( ! wfRunHooks( 'ArticleDelete', array( &$this, &$user, &$reason, &$error, &$status ) ) ) {
+               if ( !wfRunHooks( 'ArticleDelete', array( &$this, &$user, &$reason, &$error, &$status ) ) ) {
                        if ( $status->isOK() ) {
                                // Hook aborted but didn't set a fatal status
                                $status->fatal( 'delete-hook-aborted' );
@@ -2887,7 +2887,7 @@ class WikiPage implements Page, IDBAccessObject {
                $logEntry->setComment( $reason );
                $logid = $logEntry->insert();
 
-               $dbw->onTransactionPreCommitOrIdle( function() use ( $dbw, $logEntry, $logid ) {
+               $dbw->onTransactionPreCommitOrIdle( function () use ( $dbw, $logEntry, $logid ) {
                        // Bug 56776: avoid deadlocks (especially from FileDeleteForm)
                        $logEntry->publish( $logid );
                } );
@@ -2904,7 +2904,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Do some database updates after deletion
         *
-        * @param int $id page_id value of the page being deleted
+        * @param int $id The page_id value of the page being deleted
         * @param Content $content Optional page content to be used when determining
         *   the required updates. This may be needed because $this->getContent()
         *   may already return null when the page proper was deleted.
@@ -2949,7 +2949,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @param string $token Rollback token.
         * @param bool $bot If true, mark all reverted edits as bot.
         *
-        * @param array $resultDetails contains result-specific array of additional values
+        * @param array $resultDetails Array contains result-specific array of additional values
         *    'alreadyrolled' : 'current' (rev)
         *    success        : 'summary' (str), 'current' (rev), 'target' (rev)
         *
@@ -3347,7 +3347,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Do this at the end of the commit to reduce lock wait timeouts
                $dbw->onTransactionPreCommitOrIdle(
-                       function() use ( $dbw, $that, $method, $added, $deleted ) {
+                       function () use ( $dbw, $that, $method, $added, $deleted ) {
                                $ns = $that->getTitle()->getNamespace();
 
                                $addFields = array( 'cat_pages = cat_pages + 1' );
@@ -3525,7 +3525,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @param int &$cascade Set to false if cascading protection isn't allowed.
         * @param array $expiry Per restriction type expiration
         * @param User $user The user updating the restrictions
-        * @return bool true on success
+        * @return bool True on success
         */
        public function updateRestrictions(
                $limit = array(), $reason = '', &$cascade = 0, $expiry = array(), User $user = null
index cfd5370..0bf2ffc 100644 (file)
@@ -122,7 +122,7 @@ class DateFormatter {
         *
         * @param Language|string|null $lang In which language to format the date
         *              Defaults to the site content language
-        * @return DateFormatter object
+        * @return DateFormatter
         */
        public static function &getInstance( $lang = null ) {
                global $wgMemc, $wgContLang;
index 648667b..30bb2cf 100644 (file)
@@ -265,7 +265,7 @@ class LinkHolderArray {
        /**
         * Replace <!--LINK--> link placeholders with actual links, in the buffer
         *
-        * @param $text
+        * @param string $text
         * @return array Array of link CSS classes, indexed by PDBK.
         */
        function replace( &$text ) {
index e5917b8..bc4fcce 100644 (file)
@@ -211,7 +211,7 @@ class Parser {
        var $mLangLinkLanguages;
 
        /**
-        * @var boolean Recursive call protection.
+        * @var bool Recursive call protection.
         * This variable should be treated as if it were private.
         */
        public $mInParse = false;
@@ -349,7 +349,7 @@ class Parser {
         * Convert wikitext to HTML
         * Do not call this function recursively.
         *
-        * @param string $text text we want to parse
+        * @param string $text Text we want to parse
         * @param Title $title
         * @param ParserOptions $options
         * @param bool $linestart
@@ -798,7 +798,7 @@ class Parser {
        /**
         * Get the ParserOptions object
         *
-        * @return ParserOptions object
+        * @return ParserOptions
         */
        function getOptions() {
                return $this->mOptions;
@@ -1434,7 +1434,7 @@ class Parser {
         *
         * @param string $text
         *
-        * @return string the altered text
+        * @return string The altered text
         */
        function doAllQuotes( $text ) {
                wfProfileIn( __METHOD__ );
@@ -2002,10 +2002,12 @@ class Parser {
                        wfProfileOut( __METHOD__ . "-e1" );
                        wfProfileIn( __METHOD__ . "-misc" );
 
+                       $origLink = $m[1];
+
                        # Don't allow internal links to pages containing
                        # PROTO: where PROTO is a valid URL protocol; these
                        # should be external links.
-                       if ( preg_match( '/^(?i:' . $this->mUrlProtocols . ')/', $m[1] ) ) {
+                       if ( preg_match( '/^(?i:' . $this->mUrlProtocols . ')/', $origLink ) ) {
                                $s .= $prefix . '[[' . $line;
                                wfProfileOut( __METHOD__ . "-misc" );
                                continue;
@@ -2013,12 +2015,12 @@ class Parser {
 
                        # Make subpage if necessary
                        if ( $useSubpages ) {
-                               $link = $this->maybeDoSubpageLink( $m[1], $text );
+                               $link = $this->maybeDoSubpageLink( $origLink, $text );
                        } else {
-                               $link = $m[1];
+                               $link = $origLink;
                        }
 
-                       $noforce = ( substr( $m[1], 0, 1 ) !== ':' );
+                       $noforce = ( substr( $origLink, 0, 1 ) !== ':' );
                        if ( !$noforce ) {
                                # Strip off leading ':'
                                $link = substr( $link, 1 );
@@ -2097,11 +2099,13 @@ class Parser {
                        if ( $noforce ) {
                                # Interwikis
                                wfProfileIn( __METHOD__ . "-interwiki" );
+                               # The final condition here is due to bug 68085
                                if (
                                        $iw && $this->mOptions->getInterwikiMagic() && $nottalk && (
                                                Language::fetchLanguageName( $iw, null, 'mw' ) ||
                                                in_array( $iw, $wgExtraInterlanguageLinkPrefixes )
-                                       )
+                                       ) && substr_compare( $this->getTargetLanguage()->lc( ltrim( $origLink ) ),
+                                               $iw, 0, strlen( $iw ) ) === 0
                                ) {
                                        # Bug 24502: filter duplicates
                                        if ( !isset( $this->mLangLinkLanguages[$iw] ) ) {
index 33f0f96..6102ca4 100644 (file)
@@ -26,7 +26,7 @@
  * @todo document
  */
 class ParserCache {
-       /** @var MWMemcached  */
+       /** @var MWMemcached */
        private $mMemc;
        /**
         * Get an instance of this object
index 2cd208c..411702f 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 /**
- * \brief Set options of the Parser
+ * @brief Set options of the Parser
  *
  * All member variables are supposed to be private in theory, although in
  * practise this is not the case.
index 09f714f..3de7505 100644 (file)
@@ -56,6 +56,7 @@ class ParserOutput extends CacheTime {
                private $mExtensionData = array(); # extra data used by extensions
                private $mLimitReportData = array(); # Parser limit report data
                private $mParseStartTime = array(); # Timestamps for getTimeSinceStart()
+               private $mPreventClickjacking = false; # Whether to emit X-Frame-Options: DENY
 
        const EDITSECTION_REGEX =
                '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
@@ -396,7 +397,7 @@ class ParserOutput extends CacheTime {
 
        /**
         * @param Title $title Title object, must be an interwiki link
-        * @throws MWException if given invalid input
+        * @throws MWException If given invalid input
         */
        function addInterwikiLink( $title ) {
                if ( !$title->isExternal() ) {
@@ -471,6 +472,7 @@ class ParserOutput extends CacheTime {
                $this->addJsConfigVars( $out->getJsConfigVars() );
 
                $this->mHeadItems = array_merge( $this->mHeadItems, $out->getHeadItemsArray() );
+               $this->mPreventClickjacking = $this->mPreventClickjacking || $out->getPreventClickjacking();
        }
 
        /**
@@ -478,7 +480,7 @@ class ParserOutput extends CacheTime {
         * -- this is assumed to have been validated
         * (check equal normalisation, etc.)
         *
-        * @param string $text desired title text
+        * @param string $text Desired title text
         */
        public function setDisplayTitle( $text ) {
                $this->setTitleText( $text );
@@ -537,7 +539,7 @@ class ParserOutput extends CacheTime {
         *     Wikimedia Commons.
         *     This is not actually implemented, yet but would be pretty cool.
         *
-        * @note: Do not use setProperty() to set a property which is only used
+        * @note Do not use setProperty() to set a property which is only used
         * in a context where the ParserOutput object itself is already available,
         * for example a normal page view. There is no need to save such a property
         * in the database since the text is already parsed. You can just hook
@@ -576,7 +578,7 @@ class ParserOutput extends CacheTime {
        /**
         * @param string $name The property name to look up.
         *
-        * @return mixed|false The value previously set using setProperty(). False if null or no value
+        * @return mixed|bool The value previously set using setProperty(). False if null or no value
         * was set for the given property name.
         *
         * @note You need to use getProperties() to check for boolean and null properties.
@@ -793,6 +795,17 @@ class ParserOutput extends CacheTime {
                $this->mLimitReportData[$key] = $value;
        }
 
+       /**
+        * Get or set the prevent-clickjacking flag
+        *
+        * @since 1.24
+        * @param boolean|null $flag New flag value, or null to leave it unchanged
+        * @return boolean Old flag value
+        */
+       public function preventClickjacking( $flag = null ) {
+               return wfSetVar( $this->mPreventClickjacking, $flag );
+       }
+
        /**
         * Save space for for serialization by removing useless values
         */
index bf2bf61..26daca1 100644 (file)
@@ -995,7 +995,7 @@ class PPFrame_Hash implements PPFrame {
 
        /**
         * @throws MWException
-        * @param string|PPNode$root
+        * @param string|PPNode $root
         * @param int $flags
         * @return string
         */
diff --git a/includes/password/BcryptPassword.php b/includes/password/BcryptPassword.php
new file mode 100644 (file)
index 0000000..dd806e2
--- /dev/null
@@ -0,0 +1,88 @@
+<?php
+/**
+ * Implements the BcryptPassword class for the MediaWiki software.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * A Bcrypt-hashed password
+ *
+ * This is a computationally complex password hash for use in modern applications.
+ * The number of rounds can be configured by $wgPasswordConfig['bcrypt']['cost'].
+ *
+ * @since 1.24
+ */
+class BcryptPassword extends ParameterizedPassword {
+       protected function getDefaultParams() {
+               return array(
+                       'rounds' => $this->config['cost'],
+               );
+       }
+
+       protected function getDelimiter() {
+               return '$';
+       }
+
+       protected function parseHash( $hash ) {
+               parent::parseHash( $hash );
+
+               $this->params['rounds'] = (int)$this->params['rounds'];
+       }
+
+       /**
+        * @param string $password Password to encrypt
+        *
+        * @throws PasswordError If bcrypt has an unknown error
+        * @throws MWException If bcrypt is not supported by PHP
+        */
+       public function crypt( $password ) {
+               if ( !defined( 'CRYPT_BLOWFISH' ) ) {
+                       throw new MWException( 'Bcrypt is not supported.' );
+               }
+
+               // Either use existing hash or make a new salt
+               // Bcrypt expects 22 characters of base64-encoded salt
+               // Note: bcrypt does not use MIME base64. It uses its own base64 without any '=' padding.
+               //       It expects a 128 bit salt, so it will ignore anything after the first 128 bits
+               if ( !isset( $this->args[0] ) ) {
+                       $this->args[] = substr(
+                               // Replace + with ., because bcrypt uses a non-MIME base64 format
+                               strtr(
+                                       // Random base64 encoded string
+                                       base64_encode( MWCryptRand::generate( 16, true ) ),
+                                       '+', '.'
+                               ),
+                               0, 22
+                       );
+               }
+
+               $hash = crypt( $password,
+                       sprintf( '$2y$%02d$%s', (int)$this->params['rounds'], $this->args[0] ) );
+
+               if ( !is_string( $hash ) || strlen( $hash ) <= 13 ) {
+                       throw new PasswordError( 'Error when hashing password.' );
+               }
+
+               // Strip the $2y$
+               $parts = explode( $this->getDelimiter(), substr( $hash, 4 ) );
+               $this->params['rounds'] = (int)$parts[0];
+               $this->args[0] = substr( $parts[1], 0, 22 );
+               $this->hash = substr( $parts[1], 22 );
+       }
+}
diff --git a/includes/password/EncryptedPassword.php b/includes/password/EncryptedPassword.php
new file mode 100644 (file)
index 0000000..39da32d
--- /dev/null
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Implements the EncryptedPassword class for the MediaWiki software.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Helper class for passwords that use another password hash underneath it
+ * and encrypts that hash with a configured secret.
+ *
+ * @since 1.24
+ */
+class EncryptedPassword extends ParameterizedPassword {
+       protected function getDelimiter() {
+               return ':';
+       }
+
+       protected function getDefaultParams() {
+               return array(
+                       'cipher' => $this->config['cipher'],
+                       'secret' => count( $this->config['secrets'] ) - 1
+               );
+       }
+
+       public function crypt( $password ) {
+               $secret = $this->config['secrets'][$this->params['secret']];
+
+               if ( $this->hash ) {
+                       $underlyingPassword = $this->factory->newFromCiphertext( openssl_decrypt(
+                                       base64_decode( $this->hash ), $this->params['cipher'],
+                                       $secret, 0, base64_decode( $this->args[0] )
+                               ) );
+               } else {
+                       $underlyingPassword = $this->factory->newFromType( $this->config['underlying'], $this->config );
+               }
+
+               $underlyingPassword->crypt( $password );
+               $iv = MWCryptRand::generate( openssl_cipher_iv_length( $this->params['cipher'] ), true );
+
+               $this->hash = openssl_encrypt(
+                       $underlyingPassword->toString(), $this->params['cipher'], $secret, 0, $iv );
+               $this->args = array( base64_encode( $iv ) );
+       }
+
+       /**
+        * Updates the underlying hash by encrypting it with the newest secret.
+        *
+        * @throws MWException If the configuration is not valid
+        * @return bool True if the password was updated
+        */
+       public function update() {
+               if ( count( $this->args ) != 2 || $this->params == $this->getDefaultParams() ) {
+                       // Hash does not need updating
+                       return false;
+               }
+
+               // Decrypt the underlying hash
+               $underlyingHash = openssl_decrypt(
+                       base64_decode( $this->args[1] ),
+                       $this->params['cipher'],
+                       $this->config['secrets'][$this->params['secret']],
+                       0,
+                       base64_decode( $this->args[0] )
+               );
+
+               // Reset the params
+               $this->params = $this->getDefaultParams();
+
+               // Check the key size with the new params
+               $iv = MWCryptRand::generate( openssl_cipher_iv_length( $this->params['cipher'] ), true );
+               $this->hash = base64_encode( openssl_encrypt(
+                               $underlyingHash,
+                               $this->params['cipher'],
+                               $this->config['secrets'][$this->params['secret']],
+                               0,
+                               $iv
+                       ) );
+               $this->args = array( base64_encode( $iv ) );
+
+               return true;
+       }
+}
diff --git a/includes/password/InvalidPassword.php b/includes/password/InvalidPassword.php
new file mode 100644 (file)
index 0000000..e45b774
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Implements the InvalidPassword class for the MediaWiki software.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Represents an invalid password hash. It is represented as the empty string (i.e.,
+ * a password hash with no type).
+ *
+ * No two invalid passwords are equal. Comparing anything to an invalid password will
+ * return false.
+ *
+ * @since 1.24
+ */
+class InvalidPassword extends Password {
+       public function crypt( $plaintext ) {
+       }
+
+       public function toString() {
+               return '';
+       }
+
+       public function equals( $other ) {
+               return false;
+       }
+
+       public function needsUpdate() {
+               return false;
+       }
+}
diff --git a/includes/password/LayeredParameterizedPassword.php b/includes/password/LayeredParameterizedPassword.php
new file mode 100644 (file)
index 0000000..5735e28
--- /dev/null
@@ -0,0 +1,140 @@
+<?php
+/**
+ * Implements the LayeredParameterizedPassword class for the MediaWiki software.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * This password hash type layers one or more parameterized password types
+ * on top of each other.
+ *
+ * The underlying types must be parameterized. This wrapping type accumulates
+ * all the parameters and arguments from each hash and then passes the hash of
+ * the last layer as the password for the next layer.
+ *
+ * @since 1.24
+ */
+class LayeredParameterizedPassword extends ParameterizedPassword {
+       protected function getDelimiter() {
+               return '!';
+       }
+
+       protected function getDefaultParams() {
+               $params = array();
+
+               foreach ( $this->config['types'] as $type ) {
+                       $passObj = $this->factory->newFromType( $type );
+
+                       if ( !$passObj instanceof ParameterizedPassword ) {
+                               throw new MWException( 'Underlying type must be a parameterized password.' );
+                       } elseif ( $passObj->getDelimiter() === $this->getDelimiter() ) {
+                               throw new MWException( 'Underlying type cannot use same delimiter as encapsulating type.' );
+                       }
+
+                       $params[] = implode( $passObj->getDelimiter(), $passObj->getDefaultParams() );
+               }
+
+               return $params;
+       }
+
+       public function crypt( $password ) {
+               $lastHash = $password;
+               foreach ( $this->config['types'] as $i => $type ) {
+                       // Construct pseudo-hash based on params and arguments
+                       /** @var ParameterizedPassword $passObj */
+                       $passObj = $this->factory->newFromType( $type );
+
+                       $params = '';
+                       $args = '';
+                       if ( $this->params[$i] !== '' ) {
+                               $params = $this->params[$i] . $passObj->getDelimiter();
+                       }
+                       if ( isset( $this->args[$i] ) && $this->args[$i] !== '' ) {
+                               $args = $this->args[$i] . $passObj->getDelimiter();
+                       }
+                       $existingHash = ":$type:" . $params . $args . $this->hash;
+
+                       // Hash the last hash with the next type in the layer
+                       $passObj = $this->factory->newFromCiphertext( $existingHash );
+                       $passObj->crypt( $lastHash );
+
+                       // Move over the params and args
+                       $this->params[$i] = implode( $passObj->getDelimiter(), $passObj->params );
+                       $this->args[$i] = implode( $passObj->getDelimiter(), $passObj->args );
+                       $lastHash = $passObj->hash;
+               }
+
+               $this->hash = $lastHash;
+       }
+
+       /**
+        * Finish the hashing of a partially hashed layered hash
+        *
+        * Given a password hash that is hashed using the first layer of this object's
+        * configuration, perform the remaining layers of password hashing in order to
+        * get an updated hash with all the layers.
+        *
+        * @param ParameterizedPassword $passObj Password hash of the first layer
+        *
+        * @throws MWException If the first parameter is not of the correct type
+        */
+       public function partialCrypt( ParameterizedPassword $passObj ) {
+               $type = $passObj->config['type'];
+               if ( $type !== $this->config['types'][0] ) {
+                       throw new MWException( 'Only a hash in the first layer can be finished.' );
+               }
+
+               // Gather info from the existing hash
+               $this->params[0] = implode( $passObj->getDelimiter(), $passObj->params );
+               $this->args[0] = implode( $passObj->getDelimiter(), $passObj->args );
+               $lastHash = $passObj->hash;
+
+               // Layer the remaining types
+               foreach ( $this->config['types'] as $i => $type ) {
+                       if ( $i == 0 ) {
+                               continue;
+                       };
+
+                       // Construct pseudo-hash based on params and arguments
+                       /** @var ParameterizedPassword $passObj */
+                       $passObj = $this->factory->newFromType( $type );
+
+                       $params = '';
+                       $args = '';
+                       if ( $this->params[$i] !== '' ) {
+                               $params = $this->params[$i] . $passObj->getDelimiter();
+                       }
+                       if ( isset( $this->args[$i] ) && $this->args[$i] !== '' ) {
+                               $args = $this->args[$i] . $passObj->getDelimiter();
+                       }
+                       $existingHash = ":$type:" . $params . $args . $this->hash;
+
+                       // Hash the last hash with the next type in the layer
+                       $passObj = $this->factory->newFromCiphertext( $existingHash );
+                       $passObj->crypt( $lastHash );
+
+                       // Move over the params and args
+                       $this->params[$i] = implode( $passObj->getDelimiter(), $passObj->params );
+                       $this->args[$i] = implode( $passObj->getDelimiter(), $passObj->args );
+                       $lastHash = $passObj->hash;
+               }
+
+               $this->hash = $lastHash;
+       }
+}
diff --git a/includes/password/MWOldPassword.php b/includes/password/MWOldPassword.php
new file mode 100644 (file)
index 0000000..0ba407f
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Implements the MWOldPassword class for the MediaWiki software.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * The old style of MediaWiki password hashing. It involves
+ * running MD5 on the password.
+ *
+ * @since 1.24
+ */
+class MWOldPassword extends ParameterizedPassword {
+       protected function getDefaultParams() {
+               return array();
+       }
+
+       protected function getDelimiter() {
+               return ':';
+       }
+
+       public function crypt( $plaintext ) {
+               global $wgPasswordSalt;
+
+               if ( $wgPasswordSalt && count( $this->args ) == 1 ) {
+                       $this->hash = md5( $this->args[0] . '-' . md5( $plaintext ) );
+               } else {
+                       $this->args = array();
+                       $this->hash = md5( $plaintext );
+               }
+       }
+}
diff --git a/includes/password/MWSaltedPassword.php b/includes/password/MWSaltedPassword.php
new file mode 100644 (file)
index 0000000..6c6895a
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Implements the BcryptPassword class for the MediaWiki software.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * The old style of MediaWiki password hashing, with a salt. It involves
+ * running MD5 on the password, and then running MD5 on the salt concatenated
+ * with the first hash.
+ *
+ * @since 1.24
+ */
+class MWSaltedPassword extends ParameterizedPassword {
+       protected function getDefaultParams() {
+               return array();
+       }
+
+       protected function getDelimiter() {
+               return ':';
+       }
+
+       public function crypt( $plaintext ) {
+               if ( count( $this->args ) == 0 ) {
+                       $this->args[] = MWCryptRand::generateHex( 8 );
+               }
+
+               $this->hash = md5( $this->args[0] . '-' . md5( $plaintext ) );
+       }
+}
diff --git a/includes/password/ParameterizedPassword.php b/includes/password/ParameterizedPassword.php
new file mode 100644 (file)
index 0000000..4d6e415
--- /dev/null
@@ -0,0 +1,115 @@
+<?php
+/**
+ * Implements the ParameterizedPassword class for the MediaWiki software.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Helper class for password hash types that have a delimited set of parameters
+ * inside of the hash.
+ *
+ * All passwords are in the form of :<TYPE>:... as explained in the main Password
+ * class. This class is for hashes in the form of :<TYPE>:<PARAM1>:<PARAM2>:... where
+ * <PARAM1>, <PARAM2>, etc. are parameters that determine how the password was hashed.
+ * Of course, the internal delimiter (which is : by convention and default), can be
+ * changed by overriding the ParameterizedPassword::getDelimiter() function.
+ *
+ * This class requires overriding an additional function: ParameterizedPassword::getDefaultParams().
+ * See the function description for more details on the implementation.
+ *
+ * @since 1.24
+ */
+abstract class ParameterizedPassword extends Password {
+       /**
+        * Named parameters that have default values for this password type
+        * @var array
+        */
+       protected $params = array();
+
+       /**
+        * Extra arguments that were found in the hash. This may or may not make
+        * the hash invalid.
+        * @var array
+        */
+       protected $args = array();
+
+       protected function parseHash( $hash ) {
+               parent::parseHash( $hash );
+
+               if ( $hash === null ) {
+                       $this->params = $this->getDefaultParams();
+                       return;
+               }
+
+               $parts = explode( $this->getDelimiter(), $hash );
+               $paramKeys = array_keys( $this->getDefaultParams() );
+
+               if ( count( $parts ) < count( $paramKeys ) ) {
+                       throw new PasswordError( 'Hash is missing required parameters.' );
+               }
+
+               if ( $paramKeys ) {
+                       $this->args = array_splice( $parts, count( $paramKeys ) );
+                       $this->params = array_combine( $paramKeys, $parts );
+               } else {
+                       $this->args = $parts;
+               }
+
+               if ( $this->args ) {
+                       $this->hash = array_pop( $this->args );
+               } else {
+                       $this->hash = null;
+               }
+       }
+
+       public function needsUpdate() {
+               return parent::needsUpdate() || $this->params !== $this->getDefaultParams();
+       }
+
+       public function toString() {
+               return
+                       ':' . $this->config['type'] . ':' .
+                       implode( $this->getDelimiter(), array_merge( $this->params, $this->args ) ) .
+                       $this->getDelimiter() . $this->hash;
+       }
+
+       /**
+        * Returns the delimiter for the parameters inside the hash
+        *
+        * @return string
+        */
+       abstract protected function getDelimiter();
+
+       /**
+        * Return an ordered array of default parameters for this password hash
+        *
+        * The keys should be the parameter names and the values should be the default
+        * values. Additionally, the order of the array should be the order in which they
+        * appear in the hash.
+        *
+        * When parsing a password hash, the constructor will split the hash based on
+        * the delimiter, and consume as many parts as it can, matching each to a parameter
+        * in this list. Once all the parameters have been filled, all remaining parts will
+        * be considered extra arguments, except, of course, for the very last part, which
+        * is the hash itself.
+        *
+        * @return array
+        */
+       abstract protected function getDefaultParams();
+}
diff --git a/includes/password/Password.php b/includes/password/Password.php
new file mode 100644 (file)
index 0000000..4e395b5
--- /dev/null
@@ -0,0 +1,186 @@
+<?php
+/**
+ * Implements the Password class for the MediaWiki software.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Represents a password hash for use in authentication
+ *
+ * Note: All password types are transparently prefixed with :<TYPE>:, where <TYPE>
+ * is the registered type of the hash. This prefix is stripped in the constructor
+ * and is added back in the toString() function.
+ *
+ * When inheriting this class, there are a couple of expectations
+ * to be fulfilled:
+ *  * If Password::toString() is called on an object, and the result is passed back in
+ *    to PasswordFactory::newFromCiphertext(), the result will be identical to the original.
+ *  * The string representations of two Password objects are equal only if
+ *    the original plaintext passwords match. In other words, if the toString() result of
+ *    two objects match, the passwords are the same, and the user will be logged in.
+ *    Since the string representation of a hash includes its type name (@see Password::toString),
+ *    this property is preserved across all classes that inherit Password.
+ *    If a hashing scheme does not fulfill this expectation, it must make sure to override the
+ *    Password::equals() function and use custom comparison logic. However, this is not
+ *    recommended unless absolutely required by the hashing mechanism.
+ * With these two points in mind, when creating a new Password sub-class, there are some functions
+ * you have to override (because they are abstract) and others that you may want to override.
+ *
+ * The abstract functions that must be overridden are:
+ *  * Password::crypt(), which takes a plaintext password and hashes it into a string hash suitable
+ *    for being passed to the constructor of that class, and then stores that hash (and whatever
+ *     other data) into the internal state of the object.
+ * The functions that can optionally be overridden are:
+ *  * Password::parseHash(), which can be useful to override if you need to extract values from or
+ *    otherwise parse a password hash when it's passed to the constructor.
+ *  * Password::needsUpdate(), which can be useful if a specific password hash has different
+ *    logic for when the hash needs to be updated.
+ *  * Password::toString(), which can be useful if the hash was changed in the constructor and
+ *    needs to be re-assembled before being returned as a string. This function is expected to add
+ *    the type back on to the hash, so make sure to do that if you override the function.
+ *  * Password::equals() - This function compares two Password objects to see if they are equal.
+ *    The default is to just do a timing-safe string comparison on the $this->hash values.
+ *
+ * After creating a new password hash type, it can be registered using the static
+ * Password::register() method. The default type is set using the Password::setDefaultType() type.
+ * Types must be registered before they can be set as the default.
+ *
+ * @since 1.24
+ */
+abstract class Password {
+       /**
+        * @var PasswordFactory Factory that created the object
+        */
+       protected $factory;
+
+       /**
+        * String representation of the hash without the type
+        * @var string
+        */
+       protected $hash;
+
+       /**
+        * Array of configuration variables injected from the constructor
+        * @var array
+        */
+       protected $config;
+
+       /**
+        * Construct the Password object using a string hash
+        *
+        * It is strongly recommended not to call this function directly unless you
+        * have a reason to. Use the PasswordFactory class instead.
+        *
+        * @throws MWException If $config does not contain required parameters
+        *
+        * @param PasswordFactory $factory Factory object that created the password
+        * @param array $config Array of engine configuration options for hashing
+        * @param string|null $hash The raw hash, including the type
+        */
+       final public function __construct( PasswordFactory $factory, array $config, $hash = null ) {
+               if ( !isset( $config['type'] ) ) {
+                       throw new MWException( 'Password configuration must contain a type name.' );
+               }
+               $this->config = $config;
+               $this->factory = $factory;
+
+               if ( $hash !== null && strlen( $hash ) >= 3 ) {
+                       // Strip the type from the hash for parsing
+                       $hash = substr( $hash, strpos( $hash, ':', 1 ) + 1 );
+               }
+
+               $this->hash = $hash;
+               $this->parseHash( $hash );
+       }
+
+       /**
+        * Get the type name of the password
+        *
+        * @return string Password type
+        */
+       final public function getType() {
+               return $this->config['type'];
+       }
+
+       /**
+        * Perform any parsing necessary on the hash to see if the hash is valid
+        * and/or to perform logic for seeing if the hash needs updating.
+        *
+        * @param string $hash The hash, with the :<TYPE>: prefix stripped
+        * @throws PasswordError If there is an error in parsing the hash
+        */
+       protected function parseHash( $hash ) {
+       }
+
+       /**
+        * Determine if the hash needs to be updated
+        *
+        * @return bool True if needs update, false otherwise
+        */
+       public function needsUpdate() {
+       }
+
+       /**
+        * Compare one Password object to this object
+        *
+        * By default, do a timing-safe string comparison on the result of
+        * Password::toString() for each object. This can be overridden to do
+        * custom comparison, but it is not recommended unless necessary.
+        *
+        * @param Password|string $other The other password
+        * @return bool True if equal, false otherwise
+        */
+       public function equals( $other ) {
+               if ( !$other instanceof self ) {
+                       // No need to use the factory because we're definitely making
+                       // an object of the same type.
+                       $obj = clone $this;
+                       $obj->crypt( $other );
+                       $other = $obj;
+               }
+
+               return hash_equals( $this->toString(), $other->toString() );
+       }
+
+       /**
+        * Convert this hash to a string that can be stored in the database
+        *
+        * The resulting string should be considered the seralized representation
+        * of this hash, i.e., if the return value were recycled back into
+        * PasswordFactory::newFromCiphertext, the returned object would be equivalent to
+        * this; also, if two objects return the same value from this function, they
+        * are considered equivalent.
+        *
+        * @return string
+        */
+       public function toString() {
+               return ':' . $this->config['type'] . ':' . $this->hash;
+       }
+
+       /**
+        * Hash a password and store the result in this object
+        *
+        * The result of the password hash should be put into the internal
+        * state of the hash object.
+        *
+        * @param string $password Password to hash
+        * @throws PasswordError If an internal error occurs in hashing
+        */
+       abstract public function crypt( $password );
+}
diff --git a/includes/password/PasswordError.php b/includes/password/PasswordError.php
new file mode 100644 (file)
index 0000000..c9707ad
--- /dev/null
@@ -0,0 +1,28 @@
+<?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
+ */
+
+/**
+ * Show an error when any operation involving passwords fails to run.
+ *
+ * @ingroup Exception
+ */
+class PasswordError extends MWException {
+       // NOP
+}
diff --git a/includes/password/PasswordFactory.php b/includes/password/PasswordFactory.php
new file mode 100644 (file)
index 0000000..70b7656
--- /dev/null
@@ -0,0 +1,178 @@
+<?php
+/**
+ * Implements the Password class for the MediaWiki software.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Factory class for creating and checking Password objects
+ *
+ * @since 1.24
+ */
+final class PasswordFactory {
+       /**
+        * The default PasswordHash type
+        *
+        * @var string
+        * @see PasswordFactory::setDefaultType
+        */
+       private $default = '';
+
+       /**
+        * Mapping of password types to classes
+        * @var array
+        * @see PasswordFactory::register
+        * @see Setup.php
+        */
+       private $types = array(
+               '' => array( 'type' => '', 'class' => 'InvalidPassword' ),
+       );
+
+       /**
+        * Register a new type of password hash
+        *
+        * @param string $type Unique type name for the hash
+        * @param array $config Array of configuration options
+        */
+       public function register( $type, array $config ) {
+               $config['type'] = $type;
+               $this->types[$type] = $config;
+       }
+
+       /**
+        * Set the default password type
+        *
+        * @throws InvalidArgumentException If the type is not registered
+        * @param string $type Password hash type
+        */
+       public function setDefaultType( $type ) {
+               if ( !isset( $this->types[$type] ) ) {
+                       throw new InvalidArgumentException( "Invalid password type $type." );
+               }
+               $this->default = $type;
+       }
+
+       /**
+        * Initialize the internal static variables using the global variables
+        *
+        * @param Config $config Configuration object to load data from
+        */
+       public function init( Config $config ) {
+               foreach ( $config->get( 'PasswordConfig' ) as $type => $options ) {
+                       $this->register( $type, $options );
+               }
+
+               $this->setDefaultType( $config->get( 'PasswordDefault' ) );
+       }
+
+       /**
+        * Get the list of types of passwords
+        *
+        * @return array
+        */
+       public function getTypes() {
+               return $this->types;
+       }
+
+       /**
+        * Create a new Hash object from an existing string hash
+        *
+        * Parse the type of a hash and create a new hash object based on the parsed type.
+        * Pass the raw hash to the constructor of the new object. Use InvalidPassword type
+        * if a null hash is given.
+        *
+        * @param string|null $hash Existing hash or null for an invalid password
+        * @return Password object
+        * @throws PasswordError if hash is invalid or type is not recognized
+        */
+       public function newFromCiphertext( $hash ) {
+               if ( $hash === null || $hash === false || $hash === '' ) {
+                       return new InvalidPassword( $this, array( 'type' => '' ), null );
+               } elseif ( $hash[0] !== ':' ) {
+                       throw new PasswordError( 'Invalid hash given' );
+               }
+
+               $type = substr( $hash, 1, strpos( $hash, ':', 1 ) - 1 );
+               if ( !isset( $this->types[$type] ) ) {
+                       throw new PasswordError( "Unrecognized password hash type $type." );
+               }
+
+               $config = $this->types[$type];
+
+               return new $config['class']( $this, $config, $hash );
+       }
+
+       /**
+        * Make a new default password of the given type.
+        *
+        * @param string $type Existing type
+        * @return Password object
+        * @throws PasswordError if hash is invalid or type is not recognized
+        */
+       public function newFromType( $type ) {
+               if ( !isset( $this->types[$type] ) ) {
+                       throw new PasswordError( "Unrecognized password hash type $type." );
+               }
+
+               $config = $this->types[$type];
+
+               return new $config['class']( $this, $config );
+       }
+
+       /**
+        * Create a new Hash object from a plaintext password
+        *
+        * If no existing object is given, make a new default object. If one is given, clone that
+        * object. Then pass the plaintext to Password::crypt().
+        *
+        * @param string $password Plaintext password
+        * @param Password|null $existing Optional existing hash to get options from
+        * @return Password object
+        */
+       public function newFromPlaintext( $password, Password $existing = null ) {
+               if ( $existing === null ) {
+                       $config = $this->types[$this->default];
+                       $obj = new $config['class']( $this, $config );
+               } else {
+                       $obj = clone $existing;
+               }
+
+               $obj->crypt( $password );
+
+               return $obj;
+       }
+
+       /**
+        * Determine whether a password object needs updating
+        *
+        * Check whether the given password is of the default type. If it is,
+        * pass off further needsUpdate checks to Password::needsUpdate.
+        *
+        * @param Password $password
+        *
+        * @return bool True if needs update, false otherwise
+        */
+       public function needsUpdate( Password $password ) {
+               if ( $password->getType() !== $this->default ) {
+                       return true;
+               } else {
+                       return $password->needsUpdate();
+               }
+       }
+}
diff --git a/includes/password/Pbkdf2Password.php b/includes/password/Pbkdf2Password.php
new file mode 100644 (file)
index 0000000..080e3b0
--- /dev/null
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Implements the Pbkdf2Password class for the MediaWiki software.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * A PBKDF2-hashed password
+ *
+ * This is a computationally complex password hash for use in modern applications.
+ * The number of rounds can be configured by $wgPasswordConfig['pbkdf2']['cost'].
+ *
+ * @since 1.24
+ */
+class Pbkdf2Password extends ParameterizedPassword {
+       protected function getDefaultParams() {
+               return array(
+                       'algo' => $this->config['algo'],
+                       'rounds' => $this->config['cost'],
+                       'length' => $this->config['length']
+               );
+       }
+
+       protected function getDelimiter() {
+               return ':';
+       }
+
+       public function crypt( $password ) {
+               if ( count( $this->args ) == 0 ) {
+                       $this->args[] = base64_encode( MWCryptRand::generate( 16, true ) );
+               }
+
+               if ( function_exists( 'hash_pbkdf2' ) ) {
+                       $hash = hash_pbkdf2(
+                               $this->params['algo'],
+                               $password,
+                               base64_decode( $this->args[0] ),
+                               (int)$this->params['rounds'],
+                               (int)$this->params['length'],
+                               true
+                       );
+               } else {
+                       $hashLen = strlen( hash( $this->params['algo'], '', true ) );
+                       $blockCount = ceil( $this->params['length'] / $hashLen );
+
+                       $hash = '';
+                       $salt = base64_decode( $this->args[0] );
+                       for ( $i = 1; $i <= $blockCount; ++$i ) {
+                               $roundTotal = $lastRound = hash_hmac(
+                                       $this->params['algo'],
+                                       $salt . pack( 'N', $i ),
+                                       $password,
+                                       true
+                               );
+
+                               for ( $j = 1; $j < $this->params['rounds']; ++$j ) {
+                                       $lastRound = hash_hmac( $this->params['algo'], $lastRound, $password, true );
+                                       $roundTotal ^= $lastRound;
+                               }
+
+                               $hash .= $roundTotal;
+                       }
+
+                       $hash = substr( $hash, 0, $this->params['length'] );
+               }
+
+               $this->hash = base64_encode( $hash );
+       }
+}
index f8d48cc..e77ffd7 100644 (file)
@@ -132,7 +132,7 @@ abstract class PoolCounter {
         * Lets another one grab the lock, and returns the workers
         * waiting on acquireForAnyone()
         *
-        * @return Status value is one of Released/NotLocked/Error
+        * @return Status Value is one of Released/NotLocked/Error
         */
        abstract public function release();
 
@@ -143,7 +143,7 @@ abstract class PoolCounter {
         * the same key can acquire a lock.
         *
         * @param string $key PoolCounter instance key (any string)
-        * @param int $slots the number of slots (max allowed value is 65536)
+        * @param int $slots The number of slots (max allowed value is 65536)
         * @return int
         */
        protected function hashKeyIntoSlots( $key, $slots ) {
index 2b37b0b..d609f61 100644 (file)
@@ -90,7 +90,7 @@ class PoolCounterRedis extends PoolCounter {
 
                $this->keySha1 = sha1( $this->key );
                $met = ini_get( 'max_execution_time' ); // usually 0 in CLI mode
-               $this->lockTTL = $met ? 2*$met : 3600;
+               $this->lockTTL = $met ? 2 * $met : 3600;
 
                if ( self::$active === null ) {
                        self::$active = array();
index 75f6966..7b8f340 100644 (file)
@@ -25,7 +25,7 @@
 
 /**
  * Begin profiling of a function
- * @param string $functionname name of the function we will profile
+ * @param string $functionname Name of the function we will profile
  */
 function wfProfileIn( $functionname ) {
        if ( Profiler::$__instance === null ) { // use this directly to reduce overhead
@@ -38,7 +38,7 @@ function wfProfileIn( $functionname ) {
 
 /**
  * Stop profiling of a function
- * @param string $functionname name of the function we have profiled
+ * @param string $functionname Name of the function we have profiled
  */
 function wfProfileOut( $functionname = 'missing' ) {
        if ( Profiler::$__instance === null ) { // use this directly to reduce overhead
@@ -126,7 +126,7 @@ abstract class Profiler {
                        if ( is_array( $wgProfiler ) ) {
                                if ( !isset( $wgProfiler['class'] ) ) {
                                        $class = 'ProfilerStub';
-                               } elseif ( $wgProfiler['class'] === 'Profiler'  ) {
+                               } elseif ( $wgProfiler['class'] === 'Profiler' ) {
                                        $class = 'ProfilerStub'; // b/c; don't explode
                                } else {
                                        $class = $wgProfiler['class'];
@@ -196,7 +196,7 @@ abstract class Profiler {
        /**
         * Called by wfProfieOut()
         *
-        * @param  string $functionname
+        * @param string $functionname
         */
        abstract public function profileOut( $functionname );
 
@@ -326,7 +326,7 @@ abstract class Profiler {
        /**
         * Add an entry in the debug log file
         *
-        * @param string $s to output
+        * @param string $s String to output
         */
        protected function debug( $s ) {
                if ( function_exists( 'wfDebug' ) ) {
@@ -338,7 +338,7 @@ abstract class Profiler {
         * Add an entry in the debug log group
         *
         * @param string $group Group to send the message to
-        * @param string $s to output
+        * @param string $s String to output
         */
        protected function debugGroup( $group, $s ) {
                if ( function_exists( 'wfDebugLog' ) ) {
@@ -356,7 +356,7 @@ abstract class Profiler {
  * @since 1.24
  */
 class TransactionProfiler {
-       /** @var float seconds */
+       /** @var float Seconds */
        protected $mDBLockThreshold = 3.0;
        /** @var array DB/server name => (active trx count, time, DBs involved) */
        protected $mDBTrxHoldingLocks = array();
@@ -397,7 +397,7 @@ class TransactionProfiler {
        public function recordFunctionCompletion( $method, $realtime ) {
                if ( !$this->mDBTrxHoldingLocks ) {
                        return; // short-circuit
-               // @TODO: hardcoded check is a tad janky (what about FOR UPDATE?)
+               // @todo hardcoded check is a tad janky (what about FOR UPDATE?)
                } elseif ( !preg_match( '/^query-m: (?!SELECT)/', $method )
                        && $realtime < $this->mDBLockThreshold
                ) {
index abcd23c..af3c774 100644 (file)
@@ -94,8 +94,8 @@ class ProfilerMwprof extends Profiler {
         * Update an entry with timing data.
         *
         * @param string $name Section name
-        * @param float $elapsedCpu elapsed CPU time
-        * @param float $elapsedWall elapsed wall-clock time
+        * @param float $elapsedCpu Elapsed CPU time
+        * @param float $elapsedWall Elapsed wall-clock time
         */
        public function updateRunningEntry( $name, $elapsedCpu, $elapsedWall ) {
                // If this is the first measurement for this entry, store plain values.
index 5de9982..7fd86eb 100644 (file)
@@ -299,7 +299,7 @@ class ProfilerStandard extends Profiler {
        /**
         * Recursive function the format the current profiling array into a tree
         *
-        * @param array $stack profiling array
+        * @param array $stack Profiling array
         * @return array
         */
        protected function remapCallTree( array $stack ) {
index 066ecbe..768dd7f 100644 (file)
@@ -31,7 +31,7 @@ interface RCFeedEngine {
         * @see RecentChange::cleanupForIRC
         * @param array $feed The feed, as configured in an associative array
         * @param string $line The text to send
-        * @return bool success
+        * @return bool Success
         */
        public function send( array $feed, $line );
 }
diff --git a/includes/resourceloader/DerivativeResourceLoaderContext.php b/includes/resourceloader/DerivativeResourceLoaderContext.php
new file mode 100644 (file)
index 0000000..d114d7e
--- /dev/null
@@ -0,0 +1,202 @@
+<?php
+/**
+ * Derivative context for resource loader modules.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 Kunal Mehta
+ */
+
+/**
+ * Allows changing specific properties of a context object,
+ * without changing the main one. Inspired by DerivativeContext.
+ *
+ * @since 1.24
+ */
+class DerivativeResourceLoaderContext extends ResourceLoaderContext {
+
+       /**
+        * @var ResourceLoaderContext
+        */
+       private $context;
+       protected $modules;
+       protected $language;
+       protected $direction;
+       protected $skin;
+       protected $user;
+       protected $debug;
+       protected $only;
+       protected $version;
+       protected $hash;
+       protected $raw;
+
+       public function __construct( ResourceLoaderContext $context ) {
+               $this->context = $context;
+       }
+
+       public function getModules() {
+               if ( !is_null( $this->modules ) ) {
+                       return $this->modules;
+               } else {
+                       return $this->context->getModules();
+               }
+       }
+
+       /**
+        * @param string[] $modules
+        */
+       public function setModules( array $modules ) {
+               $this->modules = $modules;
+       }
+
+       public function getLanguage() {
+               if ( !is_null( $this->language ) ) {
+                       return $this->language;
+               } else {
+                       return $this->context->getLanguage();
+               }
+       }
+
+       /**
+        * @param string $language
+        */
+       public function setLanguage( $language ) {
+               $this->language = $language;
+               $this->direction = null; // Invalidate direction since it might be based on language
+               $this->hash = null;
+       }
+
+       public function getDirection() {
+               if ( !is_null( $this->direction ) ) {
+                       return $this->direction;
+               } else {
+                       return $this->context->getDirection();
+               }
+       }
+
+       /**
+        * @param string $direction
+        */
+       public function setDirection( $direction ) {
+               $this->direction = $direction;
+               $this->hash = null;
+       }
+
+       public function getSkin() {
+               if ( !is_null( $this->skin ) ) {
+                       return $this->skin;
+               } else {
+                       return $this->context->getSkin();
+               }
+       }
+
+       /**
+        * @param string $skin
+        */
+       public function setSkin( $skin ) {
+               $this->skin = $skin;
+               $this->hash = null;
+       }
+
+       public function getUser() {
+               if ( !is_null( $this->user ) ) {
+                       return $this->user;
+               } else {
+                       return $this->context->getUser();
+               }
+       }
+
+       /**
+        * @param string $user
+        */
+       public function setUser( $user ) {
+               $this->user = $user;
+               $this->hash = null;
+       }
+
+       public function getDebug() {
+               if ( !is_null( $this->debug ) ) {
+                       return $this->debug;
+               } else {
+                       return $this->context->getDebug();
+               }
+       }
+
+       /**
+        * @param bool $debug
+        */
+       public function setDebug( $debug ) {
+               $this->debug = $debug;
+               $this->hash = null;
+       }
+
+       public function getOnly() {
+               if ( !is_null( $this->only ) ) {
+                       return $this->only;
+               } else {
+                       return $this->context->getOnly();
+               }
+       }
+
+       /**
+        * @param string $only
+        */
+       public function setOnly( $only ) {
+               $this->only = $only;
+               $this->hash = null;
+       }
+
+       public function getVersion() {
+               if ( !is_null( $this->version ) ) {
+                       return $this->version;
+               } else {
+                       return $this->context->getVersion();
+               }
+       }
+
+       /**
+        * @param string $version
+        */
+       public function setVersion( $version ) {
+               $this->version = $version;
+               $this->hash = null;
+       }
+
+       public function getRaw() {
+               if ( !is_null( $this->raw ) ) {
+                       return $this->raw;
+               } else {
+                       return $this->context->getRaw();
+               }
+       }
+
+       /**
+        * @param bool $raw
+        */
+       public function setRaw( $raw ) {
+               $this->raw = $raw;
+       }
+
+       public function getRequest() {
+               return $this->context->getRequest();
+       }
+
+       public function getResourceLoader() {
+               return $this->context->getResourceLoader();
+       }
+
+}
index 5ac874d..bcb3842 100644 (file)
@@ -50,7 +50,7 @@ class ResourceLoader {
         */
        protected $testModuleNames = array();
 
-       /** @var array e.g. array( 'source-id' => array( 'loadScript' => 'http://.../load.php' ) ) */
+       /** @var array E.g. array( 'source-id' => array( 'loadScript' => 'http://.../load.php' ) ) */
        protected $sources = array();
 
        /** @var bool */
@@ -293,6 +293,47 @@ class ResourceLoader {
                                        '\': expected ResourceLoaderModule or array (got: ' . gettype( $info ) . ')'
                                );
                        }
+
+                       // Last-minute changes
+
+                       // Apply custom skin-defined styles to existing modules.
+                       if ( $this->isFileModule( $name ) ) {
+                               global $wgResourceModuleSkinStyles;
+                               foreach ( $wgResourceModuleSkinStyles as $skinName => $skinStyles ) {
+                                       // If this module already defines skinStyles for this skin, ignore $wgResourceModuleSkinStyles.
+                                       if ( isset( $this->moduleInfos[$name]['skinStyles'][$skinName] ) ) {
+                                               continue;
+                                       }
+
+                                       // If $name is preceded with a '+', the defined style files will be added to 'default'
+                                       // skinStyles, otherwise 'default' will be ignored as it normally would be.
+                                       if ( isset( $skinStyles[ $name ] ) ) {
+                                               $paths = (array)$skinStyles[ $name ];
+                                               $styleFiles = array();
+                                       } else if ( isset( $skinStyles[ '+' . $name ] ) ) {
+                                               $paths = (array)$skinStyles[ '+' . $name ];
+                                               $styleFiles = isset( $this->moduleInfos[$name]['skinStyles']['default'] ) ?
+                                                       $this->moduleInfos[$name]['skinStyles']['default'] :
+                                                       array();
+                                       } else {
+                                               continue;
+                                       }
+
+                                       // Add new file paths, remapping them to refer to our directories and not use settings
+                                       // from the module we're modifying. These can come from the base definition or be defined
+                                       // for each module.
+                                       list( $localBasePath, $remoteBasePath ) =
+                                               ResourceLoaderFileModule::extractBasePaths( $skinStyles );
+                                       list( $localBasePath, $remoteBasePath ) =
+                                               ResourceLoaderFileModule::extractBasePaths( $paths, $localBasePath, $remoteBasePath );
+
+                                       foreach ( $paths as $path ) {
+                                               $styleFiles[] = new ResourceLoaderFilePath( $path, $localBasePath, $remoteBasePath );
+                                       }
+
+                                       $this->moduleInfos[$name]['skinStyles'][$skinName] = $styleFiles;
+                               }
+                       }
                }
 
                wfProfileOut( __METHOD__ );
@@ -448,6 +489,23 @@ class ResourceLoader {
                return $this->modules[$name];
        }
 
+       /**
+        * Return whether the definition of a module corresponds to a simple ResourceLoaderFileModule.
+        *
+        * @param string $name Module name
+        * @return boolean
+        */
+       protected function isFileModule( $name ) {
+               if ( !isset( $this->moduleInfos[$name] ) ) {
+                       return false;
+               }
+               $info = $this->moduleInfos[$name];
+               if ( isset( $info['object'] ) || isset( $info['class'] ) ) {
+                       return false;
+               }
+               return true;
+       }
+
        /**
         * Get the list of sources.
         *
@@ -457,6 +515,22 @@ class ResourceLoader {
                return $this->sources;
        }
 
+       /**
+        * Get the URL to the load.php endpoint for the given
+        * ResourceLoader source
+        *
+        * @since 1.24
+        * @param string $source
+        * @throws MWException On an invalid $source name
+        * @return string
+        */
+       public function getLoadScript( $source ) {
+               if ( !isset( $this->sources[$source] ) ) {
+                       throw new MWException( "The $source source was never registered in ResourceLoader." );
+               }
+               return $this->sources[$source]['loadScript'];
+       }
+
        /**
         * Output a response to a load request, including the content-type header.
         *
@@ -1232,6 +1306,27 @@ class ResourceLoader {
 
        /**
         * Build a load.php URL
+        *
+        * @since 1.24
+        * @param string $source Name of the ResourceLoader source
+        * @param ResourceLoaderContext $context
+        * @param array $extraQuery
+        * @return string URL to load.php. May be protocol-relative (if $wgLoadScript is procol-relative)
+        */
+       public function createLoaderURL( $source, ResourceLoaderContext $context,
+               $extraQuery = array()
+       ) {
+               $query = self::createLoaderQuery( $context, $extraQuery );
+               $script = $this->getLoadScript( $source );
+
+               // Prevent the IE6 extension check from being triggered (bug 28840)
+               // by appending a character that's invalid in Windows extensions ('*')
+               return wfExpandUrl( wfAppendQuery( $script, $query ) . '&*', PROTO_RELATIVE );
+       }
+
+       /**
+        * Build a load.php URL
+        * @deprecated since 1.24, use createLoaderURL instead
         * @param array $modules Array of module names (strings)
         * @param string $lang Language code
         * @param string $skin Skin name
@@ -1259,6 +1354,30 @@ class ResourceLoader {
                return wfExpandUrl( wfAppendQuery( $wgLoadScript, $query ) . '&*', PROTO_RELATIVE );
        }
 
+       /**
+        * Helper for createLoaderURL()
+        *
+        * @since 1.24
+        * @see makeLoaderQuery
+        * @param ResourceLoaderContext $context
+        * @param array $extraQuery
+        * @return array
+        */
+       public static function createLoaderQuery( ResourceLoaderContext $context, $extraQuery = array() ) {
+               return self::makeLoaderQuery(
+                       $context->getModules(),
+                       $context->getLanguage(),
+                       $context->getSkin(),
+                       $context->getUser(),
+                       $context->getVersion(),
+                       $context->getDebug(),
+                       $context->getOnly(),
+                       $context->getRequest()->getBool( 'printable' ),
+                       $context->getRequest()->getBool( 'handheld' ),
+                       $extraQuery
+               );
+       }
+
        /**
         * Build a query array (array representation of query string) for load.php. Helper
         * function for makeLoaderURL().
index 9013e2b..8994c0e 100644 (file)
@@ -208,21 +208,21 @@ class ResourceLoaderContext {
         * @return bool
         */
        public function shouldIncludeScripts() {
-               return is_null( $this->only ) || $this->only === 'scripts';
+               return is_null( $this->getOnly() ) || $this->getOnly() === 'scripts';
        }
 
        /**
         * @return bool
         */
        public function shouldIncludeStyles() {
-               return is_null( $this->only ) || $this->only === 'styles';
+               return is_null( $this->getOnly() ) || $this->getOnly() === 'styles';
        }
 
        /**
         * @return bool
         */
        public function shouldIncludeMessages() {
-               return is_null( $this->only ) || $this->only === 'messages';
+               return is_null( $this->getOnly() ) || $this->getOnly() === 'messages';
        }
 
        /**
@@ -231,8 +231,8 @@ class ResourceLoaderContext {
        public function getHash() {
                if ( !isset( $this->hash ) ) {
                        $this->hash = implode( '|', array(
-                               $this->getLanguage(), $this->getDirection(), $this->skin, $this->user,
-                               $this->debug, $this->only, $this->version
+                               $this->getLanguage(), $this->getDirection(), $this->getSkin(), $this->getUser(),
+                               $this->getDebug(), $this->getOnly(), $this->getVersion()
                        ) );
                }
                return $this->hash;
index 3a6d5d2..edde9bc 100644 (file)
@@ -218,27 +218,17 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *     )
         * @endcode
         */
-       public function __construct( $options = array(), $localBasePath = null,
+       public function __construct(
+               $options = array(),
+               $localBasePath = null,
                $remoteBasePath = null
        ) {
-               global $IP, $wgScriptPath, $wgResourceBasePath;
-               $this->localBasePath = $localBasePath === null ? $IP : $localBasePath;
-               if ( $remoteBasePath !== null ) {
-                       $this->remoteBasePath = $remoteBasePath;
-               } else {
-                       $this->remoteBasePath = $wgResourceBasePath === null ? $wgScriptPath : $wgResourceBasePath;
-               }
-
-               if ( isset( $options['remoteExtPath'] ) ) {
-                       global $wgExtensionAssetsPath;
-                       $this->remoteBasePath = $wgExtensionAssetsPath . '/' . $options['remoteExtPath'];
-               }
-
-               if ( isset( $options['remoteSkinPath'] ) ) {
-                       global $wgStylePath;
-                       $this->remoteBasePath = $wgStylePath . '/' . $options['remoteSkinPath'];
-               }
+               // localBasePath and remoteBasePath both have unbelievably long fallback chains
+               // and need to be handled separately.
+               list( $this->localBasePath, $this->remoteBasePath ) =
+                       self::extractBasePaths( $options, $localBasePath, $remoteBasePath );
 
+               // Extract, validate and normalise remaining options
                foreach ( $options as $member => $option ) {
                        switch ( $member ) {
                                // Lists of file paths
@@ -281,8 +271,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                // Single strings
                                case 'group':
                                case 'position':
-                               case 'localBasePath':
-                               case 'remoteBasePath':
                                case 'skipFunction':
                                        $this->{$member} = (string)$option;
                                        break;
@@ -293,9 +281,59 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                        break;
                        }
                }
+       }
+
+       /**
+        * Extract a pair of local and remote base paths from module definition information.
+        * Implementation note: the amount of global state used in this function is staggering.
+        *
+        * @param array $options Module definition
+        * @param string $localBasePath Path to use if not provided in module definition. Defaults
+        *     to $IP
+        * @param string $remoteBasePath Path to use if not provided in module definition. Defaults
+        *     to $wgScriptPath
+        * @return array array( localBasePath, remoteBasePath )
+        */
+       public static function extractBasePaths(
+               $options = array(),
+               $localBasePath = null,
+               $remoteBasePath = null
+       ) {
+               global $IP, $wgScriptPath, $wgResourceBasePath;
+
+               // The different ways these checks are done, and their ordering, look very silly,
+               // but were preserved for backwards-compatibility just in case. Tread lightly.
+
+               $localBasePath = $localBasePath === null ? $IP : $localBasePath;
+               if ( $remoteBasePath !== null ) {
+                       $remoteBasePath = $remoteBasePath;
+               } else {
+                       $remoteBasePath = $wgResourceBasePath === null ? $wgScriptPath : $wgResourceBasePath;
+               }
+
+               if ( isset( $options['remoteExtPath'] ) ) {
+                       global $wgExtensionAssetsPath;
+                       $remoteBasePath = $wgExtensionAssetsPath . '/' . $options['remoteExtPath'];
+               }
+
+               if ( isset( $options['remoteSkinPath'] ) ) {
+                       global $wgStylePath;
+                       $remoteBasePath = $wgStylePath . '/' . $options['remoteSkinPath'];
+               }
+
+               if ( array_key_exists( 'localBasePath', $options ) ) {
+                       $localBasePath = (string)$options['localBasePath'];
+               }
+
+               if ( array_key_exists( 'remoteBasePath', $options ) ) {
+                       $remoteBasePath = (string)$options['remoteBasePath'];
+               }
+
                // Make sure the remote base path is a complete valid URL,
                // but possibly protocol-relative to avoid cache pollution
-               $this->remoteBasePath = wfExpandUrl( $this->remoteBasePath, PROTO_RELATIVE );
+               $remoteBasePath = wfExpandUrl( $remoteBasePath, PROTO_RELATIVE );
+
+               return array( $localBasePath, $remoteBasePath );
        }
 
        /**
@@ -331,7 +369,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Get loader script.
         *
-        * @return string|false JavaScript code to be added to startup module
+        * @return string|bool JavaScript code to be added to startup module
         */
        public function getLoaderScript() {
                if ( count( $this->loaderScripts ) === 0 ) {
@@ -567,18 +605,26 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /* Protected Methods */
 
        /**
-        * @param string $path
+        * @param string|ResourceLoaderFilePath $path
         * @return string
         */
        protected function getLocalPath( $path ) {
+               if ( $path instanceof ResourceLoaderFilePath ) {
+                       return $path->getLocalPath();
+               }
+
                return "{$this->localBasePath}/$path";
        }
 
        /**
-        * @param string $path
+        * @param string|ResourceLoaderFilePath $path
         * @return string
         */
        protected function getRemotePath( $path ) {
+               if ( $path instanceof ResourceLoaderFilePath ) {
+                       return $path->getRemotePath();
+               }
+
                return "{$this->remoteBasePath}/$path";
        }
 
@@ -660,7 +706,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        $files = array_merge( $files, $this->debugScripts );
                }
 
-               return array_unique( $files );
+               return array_unique( $files, SORT_REGULAR );
        }
 
        /**
@@ -751,7 +797,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        return '';
                }
                $js = '';
-               foreach ( array_unique( $scripts ) as $fileName ) {
+               foreach ( array_unique( $scripts, SORT_REGULAR ) as $fileName ) {
                        $localPath = $this->getLocalPath( $fileName );
                        if ( !file_exists( $localPath ) ) {
                                throw new MWException( __METHOD__ . ": script file not found: \"$localPath\"" );
@@ -785,7 +831,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        return array();
                }
                foreach ( $styles as $media => $files ) {
-                       $uniqueFiles = array_unique( $files );
+                       $uniqueFiles = array_unique( $files, SORT_REGULAR );
                        $styleFiles = array();
                        foreach ( $uniqueFiles as $file ) {
                                $styleFiles[] = $this->readStyleFile( $file, $flip );
@@ -804,17 +850,18 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @param bool $flip
         *
         * @return string CSS data in script file
-        * @throws MWException if the file doesn't exist
+        * @throws MWException If the file doesn't exist
         */
        protected function readStyleFile( $path, $flip ) {
                $localPath = $this->getLocalPath( $path );
+               $remotePath = $this->getRemotePath( $path );
                if ( !file_exists( $localPath ) ) {
                        $msg = __METHOD__ . ": style file not found: \"$localPath\"";
                        wfDebugLog( 'resourceloader', $msg );
                        throw new MWException( $msg );
                }
 
-               if ( $this->getStyleSheetLang( $path ) === 'less' ) {
+               if ( $this->getStyleSheetLang( $localPath ) === 'less' ) {
                        $style = $this->compileLESSFile( $localPath );
                        $this->hasGeneratedStyles = true;
                } else {
@@ -824,20 +871,15 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                if ( $flip ) {
                        $style = CSSJanus::transform( $style, true, false );
                }
-               $dirname = dirname( $path );
-               if ( $dirname == '.' ) {
-                       // If $path doesn't have a directory component, don't prepend a dot
-                       $dirname = '';
-               }
-               $dir = $this->getLocalPath( $dirname );
-               $remoteDir = $this->getRemotePath( $dirname );
+               $localDir = dirname( $localPath );
+               $remoteDir = dirname( $remotePath );
                // Get and register local file references
                $this->localFileRefs = array_merge(
                        $this->localFileRefs,
-                       CSSMin::getLocalFileReferences( $style, $dir )
+                       CSSMin::getLocalFileReferences( $style, $localDir )
                );
                return CSSMin::remap(
-                       $style, $dir, $remoteDir, true
+                       $style, $localDir, $remoteDir, true
                );
        }
 
diff --git a/includes/resourceloader/ResourceLoaderFilePath.php b/includes/resourceloader/ResourceLoaderFilePath.php
new file mode 100644 (file)
index 0000000..dd239d0
--- /dev/null
@@ -0,0 +1,74 @@
+<?php
+/**
+ * An object to represent a path to a JavaScript/CSS file, along with a remote
+ * and local base path, for use with ResourceLoaderFileModule.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * An object to represent a path to a JavaScript/CSS file, along with a remote
+ * and local base path, for use with ResourceLoaderFileModule.
+ */
+class ResourceLoaderFilePath {
+       /* Protected Members */
+
+       /** @var string Local base path */
+       protected $localBasePath;
+
+       /** @var string Remote base path */
+       protected $remoteBasePath;
+
+       /**
+        * @var string Path to the file */
+       protected $path;
+
+       /* Methods */
+
+       /**
+        * @param string $path Path to the file.
+        * @param string $localBasePath Base path to prepend when generating a local path.
+        * @param string $remoteBasePath Base path to prepend when generating a remote path.
+        */
+       public function __construct( $path, $localBasePath, $remoteBasePath ) {
+               $this->path = $path;
+               $this->localBasePath = $localBasePath;
+               $this->remoteBasePath = $remoteBasePath;
+       }
+
+       /**
+        * @return string
+        */
+       public function getLocalPath() {
+               return "{$this->localBasePath}/{$this->path}";
+       }
+
+       /**
+        * @return string
+        */
+       public function getRemotePath() {
+               return "{$this->remoteBasePath}/{$this->path}";
+       }
+
+       /**
+        * @return string
+        */
+       public function getPath() {
+               return $this->path;
+       }
+}
index 73b6ea7..fe0c845 100644 (file)
@@ -34,7 +34,7 @@ class ResourceLoaderLanguageNamesModule extends ResourceLoaderModule {
 
 
        /**
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @return array
         */
        protected function getData( ResourceLoaderContext $context ) {
@@ -45,7 +45,7 @@ class ResourceLoaderLanguageNamesModule extends ResourceLoaderModule {
        }
 
        /**
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
index f636105..0ace76a 100644 (file)
@@ -144,17 +144,17 @@ abstract class ResourceLoaderModule {
         * @return array Array of URLs
         */
        public function getScriptURLsForDebug( ResourceLoaderContext $context ) {
-               $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' )
+               $resourceLoader = $context->getResourceLoader();
+               $derivative = new DerivativeResourceLoaderContext( $context );
+               $derivative->setModules( array( $this->getName() ) );
+               $derivative->setOnly( 'scripts' );
+               $derivative->setDebug( true );
+
+               $url = $resourceLoader->createLoaderURL(
+                       $this->getSource(),
+                       $derivative
                );
+
                return array( $url );
        }
 
@@ -188,20 +188,20 @@ abstract class ResourceLoaderModule {
         * load the files directly. See also getScriptURLsForDebug()
         *
         * @param ResourceLoaderContext $context
-        * @return array array( mediaType => array( URL1, URL2, ... ), ... )
+        * @return array Array( mediaType => array( URL1, URL2, ... ), ... )
         */
        public function getStyleURLsForDebug( ResourceLoaderContext $context ) {
-               $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' )
+               $resourceLoader = $context->getResourceLoader();
+               $derivative = new DerivativeResourceLoaderContext( $context );
+               $derivative->setModules( array( $this->getName() ) );
+               $derivative->setOnly( 'styles' );
+               $derivative->setDebug( true );
+
+               $url = $resourceLoader->createLoaderURL(
+                       $this->getSource(),
+                       $derivative
                );
+
                return array( 'all' => array( $url ) );
        }
 
@@ -548,7 +548,7 @@ abstract class ResourceLoaderModule {
                return false;
        }
 
-       /** @var JSParser lazy-initialized; use self::javaScriptParser() */
+       /** @var JSParser Lazy-initialized; use self::javaScriptParser() */
        private static $jsParser;
        private static $parseCacheVersion = 1;
 
index 56eb0a0..2c0f8df 100644 (file)
@@ -168,7 +168,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
         * This way we can reasonably reduce the amout of module registration
         * data send to the client.
         *
-        * @param Array &$registryData Modules keyed by name with properties:
+        * @param array &$registryData Modules keyed by name with properties:
         *  - string 'version'
         *  - array 'dependencies'
         *  - string|null 'group'
@@ -233,7 +233,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                );
                        }
 
-                       $registryData[ $name ] = array(
+                       $registryData[$name] = array(
                                'version' => $mtime,
                                'dependencies' => $module->getDependencies(),
                                'group' => $module->getGroup(),
index e42301b..dc52969 100644 (file)
@@ -91,7 +91,7 @@ class RevisionDeleter {
         * Checks for a change in the bitfield for a certain option and updates the
         * provided array accordingly.
         *
-        * @param string $desc description to add to the array if the option was
+        * @param string $desc Description to add to the array if the option was
         * enabled / disabled.
         * @param int $field The bitmask describing the single option.
         * @param int $diff The xor of the old and new bitfields.
index b8b2bae..57cdaf4 100644 (file)
@@ -117,7 +117,7 @@ class SearchHighlighter {
                                                }
                                                $offset = $endMatches[0][1] + strlen( $endMatches[0][0] );
                                        }
-                                       if ( ! $found ) {
+                                       if ( !$found ) {
                                                // couldn't find appropriate closing tag, skip
                                                $this->splitAndAdd( $textExt, $count, substr( $text, $start, strlen( $matches[0][0] ) ) );
                                                $start += strlen( $matches[0][0] );
@@ -184,7 +184,7 @@ class SearchHighlighter {
                        $succ = true;
                        // check if first text contains all terms
                        foreach ( $terms as $term ) {
-                               if ( ! preg_match( "/$patPre" . $term . "$patPost/ui", $firstText ) ) {
+                               if ( !preg_match( "/$patPre" . $term . "$patPost/ui", $firstText ) ) {
                                        $succ = false;
                                        break;
                                }
@@ -194,7 +194,7 @@ class SearchHighlighter {
                                $offsets[$first] = 0;
                        }
                }
-               if ( ! $snippets ) {
+               if ( !$snippets ) {
                        // match whole query on text
                        $this->process( $pat1, $textExt, $left, $contextchars, $snippets, $offsets );
                        // match whole query on templates/tables/images
@@ -279,7 +279,7 @@ class SearchHighlighter {
 
                $processed = array();
                foreach ( $terms as $term ) {
-                       if ( ! isset( $processed[$term] ) ) {
+                       if ( !isset( $processed[$term] ) ) {
                                $pat3 = "/$patPre(" . $term . ")$patPost/ui"; // highlight word
                                $extract = preg_replace( $pat3,
                                        "\\1<span class='searchmatch'>\\2</span>\\3", $extract );
@@ -295,7 +295,7 @@ class SearchHighlighter {
        /**
         * Split text into lines and add it to extracts array
         *
-        * @param array $extracts index -> $line
+        * @param array $extracts Index -> $line
         * @param int $count
         * @param string $text
         */
@@ -528,7 +528,7 @@ class SearchHighlighter {
                        }
                        ++$lineno;
                        $m = array();
-                       if ( ! preg_match( $pat1, $line, $m ) ) {
+                       if ( !preg_match( $pat1, $line, $m ) ) {
                                continue;
                        }
                        --$contextlines;
index 56ae2ff..453211b 100644 (file)
@@ -217,7 +217,7 @@ class SearchResult {
        }
 
        /**
-        * @return string timestamp
+        * @return string Timestamp
         */
        function getTimestamp() {
                if ( $this->mRevision ) {
index 4854bcb..9711f04 100644 (file)
@@ -215,7 +215,7 @@ class MediaWikiSite extends Site {
                        // Filter the substructure down to what we actually are using.
                        $collectedHits = array_filter(
                                array_values( $externalData['query'][$listId] ),
-                               function( $a ) use ( $fieldId, $pageTitle ) {
+                               function ( $a ) use ( $fieldId, $pageTitle ) {
                                        return $a[$fieldId] === $pageTitle;
                                }
                        );
index e3559f5..fafb14c 100644 (file)
@@ -700,7 +700,7 @@ class Site implements Serializable {
 }
 
 /**
- * @deprecated
+ * @deprecated since 1.21
  */
 class SiteObject extends Site {
 }
index dfe4ec5..2d9f22d 100644 (file)
@@ -277,7 +277,7 @@ class SiteList extends GenericArrayObject {
                $group = new self();
 
                /**
-                * @var \Site $site
+                * @var Site $site
                 */
                foreach ( $this as $site ) {
                        if ( $site->getGroup() === $groupName ) {
@@ -352,7 +352,7 @@ class SiteList extends GenericArrayObject {
 }
 
 /**
- * @deprecated
+ * @deprecated since 1.21
  */
 class SiteArray extends SiteList {
 }
index f382d98..6659407 100644 (file)
@@ -460,7 +460,7 @@ class SiteSQLStore implements SiteStore {
 }
 
 /**
- * @deprecated
+ * @deprecated since 1.21
  */
 class Sites extends SiteSQLStore {
 
@@ -468,7 +468,7 @@ class Sites extends SiteSQLStore {
         * Factory for creating new site objects.
         *
         * @since 1.21
-        * @deprecated
+        * @deprecated since 1.21
         *
         * @param string|bool $globalId
         *
@@ -485,7 +485,7 @@ class Sites extends SiteSQLStore {
        }
 
        /**
-        * @deprecated
+        * @deprecated since 1.21
         * @return SiteStore
         */
        public static function singleton() {
@@ -499,7 +499,7 @@ class Sites extends SiteSQLStore {
        }
 
        /**
-        * @deprecated
+        * @deprecated since 1.21
         * @param string $group
         * @return SiteList
         */
index 008200d..806a48a 100644 (file)
@@ -53,7 +53,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                $opts = $this->getOptions();
                if ( $rows === false ) {
                        if ( !$this->including() ) {
-                               $this->doHeader( $opts );
+                               $this->doHeader( $opts, 0 );
+                               $this->getOutput()->setStatusCode( 404 );
                        }
 
                        return;
@@ -290,8 +291,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        ''
                );
 
-               if ( !wfRunHooks( 'ChangesListSpecialPageQuery',
-                       array( $this->getName(), &$tables, &$fields, &$conds, &$query_options, &$join_conds, $opts ) )
+               if ( !$this->runMainQueryHook( $tables, $fields, $conds, $query_options, $join_conds,
+                       $opts )
                ) {
                        return false;
                }
@@ -308,6 +309,13 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                );
        }
 
+       protected function runMainQueryHook( &$tables, &$fields, &$conds, &$query_options, &$join_conds, $opts ) {
+               return wfRunHooks(
+                       'ChangesListSpecialPageQuery',
+                       array( $this->getName(), &$tables, &$fields, &$conds, &$query_options, &$join_conds, $opts )
+               );
+       }
+
        /**
         * Return a DatabaseBase object for reading
         *
@@ -326,7 +334,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        public function webOutput( $rows, $opts ) {
                if ( !$this->including() ) {
                        $this->outputFeedLinks();
-                       $this->doHeader( $opts );
+                       $this->doHeader( $opts, $rows->numRows() );
                }
 
                $this->outputChangesList( $rows, $opts );
@@ -351,8 +359,9 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * Set the text to be displayed above the changes
         *
         * @param FormOptions $opts
+        * @param int $numRows Number of rows in the result to show after this header
         */
-       public function doHeader( $opts ) {
+       public function doHeader( $opts, $numRows ) {
                $this->setTopText( $opts );
 
                // @todo Lots of stuff should be done here.
index 3a83d2b..b8fc05e 100644 (file)
@@ -470,7 +470,6 @@ abstract class QueryPage extends SpecialPage {
         * This is the actual workhorse. It does everything needed to make a
         * real, honest-to-gosh query page.
         * @param string $par
-        * @return int
         */
        function execute( $par ) {
                global $wgQueryCacheLimit, $wgDisableQueryPageUpdate;
@@ -488,7 +487,7 @@ abstract class QueryPage extends SpecialPage {
 
                if ( $this->isCached() && !$this->isCacheable() ) {
                        $out->addWikiMsg( 'querypage-disabled' );
-                       return 0;
+                       return;
                }
 
                $out->setSyndicated( $this->isSyndicated() );
@@ -578,8 +577,6 @@ abstract class QueryPage extends SpecialPage {
                }
 
                $out->addHTML( Xml::closeElement( 'div' ) );
-
-               return min( $this->numRows, $this->limit ); # do not return the one extra row, if exist
        }
 
        /**
index f968276..0070c74 100644 (file)
@@ -101,8 +101,8 @@ class SpecialPage {
         * @param string $name Name of the special page, as seen in links and URLs
         * @param string $restriction User right required, e.g. "block" or "delete"
         * @param bool $listed Whether the page is listed in Special:Specialpages
-        * @param callable|bool $function unused
-        * @param string $file unused
+        * @param callable|bool $function Unused
+        * @param string $file Unused
         * @param bool $includable Whether the page can be included in normal pages
         */
        public function __construct(
@@ -134,7 +134,7 @@ class SpecialPage {
        // @todo FIXME: Decide which syntax to use for this, and stick to it
        /**
         * Whether this special page is listed in Special:SpecialPages
-        * @since r3583 (v1.3)
+        * @since 1.3 (r3583)
         * @return bool
         */
        function isListed() {
@@ -328,7 +328,7 @@ class SpecialPage {
         *   - `prefixSearchSubpages( "" )` should return `array( foo", "bar", "baz" )`
         *
         * @param string $search Prefix to search for
-        * @param integer $limit Maximum number of results to return
+        * @param int $limit Maximum number of results to return
         * @return string[] Matching subpages
         */
        public function prefixSearchSubpages( $search, $limit = 10 ) {
index 9ff96ab..07b6b4e 100644 (file)
@@ -160,6 +160,7 @@ class SpecialPageFactory {
                'Emailuser' => 'SpecialEmailUser',
                'Movepage' => 'MovePageForm',
                'Mycontributions' => 'SpecialMycontributions',
+               'MyLanguage' => 'SpecialMyLanguage',
                'Mypage' => 'SpecialMypage',
                'Mytalk' => 'SpecialMytalk',
                'Myuploads' => 'SpecialMyuploads',
index e4b606d..04e2f11 100644 (file)
@@ -45,7 +45,7 @@ class SpecialAllPages extends IncludableSpecialPage {
        /**
         * Constructor
         *
-        * @param string $name name of the special page, as seen in links and URLs (default: 'Allpages')
+        * @param string $name Name of the special page, as seen in links and URLs (default: 'Allpages')
         */
        function __construct( $name = 'Allpages' ) {
                parent::__construct( $name );
@@ -54,7 +54,7 @@ class SpecialAllPages extends IncludableSpecialPage {
        /**
         * Entry point : initialise variables and call subfunctions.
         *
-        * @param string $par becomes "FOO" when called like Special:Allpages/FOO (default null)
+        * @param string $par Becomes "FOO" when called like Special:Allpages/FOO (default null)
         */
        function execute( $par ) {
                $request = $this->getRequest();
index 8c46a93..3297c17 100644 (file)
@@ -28,7 +28,7 @@
  * @ingroup SpecialPage
  */
 class SpecialBlock extends FormSpecialPage {
-       /** @var User user to be blocked, as passed either by parameter (url?wpTarget=Foo)
+       /** @var User User to be blocked, as passed either by parameter (url?wpTarget=Foo)
         * or as subpage (Special:Block/Foo) */
        protected $target;
 
@@ -454,7 +454,7 @@ class SpecialBlock extends FormSpecialPage {
        /**
         * Determine the target of the block, and the type of target
         * @todo Should be in Block.php?
-        * @param string $par subpage parameter passed to setup, or data value from
+        * @param string $par Subpage parameter passed to setup, or data value from
         *     the HTMLForm
         * @param WebRequest $request Optionally try and get data from a request too
         * @return array( User|string|null, Block::TYPE_ constant|null )
@@ -600,7 +600,7 @@ class SpecialBlock extends FormSpecialPage {
         * @return bool|string
         */
        public static function processForm( array $data, IContextSource $context ) {
-               global $wgBlockAllowsUTEdit, $wgHideUserContribLimit;
+               global $wgBlockAllowsUTEdit, $wgHideUserContribLimit, $wgContLang;
 
                $performer = $context->getUser();
 
@@ -687,7 +687,8 @@ class SpecialBlock extends FormSpecialPage {
                $block = new Block();
                $block->setTarget( $target );
                $block->setBlocker( $performer );
-               $block->mReason = $data['Reason'][0];
+               # Truncate reason for whole multibyte characters
+               $block->mReason = $wgContLang->truncate( $data['Reason'][0], 255 );
                $block->mExpiry = self::parseExpiryInput( $data['Expiry'] );
                $block->prevents( 'createaccount', $data['CreateAccount'] );
                $block->prevents( 'editownusertalk', ( !$wgBlockAllowsUTEdit || $data['DisableUTEdit'] ) );
index 734544d..3367bd4 100644 (file)
@@ -43,7 +43,7 @@ class SpecialCategories extends SpecialPage {
         * Initialize or override the PageLinkRenderer SpecialCategories collaborates with.
         * Useful mainly for testing.
         *
-        * @todo: the pager should also be injected, and de-coupled from the rendering logic.
+        * @todo the pager should also be injected, and de-coupled from the rendering logic.
         *
         * @param PageLinkRenderer $linkRenderer
         */
index dcd2443..ad1d597 100644 (file)
@@ -61,7 +61,7 @@ class SpecialChangePassword extends FormSpecialPage {
        /**
         * Set a message at the top of the Change Password form
         * @since 1.23
-        * @param Message $msg to parse and add to the form header
+        * @param Message $msg Message to parse and add to the form header
         */
        public function setChangeMessage( Message $msg ) {
                $this->mPreTextMessage = $msg;
@@ -230,7 +230,7 @@ class SpecialChangePassword extends FormSpecialPage {
        }
 
        /**
-        * @throws PasswordError when cannot set the new password because requirements not met.
+        * @throws PasswordError When cannot set the new password because requirements not met.
         */
        protected function attemptReset( $oldpass, $newpass, $retype ) {
                global $wgPasswordAttemptThrottle;
@@ -260,7 +260,7 @@ class SpecialChangePassword extends FormSpecialPage {
                        );
                }
 
-               // @TODO Make these separate messages, since the message is written for both cases
+               // @todo Make these separate messages, since the message is written for both cases
                if ( !$user->checkTemporaryPassword( $oldpass ) && !$user->checkPassword( $oldpass ) ) {
                        wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'wrongpassword' ) );
                        throw new PasswordError( $this->msg( 'resetpass-wrong-oldpass' )->text() );
index 05bbb5a..a884a39 100644 (file)
@@ -206,7 +206,7 @@ class SpecialContributions extends IncludableSpecialPage {
                                $output = $pager->getBody();
                                if ( !$this->including() ) {
                                        $output = '<p>' . $pager->getNavigationBar() . '</p>' .
-                                               $output.
+                                               $output .
                                                '<p>' . $pager->getNavigationBar() . '</p>';
                                }
                                $out->addHTML( $output );
@@ -255,6 +255,9 @@ class SpecialContributions extends IncludableSpecialPage {
                                                wfEscapeWikiText( $userObj->getName() ),
                                        )
                                );
+                               if ( !$this->including() ) {
+                                       $this->getOutput()->setStatusCode( 404 );
+                               }
                        }
                        $user = htmlspecialchars( $userObj->getName() );
                } else {
@@ -790,7 +793,7 @@ class ContribsPager extends ReverseChronologicalPager {
                // Paranoia: avoid brute force searches (bug 17342)
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $conds[] = $this->mDb->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0';
-               } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+               } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
                        $conds[] = $this->mDb->bitAnd( 'rev_deleted', Revision::SUPPRESSED_USER ) .
                                ' != ' . Revision::SUPPRESSED_USER;
                }
index 4df5b2b..b69eb63 100644 (file)
@@ -62,7 +62,7 @@ class DeletedContribsPager extends IndexPager {
                // Paranoia: avoid brute force searches (bug 17792)
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::DELETED_USER ) . ' = 0';
-               } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+               } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
                        $conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::SUPPRESSED_USER ) .
                                ' != ' . Revision::SUPPRESSED_USER;
                }
index 369f11f..76f2f4a 100644 (file)
@@ -70,9 +70,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $this->checkReadOnly();
 
                $this->outputHeader();
-
-               $out->addSubtitle( $this->msg( 'watchlistfor2', $this->getUser()->getName() )
-                       ->rawParams( SpecialEditWatchlist::buildTools( null ) ) );
+               $this->outputSubtitle();
 
                # B/C: $mode used to be waaay down the parameter list, and the first parameter
                # was $wgUser
@@ -104,24 +102,42 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 
                        case self::EDIT_NORMAL:
                        default:
-                               $out->setPageTitle( $this->msg( 'watchlistedit-normal-title' ) );
-                               $form = $this->getNormalForm();
-                               if ( $form->show() ) {
-                                       $out->addHTML( $this->successMessage );
-                                       $out->addReturnTo( SpecialPage::getTitleFor( 'Watchlist' ) );
-                               } elseif ( $this->toc !== false ) {
-                                       $out->prependHTML( $this->toc );
-                                       $out->addModules( 'mediawiki.toc' );
-                               }
+                       $this->executeViewEditWatchlist();
                                break;
                }
        }
 
+       /**
+        * Renders a subheader on the watchlist page.
+        */
+       protected function outputSubtitle() {
+               $out = $this->getOutput();
+               $out->addSubtitle( $this->msg( 'watchlistfor2', $this->getUser()->getName() )
+                       ->rawParams( SpecialEditWatchlist::buildTools( null ) ) );
+       }
+
+       /**
+        * Executes an edit mode for the watchlist view, from which you can manage your watchlist
+        *
+        */
+       protected function executeViewEditWatchlist() {
+               $out = $this->getOutput();
+               $out->setPageTitle( $this->msg( 'watchlistedit-normal-title' ) );
+               $form = $this->getNormalForm();
+               if ( $form->show() ) {
+                       $out->addHTML( $this->successMessage );
+                       $out->addReturnTo( SpecialPage::getTitleFor( 'Watchlist' ) );
+               } elseif ( $this->toc !== false ) {
+                       $out->prependHTML( $this->toc );
+                       $out->addModules( 'mediawiki.toc' );
+               }
+       }
+
        /**
         * Return an array of subpages beginning with $search that this special page will accept.
         *
         * @param string $search Prefix to search for
-        * @param integer $limit Maximum number of results to return
+        * @param int $limit Maximum number of results to return
         * @return string[] Matching subpages
         */
        public function prefixSearchSubpages( $search, $limit = 10 ) {
@@ -244,7 +260,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $talk = $this->msg( 'talkpagelinktext' )->escaped();
                // Do a batch existence check
                $batch = new LinkBatch();
-               if (count($titles) >= 100) {
+               if ( count( $titles ) >= 100 ) {
                        $output = wfMessage( 'watchlistedit-too-many' )->parse();
                        return;
                }
@@ -331,7 +347,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         *
         * @return array
         */
-       private function getWatchlistInfo() {
+       protected function getWatchlistInfo() {
                $titles = array();
                $dbr = wfGetDB( DB_MASTER );
 
@@ -538,23 +554,26 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $count = 0;
 
                foreach ( $this->getWatchlistInfo() as $namespace => $pages ) {
-                       if ( $namespace >= 0 ) {
-                               $fields['TitlesNs' . $namespace] = array(
-                                       'class' => 'EditWatchlistCheckboxSeriesField',
-                                       'options' => array(),
-                                       'section' => "ns$namespace",
-                               );
-                       }
+                       $options = array();
 
                        foreach ( array_keys( $pages ) as $dbkey ) {
                                $title = Title::makeTitleSafe( $namespace, $dbkey );
 
                                if ( $this->checkTitle( $title, $namespace, $dbkey ) ) {
                                        $text = $this->buildRemoveLine( $title );
-                                       $fields['TitlesNs' . $namespace]['options'][$text] = $title->getPrefixedText();
+                                       $options[$text] = $title->getPrefixedText();
                                        $count++;
                                }
                        }
+
+                       // checkTitle can filter some options out, avoid empty sections
+                       if ( count( $options ) > 0 ) {
+                               $fields['TitlesNs' . $namespace] = array(
+                                       'class' => 'EditWatchlistCheckboxSeriesField',
+                                       'options' => $options,
+                                       'section' => "ns$namespace",
+                               );
+                       }
                }
                $this->cleanupWatchlist();
 
@@ -763,8 +782,8 @@ class EditWatchlistCheckboxSeriesField extends HTMLMultiSelectField {
         * form is open (bug 32126), but we know that invalid items will
         * be harmless so we can override it here.
         *
-        * @param string $value the value the field was submitted with
-        * @param array $alldata the data collected from the form
+        * @param string $value The value the field was submitted with
+        * @param array $alldata The data collected from the form
         * @return bool|string Bool true on success, or String error to display.
         */
        function validate( $value, $alldata ) {
index 0062211..0958126 100644 (file)
@@ -175,7 +175,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
        /**
         * Validate target User
         *
-        * @param string $target target user name
+        * @param string $target Target user name
         * @return User User object on success or a string on error
         */
        public static function getTarget( $target ) {
index 35a3ba1..ecbd353 100644 (file)
@@ -41,7 +41,7 @@ class SpecialExpandTemplates extends SpecialPage {
        /** @var bool Whether or not to remove <nowiki> tags in the expanded wikitext */
        protected $removeNowiki;
 
-       /** @var maximum size in bytes to include. 50MB allows fixing those huge pages */
+       /** @var int Maximum size in bytes to include. 50MB allows fixing those huge pages */
        const MAX_INCLUDE_SIZE = 50000000;
 
        function __construct() {
index bc8e728..2cf5bfe 100644 (file)
@@ -302,7 +302,7 @@ class SpecialExport extends SpecialPage {
        /**
         * Do the actual page exporting
         *
-        * @param string $page user input on what page(s) to export
+        * @param string $page User input on what page(s) to export
         * @param int $history One of the WikiExporter history export constants
         * @param bool $list_authors Whether to add distinct author list (when
         *   not returning full history)
@@ -536,7 +536,7 @@ class SpecialExport extends SpecialPage {
         * @param array $inputPages List of titles to look up
         * @param array $pageSet Associative array indexed by titles for output
         *
-        * @return array associative array index by titles
+        * @return array Associative array index by titles
         */
        private function getImages( $inputPages, $pageSet ) {
                return $this->getLinks(
index b6c9d55..354960b 100644 (file)
@@ -59,7 +59,7 @@ class FileDuplicateSearchPage extends QueryPage {
        /**
         * Fetch dupes from all connected file repositories.
         *
-        * @return array of File objects
+        * @return array Array of File objects
         */
        function getDupes() {
                return RepoGroup::singleton()->findBySha1( $this->hash );
@@ -67,7 +67,7 @@ class FileDuplicateSearchPage extends QueryPage {
 
        /**
         *
-        * @param array $dupes of File objects
+        * @param array $dupes Array of File objects
         */
        function showList( $dupes ) {
                $html = array();
index eb1c139..5860f63 100644 (file)
@@ -37,7 +37,12 @@ class SpecialFilepath extends RedirectSpecialPage {
        function getRedirect( $par ) {
                $file = $par ?: $this->getRequest()->getText( 'file' );
 
-               return SpecialPage::getSafeTitleFor( 'Redirect', 'file/' . $file );
+               if ( $file ) {
+                       $argument = "file/$file";
+               } else {
+                       $argument = 'file';
+               }
+               return SpecialPage::getSafeTitleFor( 'Redirect', $argument );
        }
 
        protected function getGroupName() {
index 03b3688..a67d3c0 100644 (file)
@@ -177,7 +177,7 @@ HTML;
         * Return an array of subpages beginning with $search that this special page will accept.
         *
         * @param string $search Prefix to search for
-        * @param integer $limit Maximum number of results to return
+        * @param int $limit Maximum number of results to return
         * @return string[] Matching subpages
         */
        public function prefixSearchSubpages( $search, $limit = 10 ) {
index aec1257..10d1957 100644 (file)
@@ -51,7 +51,7 @@ class LinkSearchPage extends QueryPage {
         * Initialize or override the PageLinkRenderer LinkSearchPage collaborates with.
         * Useful mainly for testing.
         *
-        * @todo: query logic and rendering logic should be split and also injected
+        * @todo query logic and rendering logic should be split and also injected
         *
         * @param PageLinkRenderer $linkRenderer
         */
index a77b70c..582f743 100644 (file)
@@ -217,12 +217,12 @@ class SpecialListGroupRights extends SpecialPage {
        /**
         * Create a user-readable list of permissions from the given array.
         *
-        * @param array $permissions of permission => bool (from $wgGroupPermissions items)
-        * @param array $revoke of permission => bool (from $wgRevokePermissions items)
-        * @param array $add of groups this group is allowed to add or true
-        * @param array $remove of groups this group is allowed to remove or true
-        * @param array $addSelf of groups this group is allowed to add to self or true
-        * @param array $removeSelf of group this group is allowed to remove from self or true
+        * @param array $permissions Array of permission => bool (from $wgGroupPermissions items)
+        * @param array $revoke Array of permission => bool (from $wgRevokePermissions items)
+        * @param array $add Array of groups this group is allowed to add or true
+        * @param array $remove Array of groups this group is allowed to remove or true
+        * @param array $addSelf Array of groups this group is allowed to add to self or true
+        * @param array $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 function formatPermissions( $permissions, $revoke, $add, $remove, $addSelf, $removeSelf ) {
index cf11881..feeafbc 100644 (file)
@@ -193,7 +193,7 @@ class UsersPager extends AlphabeticPager {
                $edits = '';
                global $wgEdititis;
                if ( !$this->including && $wgEdititis ) {
-                       // @fixme i18n issue: Hardcoded square brackets.
+                       // @todo fixme i18n issue: Hardcoded square brackets.
                        $edits = ' [' .
                                $this->msg( 'usereditcount' )->numParams( $row->edits )->escaped() .
                                ']';
@@ -403,7 +403,7 @@ class SpecialListUsers extends IncludableSpecialPage {
         * Return an array of subpages beginning with $search that this special page will accept.
         *
         * @param string $search Prefix to search for
-        * @param integer $limit Maximum number of results to return
+        * @param int $limit Maximum number of results to return
         * @return string[] Matching subpages
         */
        public function prefixSearchSubpages( $search, $limit = 10 ) {
index ced5d25..36abeb0 100644 (file)
@@ -119,7 +119,7 @@ class SpecialLog extends SpecialPage {
         * Return an array of subpages beginning with $search that this special page will accept.
         *
         * @param string $search Prefix to search for
-        * @param integer $limit Maximum number of results to return
+        * @param int $limit Maximum number of results to return
         * @return string[] Matching subpages
         */
        public function prefixSearchSubpages( $search, $limit = 10 ) {
index eea1336..e1700de 100644 (file)
@@ -328,14 +328,14 @@ class SpecialMergeHistory extends SpecialPage {
        /**
         * Actually attempt the history move
         *
-        * @todo: if all versions of page A are moved to B and then a user
+        * @todo if all versions of page A are moved to B and then a user
         * tries to do a reverse-merge via the "unmerge" log link, then page
         * A will still be a redirect (as it was after the original merge),
         * though it will have the old revisions back from before (as expected).
         * The user may have to "undo" the redirect manually to finish the "unmerge".
         * Maybe this should delete redirects at the target page of merges?
         *
-        * @return boolean Success
+        * @return bool Success
         */
        function merge() {
                # Get the titles directly from the IDs, in case the target page params
@@ -452,6 +452,7 @@ class SpecialMergeHistory extends SpecialPage {
                                $dbw->insert( 'pagelinks',
                                        array(
                                                'pl_from' => $this->mDestID,
+                                               'pl_from_namespace' => $destTitle->getNamespace(),
                                                'pl_namespace' => $destTitle->getNamespace(),
                                                'pl_title' => $destTitle->getDBkey() ),
                                        __METHOD__
@@ -476,7 +477,7 @@ class SpecialMergeHistory extends SpecialPage {
                        array( $destTitle->getPrefixedText(), $timestampLimit ), $this->getUser()
                );
 
-               # @TODO: message should use redirect=no
+               # @todo message should use redirect=no
                $this->getOutput()->addWikiMsg( 'mergehistory-success',
                        $targetTitle->getPrefixedText(), $destTitle->getPrefixedText(), $count );
 
index 7223efd..ee144d6 100644 (file)
@@ -126,7 +126,7 @@ class MovePageForm extends UnlistedSpecialPage {
        /**
         * Show the form
         *
-        * @param array $err error messages. Each item is an error message.
+        * @param array $err 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().
         */
diff --git a/includes/specials/SpecialMyLanguage.php b/includes/specials/SpecialMyLanguage.php
new file mode 100644 (file)
index 0000000..1f3c63f
--- /dev/null
@@ -0,0 +1,94 @@
+<?php
+/**
+ * Implements Special:MyLanguage
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Niklas Laxström
+ * @author Siebrand Mazeland
+ * @copyright Copyright © 2010-2013 Niklas Laxström, Siebrand Mazeland
+ */
+
+/**
+ * Unlisted special page just to redirect the user to the translated version of
+ * a page, if it exists.
+ *
+ * Usage: [[Special:MyLanguage/Page name|link text]]
+ *
+ * @since 1.24
+ * @ingroup SpecialPage
+ */
+class SpecialMyLanguage extends RedirectSpecialArticle {
+       public function __construct() {
+               parent::__construct( 'MyLanguage' );
+       }
+
+       /**
+        * If the special page is a redirect, then get the Title object it redirects to.
+        * False otherwise.
+        *
+        * @param string $par Subpage string
+        * @return Title|bool
+        */
+       public function getRedirect( $par ) {
+               $title = $this->findTitle( $par );
+               // Go to the main page if given invalid title.
+               if ( !$title ) {
+                       $title = Title::newMainPage();
+               }
+               return $title;
+       }
+
+       /**
+        * Assuming the user's interface language is fi. Given input Page, it
+        * returns Page/fi if it exists, otherwise Page. Given input Page/de,
+        * it returns Page/fi if it exists, otherwise Page/de if it exists,
+        * otherwise Page.
+        *
+        * @param string $par
+        * @return Title|null
+        */
+       public function findTitle( $par ) {
+               global $wgLanguageCode;
+               // base = title without language code suffix
+               // provided = the title as it was given
+               $base = $provided = Title::newFromText( $par );
+
+               if ( $base && strpos( $par, '/' ) !== false ) {
+                       $pos = strrpos( $par, '/' );
+                       $basepage = substr( $par, 0, $pos );
+                       $code = substr( $par, $pos + 1 );
+                       if ( strlen( $code ) && Language::isKnownLanguageTag( $code ) ) {
+                               $base = Title::newFromText( $basepage );
+                       }
+               }
+
+               if ( !$base ) {
+                       return null;
+               }
+
+               $uiCode = $this->getLanguage()->getCode();
+               $proposed = $base->getSubpage( $uiCode );
+               if ( $uiCode !== $wgLanguageCode && $proposed && $proposed->exists() ) {
+                       return $proposed;
+               } elseif ( $provided && $provided->exists() ) {
+                       return $provided;
+               } else {
+                       return $base;
+               }
+       }
+}
index a432f10..ba972ce 100644 (file)
@@ -30,7 +30,7 @@
  */
 class SpecialPageLanguage extends FormSpecialPage {
        /**
-        * @var $goToUrl URL to go to if language change successful
+        * @var string URL to go to if language change successful
         */
        private $goToUrl;
 
@@ -86,6 +86,10 @@ class SpecialPageLanguage extends FormSpecialPage {
                return $page;
        }
 
+       protected function postText() {
+               return $this->showLogFragment( $this->par );
+       }
+
        public function alterForm( HTMLForm $form ) {
                $form->setDisplayFormat( 'vform' );
                $form->setWrapperLegend( false );
@@ -107,7 +111,7 @@ class SpecialPageLanguage extends FormSpecialPage {
                // Returns the default since the page is not loaded from DB
                $defLang = $title->getPageLanguage()->getCode();
 
-               $pageId =  $title->getArticleID();
+               $pageId = $title->getArticleID();
 
                // Check if article exists
                if ( !$pageId ) {
@@ -178,4 +182,12 @@ class SpecialPageLanguage extends FormSpecialPage {
                // Success causes a redirect
                $this->getOutput()->redirect( $this->goToUrl );
        }
+
+       function showLogFragment( $title ) {
+               $moveLogPage = new LogPage( 'pagelang' );
+               $out1 = Xml::element( 'h2', null, $moveLogPage->getName()->text() );
+               $out2 = '';
+               LogEventsList::showLogExtract( $out2, 'pagelang', $title );
+               return $out1 . $out2;
+       }
 }
index 05f0b2b..f5b19cc 100644 (file)
@@ -82,7 +82,7 @@ class SpecialPagesWithProp extends QueryPage {
         * Return an array of subpages beginning with $search that this special page will accept.
         *
         * @param string $search Prefix to search for
-        * @param integer $limit Maximum number of results to return
+        * @param int $limit Maximum number of results to return
         * @return string[] Matching subpages
         */
        public function prefixSearchSubpages( $search, $limit = 10 ) {
index 2707916..8c01ef2 100644 (file)
@@ -239,7 +239,7 @@ class SpecialRandomInCategory extends SpecialPage {
         *
         * @param Title $category
         * @return array The lowest and highest timestamp
-        * @throws MWException if category has no entries.
+        * @throws MWException If category has no entries.
         */
        protected function getMinAndMaxForCat( Title $category ) {
                $dbr = wfGetDB( DB_SLAVE );
index 24b363d..6d8f59b 100644 (file)
@@ -56,7 +56,9 @@ class RandomPage extends SpecialPage {
        public function execute( $par ) {
                global $wgContLang;
 
-               if ( $par ) {
+               if ( is_string( $par ) ) {
+                       // Testing for stringiness since we want to catch
+                       // the empty string to mean main namespace only.
                        $this->setNamespace( $wgContLang->getNsIndex( $par ) );
                }
 
index aa8ed82..ea785fa 100644 (file)
@@ -229,9 +229,8 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        $opts['tagfilter']
                );
 
-               if ( !wfRunHooks( 'SpecialRecentChangesQuery',
-                       array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$fields ),
-                       '1.23' )
+               if ( !$this->runMainQueryHook( $tables, $fields, $conds, $query_options, $join_conds,
+                       $opts )
                ) {
                        return false;
                }
@@ -255,6 +254,15 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                return $rows;
        }
 
+       protected function runMainQueryHook( &$tables, &$fields, &$conds, &$query_options, &$join_conds, $opts ) {
+               return parent::runMainQueryHook( $tables, $fields, $conds, $query_options, $join_conds, $opts )
+                       && wfRunHooks(
+                               'SpecialRecentChangesQuery',
+                               array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$fields ),
+                               '1.23'
+                       );
+       }
+
        public function outputFeedLinks() {
                $this->addFeedLinks( $this->getFeedQuery() );
        }
@@ -344,6 +352,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                                $this->msg( 'recentchanges-noresult' )->parse() .
                                '</div>'
                        );
+                       if ( !$this->including() ) {
+                               $this->getOutput()->setStatusCode( 404 );
+                       }
                } else {
                        $this->getOutput()->addHTML( $rclistOutput );
                }
@@ -353,8 +364,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
         * Set the text to be displayed above the changes
         *
         * @param FormOptions $opts
+        * @param int $numRows Number of rows in the result to show after this header
         */
-       public function doHeader( $opts ) {
+       public function doHeader( $opts, $numRows ) {
                global $wgScript;
 
                $this->setTopText( $opts );
@@ -364,7 +376,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
 
                $panel = array();
                $panel[] = self::makeLegend( $this->getContext() );
-               $panel[] = $this->optionsPanel( $defaults, $nondefaults );
+               $panel[] = $this->optionsPanel( $defaults, $nondefaults, $numRows );
                $panel[] = '<hr />';
 
                $extraOpts = $this->getExtraOptions( $opts );
@@ -639,9 +651,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
         *
         * @param array $defaults
         * @param array $nondefaults
+        * @param int $numRows Number of rows in the result to show after this header
         * @return string
         */
-       function optionsPanel( $defaults, $nondefaults ) {
+       function optionsPanel( $defaults, $nondefaults, $numRows ) {
                global $wgRCLinkLimits, $wgRCLinkDays;
 
                $options = $nondefaults + $defaults;
@@ -655,10 +668,15 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $lang = $this->getLanguage();
                $user = $this->getUser();
                if ( $options['from'] ) {
-                       $note .= $this->msg( 'rcnotefrom' )->numParams( $options['limit'] )->params(
-                               $lang->userTimeAndDate( $options['from'], $user ),
-                               $lang->userDate( $options['from'], $user ),
-                               $lang->userTime( $options['from'], $user ) )->parse() . '<br />';
+                       $note .= $this->msg( 'rcnotefrom' )
+                               ->numParams( $options['limit'] )
+                               ->params(
+                                       $lang->userTimeAndDate( $options['from'], $user ),
+                                       $lang->userDate( $options['from'], $user ),
+                                       $lang->userTime( $options['from'], $user )
+                               )
+                               ->numParams( $numRows )
+                               ->parse() . '<br />';
                }
 
                # Sort data for display and make sure it's unique after we've added user data.
index e73cabc..9700638 100644 (file)
@@ -109,9 +109,8 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                        $opts['tagfilter']
                );
 
-               if ( !wfRunHooks( 'SpecialRecentChangesQuery',
-                       array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$select ),
-                       '1.23' )
+               if ( !$this->runMainQueryHook( $tables, $select, $conds, $query_options, $join_conds,
+                       $opts )
                ) {
                        return false;
                }
@@ -221,6 +220,15 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                return $res;
        }
 
+       protected function runMainQueryHook( &$tables, &$select, &$conds, &$query_options, &$join_conds, $opts ) {
+               return parent::runMainQueryHook( $tables, $select, $conds, $query_options, $join_conds, $opts )
+               && wfRunHooks(
+                       'SpecialRecentChangesQuery',
+                       array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$select ),
+                       '1.23'
+               );
+       }
+
        function setTopText( FormOptions $opts ) {
                $target = $this->getTargetTitle();
                if ( $target ) {
index 4926d6d..774fd80 100644 (file)
@@ -66,7 +66,7 @@ class SpecialRedirect extends FormSpecialPage {
        /**
         * Handle Special:Redirect/user/xxxx (by redirecting to User:YYYY)
         *
-        * @return string|null url to redirect to, or null if $mValue is invalid.
+        * @return string|null Url to redirect to, or null if $mValue is invalid.
         */
        function dispatchUser() {
                if ( !ctype_digit( $this->mValue ) ) {
@@ -85,7 +85,7 @@ class SpecialRedirect extends FormSpecialPage {
        /**
         * Handle Special:Redirect/file/xxxx
         *
-        * @return string|null url to redirect to, or null if $mValue is not found.
+        * @return string|null Url to redirect to, or null if $mValue is not found.
         */
        function dispatchFile() {
                $title = Title::makeTitleSafe( NS_FILE, $this->mValue );
@@ -121,7 +121,7 @@ class SpecialRedirect extends FormSpecialPage {
         * Handle Special:Redirect/revision/xxx
         * (by redirecting to index.php?oldid=xxx)
         *
-        * @return string|null url to redirect to, or null if $mValue is invalid.
+        * @return string|null Url to redirect to, or null if $mValue is invalid.
         */
        function dispatchRevision() {
                $oldid = $this->mValue;
@@ -141,7 +141,7 @@ class SpecialRedirect extends FormSpecialPage {
        /**
         * Handle Special:Redirect/page/xxx (by redirecting to index.php?curid=xxx)
         *
-        * @return string|null url to redirect to, or null if $mValue is invalid.
+        * @return string|null Url to redirect to, or null if $mValue is invalid.
         */
        function dispatchPage() {
                $curid = $this->mValue;
@@ -164,7 +164,7 @@ class SpecialRedirect extends FormSpecialPage {
         * or do nothing (if $mValue wasn't set) allowing the form to be
         * displayed.
         *
-        * @return bool true if a redirect was successfully handled.
+        * @return bool True if a redirect was successfully handled.
         */
        function dispatch() {
                // the various namespaces supported by Special:Redirect
index b90026a..93df289 100644 (file)
@@ -160,8 +160,6 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                if ( !$this->typeName || count( $this->ids ) == 0 ) {
                        throw new ErrorPageError( 'revdelete-nooldid-title', 'revdelete-nooldid-text' );
                }
-               $this->typeLabels = self::$UILabels[$this->typeName];
-               $this->mIsAllowed = $user->isAllowed( RevisionDeleter::getRestriction( $this->typeName ) );
 
                # Allow the list type to adjust the passed target
                $this->targetObj = RevisionDeleter::suggestTarget(
@@ -170,6 +168,16 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        $this->ids
                );
 
+               $this->typeLabels = self::$UILabels[$this->typeName];
+               $list = $this->getList();
+               $list->reset();
+               $bitfield = $list->current()->getBits();
+               $this->mIsAllowed = $user->isAllowed( RevisionDeleter::getRestriction( $this->typeName ) );
+               $canViewSuppressedOnly = $this->getUser()->isAllowed( 'viewsuppressed' ) &&
+                       !$this->getUser()->isAllowed( 'suppressrevision' );
+               $pageIsSuppressed = $bitfield & Revision::DELETED_RESTRICTED;
+               $this->mIsAllowed = $this->mIsAllowed && !( $canViewSuppressedOnly && $pageIsSuppressed );
+
                $this->otherReason = $request->getVal( 'wpReason' );
                # We need a target page!
                if ( is_null( $this->targetObj ) ) {
@@ -444,12 +452,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                Html::hidden( 'target', $this->targetObj->getPrefixedText() ) .
                                Html::hidden( 'type', $this->typeName ) .
                                Html::hidden( 'ids', implode( ',', $this->ids ) ) .
-                               Xml::closeElement( 'fieldset' ) . "\n";
-               } else {
-                       $out = '';
-               }
-               if ( $this->mIsAllowed ) {
-                       $out .= Xml::closeElement( 'form' ) . "\n";
+                               Xml::closeElement( 'fieldset' ) . "\n" .
+                               Xml::closeElement( 'form' ) . "\n";
                        // Show link to edit the dropdown reasons
                        if ( $this->getUser()->isAllowed( 'editinterface' ) ) {
                                $title = Title::makeTitle( NS_MEDIAWIKI, 'Revdelete-reason-dropdown' );
@@ -461,6 +465,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                );
                                $out .= Xml::tags( 'p', array( 'class' => 'mw-revdel-editreasons' ), $link ) . "\n";
                        }
+               } else {
+                       $out = '';
                }
                $this->getOutput()->addHTML( $out );
        }
index 4c8c8f3..54f224a 100644 (file)
@@ -47,7 +47,7 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                        return;
                }
 
-               $optional = array( 'maxjobs' => 0 );
+               $optional = array( 'maxjobs' => 0, 'maxtime' => 30, 'type' => false, 'async' => true );
                $required = array_flip( array( 'title', 'tasks', 'signature', 'sigexpiry' ) );
 
                $params = array_intersect_key( $this->getRequest()->getValues(), $required + $optional );
@@ -75,18 +75,28 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                // Apply any default parameter values
                $params += $optional;
 
-               // Client will usually disconnect before checking the response,
-               // but it needs to know when it is safe to disconnect. Until this
-               // reaches ignore_user_abort(), it is not safe as the jobs won't run.
-               ignore_user_abort( true ); // jobs may take a bit of time
-               header( "HTTP/1.0 202 Accepted" );
-               ob_flush();
-               flush();
-               // Once the client receives this response, it can disconnect
+               if ( $params['async'] ) {
+                       // Client will usually disconnect before checking the response,
+                       // but it needs to know when it is safe to disconnect. Until this
+                       // reaches ignore_user_abort(), it is not safe as the jobs won't run.
+                       ignore_user_abort( true ); // jobs may take a bit of time
+                       header( "HTTP/1.0 202 Accepted" );
+                       ob_flush();
+                       flush();
+                       // Once the client receives this response, it can disconnect
+               }
 
                // Do all of the specified tasks...
                if ( in_array( 'jobs', explode( '|', $params['tasks'] ) ) ) {
-                       self::executeJobs( (int)$params['maxjobs'] );
+                       $runner = new JobRunner();
+                       $response = $runner->run( array(
+                               'type'     => $params['type'],
+                               'maxJobs'  => $params['maxjobs'] ? $params['maxjobs'] : 1,
+                               'maxTime'  => $params['maxtime'] ? $params['maxjobs'] : 30
+                       ) );
+                       if ( !$params['async'] ) {
+                               print FormatJson::encode( $response, true );
+                       }
                }
        }
 
@@ -100,52 +110,4 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                ksort( $query ); // stable order
                return hash_hmac( 'sha1', wfArrayToCgi( $query ), $wgSecretKey );
        }
-
-       /**
-        * Run jobs from the job queue
-        *
-        * @note: also called from Wiki.php
-        *
-        * @param int $maxJobs Maximum number of jobs to run
-        * @return void
-        */
-       public static function executeJobs( $maxJobs ) {
-               $n = $maxJobs; // number of jobs to run
-               if ( $n < 1 ) {
-                       return;
-               }
-               try {
-                       $group = JobQueueGroup::singleton();
-                       $count = $group->executeReadyPeriodicTasks();
-                       if ( $count > 0 ) {
-                               wfDebugLog( 'jobqueue', "Executed $count periodic queue task(s)." );
-                       }
-
-                       do {
-                               $job = $group->pop( JobQueueGroup::TYPE_DEFAULT, JobQueueGroup::USE_CACHE );
-                               if ( $job ) {
-                                       $output = $job->toString() . "\n";
-                                       $t = -microtime( true );
-                                       wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
-                                       $success = $job->run();
-                                       wfProfileOut( __METHOD__ . '-' . get_class( $job ) );
-                                       $group->ack( $job ); // done
-                                       $t += microtime( true );
-                                       $t = round( $t * 1000 );
-                                       if ( $success === false ) {
-                                               $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
-                                       } else {
-                                               $output .= "Success, Time: $t ms\n";
-                                       }
-                                       wfDebugLog( 'jobqueue', $output );
-                               }
-                       } while ( --$n && $job );
-               } catch ( MWException $e ) {
-                       MWExceptionHandler::rollbackMasterChangesAndLog( $e );
-                       // We don't want exceptions thrown during job execution to
-                       // be reported to the user since the output is already sent.
-                       // Instead we just log them.
-                       MWExceptionHandler::logException( $e );
-               }
-       }
 }
index 15a7b59..1caed0b 100644 (file)
@@ -82,7 +82,8 @@ class SpecialSearch extends SpecialPage {
                $out = $this->getOutput();
                $out->allowClickjacking();
                $out->addModuleStyles( array(
-                       'mediawiki.special', 'mediawiki.special.search', 'mediawiki.ui', 'mediawiki.ui.button'
+                       'mediawiki.special', 'mediawiki.special.search', 'mediawiki.ui', 'mediawiki.ui.button',
+                       'mediawiki.ui.input',
                ) );
 
                // Strip underscores from title parameter; most of the time we'll want
@@ -346,6 +347,9 @@ class SpecialSearch extends SpecialPage {
                        // Show the create link ahead
                        $this->showCreateLink( $title, $num, $titleMatches, $textMatches );
                        if ( $totalRes > $this->limit || $this->offset ) {
+                               if ( $this->searchEngineType !== null ) {
+                                       $this->setExtraParam( 'srbackend', $this->searchEngineType );
+                               }
                                $prevnext = $this->getLanguage()->viewPrevNext(
                                        $this->getPageTitle(),
                                        $this->offset,
@@ -406,7 +410,7 @@ class SpecialSearch extends SpecialPage {
         * @param Title $title
         * @param int $num The number of search results found
         * @param null|SearchResultSet $titleMatches Results from title search
-        * @param null|SearchResultSet $textMatches  Results from text search
+        * @param null|SearchResultSet $textMatches Results from text search
         */
        protected function showCreateLink( $title, $num, $titleMatches, $textMatches ) {
                // show direct page/create link if applicable
@@ -423,8 +427,10 @@ class SpecialSearch extends SpecialPage {
                        return;
                }
 
+               $linkClass = 'mw-search-createlink';
                if ( $title->isKnown() ) {
                        $messageName = 'searchmenu-exists';
+                       $linkClass = 'mw-search-exists';
                } elseif ( $title->quickUserCan( 'create', $this->getUser() ) ) {
                        $messageName = 'searchmenu-new';
                } else {
@@ -439,7 +445,7 @@ class SpecialSearch extends SpecialPage {
 
                // Extensions using the hook might still return an empty $messageName
                if ( $messageName ) {
-                       $this->getOutput()->wrapWikiMsg( "<p class=\"mw-search-createlink\">\n$1</p>", $params );
+                       $this->getOutput()->wrapWikiMsg( "<p class=\"$linkClass\">\n$1</p>", $params );
                } else {
                        // preserve the paragraph for margins etc...
                        $this->getOutput()->addHtml( '<p></p>' );
@@ -798,7 +804,7 @@ class SpecialSearch extends SpecialPage {
         * @param SearchResult $result
         * @param string $lastInterwiki
         * @param string $query
-        * @param array $customCaptions iw prefix -> caption
+        * @param array $customCaptions Interwiki prefix -> caption
         *
         * @return string
         */
@@ -1081,7 +1087,7 @@ class SpecialSearch extends SpecialPage {
                        'id' => $this->profile === 'advanced' ? 'powerSearchText' : 'searchText',
                        'size' => '50',
                        'autofocus',
-                       'class' => 'mw-ui-input',
+                       'class' => 'mw-ui-input mw-ui-input-inline',
                ) ) . "\n";
                $out .= Html::hidden( 'fulltext', 'Search' ) . "\n";
                $out .= Xml::submitButton(
@@ -1090,7 +1096,7 @@ class SpecialSearch extends SpecialPage {
                ) . "\n";
 
                // Results-info
-               if ( $totalNum > 0 ) {
+               if ( $totalNum > 0 && $this->offset < $totalNum ) {
                        $top = $this->msg( 'showingresultsheader' )
                                ->numParams( $this->offset + 1, $this->offset + $resultsShown, $totalNum )
                                ->params( wfEscapeWikiText( $term ) )
index bea65ba..73bdbd6 100644 (file)
@@ -59,7 +59,7 @@ class SpecialTrackingCategories extends SpecialPage {
                        </tr></thead>"
                );
 
-               foreach( $wgTrackingCategories as $catMsg ) {
+               foreach ( $wgTrackingCategories as $catMsg ) {
                        /*
                         * Check if the tracking category varies by namespace
                         * Otherwise only pages in the current namespace will be displayed
index 04b36c7..25f520e 100644 (file)
@@ -910,7 +910,8 @@ class SpecialUndelete extends SpecialPage {
                        if ( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
                                $out->wrapWikiMsg(
                                        "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
-                                       'rev-deleted-text-permission'
+                               $rev->isDeleted( Revision::DELETED_RESTRICTED ) ?
+                                       'rev-suppressed-text-permission' : 'rev-deleted-text-permission'
                                );
 
                                return;
@@ -918,7 +919,8 @@ class SpecialUndelete extends SpecialPage {
 
                        $out->wrapWikiMsg(
                                "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
-                               'rev-deleted-text-view'
+                               $rev->isDeleted( Revision::DELETED_RESTRICTED ) ?
+                                       'rev-suppressed-text-view' : 'rev-deleted-text-view'
                        );
                        $out->addHTML( '<br />' );
                        // and we are allowed to see...
index fc18706..4fd7cd4 100644 (file)
@@ -1144,7 +1144,7 @@ class UploadForm extends HTMLForm {
        /**
         * Empty function; submission is handled elsewhere.
         *
-        * @return bool false
+        * @return bool False
         */
        function trySubmit() {
                return false;
index 75ab19f..cb821cb 100644 (file)
@@ -57,7 +57,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
        /**
         * Execute page -- can output a file directly or show a listing of them.
         *
-        * @param string $subPage subpage, e.g. in
+        * @param string $subPage Subpage, e.g. in
         *   http://example.com/wiki/Special:UploadStash/foo.jpg, the "foo.jpg" part
         * @return bool Success
         */
@@ -75,7 +75,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
         * If file available in stash, cats it out to the client as a simple HTTP response.
         * n.b. Most sanity checking done in UploadStashLocalFile, so this is straightforward.
         *
-        * @param string $key the key of a particular requested file
+        * @param string $key The key of a particular requested file
         * @throws HttpError
         * @return bool
         */
@@ -227,7 +227,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
         * @param array $params Scaling parameters ( e.g. array( width => '50' ) );
         * @param int $flags Scaling flags ( see File:: constants )
         * @throws MWException
-        * @return bool success
+        * @return bool Success
         */
        private function outputRemoteScaledThumb( $file, $params, $flags ) {
                // This global probably looks something like
index 1ef96c3..46b4999 100644 (file)
@@ -1048,7 +1048,7 @@ class LoginForm extends SpecialPage {
        /**
         * Display a "successful action" page.
         *
-        * @param string $type condition of return to; see `executeReturnTo`
+        * @param string $type Condition of return to; see `executeReturnTo`
         * @param string|Message $title Page's title
         * @param string $msgname
         * @param string $injected_html
@@ -1214,6 +1214,7 @@ class LoginForm extends SpecialPage {
                $out->addModuleStyles( array(
                        'mediawiki.ui',
                        'mediawiki.ui.button',
+                       'mediawiki.ui.input',
                        'mediawiki.special.userlogin.common.styles'
                ) );
                $out->addModules( array(
index 411970e..0ec85ba 100644 (file)
@@ -715,7 +715,7 @@ class UserrightsPage extends SpecialPage {
        /**
         * Returns $this->getUser()->changeableGroups()
         *
-        * @return array array(
+        * @return array Array(
         *   'add' => array( addablegroups ),
         *   'remove' => array( removablegroups ),
         *   'add-self' => array( addablegroups to self ),
index 28ad0f4..8ca9e23 100644 (file)
@@ -307,7 +307,7 @@ class SpecialVersion extends SpecialPage {
        }
 
        /**
-        * @return string wgVersion + a link to subversion revision of svn BASE
+        * @return string Global wgVersion + a link to subversion revision of svn BASE
         */
        private static function getVersionLinkedSvn() {
                global $IP;
@@ -349,7 +349,7 @@ class SpecialVersion extends SpecialPage {
 
        /**
         * @since 1.22 Returns the HEAD date in addition to the sha1 and link
-        * @return bool|string wgVersion + HEAD sha1 stripped to the first 7 chars
+        * @return bool|string Global wgVersion + HEAD sha1 stripped to the first 7 chars
         *   with link and date, or false on failure
         */
        private static function getVersionLinkedGit() {
index ea526de..8269b01 100644 (file)
@@ -111,7 +111,7 @@ class WantedFilesPage extends WantedQueryPage {
                                'img1.img_name' => null,
                                // We also need to exclude file redirects
                                'img2.img_name' => null,
-                        ),
+                       ),
                        'options' => array( 'GROUP BY' => 'il_to' ),
                        'join_conds' => array(
                                'img1' => array( 'LEFT JOIN',
index 57659e7..5691e50 100644 (file)
@@ -83,7 +83,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
         * Return an array of subpages beginning with $search that this special page will accept.
         *
         * @param string $search Prefix to search for
-        * @param integer $limit Maximum number of results to return
+        * @param int $limit Maximum number of results to return
         * @return string[] Matching subpages
         */
        public function prefixSearchSubpages( $search, $limit = 10 ) {
@@ -258,7 +258,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                // the necessary rights.
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $bitmask = LogPage::DELETED_ACTION;
-               } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+               } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
                        $bitmask = LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED;
                } else {
                        $bitmask = 0;
@@ -279,9 +279,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        ''
                );
 
-               wfRunHooks( 'SpecialWatchlistQuery',
-                       array( &$conds, &$tables, &$join_conds, &$fields, $opts ),
-                       '1.23' );
+               $this->runMainQueryHook( $tables, $fields, $conds, $query_options, $join_conds, $opts );
 
                return $dbr->select(
                        $tables,
@@ -293,6 +291,15 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                );
        }
 
+       protected function runMainQueryHook( &$tables, &$fields, &$conds, &$query_options, &$join_conds, $opts ) {
+               return parent::runMainQueryHook( $tables, $fields, $conds, $query_options, $join_conds, $opts )
+                       && wfRunHooks(
+                               'SpecialWatchlistQuery',
+                               array( &$conds, &$tables, &$join_conds, &$fields, $opts ),
+                               '1.23'
+                       );
+       }
+
        /**
         * Return a DatabaseBase object for reading
         *
@@ -391,8 +398,9 @@ class SpecialWatchlist extends ChangesListSpecialPage {
         * Set the text to be displayed above the changes
         *
         * @param FormOptions $opts
+        * @param int $numRows Number of rows in the result to show after this header
         */
-       public function doHeader( $opts ) {
+       public function doHeader( $opts, $numRows ) {
                $user = $this->getUser();
 
                $this->getOutput()->addSubtitle(
@@ -406,7 +414,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $wlInfo = '';
                if ( $opts['days'] > 0 ) {
                        $timestamp = wfTimestampNow();
-                       $wlInfo = $this->msg( 'wlnote2' )->numParams( round( $opts['days'] * 24 ) )->params(
+                       $wlInfo = $this->msg( 'wlnote' )->numParams( $numRows, round( $opts['days'] * 24 ) )->params(
                                $lang->userDate( $timestamp, $user ), $lang->userTime( $timestamp, $user )
                        )->parse() . "<br />\n";
                }
index d980f79..60ac02f 100644 (file)
@@ -101,10 +101,10 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
         * @param int $back Display from this article ID at backwards scrolling (default: 0)
         */
        function showIndirectLinks( $level, $target, $limit, $from = 0, $back = 0 ) {
-               global $wgMaxRedirectLinksRetrieved;
+               global $wgMaxRedirectLinksRetrieved, $wgUseLinkNamespaceDBFields;
+
                $out = $this->getOutput();
                $dbr = wfGetDB( DB_SLAVE );
-               $options = array();
 
                $hidelinks = $this->opts->getValue( 'hidelinks' );
                $hideredirs = $this->opts->getValue( 'hideredirs' );
@@ -113,77 +113,88 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
 
                $fetchlinks = ( !$hidelinks || !$hideredirs );
 
-               // Make the query
-               $plConds = array(
-                       'page_id=pl_from',
+               // Build query conds in concert for all three tables...
+               $conds['pagelinks'] = array(
                        'pl_namespace' => $target->getNamespace(),
                        'pl_title' => $target->getDBkey(),
                );
-               if ( $hideredirs ) {
-                       $plConds['rd_from'] = null;
-               } elseif ( $hidelinks ) {
-                       $plConds[] = 'rd_from is NOT NULL';
-               }
-
-               $tlConds = array(
-                       'page_id=tl_from',
+               $conds['templatelinks'] = array(
                        'tl_namespace' => $target->getNamespace(),
                        'tl_title' => $target->getDBkey(),
                );
-
-               $ilConds = array(
-                       'page_id=il_from',
+               $conds['imagelinks'] = array(
                        'il_to' => $target->getDBkey(),
                );
 
                $namespace = $this->opts->getValue( 'namespace' );
                if ( is_int( $namespace ) ) {
-                       $plConds['page_namespace'] = $namespace;
-                       $tlConds['page_namespace'] = $namespace;
-                       $ilConds['page_namespace'] = $namespace;
+                       if ( $wgUseLinkNamespaceDBFields ) {
+                               $conds['pagelinks']['pl_from_namespace'] = $namespace;
+                               $conds['templatelinks']['tl_from_namespace'] = $namespace;
+                               $conds['imagelinks']['il_from_namespace'] = $namespace;
+                       } else {
+                               $conds['pagelinks']['page_namespace'] = $namespace;
+                               $conds['templatelinks']['page_namespace'] = $namespace;
+                               $conds['imagelinks']['page_namespace'] = $namespace;
+                       }
                }
 
                if ( $from ) {
-                       $tlConds[] = "tl_from >= $from";
-                       $plConds[] = "pl_from >= $from";
-                       $ilConds[] = "il_from >= $from";
+                       $conds['templatelinks'][] = "tl_from >= $from";
+                       $conds['pagelinks'][] = "pl_from >= $from";
+                       $conds['imagelinks'][] = "il_from >= $from";
                }
 
-               // Read an extra row as an at-end check
-               $queryLimit = $limit + 1;
-
-               $options['LIMIT'] = $queryLimit;
-               $fields = array( 'page_id', 'page_namespace', 'page_title', 'rd_from' );
+               if ( $hideredirs ) {
+                       $conds['pagelinks']['rd_from'] = null;
+               } elseif ( $hidelinks ) {
+                       $conds['pagelinks'][] = 'rd_from is NOT NULL';
+               }
 
-               $joinConds = array( 'redirect' => array( 'LEFT JOIN', array(
-                       'rd_from = page_id',
-                       'rd_namespace' => $target->getNamespace(),
-                       'rd_title' => $target->getDBkey(),
-                       'rd_interwiki = ' . $dbr->addQuotes( '' ) . ' OR rd_interwiki IS NULL'
-               ) ) );
+               $queryFunc = function ( $dbr, $table, $fromCol ) use ( $conds, $target, $limit ) {
+                       global $wgUseLinkNamespaceDBFields;
+                       // Read an extra row as an at-end check
+                       $queryLimit = $limit + 1;
+                       $on = array(
+                               "rd_from = $fromCol",
+                               'rd_title' => $target->getDBkey(),
+                               'rd_interwiki = ' . $dbr->addQuotes( '' ) . ' OR rd_interwiki IS NULL'
+                       );
+                       if ( $wgUseLinkNamespaceDBFields ) { // migration check
+                               $on['rd_namespace'] = $target->getNamespace();
+                       }
+                       // Inner LIMIT is 2X in case of stale backlinks with wrong namespaces
+                       $subQuery = $dbr->selectSqlText(
+                               array( $table, 'page', 'redirect' ),
+                               array( $fromCol, 'rd_from' ),
+                               $conds[$table],
+                               __CLASS__ . '::showIndirectLinks',
+                               array( 'ORDER BY' => $fromCol, 'LIMIT' => 2 * $queryLimit ),
+                               array(
+                                       'page' => array( 'INNER JOIN', "$fromCol = page_id" ),
+                                       'redirect' => array( 'LEFT JOIN', $on )
+                               )
+                       );
+                       return $dbr->select(
+                               array( 'page', 'temp_backlink_range' => "($subQuery)" ),
+                               array( 'page_id', 'page_namespace', 'page_title', 'rd_from' ),
+                               array(),
+                               __CLASS__ . '::showIndirectLinks',
+                               array( 'ORDER BY' => 'page_id', 'LIMIT' => $queryLimit ),
+                               array( 'page' => array( 'INNER JOIN', "$fromCol = page_id" ) )
+                       );
+               };
 
                if ( $fetchlinks ) {
-                       $options['ORDER BY'] = 'pl_from';
-                       $plRes = $dbr->select( array( 'pagelinks', 'page', 'redirect' ), $fields,
-                               $plConds, __METHOD__, $options,
-                               $joinConds
-                       );
+                       $plRes = $queryFunc( $dbr, 'pagelinks', 'pl_from' );
                }
 
                if ( !$hidetrans ) {
-                       $options['ORDER BY'] = 'tl_from';
-                       $tlRes = $dbr->select( array( 'templatelinks', 'page', 'redirect' ), $fields,
-                               $tlConds, __METHOD__, $options,
-                               $joinConds
-                       );
+                       $tlRes = $queryFunc( $dbr, 'templatelinks', 'tl_from' );
                }
 
                if ( !$hideimages ) {
-                       $options['ORDER BY'] = 'il_from';
-                       $ilRes = $dbr->select( array( 'imagelinks', 'page', 'redirect' ), $fields,
-                               $ilConds, __METHOD__, $options,
-                               $joinConds
-                       );
+                       $ilRes = $queryFunc( $dbr, 'imagelinks', 'il_from' );
                }
 
                if ( ( !$fetchlinks || !$plRes->numRows() )
@@ -200,6 +211,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                                        }
                                        $errMsg = is_int( $namespace ) ? 'nolinkshere-ns' : 'nolinkshere';
                                        $out->addWikiMsg( $errMsg, $this->target->getPrefixedText() );
+                                       $out->setStatusCode( 404 );
                                }
                        }
 
index a4240e2..f1e7065 100644 (file)
@@ -81,7 +81,7 @@ class UsercreateTemplate extends BaseTemplate {
                                </label>
                                <?php
                                echo Html::input( 'wpName', $this->data['name'], 'text', array(
-                                       'class' => 'mw-input loginText',
+                                       'class' => 'mw-ui-input loginText',
                                        'id' => 'wpName2',
                                        'tabindex' => '1',
                                        'size' => '20',
@@ -109,7 +109,7 @@ class UsercreateTemplate extends BaseTemplate {
                                <label for='wpPassword2'><?php $this->msg( 'userlogin-yourpassword' ); ?></label>
                                <?php
                                echo Html::input( 'wpPassword', null, 'password', array(
-                                       'class' => 'mw-input loginPassword',
+                                       'class' => 'mw-ui-input loginPassword',
                                        'id' => 'wpPassword2',
                                        'tabindex' => '3',
                                        'size' => '20',
@@ -129,7 +129,7 @@ class UsercreateTemplate extends BaseTemplate {
                        ?>
                                <div class="mw-ui-vform-field" id="mw-user-domain-section">
                                        <label for="wpDomain"><?php $this->msg( 'yourdomainname' ); ?></label>
-                                       <div class="mw-input">
+                                       <div>
                                                <?php echo $select->getHTML(); ?>
                                        </div>
                                </div>
@@ -139,7 +139,7 @@ class UsercreateTemplate extends BaseTemplate {
                                <label for='wpRetype'><?php $this->msg( 'createacct-yourpasswordagain' ); ?></label>
                                <?php
                                echo Html::input( 'wpRetype', null, 'password', array(
-                                       'class' => 'mw-input loginPassword',
+                                       'class' => 'mw-ui-input loginPassword',
                                        'id' => 'wpRetype',
                                        'tabindex' => '5',
                                        'size' => '20',
@@ -161,7 +161,7 @@ class UsercreateTemplate extends BaseTemplate {
                                        </label>
                                        <?php
                                                echo Html::input( 'wpEmail', $this->data['email'], 'email', array(
-                                                       'class' => 'mw-input loginText',
+                                                       'class' => 'mw-ui-input loginText',
                                                        'id' => 'wpEmail',
                                                        'tabindex' => '6',
                                                        'size' => '20',
@@ -176,7 +176,7 @@ class UsercreateTemplate extends BaseTemplate {
                        <?php if ( $this->data['userealname'] ) { ?>
                                <div class="mw-ui-vform-field">
                                        <label for='wpRealName'><?php $this->msg( 'createacct-realname' ); ?></label>
-                                       <input type='text' class='mw-input loginText' name="wpRealName" id="wpRealName"
+                                       <input type='text' class='mw-ui-input loginText' name="wpRealName" id="wpRealName"
                                                tabindex="7"
                                                value="<?php $this->text( 'realname' ); ?>" size='20' />
                                        <div class="prefsectiontip">
@@ -189,7 +189,7 @@ class UsercreateTemplate extends BaseTemplate {
                                <div class="mw-ui-vform-field">
                                        <label for='wpReason'><?php $this->msg( 'createacct-reason' ); ?></label>
                                        <?php echo Html::input( 'wpReason', $this->data['reason'], 'text', array(
-                                               'class' => 'mw-input loginText',
+                                               'class' => 'mw-ui-input loginText',
                                                'id' => 'wpReason',
                                                'tabindex' => '8',
                                                'size' => '20',
@@ -231,7 +231,7 @@ class UsercreateTemplate extends BaseTemplate {
                                                        <?php } ?>
                                                        <input
                                                                type="<?php echo htmlspecialchars( $inputItem['type'] ); ?>"
-                                                               class="mw-input"
+                                                               class="mw-ui-input"
                                                                name="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
                                                                tabindex="<?php echo $tabIndex++; ?>"
                                                                value="<?php echo htmlspecialchars( $inputItem['value'] ); ?>"
index bab544b..7187e8c 100644 (file)
@@ -72,7 +72,7 @@ class UserloginTemplate extends BaseTemplate {
                                <?php
                                $extraAttrs = array();
                                echo Html::input( 'wpName', $this->data['name'], 'text', array(
-                                       'class' => 'loginText',
+                                       'class' => 'loginText mw-ui-input',
                                        'id' => 'wpName1',
                                        'tabindex' => '1',
                                        'size' => '20',
@@ -102,7 +102,7 @@ class UserloginTemplate extends BaseTemplate {
                                </label>
                                <?php
                                echo Html::input( 'wpPassword', null, 'password', array(
-                                       'class' => 'loginPassword',
+                                       'class' => 'loginPassword mw-ui-input',
                                        'id' => 'wpPassword1',
                                        'tabindex' => '2',
                                        'size' => '20',
index c593dca..f46cb5e 100644 (file)
@@ -45,7 +45,7 @@ class MediaWikiPageLinkRenderer implements PageLinkRenderer {
         * HtmlPageLinkRenderer, we will be using them, so it seems prudent to
         * already declare the dependency and inject them.
         *
-        * @param TitleFormatter $formatter formatter for generating the target title string
+        * @param TitleFormatter $formatter Formatter for generating the target title string
         * @param string $baseUrl (currently unused, pending refactoring of Linker).
         *        Defaults to $wgArticlePath.
         */
@@ -62,7 +62,7 @@ class MediaWikiPageLinkRenderer implements PageLinkRenderer {
         * Returns the (partial) URL for the given page (including any section identifier).
         *
         * @param TitleValue $page The link's target
-        * @param array $params any additional URL parameters.
+        * @param array $params Any additional URL parameters.
         *
         * @return string
         */
index 8798de5..12b7143 100644 (file)
@@ -25,7 +25,7 @@
 /**
  * A codec for %MediaWiki page titles.
  *
- * @note: Normalization and validation is applied while parsing, not when formatting.
+ * @note Normalization and validation is applied while parsing, not when formatting.
  * It's possible to construct a TitleValue with an invalid title, and use MediaWikiTitleCodec
  * to generate an (invalid) title string from it. TitleValues should be constructed only
  * via parseTitle() or from a (semi)trusted source, such as the database.
@@ -49,8 +49,8 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
        protected $localInterwikis;
 
        /**
-        * @param Language $language the language object to use for localizing namespace names.
-        * @param GenderCache $genderCache the gender cache for generating gendered namespace names
+        * @param Language $language The language object to use for localizing namespace names.
+        * @param GenderCache $genderCache The gender cache for generating gendered namespace names
         * @param string[]|string $localInterwikis
         */
        public function __construct( Language $language, GenderCache $genderCache,
@@ -67,7 +67,7 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
         * @param int $namespace
         * @param string $text
         *
-        * @throws InvalidArgumentException if the namespace is invalid
+        * @throws InvalidArgumentException If the namespace is invalid
         * @return string
         */
        public function getNamespaceName( $namespace, $text ) {
@@ -97,7 +97,7 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
         *        Underscores will be replaced.
         * @param string $fragment The fragment name (may be empty).
         *
-        * @throws InvalidArgumentException if the namespace is invalid
+        * @throws InvalidArgumentException If the namespace is invalid
         * @return string
         */
        public function formatTitle( $namespace, $text, $fragment = '' ) {
@@ -187,10 +187,10 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
         * namespace prefixes, sets the other forms, and canonicalizes
         * everything.
         *
-        * @todo: this method is only exposed as a temporary measure to ease refactoring.
+        * @todo this method is only exposed as a temporary measure to ease refactoring.
         * It was copied with minimal changes from Title::secureAndSplit().
         *
-        * @todo: This method should be split up and an appropriate interface
+        * @todo This method should be split up and an appropriate interface
         * defined for use by the Title class.
         *
         * @param string $text
index a277594..fb1096e 100644 (file)
@@ -37,7 +37,7 @@ interface PageLinkRenderer {
         * @todo expand this to cover the functionality of Linker::linkUrl
         *
         * @param TitleValue $page The link's target
-        * @param array $params any additional URL parameters.
+        * @param array $params Any additional URL parameters.
         *
         * @return string
         */
index ea58b1e..7c71ef5 100644 (file)
@@ -48,9 +48,9 @@ interface TitleFormatter {
        /**
         * Returns the title text formatted for display, without namespace of fragment.
         *
-        * @note: Only minimal normalization is applied. Consider using TitleValue::getText() directly.
+        * @note Only minimal normalization is applied. Consider using TitleValue::getText() directly.
         *
-        * @param TitleValue $title the title to format
+        * @param TitleValue $title The title to format
         *
         * @return string
         */
@@ -59,7 +59,7 @@ interface TitleFormatter {
        /**
         * Returns the title formatted for display, including the namespace name.
         *
-        * @param TitleValue $title the title to format
+        * @param TitleValue $title The title to format
         *
         * @return string
         */
@@ -68,7 +68,7 @@ interface TitleFormatter {
        /**
         * Returns the title formatted for display, with namespace and fragment.
         *
-        * @param TitleValue $title the title to format
+        * @param TitleValue $title The title to format
         *
         * @return string
         */
index d548663..0635ee8 100644 (file)
@@ -37,8 +37,8 @@ interface TitleParser {
         *
         * @note this only parses local page links, interwiki-prefixes etc. are not considered!
         *
-        * @param string $text the text to parse
-        * @param int $defaultNamespace namespace to assume per default (usually NS_MAIN)
+        * @param string $text The text to parse
+        * @param int $defaultNamespace Namespace to assume per default (usually NS_MAIN)
         *
         * @throws MalformedTitleException If the text is not a valid representation of a page title.
         * @return TitleValue
index 73e1dc2..402247c 100644 (file)
@@ -52,7 +52,7 @@ class TitleValue {
        /**
         * Constructs a TitleValue.
         *
-        * @note: TitleValue expects a valid DB key; typically, a TitleValue is constructed either
+        * @note TitleValue expects a valid DB key; typically, a TitleValue is constructed either
         * from a database entry, or by a TitleParser. We could apply "some" normalization here,
         * such as substituting spaces by underscores, but that would encourage the use of
         * un-normalized text when constructing TitleValues. For constructing a TitleValue from
@@ -122,8 +122,8 @@ class TitleValue {
         *
         * This is computed from the DB key by replacing any underscores with spaces.
         *
-        * @note: To get a title string that includes the namespace and/or fragment,
-        *        use a TitleFormatter.
+        * @note To get a title string that includes the namespace and/or fragment,
+        *       use a TitleFormatter.
         *
         * @return string
         */
index 5defd45..6a6b358 100644 (file)
@@ -283,7 +283,7 @@ abstract class UploadBase {
 
        /**
         * Verify whether the upload is sane.
-        * @return mixed self::OK or else an array with error information
+        * @return mixed Const self::OK or else an array with error information
         */
        public function verifyUpload() {
                wfProfileIn( __METHOD__ );
@@ -379,8 +379,8 @@ abstract class UploadBase {
        /**
         * Verify the mime type.
         *
-        * @note Only checks that it is not an evil mime. The does it have
-        *  correct extension given its mime type check is in verifyFile.
+        * @note Only checks that it is not an evil mime. The "does it have
+        *  correct extension given its mime type?" check is in verifyFile.
         * @param string $mime Representing the mime
         * @return mixed True if the file is verified, an array otherwise
         */
@@ -388,7 +388,7 @@ abstract class UploadBase {
                global $wgVerifyMimeType;
                wfProfileIn( __METHOD__ );
                if ( $wgVerifyMimeType ) {
-                       wfDebug( "\n\nmime: <$mime> extension: <{$this->mFinalExtension}>\n\n" );
+                       wfDebug( "mime: <$mime> extension: <{$this->mFinalExtension}>\n" );
                        global $wgMimeTypeBlacklist;
                        if ( $this->checkFileExtension( $mime, $wgMimeTypeBlacklist ) ) {
                                wfProfileOut( __METHOD__ );
@@ -593,7 +593,7 @@ abstract class UploadBase {
         * isAllowed() should be called as well for generic is-user-blocked or
         * can-user-upload checking.
         *
-        * @param User $user object to verify the permissions against
+        * @param User $user User object to verify the permissions against
         * @return mixed An array as returned by getUserPermissionsErrors or true
         *   in case the user has proper permissions.
         */
@@ -1276,8 +1276,8 @@ abstract class UploadBase {
 
        /**
         * Callback to filter SVG Processing Instructions.
-        * @param string $target processing instruction name
-        * @param string $data processing instruction attribute and value
+        * @param string $target Processing instruction name
+        * @param string $data Processing instruction attribute and value
         * @return bool (true if the filter identified something bad)
         */
        public static function checkSvgPICallback( $target, $data ) {
index 6f90280..bea7128 100644 (file)
@@ -68,7 +68,7 @@ class UploadFromChunks extends UploadFromFile {
         * Calls the parent stashFile and updates the uploadsession table to handle "chunks"
         *
         * @param User|null $user
-        * @return UploadStashFile stashed file
+        * @return UploadStashFile Stashed file
         */
        public function stashFile( User $user = null ) {
                // Stash file is the called on creating a new chunk session:
@@ -201,9 +201,9 @@ class UploadFromChunks extends UploadFromFile {
        /**
         * Add a chunk to the temporary directory
         *
-        * @param string $chunkPath path to temporary chunk file
-        * @param int $chunkSize size of the current chunk
-        * @param int $offset offset of current chunk ( mutch match database chunk offset )
+        * @param string $chunkPath Path to temporary chunk file
+        * @param int $chunkSize Size of the current chunk
+        * @param int $offset Offset of current chunk ( mutch match database chunk offset )
         * @return Status
         */
        public function addChunk( $chunkPath, $chunkSize, $offset ) {
index a7e7100..23a7a3a 100644 (file)
@@ -167,7 +167,7 @@ class UploadStash {
        /**
         * Getter for file metadata.
         *
-        * @param string $key key under which file information is stored
+        * @param string $key Key under which file information is stored
         * @return array
         */
        public function getMetadata( $key ) {
@@ -179,7 +179,7 @@ class UploadStash {
        /**
         * Getter for fileProps
         *
-        * @param string $key key under which file information is stored
+        * @param string $key Key under which file information is stored
         * @return array
         */
        public function getFileProps( $key ) {
@@ -523,7 +523,7 @@ class UploadStash {
        /**
         * Helper function: Initialize the UploadStashFile for a given file.
         *
-        * @param string $key key under which to store the object
+        * @param string $key Key under which to store the object
         * @throws UploadStashZeroLengthFileException
         * @return bool
         */
index b6df18b..1e521cb 100644 (file)
@@ -151,8 +151,7 @@ class ArrayUtils {
         * @since 1.23
         *
         * @param array $array1 The array to compare from
-        * @param array $array2 An array to compare against
-        * @param array ... More arrays to compare against
+        * @param array $array2,... More arrays to compare against
         * @return array An array containing all the values from array1
         *               that are not present in any of the other arrays.
         */
index b16d4a4..b97e2ad 100644 (file)
@@ -34,7 +34,7 @@ abstract class CdbReader {
        /**
         * Open a file and return a subclass instance
         *
-        * @param $fileName string
+        * @param string $fileName
         *
         * @return CdbReader
         */
@@ -64,7 +64,7 @@ abstract class CdbReader {
        /**
         * Create the object and open the file
         *
-        * @param $fileName string
+        * @param string $fileName
         */
        abstract public function __construct( $fileName );
 
@@ -76,7 +76,7 @@ abstract class CdbReader {
        /**
         * Get a value with a given key. Only string values are supported.
         *
-        * @param $key string
+        * @param string $key
         */
        abstract public function get( $key );
 }
@@ -107,7 +107,7 @@ abstract class CdbWriter {
         * Open a writer and return a subclass instance.
         * The user must have write access to the directory, for temporary file creation.
         *
-        * @param $fileName string
+        * @param string $fileName
         *
         * @return CdbWriterDBA|CdbWriterPHP
         */
@@ -120,14 +120,14 @@ abstract class CdbWriter {
        /**
         * Create the object and open the file
         *
-        * @param $fileName string
+        * @param string $fileName
         */
        abstract public function __construct( $fileName );
 
        /**
         * Set a key to a given value. The value will be converted to string.
-        * @param $key string
-        * @param $value string
+        * @param string $key
+        * @param string $value
         */
        abstract public function set( $key, $value );
 
index baba580..19d747a 100644 (file)
@@ -32,8 +32,8 @@ class CdbFunctions {
         * Take a modulo of a signed integer as if it were an unsigned integer.
         * $b must be less than 0x40000000 and greater than 0
         *
-        * @param $a
-        * @param $b
+        * @param int $a
+        * @param int $b
         *
         * @return int
         */
@@ -49,8 +49,8 @@ class CdbFunctions {
 
        /**
         * Shift a signed integer right as if it were unsigned
-        * @param $a
-        * @param $b
+        * @param int $a
+        * @param int $b
         * @return int
         */
        public static function unsignedShiftRight( $a, $b ) {
@@ -67,7 +67,7 @@ class CdbFunctions {
        /**
         * The CDB hash function.
         *
-        * @param $s string
+        * @param string $s
         *
         * @return int
         */
@@ -125,7 +125,7 @@ class CdbReaderPHP extends CdbReader {
        protected $dlen;
 
        /**
-        * @param $fileName string
+        * @param string $fileName
         * @throws CdbException
         */
        public function __construct( $fileName ) {
@@ -145,7 +145,7 @@ class CdbReaderPHP extends CdbReader {
        }
 
        /**
-        * @param $key
+        * @param mixed $key
         * @return bool|string
         */
        public function get( $key ) {
@@ -158,8 +158,8 @@ class CdbReaderPHP extends CdbReader {
        }
 
        /**
-        * @param $key
-        * @param $pos
+        * @param string $key
+        * @param int $pos
         * @return bool
         */
        protected function match( $key, $pos ) {
@@ -174,8 +174,8 @@ class CdbReaderPHP extends CdbReader {
 
        /**
         * @throws CdbException
-        * @param $length
-        * @param $pos
+        * @param int $length
+        * @param int $pos
         * @return string
         */
        protected function read( $length, $pos ) {
@@ -200,7 +200,7 @@ class CdbReaderPHP extends CdbReader {
 
        /**
         * Unpack an unsigned integer and throw an exception if it needs more than 31 bits
-        * @param $s
+        * @param string $s
         * @throws CdbException
         * @return mixed
         */
@@ -216,7 +216,7 @@ class CdbReaderPHP extends CdbReader {
 
        /**
         * Unpack a 32-bit signed integer
-        * @param $s
+        * @param string $s
         * @return int
         */
        protected function unpackSigned( $s ) {
@@ -226,7 +226,7 @@ class CdbReaderPHP extends CdbReader {
        }
 
        /**
-        * @param $key
+        * @param string $key
         * @return bool
         */
        protected function findNext( $key ) {
@@ -274,7 +274,7 @@ class CdbReaderPHP extends CdbReader {
        }
 
        /**
-        * @param $key
+        * @param mixed $key
         * @return bool
         */
        protected function find( $key ) {
@@ -295,7 +295,7 @@ class CdbWriterPHP extends CdbWriter {
        protected $pos;
 
        /**
-        * @param $fileName string
+        * @param string $fileName
         */
        public function __construct( $fileName ) {
                $this->realFileName = $fileName;
@@ -347,7 +347,7 @@ class CdbWriterPHP extends CdbWriter {
 
        /**
         * @throws CdbException
-        * @param $buf
+        * @param string $buf
         */
        protected function write( $buf ) {
                $len = fwrite( $this->handle, $buf );
@@ -358,7 +358,7 @@ class CdbWriterPHP extends CdbWriter {
 
        /**
         * @throws CdbException
-        * @param $len
+        * @param int $len
         */
        protected function posplus( $len ) {
                $newpos = $this->pos + $len;
@@ -370,9 +370,9 @@ class CdbWriterPHP extends CdbWriter {
        }
 
        /**
-        * @param $keylen
-        * @param $datalen
-        * @param $h
+        * @param int $keylen
+        * @param int $datalen
+        * @param int $h
         */
        protected function addend( $keylen, $datalen, $h ) {
                $this->hplist[] = array(
@@ -388,8 +388,8 @@ class CdbWriterPHP extends CdbWriter {
 
        /**
         * @throws CdbException
-        * @param $keylen
-        * @param $datalen
+        * @param int $keylen
+        * @param int $datalen
         */
        protected function addbegin( $keylen, $datalen ) {
                if ( $keylen > 0x7fffffff ) {
@@ -481,7 +481,7 @@ class CdbWriterPHP extends CdbWriter {
        /**
         * Clean up the temp file and throw an exception
         *
-        * @param $msg string
+        * @param string $msg
         * @throws CdbException
         */
        protected function throwException( $msg ) {
index e4e1cfd..0e2db8c 100644 (file)
@@ -73,8 +73,8 @@ class IP {
         * SIIT IPv4-translated addresses are rejected.
         * Note: canonicalize() tries to convert translated addresses to IPv4.
         *
-        * @param string $ip possible IP address
-        * @return Boolean
+        * @param string $ip Possible IP address
+        * @return bool
         */
        public static function isIPAddress( $ip ) {
                return (bool)preg_match( '/^' . IP_ADDRESS_STRING . '$/', $ip );
@@ -84,8 +84,8 @@ class IP {
         * Given a string, determine if it as valid IP in IPv6 only.
         * Note: Unlike isValid(), this looks for networks too.
         *
-        * @param string $ip possible IP address
-        * @return Boolean
+        * @param string $ip Possible IP address
+        * @return bool
         */
        public static function isIPv6( $ip ) {
                return (bool)preg_match( '/^' . RE_IPV6_ADD . '(?:\/' . RE_IPV6_PREFIX . ')?$/', $ip );
@@ -95,8 +95,8 @@ class IP {
         * Given a string, determine if it as valid IP in IPv4 only.
         * Note: Unlike isValid(), this looks for networks too.
         *
-        * @param string $ip possible IP address
-        * @return Boolean
+        * @param string $ip Possible IP address
+        * @return bool
         */
        public static function isIPv4( $ip ) {
                return (bool)preg_match( '/^' . RE_IP_ADD . '(?:\/' . RE_IP_PREFIX . ')?$/', $ip );
@@ -107,8 +107,8 @@ class IP {
         * SIIT IPv4-translated addresses are rejected.
         * Note: canonicalize() tries to convert translated addresses to IPv4.
         *
-        * @param $ip String
-        * @return Boolean: True if it is valid.
+        * @param string $ip
+        * @return bool True if it is valid
         */
        public static function isValid( $ip ) {
                return ( preg_match( '/^' . RE_IP_ADD . '$/', $ip )
@@ -120,8 +120,8 @@ class IP {
         * SIIT IPv4-translated addresses are rejected.
         * Note: canonicalize() tries to convert translated addresses to IPv4.
         *
-        * @param $ipblock String
-        * @return Boolean: True if it is valid.
+        * @param string $ipblock
+        * @return bool True if it is valid
         */
        public static function isValidBlock( $ipblock ) {
                return ( preg_match( '/^' . RE_IPV6_BLOCK . '$/', $ipblock )
@@ -134,7 +134,7 @@ class IP {
         * IPv4 addresses are just trimmed.
         *
         * @param string $ip IP address in quad or octet form (CIDR or not).
-        * @return String
+        * @return string
         */
        public static function sanitizeIP( $ip ) {
                $ip = trim( $ip );
@@ -186,7 +186,7 @@ class IP {
         * Prettify an IP for display to end users.
         * This will make it more compact and lower-case.
         *
-        * @param $ip string
+        * @param string $ip
         * @return string
         */
        public static function prettifyIP( $ip ) {
@@ -286,9 +286,9 @@ class IP {
         * 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
+        * @param string $host
+        * @param int $port
+        * @param bool|int $defaultPort
         * @return string
         */
        public static function combineHostAndPort( $host, $port, $defaultPort = false ) {
@@ -305,8 +305,8 @@ class IP {
        /**
         * Convert an IPv4 or IPv6 hexadecimal representation back to readable format
         *
-        * @param string $hex number, with "v6-" prefix if it is IPv6
-        * @return String: quad-dotted (IPv4) or octet notation (IPv6)
+        * @param string $hex Number, with "v6-" prefix if it is IPv6
+        * @return string Quad-dotted (IPv4) or octet notation (IPv6)
         */
        public static function formatHex( $hex ) {
                if ( substr( $hex, 0, 3 ) == 'v6-' ) { // IPv6
@@ -319,8 +319,8 @@ class IP {
        /**
         * Converts a hexadecimal number to an IPv6 address in octet notation
         *
-        * @param $ip_hex String: pure hex (no v6- prefix)
-        * @return String (of format a:b:c:d:e:f:g:h)
+        * @param string $ip_hex Pure hex (no v6- prefix)
+        * @return string (of format a:b:c:d:e:f:g:h)
         */
        public static function hexToOctet( $ip_hex ) {
                // Pad hex to 32 chars (128 bits)
@@ -339,8 +339,8 @@ class IP {
        /**
         * Converts a hexadecimal number to an IPv4 address in quad-dotted notation
         *
-        * @param $ip_hex String: pure hex
-        * @return String (of format a.b.c.d)
+        * @param string $ip_hex Pure hex
+        * @return string (of format a.b.c.d)
         */
        public static function hexToQuad( $ip_hex ) {
                // Pad hex to 8 chars (32 bits)
@@ -361,8 +361,8 @@ class IP {
         * Determine if an IP address really is an IP address, and if it is public,
         * i.e. not RFC 1918 or similar
         *
-        * @param $ip String
-        * @return Boolean
+        * @param string $ip
+        * @return bool
         */
        public static function isPublic( $ip ) {
                static $privateSet = null;
@@ -388,8 +388,8 @@ class IP {
         * function for an IPv6 address will be prefixed with "v6-", a non-
         * hexadecimal string which sorts after the IPv4 addresses.
         *
-        * @param string $ip quad dotted/octet IP address.
-        * @return String|bool false on failure
+        * @param string $ip Quad dotted/octet IP address.
+        * @return string|bool False on failure
         */
        public static function toHex( $ip ) {
                if ( self::isIPv6( $ip ) ) {
@@ -420,8 +420,8 @@ class IP {
        /**
         * Given an IPv6 address in octet notation, returns a pure hex string.
         *
-        * @param string $ip octet ipv6 IP address.
-        * @return String|bool pure hex (uppercase); false on failure
+        * @param string $ip Octet ipv6 IP address.
+        * @return string|bool Pure hex (uppercase); false on failure
         */
        private static function IPv6ToRawHex( $ip ) {
                $ip = self::sanitizeIP( $ip );
@@ -529,7 +529,7 @@ class IP {
         * Convert a network specification in IPv6 CIDR notation to an
         * integer network and a number of bits
         *
-        * @param $range
+        * @param string $range
         *
         * @return array(string, int)
         */
@@ -570,7 +570,7 @@ class IP {
         *     2001:0db8:85a3::7344 - 2001:0db8:85a3::7344   Explicit range
         *     2001:0db8:85a3::7344/96                       Single IP
         *
-        * @param $range
+        * @param string $range
         *
         * @return array(string, string)
         */
@@ -616,9 +616,9 @@ class IP {
        /**
         * Determine if a given IPv4/IPv6 address is in a given CIDR network
         *
-        * @param string $addr the address to check against the given range.
-        * @param string $range the range to check the given address against.
-        * @return Boolean: whether or not the given address is in the given range.
+        * @param string $addr The address to check against the given range.
+        * @param string $range The range to check the given address against.
+        * @return bool Whether or not the given address is in the given range.
         */
        public static function isInRange( $addr, $range ) {
                $hexIP = self::toHex( $addr );
@@ -635,8 +635,8 @@ class IP {
         * This currently only checks a few IPV4-to-IPv6 related cases.  More
         * unusual representations may be added later.
         *
-        * @param string $addr something that might be an IP address
-        * @return String: valid dotted quad IPv4 address or null
+        * @param string $addr Something that might be an IP address
+        * @return string Valid dotted quad IPv4 address or null
         */
        public static function canonicalize( $addr ) {
                // remove zone info (bug 35738)
index 6b6655e..8610386 100644 (file)
@@ -101,7 +101,7 @@ class MWCryptHKDF {
        /**
         * @param string $hash Name of hashing algorithm
         * @param BagOStuff $cache
-        * @param string|array $context to mix into HKDF context
+        * @param string|array $context Context to mix into HKDF context
         */
        public function __construct( $secretKeyMaterial, $algorithm, $cache, $context ) {
                if ( strlen( $secretKeyMaterial ) < 16 ) {
@@ -133,7 +133,7 @@ class MWCryptHKDF {
 
        /**
         * MW specific salt, cached from last run
-        * @return string binary string
+        * @return string Binary string
         */
        protected function getSaltUsingCache() {
                if ( $this->salt == '' ) {
@@ -189,9 +189,9 @@ class MWCryptHKDF {
        /**
         * Produce $bytes of secure random data. As a side-effect,
         * $this->lastK is set to the last hashLen block of key material.
-        * @param int $bytes number of bytes of data
-        * @param string $context to mix into CTXinfo
-        * @return string binary string of length $bytes
+        * @param int $bytes Number of bytes of data
+        * @param string $context Context to mix into CTXinfo
+        * @return string Binary string of length $bytes
         */
        protected function realGenerate( $bytes, $context = '' ) {
 
@@ -237,13 +237,13 @@ class MWCryptHKDF {
         * N.B. http://eprint.iacr.org/2010/264.pdf seems to differ from RFC 5869 in that the test
         * vectors from RFC 5869 only work if K(0) = '' and K(1) = HMAC(PRK, K(0) || CTXinfo || 1)
         *
-        * @param string $hash the hashing function to use (e.g., sha256)
-        * @param string $ikm the input keying material
-        * @param string $salt the salt to add to the ikm, to get the prk
-        * @param string $info optional context (change the output without affecting
+        * @param string $hash The hashing function to use (e.g., sha256)
+        * @param string $ikm The input keying material
+        * @param string $salt The salt to add to the ikm, to get the prk
+        * @param string $info Optional context (change the output without affecting
         *      the randomness properties of the output)
-        * @param integer $L number of bytes to return
-        * @return string cryptographically secure pseudorandom binary string
+        * @param int $L Number of bytes to return
+        * @return string Cryptographically secure pseudorandom binary string
         */
        public static function HKDF( $hash, $ikm, $salt, $info, $L ) {
                $prk = self::HKDFExtract( $hash, $salt, $ikm );
@@ -256,10 +256,10 @@ class MWCryptHKDF {
         * Note that the hmac is keyed with XTS (the salt),
         * and the SKM (source key material) is the "data".
         *
-        * @param string $hash the hashing function to use (e.g., sha256)
-        * @param string $ikm the input keying material
-        * @param string $salt the salt to add to the ikm, to get the prk
-        * @return string binary string (pseudorandm key) used as input to HKDFExpand
+        * @param string $hash The hashing function to use (e.g., sha256)
+        * @param string $ikm The input keying material
+        * @param string $salt The salt to add to the ikm, to get the prk
+        * @return string Binary string (pseudorandm key) used as input to HKDFExpand
         */
        private static function HKDFExtract( $hash, $salt, $ikm ) {
                return hash_hmac( $hash, $ikm, $salt, true );
@@ -268,16 +268,16 @@ class MWCryptHKDF {
        /**
         * Expand the key with the given context
         *
-        * @param $hash Hashing Algorithm
-        * @param $prk a pseudorandom key of at least HashLen octets
-         *     (usually, the output from the extract step)
-        * @param $info optional context and application specific information
-         *     (can be a zero-length string)
-        * @param $bytes length of output keying material in bytes
-         *     (<= 255*HashLen)
-        * @param &$lastK set by this function to the last block of the expansion.
+        * @param string $hash Hashing Algorithm
+        * @param string $prk A pseudorandom key of at least HashLen octets
+             (usually, the output from the extract step)
+        * @param string $info Optional context and application specific information
+             (can be a zero-length string)
+        * @param int $bytes Length of output keying material in bytes
+             (<= 255*HashLen)
+        * @param string &$lastK Set by this function to the last block of the expansion.
         *      In MediaWiki, this is used to seed future Extractions.
-        * @return string cryptographically secure random string $bytes long
+        * @return string Cryptographically secure random string $bytes long
         */
        private static function HKDFExpand( $hash, $prk, $info, $bytes, &$lastK = '' ) {
                $hashLen = MWCryptHKDF::$hashLength[$hash];
@@ -293,7 +293,7 @@ class MWCryptHKDF {
                for ( $counter = 1; $counter <= $rounds; ++$counter ) {
                        $lastK = hash_hmac(
                                $hash,
-                               $lastK . $info . chr($counter),
+                               $lastK . $info . chr( $counter ),
                                $prk,
                                true
                        );
@@ -306,9 +306,9 @@ class MWCryptHKDF {
        /**
         * Generate cryptographically random data and return it in raw binary form.
         *
-        * @param int $bytes the number of bytes of random data to generate
-        * @param string $context string to mix into HMAC context
-        * @return string binary string of length $bytes
+        * @param int $bytes The number of bytes of random data to generate
+        * @param string $context String to mix into HMAC context
+        * @return string Binary string of length $bytes
         */
        public static function generate( $bytes, $context ) {
                return self::singleton()->realGenerate( $bytes, $context );
@@ -318,9 +318,9 @@ class MWCryptHKDF {
         * Generate cryptographically random data and return it in hexadecimal string format.
         * See MWCryptRand::realGenerateHex for details of the char-to-byte conversion logic.
         *
-        * @param int $chars the number of hex chars of random data to generate
-        * @param string $context string to mix into HMAC context
-        * @return string random hex characters, $chars long
+        * @param int $chars The number of hex chars of random data to generate
+        * @param string $context String to mix into HMAC context
+        * @return string Random hex characters, $chars long
         */
        public static function generateHex( $chars, $context = '' ) {
                $bytes = ceil( $chars / 2 );
index eb74d12..31a71c4 100644 (file)
@@ -147,7 +147,7 @@ class MWCryptRand {
         * Randomly hash data while mixing in clock drift data for randomness
         *
         * @param string $data The data to randomly hash.
-        * @return String The hashed bytes
+        * @return string The hashed bytes
         * @author Tim Starling
         */
        protected function driftHash( $data ) {
@@ -214,7 +214,7 @@ class MWCryptRand {
        /**
         * Decide on the best acceptable hash algorithm we have available for hash()
         * @throws MWException
-        * @return String A hash algorithm
+        * @return string A hash algorithm
         */
        protected function hashAlgo() {
                if ( !is_null( $this->algo ) ) {
@@ -259,8 +259,8 @@ class MWCryptRand {
         * Generate an acceptably unstable one-way-hash of some text
         * making use of the best hash algorithm that we have available.
         *
-        * @param $data string
-        * @return String A raw hash of the data
+        * @param string $data
+        * @return string A raw hash of the data
         */
        protected function hash( $data ) {
                return hash( $this->hashAlgo(), $data, true );
@@ -270,9 +270,9 @@ class MWCryptRand {
         * Generate an acceptably unstable one-way-hmac of some text
         * making use of the best hash algorithm that we have available.
         *
-        * @param $data string
-        * @param $key string
-        * @return String A raw hash of the data
+        * @param string $data
+        * @param string $key
+        * @return string A raw hash of the data
         */
        protected function hmac( $data, $key ) {
                return hash_hmac( $this->hashAlgo(), $data, $key, true );
@@ -487,11 +487,11 @@ class MWCryptRand {
         * You can use MWCryptRand::wasStrong() if you wish to know if the source used
         * was cryptographically strong.
         *
-        * @param int $bytes the number of bytes of random data to generate
+        * @param int $bytes The number of bytes of random data to generate
         * @param bool $forceStrong Pass true if you want generate to prefer cryptographically
         *                          strong sources of entropy even if reading from them may steal
         *                          more entropy from the system than optimal.
-        * @return String Raw binary random data
+        * @return string Raw binary random data
         */
        public static function generate( $bytes, $forceStrong = false ) {
                return self::singleton()->realGenerate( $bytes, $forceStrong );
@@ -503,11 +503,11 @@ class MWCryptRand {
         * You can use MWCryptRand::wasStrong() if you wish to know if the source used
         * was cryptographically strong.
         *
-        * @param int $chars the number of hex chars of random data to generate
+        * @param int $chars The number of hex chars of random data to generate
         * @param bool $forceStrong Pass true if you want generate to prefer cryptographically
         *                          strong sources of entropy even if reading from them may steal
         *                          more entropy from the system than optimal.
-        * @return String Hexadecimal random data
+        * @return string Hexadecimal random data
         */
        public static function generateHex( $chars, $forceStrong = false ) {
                return self::singleton()->realGenerateHex( $chars, $forceStrong );
index 7105f6c..3a0492d 100644 (file)
@@ -24,7 +24,7 @@ class MWFunction {
 
        /**
         * @deprecated since 1.22; use call_user_func()
-        * @param $callback
+        * @param callable $callback
         * @return mixed
         */
        public static function call( $callback ) {
@@ -36,8 +36,8 @@ class MWFunction {
 
        /**
         * @deprecated since 1.22; use call_user_func_array()
-        * @param $callback
-        * @param $argsarams
+        * @param callable $callback
+        * @param array $argsarams
         * @return mixed
         */
        public static function callArray( $callback, $argsarams ) {
@@ -47,8 +47,8 @@ class MWFunction {
        }
 
        /**
-        * @param $class
-        * @param $args array
+        * @param string $class
+        * @param array $args
         * @return object
         */
        public static function newObj( $class, $args = array() ) {
index 9cd3d3f..86f4512 100644 (file)
@@ -42,11 +42,11 @@ class StringUtils {
         * Beware of this when backporting code to that version of MediaWiki.
         *
         * @param string $value String to check
-        * @param boolean $disableMbstring Whether to use the pure PHP
+        * @param bool $disableMbstring Whether to use the pure PHP
         * implementation instead of trying mb_check_encoding. Intended for unit
         * testing. Default: false
         *
-        * @return boolean Whether the given $value is a valid UTF-8 encoded string
+        * @return bool Whether the given $value is a valid UTF-8 encoded string
         */
        static function isUtf8( $value, $disableMbstring = false ) {
                $value = (string)$value;
@@ -121,10 +121,10 @@ class StringUtils {
         * hungry and inflexible. The memory requirements are such that I don't
         * recommend using it on anything but guaranteed small chunks of text.
         *
-        * @param $startDelim
-        * @param $endDelim
-        * @param $replace
-        * @param $subject
+        * @param string $startDelim
+        * @param string $endDelim
+        * @param string $replace
+        * @param string $subject
         *
         * @return string
         */
@@ -157,11 +157,11 @@ class StringUtils {
         * start, so e.g. /*\/ is not considered to be both the start and end of a
         * comment. /*\/xy/*\/ is considered to be a single comment with contents /xy/.
         *
-        * @param string $startDelim start delimiter
-        * @param string $endDelim end delimiter
-        * @param $callback Callback: function to call on each match
-        * @param $subject String
-        * @param string $flags regular expression flags
+        * @param string $startDelim Start delimiter
+        * @param string $endDelim End delimiter
+        * @param callable $callback Function to call on each match
+        * @param string $subject
+        * @param string $flags Regular expression flags
         * @throws MWException
         * @return string
         */
@@ -245,13 +245,13 @@ class StringUtils {
         *
         *   preg_replace( "!$startDelim(.*)$endDelim!$flags", $replace, $subject )
         *
-        * @param string $startDelim start delimiter regular expression
-        * @param string $endDelim end delimiter regular expression
-        * @param string $replace replacement string. May contain $1, which will be
+        * @param string $startDelim Start delimiter regular expression
+        * @param string $endDelim End delimiter regular expression
+        * @param string $replace Replacement string. May contain $1, which will be
         *                 replaced by the text between the delimiters
-        * @param string $subject to search
-        * @param string $flags regular expression flags
-        * @return String: The string with the matches replaced
+        * @param string $subject String to search
+        * @param string $flags Regular expression flags
+        * @return string The string with the matches replaced
         */
        static function delimiterReplace( $startDelim, $endDelim, $replace, $subject, $flags = '' ) {
                $replacer = new RegexlikeReplacer( $replace );
@@ -361,8 +361,8 @@ class RegexlikeReplacer extends Replacer {
  */
 class DoubleReplacer extends Replacer {
        /**
-        * @param $from
-        * @param $to
+        * @param mixed $from
+        * @param mixed $to
         * @param int $index
         */
        function __construct( $from, $to, $index = 0 ) {
@@ -387,7 +387,7 @@ class HashtableReplacer extends Replacer {
        private $table, $index;
 
        /**
-        * @param $table
+        * @param array $table
         * @param int $index
         */
        function __construct( $table, $index = 0 ) {
index 0ce90c1..604d381 100644 (file)
@@ -37,7 +37,7 @@ class UIDGenerator {
        protected $lockFile88; // string; local file path
        protected $lockFile128; // string; local file path
 
-       /** @var Array */
+       /** @var array */
        protected $fileHandles = array(); // cache file handles
 
        const QUICK_RAND = 1; // get randomness from fast and insecure sources
@@ -102,7 +102,7 @@ class UIDGenerator {
         *
         * UID generation is serialized on each server (as the node ID is for the whole machine).
         *
-        * @param $base integer Specifies a base other than 10
+        * @param int $base Specifies a base other than 10
         * @return string Number
         * @throws MWException
         */
@@ -146,7 +146,7 @@ class UIDGenerator {
         *
         * UID generation is serialized on each server (as the node ID is for the whole machine).
         *
-        * @param $base integer Specifies a base other than 10
+        * @param int $base Specifies a base other than 10
         * @return string Number
         * @throws MWException
         */
@@ -185,7 +185,7 @@ class UIDGenerator {
        /**
         * Return an RFC4122 compliant v4 UUID
         *
-        * @param $flags integer Bitfield (supports UIDGenerator::QUICK_RAND)
+        * @param int $flags Bitfield (supports UIDGenerator::QUICK_RAND)
         * @return string
         * @throws MWException
         */
@@ -211,7 +211,7 @@ class UIDGenerator {
        /**
         * Return an RFC4122 compliant v4 UUID
         *
-        * @param $flags integer Bitfield (supports UIDGenerator::QUICK_RAND)
+        * @param int $flags Bitfield (supports UIDGenerator::QUICK_RAND)
         * @return string 32 hex characters with no hyphens
         * @throws MWException
         */
@@ -226,8 +226,8 @@ class UIDGenerator {
         * If UIDGenerator::QUICK_VOLATILE is used the counter might reset on server restart.
         *
         * @param string $bucket Arbitrary bucket name (should be ASCII)
-        * @param integer $bits Bit size (<=48) of resulting numbers before wrap-around
-        * @param integer $flags (supports UIDGenerator::QUICK_VOLATILE)
+        * @param int $bits Bit size (<=48) of resulting numbers before wrap-around
+        * @param int $flags (supports UIDGenerator::QUICK_VOLATILE)
         * @return float Integer value as float
         * @since 1.23
         */
@@ -240,9 +240,9 @@ class UIDGenerator {
         *
         * @see UIDGenerator::newSequentialPerNodeID()
         * @param string $bucket Arbitrary bucket name (should be ASCII)
-        * @param integer $bits Bit size (16 to 48) of resulting numbers before wrap-around
-        * @param integer $count Number of IDs to return (1 to 10000)
-        * @param integer $flags (supports UIDGenerator::QUICK_VOLATILE)
+        * @param int $bits Bit size (16 to 48) of resulting numbers before wrap-around
+        * @param int $count Number of IDs to return (1 to 10000)
+        * @param int $flags (supports UIDGenerator::QUICK_VOLATILE)
         * @return array Ordered list of float integer values
         * @since 1.23
         */
@@ -256,9 +256,9 @@ class UIDGenerator {
         *
         * @see UIDGenerator::newSequentialPerNodeID()
         * @param string $bucket Arbitrary bucket name (should be ASCII)
-        * @param integer $bits Bit size (16 to 48) of resulting numbers before wrap-around
-        * @param integer $count Number of IDs to return (1 to 10000)
-        * @param integer $flags (supports UIDGenerator::QUICK_VOLATILE)
+        * @param int $bits Bit size (16 to 48) of resulting numbers before wrap-around
+        * @param int $count Number of IDs to return (1 to 10000)
+        * @param int $flags (supports UIDGenerator::QUICK_VOLATILE)
         * @return array Ordered list of float integer values
         */
        protected function getSequentialPerNodeIDs( $bucket, $bits, $count, $flags ) {
@@ -337,9 +337,9 @@ class UIDGenerator {
         * This is useful for making UIDs sequential on a per-node bases.
         *
         * @param string $lockFile Name of a local lock file
-        * @param $clockSeqSize integer The number of possible clock sequence values
-        * @param $counterSize integer The number of possible counter values
-        * @return Array (result of UIDGenerator::millitime(), counter, clock sequence)
+        * @param int $clockSeqSize The number of possible clock sequence values
+        * @param int $counterSize The number of possible counter values
+        * @return array (result of UIDGenerator::millitime(), counter, clock sequence)
         * @throws MWException
         */
        protected function getTimestampAndDelay( $lockFile, $clockSeqSize, $counterSize ) {
@@ -420,7 +420,7 @@ class UIDGenerator {
         * timestamp. This returns false if it would have to wait more than 10ms.
         *
         * @param array $time Result of UIDGenerator::millitime()
-        * @return Array|bool UIDGenerator::millitime() result or false
+        * @return array|bool UIDGenerator::millitime() result or false
         */
        protected function timeWaitUntil( array $time ) {
                do {
@@ -449,7 +449,7 @@ class UIDGenerator {
        }
 
        /**
-        * @return Array (current time in seconds, milliseconds since then)
+        * @return array (current time in seconds, milliseconds since then)
         */
        protected static function millitime() {
                list( $msec, $sec ) = explode( ' ', microtime() );
index 6be186f..0f56e33 100644 (file)
@@ -64,7 +64,7 @@ class ZipDirectoryReader {
         *        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:
+        * @return Status A Status object. The following fatal errors are defined:
         *
         *      - zip-file-open-error: The file could not be opened.
         *
@@ -181,6 +181,8 @@ class ZipDirectoryReader {
 
        /**
         * Throw an error, and log a debug message
+        * @param mixed $code
+        * @param string $debugMessage
         */
        function error( $code, $debugMessage ) {
                wfDebug( __CLASS__ . ": Fatal error: $debugMessage\n" );
@@ -299,7 +301,7 @@ class ZipDirectoryReader {
         * Find the location of the central directory, as would be seen by a
         * non-ZIP64 reader.
         *
-        * @return List containing offset, size and end position.
+        * @return array List containing offset, size and end position.
         */
        function findOldCentralDirectory() {
                $size = $this->eocdr['CD size'];
@@ -430,9 +432,7 @@ 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 ( $this->testBit( $data['general bits'], self::GENERAL_UTF8 ) ) {
                                $name = $data['name'];
                        } else {
                                $name = iconv( 'CP437', 'UTF-8', $data['name'] );
@@ -485,6 +485,7 @@ class ZipDirectoryReader {
 
        /**
         * Get the length of the file.
+        * @return int
         */
        function getFileLength() {
                if ( $this->fileLength === null ) {
@@ -661,7 +662,7 @@ class ZipDirectoryReader {
         * Returns a bit from a given position in an integer value, converted to
         * boolean.
         *
-        * @param $value integer
+        * @param int $value
         * @param int $bitIndex The index of the bit, where 0 is the LSB.
         * @return bool
         */
@@ -671,6 +672,7 @@ class ZipDirectoryReader {
 
        /**
         * Debugging helper function which dumps a string in hexdump -C format.
+        * @param string $s
         */
        function hexDump( $s ) {
                $n = strlen( $s );
index 0a19d61..8b41b4e 100644 (file)
@@ -339,7 +339,7 @@ class Language {
                        throw new MWException( __METHOD__ . " must be passed a string, $type given$addmsg" );
                }
 
-               return (bool)preg_match( '/^[a-z0-9-]{2,}$/i', $code );
+               return (bool)preg_match( '/^[a-z0-9-]{2,}$/', $code );
        }
 
        /**
@@ -2396,7 +2396,7 @@ class Language {
                        // Timestamps are in different years: use full timestamp
                        // Also do full timestamp for future dates
                        /**
-                        * @FIXME Add better handling of future timestamps.
+                        * @todo FIXME: Add better handling of future timestamps.
                         */
                        $format = $this->getDateFormatString( 'both', $user->getDatePreference() ?: 'default' );
                        $ts = $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) );
@@ -3125,7 +3125,7 @@ class Language {
         */
        function getMagic( $mw ) {
                // Saves a function call
-               if ( ! $this->mMagicHookDone ) {
+               if ( !$this->mMagicHookDone ) {
                        $this->doMagicHook();
                }
 
@@ -3795,7 +3795,7 @@ class Language {
                foreach ( $forms as $index => $form ) {
                        if ( preg_match( '/\d+=/i', $form ) ) {
                                $pos = strpos( $form, '=' );
-                               if ( substr( $form, 0, $pos ) === (string) $count ) {
+                               if ( substr( $form, 0, $pos ) === (string)$count ) {
                                        return substr( $form, $pos + 1 );
                                }
                                unset( $forms[$index] );
@@ -4443,7 +4443,7 @@ class Language {
                if ( !isset( $format['avoid'] ) ) {
                        $format['avoid'] = false;
                }
-               if ( !isset( $format['noabbrevs' ] ) ) {
+               if ( !isset( $format['noabbrevs'] ) ) {
                        $format['noabbrevs'] = false;
                }
                $secondsMsg = wfMessage(
index 4c956f0..1d279d6 100644 (file)
@@ -162,26 +162,6 @@ class IuConverter extends LanguageConverter {
                }
        }
 
-       /**
-        * An ugly function wrapper for parsing Image titles
-        * (to prevent image name conversion)
-        *
-        * @param string $text
-        * @param bool $toVariant
-        *
-        * @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
         *
index 1ab3c51..3d05b81 100644 (file)
@@ -270,26 +270,6 @@ class KkConverter extends LanguageConverter {
                }
        }
 
-       /**
-        * An ugly function wrapper for parsing Image titles
-        * (to prevent image name conversion)
-        *
-        * @param string $text
-        * @param bool $toVariant
-        *
-        * @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
         *
index 674e717..f74be05 100644 (file)
@@ -180,26 +180,6 @@ class KuConverter extends LanguageConverter {
                }
        }
 
-       /**
-        * An ugly function wrapper for parsing Image titles
-        * (to prevent image name conversion)
-        *
-        * @param string $text
-        * @param bool $toVariant
-        *
-        * @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, specials:
         *    - ommiting roman numbers
index 68e047c..a22730c 100644 (file)
@@ -138,26 +138,6 @@ class ShiConverter extends LanguageConverter {
                }
        }
 
-       /**
-        * An ugly function wrapper for parsing Image titles
-        * (to prevent image name conversion)
-        *
-        * @param string $text
-        * @param bool $toVariant
-        *
-        * @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
         *
index d0c4e06..80099ac 100644 (file)
@@ -128,26 +128,6 @@ class SrConverter extends LanguageConverter {
                }
        }
 
-       /**
-        * An ugly function wrapper for parsing Image titles
-        * (to prevent image name conversion)
-        *
-        * @param string $text
-        * @param bool $toVariant
-        *
-        * @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, specials:
         *    - ommiting roman numbers
index c3e146a..9cb0166 100644 (file)
        "talkpagelinktext": "Besprekings",
        "specialpage": "Spesiale bladsy",
        "personaltools": "Persoonlike gereedskap",
-       "postcomment": "Nuwe opskrif",
        "articlepage": "Lees artikel",
        "talk": "Bespreking",
        "views": "Weergawes",
        "externaldberror": "'n Databasisfout het tydens aanmelding voorgekom of u het nie toestemming om u eksterne rekening op te dateer nie.",
        "login": "Meld aan",
        "nav-login-createaccount": "Meld aan / registreer",
-       "loginprompt": "U blaaier moet koekies toelaat om op {{SITENAME}} te kan aanmeld.",
        "userlogin": "Meld aan / registreer",
        "userloginnocreate": "Meld aan",
        "logout": "Teken uit",
        "powersearch-togglelabel": "Kies:",
        "powersearch-toggleall": "Alle",
        "powersearch-togglenone": "Geen",
+       "powersearch-remember": "Onthou keuse vir toekomstige soekopdragte",
        "search-external": "Eksterne soektog",
        "searchdisabled": "{{SITENAME}} se soekfunksie is tans afgeskakel ter wille van werkverrigting. Gebruik gerus intussen Google of Yahoo! Let daarop dat hulle indekse van die {{SITENAME}}-inhoud verouderd mag wees.",
        "search-error": "'n Fout het tydens die soektog voorgekom: $1",
        "preferences": "Voorkeure",
        "mypreferences": "Voorkeure",
        "prefs-edits": "Aantal wysigings:",
+       "prefsnologintext2": "U moet $1 om voorkeure te stel.",
        "prefs-skin": "Omslag",
        "skin-preview": "Voorskou",
        "datedefault": "Geen voorkeur",
        "license-nopreview": "(Voorskou nie beskikbaar)",
        "upload_source_url": " ('n geldige, publiek toeganklike URL)",
        "upload_source_file": " ('n lêer op u rekenaar)",
+       "listfiles-delete": "skrap",
        "listfiles-summary": "Hierdie spesiale bladsy wys al die opgelaaide lêers.\nDie nuutste lêers word heel bo vertoon.\nKliek op die opskrifte om die tabel te hersorteer.",
        "listfiles_search_for": "Soek vir medianaam:",
        "imgfile": "lêer",
        "download": "laai af",
        "unwatchedpages": "Bladsye wat nie dopgehou word nie",
        "listredirects": "Lys aansture",
+       "listduplicatedfiles": "Lys van leërs met duplikate",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] het [[$3|{{PLURAL:$2|'n duplikaat|$2 duplikate}}]].",
        "unusedtemplates": "Ongebruikte sjablone",
        "unusedtemplatestext": "Hierdie blad lys alle bladsye in die {{ns:template}}-naamruimte wat nêrens in 'n ander blad ingesluit word nie. Onthou om ook ander skakels na die sjablone na te gaan voor verwydering.",
        "unusedtemplateswlh": "ander skakels",
        "watchlist-details": "{{PLURAL:$1|$1 bladsy|$1 bladsye}} in u dophoulys, besprekingsbladsye uitgesluit.",
        "wlheader-enotif": "E-pos kennisgewings is aangeskakel.",
        "wlheader-showupdated": "Bladsye wat verander is sedert u hulle laas besoek het word in '''vetdruk''' uitgewys.",
+       "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",
        "watching": "Plaas op dophoulys...",
        "autosumm-replace": "Vervang bladsyinhoud met '$1'",
        "autoredircomment": "Stuur aan na [[$1]]",
        "autosumm-new": "Nuwe bladsy geskep met '$1'",
+       "autosumm-newblank": "Leë bladsy geskep",
        "size-bytes": "$1 G",
        "size-kilobytes": "$1 KG",
        "size-megabytes": "$1 MG",
        "duplicate-defaultsort": "Waarskuwing: Die standaardsortering \"$2\" kry voorrang voor die sortering \"$1\".",
        "version": "Weergawe",
        "version-extensions": "Uitbreidings geïnstalleer",
+       "version-skins": "Omslae",
        "version-specialpages": "Spesiale bladsye",
        "version-parserhooks": "Ontlederhoeke",
        "version-variables": "Veranderlikes",
        "version-antispam": "Spam-voorkoming",
-       "version-skins": "Omslae",
        "version-other": "Ander",
        "version-mediahandlers": "Mediaverwerkers",
        "version-hooks": "Hoeke",
        "version-hook-name": "Hoek naam",
        "version-hook-subscribedby": "Gebruik deur",
        "version-version": "(Weergawe $1)",
+       "version-no-ext-name": "[geen naam]",
        "version-license": "MediaWiki se lisensie",
        "version-ext-license": "Lisensie",
        "version-ext-colheader-name": "Uitbreiding",
+       "version-skin-colheader-name": "Omslag",
        "version-ext-colheader-version": "Weergawe",
        "version-ext-colheader-license": "Lisensie",
        "version-ext-colheader-description": "Beskrywing",
        "expand_templates_remove_nowiki": "Onderdruk <nowiki> etikette in die resultaat",
        "expand_templates_generate_xml": "Wys XML-ontledingsboom",
        "expand_templates_generate_rawhtml": "Wys rou HTML",
-       "expand_templates_preview": "Voorskou"
+       "expand_templates_preview": "Voorskou",
+       "pagelang-name": "Bladsy",
+       "pagelang-language": "Taal",
+       "pagelang-select-lang": "Kies taal"
 }
index 8070e2d..9491bd3 100644 (file)
        "license": "ترخيص:",
        "license-header": "ترخيص",
        "nolicense": "غير محدد",
+       "licenses-edit": "عدل خيارات الترخيص",
        "license-nopreview": "(العرض المسبق غير متوفر)",
        "upload_source_url": "  (مسار صحيح، يمكن الوصول إليه)",
        "upload_source_file": " (ملف على حاسوبك)",
        "watchlist-details": "{{PLURAL:$1||صفحة واحدة|صفحتان|$1 صفحات|$1 صفحة}} في قائمة مراقبتك، دون اعتبار صفحات النقاش صفحات منفصلة.",
        "wlheader-enotif": "الإخطار بالبريد الإلكتروني مُفعّل.",
        "wlheader-showupdated": "الصفحات التي تم تحريرها بعد مطالعتك إياها آخر مرة عناوينها بالخط '''الغليظ'''",
-       "wlnote2": "فيما يلي تعرض التعديلات التي أجريت في آخر {{PLURAL:$1|ساعة|ساعتين|<strong>$1</strong> ساعات|<strong>$1</strong> ساعة}}، وذلك اعتبارا من $2، $3.",
+       "wlnote": "بالأسفل {{PLURAL:$1|لا توجد تغييرات|التغيير الأخير|آخر تغييرين|آخر '''$1''' تغييرات|آخر '''$1''' تغييرا|آخر '''$1''' تغيير}} في {{PLURAL:$2||'''الساعة''' الماضية|'''الساعتين''' الماضيتين|ال'''$2''' ساعات الماضية|ال'''$2''' ساعة الماضية}} وفقاً ل$3، $4.",
        "wlshowlast": "عرض آخر $1 ساعات $2 أيام $3",
        "watchlist-options": "خيارات قائمة المراقبة",
        "watching": "يراقب...",
        "version-hook-name": "اسم الخطاف",
        "version-hook-subscribedby": "يستخدم بواسطة",
        "version-version": "(نسخة $1)",
+       "version-no-ext-name": "[لا اسم]",
        "version-svn-revision": "ن$1",
        "version-license": "ترخيص ميدياويكي",
        "version-ext-license": "ترخيص",
        "version-ext-colheader-name": "امتداد",
+       "version-skin-colheader-name": "واجهة",
        "version-ext-colheader-version": "نسخة",
        "version-ext-colheader-license": "ترخيص",
        "version-ext-colheader-description": "وصف",
        "expand_templates_generate_xml": "اعرض شجرة XML parse",
        "expand_templates_generate_rawhtml": "أظهر خام HTML",
        "expand_templates_preview": "عرض مسبق",
-       "pagelang-name": "صفحة"
+       "pagelanguage": "اختيار لغة الصفحة",
+       "pagelang-name": "صفحة",
+       "pagelang-language": "اللغة",
+       "pagelang-use-default": "استخدام اللغة الافتراضية",
+       "pagelang-select-lang": "اختر اللغة",
+       "right-pagelang": "تغيير لغة الصفحة",
+       "action-pagelang": "تغيير لغة الصفحة",
+       "log-name-pagelang": "تغيير سجل الصفحة"
 }
index f78a9e4..9b12248 100644 (file)
@@ -24,7 +24,7 @@
        "tog-previewontop": "ورّي نضرة قبليّة تاع واش يصرا، فوق الجيهة تاع التبدال",
        "tog-previewonfirst": "بين شوفه-قبليه مع اول تبديله",
        "tog-enotifwatchlistpages": "ابحت لي إيمال كي تتبدّل صفحة ولا فيشي من الـليستة تاع الـتتباع تاعي",
-       "tog-enotifusertalkpages": "ابعثÙ\84Ù\8a Ø¨Ø±Ù\8aÙ\87 Ù\83Ù\84 Ù\85ا ØªØ¨Ø¯Ù\84ت Ø¨Ø§Ø¬Øª Ù\86Ù\82اش ديالي",
+       "tog-enotifusertalkpages": "ابعثÙ\84Ù\8a Ø¨Ø±Ù\8aÙ\91Ø© Ù\83Ù\84Ù\91 Ù\85ا ØªØ¨Ø¯Ù\91Ù\84ت Ø¨Ø§Ø¬ØªÙ° Ø§Ù\84تÙ\82رعÙ\8aج ديالي",
        "tog-enotifminoredits": "ابعت لي بريه حتا يلا كانت تبدالات صغيرة فلباجات و الـفيشيّات",
        "tog-enotifrevealaddr": "بين لادريستي إلكترونيك في براوات الاعلام",
        "tog-shownumberswatching": "بين شحال كاين من مستعمل يتبع الباجه",
        "moredotdotdot": "كتر...",
        "morenotlisted": "هاد الليستة ما راهيش مكمولة",
        "mypage": "باجه",
-       "mytalk": "نقاش",
+       "mytalk": "تقرعيج",
        "anontalk": "تناقش على الـ ip هادي",
        "navigation": "تبحار",
        "and": "&#32;و",
        "no-null-revision": "ما يمكنش تخلاق مراجعة جديدة خاوية لل باجة \"$1\".",
        "badtitle": "عنوان عيان",
        "badtitletext": "عنوان الباجه المطلوب إما ماشي صحيح والا فارغ، وبالاك الوصيل بين اللغات والا بين البروجيات ماشي صحيح.\nبالاك فيه حروف ما تصلحش  باس يستعملوها فالعناوين.",
+       "perfcached": "الموطايات هادي راهي مخبّية و بالاك تاني يكون فات عليها الوقت. {{PLURAL:$1||ناتج واحد|زوج نواتج|$1 نواتج|$1 ناتج}} على الكتَر {{PLURAL:$1||مخبّي|مخبّيين}}.",
        "viewsource": "شوف الاصل",
        "yourname": "اسم المستخدم:",
        "yourpassword": "كلمة السر:",
        "sp-contributions-blocklog": "ريجيسترالمنع",
        "sp-contributions-uploads": "مرفوعات",
        "sp-contributions-logs": "ريجيسترات",
-       "sp-contributions-talk": "نقاش",
+       "sp-contributions-talk": "تقرعيج",
        "sp-contributions-search": "تفتاش المشاركات",
        "sp-contributions-username": "عنوان أيبي والال اسم مستخدم:",
        "sp-contributions-toponly": "ما تورّي غير المشاركات التوالا تاع المقالات",
        "tooltip-pt-mycontris": "ليسته نتع مساهماتك",
        "tooltip-pt-login": "مادابيك تسجل الدخول تاعك، بصّح ماشي ملزوم عليك",
        "tooltip-pt-logout": "سجل خروج",
-       "tooltip-ca-talk": "نقاش على باجت المحتوى",
+       "tooltip-ca-talk": "تقرعيج على باجتٰ المحتاوا",
        "tooltip-ca-edit": "تنجم تحرر هاذ الباجه ،ماذابيك تستعمل قفله المراجعه قبل ما تحفظ",
        "tooltip-ca-addsection": "ابدأ طرف جديد",
        "tooltip-ca-viewsource": "هاذ الباجه محميه. و شنو تقدرو تشوفو الأصلي نتاعها",
index b514100..6996974 100644 (file)
@@ -9,7 +9,8 @@
                        "Shirayuki",
                        "Xuacu",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Fitoschido"
                ]
        },
        "tog-underline": "Sorrayar enllaces:",
        "policy-url": "Project:Polítiques",
        "portal": "Portal de la comunidá",
        "portal-url": "Project:Portal de la comunidá",
-       "privacy": "Política de proteición de datos",
-       "privacypage": "Project:Política de proteición de datos",
+       "privacy": "Política de privacidá",
+       "privacypage": "Project:Política de privacidá",
        "badaccess": "Fallu de permisos",
        "badaccess-group0": "Nun tienes permisu pa executar l'aición solicitada.",
        "badaccess-groups": "L'aición solicitada ta acutada pa usuarios {{PLURAL:$2|del grupu|d'unu d'estos grupos}}: $1.",
        "accmailtext": "Unvióse a $2 una contraseña xenerada al debalu pal usuariu [[User talk:$1|$1]]. Pue camudase na páxina ''[[Special:ChangePassword|camudar contraseña]]'' depués d'aniciar sesión.",
        "newarticle": "(Nuevu)",
        "newarticletext": "Siguisti un enllaz a un artículu qu'inda nun esiste.\nPa crear la páxina, empecipia a escribir nel cuadru d'embaxo (mira la [$1 páxina d'ayuda] pa más información).\nSi llegasti equí por enquivocu, calca nel botón '''atrás''' del to restolador.",
-       "anontalkpagetext": "----\n''Esta ye la páxina d'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.''\nPoro, tenemos qu'usar la direición numbérica IP pa identificalu/la.\nEsa IP pue tar compartida por varios usuarios.\nSi ye un usuariu anónimu y cree qu'hai comentarios irrelevantes empobinaos a vusté, por favor, [[Special:UserLogin/signup|cree una cuenta]] o [[Special:UserLogin/signup|anicie sesión]] pa torgar futures confusiones con otros usuarios anónimos.",
-       "noarticletext": "Nestos momentos nun hai testu nesta páxina.\nPue [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n'otres páxines,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar esta páxina]</span>.",
+       "anontalkpagetext": "----\n''Esta ye la páxina d'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.''\nPola mor d'ello ha usase la direición numbérica IP pa identificalu/la.\nTala IP pue compartise por varios usuarios.\nSi yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:UserLogin/signup|crea una cuenta]] o [[Special:UserLogin/signup|identifícate]] pa torgar futures confusiones con otros usuarios anónimos.",
+       "noarticletext": "Nestos momentos nun hai testu nesta páxina.\nPues [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n'otres páxines,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar esta páxina]</span>.",
        "noarticletext-nopermission": "Nestos momentos nun hai testu nesta páxina.\nPue [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n'otres páxines o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos]</span>, pero nun tiene permisu pa crear esta páxina.",
        "missing-revision": "La revisión #$1 de la páxina llamada \"{{FULLPAGENAME}}\" nun esiste.\n\nDe vezu la causa d'esto ye siguir un enllaz antiguu del historial a una páxina que se desanició.\nSe puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistru de desanicios].",
        "userpage-userdoesnotexist": "La cuenta d'usuariu «$1» nun ta rexistrada.\nPor favor comprueba si quies crear/editar esta páxina.",
        "revdelete-text-text": "Les revisiones desaniciaes inda apaecerán nel historial de la páxina, pero partes del conteníu nun sedrán accesibles al públicu.",
        "revdelete-text-file": "Les versiones del ficheru desaniciaes inda apaecerán nel historial del ficheru, pero partes del conteníu nun sedrán accesibles al públicu.",
        "logdelete-text": "Los socesos del rexistru desaniciaos inda apaecerán nos rexistros, pero partes del conteníu nun sedrán accesibles al públicu.",
-       "revdelete-text-others": "Otros alministradores de {{SITENAME}} inda tendrán accesu al conteníu anubríu y puen desfacer l'anubrimientu con esta mesma interfaz, mentanto nun se configuren otres torgues más.",
+       "revdelete-text-others": "Otros alministradores inda tendrán accesu al conteníu anubríu y puen desfacer el desaniciu, mentanto nun se configuren otres torgues más.",
        "revdelete-confirm": "Confirma que quies facer esto, qu'entiendes les consecuencies, y que vas facer esto d'alcuerdo [[{{MediaWiki:Policy-url}}|cola política]].",
        "revdelete-suppress-text": "La supresión '''namái''' tendría d'usase nos casos darréu:\n* Información que pudiere ser bilordiosa\n* Información personal inapropiada\n*: ''direiciones de llares y númberos de teléfonu, númberos d'identidá nacional, etc.''",
        "revdelete-legend": "Establecer torgues de visibilidá",
        "watchlist-details": "{{PLURAL:$1|$1 páxina|$1 páxines}} na to llista de siguimientu, ensin cuntar aparte les páxines d'alderique.",
        "wlheader-enotif": "La notificación per corréu electrónicu ta activada.",
        "wlheader-showupdated": "Les páxines que camudaron dende que les visitasti anteriormente amuesense en '''negrina'''",
-       "wlnote2": "Abaxo tan los cambios {{PLURAL:$1|na cabera hora|nes caberes <strong>$1</strong> hores}}, el día $2 a les $3.",
+       "wlnote": "Abaxo {{PLURAL:$1|tá'l caberu cambiu|tan 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 siguimientu",
        "watching": "Vixilando...",
        "protectlogpage": "Rexistru de proteiciones",
        "protectlogtext": "Darréu ta un rexistru de les protecciones de páxines.\nConsulta la [[Special:ProtectedPages|llista de páxines protexíes]] pa ver les proteiciones actives nestos momentos.",
        "protectedarticle": "protexó «[[$1]]»",
-       "modifiedarticleprotection": "camudó'l nivel de proteición de \"[[$1]]\"",
+       "modifiedarticleprotection": "camudó’l nivel de proteición de «[[$1]]»",
        "unprotectedarticle": "quitó-y la protección a \"[[$1]]\"",
-       "movedarticleprotection": "treslladó los parámetros de proteición dende \"[[$2]]\" 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\"",
+       "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.",
index 1669b9d..b3cf3a2 100644 (file)
@@ -24,7 +24,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Arystanbek",
-                       "Dağlı95"
+                       "Dağlı95",
+                       "Sayginer"
                ]
        },
        "tog-underline": "Keçidlərin altını xətlə:",
        "externaldberror": "Verilənlər bazasının doğruluğunu yoxlamada xəta baş verib və yaxud sizin xarici istifadəçi qeydiyyatını yeniləmək hüququnuz yoxdur.",
        "login": "Daxil ol",
        "nav-login-createaccount": "Daxil ol / hesab yarat",
-       "loginprompt": "{{SITENAME}} saytına daxil olmaq üçün \"veb kökələrinin\" (cookies) istifadəsinə icazə verilməlidir.",
        "userlogin": "Daxil ol və ya istifadəçi yarat",
        "userloginnocreate": "Daxil ol",
        "logout": "Çıxış",
        "noemailcreate": "Düzgün e-poçt ünvanı qeyd etməlisiniz",
        "passwordsent": "Yeni parol \"$1\" üçün qeydiyyata alınan e-poçt ünvanına göndərilmişdir.\nXahiş edirik, e-məktubu aldıqdan sonra yenidən daxil olasınız.",
        "blocked-mailpassword": "İP ünvanınız bloklu olduğuna görə, yeni parol göndərmə mümkün deyil.",
-       "eauthentsent": "Göstərilən bu e-poçt ünvanına məktub göndərildi. \nGələcəkdə e-poçt almaq üçün,bu e-poçtun sizə aid olması haqqındakı qaydalarla tanış olun.",
+       "eauthentsent": "Göstərilən e-poçt ünvanına məktub göndərildi. \nGələcəkdə həmin ünvana e-məktub ala bilmək üçün, ünvanın sizə aid olmasının təsdiq edilməsi ilə bağlı məktubda verilən göstərişlərə riayət etməlisiniz.",
        "throttled-mailpassword": "Bir parol sıfırlama e-poçtu son {{PLURAL:$1|bir saat|$1 saat}} içində zatən göndərildi. Xidməti pis niyyətlə istifadə etməyi önləmək üçün, hər {{PLURAL:$1|bir saatda|$1 saatda}} sadəcə bir parol sıfırlama e-poçtu göndəriləcəkdir.",
        "mailerror": "Məktub göndərmə xətası: $1",
        "acct_creation_throttle_hit": "Sizin IP ünvanınızdan bu viki-də son bir gün ərzində {{PLURAL:$1|1 hesab|$1 hesab}} açılmışdır. Bu bir gün ərzində icazə verilən maksimum say olduğu üçün, indiki anda daha çox hesab aça bilməzsiniz.",
        "right-deletedhistory": "silinmiş mətnə daxil olmadan silinmiş səhifələrin tarixçələrinə baxma",
        "right-browsearchive": "Silinmiş səhifələri axtar",
        "right-undelete": "Silinmiş səhifələrin bərpası",
-       "right-suppressrevision": "İdarəçilərdən gizlənmiş dəyişikliklərə bax və geri yüklə",
+       "right-suppressrevision": "Səhifələrin gizli versiyalarına bax, gizlə və göstər",
        "right-suppressionlog": "Şəxsi qeydlərə bax",
        "right-block": "Digər istifadəçilərin redaktə etməsinə qadağa qoy",
        "right-blockemail": "İstifadəçinin e-poçt göndərməsinə qadağa qoy",
        "watchlist-details": "İzləmə siyahınızda, müzakirə səhifələrini çıxmaq şərtilə, {{PLURAL:$1|$1 səhifə|$1 səhifə}} var.",
        "wlheader-enotif": " E-məktubla bildiriş aktivdir.",
        "wlheader-showupdated": "Son ziyarətinizdən sonra edilən dəyişikliklər '''qalın şriftlərlə''' göstərilmişdir.",
+       "wlnote": "Aşağıdakı {{PLURAL:$1|'''$1''' dəyişiklik|'''$1''' dəyişiklik}} son {{PLURAL:$2|saatda|'''$2''' saatda}} edilmişdir.",
        "wlshowlast": "Bunları göstər: son $1 saatı $2 günü $3",
        "watchlist-options": "İzləmə siyahısının nizamlamaları",
        "watching": "İzlənilir...",
        "deletereasonotherlist": "Digər səbəb",
        "deletereason-dropdown": "*Əsas silmə səbəbi\n** Müəllif istəyi\n** Müəllif hüququ pozuntusu\n** Vandalizm",
        "delete-edit-reasonlist": "Silmə səbəblərinin redaktəsi",
-       "rollback": "Əvvəlki versiya",
+       "rollback": "əvvəlki halına qaytar",
        "rollback_short": "əvvəlki halına qaytar",
        "rollbacklink": "əvvəlki halına qaytar",
+       "rollbacklinkcount": "$1 {{PLURAL:$1|dəyişikliyi|dəyişikliyi}} geri qaytar",
        "rollbackfailed": "Geri qaytarma uğursuzdur",
        "cantrollback": "Redaktə geri qaytarıla bilməz; axırıncı redaktə səhifədə olan yeganə fəaliyyətdir.",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|Müzakirə]]) tərəfindən edilmiş dəyişikliklər [[User:$1|$1]] tərəfindən edilmiş dəyişikliklərə qaytarıldı.",
        "sp-contributions-search": "Fəaliyyətləri axtar",
        "sp-contributions-username": "IP-ünvanı və ya istifadəçi adı:",
        "sp-contributions-toponly": "Son redaktə olan dəyişiklikləri göstər",
+       "sp-contributions-newonly": "Yalnız yeni səhifə yaradılan dəyişiklikləri göstər",
        "sp-contributions-submit": "Axtar",
        "whatlinkshere": "Bu səhifəyə bağlantılar",
        "whatlinkshere-title": "\"$1\" məqaləsinə keçid verən səhifələr",
        "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-move-move": "$1 $3 səhifəsinin adını $4 olaraq {{GENDER:$1|dəyişdi|dəyişdi}}.",
+       "logentry-move-move_redir": "$1 $3 səhifəsinin adını yönləndirmənin əksinə dəyişərək, $4 {{GENDER:$2|adlandırdı}}",
        "logentry-newusers-newusers": "$1istifadəçi hesabını yaratdı",
        "logentry-newusers-create": "$1 istifadəçi hesabı yaratdı",
        "logentry-newusers-create2": "$1 $3 üçün istifadəçi hesabı yaratdı",
index 4f28db5..4e2de7b 100644 (file)
@@ -24,7 +24,7 @@
        "tog-newpageshidepatrolled": "Яңы биттәр исемлегендә тикшерелгән үҙгәртеүҙәрҙе йәшер",
        "tog-extendwatchlist": "Барлыҡ үҙгәртеүҙәрҙе үҙ эсенә алған, киңәйтелгән күҙәтеү исемлеге",
        "tog-usenewrc": "Һуңғы төҙәтеүҙәр һәм күҙәтеү исемлегендәге үҙгәрештәрҙе төркөмдәргә бүлергә",
-       "tog-numberheadings": "Башисемдәрҙе автоматик рәүештә номерлаe",
+       "tog-numberheadings": "Башисемдәрҙе автоматик рәүештә номерланһын",
        "tog-showtoolbar": "Мөхәррирләгән ваҡытта өҫкө ҡоралдар панелен күрһәтергә (JavaScript кәрәк)",
        "tog-editondblclick": "Биттәрҙе ике сиртеү менән мөхәррирләргә",
        "tog-editsectiononrightclick": "Бүлектәрҙе исемдәренә төрткөнөң уң яғына сиртеп үҙгәртергә",
        "october-date": "Октябрь $1",
        "november-date": "Ноябрь $1",
        "december-date": "Сентябрь $1",
-       "pagecategories": "{{PLURAL:$1|1=Категория|Категория}}",
+       "pagecategories": "{{PLURAL:$1|1=Категория|Категориялар}}",
        "category_header": "«$1» категорияһындағы биттәр",
        "subcategories": "Эске категориялар",
        "category-media-header": "«$1» категорияһындағы файлдар",
        "category-empty": "\"Был категория әлегә буш.\"",
-       "hidden-categories": "{{PLURAL:$1|1=Йәшерен категория|Йәшерен категориялар}}",
+       "hidden-categories": "{{PLURAL:$1|Йәшерен категория|Йәшерен категориялар}}",
        "hidden-category-category": "Йәшерен категориялар",
-       "category-subcat-count": "{{PLURAL:$2|1=Был категорияла тик киләһе эске категория ғына бар.|$2 эске категорияның $1 эске категорияһы күрһәтелгән.}}",
-       "category-subcat-count-limited": "Был категорияла {{PLURAL:$1|$1 эске категория}} бар.",
+       "category-subcat-count": "{{PLURAL:$2|Был категорияла тик киләһе эске категория ғына бар.|Барлығы $2 категориянан, был категорияла киләһе  {{PLURAL:$1|эске категория|$1 эске категория}} күрһәтелә.}}",
+       "category-subcat-count-limited": "Был категорияға киләһе {{PLURAL:$1|эске категория|$1 эске категория}} ингән.",
        "category-article-count": "{{PLURAL:$2|1=Был категорияла бер генә бит бар.|Категориялағы $2 биттең $1 бите күрһәтелгән.}}",
        "category-article-count-limited": "Был категорияла {{PLURAL:$1|$1 бит}} бар.",
        "category-file-count": "{{PLURAL:$2|Был категорияла бер генә файл бар.|Категориялағы $2 файлдың {{PLURAL:$1|$1 файлы күрһәтелгән}}.}}",
-       "category-file-count-limited": "Ð\91Ñ\83 категорияла {{PLURAL:$1|$1 файл}} бар.",
+       "category-file-count-limited": "Ð\91Ñ\8bл категорияла {{PLURAL:$1|$1 файл}} бар.",
        "listingcontinuesabbrev": "(дауамы)",
        "index-category": "Индексланған биттәр",
        "noindex-category": "Индексланмаған биттәр",
        "talkpagelinktext": "әңг.",
        "specialpage": "Ярҙамсы бит",
        "personaltools": "Шәхси ҡоралдар",
-       "postcomment": "Яңы бүлек",
        "articlepage": "Мәҡәләне ҡарап сығырға",
        "talk": "Әңгәмә",
        "views": "Ҡарауҙар",
        "invalidtitle-knownnamespace": "\"$2\" исем арауығы һәм \"$3\"  тексты исем өсөн ярамай",
        "invalidtitle-unknownnamespace": "\"$2\" тексты һәм \"$1\" арауыҡ өсөн билдәһеҙ номерлы исем ярамай",
        "exception-nologin": "Танылмағанһығыҙ",
-       "exception-nologin-text": "Ð\91Ñ\8bл Ð±Ð¸Ñ\82Ñ\82е Ò¡Ð°Ñ\80аÑ\80 Ð¹Ó\99ки Ò»Ð¾Ñ\80аÑ\82Ñ\8bлÒ\93ан Ò\93Ó\99мÓ\99лде Ð±Ð°Ñ\88ҡаÑ\80Ñ\8bÑ\80 Ó©Ñ\81өн Ñ\81иÑ\81Ñ\82емала Ñ\82анÑ\8bлÑ\8bÑ\83 кәрәк.",
+       "exception-nologin-text": "Ð\91Ñ\8bл Ð±Ð¸Ñ\82Ñ\82е Ò¡Ð°Ñ\80аÑ\83 Ð¹Ó\99ки Ò»Ð¾Ñ\80аÑ\82Ñ\8bлÒ\93ан Ò\93Ó\99мÓ\99лде Ð±Ð°Ñ\88ҡаÑ\80Ñ\8bÑ\83 Ó©Ñ\81өн Ñ\81иÑ\81Ñ\82емала [[Special:Userlogin|Ñ\82анÑ\8bлÑ\8bÑ\80Ò\93а]] кәрәк.",
        "virus-badscanner": "Көйләү хатаһы: Билдәһеҙ вирустар сканеры: ''$1''",
        "virus-scanfailed": "сканлау хатаһы ($1 коды)",
        "virus-unknownscanner": "беленмәгән антивирус:",
        "externaldberror": "Тышҡы мәғлүмәт базаһы менән танылғанда хата барлыҡҡа килде йәки тышҡы үҙ көйләүҙәрегеҙҙе үҙгәртер өсөн хоҡуҡтарығыҙ етәрле түгел.",
        "login": "Танылыу",
        "nav-login-createaccount": "Танылыу йәки теркәлеү",
-       "loginprompt": "{{SITENAME}} проектына кереү өсөн «cookies» рөхсәт ителгән булырға тейеш.",
        "userlogin": "Танылыу йәки теркәлеү",
        "userloginnocreate": "Танылыу",
        "logout": "Тамамлау",
        "nologinlink": "Иҫәп яҙыуын булдырырға",
        "createaccount": "Яңы ҡатнашыусыны теркәү",
        "gotaccount": "Әгәр Һеҙ теркәлеү үткән булһағыҙ? '''$1'''.",
-       "gotaccountlink": "Үҙегеҙ менән таныштырығыҙ",
+       "gotaccountlink": "Танылыу",
        "userlogin-resetlink": "Танылыу мәғлүмәттәрен оноттоғоҙмо?",
        "userlogin-resetpassword-link": "Серһүҙҙе ҡабул итмәү",
        "userlogin-loggedin": " Һеҙ {{GENDER:$1|$1}} булараҡ индегеҙ инде. Башҡа файҙаланыусы булып инер өсөн аҫтағы ҡалыпты ҡулланығыҙ.",
        "password-login-forbidden": "Был ҡатнашыусы исемен һәм серһүҙҙе ҡулланыу тыйылған",
        "mailmypassword": "Яңы серһүҙ ебәрергә",
        "passwordremindertitle": "{{SITENAME}} өсөн яңы ваҡытлыса серһүҙ",
-       "passwordremindertext": "Кемдер (бәлки, һеҙ, IP-адресы: $1) {{SITENAME}} ($4) өсөн яңы серһүҙ һоратты. $2 ҡатнашыусыһы өсөн ваҡытлыса яңы серһүҙ яһалды: $3. Әгәр был һеҙ булһағыҙ, системага керегеҙ һәм серһүҙ алмаштырығыҙ. Яңы серһүҙ $5 {{PLURAL:$5|көн}} ғәмәлдә буласаҡ.\n\nӘгәр һеҙ серһүҙҙе алмаштырыуҙы һоратмаған йәки онотоп кире иҫләгән булһағыҙ һәм үҙгәртергә теләмәһәгеҙ, был хәбәргә иғтибар итмәгеҙ һәм элекке серһүҙегеҙҙе ҡулланыуығыҙҙы дауам итегеҙ.",
+       "passwordremindertext": "Кемдер (бәлки, һеҙ, IP-адресы: $1) {{SITENAME}} ($4) өсөн яңы серһүҙ һоратты. $2 ҡатнашыусыһы өсөн ваҡытлыса яңы серһүҙ яһалды: $3. Әгәр был һеҙ булһағыҙ, системага керегеҙ һәм серһүҙ алмаштырығыҙ. Яңы серһүҙ $5 {{PLURAL:$5|көн}} ғәмәлдә буласаҡ.\n\nӘгәр һеҙ серһүҙҙе алмаштырыуҙы һоратмаған йәки онотоп кире иҫләгән булһағыҙ һәм үҙгәртергә теләмәһәгеҙ, был хәбәргә иғтибар итмәгеҙ һәм элекке серһүҙҙе ҡулланыуҙы дауам итегеҙ.",
        "noemail": "$1 исемле ҡулланыусы өсөн электрон почта адресы белдерелмәгән.",
        "noemailcreate": "Дөрөҫ электрон почта адресы күрһәтеү кәрәк",
        "passwordsent": "Яңы серһүҙ $1 исемле ҡатнашыусының электрон почта адресына ебәрелде.\n\nЗинһар, серһүҙҙе алғас, системаға яңынан керегеҙ.",
        "loginlanguagelabel": "Тел: $1",
        "suspicious-userlogout": "Һеҙҙең сеансты тамамлау тураһында һорауығыҙ кире ҡағылды, сөнки ул төҙөк булмаған браузер йәки кэшлаусы прокси тарафынан ебәрелгән һорауға оҡшаған.",
        "createacct-another-realname-tip": "Ысын исемегеҙ (мотлаҡ түгел).\nУны яҙып ҡуйһағыҙ, ул биткә кем төҙәтеү индергәнен күрһәтеү өсөн ҡулланыласаҡ.",
+       "pt-login": "Танылыу",
+       "pt-login-button": "Танылыу",
+       "pt-userlogout": "Тамамлау",
        "php-mail-error-unknown": "PHP-ның mail() функцияһында билдәһеҙ хата",
        "user-mail-no-addy": "Электрон почта адресы булмайынса электрон хәбәр ебәреп ҡараны",
        "user-mail-no-body": "Буш йә мәғәнәһеҙ йөкмәткеле ҡыҫҡа электрон хат ебәрергә тырышҡан.",
        "resetpass-wrong-oldpass": "Хаталы ваҡытлыса йәки ағымдағы серһүҙ.\nҺеҙ, бәлки, серһүҙегеҙҙе алмаштырғанһығыҙ йәки яңы серһүҙ һоратҡанһығыҙ.",
        "resetpass-temp-password": "Ваҡытлыса серһүҙ",
        "resetpass-abort-generic": "Серһүҙҙе үҙгәртеү киңәйеү тарафынан өҙөлдө.",
+       "resetpass-expired": "Һеҙҙең серһүҙҙең ғәмәл ваҡыты үткән. Зинһар, системала танылыу өсөн яңы серҙһүҙ ҡуйығыҙ.",
        "passwordreset": "Серһүҙҙе ташлатыу",
        "passwordreset-text-one": "Серһүҙегеҙҙе ташлар өсөн ош ҡалыпты тултырығыҙ.",
        "passwordreset-text-many": "{{PLURAL:$1|Серһүҙҙе ташлар өсөн яландарҙың береһен тултырығыҙ.}}",
        "accmailtext": "[[User talk:$1|$1]] өсөн осраҡлы яһалған серһүҙ $2 адресына ебәрелде.\n\nТанылғандан һуң был иҫәп яҙмаһы өсөн серһүҙҙе ''[[Special:ChangePassword|серһүҙҙе үҙгәртеү өсөн махсус биттә үҙгәртә алаһығыҙ]]''.",
        "newarticle": "(Яңы)",
        "newarticletext": "Һеҙ һылтанма буйынса әлегә яһалмаған биткә күстегеҙ.\nЯңы бит яһар өсөн аҫтағы тәҙрәгә текст керетегеҙ (тулыраҡ мәғлүмәт өсөн [$1 ярҙам битен] ҡарағыҙ).\nӘгәр был биткә яңылыш килеп эләккән булһағыҙ, браузерығыҙҙың '''артҡа''' төймәһенә баҫығыҙ.",
-       "anontalkpagetext": "----''Был фекер алышыу бите, иҫәп яҙыуы булдырмаған йәки уны ҡулланмаған аноним ҡатнашыусының бите.\nШуның өсөн ҡулланыусыны таныу өсөн IP-адресы ҡулланыла.\nӘгәр һеҙ аноним ҡулланыусы булһағыҙ һәм һеҙгә ебәрелмәгән хәбәрҙәр алдым тиһәгеҙ (бер IP-адрес күп ҡулланыусы өсөн булырға мөмкин) һәм башҡа бындай аңлашылмаусанлыҡтар килеп сыҡмаһын өсөн, зинар, [[Special:UserLogin|системаға керегеҙ]] йәки [[Special:UserLogin/signup|теркәлегеҙ]].''",
+       "anontalkpagetext": "----\n<em>Был фекер алышыу бите, иҫәп яҙыуы булдырмаған йәки уны ҡулланмаған аноним ҡатнашыусының бите.</em>\nШуның өсөн ҡулланыусыны таныу өсөн IP-адресы ҡулланыла.\nӘгәр һеҙ аноним ҡулланыусы булһағыҙ һәм һеҙгә ебәрелмәгән хәбәрҙәр алдым тиһәгеҙ (бер IP-адрес күп ҡулланыусы өсөн булырға мөмкин) һәм башҡа бындай аңлашылмаусанлыҡтар килеп сыҡмаһын өсөн, зинар, [[Special:UserLogin|системаға керегеҙ]] йәки [[Special:UserLogin/signup|теркәлегеҙ]].",
        "noarticletext": "Хәҙерге ваҡытта был биттә текст юҡ.\nҺеҙ [[Special:Search/{{PAGENAME}}|был исемде башҡа биттәрҙә эҙләй]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тап килгән журнал яҙмаларын таба]\nйәки '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} бындай исемле яңы бит яһай]'''</span> алаһығыҙ.",
        "noarticletext-nopermission": "Хәҙерге ваҡытта был биттә текст юҡ.\nҺеҙ башҡа биттәрҙә [[Special:Search/{{PAGENAME}}|был исемде]] йәки\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналдағы яҙмаларҙы] эҙләй алаһығыҙ, тик һеҙҙең бит яһау хоҡуғығыҙ юҡ.</span>",
        "missing-revision": "\"{{FULLPAGENAME}}\" исемле биттең $1 номерлы өлгөһө юҡ.\n\nБыл хәл, ғәҙәттә, юйылған биткә яһалған һылтанманын ваҡыты үтеүенән барлыҡҡа килә.\nТулыраҡ мәғлүмәт өсөн ҡарағыҙ: [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} юйыу яҙмалары].",
        "revdelete-hide-text": "Биттең был версияһының текстын йәшерергә",
        "revdelete-hide-image": "Файл эстәлеген йәшерергә",
        "revdelete-hide-name": "Ғәмәлде һәм маҡсатын йәшерергә",
-       "revdelete-hide-comment": "Үҙгәртеү тасуирламаларын йәшерергә",
-       "revdelete-hide-user": "Мөхәррирләүсенең исемен/IP-адресын йәшерергә",
+       "revdelete-hide-comment": "Үҙгәртеүҙәр тасуирламаһы",
+       "revdelete-hide-user": "Мөхәррирләүсенең исеме/IP-адресы",
        "revdelete-hide-restricted": "Мәғлүмәттәрҙе хакимдәрҙән дә йәшерергә",
        "revdelete-radio-same": "(үҙгәртмәҫкә)",
-       "revdelete-radio-set": "Эйе",
-       "revdelete-radio-unset": "Юҡ",
+       "revdelete-radio-set": "Ð\99Ó\99Ñ\88еÑ\80ен",
+       "revdelete-radio-unset": "Ð\9aÒ¯Ñ\80енгÓ\99н",
        "revdelete-suppress": "Мәғлүмәттәрҙе шулай уҡ хакимдәрҙән дә йәшерергә",
        "revdelete-unsuppress": "Тергеҙелгән версияларҙан бар сикләүҙәрҙе алырға",
        "revdelete-log": "Сәбәп:",
-       "revdelete-submit": "Һайланған {{PLURAL:$1|1=версия|версиялар}} өсөн ҡулланырға",
+       "revdelete-submit": "Һайланған {{PLURAL:$1|версия|версиялар}} өсөн ҡулланырға",
        "revdelete-success": "'''Версия күренеүсәнлеге уңышлы үҙгәртелде.'''",
        "revdelete-failure": "'''Версия күренеүсәнлеген үҙгәртеп булмай:'''\n$1",
        "logdelete-success": "'''Яҙма күренеүсәнлеге үҙгәртелде.'''",
        "duplicate-defaultsort": "'''Иҫкәртеү:''' \"$2\" ғәҙәттәге тәпртипкә килтереү асҡысы элекке \"$1\" ғәҙәттәге тәртипкә килтереү асҡысын үҙгәртә.",
        "version": "MediaWiki өлгөһө",
        "version-extensions": "Ҡуйылған киңәйтеүҙәр",
+       "version-skins": "Күренештәр",
        "version-specialpages": "Махсус биттәр",
        "version-parserhooks": "Уҡыу ҡоралдары",
        "version-variables": "Үҙгәреүсән дәүмәлдәр",
        "version-antispam": "Спамға ҡаршы ҡорал",
-       "version-skins": "Күренештәр",
        "version-other": "Башҡалар",
        "version-mediahandlers": "Медиа эшкәртеүсе ҡоралдар",
        "version-hooks": "Эләктереп алыусылар",
index 52c7e41..f8947bb 100644 (file)
        "wantedcategories": "Bnutzde, ower néd åglégte Kategorien",
        "wantedpages": "Gwynschde Seiten",
        "wantedpages-badtitle": "Ungütiger Titel im Ergeewnis: $1",
-       "wantedfiles": "Fööhernde Daatein",
-       "wantedtemplates": "Fööhernde Vurlong",
+       "wantedfiles": "Datein, wo ma braucha",
+       "wantedtemplates": "Voalong, wo ma braucha",
        "mostlinked": "Haiffig valinkte Seiten",
        "mostlinkedcategories": "Haiffig brauchde Kategorien",
        "mostlinkedtemplates": "Haiffig brauchde Vurlong",
index 08a02a3..20218ac 100644 (file)
@@ -31,6 +31,7 @@
        "tog-watchdefault": "Дадаваць у мой сьпіс назіраньня старонкі і файлы, якія я {{GENDER:|рэдагаваў|рэдагавала}}",
        "tog-watchmoves": "Дадаваць у мой сьпіс назіраньня перанесеныя мною старонкі і файлы",
        "tog-watchdeletion": "Дадаваць у мой сьпіс назіраньня старонкі і файлы, якія я выдаляю",
+       "tog-watchrollback": "Дадаваць у мой сьпіс назіраньня старонкі, дзе я {{GENDER:|зрабіў|зрабіла}} адкат",
        "tog-minordefault": "Па змоўчаньні пазначаць усе мае праўкі дробнымі",
        "tog-previewontop": "Паказваць папярэдні прагляд старонкі над полем рэдагаваньня",
        "tog-previewonfirst": "Папярэдні прагляд пры першым рэдагаваньні",
        "preview": "Папярэдні прагляд",
        "showpreview": "Праглядзець",
        "showdiff": "Паказаць зьмены",
+       "blankarticle": "<strong>Папярэджаньне:</strong> вы ствараеце пустую старонку.\nКалі вы націсьніце «{{int:savearticle}}» яшчэ раз, старонка будзе створаная без аніякага зьместу.",
        "anoneditwarning": "'''Папярэджаньне:''' Вы не ўвайшлі ў сыстэму. Ваш IP-адрас будзе запісаны ў гісторыі гэтай старонкі.",
        "anonpreviewwarning": "''Вы не ўвайшлі ў сыстэму. Падчас захаваньня Ваш IP-адрас будзе дададзены ў гісторыю рэдагаваньняў старонкі.''",
        "missingsummary": "'''Напамін:''' Вы не пазначылі кароткае апісаньне зьменаў.\nКалі Вы націсьніце кнопку «Запісаць» яшчэ раз, Вашае рэдагаваньне будзе запісанае без апісаньня.",
        "rev-deleted-event": "(запіс з журнала падзеяў выдалены)",
        "rev-deleted-user-contribs": "[імя ўдзельніка альбо IP-адрас выдалены — рэдагаваньне схаванае з унёску]",
        "rev-deleted-text-permission": "Гэтая вэрсія старонкі была '''выдаленая'''.\nМагчыма, падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
+       "rev-suppressed-text-permission": "Гэтая вэрсія старонкі была <strong>схаваная</strong>.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].",
        "rev-deleted-text-unhide": "Гэтая вэрсія старонкі была '''выдаленая'''.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].\nВы можаце [$1 праглядзець гэтую вэрсію], калі жадаеце.",
        "rev-suppressed-text-unhide": "Гэтая вэрсія старонкі была '''схаваная'''.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].\nВы можаце [$1 праглядзець гэтую вэрсію], калі жадаеце.",
        "rev-deleted-text-view": "Гэтая вэрсія старонкі была '''выдаленая'''.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
        "revdelete-text-text": "Выдаленыя вэрсіі будуць па-ранейшаму бачныя ў гісторыі старонкі, але некаторыя часткі іх зьместу будуць недаступныя для ўдзельнікаў.",
        "revdelete-text-file": "Выдаленыя вэрсіі файла будуць па-ранейшаму бачныя ў гісторыі старонкі, але часткі іх зьместу будуць недаступныя для ўдзельнікаў.",
        "logdelete-text": "Выдаленыя падзеі ў журнале будуць па-ранейшаму даступныя ў журналах, але часткі іх зьместу будуць недаступныя ўдзельнікам.",
-       "revdelete-text-others": "Іншыя адмністратары {{GRAMMAR:родны|{{SITENAME}}}} па-ранейшаму будуць мець магчымасьць пабачыць і аднавіць схаваны зьмест праз гэты ж інтэрфэйс, калі ня будуць усталяваныя дадатковыя абмежаваньні.",
+       "revdelete-text-others": "Іншыя адмністратары па-ранейшаму будуць мець магчымасьць пабачыць і аднавіць схаваны зьмест, калі ня будуць усталяваныя дадатковыя абмежаваньні.",
        "revdelete-confirm": "Калі ласка, пацьвердзіце, што Вы сапраўды жадаеце зрабіць гэта, разумееце наступствы і робіце гэта ў адпаведнасьці з [[{{MediaWiki:Policy-url}}|правіламі]].",
        "revdelete-suppress-text": "Скрываньне можа выкарыстоўвацца '''толькі''' ў наступных выпадках:\n* патэнцыйна паклёпніцкая інфармацыя\n* раскрыцьцё асабістых зьвестак\n*: ''хатнія адрасы, тэлефонныя нумары, нумары пашпартоў і г. д.''",
        "revdelete-legend": "Усталяваць абмежаваньні бачнасьці",
        "right-deletedtext": "прагляд выдаленага тэксту і зьменаў паміж выдаленымі вэрсіямі старонак",
        "right-browsearchive": "пошук выдаленых старонак",
        "right-undelete": "аднаўленьне старонак",
-       "right-suppressrevision": "прагляд і аднаўленьне вэрсіяў, схаваных ад адміністратараў",
+       "right-suppressrevision": "праглядаць, хаваць і аднаўляць пэўныя вэрсіі старонак, зробленыя любым удзельнікам",
+       "right-viewsuppressed": "праглядаць вэрсіі старонак, схаваныя ад усіх удзельнікаў",
        "right-suppressionlog": "прагляд прыватных журналаў",
        "right-block": "блякаваньне іншых удзельнікаў ад рэдагаваньняў",
        "right-blockemail": "блякаваньне іншых ўдзельнікаў ад дасылкі электроннай пошты",
        "recentchanges-label-plusminus": "Памер старонкі зьмяніўся на такую колькасьць байтаў",
        "recentchanges-legend-heading": "'''Легенда:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (глядзіце таксама [[Special:NewPages|сьпіс новых старонак]])",
-       "rcnotefrom": "Ніжэй знаходзяцца зьмены з <strong>$2</strong> (да <strong>$1</strong> на старонку).",
+       "rcnotefrom": "Ніжэй {{PLURAL:$5|знаходзіцца зьмена|знаходзяцца зьмены}} з <strong>$4 $3</strong> (да <strong>$1</strong> на старонку).",
        "rclistfrom": "Паказаць зьмены з $2 $3",
        "rcshowhideminor": "$1 дробныя праўкі",
        "rcshowhideminor-show": "Паказаць",
        "nolicense": "Ня выбраная",
        "licenses-edit": "Рэдагаваць парамэтры ліцэнзіі",
        "license-nopreview": "(Прагляд недаступны)",
-       "upload_source_url": " (слушны, агульнадаступны URL-адрас)",
-       "upload_source_file": " (файл на Вашым кампутары)",
+       "upload_source_url": "(выбраны вамі файл з слушнага і агульнадаступнага URL-адрасу)",
+       "upload_source_file": "(выбраны файл на вашым кампутары)",
        "listfiles-delete": "выдаліць",
        "listfiles-summary": "На гэтай спэцыяльнай старонцы паказаныя ўсе загружаныя файлы.",
        "listfiles_search_for": "Пошук па назьве файла:",
        "watchlist-details": "У Вашым сьпісе назіраньня $1 {{PLURAL:$1|старонка|старонкі|старонак}} за выключэньнем старонак абмеркаваньня.",
        "wlheader-enotif": "Апавяшчэньне па e-mail уключанае.",
        "wlheader-showupdated": "Старонкі, зьмененыя з часу вашага апошняга візыту, вылучаныя '''тоўстым''' шрыфтам.",
-       "wlnote2": "Ніжэй паказаныя зьмены за {{PLURAL:$1|<strong>$1</strong> гадзіну|<strong>$1</strong> гадзіны|<strong>$1</strong> гадзінаў}} на $3 $2.",
+       "wlnote": "Ніжэй {{PLURAL:$1|паказаная <strong>$1</strong> апошняя зьмена|паказаныя <strong>$1</strong> апошнія зьмены|паказаныя <strong>$1</strong> апошніх зьменаў}} за <strong>$2</strong> {{PLURAL:$2|гадзіну|гадзіны|гадзінаў}}, па стане на $4 $3.",
        "wlshowlast": "Паказаць: за апошнія $1 гадзінаў, $2 дзён, $3",
        "watchlist-options": "Налады сьпісу назіраньня",
        "watching": "Дадаецца ў сьпіс назіраньня…",
        "import-upload": "Загрузіць XML-зьвесткі",
        "import-token-mismatch": "Страчаныя зьвесткі сэсіі. Калі ласка, паспрабуйце ізноў.",
        "import-invalid-interwiki": "Немагчыма імпартаваць з вызначанай вікі.",
-       "import-error-edit": "Старонка «$1» не імпартаваная, бо Вы ня маеце правоў на яе рэдагаваньне.",
-       "import-error-create": "Старонка «$1» не імпартаваная, бо Вы ня маеце правоў на яе стварэньне.",
+       "import-error-edit": "Старонка «$1» не была імпартаваная, бо Вы ня маеце правоў на яе рэдагаваньне.",
+       "import-error-create": "Старонка «$1» не была імпартаваная, бо Вы ня маеце правоў на яе стварэньне.",
        "import-error-interwiki": "Старонка «$1» не была імпартаваная, таму што гэтая назва зарэзэрваваная для інтэрвікі.",
        "import-error-special": "Старонка «$1» не была імпартаваная, таму што яна належыць да спэцыяльнай прасторы назваў, старонкі ў якой не дазволеныя.",
        "import-error-invalid": "Старонка «$1» не была імпартаваная з-за няслушнасьці назвы.",
        "autosumm-replace": "Старонка замененая на '$1'",
        "autoredircomment": "Перанакіроўвае на [[$1]]",
        "autosumm-new": "Створана старонка са зьместам '$1'",
+       "autosumm-newblank": "Створаная пустая старонка",
        "size-bytes": "$1 б",
        "size-kilobytes": "$1 кб",
        "size-megabytes": "$1 Мб",
        "right-pagelang": "Зьмяніць мову старонкі",
        "action-pagelang": "зьмену мовы старонкі",
        "log-name-pagelang": "Журнал зьменаў мовы",
-       "log-description-pagelang": "Гэта журнал зьменаў мовы старонак."
+       "log-description-pagelang": "Гэта журнал зьменаў мовы старонак.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} мову старонкі $3 з $4 на $5."
 }
index a345e50..d69a81b 100644 (file)
@@ -39,6 +39,7 @@
        "tog-watchdefault": "Дабаўляць старонкі і файлы пасля маіх правак у мой спіс назірання",
        "tog-watchmoves": "Дабаўляць перайменаваныя мной старонкі і файлы ў мой спіс назірання",
        "tog-watchdeletion": "Дабаўляць сцёртыя мной старонкі і файлы ў мой спіс назірання",
+       "tog-watchrollback": "Дадаваць старонкі, дзе я {{GENDER:|зрабіў|зрабіла}} адкат, у мой спіс назірання",
        "tog-minordefault": "Пачынаць кожную праўку як дробную",
        "tog-previewontop": "Папярэдні паказ — над рэдактарскім полем",
        "tog-previewonfirst": "Папярэдні паказ пры першай праўцы",
        "thu": "Чц",
        "fri": "Пт",
        "sat": "Сб",
-       "january": "Студзень",
-       "february": "Ð\9bюты",
-       "march": "Сакавік",
-       "april": "Ð\9aрасавік",
-       "may_long": "ТÑ\80авенÑ\8c",
-       "june": "Чэрвень",
-       "july": "Ð\9bіпень",
-       "august": "Ð\96нівень",
-       "september": "Ð\92ерасень",
-       "october": "Ð\9aастрычнік",
-       "november": "Ð\9bістапад",
-       "december": "Снежань",
+       "january": "cтудзень",
+       "february": "люты",
+       "march": "сакавік",
+       "april": "красавік",
+       "may_long": "май",
+       "june": "чэрвень",
+       "july": "ліпень",
+       "august": "Ðнівень",
+       "september": "верасень",
+       "october": "кастрычнік",
+       "november": "лістапад",
+       "december": "снежань",
        "january-gen": "студзеня",
        "february-gen": "лютага",
        "march-gen": "сакавіка",
        "preview": "Перадпаказ",
        "showpreview": "Як будзе",
        "showdiff": "Розніца",
+       "blankarticle": "<strong>Увага:</strong> Вы ствараеце пустую старонку.\nКалі вы націсніце \"{{int:savearticle}}\" яшчэ раз, будзе створана старонка без аніякага зместу.",
        "anoneditwarning": "Вы не ўвайшлі ў сістэму. Таму, калі вы запішаце старонку, у яе гісторыю трапіць ваш адрас IP.",
        "anonpreviewwarning": "''Вы не прайшлі ідэнтыфікацыю Захаванне будзе запісана з вашым IP адрасам у гісторыі правак гэтай старонкі.''",
-       "missingsummary": "'''Нагадваем''': вы не ўпісалі тлумачэння для сваёй праўкі. Калі націснуць Запісаць яшчэ раз, праўка будзе замацавана без тлумачэння.",
+       "missingsummary": "<strong>Нагадваем:</strong> вы не ўпісалі тлумачэння для сваёй праўкі. Калі націснуць \"{{int:savearticle}}\" яшчэ раз, праўка будзе замацавана без тлумачэння.",
        "missingcommenttext": "Калі ласка, увядзіце ніжэй каментарый.",
        "missingcommentheader": "'''Увага:''' вы нічога не ўпісалі ў тэму/загаловак гэтай заўвагі. Націсканне '{{int:savearticle}}' замацуе вашую праўку з пустой тэмай/загалоўкам.",
        "summary-preview": "Перадпаказ апісання:",
        "accmailtitle": "Быў адасланы пароль",
        "accmailtext": "На адрас $2 быў дасланы згенераваны пароль для [[User talk:$1|$1]]. Ён можа быць зменены на <em>[[Special:ChangePassword|старонцы змены пароля]]</em> пасля ўваходу ў сістэму.",
        "newarticle": "(Новы)",
-       "newarticletext": "Вы перайшлі да старонкі, якой яшчэ няма, і таму трапілі сюды. Каб пачаць новую старонку, пішыце яе тэкст у ніжэйпаказаным акне рэдагавання (падрабязнасці бач у [$1 даведцы]). Калі вы тут выпадкова, проста націсніце \"назад\" у браўзеры.",
+       "newarticletext": "Вы перайшлі да старонкі, якой яшчэ няма, і таму трапілі сюды. \nКаб пачаць новую старонку, пішыце яе тэкст у ніжэйпаказаным акне рэдагавання (падрабязнасці бач у [$1 даведцы]). \nКалі вы тут выпадкова, проста націсніце <strong>назад</strong> у браўзеры.",
        "anontalkpagetext": "----''Гэта старонка размовы з ананімным удзельнікам, які або не мае свайго рахунку, або ім не карыстаўся. Таму дзеля яго ці яе ідэнтыфікацыі мы мусім выкарыстаць лічбавы Адрас IP. Такі адрас IP могуць дзяліць між сабою некалькі асоб. Калі вы ананімны ўдзельнік, і лічыце, што атрымліваеце няслушныя заўвагі,[[Special:UserLogin/signup|стварыце рахунак]] або [[Special:UserLogin|акажыцеся]], каб вас больш не блыталі з іншымі ананімнымі ўдзельнікамі.''",
        "noarticletext": "Старонка не ўтрымлівае тэксту. Вы можаце [[Special:Search/{{PAGENAME}}|пашукаць гэткую назву]] ў іншых старонках ці <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ў журналах],\nабо [{{fullurl:{{FULLPAGENAME}}|action=edit}} папрацаваць з гэтай старонкай]</span>.",
        "noarticletext-nopermission": "Старонка не ўтрымлівае тэксту.\nВы можаце [[Special:Search/{{PAGENAME}}|пашукаць гэткую назву]] ў іншых старонках,\nці <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ў журналах]</span>, але вы не маеце дазволу на стварэнне гэтай старонкі.",
        "rev-deleted-event": "(сцёртае дзеянне з журналам)",
        "rev-deleted-user-contribs": "[імя ўдзельніка альбо IP-адрас выдалены — рэдагаванне скрытыя ад узносаў]",
        "rev-deleted-text-permission": "Гэтая версія старонкі была '''сцёртая'''.\nПадрабязнасці гл. у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале сціранняў].",
+       "rev-suppressed-text-permission": "Гэта версія старонкі <strong>схаваная</strong>.\nПадрабязнасці можна пабачыць у [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале ўтойвання].",
        "rev-deleted-text-unhide": "Гэтая версія старонкі была '''выдаленая'''.\nМагчыма, падрабязнасці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} часопісе сціранняў].\nПры жаданні, Вы можаце [$1 праглядзець гэтую вэрсію].",
        "rev-suppressed-text-unhide": "Гэтая вэрсія старонкі была '''схаваная'''.\nМагчыма, падрабязнасці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} часопісе сціранняў].\nПры жаданні, Вы можаце [$1 праглядзець гэтую вэрсію].",
        "rev-deleted-text-view": "Гэтая версія старонкі была '''сцёртая'''.\nВы можаце яе бачыць; падрабязнасці гл. у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале сціранняў].",
        "revdelete-text-text": "Сцёртыя версіі будуць па-ранейшаму паказвацца ў гісторыі старонкі, але частка іх зместу будзе недаступна для грамадскасці.",
        "revdelete-text-file": "Сцёртыя версіі файла будуць па-ранейшаму паказвацца ў гісторыі файла, але частка іх зместу будзе недаступна для грамадскасці.",
        "logdelete-text": "Сцёртыя запісы журнала будуць па-ранейшаму паказвацца ў журналах, але частка іх зместу будзе недаступна для грамадскасці.",
-       "revdelete-text-others": "Ð\86нÑ\88Ñ\8bÑ\8f Ð°Ð´Ð¼Ñ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82аÑ\80Ñ\8b Ð¿Ð»Ñ\8fÑ\86оÑ\9eкÑ\96 {{SITENAME}} Ð±Ñ\83дÑ\83Ñ\86Ñ\8c Ð¿Ð°-Ñ\80анейÑ\88амÑ\83 Ð¼ÐµÑ\86Ñ\8c Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ð´Ð° Ñ\81Ñ\85аванага Ð·Ð¼ÐµÑ\81Ñ\82Ñ\83 Ñ\96 Ð·Ð¼Ð¾Ð³Ñ\83Ñ\86Ñ\8c Ð°Ð´Ð½Ð°Ð²Ñ\96Ñ\86Ñ\8c Ñ\8fго Ð¿Ñ\80аз Ð³Ñ\8dÑ\82Ñ\8b Ñ\81амÑ\8b Ñ\96нÑ\82Ñ\8dÑ\80Ñ\84ейÑ\81, калі не ўстанавіць дадатковыя абмежаванні.",
+       "revdelete-text-others": "Ð\86нÑ\88Ñ\8bÑ\8f Ð°Ð´Ð¼Ñ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82аÑ\80Ñ\8b Ð±Ñ\83дÑ\83Ñ\86Ñ\8c Ð¿Ð°-Ñ\80анейÑ\88амÑ\83 Ð¼ÐµÑ\86Ñ\8c Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ð´Ð° Ñ\81Ñ\85аванага Ð·Ð¼ÐµÑ\81Ñ\82Ñ\83 Ñ\96 Ð·Ð¼Ð¾Ð³Ñ\83Ñ\86Ñ\8c Ð°Ð´Ð½Ð°Ð²Ñ\96Ñ\86Ñ\8c Ñ\8fго, калі не ўстанавіць дадатковыя абмежаванні.",
        "revdelete-confirm": "Пацвердзіце, што вы жадаеце гэта зрабіць, што вы разумееце наступствы, і што вы робіце гэта ў адпаведнасці з [[{{MediaWiki:Policy-url}}|арганізацыйнымі правіламі]].",
        "revdelete-suppress-text": "Заглушэнне належыць ужываць <strong>выключна</strong> ў наступных выпадках:\n* патэнцыяльна паклёпніцкія звесткі\n* недапушчальная асабістая інфармацыя\n*: <em>хатнія адрасы і тэлефоны, нумары страхавання і г.д.</em>",
        "revdelete-legend": "Настроіць абмежаванні бачнасці",
        "right-deletedtext": "Адкрыць выдалены тэкст і ўсе змены паміж выдаленымі версіямі",
        "right-browsearchive": "Шукаць у сцёртых старонках",
        "right-undelete": "Аднаўляць старонкі",
-       "right-suppressrevision": "Бачыць і аднаўляць версіі, схаваныя ад адміністратараў",
+       "right-suppressrevision": "Бачыць, хаваць і адкрываць схаваныя асобныя версіі ад усіх удзельнікаў",
+       "right-viewsuppressed": "Бачыць версіі, схаваныя ад усіх удзельнікаў",
        "right-suppressionlog": "Чытаць прыватныя журналы",
        "right-block": "Забараняць праўкі іншым удзельнікам",
        "right-blockemail": "Забараняць удзельніку адсыланне эл.пошты",
        "recentchanges-label-plusminus": "Аб'ём старонкі змяніўся на гэтую лічбу байтаў",
        "recentchanges-legend-heading": "'''Легенда:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (гл. асобна [[Special:NewPages|новыя старонкі]])",
-       "rcnotefrom": "Ніжэй знаходзяцца змены з <b>$2</b> (паказана не больш чым <b>$1</b>).",
+       "rcnotefrom": "Ніжэй {{PLURAL:$5|паказана змяненне|паказаны змены}} з <strong>$3, $4</strong> (не больш за <strong>$1</strong>).",
        "rclistfrom": "Паказаць змены з $3 $2",
        "rcshowhideminor": "$1 дробныя праўкі",
        "rcshowhideminor-show": "Паказаць",
        "nolicense": "Нішто не выбрана",
        "licenses-edit": "Правіць параметры ліцэнзіі",
        "license-nopreview": "(без перадпаказу)",
-       "upload_source_url": " (сапраўдны, публічна дасягальны URL)",
-       "upload_source_file": " (файл на вашай машыне)",
+       "upload_source_url": "(выбраны файл з сапраўднага, публічна дасяжнага URL)",
+       "upload_source_file": "(выбраны файл з вашага камп'ютара)",
        "listfiles-delete": "сцерці",
        "listfiles-summary": "Гэтая службовая старонка паказвае ўсе загружаныя файлы.",
        "listfiles_search_for": "Знайсці назву выявы:",
        "mostlinked": "Старонкі, на якія найчасцей спасылаюцца",
        "mostlinkedcategories": "Катэгорыі з найбольшай колькасцю складнікаў",
        "mostlinkedtemplates": "Шаблоны ў частым выкарыстанні",
-       "mostcategories": "Артыкулы ў найбольшай кольк. катэгорый",
+       "mostcategories": "Артыкулы ў найбольшай колькасці катэгорый",
        "mostimages": "Выявы ў частым выкарыстанні",
        "mostinterwikis": "Артыкулы з найбольш. кольк. інтэрвікі",
        "mostrevisions": "Артыкулы з найбольшай колькасцю версій",
        "listusers-editsonly": "Толькі ўдзельнікі, якія маюць праўкі",
        "listusers-creationsort": "У парадку датаў стварэння",
        "listusers-desc": "Парадкаваць да памяншэння",
-       "usereditcount": "$1 {{PLURAL:$1|праўка|праўкі}}",
-       "usercreated": "\t{{GENDER:$3|Зарэгістраваўся|Зарэгістравалася}} $1 в $2",
+       "usereditcount": "$1 {{PLURAL:$1|праўка|праўкі|правак}}",
+       "usercreated": "\t{{GENDER:$3|Зарэгістраваўся|Зарэгістравалася}} $1 у $2",
        "newpages": "Новыя старонкі",
        "newpages-username": "Імя ўдзельніка:",
        "ancientpages": "Найстарэйшыя старонкі",
        "watchlist-details": "Назіраю {{PLURAL:$1|$1 старонку|$1 старонкі|$1 старонак}} без уліку размоўных.",
        "wlheader-enotif": "Працуе апавяшчанне праз эл.пошту.",
        "wlheader-showupdated": "Старонкі, якія былі зменены пасля вашага апошняга наведвання, паказаны <strong>абрысам шрыфту</strong>.",
-       "wlnote2": "Ніжэй паказаны змены за {{PLURAL:$1|апошнюю гадзіну|апошнія <strong>$1</strong> гадзіны|апошнія <strong>$1</strong> гадзін}}, па стане на $2, $3.",
+       "wlnote": "Ніжэй {{PLURAL:$1|паказана апошняя <strong>$1</strong> змена|паказаны апошнія <strong>$1</strong> змены|паказаны апошнія <strong>$1</strong> змен}} за {{PLURAL:$2|апошнюю|апошнія|апошнія}} <strong>$2</strong> {{PLURAL:$2|гадзіну|гадзіны|гадзін}}, на момант часу $3 $4.",
        "wlshowlast": "Паказваць апошнія $1 гадз. $2 дзён $3",
        "watchlist-options": "Магчымасці назірання",
        "watching": "Дапісваецца ў спіс назірання...",
        "import-invalid-interwiki": "Немагчыма імпартаваць з гэтай вікі.",
        "import-error-edit": "Старонка «$1» не была імпартавана, бо вам не дазволена яе правіць.",
        "import-error-create": "Старонка «$1» не была імпартавана, бо вам не дазволена яе ствараць.",
-       "import-error-interwiki": "Старонка «$1» не была імпартаваная, таму што гэтая назва зарэзерваваная для інтэрвікі.",
+       "import-error-interwiki": "Старонка «$1» не была імпартавана, таму што гэта назва зарэзервавана для інтэрвікі.",
        "import-error-special": "Старонка «$1» не была імпартаваная, таму што яна належыць да спецыяльнай прасторы назваў, старонкі ў якой не дазволеныя.",
-       "import-error-invalid": "Старонка «$1» не была імпартаваная з-за няслушнасці назвы.",
+       "import-error-invalid": "Старонка «$1» не была імпартавана, таму што назва, пад якую яна імпартуецца, недапушчальная на гэтай вікі.",
        "import-error-unserialize": "Немагчыма дэсерыялізаваць версію $2 старонкі \"$1\". Меркавалася, што версія выкарыстоўвае мадэль змесціва $3, серыялізавана як $4.",
        "import-error-bad-location": "Версія $2, якая выкарыстоўвае мадэль змесціва $3, не можа быць запісана на старонцы \"$1\" гэтай вікі, паколькі такая мадэль не падтрымліваецца на гэтай старонцы.",
        "import-options-wrong": "{{PLURAL:$2|1=Няправільны параметр|Няправільныя параметры}}: <nowiki>$1</nowiki>",
        "importlogpage": "Журнал імпартаванняў",
        "importlogpagetext": "Адміністрацыйныя імпартаванні старонак з іншых вікі, разам з гісторыямі правак.",
        "import-logentry-upload": "імпартавана [[$1]] праз файлавы ўклад",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|версія|версіі|версій}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|версія|версіі|версій}} імпартавана",
        "import-logentry-interwiki": "транс-вікавана $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|версія|версіі|версій}} з $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|версія|версіі|версій}} імпартавана з $2",
        "javascripttest": "JavaScript-тэсты",
        "javascripttest-title": "Праводзіцца тэставанне $1",
        "javascripttest-pagetext-noframework": "Гэта старонка зарэзервавана для запуску тэстаў JavaScript",
        "autosumm-replace": "Замена старонкі на '$1'",
        "autoredircomment": "Перасылае да [[$1]]",
        "autosumm-new": "Новая старонка: '$1'",
+       "autosumm-newblank": "Створана пустая старонка",
        "lag-warn-normal": "Змены, зробленыя менш за $1 {{PLURAL:$1|сек.|сек.}} таму назад, могуць не трапіць у гэты спіс.",
        "lag-warn-high": "З прычыны моцных затрымак на серверы баз звестак, змены, зробленыя менш за $1 {{PLURAL:$1|сек.|сек.}} таму назад, могуць не трапіць у гэты спіс.",
        "watchlistedit-normal-title": "Спіс назірання",
index 07a5a29..5ac6601 100644 (file)
        "watchlist-details": "আপনার নজরতালিকাতে {{PLURAL:$1|$1টি পাতা}} আছে (আলাপ পাতাগুলি গণনায় না ধরে)।",
        "wlheader-enotif": "ইমেল বিজ্ঞপ্তি সক্রিয় করা আছে।",
        "wlheader-showupdated": "আপনার শেষ আগমনের পর থেকে যেসব পাতায় পরিবর্তন হয়েছে সেগুলি '''গাঢ়''' করে দেখানো হয়েছে।",
-       "wlnote2": "$3, $2 অনুসারে, সর্বশেষ {{PLURAL:$1|ঘণ্টার|<strong>$1</strong> ঘণ্টার}} পরিবর্তন নিচে দেয়া হয়েছে।",
+       "wlnote": "নিচে $3, $4 তারিখ থেকে বিগত {{PLURAL:$2|১ ঘন্টায়|'''$2''' ঘন্টায়}} সংঘটিত {{PLURAL:$1|শেষ ১টি পরিবর্তন|শেষ '''$1'''টি পরিবর্তন}} দেখানো হল।",
        "wlshowlast": "দেখাও সর্বশেষ  $1 ঘণ্টা $2 দিন $3",
        "watchlist-options": "নজর তালিকা পছন্দসমূহ",
        "watching": "নজর রাখা হচ্ছে...",
        "importlogpage": "আমদানি লগ",
        "importlogpagetext": "প্রশাসক কর্তৃক অন্যান্য উইকি থেকে সম্পাদনা ইতিহাসসহ পাতা আমদানি।",
        "import-logentry-upload": "ফাইল আপলোডের মাধ্যমে [[$1]] আমদানি করা হয়েছে",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|টি সংশোধন|টি সংশোধন}}",
+       "import-logentry-upload-detail": "$1টি {{PLURAL:$1|সংশোধন}} আমদানি করা হয়েছে",
        "import-logentry-interwiki": "$1 উইকি-স্থানান্তরিত",
-       "import-logentry-interwiki-detail": "$2-à¦\8fর à¦\95রা $1 {{PLURAL:$1|সà¦\82শà§\8bধন|à¦\9fি à¦¸à¦\82শà§\8bধন}}",
+       "import-logentry-interwiki-detail": "$2-à¦\8fর à¦¥à§\87à¦\95à§\87 $1à¦\9fি {{PLURAL:$1|সà¦\82শà§\8bধন}} à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87",
        "javascripttest": "জাভাস্ক্রিপ্ট পরীক্ষা",
        "javascripttest-title": "$1 পরীক্ষা চলছে",
        "javascripttest-pagetext-noframework": "এই পাতাটি জাভাস্ক্রিপ্ট পরীক্ষার জন্য সংরক্ষিত।",
        "autosumm-replace": "পাতাকে '$1' দিয়ে প্রতিস্থাপিত করা হল",
        "autoredircomment": "[[$1]]-এ পুনর্নির্দেশ করা হল",
        "autosumm-new": "$1 দিয়ে তৈরি পাতা",
+       "autosumm-newblank": "খালি পাতা তৈরি হয়েছে",
        "size-bytes": "$1 বাইট",
        "size-kilobytes": "$1 কিলোবাইট",
        "size-megabytes": "$1 মেগাবাইট",
index 0198e96..3978647 100644 (file)
        "talkpagelinktext": "Kaozeal",
        "specialpage": "Pajenn dibar",
        "personaltools": "Ostilhoù personel",
-       "postcomment": "Rann nevez",
        "articlepage": "Sellet ouzh ar pennad",
        "talk": "Kaozeadenn",
        "views": "Gweladennoù",
        "externaldberror": "Pe ez eus bet ur fazi gwiriekaat diavaez er bank titouroù pe n'oc'h ket aotreet da nevesaat ho kont diavaez.",
        "login": "Kevreañ",
        "nav-login-createaccount": "Krouiñ ur gont pe kevreañ",
-       "loginprompt": "Ret eo deoc'h bezañ gweredekaet an toupinoù a-benn gellout kevreañ ouzh {{SITENAME}}.",
        "userlogin": "Kevreañ / krouiñ ur gont",
        "userloginnocreate": "Kevreañ",
        "logout": "Digevreañ",
        "powersearch-togglelabel": "Dibab :",
        "powersearch-toggleall": "An holl",
        "powersearch-togglenone": "Hini ebet",
+       "powersearch-remember": "Derc'hel soñj eus an diuzadenn evit klaskoù da zont",
        "search-external": "Klask diavaez",
        "searchdisabled": "<p>Diweredekaet eo bet an arc'hwel klask war an destenn a-bezh evit ur frapad rak ur samm re vras e oa evit ar servijer. Emichañs e vo tu d'e adlakaat pa vo ur servijer galloudusoc'h ganeomp. Da c'hortoz e c'hallit klask gant Google:</p>",
        "search-error": "Ur fazi a zo bet e-ser klask : $1",
        "license-nopreview": "(Dibosupl rakwelet)",
        "upload_source_url": " (Un URL reizh a c'hall bezañ tizhet gant an holl)",
        "upload_source_file": " (ur restr war hoc'h urzhiataer)",
+       "listfiles-delete": "dilemel",
        "listfiles-summary": "Diskouez a ra ar bajenn dibar-mañ an holl restroù bet ezporzhiet.",
        "listfiles_search_for": "Klask anv ar skeudenn :",
        "imgfile": "restr",
        "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.",
+       "wantedfiletext-nocat-noforeign": "Implijet e vez ar restroù-mañ met n'eus ket anezho.",
        "wantedtemplates": "Patromoù a vank",
        "mostlinked": "Pajennoù dezho al liammoù niverusañ",
        "mostlinkedcategories": "Rummadoù dezho al liammoù niverusañ",
        "watchlist-details": "Lakaet hoc'h eus {{PLURAL:$1|$1 bajenn|$1 pajenn}} dindan evezh, anez kontañ ar pajennoù kaozeal.",
        "wlheader-enotif": "Gweredekaet eo ar c'has posteloù.",
        "wlheader-showupdated": "E '''tev''' emañ merket ar pajennoù bet kemmet abaoe ar wezh ziwezhañ hoc'h eus sellet outo",
+       "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ñ",
        "watching": "Heuliet...",
        "autosumm-replace": "Oc'h erlec'hiañ ar bajenn gant '$1'",
        "autoredircomment": "Adkas war-du [[$1]]",
        "autosumm-new": "Pajenn krouet gant : \"$1\"",
+       "autosumm-newblank": "Krouet eo bet ur bajenn c'houllo",
        "size-bytes": "$1 o",
        "size-kilobytes": "$1 Kio",
        "size-megabytes": "$1 Mio",
        "watchlistedit-raw-removed": "Tennet ez eus bet {{PLURAL:$1|1 pajenn|$1 pajenn}} :",
        "watchlistedit-clear-legend": "Diverkañ ar roll-evezhiañ",
        "watchlistedit-clear-titles": "Titloù :",
+       "watchlistedit-clear-removed": "Dilamet ez eus bet {{PLURAL:$1|1 titl|$1 a ditloù}} :",
+       "watchlistedit-too-many": "Re a bajennoù zo da ziskwel amañ.",
        "watchlisttools-clear": "Diverkañ ar roll-evezhiañ",
        "watchlisttools-view": "Gwelet ar c'hemmoù degaset",
        "watchlisttools-edit": "Gwelet ha kemmañ ar roll evezhiañ",
        "version-hook-name": "Anv ar galv",
        "version-hook-subscribedby": "Termenet gant",
        "version-version": "($1)",
+       "version-no-ext-name": "[anv ebet]",
        "version-license": "Aotre-implijout MediaWiki",
        "version-ext-license": "Aotre-implijout",
        "version-ext-colheader-name": "Astenn",
+       "version-skin-colheader-name": "Gwiskadur",
        "version-ext-colheader-version": "Stumm",
        "version-ext-colheader-license": "Aotre-implijout",
        "version-ext-colheader-description": "Deskrivadur",
        "expand_templates_generate_xml": "Gwelet ar gwezennadur XML",
        "expand_templates_generate_rawhtml": "Diskouez an HTML kriz",
        "expand_templates_preview": "Rakwelet",
+       "pagelanguage": "Diuzañ yezh ar bajenn",
        "pagelang-name": "Pajenn",
        "pagelang-language": "Yezh",
        "pagelang-use-default": "Implijout ar yezh dre ziouer",
        "pagelang-select-lang": "Dibab ar yezh",
-       "right-pagelang": "Cheñch yezh ar bajenn"
+       "right-pagelang": "Cheñch yezh ar bajenn",
+       "action-pagelang": "cheñch yezh ar bajenn"
 }
index 8ec8bb8..fac19cc 100644 (file)
        "hidden-category-category": "Sakrivene kategorije",
        "category-subcat-count": "{{PLURAL:$2|Ova kategorija ima sljedeću podkategoriju.|Ova kategorija ima {{PLURAL:$1|sljedeću podkategoriju|sljedeće $1 podkategorije|sljedećih $1 podkategorija}}, od $2 ukupno.}}",
        "category-subcat-count-limited": "Ova kategorija sadrži {{PLURAL:$1|slijedeću $1 podkategoriju|slijedeće $1 podkategorije|slijedećih $1 podkategorija}}.",
-       "category-article-count": "{{PLURAL:$2|U ovoj kategoriji se nalazi $1 članak.|{{PLURAL:$1|Prikazan je $1 članak|Prikazana su $1 članka|Prikazano je $1 članaka}} od ukupno $2 u ovoj kategoriji.}}",
+       "category-article-count": "{{PLURAL:$2|U ovoj kategoriji nalazi se $1 članak.|{{PLURAL:$1|Prikazan je $1 članak|Prikazana su $1 članka|Prikazano je $1 članaka}} od ukupno $2 u ovoj kategoriji.}}",
        "category-article-count-limited": "{{PLURAL:$1|Slijedeća $1 stranica je|Slijedeće $1 stranice su|Slijedećih $1 stranica je}} u ovoj kategoriji.",
        "category-file-count": "{{PLURAL:$2|Ova kategorija ima slijedeću $1 datoteku.|{{PLURAL:$1|Prikazana je $1 datoteka|Prikazane su $1 datoteke|Prikazano je $1 datoteka}} u ovoj kategoriji, od ukupno $2.}}",
        "category-file-count-limited": "{{PLURAL:$1|Slijedeća $1 datoteka je|Slijedeće $1 datoteke su|Slijedećih $1 datoteka je}} u ovoj kategoriji.",
        "readonly": "Baza je zaključana",
        "enterlockreason": "Unesite razlog za zaključavanje, uključujući procjenu vremena otključavanja",
        "readonlytext": "Baza je trenutno zaključana za nove unose i ostale izmjene, vjerovatno zbog rutinskog održavanja, posle čega će biti vraćena u uobičajeno stanje.\n\nAdministrator koji ju je zaključao je ponudio ovo objašnjenje: $1",
-       "missing-article": "U bazi podataka nije pronađen tekst stranice tražen pod nazivom \"$1\" $2.\n\nDo ovoga dolazi kada se prati pomjeranje ili historija linka za stranicu koja je pobrisana.\n\n\nU slučaju da se ne radi o gore navedenom, moguće je da ste pronašli grešku u programu.\nMolimo Vas da ovo prijavite [[Special:ListUsers/sysop|administratoru]] sa navođenjem tačne adrese stranice",
+       "missing-article": "U bazi podataka nije pronađen tekst stranice tražen pod nazivom \"$1\" $2.\n\nDo ovoga dolazi kad se prati pomjeranje ili historija linka za stranicu koja je pobrisana.\n\n\nU slučaju da se ne radi o gore navedenom moguće je da ste pronašli grešku u programu.\nMolimo Vas da ovo prijavite [[Special:ListUsers/sysop|administratoru]] s navođenjem tačne adrese stranice.",
        "missingarticle-rev": "(revizija#: $1)",
        "missingarticle-diff": "(Razlika: $1, $2)",
        "readonly_lag": "Baza podataka je zaključana dok se sekundarne baze podataka na serveru ne sastave sa glavnom.",
        "userexists": "Korisničko ime koje ste unijeli je već u upotrebi.\nMolimo Vas da izaberete drugo ime.",
        "loginerror": "Greška pri prijavljivanju",
        "createaccounterror": "Ne može se napraviti račun: $1",
-       "nocookiesnew": "Korisnički nalog je napravljen, ali niste prijavljeni.  {{SITENAME}} koristi kolačiće (''cookies'') da bi se korisnici prijavili.  Vi ste onemogućili kolačiće na Vašem računaru.  Molimo Vas da ih omogućite, a onda se prijavite sa svojim novim korisničkim imenom i šifrom.",
+       "nocookiesnew": "Korisnički nalog je napravljen, ali niste prijavljeni. {{SITENAME}} koristi kolačiće (''cookies'') da bi se korisnici prijavili.  Vi ste onemogućili kolačiće na Vašem računaru. Molimo Vas da ih omogućite, a onda se prijavite sa svojim novim korisničkim imenom i šifrom.",
        "nocookieslogin": "{{SITENAME}} koristi kolačiće (''cookies'') da bi se korisnici prijavili.  Vi ste onemogućili kolačiće na Vašem kompjuteru.  Molimo Vas da ih omogućite i da pokušate ponovo sa prijavom.",
        "nocookiesfornew": "Korisnički račun nije napravljen, jer nismo mogli da potvrdimo njegov izvor.\nProvjerite da li su cookies omogućeni, ponovo učitajte ovu stranicu i pokušajte ponovo.",
        "noname": "Niste izabrali ispravno korisničko ime.",
        "loginsuccesstitle": "Prijavljivanje uspješno",
        "loginsuccess": "'''Sad ste prijavljeni na {{SITENAME}} kao \"$1\".'''",
-       "nosuchuser": "Ne postoji korisnik sa imenom \"$1\".\nKorisnička imena razlikuju velika i mala slova.\nProvjerite vaše kucanje ili [[Special:UserLogin/signup|napravite novi korisnički račun]].",
-       "nosuchusershort": "Ne postoji korisnik sa imenom \"$1\".\nProvjerite da li ste dobro ukucali.",
+       "nosuchuser": "Ne postoji korisnik s imenom \"$1\".\nKorisnička imena razlikuju velika i mala slova.\nProvjerite Vaš unos ili [[Special:UserLogin/signup|napravite novi korisnički račun]].",
+       "nosuchusershort": "Ne postoji korisnik s imenom \"$1\".\nProvjerite jeste li dobro ukucali.",
        "nouserspecified": "Morate izabrati korisničko ime.",
        "login-userblocked": "Ovaj korisnik je blokiran. Prijava nije dopuštena.",
        "wrongpassword": "Unijeli ste neispravnu šifru.\nMolimo Vas da pokušate ponovno.",
        "userjspreview": "'''Zapamtite ovo je samo izgled vaše JavaScript-e, još uvijek nije sačuvan!'''",
        "sitecsspreview": "'''Zapamtite ovo je samo izgled ovog CSS-a.'''\n'''Još uvijek nije sačuvan!'''",
        "sitejspreview": "'''Zapamtite ovo je samo izgled ovog koda JavaScripte.'''\n'''Još uvijek nije sačuvan!'''",
-       "userinvalidcssjstitle": "'''Upozorenje:''' Ne postoji interfejs pod imenom \"$1\".\nNe zaboravite da imena stranica s .css i .js kodom počinju malim slovom, npr. {{ns:user}}:Foo/vector.css, a ne {{ns:user}}:Foo/Vector.css.",
+       "userinvalidcssjstitle": "'''Upozorenje:''' Ne postoji interfejs pod imenom \"$1\".\nNe zaboravite da imena stranica s .css i .js kodom počinju malim slovom, npr, {{ns:user}}:Foo/vector.css, a ne {{ns:user}}:Foo/Vector.css.",
        "updated": "(Osvježeno)",
        "note": "'''Pažnja:'''",
        "previewnote": "'''Ne zaboravite da je ovo samo pregled'''\nIzmjene stranice nisu još sačuvane!",
        "continue-editing": "Idi na područje uređivanja",
-       "previewconflict": "Ovaj pregled reflektuje tekst u gornjem polju\nkako će izgledati ako pritisnete \"Sačuvaj članak\".",
+       "previewconflict": "Ovaj pregled prikazuje kako će tekst u gornjem polju\nizgledati ako kliknete \"Sačuvaj članak\".",
        "session_fail_preview": "'''Izvinjavamo se! Nismo mogli obraditi vašu izmjenu zbog gubitka podataka o prijavi. Molimo pokušajte ponovno. Ako i dalje ne bude radilo, pokušajte se [[Special:UserLogout|odjaviti]] i ponovno prijaviti.'''",
        "session_fail_preview_html": "'''Žao nam je! Nismo mogli da obradimo vašu izmjenu zbog gubitka podataka.'''\n\n''Zbog toga što {{SITENAME}} ima omogućen izvorni HTML, predpregled je sakriven kao predostrožnost protiv JavaScript napada.''\n\n'''Ako ste pokušali da napravite pravu izmjenu, molimo pokušajte ponovo. Ako i dalje ne radi, pokušajte da se [[Special:UserLogout|odjavite]] i ponovo prijavite.'''",
        "token_suffix_mismatch": "'''Vaša izmjena nije prihvaćena jer je Vaš web preglednik ubacio znakove interpunkcije u token uređivanja.\nIzmjena je odbačena da bi se spriječilo uništavanje teksta stranice.\nTo se događa ponekad kad korisite problematični anonimni proxy koji je baziran na web-u.'''",
        "right-createtalk": "Pravljenje stranica za razgovor",
        "right-createaccount": "Pravljenje korisničkog računa",
        "right-minoredit": "Označavanje izmjena kao malih",
-       "right-move": "Pomjeranje stranica",
-       "right-move-subpages": "Pomjeranje stranica sa svim podstranicama",
+       "right-move": "Preusmjeravanje stranica",
+       "right-move-subpages": "Preusmjeravanje stranica sa svim podstranicama",
        "right-move-rootuserpages": "Premještanje stranica osnovnih korisnika",
        "right-movefile": "Premještanje datoteka",
        "right-suppressredirect": "Ne pravi preusmjeravanje sa starog imena pri preusmjeravanju stranica",
        "upload_directory_missing": "Folder za postavljanje ($1) nedostaje i webserver ga ne može napraviti.",
        "upload_directory_read_only": "Folder za postavljanje ($1) na webserveru je postavljen samo za čitanje.",
        "uploaderror": "Greška pri slanju",
-       "upload-recreate-warning": "'''Upozorenje: Datoteka s tim imenom je obrisana ili pomjerena.'''\nZapisnik brisanja i pomjeranja za ovu stranicu je dostupan ovdje na uvid:",
+       "upload-recreate-warning": "'''Upozorenje: Datoteka s tim imenom je obrisana ili preusmjerena.'''\nZapisnik brisanja i preusmjeravanja za ovu stranicu dostupan je ovdje:",
        "uploadtext": "Koristite formu ispod za postavljanje datoteka.\nDa bi ste vidjeli ili pretražili ranije postavljene datoteke, pogledajte [[Special:FileList|spisak postavljenih datoteka]], ponovna postavljanja su također zapisana u [[Special:Log/upload|zapisnik postavljanja]], a brisanja u [[Special:Log/delete|zapisnik brisanja]].\n\nDa bi ste prikazali datoteku na stranici, koristite link na jedan od slijedećih načina:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg]]</nowiki></code>''' da upotrijebite potpunu veziju datoteke\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.png|200px|thumb|lijevo|opis slike]]</nowiki></code>''' da upotrijebite smanjeni prikaz širine 200 piksela unutar okvira, s lijevim poravnanjem i ''opisom slike''.\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datoteka.ogg]]</nowiki></code>''' za direkno povezivanje datoteke bez njenog prikazivanja",
        "upload-permitted": "Podržane vrste datoteka: $1.",
        "upload-preferred": "Preferirane vrste datoteka: $1.",
        "fileexists-extension": "Datoteka sa sličnim nazivom postoji: [[$2|thumb]]\n* Naziv datoteke koja se postavlja: <strong>[[:$1]]</strong>\n* Naziv postojeće datoteke: <strong>[[:$2]]</strong>\nMolimo Vas da izaberete drugačiji naziv.",
        "fileexists-thumbnail-yes": "Izgleda da je datoteka slika smanjene veličine ''(\"thumbnail\")''. [[$1|thumb]]\nMolimo provjerite datoteku <strong>[[:$1]]</strong>.\nAko je provjerena datoteka ista slika originalne veličine, nije potrebno postavljati dodatnu sliku.",
        "file-thumbnail-no": "Naziv datoteke počinje sa <strong>$1</strong>.\nIzgleda da se radi o smanjenoj slici ''(\"thumbnail\")''.\nAko imate ovu sliku u punoj rezoluciji, postavite nju; ili promijenite naslov ove datoteke.",
-       "fileexists-forbidden": "Datoteka sa ovim imenom već postoji i ne može biti prepisana.\nAko i dalje želite da postavite ovu datoteku, molimo Vas da se vratite i pošaljete ovu datoteku pod novim imenom. [[File:$1|thumb|center|$1]]",
-       "fileexists-shared-forbidden": "Datoteka sa ovim imenom već postoji u zajedničkoj ostavi; molimo Vas da se vratite i pošaljete ovu datoteku pod novim imenom. [[File:$1|thumb|center|$1]]",
+       "fileexists-forbidden": "Datoteka s ovim imenom već postoji i ne može biti prepisana.\nAko i dalje želite postaviti ovu datoteku, molimo Vas da se vratite i pošaljete ovu datoteku pod novim imenom. [[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "Datoteka s ovim imenom već postoji u zajedničkoj ostavi. Molimo Vas da se vratite i pošaljete ovu datoteku pod novim imenom. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Ova datoteka je dvojnik {{PLURAL:$1|slijedećoj datoteci|slijedećim datotekama}}:",
        "file-deleted-duplicate": "Datoteka koje je identična ovoj datoteci ([[:$1]]) je ranije bila obrisana. Trebate provjeriti historiju brisanja te datoteke prije nego što nastavite sa njenim ponovnim postavljanjem.",
        "uploadwarning": "Upozorenje pri slanju",
        "upload-description": "Opis datoteke",
        "upload-options": "Opcije postavljanja",
        "watchthisupload": "Prati ovu datoteku",
-       "filewasdeleted": "Datoteka s ovim nazivom je ranije postavljana i nakon toga obrisana.\nPrije nego što nastavite da je ponovno postavite trebate provjeriti $1.",
+       "filewasdeleted": "Datoteka s ovim nazivom je ranije postavljana i nakon toga obrisana.\nPrije no što nastavite da je ponovo postavite trebate provjeriti $1.",
        "filename-bad-prefix": "Naziv datoteke koju postavljate počinje sa '''\"$1\"''', što je naziv koji obično automatski dodjeljuju digitalni fotoaparati i kamere.\nMolimo Vas da odaberete naziv datoteke koji opisuje njen sadržaj.",
        "filename-prefix-blacklist": " #<!-- ostavite ovu liniju onakvom kakva jeste --> <pre>\n# Sintaksa je slijedeća:\n#   * Sve od karaktera \"#\" pa do kraja je komentar\n#   * Svaka neprazna linija je prefiks za tipična imena datoteka koja automatski dodjeljuje digitalna kamera\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # neki mobilni telefoni\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # razni\n #</pre> <!-- ostavite ovu liniju onakvom kakva jeste -->",
        "upload-success-subj": "Uspješno slanje",
        "protectedpages-indef": "Samo neograničena zaštićenja",
        "protectedpages-cascade": "Samo prenosive zaštite",
        "protectedpages-noredirect": "Sakrij preusmjerenja",
-       "protectedpagesempty": "Trenutno nijedna stranica nije zaštićena ovim parametrima.",
+       "protectedpagesempty": "Trenutno nijedna stranica nije zaštićena ovim parametrima.",
        "protectedpages-page": "Stranica",
        "protectedpages-expiry": "Istječe",
        "protectedpages-reason": "Razlog",
        "protectedpages-unknown-timestamp": "Nepoznato",
        "protectedtitles": "Zaštićeni naslovi",
-       "protectedtitlesempty": "Nema naslova zaštićenih članaka sa ovim parametrima.",
+       "protectedtitlesempty": "Nijedan naslov članka trenutno nije zaštićen ovim parametrima.",
        "listusers": "Spisak korisnika",
        "listusers-editsonly": "Pokaži samo korisnike koji su uređivali",
        "listusers-creationsort": "Sortiraj po datumu pravljenja",
        "move": "Preusmjeri",
        "movethispage": "Premjesti ovu stranicu",
        "unusedimagestext": "Slijedeće datoteke postoje ali nisu uključene ni u jednu stranicu.\nMolimo obratite pažnju da druge web stranice mogu biti povezane s datotekom putem direktnog URLa, tako da i pored toga mogu biti prikazane ovdje pored aktivne upotrebe.",
-       "unusedcategoriestext": "Slijedeće stranice kategorija postoje iako ih ni jedan drugi članak ili kategorija ne koriste.",
+       "unusedcategoriestext": "Sljedeće stranice kategorija postoje iako ih nijedan drugi članak ili kategorija ne koriste.",
        "notargettitle": "Nema cilja",
        "notargettext": "Niste naveli ciljnu stranicu ili korisnika\nna kome bi se izvela ova funkcija.",
        "nopagetitle": "Ne postoji takva stranica",
        "all-logs-page": "Svi javni registri",
        "alllogstext": "Zajednički prikaz svih dostupnih zapisa sa {{SITENAME}}.\nMožete specificirati prikaz izabiranjem specifičnog spiska, korisničkog imena ili promjenjenog članka (razlikovati velika slova).",
        "logempty": "Ne postoji takav zapis.",
-       "log-title-wildcard": "Traži naslove koji počinju ovim tekstom",
+       "log-title-wildcard": "Traži naslove koji počinju ovim tekstom",
        "showhideselectedlogentries": "Pokaži/sakrij izabrane zapise u evidenciji",
        "allpages": "Sve stranice",
        "nextpage": "Sljedeća strana ($1)",
        "watchlist-details": "{{PLURAL:$1|$1 stranica praćena|$1 stranice praćene|$1 stranica praćeno}} ne računajući stranice za razgovor.",
        "wlheader-enotif": "Obavještavanje e-poštom je omogućeno.",
        "wlheader-showupdated": "Stranice koje su izmijenjene od kad ste ih posljednji put posjetili su prikazane '''podebljanim slovima'''",
+       "wlnote": "Ispod je {{PLURAL:$1|najskorija izmjena|'''$1''' najskorije izmjene|'''$1''' najskorijih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih '''$2''' sata|u posljednjih '''$2''' sati}}, od $3, $4.",
        "wlshowlast": "Prikaži posljednjih $1 sati $2 dana $3",
        "watchlist-options": "Opcije spiska praćenja",
        "watching": "Pratim...",
        "confirmdeletetext": "Brisanjem ćete obrisati stranicu ili sliku zajedno sa historijom iz baze podataka, ali će se iste moći vratiti kasnije.\nMolim potvrdite svoju namjeru, da razumijete posljedice i da ovo radite u skladu sa [[{{MediaWiki:Policy-url}}|pravilima]].",
        "actioncomplete": "Akcija završena",
        "actionfailed": "Akcija nije uspjela",
-       "deletedtext": "Članak \"$1\" je obrisan.\nPogledajte $2 za zapis o skorašnjim brisanjima.",
+       "deletedtext": "Članak \"$1\" je obrisan.\nPogledajte $2 za zapisnik nedavnih brisanja.",
        "dellogpage": "Protokol brisanja",
        "dellogpagetext": "Ispod je spisak najskorijih brisanja.",
        "deletionlog": "zapis brisanja",
        "blockipsuccesssub": "Blokiranje je uspjelo",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] je {{GENDER:$1|blokiran|blokirana|blokiran}}.<br />\nPogledajte [[Special:BlockList|spisak blokiranja]] za pregled blokiranja.",
        "ipb-blockingself": "Ovom akcijom ćete blokirati sebe! Da li ste sigurni da to želite?",
-       "ipb-confirmhideuser": "Upravo ćete blokirati korisnika sa uključenom opcijom ''sakrij korisnika''. Ovim će korisničko ime biti sakriveno u svim spiskovima i stavkama zapisnika. Da li ste sigurni da to želite?",
+       "ipb-confirmhideuser": "Upravo ćete blokirati korisnika s uključenom opcijom \"Sakrij korisnika\". Ovim će korisničko ime biti sakriveno u svim spiskovima i stavkama zapisnika. Jeste li sigurni da to želite?",
        "ipb-edit-dropdown": "Uredi razloge blokiranja",
        "ipb-unblock-addr": "Deblokiraj $1",
        "ipb-unblock": "Deblokiraj korisničko ime ili IP adresu",
        "lockfilenotwritable": "Datoteka zaključavanja baze je zaštićena za pisanje.\nAko želite otključati ili zaključati bazu, ova datoteka mora biti omogućena za pisanje od strane web servera.",
        "databasenotlocked": "Baza podataka nije zaključana.",
        "lockedbyandtime": "(od $1 dana $2 u $3)",
-       "move-page": "Pomjeranje $1",
+       "move-page": "Preusmjeravanje $1",
        "move-page-legend": "Premjestite stranicu",
-       "movepagetext": "Korištenjem ovog formulara možete preimenovati stranicu, premještajući cijelu historiju na novo ime.\nČlanak pod starim imenom će postati stranica koja preusmjerava na članak pod novim imenom. \nMožete automatski izmjeniti preusmjerenje do izvornog naslova.\nAko se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].\nDužni ste provjeriti da svi linkovi i dalje nastave voditi na prave stranice.\n\nImajte na umu da članak '''neće''' biti preusmjeren ukoliko već postoji članak pod imenom na koje namjeravate da preusmjerite osim u slučaju stranice za preusmjeravanje koja nema nikakvih starih izmjena.\nTo znači da možete vratiti stranicu na prethodno mjesto ako pogriješite, ali ne možete zamijeniti postojeću stranicu.\n\n'''Pažnja!'''\nOvo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice;\nMolimo dobro razmislite prije nego što preimenujete stranicu.",
-       "movepagetext-noredirectfixer": "Koristeći obrazac ispod ćete preimenovati stranicu i premjestiti cijelu njenu historiju na novi naziv.\nStari naziv će postati preusmjerenje na novi naziv.\nMolimo provjerite da li postoje [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].\nVi ste za to odgovorni te morate provjeriti da li su linkovi ispravni i da li vode tamo gdje bi trebali.\n\nImajte na umu da stranica '''neće''' biti premještena ako već postoji stranica s tim imenom, osim ako je prazna ili je preusmjerenje ili nema ranije historije.\nOvo znali da možete preimenovati stranicu nazad gdje je ranije bila preimenovana ako ste pogriješili a ne možete ponovo preimenovati postojeću stranicu.\n\n'''Pažnja!'''\nImajte na umu da preusmjeravanje popularnog članka može biti\ndrastična i neočekivana promjena za korisnike; molimo budite sigurni da ste shvatili posljedice prije nego što nastavite.",
+       "movepagetext": "Korištenjem ovog formulara možete preimenovati stranicu, premještajući cijelu historiju na novo ime.\nČlanak pod starim imenom postat će stranica koja preusmjerava na članak pod novim imenom. \nMožete automatski izmijeniti preusmjerenje do izvornog naslova.\nAko se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].\nDužni ste provjeriti da svi linkovi i dalje nastave voditi na prave stranice.\n\nImajte na umu da članak '''neće''' biti preusmjeren ako već postoji članak pod imenom na koje ga namjeravate preusmjeriti osim u slučaju stranice za preusmjeravanje koja nema nikakvih starih izmjena.\nTo znači da možete vratiti stranicu na prethodno mjesto ako pogriješite, ali ne možete zamijeniti postojeću stranicu.\n\n'''Pažnja!'''\nOvo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice.\nMolimo da dobro razmislite prije no što preimenujete stranicu.",
+       "movepagetext-noredirectfixer": "Koristeći donji obrazac, preimenovat ćete stranicu i premjestiti cijelu njenu historiju na novi naziv.\nStari naziv postat će preusmjerenje na novi naziv.\nMolimo da provjerite postoje li [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].\nVi ste za to odgovorni te morate provjeriti jesu li linkovi ispravni i vode li tamo kamo bi trebali voditi.\n\nImajte na umu da stranica '''neće''' biti premještena ako već postoji stranica s tim imenom, osim ako je prazna ili je preusmjerenje ili nema ranije historije.\nOvo znači da možete preimenovati stranicu nazad gdje je ranije bila preimenovana ako ste pogriješili, ali ne možete ponovo preimenovati postojeću stranicu.\n\n'''Pažnja!'''\nImajte na umu da preusmjeravanje popularnog članka može biti\ndrastična i neočekivana promjena za korisnike; molimo da budete sigurni da ste shvatili posljedice prije no što nastavite.",
        "movepagetalktext": "Odgovarajuća stranica za razgovor, ako postoji, će automatski biti premještena istovremeno '''osim:'''\n*Ako premještate stranicu preko imenskih prostora,\n*Neprazna stranica za razgovor već postoji pod novim imenom, ili\n*Odčekirajte donju kutiju.\n\nU tim slučajevima, moraćete ručno da premjestite stranicu ukoliko to želite.",
        "movearticle": "Premjestite stranicu",
        "moveuserpage-warning": "'''Upozorenje:''' Premještate korisničku stranicu. Molimo da zapamtite da će se samo stranica premjestiti a korisnik se ''neće'' preimenovati.",
        "movepagebtn": "pomjerite stranicu",
        "pagemovedsub": "Premještanje uspjelo",
        "movepage-moved": "'''\"$1\" je premještena na \"$2\"'''",
-       "movepage-moved-redirect": "Pomjeranje je napravljeno.",
+       "movepage-moved-redirect": "Preusmjerenje je napravljeno.",
        "movepage-moved-noredirect": "Pravljenje preusmjerenja je onemogućeno.",
-       "articleexists": "Stranica pod tim imenom već postoji, ili je ime koje ste izabrali neispravno.  Molimo Vas da izaberete drugo ime.",
+       "articleexists": "Stranica pod tim imenom već postoji ili je ime koje ste izabrali neispravno. Molimo Vas da izaberete drugo ime.",
        "cantmove-titleprotected": "Ne možete premjestiti stranicu na ovu lokaciju, jer je novi naslov zaštićen od pravljenja",
        "movetalk": "Premjestite \"stranicu za razgovor\" takođe, ako je moguće.",
        "move-subpages": "Premjesti sve podstranice (do $1)",
        "tooltip-pt-login": "Predlažemo da se prijavite, ali nije obvezno.",
        "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-edit": "Možete uređivati ovaj članak. Molimo Vas, koristite dugme \"Prikaži izgled\" prije spašavanja izmjena.",
        "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-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-search-go": "Idi na stranicu s tačno ovim imenom ako postoji",
+       "tooltip-search-fulltext": "Pretražite stranice s ovim tekstom",
        "tooltip-p-logo": "Glavna stranica",
        "tooltip-n-mainpage": "Posjetite početnu stranicu",
        "tooltip-n-mainpage-description": "Posjetite početnu stranicu",
        "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-whatlinkshere": "Spisak svih članaka koji su povezani s 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",
        "scarytranscludefailed-httpstatus": "[Preuzimanje šablona nije uspjelo za $1: HTTP $2]",
        "scarytranscludetoolong": "[URL je predugačak]",
        "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:\n: ''$2''\n\nMolimo Vas da potvrdite da stvarno želite da ponovo napravite ovaj članak.",
-       "confirmrecreate-noreason": "Korisnik [[User:$1|$1]] ([[User talk:$1|razgovor]]) je obrisao ovaj članak pošto ste ga počeli uređivati. Molimo Vas da potvrdite da stvarno želite da ponovo napravite ovaj članak.",
+       "confirmrecreate": "Korisnik [[User:$1|$1]] ([[User talk:$1|razgovor]]) obrisao je ovaj članak pošto ste počeli uređivanje s razlogom:\n: ''$2''\n\nMolimo Vas da potvrdite da stvarno želite ponovo napraviti ovaj članak.",
+       "confirmrecreate-noreason": "Korisnik [[User:$1|$1]] ([[User talk:$1|razgovor]]) obrisao je ovaj članak nakon što ste ga počeli uređivati. Molimo Vas da potvrdite da stvarno želite ponovo napraviti ovaj članak.",
        "recreate": "Ponovno napravi",
        "unit-pixel": "px",
        "confirm_purge_button": "U redu",
        "version-poweredby-credits": "Ova wiki je zasnovana na '''[https://www.mediawiki.org/ MediaWiki]''', autorska prava zadržana © 2001-$1 $2.",
        "version-poweredby-others": "ostali",
        "version-credits-summary": "Željeli bismo se zahvaliti sljedećim ljudima na njihovom doprinosu [[Special:Version|MediaWikiju]].",
-       "version-license-info": "Mediawiki je slobodni softver, možete ga redistribuirati i/ili mijenjati pod uslovima GNU opće javne licence kao što je objavljeno od strane Fondacije Slobodnog Softvera, bilo u verziji 2 licence, ili (po vašoj volji) nekoj od kasniji verzija.\n\nMediawiki se distriburia u nadi da će biti korisna, ali BEZ IKAKVIH GARANCIJA, čak i bez ikakvih posrednih garancija o KOMERCIJALNOSTI ili DOSTUPNOSTI ZA ODREĐENU SVRHU. Pogledajte GNU opću javnu licencu za više detalja.\n\nTrebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU GNU opće javne licence] zajedno s ovim programom, ako niste, pišite Fondaciji Slobodnog Softvera na adresu  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ili je pročitajte [//www.gnu.org/licenses/old-licenses/gpl-2.0.html online].",
+       "version-license-info": "Mediawiki je slobodni softver; možete ga redistribuirati i(li) mijenjati pod uvjetima opće javne GNU licence kao što je objavljeno od strane \"Free Software Foundationa\", bilo u verziji 2 licence ili (po Vašoj volji) nekoj od kasnijih verzija.\n\nMediawiki se distribuira u nadi da će biti korisna, ali BEZ IKAKVIH GARANCIJA, čak i bez ikakvih posrednih garancija o KOMERCIJALNOSTI ili DOSTUPNOSTI ZA ODREĐENU SVRHU. Pogledajte opću javnu GNU licencu za više detalja.\n\nTrebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU opće javne GNU licence] zajedno s ovim programom. Ako niste, pišite \"Free Software Foundationu\" na adresu: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ili je pročitajte [//www.gnu.org/licenses/old-licenses/gpl-2.0.html ovdje].",
        "version-software": "Instalirani softver",
        "version-software-product": "Proizvod",
        "version-software-version": "Verzija",
        "fileduplicatesearch-info": "$1 × $2 piksel<br />Veličina datoteke: $3<br />MIME vrsta: $4",
        "fileduplicatesearch-result-1": "Datoteka \"$1\" nema identičnih dvojnika.",
        "fileduplicatesearch-result-n": "Datoteka \"$1\" ima {{PLURAL:$2|1 identičnog|$2 identična|$2 identičnih}} dvojnika.",
-       "fileduplicatesearch-noresults": "Nije pronađena datoteka sa imenom \"$1\".",
+       "fileduplicatesearch-noresults": "Nije pronađena datoteka s imenom \"$1\".",
        "specialpages": "Posebne stranice",
        "specialpages-note-top": "Legenda",
        "specialpages-note": "* Normalne posebne stranice.\n* <strong class=\"mw-specialpagerestricted\">Zaštićene posebne stranice.</strong>",
        "htmlform-no": "Ne",
        "htmlform-yes": "Da",
        "htmlform-chosen-placeholder": "Izaberite opciju",
+       "htmlform-cloner-create": "Dodaj još",
        "sqlite-has-fts": "$1 sa podrškom pretrage cijelog teksta",
        "sqlite-no-fts": "$1 bez podrške pretrage cijelog teksta",
        "logentry-delete-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3",
        "logentry-rights-rights-legacy": "$1 je {{GENDER:$2|promijenio|promijenila|promijenio}} članstvo grupe za $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$1|je automatski promijenjeno članstvo|su automatski promijenjena članstva}} iz $4 u $5",
        "rightsnone": "(nema)",
-       "feedback-bugornote": "Ako ste spremni detaljno opisati tehnički problem molimo [$1 prijavite \"bug\" (grešku)].\nInače, možete ispuniti jednostavan obrazac ispod. Vaš komentar biti će dodan na stranicu \"[$3 $2]\", zajedno s vašim korisničkim imenom i internetskog preglednika koji koristite.",
+       "feedback-bugornote": "Ako ste spremni detaljno opisati tehnički problem, molimo [$1 prijavite \"bug\" (grešku)].\nInače, možete ispuniti jednostavan obrazac ispod. Vaš komentar bit će dodan na stranicu \"[$3 $2]\" zajedno s Vašim korisničkim imenom.",
        "feedback-subject": "Tema:",
        "feedback-message": "Poruka:",
        "feedback-cancel": "Odustani",
        "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-fileexists-forbidden": "Datoteka s imenom \"$1\" već postoji, i ne može biti zamijenjena.",
+       "api-error-fileexists-forbidden": "Datoteka s imenom \"$1\" već postoji i ne može biti zamijenjena.",
        "api-error-fileexists-shared-forbidden": "Datoteka s imenom \"$1\" već postoji u zajedničkom spremištu i ne može biti prepisana.",
        "api-error-file-too-large": "Datoteka koju ste poslali je bila prevelika.",
        "api-error-filename-tooshort": "Ime datoteke je prekratko.",
index 25ce027..57bae32 100644 (file)
        "right-browsearchive": "Cercar pàgines esborrades",
        "right-undelete": "Restaurar pàgines esborrades",
        "right-suppressrevision": "Revisar i restaurar les versions amagades als administradors",
+       "right-viewsuppressed": "Mostra les revisions amagades de qualsevol usuari",
        "right-suppressionlog": "Veure registres privats",
        "right-block": "Blocar altres usuaris per a impedir-los l'edició",
        "right-blockemail": "Impedir que un usuari envii correu electrònic",
        "license": "Llicència:",
        "license-header": "Llicència",
        "nolicense": "No se n'ha seleccionat cap",
+       "licenses-edit": "Modifica les opcions de llicència",
        "license-nopreview": "(Previsualització no disponible)",
        "upload_source_url": " (un URL vàlid i accessible públicament)",
-       "upload_source_file": " (un fitxer en el vostre ordinador)",
+       "upload_source_file": " (un fitxer triat del vostre ordinador)",
        "listfiles-delete": "elimina",
        "listfiles-summary": "Aquesta pàgina especial mostra tots els fitxers carregats.\nSi filtreu per usuari només es mostraran els fitxers la versió més recent dels quals hagi estat carregada per aquell.",
        "listfiles_search_for": "Cerca el nom d'un fitxer de medis:",
        "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-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>ratllaran</del>. A més, les pàgines que tinguin fitxers incrustats que no existeixin es llistaran a [[:$1]].",
        "wantedfiletext-cat-noforeign": "Els fitxers següents s'utilitzen, però no existeixen. Addicionalment, s'enumeren a [[:$1]] les pàgines que tenen fitxers inserits que no existeixen.",
        "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>.",
        "wantedfiletext-nocat-noforeign": "Els fitxers següents s'utilitzen però no existeixen.",
        "watchlist-details": "Teniu $1 {{PLURAL:$1|pàgina|pàgines}} a la llista de seguiment, sense comptar les pàgines de discussió.",
        "wlheader-enotif": "La notificació per correu electrònic està habilitada.",
        "wlheader-showupdated": "Les pàgines que s'han canviat des de la vostra darrera visita es mostren en '''negreta'''.",
-       "wlnote2": "A continuació es presenten els canvis durant {{PLURAL:$1|l'última hora|les últimes <strong>$1</strong> hores}}, a partir de $2, $3.",
+       "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",
        "watching": "S'està vigilant...",
        "autosumm-replace": "Contingut canviat per «$1».",
        "autoredircomment": "Redirecció a [[$1]]",
        "autosumm-new": "Es crea la pàgina amb «$1».",
+       "autosumm-newblank": "S'ha creat una pàgina en blanc",
        "lag-warn-normal": "Els canvis més nous de $1 {{PLURAL:$1|segon|segons}} podrien no mostrar-se a la llista.",
        "lag-warn-high": "A causa de la lenta resposta del servidor de base de dades, els canvis més nous de $1 {{PLURAL:$1|segon|segons}} potser no es mostren aquesta llista.",
        "watchlistedit-normal-title": "Edita la llista de seguiment",
index f69fec2..d525b7b 100644 (file)
@@ -6,7 +6,9 @@
                        "Yejianfei",
                        "Hakka",
                        "아라",
-                       "Mywood"
+                       "Mywood",
+                       "Impersonator 1",
+                       "LNDDYL"
                ]
        },
        "tog-underline": "下劃綫鏈接",
        "talkpagelinktext": "討論",
        "specialpage": "特殊頁",
        "personaltools": "個人其家私",
-       "postcomment": "新其蜀段",
        "articlepage": "覷蜀覷內容頁面",
        "talk": "討論",
        "views": "覷蜀覷",
        "externaldberror": "可能是驗證數據庫鄭咯,或者是汝𣍐使升級汝其外部賬戶。",
        "login": "躒底",
        "nav-login-createaccount": "躒底/開賬戶",
-       "loginprompt": "汝著清除cookies才會底{{SITENAME}}。",
        "userlogin": "躒底/開賬戶",
        "userloginnocreate": "躒底",
        "logout": "躒出",
index 1f6960d..e295f4c 100644 (file)
@@ -25,6 +25,7 @@
        "tog-watchdefault": "ТӀетоха ас нисйина агӀонаш тергаме могӀам чу",
        "tog-watchmoves": "ТӀетоха ас цӀераш хийцина агӀонаш тергаме могӀам чу",
        "tog-watchdeletion": "ТӀетоха ас дӀаяьхна агӀонаш тергаме могӀанан чу",
+       "tog-watchrollback": "Аса нисдар юхудаькхина агӀо сан тергаме могӀанан тӀетуху",
        "tog-minordefault": "Къастам бе нисйиначарн хlумцадеш кегийра долушсанна",
        "tog-previewontop": "Чуяккха хьалххьажар тадаран кора хьалха",
        "tog-previewonfirst": "Гайта хьалххьажар тадарш да долийча",
        "hidden-category-category": "Къайлаха йолу категореш",
        "category-subcat-count": "{{PLURAL:$2|ХӀокху категори чохь ю хӀокхуьнан бухара категори.|ХӀокху категори чохь ю $1 {{PLURAL:$1|бухара категори|бухара категореш}} $2 массо нах.}}",
        "category-subcat-count-limited": "ХӀокх категори чохь {{PLURAL:$1|бухар категори|$1 бухар категореш}} ю.",
-       "category-article-count": "{{PLURAL:$2|ХӀокху категори чохь яц цхьа агӀо бе.|{{PLURAL:$1|Гойту $1 агӀо|Гойту $1 агӀонаш}} хӀокху категорешца кху $2.}}",
+       "category-article-count": "{{PLURAL:$2|ХӀокху категори чохь яц цхьа агӀо бе.|ХӀокху категори чохь ю $2 агӀо, царах агӀонгахь {{PLURAL:$1|гойту $1 агӀо}}}}",
        "category-article-count-limited": "ХӀокху категори чохь {{PLURAL:$1|$1 агӀо|$1 агӀонаш}} цхьа агӀо бен яц.",
        "category-file-count": "{{PLURAL:$2|ХӀокху категори чохь цхьа файл бе яц.|{{PLURAL:$1|Гойту $1 файл|Гойту $1 файлаш}} хӀокху категорешца кху $2.}}",
        "category-file-count-limited": "ХӀокху категори чохь {{PLURAL:$1|$1 файл|$1 файлаш|1=цхьаъ бен файл яц}}.",
        "preview": "Хьалха муха ю хьажа",
        "showpreview": "Хьалха муха ю хьажар",
        "showdiff": "Хlоттина болу хийцам",
+       "blankarticle": "<strong>ДӀахьедар:</strong> Ахьа кхуллуш йолу агӀо еса ю.\nЮху кнопка «{{int:savearticle}}» тӀетаӀаяхь, агӀо цхьа чулацам боцуш кхуллур ю.",
        "anoneditwarning": "'''Тергам бе''': Ахьа хьай цӀарца тадарш деш дац. Хьан IP-адрес дӀаяздина хира ду хӀокху агӀон истори чу.",
        "anonpreviewwarning": "''Системин чу цагӀахь хьан IP-адрес агӀона истори чу дӀаяз лур ду.''",
        "missingcommenttext": "Дехар до дӀаязбе хайн хаам лахахь.",
        "rev-deleted-event": "(дӀаяздар дӀаяьккхина)",
        "rev-deleted-user-contribs": "[декъашхочун цӀе я IP-адрес дӀаяхина — къинхьегаман агӀонгара нисдар къайлаяьккхина]",
        "rev-deleted-text-permission": "ХӀара агӀона верси '''дӀаяьккхина''' ю.\nБахьна далина [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяьхнарш йолу тептар чохь].",
+       "rev-suppressed-text-permission": "ХӀара агӀона верси <strong>къайлаяьккхина ю</strong>.\nБахьна далина [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} къайлаяьхарш йолу тептар чохь].",
        "rev-deleted-text-unhide": "ХӀара агӀона верси '''дӀаяьккхина''' ю.\nБахьна далина [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяьхнарш йолу тептар чохь].\nХьайна лаахь хьа йиш ю [$1 и верси хьажа].",
        "rev-suppressed-text-unhide": "ХӀара агӀона верси '''къайлаяьккхина''' ю.\nБахьна далина [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяьхнарш йолу тептар чохь].\nХьайна лаахь хьа йиш ю [$1 и верси хьажа].",
        "rev-deleted-text-view": "ХӀара агӀона верси '''дӀаяьккхина''' ю.\nБахьна далина [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяьхнарш йолу тептар чохь].",
        "license": "Бакъойалар:",
        "license-header": "Бакъойалар",
        "nolicense": "Яц",
+       "licenses-edit": "Лицензин параметраш хийца",
        "license-nopreview": "(Хьалха муха ю хьажа цало)",
-       "upload_source_file": " (файл хьан компьютер чохь ю)",
+       "upload_source_url": "(ахьа хаьржина нийса, массо тӀекхочу интернет-адрес)",
+       "upload_source_file": "(файл хьан компьютер чохь ю)",
        "listfiles-delete": "дӀаяккха",
        "listfiles-summary": "Лахахь гойтуш ю ерриг файлаш.\nДекъашхо къастичи, цун керла файлаш гойту.",
        "listfiles_search_for": "Лаха хIуман цIарца:",
        "mostimages": "Массарел дуккха лелайо файлаш",
        "mostinterwikis": "Дуккха юкъарвики хьажоргаш тӀе тоьхна йолу агӀонаш",
        "mostrevisions": "Сих сиха нисйина йолу агӀонаш",
-       "prefixindex": "Ð¥Ñ\8cалÑ\85а Ð°Ð³Ó\80онаÑ\88ан Ñ\86Ó\80еÑ\80аÑ\88 Ñ\85Ó\80оÑ\82Ñ\82о Ð¹еза",
+       "prefixindex": "Ð¥Ñ\8cалÑ\85а Ð°Ð³Ó\80онийн Ñ\86Ó\80еÑ\80аÑ\88 Ñ\85Ó\80оÑ\82Ñ\82о еза",
        "prefixindex-namespace": "Хьалха агӀонашан цӀераш хӀотто еза («{{ns:$1}}»)",
        "prefixindex-strip": "Хиламийн могӀам чура префикс къайлаяккха",
        "shortpages": "Боца яззамаш",
        "emailsend": "ДӀадахьийта",
        "emailccme": "Соьга а кхосса хааман копи.",
        "emailccsubject": "$1: $2 бохьуьтучу хааман копи",
-       "emailsent": "Ð\9aеÑ\85аÑ\82 Ð´Ó\8fадахьийтина",
+       "emailsent": "Ð\9aеÑ\85аÑ\82 Ð´Ó\80адахьийтина",
        "emailsenttext": "Хьан электроннан хаам дӏабахьийтина.",
        "emailuserfooter": "ХӀара хаам бахийтинера $1 {{GENDER:$1|декъащхочо}} $2 {{GENDER:$2|декъащхочунга}} «декъашхочунга хаам» олучу функцин гӀоьнца {{SITENAME}} проектан.",
        "usermessage-summary": "Битта системан хаам.",
        "watchlist-details": "Хьан тергаме могӀанца $1 {{PLURAL:$1|агӀо}} ю, дийцаре агӀонаш йоцуш.",
        "wlheader-enotif": "Электронан почте хаамаш байтар латина ду.",
        "wlheader-showupdated": "Хийцам бина агӀонаш '''Ӏаьржа''' шрифтцан билгальяха ю.",
-       "wlnote2": "Лахахьа гайтина {{PLURAL:$1|тӀеххьара сахьт}} чохь бина хийцамаш $2 $3.",
+       "wlnote": "Лахахьа {{PLURAL:$1|тlаьхьа богlу $1 хийцам|тlаьхьа богlу $1 хийцамаш|тlаьхьа богlу $1 хийцамаш}} хlокху {{PLURAL:$2|тlаьхьар|тlаьхьара|тlаьхьара}} <strong>$2</strong> {{PLURAL:$2|сохьт|сохьатехь|сохьташкахь}}.",
        "wlshowlast": "Гайта тӀаьххьара $1 сахьт $2 де $3",
        "watchlist-options": "Тергаме могlаман гlирс нисбар",
        "watching": "Тергаме мlогаман юкъаяккха…",
        "undelete-error-long": "Файл меттахӀоттош гӀалат даьлла:\n\n$1",
        "undelete-show-file-submit": "Хlаъ",
        "namespace": "Цlерийн ана:",
-       "invert": "Хаьржинарг хилийта",
+       "invert": "Хаьржинарг къайлаяккха",
        "tooltip-invert": "ХӀоттае хӀара билгало, хаьржинчу цӀерийн меттиган агӀонашан хийцамаш къайлабаха (кхин дихкина цӀерийн меттигаш, гайтина елахь)",
        "namespace_association": "Йихкина меттиг",
        "tooltip-namespace_association": "ХӀоттае хӀара билгало, иштта дийцарийн (я кхин) цӀерийн меттиг юкъахь хилийта",
        "sp-contributions-newonly": "АгӀонаш кхоллар бен ма гайта",
        "sp-contributions-submit": "Лаха",
        "whatlinkshere": "Хьажоргаш кхузе",
-       "whatlinkshere-title": "ХӀокхунца «$1» йолу агӀонаш",
+       "whatlinkshere-title": "«$1» тӀе хьажоргаш йолу агӀонаш",
        "whatlinkshere-page": "Агlо:",
        "linkshere": "ТӀаьхьайогӀу агӀонаш оцу '''[[:$1]]''': хьажорагца ю",
        "nolinkshere": "ХӀокху '''[[:$1]]''' агӀона тӀе кхечу агӀонашкахь хьажоргаш яц.",
        "import-upload": "Чуяха XML-хаамаш",
        "import-token-mismatch": "Сеансан хаамаш дӀадайна. Дехар до, юху гӀорта.",
        "import-invalid-interwiki": "Билгалйина вики чура импорт ян йиш яц.",
-       "import-error-special": "«$1» агӀо импорт йина яц, и къастина цӀерийн меттигашан юкъайогӀуш хиларна.",
+       "import-error-edit": "«$1» агӀо хьуна таян цамагор бахьнехь и импорт цайина.",
+       "import-error-create": "«$1» агӀо хьуна кхолла цамагор бахьнехь и импорт цайина.",
+       "import-error-interwiki": "«$1» агӀо импорт ца йина, цуна цӀе арахьара хьажоргашна (юкъаравикешна) кечйина хилар бахьнехь.",
+       "import-error-special": "«$1» агӀо импорт йина яц, и къастина цӀерийн меттигийн юкъайогӀуш хиларна.",
+       "import-error-invalid": "«$1» агӀо импорт цайина, оцунна импорт еш йолу цӀе хӀокху вики чохь ца магийна хилар бахьнехь.",
        "importlogpage": "Импортан тептар",
        "importlogpagetext": "Куьйгалхоша агӀонаш импорт яр царна бина хийцамашца кхечу википедеш чура.",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|верси|версеш}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|верси импорт йина|версеш импорт йина}}",
        "import-logentry-interwiki": "«$1» — викиюкъара импорт",
-       "import-logentry-interwiki-detail": "$2 чура $1 {{PLURAL:$1|верси|версеш}}",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|верси импорт йина|версеш импорт йина}} $2 чура",
        "javascripttest": "JavaScript хьажар",
        "javascripttest-title": "$1 хьожуш бу",
        "tooltip-pt-userpage": "Декъашхочуьна агlо",
        "minutes-abbrev": "$1 мин",
        "hours-abbrev": "$1 сахь.",
        "seconds": "{{PLURAL:$1|$1 секунд|$1 секунд}}",
-       "minutes": "{{PLURAL:$1|$1 минут|$1 минут}}",
+       "minutes": "{{PLURAL:$1|$1 минот|$1 минот}}",
        "hours": "{{PLURAL:$1|$1 сахьт|$1 сахьт}}",
        "days": "{{PLURAL:$1|$1 де|$1 де}}",
        "weeks": "{{PLURAL:$1|$1 кӀира}}",
        "ago": "$1 хьалха",
        "just-now": "хӀинца",
        "hours-ago": "$1 {{PLURAL:$1|сахьт}}",
-       "minutes-ago": "$1 {{PLURAL:$1|минут}} хьалха",
+       "minutes-ago": "$1 {{PLURAL:$1|минот}} хьалха",
        "seconds-ago": "$1 {{PLURAL:$1|секунд}} хьалха",
        "monday-at": "оршотан дийнахь $1",
        "tuesday-at": "шинара дийнахь $1",
        "autosumm-replace": "АгӀона чуьраниг хийцина → «$1»",
        "autoredircomment": "[[$1]] тӀе хьажийна",
        "autosumm-new": "Керла агlо: «$1»",
+       "autosumm-newblank": "Кхоьллина еса агӀо",
        "watchlistedit-normal-title": "Тергаме могӀанийн хийцамаш",
        "watchlistedit-normal-legend": "Тергаме могӀам юкъар дӀаяккхар",
        "watchlistedit-normal-explain": "Лахахь гойту хьан тергаме могӀамехь йолу агӀонаш.\nДӀаяздарш дӀадаха билгалде уьш такха тӀетаӀе кнопка «{{int:Watchlistedit-normal-submit}}».\nКхин хьа йиш ю [[Special:EditWatchlist/raw|йозан кепар могӀом нисба ]].",
        "watchlisttools-clear": "Тергаман могӀам дӀацӀанбан",
        "watchlisttools-view": "МогӀам чура агӀонашан хийцамаш",
        "watchlisttools-edit": "Хьажа/нисбé могӀам",
-       "watchlisttools-raw": "Йоза санна нисдé",
+       "watchlisttools-raw": "Йоза санна тае",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|дийцаре]])",
        "version": "Верси MediaWiki",
        "version-extensions": "ДӀахӀоттийна шордарш",
        "api-error-uploaddisabled": "ХӀокху вики чохь файлаш чуяхар дӀадайина ду.",
        "api-error-verification-error": "ХӀара файл йоьхна я хила цаеза тайпан хила мега.",
        "duration-seconds": "$1 {{PLURAL:$1|секунд}}",
-       "duration-minutes": "$1 {{PLURAL:$1|минут}}",
+       "duration-minutes": "$1 {{PLURAL:$1|минот}}",
        "duration-hours": "$1 {{PLURAL:$1|сахьт}}",
        "duration-days": "$1 {{PLURAL:$1|де}}",
        "duration-weeks": "$1 {{PLURAL:$1|кӀира}}",
index 69dddfb..9f45222 100644 (file)
@@ -42,6 +42,7 @@
        "tog-watchdefault": "Přidávat mnou editované stránky a soubory ke sledovaným",
        "tog-watchmoves": "Přidávat mnou přesouvané stránky a soubory mezi sledované",
        "tog-watchdeletion": "Přidávat stránky a soubory, které smažu, mezi sledované",
+       "tog-watchrollback": "Přidávat stránky, které jsem {{GENDER:|vrátil|vrátila}} zpět, ke sledovaným",
        "tog-minordefault": "Označovat editace implicitně jako malé",
        "tog-previewontop": "Zobrazovat náhled před editačním oknem (ne za ním)",
        "tog-previewonfirst": "Zobrazit při první editaci náhled",
        "loginerror": "Chyba při přihlašování",
        "createacct-error": "Chyba při zakládání účtu",
        "createaccounterror": "Nepodařilo se vytvořit uživatelský účet: $1",
-       "nocookiesnew": "Uživatelský účet byl vytvořen, ale nejste přihlášeni. {{SITENAME}} používá cookies k přihlášení uživatelů. Vy máte cookies vypnuty. Prosím zapněte je a přihlaste se znovu s vaším novým uživatelským jménem a heslem.",
+       "nocookiesnew": "Uživatelský účet byl vytvořen, ale nejste přihlášeni. {{SITENAME}} používá cookies k přihlášení uživatelů. Vy máte cookies vypnuty. Prosím, zapněte je a poté se přihlaste svým novým uživatelským jménem a heslem.",
        "nocookieslogin": "{{SITENAME}} používá cookies k přihlášení uživatelů. Vy máte cookies vypnuty. Prosím zapněte je a zkuste znovu.",
        "nocookiesfornew": "Uživatelský účet nebyl založen, neboť jsme nebyli schopni potvrdit jeho původ.\nUjistěte se, že máte povoleny cookies, obnovte tuto stránku a zkuste to znovu.",
        "noname": "Musíte uvést jméno svého účtu.",
        "preview": "Náhled",
        "showpreview": "Ukázat náhled",
        "showdiff": "Ukázat změny",
+       "blankarticle": "<strong>Upozornění:</strong> Stránka, kterou se chystáte založit, je prázdná. Pokud ještě jednou kliknete na „{{int:savearticle}}“, bude založena zcela bez obsahu.",
        "anoneditwarning": "'''Varování:''' Nejste přihlášen(a). Vaše IP adresa bude zveřejněna v historii této stránky.",
        "anonpreviewwarning": "''Nejste přihlášen(a). Uložením zveřejníte svou IP adresu v historii této stránky.''",
        "missingsummary": "'''Připomenutí:''' Nezadali jste shrnutí editace. Pokud ještě jednou kliknete na Uložit změny, bude vaše editace zapsána bez shrnutí.",
        "rev-deleted-event": "(záznam odstraněn)",
        "rev-deleted-user-contribs": "[uživatelské jméno nebo IP adresa odstraněny – editace v příspěvcích skryta]",
        "rev-deleted-text-permission": "Tato revize byla '''smazána'''.\nPodrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} knize smazaných stránek].",
+       "rev-suppressed-text-permission": "Tato revize byla <strong>utajena</strong>. Podrobnosti jsou uvedeny v [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} knize utajení].",
        "rev-deleted-text-unhide": "Tato revize byla '''smazána'''.\nPodrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} knize smazaných stránek].\nPokud chcete, můžete si přesto [$1 tuto revizi prohlédnout].",
        "rev-suppressed-text-unhide": "Tato revize byla '''utajena'''.\nPodrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} záznamu utajení].\nPokud chcete, můžete si přesto [$1 tuto revizi prohlédnout].",
        "rev-deleted-text-view": "Tato revize byla '''smazána'''.\nMůžete si ji prohlédnout; podrobnosti jsou uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} knize smazaných stránek].",
        "revdelete-text-text": "Smazané editace se budou i nadále zobrazovat v historii stránky, ale části jejich obsahu nebudou veřejně přístupné.",
        "revdelete-text-file": "Smazané verze souborů se budou i nadále zobrazovat v historii stránky, ale části jejich obsahu nebudou veřejně přístupné.",
        "logdelete-text": "Smazané protokolovací záznamy se budou i nadále zobrazovat v historii stránky, ale části jejich obsahu nebudou veřejně přístupné.",
-       "revdelete-text-others": "Ostatní správci {{grammar:2sg|{{SITENAME}}}} budou i nadále moci ke skrytému obsahu přistupovat a mohou ho pomocí stejného rozhraní obnovit, pokud nejsou nastavena dodatečná omezení.",
+       "revdelete-text-others": "Ostatní správci budou i nadále moci ke skrytému obsahu přistupovat a mohou ho obnovit, pokud nejsou nastavena dodatečná omezení.",
        "revdelete-confirm": "Prosím potvrďte, že to opravdu chcete učinit, že si uvědomujete důsledky a že je to v souladu s [[{{MediaWiki:Policy-url}}|pravidly]].",
        "revdelete-suppress-text": "Utajování by se mělo používat '''pouze''' v následujících případech:\n* Potenciálně pomlouvačné informace\n* Nevhodné osobní údaje\n*: ''adresy bydliště a telefonní čísla, rodná čísla apod.''",
        "revdelete-legend": "Nastavit omezení viditelnosti",
        "right-deletedtext": "Prohlížení smazaného textu a rozdílů mezi smazanými verzemi",
        "right-browsearchive": "Vyhledávání ve smazaných stránkách",
        "right-undelete": "Obnovování smazaných stránek",
-       "right-suppressrevision": "Prohlížení a obnovování revizí skrytých před správci",
+       "right-suppressrevision": "Prohlížení, skrývání a odkrývání revizí skrytých před všemi uživateli",
+       "right-viewsuppressed": "Prohlížení revizí skrytých před všemi uživateli",
        "right-suppressionlog": "Prohlížení skrytých protokolovacích záznamů",
        "right-block": "Blokování možnosti editace ostatním uživatelům",
        "right-blockemail": "Blokování možnosti poslat e-mail",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vizte též [[Special:NewPages|seznam nových stránek]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Níže jsou změny od <strong>$2</strong> ({{PLURAL:$1|zobrazena|zobrazeny|zobrazeno}} nejvýše <strong>$1</strong>).",
+       "rcnotefrom": "Níže {{PLURAL:$5|je změna|jsou změny}} od <strong>$3, $4</strong> ({{PLURAL:$1|zobrazena|zobrazeny|zobrazeno}} nejvýše <strong>$1</strong>).",
        "rclistfrom": "Ukázat nové změny, počínaje od $2, $3",
        "rcshowhideminor": "$1 malé editace",
        "rcshowhideminor-show": "Zobrazit",
        "nolicense": "Bez udání licence",
        "licenses-edit": "Editovat nabídku licencí",
        "license-nopreview": "(Náhled není dostupný)",
-       "upload_source_url": " (platné, veřejně přístupné URL)",
-       "upload_source_file": " (soubor ve vašem počítači)",
+       "upload_source_url": "(vybraný soubor z platného, veřejně přístupného URL)",
+       "upload_source_file": "(vybraný soubor z vašeho počítače)",
        "listfiles-delete": "smazat",
        "listfiles-summary": "Tato speciální stránka zobrazuje všechny načtené soubory.",
        "listfiles_search_for": "Hledat soubor podle názvu:",
        "watchlist-details": "Na vašem seznamu sledovaných stránek {{PLURAL:$1|je $1 stránka|jsou $1 stránky|je $1 stránek}}, nepočítaje v to diskusní stránky.",
        "wlheader-enotif": "Upozorňování e-mailem je zapnuto.",
        "wlheader-showupdated": "Stránky, které se změnily od vaší poslední návštěvy, jsou zobrazeny '''tučně'''.",
-       "wlnote2": "Níže jsou změny za {{PLURAL:$1|poslední hodinu|poslední <strong>$1</strong> hodiny|posledních <strong>$1</strong> hodin}} do $3, $2.",
+       "wlnote": "Níže {{PLURAL:$1|je poslední změna|jsou poslední <strong>$1</strong> změny|je posledních <strong>$1</strong> změn}} za {{PLURAL:$2|poslední hodinu|poslední <strong>$2</strong> hodiny|posledních <strong>$2</strong> hodin}} do $4, $3.",
        "wlshowlast": "Ukázat posledních $1 hodin $2 dnů $3",
        "watchlist-options": "Možnosti sledovaných stránek",
        "watching": "Přidávám na seznam sledovaných stránek…",
        "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-error-interwiki": "Stránka „$1“ se nenaimportovala, protože její název je vyhrazen pro externí odkazy (interwiki).",
+       "import-error-special": "Stránka „$1“ se nenaimportovala, protože patří do speciálního jmenného prostoru, ve kterém stránky být nemohou.",
+       "import-error-invalid": "Stránka „$1“ se nenaimportovala, protože název, do kterého by se naimportovala, je na této wiki nepoužitelný.",
        "import-error-unserialize": "Nepodařilo se deserializovat revizi $2 stránky „$1“. Revize měla používat model obsahu $3 serializovaný jako $4.",
        "import-error-bad-location": "Revizi $2 používající obsahový model $3 nelze uložit na \"$1\" na této wiki, neboť tento model není na této stránce podporován.",
        "import-options-wrong": "{{PLURAL:$2|Chybná volba|Chybné volby}}: <nowiki>$1</nowiki>",
        "importlogpage": "Kniha importů",
        "importlogpagetext": "Na této stránce se zobrazují správcovské importy stránek včetně historie editací z jiných wiki.",
        "import-logentry-upload": "naimportoval [[$1]] načtením souboru",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revizi|revize|revizí}}",
+       "import-logentry-upload-detail": "{{PLURAL:$1|naimportována $1 revize|naimportovány $1 revize|naimportováno $1 revizí}}",
        "import-logentry-interwiki": "přenesl $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revizi|revize|revizí}} z $2",
+       "import-logentry-interwiki-detail": "{{PLURAL:$1|naimportována $1 revize|naimportovány $1 revize|naimportováno $1 revizí}} z $2",
        "javascripttest": "Testování JavaScriptu",
        "javascripttest-title": "Spouštějí se testy v $1",
        "javascripttest-pagetext-noframework": "Tato stránka je vyhrazena pro spouštění testů JavaScriptu.",
        "autosumm-replace": "Obsah stránky nahrazen textem „$1“",
        "autoredircomment": "Přesměrování na [[$1]]",
        "autosumm-new": "Založena nová stránka s textem „$1“",
+       "autosumm-newblank": "Založena prázdná stránka",
        "size-kilobytes": "$1 KB",
        "lag-warn-normal": "Změny za {{PLURAL:$1|poslední sekundu|poslední $1 sekundy|posledních $1 sekund}} nemusí být v tomto seznamu zobrazeny.",
        "lag-warn-high": "Protože je databázový server právě mimořádně vytížen, nemusí být změny za {{PLURAL:$1|poslední sekundu|poslední $1 sekundy|posledních $1 sekund}} v tomto seznamu zobrazeny.",
index c2efafd..01f293f 100644 (file)
@@ -91,6 +91,7 @@
        "tog-watchdefault": "Selbst geänderte Seiten und Dateien automatisch beobachten",
        "tog-watchmoves": "Selbst verschobene Seiten und Dateien automatisch beobachten",
        "tog-watchdeletion": "Selbst gelöschte Seiten und Dateien automatisch beobachten",
+       "tog-watchrollback": "Seiten der Beobachtungsliste hinzufügen, bei denen ich eine Zurücksetzung durchgeführt habe.",
        "tog-minordefault": "Eigene Änderungen standardmäßig als geringfügig markieren",
        "tog-previewontop": "Vorschau oberhalb des Bearbeitungsfensters anzeigen",
        "tog-previewonfirst": "Beim ersten Bearbeiten immer die Vorschau anzeigen",
        "preview": "Vorschau",
        "showpreview": "Vorschau zeigen",
        "showdiff": "Änderungen zeigen",
+       "blankarticle": "<strong>Warnung:</strong> Die Seite, die du erstellst, ist leer.\nWenn du erneut auf „{{int:savearticle}}“ klickst, wird die Seite ohne Inhalt erstellt.",
        "anoneditwarning": "Du bearbeitest diese Seite unangemeldet. Wenn du sie abspeicherst, wird deine aktuelle IP-Adresse in der Versionsgeschichte aufgezeichnet und ist damit unwiderruflich '''öffentlich''' einsehbar.",
        "anonpreviewwarning": "''Du bist nicht angemeldet. Beim Speichern wird deine IP-Adresse in der Versionsgeschichte aufgezeichnet.''",
        "missingsummary": "'''Hinweis:''' Du hast keine Zusammenfassung angegeben. Wenn du erneut auf „{{int:savearticle}}“ klickst, wird deine Änderung ohne Zusammenfassung übernommen.",
        "rev-deleted-event": "(Logbuchaktion entfernt)",
        "rev-deleted-user-contribs": "[Benutzername oder IP-Adresse entfernt – Bearbeitung aus Beiträgen versteckt]",
        "rev-deleted-text-permission": "Diese Version wurde '''gelöscht'''.\nNähere Angaben zum Löschvorgang sowie eine Begründung stehen im [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch].",
+       "rev-suppressed-text-permission": "Diese Seitenversion wurde <strong>unterdrückt</strong>.\nEinzelheiten können im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Oversight-Logbuch] gefunden werden.",
        "rev-deleted-text-unhide": "Diese Version wurde '''gelöscht'''.\nNähere Angaben stehen im [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch].\nDu kannst [$1 diese Version einsehen], sofern du möchtest.",
        "rev-suppressed-text-unhide": "Diese Version wurde '''unterdrückt'''.\nNähere Angaben stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Unterdrückungs-Logbuch].\nDu kannst [$1 diese Version einsehen], sofern du möchtest.",
        "rev-deleted-text-view": "Diese Version wurde '''gelöscht'''.\nDu kannst sie einsehen, sofern du möchtest. Nähere Angaben stehen im [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch].",
        "revdelete-text-text": "Gelöschte Versionen verbleiben noch in der Versionsgeschichte, jedoch sind Teile ihres Inhalts für die Öffentlichkeit nicht zugänglich.",
        "revdelete-text-file": "Gelöschte Dateiversionen verbleiben noch in der Datei-Versionsgeschichte, jedoch sind Teile ihres Inhalts für die Öffentlichkeit nicht zugänglich.",
        "logdelete-text": "Gelöschte Logbucheinträge verbleiben noch in den Logbüchern, jedoch sind Teile ihres Inhalts für die Öffentlichkeit nicht zugänglich.",
-       "revdelete-text-others": "Andere Administratoren auf {{SITENAME}} haben noch Zugriff auf den versteckten Inhalt und können ihn auch mithilfe dieser Spezialseite wiederherstellen, solange keine zusätzlichen Beschränkungen festgelegt werden.",
+       "revdelete-text-others": "Andere Administratoren haben noch Zugriff auf den versteckten Inhalt und können ihn auch wiederherstellen, solange keine zusätzlichen Beschränkungen festgelegt werden.",
        "revdelete-confirm": "Bitte bestätige, dass du beabsichtigst, dies zu tun, die Konsequenzen verstehst und es in Übereinstimmung mit den [[{{MediaWiki:Policy-url}}|Richtlinien]] tust.",
        "revdelete-suppress-text": "Unterdrückungen sollten '''nur''' in den folgenden Fällen vorgenommen werden:\n* Potentiell beleidigende Informationen\n* Unangebrachte persönliche Informationen\n*: ''Adressen, Telefonnummern, Sozialversicherungsnummern etc.''",
        "revdelete-legend": "Setzen der Sichtbarkeitseinschränkungen",
        "preferences": "Einstellungen",
        "mypreferences": "Einstellungen",
        "prefs-edits": "Anzahl der Bearbeitungen:",
-       "prefsnologintext2": "Du musst dich $1, um Benutzereinstellungen festzulegen.",
+       "prefsnologintext2": "$1, um deine Benutzereinstellungen festzulegen.",
        "prefs-skin": "Benutzeroberfläche",
        "skin-preview": "Vorschau",
        "datedefault": "Standard",
        "right-deletedtext": "Gelöschte Texte und Versionsunterschiede zwischen gelöschten Versionen ansehen",
        "right-browsearchive": "Nach gelöschten Seiten suchen",
        "right-undelete": "Seiten wiederherstellen",
-       "right-suppressrevision": "Versionen ansehen und wiederherstellen, die auch vor Administratoren verborgen sind",
+       "right-suppressrevision": "Bestimmte Versionen vor jedem Benutzer verstecken, wiederherstellen und anschauen",
+       "right-viewsuppressed": "Vor jedem Benutzer versteckte Versionen ansehen",
        "right-suppressionlog": "Private Logbücher ansehen",
        "right-block": "Benutzer sperren (Schreibrecht)",
        "right-blockemail": "Benutzer am Versenden von E-Mails hindern",
        "recentchanges-legend-heading": "'''Legende:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (siehe auch die [[Special:NewPages|Liste neuer Seiten]])",
        "recentchanges-legend-plusminus": "''(±123)''",
-       "rcnotefrom": "Angezeigt werden die Änderungen seit <strong>$2</strong> (max. <strong>$1</strong> Einträge).",
+       "rcnotefrom": "Angezeigt {{PLURAL:$5|wird die Änderung|werden die Änderungen}} seit <strong>$3, $4</strong> (max. <strong>$1</strong> Einträge).",
        "rclistfrom": "Nur Änderungen seit $3, $2 Uhr zeigen.",
        "rcshowhideminor": "Kleine Änderungen $1",
        "rcshowhideminor-show": "anzeigen",
        "nolicense": "Keine Vorauswahl",
        "licenses-edit": "Lizenzoptionen bearbeiten",
        "license-nopreview": "(es ist keine Vorschau verfügbar)",
-       "upload_source_url": " (gültige, öffentlich zugängliche URL)",
-       "upload_source_file": " (eine Datei auf deinem Computer)",
+       "upload_source_url": "(deine ausgewählte Datei von einer gültigen, öffentlich zugänglichen URL)",
+       "upload_source_file": "(deine ausgewählte Datei von deinem Computer)",
        "listfiles-delete": "löschen",
        "listfiles-summary": "Diese Spezialseite listet alle hochgeladenen Dateien auf.",
        "listfiles_search_for": "Suche nach Datei:",
        "watchlist-details": "Du beobachtest {{PLURAL:$1|eine Seite|$1 Seiten}}, ohne dass Diskussionsseiten getrennt gezählt werden.",
        "wlheader-enotif": "Der E-Mail-Benachrichtigungsdienst ist aktiviert.",
        "wlheader-showupdated": "Seiten mit noch nicht gesehenen Änderungen werden '''fett''' dargestellt.",
-       "wlnote2": "Es folgen die Änderungen der letzten {{PLURAL:$1|Stunde|<strong>$1</strong> Stunden}}. Stand: $2, $3.",
+       "wlnote": "Es {{PLURAL:$1|folgt die letzte Änderung|folgen die letzten <strong>$1</strong> Änderungen}} der letzten {{PLURAL:$2|Stunde|<strong>$2</strong> Stunden}}. Stand: $3, $4 Uhr.",
        "wlshowlast": "Zeige die Änderungen der letzten $1 Stunden, $2 Tage oder $3.",
        "watchlist-options": "Anzeigeoptionen",
        "watching": "Beobachten …",
        "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-error-invalid": "Seite „$1“ wurde nicht importiert, da der Name, zu dem sie importiert werden würde, auf diesem Wiki nicht gültig ist.",
        "import-error-unserialize": "Die Version $2 der Seite „$1“ konnte nicht deserialisiert werden. Die Version wurde zur Verwendung des Inhaltsmodells $3 gemeldet, das als $4 serialisiert ist.",
        "import-error-bad-location": "Die Version $2, die das Inhaltsmodell $3 verwendet, kann auf diesem Wiki nicht unter „$1“ gespeichert werden, da dieses Modell auf dieser Seite nicht unterstützt wird.",
        "import-options-wrong": "Falsche {{PLURAL:$2|Option|Optionen}}: <nowiki>$1</nowiki>",
        "importlogpage": "Import-Logbuch",
        "importlogpagetext": "Administrativer Import von Seiten mit Versionsgeschichte von anderen Wikis.",
        "import-logentry-upload": "importierte „[[$1]]“ von einer Datei",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|Version|Versionen}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|Version|Versionen}} importiert",
        "import-logentry-interwiki": "importierte „$1“ (Transwiki)",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|Version|Versionen}} von $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|Version|Versionen}} von $2 importiert",
        "javascripttest": "JavaScript-Test",
        "javascripttest-title": "$1-Tests werden durchgeführt",
        "javascripttest-pagetext-noframework": "Diese Seite ist JavaSkript-Tests vorbehalten.",
        "autosumm-replace": "Der Seiteninhalt wurde durch einen anderen Text ersetzt: „$1“",
        "autoredircomment": "Weiterleitung nach [[$1]] erstellt",
        "autosumm-new": "Die Seite wurde neu angelegt: „$1“",
+       "autosumm-newblank": "Leere Seite erstellt",
        "size-bytes": "$1 Bytes",
        "size-megabytes": "$1 MB",
        "size-gigabytes": "$1 GB",
index 0ed4a54..275088a 100644 (file)
        "editwarning-warning": "Wexto ke şıma na pele ra veciyê, beno ke vurnayışê şıma vindi bê.\nEke şıma kewtê hesabê xo, şıma şenê nê balantışi qısmê \"{{int:prefs-editing}}\"i de tercihanê xo ra bıvındarnê.",
        "editpage-notsupportedcontentformat-title": "Formatê zerreki qebul nêbeno",
        "content-model-wikitext": "wikimetin",
-       "content-model-text": "duz metin",
+       "content-model-text": "metno pan",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "expensive-parserfunction-warning": "Hişyari: No pel de fonksiyoni zaf esti.\n\nNo $2 daweti ra gani tay bıbo, na hel {{PLURAL:$1|1 dawet esto|$1 dawet esto}}.",
        "watchlist-details": "{{PLURAL:$1|$1 pele|$1 peleyan}} listeyê seyr-kerdışi şıma dı, peleyanê vurnayışi dahil niyo.",
        "wlheader-enotif": "E-mail xeber dayiş abiyo.",
        "wlheader-showupdated": "ziyaretê şıma ye peyini de vuryayişê peli pê '''nuşteyo qalıni''' mocyayo.",
-       "wlnote2": "Cêr vurnayışê {{PLURAL:$1|saeta|<strong>$1</strong> saetanê}} peyênan estê, $2 ra be hetan $3.",
+       "wlnote": "$3 seate u bahde $4 deqa dıma {{PLURAL:$2|ju seate dı|'''$2''' ju seate dı}} {{PLURAL:$1|vurnayışe peyeni|vurnayışe '''$1''' peyeni}} cêrdeyê",
        "wlshowlast": "Peyni de vurnayışan ra  $1 seata u $2 roca $3 bımocnê",
        "watchlist-options": "Tercihê liste da seyri",
        "watching": "Seyr ke...",
index 4f6e294..6641fbd 100644 (file)
        "talkpagelinktext": "Discusiòun",
        "specialpage": "Pàgina specêla",
        "personaltools": "Strumèint persunêl",
-       "postcomment": "Sesiòun nōva",
        "articlepage": "Guêrda la pàgina",
        "talk": "Discusiòun",
        "views": "Vîşiti",
        "externaldberror": "È sucès un erōr cun al terminêl ed certificasiòun ed validitê d'ed fōra, opór an 's gh'à mìa al j autorişasiòun necesâri per arnuvêr l' ingrès d'ed fōra.",
        "login": "Và dèinter",
        "nav-login-createaccount": "Và dèinter / Fà la tó inscrisiòun",
-       "loginprompt": "Per andêr dèinter a {{SITENAME}} l'é necesâri permèter i cookie.",
        "userlogin": "Và dèinter / Fà la tó inscrisiòun",
        "userloginnocreate": "Và dèinter",
        "logout": "Và fōra",
        "revdelete-text-text": "Al versiòun scanşlêdi as vèden incòra int la stòria 'd la pàgina, mó pcòun ed còl che gh'é dèinter al srà mìa vést dal póblich.",
        "revdelete-text-file": " Al versiòun di file scanşlê as vèden incòra int la stòria dal file, mó pcòun ed còl che gh'é dèinter al srà mìa vést dal póblich.",
        "logdelete-text": "I fât scanşlê as vèden incòra int la stòria 'd la pàgina, mó pcòun ed còl che gh'é dèinter al srà mìa vést dal póblich.",
-       "revdelete-text-others": "Êter aministradōr ed {{SITENAME}} a srân incòra bòun ed vèder j argomèint lughê e prân a turnêri a mèter incòra ed nōv per mèz ed cól canêl ché, se în mìa stê impustê di nōv lémit.",
+       "revdelete-text-others": "Êter aministradōr ed {{SITENAME}} a srân incòra bòun ed vèder j argomèint lughê e prân a turnêri a mèter incòra ed nōv, se în mìa stê impustê di nōv lémit.",
        "revdelete-confirm": "Per piaşèir cunfèirma che còst l'é còl ch'ét vō fêr, che t'é infurmê dal cunseguèinsi, e che t'é drē fêr còst int al rispèt dal [[{{MediaWiki:Policy-url}}|léni guîda]].",
        "revdelete-suppress-text": "La scanşlêda la duvré èser druvêda <strong>sōl</strong> in chi chêş ché:\n* infurmasiòun che prén èser calónij \n* infurmasiòun personêli cme \n*: <em>indirés, nómer ed telèfon, côdis fischêl, e via acsé.</em>",
        "revdelete-legend": "Impôsta i lémit seguèint al versiòun scanşlêdi:",
        "recentchanges-label-minor": "Còsta l'é 'na mudéfica céca",
        "recentchanges-label-bot": "Cla mudéfica ché l'é stêda fâta da un bot.",
        "recentchanges-label-unpatrolled": "Cla mudéfica ché an n'é mìa incòra stêda verifichêda.",
-       "rcnotefrom": "Ché sòt a gh'é la lésta dal mudéfichi fâti a partîr da <strong>$2</strong>(fîn a <strong>$1</strong>).",
+       "rcnotefrom": "Ché sòt a {{PLURAL:$5|gh'é la mudéfica fâta|gh'în al mudéfichi fâti}} a partîr da<strong>$3,$4</strong>(fîn a <strong>$1</strong>).",
        "rclistfrom": "Fà vèder al mudéfichi fâti a partîr da $3 $2",
        "rcshowhideminor": "$1 al mudéfichi céchi",
        "rcshowhidebots": "$1 i bot",
index bc2dbdb..d506ad2 100644 (file)
@@ -17,6 +17,7 @@
        "tog-watchdefault": "Add pages and files I edit to my watchlist",
        "tog-watchmoves": "Add pages and files I move to my watchlist",
        "tog-watchdeletion": "Add pages and files I delete to my watchlist",
+       "tog-watchrollback": "Add pages where I have performed a rollback to my watchlist",
        "tog-minordefault": "Mark all edits minor by default",
        "tog-previewontop": "Show preview before edit box",
        "tog-previewonfirst": "Show preview on first edit",
        "preview": "Preview",
        "showpreview": "Show preview",
        "showdiff": "Show changes",
+       "blankarticle": "<strong>Warning:</strong> The page you are creating is blank.\nIf you click \"{{int:savearticle}}\" again, the page will be created without any content.",
        "anoneditwarning": "<strong>Warning:</strong> You are not logged in.\nYour IP address will be recorded in this page's edit history.",
        "anonpreviewwarning": "<em>You are not logged in. Saving will record your IP address in this page's edit history.</em>",
        "missingsummary": "<strong>Reminder:</strong> You have not provided an edit summary.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
        "rev-deleted-event": "(log action removed)",
        "rev-deleted-user-contribs": "[username or IP address removed - edit hidden from contributions]",
        "rev-deleted-text-permission": "This page revision has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "rev-suppressed-text-permission": "This page revision has been <strong>suppressed</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
        "rev-deleted-text-unhide": "This page revision has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].\nYou can still [$1 view this revision] if you wish to proceed.",
        "rev-suppressed-text-unhide": "This page revision has been <strong>suppressed</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].\nYou can still [$1 view this revision] if you wish to proceed.",
        "rev-deleted-text-view": "This page revision has been <strong>deleted</strong>.\nYou can view it; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
        "right-deletedtext": "View deleted text and changes between deleted revisions",
        "right-browsearchive": "Search deleted pages",
        "right-undelete": "Undelete a page",
-       "right-suppressrevision": "Review and restore revisions hidden from administrators",
+       "right-suppressrevision": "View, hide and unhide specific revisions of pages from any user",
+       "right-viewsuppressed": "View revisions hidden from any user",
        "right-suppressionlog": "View private logs",
        "right-block": "Block other users from editing",
        "right-blockemail": "Block a user from sending email",
        "recentchanges-legend-bot": "{{int:recentchanges-label-bot}}",
        "recentchanges-legend-unpatrolled": "{{int:recentchanges-label-unpatrolled}}",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
-       "rcnotefrom": "Below are the changes since <strong>$2</strong> (up to <strong>$1</strong> shown).",
+       "rcnotefrom": "Below {{PLURAL:$5|is the change|are the changes}} since <strong>$3, $4</strong> (up to <strong>$1</strong> shown).",
        "rclistfrom": "Show new changes starting from $2, $3",
        "rcshowhideminor": "$1 minor edits",
        "rcshowhideminor-show": "Show",
        "licenses": "-",
        "licenses-edit": "Edit license options",
        "license-nopreview": "(Preview not available)",
-       "upload_source_url": "(a valid, publicly accessible URL)",
-       "upload_source_file": "(a file on your computer)",
+       "upload_source_url": "(your chosen file from a valid, publicly accessible URL)",
+       "upload_source_file": "(your chosen file from your computer)",
        "listfiles-delete": "delete",
        "listfiles-summary": "This special page shows all uploaded files.",
        "listfiles_search_for": "Search for media name:",
        "watchlist-details": "{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not separately counting talk pages.",
        "wlheader-enotif": "Email notification is enabled.",
        "wlheader-showupdated": "Pages that have been changed since you last visited them are shown in <strong>bold</strong>.",
-       "wlnote2": "Below are the changes in the last {{PLURAL:$1|hour|<strong>$1</strong> hours}}, as of $2, $3.",
+       "wlnote": "Below {{PLURAL:$1|is the last change|are the last <strong>$1</strong> changes}} in the last {{PLURAL:$2|hour|<strong>$2</strong> hours}}, as of $3, $4.",
        "wlshowlast": "Show last $1 hours $2 days $3",
        "watchlist-options": "Watchlist options",
        "watching": "Watching...",
        "import-upload": "Upload XML data",
        "import-token-mismatch": "Loss of session data.\nPlease 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-error-edit": "Page \"$1\" was not imported because you are not allowed to edit it.",
+       "import-error-create": "Page \"$1\" was not imported because you are not allowed to create it.",
+       "import-error-interwiki": "Page \"$1\" was not imported because its name is reserved for external linking (interwiki).",
+       "import-error-special": "Page \"$1\" was not imported because it belongs to a special namespace that does not allow pages.",
+       "import-error-invalid": "Page \"$1\" was not imported because the name to which it would be imported is invalid on this wiki.",
        "import-error-unserialize": "Revision $2 of page \"$1\" could not be unserialized. The revision was reported to use content model $3 serialized as $4.",
        "import-error-bad-location": "Revision $2 using content model $3 cannot be stored on \"$1\" on this wiki, since that model is not supported on that page.",
        "import-options-wrong": "Wrong {{PLURAL:$2|option|options}}: <nowiki>$1</nowiki>",
        "importlogpage": "Import log",
        "importlogpagetext": "Administrative imports of pages with edit history from other wikis.",
        "import-logentry-upload": "imported [[$1]] by file upload",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revision|revisions}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revision|revisions}} imported",
        "import-logentry-interwiki": "transwikied $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision|revisions}} from $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision|revisions}} imported from $2",
        "javascripttest": "JavaScript testing",
        "javascripttest-backlink": "< $1",
        "javascripttest-title": "Running $1 tests",
        "autosumm-replace": "Replaced content with \"$1\"",
        "autoredircomment": "Redirected page to [[$1]]",
        "autosumm-new": "Created page with \"$1\"",
+       "autosumm-newblank": "Created blank page",
        "autoblock_whitelist": "AOL http://webmaster.info.aol.com/proxyinfo.html\n*64.12.96.0/19\n*149.174.160.0/20\n*152.163.240.0/21\n*152.163.248.0/22\n*152.163.252.0/23\n*152.163.96.0/22\n*152.163.100.0/23\n*195.93.32.0/22\n*195.93.48.0/22\n*195.93.64.0/19\n*195.93.96.0/19\n*195.93.16.0/20\n*198.81.0.0/22\n*198.81.16.0/20\n*198.81.8.0/23\n*202.67.64.128/25\n*205.188.192.0/20\n*205.188.208.0/23\n*205.188.112.0/20\n*205.188.146.144/30\n*207.200.112.0/21",
        "size-bytes": "$1 B",
        "size-kilobytes": "$1 KB",
index fae17d7..3cf01bc 100644 (file)
        "powersearch-togglelabel": "Elekti:",
        "powersearch-toggleall": "Ĉion",
        "powersearch-togglenone": "Nenion",
+       "powersearch-remember": "Memori elekton por estontaj serĉoj",
        "search-external": "Ekstera serĉo",
        "searchdisabled": "<p>Oni provizore malŝaltis serĉadon per la plenteksta\nindekso pro troŝarĝita servilo. Intertempe, vi povas serĉi per <i>guglo</i> aŭ per <i>jahu!</i>:</p>",
        "search-error": "Okazis eraro dum serĉado: $1",
        "right-deletedtext": "Rigardi forigitan tekston kaj ŝanĝojn inter forigitaj revizioj.",
        "right-browsearchive": "Serĉi forigitajn paĝojn",
        "right-undelete": "Restarigi paĝon",
-       "right-suppressrevision": "Kontroli kaj restarigi versiojn kaŝitajn de administrantoj",
+       "right-suppressrevision": "Montri, kaŝi kaj malkaŝi specifajn paĝajn versiojn de ajna uzanto",
        "right-suppressionlog": "Vidi privatajn protokolojn",
        "right-block": "Forbari aliajn uzantoj de redaktado",
        "right-blockemail": "Forbari uzanton de retpoŝta sendado",
        "listgrouprights-namespaceprotection-header": "Nomspacaj restriktoj",
        "listgrouprights-namespaceprotection-namespace": "Nomspaco",
        "listgrouprights-namespaceprotection-restrictedto": "Rajtoj, kiuj permesas al uzanto redakti",
+       "trackingcategories": "Kategorioj por kontrolado",
+       "trackingcategories-summary": "Ĉi tiu paĝo listigas kategoriojn por kontrolado, aŭtomate farita de la Mediavikia programaro. Ties nomoj estas ŝanĝebla, ŝanĝante la paran sistemmesaĝon en la nomspaco {{ns:8}}.",
+       "trackingcategories-msg": "Kategorio pri kontrolado",
        "trackingcategories-name": "Nomo de mesaĝo",
+       "trackingcategories-desc": "Kriterio por inkluzivi kategorion",
        "trackingcategories-nodesc": "Neniu priskribo estas disponebla.",
        "trackingcategories-disabled": "Kategorio estas malaktivigita",
        "mailnologin": "Neniu alsendota adreso",
        "watchlist-details": "{{PLURAL:$1|$1 paĝo|$1 paĝoj}} en via atentaro, ne aparte kalkulante diskutpaĝojn.",
        "wlheader-enotif": "Retpoŝta sciigo estas ŝalta.",
        "wlheader-showupdated": "Paĝoj montriĝis per '''dikaj literoj''' kiuj estis ŝanĝitaj ekde vi laste vizitis.",
-       "wlnote2": "Malsupre estas la ŝanĝoj en la {{PLURAL:$1|lasta horo|lastaj <strong>$1</strong> horoj}}, ekde $2, $3.",
+       "wlnote": "Jen la {{PLURAL:$1|lasta redakto|lastaj <strong>$1</strong> redaktoj}} dum la {{PLURAL:$2|lasta horo|lastaj <strong>$2</strong> horoj}}, ekde $3, $4.",
        "wlshowlast": "Montri el lastaj $1 horoj $2 tagoj $3",
        "watchlist-options": "Opcioj por atentaro",
        "watching": "Aldonante al la atentaro...",
index 976fe83..787e750 100644 (file)
                        "Wifidel",
                        "Macofe",
                        "Koavf",
-                       "Themasterriot"
+                       "Themasterriot",
+                       "AVIADOR"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "tog-watchdefault": "Añadir las páginas y archivos que edite a mi lista de seguimiento",
        "tog-watchmoves": "Añadir las páginas y archivos que mueva a mi lista de seguimiento",
        "tog-watchdeletion": "Añadir las páginas y archivos que borre a mi lista de seguimiento",
+       "tog-watchrollback": "Añadir las páginas donde realicé una reversión a mi lista de seguimento",
        "tog-minordefault": "Marcar todas las ediciones como menores de manera predeterminada",
        "tog-previewontop": "Mostrar previsualización antes del cuadro de edición",
        "tog-previewonfirst": "Mostrar previsualización en la primera edición",
        "preview": "Previsualizar",
        "showpreview": "Mostrar previsualización",
        "showdiff": "Mostrar los cambios",
+       "blankarticle": "<strong>Aviso:</strong> estás a punto de crear una página vacía.\nSi pulsas en «{{int:savearticle}}» de nuevo, se creará la página sin ningún contenido.",
        "anoneditwarning": "<strong>Advertencia:</strong> No has iniciado sesión.\nTu dirección IP se almacenará en el historial de edición de esta página.",
        "anonpreviewwarning": "<em>No has iniciado sesión. Al guardar los cambios se almacenará tu dirección IP en el historial de edición de esta página.</em>",
        "missingsummary": "<strong>Recordatorio:</strong> No has escrito un resumen de edición.\nSi haces clic nuevamente en «{{int:savearticle}}» tu edición se grabará sin él.",
        "rev-deleted-event": "(entrada borrada)",
        "rev-deleted-user-contribs": "[nombre de usuario o dirección IP eliminada - edición ocultada de la lista de contribuciones]",
        "rev-deleted-text-permission": "Esta revisión de la página ha sido '''borrada'''.\nPuede haber detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
+       "rev-suppressed-text-permission": "Esta revisión de la página se <strong>suprimió</strong>.\nLos detalles se pueden ver en el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresión].",
        "rev-deleted-text-unhide": "Esta revisión de la página ha sido '''borrada'''.\nPuede haber más detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].\nComo administrador todavía puedes [$1 ver esta revisión] si así lo deseas.",
        "rev-suppressed-text-unhide": "Esta revisión de la página ha sido '''suprimida'''.\nPuede haber más detalles en el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresiones].\nComo administrador podrá seguir [$1 viendo esta revisión] si desea continuar.",
        "rev-deleted-text-view": "Esta revisión de la página ha sido '''borrada'''.\nAún tiene la posibilidad de verla; puede ampliar los detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
        "revdelete-text-text": "Las revisiones eliminadas aún aparecerán en el historial de la página, pero parte de su contenido será inaccesible para el público.",
        "revdelete-text-file": "Las versiones de los archivos eliminados aún aparecerán en el historial del archivo, pero partes de su contenido serán inaccesibles para el público.",
        "logdelete-text": "Las revisiones eliminadas aún aparecerán en el historial de la página, pero parte de su contenido será inaccesible para el público.",
-       "revdelete-text-others": "Otros administradores en {{SITENAME}} aun serán capaces de acceder a los contenidos ocultos y pueden restaurarlos a través de esta interfaz, a menos que se establezcan restricciones adicionales.",
+       "revdelete-text-others": "Otros administradores aun serán capaces de acceder a los contenidos ocultos y restaurarlos, a menos que se establezcan restricciones adicionales.",
        "revdelete-confirm": "Por favor confirma que deseas realizar la operación, que entiendes las consecuencias y que estás ejecutando dicha acción acorde con [[{{MediaWiki:Policy-url}}|las políticas]].",
        "revdelete-suppress-text": "La herramienta de supresión '''solo''' debería usarse en los siguientes casos:\n* información potencialmente injuriosa o calumniante.\n* información personal inapropiada, tal como:\n*: ''nombres, domicilios, números de teléfono, números de la seguridad social e información análoga.''",
        "revdelete-legend": "Establecer restricciones de revisión:",
        "gender-unknown": "Prefiero no especificarlo",
        "gender-male": "Masculino",
        "gender-female": "Femenino",
-       "prefs-help-gender": "Opcional: empleado para que sea usado correctamente el género por parte del software. Esta información será pública.",
+       "prefs-help-gender": "Opcional: el software utiliza esta preferencia para dirigirse a ti con el género gramatical apropiado. Esta información es pública.",
        "email": "Correo electrónico",
        "prefs-help-realname": "El nombre real es opcional. Si decides proporcionarlo, se usará para dar atribución a tu trabajo.",
        "prefs-help-email": "La dirección de correo electrónico es opcional, pero es necesaria para el restablecimiento de tu contraseña, en caso de que la olvides.",
        "right-deletedtext": "Ver texto borrado y cambios entre revisiones borradas",
        "right-browsearchive": "Buscar páginas borradas",
        "right-undelete": "Restaurar una página",
-       "right-suppressrevision": "Revisar y restaurar revisiones escondidas por administradores",
+       "right-suppressrevision": "Ver, ocultar y mostrar revisiones específicas de páginas de cualquier usuario",
+       "right-viewsuppressed": "Ver revisiones ocultas de cualquier usuario",
        "right-suppressionlog": "Ver registros privados",
        "right-block": "Bloquear a otros usuarios para que no editen",
        "right-blockemail": "Bloquear a un usuario para que no pueda mandar correos electrónicos",
        "recentchanges-label-plusminus": "El tamaño de la página cambió esta cantidad de bytes",
        "recentchanges-legend-heading": "'''Leyenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (véase también la [[Special:NewPages|lista de páginas nuevas]])",
-       "rcnotefrom": "A continuación se presentan los cambios desde <strong> $2 </strong> (hasta <strong> $1 </strong> se muestra).",
+       "rcnotefrom": "Debajo está{{PLURAL:$5|el cambio|n los cambios}} desde <strong>$3, $4</strong> (se muestran hasta <strong>$1</strong>).",
        "rclistfrom": "Mostrar nuevos cambios desde $2, $3",
        "rcshowhideminor": "$1 ediciones menores",
        "rcshowhideminor-show": "Mostrar",
        "nolicense": "Ninguna seleccionada",
        "licenses-edit": "Editar las opciones de licencia",
        "license-nopreview": "(Previsualización no disponible)",
-       "upload_source_url": " (una URL válida y accesible públicamente)",
-       "upload_source_file": "(un archivo en tu computadora)",
+       "upload_source_url": "(un archivo elegido de una URL válida y accesible públicamente)",
+       "upload_source_file": "(un archivo elegido de tu computadora)",
        "listfiles-delete": "borrar",
        "listfiles-summary": "Esta página especial muestra todos los archivos subidos.\nCuando el usuario la filtra, solo se muestran los archivos cargados por el usuario en su versión más reciente.",
        "listfiles_search_for": "Buscar por nombre de imagen:",
        "watchlist-details": "{{PLURAL:$1|$1 página|$1 páginas}} en su lista de seguimiento, sin contar las de discusión.",
        "wlheader-enotif": "La notificación por correo está activada.",
        "wlheader-showupdated": "Las páginas modificadas desde su última visita aparecen en '''negrita'''.",
-       "wlnote2": "A continuación se muestran los cambios de  {{PLURAL:$1|la última hora|las últimas <strong>$1</strong> horas}}, a partir del $2, $3.",
+       "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",
        "watching": "Vigilando...",
        "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-error-edit": "No se importó la página «$1» porque no tienes permisos para editarla.",
+       "import-error-create": "No se importó la página «$1» porque no tienes permisos para crearla.",
+       "import-error-interwiki": "No se importó la página «$1» porque su nombre está reservado para los enlaces externos (interwiki).",
+       "import-error-special": "No se importó la página «$1» porque pertenece a un espacio de nombres especial que no admite páginas.",
+       "import-error-invalid": "No se importó la página «$1» porque el nombre de destino para su importación no es válido en este wiki.",
        "import-error-unserialize": "La revisión $2 de la página \"$1\" no pudo dejar de hacerse en serie. Se informó de la revisión para utilizar el modelo de contenidos $3 ejecutado en serie como $4.",
        "import-error-bad-location": "La revisión $2 utilizando el modelo de contenido $3 no se pueden almacenar en \"$1\" en este wiki, ya que ese modelo no es compatible en esa página.",
        "import-options-wrong": "{{PLURAL:$2|Opción errónea|Opciones erróneas}}: <nowiki>$1</nowiki>",
        "importlogpage": "Registro de importaciones",
        "importlogpagetext": "Importaciones administrativas de páginas con historial desde otros wikis.",
        "import-logentry-upload": "importó [[$1]] por subida de archivo",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revisión|revisiones}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revisión importada|revisiones importadas}}",
        "import-logentry-interwiki": "transwikificada $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revisión|revisiones}} desde $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revisión importada|revisiones importadas}} desde $2",
        "javascripttest": "Pruebas de JavaScript",
        "javascripttest-title": "Pruebas de $1 en ejecución",
        "javascripttest-pagetext-noframework": "Esta página está reservada para ejecutar pruebas de JavaScript.",
        "autosumm-replace": "Página reemplazada por «$1»",
        "autoredircomment": "Página redirigida a [[$1]]",
        "autosumm-new": "Página creada con «$1»",
+       "autosumm-newblank": "Se creó una página vacía",
        "lag-warn-normal": "Los cambios realizados en {{PLURAL:$1|el último segundo|los últimos $1 segundos}} podrían no mostrarse en esta lista.",
        "lag-warn-high": "Debido a una alta latencia el servidor de base de datos, los cambios realizados en {{PLURAL:$1|el último segundo|los últimos $1 segundos}} podrían no mostrarse en esta lista.",
        "watchlistedit-normal-title": "Editar lista de seguimiento",
index fb3bd43..9e7ebb1 100644 (file)
        "preview": "Eelvaade",
        "showpreview": "Näita eelvaadet",
        "showdiff": "Näita muudatusi",
+       "blankarticle": "<strong>Hoiatus:</strong> Lehekülg, mida alustad, on tühi.\nKui klõpsad uuesti \"{{int:savearticle}}\", luuakse lehekülg ilma sisuta.",
        "anoneditwarning": "'''Hoiatus:''' Sa pole sisse logitud.\nSelle lehe redigeerimislogisse salvestatakse su IP-aadress.",
        "anonpreviewwarning": "''Sa pole sisse logitud. Selle lehe redigeerimislogisse salvestatakse su IP-aadress.''",
        "missingsummary": "'''Meeldetuletus:''' Sa ei ole lisanud muudatuse resümeed.\nKui vajutad uuesti salvestamise nupule, salvestatakse muudatus ilma resümeeta.",
        "undo-summary": "Eemaldatud muudatus $1, mille tegi [[Special:Contributions/$2|$2]] ([[User talk:$2|arutelu]])",
        "undo-summary-username-hidden": "Eemaldatud redaktsioon $1, mille tegi peidetud kasutaja",
        "cantcreateaccounttitle": "Ei saa kontot luua",
-       "cantcreateaccount-text": "Kasutaja [[User:$3|$3]] on blokeerinud kasutajanime loomise sellelt IP-aadressilt ('''$1''').\nKasutaja $3 märkis põhjuseks ''$2''",
+       "cantcreateaccount-text": "[[User:$3|$3]] on blokeerinud konto loomise sellelt IP-aadressilt (<strong>$1</strong>).\n\n$3 märkis järgmise põhjuse: <em>$2</em>",
        "cantcreateaccount-range-text": "Kontode loomine IP-aadressidelt vahemikus '''$1''', millesse jääb sinu IP-aadress ('''$4'''), on blokeeritud. Blokeeris kasutaja [[User:$3|$3]].\n\n$3 tõi järgmise põhjuse: ''$2''",
        "viewpagelogs": "Vaata selle lehe logisid",
        "nohistory": "Sellel leheküljel ei ole eelmisi redaktsioone.",
        "rev-deleted-event": "(logitoiming eemaldatud)",
        "rev-deleted-user-contribs": "[kasutajanimi või IP-aadress eemaldatud – muudatust ei näidata]",
        "rev-deleted-text-permission": "See lehekülje redaktsioon on '''kustutatud'''.\nÜksikasju võib olla [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} kustutamise logis].",
+       "rev-suppressed-text-permission": "Lehekülje see redaktsioon on <strong>varjatud</strong>.\nÜksikasju leiad [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} varjamislogist].",
        "rev-deleted-text-unhide": "See lehekülje redaktsioon on '''kustutatud'''.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Kustutamislogis] võib leiduda üksikasju.\nSoovi korral saad siiski [$1 seda redaktsiooni] näha.",
        "rev-suppressed-text-unhide": "See redaktsioon leheküljest on '''varjatud'''.\n[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Varjamislogis] võib leiduda üksikasju.\nSaad soovi korral siiski [$1 seda redaktsiooni vaadata].",
        "rev-deleted-text-view": "See lehekülje redaktsioon on '''kustutatud'''.\nSaad seda näha. [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Kustutamislogis] võib leiduda üksikasju.",
        "revdelete-text-text": "Kustutatud redaktsioonid jäävad lehekülje ajalukku alles, aga osa nende sisust pole kõigile juurdepääsetav.",
        "revdelete-text-file": "Kustutatud failiversioonid jäävad faili ajalukku alles, aga osa nende sisust pole kõigile juurdepääsetav.",
        "logdelete-text": "Kustutatud logisündmused jäävad logisse alles, aga osa nende sisust pole kõigile juurdepääsetav.",
-       "revdelete-text-others": "Teised {{GRAMMAR:genitive|{{SITENAME}}}} administraatorid pääsevad ikkagi peidetud sisu juurde ja saavad sama liidese kaudu selle taastada, kui seatud pole lisapiiranguid.",
+       "revdelete-text-others": "Teised administraatorid pääsevad ikkagi peidetud sisu juurde ja saavad selle taastada, kui seatud pole lisapiiranguid.",
        "revdelete-confirm": "Kinnita, et soovid tõesti seda teha ning et saad aru tagajärgedest ja tegevus on kooskõlas [[{{MediaWiki:Policy-url}}|siinsete kokkulepetega]].",
        "revdelete-suppress-text": "Andmed tuleks varjata '''ainult''' järgmistel juhtudel:\n* võimalik laim\n* sobimatu isiklik teave\n*: ''kodune aadress ja telefoninumber, isikukood jne''",
        "revdelete-legend": "Nähtavuse piirangute seadmine",
        "right-deletedtext": "Vaadata kustutatud teksti ja võrrelda kustutatud redaktsioone",
        "right-browsearchive": "Otsida kustutatud lehekülgi",
        "right-undelete": "Taastada lehekülg",
-       "right-suppressrevision": "Üle vaadata ja taastada administraatorite eest peidetud redaktsioone",
+       "right-suppressrevision": "Vaadata, peita ja taastada kõigi kasutajate eest varjatud kindlaid redaktsioone",
+       "right-viewsuppressed": "Vaadata kõigi kasutajate eest varjatud redaktsioone",
        "right-suppressionlog": "Vaadata eralogisid",
        "right-block": "Keelata lehekülgede muutmist mõnel kasutajal",
        "right-blockemail": "Keelata kasutajal e-kirjade saatmine",
        "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",
-       "newuserlogpage": "Kasutaja loomise logi",
+       "newuserlogpage": "Konto loomise logi",
        "newuserlogpagetext": "Siin on logitud kasutajate registreerimine.",
        "rightslog": "Kasutajaõiguste logi",
        "rightslogtext": "See on logi kasutajate õiguste muutuste kohta.",
        "action-deletedhistory": "selle lehekülje kustutatud ajalugu vaadata",
        "action-browsearchive": "kustutatud lehekülgi otsida",
        "action-undelete": "lehekülgi taastada",
-       "action-suppressrevision": "seda peidetud redaktsiooni vaadata ja taastada",
+       "action-suppressrevision": "seda peidetud redaktsiooni vaadata ega taastada",
        "action-suppressionlog": "seda eralogi vaadata",
        "action-block": "selle kasutaja redigeerimisõigust blokeerida",
        "action-protect": "selle lehekülje kaitsetasemeid muuta",
        "recentchanges-label-plusminus": "Lehekülje suuruse muutus baitides",
        "recentchanges-legend-heading": "'''Seletus:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vaata ka [[Special:NewPages|uute lehekülgede loendit]])",
-       "rcnotefrom": "Allpool on toodud muudatused alates: <strong>$2</strong> (näidatakse kuni <strong>$1</strong> muudatust)",
+       "rcnotefrom": "Allpool on toodud {{PLURAL:$5|muudatus|muudatused}} alates: <strong>$3, kell $4</strong> (näidatakse kuni <strong>$1</strong> muudatust)",
        "rclistfrom": "Näita muudatusi alates: $3, kell $2",
        "rcshowhideminor": "Pisiparandused ($1)",
        "rcshowhideminor-show": "näita",
        "license": "Litsents:",
        "license-header": "Litsents",
        "nolicense": "pole valitud",
+       "licenses-edit": "Redigeeri litsentsivalikut",
        "license-nopreview": "(Eelvaade ei ole saadaval)",
        "upload_source_url": "(avalikult ligipääsetav URL)",
        "upload_source_file": "(fail sinu arvutis)",
        "watchlist-details": "Jälgimisloendis on {{PLURAL:$1|üks lehekülg|$1 lehekülge}}. Arutelulehekülgi pole eraldi välja toodud.",
        "wlheader-enotif": "E-posti teel teavitamine on lubatud.",
        "wlheader-showupdated": "Leheküljed, mida on muudetud peale sinu viimast külastust, on '''rasvases kirjas'''.",
-       "wlnote2": "Allpool on viimase {{PLURAL:$1|tunni|<strong>$1</strong> tunni}} jooksul tehtud muudatused seisuga $2, $3.",
+       "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 seaded",
        "watching": "Jälgimine...",
        "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-error-interwiki": "Lehekülge \"$1\" ei imporditud, sest selle pealkirja hoitakse välislinkide (interviki) jaoks.",
+       "import-error-special": "Lehekülge \"$1\" ei imporditud, sest see kuulub erinimeruumi, kus pole leheküljed lubatud.",
+       "import-error-invalid": "Lehekülge \"$1\" ei imporditud, sest pealkiri, mille alla see siin toodaks, on vigane.",
        "import-error-bad-location": "Redaktsiooni $2 sisumudeliga $3 ei saa talletada siin vikis leheküljel \"$1\", mis seda mudelit ei toeta.",
        "import-options-wrong": "{{PLURAL:$2|Vale valik|Valed valikud}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Etteantud juurlehekülje pealkiri on vigane.",
        "importlogpage": "Impordilogi",
        "importlogpagetext": "Importimislogi kuvab leheküljed, mille redigeerimisajalugu pärineb teistest vikidest.",
        "import-logentry-upload": "importis faili üleslaadimisega lehekülje [[$1]]",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|redaktsioon|redaktsiooni}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|redaktsioon|redaktsiooni}} imporditud",
        "import-logentry-interwiki": "importis teisest vikist lehekülje $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|redaktsioon|redaktsiooni}} asukohast $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|redaktsioon|redaktsiooni}} imporditud asukohast $2",
        "javascripttest": "JavaScripti katsetamine",
        "javascripttest-title": "$1-katse käitus",
        "javascripttest-pagetext-noframework": "Seda lehekülge hoitakse JavaScripti katsete jaoks.",
        "tooltip-preferences-save": "Salvesta eelistused",
        "tooltip-summary": "Kirjuta lühike kokkuvõte",
        "common.css": "/* Siin olevat CSS-i kasutavad kõik kujundused. */",
+       "group-autoconfirmed.css": "/* Siin asuv kaskaadilaadistik puudutab ainult automaatselt kinnitatud kasutajaid. */",
+       "group-user.css": "/* Siin asuv kaskaadilaadistik puudutab ainult registreeritud kasutajaid. */",
+       "group-bot.css": "/* Siin asuv kaskaadilaadistik puudutab ainult roboteid. */",
+       "group-sysop.css": "/* Siin asuv kaskaadilaadistik puudutab ainult administraatoreid. */",
+       "group-bureaucrat.css": "/* Siin asuv kaskaadilaadistik puudutab ainult bürokraate. */",
        "common.js": "/* Siinne JavaScript laaditakse igale kasutajatele igal laaditud leheküljel. */",
+       "group-autoconfirmed.js": "/* Siin asuv JavaScript laaditakse ainult automaatselt kinnitatud kasutajate jaoks. */",
+       "group-user.js": "/* Siin asuv JavaScript laaditakse ainult registreeritud kasutajate jaoks. */",
+       "group-bot.js": "/* Siin asuv JavaScript laaditakse ainult robotite jaoks. */",
+       "group-sysop.js": "/* Siin asuv JavaScript laaditakse ainult administraatorite jaoks. */",
+       "group-bureaucrat.js": "/* Siin asuv JavaScript laaditakse ainult bürokraatide jaoks. */",
        "anonymous": "{{GRAMMAR:genitive|{{SITENAME}}}} {{PLURAL:$1|anonüümne kasutaja|anonüümsed kasutajad}}",
        "siteuser": "{{GRAMMAR:genitive|{{SITENAME}}}} kasutaja $1",
        "anonuser": "{{GRAMMAR:genitive|{{SITENAME}}}} anonüümne kasutaja $1",
        "autosumm-replace": "Lehekülg asendatud tekstiga '$1'",
        "autoredircomment": "Ümbersuunamine lehele [[$1]]",
        "autosumm-new": "Uus lehekülg: '$1'",
+       "autosumm-newblank": "Alustatud tühja leheküljega",
        "lag-warn-normal": "Viimase {{PLURAL:$1|ühe sekundi|$1 sekundi}} jooksul tehtud muudatused ei pruugi selles loendis näha olla.",
        "lag-warn-high": "Andmebaasiserveri töö viivituste tõttu ei pruugi viimase {{PLURAL:$1|ühe sekundi|$1 sekundi}} jooksul tehtud muudatused selles loendis näha olla.",
        "watchlistedit-normal-title": "Jälgimisloendi redigeerimine",
index d582261..51e07bd 100644 (file)
        "preview": "پیش‌نمایش",
        "showpreview": "پیش‌نمایش",
        "showdiff": "نمایش تغییرات",
+       "blankarticle": "<strong>هشدار:</strong> شما در حال ایجاد صفحه خالی هستید.\nاگر \"{{int:savearticle}}\" را دوباره کلیک کنید، صفحه بدون محتوا ایجاد می‌شود.",
        "anoneditwarning": "'''هشدار:''' شما به سامانه وارد نشده‌اید.\nنشانی آی‌پی شما در تاریخچهٔ ویرایش این صفحه ثبت خواهد شد.",
        "anonpreviewwarning": "''شما به سامانه وارد نشده‌اید. ذخیره کردن باعث می‌شود که نشانی آی‌پی شما در تاریخچهٔ این صفحه ثبت گردد.''",
        "missingsummary": "'''یادآوری:''' شما خلاصهٔ ویرایش ننوشته‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
        "rev-deleted-event": "(مورد از سیاهه پاک شده)",
        "rev-deleted-user-contribs": "[نام کاربری یا نشانی آی‌پی حذف شده - ویرایش مخفی شده در مشارکت‌ها]",
        "rev-deleted-text-permission": "این ویرایش از این صفحه '''حذف شده‌است'''.\nممکن است اطلاعات مرتبط با آن در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] موجود باشد.",
+       "rev-suppressed-text-permission": "این ویرایش از این صفحه '''حذف شده‌است'''.\nشما می‌توانید آن را ببینید؛ ممکن است اطلاعات مرتبط با آن در [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] موجود باشد.",
        "rev-deleted-text-unhide": "این ویرایش از این صفحه '''حذف شده‌است'''.\nممکن است اطلاعات مرتبط با آن در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] موجود باشد.\nشما کماکان می‌توانید در صورت تمایل [$1 این نسخه را ببینید].",
        "rev-suppressed-text-unhide": "این ویرایش از این صفحه '''فرونشانده شده‌است'''.\nممکن است اطلاعات مرتبط با آن در [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاههٔ فرونشانی] موجود باشد.\nشما کماکان می‌توانید در صورت تمایل [$1 این نسخه را ببینید].",
        "rev-deleted-text-view": "این ویرایش از این صفحه '''حذف شده‌است'''.\nشما می‌توانید آن را ببینید؛ ممکن است اطلاعات مرتبط با آن در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] موجود باشد.",
        "revdelete-text-text": "نسخه‌های حذف‌شده همچنان در تارییخچه نمایان خواند بود ولی قسمت‌هایی از محتویات غبرقابل دسترس برای عموم خواهد بود.",
        "revdelete-text-file": "نسخه‌های حذف‌شده همچنان در تاریخچهٔ پرونده نمایان خواهد بود ولی قسمت‌هایی از محتویات آن‌ها برای عموم غیرقابل دسترس خواهد بود.",
        "logdelete-text": "نسخه‌های حذف‌شده همچنان در سیاهه‌های نمایان خواهد بود ولی قسمت‌هایی از محتویات آن‌ها غیرقابل دسترس برای عموم خواهد بود.",
-       "revdelete-text-others": "سایر مدیران {{SITENAME}} هنوز می‌توانند این محتوای پنهان را ببینند و از همین طریق موارد حذف شده را احیا کنند، مگر آن که محدودیت‌های دیگری اعمال گردد.",
+       "revdelete-text-others": "سایر مدیران هنوز می‌توانند این محتوای پنهان را ببینند و از همین طریق موارد حذف شده را احیا کنند، مگر آن که محدودیت‌های دیگری اعمال گردد.",
        "revdelete-confirm": "لطفاً تأیید کنید که می‌خواهید این کار را انجام دهید، عواقب آن را درک می‌کنید و این کار را طبق [[{{MediaWiki:Policy-url}}|سیاست‌ها]] انجام می‌دهید.",
        "revdelete-suppress-text": "فرونشانی باید '''تنها''' برای موارد زیر استفاده شود:\n* اطلاعات به طور بالقوه افتراآمیز\n* اطلاعات نامناسب شخصی\n*: ''نشانی منزل، شماره تلفن، کد ملی و غیره.''",
        "revdelete-legend": "تنظیم محدودیت‌های پیدایی",
        "shown-title": "نمایش $1 {{PLURAL:$1|نتیجه|نتیجه}} در هر صفحه",
        "viewprevnext": "نمایش ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''صفحه‌ای با عنوان «[[:$1]]» در این ویکی وجود دارد.'''",
-       "searchmenu-new": "<strong>اÛ\8cجاد ØµÙ\81Ø­Ù\87Ù\94 Â«[[:$1]]» Ø¯Ø± Ø§Û\8cÙ\86 Ù\88Û\8cÚ©Û\8c!</strong> {{PLURAL:$2|0=|Ù\87Ù\85Ú\86Ù\86Û\8cÙ\86 Ù\85شاÙ\87دÙ\87Ù\94 ØµÙ\81Ø­Ù\87Ù\94 Ù¾Û\8cدا Ø´Ø¯Ù\87 Ø¨Ø§ Ø¬Ø³ØªØ¬Ù\88Û\8c Ø´Ù\85ا.|Ù\87Ù\85Ú\86Ù\86Û\8cÙ\86 Ù\85شاÙ\87دÙ\87Ù\94 Ø¬Ø³ØªØ¬Ù\88Û\8c Ù\86تاÛ\8cج Ù¾Û\8cدا Ø´Ø¯Ù\87.}}",
+       "searchmenu-new": "<strong>صÙ\81Ø­Ù\87Ù\94 Â«[[:$1]]» Ø±Ø§ Ø¯Ø± Ø§Û\8cÙ\86 Ù\88Û\8cÚ©Û\8c Ø¨Ø³Ø§Ø²Û\8cد!</strong> {{PLURAL:$2|0=Ù\87Ù\85Ú\86Ù\86Û\8cÙ\86 ØµÙ\81Ø­Ù\87Ù\94 Û\8cاÙ\81تâ\80\8cشدÙ\87 Ø¨Ø§ Ø¬Ø³ØªØ¬Ù\88Û\8cتاÙ\86 Ø±Ø§ Ø¨Ø¨Û\8cÙ\86Û\8cد.|Ù\87Ù\85Ú\86Ù\86Û\8cÙ\86 Ù\86تاÛ\8cج Ø¬Ø³ØªØ¬Ù\88Û\8c Û\8cاÙ\81تâ\80\8cشدÙ\87 Ø±Ø§ Ø¨Ø¨Û\8cÙ\86Û\8cد.}}",
        "searchprofile-articles": "صفحه‌های محتوایی",
        "searchprofile-images": "چندرسانه‌ای",
        "searchprofile-everything": "همه‌چیز",
        "right-deletedtext": "مشاهدهٔ متن حذف‌شده و تغییرات بین نسخه‌های حذف‌شده",
        "right-browsearchive": "جستجوی صفحه‌های حذف‌شده",
        "right-undelete": "احیای صفحه‌ها",
-       "right-suppressrevision": "بازبینی و احیای ویرایش‌هایی که از مدیران پنهان شده‌اند",
+       "right-suppressrevision": "مشاهده  و احیای ویرایش‌هایی که از کاربران پنهان شده‌اند",
+       "right-viewsuppressed": "مشاهده نسخه‌هایی که از کاربران مخفی شده‌اند",
        "right-suppressionlog": "مشاهدهٔ سیاهه‌های خصوصی",
        "right-block": "قطع دسترسی ویرایشی دیگر کاربران",
        "right-blockemail": "قطع دسترسی دیگر کاربران برای ارسال رایانامه",
        "recentchanges-legend-heading": "'''اختصارها:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنین به [[Special:NewPages|فهرست صفحات جدید]] نگاه کنید)",
        "recentchanges-legend-plusminus": "('' ±۱۲۳'')",
-       "rcnotefrom": "در زیر تغییرات از <strong>$2</strong> (تا <strong>$1</strong> نشان داده شده‌است).",
+       "rcnotefrom": "در زیر تغییرات از <strong>$3, $4</strong> (تا <strong>$1</strong> {{PLURAL:$5|نشان داده شده‌است|نشان داده شده‌اند}}).",
        "rclistfrom": "نمایش تغییرات جدید با شروع از $3 $2",
        "rcshowhideminor": "$1 ویرایش‌های جزئی",
        "rcshowhideminor-show": "نمایش",
        "watchlist-details": "بدون احتساب صفحه‌های جداگانهٔ بحث، {{PLURAL:$1|$1 صفحه|$1 صفحه}} در فهرست پی‌گیری‌های شما قرار {{PLURAL:$1|دارد|دارند}}.",
        "wlheader-enotif": "آگاه‌سازی رایانامه‌ای فعال است.",
        "wlheader-showupdated": "صفحه‌هایی که پس از آخرین بازدید شما تغییر کرده‌اند '''پررنگ''' نمایش داده شده‌اند.",
-       "wlnote2": "در زیر تغییرات اخیر وجود دارد {{PLURAL:$1|ساعت|<strong>$1</strong> ساعت‌ها}}, به عنوان $2, $3.",
+       "wlnote": "در زیر {{PLURAL:$1|تغییری|$1 تغییری}} که در {{PLURAL:$2|ساعت|$2 ساعت}} گذشته انجام شده موجود است، تاریخ آخرین بازیابی: $3، $4",
        "wlshowlast": "نمایش آخرین $1 ساعت $2 روز $3",
        "watchlist-options": "گزینه‌های پی‌گیری",
        "watching": "پی‌گیری...",
        "sp-contributions-search": "جستجوی مشارکت‌ها",
        "sp-contributions-username": "نشانی آی‌پی یا نام کاربری:",
        "sp-contributions-toponly": "فقط ویرایش‌هایی که آخرین نسخه‌اند نمایش داده شود",
-       "sp-contributions-newonly": "Ù\81Ù\82Ø· Ù\86Ù\85اÛ\8cØ´ Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 ØªÙ\88Ù\84Û\8cدâ\80\8cÙ\87اÛ\8c صفحه هستند",
+       "sp-contributions-newonly": "Ù\81Ù\82Ø· Ù\86Ù\85اÛ\8cØ´ Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ø§Û\8cجاد صفحه هستند",
        "sp-contributions-submit": "جستجو",
        "whatlinkshere": "پیوندها به این صفحه",
        "whatlinkshere-title": "صفحه‌هایی که به «$1» پیوند دارند",
        "import-upload": "بارگذاری داده اکس‌ام‌ال",
        "import-token-mismatch": "از دست رفتن اطلاعات نشست کاربری. لطفاً دوباره امتحان کنید.",
        "import-invalid-interwiki": "از ویکی مشخص شده نمی‌توان درون‌ریزی انجام داد.",
-       "import-error-edit": "صفحهٔ «$1» وارد نمی‌شود، چون شما مجاز به ویرایش آن نیستید.",
-       "import-error-create": "صفحهٔ «$1» وارد نمی‌شود، چون شما مجاز به ایجاد آن نیستید.",
+       "import-error-edit": "صفحهٔ «$1» وارد نشد، چون شما مجاز به ویرایش آن نیستید.",
+       "import-error-create": "صفحهٔ «$1» وارد نشد، چون شما مجاز به ایجاد آن نیستید.",
        "import-error-interwiki": "صفحه «$1» وارد نشد. چون نام آن برای پیوند خارجی (interwiki) رزرو شده‌است.",
        "import-error-special": "صفحهٔ «$1» درون‌ریزی نشد، چرا که متعلق به فضای نام نامجاز است.",
-       "import-error-invalid": "صفحه \"$1\" به دلیل نامعتبر بودن نامش وارد نمی‌شود.",
+       "import-error-invalid": "صفحه \"$1\" به دلیل نامعتبر بودن نامش که ممکن بود در ویکی نامعتبر باشد، وارد نشد.",
        "import-error-unserialize": "امکان خارج کردن نسخهٔ $2 از صفحهٔ «$1» از حالت سریال‌شده وجود نداشت. گزارش شد که نسخه از مدل محتوای $3 استفاده می‌کند که به صورت $4 سریال شده‌است.",
        "import-error-bad-location": "بازبینی $2 با استفاده از مدل محتوای $3 نمی‌تواند در \"$1\" در این ویکی ذخیره شده باشد، از آنجایی که مدل در آن صفحه پشتیبانی نشده‌است.",
        "import-options-wrong": "{{PLURAL:$2|جزئیات|جزئیات}} اشتباه: <nowiki>$1</nowiki>",
        "importlogpage": "سیاههٔ درون‌ریزی‌ها",
        "importlogpagetext": "درون‌ریزی صفحه‌ها به همراه تاریخچهٔ ویرایش آن‌ها از ویکی‌های دیگر.",
        "import-logentry-upload": "[[$1]] را از طریق بارگذاری پرونده درون‌ریزی کرد",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|نسخه|نسخه}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|نسخه|نسخه}} واردشده",
        "import-logentry-interwiki": "$1 را تراویکی کرد",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|نسخه|نسخه}} از $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|نسخه|نسخه}} واردشده از $2",
        "javascripttest": "آزمایش جاوا اسکریپت",
        "javascripttest-title": "در حال اجرای آزمایش‌های $1",
        "javascripttest-pagetext-noframework": "این صفحه برای اجرای آزمایش‌های جاوا اسکریپت کنار گذاشته شده‌است.",
        "autosumm-replace": "جایگزینی صفحه با '$1'",
        "autoredircomment": "تغییرمسیر به [[$1]]",
        "autosumm-new": "صفحه‌ای جدید حاوی «$1» ایجاد کرد",
+       "autosumm-newblank": "ایجاد صفحه خالی",
        "size-bytes": "$1 بایت",
        "size-kilobytes": "$1 کیلوبایت",
        "size-megabytes": "$1 مگابایت",
index 8cde960..739356f 100644 (file)
@@ -57,6 +57,7 @@
        "tog-watchdefault": "Lisää muokkaamani sivut ja tiedostot tarkkailulistalleni",
        "tog-watchmoves": "Lisää siirtämäni sivut ja tiedostot tarkkailulistalleni",
        "tog-watchdeletion": "Lisää poistamani sivut ja tiedostot tarkkailulistalleni",
+       "tog-watchrollback": "Lisää tarkkailulistalleni ne sivut, joissa olen käyttänyt palautus-toimintoa.",
        "tog-minordefault": "Merkitse kaikki muutokset oletusarvoisesti pieniksi",
        "tog-previewontop": "Näytä esikatselu muokkauskentän yläpuolella",
        "tog-previewonfirst": "Näytä esikatselu heti, kun muokkaus aloitetaan",
        "preview": "Esikatselu",
        "showpreview": "Esikatsele",
        "showdiff": "Näytä muutokset",
+       "blankarticle": "<strong>Varoitus:</strong> Sivu, jota olet luomassa, on tyhjä.\nJos napsautat \"{{int:savearticle}}\" uudelleen, sivu luodaan ilman sisältöä.",
        "anoneditwarning": "'''Varoitus:''' Et ole kirjautunut sisään.\nIP-osoitteesi kirjataan tämän sivun muutoshistoriaan.",
        "anonpreviewwarning": "''Et ole kirjautunut sisään. Tallentaminen kirjaa IP-osoitteesi tämän sivun muutoshistoriaan.''",
        "missingsummary": "Et ole antanut yhteenvetoa. Jos valitset Tallenna uudelleen, niin muokkauksesi tallennetaan ilman yhteenvetoa.",
        "rev-deleted-event": "(lokitapahtuma poistettu)",
        "rev-deleted-user-contribs": "[käyttäjätunnus tai IP-osoite poistettu – muokkaus on piilotettu muokkausluettelosta]",
        "rev-deleted-text-permission": "Tämä versio sivusta on '''poistettu'''.\nLisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].",
+       "rev-suppressed-text-permission": "Tämä versio sivusta on <strong>häivytetty</strong>.\nLisätietoja löytyy [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}  häivytyslokista].",
        "rev-deleted-text-unhide": "Tämä versio sivusta on '''poistettu'''.\nLisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].\nVoit silti [$1 nähdä tämän muutoksen], jos haluat jatkaa.",
        "rev-suppressed-text-unhide": "Tämä versio sivusta on '''häivytetty'''.\nLisätietoja löytyy [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} häivytyslokista].\nVoit silti [$1 nähdä tämän muutoksen], jos haluat jatkaa.",
        "rev-deleted-text-view": "Tämä versio sivusta on '''poistettu'''.\nVoit silti nähdä sen. Lisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].",
        "revdelete-text-text": "Poistetut versiot näkyvät edelleen sivun historiassa, mutta osa niiden sisällöstä ei enää ole saatavilla julkisesti.",
        "revdelete-text-file": "Poistetut tiedostoversiot näkyvät yhä sivun historiassa, mutta osa niiden sisällöstä ei ole saatavilla julkisesti.",
        "logdelete-text": "Poistetut lokimerkinnät näkyvät edelleen lokeissa, mutta osa niiden sisällöstä ei enää ole saatavilla julkisesti.",
-       "revdelete-text-others": "Muut ylläpitäjät sivustolla {{SITENAME}} kykenevät silti näkemään piilotetun sisällön ja voivat palauttaa sen takaisin näkyviin tämän saman käyttöliittymän kautta, paitsi silloin kun lisärajoituksia on asetettu.",
+       "revdelete-text-others": "Muut ylläpitäjät kykenevät silti näkemään piilotetun sisällön ja voivat palauttaa sen takaisin näkyviin, paitsi silloin kun lisärajoituksia on asetettu.",
        "revdelete-confirm": "Varmista, että haluat tehdä tämän – ymmärrät seuraukset ja teet tämän [[{{MediaWiki:Policy-url}}|käytäntöjen]] mukaisesti.",
        "revdelete-suppress-text": "Häivytystä pitäisi käyttää '''vain''' seuraavissa tapauksissa:\n* Mahdollisesti henkilön kunniaa loukkaavia tietoja\n* Sopimattomat henkilötiedot\n*: ''kotiosoitteet, puhelinnumerot, henkilötunnukset ja muut.''",
        "revdelete-legend": "Aseta version näkyvyyden rajoitukset",
        "right-deletedtext": "Tarkastella poistettujen sivujen tekstiä ja muutoksia poistettujen versioiden välillä",
        "right-browsearchive": "Hakea poistettuja sivuja",
        "right-undelete": "Palauttaa poistettuja sivuja",
-       "right-suppressrevision": "Tarkastella ja palauttaa ylläpitäjiltä piilotettuja versioita",
+       "right-suppressrevision": "Katsoa, piilottaa ja tuoda näkyviin tiettyjä sivujen versioita kaikilta käyttäjiltä",
+       "right-viewsuppressed": "Katsoa versioita, jotka on piilotettu jokaiselta käyttäjältä",
        "right-suppressionlog": "Tarkastella yksityisiä lokeja",
        "right-block": "Asettaa toiselle käyttäjälle muokkausesto",
        "right-blockemail": "Estää käyttäjää lähettämästä sähköpostia",
        "recentchanges-legend-heading": "'''Selitys:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (katso myös [[Special:NewPages|lista uusista sivuista]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Alla ovat muutokset <strong>$2</strong> lähtien. (Enintään <strong>$1</strong> näytetään.)",
+       "rcnotefrom": "Alla ovat muutokset <strong>$3, $4</strong> lähtien. (Enintään <strong>$1</strong> näytetään.)",
        "rclistfrom": "Näytä uudet muutokset $3 $2 alkaen",
        "rcshowhideminor": "$1 pienet muutokset",
        "rcshowhideminor-show": "Näytä",
        "nolicense": "Ei lisenssiä",
        "licenses-edit": "Muokkaa lisenssivaihtoehtoja",
        "license-nopreview": "(esikatselua ei saatavilla)",
-       "upload_source_url": " (julkinen verkko-osoite)",
-       "upload_source_file": " (tiedosto tietokoneella)",
+       "upload_source_url": "(valitsemasi tiedosto kelvollisesta ja julkisesta verkko-osoitteesta)",
+       "upload_source_file": "(valitsemasi tiedosto omasta tietokoneestasi)",
        "listfiles-delete": "poista",
        "listfiles-summary": "Tämä toimintosivu näyttää kaikki tallennetut tiedostot.",
        "listfiles_search_for": "Nimihaku",
        "watchlist-details": "Tarkkailulistallasi on {{PLURAL:$1|$1 sivu|$1 sivua}}. Keskustelusivuja ei lasketa mukaan.",
        "wlheader-enotif": "Sähköposti-ilmoitus on käytössä.",
        "wlheader-showupdated": "Sivut, joita on muokattu viimeisen käyntisi jälkeen, on '''lihavoitu'''.",
-       "wlnote2": "Alla on muutokset viimeisen {{PLURAL:$1|tunnin|<strong>$1</strong> tunnin}} ajalta $2 kello $3 asti.",
+       "wlnote": "Alla on {{PLURAL:$1|yksi muutos|<strong>$1</strong> muutosta}} viimeisen {{PLURAL:$2|tunnin|<strong>$2</strong> tunnin}} ajalta $3 kello $4 asti.",
        "wlshowlast": "Näytä viimeiset $1 tuntia tai $2 päivää, $3",
        "watchlist-options": "Tarkkailulistan asetukset",
        "watching": "Lisätään tarkkailulistalle...",
        "import-error-create": "Sivua $1 ei tuotu, koska sinulla ei ole oikeutta luoda sitä.",
        "import-error-interwiki": "Sivua $1 ei tuotu, koska sen nimi on varattu ulkoiseen linkittämiseen (interwiki).",
        "import-error-special": "Sivua $1 ei tuotu, koska se kuuluu erityiseen nimiavaruuteen, joka ei salli sivuja.",
-       "import-error-invalid": "Sivua $1 ei tuotu, koska sen nimi ei kelpaa.",
+       "import-error-invalid": "Sivua $1 ei tuotu, koska se nimi, jolle se tuotaisiin, ei ole kelvollinen tässä wikissä.",
        "import-error-unserialize": "Versiota $2 sivusta $1 ei voida jakaa osiin. Version ilmoitettiin käyttävän sisältömallia $3 ja sarjoitusmuotoilua $4.",
        "import-error-bad-location": "Sivun versiota $2, joka käyttää sisällön mallia $3, ei voi tallettaa kohteeseen \"$1\" tässä wikissä, koska tuota mallia ei tueta kyseisellä sivulla.",
        "import-options-wrong": "{{PLURAL:$2|Väärä asetus|Väärät asetukset}}: <nowiki>$1</nowiki>",
        "importlogpage": "Tuontiloki",
        "importlogpagetext": "Loki ylläpitäjien toisista wikeistä tuomista sivuista, joissa on muokkaushistoriaa.",
        "import-logentry-upload": "toi sivun [[$1]] tiedostomuodossa",
-       "import-logentry-upload-detail": "{{PLURAL:$1|yksi versio|$1 versiota}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|versio|versiota}} tuotiin",
        "import-logentry-interwiki": "toi toisesta wikistä sivun $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versio|versiota}} tuotiin wikistä $2",
        "javascripttest": "JavaScriptin testaus",
        "autosumm-replace": "Ak: Sivun sisältö korvattiin sisällöllä ”$1”",
        "autoredircomment": "Ak: Ohjaus sivulle [[$1]]",
        "autosumm-new": "Ak: Uusi sivu: $1",
+       "autosumm-newblank": "Ak: Luotiin tyhjä sivu",
        "size-kilobytes": "$1 KiB",
        "size-megabytes": "$1 MiB",
        "size-gigabytes": "$1 GiB",
+       "size-terabytes": "$1 TiB",
+       "size-petabytes": "$1 PiB",
+       "size-exabytes": "$1 EiB",
+       "size-zetabytes": "$1 ZiB",
+       "size-yottabytes": "$1 YiB",
+       "bitrate-bits": "$1 bit/s",
+       "bitrate-kilobits": "$1 kbit/s",
+       "bitrate-megabits": "$1 Mbit/s",
+       "bitrate-gigabits": "$1 Gbit/s",
+       "bitrate-terabits": "$1 Tbit/s",
+       "bitrate-petabits": "$1 Pbit/s",
+       "bitrate-exabits": "$1 Ebit/s",
+       "bitrate-zetabits": "$1 Zbit/s",
+       "bitrate-yottabits": "$1 Ybit/s",
        "lag-warn-normal": "Muutokset, jotka ovat uudempia kuin $1 {{PLURAL:$1|sekunti|sekuntia}}, eivät välttämättä näy tällä sivulla.",
        "lag-warn-high": "Tietokannoilla on työjonoa. Muutokset, jotka ovat uudempia kuin $1 {{PLURAL:$1|sekunti|sekuntia}}, eivät välttämättä näy tällä sivulla.",
        "watchlistedit-normal-title": "Tarkkailulistan muokkaus",
index 2b43f7f..edd5e2c 100644 (file)
                        "Akeron",
                        "Linedwell",
                        "Yona b",
-                       "SnowedEarth"
+                       "SnowedEarth",
+                       "Orikrin1998",
+                       "Automatik"
                ]
        },
        "tog-underline": "Souligner les liens :",
        "tog-watchdefault": "Ajouter les pages et les fichiers que je modifie à ma liste de suivi",
        "tog-watchmoves": "Ajouter les pages et les fichiers que je renomme à ma liste de suivi",
        "tog-watchdeletion": "Ajouter les pages et les fichiers que je supprime à ma liste de suivi",
+       "tog-watchrollback": "Ajouter à ma liste de suivi les pages sur lesquelles j’ai effectué une annulation",
        "tog-minordefault": "Marquer toutes mes modifications comme mineures par défaut",
        "tog-previewontop": "Afficher la prévisualisation au-dessus de la zone de modification",
        "tog-previewonfirst": "Afficher la prévisualisation lors de la première modification",
        "create-this-page": "Créer cette page",
        "delete": "Supprimer",
        "deletethispage": "Supprimer cette page",
-       "undeletethispage": "Annuler la suppression de cette page",
+       "undeletethispage": "Restaurer cette page",
        "undelete_short": "Restaurer {{PLURAL:$1|une modification|$1 modifications}}",
        "viewdeleted_short": "Voir {{PLURAL:$1|une modification supprimée|$1 modifications supprimées}}",
        "protect": "Protéger",
        "jumpto": "Aller à :",
        "jumptonavigation": "navigation",
        "jumptosearch": "rechercher",
-       "view-pool-error": "Désolé, les serveurs sont surchargés en ce moment.\nTrop d'utilisateurs cherchent à consulter cette page.\nVeuillez attendre un moment avant de retenter l'accès à cette page.\n\n$1",
+       "view-pool-error": "Désolé, les serveurs sont surchargés en ce moment.\nTrop d'utilisateurs cherchent à consulter cette page.\nVeuillez attendre un moment avant de retenter l'accès à celle ci.\n$1",
        "generic-pool-error": "Désolé, les serveurs sont surchargés pour le moment.\nTrop d’utilisateurs essayent de consulter cette ressource.\nVeuillez attendre un peu avant de réessayer d’accéder à celle-ci.",
        "pool-timeout": "Délai d'attente dépassé",
        "pool-queuefull": "La file d'attente est pleine",
        "badaccess-group0": "Vous n’avez pas les droits suffisants pour réaliser l’action demandée.",
        "badaccess-groups": "L’action que vous essayez de réaliser n’est permise qu’aux utilisateurs {{PLURAL:$2|du groupe|d'un des groupes}} : $1.",
        "versionrequired": "Version $1 de MediaWiki nécessaire",
-       "versionrequiredtext": "La version $1 de MediaWiki est nécessaire pour utiliser cette page. Consultez [[Special:Version|la page des versions]]",
+       "versionrequiredtext": "La version $1 de MediaWiki est nécessaire pour utiliser cette page. Consultez [[Special:Version|la page des versions]].",
        "ok": "Valider",
        "pagetitle": "$1 — {{SITENAME}}",
        "retrievedfrom": "Récupérée de « $1 »",
        "password-login-forbidden": "L'utilisation de ce nom d'utilisateur et de ce mot de passe a été interdite.",
        "mailmypassword": "Réinitialiser le mot de passe",
        "passwordremindertitle": "Nouveau mot de passe temporaire pour {{SITENAME}}",
-       "passwordremindertext": "Quelqu'un (probablement vous, ayant l'adresse IP $1) a demandé un nouveau mot de\npasse pour {{SITENAME}} ($4 ). Un mot de passe temporaire a été créé pour\nl'utilisateur « $2 » et est « $3 ». Si cela était votre intention, vous devrez\nvous connecter et choisir un nouveau mot de passe.\nVotre mot de passe temporaire expirera dans $5 jour{{PLURAL:$5||s}}.\n\nSi vous n'êtes pas l'auteur de cette demande, ou si vous vous souvenez à présent\nde votre ancien mot de passe et que vous ne souhaitez plus en changer, vous\npouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
+       "passwordremindertext": "Quelqu'un (probablement vous, ayant l'adresse IP $1) a demandé un nouveau mot de\npasse pour {{SITENAME}} ($4). Un mot de passe temporaire a été créé pour\nl'utilisateur « $2 » et est « $3 ». Si cela était votre intention, vous devrez\nvous connecter et choisir un nouveau mot de passe.\nVotre mot de passe temporaire expirera dans $5 jour{{PLURAL:$5||s}}.\n\nSi vous n'êtes pas l'auteur de cette demande, ou si vous vous souvenez à présent\nde votre ancien mot de passe et que vous ne souhaitez plus en changer, vous\npouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
        "noemail": "Aucune adresse de courriel n'a été enregistrée pour l'utilisateur « $1 ».",
        "noemailcreate": "Vous devez fournir une adresse de courriel valide",
        "passwordsent": "Un nouveau mot de passe a été envoyé à l'adresse de courriel de l'utilisateur « $1 ». Veuillez vous reconnecter après l'avoir reçu.",
        "passwordreset-emaildisabled": "Les fonctionnalités e-mail ont été désactivées sur ce wiki.",
        "passwordreset-username": "Nom d'utilisateur :",
        "passwordreset-domain": "Domaine :",
-       "passwordreset-capture": "Voir le courriel résultant?",
+       "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}}",
        "preview": "Prévisualisation",
        "showpreview": "Prévisualiser",
        "showdiff": "Voir les modifications",
+       "blankarticle": "<strong>Attention :</strong> La page que vous créez est vide.\nSi vous cliquez de nouveau sur « {{int:savearticle}} », la page sera créée sans aucun contenu.",
        "anoneditwarning": "<strong>Attention :</strong> Vous n’êtes pas identifié(e). Votre adresse IP sera enregistrée dans l’historique de cette page.",
        "anonpreviewwarning": "''Vous n’êtes pas identifié(e). Sauvegarder enregistrera votre adresse IP dans l’historique des modifications de la page.''",
        "missingsummary": "'''Rappel :''' vous n'avez pas encore fourni le résumé de votre modification.\nSi vous cliquez de nouveau sur le bouton « {{int:savearticle}} », la publication sera faite sans nouvel avertissement.",
        "rev-deleted-event": "(entrée retirée)",
        "rev-deleted-user-contribs": "[nom d'utilisateur ou adresse IP retiré - modification masquée sur les contributions]",
        "rev-deleted-text-permission": "Cette version de la page a été '''effacée'''.\nDes détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des effacements].",
+       "rev-suppressed-text-permission": "Cette version de la page a été <strong>supprimée</strong>.\nLes détails se trouvent dans le [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} journal des suppressions].",
        "rev-deleted-text-unhide": "Cette version de la page a été '''effacée'''.\nDes détails sont disponibles dans [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} le journal des effacements].\nVous pouvez toujours [$1 voir cette version] si vous le voulez.",
        "rev-suppressed-text-unhide": "Cette version de la page a été '''supprimée'''.\nDes détails sont disponibles dans [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} le journal des suppression].\nVous pouvez toujours [$1 voir cette version] si vous le voulez.",
        "rev-deleted-text-view": "Cette version de la page a été '''effacée'''.\nVous pouvez la visualiser ; des détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des effacements].",
        "revdelete-text-text": "Les révisions supprimées continueront à apparaître dans l’historique de la page, mais une partie de leur contenu sera inaccessible au public.",
        "revdelete-text-file": "Les versions de fichier supprimées continueront à apparaître dans l’historique des fichiers, mais une partie de leur contenu sera indisponible au public.",
        "logdelete-text": "Les évènements du journal supprimés continueront à apparaître dans les journaux, mais une partie de leur contenu sera indisponible au public.",
-       "revdelete-text-others": "Les autres administrateurs de {{SITENAME}} seront toujours capables d'accéder au contenu caché et peuvent le restaurer à nouveau par cette interface, à moins que des restrictions additionnelles soient définies.",
+       "revdelete-text-others": "Les autres administrateurs seront toujours en mesure d'accéder au contenu caché et le restaurer, à moins que des restrictions supplémentaires soient fixées.",
        "revdelete-confirm": "Confirmez que vous voulez effectuer cette action, que vous en comprenez les conséquences, et que vous le faites en accord avec [[{{MediaWiki:Policy-url}}|les règles]].",
        "revdelete-suppress-text": "La suppression ne doit être utilisée '''que''' dans les cas suivants :\n* Informations potentiellement diffamatoires\n* Informations personnelles inappropriées\n*: ''adresse, numéro de téléphone, numéro de sécurité sociale, …''",
        "revdelete-legend": "Mettre en place des restrictions de visibilité :",
        "right-deletedtext": "Voir le texte supprimé et les différences entre les versions supprimées",
        "right-browsearchive": "Rechercher des pages supprimées",
        "right-undelete": "Restaurer une page supprimée",
-       "right-suppressrevision": "Examiner et restaurer les versions masquées aux administrateurs",
+       "right-suppressrevision": "Afficher, masquer et démasquer des révisions spécifiques de pages pour n’importe quel utilisateur",
+       "right-viewsuppressed": "Afficher les révisions masquées pour n’importe quel utilisateur",
        "right-suppressionlog": "Voir les journaux privés",
        "right-block": "Bloquer en écriture d'autres utilisateurs",
        "right-blockemail": "Empêcher un utilisateur d'envoyer des courriels",
        "recentchanges-legend-heading": "'''Légende :'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (voir aussi la [[Special:NewPages|liste des nouvelles pages]]).",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Ci-dessous les modifications effectuées depuis le <strong>$2</strong> (jusqu’à <strong>$1</strong> affichés).",
+       "rcnotefrom": "Ci-dessous {{PLURAL:$5|la modification effectuée|les modifications effectuées}} depuis le <strong>$3, $4</strong> (affichées jusqu’à <strong>$1</strong>).",
        "rclistfrom": "Afficher les nouvelles modifications depuis le $3 à $2",
        "rcshowhideminor": "$1 les modifications mineures",
        "rcshowhideminor-show": "Afficher",
        "nolicense": "Aucune licence sélectionnée",
        "licenses-edit": "Modifier les options de licence",
        "license-nopreview": "(Prévisualisation non disponible)",
-       "upload_source_url": " (une URL valide et accessible publiquement)",
-       "upload_source_file": " (un fichier sur votre ordinateur)",
+       "upload_source_url": "(le fichier que vous avez choisi depuis une URL valide et accessible publiquement)",
+       "upload_source_file": "(votre fichier choisi depuis votre ordinateur)",
        "listfiles-delete": "supprimer",
        "listfiles-summary": "Cette page spéciale permet de lister tous les fichiers importés.",
        "listfiles_search_for": "Rechercher un nom de média :",
        "watchlist-details": "{{PLURAL:$1|$1 page|$1 pages}} dans votre liste de suivi, sans compter les pages de discussion.",
        "wlheader-enotif": "La notification par courriel est activée.",
        "wlheader-showupdated": "Les pages qui ont été modifiées depuis votre dernière visite sont affichées en '''gras'''.",
-       "wlnote2": "Ci-dessous les modifications dans {{PLURAL:$1|la dernière heure|les <strong>$1</strong> dernières heures}}, à partir de $2, $3.",
+       "wlnote": "Ci-dessous {{PLURAL:$1|figure la dernière modification effectuée|figurent les <strong>$1</strong> dernières modifications effectuées}} durant {{PLURAL:$2|la dernière heure|les <strong>$2</strong> 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",
        "watching": "Suivi…",
        "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 spécial qui n'en autorise aucune.",
-       "import-error-invalid": "Page « $1 » n'est pas importée parce que son nom n'est pas valide.",
+       "import-error-edit": "La page « $1 » n’a pas été importée parce que vous n’êtes pas autorisé à la modifier.",
+       "import-error-create": "La page « $1 » n’a pas été importée parce que vous n’êtes pas autorisé à la créer.",
+       "import-error-interwiki": "La page « $1 » n’a pas été importée parce que son nom est réservé pour un lien externe (interwiki).",
+       "import-error-special": "La page « $1 » n’a pas été importée parce qu’elle appartient à un espace de noms spécial qui n’autorise aucune page.",
+       "import-error-invalid": "Page « $1 » n’a pas été importée parce que le nom sous lequel elle aurait été importée n’est pas valide sur ce wiki.",
        "import-error-unserialize": "La révision $2 de la page « $1 » ne peut pas être désérialisée. La révision est indiquée comme utilisant le modèle de contenu $3 sérialisé en $4.",
        "import-error-bad-location": "La révision $2 utilisant le modèle de contenu $3 n’a pas pu être stocké sur « $1 » sur ce wiki, car ce modèle n’est pas supporté sur cette page.",
        "import-options-wrong": "{{PLURAL:$2|Mauvaise option|Mauvaises options}} : <nowiki>$1</nowiki>",
        "importlogpage": "Journal des importations",
        "importlogpagetext": "Importations administratives de pages d'autres wikis, avec leur historique de modification.",
        "import-logentry-upload": "a importé [[$1]] par envoi de fichier",
-       "import-logentry-upload-detail": "$1 version{{PLURAL:$1||s}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|révision importée|révisions importées}}",
        "import-logentry-interwiki": "a importé $1 d'un wiki à l'autre",
-       "import-logentry-interwiki-detail": "$1 version{{PLURAL:$1||s}} depuis $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|révision importée|révisions importées}} depuis $2",
        "javascripttest": "Test de JavaScript",
        "javascripttest-title": "Exécution des tests $1",
        "javascripttest-pagetext-noframework": "Cette page est réservée pour l'exécution des tests JavaScript.",
        "autosumm-replace": "Contenu remplacé par « $1 »",
        "autoredircomment": "Page redirigée vers [[$1]]",
        "autosumm-new": "Page créée avec « $1 »",
+       "autosumm-newblank": "Page vide créée",
        "size-bytes": "$1&nbsp;o",
        "size-kilobytes": "$1&nbsp;Kio",
        "size-megabytes": "$1&nbsp;Mio",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|a modifié}} l'appartenance au groupe pour $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|a été promu}} automatiquement de $4 à $5",
        "rightsnone": "(aucun)",
-       "feedback-bugornote": "Si vous êtes prêt à décrire un problème technique en détail, veuillez [$1 signaler un bogue].\nSinon, 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-bugornote": "Si vous êtes prêt à décrire un problème technique en détail, veuillez [$1 signaler un bogue].\nSinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentaire sera ajouté à la page « [$3 $2] », avec votre nom d'utilisateur.",
        "feedback-subject": "Objet :",
        "feedback-message": "Message :",
        "feedback-cancel": "Annuler",
index 8320af5..e3f8bbb 100644 (file)
@@ -9,7 +9,9 @@
                        "Vipuser",
                        "Xiaomingyan",
                        "아라",
-                       "Mywood"
+                       "Mywood",
+                       "Impersonator 1",
+                       "LNDDYL"
                ]
        },
        "tog-underline": "下劃連結",
        "talkpagelinktext": "談詑",
        "specialpage": "特殊頁",
        "personaltools": "個人工具",
-       "postcomment": "話滴想法",
        "articlepage": "看吖文章",
        "talk": "談詑",
        "views": "望下",
        "externaldberror": "外部驗證資料庫出錯,或倷更新伓正倷嗰外部帳戶。",
        "login": "登入",
        "nav-login-createaccount": "登入/新開隻帳戶",
-       "loginprompt": "要開到cookies才登入得正{{SITENAME}}。",
        "userlogin": "登入/新開隻帳戶",
        "userloginnocreate": "登入",
        "logout": "退出",
        "watchlist-details": "$1隻頁面(伓算討論頁) 拕眏到哩",
        "wlheader-enotif": "啟動哩email通知功能。",
        "wlheader-showupdated": "上回倷眵嗰頁面改動嗰部分用'''粗體'''顯到",
+       "wlnote": "下底係最近'''$2'''鐘頭內嗰最晏'''$1'''道修改:",
        "wlshowlast": "顯示箇日子$1鐘頭$2日$3嗰改動",
        "watchlist-options": "監視清單選項",
        "watching": "眏到...",
index ddda55f..8b1a199 100644 (file)
@@ -14,7 +14,8 @@
                        "Vivaelcelta",
                        "Xosé",
                        "לערי ריינהארט",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "McDutchie"
                ]
        },
        "tog-underline": "Subliñar as ligazóns:",
        "preview": "Vista previa",
        "showpreview": "Mostrar a vista previa",
        "showdiff": "Mostrar os cambios",
+       "blankarticle": "<strong>Advertencia:</strong> A páxina que está a piques de crear está baleira.\nSe preme no botón \"{{int:savearticle}}\" outra vez, a páxina crearase sen contido.",
        "anoneditwarning": "'''Aviso:''' Non accedeu ao sistema.\nO seu enderezo IP quedará rexistrado no historial de revisións desta páxina.",
        "anonpreviewwarning": "''Non accedeu ao sistema. Se garda a páxina, o seu enderezo IP quedará rexistrado no historial de edicións.''",
        "missingsummary": "'''Aviso:''' Esqueceu incluír o texto do campo resumo.\nSe preme en \"{{int:savearticle}}\" a súa edición gardarase sen ningunha descrición da edición.",
        "rev-deleted-event": "(entrada eliminada)",
        "rev-deleted-user-contribs": "[nome de usuario ou enderezo IP eliminado; edición agochada das contribucións]",
        "rev-deleted-text-permission": "Esta revisión da páxina foi '''borrada'''.\nPode ampliar os detalles no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistro de borrados].",
+       "rev-suppressed-text-permission": "Esta revisión da páxina foi <strong>suprimida</strong>.\nPode ampliar os detalles no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rexistro de supresións].",
        "rev-deleted-text-unhide": "Esta revisión da páxina foi '''borrada'''.\nPode ampliar os detalles no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistro de borrados].\nAínda pode [$1 ver esta revisión] se quere.",
        "rev-suppressed-text-unhide": "Esta revisión da páxina foi '''suprimida'''.\nPode ampliar os detalles no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rexistro de supresións].\nAínda pode [$1 ver esta revisión] se quere.",
        "rev-deleted-text-view": "Esta revisión da páxina foi '''borrada'''.\nAínda ten a posibilidade de vela; pode ampliar os detalles no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistro de borrados].",
        "revdelete-text-text": "As revisións borradas seguirán aparecendo no historial da páxina, pero partes do seu contido serán inaccesibles para o público.",
        "revdelete-text-file": "As revisións borradas do ficheiro seguirán aparecendo no historial do ficheiro, pero partes do seu contido serán inaccesibles para o público.",
        "logdelete-text": "Os rexistros de eventos borrados seguirán aparecendo nos rexistros, pero partes do seu contido serán inaccesibles para o público.",
-       "revdelete-text-others": "Os outros administradores de {{SITENAME}} seguirán tendo acceso aos contidos agochados e poderán restauralos a través desta mesma interface, a menos que se definan restricións adicionais.",
+       "revdelete-text-others": "Os outros administradores seguirán tendo acceso aos contidos agochados e poderán restauralos, a menos que se definan restricións adicionais.",
        "revdelete-confirm": "Por favor, confirme que quere levar a cabo esta acción, que comprende as consecuencias e que o fai de acordo [[{{MediaWiki:Policy-url}}|coas políticas]].",
        "revdelete-suppress-text": "A eliminación '''unicamente''' debería utilizarse nos seguintes casos:\n* Información potencialmente difamatoria\n* Información persoal inapropiada\n*: ''domicilios e números de teléfono, números da seguridade social etc.''",
        "revdelete-legend": "Aplicar restricións de visibilidade",
        "right-deletedtext": "Ver texto borrado e cambios entre revisións eliminadas",
        "right-browsearchive": "Procurar páxinas borradas",
        "right-undelete": "Restaurar unha páxina",
-       "right-suppressrevision": "Revisar e restaurar as revisións agochadas dos administradores",
+       "right-suppressrevision": "Revisar, agochar e restaurar revisións específicas de páxinas de calquera usuario",
+       "right-viewsuppressed": "Ver revisións agochadas por calquera usuario",
        "right-suppressionlog": "Ver rexistros privados",
        "right-block": "Bloquear outros usuarios fronte á edición",
        "right-blockemail": "Bloquear un usuario fronte ao envío dun correo electrónico",
        "recentchanges-legend-heading": "'''Lenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (véxase tamén a [[Special:NewPages|lista de páxinas novas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "A continuación móstranse os cambios feitos desde o <strong>$3</strong> ás <strong>$4</strong> (móstranse <strong>$1</strong> como máximo).",
+       "rcnotefrom": "A continuación {{PLURAL:$5|móstrase o cambio feito|móstranse os cambios feitos}} desde o <strong>$3</strong> ás <strong>$4</strong> (móstranse <strong>$1</strong> como máximo).",
        "rclistfrom": "Mostrar os cambios novos desde o $3 ás $2",
        "rcshowhideminor": "$1 as edicións pequenas",
        "rcshowhideminor-show": "Mostrar",
        "license": "Licenza:",
        "license-header": "Licenza",
        "nolicense": "Ningunha seleccionada",
+       "licenses-edit": "Editar as opcións de licenza",
        "license-nopreview": "(A vista previa non está dispoñible)",
        "upload_source_url": "  (un URL válido e accesible publicamente)",
        "upload_source_file": "  (un ficheiro no seu ordenador)",
        "watchlist-details": "Hai {{PLURAL:$1|unha páxina|$1 páxinas}} na súa lista de vixilancia, sen contar as de conversa.",
        "wlheader-enotif": "A notificación por correo electrónico está activada.",
        "wlheader-showupdated": "As páxinas que cambiaron desde a súa última visita móstranse en '''negra'''.",
-       "wlnote2": "A continuación están as modificacións feitas {{PLURAL:$1|na última hora|nas últimas <strong>$1</strong> horas}}, ata o $2 ás $3.",
+       "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",
        "watching": "Vixiando...",
        "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-error-edit": "Non foi posible importar a páxina \"$1\" porque non ten os permisos necesarios para editala.",
+       "import-error-create": "Non foi posible importar a páxina \"$1\" porque non ten os permisos necesarios para creala.",
+       "import-error-interwiki": "Non foi posible importar a páxina \"$1\" porque o seu nome está reservado para unha ligazón externa (interwiki).",
+       "import-error-special": "Non foi posible importar a páxina \"$1\" porque pertence a un espazo de nomes especial que non o permite.",
+       "import-error-invalid": "Non foi posible importar a páxina \"$1\" porque o nome co que se importaría non é válido neste wiki.",
        "import-error-unserialize": "Non se puido deserializar a revisión $2 da páxina \"$1\". Informouse de que a revisión usa o modelo de contido $3 serializado como $4.",
        "import-error-bad-location": "Non se pode almacenar a revisión $2 que usa o modelo de contido $3 na páxina \"$1\" deste wiki, dado que ese modelo non está soportado nesa páxina.",
        "import-options-wrong": "{{PLURAL:$2|Opción incorrecta|Opcións incorrectas}}: <nowiki>$1</nowiki>",
        "importlogpage": "Rexistro de importacións",
        "importlogpagetext": "Rexistro de importación de páxinas xunto co seu historial de edicións procedentes doutros wikis.",
        "import-logentry-upload": "importou \"[[$1]]\" mediante a carga dun ficheiro",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revisión|revisións}}",
+       "import-logentry-upload-detail": "{{PLURAL:$1|Importouse $1 revisión|Importáronse $1 revisións}}",
        "import-logentry-interwiki": "importou \"$1\"",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revisión|revisións}} de $2",
+       "import-logentry-interwiki-detail": "{{PLURAL:$1|Importouse $1 revisión|Importáronse $1 revisións}} desde $2",
        "javascripttest": "Proba de JavaScript",
        "javascripttest-title": "Executando probas de $1",
        "javascripttest-pagetext-noframework": "Esta páxina está reservada para executar probas do JavaScript.",
        "autosumm-replace": "O contido da páxina foi substituído por \"$1\"",
        "autoredircomment": "Redirixida cara a \"[[$1]]\"",
        "autosumm-new": "Nova páxina: \"$1\"",
+       "autosumm-newblank": "A páxina creouse sen contido",
        "size-kilobytes": "$1 kB",
        "lag-warn-normal": "Pode que os cambios feitos {{PLURAL:$1|no último segundo|nos últimos $1 segundos}} non aparezan nesta lista.",
        "lag-warn-high": "Debido a unha gran demora do servidor da base de datos, pode que nesta lista non aparezan os cambios feitos {{PLURAL:$1|no último segundo|nos últimos $1 segundos}}.",
index a900ad5..b781900 100644 (file)
@@ -10,7 +10,9 @@
                        "Urhixidur",
                        "Xiaomingyan",
                        "아라",
-                       "Mywood"
+                       "Mywood",
+                       "Impersonator 1",
+                       "LNDDYL"
                ]
        },
        "tog-underline": "鏈接加底線:",
        "talkpagelinktext": "交流",
        "specialpage": "特殊頁面",
        "personaltools": "私人工具",
-       "postcomment": "新段落",
        "articlepage": "查看內容頁面",
        "talk": "討論",
        "views": "查看數",
        "externaldberror": "邇可能係由於驗證數據庫差錯或者汝分系統禁止更新汝嘅外部賬號。",
        "login": "登入",
        "nav-login-createaccount": "登入/建立新帳號",
-       "loginprompt": "汝必須啟用Cookies正做得成功登入{{SITENAME}}。",
        "userlogin": "登入/建立新帳號",
        "userloginnocreate": "登入",
        "logout": "登出",
        "watchlist-details": "毋包含交流頁,汝嘅監視列表上有$1隻頁面。",
        "wlheader-enotif": "Yí-kîn khí-thung email thûng-tî kûng-nèn.",
        "wlheader-showupdated": "Chhai ngì song-chhṳ kiám-sṳ heu yû pûn chhùng-siû ko ke vùn-chông chiông-voi hién-sṳ vi '''chhû-thí'''.",
+       "wlnote": "Yî-ha he chui-khiûn <b>$2</b> séu-sṳ̀ nui-ke chui-heu $1-chhṳ chin-siû.",
        "wlshowlast": "展示最近$1隻鐘頭,$2日或$3嘅更改。",
        "watchlist-options": "監視列表選項",
        "watching": "監視中...",
index f3a899f..df559b0 100644 (file)
@@ -43,6 +43,7 @@
        "tog-watchdefault": "מעקב אחרי דפים וקבצים שערכתי",
        "tog-watchmoves": "מעקב אחרי דפים וקבצים שהעברתי",
        "tog-watchdeletion": "מעקב אחרי דפים וקבצים שמחקתי",
+       "tog-watchrollback": "מעקב אחרי דפים ששחזרתי",
        "tog-minordefault": "הגדרת כל פעולת עריכה כמשנית אם לא צוין אחרת",
        "tog-previewontop": "הצגת תצוגה מקדימה לפני תיבת העריכה",
        "tog-previewonfirst": "הצגת תצוגה מקדימה בעריכה ראשונה",
        "preview": "תצוגה מקדימה",
        "showpreview": "תצוגה מקדימה",
        "showdiff": "הצגת שינויים",
+       "blankarticle": "<strong>אזהרה:</strong> הדף שאתם יוצרים הוא ריק.\nאם תלחצו שוב על \"{{int:savearticle}}\", הדף ייווצר ללא תוכן.",
        "anoneditwarning": "'''אזהרה:''' אינכם מחוברים לחשבון. כתובת ה־IP שלכם תירשם בהיסטוריית העריכות של הדף.",
        "anonpreviewwarning": "''אינכם מחוברים לחשבון. שמירה תגרום לכתובת ה־IP שלכם להירשם בהיסטוריית העריכות של הדף.''",
        "missingsummary": "'''תזכורת:''' לא הזנתם תקציר עריכה.\nאם תלחצו שוב על הכפתור \"{{int:savearticle}}\", עריכתכם תישמר בלעדיו.",
        "subject-preview": "תצוגה מקדימה של הנושא/הכותרת:",
        "blockedtitle": "המשתמש חסום",
        "blockedtext": "'''שם המשתמש או כתובת ה־IP שלכם נחסמו.'''\n\nהחסימה בוצעה על ידי $1. הסיבה שניתנה לכך היא '''$2'''.\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nבאפשרותכם ליצור קשר עם $1 או עם כל אחד מ[[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] האחרים כדי לדון על החסימה.\nאינכם יכולים להשתמש בתכונת \"שליחת דואר אלקטרוני למשתמש זה\" אם לא ציינתם כתובת דוא\"ל תקפה ב[[Special:Preferences|העדפות המשתמש שלכם]] או אם נחסמתם משליחת דוא\"ל.\nכתובת ה־IP שלכם היא $3, ומספר החסימה שלכם הוא #$5.\nאנא ציינו את כל הפרטים הללו בכל פנייה למפעילי המערכת.",
-       "autoblockedtext": "×\9bת×\95×\91ת ×\94Ö¾IP ×©×\9c×\9b×\9d × ×\97ס×\9e×\94 ×\91×\90×\95פ×\9f ×\90×\95×\98×\95×\9e×\98×\99 ×\9b×\99×\95×\95×\9f ×©×\9eשת×\9eש ×\90×\97ר, ×©× ×\97ס×\9d ×¢×\9cÖ¾×\99×\93×\99 $1, ×¢×©×\94 ×\91×\94 ×©×\99×\9e×\95ש.\n×\94ס×\99×\91×\94 ×©× ×\99תנ×\94 ×\9c×\97ס×\99×\9e×\94 ×\94×\99×\90:\n\n:<em>$2</em>\n\n* ×ª×\97×\99×\9cת ×\94×\97ס×\99×\9e×\94: $8\n* ×¤×§×\99עת ×\94×\97ס×\99×\9e×\94: $6\n* ×\94×\97ס×\99×\9e×\94 ×©×\91×\95צע×\94: $7\n\n×\91×\90פשר×\95ת×\9b×\9d ×\9c×\99צ×\95ר ×§×©×¨ ×¢×\9d $1 ×\90×\95 ×¢×\9d ×\9b×\9c ×\90×\97×\93 ×\9e[[{{MediaWiki:Grouppage-sysop}}|×\9eפע×\99×\9c×\99 ×\94×\9eער×\9bת]] ×\94×\90×\97ר×\99×\9d ×\9b×\93×\99 ×\9c×\93×\95×\9f ×\91×\97ס×\99×\9e×\94.\n\n×\91×\90פשר×\95ת×\9b×\9d ×\9c×\94שת×\9eש ×\91ת×\9b×\95נת \"{{int:emailuser}}\", ×\90×\9c×\90 ×\90×\9d ×\9c×\90 ×¦×\99×\99נת×\9d ×\9bת×\95×\91ת ×\93×\95×\90\"×\9c ×ª×§×¤ה ב[[Special:Preferences|העדפות המשתמש שלכם]] או אם נחסמתם משליחת דוא\"ל.\n\nכתובת ה־IP שלכם היא $3, ומספר החסימה שלכם הוא #$5.\nאנא ציינו את כל הפרטים הללו בכל פנייה למפעילי המערכת.",
+       "autoblockedtext": "×\9bת×\95×\91ת ×\94Ö¾IP ×©×\9c×\9b×\9d × ×\97ס×\9e×\94 ×\91×\90×\95פ×\9f ×\90×\95×\98×\95×\9e×\98×\99 ×\9b×\99×\95×\95×\9f ×©×\9eשת×\9eש ×\90×\97ר, ×©× ×\97ס×\9d ×¢×\9cÖ¾×\99×\93×\99 $1, ×\94שת×\9eש ×\91×\94.\n×\94ס×\99×\91×\94 ×©× ×\99תנ×\94 ×\9c×\97ס×\99×\9e×\94 ×\94×\99×\90:\n\n:<em>$2</em>\n\n* ×ª×\97×\99×\9cת ×\94×\97ס×\99×\9e×\94: $8\n* ×¤×§×\99עת ×\94×\97ס×\99×\9e×\94: $6\n* ×\94×\97ס×\99×\9e×\94 ×©×\91×\95צע×\94: $7\n\n×\91×\90פשר×\95ת×\9b×\9d ×\9c×\99צ×\95ר ×§×©×¨ ×¢×\9d $1 ×\90×\95 ×¢×\9d ×\9b×\9c ×\90×\97×\93 ×\9e[[{{MediaWiki:Grouppage-sysop}}|×\9eפע×\99×\9c×\99 ×\94×\9eער×\9bת]] ×\94×\90×\97ר×\99×\9d ×\9b×\93×\99 ×\9c×\93×\95×\9f ×\91×\97ס×\99×\9e×\94.\n\n×\91×\90פשר×\95ת×\9b×\9d ×\9c×\94שת×\9eש ×\91ת×\9b×\95נת \"{{int:emailuser}}\", ×\90×\9c×\90 ×\90×\9d ×\9c×\90 ×¦×\99×\99נת×\9d ×\9bת×\95×\91ת ×\93×\95×\90\"×\9c ×ª×§×\99× ה ב[[Special:Preferences|העדפות המשתמש שלכם]] או אם נחסמתם משליחת דוא\"ל.\n\nכתובת ה־IP שלכם היא $3, ומספר החסימה שלכם הוא #$5.\nאנא ציינו את כל הפרטים הללו בכל פנייה למפעילי המערכת.",
        "blockednoreason": "לא ניתנה סיבה",
        "whitelistedittext": "עליכם $1 כדי לערוך דפים.",
        "confirmedittext": "עליכם לאמת את כתובת הדוא\"ל שלכם לפני שתוכלו לערוך דפים. אנא הגדירו ואמתו את כתובת הדוא\"ל שלכם באמצעות [[Special:Preferences|העדפות המשתמש]] שלכם.",
        "rev-deleted-user": "(שם המשתמש הוסר)",
        "rev-deleted-event": "(פעולת היומן הוסרה)",
        "rev-deleted-user-contribs": "[שם המשתמש או כתובת ה־IP הוסרו – העריכה הוסתרה מדף התרומות]",
-       "rev-deleted-text-permission": "גרסת הדף הזו '''נמחקה'''.\nניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
-       "rev-deleted-text-unhide": "גרסת הדף הזו '''נמחקה'''.\nניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].\nאתם עדיין יכולים [$1 לצפות בגרסה] אם ברצונכם להמשיך.",
-       "rev-suppressed-text-unhide": "גרסת הדף הזו '''הוסתרה'''.\nניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההסתרות].\nאתם עדיין יכולים [$1 לצפות בגרסה] אם ברצונכם להמשיך.",
+       "rev-deleted-text-permission": "גרסת הדף הזו <strong>נמחקה</strong>.\nניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
+       "rev-suppressed-text-permission": "גרסת הדף הזו <strong>הועלמה</strong>.\nניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההעלמות].",
+       "rev-deleted-text-unhide": "גרסת הדף הזו <strong>נמחקה</strong>.\nניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].\nאתם עדיין יכולים [$1 לצפות בגרסה הזו] אם ברצונכם להמשיך.",
+       "rev-suppressed-text-unhide": "גרסת הדף הזו <strong>הועלמה</strong>.\nניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההעלמות].\nאתם עדיין יכולים [$1 לצפות בגרסה הזו] אם ברצונכם להמשיך.",
        "rev-deleted-text-view": "גרסת הדף הזו '''נמחקה'''.\nאתם יכולים לצפות בה; ניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
-       "rev-suppressed-text-view": "גרסת הדף הזו '''הוסתרה'''.\nאתם יכולים לצפות בה; ניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההסתרות].",
+       "rev-suppressed-text-view": "גרסת הדף הזו <strong>הועלמה</strong>.\nאתם יכולים לצפות בה; ניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההעלמות].",
        "rev-deleted-no-diff": "אינכם יכולים לצפות בהבדלים בין הגרסאות שציינתם משום שאחת מהן '''נמחקה'''.\nניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
        "rev-suppressed-no-diff": "אינכם יכולים לצפות בהבדלים בין הגרסאות שציינתם משום שאחת מהן '''נמחקה'''.",
        "rev-deleted-unhide-diff": "אחת מהגרסאות שביקשתם להשוות '''נמחקה'''.\nניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].\nאתם עדיין יכולים [$1 לצפות בהבדלים בין הגרסאות] אם ברצונכם להמשיך.",
-       "rev-suppressed-unhide-diff": "אחת מהגרסאות שביקשתם להשוות '''הוסתרה'''.\nניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההסתרות].\nאתם עדיין יכולים [$1 לצפות בהבדלים בין הגרסאות] אם ברצונכם להמשיך.",
+       "rev-suppressed-unhide-diff": "אחת מהגרסאות שביקשתם להשוות <strong>הועלמה</strong>.\nניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההעלמות].\nאתם עדיין יכולים [$1 לצפות בהבדלים בין הגרסאות] אם ברצונכם להמשיך.",
        "rev-deleted-diff-view": "אחת מהגרסאות שביקשתם להשוות '''נמחקה'''.\nאתם עדיין יכולים לצפות בהבדלים בין הגרסאות; ניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
-       "rev-suppressed-diff-view": "אחת מהגרסאות שביקשתם להשוות '''הוסתרה'''.\nאתם יכולים לצפות בהבדלים בין הגרסאות; ניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההסתרות].",
+       "rev-suppressed-diff-view": "אחת מהגרסאות שביקשתם להשוות <strong>הועלמה</strong>\nאתם יכולים לצפות בהבדלים בין הגרסאות; ניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן  ההעלמות].",
        "rev-delundel": "הצגה/הסתרה",
        "rev-showdeleted": "הצגה",
        "revisiondelete": "מחיקה ושחזור של גרסאות",
        "revdelete-text-text": "גרסאות שנמחקו עדיין תופענה בהיסטוריית הדף, אך חלקים מהתוכן שלהן לא יהיו זמינים לציבור.",
        "revdelete-text-file": "גרסאות קבצים שנמחקו עדיין תופענה בהיסטוריית הקובץ, אך חלקים מהתוכן שלהן לא יהיו זמינים לציבור.",
        "logdelete-text": "פעולות יומן שנמחקו עדיין תופענה בדפי היומנים, אך חלקים מהתוכן שלהן לא יהיו זמינים לציבור.",
-       "revdelete-text-others": "×\9eפע×\99×\9c×\99 ×\9eער×\9bת ×\90×\97ר×\99×\9d ×\91×\90תר ×¢×\93×\99×\99×\9f ×\99×\95×\9b×\9c×\95 ×\9c×\92שת ×\9cת×\95×\9b×\9f ×\94נסתר ×\95×\99×\95×\9b×\9c×\95 ×\9cש×\97×\96ר ×\90×\95ת×\95 ×©×\95×\91 ×\93ר×\9a ×\94×\9e×\9eשק ×\94×\96×\94, אלא אם כן תוגדרנה הגבלות נוספות.",
+       "revdelete-text-others": "×\9eפע×\99×\9c×\99 ×\9eער×\9bת ×\90×\97ר×\99×\9d ×¢×\93×\99×\99×\9f ×\99×\95×\9b×\9c×\95 ×\9c×\92שת ×\9cת×\95×\9b×\9f ×\94נסתר ×\9b×\93×\99 ×\9cש×\97×\96ר ×\90×\95ת×\95, אלא אם כן תוגדרנה הגבלות נוספות.",
        "revdelete-confirm": "אנא אשרו שזה אכן מה שאתם מתכוונים לעשות, שאתם מבינים את התוצאות של מעשה כזה, ושהמעשה מבוצע בהתאם ל[[{{MediaWiki:Policy-url}}|נוהלי האתר]].",
-       "revdelete-suppress-text": "×\99ש ×\9c×\94שת×\9eש ×\91×\94סתר×\94 ×\9e×\9c×\90×\94 '''×\90×\9a ×\95רק''' ×\91×\9eקר×\99×\9d ×\94×\91×\90×\99×\9d:\n* ×\9e×\99×\93×¢ ×©×¢×\9c×\95×\9c ×\9c×\94×\99×\95ת ×\9cש×\95×\9f ×\94רע\n* ×\97ש×\99פת ×\9e×\99×\93×¢ ×\90×\99ש×\99\n*: '''×\9bת×\95×\91×\95ת ×\91ת×\99×\9d ×\95×\9eספר×\99 ×\98×\9cפ×\95×\9f, ×\9eספר×\99 ×\96×\99×\94×\95×\99 ×\9e×\93×\99נת×\99×\99×\9d, ×\95×\9b×\93×\95×\9e×\94'''",
+       "revdelete-suppress-text": "×\99ש ×\9c×\94שת×\9eש ×\91×\94×¢×\9c×\9e×\94 '''×\90×\9a ×\95רק''' ×\91×\9eקר×\99×\9d ×\94×\91×\90×\99×\9d:\n* ×\9e×\99×\93×¢ ×©×¢×\9c×\95×\9c ×\9c×\94×\99×\95ת ×\9cש×\95×\9f ×\94רע\n* ×\97ש×\99פת ×\9e×\99×\93×¢ ×\90×\99ש×\99\n*: <em>×\9bת×\95×\91×\95ת ×\91ת×\99×\9d ×\95×\9eספר×\99 ×\98×\9cפ×\95×\9f, ×\9eספר×\99 ×\96×\94×\95ת, ×\95×\9b×\95'</em>",
        "revdelete-legend": "הגדרת הגבלות התצוגה",
        "revdelete-hide-text": "תוכן הגרסה",
        "revdelete-hide-image": "הסתרת תוכן הקובץ",
        "revdelete-hide-name": "הסתרת הפעולה ודף היעד",
        "revdelete-hide-comment": "תקציר העריכה",
        "revdelete-hide-user": "שם המשתמש או כתובת ה־IP של העורך",
-       "revdelete-hide-restricted": "×\94סתרת המידע גם ממפעילי המערכת",
+       "revdelete-hide-restricted": "×\94×¢×\9c×\9eת המידע גם ממפעילי המערכת",
        "revdelete-radio-same": "(ללא שינוי)",
        "revdelete-radio-set": "מוסתר",
        "revdelete-radio-unset": "גלוי",
-       "revdelete-suppress": "×\94סתרת המידע גם ממפעילי המערכת",
+       "revdelete-suppress": "×\94×¢×\9c×\9eת המידע גם ממפעילי המערכת",
        "revdelete-unsuppress": "הסרת הגבלות בגרסאות המשוחזרות",
        "revdelete-log": "סיבה:",
        "revdelete-submit": "ביצוע על {{PLURAL:$1|הגרסה שנבחרה|הגרסאות שנבחרו}}",
        "revdelete-modify-missing": "שגיאה בשינוי פריט מספר $1: הוא אינו נמצא בבסיס הנתונים!",
        "revdelete-no-change": "'''אזהרה:''' לפריט מתאריך $2, $1 כבר יש את הגדרות ההצגה הנדרשות.",
        "revdelete-concurrent-change": "שגיאה בשינוי הפריט מתאריך $2, $1: נראה שמצבו שונה על־ידי מישהו אחר בזמן שאתם ניסיתם לשנות אותו.\nאנא בדקו ביומנים.",
-       "revdelete-only-restricted": "ש×\92×\99×\90×\94 ×\91×\94סתרת ×\94פר×\99×\98 ×\9eת×\90ר×\99×\9a $2, $1: ×\90×\99×\9f ×\91×\90פשר×\95ת×\9a ×\9c×\94סת×\99ר ×¤×¨×\99×\98×\99×\9d ×\9e×\9eפע×\99×\9c×\99 ×\94×\9eער×\9bת ×\9e×\91×\9c×\99 ×\9c×\91×\97×\95ר ×\92×\9d ×\91×\90×\97ת ×\9e×\90פשר×\95×\99×\95ת ×\94×\94סתר×\94 האחרות.",
+       "revdelete-only-restricted": "ש×\92×\99×\90×\94 ×\91×\94סתרת ×\94פר×\99×\98 ×\9eת×\90ר×\99×\9a $2, $1: ×\90×\99×\9f ×\91×\90פשר×\95ת×\9a ×\9c×\94×¢×\9c×\99×\9d ×¤×¨×\99×\98×\99×\9d ×\9e×\9eפע×\99×\9c×\99 ×\94×\9eער×\9bת ×\9e×\91×\9c×\99 ×\9c×\91×\97×\95ר ×\92×\9d ×\91×\90×\97ת ×\9e×\90פשר×\95×\99×\95ת ×\94נר×\90×\95ּת האחרות.",
        "revdelete-reason-dropdown": "* סיבות מחיקה נפוצות\n** הפרת זכויות יוצרים\n** תקציר עריכה או מידע אישי לא הולמים\n** שם משתמש לא הולם\n** מידע שעלול להיות לשון הרע",
        "revdelete-otherreason": "סיבה אחרת/נוספת:",
        "revdelete-reasonotherlist": "סיבה אחרת",
        "revdelete-edit-reasonlist": "עריכת סיבות המחיקה",
        "revdelete-offender": "מחבר הגרסה:",
-       "suppressionlog": "×\99×\95×\9e×\9f ×\94סתרות",
+       "suppressionlog": "×\99×\95×\9e×\9f ×\94×¢×\9c×\9eות",
        "suppressionlogtext": "להלן רשימת המחיקות והחסימות הכוללות תוכן המוסתר ממפעילי המערכת.\nראו את [[Special:BlockList|רשימת החסומים]] לרשימת החסימות הפעילות כעת.",
        "mergehistory": "מיזוג גרסאות של דפים",
        "mergehistory-header": "דף זה מאפשר לכם למזג גרסאות מהיסטוריית הדף של דף מקור לתוך דף חדש יותר.\nאנא ודאו ששינוי זה לא יפגע בהמשכיות השינויים בדף הישן.\n\n'''לפחות גרסה אחת של דף המקור חייבת להישאר בו.'''",
        "right-deletedtext": "צפייה בטקסט מחוק ובהבדלים בין גרסאות מחוקות",
        "right-browsearchive": "חיפוש דפים מחוקים",
        "right-undelete": "שחזור דף מחוק",
-       "right-suppressrevision": "בדיקה ושחזור של גרסאות המוסתרות ממפעילי המערכת",
+       "right-suppressrevision": "הצגה, הסתרה וביטול הסתרה של גרסאות מסוימות של דפים מכל המשתמשים",
+       "right-viewsuppressed": "הצגת גרסאות שמוסתרות מכל המשתמשים",
        "right-suppressionlog": "צפייה ביומנים פרטיים",
        "right-block": "חסימת משתמשים אחרים מעריכה",
        "right-blockemail": "חסימת משתמש משליחת דואר אלקטרוני",
        "recentchanges-legend-heading": "'''מקרא:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ראו גם [[Special:NewPages|רשימת דפים חדשים]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "להלן השינויים שבוצעו החל מ‏‏֫־<b>$2</b> (עד <b>$1</b> מוצגים).",
+       "rcnotefrom": "להלן {{PLURAL:$5|השינוי שבוצע|השינויים שבוצעו}} החל מ‏‏֫־<b>$2</b> (עד <b>$1</b> מוצגים).",
        "rclistfrom": "הצגת שינויים חדשים החל מ־$2, $3",
        "rcshowhideminor": "$1 שינויים משניים",
        "rcshowhideminor-show": "הצגת",
        "fileexists-shared-forbidden": "קובץ בשם זה כבר קיים כקובץ משותף.\nאם אתם עדיין מעוניינים להעלות קובץ זה, אנא חזרו לדף הקודם והעלו את הקובץ תחת שם חדש.\n[[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "קובץ זה זהה {{PLURAL:$1|לקובץ הבא|לקבצים הבאים}}:",
        "file-deleted-duplicate": "קובץ זהה לקובץ זה ([[:$1]]) נמחק בעבר.\nאנא בדקו את היסטוריית המחיקה של הקובץ לפני שתעלו אותו מחדש.",
-       "file-deleted-duplicate-notitle": "ק×\95×\91×¥ ×\96×\94×\94 ×\9cק×\95×\91×¥ ×\96×\94 × ×\9e×\97ק ×\91×¢×\91ר, ×\95×\94×\9b×\95תרת ×©×\9c×\95 ×\94×\95סתר×\94.\n×\90× ×\90 ×\91קש×\95 ×\9e×\9e×\99ש×\94×\95 ×©×\99×\9b×\95×\9c ×\9cר×\90×\95ת ×\9e×\99×\93×¢ ×¢×\9c ×§×\91צ×\99×\9d ×©×\94×\95סתרו לבדוק את המצב לפני שתעלו אותו מחדש.",
+       "file-deleted-duplicate-notitle": "ק×\95×\91×¥ ×\96×\94×\94 ×\9cק×\95×\91×¥ ×\96×\94 × ×\9e×\97ק ×\91×¢×\91ר, ×\95×\94×\9b×\95תרת ×©×\9c×\95 ×\94×\95×¢×\9c×\9e×\94.\n×\90× ×\90 ×\91קש×\95 ×\9e×\9e×\99ש×\94×\95 ×©×\99×\9b×\95×\9c ×\9cר×\90×\95ת × ×ª×\95× ×\99×\9d ×¢×\9c ×§×\91צ×\99×\9d ×©×\94×\95×¢×\9c×\9eו לבדוק את המצב לפני שתעלו אותו מחדש.",
        "uploadwarning": "אזהרת העלאת קבצים",
        "uploadwarning-text": "אנא שנו את תיאור הקובץ שלמטה ונסו שוב.",
        "savefile": "שמירת קובץ",
        "nolicense": "אין",
        "licenses-edit": "עריכת אפשרויות רישיון",
        "license-nopreview": "(תצוגה מקדימה לא זמינה)",
-       "upload_source_url": "(×\9bת×\95×\91ת URL ×ª×§×¤×\94 ×\95× ×\92×\99ש×\94)",
-       "upload_source_file": "(ק×\95×\91×¥ ×\91מחשב שלך)",
+       "upload_source_url": "(ק×\95×\91×¥ ×©×\91×\97רת ×\9e×\9bת×\95×\91ת URL ×ª×§×\99× ×\94 ×\95× ×\92×\99ש×\94 ×\9cצ×\99×\91×\95ר)",
+       "upload_source_file": "(ק×\95×\91×¥ ×©×\91×\97רת ×\9e×\94מחשב שלך)",
        "listfiles-delete": "מחיקה",
        "listfiles-summary": "דף מיוחד זה מציג את כל הקבצים שהועלו.",
        "listfiles_search_for": "חיפוש קובץ מדיה בשם:",
        "watchlist-details": "ברשימת המעקב יש {{PLURAL:$1|דף אחד|$1 דפים}}, כאשר דפי השיחה אינם נספרים בנפרד.",
        "wlheader-enotif": "הודעות דוא\"ל מאופשרות.",
        "wlheader-showupdated": "דפים שהשתנו מאז ביקורך האחרון בהם מוצגים ב'''הדגשה'''.",
-       "wlnote2": "להלן השינויים האחרונים {{PLURAL:$1|בשעה האחרונה|בשעתיים האחרונות|ב‏‏־<strong>$1</strong> השעות האחרונות}}, עד $3, $2.",
+       "wlnote": "להלן {{PLURAL:$1|השינוי האחרון|<strong>$1</strong> השינויים האחרונים}} {{PLURAL:$2|בשעה האחרונה|בשעתיים האחרונות|ב־<strong>$2</strong> השעות האחרונות}}, עד $4, $3.",
        "wlshowlast": "(הצגת $1 שעות אחרונות | $2 ימים אחרונים | $3)",
        "watchlist-options": "אפשרויות ברשימת המעקב",
        "watching": "בהוספה לרשימת המעקב…",
        "sp-contributions-newbies-sub": "עבור משתמשים חדשים",
        "sp-contributions-newbies-title": "תרומות של משתמשים חדשים",
        "sp-contributions-blocklog": "יומן חסימות",
-       "sp-contributions-suppresslog": "תר×\95×\9e×\95ת ×\9eשת×\9eש ×\9e×\95סתרות",
+       "sp-contributions-suppresslog": "תר×\95×\9e×\95ת ×\9eשת×\9eש ×\9e×\95×¢×\9c×\9eות",
        "sp-contributions-deleted": "תרומות משתמש מחוקות",
        "sp-contributions-uploads": "העלאות",
        "sp-contributions-logs": "יומנים",
        "blockipsuccesssub": "החסימה הושלמה בהצלחה",
        "blockipsuccesstext": "{{GENDER:$1|המשתמש|המשתמשת}} [[Special:Contributions/$1|$1]] {{GENDER:$1|נחסם|נחסמה}}.\n\nראו את [[Special:BlockList|רשימת החסומים]] כדי לצפות בחסימות.",
        "ipb-blockingself": "אתם עומדים לחסום את עצמכם! האם אתם בטוחים שברצונכם לעשות זאת?",
-       "ipb-confirmhideuser": "×\90ת×\9d ×¢×\95×\9e×\93×\99×\9d ×\9c×\97ס×\95×\9d ×\9eשת×\9eש ×¢×\9d ×\94×\90פשר×\95ת \"×\94סתרת ×\9eשת×\9eש\". ×¤×¢×\95×\9c×\94 ×\96×\95 ×ª×¡×ª×\99ר את שם המשתמש בכל הרשימות ופעולות היומן. האם אתם בטוחים שברצונכם לעשות זאת?",
+       "ipb-confirmhideuser": "×\90ת×\9d ×¢×\95×\9e×\93×\99×\9d ×\9c×\97ס×\95×\9d ×\9eשת×\9eש ×¢×\9d ×\94×\90פשר×\95ת \"×\94סתרת ×\9eשת×\9eש\". ×\96×\94 ×\99×¢×\9c×\99×\9d את שם המשתמש בכל הרשימות ופעולות היומן. האם אתם בטוחים שברצונכם לעשות זאת?",
        "ipb-confirmaction": "אם אתם באמת בטוחים שברצונכם לעשות זאת, אנא סמנו את השדה \"{{int:ipb-confirm}}\" שבתחתית.",
        "ipb-edit-dropdown": "עריכת סיבות החסימה",
        "ipb-unblock-addr": "הסרת חסימה של $1",
        "autoblocker": "נחסמתם באופן אוטומטי משום שאתם חולקים את כתובת ה־IP שלכם עם [[User:$1|$1]].\nהסיבה שניתנה לחסימת $1 היא \"$2\"",
        "blocklogpage": "יומן חסימות",
        "blocklog-showlog": "משתמש זה נחסם בעבר.\nיומן החסימות מוצג להלן:",
-       "blocklog-showsuppresslog": "×\9eשת×\9eש ×\96×\94 × ×\97ס×\9d ×\95×\94×\95סתר ×\91×¢×\91ר.\n×\99×\95×\9e×\9f ×\94×\94סתרות מוצג להלן:",
+       "blocklog-showsuppresslog": "×\9eשת×\9eש ×\96×\94 × ×\97ס×\9d ×\95×\94×\95סתר ×\91×¢×\91ר.\n×\99×\95×\9e×\9f ×\94×\94×¢×\9c×\9eות מוצג להלן:",
        "blocklogentry": "חסם את [[$1]] למשך $2 $3",
        "reblock-logentry": "שינה את הגדרות החסימה של [[$1]] עם זמן פקיעה של $2 $3",
        "blocklogtext": "זהו יומן פעולות החסימה והשחרור של משתמשים.\nכתובות IP שנחסמו אוטומטית אינן מופיעות.\nראו גם את [[Special:BlockList|רשימת החסומים]] לרשימה של החרמות וחסימות פעילות כעת.",
        "range_block_disabled": "האפשרות לחסום טווח כתובות אינה פעילה.",
        "ipb_expiry_invalid": "זמן פקיעת החסימה אינו תקין.",
        "ipb_expiry_temp": "חסימות הכוללות הסתרת שם משתמש חייבות להיות לזמן בלתי מוגבל.",
-       "ipb_hide_invalid": "×\9c×\90 × ×\99ת×\9f ×\9c×\94סת×\99ר ×©×\9d ×\9eשת×\9eש זה; {{PLURAL:$1|בוצעה ממנו יותר מעריכה אחת|בוצעו ממנו יותר מ‏‏֫־$1 עריכות}}.",
+       "ipb_hide_invalid": "×\9c×\90 × ×\99ת×\9f ×\9c×\94×¢×\9c×\99×\9d ×\90ת ×\94×\97ש×\91×\95×\9f ×\94זה; {{PLURAL:$1|בוצעה ממנו יותר מעריכה אחת|בוצעו ממנו יותר מ‏‏֫־$1 עריכות}}.",
        "ipb_already_blocked": "המשתמש \"$1\" כבר נחסם.",
        "ipb-needreblock": "$1 כבר נחסם. האם ברצונכם לשנות את הגדרות החסימה?",
        "ipb-otherblocks-header": "{{PLURAL:$1|חסימה אחרת|חסימות אחרות}}",
        "importlogpage": "יומן ייבוא",
        "importlogpagetext": "ייבוא מנהלי של דפים (כולל היסטוריית העריכות שלהם) מאתרי ויקי אחרים.",
        "import-logentry-upload": "ייבא את [[$1]] באמצעות העלאת קובץ",
-       "import-logentry-upload-detail": "{{PLURAL:$1|גרסה אחת|$1 גרסאות}}",
+       "import-logentry-upload-detail": "{{PLURAL:$1|גרסה אחת יובאה|$1 גרסאות יובאו}}",
        "import-logentry-interwiki": "ייבא את $1 בייבוא בין־אתרי",
-       "import-logentry-interwiki-detail": "{{PLURAL:$1|גרסה אחת|$1 גרסאות}} של הדף $2",
+       "import-logentry-interwiki-detail": "{{PLURAL:$1|גרסה אחת של הדף $2 יובאה|$1 גרסאות של הדף $2 יובאו}}",
        "javascripttest": "בדיקת JavaScript",
        "javascripttest-title": "הרצת בדיקות $1",
        "javascripttest-pagetext-noframework": "דף זה שמור להרצת בדיקות JavaScript.",
        "autosumm-replace": "החלפת הדף בתוכן \"$1\"",
        "autoredircomment": "הפניה לדף [[$1]]",
        "autosumm-new": "יצירת דף עם התוכן \"$1\"",
+       "autosumm-newblank": "יצירת דף ריק",
        "size-bytes": "$1 בייט",
        "size-kilobytes": "$1 קילו־בייט",
        "size-megabytes": "$1 מגה־בייט",
        "logentry-delete-revision": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|גרסה|$5 גרסאות}} בדף $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של פעולות יומן של $3",
        "logentry-delete-revision-legacy": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של גרסאות בדף $3",
-       "logentry-suppress-delete": "$1 {{GENDER:$2|×\94סת×\99ר|×\94סת×\99ר×\94}} ×\9c×\97×\9c×\95×\98×\99×\9f את הדף $3",
+       "logentry-suppress-delete": "$1 {{GENDER:$2|×\94×¢×\9c×\99×\9d\94×¢×\9c×\99×\9e×\94}} את הדף $3",
        "logentry-suppress-event": "$1 {{GENDER:$2|שינה|שינתה}} בסודיות את מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4",
        "logentry-suppress-revision": "$1 {{GENDER:$2|שינה|שינתה}} בסודיות את מצב התצוגה של {{PLURAL:$5|גרסה|$5 גרסאות}} בדף $3: $4",
        "logentry-suppress-event-legacy": "$1 {{GENDER:$2|שינה|שינתה}} בסודיות את מצב התצוגה של פעולות יומן של $3",
index 6845717..8ff0b40 100644 (file)
        "view": "दर्शाव",
        "view-foreign": "$1 पर देखें",
        "edit": "सम्पादन",
+       "edit-local": "स्थानीय विवरण सम्पादन",
        "create": "बनाएँ",
+       "create-local": "स्थानीय विवरण निर्माण",
        "editthispage": "इस पृष्ठ को बदलें",
        "create-this-page": "यह पृष्ठ बनाएँ",
        "delete": "हटाएँ",
        "talkpagelinktext": "चर्चा",
        "specialpage": "विशेष पृष्ठ",
        "personaltools": "वैयक्तिक औज़ार",
-       "postcomment": "नया अनुभाग",
        "articlepage": "सामग्री पृष्ठ देखें",
        "talk": "चर्चा",
        "views": "दर्शाव",
        "jumptonavigation": "भ्रमण",
        "jumptosearch": "खोज",
        "view-pool-error": "क्षमा करें, इस समय सर्वरों पर अतिभार है।\nबहुत सारे प्रयोक्ता इस पृष्ठ को देखने का प्रयास कर रहे हैं।\nकृपया कुछ समय प्रतीक्षा कर फिर से इस पृष्ठ को देखने का प्रयास करें।\n\n$1",
+       "generic-pool-error": "क्षमा करें, इस समय सर्वरों पर अत्यधिक भार है।\nइस सामग्री को बहुत अधिक प्रयोक्ता देखने का प्रयत्न कर रहे हैं।\nकृपया इसे देखने का पुनः यत्न कुछ समय पश्चात करें।",
        "pool-timeout": "तालाबन्दी के लिए प्रतीक्षा समय समाप्त",
        "pool-queuefull": "पूल पंक्ति भरी हुई है",
        "pool-errorunknown": "अज्ञात त्रुटि",
        "externaldberror": "या तो प्रमाणिकरण डाटाबेस में त्रुटि हुई है या फिर आपको अपना बाह्य खाता अपडेट करने की अनुमति नहीं है।",
        "login": "लॉग इन",
        "nav-login-createaccount": "सत्रारंभ / खाता खोलें",
-       "loginprompt": "{{SITENAME}} पर लॉग इन करने के लिए अपने ब्राउज़र पर कुकीज़ (cookies) सक्षम करें।",
        "userlogin": "सत्रारंभ / खाता खोलें",
        "userloginnocreate": "लॉग इन",
        "logout": "सत्रांत",
        "gotaccountlink": "लॉग इन",
        "userlogin-resetlink": "अपनी प्रवेश जानकारी भूल गए हैं?",
        "userlogin-resetpassword-link": "अपना पासवर्ड भूल गए?",
+       "userlogin-helplink2": "लॉग इन करने में सहायता",
        "userlogin-loggedin": "आप {{GENDER:$1|$1}} के रूप में पहले से लॉग्ड इन हैं।\nकिसी अन्य सदस्य के रूप में लॉग इन करने के लिए निम्नलिखित फ़ॉर्म का प्रयोग करें।",
        "userlogin-createanother": "एक अन्य खाता खोलें",
        "createacct-emailrequired": "ई-मेल पता",
        "edit-gone-missing": "पृष्ठ अद्यतित न किया जा सका।\nलगता है यह हटा दिया गया है।",
        "edit-conflict": "संपादन अंतर्विरोध",
        "edit-no-change": "आपने कोई बदलाव ही नहीं किए, अतः आपके इस संपादन को नज़रंदाज़ कर दिया गया है।",
+       "postedit-confirmation-created": "पृष्ठ निर्मित किया गया है।",
+       "postedit-confirmation-restored": "पृष्ठ पुरानी स्थिति पर लाया गया है।",
        "postedit-confirmation-saved": "आपका सम्पादन सहेजा गया है।",
        "edit-already-exists": "नया पृष्ठ बनाया नहीं जा सका।\nयह पहले से मौजूद है।",
        "defaultmessagetext": "संदेश का डिफ़ॉल्ट पाठ",
        "parser-template-loop-warning": "साँचा चक्र मिला: [[$1]]",
        "parser-template-recursion-depth-warning": "साँचा पुनरावर्ती गहराई सीमा पार ($1)",
        "language-converter-depth-warning": "भाषा कन्वर्टर गहराई सीमा से बाहर गया ( $1 )",
-       "node-count-exceeded-category": "पृष्ठ जिनमें नोड-संख्या पार की गई है",
+       "node-count-exceeded-category": "पृष्ठ जिनमें नोड-संख्या सीमा पार की गई है",
+       "node-count-exceeded-category-desc": "यह उन पृष्ठों की श्रेणी है जिनमें नोड-संख्या सीमा पार की गयी है।",
        "node-count-exceeded-warning": "पृष्ठ ने नोड-संख्या पार की है",
        "expansion-depth-exceeded-category": "पृष्ठ जिनमें विस्तार गहराई पार की गई है",
+       "expansion-depth-exceeded-category-desc": "यह उन पृष्ठों की श्रेणी है जिनमें विस्तार गहराई पार की गयी है।",
        "expansion-depth-exceeded-warning": "पृष्ठ में विस्तार गहराई पार की गई है",
        "parser-unstrip-loop-warning": "Unstrip लूप पाया गया",
        "parser-unstrip-recursion-limit": "Unstrip पुनरावर्तन सीमा पार की गई ($1)",
        "currentrev": "सद्य अवतरण",
        "currentrev-asof": "$1 के समय का अवतरण",
        "revisionasof": "$1 का अवतरण",
-       "revision-info": "$2 द्वारा परिवर्तित $1 का अवतरण",
+       "revision-info": "{{GENDER:$6|$2}} द्वारा परिवर्तित $1 का अवतरण$7",
        "previousrevision": "← पुराना अवतरण",
        "nextrevision": "नया अवतरण →",
        "currentrevisionlink": "वर्तमान अवतरण",
        "revdelete-no-file": "निर्दिष्ट फ़ाइल मौजूद नहीं है।",
        "revdelete-show-file-confirm": "क्या आप वाकई फ़ाइल \"<nowiki>$1</nowiki>\" के $2 को $3 बजे बने, हटाए जा चुके अवतरण को देखना चाहते हैं?",
        "revdelete-show-file-submit": "हाँ",
+       "revdelete-selected-text": "[[:$2]] {{PLURAL:$1|का|के}} चयनित अवतरण:",
+       "revdelete-selected-file": "[[:$2]] {{PLURAL:$1|का|के}} चयनित फ़ाइल अवतरण:",
        "logdelete-selected": "{{PLURAL:$1|चुना हुआ|चुने हुए}} लॉग इवेंट:",
        "revdelete-confirm": "पुष्टि करें कि आप यह कार्य करना चाहते हैं, आप इसका परिणाम समझते हैं, और आप ये [[{{MediaWiki:Policy-url}}|नीति]] के अनुसार कर रहे हैं।",
        "revdelete-suppress-text": "छिपाने का प्रयोग <strong>केवल</strong> इन परिस्थितियों में होना चाहिए:\n* संभावित अपमानजनक जानकारी\n* अनुपयुक्त निजी जानकारी\n*: <em>घर के पते व दूरभाष, राष्ट्रीय पहचान क्रमांक आदि।</em>",
        "right-move": "पृष्ठ स्थानांतरित करें",
        "right-move-subpages": "पृष्ठ उपपृष्ठों सहित स्थानांतरीत करें",
        "right-move-rootuserpages": "मूल सदस्य पृष्ठ स्थानांतरित करें",
+       "right-move-categorypages": "श्रेणी पृष्ठ स्थानांतरित करें",
        "right-movefile": "संचिकाएँ स्थानांतरित करें",
        "right-suppressredirect": "पृष्ठ स्थानांतरित करते समय पुनर्निर्देश ना छोड़ें",
        "right-upload": "फ़ाइल अपलोड करें",
        "action-createpage": "पृष्ठ बनाने",
        "action-createtalk": "वार्ता पृष्ठ बनाने",
        "action-createaccount": "यह सदस्य खाता खोलने",
+       "action-history": "इस पृष्ठ का इतिहास देखने",
        "action-minoredit": "इस बदलाव को छोटा बदलाव चिन्हित करने",
        "action-move": "इस पृष्ठ को स्थानांतरित करने",
        "action-move-subpages": "इस पृष्ठ व इसके उप-पृष्ठों को स्थानांतरित करने",
        "action-move-rootuserpages": "मूल सदस्य पृष्ठों को स्थानांतरित करने",
+       "action-move-categorypages": "श्रेणी पृष्ठ स्थानांतरित करने",
        "action-movefile": "इस फ़ाइल को स्थानांतरित करने",
        "action-upload": "इस फ़ाइल को अपलोड करने",
        "action-reupload": "मौजूदा फ़ाइल के स्थान पर नई सामग्री डालने",
        "windows-nonascii-filename": "यह विकि विशेष कैरैक्टरों के साथ फ़ाइल के नामों को स्वीकार नहीं करता।",
        "fileexists": "इस नाम की फ़ाइल पहले से मौजूद है, यदि यह फ़ाइल बदलने में आप साशंक हैं तो कृपया <strong>[[:$1]]</strong> देखें। [[$1|thumb]]",
        "filepageexists": "इस फ़ाइल के लिए विवरण पृष्ठ पहले ही <strong>[[:$1]]</strong> पर बनाया जा चुका है, पर इस नाम की कोई फ़ाइल अभी उपस्थित नहीं है। \nआप जो विवरण देंगे वह विवरण पृष्ठ पर नहीं दिखेगा। \nआपको अपने विवरण को वहाँ डालने के लिए उसका हस्त्य सम्पादन करना पड़ेगा।\n[[$1|thumb]]",
-       "fileexists-extension": "à¤\87स à¤¨à¤¾à¤® à¤¸à¥\87 à¤®à¤¿à¤²à¤¤à¥\87-à¤\9cà¥\81लतà¥\87 à¤¨à¤¾à¤® à¤\95à¥\80 à¤\8fà¤\95 à¤«à¤¼à¤¾à¤\87ल à¤ªà¤¹à¤²à¥\87 à¤¸à¥\87 à¤¹à¥\88: [[$2|thumb]]\n* à¤\85पलà¥\8bड à¤¹à¥\8b à¤°à¤¹à¥\80 à¤«à¤¼à¤¾à¤\87ल à¤\95ा à¤¨à¤¾à¤®: <strong>[[:$1]]</strong>\n* à¤®à¥\8cà¤\9cà¥\82दा à¤«à¤¼à¤¾à¤\87ल à¤\95ा à¤¨à¤¾à¤®: <strong>[[:$2]]</strong>\nà¤\95à¥\83पया à¤\85नà¥\8dय à¤¨à¤¾à¤® à¤\9aà¥\81नà¥\87à¤\82।",
+       "fileexists-extension": "à¤\87स à¤¨à¤¾à¤® à¤¸à¥\87 à¤®à¤¿à¤²à¤¤à¥\87-à¤\9cà¥\81लतà¥\87 à¤¨à¤¾à¤® à¤\95à¥\80 à¤\8fà¤\95 à¤«à¤¼à¤¾à¤\87ल à¤ªà¤¹à¤²à¥\87 à¤¸à¥\87 à¤¹à¥\88: [[$2|thumb]]\n* à¤\85पलà¥\8bड à¤¹à¥\8b à¤°à¤¹à¥\80 à¤«à¤¼à¤¾à¤\87ल à¤\95ा à¤¨à¤¾à¤®: <strong>[[:$1]]</strong>\n* à¤®à¥\8cà¤\9cà¥\82दा à¤«à¤¼à¤¾à¤\87ल à¤\95ा à¤¨à¤¾à¤®: <strong>[[:$2]]</strong>\nशायद à¤\86प à¤\87ससà¥\87 à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤¨à¤¾à¤® à¤\95ा à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रना à¤\9aाहà¥\87à¤\82à¤\97à¥\87?",
        "fileexists-thumbnail-yes": "यह फ़ाइल बड़े चित्र का छोटा आकार ''(अंगूठाकार)'' प्रतीत होता है। [[$1|thumb]]\n<strong>[[:$1]]</strong> फ़ाइल को देखें।\nअगर जाँची गई फ़ाइल इसी आकार की है तो छोटे आकार की फ़ाइल अपलोड करने की आवश्यकता नहीं है।",
        "file-thumbnail-no": "इस फ़ाइल का नाम <strong>$1</strong> से शुरू हो रहा है।\nयह आकार घटाई हुई ''(अंगूठाकार)'' हो सकती है।\nअगर यह चित्र अपने मूल आकार में है तो इसे अपलोड करें, नहीं तो फ़ाइल बदलें।",
        "fileexists-forbidden": "इस नाम की फ़ाइल पहले ही मौजूद है, और इसकी जगह और नहीं अपलोड की जा सकती।\nयदि आप इस फ़ाइल को फिर भी अपलोड करना चाहते हैं, तो कृपया वापस जा के इसके लिए कोई अन्य नाम चुनें।\n[[File:$1|thumb|center|$1]]",
        "uploaddisabledtext": "फ़ाइल अपलोड अक्षम हैं।",
        "php-uploaddisabledtext": "पी॰एच॰पी में फ़ाइल अपलोड बंद हैं।\nकृपया file_uploads जमाव की जाँच करें।",
        "uploadscripted": "इस फ़ाइल में एच॰टी॰एम॰एल या स्क्रिप्ट कोड है, जो वेब ब्राउज़र द्वारा गलत पढ़ा जा सकता है।",
+       "uploadscriptednamespace": "इस एस॰वी॰जी फ़ाइल में अमान्य नामस्थान \"$1\" है।",
        "uploadinvalidxml": "अपलोड की गई फ़ाइल में स्थित XML पार्स नहीं की जा सकी।",
        "uploadvirus": "इस फ़ाइल में व्हाईरस हैं! अधिक जानकारी: $1",
        "uploadjava": "यह फ़ाइल एक ज़िप फ़ाइल है जिसमें एक जावा .class फ़ाइल है।\nजावा फ़ाइलों को अपलोड करना वर्जित है, क्योंकि इनके कारण सुरक्षा बाधाएँ पार की जा सकती हैं।",
        "license": "लाइसेन्सिंग:",
        "license-header": "लाइसेन्सिंग",
        "nolicense": "कुछ भी नहीं चुना",
+       "licenses-edit": "लाइसेंस विकल्प सम्पादन",
        "license-nopreview": "(झलक उपलब्ध नहीं है)",
        "upload_source_url": " (एक वैध, सभी जगहों से उपलब्ध यू॰आर॰एल)",
        "upload_source_file": " (आपके कम्प्यूटर से फ़ाइल)",
+       "listfiles-delete": "हटाएँ",
        "listfiles-summary": "यह विशेष पृष्ठ सभी अपलोड की गई फ़ाइलें दर्शाता है।",
        "listfiles_search_for": "मीडिया नाम के लिये खोजें:",
        "imgfile": "फ़ाइल",
        "filedelete-maintenance": "रखरखाव चल रहा है और रखरखाव के दौरान फ़ाइलों को हटाना और पुनर्स्थापित करना अक्षम है।",
        "filedelete-maintenance-title": "फ़ाइल हटा नहीं सकते",
        "mimesearch": "MIME खोज",
-       "mimesearch-summary": "MIME-प्रकारों के अनुसार फ़ाइलें खोजने के लिये इस पृष्ठ का इस्तेमाल किया जा सकता है।\nइनपुट: फ़ाइल का प्रकार/उपप्रकार, उदा. <code>image/jpeg</code>.",
+       "mimesearch-summary": "MIME-प्रकारों के अनुसार फ़ाइलें खोजने के लिये इस पृष्ठ का इस्तेमाल किया जा सकता है।\nइनपुट: फ़ाइल का प्रकार/उपप्रकार या प्रकार/*, उदा. <code>image/jpeg</code>।",
        "mimetype": "MIME प्रकार:",
        "download": "डाउनलोड",
        "unwatchedpages": "ध्यान न दिये हुए पृष्ठ",
        "wantedtemplates": "वांछित साँचे",
        "mostlinked": "सर्वाधिक से जुड़े हुए पृष्ठ",
        "mostlinkedcategories": "सर्वाधिक से जुड़ी हुई श्रेणियाँ",
-       "mostlinkedtemplates": "सरà¥\8dवाधिà¤\95 à¤¸à¥\87 à¤\9cà¥\81ड़à¥\87 à¤¹à¥\81à¤\8f à¤¸à¤¾à¤\81à¤\9aà¥\87",
+       "mostlinkedtemplates": "सरà¥\8dवाधिà¤\95 à¤\9fà¥\8dराà¤\82सà¤\95à¥\8dलà¥\82ड à¤\95ियà¥\87 à¤\97यà¥\87 à¤ªà¥\83षà¥\8dठ",
        "mostcategories": "सर्वाधिक श्रेणियों वाले पृष्ठ",
        "mostimages": "सर्वाधिक से जुड़ी हुई फ़ाइलें",
        "mostinterwikis": "सर्वाधिक अंतरविकी कड़ियों वाले पृष्ठ",
        "duplicate-defaultsort": "'''Warning:''' पुरानी मूल क्रमांकन कुंजी \"$1\" के बजाय अब मूल क्रमांकन कुंजी \"$2\" होगी।",
        "version": "रूपान्तर",
        "version-extensions": "इन्स्टॉल की हुई एक्स्टेंशन",
+       "version-skins": "इन्स्टॉल की गयी त्वचाएँ",
        "version-specialpages": "विशेष पृष्ठ",
        "version-parserhooks": "पार्सर हूक",
        "version-variables": "वेरिएबल",
        "version-antispam": "अवांछित-ईमेल रोकथाम",
-       "version-skins": "त्वचाएं",
        "version-other": "अन्य",
        "version-mediahandlers": "मीडिया संचालक",
        "version-hooks": "हूक",
index 62fd035..0b526c5 100644 (file)
        "prefs-watchlist-token": "Token popisa praćenja:",
        "prefs-misc": "Razno",
        "prefs-resetpass": "Promijeni lozinku",
-       "prefs-changeemail": "Promijeni E-mail",
+       "prefs-changeemail": "promijeni e-mail",
        "prefs-setemail": "Postavite E-mail adresu",
        "prefs-email": "Mogućnosti e-maila",
        "prefs-rendering": "Izgled",
        "watchlist-details": "{{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica}} se nalazi na popisu praćenja, ne brojeći stranice za razgovor.",
        "wlheader-enotif": "Uključeno je izvješćivanje e-poštom.",
        "wlheader-showupdated": "Stranice koje su promijenjene od Vašeg posljednjeg posjeta prikazane su '''podebljano'''",
+       "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 posljednjih $1 sati $2 dana $3",
        "watchlist-options": "Izbornik popisa praćenja",
        "watching": "Pratim...",
index 8203833..a21f545 100644 (file)
        "permalink": "Hivatkozás erre a változatra",
        "print": "Nyomtatás",
        "view": "Olvasás",
+       "view-foreign": "Megtekintés ezen: $1",
        "edit": "Szerkesztés",
        "edit-local": "Helyi leírás szerkesztése",
        "create": "Létrehozás",
        "jumptonavigation": "navigáció",
        "jumptosearch": "keresés",
        "view-pool-error": "A szerverek jelenleg túl vannak terhelve, mert túl sok felhasználó próbálta megtekinteni ezt az oldalt.\nKérjük, várj egy kicsit, mielőtt újra próbálkoznál a lap megtekintésével!\n\n$1",
+       "generic-pool-error": "Sajnálom, a szerverek jelenleg túl vannak terhelve.\nTúl sok felhasználó próbálja ezt az oldalt megtekinteni.\nKérjük, várj egy kicsit, mielőtt újra próbálkoznál az oldal megtekintésével!",
        "pool-timeout": "Letelt a zárolás feloldására szánt várakozási idő",
        "pool-queuefull": "A pool sor megtelt",
        "pool-errorunknown": "Ismeretlen hiba",
        "preview": "Előnézet",
        "showpreview": "Előnézet megtekintése",
        "showdiff": "Változtatások megtekintése",
+       "blankarticle": "<strong>Figyelem:</strong> A létrehozandó szócikk üres.\nHa ismét a \"{{int:savearticle}}\" gombra kattintasz, a szócikket tartalom nélkül fogod létrehozni.",
        "anoneditwarning": "'''Figyelem:''' Nem vagy bejelentkezve, ha szerkesztesz, az IP-címed látható lesz a laptörténetben.",
        "anonpreviewwarning": "''Nem vagy bejelentkezve. A mentéskor az IP-címed rögzítve lesz a laptörténetben.''",
        "missingsummary": "'''Emlékeztető:''' Nem adtál meg szerkesztési összefoglalót. Ha összefoglaló nélkül akarod elküldeni a szöveget, kattints újra a mentésre.",
        "parser-template-recursion-depth-warning": "A sablon rekurzív beillesztésének mélysége átlépte a határérékét ($1)",
        "language-converter-depth-warning": "A nyelvátalakító rekurzióinak száma túllépve ($1)",
        "node-count-exceeded-category": "Lapok, ahogy a csomópont szám túl nagy",
+       "node-count-exceeded-category-desc": "Azon oldalaknak a kategóriája, ahol a csomópont szám túl nagy.",
        "node-count-exceeded-warning": "Az oldal meghaladta a csomópont számot",
        "expansion-depth-exceeded-category": "Lapok, melyeken a sablonok kibontása meghaladja a megengedett szintet",
        "expansion-depth-exceeded-warning": "A lap meghaladta az engedélyezett kiterjesztési mélységet",
        "undo-norev": "A szerkesztés nem állítható vissza, mert nem létezik vagy törölve lett.",
        "undo-nochange": "A szerkesztés már vissza lett állítva.",
        "undo-summary": "Visszavontam [[Special:Contributions/$2|$2]] ([[User talk:$2|vita]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]]) szerkesztését (oldid: $1)",
+       "undo-summary-username-hidden": "A rejtett felhasználó által végzett $1 változat visszavonása",
        "cantcreateaccounttitle": "Felhasználói fiók létrehozása sikertelen",
        "cantcreateaccount-text": "Erről az IP-címről ('''$1''') nem lehet regisztrálni, mert [[User:$3|$3]] blokkolta az alábbi indokkal:\n\n:''$2''",
+       "cantcreateaccount-range-text": "A regisztrációt a(z) '''$1''' IP-címtartományban, amelybe a te IP-címed ('''$4''') is tartozik, [[User:$3|$3]] blokkolta.",
        "viewpagelogs": "A lap a rendszernaplókban",
        "nohistory": "A lap nem rendelkezik laptörténettel.",
        "currentrev": "Aktuális változat",
        "revdelete-no-file": "A megadott fájl nem létezik.",
        "revdelete-show-file-confirm": "Biztosan meg szeretnéd nézni a(z) „<nowiki>$1</nowiki>” $2, $3-i törölt változatát?",
        "revdelete-show-file-submit": "Igen",
+       "revdelete-selected-text": "[[:$2]] {{PLURAL:$1|kiválasztott változata|kiválasztott változatai}}",
        "logdelete-selected": "{{PLURAL:$1|Kiválasztott naplóesemény|Kiválasztott naplóesemények}}:",
        "revdelete-confirm": "Kérlek erősítsd meg, hogy valóban ezt szeretnéd tenni; megértetted a következményeket, és amit teszel, az összhangban van [[{{MediaWiki:Policy-url}}|az irányelvekkel]].",
        "revdelete-suppress-text": "Az elrejtés '''csak''' a következő esetekben használható:\n* Illetlen személyes információk\n*: ''otthoni cím, telefonszámok, társadalombiztosítási számok stb.''",
        "right-reupload-shared": "felülírhatja a közös megosztóhelyen lévő fájlokat helyben",
        "right-upload_by_url": "fájl feltöltése URL-cím alapján",
        "right-purge": "oldal gyorsítótárának ürítése megerősítés nélkül",
-       "right-autoconfirmed": "félig védett lapok szerkesztése",
+       "right-autoconfirmed": "Nem érint a IP-alapú szerkesztéskorlátozás",
        "right-bot": "automatikus folyamatként való kezelés",
        "right-nominornewtalk": "felhasználói lapok nem apró szerkesztésével megjelenik az új üzenet szöveg",
        "right-apihighlimits": "nagyobb mennyiségű lekérdezés az API-n keresztül",
        "right-deletedtext": "törölt változatok szövegének és a változatok közötti eltérés megtekintése",
        "right-browsearchive": "keresés a törölt lapok között",
        "right-undelete": "lap helyreállítása",
-       "right-suppressrevision": "az adminisztrátorok elől elrejtett változatok megtekintése és helyreállítása",
+       "right-suppressrevision": "Bármely felhasználó által végzett változatok megtekintése, elrejtése és felfedése",
        "right-suppressionlog": "privát naplók megtekintése",
        "right-block": "szerkesztők blokkolása",
        "right-blockemail": "szerkesztő e-mail küldési lehetőségének blokkolása",
        "recentchanges-label-plusminus": "Az oldal mérete ennyi bájttal módosult",
        "recentchanges-legend-heading": "Jelmagyarázat:",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lásd még: [[Special:NewPages|új lapok listája]])",
-       "rcnotefrom": "Alább a <b>$2</b> óta történt változtatások láthatóak (legfeljebb <b>$1</b> db).",
+       "rcnotefrom": "Alább a <strong>$3 $4</strong> óta történt változtatások láthatóak (legfeljebb <b>$1</b> db).",
        "rclistfrom": "$3 $2 után történt változtatások megtekintése",
        "rcshowhideminor": "apró szerkesztések $1",
        "rcshowhideminor-show": "megjelenítése",
        "largefileserver": "A fájl mérete meghaladja a kiszolgálón beállított maximális értéket.",
        "emptyfile": "Az általad feltöltött fájl üresnek tűnik.\nEz valószínűleg azért van, mert hibásan adtad meg a feltöltendő fájl nevét.\nEllenőrizd, hogy valóban fel akarod-e tölteni ezt a fájlt.",
        "windows-nonascii-filename": "A wiki nem támogatja a speciális karaktereket tartalmazó fájlneveket.",
-       "fileexists": "<strong>[[:$1]]</strong> névvel már létezik egy állomány.\nEllenőrizd, hogy biztosan felül akarod-e írni! [[$1|thumb]]",
+       "fileexists": "<strong>[[:$1]]</strong> névvel már létezik egy állomány. Ellenőrizd, hogy biztosan felül akarod-e írni!\n[[$1|thumb]]",
        "filepageexists": "Ehhez a fájlnévhez már létezik leírás a <strong>[[:$1]]</strong> lapon, de jelenleg nincs feltöltve ilyen nevű fájl.\nA leírás, amit ebbe az űrlapba írsz, nem fogja felülírni a már létezőt.\nHa meg szeretnéd változtatni a leírást, meg kell nyitnod szerkesztésre a lapjot.\n[[$1|thumb]]",
-       "fileexists-extension": "Már van egy hasonló nevű feltöltött fájl: [[$2|thumb]]\n* A feltöltendő fájl neve: <strong>[[:$1]]</strong>\n* A már létező fájl neve: <strong>[[:$2]]</strong>\nKérjük, hogy válassz másik nevet.",
+       "fileexists-extension": "Már van egy hasonló nevű feltöltött fájl: [[$2|thumb]]\n* A feltöltendő fájl neve: <strong>[[:$1]]</strong>\n* A már létező fájl neve: <strong>[[:$2]]</strong>\nSzeretnél egy jobban megkülönböztethető nevet használni?",
        "fileexists-thumbnail-yes": "A fájl egy kisméretű képnek ''(bélyegképnek)'' tűnik. [[$1|thumb]]\nKérjük, hogy ellenőrizd a(z) <strong>[[:$1]]</strong> fájlt.\nHa az ellenőrzött fájl ugyanakkora, mint az eredeti méretű kép, akkor nincs szükség bélyegkép feltöltésére.",
        "file-thumbnail-no": "A fájlnév a(z) <strong>$1</strong> karakterlánccal kezdődik.\nÚgy tűnik, hogy ez egy kisméretű kép ''(bélyegkép)''.\nHa rendelkezel a teljesméretű képpel, akkor töltsd fel azt, egyébként kérjük, hogy változtasd meg a fájlnevet.",
        "fileexists-forbidden": "Már létezik egy ugyanilyen nevű fájl, és nem lehet felülírni.\nHa még mindig fel szeretnéd tölteni a fájlt, menj vissza, és adj meg egy új nevet. [[File:$1|thumb|center|$1]]",
        "license-header": "Licenc",
        "nolicense": "Válassz licencet!",
        "license-nopreview": "(Előnézet nem elérhető)",
-       "upload_source_url": " (egy érvényes, nyilvánosan elérhető URL)",
-       "upload_source_file": " (egy fájl a számítógépeden)",
+       "upload_source_url": "(a kiválasztott fájlod egy nyilvánosan elérhető URL-ről)",
+       "upload_source_file": "(a számítógépeden kiválasztott fájl)",
        "listfiles-summary": "Ezen a speciális lapon látható az összes feltöltött fájl.",
        "listfiles_search_for": "Keresés fájl nevére:",
        "imgfile": "fájl",
        "statistics-mostpopular": "Legtöbbször megtekintett lapok",
        "doubleredirects": "Dupla átirányítások",
        "doubleredirectstext": "Ez a lap azokat a lapokat listázza, melyek átirányító lapokra irányítanak át.\nMinden sor tartalmaz egy hivatkozást az első, valamint a második átirányításra, valamint a második átirányítás céljára, ami általában a valódi céllap, erre kellene az első átirányításnak mutatnia.\nAz <del>áthúzott</del> sorok a lista elkészülése óta javítva lettek.",
-       "double-redirect-fixed-move": "[[$1]] átnevezve, a továbbiakban átirányításként működik a(z) [[$2]] lapra",
+       "double-redirect-fixed-move": "[[$1]] áthelyezve.\nAutomatikusan frissült, és mostantól a(z) [[$2]] lapra irányít át.",
        "double-redirect-fixed-maintenance": "[[$1]] dupla átirányítás automatikus javítása karbantartás során a következőre: [[$2]]",
        "double-redirect-fixer": "Átirányításjavító",
        "brokenredirects": "Nem létező lapra mutató átirányítások",
        "watchlist-details": "A vitalapokon kívül {{PLURAL:$1|egy|$1}} lap van a figyelőlistádon.",
        "wlheader-enotif": "Az e-mailen keresztül történő értesítés engedélyezve.",
        "wlheader-showupdated": "Azok a lapok, amelyek megváltoztak, mióta utoljára megnézted őket, '''vastagítva''' láthatók.",
-       "wlnote2": "Alább az utolsó {{PLURAL:$1| <strong> $1 </strong> óra}} változásai láthatók. A lista frissítésének ideje  $2 $3",
+       "wlnote": "Alább {{PLURAL:$1|az utolsó változás|az utolsó <strong>$1</strong> változás}} látható az elmúlt {{PLURAL:$2|órában|<strong>$2</strong> órában}}, $3 $4-kor.",
        "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",
        "watching": "Figyelés...",
        "enotif_reset": "Az összes lap megjelölése felkeresettként",
        "enotif_impersonal_salutation": "{{SITENAME}} felhasználó",
        "enotif_subject_deleted": "$2 törölte a $1 {{SITENAME}} oldalt.",
+       "enotif_subject_created": "$2 létrehozta a(z) $1 {{SITENAME}} oldalt",
        "enotif_subject_moved": "$2 átmozgatta a $1 {{SITENAME}} oldalt.",
        "enotif_subject_restored": "$2 visszaállította a $1 {{SITENAME}} oldalt.",
-       "enotif_subject_changed": "$2 megváltoztatta a $1 {{SITENAME}} oldalt.",
+       "enotif_subject_changed": "$2 megváltoztatta a(z) $1 {{SITENAME}} oldalt",
        "enotif_body_intro_deleted": "$2 törölte a $1 {{SITENAME}} oldalt $PAGEEDITDATE-kor, lásd $3.",
        "enotif_body_intro_created": "$2 létrehozta a $1 {{SITENAME}} oldalt $PAGEEDITDATE-kor, lásd az aktuális verziót itt: $3.",
        "enotif_body_intro_moved": "$2 átmozgatta a $1 {{SITENAME}} oldalt $PAGEEDITDATE-kor, lásd az aktuális verziót itt: $3.",
        "protect-locked-blocked": "Nem változtathatod meg a védelmi szinteket, amíg blokkolnak. Itt vannak a(z)\n'''$1''' lap jelenlegi beállításai:",
        "protect-locked-dblock": "A védelmi szinteket egy aktív adatbázis zárolás miatt nem változtathatod meg.\nItt vannak a(z) '''$1''' lap jelenlegi beállításai:",
        "protect-locked-access": "A fiókod számára nem engedélyezett a védelmi szintek megváltoztatása.\nItt vannak a(z) '''$1''' lap jelenlegi beállításai:",
-       "protect-cascadeon": "A lap le van védve, mert {{PLURAL:$1|tartalmazza az alábbi lap, amelyen|tartalmazzák az alábbi lapok, amelyeken}}\nbe van kapcsolva a kaszkád védelem.\nMegváltoztathatod ezen lap védelmi szintjét, de az nem lesz hatással a kaszkád védelemre.",
+       "protect-cascadeon": "A lap jelenleg le van védve, mert {{PLURAL:$1|tartalmazza az alábbi lap, amelyen|tartalmazzák az alábbi lapok, amelyeken}} be van kapcsolva a kaszkád védelem.\nEzen lap védelmi szintjének megváltoztatása nem lesz hatással a kaszkád védelemre.",
        "protect-default": "Minden szerkesztő számára engedélyezett",
        "protect-fallback": "\"$1\" engedély szükséges hozzá",
        "protect-level-autoconfirmed": "Csak automatikusan ellenőrzött szerkesztőknek engedélyezett (nem vagy frissen regisztráltaknak nem)",
        "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-error-invalid": "„$1” lap nem került importálásra, mert a név, amelyen importálásra kerülne nem érvényes ezen a wikin.",
        "import-options-wrong": "Rossz {{PLURAL:$2|opció|opciók}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "A megadott gyökér oldal címe érvénytelen.",
        "import-rootpage-nosubpage": "A(z) \"$1\" névtér nem engedi meg aloldalak használatát.",
        "importlogpage": "Importnapló",
        "importlogpagetext": "Lapok szerkesztési előzményekkel történő adminisztratív imporálása más wikikből.",
        "import-logentry-upload": "[[$1]] importálása fájlfeltöltéssel kész",
-       "import-logentry-upload-detail": "{{PLURAL:$1|egy|$1}} változat",
+       "import-logentry-upload-detail": "$1 változat importálva",
        "import-logentry-interwiki": "$1 más wikiből áthozva",
-       "import-logentry-interwiki-detail": "{{PLURAL:$1|egy|$1}} változat innen: $2",
+       "import-logentry-interwiki-detail": "$1 változat innen: $2",
        "javascripttest": "JavaScript tesztelés",
        "javascripttest-title": "$1 tesztek futtatása",
        "javascripttest-pagetext-noframework": "Ez az oldal JavaStript tesztek futtatására van fenntartva.",
index f6e3c30..d9cabd3 100644 (file)
@@ -29,6 +29,7 @@
        "tog-watchdefault": "Adder le paginas e files que io modifica a mi observatorio",
        "tog-watchmoves": "Adder le paginas e files que io renomina a mi observatorio",
        "tog-watchdeletion": "Adder le paginas e files que io dele a mi observatorio",
+       "tog-watchrollback": "Adder a mi observatorio le paginas in que io ha effectuate un revocation",
        "tog-minordefault": "Marcar omne modificationes initialmente como minor",
        "tog-previewontop": "Monstrar previsualisation ante le quadro de modification",
        "tog-previewonfirst": "Monstrar previsualisation al prime modification",
        "preview": "Previsualisation",
        "showpreview": "Monstrar previsualisation",
        "showdiff": "Detaliar modificationes",
+       "blankarticle": "<strong>Advertimento:</strong> Le pagina que tu vole crear es vacue.\nSi tu clicca de novo sur \"{{int:savearticle}}\", le pagina essera create sin contento.",
        "anoneditwarning": "'''Attention:''' Tu non ha aperite un session.\nTu adresse IP essera registrate in le historia de modificationes de iste pagina.",
        "anonpreviewwarning": "''Tu non ha aperite un session. Salveguardar registrara tu adresse IP in le historia de modificationes de iste pagina.''",
        "missingsummary": "'''Rememoration:''' Tu non ha specificate un summario del modification.\nSi tu clicca super \"{{int:savearticle}}\" de novo, le modification essera publicate sin summario.",
        "rev-deleted-event": "(entrata eliminate)",
        "rev-deleted-user-contribs": "[nomine de usator o adresse IP removite - modification celate ab contributiones]",
        "rev-deleted-text-permission": "Iste version del pagina ha essite '''delite'''.\nEs possibile que se trova detalios in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de deletiones].",
+       "rev-suppressed-text-permission": "Iste version del pagina ha essite <strong>supprimite</strong>.\nDetalios se trova in le [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de suppressiones].",
        "rev-deleted-text-unhide": "Iste version del pagina ha essite '''delite'''.\nDetalios se trova in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de deletiones].\nTu pote totevia [$1 vider iste version] si tu vole.",
        "rev-suppressed-text-unhide": "Iste version del pagina ha essite '''supprimite'''.\nDetalios se trova in le [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de suppressiones].\nTu pote totevia [$1 vider iste version] si tu vole.",
        "rev-deleted-text-view": "Iste version del pagina ha essite '''delite'''.\nTu pote vider lo;\ndetalios se trova in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de deletiones].",
        "revdelete-text-text": "Versiones delite continua a apparer in le historia del pagina, ma parte de lor contento essera inaccessibile pro le publico.",
        "revdelete-text-file": "Versiones delite de un file continua a apparer in le historia del file, ma parte de lor contento essera inaccessibile pro le publico.",
        "logdelete-text": "Eventos delite continua a apparer in le registros, ma parte de lor contento essera inaccessibile pro le publico.",
-       "revdelete-text-others": "Altere administratores in {{SITENAME}} continua a poter acceder al contento abscondite e pote restaurar lo per medio de iste mesme interfacie, a minus que additional restrictiones ha essite definite.",
+       "revdelete-text-others": "Altere administratores continua a poter acceder al contento celate e restaurar lo, a minus que additional restrictiones ha essite definite.",
        "revdelete-confirm": "Per favor confirma que tu ha le intention de facer isto, que tu comprende le consequentias, e que tu face isto in accordo con [[{{MediaWiki:Policy-url}}|le politica]].",
        "revdelete-suppress-text": "Le suppression debe '''solmente''' esser usate pro le sequente casos:\n* Information potentialmente diffamatori\n* Information personal inappropriate\n*: ''adresses de domicilio e numeros de telephono, numeros de securitate social, etc.''",
        "revdelete-legend": "Definir restrictiones de visibilitate",
        "right-deletedtext": "Vider texto delite e differentias inter versiones delite",
        "right-browsearchive": "Cercar in paginas delite",
        "right-undelete": "Restaurar un pagina",
-       "right-suppressrevision": "Revider e restaurar versiones celate ab administratores",
+       "right-suppressrevision": "Vider, celar e revelar versiones specific de paginas de qualcunque usator",
+       "right-viewsuppressed": "Vider versiones celate de qualcunque usator",
        "right-suppressionlog": "Vider registros private",
        "right-block": "Blocar altere usatores de facer modificationes",
        "right-blockemail": "Blocar un usator de inviar e-mail",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vide etiam le [[Special:NewPages|lista de nove paginas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Ecce le modificationes a partir del <strong>$3 a $4</strong> (usque a <strong>$1</strong> entratas).",
+       "rcnotefrom": "Ecce le {{PLURAL:$5|modification|modificationes}} a partir del <strong>$3 a $4</strong> (usque a <strong>$1</strong> entratas monstrate).",
        "rclistfrom": "Monstrar nove modificationes a partir de $3 $2",
        "rcshowhideminor": "$1 modificationes minor",
        "rcshowhideminor-show": "Monstrar",
        "license": "Licentia:",
        "license-header": "Licentia",
        "nolicense": "Nulle licentia seligite",
+       "licenses-edit": "Modificar optiones de licentia",
        "license-nopreview": "(Previsualisation non disponibile)",
-       "upload_source_url": " (un adresse URL valide e publicamente accessibile)",
-       "upload_source_file": " (un file in tu computator)",
+       "upload_source_url": "(le file de tu preferentia ab un adresse URL valide e publicamente accessibile)",
+       "upload_source_file": "(le file de tu preferentia ab tu computator)",
        "listfiles-delete": "deler",
        "listfiles-summary": "Iste pagina special monstra tote le files incargate.",
        "listfiles_search_for": "Cercar un nomine de media:",
        "watchlist-details": "{{PLURAL:$1|$1 pagina|$1 paginas}} in tu observatorio. Le paginas de discussion non es contate separatemente.",
        "wlheader-enotif": "Le notification via e-mail es active.",
        "wlheader-showupdated": "Le paginas que ha essite modificate post tu ultime visita se monstra in litteras '''grasse'''.",
-       "wlnote2": "Ecce le cambiamentos in le ultime {{PLURAL:$1|hora|<strong>$1</strong> horas}}, a partir del $2 a $3.",
+       "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",
        "watching": "Observation in curso...",
        "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 perque tu non ha le permission de modificar lo.",
-       "import-error-create": "Le pagina \"$1\" non es importate perque 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-error-edit": "Le pagina \"$1\" non ha essite importate perque tu non ha le permission de modificar lo.",
+       "import-error-create": "Le pagina \"$1\" non ha essite importate perque tu non ha le permission de crear lo.",
+       "import-error-interwiki": "Le pagina \"$1\" non ha essite importate perque su nomine es reservate pro un ligamine externe (interwiki).",
+       "import-error-special": "Le pagina \"$1\" non ha essite importate perque illo pertine a un spatio de nomines special que non permitte paginas.",
+       "import-error-invalid": "Le pagina \"$1\" non ha essite importate perque le nomine sub le qual illo haberea essite importate non es valide in iste wiki.",
        "import-error-unserialize": "Le version $2 del pagina \"$1\" non pote esser disserialisate. Il ha essite reportate que iste version usa le modello de contento $3 serialisate como $4.",
        "import-error-bad-location": "Le version $2 que usa le modello de contento $3 non pote esser immagazinate in \"$1\" in iste wiki, perque iste modello non es supportate in iste pagina.",
        "import-options-wrong": "Mal {{PLURAL:$2|option|optiones}}: <nowiki>$1</nowiki>",
        "importlogpage": "Registro de importationes",
        "importlogpagetext": "Importationes administrative de paginas con historia de modificationes desde altere wikis.",
        "import-logentry-upload": "importava [[$1]] per incargamento de file",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|version|versiones}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|version|versiones}} importate",
        "import-logentry-interwiki": "importava $1 transwiki",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|version|versiones}} desde $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|version|versiones}} importate desde $2",
        "javascripttest": "Test de JavaScript",
        "javascripttest-title": "Execution de $1 tests",
        "javascripttest-pagetext-noframework": "Iste pagina es reservate pro le execution de tests de JavaScript.",
        "autosumm-replace": "Contento reimplaciate per '$1'",
        "autoredircomment": "Redirection verso [[$1]]",
        "autosumm-new": "Pagina create con '$1'",
+       "autosumm-newblank": "Pagina vacue create",
        "lag-warn-normal": "Le modificationes plus nove que $1 {{PLURAL:$1|secunda|secundas}} possibilemente non se revela in iste lista.",
        "lag-warn-high": "Le servitor del base de datos es in retardo; modificationes facite durante le ultime $1 {{PLURAL:$1|secunda|secundas}} possibilemente non appare in iste lista.",
        "watchlistedit-normal-title": "Modificar observatorio",
index 7bea4ef..ce94b3f 100644 (file)
                ]
        },
        "tog-underline": "Pinag-ugisan ti silpo:",
-       "tog-hideminor": "Ilemmeng dagiti bassit a panagbaliw kadagiti naudi a sinuk-sukatan",
-       "tog-hidepatrolled": "Ilemmeng dagiti napatruliaan nga inurnos kadagiti naudi a sinuk-sukatan",
+       "tog-hideminor": "Ilemmeng dagiti bassit a inurnos iti kaudian a balbaliw",
+       "tog-hidepatrolled": "Ilemmeng dagiti napatruliaan nga inurnos iti kaudian a balbaliw",
        "tog-newpageshidepatrolled": "Ilemmeng dagiti napatruliaan a panid manipud ti baro a listaan ti panid",
-       "tog-extendwatchlist": "Ipalawa ti listaan ti bambantayan tapno maipakita amin a nasukatan, tapno saan laeng a dagiti nabiit",
-       "tog-usenewrc": "Dagiti grupo a panagbaliw babaen ti panid kadagiti kinaudi a panagbaliw ken banbantayan",
+       "tog-extendwatchlist": "Ipalawa ti listaan ti bambantayan tapno maipakita amin a nasukatan, saan laeng a ti kabiitan",
+       "tog-usenewrc": "Dagiti grupo a panagbaliw babaen ti panid ti kaudian a balbaliw ken listaan ti bambantayan",
        "tog-numberheadings": "Automatiko a pabilangan dagiti paulo",
        "tog-showtoolbar": "Ipakita ti baras ti ramit ti panag-urnos",
        "tog-editondblclick": "Urnosen dagiti panid iti mamindua a panagpindut",
-       "tog-editsectiononrightclick": "Pakabaelan ti panag-urnos ti paset babaen ti kanawan a panagpindut kadagiti titulo ti paset",
-       "tog-watchcreations": "Agnayon kadagiti panid a pinartuatko ken papeles nga inkargak idiay listaan ti bambantayak",
-       "tog-watchdefault": "Agnayon kadagiti panid ken papeles nga inurnosko idiay listaan ti bambantayak",
-       "tog-watchmoves": "Agnayon kadagiti panid ken papeles nga inyalisko idiay listaan ti bambantayak",
-       "tog-watchdeletion": "Agnayon kadagiti panid ken papeles nga inikkatko idiay listaan ti bambantayak",
-       "tog-minordefault": "Markaan amin nga inurnos a kas sigud a bassit",
+       "tog-editsectiononrightclick": "Pakabaelan ti panag-urnos iti paset babaen ti panagpindut iti kanawan kadagiti titulo ti paset",
+       "tog-watchcreations": "Agnayon kadagiti panid a pinartuatko ken papeles nga inkargak iti listaan ti bambantayak",
+       "tog-watchdefault": "Agnayon kadagiti panid ken papeles nga inurnosko iti listaan ti bambantayak",
+       "tog-watchmoves": "Agnayon kadagiti panid ken papeles nga inyalisko iti listaan ti bambantayak",
+       "tog-watchdeletion": "Agnayon kadagiti panid ken papeles nga inikkatko iti listaan ti bambantayak",
+       "tog-minordefault": "Markaan amin dagiti inurnos a kas bassit babaen ti kasisigud",
        "tog-previewontop": "Ipakita ti panagipadas sakbay ti pagurnosan a kahon",
        "tog-previewonfirst": "Ipakita ti pinadas iti umuna a panag-urnos",
-       "tog-enotifwatchlistpages": "Esuratannak no mabaliwan ti panid wenno papeles idiay listaan dagiti bambantayak",
+       "tog-enotifwatchlistpages": "Esuratannak no mabaliwan ti panid wenno papeles iti listaan dagiti bambantayak",
        "tog-enotifusertalkpages": "Esuratannak no mabaliwan ti panid ti tungtungak",
        "tog-enotifminoredits": "Esuratannak pay para kadagiti bassit a panag-urnos kadagiti panid ken papeles",
-       "tog-enotifrevealaddr": "Iparang ti pagtaengan ti esuratko kadagiti panagipakaaammo nga esurat",
+       "tog-enotifrevealaddr": "Iparang ti pagtaengan ti esuratko iti panagipakaaammo kadagiti esurat",
        "tog-shownumberswatching": "Ipakita ti bilang dagiti agbuybuya nga agar-aramat",
        "tog-oldsig": "Ti adda a pirma:",
-       "tog-fancysig": "Tratuen ti pirma a kas wikitext (nga awan ti automatiko a panagsilpo)",
-       "tog-uselivepreview": "Usaren ti agdama a panagipadas (eksperimento)",
-       "tog-forceeditsummary": "Pakaammuannak no sumrek ti blanko a pakabuklan ti panag-urnos",
+       "tog-fancysig": "Tratuen ti pirma a kas wikitext (nga awan ti automatiko a silpo)",
+       "tog-uselivepreview": "Usaren ti agdama a panagipadas (eksperimental)",
+       "tog-forceeditsummary": "Pakaammuannak no sumrek iti blanko a pakabuklan ti panag-urnos",
        "tog-watchlisthideown": "Ilemmeng dagiti inurnosko manipud ti listaan ti bambantayan",
        "tog-watchlisthidebots": "Ilemmeng dagiti inurnos ti bot manipud ti listaan ti bambantayan",
        "tog-watchlisthideminor": "Ilemmeng dagiti bassit nga inurnos manipud ti listaan ti bambantayan",
-       "tog-watchlisthideliu": "Ilemmeng dagiti inurnos ti nakasterk nga agar-aramat manipud ti listaan ti bambantayan",
-       "tog-watchlisthideanons": "Ilemmeng dagiti inurnos ti di am-ammo nga agar-aramat manipud ti listaan ti bambantayan",
+       "tog-watchlisthideliu": "Ilemmeng dagiti inurnos babaen dagiti nakastrek nga agar-aramat manipud ti listaan ti bambantayan",
+       "tog-watchlisthideanons": "Ilemmeng dagiti inurnos babaen dagiti di ammo nga agar-aramat manipud ti listaan ti bambantayan",
        "tog-watchlisthidepatrolled": "Ilemmeng dagiti napatruliaan nga inurnos manipud ti listaan ti bambantayan",
-       "tog-ccmeonemails": "Patulodandak kadagiti kopia ti esurat nga ipatulodko kadagiti sabsabali nga agar-aramat",
+       "tog-ccmeonemails": "Patulodandak kadagiti kopia ti esurat nga ipatulodko kadagiti sabali nga agar-aramat",
        "tog-diffonly": "Saan nga iparang ti linaon ti panid dita baba dagiti pagiddiatan",
        "tog-showhiddencats": "Ipakita dagiti nailemmeng a kategoria",
        "tog-norollbackdiff": "Laksiden ti paggiddiatan kalpasan ti panagaramid ti panagisubli",
-       "tog-useeditwarning": "Pakaunaannak no pumanawak iti maysa pagurnosan a panid no adda ti saan a naidulin a sinuksukatan",
-       "tog-prefershttps": "Kankanayon nga agusar ti natalged a pannakaisilpo no nakastrek",
+       "tog-useeditwarning": "Pakaunaannak no pumanawak iti maysa pagurnosan a panid nga addaan iti saan a naidulin a sinuksukatan",
+       "tog-prefershttps": "Kankanayon nga agusar ti natalged a koneksion no nakastrek",
        "underline-always": "Kanayon",
        "underline-never": "Saan uray kaanoman",
-       "underline-default": "Kasisigud a kudil wenno pagbasabasa",
-       "editfont-style": "Urnosen ti kita ti letra iti lugar:",
+       "underline-default": "Kudil wenno kasisigud a pagbasabasa",
+       "editfont-style": "Estilo ti kita ti letra ti pagurnosan a lugar:",
        "editfont-default": "Kasisigud a pagbasabasa",
        "editfont-monospace": "Monospaced a kita ti letra",
        "editfont-sansserif": "Sans-serif a kita ti letra",
        "category_header": "Pampanid iti kategoria \"$1\"",
        "subcategories": "Dagiti subkategoria",
        "category-media-header": "Dagiti midia iti kategoria \"$1\"",
-       "category-empty": "''Daytoy a kategoria ket agdama a saan nga aglaon kadagiti panid wenno midia.''",
+       "category-empty": "<em>Daytoy a kategoria ket agdama a saan nga aglaon kadagiti panid wenno midia.</em>",
        "hidden-categories": "{{PLURAL:$1|Nailemmeng a kategoria|Nailemmeng a katkategoria}}",
        "hidden-category-category": "Nailemmeng a katkategoria",
-       "category-subcat-count": "{{PLURAL:$2|Daytoy a kategoria ket adda laeng ti sumaganad a subkategoria.|Daytoy a kategoria ket addaan ti sumaganad a {{PLURAL:$1|a subkategoria|$1 a subkatkategoria}}, manipud ti $2 a dagup.}}",
+       "category-subcat-count": "{{PLURAL:$2|Daytoy a kategoria ket addaan laeng ti sumaganad a subkategoria.|Daytoy a kategoria ket addaan ti sumaganad a {{PLURAL:$1|a subkategoria|$1 a subkatkategoria}}, manipud ti $2 a dagup.}}",
        "category-subcat-count-limited": "Daytoy a kategoria ket addaan ti sumaganad a {{PLURAL:$1|a subkategoria|$1 a subkatkategoria}}.",
        "category-article-count": "{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng ti sumaganad a panid.|Ti sumaganad a {{PLURAL:$1|a panid ket|$1 a pampanid ket dagiti}} adda iti daytoy a kategoria, manipud ti $2 a dagup.}}",
        "category-article-count-limited": "Ti sumaganad a {{PLURAL:$1|panid |$1 a pampanid}} ket adda iti agdama a kategoria.",
        "category-file-count-limited": "Ti sumaganad a {{PLURAL:$1|papeles|$1 a pappapeles}} ket adda iti agdama a kategoria.",
        "listingcontinuesabbrev": "tuloy.",
        "index-category": "Naipagsurotan a pampanid",
-       "noindex-category": "Di naipasurotan a pampanid",
-       "broken-file-category": "Pampanid nga adda nadadael a silsilpo kadagiti papeles",
+       "noindex-category": "Di naipagsurotan a pampanid",
+       "broken-file-category": "Pampanid nga addaan kadagiti nadadael a silpo ti papeles",
        "about": "Maipanggep",
        "article": "Naglaon a panid",
-       "newwindow": "(aglukat iti sabali a tawa)",
+       "newwindow": "(aglukat iti baro a tawa)",
        "cancel": "Ukasen",
        "moredotdotdot": "Adu pay...",
        "morenotlisted": "Daytoy a listaan ket saan a kompleto.",
        "actions": "Dagiti aramid",
        "namespaces": "Dagiti nagan ti espasio",
        "variants": "Sab-sabali a pagsasao",
-       "navigation-heading": "Pagdaliasatan ti pagpilian",
+       "navigation-heading": "Listaan ti pagdaliasatan",
        "errorpagetitle": "Biddut",
        "returnto": "Agsubli idiay $1.",
        "tagline": "Naggapo idiay {{SITENAME}}",
        "view-foreign": "Kitaen idiay $1",
        "edit": "Urnosen",
        "edit-local": "Urnosen ti lokal a deskripsion",
-       "create": "Agaramid",
+       "create": "Agpartuat",
        "create-local": "Agnayon ti lokal a deskripsion",
        "editthispage": "Urnosen daytoy a panid",
        "create-this-page": "Partuaten daytoy a panid",
        "categorypage": "Kitaen ti panid ti kategoria",
        "viewtalkpage": "Kitaen ti pagtungtungan",
        "otherlanguages": "Kadagiti sabali a pagsasao",
-       "redirectedfrom": "(Naibaw-ing manipud idiay $1)",
+       "redirectedfrom": "(Naibaw-ing manipud iti $1)",
        "redirectpagesub": "Baw-ing a panid",
-       "lastmodifiedat": "Daytoy a panid ket naudi a nabaliwan idi $1, idi $2.",
-       "viewcount": "Naserrekan daytoy a panid {{PLURAL:$1|iti naminsan|kadagiti $1 a beses}}.",
+       "lastmodifiedat": "Daytoy a panid ket naudi a nabaliwan idi $1, $2.",
+       "viewcount": "Naserrekanen daytoy a panid {{PLURAL:$1|iti naminsan|kadagiti $1 a beses}}.",
        "protectedpage": "Nasalakniban a panid",
        "jumpto": "Lumaktaw idiay:",
        "jumptonavigation": "pagdaliasatan",
        "jumptosearch": "biruken",
-       "view-pool-error": "Pasensian, dagiti servers ket nadagsenan unay tattan.\nAdu unay dagiti agar-aramat nga agbuy-buya ti daytoy a panid.\nPangaasi nga agurayka met bassit sakbay a padasem manen ti mangserrek daytoy a panid.\n\n$1",
-       "generic-pool-error": "Pasensian, dagiti server ket agdama a nadagsenan unay.\nAdu unay dagiti agar-aramat nga agbuybuya ti daytoy a rekurso.\nPangngaasi nga agurayka bassit sakbay a padasem manen a serrekan daytoy a rekurso.",
+       "view-pool-error": "Pasensian, dagiti server ket nadagsenan unay iti agdama.\nAdu unay dagiti agar-aramat nga agpadpadas nga agbuya iti daytoy a panid.\nPangngaasi nga agurayka bassit sakbay a padasem manen a serrekan daytoy a panid.\n\n$1",
+       "generic-pool-error": "Pasensian, dagiti server ket agdama a nadagsenan iti agdama.\nAdu unay dagiti agar-aramat nga agpadpadas nga agbuya iti daytoy a rekurso.\nPangngaasi nga agurayka bassit sakbay a padasem manen a serrekan daytoy a rekurso.",
        "pool-timeout": "Madamdama agur-uray para iti kandado",
-       "pool-queuefull": "Napunnon ti nagyanan ti pagur-urayan",
-       "pool-errorunknown": "Di am-ammo a biddut",
-       "pool-servererror": "Ti serbisio ti pagbilangan ti pisina ket saan a magun-od ($1).",
+       "pool-queuefull": "Napunnon ti pagyanan ti pagur-urayan",
+       "pool-errorunknown": "Di ammo a biddut",
+       "pool-servererror": "Ti serbisio ti pagbilangan ti pagyanan ti pagur-urayan ket saan a magun-od ($1).",
        "aboutsite": "Maipanggep ti {{SITENAME}}",
        "aboutpage": "Project:Maipanggep",
        "copyright": "Ti linaon ket magun-od babaen ti $1 malaksid no adda sabali a naibaga.",
        "privacypage": "Project:Annuroten ti kinapribado",
        "badaccess": "Biddut ti pammalubos",
        "badaccess-group0": "Awan pammalubosmo a mangpataray ti kiniddawmo nga aramid.",
-       "badaccess-groups": "Ti kiniddawmo nga aramid ket limitado laeng kadagiti agar-aramat {{PLURAL:$2|iti grupo|iti maysa kadagiti grupo}}: ti $1.",
+       "badaccess-groups": "Ti kiniddawmo nga aramid ket limitado laeng kadagiti agar-aramat {{PLURAL:$2|iti grupo|iti maysa kadagiti grupo}}: $1.",
        "versionrequired": "Masapul ti bersion $1 ti MediaWiki",
        "versionrequiredtext": "Masapul ti bersion $1 ti MediaWiki tapno maaramat daytoy a panid. \nKitaen ti [[Special:Version|panid ti bersion]].",
        "ok": "Sige",
        "retrievedfrom": "Naala manipud idiay \"$1\"",
-       "youhavenewmessages": "Addaanka ti $1 ($2).",
-       "youhavenewmessagesfromusers": "Adda $1 manipud {{PLURAL:$3|ti sabali nga agar-aramat|kadagiti $3 a sabsabali nga agar-aramat}} ($2).",
-       "youhavenewmessagesmanyusers": "Adda $1 manipud kadagiti adu nga agar-aramat ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|a baro a mensahem|999=a baro a menmensahem}}",
-       "newmessagesdifflinkplural": "kinaudi a {{PLURAL:$1|sinukatan|999=sinuksukatan}}",
-       "youhavenewmessagesmulti": "Adda dagiti baro a mensahem iti $1",
+       "youhavenewmessages": "{{PLURAL:$3|Addaanka}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Addaanka}} $1 manipud {{PLURAL:$3|ti sabali nga agar-aramat|kadagiti $3 a sabali nga agar-aramat}} ($2).",
+       "youhavenewmessagesmanyusers": "Addaanka $1 manipud kadagiti adu nga agar-aramat ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|iti baro a mensahe|999=kadagiti baro a mensahe}}",
+       "newmessagesdifflinkplural": "naudi a {{PLURAL:$1|sinukatan|999=sinuksukatan}}",
+       "youhavenewmessagesmulti": "Addaanka kadagiti baro a mensahe iti $1",
        "editsection": "urnosen",
        "editold": "urnosen",
        "viewsourceold": "kitaen ti taudan",
        "hidetoc": "ilemmeng",
        "collapsible-collapse": "Rebbaen",
        "collapsible-expand": "Palawaen",
-       "thisisdeleted": "Kitaen wenno isubli ti $1?",
-       "viewdeleted": "Kitaen ti $1?",
+       "thisisdeleted": "Kitaen wenno ipulang $1?",
+       "viewdeleted": "Kitaen $1?",
        "restorelink": "{{PLURAL:$1|ti maysa a naikkat a naurnos|dagiti $1 a naikkat a naurnos}}",
        "feedlinks": "Pakan:",
        "feed-invalid": "Imbalido a kita ti suskrision a pakan.",
        "feed-unavailable": "Saan a magun-od dagiti sindikasion ti pakan",
-       "site-rss-feed": "$1 a pakan ti RSS",
-       "site-atom-feed": "$1 a pakan ti Atom",
-       "page-rss-feed": "\"$1\" a pakan ti RSS",
-       "page-atom-feed": "Pakan nga Atom ti \"$1\"",
+       "site-rss-feed": "Pakan ti RSS ti $1",
+       "site-atom-feed": "Pakan ti Atom ti $1",
+       "page-rss-feed": "Pakan ti RSS ti \"$1\"",
+       "page-atom-feed": "Pakan ti Atom ti \"$1\"",
        "red-link-title": "$1 (awan ti panid)",
        "sort-descending": "Ilasin nga agpababa",
        "sort-ascending": "Ilasin nga agpangato",
        "nstab-help": "Panid ti tulong",
        "nstab-category": "Kategoria",
        "nosuchaction": "Awan ti kasta nga aramid",
-       "nosuchactiontext": "Ti tignay a nainaganan babaen ti URL ket imbalido.\nMabalin a madi ti naimakiniliam nga URL, wenno sinurotmo ti saan nga agpayso a silpo.\nMabalin a daytoy ket kiteb ti sopwer nga us-usaren babaen ti {{SITENAME}}.",
+       "nosuchactiontext": "Ti aramid a nainaganan babaen ti URL ket imbalido.\nMabalin a madi ti naimakiniliam nga URL, wenno sinurotmo ti saan a nasayaat a silpo.\nMabalinmo pay nga ibaga ti parikut ti sopwer nga us-usaren babaen ti {{SITENAME}}.",
        "nosuchspecialpage": "Awan ti kasta nga espesial a panid",
-       "nospecialpagetext": "<strong>Nagkiddawka ti imbalido nga espesial a panid.</strong>\n\nMasarakan ti listaan dagiti umisu nga espesial a pampanid iti [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nospecialpagetext": "<strong>Nagkiddawka ti imbalido nga espesial a panid.</strong>\n\nTi listaan dagiti umisu nga espesial a pampanid ket mabirukan iti [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Biddut",
        "databaseerror": "Biddut iti database",
-       "databaseerror-text": "Adda napasamak a biddut ti usisa ti database.\nDaytoy ket mabalin a mangibagbaga ti parikut ti sopwer.",
-       "databaseerror-textcl": "Adda napasamak a biddut ti usisa ti database.",
+       "databaseerror-text": "Adda napasamak a biddut ti panagusisa ti database.\nDaytoy ket mabalin a mangibagbaga ti parikut ti sopwer.",
+       "databaseerror-textcl": "Adda napasamak a biddut ti pangusisa ti database.",
        "databaseerror-query": "Usisa: $1",
        "databaseerror-function": "Annong: $1",
        "databaseerror-error": "Biddut: $1",
-       "laggedslavemode": "'''Ballaag:''' Ti panid ket mabalin a saan nga aglaon kadagiti kinaudi a panagpabaro.",
+       "laggedslavemode": "<strong>Ballaag:</strong> Ti panid ket mabalin a saan nga aglaon kadagiti kinaudi a panagpabaro.",
        "readonly": "Narikepan ti database",
-       "enterlockreason": "Agikabil ti rason para iti pannakarikep, agraman ti maysa a karkulo no kaanonto a maluktan",
-       "readonlytext": "Ti database ket agdama a nairikpan kadagiti baro a panagikabil ken panagbaliw, mabalin a gapu dagiti kadawyan a pagsimpa, no malpas kadawyanto nga agsubli.\n\nTi administrador a nangrikep ket nangited ti daytoy a palawag: $1",
-       "missing-article": "Ti database ket saan a nakabiruk ti testo ti panid a mabirukanna koma, a napanaganan ti \"$1\" $2.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a baak a paggiddiatan wenno silpo ti pakasaritaan ti maysa panid a dati a naikkat.\n\nNo saan a kasta, mabalin a nakasarakka ti kiteb ti sopwer.\n\nPangngaasi nga ipadamagmo kadagiti [[Special:ListUsers/sysop|administrador]], isuratmo ti pakaammo dayta nga URL.",
-       "missingarticle-rev": "(binaliwan#: $1)",
-       "missingarticle-diff": "(Sabali: $1, $2)",
-       "readonly_lag": "Automatiko a narikpan ti database kabayatan a dagiti tagabu a database server ket kumamakam iti agturay",
+       "enterlockreason": "Agikabil ti rason para iti pannakarikep, mangiraman ti maysa a karkulo no kaanonto a malukatan",
+       "readonlytext": "Ti database ket agdama a narikpan kadagiti baro a panagikabil ken panagbaliw, mabalin a gapu dagiti kadawyan a pagsimpa, kalpasanna a normalto nga agsubli.\n\nTi administrador a nangrikep ket nangited iti daytoy a palawag: $1",
+       "missing-article": "Ti database ket saan a nakabiruk ti testo ti panid a mabirukanna koma, a nanaganan ti \"$1\" $2.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a baak a paggiddiatan wenno silpo ti pakasaritaan ti maysa panid a dati a naikkat.\n\nNo saan a kasta, mabalin a nakasarakka ti parikut ti sopwer.\n\nPangngaasi nga ipadamagmo kadagiti [[Special:ListUsers/sysop|administrador]], isuratmo ti pakaammo dayta nga URL.",
+       "missingarticle-rev": "(rebision#: $1)",
+       "missingarticle-diff": "(Dip: $1, $2)",
+       "readonly_lag": "Automatiko a narikpan ti database kabayatan a dagiti tagabu a server ti database ket kumamakam iti agturay",
        "internalerror": "Akin-uneg a biddut",
        "internalerror_info": "Akin-uneg a biddut: $1",
        "filecopyerror": "Saan a makopia ti papeles $1 iti $2.",
        "filerenameerror": "Saan a managanan manen ti papeles \"$1\" iti \"$2\".",
-       "filedeleteerror": "Saan a maikkat ti papeles  \"$1\".",
-       "directorycreateerror": "Saan a maaramid ti direktorio \"$1\".",
+       "filedeleteerror": "Saan a maikkat ti papeles \"$1\".",
+       "directorycreateerror": "Saan a mapartuat ti direktorio \"$1\".",
        "filenotfound": "Saan a mabirukan ti papeles \"$1\".",
-       "unexpected": "Di mapakpakadaaan a pateg: \"$1\"=\"$2\".",
+       "unexpected": "Di nanamnama a pateg: \"$1\"=\"$2\".",
        "formerror": "Biddut: saan a maited ti porma.",
        "badarticleerror": "Saan a matungpal daytoy nga aramid iti daytoy a panid.",
-       "cannotdelete": "Ti panid wenno ti papeles \"$1\" ket saan a maikkat.\nAmangan no adda sabali a nangikkaten.",
-       "cannotdelete-title": "Saan a maikkat ti panid  \"$1\"",
-       "delete-hook-aborted": "Inukas ti kawit ti panagborra.\nAwan ti intedna a palawag.",
-       "no-null-revision": "Saan a makaaramid ti awan serbina a panagbaliw para iti panid \"$1\"",
+       "cannotdelete": "Ti panid wenno papeles ti \"$1\" ket saan a maikkat.\nAmangan no adda sabali a nangikkaten.",
+       "cannotdelete-title": "Saan a maikkat ti panid ti \"$1\"",
+       "delete-hook-aborted": "Pinasardeng ti panagikkat babaen ti kawit.\nAwan ti intedna a palawag.",
+       "no-null-revision": "Saan a makapartuat ti awan serbina a panagbaliw para iti panid ti \"$1\"",
        "badtitle": "Madi a titulo",
-       "badtitletext": "Ti kiniddaw idi a titulo ti panid ket imbalido, blanko, wenno maysa a saan nga husto a naisilpo a silpo ti pagsasao wenno interwiki a titulo.\nMabalin nga aglaon ti a maysa wenno ad-adu a karakter a saan a mausar kadagiti titulo.",
+       "badtitletext": "Ti kiniddaw idi a titulo ti panid ket imbalido, blanko, wenno maysa a saan a husto a naisilpo a silpo ti pagsasao wenno interwiki a titulo.\nMabalin nga aglaon ti a maysa wenno ad-adu a karakter a saan a mausar kadagiti titulo.",
        "perfcached": "Ti sumaganad a datos ket naidulin ken mabalin a saan a napabaro. Ti kaadu {{PLURAL:$1|iti maysa a nagbanagan|dagiti $1 a nagbanagan}} ket magun-od idiay nagidulinan.",
-       "perfcachedts": "Ti sumaganad a datos ket naidulin, ken naudi a napabaro idi $1. Ti kaadu a {{PLURAL:$4|iti maysa a nagbanagan |dagiti $4 nagbanagan}} ket magun-od idiay pagidulinan.",
-       "querypage-no-updates": "Dagiti panangpabaro iti daytoy a panid ket agdama a nabaldado. \nSaan a mipasaradiwa ita dagiti datos ditoy.",
+       "perfcachedts": "Ti sumaganad a datos ket naidulin, ken naudi a napabaro idi $1. Ti kaadu {{PLURAL:$4|iti maysa a nagbanagan|kadagiti $4 nagbanagan}} ket magun-od iti pagidulinan.",
+       "querypage-no-updates": "Dagiti panangpabaro iti daytoy a panid ket agdama a nabaldado. \nSaan a mapasadiwa ita dagiti datos ditoy.",
        "viewsource": "Kitaen ti taudan",
        "viewsource-title": "Kitaen ti taudan para iti $1",
        "actionthrottled": "Napabuntog ti aramid",
        "actionthrottledtext": "Para iti pagkontra ti spam, naipatinggaka nga agramid iti daytoy a tignay iti adu unay a beses iti nasiket nga oras, ken nalabsamon daytoy a patingga.\nPangngaasi nga ipadasmo manen no madamdama.",
        "protectedpagetext": "Nasalakniban daytoy a panid tapno mapawilan ti panag-urnos wenno dagiti dadduma pay a tignay.",
        "viewsourcetext": "Mabalinmo a kitaen ken tuladen ti taudan daytoy a panid:",
-       "viewyourtext": "Mabalinmo a makita ken tuladen ti taudan dagiti '''inurnosmo''' ditoy a panid:",
-       "protectedinterface": "Daytoy a panid ket mangited ti testo nga interface para iti sopwer iti daytoy a wiki, ken nasalakniban tapno mapawilan ti panag-abuso.\nTi aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
-       "editinginterface": "'''Ballaag:''' Ur-urnosem ti maysa a panid a maar-aramat a mangted iti testo ti interface para iti sopwer.\nDagiti panagsukat iti daytoy a panid ket maarigan ti langa ti panagaramat nga interface dagiti sabali nga agar-aramat iti daytoy a wiki.\nTi aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
-       "cascadeprotected": "Daytoy a panid ket nasalakniban para iti panag-urnos ngamin ket nairaman kadagiti sumaganad {{PLURAL:$1|a panid, a|a pampanid, a}} nasalakniban nga adda ti napili nga \"agsariap\"  :\n$2",
-       "namespaceprotected": "Awan ti pammalubosmo nga agurnos kadagiti panid iti '''$1''' a nagan ti espasio.",
-       "customcssprotected": "Awan ti pammalubosmo nga agurnos iti daytoy panid ti CSS, ngamin ket adda linaonna a tagikua dagiti agar-aramat ti sabali a kasasaad.",
-       "customjsprotected": "Awan ti pammalubosmo nga agurnos iti daytoy a panid ti JavaScript, ngamin ket adda linaonna a tagikua dagiti agar-aramat ti sabali a kasasaad.",
+       "viewyourtext": "Mabalinmo a makita ken tuladen ti taudan dagiti <strong>inurnosmo</strong> iti daytoy panid:",
+       "protectedinterface": "Daytoy a panid ket mangited ti testo ti interface para iti sopwer iti daytoy a wiki, ken nasalakniban tapno mapawilan ti panag-abuso.\nTi aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
+       "editinginterface": "<strong>Ballaag:</strong> Ur-urnosem ti maysa a panid a maar-aramat a mangted iti testo ti interface para iti sopwer.\nDagiti panagsukat iti daytoy a panid ket maarigan ti langa ti interface ti agar-aramat para kadagiti sabali nga agar-aramat iti daytoy a wiki.\nTi aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
+       "cascadeprotected": "Daytoy a panid ket nasalaknibanen para iti panag-urnos ngamin ket nairaman kadagiti sumaganad {{PLURAL:$1|a panid, a|a pampanid, a}} nasalakniban iti nalukatan a pagpilian ti \"sariap\":\n$2",
+       "namespaceprotected": "Awan ti pammalubosmo nga agurnos kadagiti panid iti nagan ti espasio ti <strong>$1</strong>.",
+       "customcssprotected": "Awan ti pammalubosmo nga agurnos iti daytoy panid ti CSS, ngamin ket naglaon ti personal a pannakaisaad iti sabali agar-aramat.",
+       "customjsprotected": "Awan ti pammalubosmo nga agurnos iti daytoy a panid ti JavaScript, ngamin ket naglaon ti personal a pannakaisaad iti sabali agar-aramat.",
        "mycustomcssprotected": "Awan pammalubosmo nga agurnos iti daytoy a panid ti CSS.",
        "mycustomjsprotected": "Awan pammalubosmo nga agurnos iti daytoy a panid ti JavaScript.",
        "myprivateinfoprotected": "Awan pammalubosmo nga agurnos iti pribado a pakaammom.",
        "mypreferencesprotected": "Awan pammalubosmo nga agurnos kadagiti kakaykayatam.",
        "ns-specialprotected": "Saan a mabalin nga urnosen dagiti espesial a panid.",
-       "titleprotected": "Daytoy a titulo ket nasalakniban manipud ti panakapartuat babaen ni [[User:$1|$1]].\nTi naited a rason ket ''$2''.",
-       "filereadonlyerror": "Di nabaliwan ti papeles \"$1\" gapu ket ti repositorio ti papeles \"$2\" ket mabasa laeng a moda.\n\nTi administrador a nangserra ket nagited iti daytoy a panagilawlawag \"''$3''\".",
+       "titleprotected": "Daytoy a titulo ket nasalakniban manipud ti pannakapartuat babaen ni [[User:$1|$1]].\nTi naited a rason ket \"<em>$2</em>\".",
+       "filereadonlyerror": "Di nabaliwan ti papeles ti \"$1\" gapu ket ti repositorio ti papeles ti \"$2\" ket mabasa laeng a moda.\n\nTi administrador a nangserra ket nangited iti daytoy a panagilawlawag \"''$3''\".",
        "invalidtitle-knownnamespace": "Imbalido a titulo iti nagan ti espasio \"$2\" ken testo \"$3\"",
-       "invalidtitle-unknownnamespace": "Imbalido a titulo iti di-amammo a nagan ti espasio a numero $1 ken testo \"$2\"",
+       "invalidtitle-unknownnamespace": "Imbalido a titulo iti di ammo a nagan ti espasio a bilang $1 ken testo \"$2\"",
        "exception-nologin": "Saan a nakastrek",
        "exception-nologin-text": "Pangngaasi a [[Special:Userlogin|sumrek]] tapno maserrekam daytoy a panid wenno tignay.",
        "exception-nologin-text-manual": "Pangngaasi a $1 tapno maserrekan daytoy a panid wenno tignay.",
-       "virus-badscanner": "Madi di panaka-aramidna: Di am-ammo a birus a panagskan: \"$1\"",
-       "virus-scanfailed": "napaay ti panagskan (kodigo $1)",
-       "virus-unknownscanner": "di am-ammo a pagpaksiat ti \"birus\":",
-       "logouttext": "'''Nakaruarkan.'''\n\nLaglagipen nga adda met dagiti panid nga agtultuloy a maiparang a kasla nakastreka pay, aginggana no dalusam ti pannakaidulin ti pagbasabasam.",
+       "virus-badscanner": "Madi ti konpigurasion: Di ammo a panagsukimat ti birus: <em>$1</em>",
+       "virus-scanfailed": "napaay ti panagsukimat (kodigo $1)",
+       "virus-unknownscanner": "di ammmo nga antibirus:",
+       "logouttext": "<strong>Nakaruarkan.</strong>\n\nLaglagipen nga adda met dagiti panid nga agtultuloy a maiparang a kasla nakastrekka pay, aginggana no dalusam ti pannakaidulin ti pagbasabasam.",
        "welcomeuser": "Naragsak nga isasangbay, $1!",
-       "welcomecreation-msg": "Naaramiden ti pakabilangam.\nDimo liplipatan a sukatan dagiti kakaykayatam idiay [[Special:Preferences|{{SITENAME}} kakaykayatan]].",
+       "welcomecreation-msg": "Napartuaten ti pakabilangam.\nNo kayatmo mabaliwamon dagiti [[Special:Preferences|kakaykayatam]] ti {{SITENAME}}.",
        "yourname": "Nagan ti agar-aramat:",
        "userlogin-yourname": "Nagan ti agar-aramat",
        "userlogin-yourname-ph": "Ikabil ti naganmo nga agar-aramat",
        "yourpassword": "Kontrasenias:",
        "userlogin-yourpassword": "Kontrasenias",
        "userlogin-yourpassword-ph": "Ikabilmo ti kontrasenias",
-       "createacct-yourpassword-ph": "Agikabil ti kontrasenias",
-       "yourpasswordagain": "Uliten ti kontrasenias:",
+       "createacct-yourpassword-ph": "Ikabil ti kontrasenias",
+       "yourpasswordagain": "Imakinilya manen ti kontrasenias:",
        "createacct-yourpasswordagain": "Pasingkedan ti kontrasenias",
        "createacct-yourpasswordagain-ph": "Ikabil manen ti kontrasenias",
        "remembermypassword": "Laglagipem ti iseserrekko iti daytoy a pagbasabasa (para iti kapaut iti $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}})",
        "userlogin-remembermypassword": "Taginayonennak nga iserrek",
-       "userlogin-signwithsecure": "Usaren ti natalged a pannakaisilpo",
-       "yourdomainname": "Ti bukodmo a pagturayan:",
-       "password-change-forbidden": "Saanmo a mabalin ti mangbaliw kadagiti kontrasenias iti daytoy a wiki.",
-       "externaldberror": "Adda biddut idi ti panakapasingked ti database wenno saanmo a mabalin ti agpabaro ti bukodmo nga akin-ruar a pakabilangan.",
+       "userlogin-signwithsecure": "Usaren ti natalged a koneksion",
+       "yourdomainname": "Ti bukodmo a dominio:",
+       "password-change-forbidden": "Saanmo a mabaliwan dagiti kontrasenias iti daytoy a wiki.",
+       "externaldberror": "Mabalin nga adda biddut iti pannakapasingked ti database wenno saanka a mapalubosan a mangpabaro ti akin-ruar a pakabilangam.",
        "login": "Sumrek",
-       "nav-login-createaccount": "Sumrek / agaramid ti pakabilangan",
-       "userlogin": "Sumrek / agaramid ti pakabilangan",
+       "nav-login-createaccount": "Sumrek / agpartuat ti pakabilangan",
+       "userlogin": "Sumrek / agpartuat ti pakabilangan",
        "userloginnocreate": "Sumrek",
        "logout": "Rummuar",
        "userlogout": "Rummuar",
        "userlogin-noaccount": "Awan ti pakabilangam?",
        "userlogin-joinproject": "Tumipon iti {{SITENAME}}",
        "nologin": "Awan pakabilangam? $1.",
-       "nologinlink": "Agaramid ti pakabilangan",
-       "createaccount": "Agaramid ti pakabilangan",
-       "gotaccount": "Addaanka kadin ti pakabilangam? $1.",
+       "nologinlink": "Agpartuat ti pakabilangan",
+       "createaccount": "Agpartuat ti pakabilangan",
+       "gotaccount": "Addaanka kadin iti pakabilangan? $1.",
        "gotaccountlink": "Sumrek",
-       "userlogin-resetlink": "Nalipatam dagiti salaysay ti pagserrekmo?",
+       "userlogin-resetlink": "Nalipatam dagiti salaysay ti panagserrekmo?",
        "userlogin-resetpassword-link": "Nalipatam ti kontraseniasmo?",
        "userlogin-helplink2": "Tulong iti panagserrek",
        "userlogin-loggedin": "Nakastrekkan a kas ni {{GENDER:$1|$1}}.\nUsaren ti porma dita baba tapno sumrek a kas sabali nga agar-aramat.",
-       "userlogin-createanother": "Agaramid pay ti sabali a pakabilangan",
+       "userlogin-createanother": "Agpartuat ti sabali a pakabilangan",
        "createacct-emailrequired": "Esurat a pagtaengan",
        "createacct-emailoptional": "Esurat a pagtaengan (pagpilian)",
        "createacct-email-ph": "Ikabil ti esurat a pagtaengam",
        "createacct-another-email-ph": "Ikabil ti esurat a pagtaengan",
-       "createaccountmail": "Agusar ti pugto a temporario a kontrasenias ken ipatulod idiay naisangayan nga esurat a pagtaengan",
+       "createaccountmail": "Agusar ti pugto a temporario a kontrasenias ken ipatulod iti naisangayan nga esurat a pagtaengan",
        "createacct-realname": "Pudno a nagan (pagpilian)",
        "createaccountreason": "Rason:",
        "createacct-reason": "Rason",
        "createacct-reason-ph": "Apay nga agparpartuatka manen ti sabali a pakabilangan",
-       "createacct-captcha": "Panagkita ti seguridad",
+       "createacct-captcha": "Panagpatalged ti seguridad",
        "createacct-imgcaptcha-ph": "Ikabil ti testo a makitam dita ngato",
        "createacct-submit": "Partuatem ti pakabilangam",
-       "createacct-another-submit": "Agaramid pay ti sabali a pakabilangan",
+       "createacct-another-submit": "Agpartuat ti sabali a pakabilangan",
        "createacct-benefit-heading": "Ti {{SITENAME}} ket inar-aramid babaen ti tattao a kasla kenka.",
        "createacct-benefit-body1": "{{PLURAL:$1|nga inurnos|nga inur-urnos}}",
        "createacct-benefit-body2": "{{PLURAL:$1|a panid|a pampanid}}",
        "createacct-benefit-body3": "nga agdama a {{PLURAL:$1|nagparawad|nagparparawad}}",
        "badretype": "Saan nga agpada dagiti inkabilmo a kontrasenias.",
-       "userexists": "Maus-usaren ti inkabilmo a nagan.\nPangngaasi nga agpilika ti sabali a nagan.",
+       "userexists": "Maus-usaren ti inkabilmo a nagan.\nPangngaasi nga agpilika iti sabali a nagan.",
        "loginerror": "Biddut ti iseserrek",
        "createacct-error": "Biddut ti panagpartuat ti pakabilangan",
-       "createaccounterror": "Saan a makaaramid ti pakabilangan: $1",
-       "nocookiesnew": "Naaramid ti pakabilangan ti agar-aramat, ngem saanka a nakastrek.\nTi {{SITENAME}} ket agus-usar kadagiti \"galietas\" tapno maiserrek dagiti agar-aramat.\nNabaldado dagiti galietam.\nPangngaasi a pakabaelam ida, ken sumrekka nga agusar ti baro a naganmo ken kontrasenias.",
+       "createaccounterror": "Saan a makapartuat ti pakabilangan: $1",
+       "nocookiesnew": "Napartuaten ti pakabilangan ti agar-aramat, ngem saanka a nakastrek.\nTi {{SITENAME}} ket agus-usar kadagiti galietas tapno maiserrek dagiti agar-aramat.\nNabaldado dagiti galietam.\nPangngaasi a pakabaelam ida, ken sumrekka nga agusar iti baro a naganmo ken kontrasenias.",
        "nocookieslogin": "Ti {{SITENAME}} ket agus-usar kadagiti galietas tapno maiserrek dagiti agar-aramat.\nNabaldado dagiti galietam.\nPangngaasi a pakabaelam ida ken padasem manen ti sumrek.",
-       "nocookiesfornew": "Ti pakabilangan ti agar-aramat ket saan a naaramid, saanmi a mapasingkedan ti taudanna.\nSiguraduem a napakabaelan dagita galietam, ikargam manen daytoy a panid ken padasem manen.",
-       "noname": "Saanmo a nainaganan ti agpayso a nagan ti agar-aramat.",
+       "nocookiesfornew": "Ti pakabilangan ti agar-aramat ket saan a napartuat, saanmi a mapasingkedan ti taudanna.\nSiguraduem a napakabaelan dagita galietam, ikarga manen daytoy a panid ken padasen manen.",
+       "noname": "Saanmo a nainaganan ti umisu a nagan ti agar-aramat.",
        "loginsuccesstitle": "Balligi ti panagserrek",
-       "loginsuccess": "'''Nakastrekkan iti {{SITENAME}} a kas ni \"$1\".'''",
-       "nosuchuser": "Awan ti agar-aramat nga agnagan iti \"$1\". \n\nDagiti nagan ti agar-aramat ket sensitibo ti kadakkel ti letra.\n\nKitaem ti panangiletra, wenno [[Special:UserLogin/signup|agaramidka ti baro a pakabilangan]].",
+       "loginsuccess": "<strong>Nakastrekkan iti {{SITENAME}} a kas ni \"$1\".</strong>",
+       "nosuchuser": "Awan ti agar-aramat nga agnagan ti \"$1\". \n\nDagiti nagan ti agar-aramat ket sensitibo ti kadakkel ti letra.\n\nKitaem ti panangiletram, wenno [[Special:UserLogin/signup|agpartuat ti baro a pakabilangan]].",
        "nosuchusershort": "Awan ti agar-aramat nga agnagan ti \"$1\".\nKitaem ti panangiletram.",
-       "nouserspecified": "Nasken nga agikabilka ti nagan ti agar-aramat.",
+       "nouserspecified": "Nasken nga inaganam ti nagan ti agar-aramat.",
        "login-userblocked": "Naserraan daytoy nga agar-aramat. Saan a mapalubosan ti sumrek.",
-       "wrongpassword": "Saan a husto ti naikabil a kontrasenias. \nPangngaasi a padasem manen.",
-       "wrongpasswordempty": "Blanko ti naikabil a kontrasenias. \nPangngaasi a padasem manen.",
+       "wrongpassword": "Saan a husto ti naikabil a kontrasenias. \nPangngaasi a padasen manen.",
+       "wrongpasswordempty": "Blanko ti naikabil a kontrasenias. \nPangngaasi a padasen manen.",
        "passwordtooshort": "Dagiti kontrasenias ket nasken a saan a basbasit ngem {{PLURAL:$1|1 a karakter|$1 a karkarakter}}.",
        "password-name-match": "Nasken a ti kontrasenias ket maigiddiat manipud ti naganmo.",
-       "password-login-forbidden": "Ti panag-usar ti daytoy a nagan ti agar-aramat ken kontrasenias ket naipariten.",
-       "mailmypassword": "Iyasentar manen ti kontrasenias",
+       "password-login-forbidden": "Ti panag-usar iti daytoy a nagan ti agar-aramat ken kontrasenias ket naipariten.",
+       "mailmypassword": "Isaad manen ti kontrasenias",
        "passwordremindertitle": "Baro a temporario a kontrasenias para iti {{SITENAME}}",
-       "passwordremindertext": "Adda maysa a tao (mabalin a sika met laeng, manipud iti IP a pagtaengan a $1) ket nagkiddaw ti baro\na kontrasenias para iti {{SITENAME}} ($4). Ti saan nga agnayon a kontrasenias ti agususar\n\"$2\" ket naaramiden ken naidisso iti \"$3\". No kastan ti kinayatmo,\nmasapul a sumrek ka ta agpili ka ti baro a kontrasenias.\nTi temporario a bukodmo a kontrasenias ket agpaso  {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\n\nNo sabali ti nagkiddaw, wenno no malagipmo pay ti kontrasenias mo ket dimon kayat a suktan daytoy, mabalin a dimo lattan ikaskaso daytoy a mensahe ket itultuloymo latta nga usaren ti daan a kontrasenias.",
-       "noemail": "Awan ti esurat a pagtaengan a nairehistro para  iti agar-aramat a ni \"$1\".",
+       "passwordremindertext": "Adda maysa a tao (mabalin a sika met laeng, manipud iti IP a pagtaengan a $1) ket nagkiddaw ti baro a kontrasenias para iti {{SITENAME}} ($4). Ti temporario a kontrasenias para kenni agar-aramat \"$2\" ket napartuaten ken naisaad iti \"$3\". No kastan ti kinayatmo, nasken itan a sumrekka ken agpili ti baro a kontrasenias.\nTi temporario a kontraseniasmo ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\n\nNo sabali ti nagkiddaw, wenno nalagipmon ti kontraseniasmo,\nken dimo kayaten a sukatan daytoy, mabalinmo a di ikaskaso daytoy a mensahe ken agtuloy nga usaren ti daan a kontraseniasmo.",
+       "noemail": "Awan ti esurat a pagtaengan a nairehistro para iti agar-aramat a ni \"$1\".",
        "noemailcreate": "Nasken a mangitedka ti pudno nga esurat a pagtaengan.",
        "passwordsent": "Naipatuloden ti baro a kontrasenias iti esurat a pagtaengan a nairehistro kenni \"$1\".\nPangngaasi a sumrekka manen kalpasan ti pannakaawatmo.",
-       "blocked-mailpassword": "Ti IP a pagtaengam ket naserraan manipud ti panag-urnos, isunga saan a mapalubosan nga agusar ti annong ti panagipulang ti kontrasenias tapno mapawilan ti panag-abuso.",
+       "blocked-mailpassword": "Ti IP a pagtaengam ket naserraan manipud ti panag-urnos, ken isu a saan a mapalubosan nga agusar ti annong ti panagipulang ti kontrasenias tapno mapawilan ti panag-abuso.",
        "eauthentsent": "Naipatuloden ti pammatalged nga esurat iti naikeddeng nga esurat a pagtaengan.\nSakbay a maipatulod ti aniaman nga esurat iti pakabilangan, masapul a surotem dagiti maibagbaga iti esurat, tapno mapatalgedan ti pakabilangan ket agpayso a kukuam.",
-       "throttled-mailpassword": "Ti panangiyasentar manen ti kontrasenias ket naipatuloden, iti kaunegan ti napalabas a {{PLURAL:$1|nga oras|$1 nga or-oras}}.\nTapno maipawilan ti panag-abuso, maysa laeng a panangiyasentar manen ti kontrasenias ti maipatulod iti kada {{PLURAL:$1|nga oras|$1 nga or-oras}}.",
+       "throttled-mailpassword": "Ti panangisaad manen ti kontrasenias ket naipatuloden, iti kaunegan ti napalabas a {{PLURAL:$1|nga oras|$1 nga or-oras}}.\nTapno maipawilan ti panag-abuso, maysa laeng a panangisaad manen ti kontrasenias ti maipatulod iti kada {{PLURAL:$1|nga oras|$1 nga or-oras}}.",
        "mailerror": "Biddut iti panangipatulod ti surat: $1",
-       "acct_creation_throttle_hit": "Dagiti sumarungkar ti daytoy a wiki nga agus-usar ti IP a pagtaengan ket nakaaramid {{PLURAL:$1|iti 1 a pakabilangan|kadagiti $1 a pakabilangan}} iti nasakbayan nga aldaw, nga isu laeng ti kaadu a maipalubos iti daytoy a paset ti panawen.\nA kas ti nagbanagan, dagiti agsarsarungkar nga agus-usar ti IP a pagtaengan ket agdama a saanda a mabalin a makaaramid kadagiti pakabilangan.",
-       "emailauthenticated": "Ti esurat a pagtaengam ket napatalgedan idi $2 idi $3.",
+       "acct_creation_throttle_hit": "Dagiti sumarungkar iti daytoy a wiki nga agus-usar ti IP a pagtaengan ket nakapartuat {{PLURAL:$1|iti 1 a pakabilangan|kadagiti $1 a pakabilangan}} iti nasakbayan nga aldaw, nga isu laeng ti kaadu a maipalubos iti daytoy a paset ti panawen.\nA kas ti nagbanagan, dagiti agsarsarungkar nga agus-usar ti IP a pagtaengan ket agdama a saanda a mabalin a makapartuat kadagiti pakabilangan.",
+       "emailauthenticated": "Ti esurat a pagtaengam ket napatalgedan idi $2, $3.",
        "emailnotauthenticated": "Saan pay a napatalgedan ti esuratmo a pagtaengan.\nAwanto ti esurat a maipatulod para kadagiti sumaganad a langa.",
        "noemailprefs": "Ipanaganan ti esurat a pagtaengan tapno agbalin dagitoy a langa.",
        "emailconfirmlink": "Pasingkedam ti esurat a pagtaengam",
        "invalidemailaddress": "Ti esurat a pagtaengan ket saan a maawat ngamin ket kasla adda ti saan a napudno a porma.\nPangngaasi nga agikabil ti nasayaat a porma ti pagtaengan wenno ikkaten amin a naikabil.",
        "cannotchangeemail": "Dagiti pakabilangan nga esurat a pagtaengan ket saan a mabaliwan iti daytoy a wiki.",
-       "emaildisabled": "Daytoy a pagsaaadan ket saan a makaipatulod kadagiti esurat.",
-       "accountcreated": "Naaramiden ti pakabilangan",
+       "emaildisabled": "Daytoy a sitio ket saan a makaipatulod kadagiti esurat.",
+       "accountcreated": "Napartuaten ti pakabilangan",
        "accountcreatedtext": "Ti pakabilangan ti agar-aramat para kenni [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|tungtungan]]) ket napartuaten.",
-       "createaccount-title": "Panagaramid ti pakabilangan para iti {{SITENAME}}",
-       "createaccount-text": "Adda nagaramid ti pakabilangan para iti esurat a pagtaengam idiay {{SITENAME}} ($4) nga agnagan  ti \"$2\", iti kontrasenias a \"$3\".\nNasken a sumrekka ken sukatam ti kontraseniasmo tattan.\n\nMabalinmo ti saan a mangikaskaso ti daytoy a mensahe, no biddut a naaramid daytoy a pakabilangan.",
-       "login-throttled": "Adu unay ti panagpadasmo a sumrek.\nPangngaasi nga agurayka ti $1 sakbay a padasem manen.",
+       "createaccount-title": "Panagpartuat ti pakabilangan para iti {{SITENAME}}",
+       "createaccount-text": "Adda nagpartuat ti pakabilangan para iti esurat a pagtaengam iti {{SITENAME}} ($4) nga agnagan  ti \"$2\", iti kontrasenias a \"$3\".\nNasken a sumrekka ken sukatam ti kontraseniasmo tattan.\n\nMabalinmo ti saan a mangikaskaso iti daytoy a mensahe, no biddut a naaramid daytoy a pakabilangan.",
+       "login-throttled": "Adu unay ti panagpadasmo a sumrek.\nPangngaasi nga agurayka ti $1 sakbay a padasen manen.",
        "login-abort-generic": "Napaay ti panagserrekmo - Napasardeng",
        "loginlanguagelabel": "Pagsasao: $1",
        "suspicious-userlogout": "Naiparit ti panagkiddawmo a rummuar ngamin ket kasla inpatulod ti nadadael a panagbasabasa wenno pannakaidulin a pannakbagi.",
        "createacct-another-realname-tip": "Saan a nasken ti pudno a nagan.\nNo kayatmo nga ited, mausarto daytoy para iti panangited ti pammadayaw para kadagiti obrada.",
        "pt-login": "Sumrek",
        "pt-login-button": "Sumrek",
-       "pt-createaccount": "Agaramid ti pakabilangan",
+       "pt-createaccount": "Agpartuat ti pakabilangan",
        "pt-userlogout": "Rummuar",
-       "php-mail-error-unknown": "Di ammo a biddut ti surat ti PHP() nga annong.",
-       "user-mail-no-addy": "Pinadas nga inpatulod ti esurat nga awan ti esurat a pagtaengan.",
-       "user-mail-no-body": "Pinadas nga inpatulod ti esurat nga awan linaonna wenno ababa laeng a bagi.",
+       "php-mail-error-unknown": "Di ammo a biddut iti surat ti annong ti PHP().",
+       "user-mail-no-addy": "Pinadas nga inpatulod ti esurat nga awan ti maysa nga esurat a pagtaengan.",
+       "user-mail-no-body": "Pinadas nga inpatulod ti esurat nga awan ti maysa a linaonna wenno ababa unay a bagi.",
        "changepassword": "Baliwan ti kontrasenias",
-       "resetpass_announce": "Tapno malpas ti panagserrek, nasken a mangiyasentarka ti baro a kontrasenias.",
+       "resetpass_announce": "Tapno malpas ti panagserrek, nasken a mangisaadka ti baro a kontrasenias.",
        "resetpass_header": "Sukatan ti kontrasenias ti pakabilangan",
        "oldpassword": "Daan a kontrasenias:",
        "newpassword": "Baro a kontrasenias:",
        "retypenew": "Imakinilya manen ti baro a kontrasenias:",
-       "resetpass_submit": "Ikabil ti kontrasenias ken sumrek",
+       "resetpass_submit": "Isaad ti kontrasenias ken sumrek",
        "changepassword-success": "Balligi a nasukatan ti kontraseniasmo!",
        "changepassword-throttled": "Nakaaramidka kadagiti adu unay a nabiit a panangipadas ti panagserrek.\nPangngaasi nga aguray ti $1 sakbay a padasen manen.",
        "resetpass_forbidden": "Saan a masukatan dagiti kontrasenias",
        "resetpass-submit-loggedin": "Sukatan ti kontrasenias",
        "resetpass-submit-cancel": "Ukasen",
        "resetpass-wrong-oldpass": "Imbalido ti temporario wenno agdama a kontrasenias.\nMabalin a nagballigi ti panagsukatmo ti kontrasenias wenno nagkiddaw ti baro a temporario a kontrasenias.",
-       "resetpass-recycled": "Pangngaasi nga iyasentar manen ti kontrasenias iti sabali ngem ti agdama a kontraseniasmo.",
-       "resetpass-temp-emailed": "Simrekka a nagusar ti temporario a naipatulod a kodigo.\nTapno malpas ti panagserrek, nasken a mangiyasentarka ti baro a kontrasenias ditoy:",
+       "resetpass-recycled": "Pangngaasi nga isaad manen ti kontrasenias iti sabali ngem ti agdama a kontraseniasmo.",
+       "resetpass-temp-emailed": "Simrekka a nagusar ti temporario a naipatulod a kodigo.\nTapno malpas ti panagserrek, nasken a mangisaadka ti baro a kontrasenias ditoy:",
        "resetpass-temp-password": "Temporario a kontrasenias:",
        "resetpass-abort-generic": "Ti panagsukat ti kontrasenias ket pinasardeng babaen ti maysa a pagpaatiddog.",
-       "resetpass-expired": "Nagpason ti kontraseniasmo. Pangngaasi a mangiyasentar ti baro a kontrasenias tapno makastrek.",
-       "resetpass-expired-soft": "Nagpason ti kontraseniasmo, ken nasken a maiyasentar manen. Pangngaasi nga agpili tattan ti baro a kontrasenias, wenno pinduten ti \"{{int:resetpass-submit-cancel}}\"  tapno maiyasentarto intono madamdama.",
-       "resetpass-validity-soft": "Saan nga umiso ti kontraseniasmo: $1\n\nAgpilika tattan ti baro a kontrasenias, wenno pinduten ti \"{{int:resetpass-submit-cancel}}\" tapno isaad intono madamdama.",
-       "passwordreset": "Iyasentar manen ti kontrasenias",
-       "passwordreset-text-one": "Lippasem daytoy a porma tapno maiyasentar manen ti bukodmo a kontrasenias.",
+       "resetpass-expired": "Nagpason ti kontraseniasmo. Pangngaasi a mangisaad ti baro a kontrasenias tapno makastrek.",
+       "resetpass-expired-soft": "Nagpason ti kontraseniasmo, ken nasken a maisaad manen. Pangngaasi nga agpili tattan ti baro a kontrasenias, wenno pinduten ti \"{{int:resetpass-submit-cancel}}\"  tapno maisaad intono madamdama.",
+       "resetpass-validity-soft": "Saan nga umiso ti kontraseniasmo: $1\n\nAgpilika tattan ti baro a kontrasenias, wenno pinduten ti \"{{int:resetpass-submit-cancel}}\" tapno maisaad intono madamdama.",
+       "passwordreset": "Isaad manen ti kontrasenias",
+       "passwordreset-text-one": "Kompletuen daytoy a porma tapno makaawat iti temporario a kontrasenias babaen ti esurat.",
        "passwordreset-text-many": "{{PLURAL:$1|Agpunno ti maysa kadagiti pagikabilan tapno makaawat ti temporario a kontrasenias babaen ti esurat.}}",
-       "passwordreset-legend": "Iyasentar manen ti kontrasenias",
-       "passwordreset-disabled": "Nabaldado dagiti panangiyasentar manen ti kontrasenias iti daytoy a wiki.",
+       "passwordreset-legend": "Isaad manen ti kontrasenias",
+       "passwordreset-disabled": "Nabaldado dagiti panangisaad manen ti kontrasenias iti daytoy a wiki.",
        "passwordreset-emaildisabled": "Dagiti langa ti esurat ket nabaldado iti daytoy a wiki.",
        "passwordreset-username": "Nagan ti agar-aramat:",
-       "passwordreset-domain": "Pagturayan:",
-       "passwordreset-capture": "Kitaen ti nagbanagan ti esurat?",
-       "passwordreset-capture-help": "No markaam daytoy a kahon, ti esurat (nga adda ti temporario a kontrasenias) ket maipakita kenka ken maipatulod iti agar-aramat.",
+       "passwordreset-domain": "Dominio:",
+       "passwordreset-capture": "Kitaen ti nagbanagan nga esurat?",
+       "passwordreset-capture-help": "No markaam daytoy a kahon, ti esurat (nga adda ti temporario a kontrasenias) ket maipakitanto kenka ken maipatulodto iti agar-aramat.",
        "passwordreset-email": "Esurat a pagtaengan:",
-       "passwordreset-emailtitle": "Salaysay ti pakabilangan iti {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Adda (baka sika, ti naggapuan ti IP a pagtaengan $1) a nagkiddaw ti maysa a panangiyasentar manen ti kontrasenias para iti {{SITNAME}} ($4) . {{PLURAL:$3|Ti |Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nnakairaman iti daytoy nga esurat a pagtaengan:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ket saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloyka nga agusar ti daan a kontrasenias.",
-       "passwordreset-emailtext-user": "Daytoy nga agar-aramat $1 iti {{SITENAME}} ket nagkiddaw ti maysa a panangiyasentar manen ti bukod a kontrasenias para iti {{SITENAME}}\n($4) . {{PLURAL:$3|Ti|Dagiti}} sumaganad a pakabilanagan ti agar-aramat ket\nnakairaman iti daytoy nga esurat a pagtaengan:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpili ka ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ket saan mo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloykan nga agusar ti daan a kontraseniasmo.",
+       "passwordreset-emailtitle": "Dagiti salaysay ti pakabilangan iti {{SITENAME}}",
+       "passwordreset-emailtext-ip": "Adda (baka sika, ti naggapuan ti IP a pagtaengan $1) a nagkiddaw ti maysa a panangisaad manen ti kontrasenias para iti {{SITNAME}} ($4) . {{PLURAL:$3|Ti |Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga esurat a pagtaengan:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ket saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloyka nga agusar ti daan a kontrasenias.",
+       "passwordreset-emailtext-user": "Daytoy nga agar-aramat $1 iti {{SITENAME}} ket nagkiddaw ti maysa a panangisaad manen ti bukod a kontrasenias para iti {{SITENAME}}\n($4) . {{PLURAL:$3|Ti|Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga esurat a pagtaengan:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ken saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloykan nga agusar ti daan a kontraseniasmo.",
        "passwordreset-emailelement": "Nagan ti agar-aramat: $1\nTemporario a kontrasenias: $2",
-       "passwordreset-emailsent": "Ti maysa nga esurat ti panangiyasentar manen ti kontrasenias ket naipatuloden.",
-       "passwordreset-emailsent-capture": "Ti maysa nga esurat ti panangiyasentar manen ti kontrasenias ket naipatuloden, a napaikita dita baba.",
-       "passwordreset-emailerror-capture": "Naaramid ti maysa nga esurat a panangyasentar manen ti kontrasenias, a napaikita dita baba, ngem ti panangitulod kenni {{GENDER:$2|agar-aramat}} ket napaay: $1",
+       "passwordreset-emailsent": "Ti maysa nga esurat ti panangisaad manen ti kontrasenias ket naipatuloden.",
+       "passwordreset-emailsent-capture": "Ti maysa nga esurat ti panangisaad manen ti kontrasenias ket naipatuloden, a naipakita dita baba.",
+       "passwordreset-emailerror-capture": "Naaramid ti maysa nga esurat a panangisaad manen ti kontrasenias, a napaikita dita baba, ngem ti panangitulod kenni {{GENDER:$2|agar-aramat}} ket napaay: $1",
        "changeemail": "Sukatan ti esurat a pagtaengan",
        "changeemail-header": "Sukatan ti esurat a pagtaengan ti pakabilangan",
-       "changeemail-text": "Lippasem daytoy a porma ti panagsukat ti esurat a pagtaengam. Nasken nga ikabilmo ti kontrasenias tapno mapasingkedan daytoy a panagsukat.",
+       "changeemail-text": "Kompletuen daytoy a porma ti panagsukat ti esurat a pagtaengam. Nasken nga ikabilmo ti kontrasenias tapno mapasingkedan daytoy a panagsukat.",
        "changeemail-no-info": "Masapul a nakastrekka tapno dagus a makapan iti ditoy a panid.",
        "changeemail-oldemail": "Agdama nga esurat a pagtaengan:",
        "changeemail-newemail": "Baro nga esurat a pagtaengan:",
        "changeemail-submit": "Sukatan ti esurat",
        "changeemail-cancel": "Ukasen",
        "changeemail-throttled": "Adu unay ti panagpadasmo a sumrek.\nPangngaasi nga aguray ti $1 sakbay a padasen manen.",
-       "resettokens": "Iyasentar manen dagiti tandaan",
-       "resettokens-text": "Mabalinmo nga iyasentar dagiti tandaan a mangpalubos ti panagserrek ti naisangayan a pribado datos a mainaig ti pakabilangam ditoy.\n\nAramidem daytoy no aksidente nga inbingaymo dagitoy iti sabali wenno ti pakabilangam ket nakomprimiso.",
-       "resettokens-no-tokens": "Awan dagiti maiyasentar manen a tandaan.",
-       "resettokens-legend": "Iyasentar manen dagiti tandaan",
+       "resettokens": "Isaad manen dagiti tandaan",
+       "resettokens-text": "Mabalinmo nga isaad manen dagiti tandaan a mangpalubos ti panagserrek ti naisangayan a pribado datos a mainaig ti pakabilangam ditoy.\n\nAramidem daytoy no aksidente nga inbingaymo dagitoy iti sabali wenno ti pakabilangam ket nakomprimiso.",
+       "resettokens-no-tokens": "Awan dagiti maisaad manen a tandaan.",
+       "resettokens-legend": "Isaad manen dagiti tandaan",
        "resettokens-tokens": "Dagiti tandaan:",
        "resettokens-token-label": "$1 (agdama a pateg: $2)",
-       "resettokens-watchlist-token": "Tandaan para iti pakan ti web (Atom/RSS) kadagiti [[Special:Watchlist|panagbalbaliw ti pampanid idiay bambantayam]]",
-       "resettokens-done": "Naiyasentar manen dagiti tandaan.",
-       "resettokens-resetbutton": "Iyasentar manen  dagiti napili a tandaan",
+       "resettokens-watchlist-token": "Tandaan para iti pakan ti web (Atom/RSS) kadagiti [[Special:Watchlist|panagbalbaliw ti pampanid iti listaan ti bambantayam]]",
+       "resettokens-done": "Naisaad manen dagiti tandaan.",
+       "resettokens-resetbutton": "Isaad manen  dagiti napili a tandaan",
        "bold_sample": "Napuskol a testo",
        "bold_tip": "Napuskol a testo",
-       "italic_sample": "Nakairig a testo",
-       "italic_tip": "Nakairig a testo",
+       "italic_sample": "Italiko a testo",
+       "italic_tip": "Italiko a testo",
        "link_sample": "Titulo ti silpo",
        "link_tip": "Akin-uneg a silpo",
        "extlink_sample": "http://www.example.com titulo ti silpo",
-       "extlink_tip": "Akin-ruar a silpo (laglagipen ti http:// a pasaruno)",
+       "extlink_tip": "Akinruar a silpo (laglagipen ti http:// a pasakbay)",
        "headline_sample": "Testo ti paulo",
        "headline_tip": "Maika-2 nga agasmang ti paulo",
        "nowiki_sample": "Isengngat ti saan a naporma a testo ditoy",
-       "nowiki_tip": "Saan nga ikaskaso ti panakaporma ti wiki",
+       "nowiki_tip": "Saan nga ikaskaso ti pannakaporma ti wiki",
        "image_tip": "Naisengngat a papeles",
        "media_tip": "Silpo ti papeles",
-       "sig_tip": "Ti pirmam nga adda ti oras ken petsa",
-       "hr_tip": "Pakuros a linia (manmano laeng nga aramaten)",
+       "sig_tip": "Ti pirmam nga addaan iti oras ken petsa",
+       "hr_tip": "Horisontal a linia (manmano laeng nga aramaten)",
        "summary": "Pakabuklan:",
        "subject": "Suheto/paulo:",
        "minoredit": "Daytoy ket bassit a panag-urnos",
        "preview": "Ipadas",
        "showpreview": "Ipakita ti ipadas",
        "showdiff": "Ipakita dagiti sinukatan",
-       "anoneditwarning": "'''Ballaag:''' Saanka a nakastrek.\nMairehistro ti IP a pagtaengam iti pakasaritaan ti panagurnos iti daytoy a panid.",
-       "anonpreviewwarning": "\" Saanka a nakastrek. Ti panagidulin ket agirehistro ti IP a pagtaengam kadagitoy a  pakasaritaan ti panagurnos iti daytoy a panid.\"",
-       "missingsummary": "'''Palagip:''' Saanka a nakaited iti pakabuklan ti panag-urnos.\nNo ipindutmo ti manen ti \"{{int:savearticle}}\", maidulin ti inurnosmo nga awan ti pakabuklanna.",
+       "blankarticle": "<strong>Ballaag:</strong> Ti panid a parpatuatem ket blanko.\nNo pindutem manen ti \"{{int:savearticle}}\", ti panid ket mapartuatto nga awan ti aniaman a linaon.",
+       "anoneditwarning": "<strong>Ballaag:</strong> Saanka a nakastrek.\nMairehistro ti IP a pagtaengam iti pakasaritaan ti panag-urnos iti daytoy a panid.",
+       "anonpreviewwarning": "<em>Saanka a nakastrek. Ti panagidulin ket agirehistro ti IP a pagtaengam kadagitoy a pakasaritaan ti panag-urnos iti daytoy a panid.</em>",
+       "missingsummary": "<strong>Palagip:</strong> Saanka a nakaited iti pakabuklan ti panag-urnos.\nNo pindutem manen ti \"{{int:savearticle}}\", maidulin ti inurnosmo nga awan ti pakabuklanna.",
        "missingcommenttext": "Pangngaasi nga agikabil ti komentario dita baba.",
-       "missingcommentheader": "'''Palagip:''' Saanka a nakaited  iti suheto/paulo para iti daytoy a komentario.\nNo ipindutmo manen ti \"{{int:savearticle}}\", maidulin ti inurnosmo nga awan ti pakabuklanna.",
-       "summary-preview": "Naipadas a  pakabuklan:",
+       "missingcommentheader": "<strong>Palagip:</strong> Saanka a nakaited  iti suheto/paulo para iti daytoy a komentario.\nNo pindutem manen ti \"{{int:savearticle}}\", maidulin ti inurnosmo nga awan ti pakabuklanna.",
+       "summary-preview": "Naipadas a pakabuklan:",
        "subject-preview": "Suheto/naipadas a paulo:",
        "blockedtitle": "Naseraan ti agar-aramat",
-       "blockedtext": "'''Naseraan ti naganmo nga agar-aramat wenno ti IP a pagtaengam.'''\n\nNi $1 ti nangserra kenka. \nTi rason ket ''$2''.\n\n* Rugi ti panangserra: $8\n* Panagpaso ti panangserra: $6\n* Ti koma serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panag-serra.\nDimo mabalin nga aramaten ti ramit nga esuratan daytoy nga agar-aramat malaksid no adda napudno nga esurat a pagtaengan a naipan iti [[Special:Preferences|pakabilangan ti kaykayatmo]] ken no saanka a naparitan nga agaramat iti daytoy.\nTi agdama nga IP a pagtaengam ket $3, ti naserraan nga ID ket #$5. Pangngaasi nga iramanmo nga ited ti aniaman wenno agpada kadagitoy iti aniaman a panagsaludsodmo.",
-       "autoblockedtext": "Ti IP a pagtaengam ket na-automatiko a naserraan ngamin ket inusar ti sabali nga agar-aramat, a sinerraan ni $1.\nTi rason nga inted ket:\n\n:''$2''\n\n* Rugi ti panag-serra: $8\n* Panagpaso ti panag-serra: $6\n* Ti serraanna koma: $7\n\nMabalinmo a kontaken ni $1 wenno maysa kadagiti [[{{MediaWiki:Grouppage-sysop}}|administrador]] tapno maipalawag daytoy a panag-serra.\n\nLaglagipem a saanmo a mabalin nga usaren ti \"esuratan daytoy nga agar-aramat\" a langa malaksid no addaanka ti napudno nga esurat a pagtaengan a nakarehistro idiay [[Special:Preferences|kakaykayatam]] ken saanka a naserraan manipud ti panag-usar daytoy.\n\nTi tatta nga IP a pagtaengam ket $3, ken ti ID ti naserraan ket #$5.\nPangaasi nga iramanmo amin dagiti salaysay kadagiti amin a panagsaludsodmo.",
+       "blockedtext": "<strong>Naseraan ti naganmo nga agar-aramat wenno ti IP a pagtaengam.</strong>\n\nTi serra ket inaramid babaen ni $1. \nTi rason a naited ket <em>$2</em>.\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panagserra.\nDimo mabalin nga aramaten ti ramit nga esuratan daytoy nga agar-aramat malaksid no adda napudno nga esurat a pagtaengan a nainaganan iti [[Special:Preferences|pakabilangan ti kakaykayatm]] ken no saanka a naparitan nga agaramat iti daytoy.\nTi agdama nga IP a pagtaengam ket $3, ti naserraan nga ID ket #$5. \nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti aniaman nga aramidem nga usisa.",
+       "autoblockedtext": "Ti IP a pagtaengam ket automatiko a naserraan ngamin ket inusar ti sabali nga agar-aramat, a sinerraan ni $1.\nTi rason nga inted ket:\n\n:<em>$2</em>\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddenga a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno maysa kadagiti [[{{MediaWiki:Grouppage-sysop}}|administrador]] tapno maipalawag daytoy a panagserra.\n\nLaglagipem a saanmo a mabalin nga usaren ti \"esuratan daytoy nga agar-aramat\" a langa malaksid no addaanka ti napudno nga esurat a pagtaengan a nakarehistro iti [[Special:Preferences|kakaykayatam]] ken saanka a naserraan manipud ti panag-usar daytoy.\n\nTi tatta nga IP a pagtaengam ket $3, ken ti ID ti naserraan ket #$5.\nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti aniaman nga aramidem nga usisa.",
        "blockednoreason": "awan ti naited a rason",
        "whitelistedittext": "Nasken ti $1 tapno maurnosmo dagitoy a panid.",
-       "confirmedittext": "Masapul a pasingkedam ti esurat sakbay a makaurnos kadagitoy a panid.\nPangngaasim nga ikabil ken ipapudnom ti esuratmo idiay [[Special:Preferences|kaykayat dagiti agar-aramat ]].",
+       "confirmedittext": "Masapul a pasingkedam ti esurat sakbay a makaurnos kadagitoy a panid.\nPangngaasi nga isaad ken ipapudnom ti esuratmo babaen ti [[Special:Preferences|kakaykayatan ti agar-aramat]].",
        "nosuchsectiontitle": "Saan a mabirukan ti paset",
        "nosuchsectiontext": "Pinadasmo nga inurnos ti awan a paset.\nMabalin a naiyalis wenno naikkat bayat idi kitkitaem ti panid.",
        "loginreqtitle": "Masapul ti sumrek",
        "loginreqlink": "sumrek",
-       "loginreqpagetext": "Naskenka a $1 tapno makakitaka kadagiti sabsabali a pampanid.",
-       "accmailtitle": "Naipatuloden ti kontrasenias.",
-       "accmailtext": "Ti pugto a napartuat a kontrasenias para kenni [[User talk:$1|$1]] ket naipatuloden idiay $2. Mabalin a masukatan idiay\n''[[Special:ChangePassword|pagsukatan ti kontrasenias]]'' a panid no sumrekka.",
+       "loginreqpagetext": "Pangngaasi a $1 tapno makitam dagiti sabali a panid.",
+       "accmailtitle": "Naipatuloden ti kontrasenias",
+       "accmailtext": "Ti pugto a napartuat a kontrasenias para kenni [[User talk:$1|$1]] ket naipatuloden iti $2. Mabalin a masukatan iti\n<em>[[Special:ChangePassword|pagsukatan ti kontrasenias]]</em> a panid no sumrekka.",
        "newarticle": "(Baro)",
-       "newarticletext": "Nasurotmo ti silpo ti awan pay a panid. \nTi mangpartuat ti panid, rugiamon ti agmakinilia iti kahon dita baba (kitaen ti [$1 panid ti tulong] para iti adu pay a pakaammo). \nNo addaka ditoy babaen ti biddut, pindutem ti buton ti <strong>agsubli</strong> ti pagbasabasam.",
-       "anontalkpagetext": "----\n''Daytoy ti pakitungtungan a panid para iti di am-ammo nga agar-aramat a saan pay a nakaaramid ti pakabilangan, wenno saanna nga us-usaren.\nDakami ket agusar kami ti numero nga IP a pagtaengan ti panangilasin dagiti lalaki/babai.\nTi kastoy nga IP a pagtaengan ket us-usaren a bingayan ti adu pay a sabsabali nga agar-aramat.\nNo sika ket maysa a di am-ammo nga agar-aramat ken dagiti awan ti kapategan a komentario ket napaitudo kenka, pangngaasi nga [[Special:UserLogin/signup|agaramid ka ti pakabilangam]] wenno [[Special:UserLogin|sumrekka]] \ntapno maawanan ti panakaulaw kadagiti sabali a di am-ammo nga agar-aramat.",
-       "noarticletext": "Awan ti agdama a testo daytoy a panid.\nMabalinmo ti [[Special:Search/{{PAGENAME}}|agsapul iti kastoy a titulo ti panid]] kadagiti sabsabali a pampanid,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} birukem dagiti mainaig a listaan],\nwenno [{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} urnosem daytoy a panid].",
-       "noarticletext-nopermission": "Awan ti agdama  a linaon daytoy a panid.\nMabalinmo ti [[Special:Search/{{PAGENAME}}|agbiruk para iti titulo ti daytoy a panid]] kadagiti sabali a panid, wenno <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk kadagiti mainaig a listaan]</span>, ngem awan ti pammalubosmo a mangpartuat ti daytoy a panid.",
+       "newarticletext": "Nasurotmo ti silpo ti awan pay a panid. \nTi mangpartuat ti panid, rugiamon ti agmakinilia iti kahon dita baba (kitaen ti [$1 panid ti tulong] para iti adu pay a pakaammo). \nNo addaka ditoy babaen ti biddut, pindutem ti buton ti <strong>back</strong> ti pagbasabasam.",
+       "anontalkpagetext": "----\n<em>Daytoy ti pakitungtungan a panid para iti di ammo nga agar-aramat a saan pay a nakapartuat ti pakabilangan, wenno saanna nga us-usaren.</em>\nIsu nga agusarkami ti numero nga IP a pagtaengan tapno mailasin isuda a lalaki/babai.\nTi kastoy nga IP a pagtaengan ket us-usaren a bingayan babaen ti nadumaduma nga agar-aramat.\nNo sika ket maysa a di ammo nga agar-aramat ken dagiti awan ti pategna a komentario ket napaitudo kenka, pangngaasi nga [[Special:UserLogin/signup|agpartuatka ti pakabilangam]] wenno [[Special:UserLogin|sumrekka]] \ntapno maliklikan ti pannakaiyallilaw kadagiti sabali a di ammo nga agar-aramat.",
+       "noarticletext": "Awan ti agdama a testo daytoy a panid.\nMabalinmo ti [[Special:Search/{{PAGENAME}}|agbiruk iti kastoy a titulo ti panid]] kadagiti sabali a panid,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk kadagiti mainaig a listaan],\nwenno [{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} urnosem daytoy a panid]</span>.",
+       "noarticletext-nopermission": "Awan ti agdama  a linaon daytoy a panid.\nMabalinmo ti [[Special:Search/{{PAGENAME}}|agbiruk para iti titulo ti daytoy a panid]] kadagiti sabali a panid, wenno <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk kadagiti mainaig a listaan]</span>, ngem awan ti pammalubosmo a mangpartuat iti daytoy a panid.",
        "missing-revision": "Ti panagbalbaliw ti #$1 iti daytoy a panid a nanaganan ti \"{{FULLPAGENAME}}\" ket awan.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a silpo ti baak a pakasaritaan iti maysa a naikkaten a panid.\nDagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
-       "userpage-userdoesnotexist": "Ti pakabilangan ti agar-aramat \"$1\" ket saan a nakarehistro. \nPangngaasi a kitaem no kayatmo ti agaramid/urnosen daytoy a panid.",
-       "userpage-userdoesnotexist-view": "Ti pakabilangan ti agar-aramat \"$1\" ket saan a nakarehistro.",
-       "blocked-notice-logextract": "Agdama a naserraan daytoy nga agar-aramat.\nTi naudi a listaan ti panaka-serra ket adda dita baba tapno mausar a reperensia:",
-       "clearyourcache": "'''Pakaammo:''' No nalpaskan nga agiduldulin, koma ket masapul nga ipalabas ti cahe ti pagbasabasam tapno makita dagiti sinukatam.\n* '''Firefox / Safari:''' Tenglen ti ''Sukatan'' bayat nga ipindut ti ''Ikarga manen'', wenno ipindut ti ''Ctrl-F5'' wenno''Ctrl-R'' (''⌘-R'' Mac)\n* '''Google Chrome:''' Ipindut ti ''Ctrl-Shift-R'' (''⌘-Shift-R'' iti Mac)\n* '''Internet Explorer:''' Tenglen ti ''Ctrl'' bayat nga ipindut ti ''Ipasaradiwa'', wenno ipindut ti ''Ctrl-F5''\n* '''Opera:''' Dalusan ti cache iti ''Ramramit → Kakaykayatan''",
-       "usercssyoucanpreview": "'''Paammo:''' Usaren ti \"{{int:showpreview}}\" a buton ti panagsubok ti baro a CSS sakbay nga idulinmo.",
-       "userjsyoucanpreview": "'''Paammo:''' Usaren ti \"{{int:showpreview}}\" a buton ti panagsubok ti baro a JavaScript sakbay nga idulinmo.",
-       "usercsspreview": "'''Laglagipem nga ipadpadasmo laeng daytoy a CSS.'''\n'''Saan pay a naidulin!'''",
-       "userjspreview": "'''Laglagipem nga ipadpadasmo laeng daytoy a JavaScript.'''\n'''Saan pay a naidulin!'''",
-       "sitecsspreview": "'''Laglagipem nga ipadpadasmo laeng daytoy a CSS.'''\n'''Saan pay a naidulin!'''",
-       "sitejspreview": "'''Laglagipem nga ipadpadasmo laeng ti kodigo daytoy a JavaScript.'''\n'''Saan pay nga naidulin!'''",
-       "userinvalidcssjstitle": "'''Ballaag:''' Awan ti kudil a \"$1\".\nAnnawid a .css ken .js dagiti titulo ket agususar ti babassit a letra, a kas dagiti {{ns:user}}:Foo/vector.css saan ket a {{ns:user}}:Foo/Vector.css.",
+       "userpage-userdoesnotexist": "Ti pakabilangan ti agar-aramat ni \"$1\" ket saan a nakarehistro. \nPangngaasi a kitaem no kayatmo ti agpartuat/agurnos iti daytoy a panid.",
+       "userpage-userdoesnotexist-view": "Ti pakabilangan ti agar-aramat ni \"$1\" ket saan a nakarehistro.",
+       "blocked-notice-logextract": "Agdama a naserraan daytoy nga agar-aramat.\nTi naudi a listaan ti pannakaserra ket naited dita baba para iti reperensia:",
+       "clearyourcache": "<strong>Nota:</strong> Kalpasan ti panangidulin, koma ket masapul nga ipalabas ti cahe ti pagbasabasam tapno makita dagiti sinukatam.\n* <strong>Firefox / Safari:</strong>  Tenglen ti <em>Shift</em> bayat a pinduten ti <em>Reload</em>, wenno talmegan ti <em>Ctrl-F5</em> wenno <em>Ctrl-R</em> (<em>⌘-R</em> iti Mac)\n* <strong>Google Chrome:</strong> Talmegan ti <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> iti Mac)\n* <strong>Internet Explorer:</strong> Tenglen ti <em>Ctrl</em> bayat a pinduten ti <em>Refresh</em>, wenno talmegan ti <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Dalusan ti cache iidiay <em>Tools → Preferences</em>",
+       "usercssyoucanpreview": "<strong>Paammo:</strong>  Usaren ti buton ti \"{{int:showpreview}}\" tapno masubokan ti baro a CSS sakbay nga agidulin.",
+       "userjsyoucanpreview": "<strong>Pammo:</strong> Usaren ti buton ti \"{{int:showpreview}}\" tapno masubokan ti baro a JavaScript sakbay nga agidulin.",
+       "usercsspreview": "<strong>Laglagipem nga ipadpadasmo laeng ti bukodmo a CSS ti agar-aramat.\nSaan pay a naidulin!</strong>",
+       "userjspreview": "<strong>Laglagipem a subsubokam/ipadpadasmo ti bukodmo a JavaScript ti agar-aramat.\nSaan pay a naidulin!</strong>",
+       "sitecsspreview": "<strong>Laglagipem nga ipadpadasmo laeng daytoy a CSS.\nSaan pay a naidulin!</strong>",
+       "sitejspreview": "<strong>Laglagipem nga ipadpadasmo laeng daytoy a kodigo ti JavaScript.\nSaan pay nga naidulin!</strong>",
+       "userinvalidcssjstitle": "<strong>Ballaag:</strong> Awan ti kudil a \"$1\".\nDagiti panid ti naiduma a .css ken .js ket agus-usar ti titulo ti bassit a letra, kas ti {{ns:user}}:Foo/vector.css saan a kas ti {{ns:user}}:Foo/Vector.css.",
        "updated": "(Napabaro)",
-       "note": "'''Paammo:'''",
-       "previewnote": "'''Laglagipem a daytoy ket panagipadas laeng.'''\nDagiti sinukatam ket saan pay a naidulin!",
+       "note": "<strong>Nota:</strong>",
+       "previewnote": "<strong>Laglagipem a daytoy ket panagipadas laeng.</strong>\nDagiti sinukatam ket saan pay a naidulin!",
        "continue-editing": "Mapan idiay pagurnosan a lugar",
-       "previewconflict": "Daytoy a panagpadas ket agiparang ti testo dita ngato a panagurnos a lugar a kasla agparang no kayatmo nga idulin.",
-       "session_fail_preview": "'''Pasensia! Saanmi a maaramid ti panag-urnos gapu ngamin ta naawanan ti gimong ti data.'''\nPangngaasi a padasem manen.\nNo saan pay a mabalin, padasem ti [[Special:UserLogout|rummuar]] ken sumrekka manen.",
-       "session_fail_preview_html": "'''Pasensia! Saanmi a maaramid ti panagurnosmo ngamin ket naawanan ti gimong ti datos.'''\n\n''Gapu ti {{SITENAME}} ket addaa ti nakilaw a HTML a nakapabaelan, ti panagpadas ket nailemmeng a kas pagan-annadan kadagiti panagraut ti dakes a JavaScript.''\n\n'''No daytoy ket pudno a panag-urnos, pangngaasi a padasem manen.'''\nNo saan pay a mabalin, padasem ti [[Special:UserLogout|rummuar]] ken sumrekka manen.",
-       "token_suffix_mismatch": "'''Ti panag-urnosmo ket saan a naawat ngamin ket ti klientem ket dinadaelna ti kuldit ti kababalin idiay panagpudno ti panag-urnos.'''\nTi panag-urnos ket saan a naawat tapno mapawilan ti panakadadael ti testo ti panid.\nMapasamak daytoy no agus-usarka ti saan a nasayaat a naibasta ti sapot a di ammo a pannakbagi a panagserbi.",
-       "edit_form_incomplete": "'''Adda dagiti paset ti panag-urnos a porma a saan a nakadanon dita server; kitkitaen nga dagiti panag-urnosmo ket saan a naikkatan ken padasem manen.'''",
+       "previewconflict": "Daytoy a panagpadas ket mangipakita ti testo iti lugar ti akin-ngato a pangurnosan ti testo a kasla agparang no piliem nga idulin.",
+       "session_fail_preview": "<strong>Pasensia! Saanmi a maproseso ti panag-urnosmo gapu ta naawanan ti sesion ti datos.</strong>\nPangngaasi a padasen manen.\nNo saan pay a mabalin, padasen ti [[Special:UserLogout|rummuar]] ken sumrek manen.",
+       "session_fail_preview_html": "<strong>Pasensia! Saanmi a maproseso ti panag-urnosmo gapu ta naawanan ti sesion ti datos.</strong>'\n\n<em>Gapu ta ti {{SITENAME}} ket addaan iti naata a HTML a nakapabaelan, ti panagpadas ket nailemmeng a kas pagan-annadan kadagiti panagraut ti dakes a JavaScript.</em>\n\n<strong>No daytoy ket pudno a panag-urnos, pangngaasi a padasem manen.</strong>\nNo saan pay a mabalin, padasen ti [[Special:UserLogout|rummuar]] ken sumrek manen.",
+       "token_suffix_mismatch": "<strong>Ti panag-urnosmo ket saan a naawat ngamin ket ti klientem ket dinadaelna dagiti karakter ti tuldek iti tandaan ti panag-urnos.</strong>\nTi panag-urnos ket saan a naawat tapno mapawilan ti pannakadadael ti testo ti panid.\nSagpaminsan a mapasamak daytoy no agus-usarka ti saan a nasayaat a naibatay ti web ti di ammo a pannakbagi a serbisio.",
+       "edit_form_incomplete": "<strong>Adda dagiti paset ti pagurnosan a porma a saan a nakadanon dita server; mamindua a kitaen dagiti panag-urnosmo ket sibubukel ken padasen manen.</strong>",
        "editing": "Ur-urnosen ti $1",
        "creating": "Agparpartuat ti $1",
        "editingsection": "Ur-urnosen ti $1 (paset)",
        "editingcomment": "Ur-urnosen ti $1 (baro a paset)",
-       "editconflict": "Adda kasinnungat ti panag-urnos: $1",
-       "explainconflict": "Adda sabali a nagsukat iti daytoy a panid idi nangrugika a nagurnos.\nTi ngato a lugar ti testo ket adda dagiti nagyanna a testo ti panid a kasla agdama a kitana.\nTi inurnosmo ket maipakita dita babba a lugar ti testo\nIpatiponmo dagiti sinukatam idiay lugar ti testo.\n'''Iti laeng''' testo dita ngato a lugar ti testo ti maidulin no pindutem ti \"{{int:savearticle}}\".",
+       "editconflict": "Agsinnungat a panag-urnos: $1",
+       "explainconflict": "Adda sabali a nagsukat iti daytoy a panid idi nangrugika a nagurnos.\nTi akinngato a lugar ti testo ket aglaon ti testo ti panid iti agdama kaddana.\nDagiti sinukatam ket maipakita iti akinbabba a lugar ti testo.\nNasken nga itiponmoto dagiti sinukatam iti adda a testo.\nTi <strong>laeng</strong> testo iti akinngato a lugar ti testo ti maidulinto no talmegam ti \"{{int:savearticle}}\".",
        "yourtext": "Ti testom",
-       "storedversion": "Bersion a naidulin",
-       "nonunicodebrowser": "'''Ballaag: Ti  pabasabasam ket saan a naikeddeng ti Unicode .'''\nAdda sabali a mausar tapno makaurnoska kadagiti panid: Ti saan nga-ASCII a kababalin ket agparang iti pagurnosan a kahon a kas dagiti heksadesimal a kodigo.",
-       "editingold": "'''Ballag: Ur-urnosem ti daan a panag-baliw iti daytoy a panid.'''\nNo idulinmo, mapukaw amin a sinukatam iti daytoy a panag-baliw.",
-       "yourdiff": "Dagiti nagdudumaan",
-       "copyrightwarning": "Laglagipenyo koma, apo, nga amin a maiparawad iti {{SITENAME}} ket maibilang a mairuar babaen ti $2 (kitaen ti $1 para kadagiti salaysay). \nNo 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 />\nKasta met nga ikarim kadakami a bukodmo a sinurat wenno gapuanan daytoy, wenno tinuladmo manipud ti maysa a nawaya a pagturayan ti publiko wenno ti kapadpadana a nawaya a nagtaudan.\n '''Saan a mangited ti adda karbenganna a panagipablaak nga obra no awan ti  pammalubos!'''",
-       "copyrightwarning2": "Pangngaasiyo, apo, a laglagipen nga amin a maiparawad iti {{SITENAME}} ket mabalin a maurnos, masuktan, wenno ikkaten dagiti sabali pay nga agar-aramat.\nNo 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 />\nKasta met nga ikarim kadakami a bukodmo a sinurat wenno gapuanan daytoy, wenno tinuladmo manipud ti maysa a nawaya a pagturayan ti publiko wenno ti kapadpadana a nawaya a pagtaudan (kitaen ti $1 para iti salaysay).\n'''Saan a mangipan iti adda ti karbenganna a panagpablaak nga obra no awan ti  pammalubos!'''",
-       "longpageerror": "'''Biddut: Ti testo 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}}.'''\nIsu ti gapuna a saan a maidulin.",
-       "readonlywarning": "'''Ballaag: Narikepan ti database tapno mataripatu, isu a saanmo a mabalin nga idulin dagita inurnosmo tattan.'''\nMabalinmo ti agkopia ken agikabil ti testom iti maysa a testo a papeles ken idulinmo para iti panagusar no madamdama.\n\nTi administrador a nangrikep ket nangited iti daytoy a palawag: $1",
-       "protectedpagewarning": "'''Ballaag:  Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga adda ti gundaway nga administrador ti makaurnos ditoy.'''\nTi nakaudi a naikabil a listaan ket adda dita baba tapno usaren a reperensia:",
-       "semiprotectedpagewarning": "'''Pakaammo:'''Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaurnos ditoy.\nTi naudi a naikabil a listaan ket adda dita baba tapno usaren a reperensia:",
-       "cascadeprotectedwarning": "'''Ballaag:''' Daytoy a panid ket nasalakniban tapno dagiti laeng administrador nga adda ti pammalubos ti makaurnos ngamin ket nairaman kadagiti sumaganad a nasalakniban iti sariap\n{{PLURAL:$1|a panid|a pampanid}}:",
-       "titleprotectedwarning": "'''Ballaag:  Nasalakniban daytoy a panid tapno [[Special:ListGroupRights|dagiti naisangayan a karbengan ]] ket nasken ti makapartuat iti daytoy.'''\nTi kinaudi a naikabil iti listaan ket naikabil dita baba tapno usaren a reperensia:",
+       "storedversion": "Rebision a naidulin",
+       "nonunicodebrowser": "<strong>Ballaag: Ti pabasabasam ket saan a maitunos iti Unicode .</strong>\nAdda sabali a mausar tapno makaurnoska kadagiti panid: Ti saan nga-ASCII a karakter ket agparang iti pagurnosan a kahon a kas dagiti heksadesimal a kodigo.",
+       "editingold": "<strong>Ballag: Ur-urnosem ti daan a rebision iti daytoy a panid.</strong>\nNo idulinmo, ti aniaman a naramid a binaliwan manipud iti daytoy a rebision ket mapukawto.",
+       "yourdiff": "Paggigiddiatan",
+       "copyrightwarning": "Pangngaasi a laglagipen nga amin a kontribusion iti {{SITENAME}} ket naikeddeng a naipablaak babaen ti babaen ti $2 (kitaen ti $1 para kadagiti salaysay). \nNo dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmon nga ited ditoy.<br />\nIkarkarim pay kadakami a bukodmo a sinurat daytoy, wenno kinopia manipud ti publiko a dominio wenno ti kapadpadana a nawaya a nagtaudan.\n<strong>Saan a mangited ti nakarbengan ti kopia nga obra no awan iti pammalubos!</strong>",
+       "copyrightwarning2": "Pangngaasi a laglagipen nga amin a kontribusion iti {{SITENAME}} ket mabalin a maurnos, mabaliwan, wenno ikkaten dagiti sabali a kontributor.\nNo dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmon nga ited ditoy.<br />\nIkarkarim pay kadakami a bukodmo a sinurat daytoy, wenno kinopia manipud ti publiko a dominio wenno ti kapadpadana a nawaya a nagtaudan. (kitaen ti $1 para kadagiti salaysay).\n<strong>Saan a mangited ti nakarbengan ti kopia nga obra no awan iti pammalubos!</strong>",
+       "longpageerror": "<strong>Biddut: Ti testo nga intedmo ket {{PLURAL:$1|maysa a kilobyte|$1 kil-kilobyte}} ti katiddogna, nga at-atiddog ngem ti kangatuan iti  {{PLURAL:$2|maysa a kilobyte|$2 kil-kilobyte}}.</strong>\nSaan a mabalin a maidulin.",
+       "readonlywarning": "<strong>Ballaag: Narikepan ti database tapno mataripato, isu a saanmo a mabalin nga idulin dagita inurnosmo tattan.</strong>\nMabalinmo ti agkopia ken agipegket ti testom iti papeles ti testo ken idulinmo daytoy intono madamdama.\n\nTi administrador a nangrikep ket nangited iti daytoy a palawag: $1",
+       "protectedpagewarning": "<strong>Ballaag: Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos ditoy.</strong>\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
+       "semiprotectedpagewarning": "<strong>Nota:</strong> Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaurnos ditoy.\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
+       "cascadeprotectedwarning": "<strong>Ballaag:</strong> Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos ngamin ket nairaman kadagiti sumaganad a nasalakniban iti sariap\n{{PLURAL:$1|a panid|a pampanid}}:",
+       "titleprotectedwarning": "<strong>Ballaag:  Nasalakniban daytoy a panid tapno [[Special:ListGroupRights|dagiti naisangayan ti karbengan]] ket nasken a makapartuat iti daytoy.</strong>\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "templatesused": "{{PLURAL:$1|Ti plantilia|Dagiti plantilia}} a naaramat iti daytoy a panid:",
        "templatesusedpreview": "{{PLURAL:$1|Ti plantilia|Dagiti plantilia}} a naaramat iti daytoy a panagpadas:",
        "templatesusedsection": "{{PLURAL:$1|Ti plantilia|Dagiti plantilia}} a naaramat iti daytoy a paset:",
        "template-protected": "(nasalakniban)",
        "template-semiprotected": "(nasalakniban-bassit)",
-       "hiddencategories": "Daytoy a panid ket kameng  {{PLURAL:$1|ti 1 a nailemmeng a kategoria|dagiti $1 a nailemmeng a kategoria}}:",
-       "nocreatetext": "Pinaritan ti {{SITENAME}} ti pannakabael a panagaramid iti kabarbaro a pampanid.\nMabalinmo ti agsubli ken urnosen ti adda a panid, wenno [[Special:UserLogin|sumrek wenno agaramid ti pakabilangan]].",
+       "hiddencategories": "Daytoy a panid ket kameng {{PLURAL:$1|ti 1 a nailemmeng a kategoria|dagiti $1 a nailemmeng a kategoria}}:",
+       "nocreatetext": "Ginawidan ti {{SITENAME}} ti abilidad nga agpartuat kadagiti baro a panid.\nMabalinmo ti agsubli ken agurnos ti adda a panid, wenno [[Special:UserLogin|sumrek wenno agapartuat ti pakabilangan]].",
        "nocreate-loggedin": "Awan ti pammalubosmo nga agpartuat kadagiti baro a panid.",
-       "sectioneditnotsupported-title": "Saan a nasuportaran ti panagurnos ti paset",
+       "sectioneditnotsupported-title": "Saan a nasuportaran ti panag-urnos ti paset",
        "sectioneditnotsupported-text": "Saan a nasuportaran ti panag-urnos ti paset iti daytoy a panid.",
        "permissionserrors": "Biddut ti pammalubos",
        "permissionserrorstext": "Awan ti pammalubosmo nga agaramid iti dayta, gapu ti sumaganad {{PLURAL:$1|a rason|a rasrason}}:",
        "permissionserrorstext-withaction": "Awan ti pammalubosmo nga $2, gapu ti sumaganad a {{PLURAL:$1|rason|rasrason}}:",
-       "recreate-moveddeleted-warn": "'''Ballaag: Agparpartuatka manen ti dati a naikkat a panid'''\n\nNasken a siguraduem no maikanatad nga ituloymo nga urnosen daytoy a panid.\nTi pannakaikkat ken pannakaiyalis a listaan para iti daytoy a panid ket adda ditoy a pakakitaan:",
-       "moveddeleted-notice": "Naikkaten daytoy a panid.\nTi listaan a pannakaikkat ken pannakaiyalis ti panid ket naikabil dita baba tapno usaren a reperensia.",
+       "recreate-moveddeleted-warn": "<strong>Ballaag: Agparpartuatka manen ti dati a naikkat a panid.</strong>\n\nUsigem koma no maitutop ti agtuloy nga agurnos iti daytoy a panid.\nTi listaan ti pannakaikkat ken pannakaiyalis para iti daytoy a panid ket naited ditoy para iti pakainugotan:",
+       "moveddeleted-notice": "Naikkaten daytoy a panid.\nTi listaan ti pannakaikkat ken pannakaiyalis para iti panid ket naited dita baba para iti reperensia.",
        "log-fulllog": "Kitaem ti napno a listaan",
        "edit-hook-aborted": "Ti panag-urnos ket pinasardeng babaen ti kawit.\nAwan ti intedna a palawag.",
        "edit-gone-missing": "Saan a mapabaro daytoy a panid.\nKasla met naikkaten.",
-       "edit-conflict": "Adda kasinnungat ti panag-urnos.",
-       "edit-no-change": "Ti inurnosmo ket saan a naikaskaso, ngamin ket awan ti nasukatan a testo.",
+       "edit-conflict": "Kasinnungat ti panag-urnos.",
+       "edit-no-change": "Ti inurnosmo ket saan a naikaskaso ngamin ket awan ti naaramid a pannakasukat iti testo.",
        "postedit-confirmation-created": "Ti panid ket napartuaten.",
-       "postedit-confirmation-restored": "Ti panid ket naisublin.",
+       "postedit-confirmation-restored": "Ti panid ket naipulangen.",
        "postedit-confirmation-saved": "Ti inurnosmo ket naidulinen.",
        "edit-already-exists": "Saan a makaaramid ti baro a panid.\nAdda met daytoyen.",
        "defaultmessagetext": "Kasisigud a testo ti mensahe",
-       "content-failed-to-parse": "Napaay a nausig ti $2 a linaon para iti $1 a modelo: $3",
+       "content-failed-to-parse": "Napaay a mawaswas ti $2 a linaon para iti $1 a modelo: $3",
        "invalid-content-data": "Imbalido a datos ti linaon",
-       "content-not-allowed-here": "Ti \"$1\" a linaon ket saan a maipalubos idiay panid ti [[$2]]",
-       "editwarning-warning": "Ti ipapanaw iti daytoy a panid ket makapataud ti pannakapukaw kadagiti aniaman a binalbaliwam.\nNo nakastrekka, mabalinmo nga ibaldado daytoy a ballaag idiay \"{{int:prefs-editing}}\" a paset kadagiti kakaykayatam.",
+       "content-not-allowed-here": "Ti \"$1\" a linaon ket saan a maipalubos iti panid ti [[$2]]",
+       "editwarning-warning": "Ti ipapanaw iti daytoy a panid ket makapataud ti pannakapukaw kadagiti aniaman a binalbaliwam.\nNo nakastrekka, mabalinmo nga ibaldado daytoy a ballaag iti \"{{int:prefs-editing}}\" a paset kadagiti kakaykayatam.",
        "editpage-notsupportedcontentformat-title": "Ti pormat ti linaon ket saan a nasuportaran",
        "editpage-notsupportedcontentformat-text": "Ti pormat ti linaon ti $1 ket saan a nasuportaran babaen ti modelo ti linaon ti $2.",
        "content-model-wikitext": "wikitext",
        "content-model-text": "naranas a testo",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "expensive-parserfunction-warning": "'''Ballaag:''' Daytoy a panid ket adu unay kadagiti nangina a parser a pamay-an  a panagtawtawag.\n\nAdda koman basbasit ngem $2 {{PLURAL:$2|a panagtawtawag|kadagiti panagtawtawag}}, adda {{PLURAL:$1|tattan $1 a panagtawtawag|tattan kadagiti $1 a panagtawtawag}}.",
+       "expensive-parserfunction-warning": "<strong>Ballaag:</strong> Daytoy a panid ket adu unay kadagiti nangina a parser a pamay-an a panagtawtawag.\n\nAdda koman basbasit ngem $2 {{PLURAL:$2|a panagtawtawag|kadagiti panagtawtawag}}, adda {{PLURAL:$1|tattan iti $1 a panagtawtawag|tattan kadagiti $1 a panagtawtawag}}.",
        "expensive-parserfunction-category": "Dagiti panid nga adda ti adu unay a nangina a parser a pamay-an a panagtawtawag",
-       "post-expand-template-inclusion-warning": "'''Ballaag:''' Dakkel unay ti nairaman a kadakkel ti plantilia.\nAdda dagiti plantilia a saanto a mairaman.",
+       "post-expand-template-inclusion-warning": "<strong>Ballaag:</strong> Dakkel unay ti nairaman a kadakkel ti plantilia.\nAdda dagiti plantilia a saanto a mairaman.",
        "post-expand-template-inclusion-category": "Pampanid nga ayan ti plantilia a nagsobra ti kadakkel ti rukod a nairaman",
-       "post-expand-template-argument-warning": "'''Ballaag:''' Daytoy a panid ket aglaon ti saan a basbasit ngem maysa a panangipalawag ti plantilia a dakkel unay ti panagpadakkelna.\nDagitoy a panangipalawag ket naikkaten.",
-       "post-expand-template-argument-category": "Dagiti panid a naglaon ti naikkat a plantilia kadagiti kasinnungat",
-       "parser-template-loop-warning": "Adda nasarakan a silo ti plantilia: [[$1]]",
-       "parser-template-recursion-depth-warning": "Ti kinauneg ti panagdullit ti plantilia ket nagpatingga ti napalabes ($1)",
-       "language-converter-depth-warning": "Ti kauneg ti panagaramid ti pagsasao ket napalabes ti agpatingga a ($1)",
+       "post-expand-template-argument-warning": "<strong>Ballaag:</strong> Daytoy a panid ket aglaon ti saan a basbasit ngem maysa a panangipalawag ti plantilia a dakkel unay ti panagpadakkelna.\nDagitoy nga argumento ket saanen a nairaman.",
+       "post-expand-template-argument-category": "Pampanid a naglaon dagiti saan a nairaman nga argumento ti plantilia",
+       "parser-template-loop-warning": "Nakaduktal ti silo ti plantilia: [[$1]]",
+       "parser-template-recursion-depth-warning": "Nalabsan ti patingga ti panagdullit ti kinauneg ti plantilia ($1)",
+       "language-converter-depth-warning": "Nalabsan ti patingga ti pagbaliwen a kinauneg ti pagsasao ($1)",
        "node-count-exceeded-category": "Dagiti panid a simmurok ti bilang ti nodo",
        "node-count-exceeded-category-desc": "Ti kategoria para kadagiti panid a nalabsan ti bilang ti nodo.",
        "node-count-exceeded-warning": "Ti panid ket nasurokanna ti bilang ti nodo",
        "expansion-depth-exceeded-category": "Dagiti panid a nasurokan ti kauneg ti panagpadakkel",
        "expansion-depth-exceeded-category-desc": "Daytoy ket kategoria para kadagiti panid a nalabsan ti kauneg ti panagpadakkel.",
        "expansion-depth-exceeded-warning": "Ti panid ket nasurokanna ti kauneg ti panagpadakkel",
-       "parser-unstrip-loop-warning": "Adda nakita a di-naukisan a silo",
-       "parser-unstrip-recursion-limit": "Ti di-naukisan a panagsumro manen a patingga ket nasurokan ($1)",
-       "converter-manual-rule-error": "Adda biddut a naduktalan idiay manual nga alagaden ti panagbalbaliw ti pagsasao",
-       "undo-success": "Ti panag-urnos ket saan a maisubli.\nPangngaasi a kitaen ti pagipadaan dita baba tapno maamuan no agpaypayso ti kayatmo nga aramiden, ken idulin dagiti sinukatan dita baba tapno malpas ti panagsubli ti inurnos.",
+       "parser-unstrip-loop-warning": "Nakaduktal ti di-naukisan a silo",
+       "parser-unstrip-recursion-limit": "Nalabsan ti patingga ti panagdullit ti di-naukisan ($1)",
+       "converter-manual-rule-error": "Adda biddut a naduktalan iti manual nga alagaden ti panagbalbaliw ti pagsasao",
+       "undo-success": "Ti panag-urnos ket saan a maisubli.\nPangngaasi a kitaen ti panangipada dita baba tapno maammuan no daytoy ti kayatmo nga aramiden, ken kalpasanna idulin dagiti sinukatan dita baba tapno malpas ti panagsubli ti inurnos.",
        "undo-failure": "Ti inurnos ket saan a maipasubli gaputa adda dagiti nakisinnungat a patingnga a naurnos.",
        "undo-norev": "Saan a maibabawi ti naurnos ngamin ket awan daytoy wenno mabalin a naikkaten.",
        "undo-nochange": "Ti inurnos ket kasla naibabawin.",
        "undo-summary": "Ibabawi ti $1 a binaliwan babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]])",
        "undo-summary-username-hidden": "Isubli ti $1 a binaliwan babaen ti nailemmeng nga agar-aramat",
-       "cantcreateaccounttitle": "Saan a makaaramid ti pakabilangan",
-       "cantcreateaccount-text": "Ti panagaramid ti pakabilangan manipud ti daytoy nga IP a pagtaengan ('''$1''') ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket ''$2''",
-       "cantcreateaccount-range-text": "Ti pannakapartuat ti pakabilangan manipud kadagiti pagtaengan ti IP iti sakop ti '''$1''', a mairaman ti IP a pagtaengam ('''$4'''), ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket ''$2''",
+       "cantcreateaccounttitle": "Saan a makapartuat ti pakabilangan",
+       "cantcreateaccount-text": "Ti panagpartuat ti pakabilangan manipud ti daytoy nga IP a pagtaengan (<strong>$1</strong>) ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket <em>$2</em>",
+       "cantcreateaccount-range-text": "Ti panagpartuat ti pakabilangan manipud kadagiti pagtaengan ti IP iti sakop ti '''$1''', a mairaman ti IP a pagtaengam ('''$4'''), ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket ''$2''",
        "viewpagelogs": "Kitaen dagiti listaan para iti daytoy a panid",
        "nohistory": "Awan ti pakasaritaan ti panag-urnos iti daytoy a panid.",
-       "currentrev": "Kinaudi a binaliwan",
-       "currentrev-asof": "Kinaudi a panagbalbaliw manipud idi $1",
-       "revisionasof": "Panagbalbaliw manipud idi $1",
-       "revision-info": "Panagbaliw manipud idi $1 babaen ni {{GENDER:$6|$2}}$7",
-       "previousrevision": "←Daan a panagbalbaliw",
-       "nextrevision": "Nabarbaro a panagbalbaliw→",
-       "currentrevisionlink": "Kinaudi a binaliwan",
+       "currentrev": "Kinaudi a rebision",
+       "currentrev-asof": "Kinaudi a rebision manipud idi $1",
+       "revisionasof": "Rebision manipud idi $1",
+       "revision-info": "Rebision manipud idi $1 babaen ni {{GENDER:$6|$2}}$7",
+       "previousrevision": "← Nadadaan a rebision",
+       "nextrevision": "Nabarbaro a rebision →",
+       "currentrevisionlink": "Kinaudi a rebision",
        "cur": "agdama",
        "next": "sumaruno",
        "last": "naudi",
        "page_first": "umuna",
        "page_last": "naudi",
-       "histlegend": "Panagpili ti diperensia: Markaan dagiti kahon ti radio kadagiti panagbaliw tapno maipada ken pinduten ti serrek wenno ti buton dita baba.<br />\nLeyenda: <strong>({{int:cur}})</strong> = naggidiatan ti kinaudi a panagbaliw, <strong>({{int:last}})</strong> = naggidiatan ti sarsarunuen a panagbaliw , <strong>{{int:minoreditletter}}</strong> = bassit a panagbaliw.",
+       "histlegend": "Panagpili ti diperensia: Markaan dagiti kahon ti radio kadagiti rebision tapno maipada ken pinduten ti enter wenno ti buton dita baba.<br />\nLeyenda: <strong>({{int:cur}})</strong> = naggidiatan ti kinaudi a rebision, <strong>({{int:last}})</strong> = naggidiatan ti sarsarunuen a rebision, <strong>{{int:minoreditletter}}</strong> = bassit nga urnos.",
        "history-fieldset-title": "Agbasabasa ti pakasaritaan",
        "history-show-deleted": "Naikkat laeng",
        "histfirst": "kadaanan",
        "histlast": "kabaruan",
        "historysize": "({{PLURAL:$1|1 byte|dagiti $1 a byte}})",
-       "historyempty": "(blanko)",
-       "history-feed-title": "Pakasaritaan ti panagbalbaliw",
-       "history-feed-description": "Pakasaritaan ti panagbalbaliw para iti daytoy a panid ditoy a wiki",
-       "history-feed-item-nocomment": "$1 iti $2",
+       "historyempty": "(awan linaon)",
+       "history-feed-title": "Pakasaritaan ti rebision",
+       "history-feed-description": "Pakasaritaan ti rebision para iti daytoy a panid ditoy a wiki",
+       "history-feed-item-nocomment": "$1 idi $2",
        "history-feed-empty": "Awan ti kiniddaw a panid.\nMabalin a naikkat manipud ti daytoy a wiki, wenno nanaganan manen.\nPadasem ti [[Special:Search|agbiruk ditoy a wiki]] para kadagiti maitutop a baro a panid.",
        "rev-deleted-comment": "(naikkat ti pakabuklan ti inurnos)",
        "rev-deleted-user": "(naikkat ti nagan ti agar-aramat)",
-       "rev-deleted-event": "(naikkat ti aramid a listaan)",
-       "rev-deleted-user-contribs": "[ti nagan ti agar-aramat wenno IP a pagtaengan ket naikkat - ti inurnos ket nailemmeng kadagiti nagparawad]",
-       "rev-deleted-text-permission": "Ti pannakabaliw daytoy a panid ket '''naikkaten'''.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti naikkat].",
-       "rev-deleted-text-unhide": "Ti pannakabaliw daytoy a panid ket '''naikkaten'''.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti naikkat].\nMabalinmo pay a [$1 makita daytoy a panakabaliw] no kayatmo ti agtuloy.",
-       "rev-suppressed-text-unhide": "Ti pannakabaliw daytoy a panid ket '''napasardeng'''.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti napasardeng].\nMabalinmo pay a [$1 makita daytoy a panakabaliw] no kayatmo ti agtuloy.",
-       "rev-deleted-text-view": "Ti pannakabaliw daytoy a panid ket '''naikkaten'''.\nMabalinmo a kitaen; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti naikkat].",
-       "rev-suppressed-text-view": "Ti pannakabaliw daytoy a panid ket '''napasardeng'''.\nMabalinmo a kitaen; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti napasardeng].",
-       "rev-deleted-no-diff": "Saanmo a makita daytoy a paggiddiatan ngamin ket ti maysa a panagbaliw ket '''naikkat''.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti naikkat].",
-       "rev-suppressed-no-diff": "Saanmo a makita daytoy a paggiddiatan ngamin ket maysa a panagbaliwan ket '''naikkat''.",
-       "rev-deleted-unhide-diff": "Maysa a panagbaliw iti daytoy a paggiddiatan ket '''naikkaten'''.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti naikkat].\nMabalinmo pay a [$1 makita daytoy a paggiddiatan] no kayatmo ti agtuloy.",
-       "rev-suppressed-unhide-diff": "Maysa a panagbaliw iti daytoy a paggiddiatan ket '''napasardeng'''.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti napasardeng].\nMabalinmo pay a [$1 makita daytoy a paggiddiatan] no kayatmo ti agtuloy.",
-       "rev-deleted-diff-view": "Maysa a panagbaliw iti daytoy a paggiddiatan ket '''naikkaten'''.\nMabalinmo pay a kitaen daytoy a paggiddiatan; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti naikkat].",
-       "rev-suppressed-diff-view": "Maysa a panagbaliw iti daytoy a paggiddiatan ket '''napasardeng'''.\nMabalinmo pay a kitaen daytoy a paggiddiatan; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti napasardeng].",
-       "rev-delundel": "ipakita/ilemmeng",
+       "rev-deleted-event": "(naikkat ti listaan ti tignay)",
+       "rev-deleted-user-contribs": "[naikkat ti nagan ti agar-aramat wenno IP a pagtaengan - ti inurnos ket nailemmeng manipud kadagiti kontributor]",
+       "rev-deleted-text-permission": "Ti rebision daytoy a panid ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
+       "rev-suppressed-text-permission": "Ti rebision daytoy a panid ket <strong>napasardeng</strong>.\nDagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].",
+       "rev-deleted-text-unhide": "Ti rebision daytoy a panid ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].\nMabalinmo pay a [$1 makita daytoy a rebision] no kayatmo ti agtuloy.",
+       "rev-suppressed-text-unhide": "Ti rebision daytoy a panid ket <strong>napasardeng</strong>.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].\nMabalinmo pay a [$1 makita daytoy a rebision] no kayatmo ti agtuloy.",
+       "rev-deleted-text-view": "Ti rebision daytoy a panid ket <strong>naikkaten</strong>.\nMabalinmo a kitaen; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
+       "rev-suppressed-text-view": "Ti rebision daytoy a panid ket <strong>napasardeng</strong>.\nMabalinmo a kitaen; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].",
+       "rev-deleted-no-diff": "Saanmo a makita daytoy a paggiddiatan ngamin ket ti maysa a rebision ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
+       "rev-suppressed-no-diff": "Saanmo a makita daytoy a paggiddiatan ngamin ket maysa kadagiti rebision ket <strong>naikkaten</strong>.",
+       "rev-deleted-unhide-diff": "Maysa a rebision iti daytoy a paggiddiatan ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].\nMabalinmo pay a laeng a [$1 makita daytoy a paggiddiatan] no kayatmo ti agtuloy.",
+       "rev-suppressed-unhide-diff": "Maysa a rebision iti daytoy a paggiddiatan ket <strong>napasardeng</strong>.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].\nMabalinmo pay a laeng a [$1 makita daytoy a paggiddiatan] no kayatmo ti agtuloy.",
+       "rev-deleted-diff-view": "Maysa a rebision iti daytoy a paggiddiatan ket <strong>naikkaten</strong>.\nMabalinmo pay a kitaen daytoy a paggiddiatan; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
+       "rev-suppressed-diff-view": "Maysa a rebision iti daytoy a paggiddiatan ket <strong>napasardeng</strong>..\nMabalinmo pay a kitaen daytoy a paggiddiatan; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].",
+       "rev-delundel": "baliwan ti pannakakita",
        "rev-showdeleted": "ipakita",
-       "revisiondelete": "Ikkaten/isubli dagiti naikkat a panagbaliw",
-       "revdelete-nooldid-title": "Imbalido ti napuntaan a panagbaliw",
-       "revdelete-nooldid-text": "Mabalin a saanmo nga imbaga ti pagpuntaan ti panagbaliw  (dagiti panagbaliwan) ti panagaramid daytoy,\nawan ti naibaga a panagbaliw, wenno padpadasem nga ilemlemmeng ti agdama a panagbaliw.",
+       "revisiondelete": "Ikkaten/isubli dagiti naikkat a rebision",
+       "revdelete-nooldid-title": "Imbalido ti puntaan a rebision",
+       "revdelete-nooldid-text": "Mabalin a saanmo nga imbaga dagiti puntaan a rebision iti panagaramid daytoy nga annong, awan ti nainaganan a rebision, wenno padpadasem nga ilemlemmeng ti agdama a rebision.",
        "revdelete-no-file": "Awan dayta nainaganan a papeles.",
-       "revdelete-show-file-confirm": "Sigurado kadi a kayatmo ti mangkita ti naikkat a baliwan ti papeles \"<nowiki>$1</nowiki>\" a naggapu idi $2 idi $3?",
+       "revdelete-show-file-confirm": "Siguradoka kadi a kayatmo ti mangkita ti naikkat a rebision ti papeles ti \"<nowiki>$1</nowiki>\" manipud idi $2 idi $3?",
        "revdelete-show-file-submit": "Wen",
-       "revdelete-selected-text": "{{PLURAL:$1|Napili a nabaliwan|Dagiti napili a nabaliwan}} iti [[:$2]]:",
+       "revdelete-selected-text": "{{PLURAL:$1|Napili a rebision|Dagiti napili a rebision}} iti [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Napili a bersion ti papeles|Dagiti napili a bersion ti papeles}} iti [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Ti napili a listaan ti napasamak|Dagiti napili a listaan ti napasamak}}:",
        "revdelete-text-text": "Dagiti naikkat a rebision ket agparangto pay laeng iti panid ti pakasaritaan, ngem dagiti paset ti linaonda ket saanton a publiko a maserrekan.",
        "revdelete-text-file": "Dagiti naikkat a bersion ti papeles ket agparangto pay laeng iti pakasaritaan ti papeles, ngem dagiti paset ti linaonda ket saanton a publiko a maserrekan.",
        "logdelete-text": "Dagiti naikkat a listaan ti pasamak ket agparangto pay laeng kadagiti listaan, ngem dagiti paset ti linaonda ket saanton a publiko a maserrekan.",
-       "revdelete-text-others": "Dagiti sabali nga administrador iti {{SITENAME}} ket mabalindanto pay laeng a maserrekan ti nailemmeng a linaon ken mabalindanto manen ti mangisubli ti pannakaikkat babaen iti daytoy nga isu met laeng nga interface, malaksid no adda dagiti maipatinayon a maisaad a panangigawid.",
-       "revdelete-confirm": "Pangngaasi a pasingkedam a kayatmo nga aramiden daytoy, a maawatam dagiti pagbanagan, ket araramidem daytoy a segun iti [[{{MediaWiki:Policy-url}}|ti annuroten]].",
-       "revdelete-suppress-text": "Ti panagdepdep ket usaren '''laeng''' kadagiti sumaganad a kaso;\n* Makapataud ti libelo a pakaammo\n* Di maiparbeng a personal a pakaammo\n* : ''dagiti pagtaengan ken numero ti telepono, dagiti numero ti nailian a pakaipakaammuan, ken dadduma pay.''",
-       "revdelete-legend": "Ikabil dagiti panagiparit ti panagkita",
-       "revdelete-hide-text": "Testo ti binaliwan",
+       "revdelete-text-others": "Dagiti sabali nga administrador ket mabalindanto pay laeng a maserrekan ti nailemmeng a linaon ken mangisubli daytoy, malaksid no adda dagiti maipatinayon a maisaad a panangigawid.",
+       "revdelete-confirm": "Pangngaasi a pasingkedam a kayatmo nga aramiden daytoy, a maawatam dagiti pagbanagan, ken araramidem daytoy segun [[{{MediaWiki:Policy-url}}|ti annuroten]].",
+       "revdelete-suppress-text": "Ti panagdepdep ket usaren <strong>laeng</strong> kadagiti sumaganad a kaso;\n* Makapataud ti libelo a pakaammo\n* Di maiparbeng a personal a pakaammo\n* : <em>dagiti adres ti balay ken numero ti telepono, dagiti numero ti nailian a pakaipakaammuan, kdpy.</em>",
+       "revdelete-legend": "Isaad dagiti panangigawid ti panagkita",
+       "revdelete-hide-text": "Testo ti rebision",
        "revdelete-hide-image": "Ilemmeng ti linaon ti papeles",
        "revdelete-hide-name": "Ilemmeng ti aramid ken puntaan",
        "revdelete-hide-comment": "Pakabuklan ti inurnos",
-       "revdelete-hide-user": "Nagan ti agar-amat/ti IP a pagtaengan",
-       "revdelete-hide-restricted": "Depdepen ti datos a naggapu kadagiti administrador ken dagiti sabsabali",
+       "revdelete-hide-user": "Nagan ti agar-amat/IP a pagtaengan ti editor",
+       "revdelete-hide-restricted": "Depdepen ti datos manipud kadagiti administrador ken dagiti pay sabali",
        "revdelete-radio-same": "(saan a sukatan)",
        "revdelete-radio-set": "Nailemmeng",
        "revdelete-radio-unset": "Makita",
-       "revdelete-suppress": "Depdepen ti datos manipud kadagiti administrador ken dagiti sabsabali",
-       "revdelete-unsuppress": "Ikkaten dagiti pannakaiparit kadagiti naisubli a binaliwan",
+       "revdelete-suppress": "Depdepen ti datos manipud kadagiti administrador ken dagiti pay sabali",
+       "revdelete-unsuppress": "Ikkaten dagiti panangigawid kadagiti naipulang a rebision",
        "revdelete-log": "Rason:",
-       "revdelete-submit": "Ipakat {{PLURAL:$1|ti napili a panagbalbaliw|dagiti napili a panagbalbaliw}}",
-       "revdelete-success": "'''Balligi ti panagpabaro ti panagkita ti binalbaliwan.'''",
-       "revdelete-failure": "'''Saan a napabaro ti panagkita ti binalbaliwan.'''\n$1",
-       "logdelete-success": "'''Balligi ti panagikabil ti listaan ti panagkita.'''",
-       "logdelete-failure": "'''Napaay ti panagikabil ti listaan ti panagkita:'''\n$1",
+       "revdelete-submit": "Ipakat {{PLURAL:$1|ti napili a rebision|dagiti napili a rebision}}",
+       "revdelete-success": "<strong>Balligi ti panagpabaro ti panagkita ti rebision.</strong>",
+       "revdelete-failure": "<strong>Saan a napabaro ti panagkita ti rebision.</strong>\n$1",
+       "logdelete-success": "<strong>Balligi ti pannakaisaad ti listaan ti panagkita.</strong>",
+       "logdelete-failure": "<strong>Napaay ti pannakaisaad ti listaan ti panagkita:</strong>\n$1",
        "revdel-restore": "sukatan ti panagkita",
        "pagehist": "Pakasaritaan ti panid",
        "deletedhist": "Naikkat a pakasaritaan",
-       "revdelete-hide-current": "Biddut ti pannakailemmeng ti banag a napetsado a $2, $1: Daytoy ti kinaudi a panagbaliw\nSaan a mabalin a mailemmeng.",
-       "revdelete-show-no-access": "Biddut ti panangipakita ti banag a petsado a $2, $1: Daytoy ket namarkaan a \"nakedngan\".\nSaanmo a mabalin a serrekan.",
-       "revdelete-modify-no-access": "Biddut ti panagpabaro ti banag a petsado a $2, $1: Daytoy ket namarkaan a \"nakedngan\".\nSaanmo a mabalin a serrekan.",
-       "revdelete-modify-missing": "Biddut ti panagpabaro daytoy ID $1: Saan a nasarakan idiay database!",
-       "revdelete-no-change": "'''Ballaag:''' Daytoy a banag a napetsado ti  $2, $1 ket addaan ti kiniddaw kadagiti panagkita a kasasaad.",
-       "revdelete-concurrent-change": "Biddut ti panagpabaro daytoy a banag a napetsado ti  $2, $1: Ti panakaikabilna ket mabalin a nasuktanen ti sabsabli idi pinada mo a pinabaro.\nPangngaasi a kitaen dagiti listaan.",
-       "revdelete-only-restricted": "Biddut ti panagilemmeng daytoy banag a napetsado ti $2, $1: Saanmo a maidepdep dagita iti panagkita dagiti adminitrador no saanmo a pilian ti maysa kadagiti pinagpili ti panagkita.",
-       "revdelete-reason-dropdown": "*Dagiti kadawyan a rason ti panagikkat\n** Panaglabsing ti karbengan ti kopia\n** Di maiparbeng a komentario wenno kabukbukodan a pakaammo\n** Di maiparbeng a nagan ti agar-aramat\n** Adda pannakabalinna a pammadpadakes a pakaammo",
+       "revdelete-hide-current": "Biddut ti pannakailemmeng ti banag a napetsado ti $2, $1: Daytoy ti kinaudi a rebision.\nSaan a mabalin a mailemmeng.",
+       "revdelete-show-no-access": "Biddut ti panangipakita ti banag a petsado ti $2, $1: Daytoy ket namarkaan a \"nagawidan\".\nSaanmo a mabalin a serrekan.",
+       "revdelete-modify-no-access": "Biddut ti panagpabaro ti banag a petsado ti $2, $1: Daytoy ket namarkaan a \"nagawidan\".\nSaanmo a mabalin a serrekan.",
+       "revdelete-modify-missing": "Biddut ti panagpabaro daytoy ID $1: Awan daytoy manipud ti database!",
+       "revdelete-no-change": "<strong>Ballaag:</strong> Daytoy a banag a napetsado ti $2, $1 ken addaan ti kiniddaw a panagkita ti pannakaisaad.",
+       "revdelete-concurrent-change": "Biddut ti panagpabaro daytoy a banag a napetsado ti  $2, $1: Ti kasasaadna ket mabalin a nasukatanen ti sabali idi pinadasmo a pinabaro.\nPangngaasi a kitaen dagiti listaan.",
+       "revdelete-only-restricted": "Biddut ti panagilemmeng daytoy banag a napetsado ti $2, $1: Saanmo a maidepdep dagita iti panagkita dagiti adminitrador no saanmo a pilien ti maysa kadagiti pagpilian ti panagkita.",
+       "revdelete-reason-dropdown": "*Dagiti kadawyan a rason ti panagikkat\n** Panaglabsing ti karbengan ti kopia\n** Di maiparbeng a komentario wenno kabukbukodan a pakaammo\n** Di maiparbeng a nagan ti agar-aramat\n** Mabalin a pammadpadakes a pakaammo",
        "revdelete-otherreason": "Sabali/maipatinayon a rason:",
        "revdelete-reasonotherlist": "Sabali a rason",
        "revdelete-edit-reasonlist": "Urnosen dagiti rason ti panagikkat",
-       "revdelete-offender": "Nangsukat a mannurat:",
+       "revdelete-offender": "Mannurat ti rebision:",
        "suppressionlog": "Listaan ti nadepdepan",
-       "suppressionlogtext": "Dita baba ket addaan dagiti listaan ti pinagikkat ken panagserra a nairaman dagiti linaon a nailemmeng manipud kadagiti administrador.\nKitaen ti [[Special:BlockList|Listaan ti lapden nga IP]] para iti listaan kadagiti agdama nga operasional a panagparit ken panagserra.",
-       "mergehistory": "Pagtiponen dagiti pakasaritaan ti pampanid",
-       "mergehistory-header": "Daytoy a panid ket mabalinmo ti agitipon kadagiti pinagbaliwan ti pakasaritaan iti maysa a taudan idiay barbaro a panid.\nMasapul a sigaraduem a daytoy a panagsukat ket agsustento ti panakaituloy ti pakasaritaan ti panid.",
-       "mergehistory-box": "Pagtiponen dagiti nasukatan iti dua a pampanid:",
+       "suppressionlogtext": "Dita baba ket listaan dagiti panagikkat ken panagserra a nairaman kadagiti linaon a nailemmeng manipud kadagiti administrador.\nKitaen ti [[Special:BlockList|listaan ti serra]] para iti listaan kadagiti agdama nga operasional a panagiparit ken dagiti panagserra.",
+       "mergehistory": "Pagtiponen dagiti pakasaritaan ti panid",
+       "mergehistory-header": "Daytoy a panid ket mangpakabael kenka nga agitipon kadagiti rebision ti pakasaritaan iti maysa a taudan iti barbaro a panid.\nMasapul a siguraduen no daytoy a panagsukat ket agsustento ti pannakaituloy ti pakasaritaan ti panid.",
+       "mergehistory-box": "Pagtiponen dagiti rebision iti dua a pampanid:",
        "mergehistory-from": "Taudan ti panid:",
        "mergehistory-into": "Pangipanan a panid:",
        "mergehistory-list": "Mabalin nga itipon a pakasaritaan ti inurnos",
-       "mergehistory-merge": "Dagiti sumaganad a panagbaliw iti [[:$1]] ket mabalin nga itipon iti [[:$2]].\nUsaren ti radio a buton a tukol ti pinagtipon iti laeng panagbaliw a naaramid idiay ken sakbay ti nainagan nga oras.",
+       "mergehistory-merge": "Dagiti sumaganad a rebision iti [[:$1]] ket mabalin nga itipon iti [[:$2]].\nUsaren ti radio a buton a tukol ti panagtipon iti laeng panagbaliw a napartuat iti ken sakbay ti nainagan nga oras.\nLaglagipen a ti panag-usar kadagiti silpo ti pagdaliasatan ket mangisaad manen iti daytoy a batong.",
        "mergehistory-go": "Ipakita dagiti mabalin a maitipon a panag-urnos",
-       "mergehistory-submit": "Pagtitiponen dagiti binalbaliwan",
-       "mergehistory-empty": "Awan dagiti mabalin nga itipon ti panagbalbaliw.",
-       "mergehistory-success": "$3 {{PLURAL:$3|a binaliwan|dagiti binaliwan}} ti [[:$1]] balligi ti panagitipon idiay [[:$2]].",
-       "mergehistory-fail": "Saan a nakaaramid ti panagtipon ti pakasaritaan, pangngaasi ta kitaen ti panid ken parametro ti oras.",
+       "mergehistory-submit": "Pagtitiponen dagiti rebision",
+       "mergehistory-empty": "Awan dagiti rebision ti mabalin nga itipon.",
+       "mergehistory-success": "$3 {{PLURAL:$3|a rebision|dagiti rebision}} iti [[:$1]] ket nagballigi a naitipon iti [[:$2]].",
+       "mergehistory-fail": "Saan a nakaaramid ti panagtipon ti pakasaritaan, pangngaasi a kitaen ti panid ken dagiti parametro ti oras.",
        "mergehistory-fail-toobig": "Di naaramid ti panagtipon ti pakasaritaan gapu ta ad-adu ti patingga ti $1 {{PLURAL:$1|a rebision|kadagiti rebision}} ti maiyalisto.",
-       "mergehistory-no-source": "Awan ti taudan ti panid a $1.",
-       "mergehistory-no-destination": "Awan ti papanan ti panid a $1.",
+       "mergehistory-no-source": "Awan ti taudan ti panid ti $1.",
+       "mergehistory-no-destination": "Awan ti papanan ti panid ti $1.",
        "mergehistory-invalid-source": "Masapul nga adda ti umisu a titulo ti taudan ti panid.",
-       "mergehistory-invalid-destination": "Ti pangipanan ti panid ket masapul nga umisu a titulo.",
+       "mergehistory-invalid-destination": "Ti pangipanan a panid ket masapul nga umisu a titulo.",
        "mergehistory-autocomment": "Naitipon ti [[:$1]] iti [[:$2]]",
        "mergehistory-comment": "Naitipon ti [[:$1]] iti [[:$2]]: $3",
        "mergehistory-same-destination": "Ti nagtaudan ken ti pangipanan ti panid ket saan a mabalin nga agpada",
        "mergehistory-reason": "Rason:",
        "mergelog": "Listaan ti panagtipon",
-       "pagemerge-logentry": "itipon ti [[$1]] iti [[$2]] (dagiti binaliwan aginggana iti $3)",
+       "pagemerge-logentry": "itipon ti [[$1]] iti [[$2]] (dagiti rebision aginggana iti $3)",
        "revertmerge": "Pagsinaen",
-       "mergelogpagetext": "Adda dita baba ti listaan dagiti kinaudian a panagtipon ti maysa a panid ti pakasaritaan iti maysa a sabali.",
-       "history-title": "Panagbalbaliw a pakasaritaan iti \"$1\"",
-       "difference-title": "Paggiddiatan a nagbaetan dagiti panagbalbaliw iti \"$1\"",
+       "mergelogpagetext": "Dita baba ket ti listaan dagiti kaudian a panagtipon ti maysa a pakasaritaan ti panid iti sabali.",
+       "history-title": "Pakasaritaan a rebision iti \"$1\"",
+       "difference-title": "Paggiddiatan a nagbaetan dagiti rebision iti \"$1\"",
        "difference-title-multipage": "Paggiddiatan a nagbaetan dagiti panid  \"$1\" ken \"$2\"",
        "difference-multipage": "(Paggiddiatan dagiti panid)",
        "lineno": "Linia $1:",
-       "compareselectedversions": "Ipada dagiti pinili a binaliwan",
-       "showhideselectedversions": "Ipakita/ilemmeng dagiti napili a nabaliwan",
+       "compareselectedversions": "Ipada dagiti pinili a rebision",
+       "showhideselectedversions": "Ipakita/ilemmeng dagiti napili a rebision",
        "editundo": "ibabawi",
-       "diff-empty": "(Awan ti paggiddiatan)",
-       "diff-multi-sameuser": "({{PLURAL:$1|Maysa nga agtengnga a panagbaliw|Dagiti $1 nga agtengnga a panagbaliw}} babaen ti isu met laeng nga agar-aramat a saan a naipakita)",
-       "diff-multi-otherusers": "({{PLURAL:$1|Maysa nga agtengnga a panagbaliw|Dagiti $1 nga agtengnga a panagbaliw}} babaen {{PLURAL:$2|ti maysa a sabali nga agar-aramat|dagiti $2 nga agar-aramat}} a saan a naipakita)",
-       "diff-multi-manyusers": "({{PLURAL:$1|Maysa nga agtengnga a panangbalbaliw|Dagiti $1 nga agtengnga a panangbalbaliw}} babaen ti ad-adu ngem $2 {{PLURAL:$2|nga agar-aramat|kadagiti agar-aramat}} ti saan a naipakita)",
-       "difference-missing-revision": "{{PLURAL:$2|Maysa a panagbalbaliw|$2 kadagiti panagbalbaliw}} iti daytoy a paggiddiatan ($1) {{PLURAL:$2|ket ti|ket dagiti}} saan a naburikan.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a nabaak a panilpo tipaggiddiatan ti maysa a panid a naikkaten.\nDagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
+       "diff-empty": "(Awan paggiddiatan)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Maysa nga agtengnga a rebision|Dagiti $1 nga agtengnga a rebision}} babaen ti isu met laeng nga agar-aramat a saan a naipakita)",
+       "diff-multi-otherusers": "({{PLURAL:$1|Maysa nga agtengnga a rebision|Dagiti $1 nga agtengnga a rebision}} babaen {{PLURAL:$2|ti maysa a sabali nga agar-aramat|dagiti $2 nga agar-aramat}} a saan a naipakita)",
+       "diff-multi-manyusers": "({{PLURAL:$1|Maysa nga agtengnga a rebision|Dagiti $1 nga agtengnga a rebision}} babaen ti ad-adu ngem $2 {{PLURAL:$2|nga agar-aramat|kadagiti agar-aramat}} ti saan a naipakita)",
+       "difference-missing-revision": "{{PLURAL:$2|Maysa a rebision|$2 kadagiti rebision}} iti daytoy a paggiddiatan ($1) {{PLURAL:$2|ket ti|ket dagiti}} saan a naburikan.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a nabaak a silpo ti paggiddiatan ti maysa a panid a naikkaten.\nDagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
        "searchresults": "Dagiti nagbanagan ti panagbiruk",
        "searchresults-title": "Dagiti nabirukan a nagbanagan para iti \"$1\"",
        "titlematches": "Dagiti kapadpada a titulo ti panid",
        "textmatches": "Dagiti agpapada a testo ti panid",
        "notextmatches": "Awan dagiti kapadpada a testo ti panid",
-       "prevn": "napalabas {{PLURAL:$1|$1}}",
-       "nextn": "sumaruno {{PLURAL:$1|$1}}",
+       "prevn": "napalabas {{PLURAL:$1|$1}}",
+       "nextn": "sumaruno {{PLURAL:$1|$1}}",
        "prevn-title": "Napalabas a $1 {{PLURAL:$1|a nagbanagan|kadagiti nagbanagan}}",
        "nextn-title": "Sumaruno a $1 {{PLURAL:$1|a nagbanagan|kadagiti nagbanagan}}",
        "shown-title": "Ipakita ti $1 {{PLURAL:$1|a nagbanagan|kadagiti nagbanagan}}  ti tunggal maysa a panid",
-       "viewprevnext": "Kitaen ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchmenu-exists": "'''Adda panid a nanaganan ti \"[[:$1]]\" iti daytoy a wiki.'''",
+       "viewprevnext": "Kitaen dagiti ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-exists": "<strong>Adda panid a nanaganan ti \"[[:$1]]\" iti daytoy a wiki.</strong> {{PLURAL:$2|0=|Kitaen pay ti sabali a nabirukan a nagbanagan ti panagbiruk.}}",
        "searchmenu-new": "<strong>Partuaten ti panid ti \"[[:$1]]\" iti daytoy a wiki!</strong> {{PLURAL:$2|0=|Kitaen pay ti panid a nabirukan ti panagbirukmo.|Kitaen pay dagiti resulta a nabirukan ti panagbiruk.}}",
        "searchprofile-articles": "Dagiti naglaon a panid",
-       "searchprofile-images": "Sabsabali a midia",
+       "searchprofile-images": "Multimidia",
        "searchprofile-everything": "Amin amin",
        "searchprofile-advanced": "Napasayaat",
        "searchprofile-articles-tooltip": "Agbirukka idiay $1",
        "searchprofile-images-tooltip": "Agbirukka para iti papeles",
-       "searchprofile-everything-tooltip": "Birukem amin a linaon (uray dagiti makipatangan a panid)",
-       "searchprofile-advanced-tooltip": "Agbirukka kadagiti naiduma a \"nagan ti espasio\"",
+       "searchprofile-everything-tooltip": "Birukem amin a linaon (uray dagiti tungtungan a panid)",
+       "searchprofile-advanced-tooltip": "Agbirukka kadagiti naiduma a nagan ti espasio",
        "search-result-size": "$1 ({{PLURAL:$2|iti 1 a balikas|kadagiti $2 a balikas}})",
-       "search-result-category-size": "{{PLURAL:$1|1 a kameng| dagiti $1 a kameng}} ({{PLURAL:$2|1 a subkategoria|dagiti $2  a sukategoria}}, {{PLURAL:$3|1 a papeles|dagiti $3 a papeles}})",
+       "search-result-category-size": "{{PLURAL:$1|1 a kameng| dagiti $1 a kameng}} ({{PLURAL:$2|1 a subkategoria|dagiti $2  a subkategoria}}, {{PLURAL:$3|1 a papeles|dagiti $3 a papeles}})",
        "search-result-score": "Kaitutopan: $1%",
-       "search-redirect": "(ibaw-ing ti $1)",
+       "search-redirect": "(baw-ing ti $1)",
        "search-section": "(paset $1)",
        "search-file-match": "(maipada ti linaon a papeles)",
        "search-suggest": "Daytoy kadi: $1",
        "search-relatedarticle": "Mainaig",
        "searchrelated": "mainaig",
        "searchall": "amin",
-       "showingresults": "Maiparang dita baba agingga {{PLURAL:$1|iti '''1''' a nagbanagan|dagiti '''$1''' a nagbanagan}} a mangrugi iti #'''$2'''.",
+       "showingresults": "Maiparang dita baba agingga {{PLURAL:$1|iti <strong>1</strong> a nagbanagan|dagiti <strong>$1</strong> a nagbanagan}} a mangrugi ti #<strong>$2</strong>.",
        "showingresultsinrange": "Mangipakpakita aginggana {{PLURAL:$1|iti <strong>1</strong> a resulta|dagiti <strong>$1</strong> a resulta}} iti sakop ti #<strong>$2</strong> aginggana ti #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Nagbanagan a '''$1''' iti '''$3'''|Dagiti Nagbanagan a '''$1 - $2''' iti '''$3'''}} para iti '''$4'''",
-       "search-nonefound": "Awan ti nagbanagan a kapadpada ti sinapul.",
+       "showingresultsheader": "{{PLURAL:$5|Nagbanagan a <strong>$1</strong> iti <strong>$3</strong>|Dagiti Nagbanagan a <strong>$1 - $2</strong> iti <strong>$3</strong>}} para iti <strong>$4</strong>",
+       "search-nonefound": "Awan dagiti nagbanagan a maipada ti usisa.",
        "powersearch-legend": "Napasayat a panagbiruk",
-       "powersearch-ns": "Agbirukka kadagiti nagan ti espasio:",
+       "powersearch-ns": "Agbiruk kadagiti nagan ti espasio:",
        "powersearch-togglelabel": "Markaan:",
        "powersearch-toggleall": "Amin",
        "powersearch-togglenone": "Awan",
        "powersearch-remember": "Lagipen ti napili para kadagiti masakbayan a panagbiruk",
        "search-external": "Akinruar a panagbiruk",
        "searchdisabled": "Ti panagbiruk iti {{SITENAME}} ket nabaldado.\nMabalinmo ti agbiruk idiay Google tattan.\nLaglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.",
-       "search-error": "Adda maysa a biddut  napasamak bayat nga agbirbiruk:$1",
+       "search-error": "Adda maysa a biddut a napasamak bayat nga agbirbiruk:$1",
        "preferences": "Kakaykayatan",
        "mypreferences": "Kakaykayatan",
        "prefs-edits": "Bilang dagiti inurnos:",
        "prefs-labs": "Dagiti subokan a langa",
        "prefs-user-pages": "Dagiti panid ti agar-aramat",
        "prefs-personal": "Bariweswes ti agar-aramat",
-       "prefs-rc": "Kinaudi a binalbaliwan",
+       "prefs-rc": "Kaudian a balbaliw",
        "prefs-watchlist": "Listaan ti bambantayan",
-       "prefs-watchlist-days": "Al-aldaw nga iparang idiay listaan ti bambantayan:",
+       "prefs-watchlist-days": "Al-aldaw nga iparang iti listaan ti bambantayan:",
        "prefs-watchlist-days-max": "Kapaut nga $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}}",
-       "prefs-watchlist-edits": "Kaadu a bilang ti ipakita kadagiti sinukatan iti napadakkel a bambantayan:",
+       "prefs-watchlist-edits": "Kaadu a bilang ti ipakita kadagiti sinukatan iti napadakkel a listaan ti bambantayan:",
        "prefs-watchlist-edits-max": "Kaadu a bilang: 1000",
-       "prefs-watchlist-token": "Tandaan ti bambantayan:",
+       "prefs-watchlist-token": "Tandaan ti listaan ti bambantayan:",
        "prefs-misc": "Sabsabali",
        "prefs-resetpass": "Sukatan ti kontrasenias",
        "prefs-changeemail": "Sukatan ti esurat a pagtaengan",
-       "prefs-setemail": "Ikabil ti esurat a pagtaengan",
-       "prefs-email": "Pagpilian ti esurat",
+       "prefs-setemail": "Isaad ti esurat a pagtaengan",
+       "prefs-email": "Dagiti pagpilian ti esurat",
        "prefs-rendering": "Tabas",
        "saveprefs": "Idulin",
-       "restoreprefs": "Isubli amin dagiti kasisigud a pannakaiyasentar (kadagiti amin a paset)",
+       "restoreprefs": "Isubli amin dagiti kasisigud a pannakaisaad (kadagiti amin a paset)",
        "prefs-editing": "Ur-urnosen",
        "rows": "Ar-aray:",
        "columns": "Tuk-tukol:",
        "searchresultshead": "Biruken",
        "stub-threshold": "Pagpatinggaan para iti panagporma ti <a href=\"#\" class=\"stub\">pungol a silpo</a> (dagiti byte):",
        "stub-threshold-disabled": "Nabaldado",
-       "recentchangesdays": "Al-aldaw nga ipakita dagiti kinaudi a binalbaliwan:",
+       "recentchangesdays": "Al-aldaw nga ipakita iti kaudian a balbaliw:",
        "recentchangesdays-max": "Kapaut nga $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}}",
-       "recentchangescount": "Dagiti bilang dagiti naurnos a kinasigud a maiparang:",
-       "prefs-help-recentchangescount": "Nairaman dagiti kinaudian a baliwan, dagiti pakasaritaan ti panid, ken dagiti listaan.",
-       "prefs-help-watchlist-token2": "Daytoy ti sekreto a tulbek iti pakan ti web iti listaan ti banbantayam.\nTi sinoman a makaammo daytoy ket mabalinda a basaen ti listaan ti banbantayam, isunga saanmo nga ipabingay.\n[[Special:ResetTokens|Pindutem ditoy no kayatmo nga iyasentar manen]].",
+       "recentchangescount": "Bilang dagiti inurnos nga ipakita babaen ti kinasigud:",
+       "prefs-help-recentchangescount": "Daytoy ket mangiraman iti kaudian a balbaliw, dagiti pakasaritaan ti panid, ken dagiti listaan.",
+       "prefs-help-watchlist-token2": "Daytoy ti sekreto a tulbek iti pakan ti web iti listaan ti bambantayam.\nTi sinoman a makaammo daytoy ket mabalinda a basaen ti listaan ti bambantayam, isu a saanmo nga ipabingay.\nNo masapulmo, [[Special:ResetTokens|mabalinmo nga isaad manen]].",
        "savedprefs": "Naidulinen dagiti kakaykayatam.",
        "timezonelegend": "Sona ti oras:",
        "localtime": "Lokal nga oras:",
-       "timezoneuseserverdefault": "Usaren ti wiki a kasisigud ($1)",
-       "timezoneuseoffset": "Sabsabali (inaganan ti tangdan)",
+       "timezoneuseserverdefault": "Usaren ti kasisigud ti wiki ($1)",
+       "timezoneuseoffset": "Sabali (inaganan ti timbengan)",
        "servertime": "Oras ti server:",
-       "guesstimezone": "Agikabil manipud idiay pabasabasam",
+       "guesstimezone": "Punuen manipud ti pagbasabasa",
        "timezoneregion-africa": "Aprika",
        "timezoneregion-america": "Amerika",
        "timezoneregion-antarctica": "Antartika",
        "timezoneregion-europe": "Europa",
        "timezoneregion-indian": "Taaw Indiano",
        "timezoneregion-pacific": "Taaw Pasipiko",
-       "allowemail": "Pakabaelam ti esurat a naggapu kadagiti sabali nga agar-aramat",
+       "allowemail": "Pakabaelam ti esurat a naggapo kadagiti sabali nga agar-aramat",
        "prefs-searchoptions": "Biruken",
        "prefs-namespaces": "Dagiti nagan ti espasio",
        "default": "kasisigud",
        "prefs-custom-css": "Naiduma a CSS",
        "prefs-custom-js": "Naiduma a JavaScript",
        "prefs-common-css-js": "Bingay a CSS/JavaScript dagiti amin a kudil:",
-       "prefs-reset-intro": "Mabalinmo nga usaren daytoy a panid tapno maisublim dagita kakaykayatam iti kasisigud ti daytoy a wiki.\nNgem saanto a mabalinen nga ipasubli.",
+       "prefs-reset-intro": "Mabalinmo nga usaren daytoy a panid tapno maisublim dagita kakaykayatam iti kasisigud iti daytoy a wiki.\nNgem saanto a mabalinen nga ipasubli.",
        "prefs-emailconfirm-label": "Pammasingked ti esurat:",
        "youremail": "Esurat:",
        "username": "{{GENDER:$1|Nagan ti agar-aramat}}:",
        "yourrealname": "Pudno a nagan:",
        "yourlanguage": "Pagsasao:",
        "yourvariant": "Linaon ti sabali a pagsasao:",
-       "prefs-help-variant": "Ti kinaykayatmo a kita ti pagsasao wenno sabali a panagsurat a maipakita kadagiti linaon ti panid daytoy a wiki.",
+       "prefs-help-variant": "Ti kinaykayatmo a kita ti pagsasao wenno sabali a panagsurat a maipakita kadagiti linaon ti panid iti daytoy a wiki.",
        "yournick": "Baro a pirma:",
-       "prefs-help-signature": "Dagiti komentario kadagiti tungtungan a panid ket mapirmaan koma iti \"<nowiki>~~~~</nowiki>\" nga agpabalin ti pirmam ken ti petsa.",
-       "badsig": "Saan a pudno a kilaw a pirma.\nIkur-it dagiti HTML nga etiketa.",
-       "badsiglength": "Atiddog unay ti pirmam.\nMasapul a nababbaba ngem $1 {{PLURAL:$1| a karakter|kadagiti karakter}} ti kaatiddogna.",
+       "prefs-help-signature": "Dagiti komentario kadagiti tungtungan a panid ket mapirmaan koma iti \"<nowiki>~~~~</nowiki>\" a pabaliwento iti pirmam ken ti petsa.",
+       "badsig": "Imbalido a naata a pirma.\nKitaen dagiti etiketa ti HTML.",
+       "badsiglength": "Atiddog unay ti pirmam.\nMasapul a saan nga ad-adu ngem $1 {{PLURAL:$1| a karakter|a karkarakter}} ti kaatiddogna.",
        "yourgender": "Kasano kadi ti kayatmo a pannakaibaga?",
        "gender-unknown": "Kaykayatko a saan nga ibaga",
        "gender-male": "Isuna ket lalaki nga agur-urnos ti pampanid ti wiki",
        "gender-female": "Isuna ket babai nga agur-urnos ti pampanid ti wiki",
-       "prefs-help-gender": "Ti panangiyasentar daytoy a kakaykayatan ket saan a nasken.\nTi sopwer ket agus-usar ti pategna daytoy ti panagtawagna kenka ken ti panangibaga ti dadduma ti maitunos gramatika a panangibaga kenka.\nDaytoy a pakaammo ket makita ti publiko.",
+       "prefs-help-gender": "Ti panangisaad daytoy a kakaykayatan ket saan a nasken.\nTi sopwer ket agus-usar iti pategna tapno tawagannaka ken ibaganaka kadagiti sabali nga agus-usar iti maitunos gramatika ti henero.\nDaytoy a pakaammo ket makitanto iti publiko.",
        "email": "Esurat",
-       "prefs-help-realname": "Saan a nasken ti pudno a nagan.\nNgem no kayatmo nga ited, maaramat daytoy a kas pammadayaw ken pangpatalged iti obram.",
-       "prefs-help-email": "Ti esurat a pagtaengan ket saan a masapul, ngem masapul no agsukatka ti kontrasenias, no baka malipatam ti kontraseniasmo.",
-       "prefs-help-email-others": "Mabalinmo nga agpili tapno dagiti sabsabali nga agar-aramat ket ma esuratandaka idiay panagsilpo ti panidmo wenno ti panid ti tungtungam.\nTi esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak kenka.",
-       "prefs-help-email-required": "Masapul ti e-surat a pagtaengan.",
+       "prefs-help-realname": "Saan a nasken ti pudno a nagan.\nNgem no kayatmo nga ited, maaramatto daytoy a kas pammadayaw ken pangpatalged para iti obram.",
+       "prefs-help-email": "Ti esurat a pagtaengan ket saan a masapul, ngem masapul kadagiti panangisaad manen ti kontrasenias, no malipatam ti kontraseniasmo.",
+       "prefs-help-email-others": "Mabalinmo pay ti agpili tapno dagiti sabali nga agar-aramat ket mabalin nga esuratandaka babaen ti silpo ti panidmo wenno ti panid ti tungtungam.\nTi esurat a pagtaengam ket saan a maipakita no agkontak kenka dagiti agar-aramat.",
+       "prefs-help-email-required": "Masapul ti esurat a pagtaengan.",
        "prefs-info": "Kangrunaan a pakaammo",
        "prefs-i18n": "Internasionalisasion",
        "prefs-signature": "Pirma",
-       "prefs-dateformat": "Kita ti petsa",
-       "prefs-timeoffset": "Tangda ti oras",
+       "prefs-dateformat": "Pormat ti petsa",
+       "prefs-timeoffset": "Timbengan ti oras",
        "prefs-advancedediting": "Dagiti sapasap a pagpilian",
        "prefs-editor": "Mannurat",
        "prefs-preview": "Ipadas",
        "prefs-displayrc": "Ipakita dagiti pagpilian",
        "prefs-displaywatchlist": "Ipakita dagiti pagpilian",
        "prefs-tokenwatchlist": "Tandaan",
-       "prefs-diffs": "Sabali",
+       "prefs-diffs": "Paggigiddiatan",
        "prefs-help-prefershttps": "Daytoy a kakaykayatan ket mapakabaelanto iti sumaruno nga iseserrekmo.",
        "prefs-tabs-navigation-hint": "Pakaammo: Mabalinmo nga usaren dagiti kanigid ken kanawan a tekla ti pana tapno madaliasat ti baetan dagiti etiketa iti listaan dagiti etiketa.",
        "email-address-validity-valid": "Ti esurat a pagtaengan ket kasla umiso",
        "email-address-validity-invalid": "Ikabil ti umiso nga esurat a pagtaengan",
        "userrights": "Panagtaripato kadagiti karbengan ti agar-aramat",
        "userrights-lookup-user": "Agtaripato kadagiti grupo ti agar-aramat",
-       "userrights-user-editname": "Mangiserrek iti nagan-agar-aramat:",
+       "userrights-user-editname": "Mangiserrek iti nagan ti agar-aramat:",
        "editusergroup": "Urnosen dagiti grupo ti agar-aramat",
-       "editinguser": "Suksukatan ti karbengan ti agar-aramat ni '''[[User:$1|$1]]''' $2",
+       "editinguser": "Suksukatan ti karbengan ti agar-aramat ni '''[[User:$1|$1]]''' $2",
        "userrights-editusergroup": "Urnosen dagiti grupo ti agar-aramat",
        "saveusergroups": "Idulin dagiti grupo ti agar-aramat",
        "userrights-groupsmember": "Kameng iti:",
        "userrights-groupsmember-auto": "Napudno a kameng iti:",
-       "userrights-groups-help": "Mabaliwam dagiti ayan a grupo ti agar-aramat:\n* Ti nakur-it a kahon ket kayatna a saoen nga adda ti agar-aramat dita a grupo.\n* Ti saan a nakur-it a kahon ket kayatna a saoen nga awan ti agar-aramat dita a grupo.\n* A * ti kunana ket saanmo a maikkat ti grupo no nainayonmon, wenno pagbalittaden.",
+       "userrights-groups-help": "Mabaliwam dagiti ayan a grupo ti agar-aramat:\n* Ti nakur-it a kahon ket kayatna a saoen nga adda ti agar-aramat dita a grupo.\n* Ti saan a nakur-it a kahon ket kayatna a saoen nga awan ti agar-aramat dita a grupo.\n* A * mangipakita a saanmo a maikkat ti grupo no nainayonmon, wenno pagbalittaden.",
        "userrights-reason": "Rason:",
        "userrights-no-interwiki": "Awan ti pammalubosmo nga agurnos ti karbengan ti agar-aramat kadagiti sabali a wiki.",
        "userrights-nodatabase": "Awan ti database a $1 wenno saan a lokal.",
-       "userrights-nologin": "Masapul a [[Special:UserLogin|sumrekka]] nga adda pakabilangan nga administrador ti magted kadagiti karbengan ti agar-aramat.",
+       "userrights-nologin": "Masapul a [[Special:UserLogin|sumrekka]] nga addaan iti pakabilangan ti administrador tapno makaited kadagiti karbengan ti agar-aramat.",
        "userrights-notallowed": "Awan ti pammalubos nga agnayon wenno agikkat kadagiti karbengan ti agar-aramat.",
        "userrights-changeable-col": "Dagiti grupo a mabalinmo a baliwan",
        "userrights-unchangeable-col": "Dagiti grupo a dimo mabalin a baliwan",
        "userrights-conflict": "Suppiat dagiti panagbaliw kadagiti karbengan ti agar-aramat! Pangngaasi nga irepasom ken pasingkedam dagiti sinuksukatam.",
-       "userrights-removed-self": "Nagballigika a nagikkat kadagiti karbengam. Isu a kastoyen ket saanmo a mabalin a pastrekan daytoy a panid.",
+       "userrights-removed-self": "Nagballigika a nagikkat kadagiti bukodmo a karbengan. Iti kastoyen, saankan a mabalin a mangserrek iti daytoy a panid.",
        "group": "Grupo:",
        "group-user": "Dagiti agar-aramat",
        "group-autoconfirmed": "Dagiti automatiko a napasingkedan nga agar-aramat",
        "grouppage-suppress": "{{ns:project}}:Pagpansin",
        "right-read": "Basaen dagiti panid",
        "right-edit": "Agurnos kadagiti panid",
-       "right-createpage": "Agaramid kadagiti panid (saan a pagtutungtongan a pampanid)",
-       "right-createtalk": "Agaramid ti pagtungtungan a pampanid",
-       "right-createaccount": "Agaramid kadagiti baro a pakabilangan ti agar-aramat",
-       "right-minoredit": "Markaan a bassit dagiti inurnos",
-       "right-move": "Iyalis dagiti panid",
-       "right-move-subpages": "Iyalis dagiti panid a kakuyog dagiti subpanidda.",
-       "right-move-rootuserpages": "Iyalis dagiti ramut a panid ti agar-aramat",
-       "right-move-categorypages": "Iyalis ti pampanid ti kategoria",
-       "right-movefile": "Iyalis dagiti papeles",
-       "right-suppressredirect": "Saan nga agaramid ti baw-ing a naggapo iti taudan no iyalis dagiti panid",
-       "right-upload": "Agipan ti papeles",
-       "right-reupload": "Suratam manen dagiti adda a papeles",
-       "right-reupload-own": "Pasuratam manen dagiti addaan ti pinag-ipanmo a papeles",
-       "right-reupload-shared": "Paawanen dagiti papeles idiay pagbingayan ti nakaikabilan ti midia a lokal",
-       "right-upload_by_url": "Pag-ipan ti papeles a naggapu ti URL",
-       "right-purge": "Purgaen ti pagidulinan ti pagsaadan a ti panid nga awan ti panagpasingked",
-       "right-autoconfirmed": "Saanto a mabanagan babaen dagiti patingga ti gatad a naibatay ti IP",
-       "right-bot": "Matrato a kas automatiko a pamay-an",
+       "right-createpage": "Agpartuat kadagiti panid (saan a pagtutungtongan a pampanid)",
+       "right-createtalk": "Agpartuat ti pagtungtungan a pampanid",
+       "right-createaccount": "Agpartuat kadagiti baro a pakabilangan ti agar-aramat",
+       "right-minoredit": "Markaan dagiti inurnos a kas bassit",
+       "right-move": "Agiyalis kadagiti panid",
+       "right-move-subpages": "Agiyalis kadagiti panid a kakuyog dagiti subpanidda",
+       "right-move-rootuserpages": "Agiyalis kadagiti ramut a panid ti agar-aramat",
+       "right-move-categorypages": "Agiyalis ti pampanid ti kategoria",
+       "right-movefile": "Agiyalis kadagiti papeles",
+       "right-suppressredirect": "Saan nga agpartuat kadagiti baw-ing manipud ti taudan ti pampanid no agiyalis kadagiti panid",
+       "right-upload": "Agikarga kadagiti papeles",
+       "right-reupload": "Agisurat manen kadagiti addan a papeles",
+       "right-reupload-own": "Agisurat manen kadagiti addan a papeles a bukod nga inkarga",
+       "right-reupload-shared": "Lokal a mangtuon kadagiti papeles idiay pagbingayan a repsitorio ti midia",
+       "right-upload_by_url": "Agikarga kadagiti papeles manipud ti URL",
+       "right-purge": "Agpurga ti cache ti sitio para iti panid nga awan ti pammasingked",
+       "right-autoconfirmed": "Saan a mabanagan babaen dagiti patingga ti gatad a naibatay ti IP",
+       "right-bot": "Matrato a kas maysa nga automatiko a proseso",
        "right-nominornewtalk": "Nga awanan ti bassit a panagurnos dagiti tungtungan a panid ti mangkalbit dagiti agpakabil ti baro a mensahe",
-       "right-apihighlimits": "Agusar ti nangatngato a patingga kadagiti panagsapul ti API.",
+       "right-apihighlimits": "Agusar kadagiti nangatngato a patingga kadagiti usisa ti API.",
        "right-writeapi": "Panagusar ti panagsurat nga API",
-       "right-delete": "Ikkaten dagiti panid",
-       "right-bigdelete": "Ikkaten dagiti panid nga adda dagiti dakkel a pakasaritaanna",
-       "right-deletelogentry": "Ikkaten ken isubli ti panagikkat dagiti naisangsangayan a naikabil ti listaan",
-       "right-deleterevision": "Ikkaten ken ipasubli dagiti nainagan a panagbaliw ti panid",
-       "right-deletedhistory": "Kitaen dagiti naikabil a pakasaritaan, nga awan kaniada kadagiti nairaman a testo",
-       "right-deletedtext": "Kitaen dagiti naikkat a testo ken dagiti nasukatan a nagbaetan dagiti binaliwan",
-       "right-browsearchive": "Biruken dagiti naikkat a panid",
-       "right-undelete": "Isubli ti naikkat a panid",
-       "right-suppressrevision": "Kitaen ken ipasubli dagiti binaliwan a nailemmeng manipud kadagiti administrador",
-       "right-suppressionlog": "Kitaen dagita pribado a listaan",
-       "right-block": "Serraan dagiti sabali nga agar-aramat manipud iti panag-urnos",
-       "right-blockemail": "Serraan dagiti agar-aramat nga agpatulod manipud ti esurat",
-       "right-hideuser": "Serraan ti maysa a nagan ti agar-aramat, ilemmeng manipud ti publiko",
-       "right-ipblock-exempt": "Labsan dagiti IP a serra, dagiti automatiko a serra ken dagiti nasakup a serra.",
-       "right-proxyunbannable": "Labsan dagiti automatiko a serra dagiti pannakbagi",
-       "right-unblockself": "Ikkaten ti kabukbukodan a pannaka-serra",
-       "right-protect": "Sukatan dagiti agpang ti salaknib ken urnosen dagiti nasalakniban ti sariap a panid",
-       "right-editprotected": "Urnosen dagiti panid a nasalakniban a kas \"{{int:protect-level-sysop}}\"",
-       "right-editsemiprotected": "Urnosen dagiti panid a nasalakniban a kas \"{{int:protect-level-autoconfirmed}}\"",
-       "right-editinterface": "Urnosen ti \"interface\" ti agar-aramat",
-       "right-editusercssjs": "Urnosen dagiti CSS ken JavaScript a papeles dagiti sabsabali nga agar-aramat",
-       "right-editusercss": "Urnosen dagiti CSS a papeles dagiti sabsabali nga agar-aramat",
-       "right-edituserjs": "Urnosen dagiti JavaScript a papeles dagiti sabsabali nga agar-aramat",
-       "right-editmyusercss": "Urnosem dagiti bukodmo a papeles ti CSS ti agar-aramat",
-       "right-editmyuserjs": "Urnosem dagiti bukodmo a papeles ti JavaScript ti agar-aramat",
-       "right-viewmywatchlist": "Kitaem ti bukodmo a listaan ti banbantayan",
-       "right-editmywatchlist": "Urnosem ti bukodmo a listaan ti agar-aramat. Laglagipen nga adda dagiti tignay a mangnayonto pay laeng ti pampanid urayno awan daytoy a karbengan.",
-       "right-viewmyprivateinfo": "Kitaem ti bukodmo a pribado a datos (kasla ti esurat a pagtaengan, pudno a nagan)",
-       "right-editmyprivateinfo": "Urnosem ti bukodmo a pribado a datos (kasla ti esurat a pagtaengan, pudno a nagan)",
-       "right-editmyoptions": "Urnosem dagiti bukodmo a kakaykayatan",
-       "right-rollback": "Pardasan nga ipasubli dagiti inurnos ti naudi nga agar-aramat a nagurnos ti kakasta a panid",
-       "right-markbotedits": "Markaan dagiti napasubli nga urnos a kas inurnos dagiti bot",
-       "right-noratelimit": "Saan a maaringan kadagiti patingga a pagpataray",
-       "right-import": "Agala ti pampanid manipud kadagiti sabsabali a wiki",
-       "right-importupload": "Agala kadagiti panid a naggapu iti papeles ti pinag-ipan",
-       "right-patrol": "Markaan a kas napatruliaan dagiti inurnos ti dadduma",
-       "right-autopatrol": "Dagiti inurnosmo ket mamarkaan nga automatiko a kas napatruliaan",
-       "right-patrolmarks": "Kitaen dagiti kinaudian a binaliwan a  napatruliaan a marka",
-       "right-unwatchedpages": "Kitaen ti listaan dagiti saan a nabambantayan a panid",
-       "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 esurat kadagiti sabali nga agar-aramat",
-       "right-passwordreset": "Kitaen dagiti esurat a panangiyasentar manen kadagiti kontrasenias",
-       "newuserlogpage": "Listaan dagiti naaramid nga agar-aramat",
-       "newuserlogpagetext": "Daytoy ket listaan ti pannakaramid dagiti agar-aramat.",
+       "right-delete": "Agikkat kadagiti panid",
+       "right-bigdelete": "Agikkat kadagiti panid nga addaan kadagiti dakkel a pakasaritaan",
+       "right-deletelogentry": "Agikkat ken agisubli iti panagikkat kadagiti naisangsangayan a naikabil ti listaan",
+       "right-deleterevision": "Agikkat ken agisubli kadagiti naisangayan a rebision ti panid",
+       "right-deletedhistory": "Agkita kadagiti naikabil a naikkat a pakasaritaan, nga awan kadagiti mainaig a testo",
+       "right-deletedtext": "Agkita kadagiti naikkat a testo ken dagiti nasukatan a nagbaetan dagiti naikkat a rebision",
+       "right-browsearchive": "Agbiruk kadagiti naikkat a panid",
+       "right-undelete": "Agisubli ti pannakaikkat ti panid",
+       "right-suppressrevision": "Agkita, agilemmeng ken agisubli ti pannakakita dagiti naisangayan a rebision dagiti panid manipud ti sinoman nga agar-aramat",
+       "right-viewsuppressed": "Agkita kadagiti rebision a nailemmeng manipud ti sinoman nga agar-aramat",
+       "right-suppressionlog": "Agkita kadagiti pribado a listaan",
+       "right-block": "Agserra kadagiti sabali nga agar-aramat manipud iti panag-urnos",
+       "right-blockemail": "Agserra iti agar-aramat manipud ti panagipatulod ti esurat",
+       "right-hideuser": "Agserra iti nagan ti agar-aramat, ken agilemmeng manipud ti publiko",
+       "right-ipblock-exempt": "Labsanna dagiti serra ti IP, dagiti automatiko a serra ken dagiti sakop a serra.",
+       "right-proxyunbannable": "Labsanna dagiti automatiko a serra dagiti pannakbagi",
+       "right-unblockself": "Bukod nga agikkat it pannaka-serra",
+       "right-protect": "Agsukat kadagiti agpang ti salaknib ken agurnos kadagiti nasalakniban ti sariap a panid",
+       "right-editprotected": "Agurnos kadagiti panid a nasalakniban a kas \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "Agurnos kadagiti panid a nasalakniban a kas \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editinterface": "Agurnos iti interface ti agar-aramat",
+       "right-editusercssjs": "Agurnos kadagiti papales ti CSS ken JavaScript dagiti sabali nga agar-aramat",
+       "right-editusercss": "Agurnos kadagiti papeles ti CSS dagiti sabali nga agar-aramat",
+       "right-edituserjs": "Agurnos kadagiti papales ti JavaScript dagiti sabali nga agar-aramat",
+       "right-editmyusercss": "Agurnos kadagiti bukodmo a papeles ti CSS ti agar-aramat",
+       "right-editmyuserjs": "Agurnos kadagiti bukodmo a papeles ti JavaScript ti agar-aramat",
+       "right-viewmywatchlist": "Agkita iti bukodmo a listaan ti bambantayan",
+       "right-editmywatchlist": "Agurnos iti bukodmo a listaan ti bambantayan. Laglagipen nga adda dagiti tignay a mangnayonto pay laeng ti pampanid urayno awan daytoy a karbengan.",
+       "right-viewmyprivateinfo": "Agkita iti bukodmo a pribado a datos (kasla ti esurat a pagtaengan, pudno a nagan)",
+       "right-editmyprivateinfo": "Agurnos iti bukodmo a pribado a datos (kasla ti esurat a pagtaengan, pudno a nagan)",
+       "right-editmyoptions": "Agurnos kadagiti bukodmo a kakaykayatan",
+       "right-rollback": "Napardas a mangisubli kadagiti inurnos ti naudi nga agar-aramat a nagurnos iti naisangayan a panid",
+       "right-markbotedits": "Agmarka kadagiti naipasubli nga urnos a kas inurnos dagiti bot",
+       "right-noratelimit": "Saan a maaringan babaen dagiti patingga ti gatad",
+       "right-import": "Agala ti pampanid manipud kadagiti sabali a wiki",
+       "right-importupload": "Agala kadagiti panid manipud ti naikarga a papeles",
+       "right-patrol": "Markaanna dagiti inurnos ti dadduma a kas napatruliaan",
+       "right-autopatrol": "Automatiko a mamarkaanna ti bukod nga inurnos a kas napatruliaan",
+       "right-patrolmarks": "Agkita kadagiti kaudian a binaliwan dagiti marka ti napatruliaan",
+       "right-unwatchedpages": "Agkita ti listaan dagiti saan a nabambantayan a panid",
+       "right-mergehistory": "Mangitipon ti pakasaritaan dagiti panid",
+       "right-userrights": "Agurnos kadagiti amin a karbengan ti agar-aramat",
+       "right-userrights-interwiki": "Agurnos kadagiti karbengan ti agar-aramat kadagiti agar-aramat iti sabsabali a wiki",
+       "right-siteadmin": "Mangikandado ken manglukat iti database",
+       "right-override-export-depth": "Agipan kadagiti panid a mairaman dagiti naisilpo a panid agingana iti kauneg ti 5",
+       "right-sendemail": "Agipatulod ti esurat kadagiti sabali nga agar-aramat",
+       "right-passwordreset": "Agkita kadagiti esurat ti panangisaad manen ti kontrasenias",
+       "newuserlogpage": "Listaan ti panagpartuat ti agar-aramat",
+       "newuserlogpagetext": "Daytoy ket listaan dagiti pannakapartuat iti agar-aramat.",
        "rightslog": "Listaan dagiti karbengan ti agar-aramat",
        "rightslogtext": "Daytoy ket listaan dagiti sinukatan a karbengan ti agar-aramat.",
-       "action-read": "basaen datoy a panid",
-       "action-edit": "agurnos iti datoy a panid",
+       "action-read": "agbasa iti datoy a panid",
+       "action-edit": "agurnos iti daytoy a panid",
        "action-createpage": "agpartuat kadagiti panid",
-       "action-createtalk": "agaramid kadagiti pagtungtungan a panid",
-       "action-createaccount": "agpartuat ti pakabilangan daytoy nga agar-aramat",
-       "action-history": "kitaen ti pakasaritaan daytoy a panid",
-       "action-minoredit": "markaam a bassit nga urnos daytoy",
-       "action-move": "iyalis daytoy a panid",
-       "action-move-subpages": "iyalis daytoy a panid, ken dagiti subpanidna",
-       "action-move-rootuserpages": "iyalis dagiti ramut a panid ti agar-aramat",
-       "action-move-categorypages": "iyalis ti pampanid ti kategoria",
-       "action-movefile": "iyalis daytoy a papeles",
-       "action-upload": "ikarga daytoy a papeles",
-       "action-reupload": "suratam manen dagiti adda a papeles",
-       "action-reupload-shared": "tuonan daytoy a papeles idiay pagbingayan a repositorio",
-       "action-upload_by_url": "ikarga daytoy a papeles manipud ti URL",
-       "action-writeapi": "usaren ti panagsurat ti API",
-       "action-delete": "ikkaten daytoy a panid",
-       "action-deleterevision": "ikkaten daytoy a binaliwan",
-       "action-deletedhistory": "kitaen dagiti naikkat a pakasaritaan daytoy a panid",
-       "action-browsearchive": "birukem dagiti naikkat a panid",
-       "action-undelete": "isublim ti panakaikkat daytoy a panid",
-       "action-suppressrevision": "kitaen ken ipasubli daytoy nailemmeng a panagbaliw",
-       "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 naisangsangayan a panid",
+       "action-createtalk": "agpartuat kadagiti pagtungtungan a panid",
+       "action-createaccount": "agpartuat iti pakabilangan daytoy nga agar-aramat",
+       "action-history": "agkita iti pakasaritaan daytoy a panid",
+       "action-minoredit": "agmarka iti daytoy nga inurnos a kas bassit",
+       "action-move": "agiyalis iti daytoy a panid",
+       "action-move-subpages": "agiyalis iti daytoy a panid, ken dagiti subpanidna",
+       "action-move-rootuserpages": "agiyalis kadagiti ramut a panid ti agar-aramat",
+       "action-move-categorypages": "agiyalis iti pampanid ti kategoria",
+       "action-movefile": "agiyalis iti daytoy a papeles",
+       "action-upload": "agikarga iti daytoy a papeles",
+       "action-reupload": "agsurat manen iti daytoy nga adda a papeles",
+       "action-reupload-shared": "mangtuon iti daytoy a papeles idiay pagbingayan a repositorio",
+       "action-upload_by_url": "agikarga iti daytoy a papeles manipud ti URL",
+       "action-writeapi": "agusar iti panagsurat ti API",
+       "action-delete": "agikkat iti daytoy a panid",
+       "action-deleterevision": "agikkat iti daytoy a rebision",
+       "action-deletedhistory": "agkita kadagiti naikkat a pakasaritaan iti daytoy a panid",
+       "action-browsearchive": "agbiruk kadagiti naikkat a panid",
+       "action-undelete": "agisubli iti pannakaikkat iti daytoy a panid",
+       "action-suppressrevision": "agrepaso ken agisubli iti daytoy a nailemmeng a rebision",
+       "action-suppressionlog": "agkita iti daytoy a pribalo a listaan",
+       "action-block": "agserra iti daytoy nga agar-aramat manipud ti panag-urnos",
+       "action-protect": "mangsukat kadagiti lessaad ti salaknib para iti daytoy a panid",
+       "action-rollback": "napardas a mangisubli kadagiti inurnos ti kinaudi nga agar-aramat a nagurnos iti naisangsangayan a panid",
        "action-import": "agala ti pampanid manipud ti sabali a wiki",
-       "action-importupload": "agala ti pampanid manipud ti 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-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-importupload": "agala ti pampanid manipud ti naikarga a papeles",
+       "action-patrol": "agmarka kadagiti inurnos ti dadduma a kas napatruliaan",
+       "action-autopatrol": "agmarka iti bukodmo nga inurnos a kas napatrulian",
+       "action-unwatchedpages": "agkita ti listaan dagiti saan a nabambantayan a panid",
+       "action-mergehistory": "mangitipon ti pakasaritaan iti daytoy a panid",
+       "action-userrights": "agurnos kadagiti amin a karbengan ti agar-aramat",
+       "action-userrights-interwiki": "agurnos kadagiti karbengan ti agar-aramat dagiti agar-aramat kadagiti sabali a wiki",
+       "action-siteadmin": "mangkandado wenno manglukat ti database",
        "action-sendemail": "agipatulod kadagiti esurat",
-       "action-editmywatchlist": "urnosem ti bukodmo a listaan ti banbantayan",
-       "action-viewmywatchlist": "kitaem ti bukodmo a listaan ti banbantayan",
-       "action-viewmyprivateinfo": "kitaem ti bukodmo a pribado a pakaammo",
-       "action-editmyprivateinfo": "urnosem ti bukodmo a pribado a pakaammo",
+       "action-editmywatchlist": "agurnos iti bukodmo a listaan ti bambantayan",
+       "action-viewmywatchlist": "agkita iti bukodmo a listaan ti bambantayan",
+       "action-viewmyprivateinfo": "agkita iti bukodmo a pribado a pakaammo",
+       "action-editmyprivateinfo": "agurnos iti bukodmo a pribado a pakaammo",
        "nchanges": "$1 {{PLURAL:$1|sinukatan|dagiti sinukatan}}",
-       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|manipud idi naudi a panagsarungkar}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|manipud ti naudi a panagsarungkar}}",
        "enhancedrc-history": "pakasaritaan",
        "recentchanges": "Kaudian a balbaliw",
-       "recentchanges-legend": "Pagpilian kadagiti kaudian a balbaliw",
-       "recentchanges-summary": "Siputen dagiti kinaudi a panagbalbaliw ti wiki iti daytoy a panid.",
+       "recentchanges-legend": "Pagpilian iti kaudian a balbaliw",
+       "recentchanges-summary": "Siputen ti kaudian a balbaliw iti wiki iti daytoy a panid.",
        "recentchanges-noresult": "Awan ti nasuksukatan iti las-ud ti naited a paset ti panawen a kapada dagitoy a kriteria.",
-       "recentchanges-feed-description": "Siputen dagiti kinaudi a panagbalbaliw ti wiki iti daytoy a pakan.",
-       "recentchanges-label-newpage": "Daytoy a panag-urnos ket nakapartuat ti baro a panid",
+       "recentchanges-feed-description": "Siputen ti kaudian a balbaliw iti wiki iti daytoy a pakan.",
+       "recentchanges-label-newpage": "Daytoy a panag-urnos ket nakapartuat iti baro a panid",
        "recentchanges-label-minor": "Daytoy ket bassit a panag-urnos",
-       "recentchanges-label-bot": "Daytoy a panag-urnos ket inaramid babaen ti maysa a bot",
+       "recentchanges-label-bot": "Daytoy a panag-urnos ket inaramid babaen ti bot",
        "recentchanges-label-unpatrolled": "Daytoy a panag-urnos ket saan pay a napatruliaan",
        "recentchanges-label-plusminus": "Ti panagbaliw ti kadakkel ti panid babaen ti bilang dagiti byte",
        "recentchanges-legend-heading": "'''Leyenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kitaen pay ti [[Special:NewPages|listaan ti baro a pampanid]])",
-       "rcnotefrom": "Dita baba ket dagiti sinukatan manipud idi strong>$2</strong> (agingga iti <strong>$1</strong> a naipakita).",
-       "rclistfrom": "Ipakita dagiti kabarbaro a sinukatan a mangrugi manipud idi $3 $2",
+       "rcnotefrom": "Dita baba ket {{PLURAL:$5|ti sinukatan|dagiti sinukatan}} manipud idi <strong>$3, $4</strong> (aginggana iti <strong>$1</strong> a naipakita).",
+       "rclistfrom": "Ipakita dagiti kabarbaro a sinukatan a mangrugi manipud idi $2, $3",
        "rcshowhideminor": "$1 dagiti bassit a panag-urnos",
        "rcshowhideminor-show": "Ipakita",
        "rcshowhideminor-hide": "Ilemmeng",
        "rcshowhideliu": "$1 dagiti nakarehistro nga agar-aramat",
        "rcshowhideliu-show": "Ipakita",
        "rcshowhideliu-hide": "Ilemmeng",
-       "rcshowhideanons": "$1 dagiti di am-ammo nga agar-aramat",
+       "rcshowhideanons": "$1 dagiti di ammo nga agar-aramat",
        "rcshowhideanons-show": "Ipakita",
        "rcshowhideanons-hide": "Ilemmeng",
        "rcshowhidepatr": "$1 dagiti napatrulian a panag-urnos",
        "rcshowhidemine-show": "Ipakita",
        "rcshowhidemine-hide": "Ilemmeng",
        "rclinks": "Ipakita dagiti naudi a $1 a sinukatan iti kallabes a $2 nga al-aldaw<br />$3",
-       "diff": "sabali",
-       "hist": "saritaan",
+       "diff": "dip",
+       "hist": "hist",
        "hide": "Ilemmeng",
        "show": "Ipakita",
        "minoreditletter": "m",
        "newpageletter": "B",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 nga agbuybuya {{PLURAL:$1|nga agar-aramat|kadagiti agar-aramat}}]",
-       "rc_categories": "Patingga dagiti kategoria (pagsisinaen ti \"|\")",
+       "rc_categories": "Patingga dagiti kategoria (pagsinaen iti \"|\")",
        "rc_categories_any": "Uray ania",
        "rc-change-size-new": "$1 {{PLURAL:$1|a byte|kadagiti byte}} kalpasan ti panag-sukat",
        "newsectionsummary": "/* $1 */ baro a paset",
        "recentchangeslinked-feed": "Mainaig a sinukatan",
        "recentchangeslinked-toolbox": "Mainaig a sinuksukatan",
        "recentchangeslinked-title": "Sinukatan a mainaig iti \"$1\"",
-       "recentchangeslinked-summary": "Listaan daytoy dagiti kaudian a sinukatan kadagiti pampanid a nakasilpo manipud iti maysa a napili a panid (wenno kadagiti kameng ti maysa a nainaganan a kategoria).\nDagiti panid iti [[Special:Watchlist|listaan ti bambantayam]] ket '''napuskol'''.",
+       "recentchangeslinked-summary": "Daytoy ket listaan dagiti kaudian a sinukatan kadagiti pampanid a nakasilpo manipud iti naisangayan a panid (wenno kadagiti kameng ti maysa a nainaganan a kategoria).\nDagiti panid iti [[Special:Watchlist|listaan ti bambantayam]] ket dagiti <strong>napuskol</strong>.",
        "recentchangeslinked-page": "Nagan ti panid:",
-       "recentchangeslinked-to": "Ipakita dagiti sinukatan a panid nga embes a naisilpo iti naited a panid",
-       "upload": "Mangipan iti papeles",
-       "uploadbtn": "Mangipan iti papeles",
-       "reuploaddesc": "Ukasen ti pag-ipan ken agsubli idiay kabuklan ti pag-ipan",
-       "upload-tryagain": "Ited ti napabaro a panagipalawag ti papeles",
+       "recentchangeslinked-to": "Ipakita dagiti sinukatan kadagiti panid nga imbes a naisilpo iti naited a panid",
+       "upload": "Agikarga iti papeles",
+       "uploadbtn": "Agikarga iti papeles",
+       "reuploaddesc": "Ukasen ti panagikarga ken agsubli idiay porma ti panagikarga",
+       "upload-tryagain": "Mangited ti napabaro a deskripsion ti papeles",
        "uploadnologin": "Saan a nakastrek",
-       "uploadnologintext": "Nasken ti $1 tapno makaipanka iti papeles.",
-       "upload_directory_missing": "Ti direktorio ti pag-ipan ($1) ket napukaw ken saan a mabalin nga aramiden iti webserver.",
-       "upload_directory_read_only": "Ti pagipanan a direktoria ($1) ket saan a masuratan ti webserver.",
-       "uploaderror": "Biddut ti panang-ipan",
-       "upload-recreate-warning": "'''Ballag: Ti papeles babaen ti dayta a nagan ket naikkat wenno naiyalis.'''\n\nTi listaan ti panagikkat ken panagiyalis para iti daytoy a panid ket adda ditoy tapno makitam:",
-       "uploadtext": "Usaren ti kabuklan dita baba ti pinag-ipan ti papeles.\nTi panagkita wenno panagbiruk ti napalubos a pinag-ipan ti papeles mapan ka idiay [[Special:FileList|listaan dagiti napag-ipan a papeles]], dagiti pinag-ipan wenno pinag-ipan manen ket nakalista pay idiay [[Special:Log/upload|listaan ti pinag-ipan]], dagiti panagikkat ket idiay [[Special:Log/delete|listaan ti panagikkat]].\n\nTi panagikabil ti papeles iti panid, usaren ti panilpo a kas dagiti sumaganad a kabuklan:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' ti panag-usar ti dakkel a bersion ti papeles\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' ti agusar ti 200 pixel a kaakaba  a panagparang iti kahon idiay kannigid nga adda 'sabali a testo' ti panagipalpalawag\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' ti dagus a panagsilpo idiay papeles nga awan ti panagparang ti papeles",
+       "uploadnologintext": "Pangngaasi a $1 tapno makaikarga kadagiti papeles.",
+       "upload_directory_missing": "Ti pagikargaan a direktorio ($1) ket awan ken saan a mabalin a mapartuat babaen ti webserver.",
+       "upload_directory_read_only": "Ti pagikargaan a direktorio ($1) ket saan a masuratan babaen ti webserver.",
+       "uploaderror": "Biddut ti panagikarga",
+       "upload-recreate-warning": "<strong>Ballag: Ti papeles babaen ti dayta a nagan ket naikkat wenno naiyalis.</strong>\n\nTi listaan ti panagikkat ken panagiyalis para iti daytoy a panid ket naited ditoy para iti pakainugotan:",
+       "uploadtext": "Usaren ti porma dita baba tapno makaikarga iti papeles.\nTi panagkita wenno panagbiruk ti dati a naikarga a papeles mapan idiay [[Special:FileList|listaan dagiti naikarga a papeles]], dagiti naikarga wenno naikarga manen ket nailista pay idiay [[Special:Log/upload|listaan ti panagikarga]], dagiti panagikkat ket idiay [[Special:Log/delete|listaan ti panagikkat]].\n\nTi panangiraman ti papeles iti panid, usaren ti silpo a kas dagiti sumaganad a porma:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> tapno mausar ti napno a bersion ti papeles \n* <strong><code><nowiki>[[</nowiki>{{ns:file<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> tapno mausar ti 200 a piksel a kalawa a panagiparang iti kanigid a margin nga addaan iti \"alt text\"a kas ti deskripsion\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> para iti dagus a panangisilpo iti papeles nga awan ti panangipakita ti papeles",
        "upload-permitted": "Dagiti mapalubosan a kita ti papeles: $1.",
-       "upload-preferred": "Dagiti mabalbalin a kita ti papeles: $1.",
+       "upload-preferred": "Dagiti kaykayat a kita ti papeles: $1.",
        "upload-prohibited": "Dagiti maiparit a kita ti papeles: $1.",
-       "uploadlogpage": "Listaan ti pagipanan",
-       "uploadlogpagetext": "Adda dita baba ti listaan dagiti kaudian a naipan a papeles.\nKitaen dagiti [[Special:NewFiles|galleria ti baro a papeles]] para iti adu pay a pakabuklan apanagkita.",
+       "uploadlogpage": "Listaan ti panagikarga",
+       "uploadlogpagetext": "Dita baba ket ti listaan dagiti kaudian a panangikarga iti papeles.\nKitaen ti [[Special:NewFiles|galeria dagiti baro a papeles]] para iti adu pay a bisual a pakabuklan.",
        "filename": "Nagan ti papeles",
        "filedesc": "Pakabuklan",
        "fileuploadsummary": "Pakabuklan:",
-       "filereuploadsummary": "Dagiti panagsukat ti papeles:",
-       "filestatus": "Kasasaad ti karbengan ti panagipablaak:",
+       "filereuploadsummary": "Dagiti pannakasukat ti papeles:",
+       "filestatus": "Kasasaad ti karbengan ti kopia:",
        "filesource": "Taudan:",
        "ignorewarning": "Di ikaskaso ti ballaag ket idulin latta ti papeles",
-       "ignorewarnings": "Di ikaskaso dagiti ania man a ballaag",
-       "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.\nPangngaasi ta naganan manen ti papeles ken padasen manen nga ipapan.",
-       "filename-toolong": "Dagiti nagan ti papeles ket saan a mabalin nga at-atiddog ngem dagiti 240 a byte.",
-       "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.",
-       "filetype-bad-ie-mime": "Saan a makapag-ipan ti papeles ngamin ket masarakan ti Internet Explorer a kas \"$1\", a saan a mabalin ken makapataud a dakes a kita ti papeles.",
-       "filetype-unwanted-type": "'''\".$1\"''' ti saan a mapalubusan a kita ti papeles.\nTi mapalubusan  {{PLURAL:$3|a kita ti papeles ket|kadagiti kita ti papeles ket}} $2.",
-       "filetype-banned-type": "Ti '''\".$1\"''' {{PLURAL:$4|ket saan a mapalubusan a kita ti papeles|ket dagiti saan a mapalubusan a kita ti papeles}}.\nTi mapalubusan {{PLURAL:$3|a kita ti papeles ket|kadagiti kita ti papeles ket}} $2.",
-       "filetype-missing": "Daytoy a papeles ket awan ti kita na a (kasla \".jpg\").",
-       "empty-file": "Ti papeles nga intedmo ket awan ti nagyanna.",
+       "ignorewarnings": "Di ikaskaso dagiti aniaman a ballaag",
+       "minlength1": "Dagiti nagan ti papeles ket nasken a saan a basbassit ngem maysa a letra.",
+       "illegalfilename": "Ti nagan ti papeles ti \"$1\" ket aglaon kadagiti karakter a saan a maipalubos kadagiti titulo ti panid.\nPangngaasi a naganan manen ti papeles ken padasen manen nga ikarga.",
+       "filename-toolong": "Dagiti nagan ti papeles ket nasken a saan nga at-atiddog ngem dagiti 240 a byte.",
+       "badfilename": "Nasukatanen ti nagan ti papeles iti \"$1\".",
+       "filetype-mime-mismatch": "Ti pagpa-atiddog ti papeles ti \".$1\" ket saan a maipada iti naduktalan a kita ti MIME iti papeles ($2).",
+       "filetype-badmime": "Dagiti papeles a kita ti MIME ti \"$1\" ket saan a maipalubos a maikarga.",
+       "filetype-bad-ie-mime": "Saan a maikarga daytoy a papeles gapu ta maduktalan ti Internet Explorer a kas \"$1\", a saan a maipalubos ken makapataud ti dakes a kita ti papeles.",
+       "filetype-unwanted-type": "Ti <strong>\".$1\"</strong> ket mays a di kayat a kita ti papeles.\nTi kaykayat {{PLURAL:$3|a kita ti papeles ket|a kita dagiti papeles ket}} $2.",
+       "filetype-banned-type": "Ti <strong>\".$1\"</strong> {{PLURAL:$4|ket saan a maipalubos a kita ti papeles|ket dagiti saan a maipalubos a kita ti papeles}}.\nTi mapalubosan {{PLURAL:$3|a kita ti papeles ket|a kita dagiti papeles ket}} $2.",
+       "filetype-missing": "Daytoy a papeles ket awan ti pagpaatiddogna (kasla ti \".jpg\").",
+       "empty-file": "Ti papeles nga intedmo ket awan linaonna.",
        "file-too-large": "Ti papeles nga intedmo ket dakkel unay.",
        "filename-tooshort": "Ti nagan daytoy a papeles ket bassit unay.",
-       "filetype-banned": "Ti kita daytoy a papeles ket maiparit.",
-       "verification-error": "Daytoy a papeles ket saan a nakapasa ti pagsingkedan.",
-       "hookaborted": "Ti panagbabaro a pinadasmo ket napasardeng babaen ti pangpa-atiddog a kawit.",
-       "illegal-filename": "Ti nagan daytoy a papeles ket saan a maipalubos.",
-       "overwrite": "Saan a mabalin a suratan manen iti papeles nga adda ditan.",
-       "unknown-error": "Adda di amammo a biddut.",
-       "tmp-create-error": "Saan a makaaramid ti saan nga agnayon a papeles.",
-       "tmp-write-error": "Biddut ti pannakaisurat dagiti saan nga agnanayon a papeles.",
-       "large-file": "Ti maipatalked a papeles ket saan koma a dakdakkel ngem $1;\ndaytoy a papeles ket $2.",
-       "largefileserver": "Daytoy a papeles ket dakdakel ngem ti naaramid a mabalin para iti server.",
-       "emptyfile": "Ti papeles nga ipanmo ket kasla awan ti nagyan na.\nBaka daytoy ket gapu ti kamali ti inkabil a nagan ti papeles.\nPangngaasi ta kitaem no kayatmo latta nga ipapan daytoy a papeles.",
-       "windows-nonascii-filename": "Daytoy a wiki ket saanna a suportaran dagiti nagan ti papeles nga addaan kadagiti espesial a karakter.",
-       "fileexists": "Ti papeles nga agnagan ti kastoy ket addan, pangngaasi a kitaem ti <strong>[[:$1]]</strong> no {{GENDER:|saanka}} a sigurado no kayatmo a sukatan.\n[[$1|thumb]]",
-       "filepageexists": "Ti panangipalpalawag a panid para iti daytoy a papeles ket naaramiden idiay <strong>[[:$1]]</strong>, ngem awan ti agdama nga agnagan ti kastoy a papeles.\nTi pakabuklan nga inkabilmo ket saan nga agparang idiay deskripsion ti panid.\nTapno agparang ti pakabuklan idiay, masapul a manual a baliwam.\n[[$1|thumb]]",
-       "fileexists-extension": "Adda papeles nga agnagan ti kastoy: [[$2|thumb]]\n* Nagan ti naipapan a papeles: <strong>[[:$1]]</strong>\n* Nagan ti adda a papeles: <strong>[[:$2]]</strong>\nKayatmo kadi ti agusar ti naisangsangayan a nagan?",
-       "fileexists-thumbnail-yes": "Daytoy a papeles ket kasla ladawan a napabassit ''(thumbnail)''.\n[[$1|thumb]]\nPangngaasi a kitaem ti papeles a <strong>[[:$1]]</strong>.\nNo ti nakitam a papeles ket isu ti ladawan iti dati a kadakkel saanen a nasken ti agipan ti maysa a napabassit a ladawan.",
-       "file-thumbnail-no": "Ti nagan ti papeles ket mangrugi iti <strong>$1</strong>.\nKasla ladawan a napabassit ''(thumbnail)''.\nNo addaanka ti napno a resolusion ipanmo daytoy, no saan pangngaasi a sukatam ti nagan ti papeles.",
-       "fileexists-forbidden": "Daytoy a nagan ti papeles ket adda dita, ken saan a mabalin a masuratan manen.\nNo kayatmo pay latta nga ipan ti papeles, pangngaasi nga agsublika ken usarem ti baro a nagan.\n[[File:$1|thumb|center|$1]]",
-       "fileexists-shared-forbidden": "Daytoy a nagan ti papeles ket adda dita pagbingayan a nagikabilan ti papeles.\nNo kayatmo pay latta nga ipan ti papeles, pangngaasi nga agsublika ken usarem ti baro a nagan.\n[[File:$1|thumb|center|$1]]",
+       "filetype-banned": "Daytoy a kita ti papeles ket maiparit.",
+       "verification-error": "Daytoy a papeles ket saan a nakapasa iti pammasingked iti papeles.",
+       "hookaborted": "Ti panagbabaro a pinadasmo ket napasardeng babaen ti pangpaatiddog.",
+       "illegal-filename": "Ti nagan ti papeles ket saan a maipalubos.",
+       "overwrite": "Saan a maipalubos ti mangsurat manen iti addan a papeles.",
+       "unknown-error": "Napasamak ti maysa a di ammo a biddut.",
+       "tmp-create-error": "Saan a makapartuat ti temporario a papeles.",
+       "tmp-write-error": "Biddut ti panagsurat iti temporario a papeles.",
+       "large-file": "Maisingasing a dagiti papeles ket saan a dakdakkel ngem $1;\ndaytoy a papeles ket $2.",
+       "largefileserver": "Daytoy a papeles ket dakdakel ngem ti ipalubos a pannakaaramid ti server.",
+       "emptyfile": "Ti papeles nga inkargam ket kasla awan linaon.\nBaka daytoy ket gapu ti kamali iti nagan ti papeles.\nPangngaasi ta kitaem no kayatmo latta nga ikarga daytoy a papeles.",
+       "windows-nonascii-filename": "Daytoy a wiki ket saan a mangsuporta kadagiti nagan ti papeles nga addaan kadagiti espesial a karakter.",
+       "fileexists": "Ti papeles nga agnagan ti kastoy ket addan, pangngaasi a kitaem ti <strong>[[:$1]]</strong> no {{GENDER:|saanka}} a sigurado a kayatmo a sukatan daytoy.\n[[$1|thumb]]",
+       "filepageexists": "Ti deskripsion a panid para iti daytoy a papeles ket napartuaten idiay <strong>[[:$1]]</strong>, ngem awan ti agdama nga agnagan ti kastoy a papeles.\nTi pakabuklan nga inkabilmo ket saan nga agparang iti deskripsion ti panid.\nTapno agparang ti pakabuklan idiay, masapul a manual nga urnosem.\n[[$1|thumb]]",
+       "fileexists-extension": "Adda papeles nga agnaganen iti kastoy: [[$2|thumb]]\n* Nagan ti naikarga a papeles: <strong>[[:$1]]</strong>\n* Nagan ti adda a papeles: <strong>[[:$2]]</strong>\nKayatmo kadi ti agusar ti naisangsangayan a nagan?",
+       "fileexists-thumbnail-yes": "Daytoy a papeles ket kasla ladawan a napabassit a kadakkel <em>(thumbnail)</em>..\n[[$1|thumb]]\nPangngaasi a kitaem ti papeles ti <strong>[[:$1]]</strong>.\nNo ti nakitam a papeles ket isu ti ladawan iti dati a kadakkel saanen a nasken ti agikarga ti maysa a napabassit unay a ladawan.",
+       "file-thumbnail-no": "Ti nagan ti papeles ket mangrugi iti <strong>$1</strong>.\nKasla ti ladawan a napabassit ti kadakkel <em>(thumbnail)</em>.\nNo addaanka iti daytoy a ladawan iti napno a resolusion ikargam dayta, no saan pangngaasi a sukatam ti nagan ti papeles.",
+       "fileexists-forbidden": "Daytoy a nagan ti papeles ket addan, ken saan a mabalin a masuratan manen.\nNo kayatmo pay latta nga ikarga ti papelesmo, pangngaasi nga agsublika ken agusar iti baro a nagan.\n[[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "Ti papeles iti daytoy a nagan ket addan iti pagbingayan a repositorio ti papeles.\nNo kayatmo pay latta nga ikarga ti papeles, pangngaasi nga agsublika ken agusar iti baro a nagan.\n[[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Daytoy a papeles ket duplikado kadagiti sumaganad a {{PLURAL:$1|papeles|pappapeles}}:",
-       "file-deleted-duplicate": "Ti papeles a kapadpada ti papeles a ([[:$1]]) ket naikkat idin.\nKitaem koma ti pakasaritaan a panakaikkat ti papeles sakbay a mangirugika ti pinag-ipan.",
-       "file-deleted-duplicate-notitle": "Ti papales a kapada ti daytoy a papeles ket dati a naikkat, ken nalapdan ti titulo.\nNasken nga agdamagka ti addaan ti abilidad a mangkita ti nalapdan a datos ti papeles tapno marepaso ti kasasaad sakbay a mapan nga ikarga manen daytoy.",
-       "uploadwarning": "Ballaag iti pinag-ipan",
-       "uploadwarning-text": "Pangngaasi a baliwam ti deskripsion ti papeles ken padasem manen.",
+       "file-deleted-duplicate": "Ti papeles a kapadpada ti papeles a ([[:$1]]) ket dati a naikkat.\nKitaem koma ti pakasaritaan a pannakaikkat ti papeles sakbay a mangirugika a mangikarga manen.",
+       "file-deleted-duplicate-notitle": "Ti papales a kapada iti daytoy a papeles ket dati a naikkat, ken nalapdan ti titulo.\nNasken nga agdamagka iti sabali nga addaan iti abilidad a mangrepaso ti nalapdan a datos ti papeles tapno marepaso ti kasasaad sakbay a mapan nga agikarga manen iti daytoy.",
+       "uploadwarning": "Ballaag ti panagikarga",
+       "uploadwarning-text": "Pangngaasi a baliwam ti deskripsion ti papeles dita baba ken padasen manen.",
        "savefile": "Idulin ti papeles",
-       "uploadedimage": "naipanen ti \"[[$1]]\"",
-       "overwroteimage": "naipan ti baro a bersion ti \"[[$1]]\"",
-       "uploaddisabled": "Naiddep ti pinag-ipan.",
-       "copyuploaddisabled": "Naiddep ti pinag-ipan iti URL.",
-       "uploaddisabledtext": "Napawilan ti pinag-ipan iti papeles.",
-       "php-uploaddisabledtext": "Ti pinag-ipan ti papeles ket naiddep idiay PHP.\nPanngaasi a kitaem ti pannakaikabil ti pinag-ipan ti papeles.",
-       "uploadscripted": "Daytoy a papeles ket adda nagyanna a HTML wenno panagsurat a kodigo a mabalin nga agpakamali ti panagbasa ti sapot a pagbasabasa.",
+       "uploadedimage": "naikarga ti \"[[$1]]\"",
+       "overwroteimage": "nagikarga ti baro a bersion ti \"[[$1]]\"",
+       "uploaddisabled": "Nabaldado dagiti panagikarga.",
+       "copyuploaddisabled": "Nabaldado ti panagikarga babaen ti URL.",
+       "uploaddisabledtext": "Nabaldado dagiti panagikarga ti papeles.",
+       "php-uploaddisabledtext": "Dagiti panangikarga ti papeles ket nabaldado iti PHP.\nPanngaasi a kitaem ti pannakaisaad ti panagikarga ti papeles.",
+       "uploadscripted": "Daytoy a papeles ket naglaon ti HTML wenno eskritu ti kodigo a mabalin a kamali nga inpatarus babaen ti pagbasabasa ti web.",
        "uploadscriptednamespace": "Daytoy a papeles ti SVG ket aglaon ti maysa a saan a mabalin a nagan ti espasio ti \"$1\"",
        "uploadinvalidxml": "Ti XML iti naikarga a papeles ket saan a maiwaswas.",
-       "uploadvirus": "Addaan ti birus daytoy a papeles! Salaysay: $1",
-       "uploadjava": "Daytoy a papeles ket ZIP a papeles nga adda nagyanna a Java .a kita ti papeles.\nSaan a mabalin ti pinag-ipan ti Java a papeles, ngamin ket palabsanda dagiti seguridad a pangrestrikto.",
+       "uploadvirus": "Ti papeles ket aglaon ti birus! \nDagiti salaysay: $1",
+       "uploadjava": "Daytoy a papeles ket papeles ti ZIP nga aglaon ti Java .a klase ti papeles.\nTi panangikarga ti papales ti Java ket saan a maipalubos gapu ta makapataudda a manglabas kadagiti panangigawid ti seguridad.",
        "upload-source": "Taudan ti papeles",
        "sourcefilename": "Taudan a nagan ti papeles:",
        "sourceurl": "Taudan ti URL:",
        "destfilename": "Pangipanan ti nagan ti papeles:",
-       "upload-maxfilesize": "Kadakkel a rukod ti papeles: $1",
-       "upload-description": "Panagipalpalawag ti papeles",
-       "upload-options": "Pagpilian ti pinag-ipan",
+       "upload-maxfilesize": "Kadakkelan a rukod ti papeles: $1",
+       "upload-description": "Deskripsion ti papeles",
+       "upload-options": "Dagiti pagpilian ti panagikarga",
        "watchthisupload": "Bantayan daytoy a papeles",
-       "filewasdeleted": "Ti papeles a nanaganan ti kastoy ket naipapan idin ken napaikkaten.\nKitaem ti $1 sakbay ka nga agi pag-ipan manen.",
-       "filename-bad-prefix": "Ti nagan ti papeles nga inpanmo ket mangrugi ti '''\"$1\"''', ket saan a maipalpalawag a nagan a kayarigan a naipusgan nga automatiko kadagiti digital a pangretrato.\nPangngaasi ti agpili ti maikapalpalawag a nagan ti papelesmo.",
-       "upload-success-subj": "Balligi ti pinag-ipan",
-       "upload-success-msg": "Ti panag-ipan a naggapu idiay [$2] ket naballigi. Ket adda ditoy: [[:{{ns:file}}:$1]]",
-       "upload-failure-subj": "Parikut ti pinag-ipan",
-       "upload-failure-msg": "Addaan ti parikut ti pinag-ipanmo a naggapu idiay [$2]:\n\n$1",
-       "upload-warning-subj": "Ballaag iti pinag-ipan",
-       "upload-warning-msg": "Addaan a parikut ti panag-ipan a naggapu idiay [$2]. Mabalinmo ti agsubli ti [[Special:Upload/stash/$1|nakabuklan ti pag-ipan]] tapno masimpaan ti parikut.",
+       "filewasdeleted": "Ti papeles iti daytoy a nagan ket dati a naikarga ken kanungpalan a naikkat.\nNasken a kitaem ti $1 sakbay nga agtuloy a mangikarga manen.",
+       "filename-bad-prefix": "Ti nagan ti papeles nga ikarkargam ket mangrugi iti <strong>\"$1\"</strong>,  ken saan a deskriptibo a nagan a kadawyan nga automatiko nga ited babaen dagiti digital a kamera.\nPangngaasi nga agpili ti nasaysayaat a deskriptibo a nagan ti papelesmo.",
+       "upload-success-subj": "Balligi ti panagikarga",
+       "upload-success-msg": "Ti panagikargam manipud ti [$2] ket nagballigi. Daytoy ket magun-od ditoy [[:{{ns:file}}:$1]]",
+       "upload-failure-subj": "Parikut ti panagikarga",
+       "upload-failure-msg": "Adda parikut ti panagikargam manipud ti [$2]:\n\n$1",
+       "upload-warning-subj": "Ballaag ti panagikarga",
+       "upload-warning-msg": "Adda parikut iti panagikargam manipud ti [$2]. Mabalinmo ti agsubli iti [[Special:Upload/stash/$1|porma ti panagikarga]] tapno masimpa daytoy a parikut.",
        "upload-proto-error": "Saan a husto a protokol",
-       "upload-proto-error-text": "Dagiti adayo a pinag-ipan ket makasapul kadagiti URL a mangrugi iti <code>http://</code> wenno <code>ftp://</code>.",
+       "upload-proto-error-text": "Ti adayo a panagikarga ket makasapul kadagiti URL a mangrugi iti <code>http://</code> wenno <code>ftp://</code>.",
        "upload-file-error": "Akin-uneg a biddut",
-       "upload-file-error-text": "Adda biddut a naggapu iti uneg idi padasen ti agaramid ti saan nga agnayon a papeles dita server.\nPangngaasi a kontaken ti [[Special:ListUsers/sysop|administrador]]",
-       "upload-misc-error": "Di ammo a biddut ti panag-ipan",
-       "upload-misc-error-text": "Adda saan nga ammo a biddut ti napasamak idi agdama a nag-ipan.\nPangngaasi a  kitaen ti URL ket umisu  ken maserrekan ken padasem manen.\nNo ti parikut ket agsubli latta, kontaken ti [[Special:ListUsers/sysop|administrador]].",
-       "upload-too-many-redirects": "Adu unay ti baw-ing daytoy nga URL",
-       "upload-http-error": "Naka-adda ti biddut ti HTTP: $1",
-       "upload-copy-upload-invalid-domain": "Ti kopia a panagipan ket saan a magun-od manipud iti daytoy a pagturayan.",
-       "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": "Saan a maala dagiti papeles a hash tapno maipada.",
-       "backend-fail-notsame": "Addaan ti saan a kapada ti papeles idiay $1.",
-       "backend-fail-invalidpath": "$1 ket imbalido a pagnaan ti pagidulinan.",
-       "backend-fail-delete": "Saan a maikkat ti papeles $1.",
-       "backend-fail-describe": "Saam a mabaliwan ti metadata para iti papeles ti \"$1\".",
-       "backend-fail-alreadyexists": "Ti papeles $1 ket addan.",
-       "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.",
+       "upload-file-error-text": "Adda napasamak nga akin-uneg a biddut idi nagpadpadas nga agpartuat ti temporario a papeles iti server.\nPangngaasi a kontaken ti maysa nga [[Special:ListUsers/sysop|administrador]].",
+       "upload-misc-error": "Di ammo a biddut ti panagikarga",
+       "upload-misc-error-text": "Adda napasamak a di ammo a biddut idi las-ud ti panagikarga.\nPangngaasi a pasingkedan ti URL ket umisu ken maserrekan ken padasem manen.\nNo ti parikut ket agsubli latta, kontaken ti maysa nga [[Special:ListUsers/sysop|administrador]].",
+       "upload-too-many-redirects": "Ti URL ket naglaon kadagiti adu unay a baw-ing",
+       "upload-http-error": "Adda napasamak a biddut ti HTTP: $1",
+       "upload-copy-upload-invalid-domain": "Dagiti kopia a panagikarga ket saan a magun-od manipud ti daytoy a dominio.",
+       "backend-fail-stream": "Saan a maipan ti papeles $1.",
+       "backend-fail-backup": "Saan a makaidulin ti kapada ti papeles ti $1.",
+       "backend-fail-notexists": "Awan ti papeles ti $1.",
+       "backend-fail-hashes": "Saan a makaala kadagiti hash ti papeles para iti panangipada.",
+       "backend-fail-notsame": "Addan ti awan kapada a papeles idiay \"$1\".",
+       "backend-fail-invalidpath": "Ti \"$1\" ket imbalido a dalan ti pagidulinan.",
+       "backend-fail-delete": "Saan a maikkat ti papeles ti \"$1\".",
+       "backend-fail-describe": "Saan a mabaliwan ti metadata para iti papeles ti \"$1\".",
+       "backend-fail-alreadyexists": "Addan ti papeles ti \"$1\".",
+       "backend-fail-store": "Saan a maidulin ti papeles ti \"$1\" iti \"$2\".",
+       "backend-fail-copy": "Saan a makopia ti papeles ti \"$1\" iti \"$2\".",
+       "backend-fail-move": "Saan a maiyalis ti papeles ti \"$1\" iti \"$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 masuratan ti papeles $1.",
-       "backend-fail-maxsize": "Saan a masuratan ti papeles $1 gaputa dakdakkel ngem {{PLURAL:$2|maysa a byte|dagiti $2 a byte}}.",
-       "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 kasasaadna 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\".",
-       "backend-fail-batchsize": "Nagited ti nagipenpenan ti bunggoy iti $1 a papeles {{PLURAL:$1|nga aramid|nga ar-aramid}}; ti patingga ket $2 {{PLURAL:$2|nga aramid|nga ar-aramid}}.",
-       "backend-fail-usable": "Saan a mabasa wenno masuratan ti papeles $1 gaputa awan ti makaanay a pammalubos wenno awan dagiti direktorio/pangikabilan.",
-       "filejournal-fail-dbconnect": "Saan a maikapet idiay warnakan a database para iti likudan a pagipenpenan \"$1\".",
-       "filejournal-fail-dbquery": "Saan a makapabaro idiay warnakan a database para iti likudan a pagipenpenan \"$1\".",
+       "backend-fail-read": "Saan a mabasa ti papeles ti \"$1\".",
+       "backend-fail-create": "Saan a masuratan ti papeles ti \"$1\".",
+       "backend-fail-maxsize": "Saan a masuratan ti papeles ti \"$1\" gapu ta daytoy ket dakdakkel ngem {{PLURAL:$2|maysa a byte|dagiti $2 a byte}}.",
+       "backend-fail-readonly": "Ti pagidulinan a kalikudan ti \"$1\" ket agdama a mabasa laeng. Ti rason a naited idi ket: \"<em>$2</em>\"",
+       "backend-fail-synced": "Ti papeles ti \"$1\" ket bangking ti kasasaadna iti kaunegan a pagidulinan dagiti kalikudan",
+       "backend-fail-connect": "Saan a makaikapet idiay pagidulinan a kalikudan ti \"$1\".",
+       "backend-fail-internal": "Adda napasamak a di ammo a biddut idiay pagidulinan a kalikudan ti \"$1\".",
+       "backend-fail-contenttype": "Saan a maikeddeng ti kita ti linaon iti papeles a maidulin iti \"$1\".",
+       "backend-fail-batchsize": "Ti pagidulinan a likudan ket naited a paset ti papeles ti $1 nga {{PLURAL:$1|operasion|op-operasion}}; ti patingga ket $2 nga {{PLURAL:$2|operasion|op-operasion}}.",
+       "backend-fail-usable": "Saan a mabasa wenno masuratan ti papeles ti \"$1\" gapu ta awan ti makaanay a pammalubos wenno awan dagiti direktorio/pagikabilan.",
+       "filejournal-fail-dbconnect": "Saan a maikapet iti database ti warnakan a para iti likudan a pagipenpenan ti \"$1\".",
+       "filejournal-fail-dbquery": "Saan a makapabaro ti database ti warnakan para iti likudan a pagipenpenan ti \"$1\".",
        "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-deletelock": "Saan a maikkat ti kandado ti papeles para iti \"$1\".",
        "lockmanager-fail-acquirelock": "Saan a makaala ti kandado para iti \"$1\".",
        "lockmanager-fail-openlock": "Saan a malukatan 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-acquire": "Saan a makaala kadagiti kandado ti server $1.",
-       "lockmanager-fail-svr-release": "Saan a maibbatan dagiti kandado idiay server $1.",
-       "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.",
-       "zip-bad": "Daytoy a papeles ket nadadael wenno saan a mabasa a kas ZIP a papeles.\nSaan a mabalin a nasayaat a makita para iti seguridad.",
-       "zip-unsupported": "Ti papeles ket ZIP a papeles nga agus-usar ti ZIP a langa a saan a sinuportaran babaen ti MediaWiki .\nSaan a mabalin a nasayaat a makita para iti seguridad.",
-       "uploadstash": "Pinag-ipan ti stash",
-       "uploadstash-summary": "Daytoy a panid ket mangted ti panagserrek kadagiti papeles a napag-ipan (wenno nairugi a naipan) ngem saan pay a naipablaak iti wiki. Dagitoy a papeles ket saan a makita ti sabsabali ngem laeng ti agar-aramat a nag-ipan kaniada.",
+       "lockmanager-fail-db-bucket": "Saan a makakontak ti umanay a kandado dagiti database idiay timba ti $1.",
+       "lockmanager-fail-db-release": "Saan a maibbatan dagiti kandado iti database ti $1.",
+       "lockmanager-fail-svr-acquire": "Saan a makaala kadagiti kandado ti server ti $1.",
+       "lockmanager-fail-svr-release": "Saan a maibbatan dagiti kandado iti server ti $1.",
+       "zip-file-open-error": "Adda napasamak a biddut idi lukluktan ti papeles para kadagiti panagkita ti ZIP.",
+       "zip-wrong-format": "Ti nainagan a papeles ket saan a papeles ti ZIP.",
+       "zip-bad": "Daytoy a papeles ket nadadael wenno saan a mabasa a papeles ti ZIP.\nSaan a mabalin a nasayaat a makita para iti seguridad.",
+       "zip-unsupported": "Ti papeles ket papales ti ZIP nga agus-usar ti ZIP a langa a saan a masuportaran babaen ti MediaWiki .\nSaan a mabalin a nasayaat a makita para iti seguridad.",
+       "uploadstash": "Panagikarga ti stash",
+       "uploadstash-summary": "Daytoy a panid ket mangited ti panagserrek kadagiti papeles a naikarga wenno mangrugrugi iti proseso a maikarga, ngem saan pay a naipablaak iti wiki. Dagitoy a papeles ket saan a makita ti sinoman ngem ti laeng agar-aramat a nagikarga kaniada.",
        "uploadstash-clear": "Dalusan dagiti na-stash a papeles",
        "uploadstash-nofiles": "Awan ti na-stash a papelesmo.",
-       "uploadstash-badtoken": "Ti panag-tungpal dayta nga aramid ket napaay, ngamin ta dagiti talekmo ti panag-urnos ket nagpaso. Padasem manen.",
+       "uploadstash-badtoken": "Ti panag-tungpal dayta nga aramid ket napaay, ngamin ta dagiti talekmo ti panag-urnos ket nagpason. Padasen manen.",
        "uploadstash-errclear": "Ti panagdalus kadagiti papeles ket napaay.",
-       "uploadstash-refresh": "Pasadiwaam dagiti listaan ti papeles",
-       "invalid-chunk-offset": "Imbalido ti maysa a tangdan",
-       "img-auth-accessdenied": "naiparit ti iseserrek",
-       "img-auth-nopathinfo": "Ti servermo ket mabalin nga agipasa iti daytoy a pakaammo.\nBaka met laeng naibasta ti CGI ken saan na a tapayaen ti img_auth.\nKitaen ti https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization .",
-       "img-auth-notindir": "Ti kiniddaw a dalan ket saan a ti naaramid a direktorio ti pag-ipan",
-       "img-auth-badtitle": "Saan a makaaramid ti umisu a titulo a naggapu idiay \"$1\".",
+       "uploadstash-refresh": "Pasadiwaen dagiti listaan ti papeles",
+       "invalid-chunk-offset": "Imbalido a pirgis ti timbengan",
+       "img-auth-accessdenied": "Nalibak ti iseserrek",
+       "img-auth-nopathinfo": "Ti servermo ket saan a naisaad nga agipasa iti daytoy a pakaammo.\nMabalin a naibatay iti CGI ken saan a makasuporta ti img_auth.\nKitaen ti https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization .",
+       "img-auth-notindir": "Ti kiniddaw a dalan ket saan nga adda iti naaramid a direktorio ti pagikargaan",
+       "img-auth-badtitle": "Saan a makaaramid ti umisu a titulo manipud ti \"$1\".",
        "img-auth-nologinnWL": "Saanka a nakastrek ken ti \"$1\" ket awan idiay mabalin a listaan.",
-       "img-auth-nofile": "Ti papeles \"$1\" ket awan dita.",
-       "img-auth-isdir": "Agserserrekka ti direktorio ti papeles \"$1\".\nTi iseserrek ti papeles ti mabalin laeng.",
-       "img-auth-streaming": "Agwaig \"$1\".",
-       "img-auth-public": "Ti pamay-an ti img_auth.php ket mangiruar kadagiti papeles manipud ti pribado a wiki.\nDaytoy a wiki naipabalin a kas publiko a wiki.\nPara iti kangatuan a talinaay, nabaldado ti img_auth.php.",
-       "img-auth-noread": "Ti agar-aramat ket awan ti pammalubosna nga agbasa \"$1\".",
+       "img-auth-nofile": "Awan ti papeles ti \"$1\".",
+       "img-auth-isdir": "Padpadasem ti mangserrek ti direktorio ti \"$1\".\nTi laeng panagserrek ti papeles ti maipalubos.",
+       "img-auth-streaming": "Agip-ipan ti \"$1\".",
+       "img-auth-public": "Ti annong ti img_auth.php ket ti mangiruar kadagiti papeles manipud ti pribado a wiki.\nDaytoy a wiki naaramid a kas publiko a wiki.\nPara iti kangatuan a seguridad, nabaldado ti img_auth.php.",
+       "img-auth-noread": "Ti agar-aramat ket awan ti pammalubosna nga agbasa ti \"$1\".",
        "http-invalid-url": "Imbalido nga URL: $1",
-       "http-invalid-scheme": "Ti URL nga adda ti \"$1\" a pamuspusan ket saan a masuportaran.",
+       "http-invalid-scheme": "Dagiti URL nga addaan iti \"$1\" a pamuspusan ket saan a masuportaran.",
        "http-request-error": "Ti panagkiddaw ti HTTP ket napaay gapu ti di ammo a biddut.",
        "http-read-error": "Biddut ti panagbasa ti HTTP.",
        "http-timed-out": "Nagsardeng ti panagkiddaw ti HTTP.",
        "http-curl-error": "Biddut ti panagala ti URL: $1",
        "http-bad-status": "Adda pakirut idi las-ud ti panagkiddaw ti HTTP: $1 $2",
        "upload-curl-error6": "Di madanon ti URL",
-       "upload-curl-error6-text": "Ti URL a naited ket saan a madanon.\nPangngaasi a kitaem manen no husto ti URL ken adda dayta a pagsaadan.",
-       "upload-curl-error28": "Nagsardeng ti panag-ipan",
-       "upload-curl-error28-text": "Ti pagsaadan ket nabayag unay a simmungbat.\nPangngaasi a kitaen no naipatakder ti pagsaadan, aguray no madamdama ket padasem manen.\nBaka kayatmo a padasen no saan a makumikom nga oras.",
-       "license": "Lisensia:",
-       "license-header": "Lisensia",
+       "upload-curl-error6-text": "Ti URL a naited ket saan a madanon.\nPangngaasi a kitaem manen no husto ti URL ken adda dayta a sitio.",
+       "upload-curl-error28": "Nagsardeng ti panagikarga",
+       "upload-curl-error28-text": "Ti sitio ket nabayag unay a simmungbat.\nPangngaasi a kitaen no naipatakder ti sito, aguray no madamdama ket padasen manen.\nBaka kayatmo a padasen iti saan a makumikom nga oras.",
+       "license": "Panaglisensia:",
+       "license-header": "Panaglisensia",
        "nolicense": "Awan ti napili",
-       "license-nopreview": "(Saan a mabalin nga ipadas)",
-       "upload_source_url": " (maysa nga umisu, ken maserrekan ti publiko nga URL)",
-       "upload_source_file": "(papeles iti kompiutermo)",
+       "licenses-edit": "Urnosen dagiti pagpilian ti lisensia",
+       "license-nopreview": "(Saan a magun-od ti panagipadas)",
+       "upload_source_url": "(ti pinilim a papeles manipud ti umiso, ken publiko a maserrekan nga URL)",
+       "upload_source_file": "(ti pinilim a papeles manipud ti kompiutermo)",
        "listfiles-delete": "ikkaten",
-       "listfiles-summary": "Daytoy nga espesial a panid ket agiparang kadagiti amin a naipan a papeles.",
-       "listfiles_search_for": "Agsapul para iti nagan ti midia:",
+       "listfiles-summary": "Daytoy nga espesial a panid ket agiparang kadagiti amin a naikarga a papeles.",
+       "listfiles_search_for": "Agbiruk para iti nagan ti midia:",
        "imgfile": "papeles",
        "listfiles": "Listaan ti papeles",
        "listfiles_thumb": "Bassit a ladawan",
        "listfiles_name": "Nagan",
        "listfiles_user": "Agar-aramat",
        "listfiles_size": "Kadakkel",
-       "listfiles_description": "Panagipalpalawag",
+       "listfiles_description": "Deskripsion",
        "listfiles_count": "Dagiti bersion",
        "listfiles-show-all": "Iraman dagiti daan a bersion dagiti ladawan",
        "listfiles-latestversion": "Agdama a bersion",
        "listfiles-latestversion-no": "Saan",
        "file-anchor-link": "Papeles",
        "filehist": "Pakasaritaan ti papeles",
-       "filehist-help": "Ipindut ti maysa a petsa/oras tapno makitam ti papeles iti kasisigud a langana iti dayta nga oras.",
+       "filehist-help": "Pinduten iti petsa/oras tapno makita ti papeles a kas naiparang iti dayta a panawen.",
        "filehist-deleteall": "ikkaten amin",
        "filehist-deleteone": "ikkaten",
        "filehist-revert": "isubli",
        "filehist-datetime": "Petsa/Oras",
        "filehist-thumb": "Bassit a ladawan",
        "filehist-thumbtext": "Bassit a ladawan para iti bersion manipud idi $1",
-       "filehist-nothumb": "Awan ti napabassit a ladawan",
+       "filehist-nothumb": "Awan ti bassit a ladawan",
        "filehist-user": "Agar-aramat",
        "filehist-dimensions": "Dagiti rukod",
        "filehist-filesize": "Kadakkel ti papeles",
        "filehist-comment": "Komentario",
-       "imagelinks": "Panagusar ti papeles",
-       "linkstoimage": "Ti sumaganad {{PLURAL:$1|a silpo ti panid|kadagiti $1 a silpo ti panid}} ditoy a papeles:",
-       "linkstoimage-more": "Ad-adu ngem $1 {{PLURAL:$1|a silsilpo ti panid|silpo ti pampanid}} iti daytoy a papeles.\nTi sumaganad a listaan ket agipakita {{PLURAL:$1|ti umona a silpo ti panid|kadagiti umuna a $1 a silpo ti panid}} iti daytoy laeng a papeles.\nMagun-od ti [[Special:WhatLinksHere/$2|kompleto a listaan]].",
+       "imagelinks": "Panag-usar ti papeles",
+       "linkstoimage": "Ti sumaganad {{PLURAL:$1|a silsilpo ti panid|kadagiti $1 a silpo ti pampanid}} iti daytoy a papeles:",
+       "linkstoimage-more": "Ad-adu ngem $1 {{PLURAL:$1|a silsilpo ti panid|a silpo ti pampanid}} iti daytoy a papeles.\nTi sumaganad a listaan ket mangipakita {{PLURAL:$1|ti umona a silpo ti panid|kadagiti umuna a $1 a silsilpo ti panid}} iti daytoy laeng a papeles.\nMagun-od ti [[Special:WhatLinksHere/$2|kompleto a listaan]].",
        "nolinkstoimage": "Awan ti pampanid a nakasilpo iti daytoy a papeles.",
-       "morelinkstoimage": "Kitaen ti [[Special:WhatLinksHere/$1|ad-adu pay a silpo]] iti daytoy a papeles.",
+       "morelinkstoimage": "Kitaen ti [[Special:WhatLinksHere/$1|adu pay a silsilpo]] iti daytoy a papeles.",
        "linkstoimage-redirect": "$1 (baw-ing ti papeles) $2",
-       "duplicatesoffile": "Ti sumaganad a {{PLURAL:$1|papeles ket duplikado|a $1 a pappapeles ket duplikado}} iti daytoy a papeles ([[Special:FileDuplicateSearch/$2|adu pay a salaysay]]):",
-       "sharedupload": "Daytoy a papeles ket naggapu idiay $1 ken mabalin a mausar kadagiti sabsabali a gandat.",
-       "sharedupload-desc-there": "Daytoy a papeles ket naggapu idiay $1 ken mabalin a mausar kadagiti sabsabali a gandat.\nPangngaasi a kitaem ti [$2 pagipalpalawag ti panid] para iti adu pay a pakaammo.",
-       "sharedupload-desc-here": "Daytoy a papeles ket naggapu idiay $1 ken mabalin a mausar kadagiti sabsabali a gandat.\nTi pagipalpalawagna idiay [$2 pagipalpalawag a panid ti papeles ] ket naipakita dita baba.",
-       "sharedupload-desc-edit": "Daytoy a papeles ket naggapu manipud idiay $1 ken mabalin a mausar babaen dagiti sabali a gandat.\nBaka kayatmo nga urnosen ti bukodna a deskripsion idiay [$2 deskripsion ti papeles a panid].",
-       "sharedupload-desc-create": "Daytoy a papeles ket naggapu manipud idiay $1 ken mabalin a mausar babaen dagiti sabali a gandat.\nBaka kayatmo nga urnosen ti bukodna a deskripsion idiay [$2 deskripsion ti papeles a panid].",
+       "duplicatesoffile": "Ti sumaganad a {{PLURAL:$1|papeles ket duplikado|a $1 a pappapeles ket duplikado}} iti daytoy a papeles ([[Special:FileDuplicateSearch/$2|adu pay a salaysay]]):",
+       "sharedupload": "Daytoy a papeles ket manipud ti $1 ken mabalin a mausar babaen dagiti sabali a gandat.",
+       "sharedupload-desc-there": "Daytoy a papeles ket manipud ti $1 ken mabalin a mausar babaen dagiti sabali a gandat.\nPangngaasi a kitaem ti [$2 panid ti deskripsion ti papeles] para iti adu pay a pakaammo.",
+       "sharedupload-desc-here": "Daytoy a papeles ket manipud ti $1 ken mabalin a mausar babaen dagiti sabali a gandat.\nTi deskripsion iti [$2 panid ti deskripsion ti papelesna] idiay ket naipakita dita baba.",
+       "sharedupload-desc-edit": "Daytoy a papeles ket manipud ti $1 ken mabalin a mausar babaen dagiti sabali a gandat.\nMabalin a kayatmo nga urnosen ti bukodna a deskripsion idiay [$2 panid ti deskripsion ti papeles].",
+       "sharedupload-desc-create": "Daytoy a papeles ket manipud ti $1 ken mabalin a mausar babaen dagiti sabali a gandat.\nMabalin a kayatmo nga urnosen ti bukodna a deskripsion idiay [$2 panid ti deskripsion ti papeles].",
        "filepage-nofile": "Awan ti agnagan ti kasta a papeles.",
-       "filepage-nofile-link": "Awan ti agnagan ti kastoy a papeles, ngem mabalinmo ti [$1 mangipan].",
-       "uploadnewversion-linktext": "Mangipan ti kabarbaro a bersion iti daytoy a papeles",
-       "shared-repo-from": "Naggapo iti $1",
-       "shared-repo": "iti pagbingbingayan a nagikabilan",
-       "upload-disallowed-here": "Saanmo a masuratan manen daytoy a ladawan.",
+       "filepage-nofile-link": "Awan ti agnagan ti kastoy a papeles, ngem mabalinmo ti [$1 agikarga].",
+       "uploadnewversion-linktext": "Agikarga ti baro a bersion iti daytoy a papeles",
+       "shared-repo-from": "manipud ti $1",
+       "shared-repo": "ti pagbingbingayan a repositorio",
+       "upload-disallowed-here": "Saanmo a masuratan manen daytoy a papeles.",
        "filerevert": "Isubli ti $1",
        "filerevert-legend": "Isubli ti papeles",
-       "filerevert-intro": "Mangrugrugika nga agipasubli ti papeles '''[[Media:$1|$1]]''' iti [$4 bersion ti oras ket petsa nga $3, $2].",
+       "filerevert-intro": "Mangrugrugika nga agipasubli ti papeles ti <strong>[[Media:$1|$1]]</strong> iti [$4 bersion manipud idi $3, $2].",
        "filerevert-comment": "Rason:",
-       "filerevert-defaultcomment": "Naisubli ti bersion manipud idi $2, $1",
+       "filerevert-defaultcomment": "Naisubli iti bersion manipud idi $2, $1",
        "filerevert-submit": "Isubli",
-       "filerevert-success": "Ti '''[[Media:$1|$1]]''' ket naipasubli idiay [$4 bersion ti oras ken petsa $3, $2].",
-       "filerevert-badversion": "Awan ti dati a lokal a bersion daytoy a papeles a naited ti dayta nga oras ken petsa.",
+       "filerevert-success": "Ti <strong>[[Media:$1|$1]]</strong> ket naipasubli iti [$4 bersion manipud idi $3, $2].",
+       "filerevert-badversion": "Awan ti dati a lokal a bersion iti daytoy a papeles a naited ti dayta nga oras ken petsa.",
        "filedelete": "Ikkaten ti $1",
        "filedelete-legend": "Ikkaten ti papeles",
-       "filedelete-intro": "Mangrugrugika nga agikkat ti '''[[Media:$1|$1]]''' ken mairaman amin a pakasaritaanna.",
-       "filedelete-intro-old": "Ikikkatem ti bersion iti '''[[Media:$1|$1]]''' manipud idi [$4 $3, $2].",
+       "filedelete-intro": "Mangrugrugika nga agikkat ti <strong>[[Media:$1|$1]]</strong> ken mairaman amin a pakasaritaanna.",
+       "filedelete-intro-old": "Ikikkatem ti bersion iti <strong>[[Media:$1|$1]]</strong> manipud idi [$4 $3, $2].",
        "filedelete-comment": "Rason:",
        "filedelete-submit": "Ikkaten",
-       "filedelete-success": "Naikkaten ti '''$1'''.",
-       "filedelete-success-old": "Ti bersion iti '''[[Media:$1|$1]]''' manipud idi $3, $2 ket naikkaten.",
-       "filedelete-nofile": "awan ti '''$1''' .",
-       "filedelete-nofile-old": "Awan ti naidulin a bersion ti '''$1''' nga addaan ti naited a kakitkitana.",
+       "filedelete-success": "Naikkaten ti <strong>$1</strong>.",
+       "filedelete-success-old": "Ti bersion iti <strong>[[Media:$1|$1]]</strong> manipud idi $3, $2 ket naikkaten.",
+       "filedelete-nofile": "awan ti <strong>$1</strong> .",
+       "filedelete-nofile-old": "Awan ti naidulin a bersion ti <strong>$1</strong> nga addaan kadagiti naited a gupit.",
        "filedelete-otherreason": "Sabali/maipatinayon a rason:",
        "filedelete-reason-otherlist": "Sabali a rason",
-       "filedelete-reason-dropdown": "*Kadawyan a rasrason ti pannakaikkat\n** Panagsalungasing iti karbengan ti panagkopia\n** Nadoble a papeles",
+       "filedelete-reason-dropdown": "*Kadawyan a rasrason ti pannakaikkat\n** Panagsalungasing iti karbengan ti kopia\n** Duplikado a papeles",
        "filedelete-edit-reasonlist": "Urnosen dagiti rason ti panagikkat",
        "filedelete-maintenance": "Ti panagikkat ken panagisubli kadagiti papaeles ket nabaldado iti las-ud ti panagtartaripato.",
-       "filedelete-maintenance-title": "Saan a maikkat daytoy a papeles",
+       "filedelete-maintenance-title": "Saan a maikkat ti papeles",
        "mimesearch": "Pagbiruk ti MIME",
-       "mimesearch-summary": "Daytoy a panid ket pakabaelanna ti panagsagat ti papeles iti MIME a kitada.\nIkabil: kita ti nagyan/subtipo wenno kita ti linaon/*, a kas ti <code>image/jpeg</code>.",
+       "mimesearch-summary": "Daytoy a panid ket pakabaelanna ti panagsagat kadagiti papeles iti MIME a kitada.\nIkabil: kita ti linaon/subtipo wenno kita ti linaon/*, a kas ti <code>image/jpeg</code>.",
        "mimetype": "Kita ti MIME:",
        "download": "ikarga",
        "unwatchedpages": "Di mabambantayan a pampanid",
        "listduplicatedfiles-summary": "Daytoy ket listaan dagiti papeles a ti kaudian unay a bersion ti papeles ket duplikado ti kaudian unay a bersion iti sabali a papeles. Dagiti laeng lokal a papeles ti maikeddeng.",
        "listduplicatedfiles-entry": "Ti [[:File:$1|$1]] ket addaan [[$3|{{PLURAL:$2|iti duplikado|kadagiti $2 a duplikado}}]].",
        "unusedtemplates": "Dagiti saan a nausar a plantilia",
-       "unusedtemplatestext": "Daytoy a panid ket ilistana dagiti panid idiay {{ns:template}} a nagan ti espasio a saan a nairaman iti sabali a panid.\nLaglagipem ti agkita kadagiti sabsabali a silpo ti plantilia sakbay nga ikkatem ida.",
-       "unusedtemplateswlh": "dagiti sabali a silpo",
+       "unusedtemplatestext": "Daytoy a panid ket ilistana dagiti panid iti nagan ti espasio ti {{ns:template}} a saan a nairaman iti sabali a panid.\nLaglagipem a kitaen dagiti sabali a silpo dagiti plantilia sakbay nga ikkaten ida.",
+       "unusedtemplateswlh": "sabali a silsilpo",
        "randompage": "Pugto a panid",
        "randompage-nopages": "Awan ti pampanid iti sumaganad a {{PLURAL:$2|nagan ti espasio|nagnagan ti espasio}}: $1.",
        "randomincategory": "Pugto a panid iti kategoria",
        "randomincategory-invalidcategory": "Ti \"$1\" ket saan nga umisu a nagan ti kategoria.",
-       "randomincategory-nopages": "Awan ti pampanid iti [[:Category:$1]].",
+       "randomincategory-nopages": "Awan ti pampanid iti kategoria ti [[:Category:$1]].",
        "randomincategory-selectcategory": "Agala ti pugto a panid manipud ti kategoria: $1 $2.",
        "randomincategory-selectcategory-submit": "Inkan",
        "randomredirect": "Pugto a baw-ing",
        "randomredirect-nopages": "Awan dagiti baw-ing iti daytoy a nagan ti espasio ti \"$1\".",
        "statistics": "Estadistika",
        "statistics-header-pages": "Estadistika ti panid",
-       "statistics-header-edits": "Estadistika ti inurnos",
+       "statistics-header-edits": "Estadistika ti panag-urnos",
        "statistics-header-views": "Estadistika ti panagkita",
        "statistics-header-users": "Estadistika ti agar-aramat",
-       "statistics-header-hooks": "Estadistika a sabsabali",
+       "statistics-header-hooks": "Sabali nga estadistika",
        "statistics-articles": "Dagiti naglaon a panid",
        "statistics-pages": "Pampanid",
-       "statistics-pages-desc": "Dagiti amin a panid ti wiki, a mairaman dagiti tungtungan a panid, dagiti baw-ing, ken dadduma pay",
-       "statistics-files": "Ti naipapan a papeles",
+       "statistics-pages-desc": "Amin a pampanid iti wiki, a mairaman dagiti tungtungan a panid, dagiti baw-ing, kdpy.",
+       "statistics-files": "Dagiti naikarga a papeles",
        "statistics-edits": "Dagiti naurnos a panid manipud idi nairugi ti {{SITENAME}}",
-       "statistics-edits-average": "Pagtengngaan nga urnos ti tunggal maysa a panid",
+       "statistics-edits-average": "Dagiti pagtengngaan nga inurnos iti tunggal maysa a panid",
        "statistics-views-total": "Dagiti dagup ti panagkita",
-       "statistics-views-total-desc": "Saan a naikabil ti panagkita dagiti awan a panid ken dagiti espesial a panid",
-       "statistics-views-peredit": "Panagkita ti tunggal maysa nga urnos",
+       "statistics-views-total-desc": "Dagiti panagkita ti awan a pampanid ken saan a mairaman dagiti espesial a panid",
+       "statistics-views-peredit": "Panagkita iti tunggal maysa a panag-urnos",
        "statistics-users": "Dagiti nakarehistro nga [[Special:ListUsers|agar-aramat]]",
-       "statistics-users-active": "Dagiti nasiglat nga agar-aramat",
-       "statistics-users-active-desc": "Dagiti agar-aramat a nagtungpal ti aramid ti napalabas nga {{PLURAL:$1|aldaw|$1 nga al-aldaw}}",
+       "statistics-users-active": "Dagiti aktibo nga agar-aramat",
+       "statistics-users-active-desc": "Dagiti agar-aramat a nagtungpal ti aramid iti napalabas nga {{PLURAL:$1|aldaw|$1 nga al-aldaw}}",
        "statistics-mostpopular": "Kaaduan a nabuya a pampanid",
-       "pageswithprop": "Pampanid nga adda maysa a tagikua ti panid",
-       "pageswithprop-legend": "Pampanid nga adda maysa a tagikua ti panid",
+       "pageswithprop": "Pampanid nga adda tagikua ti panid",
+       "pageswithprop-legend": "Pampanid nga adda tagikua ti panid",
        "pageswithprop-text": "Daytoy a panid ket ilistana ti pampanid nga agus-usar ti naisangayan a tagikua ti panid.",
        "pageswithprop-prop": "Nagan ti tagikua:",
        "pageswithprop-submit": "Inkan",
-       "pageswithprop-prophidden-long": "atiddog a testo ti tagikua a nailemmeng ($1)",
+       "pageswithprop-prophidden-long": "atiddog a testo ti pateg ti tagikua a nailemmeng ($1)",
        "pageswithprop-prophidden-binary": "binario a pateg ti tagikua a nailemmeng ($1)",
        "doubleredirects": "Dagiti namindua a naibaw-ing",
-       "doubleredirectstext": "Daytoy a panid ket ilistana dagiti panid nga agbaw-ing kadagiti sabsabali a baw-ing a pampanid.\nIti tunggal maysa nga aray ket adda nagyanna kadagiti silpo iti umuna ken maikadua a baw-ing, ken iti puntaan iti maikadua a baw-ing, nga isu ti \"pudno\" a puntaan ti panid, nga ti umuna a baw-ing ket isu ti ipatudona.\n<del>Nakurosan</del> dagita naikabil ket napadtuan.",
-       "double-redirect-fixed-move": "Naiyalisen ti [[$1]].\nAutomatiko idi a napabaro ken naibaw-ing tattan idiay [[$2]].",
-       "double-redirect-fixed-maintenance": "Automatiko a simsimpaen ti doble a baw-ing manipud ti [[$1]] idiay [[$2]] iti panagtaripato nga obra.",
+       "doubleredirectstext": "Daytoy a panid ket ilistana dagiti panid nga agbaw-ing kadagiti sabali a baw-ing a pampanid.\nIti tunggal maysa nga aray ket aglaon kadagiti silpo iti umuna ken maikadua a baw-ing, ken ti pay puntaan ti maikadua a baw-ing, nga isu ti \"pudno\" a puntaan ti panid, nga ti umuna a baw-ing ket isu koma ti pakaituduanna.\nNasolbaren dagiti <del>nakurosan</del> a naikabil.",
+       "double-redirect-fixed-move": "Naiyalisen ti [[$1]].\nAutomatiko idi a napabaro ken naibaw-ing tattan iti [[$2]].",
+       "double-redirect-fixed-maintenance": "Automatiko nga agsimsimpa ti doble a baw-ing manipud ti [[$1]] iti [[$2]] iti panagtaripato nga obra.",
        "double-redirect-fixer": "Panagsimpa ti baw-ing",
        "brokenredirects": "Dagiti naputed a baw-ing",
-       "brokenredirectstext": "Dagitoy sumaganad a baw-ing ket nakasilpo kadagiti awan a panid:",
+       "brokenredirectstext": "Dagiti sumaganad a baw-ing ket nakasilpo kadagiti awan a panid:",
        "brokenredirects-edit": "urnosen",
        "brokenredirects-delete": "ikkaten",
-       "withoutinterwiki": "Dagiti panid nga awan ti silpona ti pagsasao",
-       "withoutinterwiki-summary": "Dagitoy a pampanid ket saan a nakasilpo ti sabali a bersion ti pagsasao.",
+       "withoutinterwiki": "Pampanid nga awan kadagiti silpo ti pagsasao",
+       "withoutinterwiki-summary": "Dagiti sumaganad a pampanid ket saan a nakasilpo kadagiti sabali a bersion ti pagsasao.",
        "withoutinterwiki-legend": "Pagpasaruno",
        "withoutinterwiki-submit": "Ipakita",
-       "fewestrevisions": "Dagiti panid nga adda kadagiti kabassitan a panangbalbaliw",
+       "fewestrevisions": "Dagiti panid nga adda kadagiti kabassitan a rebision",
        "nbytes": "$1 {{PLURAL:$1|a byte|dagiti byte}}",
        "ncategories": "$1 {{PLURAL:$1|a kategoria|a katkategoria}}",
        "ninterwikis": "$1 {{PLURAL:$1|nga interwiki|dagiti interwiki}}",
        "nlinks": "$1 {{PLURAL:$1|a silpo|kadagiti silpo}}",
        "nmembers": "$1 {{PLURAL:$1|a kameng|kamkameng}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|kameng|kamkameng}}",
-       "nrevisions": "$1 {{PLURAL:$1|a panagbalbaliw|kadagiti panagbalbaliw}}",
+       "nrevisions": "$1 {{PLURAL:$1|a rebison|kadagiti rebision}}",
        "nviews": "$1 {{PLURAL:$1|a panangkita|kadagiti panangkita}}",
-       "nimagelinks": "Inusar idiay $1 {{PLURAL:$1|a panid|a pampanid}}",
-       "ntransclusions": "inusar idiay $1 {{PLURAL:$1|a panid|a pampanid}}",
-       "specialpage-empty": "Awan dagiti nagbanaganna daytoy a padamag.",
+       "nimagelinks": "Inusar iti $1 {{PLURAL:$1|a panid|a pampanid}}",
+       "ntransclusions": "inusar iti $1 {{PLURAL:$1|a panid|a pampanid}}",
+       "specialpage-empty": "Awan dagiti nagbanagan daytoy a reporta.",
        "lonelypages": "Dagiti naulila a panid",
-       "lonelypagestext": "Dagiti sumaganad a panid ket saan a nakasilpo idiay wenno naipakita kadagiti sabali a panid idiay {{SITENAME}}.",
+       "lonelypagestext": "Dagiti sumaganad a panid ket saan a nakasilpo wenno nailak-am kadagiti sabali a panid iti {{SITENAME}}.",
        "uncategorizedpages": "Dagiti saan a nakategoria a panid",
        "uncategorizedcategories": "Dagiti saan a nakategoria a kategoria",
        "uncategorizedimages": "Dagiti saan a nakategoria a papeles",
        "popularpages": "Dagiti nadayeg a panid",
        "wantedcategories": "Dagiti makiddaw a kategoria",
        "wantedpages": "Dagiti makiddaw a panid",
-       "wantedpages-badtitle": "Saan nga umisu a titulo idiay naikabil a pagbanagan: $1",
+       "wantedpages-badtitle": "Imbalido a titulo iti agasmang ti nagbanagan: $1",
        "wantedfiles": "Dagiti makiddaw 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-cat-noforeign": "Dagiti sumaganad a papeles ket naus-usar ngem awanda met. Iti pay maipatinayon, dagiti panid a mangipenpen kadagiti papeles 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.",
-       "wantedfiletext-nocat-noforeign": "Dagiti sumaganad a papeles ket naus-usar ngem awanda met",
+       "wantedfiletext-cat": "Dagiti sumaganad a papeles ket maus-usar ngem awanda met. Dagiti papeles manipud kadagiti ganganaet a repositorio ket mabalin a mailista urayno adda. Ti kasta man a saan nga umno a positibo ket <del>maikkatto</del>. Iti maipatinayon, dagiti panid nga agisengngat kadagiti papeles nga awan ket nailista iti [[:$1]].",
+       "wantedfiletext-cat-noforeign": "Dagiti sumaganad a papeles ket naus-usar ngem awanda met. Iti maipatinayon, dagiti panid a mangipenpen kadagiti papeles ket nailista iti [[:$1]].",
+       "wantedfiletext-nocat": "Dagiti sumaganad a papeles ket maus-usar ngem awanda met. Dagiti papeles manipud ti ganganaet a repositorio ket mabalin a mailista urayno adda. No adda dagiti kasta a saan nga umno a positibo ket <del>maikkatto</del>.",
+       "wantedfiletext-nocat-noforeign": "Dagiti sumaganad a papeles ket naus-usar ngem awanda met.",
        "wantedtemplates": "Dagiti makiddaw a plantilia",
        "mostlinked": "Dagiti panid a kaaduan iti nakasilpo",
        "mostlinkedcategories": "Dagiti kategoria a kaaduan iti nakasilpo",
        "mostcategories": "Dagiti panid a kaaduan kadagiti kategoria",
        "mostimages": "Dagiti papeles a kaaduan iti nakasilpo",
        "mostinterwikis": "Dagiti panid a kaaduan kadagiti interwiki",
-       "mostrevisions": "Dagiti artikulo a kaaduan ti pannakabalbaliwna",
+       "mostrevisions": "Dagiti artikulo a kaaduan kadagiti rebision",
        "prefixindex": "Dagiti amin a panid nga addaan iti pasaruno",
-       "prefixindex-namespace": "Amin a panid nga addaan ti pasaruno ($1 a nagan ti espasio)",
+       "prefixindex-namespace": "Amin a pampanid nga addaan iti pasaruno (nagan ti espasio ti $1)",
        "prefixindex-strip": "Ikkaten ti pasaruno iti listaan",
        "shortpages": "Dagiti ababa a panid",
        "longpages": "Dagiti atiddog a panid",
        "deadendpages": "Dagiti ngudo a panid",
-       "deadendpagestext": "Dagitoy a pampanid ket saan a nakasilpo ti sabali a pampanid ditoy {{SITENAME}} .",
+       "deadendpagestext": "Dagiti sumaganad a panid ket saan a nakasilpo kadagiti sabali a panid iti {{SITENAME}}.",
        "protectedpages": "Dagiti nasalakniban a panid",
-       "protectedpages-indef": "Inggat ingana a salakniban laeng",
+       "protectedpages-indef": "Dagiti inggat ingana a salaknib laeng",
        "protectedpages-summary": "Daytoy a panid ket ilistana dagiti panid nga agdama a nasalakniban. Para iti listaan dagiti titulo a nasalakniban manipud ti pannakapartuat, kitaen ti [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Dagiti sariap a salaknib laeng",
        "protectedpages-noredirect": "Ilemmeng dagiti baw-ing",
        "protectedpages-unknown-performer": "Di ammo nga agar-aramat",
        "protectedtitles": "Dagiti nasalakniban a titulo",
        "protectedtitles-summary": "Daytoy a panid ket ilistana dagiti titulo nga agdama a nasalakniban manipud ti pannakapartuat. Para iti listaan dagiti adda a panid a nasalakniban, kitaen ti  [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]..",
-       "protectedtitlesempty": "Awan dagiti titulo nga agdama a nasalakniban iti dagitoy a parametro.",
-       "listusers": "Listaan dagiti agar-aramat",
-       "listusers-editsonly": "Ipakita laeng dagiti agar-aramat nga adda inurnosda",
-       "listusers-creationsort": "Ilasin no ania a petsa ti pannakaaramid",
-       "listusers-desc": "Paglalasinen iti agpababa nga urnos",
+       "protectedtitlesempty": "Awan dagiti titulo nga agdama a nasalakniban kadagitoy a parametro.",
+       "listusers": "Listaan ti agar-aramat",
+       "listusers-editsonly": "Ipakita laeng dagiti agar-aramat nga addaan kadagiti inurnos",
+       "listusers-creationsort": "Ilasin babaen ti petsa a pannakapartuat",
+       "listusers-desc": "Ilasin iti agpababa nga urnos",
        "usereditcount": "$1 {{PLURAL:$1|nga inurnos|kadagiti inurnos}}",
-       "usercreated": "{{GENDER:$3|Inaramid}} idi $1 idi $2",
+       "usercreated": "{{GENDER:$3|Pinartuat}} idi $1, $2",
        "newpages": "Baro a pampanid",
        "newpages-username": "Nagan ti agar-aramat:",
        "ancientpages": "Dagiti kadaanan a panid",
        "move": "Iyalis",
        "movethispage": "Iyalis daytoy a panid",
-       "unusedimagestext": "Adda dagiti sumaganad a papeles ngem saanda a naikabil iti ania man a panid.\nPangngaasi a laglagipen a dagiti sabali a sapot ti pagsaadan  ket makasilpoda ti papeles iti dagus a URL, ken isu pay a nailista da ditoy urayno saanda a naus-usar iti agdama.",
-       "unusedcategoriestext": "Adda dagiti sumaganad a kategoria a panid, ngem awan ti sabali a panid wenno kategoria ti agus-usar kaniada.",
-       "notargettitle": "Awan ti napuntaan",
-       "notargettext": "Saanmo a nainagan ti puntaan a panid wenno agar-aramat ti mangtungpal daytoy nga opisio.",
+       "unusedimagestext": "Adda dagiti sumaganad a papeles ngem saanda a naikabil iti aniaman a panid.\nPangngaasi a laglagipen a dagiti sabali a sitio ti web ket mabalin a nakasilpoda iti papeles iti dagus a URL, ken mabalin pay a nailista ditoy urayno saanda nga aktibo a maus-usar.",
+       "unusedcategoriestext": "Ti sumaganad a kategoria ti pampanid ket adda,urayno awan ti sabali a panid wenno kategoria ti agus-usar kaniada.",
+       "notargettitle": "Awan ti puntaan",
+       "notargettext": "Saanmo a nainagan ti puntaan a panid wenno agar-aramat ti mangtungpal iti daytoy nga annong.",
        "nopagetitle": "Awan ti kasta a puntaan a panid",
        "nopagetext": "Awan ti puntaan a panid a nainaganam.",
-       "pager-newer-n": "{{PLURAL:$1|nabarbaro 1|dagiti nabarbaro $1}}",
-       "pager-older-n": "{{PLURAL:$1|nadadaan 1|nadadaan $1}}",
+       "pager-newer-n": "{{PLURAL:$1|nabarbaro a 1|nabarbaro a $1}}",
+       "pager-older-n": "{{PLURAL:$1|nadadaan a 1|nadadaan a $1}}",
        "suppress": "Pakapansin",
-       "querypage-disabled": "Daytoy a nangruna a panid ket nabaldado gapu kadagiti rason a panagtungpal.",
+       "querypage-disabled": "Daytoy nga espesial a panid ket nabaldado gapu kadagiti rason ti kasayaat ti panagpataray.",
        "booksources": "Dagiti taudan ti libro",
-       "booksources-search-legend": "Agsapul para kadagiti taudan ti libro",
+       "booksources-search-legend": "Agbiruk para kadagiti taudan ti libro",
        "booksources-go": "Inkan",
-       "booksources-text": "Dita baba ket listaan dagiti silpo ti sabsali a lugar nga aglaklako ti liblibro, ken baka adda pay adu a pakaammoda kadagiti liblibro a kitkitaem:",
-       "booksources-invalid-isbn": "Ti naited nga ISBN ket kasla saan nga umisu; kitaen dagiti biddut ti panagtulad kadagiti naggappuanna a taudan.",
-       "specialloguserlabel": "Ti nagtungpal:",
+       "booksources-text": "Dita baba ket listaan dagiti silpo ti sabali a sitio nga aglaklako ti baro ken saan a nausar a liblibro, ken mabalin nga addaan pay iti adu a pakaammo a maipanggep kadagiti libro a birbirukem:",
+       "booksources-invalid-isbn": "Ti naited nga ISBN ket kasla saan nga umisu; kitaen dagiti biddut ti panagtulad manipud ti kasisigud a taudan.",
+       "specialloguserlabel": "Perpormer:",
        "speciallogtitlelabel": "Puntaan (titulo wenno agar-aramat):",
        "log": "Dagiti listaan",
        "all-logs-page": "Amin a listaan a publiko",
-       "alllogstext": "Naipagtipon a pinagpakita kadagiti amin nga adda a listaan ti {{SITENAME}}.\nMapabassitmo ti pinagpakita no piliam ti kita ti listaan, ti nagan ti agar-aramat (sensitibo ti kadakkel ti letra), wenno ti naapektaran a panid (ket sensitibo met ti kadakkel ti letra).",
-       "logempty": "Awan ti agpada a bagay dita listaan.",
-       "log-title-wildcard": "Agsapul kadagiti titulo nga agrugi iti daytoy a testo",
-       "showhideselectedlogentries": "Ipakita/ilemmeng dagiti napili a naikabil ti listaan",
+       "alllogstext": "Naikaykaysa a panagiparang kadagiti amin a magun-od a listaan iti {{SITENAME}}.\nMapabassitmo ti panagkita babaen ti panagpili ti kita ti listaan, ti nagan ti agar-aramat (sensitibo ti kadakkel ti letra), wenno ti naapektaran a panid (sensitibo pay ti kadakkel ti letra).",
+       "logempty": "Awan dagiti maipada a banag iti listaan.",
+       "log-title-wildcard": "Agbiruk kadagiti titulo a mangrugi iti daytoy a testo",
+       "showhideselectedlogentries": "Baliwan ti panagkita kadagiti napili a naikabil iti listaan",
        "allpages": "Amin a pampanid",
        "nextpage": "sumaruno a panid ($1)",
        "prevpage": "Napalabas a panid ($1)",
        "allpagesfrom": "Ipakita dagiti panid a mangrugi iti:",
        "allpagesto": "Ipakita dagiti panid nga agpatingga iti:",
        "allarticles": "Amin a pampanid",
-       "allinnamespace": "Amin a pampanid ($1 a nagan ti espasio)",
+       "allinnamespace": "Amin a pampanid (nagan ti espasio ti $1)",
        "allpagessubmit": "Inkan",
        "allpagesprefix": "Iparang dagiti pampanid nga adda pasarunona:",
-       "allpagesbadtitle": "Ti naited a titulo ti panid ket imbalido wenno adda idi ti sabali a pagsasao wenno interwiki a pasarunona.",
-       "allpages-bad-ns": "Awan ti {{SITENAME}} iti nagan ti espasio a \"$1\".",
+       "allpagesbadtitle": "Ti naited a titulo ti panid ket imbalido wenno adda idi ti sabali a pagsasao wenno interwiki a pasarunona.\nDaytoy ket mabalin nga aglaon iti maysa wenno ad-adu a karkarakter a saan a mausar kadagiti titulo.",
+       "allpages-bad-ns": "Ti {{SITENAME}} ket awan iti nagan ti espasio iti \"$1\".",
        "allpages-hide-redirects": "Ilemmeng dagiti baw-ing",
-       "cachedspecial-viewing-cached-ttl": "Kitkitaem ti naidulin a bersion iti daytoy a panid, nga addan ti kadaanan a $1.",
-       "cachedspecial-viewing-cached-ts": "Kitkitaem ti maysa a naidulin a bersion iti daytoy a panid, a baka daytoy ket saan a kompleto nga agpayso.",
+       "cachedspecial-viewing-cached-ttl": "Kitkitaem ti naidulin a bersion iti daytoy a panid, a mabalin nga agduog iti $1.",
+       "cachedspecial-viewing-cached-ts": "Kitkitaem ti maysa a naidulin a bersion iti daytoy a panid, a mabalin daytoy a saan a kompleto nga agpayso.",
        "cachedspecial-refresh-now": "Kitaen ti kinaudian.",
        "categories": "Katkategoria",
        "categoriespagetext": "Ti sumaganad a {{PLURAL:$1|kategoria ket aglaon|katkategoria ket aglaon}} kadagiti panid wenno midia.\n[[Special:UnusedCategories|Dagiti saan a nausar a kategoria]] ket saan a maiparang ditoy.\nKitaen met [[Special:WantedCategories|dagiti makiddaw a kategoria]].",
        "categoriesfrom": "Ipakita dagiti kategoria a mangrugi iti:",
-       "special-categories-sort-count": "paglalasinen babaen ti bilang",
-       "special-categories-sort-abc": "paglalasinen nga alpabetiko",
-       "deletedcontributions": "Dagiti naikkat nga inararamid ti agar-aramat",
-       "deletedcontributions-title": "Dagiti naikkat nga inararamid ti agar-aramat",
-       "sp-deletedcontributions-contribs": "naar-aramid",
+       "special-categories-sort-count": "ilasin babaen ti bilang",
+       "special-categories-sort-abc": "ilasin nga alpabetiko",
+       "deletedcontributions": "Dagiti naikkat a kontribusion ti agar-aramat",
+       "deletedcontributions-title": "Dagiti naikkat a kontribusion ti agar-aramat",
+       "sp-deletedcontributions-contribs": "dagiti kontribusion",
        "linksearch": "Dagiti panagbiruk ti ruar a silpo",
        "linksearch-pat": "Tabas ti panagbiruk:",
        "linksearch-ns": "Nagan ti espasio:",
        "linksearch-ok": "Biruken",
-       "linksearch-text": "Ti naataap a tarheta a kas ti \"*.wikipedia.org\" ket mabalin nga usaren.\nMasapul ti kangatuan a pagturayan, a kaspagarigan \"*.org\".<br />\n{{PLURAL:$2|Ti protokol|Dagiti protokol}} a nasuportaran: <code>$1</code> (naipakasigud ti http:// no awan ti protokol a nainaganan).",
-       "linksearch-line": "Ti $1 ket nakasilpo idiay $2",
-       "linksearch-error": "Ti naatap a tarheta ket agparang laeng iti panagrugi ti nagan ti agsangaili.",
+       "linksearch-text": "Dagiti naatap a tarheta a kas ti \"*.wikipedia.org\" ket mabalin nga usaren.\nMasapul ti saan a basbassit ngem kangatuan a dominio, kas pagarigan \"*.org\".<br />\n{{PLURAL:$2|Ti protokol|Dagiti protokol}} a nasuportaran: <code>$1</code> (kasisigud iti http:// no awan ti nainaganan a protokol).",
+       "linksearch-line": "Ti $1 ket naisilpo manipud ti $2",
+       "linksearch-error": "Ti naatap a tarheta ket mabalin nga agparang laeng iti rugi ti nagan ti agsangaili.",
        "listusersfrom": "Iparang dagiti agar-aramat a mangrugi iti:",
        "listusers-submit": "Ipakita",
        "listusers-noresult": "Awan ti nasarakan nga agar-aramat.",
        "listusers-blocked": "(naserraan)",
-       "activeusers": "Listaan dagiti nasiglat nga agar-aramat",
-       "activeusers-intro": "Daytoy ti listaan dagiti agar-aramat nga adda inararamidda kadagiti napalabas a $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}}.",
-       "activeusers-count": "$1 {{PLURAL:$1|a tignay|tigtignay}} idi kalpasan ti {{PLURAL:$3|nga aldaw|$3 nga al-aldaw}}",
+       "activeusers": "Listaan dagiti aktibo nga agar-aramat",
+       "activeusers-intro": "Daytoy ti listaan dagiti agar-aramat nga adda inar-aramid iti kaunegan dagiti napalabas a $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}}.",
+       "activeusers-count": "$1 a {{PLURAL:$1|tignay|tigtignay}} iti napalabas {{PLURAL:$3|nga aldaw|a $3 nga al-aldaw}}",
        "activeusers-from": "Iparang dagiti agar-aramat a mangrugi iti:",
        "activeusers-hidebots": "Ilemmeng dagiti bot",
        "activeusers-hidesysops": "Ilemmeng dagiti administrador",
        "activeusers-noresult": "Awan ti nasarakan nga agar-aramat.",
        "listgrouprights": "Dagiti karbengan ti grupo ti agar-aramat",
-       "listgrouprights-summary": "Dagiti sumaganad a listaan ti grupo ti agar-aramat a naipalawag iti daytoy a wiki, a nairaman dagiti karbengan ti panagserrekda.\nAdda pay mabalin nga [[{{MediaWiki:Listgrouprights-helppage}}|adu a pakaammo]] a maipapan kadagiti bukbukod a karbengan.",
-       "listgrouprights-key": "Sarita: \n* <span class=\"listgrouprights-granted\">Naited a karbengan</span> \n* <span class=\"listgrouprights-revoked\">Naukas a karbengan</span>",
+       "listgrouprights-summary": "Dagiti sumaganad a listaan ti grupo ti agar-aramat a naipalawag iti daytoy a wiki, a nairaman dagiti mainaig a karbengan ti panagserrekda.\nAdda pay mabalin nga [[{{MediaWiki:Listgrouprights-helppage}}|adu a pakaammo]] a maipanggep kadagiti kabukbuodan a karbengan.",
+       "listgrouprights-key": "Leyenda: \n* <span class=\"listgrouprights-granted\">Naited a karbengan</span> \n* <span class=\"listgrouprights-revoked\">Naukas a karbengan</span>",
        "listgrouprights-group": "Grupo",
        "listgrouprights-rights": "Dagiti karbengan",
        "listgrouprights-helppage": "Help:Dagiti karbengan ti grupo",
        "listgrouprights-members": "(listaan ti kamkameng)",
-       "listgrouprights-addgroup": "Agnayon ti {{PLURAL:$2|a grupo|kadagiti grupo}} : $1",
-       "listgrouprights-removegroup": "Aggikkat ti {{PLURAL:$2|a grupo|kadagiti grupo}}: $1",
+       "listgrouprights-addgroup": "Agnayon {{PLURAL:$2|iti grupo|kadagiti grupo}} : $1",
+       "listgrouprights-removegroup": "Aggikkat {{PLURAL:$2|iti grupo|kadagiti grupo}}: $1",
        "listgrouprights-addgroup-all": "Inayon amin dagiti grupo",
        "listgrouprights-removegroup-all": "Ikkatem amin dagiti grupo",
-       "listgrouprights-addgroup-self": "Agnayon ti {{PLURAL:$2|a grupo|kadagiti grupo}} iti bukod a pakabilangan: $1",
-       "listgrouprights-removegroup-self": "Agikkat ti {{PLURAL:$2|a grupo|kadagiti grupo}} manipud ti bukod a pakabilangan: $1",
+       "listgrouprights-addgroup-self": "Agnayon {{PLURAL:$2|iti grupo|kadagiti grupo}} iti bukod a pakabilangan: $1",
+       "listgrouprights-removegroup-self": "Agikkat {{PLURAL:$2|iti grupo|kadagiti grupo}} manipud ti bukod a pakabilangan: $1",
        "listgrouprights-addgroup-self-all": "Inayon amin dagiti grupo iti bukod a pakabilangan",
        "listgrouprights-removegroup-self-all": "Ikkatem amin dagiti grupo manipud ti bukod a pakabilangan",
        "listgrouprights-namespaceprotection-header": "Dagiti panangigawid ti nagan ti espasio",
        "index-category-desc": "Ti panid ket addaan iti <code><nowiki>__INDEX__</nowiki></code> (ken adda iti nagan ti espasio a maipalubos ti wagayway), ken isu a naipagsurotan babaen dagiti robot ngem no iti kadawyan ket saan.",
        "post-expand-template-inclusion-category-desc": "Kalpasan ti panagpadakkel kadagiti amin a plantilia, ti kadakkel ti panid ket dakdakkel ngem ti <code>$wgMaxArticleSize</code>, isu a dagiti plantilia ket saan a napadakkel.",
        "post-expand-template-argument-category-desc": "Kalpasan ti panagpadakkel ti argumento ti plantilia (dagiti addaan iti tallo a pangrikep, kasla ti <code>{{{Foo}}}</code>), ti panid ket dakdakkel ngem ti <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "Adu unay dagiti nangina nga annong ti parser (kasla ti <code>#ifexist</code>) a nairaman iti panid. Kitaen ti[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "expensive-parserfunction-category-desc": "Adu unay dagiti nangina nga annong ti parser (kasla ti <code>#ifexist</code>) a nairaman iti panid. Kitaen ti [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "Kategoria a nainayon no ti panid ket aglaon ti nadadael a silpo ti papeles (ti silpo a panangisengngat ti papeles no awan ti papeles).",
-       "hidden-category-category-desc": "Daytoy ket kategoria nga addaan iti <code><nowiki>__HIDDENCAT__</nowiki></code> , a mangpawil daytoy nga agparang kadagiti silpo ti kahon ti kategoria kadagiti panid, bbabaen ti kasisigud.",
+       "hidden-category-category-desc": "Daytoy ket kategoria nga addaan iti <code><nowiki>__HIDDENCAT__</nowiki></code> , a mangpawil daytoy nga agparang kadagiti silpo ti kahon ti kategoria kadagiti panid, babaen ti kasisigud.",
        "trackingcategories-nodesc": "Awan ti magun-od a deskripsion.",
        "trackingcategories-disabled": "Nabaldado ti kategoria",
        "mailnologin": "Awan ti pagipatulodan a pagtaengan",
-       "mailnologintext": "Masapul a [[Special:UserLogin|nakastrekka]] ken adda umisu nga esurat a pagtaengan idiay [[Special:Preferences|kaykayatmo]] ti agipatulod ti esurat kadagiti sabsabali nga agar-aramat.",
+       "mailnologintext": "Masapul a [[Special:UserLogin|nakastrekka]] ken adda umisu nga esurat a pagtaengan idiay [[Special:Preferences|kaykayatam]] tapno makaipatulod iti esurat kadagiti sabali nga agar-aramat.",
        "emailuser": "Esuratan daytoy nga agar-aramat",
        "emailuser-title-target": "Esuratam daytoy nga {{GENDER:$1|agar-aramat}}",
        "emailuser-title-notarget": "Esuratan ti agar-aramat",
        "emailpage": "Esuratan ti agar-aramat",
-       "emailpagetext": "Mabalinmo nga usaren ti kinabuklan dita baba nga agipatulod ti e-surat a mensahe ti daytoy nga {{GENDER:$1|agar-aramat}}.\nTi e-surat nga inkabilmo idiay  [[Special:Preferences|kakaykayatam]] ket agparang a kas \"Naggapu\" a pagtaengan ti e-surat, tapno ti nagipatulodam ket makasungbat kenka.",
+       "emailpagetext": "Mabalinmo nga usaren ti porma dita baba tapno makaipatulod ti esurat a mensahe iti daytoy nga {{GENDER:$1|agar-aramat}}.\nTi esurat nga inkabilmo iti [[Special:Preferences|kakaykayatam]] ket agparang a kas \"Naggapu\" a pagtaengan ti esurat, tapno ti nagipatulodam ket makasungbat kenka.",
        "defemailsubject": "Esurat ti {{SITENAME}} a naggapo kenni \"$1\"",
        "usermaildisabled": "Saanmo a mabalin ti agipatulod ti esurat",
-       "usermaildisabledtext": "Saanmo a mabalin ti agipatulod ti esurat kadagiti sabali nga agar-aramat ditoy a wiki",
+       "usermaildisabledtext": "Saanmo a mabalin ti agipatulod ti esurat kadagiti sabali nga agar-aramat iti daytoy a wiki",
        "noemailtitle": "Awan ti esurat a pagtaengan",
        "noemailtext": "Ti agar-aramat ket saan a nanginagan ti umisu nga esurat a pagtaengan.",
        "nowikiemailtext": "Ti agar-aramat ket mabalinna ti agpili a saan nga umawat iti esurat kadagiti sabali nga agar-aramat.",
        "emailccsubject": "Kopia ti mensahem kenni $1: $2",
        "emailsent": "Naipatuloden ti esurat",
        "emailsenttext": "Naipatuloden ti esurat a mensahem.",
-       "emailuserfooter": "Daytoy nga esurat ket impatulod ni $1 kenni $2 iti \"Esurat\" a panagararamid idiay {{SITENAME}}",
-       "usermessage-summary": "Agibatbati ti mesahe iti sistema.",
-       "usermessage-editor": "Mensahero iti sistema",
+       "emailuserfooter": "Daytoy nga esurat ket impatulod babaen ni $1 kenni $2 iti \"Esurat\" nga annong iti {{SITENAME}}",
+       "usermessage-summary": "Pumanpanaw iti mesahe ti sistema.",
+       "usermessage-editor": "Mensahero ti sistema",
        "watchlist": "Bambantayan",
        "mywatchlist": "Bambantayan",
        "watchlistfor2": "Para iti $1 $2",
        "nowatchlist": "Awan ti banag iti listaan dagiti bambantayam.",
        "watchlistanontext": "Pangngaasim ti $1 tapno makitam dagiti inurnosmo dita bambantayam.",
        "watchnologin": "Saan a nakastrek",
-       "addwatch": "Inayon iti bambantayan",
+       "addwatch": "Inayon iti listaan ti bambantayan",
        "addedwatchtext": "Ti panid iti \"[[:$1]]\" ket nainayonen idiay [[Special:Watchlist|listaan ti bambantayam]].\nDagiti masakbayan a panagsukat iti daytoy a panid ken dagiti mainaig a tungtunganna a panid ket mailistanto idiay.",
        "addedwatchtext-short": "Ti panid ti \"$1\" ket nainayonen iti listaan ti bambantayam.",
-       "removewatch": "Ikkaten dita bambantayan",
+       "removewatch": "Ikkaten manipud ti listaan ti bambantayan",
        "removedwatchtext": "Daytoy a panid  \"[[:$1]]\" ket naikkat idiay [[Special:Watchlist|bambantayam]].",
        "removedwatchtext-short": "Ti panid ti \"$1\" ket naikkaten manipud ti listaan ti bambantayam.",
-       "watch": "bantayan",
+       "watch": "Bantayan",
        "watchthispage": "Bantayan daytoy a panid",
        "unwatch": "Saanen a bantayan",
        "unwatchthispage": "Isardeng a bantayan daytoy a panid",
        "notanarticle": "Saan a naglaon a panid",
-       "notvisiblerev": "Ti panagbalbaliw ti sabali nga agar-aramat ket naikkaten",
-       "watchlist-details": "{{PLURAL:$1|$1 panid|$1 dagiti panid}} a bambantayam, saan a naisina a mairaman dagiti panid ti tungtungan.",
+       "notvisiblerev": "Ti naudi a rebision babaen ti sabali nga agar-aramat ket naikkaten",
+       "watchlist-details": "{{PLURAL:$1|$1 a panid|$1 a pampanid}} iti listaan ti bambantayam, a saan a naisina a mairaman dagiti panid ti tungtungan.",
        "wlheader-enotif": "Napakabaelan ti panangipakaammo ti esurat.",
-       "wlheader-showupdated": "Dagiti panid a nasukatanen manipud ti kinaudi a panagsarungkarmo ket naipakita iti '''napuskol'''",
-       "wlnote2": "Dita baba ket dagiti binalbaliwan {{PLURAL:$1|iti napalabas nga oras|kadagiti napalabas a <strong>$1</strong> nga oras}}, manipud idi $2, $3.",
+       "wlheader-showupdated": "Dagiti panid a nasukatanen manipud ti kinaudi a panagsarungkarmo ket naipakita iti <strong>napuskol</strong>.",
+       "wlnote": "Dita baba ket {{PLURAL:$1|naudi a sinukatan|dagiti naudi a <strong>$1</strong> a sinukatan}} iti napalabas {{PLURAL:$2|nga oras|a <strong>$2</strong> nga or-oras}}, manipud 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",
        "watching": "Bambantayan...",
        "unwatching": "Saanen a bantayan...",
-       "watcherrortext": "Adda nagkabiddut idi suksukatam ti kita ti bambantayam \"$1\".",
+       "watcherrortext": "Adda napasamak a biddut bayat a suksukatam dagiti pannakaisaad ti listaan ti bambantayam para iti \"$1\".",
        "enotif_reset": "Markaan amin a pampanid a kas nasarungkaran",
        "enotif_impersonal_salutation": "Agar-aramat ti {{SITENAME}}",
        "enotif_subject_deleted": "Ti {{SITENAME}} a panid ti $1 ket inikkat idin babaen ni {{gender:$2|$2}}",
-       "enotif_subject_created": "Ti {{SITENAME}} a panid ti $1 ket napartuat idin babaen ni {{gender:$2|$2}}",
-       "enotif_subject_moved": "Ti {{SITENAME}} panid ti $1 ket naiyalis idin babaen ni {{gender:$2|$2}}",
-       "enotif_subject_restored": "Ti {{SITENAME}} a panid ti $1 ket naipasubli idin babaen ni {{gender:$2|$2}}",
-       "enotif_subject_changed": "Ti {{SITENAME}} a panid ti $1 ket nasukatan idin babaen ni {{gender:$2|$2}}",
-       "enotif_body_intro_deleted": "Ti {{SITENAME}} a panid ti $1 ket {{GENDER:$2|naikkaten}} idiay $PAGEEDITDATE babaen ni $2, kitaen ti $3.",
-       "enotif_body_intro_created": "Ti {{SITENAME}} a panid ti $1 ket napartuat idin idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.",
-       "enotif_body_intro_moved": "Ti {{SITENAME}} a panid ti $1 ket naiyalis idin idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.",
-       "enotif_body_intro_restored": "Ti {{SITENAME}} a panid ti $1 ket naipasubli idi idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.",
-       "enotif_body_intro_changed": "Ti {{SITENAME}} a panid ti $1 ket nasukatan idin idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.",
+       "enotif_subject_created": "Ti {{SITENAME}} a panid ti $1 ket pinartuat idin babaen ni {{gender:$2|$2}}",
+       "enotif_subject_moved": "Ti {{SITENAME}} panid ti $1 ket inyalis idin babaen ni {{gender:$2|$2}}",
+       "enotif_subject_restored": "Ti {{SITENAME}} a panid ti $1 ket inpulang idin babaen ni {{gender:$2|$2}}",
+       "enotif_subject_changed": "Ti {{SITENAME}} a panid ti $1 ket sinukatan idin babaen ni {{gender:$2|$2}}",
+       "enotif_body_intro_deleted": "Ti {{SITENAME}} a panid ti $1 ket {{GENDER:$2|naikkat}} idi $PAGEEDITDATE babaen ni $2, kitaen ti $3.",
+       "enotif_body_intro_created": "Ti {{SITENAME}} a panid ti $1 ket napartuaten idi $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.",
+       "enotif_body_intro_moved": "Ti {{SITENAME}} a panid ti $1 ket naiyalisen idi $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.",
+       "enotif_body_intro_restored": "Ti {{SITENAME}} a panid ti $1 ket naipulangen idi $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.",
+       "enotif_body_intro_changed": "Ti {{SITENAME}} a panid ti $1 ket nasukatanen idi $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.",
        "enotif_lastvisited": "Kitaen ti $1 para iti am-amin a panagsukat sipud ti naudi nga isasarungkarmo.",
        "enotif_lastdiff": "Kitaen ti $1 tapno mabuya daytoy a panagsukat.",
        "enotif_anon_editor": "di am-ammo nga agar-aramat $1",
-       "enotif_body": "Nadungngo a $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nPakabuklan ti mannurat: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaken ti mannurat:\nsurat: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAwanton dagiti sabali a pakaammo iti kaso ti adu pay a panagtigtignay malaksid no sarungkaram datoy a panid bayat a nakastrekka. Mabalinmo pay nga iyasentar manen dagiti wagayway ti pakaammo para kadagiti amin a bambantayam a panid idiay listaan ti bambantayam.\n\nTi mannakigayyem a sistema ti panagpaammo ti {{SITENAME}} \n\n--\nTi panagsukat ti kasasaad ti esurat a pagpa-ammom, sarungkaram ti\n{{canonicalurl:{{#special:Preferences}}}}\n\nTi panagsukat kadagiti kasasaad ti bambantayam, sarungkaram ti\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTi panag-ikkat ti panid kadagiti bambantayam, sarungkaram ti\n$UNWATCHURL\n\nTi makunkunam ken no masapulmo pay ti tulong:\n$HELPPAGE",
+       "enotif_body": "Nadungngo a $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nPakabuklan ti mannurat: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaken ti mannurat:\nsurat: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAwanton dagiti sabali a pakaammo iti kaso ti adu pay a panagtigtignay malaksid no sarungkaram datoy a panid bayat a nakastrekka. Mabalinmo pay nga isaad manen dagiti wagayway ti pakaammo para kadagiti amin a bambantayam a panid idiay listaan ti bambantayam.\n\nTi mannakigayyem a sistema ti panagpaammo ti {{SITENAME}} \n\n--\nTi panagsukat ti kasasaad ti esurat a pagpa-ammom, sarungkaram ti\n{{canonicalurl:{{#special:Preferences}}}}\n\nTi panagsukat kadagiti kasasaad ti listaan ti bambantayam, sarungkaram ti\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTi panagikkat ti panid kadagiti listaan ti bambantayam, sarungkaram ti\n$UNWATCHURL\n\nTi makunkunam ken no masapulmo pay ti tulong:\n$HELPPAGE",
        "created": "naaramid",
        "changed": "nasukatan",
        "deletepage": "Ikkaten ti panid",
        "confirm": "Pasingkedan",
        "excontent": "ti linaon idi ket: '$1'",
-       "excontentauthor": "ti linaonna idi ket: \"$1\" (ken ti laeng nakaaramid idi ket ni \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "ti linaonna idi ket: \"$1\" (ken ti laeng kontributor idi ket ni \"[[Special:Contributions/$2|$2]]\")",
        "exbeforeblank": "ti linaon sakbay idi nablanko ket: \"$1\"",
        "delete-confirm": "Ikkaten ti \"$1\"",
        "delete-legend": "Ikkaten",
-       "historywarning": "'''Ballaag: ''' Ti panid a kayatmo nga ikkaten ket adda pakasaritaanna ti agarup a $1 {{PLURAL:$1|a binaliwan|kadagiti binaliwan}}:",
-       "confirmdeletetext": "Ikkatemon ti maysa a panid agraman am-amin a pakasaritaanna.\nPangngaasim ta pasingkedam a talaga a kayatmo nga aramiden daytoy, a maawatam ti bunga ti panangikkatmo, ken aramidem daytoy kas maiyannugot iti [[{{MediaWiki:Policy-url}}|annuroten]].",
-       "actioncomplete": "Nalpasen a naaramid",
+       "historywarning": "<strong>Ballaag:</strong> Ti panid a kayatmo nga ikkaten ket adda pakasaritaanna ti agarup a $1 {{PLURAL:$1|a rebision|kadagiti rebision}}:",
+       "confirmdeletetext": "Mangrugrugika a mangikkat ti maysa a panid a kakuyogna amin ti pakasaritaanna.\nPangngaasi a pasingkedam a talaga a kayatmo nga aramiden daytoy, a maawatam ti bunga ti panangikkatmo, ken aramidem daytoy kas maiyannugot iti [[{{MediaWiki:Policy-url}}|annuroten]].",
+       "actioncomplete": "Nalpasen ti aramid",
        "actionfailed": "Napaay ti aramid",
-       "deletedtext": "Naikkaten ti \"$1\".\nKitaen ti $2 para iti pannakrehistro dagiti naudi a naikkat.",
+       "deletedtext": "Naikkaten ti \"$1\".\nKitaen ti $2 para iti pannakairehistro dagiti naudi a pangikkat.",
        "dellogpage": "Listaan ti panagikkat",
        "dellogpagetext": "Adda dita baba ti listaan dagiti kaudian a panangikkat.",
        "deletionlog": "listaan ti panagikkat",
-       "reverted": "Naisubli iti immuna a panagbalbaliw",
+       "reverted": "Naisubli iti nasapsapa a rebision",
        "deletecomment": "Rason:",
        "deleteotherreason": "Sabali/maipatinayon a rason:",
        "deletereasonotherlist": "Sabali a rason",
-       "deletereason-dropdown": "* Kadawyan a rasrason ti panagikkat\n** Spam\n** Bandalismo\n** Panaglabsing iti karbengan ti panagipablaak\n** Kiddaw ti mannurat\n** Naputed a baw-ing",
+       "deletereason-dropdown": "* Kadawyan a rasrason ti panagikkat\n** Spam\n** Bandalismo\n** Panaglabsing iti karbengan ti kopia\n** Kiddaw ti mannurat\n** Naputed a baw-ing",
        "delete-edit-reasonlist": "Urnosen dagiti rason ti panagikkat",
        "delete-toobig": "Daytoy a panid ket dakkel ti pakasaritaanna, sumurok a  $1 {{PLURAL:a panagbaliwan|dagiti panagbaliwan}}.\nTi panagikkat ti kastoy a pammpanid ket naparitan tapno mapawilan ti saan nga inkarkaro a pannakadadael ti {{SITENAME}}.",
        "delete-warning-toobig": "Daytoy a panid ket adda ti dakkel unay a pakasaritaan ti panag-urnos, ti kaadu nga $1 {{PLURAL:$1|panagbaliw|dagiti panagbaliw}}.\nTi panagikkat ket madisturbo ti panagpataray ti database ti {{SITNAME}};\nagal-aluadka a mangrugi.",
        "rollback": "Isubli dagiti panag-urnos",
        "rollback_short": "Isubli",
        "rollbacklink": "isubli",
-       "rollbacklinkcount": "agisubli ti $1 {{PLURAL:$1|nga inurnos|nga inururnos}}",
-       "rollbacklinkcount-morethan": "agisubli ti ad-adu ngem $1 {{PLURAL:$1|nga inurnos|nga inururnos}}",
+       "rollbacklinkcount": "agisubli ti $1 {{PLURAL:$1|nga inurnos|nga inur-urnos}}",
+       "rollbacklinkcount-morethan": "agisubli ti ad-adu ngem $1 {{PLURAL:$1|nga inurnos|nga inur-urnos}}",
        "rollbackfailed": "Napaay ti panangisubli",
-       "cantrollback": "Saan a maisubli ti panagurnos;\nti naudi a nakaaramid ket iti laeng nagsurat daytoy a panid..",
+       "cantrollback": "Saan a maisubli ti panagurnos;\nti naudi a nakaaramid ket iti laeng nagsurat iti daytoy a panid.",
        "alreadyrolled": "Saan a maipasubli ti kinaudi a panagurnos iti [[:$1]] babaen ni [[User:$2|$2]] ([[User talk:$2|tungtungan]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nadda sabali a naurnos wenno nagipasubli ti panid.\n\nTi kinaudi a panagurnos ti daytoy a panid ket babaen ni [[User:$3|$3]] ([[User talk:$3|tungtungan]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
-       "editcomment": "Ti panagurnos a pakabuklan idi ket: \"''$1''\".",
-       "revertpage": "Insubli ti panagurnos babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]]), naisubli ti kinaudi a panagbaliw babaen ni [[User:$1|$1]]",
-       "revertpage-nouser": "Naisubli dagiti inurnos babaen ti nailemmeng nga agar-aramat iti kinaudi a panagbalbaliw babaen ni {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Naibabawi dagiti panag-urnos babaen ni $1;\nnaisubli manen ti naudi a panagbaliw babaen ni $2.",
-       "sessionfailure-title": "Napaay ti gimong",
-       "sessionfailure": "Adda parikut ti gimong ti panagserrekmo;\ndaytoy nga aramid ket naibabawi a kas pagpawilan ti panaghijack ti gimong.\nAgsubli ka ti naggapuam a panid, ikargam ti panid ken padasem manen.",
+       "editcomment": "Ti pakabuklan ti panag-urnos idi ket: \"''$1''\".",
+       "revertpage": "Insubli ti panag-urnos babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]]), naisubli ti kinaudi a rebision babaen ni [[User:$1|$1]]",
+       "revertpage-nouser": "Naisubli dagiti inurnos babaen ti nailemmeng nga agar-aramat iti kinaudi a rebision babaen ni {{GENDER:$1|[[User:$1|$1]]}}",
+       "rollback-success": "Naibabawi dagiti panag-urnos babaen ni $1;\nnaisubli manen ti naudi a rebision babaen ni $2.",
+       "sessionfailure-title": "Napaay ti sesion",
+       "sessionfailure": "Adda parikut ti sesion ti panagserrekmo;\ndaytoy nga aramid ket naibabawi a kas pagpawilan ti panaghijack ti sesion.\nAgsublika iti naggapuam a panid, ikargam manen ti panid ken padasen manen.",
        "protectlogpage": "Listaan ti panagsalaknib",
        "protectlogtext": "Dita baba ket adda listaan dagiti sinukatan a salaknib ti panid.\nKitaen ti [[Special:ProtectedPages|listaan kadagiti nasalakniban a panid]] ti listaan kadagiti agdama a panagpataray a panagsalaknib ti panid.",
        "protectedarticle": "nasalakniban ti \"[[$1]]\"",
        "modifiedarticleprotection": "nasukatan ti agpang ti salaknib para iti \"[[$1]]\"",
-       "unprotectedarticle": "naikkat ti salaknib ti \"[[$1]]\"",
-       "movedarticleprotection": "iyalis ti kasasaad ti salaknib manipud iti \"[[$2]]\" idiay \"[[$1]]\"",
+       "unprotectedarticle": "naikkat ti salaknib manipud ti \"[[$1]]\"",
+       "movedarticleprotection": "iyalis ti kasasaad ti salaknib manipud ti \"[[$2]]\" iti \"[[$1]]\"",
        "protect-title": "Sukatan ti agpang ti salaknib para iti \"$1\"",
        "protect-title-notallowed": "Kitaen ti agpang ti salaknib ti \"$1\"",
        "prot_1movedto2": "[[$1]] naiyalis iti [[$2]]",
        "protect-badnamespace-title": "Saan a mabalin a salakniban a nagan ti espasio",
-       "protect-badnamespace-text": "Dagiti panid ditoy a nagan ti espasio ket saan a mabalin a masalakniban.",
-       "protect-norestrictiontypes-text": "Daytoy a panid ket saan a mabalin a masalakniban gaputa awan dagiti maiparit a kita a magun-od.",
+       "protect-badnamespace-text": "Dagiti panid iti daytoy a nagan ti espasio ket saan a mabalin a masalakniban.",
+       "protect-norestrictiontypes-text": "Daytoy a panid ket saan a mabalin a masalakniban gapu ta awan dagiti magun-od a kita ti panangigawid.",
        "protect-norestrictiontypes-title": "Di masalakniban a panid",
        "protect-legend": "Pasingkedan ti panagsalaknib",
        "protectcomment": "Rason:",
        "protect_expiry_invalid": "Imbalido ti oras a panagpaso.",
        "protect_expiry_old": "Napalabasen ti oras ti panagpaso.",
        "protect-unchain-permissions": "Lukatan dagiti pagpilian ti salaknib",
-       "protect-text": "Mabalinmo a kitaen ken sukatan ti agpang ti salaknib para iti panid ti '''$1'''.",
-       "protect-locked-blocked": "Saanmo a mabalin a sukatan dagiti kita ti salaknib no naserraanka.\nAdda ditoy kadagiti agdama a kasasaad ti panid '''$1''':",
-       "protect-locked-dblock": "Ti kita ti salaknib ket saan a masukatan gapu ti agdama a kandado ti database.\nAdda ditoy kadagiti agdama a kasasaad ti panid '''$1''':",
-       "protect-locked-access": "Awan ti pammalubos ti pakabilangam a mangsukat kadagiti lessaad ti salaknib ti panid.\nDagitoy dagiti agdama a kasasaad ti panid a '''$1''':",
-       "protect-cascadeon": "Daytoy a panid ket agdama a nasalakniban gapu ta nairaman kadagiti sumaganad a {{PLURAL:$1|panid, nga addaan|pampanid, nga addaan}} iti sipapakat a salaknib a sariap.\nDagiti panagbaliw iti agpang ti salaknib iti daytoy a panid ket saan a mabanagan ti salaknib a sariap.",
+       "protect-text": "Mabalinmo a kitaen ken sukatan ti agpang ti salaknib para iti panid ti <strong>$1</strong>.",
+       "protect-locked-blocked": "Saanmo a mabalin a sukatan dagiti kita ti salaknib no naserraanka.\nAdda ditoy kadagiti agdama a kasasaad ti panid ti <strong>$1</strong>:",
+       "protect-locked-dblock": "Ti kita ti salaknib ket saan a masukatan gapu ti agdama a kandado ti database.\nAdda ditoy kadagiti agdama a kasasaad ti panid ti <strong>$1</strong>:",
+       "protect-locked-access": "Ti pakabilangam ket awan pammalubosna a mangsukat kadagiti agpang ti salaknib ti panid.\nDagitoy ti agdama a pannakaisaad para iti panid ti <strong>$1</strong>:",
+       "protect-cascadeon": "Daytoy a panid ket agdama a nasalakniban gapu ta nairaman kadagiti sumaganad a {{PLURAL:$1|panid, nga addaan|pampanid, nga addaan}} iti nalukatan a salaknib ti sariap.\nDagiti panagbaliw iti agpang ti salaknib iti daytoy a panid ket saan a mabanagan ti salaknib ti sariap.",
        "protect-default": "Palubosan amin nga agar-aramat",
        "protect-fallback": "Palubosan laeng dagiti agar-aramat nga adda iti \"$1\" a pammalubos",
        "protect-level-autoconfirmed": "Palubosan laeng dagiti automatiko a napasingkedan nga agar-aramat",
        "protect-existing-expiry": "Ti adda a panagpaso ti oras: $3, $2",
        "protect-otherreason": "Sabali/maipatinayon a rason:",
        "protect-otherreason-op": "Sabali a rason",
-       "protect-dropdown": "*Kadawyan a rasrason ti panagsalaknib\n** Adu unay a bandalismo\n** Adu unay a panagspam\n** Saan a produktibo ti kasinnungat a panag-urnos\n** Adu unay nga agbuybuya ti panid",
+       "protect-dropdown": "*Kadawyan a rasrason ti panagsalaknib\n** Adu unay a bandalismo\n** Adu unay a panagspam\n** Saan a produktibo ti agsinnungat a panag-urnos\n** Adu unay nga agbuybuya iti panid",
        "protect-edit-reasonlist": "Urnosen dagiti rason ti salaknib",
        "protect-expiry-options": "1 nga oras:1 hour,1 nga aldaw:1 day,1 a lawas:1 week,2 a lawas:2 weeks,1 a bulan:1 month,3 a bulan:3 months,6 a bulan:6 months,1 a tawen:1 year,awan inggana:infinite",
        "restriction-type": "Pammalubos:",
-       "restriction-level": "Agpang ti pannakaiparit:",
-       "minimum-size": "Kinababa a kadakkel:",
-       "maximum-size": "Kinangato a kadakkel:",
+       "restriction-level": "Agpang ti panangigawid:",
+       "minimum-size": "Kababaan a kadakkel:",
+       "maximum-size": "Kangatuan a kadakkel:",
        "pagesize": "(dagiti byte)",
        "restriction-edit": "Urnosen",
        "restriction-move": "Iyalis",
-       "restriction-create": "Aramiden",
-       "restriction-upload": "Pang-ipan",
+       "restriction-create": "Agpartuat",
+       "restriction-upload": "Agikarga",
        "restriction-level-sysop": "napno a nasalakniban",
        "restriction-level-autoconfirmed": "nasalakniban bassit",
        "restriction-level-all": "aniaman nga agpang",
        "undelete": "Kitaen dagiti naikkat a panid",
        "undeletepage": "Kitaen ken isubli dagiti naikkat a panid",
-       "undeletepagetitle": "'''Ti sumaganad ket buklen dagiti naikkat a panagbaliw ni [[:$1|$1]]'''.",
+       "undeletepagetitle": "<strong>Ti sumaganad ket buklen dagiti naikkat a rebision ti [[:$1|$1]]</strong>.",
        "viewdeletedpage": "Kitaen dagiti naikkat a panid",
        "undeletepagetext": "Ti sumaganad a {{PLURAL:$1|panid ket naikkaten ngem|$1 pampanid ket naikkaten ngem}} adda pay naarkibo ken mabalin pay a maipasubli .\nTi arkibo ket mabalin a sagpaminsan a madalusan.",
-       "undelete-fieldset-title": "Ipasubli dagiti binaliwan",
-       "undeleteextrahelp": "Tapno maipasubli ti intero a pakasaritaan ti panid, ibatim a saan nga nakur-itan dagita kahon ken ipindut ti '''''{{int:undeletebtn}}'''''.\nTi agaramid ti napilian a panagisubli, ikur-it dagita napilim kadagiti kahon ti kayatmo nga ipasubli, ken ipindut ti '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|a binalbaliwan|kadagiti binalbaliwan}} ti nailebben",
-       "undeletehistory": "No ipasublim daytoy a panid, amin dagiti pinagbaliwan ket maipasubli idiay pakasaritaan.\nKet no adda baro a panid a kanagnagan na a naaramid ti napalabas a pinagikkat, dagiti naipasubli a pinagbaliwan ket agparang idiay napalabas a pakasaritaan.",
-       "undeleterevdel": "Ti panagikkat ket saan a maaramid no agbanag iti rabaw ti panid, wenno ti pinagbaliwan ti papeles ket maikkatan ti bassit.\nIti kastoy a kaso, masapul nga ikkatem ti kur-it wenno ikkatem ti lemmeng dagiti kabarbaro a naikkat a binalbaliwan.",
-       "undeletehistorynoadmin": "Daytoy a panid ket naikkaten.\nTi rason ti panagikkat ket naipakita ti pakabuklan dita baba, ken dagita dsalaysay ti agar-aramat a nagpabaliw ditoy a panid sakbay a naikkat.\nTi husto a testo ti nabaliwan a panagbaliw ket adda kadagiti administrador laeng.",
-       "undelete-revision": "Naikkat ti binaliwan a $1 (manipud idi $4, idi $5) babaen ni $3:",
-       "undeleterevision-missing": "Imbalido wenno napukaw a panagbaliw.\nAddaanka ngata ti madi a silpo, wenno ti panagbaliw ket naipasubli wenno naikkat manipud idiay nailebbeng.",
-       "undelete-nodiff": "Awan ti nasarakan kadagiti dati a nabalbaliwan.",
+       "undelete-fieldset-title": "Ipasubli dagiti rebision",
+       "undeleteextrahelp": "Tapno maipasubli ti intero a pakasaritaan ti panid, ibatim a saan nga nakur-itan dagita kahon ken pinduten ti '''''{{int:undeletebtn}}'''''.\nTi agaramid ti napilian a panagisubli, ikur-it dagita napilim kadagiti kahon ti kayatmo nga ipasubli, ken pinduten ti '''''{{int:undeletebtn}}'''''.",
+       "undeleterevisions": "$1 {{PLURAL:$1|a rebision|kadagiti rebision}} ti naarkibo",
+       "undeletehistory": "No ipasublim daytoy a panid, amin dagiti rebision ket maipasubli iti pakasaritaan.\nKet no adda baro a panid a kanagnaganna a naaramid ti napalabas a panagikkat, dagiti naipasubli a rebision ket agparang iti napalabas a pakasaritaan.",
+       "undeleterevdel": "Ti panagikkat ket saan a maaramid no agbanag iti rabaw ti panid, wenno ti rebision ti papeles ket maikkatan ti bassit.\nIti kastoy a kaso, masapul nga ikkatem ti kur-it wenno ikkatem ti lemmeng dagiti kabarbaro a naikkat a rebision.",
+       "undeletehistorynoadmin": "Daytoy a panid ket naikkaten.\nTi rason ti panagikkat ket naipakita iti pakabuklan dita baba, ken dagita a salaysay ti agar-aramat a nagurnos iti daytoy a panid sakbay a naikkat.\nTi husto a testo dagitoy a naikat a rebision ket magun-od laeng dagiti administrador.",
+       "undelete-revision": "Naikkat ti rebision ti $1 (manipud idi $4, $5) babaen ni $3:",
+       "undeleterevision-missing": "Imbalido wenno napukaw a rebision.\nAddaanka ngata ti madi a silpo, wenno ti rebision ket mabalin a naipasubli wenno naikkat manipud ti arkibo.",
+       "undelete-nodiff": "Awan ti nasarakan kadagiti dati a rebision.",
        "undeletebtn": "Isubli",
        "undeletelink": "kitaen/isubli",
        "undeleteviewlink": "kitaen",
        "undeleteinvert": "Baliktaden ti napili",
        "undeletecomment": "Rason:",
-       "undeletedrevisions": "{{PLURAL:$1|1 a  binaliwan|dagiti $1 a binaliwan}} ti naisubli",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 a binaliwan|dagiti $1 a binaliwan}} ken {{PLURAL:$2|1 a papeles|dagiti $2 a papeles}} ti naisubli",
+       "undeletedrevisions": "{{PLURAL:$1|1 a rebision|dagiti $1 a rebision}} ti naisubli",
+       "undeletedrevisions-files": "{{PLURAL:$1|1 a rebision|dagiti $1 a rebision}} ken {{PLURAL:$2|1 a papeles|dagiti $2 a papeles}} ti naisubli",
        "undeletedfiles": "{{PLURAL:$1|1 a papeles|dagiti $1 a papeles}} ti naisubli",
-       "cannotundelete": "Napaay ti panagikkat:\n$1",
-       "undeletedpage": "'''Naisublin ti $1'''\n\nBinsiren 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.",
+       "cannotundelete": "Napaay ti panagisubli iti panagikkat:\n$1",
+       "undeletedpage": "<strong>Naisublin ti $1</strong>\n\nBinsiren ti [[Special:Log/delete|listaan ti panagikkat]] para iti rehistro dagiti kaudian panagikkat ken naisubsubli.",
+       "undelete-header": "Kitaen [[Special:Log/delete|ti listaan ti panagikkat]] kadagiti kaudian a naikkat a panid.",
        "undelete-search-title": "Biruken dagiti naikkat a panid",
        "undelete-search-box": "Biruken dagiti naikkat a panid",
        "undelete-search-prefix": "Ipakita dagiti panid a mangrugi iti:",
        "undelete-search-submit": "Biruken",
-       "undelete-no-results": "Awan dagiti kapada ti panid a nasarakan idiay lebben ti panagikkat.",
-       "undelete-filename-mismatch": "Saan maisubli ti panagikkat ti pinagbaliwan ti papeles nga adda oras ket petsana a $1: Saan nga agpada ti nagan ti papeles.",
-       "undelete-bad-store-key": "Saan a maisubli ti pinagikkat ti pinagbaliwan ti papeles nga adda oras ket petsana a $1: Ti papeles ket napukaw sakbay a naikkat.",
-       "undelete-cleanup-error": "Biddut ti panagikkat ti saan a naus-usar a naidulin a papeles \"$1\".",
-       "undelete-missing-filearchive": "Saan a naipabalin ti panagisubli ti ID ti papeles a nailebben $1 ngamin ket awan idiay database.\nMabalin daytoy a naikkaten.",
-       "undelete-error": "Ballaag ti panagisubli ti panagikkat ti panid",
-       "undelete-error-short": "Biddut ti pannakaikkat ti papeles: $1",
-       "undelete-error-long": "Adda nasarakan a biddut idi panagisubli ti panagikkat ti papeles:\n\n$1",
-       "undelete-show-file-confirm": "Sigurado a kayatmo ti mangkita ti naikkat a panagbaliw ti papeles \"<nowiki>$1</nowiki>\" manipud idi $2 idi $3?",
+       "undelete-no-results": "Awan dagiti kapada ti panid a nasarakan idiay arkibo ti panagikkat.",
+       "undelete-filename-mismatch": "Saan maisubli ti panagikkat ti rebision ti papeles nga adda oras ket petsana a $1: Saan nga agpada ti nagan ti papeles.",
+       "undelete-bad-store-key": "Saan a maisubli ti pinagikkat ti rebision ti papeles nga adda oras ket petsana a $1: Ti papeles ket napukaw sakbay a naikkat.",
+       "undelete-cleanup-error": "Biddut ti panagikkat ti saan a naus-usar a naarkibo a papeles ti \"$1\".",
+       "undelete-missing-filearchive": "Saan a naipasubli ti ID ti arkibo ti papeles ti $1 ngamin ket awan idiay database.\nMabalin naikkaten daytoy.",
+       "undelete-error": "Biddut ti panagisubli ti panagikkat ti panid",
+       "undelete-error-short": "Biddut ti panagisubli ti pannakaikkat ti papeles: $1",
+       "undelete-error-long": "Adda dagiti nasarakan a biddut bayat ti panagisubli ti panagikkat ti papeles:\n\n$1",
+       "undelete-show-file-confirm": "Sigurado a kayatmo ti mangkita ti naikkat a rebision ti papeles \"<nowiki>$1</nowiki>\" manipud idi $2, $3?",
        "undelete-show-file-submit": "Wen",
        "namespace": "Nagan ti espasio:",
        "invert": "Baliktaden ti napili",
        "tooltip-invert": "Ikur-it daytoy a kahon ti panagilemmeng kadagiti sinukatan a panid iti uneg ti napili a nagan ti espasio (ken ti nairaman a nagan ti espasio no naikur-it)",
-       "namespace_association": "Nairaman a nagan ti espasio",
-       "tooltip-namespace_association": "Ikur-it daytoy a kahon ti panagiraman ti kapatangan wenno suheto ti nagan ti espasio a nairaman kadagiti napili a nagan ti espasio.",
+       "namespace_association": "Mainaig a nagan ti espasio",
+       "tooltip-namespace_association": "Ikur-it daytoy a kahon ti panagiraman ti tungtungan wenno suheto ti nagan ti espasio a nairaman kadagiti napili a nagan ti espasio",
        "blanknamespace": "(Umuna)",
-       "contributions": "Naar-aramid ti {{GENDER:$1|Agar-aramat}}",
-       "contributions-title": "Inar-aramid ti agar-aramat para kenni $1",
-       "mycontris": "Naar-aramid",
+       "contributions": "Dagiti kontribusion ti {{GENDER:$1|agar-aramat}}",
+       "contributions-title": "Kontribusion ti agar-aramat para kenni $1",
+       "mycontris": "Inar-aramid",
        "contribsub2": "Para kenni {{GENDER:$3|$1}} ($2)",
-       "contributions-userdoesnotexist": "Ti pakabilangan ti agar-aramat \"$1\" ket saan a nakarehistro.",
-       "nocontribs": "Awan ti nasarakan a nasukatan a kapada daytoy a kita.",
+       "contributions-userdoesnotexist": "Ti pakabilangan ti agar-aramat ni \"$1\" ket saan a nakarehistro.",
+       "nocontribs": "Awan ti nasarakan a nasukatan a kapada dagitoy a kriteria.",
        "uctop": "(agdama)",
-       "month": "Manipud iti bulan ti (ken nasapsapa pay):",
-       "year": "Manipud iti tawen (ken nasapsapa pay):",
-       "sp-contributions-newbies": "Iparang dagiti inar-aramid dagiti kabarbaro a pakabilangan laeng",
+       "month": "Manipud ti bulan (ken nasapsapa):",
+       "year": "Manipud ti tawen (ken nasapsapa):",
+       "sp-contributions-newbies": "Iparang dagiti kontribusion dagiti kabarbaro a pakabilangan laeng",
        "sp-contributions-newbies-sub": "Para kadagiti kabarbaro a pakabilangan",
-       "sp-contributions-newbies-title": "Dagiti inar-aramid ti agar-aramat iti baro a pakabilangan",
-       "sp-contributions-blocklog": "listaan ti naserraan",
+       "sp-contributions-newbies-title": "Dagiti kontribusion para kadagiti baro a pakabilangan",
+       "sp-contributions-blocklog": "listaan ti serra",
        "sp-contributions-suppresslog": "pasardengen dagiti kontribusion ti agar-aramat",
-       "sp-contributions-deleted": "dagiti naikkat nga inar-aramid ti agar-aramat",
-       "sp-contributions-uploads": "dagiti pang-ipan",
-       "sp-contributions-logs": "listaan",
+       "sp-contributions-deleted": "dagiti naikkat a kontribusion ti agar-aramat",
+       "sp-contributions-uploads": "dagiti naikarga",
+       "sp-contributions-logs": "dagiti listaan",
        "sp-contributions-talk": "tungtungan",
        "sp-contributions-userrights": "panagtaripato kadagiti karbengan ti agar-aramat",
-       "sp-contributions-blocked-notice": "Naserraan tatta daytoy nga agar-aramat.\nTi naudi a listaan ti pannakaserra ket adda dita baba tapno mausar a reperensia:",
-       "sp-contributions-blocked-notice-anon": "Daytoy nga IP a pagtaengan ket naserraan.\nTi naudi a listaan ti pannakaserra ket adda dita baba tapno mausar a reperensia:",
-       "sp-contributions-search": "Agsapul para kadagiti naar-aramid",
+       "sp-contributions-blocked-notice": "Adama a naserraan daytoy nga agar-aramat.\nTi naudi a naikabil iti listaan ti pannakaserra ket naited dita baba para iti reperensia:",
+       "sp-contributions-blocked-notice-anon": "Daytoy nga IP a pagtaengan ket agdama a naserraan.\nTi naudi a naikabil iti listaan ti pannakaserra ket adda dita baba para iti reperensia:",
+       "sp-contributions-search": "Agbiruk para kadagiti kontribusion",
        "sp-contributions-username": "IP a pagtaengan wenno nagan ti agar-aramat:",
-       "sp-contributions-toponly": "Ipakita laeng dagiti inurnos a kinaudian a panagbaliw",
+       "sp-contributions-toponly": "Ipakita laeng dagiti inurnos dagiti kaudian a rebision",
        "sp-contributions-newonly": "Ipakita laeng dagiti inurnos a pannakapartuat ti pampanid",
        "sp-contributions-submit": "Biruken",
        "whatlinkshere": "Dagiti nakasilpo ditoy",
        "whatlinkshere-title": "Pampanid a nakasilpo iti \"$1\"",
        "whatlinkshere-page": "Panid:",
-       "linkshere": "Dagiti sumaganad a panid ket nakasilpo iti '''[[:$1]]''':",
-       "nolinkshere": "Awan ti pampanid a nakasilpo iti '''[[:$1]]'''.",
-       "nolinkshere-ns": "Awan ti pampanid a nakasilpo idiay '''[[:$1]]''' iti napili a nagan ti espasio.",
+       "linkshere": "Dagiti sumaganad a panid ket nakasilpo iti <strong>[[:$1]]</strong>:",
+       "nolinkshere": "Awan ti pampanid a nakasilpo iti <strong>[[:$1]]</strong>.",
+       "nolinkshere-ns": "Awan ti pampanid a nakasilpo iti <strong>[[:$1]]</strong> iti napili a nagan ti espasio.",
        "isredirect": "baw-ing a panid",
        "istemplate": "mailak-am",
        "isimage": "silpo ti papeles",
        "whatlinkshere-next": "{{PLURAL:$1|sumaruno|sumaruno a $1}}",
        "whatlinkshere-links": "← silsilpo",
        "whatlinkshere-hideredirs": "$1 dagiti baw-ing",
-       "whatlinkshere-hidetrans": "$1 dagiti mailaklak-am",
+       "whatlinkshere-hidetrans": "$1 dagiti mailak-am",
        "whatlinkshere-hidelinks": "$1 dagiti silpo",
-       "whatlinkshere-hideimages": "$1 a silsilpo ti papeles",
+       "whatlinkshere-hideimages": "$1 dagiti silpo ti papeles",
        "whatlinkshere-filters": "Dagiti sagat",
        "autoblockid": "Auto a panagserra #$1",
        "block": "Seraan ti agar-aramat",
        "unblock": "Ikkaten ti serra ti agar-aramat",
        "blockip": "Serraan ti agar-aramat",
        "blockip-legend": "Serraan ti agar-aramat",
-       "blockiptext": "Usaren ti kinabuklan dita baba tapno maserraan ti panagsurat manipud iti naisangayan nga IP a pagtaengan wenno nagan ti agar-aramat.\nUsaren laeng daytoy tapno pawilan ti bandalismo, ken panagtunos iti [[{{MediaWiki:Policy-url}}|annuroten]].\nIkkan ti naisangayan a rason dita baba (kas pagarigan, dakamaten ti maysa a panid a na-bandalismo) .",
+       "blockiptext": "Usaren ti porma dita baba tapno maserraan ti panagsurat manipud iti naisangayan nga IP a pagtaengan wenno nagan ti agar-aramat.\nUsaren laeng daytoy tapno pawilan ti bandalismo, ken panagtunos iti [[{{MediaWiki:Policy-url}}|annuroten]].\nIkkan ti naisangayan a rason dita baba (kas pagarigan, dakamaten ti maysa a panid a na-bandalismo) .",
        "ipaddressorusername": "IP a pagtaengan wenno nagan ti agar-aramat:",
        "ipbexpiry": "Agpaso:",
        "ipbreason": "Rason:",
-       "ipbreason-dropdown": "*Dagiti kadawyan a rason ti panagserra\n** Agikabil kadagiti  madi a pakaammo\n** Agikkat kadagiti linaon ti pampanid\n** Agikabil ti spam a silpo iti ruar\n** Agikabil ti minamaag/saan a maawatan a pampanid\n** Nabutbuteng a panagkukua /agriribok\n** Agab-abuso kadagiti sabsabali a pakabilangan\n** Saan a maawat a nagan ti agar-aramat",
-       "ipb-hardblock": "Iparit kadagiti nakastrek nga agar-aramat manipud ti panagurnos manipud ti naggapo ditoy nga IP a pagtaengan",
+       "ipbreason-dropdown": "*Dagiti kadawyan a rason ti panagserra\n** Agikabil kadagiti  madi a pakaammo\n** Agikkat kadagiti linaon ti pampanid\n** Agikabil ti spam a silpo iti ruar\n** Agikabil ti minamaag/saan a maawatan a pampanid\n** Mangbutbuteng a panagkukua /mangriribok\n** Agab-abuso kadagiti nadumaduma a pakabilangan\n** Saan a maawat a nagan ti agar-aramat",
+       "ipb-hardblock": "Iparit dagiti nakastrek nga agar-aramat manipud ti panagurnos manipud ti daytoy nga IP a pagtaengan",
        "ipbcreateaccount": "Pawilan ti panagpartuat iti pakabilangan",
        "ipbemailban": "Pawilan ti agar-aramat nga agipatulod ti esurat",
-       "ipbenableautoblock": "Automatiko ti serra ti naudi nga IP a pagtaengan nga inusar daytoy nga agar-aramat, ken dagiti sumaruno nga IP a pagtaengan a padasenda nga agpabaliw",
+       "ipbenableautoblock": "Automatiko a mangserra ti naudi nga IP a pagtaengan nga inusar daytoy nga agar-aramat, ken dagiti sumaruno nga IP a pagtaengan nga ayan ti pangipadasanda nga agurnos",
        "ipbsubmit": "Serraan daytoy nga agar-aramat",
        "ipbother": "Sabali nga oras:",
        "ipboptions": "2 nga oras:2 hours,1 nga aldaw:1 day,3 nga aldaw:3 days,1 a lawas:1 week,2 a lawas:2 weeks,1 a bulan:1 month,3 a bulan:3 months,6 a bulan:6 months,1 a tawen:1 year,awan inggana:infinite",
        "ipbhidename": "Ilemmeng ti nagan ti agar-aramat kadagiti listaan ken inurnos",
        "ipbwatchuser": "Bantayan ti panid ti agar-ramat ken panid ti tungtungan daytoy nga agar-aramat",
-       "ipb-disableusertalk": "Pawilan daytoy nga agar-aramat nga agurnos kadagiti bukodda a tungtungan a panid no naserraan",
-       "ipb-change-block": "Serraan manen ti agar-aramat kadagitoy a disso",
+       "ipb-disableusertalk": "Pawilan daytoy nga agar-aramat nga agurnos kadagiti bukodda a tungtungan a panid bayat a naserraan",
+       "ipb-change-block": "Serraan manen ti agar-aramat kadagitoy a pannakaisaad",
        "ipb-confirm": "Pasingkedan ti serra",
        "badipaddress": "Imbalido nga IP a pagtaengan",
        "blockipsuccesssub": "Balligi ti panangserra",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] ket naserraanen.<br />\nKitaen ti [[Special:BlockList|listaan ti lapden nga IP ]] tapno marepaso dagiti serra.",
+       "blockipsuccesstext": "Ni [[Special:Contributions/$1|$1]] ket naserraanen.<br />\nKitaen ti [[Special:BlockList|listaan ti serra]] tapno marepaso dagiti serra.",
        "ipb-blockingself": "Mangrugrugika nga agserra kenka! Sigurado a kayatmo nga aramiden daytoy?",
-       "ipb-confirmhideuser": "Mangrugrugika ti mangserra ti agar-aramat nga adda ti napabalinna nga \"ilemmeng ti agar-aramat\". Iddeppenna ti nagan daytoy nga agar-aramat kadagiti amin a listaan ken dagiti naikabkabil ti listaan. Siguradoka a kasta ti kayatmo?",
-       "ipb-confirmaction": "No segurado a kayatmo nga aramiden daytoy, pangngaasi a kitaen ti \"{{int:ipb-confirm}}\" a pagikabilan dita baba.",
+       "ipb-confirmhideuser": "Mangrugrugika ti mangserra iti agar-aramat a napakabaelan iti \"ilemmeng ti agar-aramat\". Iddeppenna ti nagan daytoy nga agar-aramat kadagiti amin a listaan ken dagiti naikabkabil ti listaan. Siguradoka a kasta ti kayatmo?",
+       "ipb-confirmaction": "No sigurado a kayatmo nga aramiden daytoy, pangngaasi a kitaen ti \"{{int:ipb-confirm}}\" a pagikabilan dita baba.",
        "ipb-edit-dropdown": "Urnosen dagiti rason ti panagserra",
        "ipb-unblock-addr": "Lukatan ti serra ni $1",
        "ipb-unblock": "Lukatan ti serra ti nagan ti agar-aramat wenno IP a pagtaengan",
        "ipb-blocklist": "Kitaen dagiti adda a serra",
-       "ipb-blocklist-contribs": "Dagiti inaramid ni $1",
+       "ipb-blocklist-contribs": "Dagiti kontribusion para kenni $1",
        "unblockip": "Lukatan ti serra ti agar-aramat",
-       "unblockiptext": "Usaren ti porma dita baba ti panangisubli ti panagserrek nga agsurat ti napalabas a naserran nga IP a pagtaengan wenno nagan ti agar-aramat.",
+       "unblockiptext": "Usaren ti porma dita baba tapno maisubli ti panagserrek ti panagsurat ti dati a naserran nga IP a pagtaengan wenno nagan ti agar-aramat.",
        "ipusubmit": "Ikkaten daytoy a serra",
        "unblocked": "Naikkat ti pannakaserra ni [[User:$1|$1]].",
-       "unblocked-range": "Naikkat ti serra ti $1.",
+       "unblocked-range": "Naikkaten ti serra ti $1.",
        "unblocked-id": "Naikkaten ti serra ti $1.",
        "blocklist": "Dagiti naserraan nga agar-aramat",
        "ipblocklist": "Dagiti naserraan nga agar-aramat",
        "blocklist-userblocks": "Ilemmeng dagiti serra ti pakabilangan",
        "blocklist-tempblocks": "Ilemmeng dagiti temporario a serra",
        "blocklist-addressblocks": "Ilemmeng ti maysa a serra dagiti IP",
-       "blocklist-rangeblocks": "Ilemmeng dagiti nasakup a serra",
+       "blocklist-rangeblocks": "Ilemmeng dagiti nasakop a serra",
        "blocklist-timestamp": "Petsa ken oras",
        "blocklist-target": "Puntaan",
        "blocklist-expiry": "Agpaso",
        "blocklist-by": "Ti nagserra nga admin",
-       "blocklist-params": "Parametro ti serra",
+       "blocklist-params": "Dagiti parametro ti serra",
        "blocklist-reason": "Rason",
        "ipblocklist-submit": "Biruken",
        "ipblocklist-localblock": "Lokal a serra",
        "ipblocklist-otherblocks": "Sabali {{PLURAL:$1|a serra|kadagiti serra}}",
        "infiniteblock": "inggana't inggana",
-       "expiringblock": "agpaso intono $1 ti oras nga $2",
-       "anononlyblock": "di am-ammo laeng",
-       "noautoblockblock": "nabaldado ti auto a serra",
+       "expiringblock": "agpaso intono $1, $2",
+       "anononlyblock": "di ammo laeng",
+       "noautoblockblock": "nabaldado ti automatiko a serra",
        "createaccountblock": "naserraan ti pannakapartuat ti pakabilangan",
-       "emailblock": "naserraan ti esurat",
+       "emailblock": "nabaldado ti esurat",
        "blocklist-nousertalk": "saan a mabalin nga agurnos ti bukod a tungtungan a panid",
-       "ipblocklist-empty": "Awan nagyan ti listaan ti serra.",
-       "ipblocklist-no-results": "Ti kiniddaw nga IP a pagtaengan wenno nagan ti agar-aramat ket saan a naserraan",
+       "ipblocklist-empty": "Awan linaon ti listaan ti serra.",
+       "ipblocklist-no-results": "Ti kiniddaw nga IP a pagtaengan wenno nagan ti agar-aramat ket saan a naserraan.",
        "blocklink": "serraan",
-       "unblocklink": "saanen a naserraan",
-       "change-blocklink": "baliwan  ti serra",
+       "unblocklink": "ikkaten ti serra",
+       "change-blocklink": "baliwan ti serra",
        "contribslink": "aramid",
        "emaillink": "ipatulod ti esurat",
        "autoblocker": "Automatiko a naserraan ngamin ket ti IP a pagtaengam ket naudi nga inusar babaen ni \"[[User:$1|$1]]\".\nTi inted a rason para iti serra ni $1 ket: \"$2\"",
-       "blocklogpage": "Listaan ti naserraan",
-       "blocklog-showlog": "Daytoy nga agar-aramat ket dati a naserraan.\nTi listaan ti serra ket naikabil dita baba tapno mausar a reperensia:",
-       "blocklog-showsuppresslog": "Daytoy nga agar-aramat ket dati a naserraan ken nailemmeng.\nTi listaan ti napasardeng ket naikabil dita baba tapno mausar a reperensia:",
+       "blocklogpage": "Listaan ti serra",
+       "blocklog-showlog": "Daytoy nga agar-aramat ket dati a naserraan.\nTi listaan ti serra ket naikabil dita baba para iti reperensia:",
+       "blocklog-showsuppresslog": "Daytoy nga agar-aramat ket dati a naserraan ken nailemmeng.\nTi listaan ti panagpasardeng ket naikabil dita baba para iti reperensia:",
        "blocklogentry": "naserraan ni [[$1]] nga adda ti oras a panagpaso iti $2 $3",
-       "reblock-logentry": "sinukatan ti pannakaserra para kenni [[$1]] nga adda ti oras a panagpaso iti  $2 $3",
-       "blocklogtext": "Daytoy ket listaan ti agar-aramat kadagiti panagserra ken panaglukat ti serra\nDagiti na-atomatiko a panakaserra ti IP a pagtaengan ket saan a nailista.\nKitaen ti [[Special:BlockList|Listaan ti lapden nga IP]] para iti listaan kadagiti agdama a naiparit a pagpataray ken dagiti serra.",
+       "reblock-logentry": "sinukatan ti pannakaserra para kenni [[$1]] nga adda ti oras a panagpaso iti $2 $3",
+       "blocklogtext": "Daytoy ket listaan ti agar-aramat kadagiti panagserra ken panaglukat ti serra\nDagiti automatiko a panakaserra ti IP a pagtaengan ket saan a nailista.\nKitaen ti [[Special:BlockList|listaan ti serra]] para iti listaan kadagiti agdama a naiparit a pagpataray ken dagiti serra.",
        "unblocklogentry": "lukatan ti serra ni $1",
-       "block-log-flags-anononly": "dagiti di am-ammo nga agar-aramat laeng",
+       "block-log-flags-anononly": "dagiti di ammo nga agar-aramat laeng",
        "block-log-flags-nocreate": "nabaldado ti panagpartuat ti pakabilangan",
-       "block-log-flags-noautoblock": "naiddep ti auto-serra",
-       "block-log-flags-noemail": "naserraan ti esurat",
+       "block-log-flags-noautoblock": "nabaldado ti automatiko a serra",
+       "block-log-flags-noemail": "nabaldado ti esurat",
        "block-log-flags-nousertalk": "saan a mabalin nga agurnos ti bukodna a tungtungan a panid",
-       "block-log-flags-angry-autoblock": "napabalin ti napasayaat nga auto-serra",
+       "block-log-flags-angry-autoblock": "napakabaelan ti napasayaat nga automatiko a serra",
        "block-log-flags-hiddenname": "nailemmeng ti nagan ti agar-aramat",
-       "range_block_disabled": "Ti abilidad ti administrador nga agaramid ti nasakupan a serra ket naiddep.",
+       "range_block_disabled": "Ti abilidad ti administrador nga agpartuat ti nasakupan a serra ket nabaldado.",
        "ipb_expiry_invalid": "Imbalido ti oras a panagpaso.",
        "ipb_expiry_temp": "Ti serra ti nagan ti agar-aramat ket masapul a permanente.",
-       "ipb_hide_invalid": "Saan a mapasardeng daytoy a pakabilangan; daytoy ket addaan ti ad-adu ngem {{PLURAL:$1|maysa nga inurnos|dagiti $1 nga inurnos}}.",
-       "ipb_already_blocked": " \"$1\" ket naserraan",
-       "ipb-needreblock": "$1 ket naseraan. Kayatmo a sukatan ti serrana?",
+       "ipb_hide_invalid": "Saan a mapasardeng daytoy a pakabilangan; daytoy ket addaan iti ad-adu ngem {{PLURAL:$1|maysa nga inurnos|dagiti $1 nga inurnos}}.",
+       "ipb_already_blocked": "Ni \"$1\" ket naserraanen.",
+       "ipb-needreblock": "Ni $1 ket naseraanen. Kayatmo a sukatan ti serrana?",
        "ipb-otherblocks-header": "Sabali {{PLURAL:$1|a naserraan|kadagiti naserraan}}",
        "unblock-hideuser": "Saanmo a maisubli ti serra daytoy nga agar-aramat, nailemmengen ti nagan daytoy nga agar-aramat.",
-       "ipb_cant_unblock": "Biddut: ID $1 ti serra a nabirukan. Baka nalukatan ti serranan.",
-       "ipb_blocked_as_range": "Ballag: Ti IP a pagtaengan $1 ket saan a dagus a naserraan ken saan a malukatan ti serrana.\nNgem, nupay kasta, naserran a kas paset ti sakup ti $2, a mabalin a malukatan ti serrana.",
-       "ip_range_invalid": "Imbalido a sakup ti IP.",
-       "ip_range_toolarge": "Dagiti serra a nasakup a dakdakkel ngem /$1 ket saan a maipalubos.",
+       "ipb_cant_unblock": "Biddut: San a nabirukan ti ID $1 ti serra. Mabalin a nalukatanen ti serrana.",
+       "ipb_blocked_as_range": "Biddut: Ti IP a pagtaengan ti $1 ket saan a dagus a naserraan ken saan a malukatan ti serrana.\nNgem, nupay kasta, naserran a kas paset ti sakop ti $2, a mabalin a malukatan ti serrana.",
+       "ip_range_invalid": "Imbalido a sakop ti IP.",
+       "ip_range_toolarge": "Dagiti serra a nasakop a dakdakkel ngem /$1 ket saan a maipalubos.",
        "proxyblocker": "Pannakbagi a panagserra",
-       "proxyblockreason": "Ti IP a pagtaengam ket naserraan ngamin ket daytoy ket nakalukat a panakbagi.\nPangngaasi ta kontakem ti agit-ited ti serbisio ti Internetmo wenno teknikal a suporta ti kaurnusam ken ibagam kaniada ti nakaro a parikut ti seguridad.",
-       "sorbsreason": "Ti IP a pagtaengam ket nakalista a kasla \"nalukatan a pannakbagi\" idiay DNSBL nga inusar ti {{SITNAME}}.",
-       "sorbs_create_account_reason": "Ti IP a pagtaengam ket nakalista a kasla \"nalukatan a pannakbagi\" idiay DNSBL nga inusar ti {{SITNAME}}.\nSaanka a makaaramid ti pakabilangan",
+       "proxyblockreason": "Ti IP a pagtaengam ket naserraan ngamin ket daytoy ket nakalukat a panakbagi.\nPangngaasi a kontakem ti agit-ited ti serbisio ti Internetmo wenno teknikal a suporta ti gunglom ken ibagam kaniada ti nakaro a parikut ti seguridad.",
+       "sorbsreason": "Ti IP a pagtaengam ket nailista a kasla \"nalukatan a pannakbagi\" iti DNSBL nga inusar babaen ti {{SITNAME}}.",
+       "sorbs_create_account_reason": "Ti IP a pagtaengam ket nailista a kasla \"nalukatan a pannakbagi\" iti DNSBL nga inusar babaen ti {{SITNAME}}.\nSaanka a makapartuat ti pakabilangan.",
        "xffblockreason": "Ti maysa nga IP a pagtaengan nga adda iti X-Forwarded-For header, mabalin a kukuam wenno ti pannakbagi a server nga us-usarem, ket naserraan. Ti kasisigud a rason ti pannakaserra idi ket: $1",
-       "cant-see-hidden-user": "Ti agar-aramat a kayatmo a serraan ket naserraan ken nailemmeng.\nKet awan met ti karbengam nga agilemming ti agar-aramat, saan mo a makita wenno mabaliwan ti serra ti agar-aramat.",
-       "ipbblocked": "Saanmo a mabalin ti agserra wenno agikkat ti serra ti sabali nga agar-aramat, ngamin ket naserraan ka met.",
-       "ipbnounblockself": "Saanmo a mabalin a lukatan ti serram",
+       "cant-see-hidden-user": "Ti agar-aramat a kayatmo a serraan ket naserraanen ken nailemmeng.\nGapu ta awan met ti karbengam nga agilemming ti agar-aramat, saanmo a makita wenno maurnos ti serra ti agar-aramat.",
+       "ipbblocked": "Saanmo a mabalin ti agserra wenno agikkat ti serra ti sabali nga agar-aramat, ngamin ket naserraanka met.",
+       "ipbnounblockself": "Saanmo a mabalin a lukatan ti serram.",
        "lockdb": "Balunetan ti database",
        "unlockdb": "Lukatan ti database",
-       "lockdbtext": "Ti panagserra ti database ket makaikkat ti abilidad kadagiti amin nga agar-aramat ti agurnos kadagiti panid, ti panagsukat dagiti kaykayatda, ti panagurnos dagiti bambantayanda, ken dagiti sabsabali pay a masapul ti panagsukat idiay database.\nPangngaasi a pasingkedam daytoy no kayatmo nga aramiden, ken luktam dayta database no malpas kan nga agsimpa.",
-       "unlockdbtext": "Ti panaglukat ti database ket mangipasubli ti abilidad dagiti amin nga agar-aramat ti panagurnos kadagiti panid, ti panagsukat dagiti kaykayatda, ti panagurnos dagiti bambantayanda, ken dagiti amin a makasapul ti panagsukat idiay database.\nPangngaasi a pasingkedam a daytoy no kayatmo nga aramiden.",
+       "lockdbtext": "Ti panagserra ti database ket makaikkat ti abilidad kadagiti amin nga agar-aramat ti agurnos kadagiti panid, ti panagsukat dagiti kakaykaytanda, ti panagurnos dagiti listaan ti bambantayanda, ken dagiti sabali pay a masapul ti panagsukat iti database.\nPangngaasi a pasingkedam daytoy no kayatmo nga aramiden, ken luktam dayta database no malpaskan nga agsimpa.",
+       "unlockdbtext": "Ti panaglukat ti database ket mangipasubli ti abilidad dagiti amin nga agar-aramat ti panagurnos kadagiti panid, ti panagsukat kadagiti kakaykayatanda, ti panagurnos dagiti listaan bambantayanda, ken dagiti amin a makasapul ti panagsukat iti database.\nPangngaasi a pasingkedam a daytoy no kayatmo nga aramiden.",
        "lockconfirm": "Wen, talaga a kayatko a balunetan ti database.",
        "unlockconfirm": "Wen, talaga a kayatko a balunetan ti database.",
        "lockbtn": "Balunetan ti database",
        "unlockdbsuccesssub": "Naikkaten ti balunet ti database",
        "lockdbsuccesstext": "Nabalunetan ti database.<br />\nLaglagipem nga [[Special:UnlockDB|ikkaten ti balunetna]] kalpasan a malpaska nga agsimpa.",
        "unlockdbsuccesstext": "Nalukatanen ti database.",
-       "lockfilenotwritable": "Ti serra a papeles ti database ket saan a masuratan.\nTi agserra ken aglukat iti database, masapul a masuratan ti web server.",
+       "lockfilenotwritable": "Ti papeles ti balunet ti database ket saan a masuratan.\nTapno mabalunetan ken malukatan ti database, nasken daytoy a masuratan babaen ti web server.",
        "databasenotlocked": "Saan a nabalunetan ti database.",
-       "lockedbyandtime": "(ni {{GENDER:$1|$1}} idi $2 ti oras $3)",
+       "lockedbyandtime": "(ni {{GENDER:$1|$1}} idi $2, $3)",
        "move-page": "Iyalis ti $1",
        "move-page-legend": "Iyalis ti panid",
-       "movepagetext": "Ti panagusar ti kinabuklan dita baba, ket mangnagan manen ti panid, a mangiyalis amin ti pakasaritaanna idiay baro a nagan.\nTi daan a titulo ket agbalin a baw-ing a panid idiay baro a titulo.\nMapabarom a kas automatiko dagiti baw-ing a nakatudo dita kasisigud a titulo.\nNo agpilika a saanmo a kayat, pasaraduam a kitaen ti [[Special:DoubleRedirects|doble]] wenno [[Special:BrokenRedirects|nadadael a baw-ing]].\nRenbbengmo ti mangpatalged nga amin a silpo ket agtultuloy a nakatudo iti nasken a papananda.\n\nLaglagipen a ti panid ket '''saan''' a maiyalis no addan sigud a panid iti baro a titulo, malaksid no ti kinaudi ket maysa a baw-ing ken awan ti napalabas a pakasaritaan ti panag-urnos. \nKayat a sawen daytoy a mabalinmo a suktan ti nagan ti maysa a panid manipud iti punto ti pannakasukat ti nagan no nagbiddutka, ken saan mo a mabalin a suratan manen ti addaan a panid.\n\n'''Ballaag!'''\nMabalin a maysa daytoy a nakaro ken saan a bigla a panagbaliw iti maysa a nasikat a panid;\npangngaasim a pasingkedam a maawatam ti ibunga daytoy sakbay nga agtuloyka a mangbaliw.",
-       "movepagetext-noredirectfixer": "Ti panagusar ti kinabuklan dita baba, ket panaganan ti panid, iyalis na amin ti pakasaritaan na idiay baro a nagan.\nTi daan a titulo ket agbalin baw-ing a panid idiay baro a titulo.\nPasaruduam a kitaen ti [[Special:DoubleRedirects|doble]] wenno [[Special:BrokenRedirects|nadadael a baw-ing]].\nRebbengem ti mangpatalged nga amin a panilpo ket agtultuloy a nakatudo iti nasken a papananda.\n\nLaglagipen a ti panid ket '''saan''' a maiyalis no addan sigud a panid iti baro a titulo, malaksid no awan linaonna wenno no maysa a baw-ing a panid ken awan ti panagbaliw iti pakasaritaan ti napalabas. \nKayat a sawen daytoy a mabalinmo a suktan ti nagan ti maysa a panid manipud iti punto ti pannakasukat ti nagan no nagbiddutka, ken saan mo a mabalin a suratan manen ti addaan a panid.\n\n'''Ballaag!'''\nMabalin a maysa daytoy a nakaro ken saan a bigla a panagbaliw iti maysa a nasikat a panid;\npangngaasim ta pasingkedam a maawatam ti ibunga daytoy sakbay nga agtuloyka a mangbaliw.",
-       "movepagetalktext": "Ti mainaig a tungtungan ti panid ket giddato a maiyalis a karamanna '''malaksid:'''\n*No addan sigud nga awan linaonna a tungtungan ti panid babaen ti baro a nagan, wenno\n*No ikkatem ti kur-itna ti kahon iti baba.\n\nKadagitoy a kaso, masapul nga iyalis wenno itiponmo a manual ti panid no kayatmo.",
+       "movepagetext": "Ti panagusar ti porma dita baba, ket mangnagan manen ti panid, a mangiyalis amin ti pakasaritaanna iti baro a nagan.\nTi daan a titulo ket agbalin a baw-ing a panid iti baro a titulo.\nMapabarom a kas automatiko dagiti baw-ing a nakatudo dita kasisigud a titulo.\nNo agpilika a saanmo a kayat, siguraduem a kitaen ti [[Special:DoubleRedirects|doble]] wenno [[Special:BrokenRedirects|nadadael a baw-ing]].\nRenbbengmo ti mangpatalged nga amin a silpo ket agtultuloy a nakatudo iti nasken a papananda.\n\nLaglagipen a ti panid ket <strong>saan</strong> a maiyalis no addan sigud a panid iti baro a titulo, malaksid no ti kinaudi ket maysa a baw-ing ken awan ti napalabas a pakasaritaan ti panag-urnos. \nKayat a sawen daytoy a mabalinmo a suktan ti nagan ti maysa a panid manipud iti punto ti pannakasukat ti nagan no nagbiddutka, ken saan mo a mabalin a suratan manen ti addaan a panid.\n\n<strong>Ballaag!</strong>\nMabalin a maysa daytoy a nakaro ken saan a bigla a panagbaliw iti maysa a nasikat a panid;\npangngaasim a pasingkedam a maawatam ti ibunga daytoy sakbay nga agtuloyka a mangbaliw.",
+       "movepagetext-noredirectfixer": "Ti panagusar ti kinabuklan dita baba, ket panaganan ti panid, iyalisna amin ti pakasaritaanna iti baro a nagan.\nTi daan a titulo ket agbalin baw-ing a panid idiay baro a titulo.\nPasaruduam a kitaen ti [[Special:DoubleRedirects|doble]] wenno [[Special:BrokenRedirects|nadadael a baw-ing]].\nRebbengem ti mangpatalged nga amin a silpo ket agtultuloy a nakatudo iti nasken a papananda.\n\nLaglagipen a ti panid ket <strong>saan</strong> a maiyalis no addan sigud a panid iti baro a titulo, malaksid no awan linaonna wenno no maysa a baw-ing a panid ken awan ti panagbaliw iti pakasaritaan ti napalabas. \nKayat a sawen daytoy a mabalinmo a suktan ti nagan ti maysa a panid manipud iti punto ti pannakasukat ti nagan no nagbiddutka, ken saanmo a mabalin a suratan manen ti addaan a panid.\n\n<strong>Ballaag!</strong>\nMabalin a maysa daytoy a nakaro ken saan a bigla a panagbaliw iti maysa a nasikat a panid;\npangngaasim ta pasingkedam a maawatam ti ibunga daytoy sakbay nga agtuloyka a mangbaliw.",
+       "movepagetalktext": "Ti mainaig a tungtungan ti panid ket automatikonto a maiyalis a karamanna <strong>malaksid:</strong>\n*Ti addan ti awan linaon a tungtungan ti panid babaen ti baro a nagan, wenno\n*No ikkatem ti kur-itna ti kahon iti baba.\n\nKadagitoy a kaso, masapul nga iyalis wenno manual nga itiponmo ti panid no kayatmo.",
        "movearticle": "Iyalis ti panid:",
-       "moveuserpage-warning": "'''Ballaag:''' Mangrugrugika nga agiyalis ti panid ti agar-aramat. Pangngaasi a laglapipen a ti panid ket isu laeng ti mabalin nga iyalis ken ti agar-aramat ket ''saan'' a managanan.",
+       "moveuserpage-warning": "<strong>Ballaag:</strong> Mangrugrugika nga agiyalis ti panid ti agar-aramat. Pangngaasi a laglapipen a ti panid ket isu laeng ti maiyalis ken ti agar-aramat ket <em>saanto</em> a managanan.",
        "movecategorypage-warning": "<strong>Ballaag:</strong> Mangiyal-aliskan iti panid ti kategoria. Pangngaasi a laglagipen a ti maiyalisto laeng ket ti panid ken ti aniaman a pampanid iti daan a kategoria ket <em>saanto</em> a maikategoria iti baro.",
        "movenologintext": "Masapul a nakarehistroka nga agar-aramat ken [[Special:UserLogin|nakastrek]] tapno makaiyalis iti panid.",
        "movenotallowed": "Awan ti pammalubosmo nga agiyalis kadagiti panid.",
        "movenotallowedfile": "Awan ti pammalubosmo nga agiyalis kadagiti papeles.",
-       "cant-move-user-page": "Awan ti pammalubos mo nga agiyalis kadagiti panid ti agar-aramat (malaksid kadaiti subpanid).",
-       "cant-move-to-user-page": "Awan ti pammalubos mo nga agiyalis ti panid idiay panid ti agar-aramat (malaksid kadagiti subpanid ti agar-aramat).",
+       "cant-move-user-page": "Awan ti pammalubosmo nga agiyalis kadagiti panid ti agar-aramat (malaksid kadagiti subpanid).",
+       "cant-move-to-user-page": "Awan ti pammalubosmo nga agiyalis ti panid iti panid ti agar-aramat (malaksid kadagiti subpanid ti agar-aramat).",
        "cant-move-category-page": "Awan ti pammalubosmo nga agiyalis kadagiti panid ti kategoria.",
        "cant-move-to-category-page": "Awan ti pammalubosmo nga agiyalis ti panid iti panid ti kategoria.",
        "newtitle": "Iti baro a titulo:",
-       "move-watch": "Bantayan daytoy a panid",
+       "move-watch": "Bantayan ti taudan a panid ken puntaan a panid",
        "movepagebtn": "Iyalis ti panid",
        "pagemovedsub": "Balligi ti panangiyalis",
-       "movepage-moved": "Naiyalis ti '''\"$1\" iti \"$2\"'''",
+       "movepage-moved": "<strong>Naiyalisen ti \"$1\" iti \"$2\"</strong>",
        "movepage-moved-redirect": "Napartuaten ti maysa a baw-ing.",
-       "movepage-moved-noredirect": "Ti panagaramid ti baw-ing ket napasardeng.",
-       "articleexists": "Adda panid nga adda ti kasta a nagan, wenno ti nagan a pinilim ket saan a mabalin.\nPangngaasim a mangpilika iti sabali a nagan.",
-       "cantmove-titleprotected": "Saanmo a maiyalis ti panid iti daytoy a lokasion, ngamin ket ti baro a titulo ket nasalakniban para iti panakapartuat.",
+       "movepage-moved-noredirect": "Ti pannakapartuat ti baw-ing ket napasardeng.",
+       "articleexists": "Adda panid nga adda ti kastan a nagan, wenno ti nagan a pinilim ket saan a mabalin.\nPangngaasi nga agpili ti sabali a nagan.",
+       "cantmove-titleprotected": "Saanmo a maiyalis ti panid iti daytoy a lokasion ngamin ket ti baro a titulo ket nasalakniban manipud ti pannakapartuat",
        "movetalk": "Iyalis ti mainaig a panid ti tungtungan",
-       "move-subpages": "Iyalis dagiti subpanid (aginggana ti $1)",
-       "move-talk-subpages": "Iyalis dagiti subpanid ti tungtungan ti panid (aginggana ti $1)",
-       "movepage-page-exists": "Ti panid ti $1 ket addan ken saan a mautomatiko a suratan manen.",
-       "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 kaadu iti $1 a {{PLURAL:$1|panid|pampanid}} ket naiyalis ken awanen ti automatiko a maiyalis.",
+       "move-subpages": "Iyalis dagiti subpanid (aginggana iti $1)",
+       "move-talk-subpages": "Iyalis dagiti subpanid ti tungtungan ti panid (aginggana iti $1)",
+       "movepage-page-exists": "Ti panid ti $1 ket addan ken saan a mabalin nga automatiko a masuratan manen.",
+       "movepage-page-moved": "Ti panid ti $1 ket naiyalisen iti $2.",
+       "movepage-page-unmoved": "Ti panid ti $1 ket saan a maiyalis iti $2.",
+       "movepage-max-pages": "Ti kaaduan iti $1 a {{PLURAL:$1|panid|pampanid}} ket naiyalisen ken awanton ti automatiko a maiyalis.",
        "movelogpage": "Listaan ti naiyalis",
-       "movelogpagetext": "Adda dita baba ti listaan dagiti naiyalis a panid.",
+       "movelogpagetext": "Adda dita baba ti listaan dagiti amin a naiyalis a panid.",
        "movesubpage": "{{PLURAL:$1|Subpanid|Dagiti subpanid}}",
-       "movesubpagetext": "Daytoy a panid ket adda $1 {{PLURAL:$1|a subpanid|kadagiti subpanid}} a naipakita dita baba.",
+       "movesubpagetext": "Daytoy a panid ket addaan iti $1 {{PLURAL:$1|a subpanid|kadagiti subpanid}} a naipakita dita baba.",
        "movenosubpage": "Daytoy a panid ket awan ti subpanidna.",
        "movereason": "Rason:",
        "revertmove": "isubli",
        "delete_and_move": "Ikkaten ken iyalis",
-       "delete_and_move_text": "== Masapul nga ikkaten ==\nTi pangipanan ti panid ket \"[[:$1]]\" addan.\nKayatmo nga ikkaten  tapno makaiyaliska?",
+       "delete_and_move_text": "== Masapul nga ikkaten ==\nTi pangipanan ti panid ket \"[[:$1]]\" addan.\nKayatmo nga ikkaten tapno makaiyaliska?",
        "delete_and_move_confirm": "Wen, ikkaten ti panid",
-       "delete_and_move_reason": "Naikkat tapno mawayaan ti pannaka-iyalis idiay \"[[$1]]\"",
+       "delete_and_move_reason": "Naikkat tapno mawayaan ti pannaka-iyalis manipud ti \"[[$1]]\"",
        "selfmove": "Ti titulo ti taudan ken ti pangipanan ket agpadpada;\nsaanmo a maiyalis ti panid ti isu met laeng a panid.",
-       "immobile-source-namespace": "Saan a maiyalis dagiti panid idiay nagan ti espasio ti  \"$1\"",
-       "immobile-target-namespace": "Saan a maiyalis dagiti panid idiay nagan ti espasio ti \"$1\"",
+       "immobile-source-namespace": "Saan a maiyalis dagiti panid iti nagan ti espasio ti \"$1\"",
+       "immobile-target-namespace": "Saan a maiyalis dagiti panid iti nagan ti espasio ti \"$1\"",
        "immobile-target-namespace-iw": "Ti silpo nga interwiki ket saan nga umiso a puntaan para iti panagiyalis ti panid.",
        "immobile-source-page": "Saan a mabalin nga iyalis daytoy a panid.",
-       "immobile-target-page": "Saan a maiyalis iti dayata a pangipanan a titulo.",
-       "bad-target-model": "Ti kinaykayat a pangipanan ket agus-usar ti sabali a modelo ti linaon. Saan a maipabalin manipud ti $1 iti $2.",
-       "imagenocrossnamespace": "Saan a maiyalis ti papeles idiay saan a papeles a nagan ti espasio",
-       "nonfile-cannot-move-to-file": "Saan a maiyalis ti saan a papeles idiay papeles a nagan ti espasio",
-       "imagetypemismatch": "Ti baro a pagpaatiddog ti papeles ket saan nga agpada ti kitana",
+       "immobile-target-page": "Saan a maiyalis iti dayta a pangipanan a titulo.",
+       "bad-target-model": "Ti kinaykayat a pangipanan ket agus-usar ti sabali a modelo ti linaon. Saan a mapagbaliwen manipud ti $1 iti $2.",
+       "imagenocrossnamespace": "Saan a maiyalis ti papeles iti saan nagan ti espasio ti papeles",
+       "nonfile-cannot-move-to-file": "Saan a maiyalis ti saan a papeles iti nagan ti espasio ti papeles",
+       "imagetypemismatch": "Ti baro a pagpaatiddog ti papeles ket saan a maipada iti bukodna a kita",
        "imageinvalidfilename": "Ti puntaan a nagan ti papeles ket imbalido",
-       "fix-double-redirects": "Agpabaro ti amin a baw-ing a mangipatudo ti kasisigud a titulo",
+       "fix-double-redirects": "Agpabaro kadagiti aniaman a baw-ing a mangipatudo ti kasisigud a titulo",
        "move-leave-redirect": "Mangibati ti baw-ing",
-       "protectedpagemovewarning": "'''Ballaag:''' Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan ti gundaway nga administrador ti makaiyalis.\nTi kinaudi a naikabil ti listaan ket adda dita baba tapno mausar a reperensia:",
-       "semiprotectedpagemovewarning": "'''Pakaammo:''' Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaiyalis daytoy.\nTi kinaudi a naikabil ti listaan ket adda iti baba tapno mausar a reperensia:",
-       "move-over-sharedrepo": "== Addaan ti papeles ==\n[[:$1]] addaan idiay pagbingayan a repositorio. Ti panagiyalis ti papeles iti titulo nga itoy ket paawanenna ti pagbingayan a papeles.",
-       "file-exists-sharedrepo": "Ti napilim a nagan ti papeles ket naususaren idiay pagbingayan a pagikabilan.\nPangngaasi nga agpilika ti sabali a nagan.",
+       "protectedpagemovewarning": "<strong>Balaag:</strong> Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan ti gundaway nga administrador ti makaiyalis.\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
+       "semiprotectedpagemovewarning": "<strong>Nota:</strong> Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaiyalis daytoy.\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
+       "move-over-sharedrepo": "== Addaan ti papeles ==\nTi [[:$1]] addaan iti pagbingayan a repositorio. Ti panagiyalis ti papeles iti daytoy a titulo ket tuonenna ti pagbingayan a papeles.",
+       "file-exists-sharedrepo": "Ti napilim a nagan ti papeles ket naususaren iti pagbingayan a repositorio.\nPangngaasi nga agpilika ti sabali a nagan.",
        "export": "Agipan kadagiti panid",
        "exporttext": "Maipanmo ti testo ken pakasaritaan ti inurnos iti maysa a panid wenno pampanid a nabalkut ti XML.\nDaytoy ket mabalin a maikabil iti sabali a wiki nga agususar ti MediaWiki nga usaren ti [[Special:Import|pinagala ti panid]].\n\nTi pinagipan ti panid, ikabil ti titulo dita kahon ti testo 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 panagbalbaliw, nga addaan ti linia ti pakasaritaan ti pampanid, wenno ti agdama a panagbaliw nga addaan ti pakaammo a maipapan ti kinaudi a panagurnos.\n\nNo iti kinaudi a kaso mabalinmo nga usaren ti silpo, a kas pagarigan [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para iti panid \"[[{{MediaWiki:Mainpage}}]]\".",
        "exportall": "Ipan amin a pampanid",
        "exportcuronly": "Iraman laeng ti kinaudi a panagbaliw, saan a ti napno a pakasaritaan",
-       "exportnohistory": "----\n'''Palagip:''' Ti pagipapan dagiti napno a pakasaritaan dagiti panid iti daytoy a kinabuklan ket nabaldado gapu dagiti pannakalaing ti panagandar a rason.",
+       "exportnohistory": "----\n<strong>Nota:</strong> Ti pagipapan dagiti napno a pakasaritaan dagiti panid iti daytoy a kinabuklan ket nabaldado gapu dagiti pannakalaing ti panagandar a rason.",
        "exportlistauthors": "Iraman ti amin a listaan kadagiti nagaramid iti tunggal a maysa a panid",
        "export-submit": "Agipan",
-       "export-addcattext": "Agnayon kadagiti panid a naggapu idiay kategoria:",
+       "export-addcattext": "Agnayon kadagiti panid manipud ti kategoria:",
        "export-addcat": "Inayon",
-       "export-addnstext": "Nayunan dagiti panid a naggapu idiay nagan ti espasio:",
+       "export-addnstext": "Agnayon kadagiti panid manipud ti nagan ti espasio:",
        "export-addns": "Inayon",
        "export-download": "Idulin a kas papeles",
        "export-templates": "Mangiraman kadagiti plantilia",
        "allmessagesname": "Nagan",
        "allmessagesdefault": "Kasisigud a testo ti mensahe",
        "allmessagescurrent": "Agdama a testo ti mensahe",
-       "allmessagestext": "Daytoy ti listaan dagiti mensahe ti sistema a magun-od idiay MediaWiki a nagan ti espasio.\nPangngaasi a bisitaen ti [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Lokalisasion ti MediaWiki] ken [//translatewiki.net translatewiki.net] no kayatmo ti agparawad kadagiti sapasap a panagipatarus ti MediaWiki.",
-       "allmessagesnotsupportedDB": "Saan a mausar daytoy a panid ngamin ket ti '''$wgUseDatabaseMessages''' ket nabaldado.",
+       "allmessagestext": "Daytoy ti listaan dagiti mensahe ti sistema a magun-od iti nagan ti espasio ti MediaWiki.\nPangngaasi a bisitaen ti [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Lokalisasion ti MediaWiki] ken [//translatewiki.net translatewiki.net] no kayatmo ti agparawad kadagiti sapasap a panagipatarus ti MediaWiki.",
+       "allmessagesnotsupportedDB": "Daytoy a panid ket saan a musar gapu ta nabaldado ti <strong>$wgUseDatabaseMessages</strong>.",
        "allmessages-filter-legend": "Sagat",
        "allmessages-filter": "Sagaten babaen ti naipaduma a kasasaad:",
        "allmessages-filter-unmodified": "Saan a nabaliwan",
        "allmessages-filter-submit": "Inkan",
        "allmessages-filter-translate": "Ipatarus",
        "thumbnail-more": "Padakkelen",
-       "filemissing": "Napukaw ti papeles",
-       "thumbnail_error": "Biddut ti panagaramid ti bassit a ladawan: $1",
+       "filemissing": "Awan ti papeles",
+       "thumbnail_error": "Biddut ti panagpartuat ti bassit a ladawan: $1",
        "thumbnail_error_remote": "Biddut a mensahe manipud ti $1: \n$2",
-       "djvu_page_error": "Ti DjVu a panid ket saan a nasakup",
+       "djvu_page_error": "Ti DjVu a panid ket saan a masakop",
        "djvu_no_xml": "Saan a naala ti XML iti DjVu a papeles",
-       "thumbnail-temp-create": "Saan a makaaramid ti temporario a bassit a ladawan ti papeles",
+       "thumbnail-temp-create": "Saan a makapartuat ti temporario a bassit a ladawan ti papeles",
        "thumbnail-dest-create": "Saan a maidulin ti basit a ladawan idiay pagipanan",
-       "thumbnail_invalid_params": "Imbalido a parametro ti bassit a ladawan",
-       "thumbnail_dest_directory": "Saan a nakaaramid ti pangipanan a direktorio.",
-       "thumbnail_image-type": "Daytoy a kita ti ladawan ket saan a nasuportaran.",
-       "thumbnail_gd-library": "Saan a kompleto a GD biblioteka a pannakaaramid: Awan ti opisio ti $1",
-       "thumbnail_image-missing": "Daytoy a papeles ket kasla napukaw: $1",
+       "thumbnail_invalid_params": "Imbalido dagiti parametro ti bassit a ladawan",
+       "thumbnail_dest_directory": "Saan a nakapartuat ti pangipanan a direktorio.",
+       "thumbnail_image-type": "Daytoy a kita ti ladawan ket saan a nasuportaran",
+       "thumbnail_gd-library": "Saan a kompleto a konpigurasion ti biblioteka ti GD: Awan ti annong ti $1",
+       "thumbnail_image-missing": "Kasla awan daytoy a papeles: $1",
        "thumbnail_image-failure-limit": "Adu unayen dagiti nabiit a napaay a panagipadas ($1 wenno ad-adu) a panangiparamg daytoy bassit a ladawan. Pangngaasi a padasen manen intono madamdama.",
        "import": "Agala kadagiti panid",
        "importinterwiki": "Agala ti transwiki",
-       "import-interwiki-text": "Agpilika ti wiki ken titulo ti panid nga alaem.\nDagit panagbaliw a petsa ken dagiti nagan ti mannurat ket maipreserba.\nAmin a transwiki nga alaem ket mailista idiay [[Special:Log/import|listaan ti pinagala]].",
+       "import-interwiki-text": "Agpilika ti wiki ken titulo ti panid nga alaem.\nDagiti rebision ti petsa ken dagiti nagan ti mannurat ket maipreserba.\nAmin a transwiki nga alaem ket mailista iti [[Special:Log/import|listaan ti panagala]].",
        "import-interwiki-source": "Taudan ti wiki/panid:",
-       "import-interwiki-history": "Kopiaen amin dagiti bersion ti pakasaritaan daytoy a panid",
+       "import-interwiki-history": "Kopiaen amin dagiti rebision ti pakasaritaan daytoy a panid",
        "import-interwiki-templates": "Iraman amin dagiti plantilia",
        "import-interwiki-submit": "Agala",
        "import-interwiki-namespace": "Pangipanan a nagan ti espasio:",
        "import-interwiki-rootpage": "Papanan a ramut ti panid (pagpilian):",
        "import-upload-filename": "Nagan ti papeles:",
        "import-comment": "Komentario:",
-       "importtext": "Pangngaasi nga ipanmo ti papeles a naggapu iti nagtaudan a wiki nga agusar ti [[Special:Export|agipan]].",
-       "importstart": "Agal-ala dagiti panid...",
-       "import-revision-count": "$1 {{PLURAL:$1|a pinagbaliwan|kadagiti pinagbaliwan}}",
-       "importnopages": "Awan dagiti panid ti maala.",
+       "importtext": "Pangngaasi nga ipanmo ti papeles manipud ti nagtaudan a wiki nga agusar ti [[Special:Export|ramit ti panagipan]].\nIdulinmo iti bukodmo a kompiuter ken ikarga ditoy.",
+       "importstart": "Agal-ala kadagiti panid...",
+       "import-revision-count": "$1 {{PLURAL:$1|a rebision|kadagiti rebision}}",
+       "importnopages": "Awan dagiti maala a panid.",
        "imported-log-entries": "Naala ti $1 {{PLURAL:$1|a nailista|kadagiti nailista}}.",
        "importfailed": "Napaay ti panagala: <nowiki>$1</nowiki>",
-       "importunknownsource": "Di amammo a kita ti taudan ti innala",
+       "importunknownsource": "Di ammmo a kita ti taudan ti innala",
        "importcantopen": "Saan a maluktan ti innala a papeles",
        "importbadinterwiki": "Saan a nasayaat a silpo ti interwiki",
-       "importsuccess": "Nalpasen ti pinagala!",
-       "importnosources": "Awan ti innala a taudan ti transwiki ti naipalawag ken ti dagus a pakasaritaan ti pinag-ipan ket nabaldado.",
-       "importnofile": "Awan ti inalam a papeles a naipapan.",
-       "importuploaderrorsize": "Ti pinag-ipan ti innala a papeles ket napaay.\nTi papeles ket dakdakel ngem ti mabalin a kadakkel ti pang-ipan.",
-       "importuploaderrorpartial": "Ti pinag-ipan ti innala a papeles ket napaay.\nPaset laeng ti papeles ti napag-ipan.",
-       "importuploaderrortemp": "Ti pinag-ipan ti papeles ket napaay.\nAwan ti saan nga agnayon a polder.",
-       "import-parse-failure": "Napaay ti pinagala ti XML parse",
+       "importsuccess": "Nalpasen ti panagala!",
+       "importnosources": "Awan ti innala a taudan ti transwiki ti naipalawag ken ti dagus a pakasaritaan ti panagikarga ket nabaldado.",
+       "importnofile": "Awan ti innalam a papeles ti naikarga.",
+       "importuploaderrorsize": "Ti panagikarga ti innala a papeles ket napaay.\nTi papeles ket dakdakel ngem ti maipalubos a kadakkel ti maikarga.",
+       "importuploaderrorpartial": "Ti panagikarga ti innala a papeles ket napaay.\nPaset laeng ti papeles ti naikarga.",
+       "importuploaderrortemp": "Ti panagikarga ti innala a papeles ket napaay.\nAwan ti temporario a polder.",
+       "import-parse-failure": "Napaay ti panagala ti panagwaswas ti XML",
        "import-noarticle": "Awan ti panid a maaala!",
-       "import-nonewrevisions": "Awan dagiti naala panagbalbaliw (mabalin nga adda amin dagitoyen, wenno nalabsan gapu kadagiti biddut).",
+       "import-nonewrevisions": "Awan dagiti naala a rebision (mabalin nga adda amin dagitoyen, wenno nalabsan gapu kadagiti biddut).",
        "xml-error-string": "$1 iti linia $2, tukol $3 (byte $4): $5",
-       "import-upload": "Ipan ti XML data",
-       "import-token-mismatch": "Napukaw ti gimong ti datos.\nPangngaasi a padasem manen.",
-       "import-invalid-interwiki": "Saan a makaala dita naited a wiki.",
-       "import-error-edit": "Ti panid ti \"$1\" ket saan a naala ngamin ket saanmo a mabalin nga urnosen.",
-       "import-error-create": "Ti panid ti \"$1\" ket saan a naala ngamin ket saanmo a mabalin nga aramiden.",
-       "import-error-interwiki": "Ti panid ti \"$1\" ket saan a naala ngamin ket ti nagan ket nailasin para iti ruar a panagsilpo (interwiki).",
-       "import-error-special": "Ti panid ti \"$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 ti \"$1\" ket saan a naala ngamin ket ti nagan ket imbalido.",
-       "import-error-unserialize": "Ti panagbaliw ti $2 iti panid ti \"$1\" ket di maipagsasaruno. Ti panagbalbaliw ket naireporta idi nga agus-usar ti modelo ti $3 a naipagsasaruno a kas $4.",
-       "import-error-bad-location": "Ti panagbaliw ti $2 nga agus-usar ti modelo a linaon ti $3 ket saan a maipenpen iti \"$1\" iti daytoy a wiki, gapu ta dayta a modelo ket saan a nasuportaran iti dayta a panid.",
+       "import-upload": "Ikarga ti datos ti XML",
+       "import-token-mismatch": "Napukaw ti sesion ti datos.\nPangngaasi a padasen manen.",
+       "import-invalid-interwiki": "Saan a makaala manipud ti nainaganan a wiki.",
+       "import-error-edit": "Ti panid ti \"$1\" ket saan idi a naala ngamin ket saanmo a mabalin nga urnosen.",
+       "import-error-create": "Ti panid ti \"$1\" ket saan idi a naala ngamin ket saanmo a mabalin a partuaten.",
+       "import-error-interwiki": "Ti panid ti \"$1\" ket saan idi a naala ngamin ket ti nagan ket naireserba para iti ruar a panagsilpo (interwiki).",
+       "import-error-special": "Ti panid ti \"$1\" ket saan idi a naala ngamin ket bukod ti espesial a nagan ti espasio ket saan nga agpalubos iti pampanid.",
+       "import-error-invalid": "Ti panid ti \"$1\" ket saan idi a naala ngamin ket ti nagan a pakaalaanna ket imbalido iti daytoy a wiki.",
+       "import-error-unserialize": "Ti rebisionn ti $2 iti panid ti \"$1\" ket di maipagsasaruno. Ti rebision ket naireporta idi nga agus-usar ti modelo ti $3 a naipagsasaruno a kas $4.",
+       "import-error-bad-location": "Ti rebision ti $2 nga agus-usar ti modelo a linaon ti $3 ket saan a maipenpen iti \"$1\" iti daytoy a wiki, gapu ta dayta a modelo ket saan a nasuportaran iti dayta a panid.",
        "import-options-wrong": "Saan a husto {{PLURAL:$2|a pagpilian|a pagpilpilian}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Ti naited a ramut ti panid ket imbalido a titulo.",
-       "import-rootpage-nosubpage": "Ti nagan ti lugar ti \"$1\" iti ramut ti panid ket saan amangpalubos kadagiti apo ti panid.",
-       "importlogpage": "Alaen ti listaan",
-       "importlogpagetext": "Ti administratibo a panagala dagiti panid nga adda ti pakasaritaanna nga urnos kadagiti sabsabali a wiki.",
-       "import-logentry-upload": "innala ti [[$1]] iti papeles a pinag-ipan",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|a pinagbaliwan|kadagiti pinagbaliwan}}",
-       "import-logentry-interwiki": "nai-transwiki ti $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|pinagbaliwan|dagiti pinagbaliwan}} manipud iti $2",
-       "javascripttest": "Subsubokan ti JavaScript",
-       "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:",
+       "import-rootpage-nosubpage": "Ti nagan ti espasio ti \"$1\" iti ramut ti panid ket saan a mangpalubos kadagiti subpanid.",
+       "importlogpage": "Listaan ti panagala",
+       "importlogpagetext": "Dagiti administratibo a panagala kadagiti panid nga addaan iti pakasaritaan ti panag-urnos manipud kadagiti sabali a wiki.",
+       "import-logentry-upload": "innala ti [[$1]] babaen ti panagikarga ti papeles",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|a rebision|kadagiti rebision}} ti naala",
+       "import-logentry-interwiki": "nai-transwiki iti $1",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|rebision|dagiti rebision}} ti naala manipud ti $2",
+       "javascripttest": "Panagsubok ti JavaScript",
+       "javascripttest-title": "Agpatpataray kadagiti panagsubok ti $1",
+       "javascripttest-pagetext-noframework": "Daytoy a panid ket naireserba para iti panagpataray kadagiti panagsubok ti JavaScript.",
+       "javascripttest-pagetext-unknownframework": "Di ammo a tabas ti panagsubok ti \"$1\".",
+       "javascripttest-pagetext-frameworks": "Pangngaasi nga agpili ti maysa kadagiti sumaganad a tabas ti panagsubok: $1",
+       "javascripttest-pagetext-skins": "Agpili ti kudil a pangipatarayan kadagiti panagsubok:",
        "javascripttest-qunit-intro": "Kitaen ti [ $1 dukomentasion ti panagsubok] idiay mediawiki.org.",
        "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit test suite",
        "tooltip-pt-userpage": "Panidmo nga agar-aramat",
-       "tooltip-pt-anonuserpage": "Ti panid ti agar-aramat daytoy nga IP a pagtaengan nga urnosem a  kasla",
-       "tooltip-pt-mytalk": "Pakitungtungam a panid",
-       "tooltip-pt-anontalk": "Pakitungtungan a maipapan ti panagurnos a naggapu ditoy nga IP a pagtaengan",
+       "tooltip-pt-anonuserpage": "Ti panid ti agar-aramat para iti daytoy nga IP a pagtaengan a kas ur-urnosem",
+       "tooltip-pt-mytalk": "Tungtungam a panid",
+       "tooltip-pt-anontalk": "Pakitungtungan a maipanggep kadagiti panagurnos manipud ti daytoy nga IP a pagtaengan",
        "tooltip-pt-preferences": "Dagiti kakaykayatam",
-       "tooltip-pt-watchlist": "Listaan dagiti panid a sipsiputem para iti panakabalbaliw",
-       "tooltip-pt-mycontris": "Listaan dagiti inaramidmo",
+       "tooltip-pt-watchlist": "Listaan dagiti panid a sipsiputem para iti pannakabalbaliw",
+       "tooltip-pt-mycontris": "Ti listaan dagiti kontribusionmo",
        "tooltip-pt-login": "Maisingasing a sumrekka; nupay kasta, daytoy ket saan a maipapilit",
        "tooltip-pt-logout": "Rummuar",
        "tooltip-ca-talk": "Pagtungtungan a maipapan ti linaon ti panid",
        "tooltip-ca-edit": "Mabalinmo nga urnosen daytoy a panid. Pangngaasi nga aramatem ti buton ti panagipadas sakbay nga agidulin",
        "tooltip-ca-addsection": "Mangirugi ti baro a paset",
        "tooltip-ca-viewsource": "Nasalakniban daytoy a panid.\nMabalinmo a kitaen ti taudanna.",
-       "tooltip-ca-history": "Dagiti napalabas a panagbalbaliw iti daytoy a panid.",
+       "tooltip-ca-history": "Dagiti napalabas a rebision 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 ti daytoy a panid sakbay idi naikkat",
+       "tooltip-ca-undelete": "Isubli dagiti inurnos a naaramid iti daytoy a panid sakbay idi 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-ca-watch": "Inayon daytoy a panid iti listaan ti bambantayam",
+       "tooltip-ca-unwatch": "Ikkaten daytoy a panid manipud ti listan ti bambantayam",
+       "tooltip-search": "Agbiruk iti {{SITENAME}}",
        "tooltip-search-go": "Inka idiay panid nga adda kastoy a naganna no adda",
        "tooltip-search-fulltext": "Biruken dagiti panid para iti 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 ti gandat, ti aniaman a maaramidam, no sadino ti pagbirukam kadagiti banbanag",
-       "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-portal": "Maipapan ti gandat, ti aniaman a maaramidmo, no sadino ti pagbirukam kadagiti banbanag",
+       "tooltip-n-currentevents": "Agsapul ti pakaammo kadagiti agdama a paspasamak",
+       "tooltip-n-recentchanges": "Listaan dagiti naudi a sinukatan iti wiki",
+       "tooltip-n-randompage": "Agikarga iti pugto a panid",
        "tooltip-n-help": "Ti lugar a pagsapulan",
-       "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-t-whatlinkshere": "Listaan ti amin a pampanid ti wiki a nakasilpo ditoy",
+       "tooltip-t-recentchangeslinked": "Kaudian a balbaliw kadagiti panid a naisilpo manipud ti daytoy a panid",
        "tooltip-feed-rss": "RSS a pakan para iti daytoy a panid",
        "tooltip-feed-atom": "Atom a pakan para iti daytoy a panid",
-       "tooltip-t-contributions": "Kitaen ti listaan dagiti naaramid daytoy nga agar-aramat",
+       "tooltip-t-contributions": "Ti lstaan dagiti kontribusion iti daytoy nga agar-aramat",
        "tooltip-t-emailuser": "Patulodan ti esurat daytoy nga agar-aramat",
-       "tooltip-t-upload": "Agipan iti papeles",
+       "tooltip-t-upload": "Agikarga kadagiti papeles",
        "tooltip-t-specialpages": "Listaan ti amin nga espesial a pampanid",
-       "tooltip-t-print": "Maimaldit a bersion ti panid",
-       "tooltip-t-permalink": "Agnanayon a silpo ti daytoy a panagbaliw ti panid",
+       "tooltip-t-print": "Maimaldit a bersion iti daytoy a panid",
+       "tooltip-t-permalink": "Permanente a silpo iti daytoy a rebision ti 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-special": "Daytoy ket 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-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 nga usarem daytoy sakbay nga idulinmo ti panid!",
+       "tooltip-preview": "Ipadas dagiti sinukatam, pangngaasi nga usarem daytoy sakbay nga idulin ti panid!",
        "tooltip-diff": "Ipakita no ania dagiti sinukatan nga inaramidmo iti testo",
-       "tooltip-compareselectedversions": "Kitaen ti naggidiatan dagiti dua a napili a bersion ti daytoy a panid.",
-       "tooltip-watch": "Inayon daytoy a panid idiay listaan dagiti bambantayam",
+       "tooltip-compareselectedversions": "Kitaen ti naggidiatan dagiti dua a napili a bersion iti daytoy a panid.",
+       "tooltip-watch": "Inayon daytoy a panid iti listaan ti bambantayam",
        "tooltip-watchlistedit-normal-submit": "Ikkaten dagiti titulo",
        "tooltip-watchlistedit-raw-submit": "Pabaruen ti listaan ti bambantayan",
-       "tooltip-recreate": "Aramidem manen ti panid urayno dati a naikkat.",
-       "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-recreate": "Partuaten manen ti panid urayno dati a naikkat.",
+       "tooltip-upload": "Irugi ti panagikarga",
+       "tooltip-rollback": "\"Baliktaden\"  isubli ti inurnos (dagiti inurnos) iti daytoy a panid iti naudi a kontributor iti maysa a pindut",
+       "tooltip-undo": "\"Ibabawi\" ipasubli daytoy nga urnos ken lukatanna ti porma ti pagurnosan iti panagpadas a moda. Mangpalubos daytoy ti agikabil ti rason iti pakabuklan.",
        "tooltip-preferences-save": "Idulin dagiti kakaykayatam",
-       "tooltip-summary": "Ikabil ti bassit a pakabuklan",
-       "anonymous": "Di am-ammo {{PLURAL:$1|nga agar-aramat|kadagiti agar-aramat}} iti {{SITENAME}}",
+       "tooltip-summary": "Agikabil ti bassit a pakabuklan",
+       "anonymous": "Di ammo {{PLURAL:$1|nga agar-aramat|kadagiti agar-aramat}} iti {{SITENAME}}",
        "siteuser": "{{SITENAME}} nga agar-aramat $1",
-       "anonuser": "{{SITENAME}} di amammo nga agar-aramat $1",
-       "lastmodifiedatby": "Daytoy a panid ket naudi a binalbaliwan idi $2, $1 ni $3.",
+       "anonuser": "{{SITENAME}} di ammo nga agar-aramat $1",
+       "lastmodifiedatby": "Daytoy a panid ket naudi a nabaliwan idi $2, $1 babaen ni $3.",
        "othercontribs": "Naibasar iti obra ni $1.",
        "others": "dadduma pay",
        "siteusers": "{{SITENAME}}  {{PLURAL:$2|agar-aramat|dagiti agar-aramat}}  $1",
-       "anonusers": "{{SITENAME}} di am-ammo {{PLURAL:$2|nga agar-aramat|a digiti agar-aramat}} $1",
-       "creditspage": "Dagiti pagdaydayaw ti panid",
-       "nocredits": "Awan dagiti pakaammo ti pammadayaw nga adda ditoy a panid.",
-       "spamprotectiontitle": "Panagsalaknib a sagat  para ti spam",
-       "spamprotectiontext": "Ti testo a kayatmo nga idulin ket sinerraan ti sagat ti spam.\nDaytoy ket mabalin a gapuanan babaen ti silpo a naiparit ti akin ruar a pagsaadan.",
-       "spamprotectionmatch": "Ti sumaganad a testo ti nangirugi ti sagat ti spam: $1",
-       "spambot_username": "Panagdalus iti MediaWiki spam",
-       "spam_reverting": "Ipasubli ti kinaudi a panagbaliw nga awan dagiti linaon a silpo idiay $1",
-       "spam_blanking": "Dagiti amin a panagbaliw ket aglaon kadagiti silpo idiay $1, iblanko",
-       "spam_deleting": "Dagiti amin a panagbaliw ket naglaon kadagiti silpo idiay $1, ik-ikkaten",
-       "simpleantispam-label": "Kontra-spam a panagkita.\n '''Saan''' a suratan daytoy!",
+       "anonusers": "{{SITENAME}} di ammo {{PLURAL:$2|nga agar-aramat|a digiti agar-aramat}} $1",
+       "creditspage": "Dagiti pammadayaw ti panid",
+       "nocredits": "Awan dagiti pakaammo ti pammadayaw a magun-od para iti daytoy a panid.",
+       "spamprotectiontitle": "Panagsalaknib a sagat para iti spam",
+       "spamprotectiontext": "Ti testo a kayatmo nga idulin ket sinerraan babaen ti sagat ti spam.\nDaytoy ket mabalin a gapuanan babaen ti silpo a naiparit ti akin ruar a sitio.",
+       "spamprotectionmatch": "Ti sumaganad a testo ket isu ti nangkalbit ti sagat ti spam: $1",
+       "spambot_username": "Panagdalus iti spam ti MediaWiki",
+       "spam_reverting": "Ipasubli ti naudi a rebision nga awan dagiti linaon a silpo iti $1",
+       "spam_blanking": "Amin dagiti rebision ket aglaon kadagiti silpo iti $1, iblanko",
+       "spam_deleting": "Amin dagiti rebision ket aglaon kadagiti silpo iti $1, ik-ikkaten",
+       "simpleantispam-label": "Pammasingked ti anti-spam.\n<strong>SAAN</strong> a kargaan daytoy!",
        "pageinfo-title": "Pakaammo para iti \"$1\"",
-       "pageinfo-not-current": "Pasensia, saan a mabalin ti mangited ti pakaammo para kadagiti daan a panagbalbaliw.",
+       "pageinfo-not-current": "Pasensia, saan a mabalin ti mangited ti pakaammo para kadagiti daan a rebision.",
        "pageinfo-header-basic": "Kangrunaan a pakaammo",
        "pageinfo-header-edits": "Pakasaritaan ti inurnos",
        "pageinfo-header-restrictions": "Panagsalaknib ti panid",
        "pageinfo-redirects-name": "Bilang dagiti baw-ing iti daytoy a panid",
        "pageinfo-subpages-name": "Bilang dagiti subpanid iti daytoy a panid",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|baw-ing|bawbaw-ing}}; $3 {{PLURAL:$3|saan a baw-ing|saan a bawbaw-ing}})",
-       "pageinfo-firstuser": "Nagpartuat ti panid",
+       "pageinfo-firstuser": "Nagpartuat iti panid",
        "pageinfo-firsttime": "Petsa a pannakapartuat ti panid",
-       "pageinfo-lastuser": "Kinaudi a nagurnos",
+       "pageinfo-lastuser": "Kinaudi nga editor",
        "pageinfo-lasttime": "Petsa ti kinaudi a panag-urnos",
        "pageinfo-edits": "Dagup a bilang dagiti inurnos",
        "pageinfo-authors": "Dagup a bilang dagiti naisangsangayan a mannurat",
        "pageinfo-templates": "Nailak-am {{PLURAL:$1|a plantilia|a planplantilia}} ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|Panid|Pampanid}} a nakailak-aman ($1)",
        "pageinfo-toolboxlink": "Pakaammo ti panid",
-       "pageinfo-redirectsto": "Maibaw-ing idiay",
+       "pageinfo-redirectsto": "Maibaw-ing iti",
        "pageinfo-redirectsto-info": "pakaammo",
        "pageinfo-contentpage": "Naibilang a kas naglaon a panid",
        "pageinfo-contentpage-yes": "Wen",
        "pageinfo-protect-cascading": "Dagiti panagsalaknib ket agsariap manipud ditoy",
        "pageinfo-protect-cascading-yes": "Wen",
-       "pageinfo-protect-cascading-from": "Dagiti panagsalaknib ket agsariap manipud idiay",
+       "pageinfo-protect-cascading-from": "Dagiti panagsalaknib ket agsariap manipud ti",
        "pageinfo-category-info": "Pakaammo ti kategoria",
        "pageinfo-category-pages": "Bilang dagiti panid",
        "pageinfo-category-subcats": "Bilang dagiti subkategoria",
        "markaspatrolleddiff": "Markaan a kas napatruliaan",
        "markaspatrolledtext": "Markaan daytoy a panid a kas napatruliaan",
        "markedaspatrolled": "Markaan a kas napatruliaan",
-       "markedaspatrolledtext": "Ti napili a panagbaliw iti [[:$1]] ket namarkaan a kas napatrulian.",
-       "rcpatroldisabled": "Nabaldado ti panagpatrulia kadagiti kinaudi a pinagbaliw",
-       "rcpatroldisabledtext": "Dagiti langa a patrulia ti kinaudi a pinagbaliw ket agdama a nabaldado",
+       "markedaspatrolledtext": "Ti napili a rebision iti [[:$1]] ket namarkaan a kas napatrulian.",
+       "rcpatroldisabled": "Nabaldado ti panagpatrulia iti kaudian balbaliw",
+       "rcpatroldisabledtext": "Dagiti langa ti patrulia iti kaudian a balbaliw ket agdama a nabaldado.",
        "markedaspatrollederror": "Madi a mamarkaan a kas napatruliaan",
        "markedaspatrollederrortext": "Nasken a naganam ti maysa a rebision tapno mamarkaan a kas napatruliaan.",
        "markedaspatrollederror-noautopatrol": "Saanmo a mabalin a markaan dagita sinukatam a kas napatruliaan.",
-       "markedaspatrollednotify": "Daytoy a panagbaliw ti $1 ket namarkaanen a kas napatruliaan.",
+       "markedaspatrollednotify": "Daytoy a panagbaliw iti $1 ket namarkaanen a kas napatruliaan.",
        "markedaspatrollederrornotify": "Ti panagmarka a kas napatruliaan ket napaay.",
        "patrol-log-page": "Listaan ti napatruliaan",
-       "patrol-log-header": "Daytoy ket listaan dagiti napatruliaan a panagbabaliw.",
+       "patrol-log-header": "Daytoy ket listaan dagiti napatruliaan a rebision.",
        "log-show-hide-patrol": "$1 listaan ti napatruliaan",
-       "deletedrevision": "Naikkat ti daan a binaliwan $1",
+       "deletedrevision": "Naikkat a daan a rebision ti $1",
        "filedeleteerror-short": "Biddut ti panakaikkat ti papeles: $1",
        "filedeleteerror-long": "Adda nasarakan a biddut idi agikikkat ti papeles:\n\n$1",
-       "filedelete-missing": "Ti papeles \"$1\" ket saan a maikkat, ngamin ket awanen dita.",
-       "filedelete-old-unregistered": "Ti nainagan a pinagbaliw ti papeles \"$1\" ket awan idiay database.",
-       "filedelete-current-unregistered": "Ti nainagan a papeles \"$1\" ket awan idiay database.",
-       "filedelete-archive-read-only": "Ti pagidulinan a direktorio \"$1\" ket saan a masuratan ti webserver.",
-       "previousdiff": "← Napalabas a naurnos",
-       "nextdiff": "Sumaruno a naurnos →",
-       "mediawarning": "'''Ballaag'': Daytoy a papeles ket naglaon ti dakes a kodigo.\nNo usarem daytoy, baka makompromiso ti sistema.",
-       "imagemaxsize": "Ti patingga a kadakkel ti papeles:<br />''(para dagiti pagpalpalawag ti papeles a panid)''",
+       "filedelete-missing": "Ti papeles ti \"$1\" ket saan a maikkat, ngamin ket awanen dita.",
+       "filedelete-old-unregistered": "Ti nainagan a rebison ti papeles ti \"$1\" ket awan iti database.",
+       "filedelete-current-unregistered": "Ti nainagan a papeles ti \"$1\" ket awan iti database.",
+       "filedelete-archive-read-only": "Ti arkibo a direktorio ti \"$1\" ket saan a masuratan babaen ti webserver.",
+       "previousdiff": "← Nadadaan nga urnos",
+       "nextdiff": "Barbaro nga urnos →",
+       "mediawarning": "<strong>Ballaag:</strong> Daytoy a papeles ket naglaon ti dakes a kodigo.\nNo usarem daytoy, baka makompromiso ti sistema.",
+       "imagemaxsize": "Ti patingga a kadakkel ti papeles:<br /><em>(para kadagiti panid ti deskripsion ti papeles)</em>",
        "thumbsize": "Rukod ti bassit a ladawan:",
        "widthheightpage": "$1 × $2, $3 a {{PLURAL:$3|panid|pampanid}}",
        "file-info": "kadakkel ti papeles: $1, MIME a kita: $2",
        "show-big-image-other": "Sabali {{PLURAL:$2|a resolusion|kadagiti resolusion}}: $1.",
        "show-big-image-size": "$1 × $2 dagiti piksel",
        "file-info-gif-looped": "nasiluan",
-       "file-info-gif-frames": "$1 {{PLURAL:$1|a kuadro| kadagiti kuadro}}",
+       "file-info-gif-frames": "$1 {{PLURAL:$1|a kuadro|a kuadkuadro}}",
        "file-info-png-looped": "nasiluan",
        "file-info-png-repeat": "inay-ayam ti $1 {{PLURAL:$1|a beses|a besbeses}}",
-       "file-info-png-frames": "$1 {{PLURAL:$1|a kuadro| kadagiti kuadro}}",
-       "file-no-thumb-animation": "'''Paammo: Gapu kadagiti teknikal a pannakaipatingga, dagiti bassit a ladawan ti daytoy a papeles ket saanto a maanimado.'''",
-       "file-no-thumb-animation-gif": "'''Paammo: Gapu kadagiti teknikal a pannakaipatingga, dagiti bassit a ladawan ti nangato a resolusion dagiti GIF a ladawan a kas daytoy ket saanto a maanimado.'''",
-       "newimages": "Galeria dagiti kabarbaro a papeles",
-       "imagelisttext": "Adda dita baba ti listaan ti ''$1''' {{PLURAL:$1|a papeles|dagiti papeles}} a nailasin a kas $2.",
-       "newimages-summary": "Daytoy nga espesial a panid ket ipakitana ti kinaudi a pinag-ipan kadagiti papeles.",
+       "file-info-png-frames": "$1 {{PLURAL:$1|a kuadro| a kuadkuadro}}",
+       "file-no-thumb-animation": "<strong>Nota: Gapu kadagiti teknikal a pannakaipatingga, dagiti bassit a ladawan iti daytoy a papeles ket saanto a maanimado.</strong>",
+       "file-no-thumb-animation-gif": "<strong>Nota: Gapu kadagiti teknikal a pannakaipatingga, dagiti bassit a ladawan ti nangato a resolusion dagiti GIF a ladawan a kas daytoy ket saanto a maanimado.</strong>",
+       "newimages": "Galeria dagiti baro a papeles",
+       "imagelisttext": "Adda dita baba ti listaan ti <strong>$1</strong> {{PLURAL:$1|a papeles|a pappapeles}} a nailasin a kas $2.",
+       "newimages-summary": "Daytoy nga espesial a panid ket ipakitana ti naudi a panagikarga kadagiti papeles.",
        "newimages-legend": "Sagat",
-       "newimages-label": "Nagan ti papeles (wenno paset na) :",
+       "newimages-label": "Nagan ti papeles (wenno pasetna) :",
        "newimages-showbots": "Ipakita dagiti naikarga babaen dagiti bot",
        "noimages": "Awan ti makita.",
        "ilsubmit": "Biruken",
        "bydate": "babaen ti petsa",
-       "sp-newimages-showfrom": "Iparang dagiti baro a papeles mangrugi iti $2, $1",
-       "seconds": "{{PLURAL:$1|$1 segundo|$1 segundo}}",
-       "minutes": "{{PLURAL:$1|$1 minuto|$1 minutos}}",
+       "sp-newimages-showfrom": "Iparang dagiti baro a papeles a mangrugi manipud idi $2, $1",
+       "seconds": "{{PLURAL:$1|$1 a segundo|$1 a segsegundo}}",
+       "minutes": "{{PLURAL:$1|$1 a minuto|$1 a minminuto}}",
        "hours": "{{PLURAL:$1|$1 nga oras|$1 nga or-oras}}",
        "days": "{{PLURAL:$1|$1 nga aldaw|$1 nga al-aldaw}}",
        "weeks": "{{PLURAL:$1|$1 a lawas|$1 a law-lawas}}",
        "months": "{{PLURAL:$1|$1 a bulan|$1 a bulbulan}}",
        "years": "{{PLURAL:$1|$1 a tawen|$1 a tawtawen}}",
-       "ago": "$1 nagtapos",
+       "ago": "nagtapos idi $1",
        "just-now": "tatta laeng",
-       "hours-ago": "$1 nga {{PLURAL:$1|oras|or-oras}} ti napalabas",
-       "minutes-ago": "$1 a {{PLURAL:$1|minuto|minutos}} ti napalabas",
-       "seconds-ago": "$1 a {{PLURAL:$1|segundo|seg-segundo}} ti napalabas",
-       "monday-at": "Lunes idiay $1",
-       "tuesday-at": "Martes idiay $1",
-       "wednesday-at": "Mierkoles idiay $1",
-       "thursday-at": "Huebes idiay $1",
-       "friday-at": "Biernes idiay $1",
-       "saturday-at": "Sabado idiay $1",
-       "sunday-at": "Dominggo idiay $1",
-       "yesterday-at": "Idi kalman idiay $1",
-       "bad_image_list": "Ti kinabuklan ket kas iti sumaganad:\n\nDagiti laeng banag iti listaan (linlinia a mangrugi iti *) ti mabalin.\nTi umuna a silpo iti maysa a linia ket nasken a nakasilpo iti maysa a saan a nasayaat a papeles.\nAnia man a sumarsaruno a silsilpo iti isu met laeng a linia ket maikonsidera kas mailaksid, kas pagarigan, dagiti panid a pakasarakan ti papeles a kas nakalinia.",
+       "hours-ago": "$1 nga {{PLURAL:$1|oras|or-oras}} ti nagtapos",
+       "minutes-ago": "$1 a {{PLURAL:$1|minuto|minminuto}} ti nagtapos",
+       "seconds-ago": "$1 a {{PLURAL:$1|segundo|segsegundo}} ti nagtapos",
+       "monday-at": "Lunes iti $1",
+       "tuesday-at": "Martes iti $1",
+       "wednesday-at": "Mierkoles iti $1",
+       "thursday-at": "Huebes iti $1",
+       "friday-at": "Biernes iti $1",
+       "saturday-at": "Sabado iti $1",
+       "sunday-at": "Domingo iti $1",
+       "yesterday-at": "Idi kalman iti $1",
+       "bad_image_list": "Ti pormat ket kas iti sumaganad:\n\nDagiti laeng banag iti listaan (linlinia a mangrugi iti *) ti mabalin.\nTi umuna a silpo iti maysa a linia ket nasken a nakasilpo iti maysa a saan a nasayaat a papeles.\nAnia man a sumarsaruno a silsilpo iti isu met laeng a linia ket maikonsidera kas mailaksid, kas pagarigan, dagiti panid a pakasarakan ti papeles a kas nakalinia.",
        "metadata": "Metadata",
        "metadata-help": "Daytoy a papeles ket naglaon ti naipatinayon a pakaammo, a mabalin a nainayon manipud ti dihital a kamera wenno skanner a naaramat a pangpartuat wenno pang-digitize itoy.\nNo ti papeles ket saan a nabalbaliwan manipud iti kasisigud a kasasaad, adda dagiti sumagmamano a salaysay a mabalin a saan a napno a maipakita ti nabaliwan a papeles.",
        "metadata-expand": "Ipakita dagiti napaatiddog a salaysay",
        "exif-orientation": "Pagturongan",
        "exif-samplesperpixel": "Bilang dagiti komponente",
        "exif-planarconfiguration": "Pannaka-urnos ti datos",
-       "exif-ycbcrsubsampling": "Subsampling ratio ti Y iti C",
+       "exif-ycbcrsubsampling": "Subwadan pannakaibagi ti Y iti C",
        "exif-ycbcrpositioning": "Y ken C a panakaipatakderan",
        "exif-xresolution": "Horisontal a resolusion",
-       "exif-yresolution": "nakatakder a resolusion",
-       "exif-stripoffsets": "Lokasion ti datos ti imahen",
-       "exif-rowsperstrip": "Bilang ti ar-aray tunggal maysa a strip",
-       "exif-stripbytecounts": "Bytes per compressed strip",
-       "exif-jpeginterchangeformat": "Offset to JPEG SOI",
-       "exif-jpeginterchangeformatlength": "Bytes ti JPEG a datos",
-       "exif-whitepoint": "White point chromaticity",
-       "exif-primarychromaticities": "Chromaticities dagiti primarities",
-       "exif-referenceblackwhite": "Reperensia a kuwenta iti agparis a nangisit ken puraw",
+       "exif-yresolution": "Bertikal a resolusion",
+       "exif-stripoffsets": "Lokasion ti datos ti ladawan",
+       "exif-rowsperstrip": "Bilang ti ar-aray tunggal maysa a pirgis",
+       "exif-stripbytecounts": "Dagiti byte tunggal maysa a natalmegan  a pirgis",
+       "exif-jpeginterchangeformat": "Timbengan iti JPEG SOI",
+       "exif-jpeginterchangeformatlength": "Dagiti byte ti datos ti JPEG",
+       "exif-whitepoint": "Kromatisidad ti puntos ti puraw",
+       "exif-primarychromaticities": "Dagiti kromasidad dagiti primaridad",
+       "exif-referenceblackwhite": "Reperensia a patpateg iti agparis a nangisit ken puraw",
        "exif-datetime": "Panagsukat ti papeles ti petsa ken oras",
-       "exif-imagedescription": "Titulo ti imahen",
+       "exif-imagedescription": "Titulo ti ladawan",
        "exif-make": "Nangpartuat iti kamera",
        "exif-model": "Modelo ti kamera",
-       "exif-software": "Naaramat a software",
+       "exif-software": "Naaramat a sopwer",
        "exif-artist": "Mannurat",
-       "exif-copyright": "Nakatengngel iti kaberngan ti kopia",
-       "exif-exifversion": "Exif a bersion",
-       "exif-flashpixversion": "Nasuportaran a Flashpix a bersion",
-       "exif-colorspace": "Kolor ti lugar",
-       "exif-componentsconfiguration": "Ti kayat a saoen ti tunggal maysa a nagyan",
-       "exif-compressedbitsperpixel": "Moda ti kompresion ti imahen",
-       "exif-pixelydimension": "Kaaba ti imahen",
-       "exif-pixelxdimension": "Katayag ti imahen",
+       "exif-copyright": "Nakatengngel iti karbengan ti kopia",
+       "exif-exifversion": "Bersion ti Exif",
+       "exif-flashpixversion": "Nasuportaran a bersion ti Flashpix",
+       "exif-colorspace": "Espasio ti maris",
+       "exif-componentsconfiguration": "Kaibuksilan iti tunggal maysa a komponente",
+       "exif-compressedbitsperpixel": "Moda ti kompresion ti ladawan",
+       "exif-pixelydimension": "Kaakaba ti ladawan",
+       "exif-pixelxdimension": "Katayag ti ladawan",
        "exif-usercomment": "Dagiti komentario ti agar-aramat",
-       "exif-relatedsoundfile": "Mainaig nga nangnangeg a papeles",
-       "exif-datetimeoriginal": "Petsa ken oras ti panakaaramid ti datos",
-       "exif-datetimedigitized": "Petsa ken oras ti panang-digitizing",
+       "exif-relatedsoundfile": "Mainaig a papeles ti audio",
+       "exif-datetimeoriginal": "Petsa ken oras ti pannakaaramid ti datos",
+       "exif-datetimedigitized": "Petsa ken oras ti panang-dihitado",
        "exif-subsectime": "DateTime subseconds",
        "exif-subsectimeoriginal": "DateTimeOriginal subseconds",
        "exif-subsectimedigitized": "DateTimeDigitized subseconds",
        "exif-gpstrackref": "Reperensia iti direksion ti panaggunay",
        "exif-gpstrack": "Direksion ti kuti",
        "exif-gpsimgdirectionref": "Reperensia iti direksion ti imahen",
-       "exif-gpsimgdirection": "Direksion ti imahen",
-       "exif-gpsmapdatum": "Naaramat a geodetic survey data",
-       "exif-gpsdestlatituderef": "Reperensia iti latitude a papanan",
-       "exif-gpsdestlatitude": "Latitude ti papanan",
-       "exif-gpsdestlongituderef": "Reperensia iti longitude a papanan",
-       "exif-gpsdestlongitude": "Longitude ti papanan",
+       "exif-gpsimgdirection": "Direksion ti ladawan",
+       "exif-gpsmapdatum": "Datos nga inaramat ti geodetiko a panagsukimat",
+       "exif-gpsdestlatituderef": "Reperensia iti papanan a latitud",
+       "exif-gpsdestlatitude": "Papanan a latitud",
+       "exif-gpsdestlongituderef": "Reperensia iti papanan a longitud",
+       "exif-gpsdestlongitude": "Papanan a longitud",
        "exif-gpsdestbearingref": "Reperensia iti dalan a papanan",
        "exif-gpsdestbearing": "Dalan ti papanan",
        "exif-gpsdestdistanceref": "Reperensia ti kaadayo  ti papanan",
-       "exif-gpsdestdistance": "Kaadayo iti papanan na",
-       "exif-gpsprocessingmethod": "Nagan ti kastoy a pinagaramid ti GPS",
-       "exif-gpsareainformation": "Nagan ti GPS area",
+       "exif-gpsdestdistance": "Kaadayo iti papanan",
+       "exif-gpsprocessingmethod": "Nagan ti panagproseo a pamay-an ti GPS",
+       "exif-gpsareainformation": "Nagan ti lugar ti GPS",
        "exif-gpsdatestamp": "Petsa ti GPS",
-       "exif-gpsdifferential": "Nasimpa apaggiddiatan ti GPS",
-       "exif-jpegfilecomment": "Komento ti JPEG a papeles",
-       "exif-keywords": "Nangnangruna a bal-balikas",
-       "exif-worldregioncreated": "Ti parte ti lubong nga nakaalaan ti litrato",
-       "exif-countrycreated": "Ti pagilian nga nakaalaan ti litrato",
-       "exif-countrycodecreated": "Kodigo ti pagilian nga nakaalaan ti litrato",
-       "exif-provinceorstatecreated": "Probinsia wenno estado nga nakaalaan ti litrato",
-       "exif-citycreated": "Ti siudad nga nakaalaan ti litrato",
+       "exif-gpsdifferential": "Nasimpa a paggiddiatan ti GPS",
+       "exif-jpegfilecomment": "Komentario ti papeles ti JPEG",
+       "exif-keywords": "Nangruna a balbalikas",
+       "exif-worldregioncreated": "Rehion ti lubong a nakaalaan ti retrato",
+       "exif-countrycreated": "Pagilian a nakaalaan ti retrato",
+       "exif-countrycodecreated": "Kodigo ti pagilian a nakaalaan ti retrato",
+       "exif-provinceorstatecreated": "Probinsia wenno estado a nakaalaan ti retrato",
+       "exif-citycreated": "Siudad a nakaalaan ti retrato",
        "exif-sublocationcreated": "Sabali pay a lokasion ti siudad a nakaalaan ti retrato",
-       "exif-worldregiondest": "Paset ti lubong a naipakita",
+       "exif-worldregiondest": "Rehion ti lubong a naipakita",
        "exif-countrydest": "Naipakita a pagilian",
-       "exif-countrycodedest": "Kodigo ti pagilian a naipakita",
+       "exif-countrycodedest": "Kodigo para ti pagilian a naipakita",
        "exif-provinceorstatedest": "Probinsia wenno estado a naipakita",
        "exif-citydest": "Naipakita a siudad",
-       "exif-sublocationdest": "Sabali pay a lokasion ti siudad a naipakita",
-       "exif-objectname": "Pandek a titulo",
+       "exif-sublocationdest": "Sublokasion ti siudad a naipakita",
+       "exif-objectname": "Ababa a titulo",
        "exif-specialinstructions": "Kangrunaan a panagipalpalawag",
        "exif-headline": "Paulo",
        "exif-credit": "Pammadayaw/Nangted",
        "exif-source": "Taudan",
-       "exif-editstatus": "Panagurnos a kasasaad ti imahen",
+       "exif-editstatus": "Panagurnos a kasasaad ti ladawan",
        "exif-urgency": "Ganat",
        "exif-fixtureidentifier": "Nagan ti naikabit a banag",
        "exif-locationdest": "Lugar a naibaga",
        "exif-iimversion": "Bersion ti IIM",
        "exif-iimcategory": "Kategoria",
        "exif-iimsupplementalcategory": "Dagiti sabali pay a kategoria",
-       "exif-datetimeexpires": "Saan nga usaren ti kallabes nga",
+       "exif-datetimeexpires": "Saan nga usaren kalpasanna",
        "exif-datetimereleased": "Nakairuar idi",
-       "exif-originaltransmissionref": "Kinasigud a pinagipatulod iti kodigo ti papanan",
-       "exif-identifier": "Panagilasin",
+       "exif-originaltransmissionref": "Kasisigud a transmision ti kodigo ti lokasion",
+       "exif-identifier": "Panangilasin",
        "exif-lens": "Lente nga inusar",
        "exif-serialnumber": "Agsasaruno a numero ti kamera",
        "exif-cameraownername": "Akinkukua ti kamera",
        "exif-label": "Etiketa",
        "exif-datetimemetadata": "Petsa ti kinaudi a panagbaliw ti metadata",
-       "exif-nickname": "Di pormal a nagan ti imahen",
-       "exif-rating": "Pategan (ti maysa kadagiti  5)",
-       "exif-rightscertificate": "Paneknek ti panagtaripatu dagiti karbengan",
-       "exif-copyrighted": "Kasasaad ti karbengan-panagipablaak",
-       "exif-copyrightowner": "Akinkukua ti kaberngan-pinagipablaak",
-       "exif-usageterms": "Panag-uasar a ban-banag",
-       "exif-webstatement": "Sarita ti insao ti karbengan ti kopia nga addan ti online",
-       "exif-originaldocumentid": "Naisangsangyan nga ID iti kinasigud a dokumento",
-       "exif-licenseurl": "URL iti ti karbengan ti kopia a lisensia",
+       "exif-nickname": "Di pormal a nagan ti ladwan",
+       "exif-rating": "Pategan (ti maysa kadagiti 5)",
+       "exif-rightscertificate": "Sertipikado ti panagtaripato kadagiti karbengan",
+       "exif-copyrighted": "Kasasaad ti karbengan ti kopia",
+       "exif-copyrightowner": "Akinkukua ti karbengan ti kopia",
+       "exif-usageterms": "Dagiti termino ti panag-usar",
+       "exif-webstatement": "Insasao ti karbengan ti kopia nga addaan iti online",
+       "exif-originaldocumentid": "Naisangayan nga ID iti kinasigud a dokumento",
+       "exif-licenseurl": "URL para iti lisensia ti karbengan ti kopia",
        "exif-morepermissionsurl": "Sabali a pakaammo ti lisensia",
-       "exif-attributionurl": "No usaren manen daytoy nga obra, pangngaasi nga agisilpo idiay",
-       "exif-preferredattributionname": "No usaren manen daytoy nga obra, pangngaasi a padayawen ni",
-       "exif-pngfilecomment": "Komentario ti PNG a papeles",
+       "exif-attributionurl": "No usaren manen daytoy nga obra, pangngaasi nga isilpo iti",
+       "exif-preferredattributionname": "No usaren manen daytoy nga obra, pangngaasi a padayawan ni",
+       "exif-pngfilecomment": "Komentario ti papeles ti PNG",
        "exif-disclaimer": "Renunsia",
-       "exif-contentwarning": "Ballaag ti nagyan",
-       "exif-giffilecomment": "Komentario ti GIF a papeles",
+       "exif-contentwarning": "Ballaag ti linaon",
+       "exif-giffilecomment": "Komentario ti papeles ti GIF",
        "exif-intellectualgenre": "Kita ti banag",
        "exif-subjectnewscode": "Kodigo ti suheto",
-       "exif-scenecode": "Buya ti kodigo nga IPTC",
-       "exif-event": "Paspasamak a naibaga",
-       "exif-organisationinimage": "Kaurnusan a naibaga",
-       "exif-personinimage": "Ti tao a naibaga",
-       "exif-originalimageheight": "Kangato ti imahen sakbay nga naputed",
-       "exif-originalimagewidth": "Kalawa ti imahen sakbay nga naputed",
+       "exif-scenecode": "Buya ti kodigo ti IPTC",
+       "exif-event": "Pasamak a naibaga",
+       "exif-organisationinimage": "Gunglo a naibaga",
+       "exif-personinimage": "Tao a naibaga",
+       "exif-originalimageheight": "Katayag ti ladawan sakbay a naputed",
+       "exif-originalimagewidth": "Kaakaba ti ladawan sakbay a naputed",
        "exif-compression-1": "Saan a napespes",
-       "exif-copyrighted-true": "Nakarbengan a kopia",
-       "exif-copyrighted-false": "Saan a naiyasentar ti kasasaad ti karbengan ti kopia",
+       "exif-copyrighted-true": "Nakarbengan ti kopia",
+       "exif-copyrighted-false": "Saan a naisaad ti kasasaad ti karbengan ti kopia",
        "exif-unknowndate": "Di ammo a petsa",
        "exif-orientation-1": "Kadawyan",
-       "exif-orientation-2": "Binaliktad a nagilad",
+       "exif-orientation-2": "Horisontal a binaliktad",
        "exif-orientation-3": "Naipusipus iti 180°",
-       "exif-orientation-4": "Binaliktad nga agpangato",
-       "exif-orientation-5": "Naipisipus iti 90° CCW ken nabaliktad nga agtindek",
+       "exif-orientation-4": "Bertikal a binaliktad",
+       "exif-orientation-5": "Naipisipus iti 90° CCW ken bertikal a binaliktad",
        "exif-orientation-6": "Naipusipus iti 90° CCW",
-       "exif-orientation-7": "Naipisipus iti 90° CW ken nabaliktad nga agtindek",
+       "exif-orientation-7": "Naipisipus iti 90° CW ken bertikal a nabaliktad",
        "exif-orientation-8": "Naipusipus iti 90° CW",
        "exif-planarconfiguration-1": "chunky format",
        "exif-planarconfiguration-2": "planar format",
        "exif-exposureprogram-0": "Saan a naipalpalawag",
        "exif-exposureprogram-1": "Manual",
        "exif-exposureprogram-2": "Kadawyan a programa",
-       "exif-exposureprogram-3": "Aperture priority",
+       "exif-exposureprogram-3": "Prioridad ti apertura",
        "exif-exposureprogram-4": "Shutter priority",
        "exif-exposureprogram-5": "Kreatibo a programa (di nalinteg iti  kauneg ti pagikabilan)",
        "exif-exposureprogram-6": "Aktion a programa (di nalinteg iti kapartak ti napardas a shutter)",
-       "exif-exposureprogram-7": "Retrato a kita (para iti naasideg nga imahen nga addaan ti lugar ti likud a saan a nai-focus)",
-       "exif-exposureprogram-8": "Ladawan ti daga a kita (para iti ladawan ti daga nga imahen nga addaan ti lugar ti likud a pinag- focus)",
-       "exif-subjectdistance-value": "$1 a metro",
-       "exif-meteringmode-0": "Di am-ammo",
-       "exif-meteringmode-1": "Napipia",
+       "exif-exposureprogram-7": "Retrato a kita (para iti asideg a ladladawan nga addaan ti lugar ti likud a saan a naipatengnga)",
+       "exif-exposureprogram-8": "Moda ti ladawan ti daga (para iti ladawan ti daga a retato nga addaan ti lugar ti likud a panaptengna)",
+       "exif-subjectdistance-value": "$1 a metmetro",
+       "exif-meteringmode-0": "Di ammo",
+       "exif-meteringmode-1": "Natimbeng",
        "exif-meteringmode-2": "Napipia nga agtennga a pinadagsenan",
        "exif-meteringmode-3": "Disso",
        "exif-meteringmode-4": "Sabsabali a disso",
-       "exif-meteringmode-5": "Alagad",
+       "exif-meteringmode-5": "Tabas",
        "exif-meteringmode-6": "Sangkapaset laeng",
        "exif-meteringmode-255": "Sabali",
        "exif-lightsource-0": "Di ammo",
        "scarytranscludefailed": "[Napaay ti panagala ti plantilia para iti $1]",
        "scarytranscludefailed-httpstatus": "[Napaay ti panagala ti plantilia para iti $1: HTTP $2]",
        "scarytranscludetoolong": "[Atiddog unay ti URL]",
-       "deletedwhileediting": "'''Ballaag''': Naikkaten daytoy a panid kalpasan a rinugiam nga agurnos!",
+       "deletedwhileediting": "<strong>Ballaag:</strong> Naikkaten daytoy a panid kalpasan idi rinugiam ti agurnos!",
        "confirmrecreate": "Ti ([[User talk:$1|patungtungan]]) ti agar-aramat [[User:$1|$1]] ket inikkatna daytoy a panid kalpasan ti panagrugim nga agurnos nga adda rason:\n: ''$2''\nPangngaasi a pasingkedam nga agpayso a kayatmo a partuten manen daytoy a panid.",
        "confirmrecreate-noreason": "Ti ([[User talk:$1|patungtungan]]) ti agar-aramat [[User:$1|$1]] ket inikkat na daytoy a panid idi kalkalpas mo a magirugi ti agurnos. Pangngaasi ta pasingkedam a kayatmo nga aramiden manen daytoy a panid.",
        "recreate": "Partuaten manen",
-       "confirm_purge_button": "OK",
+       "confirm_purge_button": "Sige",
        "confirm-purge-top": "Dalusan ti cache daytoy a panid?",
-       "confirm-purge-bottom": "Ti panagpurga ti panid ket dalusanna ti cache ken pursaranna nga agparang dagiti kinaudi a panagbaliw.",
-       "confirm-watch-button": "OK",
-       "confirm-watch-top": "Inayon daytoy a panid kadagiti bambantayam",
-       "confirm-unwatch-button": "OK",
-       "confirm-unwatch-top": "Ikkatem daytoy a panid ti bambantayam",
+       "confirm-purge-bottom": "Ti panagpurga ti panid ket dalusanna ti cache ken pursaranna nga iparang dagiti agdama rebision.",
+       "confirm-watch-button": "Sige",
+       "confirm-watch-top": "Inayon daytoy a panid iti listaan ti bambantayam?",
+       "confirm-unwatch-button": "Sige",
+       "confirm-unwatch-top": "Ikkatem daytoy a panid manipud ti listaan ti bambantayam?",
        "imgmultipageprev": "← napalabas a panid",
        "imgmultipagenext": "sumaruno a panid →",
        "imgmultigo": "Inkan!",
        "table_pager_prev": "Napalabas a panid",
        "table_pager_first": "Umuna a panid",
        "table_pager_last": "Maudi a panid",
-       "table_pager_limit": "Mangipakita iti $1 a banag tunggal maysa  a panid",
+       "table_pager_limit": "Mangipakita iti $1 a banag tunggal maysa a panid",
        "table_pager_limit_label": "Banag tunggal maysa a panid:",
        "table_pager_limit_submit": "Inkan",
        "table_pager_empty": "Awan dagiti nagbanagan",
        "autosumm-blank": "Naikkat amin ti linaon ti panid",
-       "autosumm-replace": "Sinukatan ti linaon iti '$1'",
+       "autosumm-replace": "Sinukatan ti linaon iti \"$1\"",
        "autoredircomment": "Naibaw-ing ti panid iti [[$1]]",
        "autosumm-new": "Pinartuat ti panid iti \"$1\"",
-       "lag-warn-normal": "Dagiti panangbalbaliw a nabarbaro ngem $1 {{PLURAL:$1|a segundo|kadagiti segundo}} ket mabalin a saan a maiparang itoy a listaan.",
-       "lag-warn-high": "Gapu ti kinabuntog ti database server, dagiti nasukatan a barbaro ngem $1 {{PLURAL:$1|a segundo|kadagiti segundo}} ket mabalin a saan nga agparang ditoy a listaan.",
-       "watchlistedit-normal-title": "Urnosem ti listaan ti bambantayan",
+       "autosumm-newblank": "Nagpartuat ti blanko a panid",
+       "lag-warn-normal": "Dagiti panangbalbaliw a nabarbaro ngem $1 {{PLURAL:$1|a segundo|a segsegundo}} ket mabalin a saan a maiparang iti daytoy a listaan.",
+       "lag-warn-high": "Gapu ti kinabuntog ti database server, dagiti nasukatan a barbaro ngem $1 {{PLURAL:$1|a segundo|a segegundo}} ket mabalin a saan nga agparang iti daytoy a listaan.",
+       "watchlistedit-normal-title": "Urnosen ti listaan ti bambantayan",
        "watchlistedit-normal-legend": "Ikkaten dagiti titulo manipud ti listaan ti bambantayam",
-       "watchlistedit-normal-explain": "Dagiti titulo ti listaan ti bambantayam ket naipakita dita baba.\nTi mangikkat ti titulo, ikur-it ti kaaripingna a kahon, ken agtakla ti \"{{int:Watchlistedit-normal-submit}}\".\nMabalinmo pay nga [[Special:EditWatchlist/raw|urnosen ti kilaw a listaan]].",
+       "watchlistedit-normal-explain": "Dagiti titulo ti listaan ti bambantayam ket naipakita dita baba.\nTi mangikkat ti titulo, ikur-it ti kaaripingna a kahon, ken pinduten ti \"{{int:Watchlistedit-normal-submit}}\".\nMabalinmo pay nga [[Special:EditWatchlist/raw|urnosen ti naata a listaan]].",
        "watchlistedit-normal-submit": "Ikkaten dagiti titulo",
-       "watchlistedit-normal-done": "{{PLURAL:$1|1 ti titulo a|$1 dagiti titulo a}} naikkat iti listaan ti bambantayam:",
-       "watchlistedit-raw-title": "Urnosen ti kilaw a listaan ti bambantayan",
-       "watchlistedit-raw-legend": "Urnosen ti kilaw a listaan ti bambantayan",
-       "watchlistedit-raw-explain": "Dagiti titulo ti listaan ti bambantayam ket naipakita dita baba, ken mabaliwam nga urnosen babaen ti panagnayon ken panagkissay manipud ti listaan;\nmaysa a titulo tunggal maysa a linia.\nNo malpaska, itakla ti \"{{int:Watchlistedit-raw-submit}}\".\nMabalinmo pay nga [[Special:EditWatchlist|usaren ti dati a panagurnos]].",
+       "watchlistedit-normal-done": "{{PLURAL:$1|1 ti titulo|$1 dagiti titulo}} a naikkat manipud ti listaan ti bambantayam:",
+       "watchlistedit-raw-title": "Urnosen ti naata a listaan ti bambantayan",
+       "watchlistedit-raw-legend": "Urnosen ti naata a listaan ti bambantayan",
+       "watchlistedit-raw-explain": "Dagiti titulo ti listaan ti bambantayam ket naipakita dita baba, ken mabaliwam nga urnosen babaen ti panagnayon ken panagkissay manipud ti listaan;\nmaysa a titulo tunggal maysa a linia.\nNo malpaska, pinduten ti \"{{int:Watchlistedit-raw-submit}}\".\nMabalinmo pay nga [[Special:EditWatchlist|usaren ti pagalagadan nga editor]].",
        "watchlistedit-raw-titles": "Dagiti titulo:",
        "watchlistedit-raw-submit": "Pabaruen ti listaan ti bambantayan",
-       "watchlistedit-raw-done": "Napabaro ti listaan ti bambantayam.",
-       "watchlistedit-raw-added": "{{PLURAL:$1|1 a titulo ti|dagiti $1 a titulo ti}} nainayon:",
-       "watchlistedit-raw-removed": "{{PLURAL:$1|1 a titulo ti|dagiti $1 dagiti titulo ti}} naikkat:",
+       "watchlistedit-raw-done": "Napabaron ti listaan ti bambantayam.",
+       "watchlistedit-raw-added": "{{PLURAL:$1|1 a titulo|$1 kadagiti titulo}} ti nainayon:",
+       "watchlistedit-raw-removed": "{{PLURAL:$1|1 a titulo|$1 kadagiti titulo}} ti naikkat:",
        "watchlistedit-clear-title": "Nadalusanen ti listaan ti bambantayan",
        "watchlistedit-clear-legend": "Dalusan ti listaan ti bambantayan",
-       "watchlistedit-clear-explain": "Amin dagiti titulo ket maikkatto manipud ti listaan ti bambantayam.",
+       "watchlistedit-clear-explain": "Amin dagiti titulo ket maikkatto manipud ti listaan ti bambantayam",
        "watchlistedit-clear-titles": "Dagiti titulo:",
        "watchlistedit-clear-submit": "Dalusan ti listaan ti bambantayan (Daytoy ket permanente!)",
        "watchlistedit-clear-done": "Nadalusanen ti bambantayam.",
        "watchlisttools-clear": "Dalusan ti listaan ti bambantayan",
        "watchlisttools-view": "Kitaen dagiti maitunos a sinukatan",
        "watchlisttools-edit": "Kitaen ken urnosen ti listaan ti bambantayan",
-       "watchlisttools-raw": "Urnosen ti kilaw a listaan ti bambantayan",
+       "watchlisttools-raw": "Urnosen ti naata a listaan ti bambantayan",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|tungtungan]])",
-       "unknown_extension_tag": "Di ammo a pagpaatiddog nga etiketa \"$1\"",
-       "duplicate-defaultsort": "'''Ballaag:''' Kinasigud a panagilasin ti \"$2\" ket sukatanna ti immuna a kinasigud a panagilasin \"$1\".",
+       "unknown_extension_tag": "Di ammo a pagpaatiddog nga etiketa ti \"$1\"",
+       "duplicate-defaultsort": "<strong>Ballag:</strong> Kasisigud a panagilasin ti \"$2\" ket tuonana ti immuna a kasisigud a panagilasin ti \"$1\".",
        "duplicate-displaytitle": "<strong>Ballaag:</strong> Ti maiparang a titulo ti \"$2\" ket tuonanna ti immmuna a maiparang a titulo ti \"$1\".",
        "version": "Bersion",
        "version-extensions": "Dagiti naisaad a pagpaatiddog",
        "version-specialpages": "Espesial a pampanid",
        "version-parserhooks": "Dagiti parser a kawit",
        "version-variables": "Nadumaduma a kita",
-       "version-antispam": "Pawilan ti spam",
+       "version-antispam": "Panagpawil iti spam",
        "version-other": "Sabali",
-       "version-mediahandlers": "Agtengtengngel kadagiti midia",
+       "version-mediahandlers": "Panagtengngel kadagiti midia",
        "version-hooks": "Dagiti kawit",
-       "version-parser-extensiontags": "Dagiti parser a pagpaatiddog nga etiketa",
-       "version-parser-function-hooks": "Parser a pamay-an dagiti kawit",
+       "version-parser-extensiontags": "Dagiti etiketa ti pagpaatiddog ti parser",
+       "version-parser-function-hooks": "Dagiti kawit nga annong ti parser",
        "version-hook-name": "Nagan ti kawit",
        "version-hook-subscribedby": "Umanamong babaen ti",
        "version-version": "($1)",
        "version-license-not-found": "Awan ti nabirukan a naisalaysay a pakaammo ti lisensia para iti daytoy a pagpaatiddog.",
        "version-credits-title": "Dagiti pammadayaw para iti $1",
        "version-credits-not-found": "Awan dagiti nabirukan a naisalaysay a pammadayaw para iti daytoy a pagpaatiddog.",
-       "version-poweredby-credits": "Daytoy a wiki ket pinaandar ti '''[https://www.mediawiki.org/ MediaWiki]''', karbengan a kopia © 2001-$1 $2.",
+       "version-poweredby-credits": "Daytoy a wiki ket pinaandar babaen ti '''[https://www.mediawiki.org/ MediaWiki]''', karbengan ti kopia © 2001-$1 $2.",
        "version-poweredby-others": "dadduma pay",
-       "version-poweredby-translators": "agipatpatarus ti translatewiki.net",
-       "version-credits-summary": "Kayatmi koma a pammadayawan dagiti sumaganad a tao para kadagiti inparawadda iti [[Special:Version|MediaWiki]].",
-       "version-license-info": "Ti MediaWiki ket nawaya a sopwer; maiwarasmo ken/wenno mabaliwam babaen ti banag iti GNU General Public License a naipablaak babaen ti Free Software Foundation; nupay iti bersion 2 iti Lisensia, wenno (ti panagpilim) ti  aniaman a bersion.\n\nTi MediaWiki ket naiwarwaras nga adda ti namnama a makatulong, ngem AWAN TI ANIA MAN A GARANTIA; nga awan pay ti naibagbaga a PANAKAILAKO wenno KALAINGAN NA ITI DAYTOY A PANGGEP. Kitaen ti GNU Sapasap a Publiko a Lisensia para kadagiti adu pay a salaysay.\n\nNaka-awatka koman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU Sapasap a  Publiko a Lisensia] a nairaman iti daytoy a programa; no saan, agsuratka idiay Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA wenno [//www.gnu.org/licenses/old-licenses/gpl-2.0.html basaem idiay online].",
+       "version-poweredby-translators": "dagiti agipatpatarus ti translatewiki.net",
+       "version-credits-summary": "Kayatmi koma a pammadayawan dagiti sumaganad a tao para kadagiti kontribusonda iti [[Special:Version|MediaWiki]].",
+       "version-license-info": "Ti MediaWiki ket nawaya a sopwer; mabalinmo nga iwaras ken/wenno baliwan babaen kadagiti termino ti GNU General Public License a naipablaak babaen ti Free Software Foundation; wenno bersion 2 iti Lisensia, wenno (ti panagpilim) ti  aniaman a naudi a bersion.\n\nTi MediaWiki ket naiwarwaras iti namnama a makatulongto, ngem AWAN TI ANIA MAN A GARANTIA; nga awan pay ti naibagbaga a PANNAKAILAKO wenno KALAINGANNA ITI DAYTOY A PANGGEP. Kitaen ti GNU General Public License para kadagiti adu pay a salaysay.\n\nNaka-awatka koman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU General Public License] a nairaman iti daytoy a programa; no saan, agsuratka idiay Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA wenno [//www.gnu.org/licenses/old-licenses/gpl-2.0.html basaem iti online].",
        "version-software": "Naisaad a sopwer",
        "version-software-product": "Produkto",
        "version-software-version": "Bersion",
        "version-entrypoints": "Pagserrekan a puntos dagiti URL",
        "version-entrypoints-header-entrypoint": "Pagserrekan a puntos",
        "version-entrypoints-header-url": "URL",
-       "redirect": "Ibaw-ing babaen ti papeles, agar-aramat, panid wenno ID ti panagbaliw",
+       "redirect": "Ibaw-ing babaen ti papeles, agar-aramat, panid wenno ID ti rebision",
        "redirect-legend": "Ibaw-ing iti papeles wenno panid",
-       "redirect-summary": "Daytoy nga espesial a panid ket maibaw-ing iti papeles (iti nagan ti papeles), ti panid (iti ID wenno panid ti panagbaliw), wenno ti panid ti agar-aramat (iti numeriko nga ID ti agar-aramat). Panag-usar:\n[[{{#Special:Redirect}}/file/Example.jpg]], \n[[{{#Special:Redirect}}/page/64308]], \n[[{{#Special:Redirect}}/revision/328429]], wenno\n[[{{#Special:Redirect}}/user/101]].",
+       "redirect-summary": "Daytoy nga espesial a panid ket maibaw-ing iti papeles (iti nagan ti papeles), ti panid (iti ID ti rebision wenno ID ti panid), wenno ti panid ti agar-aramat (iti numeriko nga ID ti agar-aramat). Panag-usar:\n[[{{#Special:Redirect}}/file/Example.jpg]], \n[[{{#Special:Redirect}}/page/64308]], \n[[{{#Special:Redirect}}/revision/328429]], wenno\n[[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Inkan",
        "redirect-lookup": "Kitaen:",
        "redirect-value": "Pateg:",
        "redirect-user": "ID ti agar-aramat",
        "redirect-page": "ID ti panid",
-       "redirect-revision": "Panagbaliw ti panid",
+       "redirect-revision": "Rebision ti panid",
        "redirect-file": "Nagan ti papeles",
        "redirect-not-exists": "Saan a nabirukan ti pateg",
        "fileduplicatesearch": "Agbiruk kadagiti duplikado a papeles",
-       "fileduplicatesearch-summary": "Agbiruk kadagiti duplikado a papeles a naibatay kadagiti \"hash\" a pateg.",
-       "fileduplicatesearch-legend": "Agsapul iti duplikado",
+       "fileduplicatesearch-summary": "Agbiruk kadagiti duplikado a papeles a naibatay kadagiti pateg ti hash.",
+       "fileduplicatesearch-legend": "Agbiruk para iti duplikado",
        "fileduplicatesearch-filename": "Nagan ti papeles:",
        "fileduplicatesearch-submit": "Biruken",
-       "fileduplicatesearch-info": "$1 × $2 pixel<br />Rukod ti papeles: $3<br />Kita ti MIME: $4",
-       "fileduplicatesearch-result-1": "Awan ti kapadpadana a duplikado ti papeles a \"$1\".",
-       "fileduplicatesearch-result-n": "Ti papeles a \"$1\" ket addaan {{PLURAL:$2|1 nga agpadpada a duplikado|dagiti $2  nga agpadpada a duplikado}}.",
-       "fileduplicatesearch-noresults": "Awan ti nagan ti papeles a \"$1\" ti nabirukan.",
+       "fileduplicatesearch-info": "$1 × $2 a piksel<br />Rukod ti papeles: $3<br />Kita ti MIME: $4",
+       "fileduplicatesearch-result-1": "Awan ti kapadpadana a duplikado ti papeles ti \"$1\".",
+       "fileduplicatesearch-result-n": "Ti papeles ti \"$1\" ket addaan {{PLURAL:$2|iti 1 nga agpadpada a duplikado|kadagiti $2 nga agpadpada a duplikado}}.",
+       "fileduplicatesearch-noresults": "Awan ti nabirukan a papeles a nanaganan ti \"$1\".",
        "specialpages": "Espesial a pampanid",
        "specialpages-note-top": "Leyenda",
        "specialpages-note": "* Kadawyan nga espesial a pampanid.\n* <span class=\"mw-specialpagerestricted\">Nagawidan nga espesial a pampanid.</span>",
-       "specialpages-group-maintenance": "Dagiti padamag ti panagtaripato",
-       "specialpages-group-other": "Sabsabali pay nga espesial a pampanid",
-       "specialpages-group-login": "Sumrek / agaramid ti pakabilangan",
-       "specialpages-group-changes": "Kaudian a sinukatan ken listaan",
-       "specialpages-group-media": "Dagiti padamag ti midia ken panag-ipan",
+       "specialpages-group-maintenance": "Dagiti reporta ti panagtaripato",
+       "specialpages-group-other": "Sabali nga espesial a pampanid",
+       "specialpages-group-login": "Sumrek / agpartuat ti pakabilangan",
+       "specialpages-group-changes": "Kaudian a balbaliw ken lislistaan",
+       "specialpages-group-media": "Dagiti reporta ti midia ken dagiti panagikarga",
        "specialpages-group-users": "Dagiti agar-aramat ken karkarbengan",
-       "specialpages-group-highuse": "Adu ti pannaka-usar a pampanid",
-       "specialpages-group-pages": "Listaan dagiti panid",
+       "specialpages-group-highuse": "Adu ti pannakausar a pampanid",
+       "specialpages-group-pages": "Lislistaan ti pampanid",
        "specialpages-group-pagetools": "Ramramit ti panid",
        "specialpages-group-wiki": "Datos ken ramramit",
        "specialpages-group-redirects": "Panangibaw-ing kadagiti espesial a pampanid",
        "blankpage": "Blanko a panid",
        "intentionallyblankpage": "Daytoy a panid  ket naigagara a blanko.",
        "external_image_whitelist": " #Baybayan daytoy a linia a kastoy<pre>\n#Ikabil ti \"regular expression fragments\" (idiay laeng paset nga ikabil ti tengnga ti  //) dita baba\n#Dagitoy ipada na ti URLs ti ruar (ti napudot a naikapet) imahen \n#Dagiti agpada ket agparang nga  imahen, ket no saan ti panilpo ti imahen ti agparang laeng\n#Dagiti linia nga umuna iti # ket maipabalin a komentario\n#Daytoy ket \"sensetibo ti kadakkel ti letra\"\n\n#Ikabil dagita \"regex fragment\" ti ngato daytoy a linia. Baybay-an a kastoy daytoy a linia</pre>",
-       "tags": "Umisu a sukatan dagiti etiketa",
-       "tag-filter": "[[Special:Tags|Ti etiketa]] a sagat:",
+       "tags": "Dagiti etiketa ti umiso a panagbaliw",
+       "tag-filter": "Sagat ti [[Special:Tags|etiketa]]:",
        "tag-filter-submit": "Sagat",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etiketa|Et-etiketa}}]]: $2)",
        "tags-title": "Dagiti etiketa",
-       "tags-intro": "Daytoy a panid ket ilistana dagiti etiketa nga usaren ti sopwer nga agmarka ti panag-urnos, ken dagiti kaibuksilanda.",
+       "tags-intro": "Daytoy a panid ket ilistana dagiti etiketa a mablin nga usaren ti sopwer a mangmarka iti urnos, ken dagiti kaibuksilanda.",
        "tags-tag": "Nagan ti etiketa",
        "tags-display-header": "Tabas dagiti listaan ti panagsukat",
-       "tags-description-header": "Napno a panangipalpalawag iti kayatna a saoen.",
+       "tags-description-header": "Napno a deskripsion ti kaibuksilan.",
        "tags-active-header": "Aktibo?",
-       "tags-hitcount-header": "Dagiti etiketa a sinukatan",
+       "tags-hitcount-header": "Dagiti adda etiketana a sinukatan",
        "tags-active-yes": "Wen",
        "tags-active-no": "Saan",
        "tags-edit": "urnosen",
-       "tags-hitcount": "$1 {{PLURAL:$1|a sinukatan|kadagiti sinukatan}}",
+       "tags-hitcount": "$1 {{PLURAL:$1|a sinukatan|a sinuksukatan}}",
        "comparepages": "Ipada dagiti panid",
        "compare-page1": "Panid 1",
        "compare-page2": "Panid 2",
-       "compare-rev1": "Panagbaliw 1",
-       "compare-rev2": "Panagbaliw 2",
+       "compare-rev1": "Rebision 1",
+       "compare-rev2": "Rebision 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.",
-       "dberr-problems": "Pasensian a! Daytoy a pagsaadan ket agdadama ti teknikal a pagrigrigatan.",
-       "dberr-again": "Padasem ti agururay to manu a minutos ken agikarga.",
-       "dberr-info": "(Saan a makontak ti database server: $1)",
-       "dberr-info-hidden": "(Saan a makontak ti database server)",
-       "dberr-usegoogle": "Padasem  ti agbiruk idiay Google tatta.",
-       "dberr-outofdate": "Palagip a dagiti listaan da kadagiti kukuami a nagyan ket baka nagpaso.",
+       "compare-invalid-title": "Ti titulo nga innaganam ket imbalido.",
+       "compare-title-not-exists": "Awan ti innaganam a titulo.",
+       "compare-revision-not-exists": "Awan ti innaganam a rebision.",
+       "dberr-problems": "Pasensia! Daytoy a sitio ket agdadama nga agsansanay kadagiti teknikal a pagrigatan.",
+       "dberr-again": "Padasem ti aguray kadagiti mano a minuto ken agikarga manen.",
+       "dberr-info": "(Saan a makontak ti server ti database: $1)",
+       "dberr-info-hidden": "(Saan a makontak ti server ti database)",
+       "dberr-usegoogle": "Iti agdama mabalinmo a padasen ti agbiruk babaen ti Google.",
+       "dberr-outofdate": "Palagip a dagiti listaanda kadagiti kukuami a linaon ket mabalin a nagpaso.",
        "dberr-cachederror": "Daytoy ket naidulin a kopia ti kiniddawmo a panid, ken mabalin a saan a kabarbaro.",
-       "htmlform-invalid-input": "Adda pakirut kadagiti inkabilmo",
-       "htmlform-select-badoption": "Ti kuwenta a nainaganam ket saan a mabalin a pagpilian.",
-       "htmlform-int-invalid": "Ti kuwenta a nainaganam ket saan a sibubukel.",
-       "htmlform-float-invalid": "Ti kuwenta a nainaganam ket saan a numero.",
-       "htmlform-int-toolow": "Ti kuwenta a nainaganam ket baba ti mabalin a kababaan ti $1",
-       "htmlform-int-toohigh": "Ti kuwenta a nainaganam ket ngato ti mabalin a kangatuan ti $1",
-       "htmlform-required": "Masapul daytoy a kuwenta",
+       "htmlform-invalid-input": "Adda pakirut kadagiti dadduma nga inkabilmo.",
+       "htmlform-select-badoption": "Ti pateg a nainaganam ket saan a mabalin a pagpilian.",
+       "htmlform-int-invalid": "Ti pateg a nainaganam ket saan a maysa a sibubukel.",
+       "htmlform-float-invalid": "Ti pateg a nainaganam ket saan a numero.",
+       "htmlform-int-toolow": "Ti pateg a nainaganam ket baba ti mabalin a kababaan ti $1.",
+       "htmlform-int-toohigh": "Ti pateg a nainaganam ket ngato ti mabalin a kangatuan ti $1.",
+       "htmlform-required": "Masapul daytoy a pateg.",
        "htmlform-submit": "Ited",
-       "htmlform-reset": "Ibabawi ti sinukatan",
+       "htmlform-reset": "Ibabawi dagiti sinukatan",
        "htmlform-selectorother-other": "Sabali",
        "htmlform-no": "Saan",
        "htmlform-yes": "Wen",
-       "htmlform-chosen-placeholder": "Agpili ti pagpilian",
+       "htmlform-chosen-placeholder": "Agpili ti maysa a pagpilian",
        "htmlform-cloner-create": "Agnayon pay ti adu",
        "htmlform-cloner-delete": "Ikkaten",
        "htmlform-cloner-required": "Saan a basbassit ngem maysa a pateg ti masapul.",
-       "sqlite-has-fts": "$1 adda ti suporta ti napno a testo ti panagbiruk",
-       "sqlite-no-fts": "$1 awan ti suporta ti napno a testo ti panagbiruk",
+       "sqlite-has-fts": "Ti $1 nga addaan iti suporta ti panagbiruk ti napno a testo",
+       "sqlite-no-fts": "Ti $1 nga awan iti suporta ti panagbiruk ti napno a testo",
        "logentry-delete-delete": "Ni $1 ket {{GENDER:$2|inikkatna}} ti panid ti $3",
        "logentry-delete-restore": "Ni $1 ket {{GENDER:$2|insublina}} ti panid ti $3",
        "logentry-delete-event": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita {{PLURAL:$5|iti listaan ti pasamak |dagiti $5 a listaan ti pasamak }} iti $3: $4",
        "logentry-delete-revision": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita  {{PLURAL:$5|iti panagbaliw |dagiti $5 a panagbaliw}} iti panid $3: $4",
-       "logentry-delete-event-legacy": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita ti listaan dagiti pasamak idiay $3",
-       "logentry-delete-revision-legacy": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita dagiti panagbaliw idiay panid $3",
+       "logentry-delete-event-legacy": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita ti listaan dagiti pasamak iti $3",
+       "logentry-delete-revision-legacy": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita dagiti rebision iti panid ti $3",
        "logentry-suppress-delete": "Ni $1 ket {{GENDER:$2|pinasardengna}} ti panid ti $3",
        "logentry-suppress-event": "Ni $1 ket sekreto a {{GENDER:$2|binaliwanna}} ti panagkita {{PLURAL:$5|iti listaan ti pasamak |dagiti $5 a listaan ti pasamak }} iti $3: $4",
        "logentry-suppress-revision": "Ni $1 ket sekreto a {{GENDER:$2|binaliwanna}} ti panagkita {{PLURAL:$5|iti panagbaliw |dagiti $5 a panagbaliw}} iti panid $3: $4",
-       "logentry-suppress-event-legacy": "Ni $1 ket sekreto a {{GENDER:$2|binaliwanna}} ti panagkita ti listaan dagiti pasamak idiay $3",
-       "logentry-suppress-revision-legacy": "Ni $1 ket sekreto a {{GENDER:$2|binaliwanna}} ti panagkita dagiti panagbaliw idiay panid $3",
-       "revdelete-content-hid": "nailemmeng ti nagyanna",
-       "revdelete-summary-hid": "nailemmeng ti pakabuklan a naurnos",
+       "logentry-suppress-event-legacy": "Ni $1 ket sekreto a {{GENDER:$2|binaliwanna}} ti panagkita ti listaan dagiti pasamak iti $3",
+       "logentry-suppress-revision-legacy": "Ni $1 ket sekreto a {{GENDER:$2|binaliwanna}} ti panagkita dagiti panagbaliw iti panid ti $3",
+       "revdelete-content-hid": "nailemmeng ti linaon",
+       "revdelete-summary-hid": "nailemmeng ti pakabuklan ti inurnos",
        "revdelete-uname-hid": "nailemmeng ti nagan ti agar-aramat",
-       "revdelete-content-unhid": "saan a nailemmeng ti nagyanna",
-       "revdelete-summary-unhid": "saan a nailemmeng ti  pakabuklan a naurnos",
+       "revdelete-content-unhid": "saan a nailemmeng ti linaon",
+       "revdelete-summary-unhid": "saan a nailemmeng ti pakabuklan ti inurnos",
        "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": "Ni $1 ket {{GENDER:$2|inyalisna}} ti panid $3 idiay $4",
-       "logentry-move-move-noredirect": "Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 idiay $4 a saan a nangibati ti baw-ing",
-       "logentry-move-move_redir": "Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 idiay $4 nga adda iti maysa a baw-ing",
-       "logentry-move-move_redir-noredirect": "Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 idiay $4 nga adda iti maysa a baw-ing a saan a nangibati ti baw-ing",
-       "logentry-patrol-patrol": "Ni $1 ket {{GENDER:$2|minarkaanna}} ti panagbaliw a $4 ti panid ti $3 a napatruliaan",
-       "logentry-patrol-patrol-auto": "Ni $1 ket automatiko a {{GENDER:$2|minarkaanna}} ti panagbaliw a $4 ti panid ti $3 a napatruliaan",
+       "revdelete-restricted": "naipakat dagiti panangigawid kadagiti administrador",
+       "revdelete-unrestricted": "inikkat dagiti panangigawid para kadagiti administrador",
+       "logentry-move-move": "Ni $1 ket {{GENDER:$2|inyalisna}} ti panid $3 iti $4",
+       "logentry-move-move-noredirect": "Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 iti $4 a saan a nangibati ti baw-ing",
+       "logentry-move-move_redir": "Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 iti $4 a nagtuon iti baw-ing",
+       "logentry-move-move_redir-noredirect": "Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 iti $4 a nagtuon iti baw-ing a saan a nangibati ti baw-ing",
+       "logentry-patrol-patrol": "Ni $1 ket {{GENDER:$2|minarkaanna}} ti rebision ti $4 iti panid ti $3 a napatruliaan",
+       "logentry-patrol-patrol-auto": "Ni $1 ket automatiko a {{GENDER:$2|minarkaanna}} ti rebision ti $4 iti panid ti $3 a napatruliaan",
        "logentry-newusers-newusers": "Ti pakabilangan idi ni $1 ket {{GENDER:$2|napartuat}}",
        "logentry-newusers-create": "Ti pakabilangan idi ni $1 ket {{GENDER:$2|napartuat}}",
        "logentry-newusers-create2": "Ti pakabilangan ti agar-aramat $3 ket {{GENDER:$2|napartuat}} idi babaen ni $1",
        "logentry-rights-rights-legacy": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti grupo a pannakaikameng para kenni $3",
        "logentry-rights-autopromote": "Ni $1 ket automatiko idi a {{GENDER:$2|naipangato}} manipud ti $4 iti $5",
        "rightsnone": "(awan)",
-       "feedback-bugornote": "No agsagana kan nga agibaga ti teknikal a pakirut a naisalaysay pangngaasi nga [$1 ireporta ti kiteb].\nNupay kasta, mau-sarmo ti nakabuklan dita baba. Ti komentario nga itedmo ket mainayon iti panid \"[$3 $2], a mairaman ti naganmo nga agar-aramat ken no ania ti pagbasabasa nga us-sarem.",
+       "feedback-bugornote": "No sisasagakan nga agibaga ti teknikal a pakirut a naisalaysay pangngaasi nga [$1 ireporta ti parikut].\nNupay kasta, mausarmo ti nalaka a porma dita baba. Ti komentario nga itedmo ket mainayon iti panid \"[$3 $2], a mairaman ti naganmo 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-submit": "Agited ti Feedback",
+       "feedback-adding": "Agnaynayon ti feedback iti panid...",
+       "feedback-error1": "Biddut: Saan a malasin dagiti nagbanagan manipud ti API",
        "feedback-error2": "Biddut: Napaay ti panagurnos",
-       "feedback-error3": "Biddut: Awan ti sungbat manipud iti API",
-       "feedback-thanks": "Agyaman! Ti panangparupaam ket naipablaak iti panid \"[$2 $1]\".",
+       "feedback-error3": "Biddut: Awan ti sungbat manipud ti API",
+       "feedback-thanks": "Agyaman! Ti feedbackmo ket naipablaak iti panid \"[$2 $1]\".",
        "feedback-close": "Nalpasen",
-       "feedback-bugcheck": "Nasayaaten! Kitaem tapno saan a dagiti adda idin a [$1 nga amammo a kitkiteb].",
-       "feedback-bugnew": "Kinitak. Ireporta ti baro a kiteb",
+       "feedback-bugcheck": "Nasayaaten! Kitaem tapno saan a dagiti adda idin a [$1 nga ammo a parparikut].",
+       "feedback-bugnew": "Kinitak. Agireporta ti baro a parikut",
        "searchsuggest-search": "Biruken",
        "searchsuggest-containing": "naglaon ti...",
-       "api-error-badaccess-groups": "Saanmo 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 a sabali a papeles] |dagiti [$2 sabsabali a papeles]}} nga addan ditoy a pagsaadan nga agpada ti nagyanda.",
-       "api-error-duplicate-archive": "Adda {{PLURAL:$1|idi [$2 sabali a papeles]|dagidi [$2 sabali a papeles]}} nga adda ditoy a pagsaadan nga agpada ti nagyan da, ngem {{PLURAL:$1|daytoy|dagitoy}} ket naikkat.",
+       "api-error-badaccess-groups": "Saanka mapalubosan nga agikarga kadagiti papeles iti daytoy a wiki.",
+       "api-error-badtoken": "Akin-uneg a biddut: Dakes a tandaan.",
+       "api-error-copyuploaddisabled": "Ti panagikarga babaen ti URL ket nabaldado iti daytoy server.",
+       "api-error-duplicate": "Adda {{PLURAL:$1|ket [$2 a sabali a papeles] |dagiti [$2 sabsabali a papeles]}} nga addaan ditoy a sitio nga agpada ti linaon.",
+       "api-error-duplicate-archive": "Adda {{PLURAL:$1|idi [$2 sabali a papeles]|dagidi [$2 sabali a papeles]}} nga addaan ditoy a sitio nga agpada ti linaonda, 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|ti papeles|dagiti papeles}}.",
-       "api-error-empty-file": "Ti papeles nga intedmo ket awan ti nagyanna.",
-       "api-error-emptypage": "Agar-aramid ti baro, dagiti awan ti linaonna a panid ket saan a maipalubos.",
-       "api-error-fetchfileerror": "Kinauneg a biddut: Addaan ti dakes a napasamak idi agalala ti papeles.",
+       "api-error-empty-file": "Ti papeles nga intedmo ket awan linaon.",
+       "api-error-emptypage": "Agparprtuat ti baro, dagiti awan ti linaon a panid ket saan a maipalubos.",
+       "api-error-fetchfileerror": "Akin-uneg a biddut: Addaan ti dakes a napasamak bayat nga agal-ala ti papeles.",
        "api-error-fileexists-forbidden": "Ti papeles nga agnagan ti \"$1\" ket addan, ken saan a mabalin a masuratan manen.",
        "api-error-fileexists-shared-forbidden": "Ti papeles nga agnagan ti \"$1\" ket adda idiay pagbibingayan a repositorio ti papeles, ken saan a mabalin a masuratan manen.",
        "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-banned-type": "Ti $1 {{PLURAL:$4|ket saan a mapalubusan a kita ti papeles|ket dagiti saan a mapalubusan a kita ti papeles}}. Ti mapalubusan {{PLURAL:$3|a kita ti papeles ket|kadagiti kita ti papeles ket}} $2.",
-       "api-error-filetype-missing": "Ti papeles ket agkurang ti pagpa-atiddog.",
-       "api-error-hookaborted": "Ti panagbabaro a pinadasmo ket napasardeng iti pangpa-atiddog a kawit.",
-       "api-error-http": "Kinauneg a biddut: Saan a makaikabit idiay server.",
+       "api-error-filetype-banned-type": "Ti $1 {{PLURAL:$4|ket saan a mapalubosan a kita ti papeles|ket dagiti saan a mapalubusan a kita ti papeles}}. Ti mapalubosan {{PLURAL:$3|a kita ti papeles ket|kadagiti kita ti papeles ket}} $2.",
+       "api-error-filetype-missing": "Ti papeles ket awan ti maysa a pagpaatiddog.",
+       "api-error-hookaborted": "Ti panagbabaro a pinadasmo ket pinasardeng babaen ti maysa a pagpaatiddog.",
+       "api-error-http": "Akin-uneg a biddut: Saan a makaikabit iti 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 panagipanmo 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 modulo 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-publishfailed": "Kinauneg a biddut: Napaay ti server a nagipablaak ti temporario a papeles.",
+       "api-error-internal-error": "Akin-uneg a biddut: Addaan ti dakes a napasamak iti panagproseso ti inkargam iti daytoy a wiki.",
+       "api-error-invalid-file-key": "Akin-uneg a biddut: Saan a nabirukan ti papeles idiay temporario a nagidulinan.",
+       "api-error-missingparam": "Akin-uneg a biddut: Awan dagiti parametro iti kiddaw.",
+       "api-error-missingresult": "Akin-uneg a biddut: Saan a naikeddeng no ti kopia ket nagballigi.",
+       "api-error-mustbeloggedin": "Masapul a nakastrekka tapno makaikarga kadagiti papeles.",
+       "api-error-mustbeposted": "Akin-uneg a biddut: Ti kiddaw ket masapul ti HTTP POST.",
+       "api-error-noimageinfo": "Balligi ti panagikarga, ngem ti server ket saan a nagited kadakami ti aniaman a pakaammo a maipanggep iti daytoy a papeles.",
+       "api-error-nomodule": "Akin-uneg a biddut: Awan ti naisad a modulo ti panagikarga.",
+       "api-error-ok-but-empty": "Akin-uneg a biddut: Awan ti sungbat manipud ti server.",
+       "api-error-overwrite": "Saan a maipalubos a suratan manen iti papeles nga addan.",
+       "api-error-stashfailed": "Akin-uneg a biddut: Napaay ti server nga agidulin ti temporario a papeles.",
+       "api-error-publishfailed": "Akin-uneg a biddut: Napaay ti server nga agipablaak ti temporario a papeles.",
        "api-error-stasherror": "Adda maysa a biddut bayat nga agikarkarga ti papeles iti stash.",
        "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 am-ammo a biddut: \"$1\".",
-       "api-error-unknown-error": "Kinauneg a biddut: Addaan ti dakes a napasamak idi nagipadaska ti agipan ti papelesmo.",
-       "api-error-unknown-warning": "Di am-ammo a ballaag: \"$1\".",
-       "api-error-unknownerror": "Di am-ammo 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.",
-       "duration-seconds": "$1 {{PLURAL:$1|segundo|seg-segundo}}",
-       "duration-minutes": "$1 {{PLURAL:$1|minuto|min-minuto}}",
-       "duration-hours": "$1 {{PLURAL:$1|oras|or-oras}}",
-       "duration-days": "$1 {{PLURAL:$1|aldaw|al-aldaw}}",
-       "duration-weeks": "$1 {{PLURAL:$1|lawas|law-lawas}}",
-       "duration-years": "$1 {{PLURAL:$1|tawen|taw-tawen}}",
-       "duration-decades": "$1 {{PLURAL:$1|dekada|dek-dekada}}",
-       "duration-centuries": "$1 {{PLURAL:$1|siglo|sig-siglo}}",
-       "duration-millennia": "$1 {{PLURAL:$1|milenio|mil-milenio}}",
-       "rotate-comment": "Ti ladawan ket napusipos babaen ti $1 {{PLURAL:$1|a degrado|a degdegrado}} nga agpakanawan",
+       "api-error-unclassified": "Adda rimsua a di ammo a biddut.",
+       "api-error-unknown-code": "Di ammo a biddut: \"$1\".",
+       "api-error-unknown-error": "Akin-uneg a biddut: Addaan ti dakes a napasamak bayat idi nagipadaska nga agikarga iti papelesmo.",
+       "api-error-unknown-warning": "Di ammo a ballaag: \"$1\".",
+       "api-error-unknownerror": "Di ammo a biddut: \"$1\".",
+       "api-error-uploaddisabled": "Nabaldado ti panagikarga iti daytoy a wiki.",
+       "api-error-verification-error": "Mabalin a dakes daytoy a papeles, wenno addaan iti madi a pagpaatiddog.",
+       "duration-seconds": "$1 a {{PLURAL:$1|segundo|segsegundo}}",
+       "duration-minutes": "$1 a {{PLURAL:$1|minuto|minminuto}}",
+       "duration-hours": "$1 nga {{PLURAL:$1|oras|or-oras}}",
+       "duration-days": "$1 nga {{PLURAL:$1|aldaw|al-aldaw}}",
+       "duration-weeks": "$1 {{PLURAL:$1|lawas|lawlawas}}",
+       "duration-years": "$1 {{PLURAL:$1|tawen|tawtawen}}",
+       "duration-decades": "$1 {{PLURAL:$1|dekada|dekdekada}}",
+       "duration-centuries": "$1 {{PLURAL:$1|siglo|sigsiglo}}",
+       "duration-millennia": "$1 {{PLURAL:$1|milenio|milmilenio}}",
+       "rotate-comment": "Ti ladawan ket napusipos babaen ti $1 {{PLURAL:$1|a grado|a gradgrado}} nga agpakanawan",
        "limitreport-title": "Panagbariweswes a datos ti parser:",
        "limitreport-cputime": "Panagusar nga oras ti CPU",
-       "limitreport-cputime-value": "$1 {{PLURAL:$1|segundo|seg-segundo}}",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|segundo|segsegundo}}",
        "limitreport-walltime": "Pudno nga oras a panagusar",
-       "limitreport-walltime-value": "$1 {{PLURAL:$1|segundo|seg-segundo}}",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|segundo|segsegundo}}",
        "limitreport-ppvisitednodes": "Nabisita a bilang ti nodo ti preproseso",
        "limitreport-ppgeneratednodes": "Napataud a bilang ti nodo ti preproseso",
        "limitreport-postexpandincludesize": "Pannakairaman a kadakkel ti kalpasan a panagpadakkel",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|a byte|kadagiti byte}}",
-       "limitreport-templateargumentsize": "Argumento a kadakkel ti plantilia",
+       "limitreport-templateargumentsize": "Kadakkel ti argumento ti plantilia",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|a byte|kadagiti byte}}",
-       "limitreport-expansiondepth": "Kangatuan a panagpadakkel ti kauneg",
+       "limitreport-expansiondepth": "Kangatuan a kauneg ti panagpadakkel",
        "limitreport-expensivefunctioncount": "Bilang ti nangina nga annong ti parser",
        "expandtemplates": "Palawaen dagiti plantilia",
-       "expand_templates_intro": "Daytoy nga espesial a panid ket agala ti testo ken palawaenna amin dagiti plantilia iti unegna a minaig iti daytoy.\nPalawaenna pay dagiti nasuportaran a parser a pamay-an a kas ti\n<code><nowiki>{{</nowiki>#language:…}}</code> ken dagiti nadumaduma a kita a kas ti\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>. \nIti kinapudno, palawaenna amin dagiti adda ti doble a tukol.",
+       "expand_templates_intro": "Daytoy nga espesial a panid ket agala ti testo ken palawaenna amin dagiti plantilia iti unegna a minaig iti daytoy.\nPalawaenna pay dagiti nasuportaran a parser a pamay-an a kas ti\n<code><nowiki>{{</nowiki>#language:…}}</code> ken dagiti nadumaduma a kita a kas ti\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>. \nIti kinapudno, palawaenna amin dagiti addaan iti doble a pangrikep.",
        "expand_templates_title": "Titulo ti kontesto, para iti {{FULLPAGENAME}} kdpy.:",
        "expand_templates_input": "Maikabil a testo:",
        "expand_templates_output": "Nagbanagan",
-       "expand_templates_xml_output": "XML a maiparang",
+       "expand_templates_xml_output": "Maiparuar a XML",
        "expand_templates_html_output": "Naata a maiparuar a HTML",
-       "expand_templates_ok": "OK",
+       "expand_templates_ok": "Sige",
        "expand_templates_remove_comments": "Ikkaten dagiti komentario",
-       "expand_templates_remove_nowiki": "Parmeken dagiti <nowiki> nga etiketa kadagiti nagbanagan",
-       "expand_templates_generate_xml": "Iparang ti XML parse a kayo",
+       "expand_templates_remove_nowiki": "Parmeken dagiti etiketa ti <nowiki> iti nagbanagan",
+       "expand_templates_generate_xml": "Iparang ti pangwaswas a kayo ti XML",
        "expand_templates_generate_rawhtml": "Ipakita ti naata a HTML",
-       "expand_templates_preview": "Pamadasan",
+       "expand_templates_preview": "Ipadas",
        "pagelanguage": "Pagpilian ti pagsasao ti panid",
        "pagelang-name": "Panid",
        "pagelang-language": "Pagsasao",
        "pagelang-select-lang": "Agpili iti pagsasao",
        "right-pagelang": "Baliwan ti pagsasao ti panid",
        "action-pagelang": "baliwan ti pagsasao ti panid",
-       "log-name-pagelang": "Baliwan ti pagsasao ti listaan",
-       "log-description-pagelang": "Daytoy ket listaan dagiti binaliwan kadagiti pagsasao ti panid.",
-       "logentry-pagelang-pagelang": "NI $1 ket {{GENDER:$2|binaliwanna}} ti pagsasao ti panid para iti $3 manipud ti $4 iti $5."
+       "log-name-pagelang": "Listaan ti panagbaliw ti pagsasao",
+       "log-description-pagelang": "Daytoy ket listaan dagiti panagbaliw kadagiti pagsasao ti panid.",
+       "logentry-pagelang-pagelang": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti pagsasao ti panid para iti $3 manipud ti $4 iti $5."
 }
index 68d3030..d65c9b7 100644 (file)
        "loginreqlink": "innskrá",
        "loginreqpagetext": "Þú þarft að $1 þig til að geta séð aðrar síður.",
        "accmailtitle": "Lykilorð sent.",
-       "accmailtext": "Lykilorðið fyrir [[User talk:$1|$1]] hefur verið sent á $2.\n\nHægt er að breyta lykilorðinu fyrir aðganginn á ''[[Special:ChangePassword|change password]]'' þegar notandinn hefur skráð sig inn.",
+       "accmailtext": "Lykilorðið fyrir [[User talk:$1|$1]] hefur verið sent á $2. Hægt er að breyta því á síðunni ''[[Special:ChangePassword|breyta lykilorði]]'' þegar notandinn hefur skráð sig inn.",
        "newarticle": "(Ný)",
        "newarticletext": "Þú hefur fylgt tengli á síðu sem ekki er til ennþá.\nÞú getur búið til síðu með þessu nafni með því að skrifa í formið fyrir neðan\n(meiri upplýsingar í [$1 hjálpinni]).\nEf þú hefur óvart villst hingað geturðu notað '''til baka'''-hnappinn í vafranum þínum.",
        "anontalkpagetext": "----''Þetta er spjallsíða fyrir óþekktan notanda sem hefur ekki búið til aðgang ennþá, eða notar hann ekki.\nÞar af leiðandi þurfum við að nota vistfang til að bera kennsli á hann/hana.\nNokkrir notendur geta deilt sama vistfangi.\nEf þú ert óþekktur notandi og finnst að óviðkomandi athugasemdum hafa verið beint að þér, gjörðu svo vel og [[Special:UserLogin/signup|búðu til aðgang]] eða [[Special:UserLogin|skráðu þig inn]] til þess að koma í veg fyrir þennan rugling við aðra óþekkta notendur í framtíðinni.''",
        "search-file-match": "(passar við innihald skráa)",
        "search-suggest": "Varstu að leita að: $1",
        "search-interwiki-caption": "Systurverkefni",
-       "search-interwiki-default": "$1 útkomur:",
+       "search-interwiki-default": "Útkomur frá $1:",
        "search-interwiki-more": "(fleiri)",
        "search-relatedarticle": "Tengt",
        "searchrelated": "tengt",
        "largefileserver": "Þessi skrá er of stór. Vefþjónninn getur ekki tekið við skránni.",
        "emptyfile": "Skráin sem þú hlóðst inn virðist vera tóm.\nÞetta gæti verið vegna ásláttarvillu í skráarnafninu.\nVinsamlegast athugaðu hvort þú viljir hlaða skránni inn.",
        "windows-nonascii-filename": "Þessi wiki styður ekki skráarnöfn með sérstökum stöfum",
-       "fileexists": "Skrá með þessu nafni er þegar til, skoðaðu <strong>[[:$1]]</strong> ef þú ert óviss um hvort þú viljir breyta henni, ekki verður skrifað yfir gömlu skránna hlaðiru inn nýrri með sama nafni heldur verður núverandi útgáfa geymd í útgáfusögu.\n[[$1|thumb]]",
+       "fileexists": "Skrá með þessu nafni er þegar til, skoðaðu <strong>[[:$1]]</strong> ef þú ert óviss um hvort þú viljir breyta henni.\n[[$1|thumb]]",
        "filepageexists": "Myndasíðan fyrir þessa síðu hefur þegar verið búin til <strong>[[:$1]]</strong>, en engin skrá er til með þessu nafni.\nLýsingin sem þú skrifaðir verður ekki birt á myndasíðunni.\nTil þess að lýsingin geti birst á síðunni, þá þarft þú að breyta síðunni sérstaklega.\n[[$1|thumb]]",
        "fileexists-extension": "Skrá með svipuðu nafni er til: [[$2|thumb]]\n*Nafn skráarinnar sem hlaða á inn: <strong>[[:$1]]</strong>\n*Nafn skráarinnar sem er þegar til: <strong>[[:$2]]</strong>\nVilt þú kanski nota annað nafn sem er meira lýsandi fyrir skránna ?",
        "fileexists-thumbnail-yes": "Skráin virðist vera smámynd [[$1|thumb]]\nVinsamlegast athugaðu skránna <strong>[[:$1]]</strong>.\nEf skráin er sama myndin í upprunalegri stærð er ekki þörf á annari smámynd.",
        "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á",
        "mimesearch": "MIME-leit",
-       "mimesearch-summary": "Þessi síða gerir þér kleift að leita eftir skrám eftir MIME-gerð þeirra.\n\nLeitarstrengurinn á að vera á þessu formi: efnistag/myndasnið, t.d. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Þessi síða gerir þér kleift að leita eftir skrám eftir MIME-gerð þeirra.\n\nLeitarstrengurinn á að vera á þessu formi: efnistag/myndasnið eða efnistag/*, t.d. <code>image/jpeg</code>.",
        "mimetype": "MIME-tegund:",
        "download": "Hlaða niður",
        "unwatchedpages": "Óvaktaðar síður",
        "enotif_lastvisited": "Heimsóttu eftirfarandi tengil til að sjá allar breytingar síðan \nþú heimsóttir síðuna síðast:\n  $1",
        "enotif_lastdiff": "Einnig getur þú heimsótt eftirfarandi tengil til að skoða þessa breytingu:\n  $1",
        "enotif_anon_editor": "ónefndum notanda $1",
-       "enotif_body": "Kæri $WATCHINGUSERNAME,\n\n$PAGEINTRO\n$NEWPAGE\n\nTil þess að hafa samband við $PAGEEDITOR, smelltu á:\n\n   $PAGEEDITOR_WIKI\n\nAthugaðu að frekari breytingar á $PAGETITLE leiða\nekki af sér fleiri tilkynningar fyrr en þú hefur heimsótt síðuna á meðan þú ert skráð/ur inn.\n\nKveðja,\n{{SITENAME}}\n\n--\n\nTil þess að breyta stillingum um hvenær þú færð sendar tilkynningar, smelltu á:\n\n{{canonicalurl:{{#special:Preferences}}}}\n\n\nTil þess að hætta að fylgjast með „$PAGETITLE”, smelltu á:\n\n$UNWATCHURL",
+       "enotif_body": "Kæri $WATCHINGUSERNAME,\n\n$PAGEINTRO\n$NEWPAGE\n\n$PAGEEDITOR skildi eftir eftirfarandi breytingarágrip: $PAGESUMMARY $PAGEMINOREDIT\n\nTil þess að hafa samband við $PAGEEDITOR, smelltu á $PAGEEDITOR_WIKI eða sentu tölvupóst á $PAGEEDITOR_EMAIL\n\nAthugaðu að frekari aðgerðir á $PAGETITLE leiða\nekki af sér fleiri tilkynningar fyrr en þú hefur heimsótt síðuna á meðan þú ert skráð/ur inn. Þú getur einnig endursett tilkynningar fyrir allar þær síður sem þú fylgist með.\n\nKveðja,\n{{SITENAME}}\n\n--\n\nTil þess að breyta stillingum um hvenær þú færð sendar tilkynningar, smelltu á:\n\n{{canonicalurl:{{#special:Preferences}}}}\n\n\nTil þess að hætta að fylgjast með „$PAGETITLE”, smelltu á:\n\n$UNWATCHURL\n\nFrekari hjálp er að finna á $HELPPAGE.",
        "created": "búin til",
        "changed": "breytt",
        "deletepage": "Eyða",
        "protect-locked-blocked": "Þú getur ekki breytt verndunarstigi á meðan þú ert bannaður.\nHérna er núverandi verndunarstig fyrir síðuna '''$1''':",
        "protect-locked-dblock": "Á meðan gangnabankinn er læstur er ekki hægt að breyta verndunarstigi.\nHér eru núverandi verndunarstig fyrir síðuna '''$1''':",
        "protect-locked-access": "Þú hefur ekki heimild til þess að vernda eða afvernda síður.\nNúverandi staða síðunnar er '''$1''':",
-       "protect-cascadeon": "Þessi síða er vernduð vegna þess að hún er innifalin í eftirfarandi {{PLURAL:$1|síðu, sem er keðjuvernduð|síðum, sem eru keðjuverndaðar}}.\nÞú getur breytt verndunarstigi þessarar síðu, en það mun ekki hafa áhrif á keðjuverndunina.",
+       "protect-cascadeon": "Þessi síða er vernduð vegna þess að hún er innifalin í eftirfarandi {{PLURAL:$1|síðu, sem er keðjuvernduð|síðum, sem eru keðjuverndaðar}}.\nBreytingar á verndunarstigi þessarar síðu munu ekki hafa áhrif á keðjuverndunina.",
        "protect-default": "Leyfa öllum notendum",
        "protect-fallback": "Leyfa eingöngu notendur með „$1“ réttindi",
        "protect-level-autoconfirmed": "Leyfa aðeins sjálkrafa staðfesta notendur",
index dd285a5..d9180fa 100644 (file)
@@ -89,6 +89,7 @@
        "tog-watchdefault": "Aggiungi le pagine e i file modificati agli osservati speciali",
        "tog-watchmoves": "Aggiungi le pagine e i file spostati agli osservati speciali",
        "tog-watchdeletion": "Aggiungi le pagine e i file cancellati agli osservati speciali",
+       "tog-watchrollback": "Aggiungi le pagine dove ho effettuato un rollback agli osservati speciali",
        "tog-minordefault": "Indica ogni modifica come minore (solo come predefinito)",
        "tog-previewontop": "Mostra l'anteprima sopra la casella di modifica e non sotto",
        "tog-previewonfirst": "Mostra l'anteprima almeno una volta prima di salvare",
        "preview": "Anteprima",
        "showpreview": "Visualizza anteprima",
        "showdiff": "Mostra modifiche",
+       "blankarticle": "<strong>Attenzione:</strong> la pagina che stai creando è vuota.\nCliccando nuovamente su \"{{int:savearticle}}\", la pagina sarà creata senza alcun contenuto.",
        "anoneditwarning": "'''Attenzione:''' Accesso non effettuato. Nella cronologia della pagina verrà registrato il tuo indirizzo IP.",
        "anonpreviewwarning": "''Non è stato eseguito il login. Salvando la pagina, il proprio indirizzo IP sarà registrato nella cronologia.''",
        "missingsummary": "'''Attenzione:''' non è stato specificato l'oggetto di questa modifica. Premendo di nuovo \"{{int:savearticle}}\" la modifica verrà salvata con l'oggetto vuoto.",
        "rev-deleted-event": "(azione del log rimossa)",
        "rev-deleted-user-contribs": "[nome utente o indirizzo IP rimosso - edit nascosto dalla cronologia]",
        "rev-deleted-text-permission": "Questa versione della pagina è stata '''cancellata'''.\nConsultare il [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log delle cancellazioni] per ulteriori dettagli.",
+       "rev-suppressed-text-permission": "Questa versione della pagina è stata '''soppressa'''.\nConsultare il [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log delle soppressioni] per ulteriori dettagli.",
        "rev-deleted-text-unhide": "Questa versione della pagina è stata '''cancellata'''.\nConsultare il [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log delle cancellazioni] per ulteriori dettagli.\nAgli amministratori è ancora consentito [$1 visualizzare questa versione] se necessario.",
        "rev-suppressed-text-unhide": "Questa versione della pagina è stata '''rimossa'''.\nConsultare il [{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} log di rimozione] per ulteriori dettagli.\nAgli amministratori è ancora consentito [$1 visualizzare questa versione] se necessario.",
        "rev-deleted-text-view": "Questa versione della pagina è stata '''cancellata'''.\nGli amministratori possono ancora visualizzarla; consultare il [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log delle cancellazioni] per ulteriori dettagli.",
        "revdelete-text-text": "Le versioni cancellate appariranno ancora nella cronologia della pagina, ma parte del loro contenuto sarà inaccessibile al pubblico.",
        "revdelete-text-file": "Le versioni di file cancellati appariranno ancora nella cronologia del file, ma parti del loro contenuto sarà inaccessibile al pubblico.",
        "logdelete-text": "Gli eventi cancellati appariranno ancora nei registri, ma parti del loro contenuto sarà inaccessibile al pubblico.",
-       "revdelete-text-others": "Altri amministratori di {{SITENAME}} saranno ancora in grado di accedere ai contenuti nascosti e potranno ripristinarli nuovamente attraverso questa stessa interfaccia, se non sono state impostate restrizioni aggiuntive.",
+       "revdelete-text-others": "Altri amministratori saranno ancora in grado di accedere ai contenuti nascosti e potranno ripristinarli, se non sono state impostate restrizioni aggiuntive.",
        "revdelete-confirm": "Per favore conferma che questo è quanto intendi fare, che sei consapevole delle conseguenze, e che stai facendo questo nel rispetto delle [[{{MediaWiki:Policy-url}}|linee guida]].",
        "revdelete-suppress-text": "La rimozione dovrebbe essere utilizzata '''unicamente''' nei seguenti casi:\n* informazioni potenzialmente diffamatorie\n* dati personali inopportuni\n*: ''indirizzi, numeri di telefono, codici fiscali, ecc.''",
        "revdelete-legend": "Imposta le seguenti limitazioni sulle versioni cancellate:",
        "showhideselectedversions": "Mostra/nascondi versioni selezionate",
        "editundo": "annulla",
        "diff-empty": "(Nessuna differenza)",
-       "diff-multi-sameuser": "({{PLURAL:$1|Una versione intermedia|$1 versioni intermedie}} di uno stesso utente non sono mostrate )",
+       "diff-multi-sameuser": "({{PLURAL:$1|Una versione intermedia|$1 versioni intermedie}} di uno stesso utente non {{PLURAL:$1|è mostrata|sono mostrate}})",
        "diff-multi-otherusers": "({{PLURAL:$1|Una versione intermedia|$1 versioni intermedie}} di {{PLURAL:$2|un altro utente|$2 utenti}} non mostrate)",
        "diff-multi-manyusers": "({{PLURAL:$1|Una versione intermedia|$1 versioni intermedie}} di oltre $2 {{PLURAL:$2|utente|utenti}} non {{PLURAL:$1|mostrata|mostrate}})",
        "difference-missing-revision": "{{PLURAL:$2|Una versione|$2 versioni}} di questa differenza ($1) {{PLURAL:$2|non è stata trovata|non sono state trovate}}.\n\nQuesto si verifica solitamente seguendo un collegamento obsoleto di un diff a una pagina cancellata.\nI dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro delle cancellazioni].",
        "right-deletedtext": "Visualizza testo cancellato e modifiche fra versioni cancellate",
        "right-browsearchive": "Ricerca nelle pagine cancellate",
        "right-undelete": "Recupera una pagina",
-       "right-suppressrevision": "Rivede e recupera versioni nascoste agli amministratori",
+       "right-suppressrevision": "Vede, nasconde e ripristina versioni specifiche delle pagine a qualsiasi utente",
+       "right-viewsuppressed": "Vede versioni nascoste a qualsiasi utente",
        "right-suppressionlog": "Visualizza i registri privati",
        "right-block": "Blocca le modifiche da parte di altri utenti",
        "right-blockemail": "Impedisce a un utente di inviare email",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vedi [[Special:NewPages|le nuove pagine]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Di seguito sono elencate le modifiche apportate a partire da <strong>$2</strong> (mostrate fino a <strong>$1</strong>).",
+       "rcnotefrom": "Di seguito {{PLURAL:$5|è elencata la modifica apportata|sono elencate le modifiche apportate}} a partire da <strong>$3, $4</strong> (mostrate fino a <strong>$1</strong>).",
        "rclistfrom": "Mostra le modifiche apportate a partire da $3 $2",
        "rcshowhideminor": "$1 le modifiche minori",
        "rcshowhideminor-show": "Mostra",
        "nolicense": "Nessuna licenza indicata",
        "licenses-edit": "Modifica opzioni di licenza",
        "license-nopreview": "(Anteprima non disponibile)",
-       "upload_source_url": " (una URL corretta e accessibile)",
-       "upload_source_file": " (un file sul proprio computer)",
+       "upload_source_url": "(un file da un URL valido e accessibile pubblicamente)",
+       "upload_source_file": "(un file dal tuo computer)",
        "listfiles-delete": "cancella",
        "listfiles-summary": "Questa pagina speciale mostra tutti i file caricati.",
        "listfiles_search_for": "Ricerca immagini per nome:",
        "watchlist-details": "La lista degli osservati speciali contiene {{PLURAL:$1|una pagina (e la rispettiva pagina di discussione)|$1 pagine (e le rispettive pagine di discussione)}}.",
        "wlheader-enotif": "La notifica via email è attiva.",
        "wlheader-showupdated": "Le pagine che sono state modificate dopo l'ultima visita sono evidenziate in '''grassetto'''.",
-       "wlnote2": "Di seguito le modifiche {{PLURAL:$1|nell'ultima ora|nelle ultime <strong>$1</strong> ore}}, da $2, $3.",
+       "wlnote": "Di seguito {{PLURAL:$1|è elencata la modifica più recente apportata|sono elencate le <strong>$1</strong> modifiche più recenti apportate}} {{PLURAL:$2|nella scorsa ora|nelle scorse <strong>$2</strong> ore}}; i dati sono aggiornati alle $4 del $3.",
        "wlshowlast": "Mostra le ultime $1 ore $2 giorni $3",
        "watchlist-options": "Opzioni osservati speciali",
        "watching": "Aggiunta agli osservati speciali...",
        "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-error-interwiki": "La pagina \"$1\" non è stata importata perché il suo nome è riservato per il collegamento esterno (interwiki).",
+       "import-error-special": "La pagina \"$1\" non è stata importata perché appartiene a un namespace speciale che non permette pagine.",
+       "import-error-invalid": "La pagina \"$1\" non è stata importata perché il nome a cui sarebbe stata importata non è valido su questo wiki.",
        "import-error-unserialize": "La versione $2 della pagina \"$1\" non può essere de-serializzata. La versione è stata segnalata per utilizzare il modello di contenuto $3 serializzato come $4.",
        "import-error-bad-location": "La versione $2 usa un modello di contenuto $3 che non può essere memorizzato in \"$1\" di questo wiki, poiché la pagina non supporta questo modello.",
        "import-options-wrong": "{{PLURAL:$2|Opzione sbagliata|Opzioni sbagliate}}: <nowiki>$1</nowiki>",
        "autosumm-replace": "Pagina sostituita con '$1'",
        "autoredircomment": "Redirect alla pagina [[$1]]",
        "autosumm-new": "Creata pagina con \"$1\"",
+       "autosumm-newblank": "Creata pagina vuota",
        "size-bytes": "$1 byte",
        "lag-warn-normal": "Le modifiche apportate {{PLURAL:$1|nell'ultimo secondo|negli ultimi $1 secondi}} potrebbero non apparire in questa lista.",
        "lag-warn-high": "A causa di un eccessivo ritardo nell'aggiornamento del server di database, le modifiche apportate {{PLURAL:$1|nell'ultimo secondo|negli ultimi $1 secondi}} potrebbero non apparire in questa lista.",
index 1a563c5..2abccf1 100644 (file)
        "logdelete-selected": "{{PLURAL:$1|選択された記録項目}}:",
        "revdelete-text-text": "削除された版は履歴に表示され続けますが、一般の利用者が内容を閲覧できなくなります。",
        "revdelete-text-file": "削除されたファイルの版はファイルの履歴に表示されつづけますが、一般の利用者はその内容の一部を閲覧できなくなります。",
-       "logdelete-text": "削除された記録項目は記録に表示されつづけますが、一般の利用者はその内容の一部を閲覧できなくなります。",
-       "revdelete-text-others": "追加の制限を設定しない限り、{{SITENAME}} の他の管理者は非表示コンテンツにまだアクセスでき、この同じインターフェースを通してそれを復元することができます。",
+       "logdelete-text": "削除された記録項目は記録に表示されけますが、一般の利用者はその内容の一部を閲覧できなくなります。",
+       "revdelete-text-others": "追加の制限を設定しない限り、他の管理者は非表示コンテンツにまだアクセスすることも復元することもできます。",
        "revdelete-confirm": "この操作を行おうとしていること、その結果を理解していること、[[{{MediaWiki:Policy-url}}|方針]]に従っていること、を確認してください。",
        "revdelete-suppress-text": "秘匿は、<strong>以下の場合に限って</strong>使用すべきです:\n* 名誉毀損のおそれがある記述\n* 非公開個人情報\n*: <em>自宅の住所、電話番号、個人を識別できる公的な番号など</em>",
        "revdelete-legend": "閲覧レベル制限を設定",
        "right-deletedtext": "削除された本文と削除された版間の差分を閲覧",
        "right-browsearchive": "削除されたページを検索",
        "right-undelete": "ページを復元",
-       "right-suppressrevision": "管理者から隠された版を確認/復元",
+       "right-suppressrevision": "すべての利用者からの特定の版を見る、隠す、あるいは隠すのをやめる",
+       "right-viewsuppressed": "すべての利用者から隠された版を閲覧",
        "right-suppressionlog": "非公開記録を閲覧",
        "right-block": "他の利用者の編集をブロック",
        "right-blockemail": "利用者のメール送信をブロック",
        "recentchanges-legend-heading": "'''凡例:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|新しいページ一覧]]も参照)",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
-       "rcnotefrom": "以下は<strong>$2</strong>以降の更新です (最大 <strong>$1</strong> 件)。",
+       "rcnotefrom": "以下は<strong>$3 $4</strong>以降の{{PLURAL:$5|更新です}} (最大 <strong>$1</strong> 件)。",
        "rclistfrom": "$3の$2以降の更新を表示する",
        "rcshowhideminor": "細部の編集を$1",
        "rcshowhideminor-show": "表示",
        "license": "ライセンス:",
        "license-header": "ライセンス",
        "nolicense": "選択なし",
+       "licenses-edit": "ライセンスオプションを編集",
        "license-nopreview": "(プレビューはありません)",
        "upload_source_url": "(有効かつ一般に公開されている URL)",
        "upload_source_file": "(あなたのコンピューター上のファイル)",
        "watchlist-details": "ウォッチリストには {{PLURAL:$1|$1 ページ}}が登録されています (トークページを除く)。",
        "wlheader-enotif": "メール通知が有効になっています。",
        "wlheader-showupdated": "最終訪問以降に変更されたページは、<strong>太字</strong>で表示されます。",
-       "wlnote2": "以下は $2 $3 までの {{PLURAL:$1|<strong>$1</strong> 時間}}でなされた変更です。",
+       "wlnote": "$3 $4 までの{{PLURAL:$2|<strong>$2</strong>時間}}になされた{{PLURAL:$1|<strong>$1</strong>件の変更}}は以下の通りです。",
        "wlshowlast": "次の期間で表示: $1時間、$2日間、$3",
        "watchlist-options": "ウォッチリストのオプション",
        "watching": "ウォッチリストに追加中...",
        "import-error-edit": "あなたにそのページを編集する許可がないため、ページ「$1」は取り込まれませんでした。",
        "import-error-create": "あなたにそのページを作成する許可がないため、ページ「$1」は取り込まれませんでした。",
        "import-error-interwiki": "ページ名が外部リンク (ウィキ間リンク) に予約されているため、ページ「$1」を取り込みませんでした。",
-       "import-error-special": "ページ「$1」は、ページが許可されない特別名前空間に属しているため取り込みません。",
+       "import-error-special": "ã\83\9aã\83¼ã\82¸ã\80\8c$1ã\80\8dã\81¯ã\80\81ã\83\9aã\83¼ã\82¸ã\81\8c許å\8f¯ã\81\95ã\82\8cã\81ªã\81\84ç\89¹å\88¥å\90\8då\89\8d空é\96\93ã\81«å±\9eã\81\97ã\81¦ã\81\84ã\82\8bã\81\9fã\82\81å\8f\96ã\82\8aè¾¼ã\81¿ã\81¾ã\81\9bã\82\93ã\81§ã\81\97ã\81\9fã\80\82",
        "import-error-invalid": "名前が正しくないため、ページ「$1」を取り込みませんでした。",
        "import-error-unserialize": "ページ「$1」の版 $2 はシリアライズ解除できませんでした。この版は $4 としてシリアライズされたコンテンツモデル $3 を使用していると報告されています。",
        "import-error-bad-location": "コンテンツモデル $3 はこのページではサポート外のため、モデル $3 を使用している版 $2 はこのウィキ上の「$1」に保存できません。",
index 1bb1d5d..13cea46 100644 (file)
        "license-nopreview": "(Қарап шығу жетімді емес)",
        "upload_source_url": "(жарамды, баршаға қатынаулы URL)",
        "upload_source_file": "(компьютеріңіздегі файл)",
+       "listfiles-delete": "жою",
        "listfiles-summary": "Бұл арнайы бетте барлық жүктелген файлдар көрсетіледі.",
        "listfiles_search_for": "Медиа атауын іздеу:",
        "imgfile": "файл",
        "watchlist-details": "Бақылау тізіміңізде {{PLURAL:$1|$1 бет|$1 бет}} бар (талқылау беттері жекелей саналмайды).",
        "wlheader-enotif": "Ескерту хат жіберуі қосылған.",
        "wlheader-showupdated": "Соңғы келіп-кетуіңізден бері өзгертілген беттер '''жуан''' қаріпімен көрсетіледі.",
-       "wlnote2": "Төменде $2, $3 кезіне дейінгі соңғы {{PLURAL:$1|сағаттағы|<strong>$1</strong> сағаттағы}} өзгерістер көрсетілген.",
+       "wlnote": "Төменде $3, $4 кезіне дейінгі соңғы {{PLURAL:$2|сағатта|'''$2''' сағатта}} болған, {{PLURAL:$1|жуықтағы өзгеріс|жуықтағы '''$1''' өзгеріс}} көрсетіледі.",
        "wlshowlast": "Соңғы $1 сағаттағы, $2 күндегі, $3 болған өзгерісті көрсету",
        "watchlist-options": "Бақылау тізімінің баптаулары",
        "watching": "Бақылауда…",
        "exbeforeblank": "тазарту алдындағы болған мағлұматы: $1",
        "delete-confirm": "«$1» дегенді жою",
        "delete-legend": "Жою",
-       "historywarning": "'''Ескету:'' Жоюы көзделген бетте бет тарихында шамамен $1 {{PLURAL:$1|түзетілуі|түзетілулері}} бар:",
+       "historywarning": "<strong>Ескету:</strong> Сіз жоймақшы болған бет тарихында шамамен $1 {{PLURAL:$1|түзетілуі|түзетілулері}} бар:",
        "confirmdeletetext": "Бетті бүкіл тарихымен бірге жойғалы жатырсыз.\nМұны жасауға сенімді екеніңізді, салдары есепке алынғанын және әрекетіңіз [[{{MediaWiki:Policy-url}}|ережелерге]] лайықты болғанын тағы бір рет тексеріп шығуыңызды сұраймыз.",
        "actioncomplete": "Әрекет орындалды",
        "actionfailed": "Әрекет орындалмады",
index 996ae86..d49f438 100644 (file)
        "currentrev": "최신판",
        "currentrev-asof": "$1 기준 최신판",
        "revisionasof": "$1 판",
-       "revision-info": "{{GENDER:$6|$2}} 사용자의 $1 판$1",
+       "revision-info": "{{GENDER:$6|$2}} 사용자의 $1 판$7",
        "previousrevision": "← 이전 판",
        "nextrevision": "다음 판 →",
        "currentrevisionlink": "최신판",
        "revdelete-text-text": "삭제된 판은 여전히 문서 역사에 남게 되지만, 그 내용의 일부는 다른 사람들이 접근할 수 없게 됩니다.",
        "revdelete-text-file": "삭제된 파일 버전은 계속 파일 역사에 남게 되지만, 내용의 일부는 다른 사람들이 접근할 수 없게 됩니다.",
        "logdelete-text": "삭제된 로그 내용은 로그에 보여지겠지만, 내용의 일부는 다른 사람들이 접근할 수 없게 됩니다.",
-       "revdelete-text-others": "{{SITENAME}}에 있는 다른 관리자는 여전히 숨겨진 내용에 접근할 수 있고 추가 제한이 설정되어 있지 않으면, 이 같은 인터페이스를 통해 다시 되살릴 수 있습니다.",
+       "revdelete-text-others": "다른 관리자는 여전히 숨겨진 내용에 접근할 수 있고 추가 제한이 설정되어 있지 않으면, 다시 되살릴 수 있습니다.",
        "revdelete-confirm": "이 작업을 수행하는 것의 결과를 알고 있으며, [[{{MediaWiki:Policy-url}}|정책]]에 맞는 행동인지 확인해주세요.",
        "revdelete-suppress-text": "숨기기는 '''다음 경우에만''' 사용되어야 합니다:\n* 잠재적인 비방 정보\n* 부적절한 개인 정보\n*: 집 주소, 전화번호, 주민등록번호 등",
        "revdelete-legend": "보이기 제한을 설정",
        "right-browsearchive": "삭제된 문서 검색",
        "right-undelete": "삭제된 문서 되살리기",
        "right-suppressrevision": "관리자가 보지 못하도록 숨겨진 판을 검토하고 되살리기",
+       "right-viewsuppressed": "어떤 사용자가 숨긴 판 보기",
        "right-suppressionlog": "숨겨진 기록을 보기",
        "right-block": "다른 사용자가 편집을 못하도록 차단",
        "right-blockemail": "다른 사용자가 이메일을 보내지 못하도록 차단",
        "license": "라이선스:",
        "license-header": "라이선스",
        "nolicense": "선택하지 않음",
+       "licenses-edit": "라이선스 옵션 편집",
        "license-nopreview": "(미리 보기 불가능)",
        "upload_source_url": "(올바르고, 공개적으로 접근할 수 있는 URL)",
        "upload_source_file": " (당신의 컴퓨터에 있는 파일)",
        "watchlist-details": "별도의 토론 문서를 세지 않고, 주시문서 목록에 {{PLURAL:$1|문서 $1개}}가 있습니다.",
        "wlheader-enotif": "이메일 알림 기능이 활성화되었습니다.",
        "wlheader-showupdated": "마지막으로 방문한 이후에 바뀐 문서는 '''굵은 글씨'''로 보입니다.",
-       "wlnote2": "아래는 $2, $3 기준으로 지난 {{PLURAL:$1|한 시간|<strong>$1</strong>시간}} 동안의 바뀜입니다.",
+       "wlnote": "다음은 최근 {{PLURAL:$2|'''$2'''시간}} 동안 {{PLURAL:$1|바뀐 문서 '''$1'''개 입니다}}. ($3 $4 기준)",
        "wlshowlast": "최근 $1시간 $2일 또는 $3 동안에 바뀐 문서 보기",
        "watchlist-options": "주시문서 목록 설정",
        "watching": "주시 추가 중…",
        "autosumm-replace": "문서 내용을 \"$1\"으로 바꿈",
        "autoredircomment": "[[$1]] 문서로 넘겨주기",
        "autosumm-new": "새 문서: $1",
+       "autosumm-newblank": "빈 문서를 만듦",
        "lag-warn-normal": "최근 $1{{PLURAL:$1|초}} 안에 바뀐 문서는 이 목록에서 빠졌을 수 있습니다.",
        "lag-warn-high": "데이터베이스 서버의 과도한 부하 때문에 최근 $1{{PLURAL:$1|초}} 안에 바뀐 문서 목록은 보이지 않을 수 있습니다.",
        "watchlistedit-normal-title": "주시문서 목록 편집하기",
index f4ecf82..3cf2b88 100644 (file)
        "talkpagelinktext": "gotûbêj",
        "specialpage": "Rûpela taybet",
        "personaltools": "Amûrên kesane",
-       "postcomment": "Beşeke nû",
        "articlepage": "Li rûpela naverokê binêre",
        "talk": "Gotûbêj",
        "views": "Dîtin",
        "externaldberror": "Çewtiyeke bingeha daneyan heye, an jî destûra te ya rojanekirina hesabê xweyê navxweyî nîne.",
        "login": "Têkeve",
        "nav-login-createaccount": "Têkeve / hesabekî nû çêke",
-       "loginprompt": "<b>Eger tu xwe nû tomar bikî, nav û şîfreya xwe hilbijêre.</b> Ji bo tomarkirina te ya di {{SITENAME}} de divê ku ''cookies'' gengaz bin.",
        "userlogin": "Têkeve an hesabekî nû çêke",
        "userloginnocreate": "Têkeve",
        "logout": "Derkeve",
        "gotaccountlink": "Têkeve",
        "userlogin-resetlink": "Te agahiyên hesabê xwe ji bîr kirin?",
        "userlogin-resetpassword-link": "Şîfreyê ji nû ve çêke",
+       "userlogin-helplink2": "Alîkariya têketinê",
        "createacct-emailrequired": "E-name",
        "createaccountmail": "Use a temporary random password and send it to the email address specified below",
        "createaccountreason": "Sedem:",
        "recentchanges-legend": "Vebijarkên guherandinên dawî",
        "recentchanges-summary": "Guhertinên herî dawî yên wîkiyê li ser vê rûpelê bişopîne.",
        "recentchanges-label-minor": "Ev guhertineka biçûk e",
-       "recentchanges-legend-newpage": "$1 - rûpela nû",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (also see [[Special:NewPages|list of new pages]])",
        "rclistfrom": "Guherandinên ji $3 $2 şûnde nîşan bide",
        "rcshowhideminor": "Guherandinên biçûk $1",
+       "rcshowhideminor-show": "nîşan bide",
+       "rcshowhideminor-hide": "veşêre",
        "rcshowhidebots": "Bot'an $1",
-       "rcshowhideliu": "Bikarhênerên qeydkirî $1",
-       "rcshowhideanons": "Bikarhênerên neqeydkirî (IP) $1",
+       "rcshowhidebots-show": "nîşan bide",
+       "rcshowhidebots-hide": "veşêre",
+       "rcshowhideliu": "Bikarhênerên tomarkirî $1",
+       "rcshowhideliu-show": "nîşan bide",
+       "rcshowhideliu-hide": "veşêre",
+       "rcshowhideanons": "Bikarhênerên netomarkirî (IP) $1",
+       "rcshowhideanons-show": "nîşan bide",
+       "rcshowhideanons-hide": "veşêre",
        "rcshowhidepatr": "Guherandinên kontrolkirî $1",
        "rcshowhidemine": "Guherandinên min $1",
+       "rcshowhidemine-show": "nîşan bide",
+       "rcshowhidemine-hide": "veşêre",
        "rclinks": "$1 guherandinên di $2 rojên dawî de nîşan bide<br />$3",
        "diff": "cudahî",
        "hist": "dîrok",
        "watchlist-details": "{{PLURAL:$1|Rûpeleka|$1 rûpel}} li ser lîsteya te ya şopandinê, rûpelên gotûbêjê nayên jimartin.",
        "wlheader-enotif": "Agahdariya E-nameyê pêk tê.",
        "wlheader-showupdated": "Ev rûpela hatî guhertin dema te lê meyzand bi '''nivîsa stûr''' tê xuyakirin.",
+       "wlnote": "Niha {{PLURAL:$1|xeyrandinê|'''$1''' xeyrandinên}} dawî yê {{PLURAL:$2|seetê|'''$2''' seetên}} dawî {{PLURAL:$1|tê|tên}} dîtin.",
        "wlshowlast": "Guhertinên berî $1 saetan, $2 rojan, ya $3 nîşan bide",
        "watchlist-options": "Vebijarkên lîsteya şopandinê",
        "watching": "Bişopîne...",
index 14f9fa3..b590893 100644 (file)
        "permalink": "Nexus perpetuus",
        "print": "Imprimere",
        "view": "Legere",
+       "view-foreign": "Legere apud {{grammar:accusative|$1}}",
        "edit": "Recensere",
        "create": "Creare",
        "editthispage": "Recensere hanc paginam",
        "talkpagelinktext": "Disputatio",
        "specialpage": "Pagina specialis",
        "personaltools": "Instrumenta personalia",
-       "postcomment": "Nova pars",
        "articlepage": "Videre rem",
        "talk": "Disputatio",
        "views": "Visae",
        "yourdomainname": "Regnum tuum:",
        "login": "Conventum aperire",
        "nav-login-createaccount": "Conventum aperire / conventum creare",
-       "loginprompt": "Cookies potestatem facere debes ut conventum aperire.",
        "userlogin": "Conventum aperire / conventum creare",
        "userloginnocreate": "Conventum aperire",
        "logout": "Conventum concludere",
        "notanarticle": "Res non est",
        "notvisiblerev": "Emendatio deleta est",
        "watchlist-details": "{{PLURAL:$1|$1 pagina|$1 paginae}} in indice paginarum custoditarum tuarum, sine paginis disputationis.",
+       "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",
        "watching": "Custodiens...",
index c89dcd0..1d04b98 100644 (file)
        "preview": "Kucken ouni ofzespäicheren",
        "showpreview": "Kucken ouni ofzespäicheren",
        "showdiff": "Ännerunge weisen",
+       "blankarticle": "<strong>Opgepasst:</strong> D'Säit déi Dir uleet ass eidel.\nWann Dir nach eng Kéier op \"{{int:savearticle}}\" klickt, da gëtt d'Säit ugeluecht.",
        "anoneditwarning": "'''Opgepasst:''' Dir sidd net ageloggt. Dowéinst gëtt amplaz vun engem Benotzernumm Är IP Adress am Historique vun dëser Säit gespäichert.",
        "anonpreviewwarning": "''Dir sidd net ageloggt. Wann Dir ofspäichert gëtt Är IP-Adress an der Lëscht vun de Versioune vun dëser Säit enregistréiert.''",
        "missingsummary": "'''Erënnerung:''' Dir hutt kee Resumé aginn.\nWann Dir nacheemol op \"{{int:savearticle}}\" klickt, gëtt Är Ännerung ouni Resumé ofgespäichert.",
        "rev-deleted-event": "(Aktioun aus dem Logbuch erausgeholl)",
        "rev-deleted-user-contribs": "[Benotzernumm oder IP-Adress ewechgeholl - Ännerung an der Lescht vun de Kontributioune verstoppt]",
        "rev-deleted-text-permission": "Dës Versioun vun der Säit gouf '''geläscht'''.\nDir fannt eventuell méi Informatiounen an der [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Läsch-Logbuch].",
+       "rev-suppressed-text-permission": "Dës Versioun vun der Säit gouf <strong>geläscht</strong>..\nDetailer fannt Dir am [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Läsch-Logbuch].",
        "rev-deleted-text-unhide": "Dës Versioun vun der Säit gouf '''geläscht'''.\nDetailer kënnen am [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Läsch-Logbuch] fonnt ginn.\nDir kënnt [$1 dës Versioun nach ëmmer kucke] wann Dir weiderfuere wëllt.",
        "rev-suppressed-text-unhide": "Dës Versioun vun der Säit gouf '''geläscht'''.\nDetailer kënnen am  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Läschlogbuch] sinn.\nDir kënnt [$1 dës Versioun gesi] wann Dir weiderfuere wëllt.",
        "rev-deleted-text-view": "Dës Versioun vun der Säit gouf '''geläscht'''.\nDir kënnt se gesinn; Dir fannt Detailer am  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Läsch-Logbuch].",
        "revdelete-selected-text": "{{PLURAL:$1|Erausgesicht Versioun|Erausgesicht Versioune}} vu(n) [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Erausgesicht Versioun|Erausgesicht Versioune}} vum Fichier vu(n) [[:$2]]:",
        "logdelete-selected": "Ausgewielten {{PLURAL:$1|Evenement|Evenementer}} aus dem Logbuch:",
-       "revdelete-text-others": "Aner Administrateuren op {{SITENAME}} kënnen nach ëmmer de verstoppten Inhalt gesinn an en iwwer deeselwechten Interface nees restauréieren, ausser wann zousätzlech Limitatiounen agestallt sinn.",
+       "revdelete-text-others": "Aner Administrateure kënnen nach ëmmer de verstoppten Inhalt gesinn an en nees restauréieren, ausser wann zousätzlech Limitatiounen agestallt sinn.",
        "revdelete-confirm": "Confirméiert w.e.g. datt Dir dat maache wëllt, datt Dir d'Konsequenze verstitt an datt Dir dëst an Aklang mat de [[{{MediaWiki:Policy-url}}|Richtlinne]] maacht.",
        "revdelete-suppress-text": "Ënnerdréckung sollt '''nëmmen''' an dëse Fäll benotzt ginn:\n* Informatiounen déi beleidege kéinten\n* Net ubruechte perséinlechen Informatiounen\n*: ''Adressen, Telefonsnummeren, Sozialversécherungsnummeren asw.''",
        "revdelete-legend": "Limitatioune fir d'Sichtbarkeet festleeën",
        "powersearch-togglelabel": "Markéieren:",
        "powersearch-toggleall": "All",
        "powersearch-togglenone": "Keen",
+       "powersearch-remember": "Auswiel fir zukünfteg Sichufroe verhalen",
        "search-external": "Extern sichen",
        "searchdisabled": "D'Sichfunktioun op {{SITENAME}} ass ausgeschalt. Dir kënnt iwwerdeems mat Hëllef vu Google sichen. Bedenkt awer, datt deenen hire  Sichindex fir {{SITENAME}} eventuell net dem aktuellste Stand entsprecht.",
        "search-error": "Beim Sichen ass e Feeler geschitt: $1",
        "right-deletedtext": "Geläschten Text an d'Ännerungen tëscht de geläschte Versioune weisen",
        "right-browsearchive": "Geläscht Säite sichen",
        "right-undelete": "Eng Säit restauréieren",
-       "right-suppressrevision": "Virun den Administrateure verstoppte Versiounen nokucken a restauréieren",
+       "right-suppressrevision": "Spezifesch Versioune vun alle Benotzer weisen, verstoppen a restauréieren",
+       "right-viewsuppressed": "Verstoppt Versioune weisen déi fir all Benotzer verstoppt sinn",
        "right-suppressionlog": "Privat Lëschte kucken",
        "right-block": "Aner Benotzer fir Ännerunge spären",
        "right-blockemail": "E Benotzer späre sou datt hie keng Maile verschécke kann",
        "recentchanges-legend-heading": "'''Legend:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kuckt och [[Special:NewPages|Lëscht vun den neie Säiten]])",
        "recentchanges-legend-plusminus": "''(±123)''",
-       "rcnotefrom": "Ugewise ginn d'Ännerunge vum <strong>$2</strong> un (maximal <strong>$1</strong> Ännerunge gi gewisen).",
+       "rcnotefrom": "Hei drënner {{PLURAL:$5|gëtt d'Ännerung|ginn d'Ännerungen}} zanter <strong>$3, $4</strong> (maximal <strong>$1</strong> Ännerunge gi gewisen).",
        "rclistfrom": "Nei Ännerunge vu(n) $3 $2 u weisen",
        "rcshowhideminor": "Kleng Ännerunge $1",
        "rcshowhideminor-show": "Weisen",
        "uploadstash-errclear": "D'Läsche vun de Fichieren huet net funktionéiert.",
        "uploadstash-refresh": "Lëscht vun de Fichieren aktualiséieren",
        "img-auth-accessdenied": "Zougang refuséiert",
-       "img-auth-nopathinfo": "PATH_INFO feelt.\nÄre Server ass net agestallt fir déi Informatioun weiderzeginn.\nEt kann u CGI leien an datt imag_auth net ënnerstëtzt gëtt.\nKuckt  https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
+       "img-auth-nopathinfo": "PATH_INFO feelt.\nÄre Server ass net agestallt fir déi Informatioun weiderzeginn.\nEt kann u CGI leien an datt imag_auth net ënnerstëtzt gëtt.\nKuckt https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "img-auth-notindir": "De gefrote Pad ass net am Upload-Repertoire agestallt.",
        "img-auth-badtitle": "Aus \"$1\" ka kee valabelen Titel gemaach ginn.",
        "img-auth-nologinnWL": "Dir sidd net ageloggt a(n) \"$1\" ass net op der Wäisser Lëscht.",
        "license": "Lizenz",
        "license-header": "Lizenz",
        "nolicense": "Keng Lizenz ausgewielt",
+       "licenses-edit": "Lizenzoptiounen änneren",
        "license-nopreview": "(Kucken ouni ofzespäichere geet net)",
-       "upload_source_url": " (gëlteg, ëffentlech zougänglech URL)",
-       "upload_source_file": " (e Fichier op Ärem Computer)",
+       "upload_source_url": "(Äre Fichier deen Dir op enger gëlteger, ëffentlech zougänglecher URL erausgesicht hutt)",
+       "upload_source_file": "(den erausgesichte Fichier vun Ärem Computer)",
        "listfiles-delete": "läschen",
        "listfiles-summary": "Op dëser Spezialsäit stinn all déi eropgeluede Fichieren.",
        "listfiles_search_for": "Sicht nom Fichier:",
        "wantedfiles": "Gewënscht Fichieren",
        "wantedfiletext-cat": "Dës Fichiere gi benotzt awer et gëtt se net. Fichiere aus frieme Repositorie kënnen hei gewise ginn och wann et se gëtt. All sou falsch Positiver ginn <del>duerchgestrach</del>. Zousätzlech gi Säiten an deene Fichieren dra sinn déi et net gëtt op [[:$1]] gewisen.",
        "wantedfiletext-nocat": "Dës Fichiere gi benotzt existéieren awer net. Fichieren aus frieme Repertoiren kënnen trotzdeem opgelëscht ginn. All dës positiv Fichiere ginn <del>duergestrach</del>.",
+       "wantedfiletext-nocat-noforeign": "Dës Fichiere gi benotzt awer et gëtt se net.",
        "wantedtemplates": "Gewënscht Schablounen",
        "mostlinked": "Dacks verlinkt Säiten",
        "mostlinkedcategories": "Dacks benotzt Kategorien",
        "trackingcategories-msg": "Tracking-Kategorie",
        "trackingcategories-name": "Numm vum Message",
        "noindex-category-desc": "D'Säit gëtt net vu Botten indexéiert, well dat magescht Wuert <code><nowiki>__NOINDEX__</nowiki></code> dran ass a well se an engem Nummraum ass, an deem déi Markéierung erlaabt ass.",
+       "broken-file-category-desc": "Kategorie, déi derbäigesat gëtt, wann et op der Säit e futtise Link op e Fichier gëtt (e Link op en agebonnene Fichier wann et de Fichier net gëtt).",
        "hidden-category-category-desc": "Dëst ass eng Kategorie an där <code><nowiki>__HIDDENCAT__</nowiki></code> drasteet, dat verhënnert datt se standardméisseg an der këscht mat de Kategorielinken op der Säit gewise gëtt.",
        "trackingcategories-nodesc": "Keng Beschreiwung disponibel.",
        "trackingcategories-disabled": "Kategorie ass desaktivéiert",
        "watchlist-details": "{{PLURAL:$1|1 Säit|$1 Säiten}} sinn op ärer Iwwerwaachungsklëscht, d'Diskussiounssäiten net matgezielt.",
        "wlheader-enotif": "E-Mail-Notifikatioun ass ageschalt.",
        "wlheader-showupdated": "Säiten déi zanter Ärer leschter Visite geännert goufen, si '''fett''' geschriwwen",
-       "wlnote2": "Hei sinn déi lescht Ännerunge aus {{PLURAL:$1|der leschter Stonn|de leschte(n) <strong>$1</strong> Stonnen}}, Stand: $2 ëm $3 Auer.“",
+       "wlnote": "Hei {{PLURAL:$1|ass déi lescht Ännerung|sinn déi lescht <strong>$1</strong> Ännerunge}} vun {{PLURAL:$2|der leschter Stonn|de leschte(n) <strong>$2</strong> 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",
        "watching": "Iwwerwaachen …",
        "movepagetalktext": "D'associéiert Diskussiounssäit, am Fall wou  eng do ass, gëtt automatesch matgeréckelt, '''ausser:'''\n*D'Säit gëtt an een aneren Nummraum geréckelt.\n*Et gëtt schonn eng Diskussiounssäit mat dësem Numm, oder\n*Dir klickt d'Këschtchen ënnendrënner net un.\n\nAn deene Fäll musst Dir d'Diskussiounssäit manuell réckelen oder fusionéieren.",
        "movearticle": "Säit réckelen:",
        "moveuserpage-warning": "'''Opgepasst:''' Dir sidd am gaang eng Benotzersäit ze réckelen. Denkt w.e.g. dorunn datt just d'Säit geréckelt gëtt an datt de Benotzer ''net'' ëmbenannt gëtt.",
+       "movecategorypage-warning": "<strong>Opgepasst:</strong> Dir sidd am Gaang eng Kategorie-Säit ze réckelen. Denkt drun datt nëmmen déi Säit geréckelt gëtt an all Säiten an der aler Kategorie ginn <em>net</em> an déi nei ëmkategoriséiert.",
        "movenologintext": "Dir musst e registréierte Benotzer an [[Special:UserLogin|ageloggt]] sinn, fir eng Säit ze réckelen.",
        "movenotallowed": "Dir hutt net déi néideg Rechter fir Säiten ze réckelen.",
        "movenotallowedfile": "Dir hutt net d'Recht fir Fichieren ze réckelen.",
        "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-error-invalid": "D'Säit \"$1\" gouf net importéiert well den Numm op se importéiert gouf an dëser Wiki net valabel ass.",
        "import-error-unserialize": "D'Versioun $2 vun der Säit \"$1\" konnt net deserialiséiert ginn. Et gouf uginn datt déi Versioun den Inhaltsmodell $3 benotzt deen als $4 serialiséiert ass.",
        "import-options-wrong": "Falsch {{PLURAL:$2|Optioun|Optiounen}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Déi Basis-Säit déi Dir uginn hutt ass kee valabelen Titel.",
        "importlogpage": "Lëscht vun den Säitenimporten",
        "importlogpagetext": "Administrativen Import vu Säite mam Historique vun den Ännerungen aus anere Wikien.",
        "import-logentry-upload": "huet [[$1]] vun engem Fichier duerch Eroplueden importéiert",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|Versioun|Versiounen}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|Versioun|Versiounen}} importéiert",
        "import-logentry-interwiki": "huet $1 importéiert (Transwiki)",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|Versioun|Versioune}} vum $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|Versioun|Versiounen}} importéiert vu(n) $2",
        "javascripttest": "JavaScript-Test",
        "javascripttest-title": "$1-Tester ginn elo gemaach",
        "javascripttest-pagetext-noframework": "Dës Säit ass fir Java-Script-Tester reservéiert.",
        "autosumm-replace": "Säitinhalt gëtt ersat duerch '$1'",
        "autoredircomment": "Virugeleet op [[$1]]",
        "autosumm-new": "Säit ugeluecht mat: '$1'",
+       "autosumm-newblank": "Eidel Säit ugeluecht",
        "lag-warn-normal": "Ännerunge vun {{PLURAL:$1|der leschter Sekonn|de leschte(n) $1 Sekonnen}} kënnen an dëser Lëscht net gewise ginn.",
        "lag-warn-high": "Duerch eng héich Serverbelaaschtung kënne Verännerungen déi viru manner wéi $1 {{PLURAL:$1|Sekonn|Sekonne}} gemaach goufen, net an dëser Lëscht ugewise ginn.",
        "watchlistedit-normal-title": "Iwwerwaachungslëscht änneren",
        "pagelang-select-lang": "Sprooch eraussichen",
        "right-pagelang": "Sprooch vun der Säit änneren",
        "action-pagelang": "d'Sprooch vun der Säit änneren",
+       "log-name-pagelang": "Log vum Ännere vun der Sprooch",
        "log-description-pagelang": "Dëst ass a Log mat den Ännerunge vun de Sprooche vun de Säiten."
 }
index 5352d96..bc79ee7 100644 (file)
        "deletethispage": "ای بلگه نه حذف بكيد",
        "undeletethispage": "ای بلگه نه حذف نكيد",
        "undelete_short": "زنه کردن {{جمی:$1|یه گل ویرایشت|$1 ویرایشتیا}}",
-       "viewdeleted_short": "بوینیت {{[جمی:$1|یه گل ویرایشت پاک بیه|$1ویرایشتیا پاک بیه}}",
+       "viewdeleted_short": "بوینیت {{[جمی:$1|یه گل ویرایشت پاکسا بیه|$1ویرایشتیا پاکسا بیه}}",
        "protect": "حمايت بكيد",
        "protect_change": "آلشت بكيد",
        "protectthispage": "ای بلگه نه حفاظت بكيد",
        "talkpagelinktext": "وت و واچ",
        "specialpage": "بلگه ويجه",
        "personaltools": "اوزاريا شصقی",
-       "postcomment": "بشه تازه",
        "articlepage": "ديئن محتوا بلگه",
        "talk": "گپ",
        "views": "ديئنيا",
        "badaccess-group0": "شما اجازه انجوم کاری که حاستیت نارین",
        "badaccess-groups": "ای کاری که شما هاستیته سی کاروریا د  {{جمی:$2|گرو|یکی د گرویا}}: $1 مئدود بیه",
        "versionrequired": "یه نسقه د نیازمنیا ویکی رسانه\n$1",
-       "versionrequiredtext": "نسقه $1 ویکی مدیا سی استفاده د ای بلگه لازم هئی .\nوه نه بوینیت [[ویجه:نسقه|نسقه بلگه]].",
+       "versionrequiredtext": "نسقه $1 ویکی مدیا سی وه کار بستن د ای بلگه لازم هئی .\nوه نه بوینیت [[ویجه:نسقه|نسقه بلگه]].",
        "ok": "خوئه",
        "retrievedfrom": "بازيافته د\"$1\"",
        "youhavenewmessages": "شما داريت $1($2)",
        "editlink": "ويرايشت",
        "viewsourcelink": "سرچشمه نه بوينيت",
        "editsectionhint": "ويرايشت يه بشق:$1",
-       "toc": "محتوايا",
+       "toc": "مینونه یا",
        "showtoc": "نشو دائن",
        "hidetoc": "قام كردن",
        "collapsible-collapse": "جم كردن",
        "thisisdeleted": "دیئن یا ورگنين $1?",
        "viewdeleted": "دیئن$1?",
        "restorelink": "{{جمی:$1|یه گل ویرایشت پاک بیه|$1 ویرایشتیا پاک بیه}}",
-       "feedlinks": "غذا Ø¯Ù\87Ù\86Ù\87:",
+       "feedlinks": "Ø®Ù\88رحÙ\88:",
        "feed-invalid": "نوع مشترک بین خورحو نامعتور",
        "feed-unavailable": "خور حونیا د دسرس نئین",
        "site-rss-feed": "خورخو RSS سی $1",
        "site-atom-feed": "خور حون Atom سی $1",
-       "page-rss-feed": "Ø®Ù\88رخو RSS سی «$1»",
+       "page-rss-feed": "Ø®Ù\88رحو RSS سی «$1»",
        "page-atom-feed": "خور حون Atom سی $1",
        "red-link-title": "$1(بلگه وجود ناره)",
        "sort-descending": "كم بيئن منظم",
        "nstab-project": "بلگه پروجه",
        "nstab-image": "جانیا",
        "nstab-mediawiki": "پيغوم",
-       "nstab-template": "قالو",
+       "nstab-template": "چوئه",
        "nstab-help": "بلگه هومياری",
        "nstab-category": "دسه",
        "nosuchaction": "چنو كاری وجود ناره",
        "badtitletext": "عنوان بلگه حاسته بیه معتور نی،یا  یه گل مئن زونی یا مئن ویکی عنوان غلطه.\nیه شایت شومل یکی با یا بیشتر کاراکتریا نبوئه سی ای موضوعیا استفاده بوئن",
        "viewsource": "سرچشمه نه بوينيت",
        "viewsource-title": "سرچشمه $1 بوينيت",
-       "actionthrottled": "عمل جلوگئری بیه",
+       "actionthrottled": "کنشت جلوگئری بیه",
        "protectedpagetext": "دای بلگه نبوئه ویرایشت یا کاریا هنی بکید",
        "viewsourcetext": "شما تونیت سرچشمه ای بلگه نه بوینیت و دش ورداریت:",
        "viewyourtext": "شما تونیت سرچشمه ویرایشتیا تونه ای د بلگه بوینیت و دشو ورداریت",
        "password-change-forbidden": "شما نتونید پاسوردیانه د ای ویکی آلشت بکید",
        "login": "اومائن",
        "nav-login-createaccount": " اومائن د سيستم/راس كردن حساو",
-       "loginprompt": "شما وا کوکیانه سی اومائن د {{SITENAME}} کوکیانه فعال بکید.",
        "userlogin": " اومائن د سيستم/راس كردن حساو",
        "userloginnocreate": "اومائن",
        "logout": "رئتن",
        "permissionserrors": "خطا اجازه دئین",
        "permissionserrorstext": "شما حق ناریت ونه انجوم بیئت, سی{{جمی:$1|دلیل|دلیلیا}} نهایی:",
        "permissionserrorstext-withaction": "شما سی $2 اجازه ناریت\nسی دمال کردن{{PLURAL:$1|reason|reasons}}:",
-       "recreate-moveddeleted-warn": "'''زنهار شما بلگه ای که وادما پاک بیه هنی راس کردیته'''\nشما باید دونسه بایت که آیا هنی سی نها گرتن ویرایشت ای بلگه خوئه.\nپاک بیئن و جمشت سی ای بلگه سی راحتی تو فراهم بیه:",
+       "recreate-moveddeleted-warn": "'''زنهار شما بلگه ای که وادما پاکسا بیه هنی راس کردیته'''\nشما باید دونسه بایت که آیا هنی سی نها گرتن ویرایشت ای بلگه خوئه.\nپاکسا بیئن و جمشت سی ای بلگه سی راحتی تو فراهم بیه:",
        "moveddeleted-notice": "ای بلگه پاک بیه.\nپاک بین و جمشت ای بلگه سی سرچشمه دئین فراهم بیه",
        "log-fulllog": "دیئن همه پهرستنومه یا",
        "edit-conflict": "مخالفت نه ویرایشت بکید",
        "page_last": "آخر",
        "histlegend": "انتخاو فرخدار:جعویا رادیو نه سی دوواره دیئن و وارسی نشو دار بکید و یا ری رئتن کلیک بکید .<br />\nشرح نوشته: '''({{int:cur}})''' = وا آخری دوواره دیئن فرخ داره '''({{ int:last}})'''= وا دواره دیئن انجوم دئنی فرخ داره  '''{{int:minoreditletter}}''' =ویرایشت کؤچک.",
        "history-fieldset-title": "ویرگار مرور ون",
-       "history-show-deleted": "فقط پاك بيه",
+       "history-show-deleted": "فقط پاكسا بيه",
        "histfirst": "قديمي تري",
        "histlast": "تازه تري",
        "historysize": "({{جمی:$1|1 بایت|$1 بایتیا}})",
        "history-feed-title": "ویرگار دوواره دیئن",
        "history-feed-description": "دوواره دیئن ویرگار سی بلگه د ویکی",
        "history-feed-item-nocomment": "$1 د\n$2",
-       "history-feed-empty": "بلگه حاسته بیه وجود ناره.\nشایت وه د ویکی پاک بیه، یا نومش آلشت بیه.\nسی بلگیا مرتوط تازه [[ویجه:پی جوری|پی جوری د ویکی]] کوششت بکید.",
+       "history-feed-empty": "بلگه حاسته بیه وجود ناره.\nشایت وه د ویکی پاکسا بیه، یا نومش آلشت بیه.\nسی بلگیا مرتوط تازه [[ویجه:پی جوری|پی جوری د ویکی]] کوششت بکید.",
        "rev-deleted-comment": "(ویرایشت چکسته جا وه جا بیه)",
        "rev-deleted-user": "(نوم کاروری جا وه جا بیه)",
        "rev-deleted-event": "(انجوم گر پهرستنومه جا وه جا بیه)",
        "rev-deleted-user-contribs": "[نوم کاروری یا نشونی آی پی جا وه جا بیه - چیا قام بیه د ور هوم یاریانه ویرایشت بکید]",
        "rev-delundel": "آلشت وضئيت ديئن",
        "rev-showdeleted": "نشو دائن",
-       "revisiondelete": "پاک کردن/زنه کردن وانئریا",
+       "revisiondelete": "پاکسا کردن/زنه کردن وانئریا",
        "revdelete-nooldid-title": "وانیری تمارزی بیه نامعتوره",
        "revdelete-no-file": "فایل مشقص بیه وجود ناره.",
        "revdelete-show-file-submit": "هری",
        "revdelete-failure": "'''دیئن وانیری وه خوئی وه هنگوم نبی:'''$1",
        "revdel-restore": "آلشت وضئيت ديئن",
        "pagehist": "ويرگار بلگه",
-       "deletedhist": "ویرگار پاک بیه",
+       "deletedhist": "ویرگار پاکسا بیه",
        "revdelete-otherreason": "دلیل هنی:",
        "revdelete-reasonotherlist": "دلیل هنی",
-       "revdelete-edit-reasonlist": "دلیلیا پاک کردنه نه ویرایشت بکید",
+       "revdelete-edit-reasonlist": "دلیلیا پاکسا کردنه نه ویرایشت بکید",
        "revdelete-offender": "نیسنه وانیری:",
        "mergehistory": "ویرگاریا بلگه نه یکی بکید",
        "mergehistory-header": "ای بلگه وه شما اجازه می ئه که وانیریانه ویرگار سرچشمه بلگه نه د یه گل بلگه تازه سریک سازی بکید.\nمطمئن بویت که ای آلشت د لحاظ ویرگاری د مین بلگه موندگار هئ.",
        "right-upload": "سوار کردن فايلا",
        "right-upload_by_url": "سوار کرد فایلیا د یو آر ال",
        "right-writeapi": "د نیسنن ای پی آی استفاده بکید",
-       "right-delete": "بلگیا نه پاک کو",
+       "right-delete": "بلگیا نه پاکسا کو",
        "right-browsearchive": "بلگه یا پاک بیه نه پی جوری کو",
        "right-undelete": "ای بلگه نه حذف نكيد",
        "right-suppressionlog": "دیئن پهرستنومه یا خصوصی",
        "action-upload": "ای فایل سوار بکید",
        "action-upload_by_url": "ای فایله نه د یو آر ال سوار بکید",
        "action-writeapi": "د نیسنن ای پی آی استفاده بکید",
-       "action-delete": "ای بلگه نه پاک کو",
+       "action-delete": "ای بلگه نه پاکسا کو",
        "action-deleterevision": "ای بازدئین پاک کو",
-       "action-deletedhistory": "ویرگار پاک بیه ای بلگه نه بوینیت",
+       "action-deletedhistory": "ویرگار پاکسا بیه ای بلگه نه بوینیت",
        "action-browsearchive": "بلگه یا پاک بیه نه پی جوری بکید",
        "action-undelete": "ای بلگه نه پاک نکو",
        "action-suppressionlog": "ای پهرستنومه خصوصی نه بوینیت",
        "upload-too-many-redirects": "ای یو آر ال د ورگیرنه واگردونیا فرئی هئ",
        "upload-copy-upload-invalid-domain": "ورداشتن سوارکردیا د ای پوشگئر د دسرس نئ.",
        "backend-fail-notexists": "فایل $1 وجود ناره.",
-       "backend-fail-delete": "نبوئه جانیا $1 پاک بوئه",
+       "backend-fail-delete": "نبوئه جانیا $1 پاکسا بوئه",
        "backend-fail-describe": "نبوئه گپ دونسمنیا سی جانیا\"$1\" آلشت بوئه.",
        "backend-fail-store": "نبوئه جانیا \"$1\" د \"$2\" امبار بوئه.",
        "backend-fail-move": "نبوئه جانیا \"$1\" د \"$2\" جا وه جا بوئه",
        "nolicense": "هیچی انتخاو نبیه",
        "license-nopreview": "(پیش سیل د دسرس نئ)",
        "upload_source_file": "(یه گل فایل د انجومیار تو)",
+       "listfiles-delete": "پاکسا کردن",
        "listfiles-summary": "ای بلگه یا ویجه همه جانیایا سوار بیه نه نشو می ئین.",
        "listfiles_search_for": "پی جوری سی نوم رسانه:",
        "imgfile": "فايل",
        "file-anchor-link": "فايل",
        "filehist": "ويرگار فايل",
        "filehist-help": "ری  ويرگاريا بپورنيت تا نسقه مرتوط بونيت.",
-       "filehist-deleteall": "همه نه پاک کو",
+       "filehist-deleteall": "همه نه پاکسا کو",
        "filehist-deleteone": "پاك كردن",
        "filehist-revert": "ورگنین",
        "filehist-current": "تازه باو",
        "shared-repo-from": "د $1",
        "filerevert-comment": "دليل:",
        "filerevert-submit": "ورگنین",
-       "filedelete": "$1 پاک کو",
+       "filedelete": "$1 پاکسا کو",
        "filedelete-legend": "فایل نه پاک کو",
        "filedelete-comment": "دليل:",
-       "filedelete-submit": "پاك كردن",
-       "filedelete-success": "$1 پاک بیه.",
+       "filedelete-submit": "پاكسا كردن",
+       "filedelete-success": "$1 پاکسا بیه.",
        "filedelete-nofile": "'''$1''' وجود ناره.",
        "filedelete-otherreason": "دلیل هنی:",
        "filedelete-reason-otherlist": "دليل هنی",
        "filedelete-edit-reasonlist": "دلیلیا پاک کردنه نه ویرایشت بکید",
-       "filedelete-maintenance-title": "نبوئه ای فایل پاک بوئه",
+       "filedelete-maintenance-title": "نبوئه ای فایل پاکسا بوئه",
        "mimesearch": "پی جوری ام آی ام ای",
        "download": "گرتن",
        "unwatchedpages": "بلگه یا ندئیه بیه",
        "double-redirect-fixer": "تعمیر کننه واگردونی",
        "brokenredirectstext": "واگردونیا نهاتر د بلگه یایی که وجود نارن هوم پیوند بینه.",
        "brokenredirects-edit": "ویرایشت",
-       "brokenredirects-delete": "پاك كردن",
+       "brokenredirects-delete": "پاكسا كردن",
        "withoutinterwiki": "بلگه یایی که هوم پیوند زون نارن",
        "withoutinterwiki-legend": "پیشون",
        "withoutinterwiki-submit": "نشون دائن",
        "allpages-hide-redirects": "واگردونیا قام بیه",
        "cachedspecial-refresh-now": "دیئن آخری.",
        "categories": "دسه يا",
-       "deletedcontributions": "هومیاریا پاک بیه کارور",
+       "deletedcontributions": "هومیاریا پاکسا بیه کارور",
        "deletedcontributions-title": "هومیاریا پاک بیه کارور",
        "sp-deletedcontributions-contribs": "هومیاریا",
        "linksearch-ns": "نوم جا:",
        "confirm": "مئكم كردن",
        "excontent": "مینونه :\"$1\" بی",
        "exbeforeblank": "مینونه حالی دمایی:\"$1\" بی",
-       "delete-confirm": "پاک کردن\"$1\"",
+       "delete-confirm": "پاکسا کردن\"$1\"",
        "delete-legend": "پاك كردن",
        "actioncomplete": "عملكرد كامل بيه",
        "actionfailed": "عملكرد شكست حرده",
        "deletecomment": "دليل:",
        "deleteotherreason": "دليليا هنی:",
        "deletereasonotherlist": "دلیل هنی",
-       "deletereason-dropdown": "* دلیلیا پاک کردن رسم بیه\n** اسپم\n** خراوکاری\n** رعایت نبین کپی رایت\n** درحاست نیسنه\n** نهاورگشت شکست حرده",
+       "deletereason-dropdown": "* دلیلیا پاکسا کردن رسم بیه\n** اسپم\n** خراوکاری\n** رعایت نبین کپی رایت\n** درحاست نیسنه\n** نهاورگشت شکست حرده",
        "rollbacklink": "ورگشتن",
        "sessionfailure-title": "شکست حردن نشینگه",
        "protectlogpage": "حفاظت کردن",
        "undeleteviewlink": "ديئن",
        "undeletecomment": "دليل:",
        "cannotundelete": "زنه کردن انجوم نبی:$1",
-       "undelete-search-title": "بلگه یا پاک بیه نه پی جوری کو",
+       "undelete-search-title": "بلگه یا پاکسا بیه نه پی جوری کو",
        "undelete-search-submit": "پی جوری",
        "undelete-error-short": "خطا پاک نبیئن جانیا:$1",
        "undelete-show-file-submit": "هری",
        "movelogpage": "جاوه جا کردن",
        "movelogpagetext": "د هار یه گل نوم گه د جا وه جایی یا بلگه هئ",
        "revertmove": "لرستن",
-       "delete_and_move": "پاک و جا وه جا بوئه",
+       "delete_and_move": "پاکسا و جا وه جا بوئه",
        "export": "وه صحرا ديئن بلگيا",
        "export-download": "ذخیره کردن جانیا",
        "allmessagesname": "نوم",
        "tooltip-ca-viewsource": "ای بلگه حفاظت بيه.\nشما تونيت سرچمه ش بئوينيت",
        "tooltip-ca-history": "دوواره ديئن ای بلگه",
        "tooltip-ca-protect": "ای بلگه نه حفاظت بكيد",
-       "tooltip-ca-delete": "ای بلگه نه حذف بكيد",
+       "tooltip-ca-delete": "ای بلگه نه پاکسا کو",
        "tooltip-ca-move": "ای بگله نه جا وه جا كو",
        "tooltip-ca-watch": "اضاف کردن ای بلگه وه نوم نوشت پیگئریاتو",
        "tooltip-ca-unwatch": "ورداشتن ای بلگه وه نوم نوشت پیگئریاتو",
index 70c362e..b003ebe 100644 (file)
        "talkpagelinktext": "Diskusija",
        "specialpage": "Īpašā Lapa",
        "personaltools": "Lietotāja rīki",
-       "postcomment": "Pievienot komentāru",
        "articlepage": "Apskatīt rakstu",
        "talk": "Diskusija",
        "views": "Apskates",
        "externaldberror": "Notikusi vai nu ārējās autentifikācijas datubāzes kļūda, vai arī tev nav atļauts izmainīt savu ārējo kontu.",
        "login": "Pieslēgties",
        "nav-login-createaccount": "Izveidot jaunu lietotāju vai doties iekšā",
-       "loginprompt": "Lai ieietu {{grammar:lokatīvs|{{SITENAME}}}}, tavam datoram ir jāpieņem sīkdatnes (<i>cookies</i>).",
        "userlogin": "Izveidot jaunu lietotāju vai doties iekšā",
        "userloginnocreate": "Pieslēgties",
        "logout": "Iziet",
        "gotaccount": "Tev jau ir lietotājvārds? '''$1'''!",
        "gotaccountlink": "Pieslēgties",
        "userlogin-resetlink": "Esat aizmirsis savu pieslēgšanās informāciju?",
+       "userlogin-helplink2": "Palīdzība ar pieslēgšanos",
        "userlogin-loggedin": "Tu esi pieslēdzies ar lietotājvārdu {{GENDER:$1|$1}}.\nLai pieslēgtos ar citu lietotājvārdu, aizpildi šo formu.",
        "userlogin-createanother": "Izveidot citu kontu",
        "createacct-emailrequired": "E-pasta adrese",
        "search-result-score": "Atbilstība: $1%",
        "search-redirect": "(pāradresēts no $1)",
        "search-section": "(sadaļa $1)",
+       "search-file-match": "(atbilst faila saturam)",
        "search-suggest": "Vai jūs domājāt: $1",
        "search-interwiki-caption": "Citi projekti",
        "search-interwiki-default": "Rezultāti no $1:",
        "license-nopreview": "(Priekšskatījums nav pieejams)",
        "upload_source_url": "(derīgs, publiski pieejams URL)",
        "upload_source_file": "(fails datorā)",
+       "listfiles-delete": "dzēst",
        "listfiles-summary": "Šajā īpašajā lapā ir redzami visi augšupielādētie faili.",
        "listfiles_search_for": "Meklēt failu pēc vārda:",
        "imgfile": "fails",
        "statistics-users-active": "Aktīvi lietotāji",
        "statistics-users-active-desc": "Lietotāji, kas ir veikuši jebkādu darbību {{PLURAL:$1|iepriekšējā dienā|iepriekšējās $1 dienās}}",
        "statistics-mostpopular": "Visvairāk skatītās lapas",
+       "pageswithprop-prop": "Īpašības nosaukums:",
        "pageswithprop-submit": "Aiziet",
        "doubleredirects": "Divkāršas pāradresācijas lapas",
        "doubleredirectstext": "Šajā lapā ir uzskaitītas pāradresācijas lapas, kuras pāradresē uz citām pāradresācijas lapām.\nKatrā rindiņā ir saites uz pirmo un otro pāradresācijas lapu, kā arī pirmā rindiņa no otrās pāradresācijas lapas teksta, kas parasti ir faktiskā \"gala\" lapa, uz kuru vajadzētu būt saitei pirmajā lapā.\n<del>Nosvītrotie</del> ieraksti jau ir tikuši salaboti.",
        "protectedpages-indef": "Tikai bezgalīgas aizsardzības",
        "protectedpages-cascade": "Tikai kaskādes aizsardzības",
        "protectedpages-noredirect": "Paslēpt pāradresācijas",
+       "protectedpages-page": "Lapa",
+       "protectedpages-reason": "Iemesls",
+       "protectedpages-unknown-timestamp": "Nav zināms",
+       "protectedpages-unknown-performer": "Nezināms lietotājs",
        "protectedtitles": "Aizsargātie nosaukumi",
        "protectedtitlesempty": "Pagaidām nevienas lapas nosaukums nav aizsargāts ar šiem paraametriem.",
        "listusers": "Lietotāju uzskaitījums",
        "movepagetext": "Šajā lapā tu vari pārdēvēt vai pārvietot lapu, kopā tās izmaiņu hronoloģiju pārvietojot to uz citu nosaukumu.\nIepriekšējā lapa kļūs par lapu, kas pāradresēs uz jauno lapu.\nŠeit var automātiski izmainīt visas pāradresācijas (redirektus) uz šo lapu (2. ķeksis apakšā).\nSaites pārējās lapās uz iepriekšējo lapu netiks mainītas. Ja izvēlies neizmainīt pāradresācijas automātiski, noteikti pārbaudi un izlabo, izskaužot [[Special:DoubleRedirects|dubultu pāradresāciju]] vai [[Special:BrokenRedirects|pāradresāciju uz neesošu lapu]].\nTev ir jāpārliecinās, vai saites vēl aizvien ved tur, kur tās ir paredzētas.\n\nŅem vērā, ka lapa '''netiks''' pārvietota, ja jau eksistē kāda cita lapa ar vēlamo nosaukumu (izņemot gadījumus, kad tā ir tukša vai kad tā ir pāradresācijas lapa, kā arī tad, ja tai nav izmaiņu hronoloģijas).\nTas nozīmē, ka tu vari pārvietot lapu atpakaļ, no kurienes tu jau reiz to esi pārvietojis, ja būsi kļūdījies, bet tu nevari pārrakstīt jau esošu lapu.\n\n'''BRĪDINĀJUMS!'''\nPopulārām lapām tā var būt krasa un negaidīta pārmaiņa;\npirms turpināšanas vēlreiz pārdomā, vai tu izproti visas iespējamās sekas.",
        "movepagetalktext": "Saistītā diskusiju lapa, ja tāda eksistē, tiks automātiski pārvietota, '''izņemot gadījumus, kad''':\n*tu pārvieto lapu uz citu palīglapu,\n*ar jauno nosaukumu jau eksistē diskusiju lapa, vai arī\n*atzīmēsi zemāk atrodamo lauciņu.\n\nJa tomēr vēlēsies, tad tev šī diskusiju lapa būs jāpārvieto vai jāapvieno pašam.",
        "movearticle": "Pārvietot lapu",
+       "movecategorypage-warning": "<strong>Brīdinājums:</strong> Tu grasies pārvietot kategoriju. Lūgums ievērot, ka pārvietota tiks tikai šī lapa, kategorijas saturs <em>netiks</em> pārvietots.",
        "movenologintext": "Tev ir jābūt reģistrētam lietotājam un jābūt [[Special:UserLogin|iegājušam]] {{grammar:lokatīvs|{{SITENAME}}}}, lai pārvietotu lapu.",
        "movenotallowed": "Tev nav atļaujas pārvietot lapas.",
        "movenotallowedfile": "Tev nav atļaujas pārvietot failus.",
        "pageinfo-edits": "Kopējais izmaiņu skaits",
        "pageinfo-authors": "Kopējais atsevišķu autoru skaits",
        "pageinfo-toolboxlink": "Lapas informācija",
+       "pageinfo-redirectsto": "Pāradresē uz",
        "pageinfo-redirectsto-info": "info",
+       "pageinfo-contentpage": "Skaitīta kā satura lapa",
        "pageinfo-contentpage-yes": "Jā",
        "pageinfo-protect-cascading-yes": "Jā",
        "pageinfo-category-info": "Kategorijas informācija",
        "exif-specialinstructions": "Īpašas norādes",
        "exif-headline": "Virsraksts",
        "exif-source": "Avots",
+       "exif-locationdest": "Attēlotā vieta",
+       "exif-locationdestcode": "Attēlotās vietas kods",
        "exif-contact": "Kontaktinformācija",
        "exif-languagecode": "Valoda",
        "exif-iimversion": "IIM versija",
        "watchlistedit-raw-done": "Tavs uzraugāmo rakstu saraksts tika atjaunots.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 lapa tika pievienota|$1 lapas tika pievienotas}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 lapa tika noņemta|$1 lapas tika noņemtas}}:",
+       "watchlistedit-clear-titles": "Nosaukumi:",
        "watchlisttools-view": "Skatīt atbilstošās izmaiņas",
        "watchlisttools-edit": "Apskatīt un izmainīt uzraugāmo rakstu sarakstu",
        "watchlisttools-raw": "Izmainīt uzraugāmo rakstu saraksta kodu",
        "duplicate-defaultsort": "'''Brīdinājums:''' Noklusējuma kārtošanas atslēga \"$2\" ignorē kārtošanas atslēga \"$1\".",
        "version": "Versija",
        "version-extensions": "Ieinstalētie paplašinājumi",
-       "version-skins": "Apdares",
+       "version-skins": "Uzstādītās apdares",
        "version-specialpages": "Īpašās lapas",
        "version-variables": "Mainīgie",
        "version-antispam": "Spama aizsardzība",
        "version-hooks": "Aizķeres",
        "version-hook-name": "Aizķeres nosaukums",
        "version-version": "(Versija $1)",
+       "version-no-ext-name": "[bez nosaukuma]",
        "version-license": "MediaWiki licence",
+       "version-ext-license": "Licence",
+       "version-ext-colheader-name": "Paplašinājums",
+       "version-skin-colheader-name": "Apdare",
+       "version-ext-colheader-version": "Versija",
+       "version-ext-colheader-license": "Licence",
+       "version-ext-colheader-description": "Apraksts",
+       "version-ext-colheader-credits": "Autori",
        "version-poweredby-credits": "Šis viki darbojas ar '''[https://www.mediawiki.org/ MediaWiki]''' programmatūru, autortiesības © 2001-$1 $2.",
        "version-poweredby-others": "citi",
        "version-poweredby-translators": "translatewiki.net tulkotāji",
        "htmlform-no": "Nē",
        "htmlform-yes": "Jā",
        "htmlform-chosen-placeholder": "Izvēlieties iespēju",
+       "htmlform-cloner-create": "Pievienot vairāk",
        "sqlite-has-fts": "$1 ar pilnteksta meklēšanas atbalstu",
        "sqlite-no-fts": "$1 bez pilnteksta meklēšanas atbalsta",
        "logentry-delete-delete": "$1 {{GENDER:$2|izdzēsa}} lapu $3",
index 967370c..6d4b38f 100644 (file)
@@ -11,7 +11,8 @@
                        "Super Wang",
                        "Xiaomingyan",
                        "Yanteng3",
-                       "아라"
+                       "아라",
+                       "LNDDYL"
                ]
        },
        "tog-underline": "鏈墊線:",
        "talkpagelinktext": "議",
        "specialpage": "特查",
        "personaltools": "家私",
-       "postcomment": "評",
        "articlepage": "閱內文",
        "talk": "議",
        "views": "覽",
        "externaldberror": "認庫之錯或禁更爾之外簿。",
        "login": "登簿",
        "nav-login-createaccount": "登簿、增簿",
-       "loginprompt": "登簿{{SITENAME}}須cookies,請准之。",
        "userlogin": "登簿、增簿",
        "userloginnocreate": "登簿",
        "logout": "去簿",
        "prefs-watchlist-token": "哨幣:",
        "prefs-misc": "雜",
        "prefs-resetpass": "更符節",
+       "prefs-changeemail": "更郵址",
        "prefs-email": "傳書",
        "prefs-rendering": "觀",
        "saveprefs": "儲",
        "nowatchlist": "無哨",
        "watchlistanontext": "$1以治哨",
        "watchnologin": "未登簿",
+       "addwatch": "增至哨站",
        "addedwatchtext": "\"[[:$1]]\"哨派矣。後有易、議者可見於[[Special:Watchlist|哨站]],且'''粗體'''列於[[Special:RecentChanges|近易]]。",
        "removedwatchtext": "\"[[:$1]]\"[[Special:Watchlist|哨]]撤矣。",
        "watch": "派哨",
        "watchlist-details": "哨上有$1,不含議論。",
        "wlheader-enotif": "*准報信。",
        "wlheader-showupdated": "*易者'''粗體'''。",
+       "wlnote": "近<b>$2</b>時有$1者易。",
        "wlshowlast": "見近$1時、$2天、$3時易",
        "watchlist-options": "哨項",
        "watching": "出陣…",
        "cannotundelete": "無以還檔;或復矣。",
        "undeletedpage": "'''$1還矣'''\n近刪新還,見[[Special:Log/delete|刪還誌]]。",
        "undelete-header": "欲覽近刪,見[[Special:Log/delete|誌刪]]。",
+       "undelete-search-title": "尋刪頁",
        "undelete-search-box": "尋刪",
        "undelete-search-prefix": "見頁始如",
        "undelete-search-submit": "尋",
        "duplicate-defaultsort": "警:預之排鍵「$2」蓋前之排鍵「$1」。",
        "version": "版",
        "version-extensions": "裝展",
+       "version-skins": "皮",
        "version-specialpages": "奇頁",
        "version-parserhooks": "語鈎",
        "version-variables": "變數",
        "version-antispam": "垃圾之防",
-       "version-skins": "皮",
        "version-other": "他",
        "version-mediahandlers": "媒處",
        "version-hooks": "鈎",
        "sqlite-no-fts": "$1 不含全文之尋",
        "revdelete-restricted": "應限至有秩",
        "revdelete-unrestricted": "除限自有秩",
-       "rightsnone": "(凡)"
+       "rightsnone": "(凡)",
+       "searchsuggest-search": "尋"
 }
index 246cdcb..272c889 100644 (file)
@@ -31,6 +31,7 @@
        "tog-watchdefault": "Додавај ги страниците и податотеките што ги уредувам во списокот на набљудувања",
        "tog-watchmoves": "Додавај ги страниците и податотеките што ги преместувам во списокот на набљудувања",
        "tog-watchdeletion": "Додавај ги страниците и податотеките што ги бришам во списокот на набљудувања",
+       "tog-watchrollback": "Додај ги страниците сум ги отповикал во набљудувани",
        "tog-minordefault": "Обележувај ги сите уредувања како ситни по основно",
        "tog-previewontop": "Прикажи го прегледот пред кутијата за уредување",
        "tog-previewonfirst": "Прикажи преглед на првото уредување",
        "preview": "Преглед",
        "showpreview": "Преглед",
        "showdiff": "Прикажи промени",
+       "blankarticle": "<strong>Предупредување:</strong> Страницата што ја создавате е празна.\nАко повторно стиснете на „{{int:savearticle}}“, страницата ќе биде создадена без никаква содржина во неа.",
        "anoneditwarning": "'''Предупредување:''' Не сте најавени.\nВашата IP-адреса ќе биде заведена во историјата на уредување на страницата.",
        "anonpreviewwarning": "''Не сте најавени. Ако ја зачувате, Вашата IP-адреса ќе биде заведена во историјата на уредување на страницата.''",
        "missingsummary": "'''Потсетник:''' Не внесовте опис на измените. Ако притиснете Зачувај повторно, вашите измени ќе се зачуваат без опис.",
        "rev-deleted-event": "(избришан запис на дејство)",
        "rev-deleted-user-contribs": "[отстрането е корисничкото име или IP-адресата - уредувањето нема да се прикаже на списокот на придонеси]",
        "rev-deleted-text-permission": "Оваа преработка страницата е <strong>избришана</strong>.\nМожеби има подробности во [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневникот на бришења].",
+       "rev-suppressed-text-permission": "Оваа преработка на страницата е <strong>притаена</strong>. Повеќе подробности ќе најдете во [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} дневникот на скривања].",
        "rev-deleted-text-unhide": "Оваа преработка на страницата е '''избришана'''.\nПовеќе подробности ќе најдете во [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневникот на бришења].\nСепак можете [$1 да ја погледнете оваа преработка] ако сакате да продолжите.",
        "rev-suppressed-text-unhide": "Оваа преработка на страница е '''притаена'''.\nПовеќе подробности ќе најдете во [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} дневникот на прикривања].\nСепак можете да ја [$1 погледнете оваа преработка] ако сакате да продолжите.",
        "rev-deleted-text-view": "Оваа преработка на страницата е '''избришана'''.\nМожете да ја погледнете; повеќе подробности ќе најдете во [{{fullurl:Special:Log/delete|page={{FULLPAGENAMEE}}}} дневникот на бришења].",
        "revdelete-text-text": "Избришаните преработки сепак се појавуваат во историјата, но делови од нивната содржина ќе бидат недостапни за јавноста.",
        "revdelete-text-file": "Избришаните верзии на податотеките сепак се појавуваат во нејзината историја, но делови од нивната содржина ќе бидат недостапни за јавноста.",
        "logdelete-text": "Избришаните дневнички ставки сепак се појавуваат во дневниците, но делови од нивната содржина ќе бидат недостапни за јавноста.",
-       "revdelete-text-others": "Другите администратори на {{SITENAME}} сепак ќе имаат пристап до скриените содржини и ќе можат да го повратат избришаното преку овој ист посредник, доколку не ставите дополнителни ограничувања.",
+       "revdelete-text-others": "Другите администратори на сепак ќе имаат пристап до скриените содржини и ќе можат да го повратат избришаното преку овој ист посредник, доколку не ставите дополнителни ограничувања.",
        "revdelete-confirm": "Потврдете дека сакате да го направите ова, дека ги сфаќате последиците, и дека тоа го правите во согласност со [[{{MediaWiki:Policy-url}}|правилата]].",
        "revdelete-suppress-text": "Притајувањето се користи '''само''' во следниве случаи:\n* Потенцијално клеветнички информации\n* Несоодветни лични информации\n*: ''домашни адреси и телефонски броеви, матични броеви и тн.''",
        "revdelete-legend": "Постави ограничувања за видливост",
        "right-deletedtext": "Прегледување на избришан текст и промени помеѓу избришани преработки",
        "right-browsearchive": "Пребарување на избришани страници",
        "right-undelete": "Обновување избришана страница",
-       "right-suppressrevision": "Прегледување и враќање на преработки скриени од администратори",
+       "right-suppressrevision": "Прегледување, скривање и откривање на поединечни преработки на страници од било кој корисник",
+       "right-viewsuppressed": "Преглед на праработки скриени од било кој корисник",
        "right-suppressionlog": "Гледање на лични дневници",
        "right-block": "Оневозможување на останати корисници да уредуваат",
        "right-blockemail": "Оневозможување корисници да праќаат е-пошта",
        "recentchanges-legend-heading": "'''Легенда:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (погл. и [[Special:NewPages|списокот на нови страници]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Подолу се промените направени од <strong>$2</strong> наваму (се прикажуваат до <b>$1</b>).",
+       "rcnotefrom": "Подолу {{PLURAL:$5|е прикажана промената|се прикажани промените}} почнувајќи од <strong>$3, $4</strong>  (се прикажуваат до <b>$1</b>).",
        "rclistfrom": "Прикажи нови промени почнувајќи од $3 $2",
        "rcshowhideminor": "$1 ситни промени",
        "rcshowhideminor-show": "Прикажи",
        "nolicense": "Нема",
        "licenses-edit": "Измени лиценцни можности",
        "license-nopreview": "(Прегледот не е достапен)",
-       "upload_source_url": " (важечка, јавно достапна URL-адреса)",
-       "upload_source_file": "(податотека на вашиот компјутер)",
+       "upload_source_url": "(податотеката што се ја одбрале од важечка, јавно достапна URL-адреса)",
+       "upload_source_file": "(податотеката што се ја одбрале од  вашиот сметач)",
        "listfiles-delete": "избриши",
        "listfiles-summary": "Оваа специјална страница ги прикажува сите подигнати податотеки.",
        "listfiles_search_for": "Побарај име на податотека:",
        "watchlist-details": "{{PLURAL:$1|$1 страница|$1 страници}} во вашиот список на набљудувања, не броејќи ги посебно страниците за разговор.",
        "wlheader-enotif": "Известувањето по е-пошта е вклучено.",
        "wlheader-showupdated": "Страниците што се изменети од вашата последна посета се прикажани со '''задебелени''' букви",
-       "wlnote2": "Подолу се прикажани промените направени во {{PLURAL:$1|последниов час|последните <strong>$1</strong> часа}}, согласно $2, $3.",
+       "wlnote": "Подолу {{PLURAL:$1|е прикажана последната промена|се прикажани последните <strong>$1</strong> промени}} во {{PLURAL:$2|последниов час|последниве <strong>$2</strong> часа}}, заклучно со $3, $4 ч.",
        "wlshowlast": "Прикажи ги последните $1 часа, $2 дена, $3",
        "watchlist-options": "Поставки за список на набљудувања",
        "watching": "Набљудување...",
        "import-error-create": "Страницата „$1“ не е увезена бидејќи не ви е дозволено да ја создадете.",
        "import-error-interwiki": "Страницата „$1“ не е увезена бидејќи името е резервирано за надворешни врски (меѓувики).",
        "import-error-special": "Страницата „$1“ не е увезена бидејќи припаѓа на посебен именски простор што не дозволува страници.",
-       "import-error-invalid": "Страницата „$1“ не е увезена бидејќи името ѝ е неважечко.",
+       "import-error-invalid": "Страницата „$1“ не е увезена бидејќи името ѝ е неважечко на ова вики.",
        "import-error-unserialize": "Преработката $2 на страницата „$1“ не може да се отсеријализира. Утврдено е дека користи содржинскиот модел $3 што е серијализиран како $4.",
        "import-error-bad-location": "Преработката $2 што го користи содржинскиот модел $3 не може да се складира во „$1“ на ова вики бидејќи тој модел не е поддржан на таа страница.",
        "import-options-wrong": "{{PLURAL:$2|Погрешна можност|Погрешни можности}}: <nowiki>$1</nowiki>",
        "importlogpage": "Дневник на увезувања",
        "importlogpagetext": "Административно увезување на страници со историја на уредување од други викија.",
        "import-logentry-upload": "увезена [[$1]] со подигање на податотека",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|преработка|преработки}}",
+       "import-logentry-upload-detail": "{{PLURAL:$1|Увезена е една преработка|Увезени се $1 преработки}}",
        "import-logentry-interwiki": "трансвикифиран $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|преработка|преработки}} од $2",
+       "import-logentry-interwiki-detail": "{{PLURAL:$1|Увезена е една преработка|Увезени се $1 преработки}} од $2",
        "javascripttest": "Проба на JavaScript",
        "javascripttest-title": "Вршам $1 проби",
        "javascripttest-pagetext-noframework": "Оваа страница е резервирана за вршење на проби со JavaScript.",
        "autosumm-replace": "Ја заменувам страницата со '$1'",
        "autoredircomment": "Пренасочување кон [[$1]]",
        "autosumm-new": "Создадена страница со: $1",
+       "autosumm-newblank": "Создадена празна страница",
        "size-bytes": "$1 Б",
        "size-kilobytes": "$1 КБ",
        "size-megabytes": "$1 МБ",
index 6c146cf..12dd59b 100644 (file)
@@ -44,6 +44,7 @@
        "tog-watchdefault": "ഞാൻ തിരുത്തുന്ന താളുകളും പ്രമാണങ്ങളും ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ചേർക്കുക",
        "tog-watchmoves": "ഞാൻ തലക്കെട്ടു മാറ്റുന്ന താളുകളും പ്രമാണങ്ങളും ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ചേർക്കുക",
        "tog-watchdeletion": "ഞാൻ നീക്കം ചെയ്യുന്ന താളുകളും പ്രമാണങ്ങളും ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ചേർക്കുക",
+       "tog-watchrollback": "ഞാൻ മുൻപ്രാപനം ചെയ്ത താളുകളും ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ചേർക്കുക",
        "tog-minordefault": "എല്ലാ തിരുത്തുകളും സ്വതേ ചെറുതിരുത്തുകളായി അടയാളപ്പെടുത്തുക",
        "tog-previewontop": "തിരുത്തൽ പെട്ടിക്കു മുകളിൽ പ്രിവ്യൂ കാണിക്കുക",
        "tog-previewonfirst": "ആദ്യത്തെ തിരുത്തിന്റെ പ്രിവ്യൂ കാണിക്കുക",
        "preview": "എങ്ങനെയുണ്ടെന്നു കാണുക",
        "showpreview": "എങ്ങനെയുണ്ടെന്നു കാണുക",
        "showdiff": "മാറ്റങ്ങൾ കാണിക്കുക",
+       "blankarticle": "<strong>മുന്നറിയിപ്പ്:</strong> താങ്കൾ സൃഷ്ടിക്കുന്ന താൾ ശൂന്യമാണ്.\n\"{{int:savearticle}}\" ഒന്നുകൂടി അമർത്തിയാൽ, ഉള്ളടക്കമൊന്നുമില്ലാതെ താൾ സൃഷ്ടിക്കപ്പെടും.",
        "anoneditwarning": "'''മുന്നറിയിപ്പ്:''' താങ്കൾ ലോഗിൻ ചെയ്തിട്ടില്ല. താങ്കളുടെ ഐ.പി. വിലാസം താളിന്റെ തിരുത്തൽ ചരിത്രത്തിൽ ചേർക്കുന്നതാണ്.",
        "anonpreviewwarning": "''താങ്കൾ ലോഗിൻ ചെയ്തിട്ടില്ല. സേവ് ചെയ്യുമ്പോൾ താളിന്റെ തിരുത്തൽ ചരിത്രത്തിൽ താങ്കളുടെ ഐ.പി. വിലാസം ചേർത്തു സൂക്ഷിക്കപ്പെടും.''",
        "missingsummary": "'''ഓർമ്മക്കുറിപ്പ്:''' താങ്കൾ തിരുത്തലിന്റെ ചുരുക്കരൂപം നൽകിയിട്ടില്ല. ''സേവ് ചെയ്യുക'' ബട്ടൺ ഒരുവട്ടം കൂടി അമർത്തിയാൽ താങ്കൾ വരുത്തിയ മാറ്റം കാത്തുസൂക്ഷിക്കുന്നതാണ്.",
        "rev-deleted-event": "(പ്രവൃത്തിയുടെ രേഖ ഒഴിവാക്കിയിരിക്കുന്നു)",
        "rev-deleted-user-contribs": "[ഉപയോക്തൃനാമം അഥവാ ഐ.പി. വിലാസം ഒഴിവാക്കപ്പെട്ടിരിക്കുന്നു - തിരുത്തൽ സേവനങ്ങളിൽ നിന്നും മറച്ചിരിക്കുന്നു]",
        "rev-deleted-text-permission": "താളിന്റെ ഈ നാൾപ്പതിപ്പ് '''മായ്ച്ചിരിക്കുന്നു'''.\nകൂടുതൽ വിവരങ്ങൾ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} മായ്ക്കൽ രേഖയിൽ] കാണാവുന്നതാണ്.",
+       "rev-suppressed-text-permission": "താളിന്റെ ഈ സംശോധനം <strong>ഒതുക്കിയിരിക്കുന്നു</strong>.\nകൂടുതൽ വിവരങ്ങൾ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ഒതുക്കൽ രേഖയിൽ] ഉണ്ട്.",
        "rev-deleted-text-unhide": "താളിന്റെ ഈ നാൾപ്പതിപ്പ് '''മായ്ച്ചിരിക്കുന്നു'''.\nകൂടുതൽ വിവരങ്ങൾ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} മായ്ക്കൽ രേഖയിൽ] ഉണ്ടായിരിക്കും.\nതാങ്കളാഗ്രഹിക്കുന്നെങ്കിൽ ഇപ്പോഴും [$1 ഈ നാൾപ്പതിപ്പ് കാണാവുന്നതാണ്].",
        "rev-suppressed-text-unhide": "താളിന്റെ ഈ സംശോധനം '''ഒതുക്കപ്പെട്ടിരിക്കുന്നു'''.\nകൂടുതൽ വിവരങ്ങൾ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ഒതുക്കൽ രേഖയിൽ] ഉണ്ടാകും.\nതാങ്കൾക്ക് ആവശ്യമെങ്കിൽ ഇപ്പോഴും [$1 ഈ സംശോധനം കാണാൻ] കഴിയുന്നതാണ്.",
        "rev-deleted-text-view": "ഈ താളിന്റെ പതിപ്പുകൾ '''മായ്ച്ചിരിക്കുന്നു'''.\n\nതാങ്കൾക്ക് അവ കാണാവുന്നതാണ്;  കൂടുതൽ വിവരങ്ങൾ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} മായ്ക്കൽ രേഖയിൽ] ഉണ്ട്.",
        "revdelete-text-text": "മായ്ക്കപ്പെട്ട നാൾപ്പതിപ്പുകൾ താളിന്റെ നാൾവഴിയിൽ കാണാവുന്നതായിരിക്കുമെങ്കിലും, അവയുടെ ഉള്ളടക്കത്തിന്റെ ചില ഭാഗങ്ങൾ പൊതുജനങ്ങൾക്ക് ലഭ്യമായിരിക്കണമെന്നില്ല.",
        "revdelete-text-file": "പ്രമാണത്തിന്റെ മായ്ക്കപ്പെട്ട പതിപ്പുകൾ താളിന്റെ നാൾവഴിയിൽ കാണാവുന്നതായിരിക്കുമെങ്കിലും, അവയുടെ ഉള്ളടക്കത്തിന്റെ ചില ഭാഗങ്ങൾ പൊതുജനങ്ങൾക്ക് ലഭ്യമായിരിക്കണമെന്നില്ല.",
        "logdelete-text": "മായ്ക്കപ്പെട്ട പ്രവൃത്തികൾ പ്രവർത്തന രേഖകളിൽ കാണാവുന്നതായിരിക്കുമെങ്കിലും, അവയുടെ ഉള്ളടക്കത്തിന്റെ ചില ഭാഗങ്ങൾ പൊതുജനങ്ങൾക്ക് ലഭ്യമായിരിക്കണമെന്നില്ല.",
-       "revdelete-text-others": "{{SITENAME}} സംരംഭത്തിലെ മറ്റ് കാര്യനിർവ്വാഹകർക്ക് മറയ്ക്കപ്പെട്ട ഉള്ളടക്കം ഇപ്പോഴും എടുക്കാവുന്നതും ആവശ്യമെങ്കിൽ ഇതേ സമ്പർക്കമുഖം ഉപയോഗിച്ച് പുനഃസ്ഥാപിക്കാനോ അല്ലെങ്കിൽ കൂടുതൽ നിബന്ധനകൾ ചേർക്കാനോ കഴിയുന്നതുമാണ്.",
+       "revdelete-text-others": "കൂടുതൽ നിബന്ധനകൾ ചേർക്കാത്ത പക്ഷം, മറ്റ് കാര്യനിർവ്വാഹകർക്ക് മറയ്ക്കപ്പെട്ട ഉള്ളടക്കം എടുക്കാനും പുനഃസ്ഥാപിക്കാനും കഴിയുന്നതാണ്.",
        "revdelete-confirm": "ഇതിന്റെ അനന്തരഫലങ്ങളെക്കുറിച്ചറിയാമെന്നും, [[{{MediaWiki:Policy-url}}|നയങ്ങൾ]] പാലിച്ചാണ് താങ്കളിത് ചെയ്യുന്നതെന്നും ഉറപ്പാക്കുക.",
        "revdelete-suppress-text": "താഴെ പറയുന്ന സാഹചര്യങ്ങളിൽ '''മാത്രമേ''' ഒതുക്കൽ ഉപയോഗിക്കാവൂ:\n* അപകീർത്തികരമായ വിവരങ്ങൾ അടങ്ങിയവ\n* അനുയോജ്യമല്ലാത്ത വ്യക്തി വിവരങ്ങൾ\n*: ''വീട്ടുവിലാസങ്ങൾ, ടെലിഫോൺ നമ്പറുകൾ, സാമൂഹിക സുരക്ഷാ നമ്പരുകൾ, തുടങ്ങിയവ.''",
        "revdelete-legend": "നാൾപ്പതിപ്പിന്റെ ദർശനീയത സജ്ജീകരിക്കുക",
        "right-deletedtext": "മായ്ക്കപ്പെട്ട എഴുത്തും താളിന്റെ മായ്ക്കപ്പെട്ട പതിപ്പുകൾ തമ്മിലുള്ള വ്യത്യാസവും കാണുക",
        "right-browsearchive": "നീക്കം ചെയ്യപ്പെട്ട താളുകളിൽ തിരയുക",
        "right-undelete": "താൾ പുനഃസ്ഥാപിക്കുക",
-       "right-suppressrevision": "കാര്യനിർവാഹകരിൽ നിന്നും മറയ്ക്കപ്പെട്ട നാൾപ്പതിപ്പുകൾ സംശോധനം ചെയ്യുക, പുനഃസ്ഥാപിക്കുക",
+       "right-suppressrevision": "മറ്റുപയോക്താക്കൾക്കായി താളുകളുടെ നാൾപ്പതിപ്പുകൾ കാണാൻ കഴിയുന്നതാക്കുക, മറയ്ക്കുക, മറയ്ക്കൽ മാാറ്റുക",
+       "right-viewsuppressed": "മറ്റുപയോക്താക്കളിൽ നിന്നും മറയ്ക്കപ്പെട്ട നാൾപ്പതിപ്പുകൾ കാണുക",
        "right-suppressionlog": "പരസ്യമല്ലാത്ത രേഖകൾ കാണുക",
        "right-block": "മറ്റുള്ള ഉപയോക്താക്കളെ മാറ്റിയെഴുതുന്നതിൽനിന്നും തടയുക",
        "right-blockemail": "ഇമെയിൽ അയക്കുന്നതിൽ നിന്നും ഉപയോക്താവിനെ തടയുക",
        "recentchanges-label-plusminus": "താളിന്റെ വലിപ്പം ഇത്രയും ബൈറ്റുകൾ മാറിയിരിക്കുന്നു",
        "recentchanges-legend-heading": "'''സൂചന:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|പുതിയ താളുകളുടെ പട്ടികയും]] കാണുക)",
-       "rcnotefrom": "<strong>$2</strong> മുതലുള്ള മാറ്റങ്ങൾ (<strong>$1</strong> എണ്ണം വരെ കാണാം).",
+       "rcnotefrom": "<strong>$3, $4</strong> മുതലുള്ള {{PLURAL:$5|മാറ്റം|മാറ്റങ്ങൾ}} ആണ് താഴെയുള്ളത്  (<strong>$1</strong> എണ്ണം വരെ കൊടുക്കുന്നതാണ്).",
        "rclistfrom": "$3 $2 മുതലുള്ള മാറ്റങ്ങൾ പ്രദർശിപ്പിക്കുക",
        "rcshowhideminor": "ചെറുതിരുത്തലുകൾ $1",
        "rcshowhideminor-show": "പ്രദർശിപ്പിക്കുക",
        "license": "പകർപ്പവകാശ വിവരങ്ങൾ:",
        "license-header": "അനുമതി",
        "nolicense": "ഒന്നും തിരഞ്ഞെടുത്തിട്ടില്ല",
+       "licenses-edit": "ഉപയോഗാനുമതി ഐച്ഛികങ്ങൾ തിരുത്തുക",
        "license-nopreview": "(പ്രിവ്യൂ ലഭ്യമല്ല)",
-       "upload_source_url": "(സാധàµ\81വായ, à´\86ർà´\95àµ\8dà´\95àµ\81à´\82 à´\89പയàµ\8bà´\97à´¿à´\95àµ\8dà´\95ാവàµ\81à´¨àµ\8dà´¨ à´¯àµ\82.à´\86ർ.à´\8eൽ.)",
-       "upload_source_file": "(താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´\95à´®àµ\8dà´ªàµ\8dà´¯àµ\82à´\9fàµ\8dà´\9fറിലàµ\81à´³àµ\8dà´³ à´\92à´°àµ\81 à´ªàµ\8dരമാണà´\82)",
+       "upload_source_url": "(താà´\99àµ\8dà´\95ൾ à´¤à´¿à´°à´\9eàµ\8dà´\9eàµ\86à´\9fàµ\81à´¤àµ\8dà´¤ à´ªàµ\8dരമാണà´\82 à´¸à´¾à´§àµ\81വായ, à´\86ർà´\95àµ\8dà´\95àµ\81à´\82 à´\89പയàµ\8bà´\97à´¿à´\95àµ\8dà´\95ാവàµ\81à´¨àµ\8dà´¨ à´¯àµ\82.à´\86ർ.à´\8eലിൽ à´¨à´¿à´¨àµ\8dനാണàµ\8d)",
+       "upload_source_file": "(താà´\99àµ\8dà´\95ൾ à´¤à´¿à´°à´\9eàµ\8dà´\9eàµ\86à´\9fàµ\81à´¤àµ\8dതതàµ\8d à´¤à´¾à´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´\95à´®àµ\8dà´ªàµ\8dà´¯àµ\82à´\9fàµ\8dà´\9fറിലàµ\81à´³àµ\8dà´³ à´ªàµ\8dരമാണമാണàµ\8d)",
        "listfiles-delete": "മായ്ക്കുക",
        "listfiles-summary": "അപ്‌ലോഡ് ചെയ്തിട്ടുള്ള എല്ലാ പ്രമാണങ്ങളും ഈ പ്രത്യേക താളിൽ കാണാവുന്നതാണ്.",
        "listfiles_search_for": "മീഡിയ പ്രമാണം തിരയുക:",
        "wantedpages-badtitle": "ഫലങ്ങളുടെ ഗണത്തിൽ അസാധുവായ തലക്കെട്ട്: $1",
        "wantedfiles": "ആവശ്യമുള്ള പ്രമാണങ്ങൾ",
        "wantedfiletext-cat": "താഴെക്കൊടുത്തിരിക്കുന്ന പ്രമാണങ്ങൾ ഉപയോഗിച്ചിട്ടുണ്ടെങ്കിലും നിലവിലില്ല. ബാഹ്യ റെപ്പോസിറ്ററികളിൽ നിന്നുള്ള പ്രമാണങ്ങൾ നിലവിലുണ്ടെങ്കിലും പട്ടികയിൽ ഉൾപ്പെട്ടിട്ടുണ്ടാവാം. അത്തരത്തിൽ തെറ്റായി ഉൾപ്പെടുത്തിയിരിക്കുന്നവ <del>വെട്ടിക്കളയുക</del>. കൂടുതലായി, നിലവിലില്ലാത്ത പ്രമാണങ്ങൾ ഉൾപ്പെടുത്തിയിട്ടുള്ള താളുകൾ കാണാൻ [[:$1]] സന്ദർശിക്കുക.",
+       "wantedfiletext-cat-noforeign": "താഴെക്കൊടുക്കുന്ന പ്രമാണങ്ങൾ നിലവിലില്ലെങ്കിലും ഉപയോഗിച്ചിട്ടുണ്ട്. കൂടുതലായി നിലവിലില്ലാത്ത എന്നാൽ ഉപയോഗിച്ചിട്ടുള്ള പ്രമാണങ്ങൾ [[:$1]] എന്ന താളിൽ കൊടുത്തിട്ടുണ്ട്.",
        "wantedfiletext-nocat": "താഴെക്കൊടുത്തിരിക്കുന്ന പ്രമാണങ്ങൾ ഉപയോഗിച്ചിട്ടുണ്ടെങ്കിലും നിലവിലില്ല. ബാഹ്യ റെപ്പോസിറ്ററികളിൽ നിന്നുള്ള പ്രമാണങ്ങൾ നിലവിലുണ്ടെങ്കിലും പട്ടികയിൽ ഉൾപ്പെട്ടിട്ടുണ്ടാവാം. അത്തരത്തിൽ തെറ്റായി ഉൾപ്പെടുത്തിയിരിക്കുന്നവ <del>വെട്ടിക്കളയുക</del>.",
+       "wantedfiletext-nocat-noforeign": "താഴെക്കൊടുത്തിരിക്കുന്ന പ്രമാണങ്ങൾ ഉപയോഗിച്ചിട്ടുണ്ടെങ്കിലും നിലവിലില്ലാത്തവയാണ്.",
        "wantedtemplates": "അവശ്യ ഫലകങ്ങൾ",
        "mostlinked": "ഏറ്റവുമധികം കണ്ണികളാൽ ചേർത്തിരിക്കുന്ന താളുകൾ",
        "mostlinkedcategories": "ഏറ്റവുമധികം താളുകൾ ചേർത്തിട്ടുള്ള വർഗ്ഗങ്ങൾ",
        "watchlist-details": "സം‌വാദത്താളുകൾ ഉൾപ്പെടുത്താതെ {{PLURAL:$1|ഒരു താൾ|$1 താളുകൾ}} താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയിലുണ്ട്.",
        "wlheader-enotif": "ഇമെയിൽ അറിയിപ്പുകൾ സജ്ജമാക്കിയിരിക്കുന്നു.",
        "wlheader-showupdated": "താങ്കളുടെ അവസാന സന്ദർശനത്തിനു ശേഷം മാറ്റം വന്ന താളുകൾ  '''കടുപ്പിച്ച്''' കാണിച്ചിരിക്കുന്നു",
-       "wlnote2": "$2, $3-നു കഴിഞ്ഞ {{PLURAL:$1|ഒരു മണിക്കൂറിലെ|<strong>$1</strong> മണിക്കൂറുകളിലെ}} മാറ്റങ്ങൾ താഴെക്കൊടുത്തിരിക്കുന്നു.",
+       "wlnote": "$3, $4-നു കഴിഞ്ഞ {{PLURAL:$2|മണിക്കൂറിൽ|<strong>$2</strong> മണിക്കൂറിൽ}} നടന്ന {{PLURAL:$1|ഒരു പുതിയ മാറ്റം|<strong>$1</strong> പുതിയ മാറ്റങ്ങൾ}} താഴെ പ്രദർശിപ്പിച്ചിരിക്കുന്നു.",
        "wlshowlast": "ഒടുവിലത്തെ $1 മണിക്കൂറുകൾ $2 ദിനങ്ങൾ, $3 പ്രദർശിപ്പിക്കുക",
        "watchlist-options": "ശ്രദ്ധിക്കുന്ന താളുകളുടെ സജ്ജീകരണങ്ങൾ",
        "watching": "ശ്രദ്ധിക്കുന്നു...",
        "import-error-create": "\"$1\" എന്ന താൾ സൃഷ്ടിക്കാനുള്ള അനുമതി താങ്കൾക്ക് ഇല്ലാത്തതിനാൽ അത് ഇറക്കുമതി ചെയ്തില്ല.",
        "import-error-interwiki": "ബാഹ്യ കണ്ണിചേർക്കലിനു (അന്തർവിക്കി) കരുതിവെച്ചിരിക്കുന്ന പേര് ആയതിനാൽ, \"$1\" എന്ന താൾ ഇറക്കുമതി ചെയ്തില്ല.",
        "import-error-special": "താളുകൾ അനുവദിക്കാത്ത പ്രത്യേക നാമമേഖലയിൽ പെടുന്നതായതിനാൽ \"$1\" എന്ന താൾ ഇറക്കുമതി ചെയ്തില്ല.",
-       "import-error-invalid": "à´ªàµ\87à´°àµ\8d à´\85സാധàµ\81വായതിനാൽ \"$1\" à´\8eà´¨àµ\8dà´¨ à´¤à´¾àµ¾ à´\87à´±à´\95àµ\8dà´\95àµ\81മതി à´\9aàµ\86à´¯àµ\8dà´¯ില്ല.",
+       "import-error-invalid": "à´\87à´±à´\95àµ\8dà´\95àµ\81മതി à´\9aàµ\86à´¯àµ\8dയപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fാൽ à´ªàµ\87à´°àµ\8d à´\88 à´µà´¿à´\95àµ\8dà´\95ിയിൽ à´\85സാധàµ\81വാà´\95àµ\81à´®àµ\86à´¨àµ\8dനതിനാൽ \"$1\" à´\8eà´¨àµ\8dà´¨ à´¤à´¾àµ¾ à´\87à´±à´\95àµ\8dà´\95àµ\81മതി à´\9aàµ\86à´¯àµ\8dà´¤ില്ല.",
        "import-options-wrong": "തെറ്റായ {{PLURAL:$2|ഐച്ഛികം|ഐച്ഛികങ്ങൾ}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "നൽകിയ മൂലതാൾ അസാധുവാണ്.",
        "import-rootpage-nosubpage": "മൂലതാളിന്റെ നാമമേഖലയായ \"$1\" ഉപതാളുകൾ അനുവദിക്കുന്നില്ല.",
        "importlogpage": "ഇറക്കുമതി പ്രവർത്തനരേഖ",
        "importlogpagetext": "മറ്റു വിക്കികളിൽ നിന്ന് താളുകൾ നാൾവഴിയടക്കം എടുക്കുന്ന കാര്യനിർവാഹക ഇറക്കുമതി.",
        "import-logentry-upload": "പ്രമാണ അപ്‌‌ലോഡ് വഴി [[$1]] ഇറക്കുമതി ചെയ്തിരിക്കുന്നു",
-       "import-logentry-upload-detail": "{{PLURAL:$1|ഒരു പതിപ്പ്|$1 പതിപ്പുകൾ}}",
+       "import-logentry-upload-detail": "{{PLURAL:$1|ഒരു പതിപ്പ്|$1 പതിപ്പുകൾ}} ഇറക്കുമതി ചെയ്തു",
        "import-logentry-interwiki": "$1 അന്തർവിക്കി ഇറക്കുമതി ചെയ്തു",
-       "import-logentry-interwiki-detail": "$2 എന്നതിൽ നിന്ന് {{PLURAL:$1|ഒരു പതിപ്പ്|$1 പതിപ്പുകൾ}}",
+       "import-logentry-interwiki-detail": "$2 എന്നതിൽ നിന്ന് {{PLURAL:$1|ഒരു പതിപ്പ്|$1 പതിപ്പുകൾ}} ഇറക്കുമതി ചെയ്തു",
        "javascripttest": "ജാവാസ്ക്രിപ്റ്റ് പരീക്ഷണം",
        "javascripttest-title": "$1 പരീക്ഷണങ്ങൾ നടക്കുന്നുണ്ട്",
        "javascripttest-pagetext-noframework": "ഈ താൾ ജാവാസ്ക്രിപ്റ്റ് പരീക്ഷണങ്ങൾ നടത്താനായി മാറ്റിവെച്ചിരിക്കുന്നതാണ്.",
        "autosumm-replace": "താളിലെ വിവരങ്ങൾ $1 എന്നാക്കിയിരിക്കുന്നു",
        "autoredircomment": "[[$1]] എന്ന താളിലേക്ക് തിരിച്ചുവിടുന്നു",
        "autosumm-new": "'$1' താൾ സൃഷ്ടിച്ചിരിക്കുന്നു",
+       "autosumm-newblank": "ശൂന്യമായ താൾ സൃഷ്ടിച്ചു",
        "size-bytes": "$1 ബൈ",
        "size-kilobytes": "$1 കെ.ബി.",
        "size-megabytes": "$1 എം.ബി.",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|സംവാദം]])",
        "unknown_extension_tag": "അജ്ഞാതമായ അനുബന്ധ റ്റാഗ് \"$1\"",
        "duplicate-defaultsort": "'''മുന്നറിയിപ്പ്:''' ക്രമപ്പെടുത്താനുള്ള ചാവിയായ \"$2\" മുമ്പ് ക്രമപ്പെടുത്താനുള്ള ചാവിയായിരുന്ന \"$1\" എന്നതിനെ അതിലംഘിക്കുന്നു.",
+       "duplicate-displaytitle": "<strong>മുന്നറിയിപ്പ്:</strong> പ്രദർശിപ്പിക്കുന്ന തലക്കെട്ട് \"$2\" മുമ്പ് പ്രദർശിപ്പിച്ചിരുന്ന തലക്കെട്ട് \"$1\" എന്നതിനെ അതിലംഘിക്കുന്നു.",
        "version": "പതിപ്പ്",
        "version-extensions": "ഇൻസ്റ്റോൾ ചെയ്തിട്ടുള്ള അനുബന്ധങ്ങൾ",
        "version-skins": "ഇൻസ്റ്റോൾ ചെയ്തിട്ടുള്ള ദൃശ്യരൂപങ്ങൾ",
index 4953184..79ea47a 100644 (file)
        "talkpagelinktext": "Perbincangan",
        "specialpage": "Laman khas",
        "personaltools": "Alatan peribadi",
-       "postcomment": "Bahagian baru",
        "articlepage": "Lihat laman kandungan",
        "talk": "Perbincangan",
        "views": "Rupa",
        "externaldberror": "Berlaku ralat pangkalan data bagi pengesahan luar atau anda tidak dibenarkan mengemaskinikan akaun luar anda.",
        "login": "Log masuk",
        "nav-login-createaccount": "Log masuk / buka akaun",
-       "loginprompt": "Anda mesti membenarkan kuki untuk log masuk ke dalam {{SITENAME}}.",
        "userlogin": "Log masuk / buka akaun",
        "userloginnocreate": "Log masuk",
        "logout": "Log keluar",
        "preview": "Pralihat",
        "showpreview": "Paparkan pralihat",
        "showdiff": "Lihat perubahan",
+       "blankarticle": "<strong>Amaran:</strong> Laman yang anda sedang menciptakan adalah kosong.\nJika akan menklik \"{{int:savearticle}}\" sekali lagi, laman ini akan diciptakan tanpa sebarang kandungan.",
        "anoneditwarning": "'''Amaran:''' Anda tidak log masuk. Alamat IP anda akan direkodkan dalam sejarah suntingan laman ini.",
        "anonpreviewwarning": "''Anda belum log masuk. Jika anda menyimpan laman ini, alamat IP anda akan direkodkan dalam sejarah penyuntingan laman ini.''",
        "missingsummary": "'''Peringatan:''' Anda tidak menyatakan ringkasan suntingan. Klik '''Simpan''' sekali lagi untuk menyimpan suntingan ini tanpa ringkasan.",
        "currentrev": "Semakan semasa",
        "currentrev-asof": "Semakan semasa pada $1",
        "revisionasof": "Semakan pada $1",
-       "revision-info": "Semakan pada $1 oleh $2",
+       "revision-info": "Semakan $3 pada $1 oleh {{GENDER:$6|$2}}$7",
        "previousrevision": "←Semakan sebelumnya",
        "nextrevision": "Semakan berikutnya→",
        "currentrevisionlink": "Semakan semasa",
        "rev-deleted-event": "(entri dibuang)",
        "rev-deleted-user-contribs": "[nama pengguna atau alamat IP dibuang - suntingan disembunyikan daripada sumbangan]",
        "rev-deleted-text-permission": "Semakan laman ini telah '''dihapuskan'''.\nPerinciannya mungkin ada di dalam [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].",
+       "rev-suppressed-text-permission": "Semakan bagi laman ini telah <strong>diselindungkan</strong>.\nButiran boleh didapati dalam [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log penyelindungan].",
        "rev-deleted-text-unhide": "Semakan laman ini telah '''dihapuskan'''.\nButiran lanjut boleh didapati dalam [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].\nAnda masih boleh [$1 melihat semakan ini] jika anda ingin teruskan.",
        "rev-suppressed-text-unhide": "Semakan laman ini telah '''diselindungkan'''.\nButiran lanjut boleh didapati dalam [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log penyelindungan].\nAnda masih boleh [$1 melihat semakan ini] jika anda ingin.",
        "rev-deleted-text-view": "Semakan laman ini telah '''dihapuskan'''.\nAnda boleh melihatnya; butiran lanjut boleh didapati dalam [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].",
        "revdelete-text-text": "Semakan-semakan yang terhapus masih akan terdapat dalam sejarah halaman, tetapi sesetengah isi kandungannya tidak akan boleh diakses oleh orang awam.",
        "revdelete-text-file": "Versi-versi yang terhapus masih akan terdapat dalam sejarah fail, tetapi sesetengah isi kandungannya tidak akan boleh diakses oleh orang awam.",
        "logdelete-text": "Peristiwa-peristiwa log yang terhapus masih akan terdapat dalam log, tetapi sesetengah isi kandungannya tidak akan boleh diakses oleh orang awam.",
-       "revdelete-text-others": "Penyelia-penyelia yang lain di {{SITENAME}} masih akan dapat mengakses dan memulihkan kandungan yang tersembunyi menerusi antaramuka yang sama ini, melainkan ditetapkannya sekatan tambahan.",
+       "revdelete-text-others": "Penyelia-penyelia yang lain masih dapat memasuki dan menyahhapuskannya, kecuali jika batasan tambahan telah ditetapkan.",
        "revdelete-confirm": "Sila sahkan bahawa anda bertujuan melakukan ini, bahawa anda faham akibatnya, dan anda melakukannya menurut [[{{MediaWiki:Policy-url}}| polisi]].",
        "revdelete-suppress-text": "Sekatan seharusnya digunakan '''hanya''' untuk kes-kes berikut:\n* maklumat yang mungkin berunsur fitnah\n* maklumat peribadi tidak sesuai\n*: ''alamat rumah dan nombor telefon, nombor keselamatan sosial, dsbg.''",
        "revdelete-legend": "Tetapkan batasan:",
        "mergehistory-empty": "Tiada semakan yang boleh digabungkan",
        "mergehistory-success": "$3 semakan bagi [[:$1]] telah digabungkan ke dalam [[:$2]].",
        "mergehistory-fail": "Gagal melaksanakan penggabungan sejarah, sila semak semula laman tersebut dan parameter waktu.",
+       "mergehistory-fail-toobig": "Tidak dapat melakukan gabungan sejarah sebab lebih daripada had $1 semakan perlu dipindahkan.",
        "mergehistory-no-source": "Laman sumber $1 tidak wujud.",
        "mergehistory-no-destination": "Laman destinasi $1 tidak wujud.",
        "mergehistory-invalid-source": "Laman sumber mestilah merupakan tajuk yang sah.",
        "powersearch-togglelabel": "Pilih:",
        "powersearch-toggleall": "Semua",
        "powersearch-togglenone": "Tiada",
+       "powersearch-remember": "Ingatkan pilihan untuk carian pada masa depan",
        "search-external": "Carian luar",
        "searchdisabled": "Ciri pencarian dalam {{SITENAME}} dimatikan. Anda boleh mencari melalui Google. Sila ambil perhatian bahawa indeks dalam Google mungkin bukan yang terkini.",
        "search-error": "Berlakunya ralat ketika mencari: $1",
        "right-move": "Memindahkan laman",
        "right-move-subpages": "Memindahkan laman berserta sublaman",
        "right-move-rootuserpages": "Memindahkan laman induk pengguna",
+       "right-move-categorypages": "Pindah laman kategori",
        "right-movefile": "Memindahkan fail",
        "right-suppressredirect": "Memindahkan sesebuah laman tanpa mencipta lencongan",
        "right-upload": "Memuat naik fail",
        "right-deletedtext": "Melihat teks yang telah dihapuskan dan perubahan antara semakan-semakan yang telah dihapuskan",
        "right-browsearchive": "Mencari laman-laman yang telah dihapuskan",
        "right-undelete": "Mengembalikan laman yang telah dihapuskan (nyahhapus)",
-       "right-suppressrevision": "Memeriksa dan memulihkan semakan yang terselindung daripada pentadbir",
+       "right-suppressrevision": "Lihat, sembunyi dan nyahsembunyikan semakan-semakan laman yang khusus dari sesiapa pengguna",
+       "right-viewsuppressed": "Lihat semakan-semakan yang disembunyikan daripada sesiapa pengguna",
        "right-suppressionlog": "Melihat log rahsia",
        "right-block": "Menyekat pengguna lain daripada menyunting",
        "right-blockemail": "Menyekat pengguna lain daripada mengirim e-mel",
        "action-move": "memindahkan laman ini",
        "action-move-subpages": "memindahkan laman ini dan sublaman-sublamannya",
        "action-move-rootuserpages": "memindahkan laman induk pengguna",
+       "action-move-categorypages": "memindah laman-laman kategori",
        "action-movefile": "pindah fail ini",
        "action-upload": "memuat naik fail ini",
        "action-reupload": "menulis ganti fail ini",
        "recentchanges-label-plusminus": "Saiz laman telah berubah sebanyak jumlah bait ini",
        "recentchanges-legend-heading": "'''Petunjuk:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lihat juga [[Special:NewPages|senarai laman baru]])",
-       "rcnotefrom": "Yang berikut adalah semua suntingan sejak <b>$2</b> (yang dipaparkan sehingga <b>$1</b>).",
+       "rcnotefrom": "Yang berikut adalah {{PLURAL:$5|suntingan|suntingan-suntingan}} sejak <strong>$3, $4</strong> (selebihi <strong>$1</strong> dipaparkan).",
        "rclistfrom": "Paparkan perubahan sejak $3 $2",
        "rcshowhideminor": "$1 suntingan kecil",
        "rcshowhideminor-show": "Paparkan",
        "largefileserver": "Fail ini telah melebihi had muat naik pelayan web.",
        "emptyfile": "Fail yang dimuat naik adalah kosong. Ini mungkin disebabkan oleh kesilapan menaip nama fail. Sila pastikan bahawa anda betul-betul mahu memuat naik fail ini.",
        "windows-nonascii-filename": "Wiki ini tidak menyokong nama fail yang mengandungi aksara khas.",
-       "fileexists": "Sebuah fail dengan nama ini telah pun wujud.\nSila semak <strong>[[:$1]]</strong> sekiranya anda tidak pasti bahawa anda mahu menukarnya atau tidak.\n[[$1|thumb]]",
+       "fileexists": "Sebuah fail dengan nama ini sudah wujud. Sila semak <strong>[[:$1]]</strong> sekiranya {{GENDER:|anda}} tidak pasti jika anda mahu menukarnya.\n[[$1|thumb]]",
        "filepageexists": "Laman penerangan untuk fail ini telah pun dicipta di <strong>[[:$1]]</strong>, tetapi tiada fail dengan nama ini wujud.\nRingkasan yang anda masukkan tidak akan muncul di laman penerangan tersebut. Untuk memastikannya muncul, anda perlu menyuntingnya secara manual.\n[[$1|thumb]]",
-       "fileexists-extension": "Sebuah fail dengan nama yang sama telah pun wujud: [[$2|thumb]]\n* Nama fail yang dimuat naik: <strong>[[:$1]]</strong>\n* Nama fail yang sedia ada: <strong>[[:$2]]</strong>\nSila pilih nama lain.",
+       "fileexists-extension": "Sebuah fail dengan nama yang serupa sudah wujud: [[$2|thumb]]\n* Nama fail yang hendak dimuat naik: <strong>[[:$1]]</strong>\n* Nama fail yang sudah sedia ada: <strong>[[:$2]]</strong>\nAdakah anda mungkin mahu menggunakan nama yang lebih tersendiri?",
        "fileexists-thumbnail-yes": "Fail ini kelihatan seperti sebuah imej yang telah dikecilkan ''(gambar kenit)''. [[$1|thumb]]\nSila semak fail <strong>[[:$1]]</strong>.\nJika fail yang disemak itu adalah sama dengan yang saiz asal, maka anda tidak perlu memuat naik gambar kenit tambahan.",
        "file-thumbnail-no": "Nama fail ini bermula dengan <strong>$1</strong>.\nBarangkali ia adalah sebuah imej yang telah dikecilkan ''(gambar kenit)''.\nJika anda memiliki imej ini dalam leraian penuh, sila muat naik fail tersebut. Jika tidak, sila tukar nama fail ini.",
        "fileexists-forbidden": "Sebuah fail dengan nama ini telah pun wujud, dan tidak boleh ditulis ganti. Jika anda masih mahu memuat naik fail ini, sila berundur dan muat naik fail ini dengan nama lain. [[File:$1|thumb|center|$1]]",
        "license": "Lesen:",
        "license-header": "Perlesenan",
        "nolicense": "Tidak dipilih",
+       "licenses-edit": "Ubah tetapan lesen",
        "license-nopreview": "(Tiada pralihat)",
        "upload_source_url": " (URL yang boleh diakses oleh orang awam)",
        "upload_source_file": " (fail dalam komputer anda)",
+       "listfiles-delete": "hapus",
        "listfiles-summary": "Laman khas ini memaparkan semua fail yang telah dimuat naik.",
        "listfiles_search_for": "Cari nama imej:",
        "imgfile": "fail",
        "watchlist-details": "$1 laman dipantau ,tidak termasuk laman perbincangan.",
        "wlheader-enotif": "Pemberitahuan melalui e-mel dibolehkan.",
        "wlheader-showupdated": "Laman-laman yang telah diubah sejak kunjungan terakhir anda dipaparkan dalam '''teks tebal'''.",
-       "wlnote2": "Yang berikut adalah perubahan dalam {{PLURAL:$1|sejam|<strong>$1</strong> jam}} yang lepas, setakat $2, $3.",
+       "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",
        "watching": "Memantau...",
        "movenotallowedfile": "Anda tidak mempunyai keizinan untuk memindahkan fail.",
        "cant-move-user-page": "Anda tidak mempunyai keizinan untuk memindahkan laman pengguna (tidak termasuk sublaman-sublamannya).",
        "cant-move-to-user-page": "Anda tidak mempunyai keizinan untuk memindahkan sesebuah laman ke mana-mana laman pengguna (kecuali sebagai sublamannya sahaja).",
+       "cant-move-category-page": "Anda tidak mempunyai kebenaran untuk memindah laman-laman kategori.",
+       "cant-move-to-category-page": "Anda tidak mempunyai kebenaran untuk memindah sebuah laman ke sebuah laman kategori.",
        "newtitle": "Ke tajuk baru:",
        "move-watch": "Pantau laman ini",
        "movepagebtn": "Pindahkan laman",
        "duplicate-defaultsort": "'''Amaran''': Kunci susunan asali \"$2\" membatalkan kunci susunan asali \"$1\" yang sebelumnya.",
        "version": "Versi",
        "version-extensions": "Penyambung yang dipasang",
+       "version-skins": "Rupa",
        "version-specialpages": "Laman khas",
        "version-parserhooks": "Penyangkuk penghurai",
        "version-variables": "Pemboleh ubah",
        "version-antispam": "Pencegahan spam",
-       "version-skins": "Rupa",
        "version-other": "Lain-lain",
        "version-mediahandlers": "Pengelola media",
        "version-hooks": "Penyangkuk",
index 48493dc..edff6ba 100644 (file)
        "jumptonavigation": "navigazzjoni",
        "jumptosearch": "fittex",
        "view-pool-error": "Jiddispjaċina, imma fil-mument is-servers jinsabu mgħobbija ż-żejjed.\nĦafna utenti qegħdin jippruvaw jaraw din il-paġna.\nJekk jogħġbok stenna ftit qabel ma terġa' tipprova tuża' din il-paġna.\n\n$1",
+       "generic-pool-error": "Jiddispjaċina, imma bħalissa is-servers jinsabu mgħobbija ż-żejjed.\nĦafna utenti qegħdin jippruvaw jaraw din ir-riżorsa.\nJekk jogħġbok stenna ftit qabel ma terġa' tipprova ttella' din ir-riżorsa.",
+       "pool-timeout": "Il-ħin tal-iskadenza qiegħed jistenna l-iżblokk.",
        "pool-queuefull": "Il-kju tal-''pool'' hi mimlija",
        "pool-errorunknown": "Problema mhux magħrufa",
+       "pool-servererror": "Is-servizz kontra l-pool mhux disponibbli ($1).",
        "aboutsite": "Dwar {{SITENAME}}",
        "aboutpage": "Project:Dwar",
-       "copyright": "Kontenut aċċessibli taħt $1.",
+       "copyright": "Il-kontenut huwa disponibbli taħt il-liċenzja $1 sakemm mhux indikat mod ieħor.",
        "copyrightpage": "{{ns:project}}:Copyright",
        "currentevents": "Ġrajjiet kurrenti",
        "currentevents-url": "Project:Ġrajjiet kurrenti",
        "ok": "OK",
        "retrievedfrom": "Miġjub minn \"$1\"",
        "youhavenewmessages": "Għandek $1 ($2).",
+       "youhavenewmessagesfromusers": "Għandek $1 minn {{PLURAL:$3|utent ieħor|$3utenti oħra}} ($2).",
        "youhavenewmessagesmanyusers": "Għandek $1 mingħand ħafna utenti ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|messaġġ ġdid|messaġġi ġodda}}",
-       "newmessagesdifflinkplural": "l-aħħar {{PLURAL:$1|bidla|bidliet}}",
+       "newmessageslinkplural": "{{PLURAL:$1|messaġġ ġdid|999=messaġġi ġodda}}",
+       "newmessagesdifflinkplural": "l-aħħar {{PLURAL:$1|bidla|999=bidliet}}",
        "youhavenewmessagesmulti": "Għandek messaġġi ġodda fuq $1",
        "editsection": "editja",
        "editold": "editja",
        "nospecialpagetext": "<strong>Inti għamilt rikjesta għal paġna speċjali invalida.</strong>\n\nLista ta' paġni speċjali validi tinsab hawn [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Problema",
        "databaseerror": "Problema fid-database",
+       "databaseerror-text": "Sar żball f'kunsltazzjoni tal-bażi tad-dejta. Dan jista' jindika difett fis-softwer.",
+       "databaseerror-textcl": "Sar żball f'kunsultazzjoni tal-bażi tad-dejta.",
+       "databaseerror-query": "Kunsultazzjoni $1",
+       "databaseerror-function": "Funzjoni:$1",
+       "databaseerror-error": "Żball:$1",
        "laggedslavemode": "Twissija: Il-Paġna jista' ma jkollhiex l-affarijiet aġġornati.",
        "readonly": "Database magħluq",
        "enterlockreason": "Daħħal raġuni għala qiegħed tagħlqu, inkludi l-istima ta' meta l-għeluq se tieħu effett",
        "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.\nJista' jkun li diġà ġie mħassar minn xi ħaddieħor.",
        "cannotdelete-title": "Il-paġna \"$1\" ma setgħetx titħassar",
+       "delete-hook-aborted": "Il-modifika ġiet abbandunata mill-''hook''.\nMa ngħatat l-ebda spjegazzjoni.",
+       "no-null-revision": "Ma setghitx tinħoloq reviżjoni nulla ġdida għall-paġna \"$1\"",
        "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. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
        "login-abort-generic": "Il-login ma kienx suċċess - Imħassar",
        "loginlanguagelabel": "Lingwa: $1",
        "suspicious-userlogout": "Ir-rikjesta tiegħek li toħroġ barra mill-kont tiegħek ġiet miċħuda minħabba li jidher li din intbagħtet minn browser li ma jaħdimx jew minn proxy ta' caching.",
+       "pt-login": "Idħol",
+       "pt-login-button": "Idħol",
+       "pt-createaccount": "Oħloq kont",
+       "pt-userlogout": "Oħroġ",
        "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.",
+       "user-mail-no-body": "Ippruvajt tibgħat ittra elettronika b'kontenut vojt jew qasir wisq.",
        "changepassword": "Ibdel il-password",
-       "resetpass_announce": "L-aċċess ġe effetwat permezz ta' kodiċi temporanju, li ntbagħat permezz tal-posta elettronika.\nBiex tkompli l-aċċess tal-kont tiegħek huwa neċessarju li toħloq password ġdida hawnhekk:",
+       "resetpass_announce": "Biex ittemm id-dħul fil-kont tiegħek, jeħtieġ li tissettja password ġdida.",
        "resetpass_text": "<!-- Żied il-kliem hawnhekk -->",
        "resetpass_header": "Biddel il-password tal-kont",
        "oldpassword": "Password antika:",
        "newpassword": "Password ġdida:",
        "retypenew": "Erġa' ikteb il-password il-ġdida:",
        "resetpass_submit": "Issettja l-password u idħol fis-sit",
-       "changepassword-success": "Il-password ġie modifikat. Aċċess fil-proċess...",
+       "changepassword-success": "Il-password inbidlet korrettament!",
+       "changepassword-throttled": "Ippruvajt tidħol wisq drabi.\nJekk jogħġbok stenna $1 qabel ma terġa' tipprova.",
        "resetpass_forbidden": "Mhuwiex possibbli li timmodifika l-passwords",
        "resetpass-no-info": "Trid tkun effetwajt il-login qabel ma taċċessa direttament din il-paġna.",
        "resetpass-submit-loggedin": "Biddel il-password",
        "resetpass-submit-cancel": "Annulla",
        "resetpass-wrong-oldpass": "Password temporanja jew kurrenti invalida.\nJista' jkun li int diġà biddilt il-password, jew għamilt rikjesta għal password temporanja ġdida.",
+       "resetpass-recycled": "Jekk jogħġbok erġa' ssettja l-password għal xi ħaġa oħra li mhijiex il-password li għandek bħalissa.",
+       "resetpass-temp-emailed": "Dħalt b'kodiċi temporanju mibgħut elettronikament.\nBiex ittem id-dħul, jeħtieġ li tissettja password ġdida hawn:",
        "resetpass-temp-password": "Password temporanja:",
+       "resetpass-abort-generic": "Estensjoni ħassret il-bidla tal-password",
+       "resetpass-expired": "Il-password skadiet. Jekk jogħġbok issettja password ġdida biex tidħol.",
+       "resetpass-expired-soft": "Il-password skadiet u jeħtieġ li terġa' tissettjaha. Agħżel password ġdida issa, jew ikklikkja \"{{int:resetpass-tissottometti-tikkanċella}}\" biex tissettjaha aktar tard.",
+       "resetpass-validity-soft": "Il-password tiegħek mhijiex valida $1 \n\nAgħżel password ġdida issa, jew ikklikkja \"{{int:resetpass-submit-cancel}}\" biex tibdilha dan aktar.",
        "passwordreset": "Irrisettja l-password",
        "passwordreset-text-one": "Imla din il-formola sabiex tirrisettja l-password.",
+       "passwordreset-text-many": "{{PLURAL:$1|Imla wieħed mill-oqsma biex tirċievi password temporanja permezz ta' ittra elettronika.}}",
        "passwordreset-legend": "Irrisettja l-password",
        "passwordreset-disabled": "L-irrisettjar tal-password fuq din il-wiki ġie diżattivat.",
+       "passwordreset-emaildisabled": "Karatteristiċi tal-posta elettronika ġew diżattivati fuq din il-wiki.",
        "passwordreset-username": "Isem l-utent:",
        "passwordreset-domain": "Dominju:",
        "passwordreset-capture": "Ara l-kontenut tal-messaġġ?",
        "passwordreset-email": "Indirizz elettroniku:",
        "passwordreset-emailtitle": "Dettalji tal-kont fuq {{SITENAME}}",
        "passwordreset-emailtext-ip": "Xi ħadd (probabbilment int, mill-indirizz IP $1) għamel rikjesta sabiex jingħata password ġdida sabiex jaċċessa l-{{SITENAME}} ($4). L-{{PLURAL:$3|utent assoċjat|utenti assoċjati}} ma' dan l-indirizz elettroniku {{PLURAL:$3|huwa|huma}}:\n\n$2\n\n{{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ħadekx 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:\n\n$2\n\n{{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": "{{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\nPassword temporanja: $2",
-       "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-emailsent": "Intbagħtet ittra-e għall-issettjar mill-ġdid tal-password.",
+       "passwordreset-emailsent-capture": "Intbagħtet ittra-e għall-ssettjar mill-ġdid tal-password u l-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",
        "changeemail": "Biddel l-indirizz elettroniku",
        "changeemail-header": "Biddel l-indirizz elettroniku tal-kont",
        "changeemail-oldemail": "Indirizz elettroniku attwali:",
        "changeemail-newemail": "Indirizz elettroniku ġdid:",
        "changeemail-none": "(xejn)",
+       "changeemail-password": "Il-password tiegħek fuq {{SITENAME}}:",
        "changeemail-submit": "Biddel l-indirizz elettroniku",
        "changeemail-cancel": "Annulla",
+       "changeemail-throttled": "Ippruvajt tidħol wisq drabi.\nJekk jogħġbok stenna $1 qabel ma terġa' tipprova.",
+       "resettokens": "Irrisettja t-tokens",
        "bold_sample": "Tipa ħoxna",
        "bold_tip": "Tipa ħoxna",
        "italic_sample": "Tipa korsiva",
        "action-writeapi": "tuża' l-API fil-ktiba",
        "action-delete": "ħassar din il-paġna",
        "action-deleterevision": "ħassar din ir-reviżjoni",
-       "action-deletedhistory": "ara l-kronoloġija mħassar ta' din il-paġna",
+       "action-deletedhistory": "ara l-kronoloġija mħassra ta' din il-paġna",
        "action-browsearchive": "fittex paġni mħassra",
        "action-undelete": "irkupra din il-paġna",
        "action-suppressrevision": "tirrevedi u treġġa' din ir-reviżjoni moħbija",
        "filehist-comment": "Kumment",
        "imagelinks": "Użu tal-fajl",
        "linkstoimage": "{{PLURAL:$1|Il-Paġna segwenti għandha|Il-$1 paġni segwenti għandhom}} links għal-fajl:",
-       "linkstoimage-more": "Iktar minn {{PLURAL:$1|paġna torbot|$1paġni jorbtu}} lejn dan il-fajl.\nIl-lista segwenti turi {{PLURAL:$1|l-ewwel paġna li tipponta|l-ewwel $1 paġni li jippuntaw}} lejn dan il-fajl.\n[[Special:WhatLinksHere/$2|Lista sħiħa]] hija disponibbli.",
+       "linkstoimage-more": "Aktar minn {{PLURAL:$1|paġna torbot|$1paġni jorbtu}} lejn dan il-fajl.\nIl-lista segwenti turi {{PLURAL:$1|l-ewwel paġna li tipponta|l-ewwel $1 paġni li jippuntaw}} lejn dan il-fajl.\n[[Special:WhatLinksHere/$2|Lista sħiħa]] hija disponibbli.",
        "nolinkstoimage": "M'hemmx paġni li huma relatati ma' dan il-fajl.",
        "morelinkstoimage": "Uri [[Special:WhatLinksHere/$1|aktar links]] għal dan il-fajl.",
        "linkstoimage-redirect": "$1 (rindirizz tal-fajl) $2",
index ed2cb7a..b194711 100644 (file)
        "talkpagelinktext": "گپ",
        "specialpage": "شا صفحه",
        "personaltools": "مه‌شه ابزار",
-       "postcomment": "نو تیکه",
        "articlepage": "نمایش صفحه",
        "talk": "گپ",
        "views": "هارشی‌ئون",
        "editlink": "دچی‌ین",
        "viewsourcelink": "منبع بدی‌ین",
        "editsectionhint": "تیکه: $1 ره دچی‌ین",
-       "toc": "دله",
+       "toc": "فهرست",
        "showtoc": "سِراق هاده",
        "hidetoc": "فرو بور",
        "collapsible-collapse": "دوستن",
        "yourdomainname": "شمه کاروری نوم",
        "login": "دله بوردن",
        "nav-login-createaccount": "دله بوردن / عضو بیّن",
-       "loginprompt": "{{SITENAME}} ره ده‌لـه بیـه‌موئـه‌ن وه‌سه، وه‌نـه cookieئون  کـارسأر بـوئـه‌ن.",
        "userlogin": "دله بموئن / عضو بیّن",
        "userloginnocreate": "دله بموئن",
        "logout": "دربوردن",
        "watchlist-details": "بدون حیساب گپ ولگ‌ئون، {{PLURAL:$1|$1 صفحه|$1 صفحه}} شمه دمبال‌هاکردنی‌ئون میون قرار {{PLURAL:$1|دارنه|دانه}}.",
        "wlheader-enotif": "*تونی ایمیل جه مطلع بواشین.",
        "wlheader-showupdated": "*صفحه‌ئونی که بعد از آخرین سربزوئنتون عوض بینه '''پر رنگ''' نشون هدائه بیّه.",
+       "wlnote": "ایجه {{PLURAL:$1|پایانی دأچیه‌ن|پایانی '''$1''' دأچیه‌ن‌ئونی}} هأسه که ای $2 ساعت ده‌له دأکه‌ته.",
        "watchlist-options": "دمبال هاکردن گوزینه‌ها",
        "watching": "ده‌مـبـال هـه‌کـارده‌ن...",
        "unwatching": "ده‌مـبـال نـه‌کـارده‌ن...",
index f29574c..d659ff7 100644 (file)
        "talkpagelinktext": "thó-lūn",
        "specialpage": "Te̍k-sû-ia̍h",
        "personaltools": "Kò-jîn kang-khū",
-       "postcomment": "加一段",
        "articlepage": "Khoàⁿ loē-iông ia̍h",
        "talk": "thó-lūn",
        "views": "Khoàⁿ",
        "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. Nā beh kái hoan-e̍k, chhiaⁿ khì Ûi-ki Mûi-thé chāi-tē-hoà sū-kang [//translatewiki.net/ translatewiki.net] hiâ.",
        "cascadeprotected": "Chit-ê ia̍h í-keng hông pó-hō͘ bē kái tit. In-ūi i tī ē-bīn {{PLURAL:$1|ê|ê}} liân-só pó-hō͘ lāi-té:\n$2",
        "namespaceprotected": "Lí bô khoân-lī kái '''$1'''  miâ-khong-kan ê ia̍h",
+       "customcssprotected": "你無受權去改這个 CSS頁,因為這个頁有包括別个用者的個人設定。",
+       "customjsprotected": "你無授權去改這个JavaScript頁,因為這个頁包括別个用者的個人設定。",
+       "mycustomcssprotected": "你無授權去改這个CSS頁。",
+       "mycustomjsprotected": "你無授權去改這个JavaScript頁。",
+       "myprivateinfoprotected": "你無授權改你家己的私人資訊。",
+       "mypreferencesprotected": "你無授權改你的家己的喜愛設定。",
+       "ns-specialprotected": "特殊頁袂得改。",
+       "titleprotected": "這个標題已經予[[User:$1|$1]]保護起來,袂得提來用。\n原因是 \"<em>$2</em>。",
+       "filereadonlyerror": "因為檔案庫這馬只會使看,所以袂得改 \"$1\"這个檔案。\n鎖檔案庫的管理員講是因為:\"$3\"。",
        "exception-nologin": "Bô teng-ji̍p",
        "exception-nologin-text": "請先[[Special:Userlogin|登入]]了才有法度看這頁抑對這頁做動作。",
        "exception-nologin-text-manual": "請先$1,才有法度看這頁抑對這頁做動作。",
        "externaldberror": "這可能是資料庫驗證錯誤,抑是無允准你改外部的口座。",
        "login": "Teng-ji̍p",
        "nav-login-createaccount": "Teng-ji̍p / khui sin kháu-chō",
-       "loginprompt": "Thiⁿ ē-kha ê chu-liāu thang khui sin hō·-thâu a̍h-sī teng-ji̍p {{SITENAME}}.",
        "userlogin": "Teng-ji̍p / khui sin kháu-chō",
        "userloginnocreate": "Teng-ji̍p",
        "logout": "Teng-chhut",
        "unusedimagestext": "<p>Chhiáⁿ chù-ì: kî-thaⁿ ê bāng-chām ū khó-lêng iōng URL ti̍t-chiap liân kàu iáⁿ-siōng, só·-í sui-jiân chhiâng-chāi teh iōng, mā sī ē lia̍t tī chia.</p>",
        "unusedcategoriestext": "Ū ē-kha chiah-ê lūi-pia̍t-ia̍h, m̄-koh bô kî-thaⁿ ê bûn-chiuⁿ a̍h-sī lūi-pia̍t lī-iōng.",
        "booksources": "Tô͘-su chu-liāu",
-       "specialloguserlabel": "Iōng-chiá:",
-       "speciallogtitlelabel": "Sû-tiâu:",
+       "specialloguserlabel": "做的人:",
+       "speciallogtitlelabel": "目地(標題抑是用者)",
        "log": "記錄",
        "logempty": "Log lāi-bīn bô sio-tùi ê hāng-bo̍k.",
        "allpages": "Só·-ū ê ia̍h",
        "unwatch": "Mài kàm-sī",
        "unwatchthispage": "Mài koh kàm-sī",
        "watchlist-details": "Kàm-sī-toaⁿ ū {{PLURAL:$1|$1 ia̍h|$1 ia̍h}}, thó-lūn-ia̍h bô sǹg chāi-lāi.",
+       "wlnote": "Ē-kha sī '''$2''' tiám-cheng í-lāi siōng sin ê $1 ê kái-piàn.",
        "wlshowlast": "Hián-sī chêng $1 tiám-cheng $2 ji̍t $3",
        "deletepage": "Thâi ia̍h",
        "confirm": "Khak-tēng",
index 76f2580..aaedc84 100644 (file)
        "preview": "Forhåndsvisning",
        "showpreview": "Forhåndsvisning",
        "showdiff": "Vis endringer",
+       "blankarticle": "<strong>Advarsel:</strong> Siden du er i ferd med å opprette er tom.\nHvis du trykker \"{{int:savearticle}}\" en gang til, vil siden opprettes uten innhold.",
        "anoneditwarning": "'''Advarsel:''' Du er ikke logget inn.\nIP-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.\nVelger du ''Lagre siden'' en gang til blir endringene lagret uten forklaring.",
        "protectedpagewarning": "'''Advarsel: Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan redigere den.'''\nDet siste loggelementet er oppgitt under som referanse:",
        "semiprotectedpagewarning": "'''Merk:''' Denne siden har blitt låst slik at kun registrerte brukere kan endre den.\nDet 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 {{PLURAL:$1|sider}}:",
-       "titleprotectedwarning": "'''Advarsel: Denne siden har blitt låst slik at [[Special:ListGroupRights|spesielle rettigheter]] kreves for å opprette den.'''\nDet siste loggelementet er oppgitt under som referanse:",
+       "titleprotectedwarning": "'''Advarsel: Denne siden har blitt låst slik at [[Special:ListGroupRights|bestemte rettigheter]] kreves for å opprette den.'''\nTil orientering vises den siste loggoppføringen under:",
        "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:",
        "sectioneditnotsupported-text": "Seksjonsredigering støttes ikke på denne siden.",
        "permissionserrors": "Rettighetsfeil",
        "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}}:",
+       "permissionserrorstext-withaction": "Du har ikke tillatelse til å $2 {{PLURAL:$1|fordi|av følgende grunner}}:",
        "recreate-moveddeleted-warn": "Advarsel: Du er i ferd med å opprette en side som tidligere har blitt slettet.'''\n\nDu bør vurdere om det er passende å fortsette å redigere denne siden.\nSlette- og flytteloggen for denne siden gjengis her:",
        "moveddeleted-notice": "Denne siden har blitt slettet.\nSlette- og flytteloggen vises nedenfor.",
        "log-fulllog": "Vis hele loggen",
        "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'''.\nDet kan være detaljer i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} slettingsloggen].",
+       "rev-suppressed-text-permission": "Denne siderevisjonen har blitt <strong>skjult</strong>.\nDetaljer finnes i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} skjulingsloggen].",
        "rev-deleted-text-unhide": "Denne siderevisjonen har blitt '''slettet'''.\nSe etter detaljer i slettingsloggen: [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}].\nDu kan fortsatt [$1 se revisjonen] om du ønsker det.",
        "rev-suppressed-text-unhide": "Denne siderevisjonen har blitt '''skjult'''.\nInformasjon om dette kan finnes i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} skjulingsloggen].\nDu kan fortsatt [$1 se revisjonen] om du ønsker det.",
        "rev-deleted-text-view": "Denne siderevisjonen har blitt '''slettet'''.\nDu kan fortsatt se den; detaljer finnes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} slettingsloggen].",
        "revdelete-text-text": "Slettede revisjoner vil fortsatt finnes i sidens historikk, men deler av deres innhold vil være utilgjengelige for offentligheten.",
        "revdelete-text-file": "Slettede filversjoner vil fortsatt finnes i filhistorikken, men deler av deres innhold vil være utilgjengelige for offentligheten.",
        "logdelete-text": "Slettede hendelser i loggen vil fortsatt finnes i loggene, men deler av deres innhold vil være utilgjengelige for offentligheten.",
-       "revdelete-text-others": "Andre administratorer på {{SITENAME}} vil fortsatt ha tilgang til det skjulte innholdet og kan rulle det tilbake igjen via det samme grensesnittet, hvis ikke ytterligere begrensinger er satt.",
+       "revdelete-text-others": "Andre administratorer vil fortsatt ha tilgang til det skjulte innholdet og kan hente det frem igjen, hvis ikke ytterligere begrensinger er satt.",
        "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:\n* Mulig injurierende utsagn\n* Følsomme personlige opplysninger\n*: ''privatadresser og -telefonnumre, fødselsnumre og lignende''",
        "revdelete-legend": "Fastsett synlighetsbegrensninger",
        "right-deletedtext": "Vise 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-suppressrevision": "Se på, skjul og hent frem igjen spesifikke siderevisjoner for alle brukere",
+       "right-viewsuppressed": "Se på revisjoner som er skjult for alle brukere",
        "right-suppressionlog": "Se private logger",
        "right-block": "Blokkere andre brukere fra å redigere",
        "right-blockemail": "Blokkere brukere fra å sende e-post",
        "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å",
-       "recentchanges-label-plusminus": "Sidestørrelsen kan endres med dette antallet bytes",
+       "recentchanges-label-plusminus": "Sidestørrelsen er endra med dette antallet byte",
        "recentchanges-legend-heading": "'''Tegnforklaring:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se også [[Special:NewPages|liste av nye sider]])",
        "recentchanges-legend-plusminus": "«(±123)»",
-       "rcnotefrom": "Nedenfor er endringene gjort siden <strong>$2</strong> (frem til <strong>$1</strong> vises).",
+       "rcnotefrom": "Nedenfor er vist {{PLURAL:$5|endringen|endringene}} som er gjort siden <strong>$3, $4</strong> (frem til <strong>$1</strong>).",
        "rclistfrom": "Vis nye endringer fra og med $3 $2",
        "rcshowhideminor": "$1 mindre endringer",
        "rcshowhideminor-show": "Vis",
        "license": "Lisens:",
        "license-header": "Lisensiering",
        "nolicense": "Ingen spesifisert",
+       "licenses-edit": "Rediger lisensvalg",
        "license-nopreview": "(Forhåndsvisning ikke tilgjengelig)",
        "upload_source_url": " (en gyldig, offentlig tilgjengelig adresse)",
        "upload_source_file": " (en fil på din datamaskin)",
        "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-cat-noforeign": "Følgende filer er i bruk, men finnes ikke. I tillegg er sider som inkluderer ikke-eksisterende filer gitt 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>.",
+       "wantedfiletext-nocat-noforeign": "Følgende filer er i bruk, men finnes ikke.",
        "wantedtemplates": "Etterspurte maler",
        "mostlinked": "Sider med flest lenker til seg",
        "mostlinkedcategories": "Kategorier med flest sider",
        "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",
-       "emailuser-title-target": "Send epost til denne {{GENDER:$1|brukeren}}",
+       "emailuser-title-target": "Send e-post til denne {{GENDER:$1|brukeren}}",
        "emailuser-title-notarget": "E-post til bruker",
        "emailpage": "E-post til bruker",
        "emailpagetext": "Du kan bruke skjemaet under for å sende en e-post til denne {{GENDER:$1|brukeren}}.\nE-postadressen du har satt i [[Special:Preferences|innstillingene dine]] vil vises i «Fra»-feltet i e-posten, slik at mottakeren kan svare deg direkte.",
        "watchlist-details": "{{PLURAL:$1|Én side|$1 sider}} på din overvåkningsliste, teller ikke diskusjonssider.",
        "wlheader-enotif": "E-postvarsling er slått på.",
        "wlheader-showupdated": "Sider som har blitt forandret siden du sist besøkte dem vises i '''fet tekst'''",
-       "wlnote2": "Nedenfor er endringene {{PLURAL:$1|den siste timen|de siste <strong>$1</strong> timene}}, per $2 $3.",
+       "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",
        "watching": "Overvåker…",
        "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-error-edit": "Siden «$1» ble ikke importert fordi du ikke har tillatelse til å redigere den.",
+       "import-error-create": "Siden «$1» ble ikke importert fordi du ikke har tillatelse til å opprette den.",
+       "import-error-interwiki": "Siden «$1» ble ikke importert fordi dette navnet er reservert for ekstern lenking (interwiki).",
+       "import-error-special": "Siden «$1» ble ikke importert fordi dette navnet tilhører et spesialnavnerom som ikke tillater sider.",
+       "import-error-invalid": "Siden «$1» ble ikke importert fordi sidenavnet er ugyldig på denne wikien.",
        "import-error-unserialize": "Revisjon $2 av siden «$1» kunne ikke serialiseres. Det ble rapportert at revisjonen bruker innholdsmodellen $3 serialisert som $4.",
        "import-error-bad-location": "Revisjon $2 som bruker innholdsmodell $3 kan ikke lagres til \"$1\" på denne wikien siden denne modellen ikke støttes på den siden.",
        "import-options-wrong": "Feil {{PLURAL:$2|opsjon|opsjoner}}: <nowiki>$1</nowiki>",
        "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-upload-detail": "{{PLURAL:$1|\\Én revisjon|$1 revisjoner}} er importert",
        "import-logentry-interwiki": "transwikiimporterte $1",
-       "import-logentry-interwiki-detail": "{{PLURAL:$1|Én revisjon|$1 revisjoner}} fra $2",
+       "import-logentry-interwiki-detail": "{{PLURAL:$1|Én revisjon|$1 revisjoner}} er importert fra $2",
        "javascripttest": "JavaScript-testing",
        "javascripttest-title": "Kjører $1 tester",
        "javascripttest-pagetext-noframework": "Denne siden er reservert for å kjøre JavaScript-tester.",
        "autosumm-replace": "Erstatter siden med «$1»",
        "autoredircomment": "Omdirigerer til [[$1]]",
        "autosumm-new": "Ny side: $1",
+       "autosumm-newblank": "Opprettet tom side",
        "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.",
        "watchlistedit-normal-title": "Rediger overvåkningsliste",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskusjon]])",
        "unknown_extension_tag": "Ukjent tilleggsmerking «$1»",
        "duplicate-defaultsort": "Advarsel: Standardsorteringen «$2» tar over for den tidligere sorteringen «$1».",
+       "duplicate-displaytitle": "<strong>Advarsel:</strong> Visningstittel \"$2\" erstatter tidligere visningstittel \"$1\".",
        "version": "Versjon",
        "version-extensions": "Installerte utvidelser",
        "version-skins": "Installerte drakter",
index 0ba4a58..91597b1 100644 (file)
        "gotaccountlink": "Anmelden",
        "userlogin-resetlink": "Bi'j de anmeldgegevens kwiet?",
        "userlogin-resetpassword-link": "Joew wachtwoord vergeten?",
+       "userlogin-helplink2": "Hulpe bie t anmelden",
        "userlogin-loggedin": "Je bin al an-emeld as {{GENDER:$1|$1}}.\nGebruuk t onderstaonde formulier um an te melden as n aandere gebruker.",
        "userlogin-createanother": "n Aandere gebrukerskonto anmaken",
        "createacct-emailrequired": "Netpostadres",
        "watchlist-details": "Der {{PLURAL:$1|steet één zied|staon $1 ziejen}} op joew volglieste, zonder de overlegziejen mee-erekend.",
        "wlheader-enotif": "Je kriegen bericht per netpost",
        "wlheader-showupdated": "Ziejen die sinds joew leste bezeuk bie-ewörken bin, staon '''vet-edrokt'''.",
+       "wlnote": "Hieronder {{PLURAL:$1|steet de leste wieziging|staon de leste $1 wiezigingen}} in {{PLURAL:$2|t aofgeleupen ure|de leste $2 uren}} vanaof $3 um $4.",
        "wlshowlast": "Laot de veurbieje $1 uur $2 dagen $3 zien",
        "watchlist-options": "Opsies veur de volglieste",
        "watching": "Volg...",
index bcce965..8ebe48c 100644 (file)
@@ -84,7 +84,7 @@
        "may_long": "मे",
        "june": "जुन",
        "july": "जुलाई",
-       "august": "à¤\85à¤\97सà¥\8dत",
+       "august": "à¤\85à¤\97सà¥\8dà¤\9f",
        "september": "सेप्टेम्बर",
        "october": "अक्टोबर",
        "november": "नोभेम्बर",
@@ -96,7 +96,7 @@
        "may-gen": "मे",
        "june-gen": "जुन",
        "july-gen": "जुलाई",
-       "august-gen": "à¤\85à¤\97सà¥\8dत",
+       "august-gen": "à¤\85à¤\97सà¥\8dà¤\9f",
        "september-gen": "सेप्टेम्बर",
        "october-gen": "अक्टोबर",
        "november-gen": "नोभेम्बर",
        "talkpagelinktext": "वार्तालाप",
        "specialpage": "विशेष पृष्ठ",
        "personaltools": "व्यक्तिगत औजारहरू",
-       "postcomment": "नयाँ खण्ड",
        "articlepage": "कन्टेन्ट पृष्ठ हेर्नुहोस्",
        "talk": "वार्तालाप",
        "views": "अवलोकनहरू",
        "externaldberror": "यहाँ प्रमाणिकरण डेटाबेस त्रुटि भयो या त तपाईंलाई आफ्नो बाहिरी खाता अद्यतन गर्ने अनुमति छैन।",
        "login": "प्रवेश",
        "nav-login-createaccount": "प्रवेश गर्ने/नयाँ खाता बनाउने",
-       "loginprompt": "तपाईंले {{SITENAME}}मा प्रवेश गर्न कुकीहरू सक्रिय बनाउनुपर्छ ।",
        "userlogin": "प्रवेश गर्ने / नयाँ खाता बनाउने",
        "userloginnocreate": "लग इन",
        "logout": "निर्गमन",
        "watchlist-details": "तपाईको निगरानी सूचीमा रहेका{{PLURAL:$1|$1 पृष्ठ|$1 पृष्ठहरु}}वार्तालापमा पृष्ठमा गनिएका छैनन् ।",
        "wlheader-enotif": "ईमेल जानकारी सक्रिय गरियो ।",
        "wlheader-showupdated": "तपाईँले पछिल्लो पल्ट भ्रमण गरेपछि परिवर्तन भएका पृष्ठहरूलाई <strong>गाढा<strong> गरेर देखाइएको छ ।",
+       "wlnote": "$3 र $4 अनुसार विगत {{PLURAL:$2|घण्टामा|'''$2''' घण्टाहरुमा}} {{PLURAL:$1|गरिएको अन्तिम परिवर्तन तल दिइएकोछ|गरिएका अन्तिम  '''$1''' परिवर्तनहरु तल दिइएका छन्}}।",
        "wlshowlast": "पछिल्ला $2 दिनहरूका $3 $1 घण्टाहरूका देखाउनुहोस्",
        "watchlist-options": "निगरानि सूची विकल्प",
        "watching": "निगरानी गर्दै...",
        "duplicate-defaultsort": "'''चेतावनी:''' पूर्व निर्धारित छोटकरी \"$2\" ले पुरानो पूर्वनिर्धारित छोटकरी\"$1\"लाई विस्थापन गरेको छ ।",
        "version": "संस्करण",
        "version-extensions": "स्थापना गरिएका एक्सटेन्सनहरु",
+       "version-skins": "खोलहरु",
        "version-specialpages": "विशेष पृष्ठहरू",
        "version-parserhooks": "पार्सर हुकहरु",
        "version-variables": "चल राशी(variables)",
        "version-antispam": "स्प्याम रोकथाम",
-       "version-skins": "खोलहरु",
        "version-api": "एपिआइ(API)",
        "version-other": "अन्य",
        "version-mediahandlers": "मिडिया  ह्यान्डलरहरू",
index 780e8dc..e129c6d 100644 (file)
@@ -58,7 +58,8 @@
                        "아라",
                        "Mar(c)",
                        "Calak",
-                       "Arg"
+                       "Arg",
+                       "NCoppens"
                ]
        },
        "tog-underline": "Koppelingen onderstrepen:",
@@ -75,7 +76,8 @@
        "tog-watchdefault": "Pagina’s en bestanden die ik bewerk automatisch volgen",
        "tog-watchmoves": "Pagina’s en bestanden die ik hernoem automatisch volgen",
        "tog-watchdeletion": "Pagina’s en bestanden die ik verwijder automatisch volgen",
-       "tog-minordefault": "Mijn bewerkingen als ‘klein’ markeren",
+       "tog-watchrollback": "Pagina's waarop ik heb teruggedraaid automatisch volgen",
+       "tog-minordefault": "Mijn bewerkingen standaard als ‘klein’ markeren",
        "tog-previewontop": "Voorvertoning boven bewerkingsveld weergeven",
        "tog-previewonfirst": "Voorvertoning bij eerste bewerking weergeven",
        "tog-enotifwatchlistpages": "Mij e-mailen bij bewerkingen van pagina’s of bestanden op mijn volglijst",
        "preview": "Voorvertoning",
        "showpreview": "Bewerking ter controle bekijken",
        "showdiff": "Wijzigingen bekijken",
+       "blankarticle": "<strong>Waarschuwing:</strong> de pagina die u wilt aanmaken is leeg.\nAls u opnieuw op \"{{int:savearticle}}\" klikt, wordt de pagina aangemaakt zonder enige inhoud.",
        "anoneditwarning": "'''Waarschuwing:''' u bent niet aangemeld.\nUw IP-adres wordt opgeslagen als u wijzigingen op deze pagina maakt.",
        "anonpreviewwarning": "''U bent niet aangemeld.''\n''Door uw bewerking op te slaan wordt uw IP-adres opgeslagen in de paginageschiedenis.''",
        "missingsummary": "'''Let op:''' u hebt geen bewerkingssamenvatting opgegeven.\nAls u nogmaals op \"{{int:savearticle}}\" klikt wordt de bewerking zonder samenvatting opgeslagen.",
        "revdelete-text-text": "Verwijderde versies zijn nog zichtbaar in de geschiedenis, maar delen van de inhoud zijn niet openbaar.",
        "revdelete-text-file": "Verwijderde versies zijn nog zichtbaar in de bestandsgeschiedenis, maar delen van de inhoud zijn niet openbaar.",
        "logdelete-text": "Verwijderde logboekregels zijn nog zichtbaar in de logboeken, maar delen van de inhoud zijn niet openbaar.",
-       "revdelete-text-others": "Andere beheerders van {{SITENAME}} kunnen de verborgen inhoud nog steeds inzien en weer zichtbaar maken via deze interface, tenzij er aanvullende beperkingen zijn ingesteld.",
+       "revdelete-text-others": "Andere beheerders kunnen de verborgen inhoud nog steeds inzien en weer zichtbaar maken, tenzij er aanvullende beperkingen zijn ingesteld.",
        "revdelete-confirm": "Bevestig dat u dit wilde doen, dat u de consequenties begrijpt en dat u dit doet in overeenstemming met het geldende [[{{MediaWiki:Policy-url}}|beleid]].",
        "revdelete-suppress-text": "Gebruik versies verbergen '''alleen''' in de volgende gevallen:\n* Mogelijk smadelijke informatie;\n* Ongepaste persoonlijke gegevens, zoals:\n*: ''adres, telefoonnummers, identificatienummer, enzovoort.''",
        "revdelete-legend": "Zichtbaarheidsbeperkingen instellen",
        "mergehistory-empty": "Er zijn geen versies die samengevoegd kunnen worden.",
        "mergehistory-success": "$3 {{PLURAL:$3|versie|versies}} van [[:$1]] zijn succesvol samengevoegd naar [[:$2]].",
        "mergehistory-fail": "Kan geen geschiedenis samenvoegen, controleer opnieuw de pagina- en tijdinstellingen.",
+       "mergehistory-fail-toobig": "Niet in staat om geschiedenis samen te voegen omdat meer dan de limiet van $1 {{PLURAL:$1|revisie zou|revisies zouden}} worden verplaatst.",
        "mergehistory-no-source": "De bronpagina $1 bestaat niet.",
        "mergehistory-no-destination": "De bestemmingspagina $1 bestaat niet.",
        "mergehistory-invalid-source": "De bronpagina moet een geldige paginanaam zijn.",
        "right-deletedtext": "Verwijderde tekst en wijzigingen tussen verwijderde versies bekijken",
        "right-browsearchive": "Verwijderde pagina's zoeken",
        "right-undelete": "Verwijderde pagina's terugplaatsen",
-       "right-suppressrevision": "Verborgen versies bekijken en terugplaatsen",
+       "right-suppressrevision": "Specifieke versies bekijken, verbergen en weer zichtbaar maken op pagina's van elke gebruiker",
+       "right-viewsuppressed": "Bekijk versies verborgen door elke gebruiker",
        "right-suppressionlog": "Niet-openbare logboeken bekijken",
        "right-block": "Andere gebruikers de mogelijkheid ontnemen te bewerken",
        "right-blockemail": "Een gebruiker het recht ontnemen om e-mail te versturen",
        "recentchanges-label-unpatrolled": "Deze bewerking is nog niet gecontroleerd",
        "recentchanges-label-plusminus": "Deze paginagrootte is met dit aantal bytes gewijzigd",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zie ook de [[Special:NewPages|Lijst met nieuwe pagina's]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zie ook de [[Special:NewPages|lijst met nieuwe pagina's]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Wijzigingen sinds <strong>$3 om $4</strong> (maximaal <strong>$1</strong> {{PLURAL:$1|wijziging|wijzigingen}}).",
        "rclistfrom": "Wijzigingen bekijken vanaf $3 $2",
        "license": "Licentie:",
        "license-header": "Licentie",
        "nolicense": "Maak een keuze",
+       "licenses-edit": "Licentieopties bewerken",
        "license-nopreview": "(Voorvertoning niet beschikbaar)",
        "upload_source_url": " (een geldige, publiek toegankelijke URL)",
        "upload_source_file": " (een bestand op uw computer)",
        "wantedfiles": "Niet-bestaande bestanden met koppelingen",
        "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>.",
+       "wantedfiletext-nocat-noforeign": "De volgende bestanden zijn in gebruik maar bestaan niet.",
        "wantedtemplates": "Niet-bestaande sjablonen met koppelingen",
        "mostlinked": "Pagina's waar het meest naar verwezen wordt",
        "mostlinkedcategories": "Categorieën waar het meest naar verwezen wordt",
        "watchlist-details": "Er {{PLURAL:$1|staat één pagina|staan $1 pagina's}} op uw volglijst. Overlegpagina's worden niet meegeteld.",
        "wlheader-enotif": "U wordt per e-mail gewaarschuwd.",
        "wlheader-showupdated": "Pagina's die zijn bewerkt sinds uw laatste bezoek worden '''vet''' weergegeven.",
-       "wlnote2": "Hieronder staan de veranderingen in {{PLURAL:$1|het|de}} laatste {{PLURAL:$1|uur|<strong> $1 </strong>uren}}, sinds $2, $3.",
+       "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",
        "watching": "Bezig met plaatsen op volglijst…",
        "importlogpage": "Importlogboek",
        "importlogpagetext": "Administratieve import van pagina's met geschiedenis van andere wiki's.",
        "import-logentry-upload": "heeft [[$1]] geïmporteerd via een bestandsupload",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|versie|versies}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|versie|versies}} geïmporteerd",
        "import-logentry-interwiki": "importeerde $1 via transwiki",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versie|versies}} van $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versie|versies}} geïmporteerd uit $2",
        "javascripttest": "JavaScript testen",
        "javascripttest-title": "Tests uitvoeren voor $1",
        "javascripttest-pagetext-noframework": "Deze pagina is gereserveerd voor het uitvoeren van JavaScripttesten.",
        "autosumm-replace": "Tekst vervangen door \"$1\"",
        "autoredircomment": "Verwijst door naar [[$1]]",
        "autosumm-new": "Nieuwe pagina aangemaakt met '$1'",
+       "autosumm-newblank": "Lege pagina aangemaakt",
        "size-kilobytes": "$1 kB",
        "lag-warn-normal": "Wijzigingen in de afgelopen {{PLURAL:$1|seconde|$1 seconden}} worden misschien niet weergegeven in deze lijst.",
        "lag-warn-high": "Door een hoge database-servertoevoer zijn wijzigingen nieuwer dan $1 {{PLURAL:$1|seconde|seconden}} mogelijk niet beschikbaar in de lijst.",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|overleg]])",
        "unknown_extension_tag": "Onbekende tag \"$1\"",
        "duplicate-defaultsort": "'''Waarschuwing:''' de standaardsortering \"$2\" krijgt voorrang voor de sortering \"$1\".",
+       "duplicate-displaytitle": "<strong>Waarschuwing:</strong>Titelweergave \"$2\" overschrijft eerdere titelweergave \"$1\".",
        "version": "Versie",
        "version-extensions": "Geïnstalleerde uitbreidingen",
        "version-skins": "Geïnstalleerde vormgevingen",
        "version-hook-name": "Hooknaam",
        "version-hook-subscribedby": "Geabonneerd door",
        "version-version": "($1)",
+       "version-no-ext-name": "[geen naam]",
        "version-license": "Licentie voor MediaWiki",
        "version-ext-license": "Licentie",
        "version-ext-colheader-name": "Uitbreiding",
        "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|heeft}} versie $4 van pagina $3 automatisch gemarkeerd als gecontroleerd",
        "logentry-newusers-newusers": "Gebruiker $1 {{GENDER:$2|is}} aangemaakt",
        "logentry-newusers-create": "Gebruikersaccount $1 {{GENDER:$2|is}} aangemaakt",
-       "logentry-newusers-create2": "Gebruiker $3 {{GENDER:$2|is}} aangemaakt door $1",
+       "logentry-newusers-create2": "Gebruikersaccount $3 {{GENDER:$2|is}} aangemaakt door $1",
        "logentry-newusers-byemail": "Gebruiker $3 {{GENDER:$2|is}} aangemaakt door $1 en het wachtwoord is per e-mail verzonden",
        "logentry-newusers-autocreate": "Gebruikersaccount $1 {{GENDER:$2|is}} automatisch aangemaakt",
        "logentry-rights-rights": "$1 {{GENDER:$2|heeft}} groepslidmaatschap voor $3 gewijzigd van $4 naar $5",
        "expand_templates_generate_xml": "XML-parserboom bekijken",
        "expand_templates_generate_rawhtml": "Ruwe HTML weergeven",
        "expand_templates_preview": "Voorvertoning",
+       "pagelanguage": "Taal pagina kiezen",
        "pagelang-name": "Pagina",
        "pagelang-language": "Taal",
-       "pagelang-select-lang": "Taal selecteren"
+       "pagelang-use-default": "Gebruik standaard taal",
+       "pagelang-select-lang": "Taal selecteren",
+       "right-pagelang": "Taal van de pagina wijzigen",
+       "action-pagelang": "Taal van de pagina wijzigen",
+       "log-name-pagelang": "Logboek van taalwijzigingen",
+       "log-description-pagelang": "Dit is een logboek van wijzigingen van de taal van pagina's.",
+       "logentry-pagelang-pagelang": "$1 wijzigde de taal van de pagina '$3' van $4 naar $5."
 }
index b2e931e..f3c6636 100644 (file)
        "unusedtemplateswlh": "andre lenkjer",
        "randompage": "Tilfeldig side",
        "randompage-nopages": "Det finst ingen sider i {{PLURAL:$2|dette namnerommet|desse namneromma}}: $1.",
+       "randomincategory-selectcategory": "Hent tilfeldig side frå kategori: $1 $2.",
+       "randomincategory-selectcategory-submit": "Hent",
        "randomredirect": "Tilfeldig omdirigering",
        "randomredirect-nopages": "Det finst ingen omdirigeringar i namnerommet «$1».",
        "statistics": "Statistikk",
        "watchlist-details": "{{PLURAL:$1|Éi side|$1 sider}} er overvaka, utanom diskusjonssider.",
        "wlheader-enotif": "Funksjonen for endringsmeldingar per e-post er på.",
        "wlheader-showupdated": "Sider som har vorte endra sidan du sist såg på dei er '''utheva'''",
+       "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 timane $2 dagane $3",
        "watchlist-options": "Alternativ for overvakingslista",
        "watching": "Overvakar...",
        "watchlistedit-raw-done": "Overvakingslista er oppdatert.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Éi side vart lagt til|$1 sider vart lagde til}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Éi side|$1 sider}} vart fjerna:",
+       "watchlistedit-clear-title": "Tømde overvakingslista",
+       "watchlistedit-clear-legend": "Tøm overvakingslista",
+       "watchlistedit-clear-explain": "Alle titlane vert fjerna frå overvakingslista di",
+       "watchlistedit-clear-titles": "Titlar:",
+       "watchlistedit-clear-submit": "Tøm overvakingslista (dette er permanent!)",
+       "watchlistedit-clear-done": "Overvakingslista di vart tømt.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|éin tittel|$1 titlar}} vart fjerna:",
+       "watchlistedit-too-many": "Det er for mange sider til at dei kan visast her.",
+       "watchlisttools-clear": "Tøm overvakingslista",
        "watchlisttools-view": "Vis relevante endringar",
        "watchlisttools-edit": "Vis og endre overvakingslista",
        "watchlisttools-raw": "Endre på overvakingslista i råformat",
index f444812..6d6cb71 100644 (file)
        "go": "Przejdź",
        "searcharticle": "Przejdź",
        "history": "Historia strony",
-       "history_short": "Historia",
+       "history_short": "historia",
        "updatedmarker": "zmienione od ostatniej wizyty",
        "printableversion": "Wersja do druku",
        "permalink": "Link do tej wersji",
        "preview": "Podgląd",
        "showpreview": "Pokaż podgląd",
        "showdiff": "Podgląd zmian",
+       "blankarticle": "<strong>Uwaga:</strong> Strona, którą masz zamiar utworzyć jest pusta.\nJeżeli klikniesz \"{{int:savearticle}}\" ponownie, strona zostanie utworzona bez jakiejkolwiek treści.",
        "anoneditwarning": "'''Uwaga:''' Nie jesteś {{GENDER:|zalogowany|zalogowana}}.\nTwój adres IP zostanie zapisany w historii edycji strony.",
        "anonpreviewwarning": "''Nie jesteś zalogowany. Jeśli zapiszesz zmiany, w historii edycji strony zostanie umieszczony Twój adres IP.''",
        "missingsummary": "'''Uwaga:''' Nie wprowadz{{GENDER:|iłeś|iłaś|ono}} opisu zmian.\nJeżeli nie chcesz go wprowadzać, naciśnij przycisk „Zapisz” jeszcze raz.",
        "rev-deleted-event": "(wpis usunięty)",
        "rev-deleted-user-contribs": "[nazwa użytkownika lub adres IP usunięte – edycja ukryta we wkładzie]",
        "rev-deleted-text-permission": "Ta wersja strony została '''usunięta'''.\nSzczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze usunięć].",
+       "rev-suppressed-text-permission": "Ta wersja strony została <strong>ukryta</strong>.\nSzczegóły można odnaleźć w [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejestrze ukryć].",
        "rev-deleted-text-unhide": "Ta wersja strony została '''usunięta'''.\nSzczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze usunięć].\nJeśli chcesz możesz [$1 obejrzeć tę wersję].",
        "rev-suppressed-text-unhide": "Ta wersja strony została '''utajniona'''.\nSzczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejestrze utajniania].\nJeśli chcesz możesz [$1 obejrzeć tę wersję].",
        "rev-deleted-text-view": "Ta wersja strony została '''usunięta'''.\nJeśli chcesz możesz ją obejrzeć. Szczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze usunięć].",
        "revdelete-text-text": "Usunięte wersje będą nadal widoczne w historii strony, ale niektóre fragmenty ich treści nie będą dostępne dla wszystkich.",
        "revdelete-text-file": "Usunięte wersje pliku będą nadal widoczne w historii pliku, ale niektóre fragmenty ich treści nie będą dostępne dla wszystkich.",
        "logdelete-text": "Usunięte wpisy rejestru nadal będą widoczne w rejestrze, ale niektóre fragmenty ich treści nie będą dostępne dla wszystkich.",
-       "revdelete-text-others": "Pozostali administratorzy {{grammar:genitive|{{SITENAME}}}} nadal będą posiadali dostęp do ukrytej treści i będą w stanie odtworzyć ją ponownie za pomocą tego samego interfejsu, jeśli nie zostaną ustawione dodatkowe ograniczenia.",
+       "revdelete-text-others": "Pozostali administratorzy nadal będą posiadali dostęp do ukrytej treści i będą w stanie odtworzyć ją ponownie za pomocą tego samego interfejsu, jeśli nie zostaną ustawione dodatkowe ograniczenia.",
        "revdelete-confirm": "Potwierdź, że chcesz to zrobić zgodnie z [[{{MediaWiki:Policy-url}}|zasadami]] i że rozumiesz konsekwencje.",
        "revdelete-suppress-text": "Ukrywanie powinno być używane '''wyłącznie''' w sytuacji:\n* Informacji, która może być zniesławieniem\n* Ujawnienie danych osobowych\n*: ''adres domowy, numer telefonu, numer PESEL itp''",
        "revdelete-legend": "Ustaw ograniczenia widoczności",
        "right-browsearchive": "Przeszukiwanie usuniętych stron",
        "right-undelete": "Odtwarzanie usuniętych stron",
        "right-suppressrevision": "Podgląd i odtwarzanie wersji ukrytych przed administratorami",
+       "right-viewsuppressed": "Umożliwia zobaczenie wersji ukrytych przed każdym użytkownikiem",
        "right-suppressionlog": "Podgląd rejestru ukrywania",
        "right-block": "Blokowanie użytkownikom możliwości edycji",
        "right-blockemail": "Blokowanie użytkownikom możliwości wysyłania wiadomości",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zobacz też [[Special:NewPages|listę nowych stron]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Poniżej pokazano zmiany wykonane po '''$2''' (nie więcej niż '''$1''' pozycji).",
+       "rcnotefrom": "Poniżej {{PLURAL:$5|pokazano zmianę|pokazano zmiany}} wykonane po <strong>$3, $4</strong> (nie więcej niż '''$1''' pozycji).",
        "rclistfrom": "Pokaż nowe zmiany od $3 $2",
        "rcshowhideminor": "$1 drobne zmiany",
        "rcshowhideminor-show": "Pokaż",
        "filepage-nofile": "Plik o tej nazwie nie istnieje.",
        "filepage-nofile-link": "Plik o tej nazwie nie istnieje, ale możesz go [$1 przesłać].",
        "uploadnewversion-linktext": "Załaduj nowszą wersję tego pliku",
-       "shared-repo-from": "z $1",
-       "shared-repo": "współdzielone zasoby",
+       "shared-repo-from": "na $1",
+       "shared-repo": "współdzielonych zasobach",
        "filepage.css": "/* Styl CSS tutaj zamieszczony jest dołączany do strony pliku, także na innych wiki */",
        "upload-disallowed-here": "Nie możesz nadpisać tego pliku.",
        "filerevert": "Przywracanie $1",
        "watchlist-details": "Lista obserwowanych przez Ciebie stron zawiera {{PLURAL:$1|$1 pozycję|$1 pozycje|$1 pozycji}}, nie licząc oddzielnie stron dyskusji.",
        "wlheader-enotif": "Wysyłanie powiadomień na adres e‐mail jest włączone.",
        "wlheader-showupdated": "'''Wytłuszczone''' zostały strony, które zostały zmodyfikowane od Twojej ostatniej wizyty na nich.",
-       "wlnote2": "Poniżej pokazano zmiany wykonane w ciągu {{PLURAL:$1|ostatniej godziny|ostatnich <strong>$1</strong> godzin}}, licząc od $2, $3.",
+       "wlnote": "Poniżej pokazano {{PLURAL:$1|zmianę wykonaną|<strong>$1</strong> zmiany wykonane|<strong>$1</strong> zmian wykonanych}} w ciągu {{PLURAL:$2|ostatniej godziny|ostatnich <strong>$2</strong> godzin}}, licząc od $4 dnia $3.",
        "wlshowlast": "Pokaż ostatnie $1 godzin, $2 dni ($3)",
        "watchlist-options": "Opcje obserwowanych",
        "watching": "Dodaję do obserwowanych...",
        "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-error-invalid": "Strona „$1” nie została zaimportowana, ponieważ jej nazwa jest nieprawidłowa na tej wiki.",
        "import-error-unserialize": "Wersja $2 strony \"$1\" nie może zostać odserializowana. Wersja używa modelu treści $3 zserializowanego jako $4",
        "import-error-bad-location": "Zmiana $2 używająca modelu danych $3 nie może zostać zapisana na \"$1\" na tej wiki, ze względu na to, że ten model danych nie jest wspierany na tej stronie.",
        "import-options-wrong": "{{PLURAL:$2|Niepoprawna opcja|Niepoprawne opcje}}: <nowiki>$1</nowiki>",
        "pageinfo-not-current": "Niestety, te informacje nie są dostępne dla starych wersji stron.",
        "pageinfo-header-basic": "Podstawowe informacje",
        "pageinfo-header-edits": "Historia edycji",
-       "pageinfo-header-restrictions": "Zabezpieczenie strony",
+       "pageinfo-header-restrictions": "Zabezpieczenie",
        "pageinfo-header-properties": "Właściwości strony",
        "pageinfo-display-title": "Wyświetlany tytuł",
        "pageinfo-default-sort": "Domyślny klucz sortowania",
        "autosumm-replace": "UWAGA! Zastąpienie treści hasła bardzo krótkim tekstem: „$1”",
        "autoredircomment": "Przekierowanie do [[$1]]",
        "autosumm-new": "Utworzono nową stronę \"$1\"",
+       "autosumm-newblank": "Utworzono pustą stronę",
        "size-bytes": "$1&nbsp;B",
        "size-kilobytes": "$1&nbsp;KB",
        "size-megabytes": "$1&nbsp;MB",
index 38a7b14..c20deed 100644 (file)
        "talkpagelinktext": "discussion",
        "specialpage": "Pàgina special",
        "personaltools": "Utiss përsonaj",
-       "postcomment": "Session neuva",
        "articlepage": "Vëdde la pàgina ëd contnù",
        "talk": "Discussion",
        "views": "Vìsite",
        "jumptonavigation": "navigassion",
        "jumptosearch": "arserché",
        "view-pool-error": "An dëspias, ij servent a son motobin carià al moment.\nTròpi utent a son an camin ch'a preuvo a lese sta pàgina-sì.\nPër piasì, ch'a speta un pòch prima ëd prové torna a lese costa pàgina.\n\n$1",
+       "generic-pool-error": "An dëspias, ij servent a son motobin carià al moment.\nTròpi utent a son an camin ch'a preuvo a lese costa arsorsa.\nPër piasì, ch'a speta un pò prima ëd prové torna a acede a costa arsorsa.",
        "pool-timeout": "Ël temp a l'é finì antramentre ch'a së spetava la saradura",
        "pool-queuefull": "La coa ëd travaj a l'é pien-a",
        "pool-errorunknown": "Eror pa conossù",
        "externaldberror": "Ò che a l'é rivaje n'eror con la base ëd dàit d'autenticassion esterna, ò pura a l'é chiel che a l'é nen autorisà a agiornesse sò cont estern.",
        "login": "Conession",
        "nav-login-createaccount": "Creé un cont o rintré ant ël sistema",
-       "loginprompt": "Che a varda mach che a venta avèj ij bëscotin abilità për podèj rintré an {{SITENAME}}.",
        "userlogin": "Creé un cont o rintré ant ël sistema",
        "userloginnocreate": "Conession",
        "logout": "Seurte da 'nt ël sistema",
        "edit-gone-missing": "As peul nen agiornesse la pàgina.\nA smija che a sia stàita scancelà.",
        "edit-conflict": "Conflit ëd modìfiche.",
        "edit-no-change": "Soa modìfica a l'é stàita ignorà, përchè gnun cambiament a l'é stàit fàit al test.",
+       "postedit-confirmation-created": "La pàgina a l'é stàita creà.",
+       "postedit-confirmation-restored": "La pàgina a l'é stàita ripristinà.",
        "postedit-confirmation-saved": "Soa modìfica a l'é stàita salvà.",
        "edit-already-exists": "La neuva pàgina a l'ha nen podù creesse.\nA esist già.",
        "defaultmessagetext": "Test che a-i sarìa se a-i fusso pa 'd modìfiche",
        "parser-template-recursion-depth-warning": "Passà ël lìmit ëd ricorsion dlë stamp ($1)",
        "language-converter-depth-warning": "Lìmit ëd profondità dël convertidor ëd lenga sorpassà ($1)",
        "node-count-exceeded-category": "Pàgine anté che ël nùmer ëd neu a l'é sorpassà",
+       "node-count-exceeded-category-desc": "Na categorìa për le pàgine andoa ël nùmer dij neud a l'é tròp grand.",
        "node-count-exceeded-warning": "La pàgina a l'ha sorpassà ël nùmer ëd neu",
        "expansion-depth-exceeded-category": "Pàgine anté che la profondeur d'espansion a l'é sorpassà",
+       "expansion-depth-exceeded-category-desc": "Costa-sì a l'é na categorìa për le pàgine andoa la profondità d'espansion a l'é tròpa.",
        "expansion-depth-exceeded-warning": "La pàgina a l'ha sorpassà la profondità d'espansion",
        "parser-unstrip-loop-warning": "Trovà un sicl nen dësmontàbil",
        "parser-unstrip-recursion-limit": "Sorpassà ël lìmit d'arcorensa nen dësmontàbil: $1",
        "currentrev": "Version dël dì d'ancheuj",
        "currentrev-asof": "Version corenta dij $1",
        "revisionasof": "Revision $1",
-       "revision-info": "Revision al $1; $2",
+       "revision-info": "Revision al $1 ëd {{GENDER:$6|$2}}$7",
        "previousrevision": "←Version pì veja",
        "nextrevision": "Revision pì neuva →",
        "currentrevisionlink": "Vardé la version corenta",
        "revdelete-text-text": "Le revision ëscancelà a compariran ancora ant la stòria dla pàgina, ma na part ëd sò contnù a sarà inacessìbil al pùblich.",
        "revdelete-text-file": "Le version d'archivi scancelà a compariran ancora ant la stòria dj'archivi, ma na part ëd sò contnù a sarà inacessìbil al pùblich.",
        "logdelete-text": "J'eveniment dl'argistr ëscancelà a compariran ancora ant j'argistr, ma na part ëd sò contnù a sarà inacessìbil al pùblich.",
-       "revdelete-text-others": "J'àutri aministrator ëd {{SITENAME}} a podran sempe acede al contù stërmà e a peulo ripristinelo torna con costa antërfassa, gavà ch'a sio definìe ëd restrission adissionaj.",
+       "revdelete-text-others": "J'àutri aministrator ëd a podran sempe acede al contù stërmà e a peulo ripristinelo torna, gavà ch'a sio definìe ëd restrission adissionaj.",
        "revdelete-confirm": "Për piasì, ch'a confema ch'a veul fé sòn, ch'as rend cont dle conseguense, e ch'a lo fa an acòrd con [[{{MediaWiki:Policy-url}}|le régole]].",
        "revdelete-suppress-text": "La scancelassion a dovrìa '''mach''' esse dovrà an costi cas:\n* Anformassion ch'a podrìo esse difamatòrie\n* Anformassion përsonaj inapropià\n*: ''adrësse ëd ca e nùmer ëd teléfon, còdes fiscaj, e via fòrt''",
        "revdelete-legend": "But-je coste limitassion-sì a le version scancelà:",
        "mergehistory-empty": "Pa gnun-a revision ch'as peula butesse ansema.",
        "mergehistory-success": "$3 {{PLURAL:$3|revision|revision}} ëd [[:$1]] a son ëstàite butà ansema a [[:$2]] sensa problema.",
        "mergehistory-fail": "A l'é nen riessusse a buté ansema le revision, për piasì, ch'as contròla la pàgina e ij temp.",
+       "mergehistory-fail-toobig": "Impossìbil fé la fusion ëd la stòria përchè un nùmer ëd {{PLURAL:$1|revision}} pi grand che $1 a sarìa spostà.",
        "mergehistory-no-source": "La pàgina sorgiss $1 a-i é pa.",
        "mergehistory-no-destination": "La pàgina ëd destinassion $1 a-i é pa.",
        "mergehistory-invalid-source": "La pàgina sorgiss a l'ha d'avèj un tìtol bon.",
index 1b41713..f9cc76c 100644 (file)
        "listgrouprights-namespaceprotection-header": "Restrições de namespace",
        "listgrouprights-namespaceprotection-namespace": "Namespace",
        "listgrouprights-namespaceprotection-restrictedto": "Direito(s) permitindo edições do usuário",
-       "trackingcategories": "Monitorando categorias",
+       "trackingcategories": "Categorias de rastreamento",
        "trackingcategories-summary": "Esta página lista categorias de monitoramento que são preenchidas automaticamente pelo software MediaWiki. Seus nomes podem ser alterados através da alteração das mensagens de sistema relevantes no namespace {{ns: 8}}.",
        "trackingcategories-msg": "Categoria de monitoramento",
        "trackingcategories-desc": "Critérios de inclusão de categoria",
        "watchlist-details": "{{PLURAL:$1|$1 página|$1 páginas}} na sua lista de páginas vigiadas, excluindo as páginas de discussão.",
        "wlheader-enotif": "A notificação por email encontra-se ativada.",
        "wlheader-showupdated": "Páginas modificadas desde a sua última visita são mostradas em '''negrito'''",
-       "wlnote2": "A seguir estão as mudanças nas últimas {{PLURAL:$1|hora|<strong>$1</strong> horas}}, a partir de $2, $3.",
+       "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",
        "watching": "Vigiando...",
index d045576..003602c 100644 (file)
@@ -77,6 +77,7 @@
        "tog-watchdefault": "Adicionar as páginas e ficheiros que eu editar às minhas páginas vigiadas",
        "tog-watchmoves": "Adicionar as páginas e ficheiros que eu mover às minhas páginas vigiadas",
        "tog-watchdeletion": "Adicionar as páginas e ficheiros que eu eliminar às minhas páginas vigiadas",
+       "tog-watchrollback": "Adicionar páginas onde fiz uma reversão à minha lista de artigos vigiados",
        "tog-minordefault": "Por omissão, marcar todas as edições como menores",
        "tog-previewontop": "Mostrar a antevisão antes da caixa de edição",
        "tog-previewonfirst": "Mostrar a antevisão na primeira edição",
        "preview": "Antevisão",
        "showpreview": "Antever resultado",
        "showdiff": "Mostrar alterações",
+       "blankarticle": "<strong>Aviso:</strong> A página que está prestes a criar está em branco.  \nSe clicar \"{{int:savearticle}}\" outra vez, a página será criada sem qualquer conteúdo.",
        "anoneditwarning": "'''Aviso''': Não iniciou sessão.\nO seu endereço IP será registado no histórico de edições desta página.",
        "anonpreviewwarning": "''Não iniciou sessão. Ao gravar, registará o seu endereço IP no histórico de edições da página.''",
        "missingsummary": "'''Atenção:''' Não introduziu um resumo da edição.\nSe clicar novamente \"Gravar página\" a sua edição será gravada sem resumo.",
        "rev-deleted-event": "(entrada removida)",
        "rev-deleted-user-contribs": "[nome de utilizador ou IP removido - edição ocultada das contribuições]",
        "rev-deleted-text-permission": "Esta revisão de página foi <strong>eliminada</strong>.\nEncontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].",
+       "rev-suppressed-text-permission": "Esta revisão de página foi <strong>suprimida</strong>.\nPode consultar os detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].",
        "rev-deleted-text-unhide": "Esta revisão de página foi <strong>eliminada</strong>.\nEncontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].\nPode mesmo assim [$1 ver esta revisão] se deseja prosseguir.",
        "rev-suppressed-text-unhide": "Esta revisão de página foi <strong>suprimida</strong>.\nEncontrará detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].\nPode mesmo assim [$1 ver esta revisão] se deseja prosseguir.",
        "rev-deleted-text-view": "Esta revisão de página foi <strong>eliminada</strong>.\nVocê pode vê-la; encontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].",
        "revdelete-text-text": "Revisões eliminadas ainda aparecerão no histórico da página, mas parte do seu conteúdo estará inacessível para o público.",
        "revdelete-text-file": "Versões eliminadas do ficheiro ainda aparecerão no histórico da página, mas parte do seu conteúdo estará inacessível para o público.",
        "logdelete-text": "Os eventos eliminados ainda aparecerão no histórico da página, mas pare de seu conteúdo será inacessível ao público.",
-       "revdelete-text-others": "Outros administradores em {{SITENAME}} podem aceder ao conteúdo oculto e torná-lo visível novamente através desta mesma interface, a menos que sejam definidas restrições adicionais.",
+       "revdelete-text-others": "Outros administradores serão ainda capazes de aceder ao conteúdo oculto e torná-lo visível novamente, a menos que sejam definidas restrições adicionais.",
        "revdelete-confirm": "Por favor, confirme que pretende executar esta operação, que compreende as suas consequências e que o faz em concordância com as [[{{MediaWiki:Policy-url}}|políticas e recomendações]].",
        "revdelete-suppress-text": "A supressão '''só''' deverá ser usada nos seguintes casos:\n* Informação potencialmente caluniosa, difamatória ou injuriosa\n* Informação pessoal imprópria\n*: ''endereços de domicílio e números de telefone, números de identificação nacional, etc''",
        "revdelete-legend": "Definir restrições de visibilidade",
        "right-deletedtext": "Ver texto eliminado e mudanças entre revisões eliminadas",
        "right-browsearchive": "Pesquisar páginas eliminadas",
        "right-undelete": "Restaurar uma página",
-       "right-suppressrevision": "Rever e restaurar revisões ocultas dos administradores",
+       "right-suppressrevision": "Ver, ocultar e restaurar revisões de páginas específicas para qualquer utilizador",
+       "right-viewsuppressed": "Ver revisões ocultas para qualquer utilizador",
        "right-suppressionlog": "Ver registos privados",
        "right-block": "Impedir outros utilizadores de editarem",
        "right-blockemail": "Impedir um utilizador de enviar correio eletrónico",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|lista de páginas novas]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
-       "rcnotefrom": "Abaixo estão as mudanças desde <strong>$2</strong> (mostradas até <strong>$1</strong>).",
+       "rcnotefrom": "Abaixo {{PLURAL:$5|está a mudança|estão as mudanças}} desde <strong>$2</strong> (mostradas até <strong>$1</strong>).",
        "rclistfrom": "Mostrar as novas mudanças a partir das $3 $2",
        "rcshowhideminor": "$1 edições menores",
        "rcshowhideminor-show": "Mostrar",
        "nolicense": "Nenhuma selecionada",
        "licenses-edit": "Editar opções de licença",
        "license-nopreview": "(Antevisão indisponível)",
-       "upload_source_url": " (uma URL válida, publicamente acessível)",
-       "upload_source_file": " (um ficheiro no seu computador)",
+       "upload_source_url": "(um ficheiro de uma URL válida, publicamente acessível)",
+       "upload_source_file": "(um ficheiro no seu computador)",
        "listfiles-delete": "eliminar",
        "listfiles-summary": "Esta página especial mostra todos os ficheiros carregados.",
        "listfiles_search_for": "Pesquisar por nome de imagem:",
        "watchlist-details": "{{PLURAL:$1|Existe $1 página|Existem $1 páginas}} em sua lista de páginas vigiadas, excluindo-se as páginas de discussão.",
        "wlheader-enotif": "A notificação por correio eletrónico está ativa.",
        "wlheader-showupdated": "As páginas modificadas desde a última vez que as visitou aparecem destacadas a '''negrito'''.",
-       "wlnote2": "Estão listadas abaixo as mudanças realizadas {{PLURAL:$1|na última hora|nas últimas <strong>$1</strong> horas}}, a partir de $2, $3.",
+       "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",
        "watching": "A vigiar...",
        "delete-edit-reasonlist": "Editar motivos de eliminação",
        "delete-toobig": "Esta página tem um histórico longo, com mais de $1 {{PLURAL:$1|edição|edições}}.\nA eliminação de páginas como esta foi restringida na {{SITENAME}}, para evitar problemas acidentais.",
        "delete-warning-toobig": "Esta página tem um histórico de edições longo, com mais de $1 {{PLURAL:$1|edição|edições}}.\nEliminá-la poderá causar problemas na base de dados da {{SITENAME}};\nprossiga com precaução.",
-       "deleting-backlinks-warning": "'''Aviso:'''  [[Special:WhatLinksHere/{{FULLPAGENAME}}|páginas]] que contêm ligações para a página que está prestes a eliminar ou que a transcluem.",
+       "deleting-backlinks-warning": "'''Aviso:''' Existem [[Special:WhatLinksHere/{{FULLPAGENAME}}|páginas]] que contêm ligações para a página que está prestes a eliminar ou que a transcluem.",
        "rollback": "Reverter edições",
        "rollback_short": "Reverter",
        "rollbacklink": "reverter",
        "import-error-create": "A página \"$1\" não foi importada porque não tem permissão para criá-la.",
        "import-error-interwiki": "A página \"$1\" não pode ser importada pois o seu nome está reservado para um ligação externa (interlíngua).",
        "import-error-special": "A página \"$1\" não pode ser importada porque pertence a um domínio especial que não permite páginas.",
-       "import-error-invalid": "A página \"$1\" não pode ser importada porque o seu nome é inválido.",
+       "import-error-invalid": "A página \"$1\" não pode ser importada porque o seu nome é inválido nesta wiki.",
        "import-error-unserialize": "Revisão $2 da página \"$1\" não pode ser desserializada. Foi relatado que a revisão usava o modelo de conteúdo $3 serializado como $4.",
        "import-error-bad-location": "A revisão $2, que usa o modelo de conteúdo $3, não pode ser gravada em \"$1\" nesta wiki, porque o modelo não é suportado nessa página.",
        "import-options-wrong": "{{PLURAL:$2|Opção errada|Opções erradas}}: <nowiki>$1</nowiki>",
        "importlogpage": "Registo de importações",
        "importlogpagetext": "Importações administrativas de páginas com a preservação do histórico de edição de outras wikis.",
        "import-logentry-upload": "importou [[$1]] por carregamento de ficheiro",
-       "import-logentry-upload-detail": "{{PLURAL:$1|uma edição|$1 edições}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|edição importada|edições importadas}}",
        "import-logentry-interwiki": "transwikis $1",
-       "import-logentry-interwiki-detail": "{{PLURAL:$1|$1 edição|$1 edições}} de $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|edição importada|edições importadas}} de $2",
        "javascripttest": "Teste de JavaScript",
        "javascripttest-title": "A executar os testes $1",
        "javascripttest-pagetext-noframework": "Esta página é reservada para a execução de testes de JavaScript.",
        "autosumm-replace": "Página substituída por \"$1\"",
        "autoredircomment": "Redirecionamento para [[$1]]",
        "autosumm-new": "Criou a página com \"$1\"",
+       "autosumm-newblank": "Página em branco criada",
        "lag-warn-normal": "Alterações realizadas {{PLURAL:$1|no último segundo|nos últimos $1 segundos}} podem não constar desta lista.",
        "lag-warn-high": "Devido a latência elevada no acesso ao servidor da base de dados, as alterações realizadas {{PLURAL:$1|no último segundo|nos últimos $1 segundos}} podem não constar desta lista.",
        "watchlistedit-normal-title": "Editar lista de páginas vigiadas",
index 62837d2..9a1d2e1 100644 (file)
        "tog-watchdefault": "[[Special:Preferences]], tab 'Watchlist'. Offers user to add edited pages to watchlist. {{Gender}}",
        "tog-watchmoves": "[[Special:Preferences]], tab 'Watchlist'. Offers user to add moved pages to watchlist. {{Gender}}",
        "tog-watchdeletion": "[[Special:Preferences]], tab 'Watchlist'. Offers user to add deleted pages to watchlist. {{Gender}}",
+       "tog-watchrollback": "[[Special:Preferences]], tab 'Watchlist'. Offers user to add pages where the user has rollbacked an edit to watchlist. {{Gender}}\n\nSee also {{msg-mw|tog-watchdefault}}, {{msg-mw|tog-watchcreations}}.",
        "tog-minordefault": "[[Special:Preferences]], tab 'Edit'. Offers user to mark all edits minor by default.  {{Gender}}",
        "tog-previewontop": "Toggle option used in [[Special:Preferences]]. {{Gender}}",
        "tog-previewonfirst": "Toggle option used in [[Special:Preferences]]. {{Gender}}",
        "preview": "The title of the Preview page shown after clicking the \"Show preview\" button in the edit page. Since this is a heading, it should probably be translated as a noun and not as a verb.\n\n{{Identical|Preview}}",
        "showpreview": "The text of the button to preview the page you are editing. See also {{msg-mw|showdiff}} and {{msg-mw|savearticle}} for the other buttons.\n\nSee also:\n* {{msg-mw|Showpreview}}\n* {{msg-mw|Accesskey-preview}}\n* {{msg-mw|Tooltip-preview}}\n{{Identical|Show preview}}",
        "showdiff": "Button below the edit page. See also {{msg-mw|Showpreview}} and {{msg-mw|Savearticle}} for the other buttons.\n\nSee also:\n* {{msg-mw|Showdiff}}\n* {{msg-mw|Accesskey-diff}}\n* {{msg-mw|Tooltip-diff}}\n{{Identical|Show change}}",
+       "blankarticle": "Notice displayed once after the user tries to save an empty page.",
        "anoneditwarning": "Shown when editing a page anonymously.\nSee also:\n* {{msg-mw|Sf autoedit anoneditwarning}}\n* {{msg-mw|Wikibase-anonymouseditwarning-property}}\n* {{msg-mw|Wikibase-anonymouseditwarning-item}}\n* {{msg-mw|Anonpreviewwarning}}",
        "anonpreviewwarning": "See also:\n* {{msg-mw|Anoneditwarning}}",
        "missingsummary": "The text \"edit summary\" is in {{msg-mw|Summary}}.\n\nSee also:\n* {{msg-mw|Missingcommentheader}}\n* {{msg-mw|Savearticle}}",
        "rev-deleted-user": "See also:\n* {{msg-mw|Rev-deleted-event}}",
        "rev-deleted-event": "See also:\n* {{msg-mw|Rev-deleted-user}}",
        "rev-deleted-user-contribs": "Part of revision deletion.",
-       "rev-deleted-text-permission": "{{Related|Rev-deleted-text}}",
+       "rev-deleted-text-permission": "This message appears in case a user lacking permission tries to view a past deleted revision of a page, although later revisions of the page still exist.\n{{Related|Rev-deleted-text}}",
+       "rev-suppressed-text-permission": "This message appears in case a user lacking permission tries to view a past suppressed revision of a page, although later revisions of the page still exist.\n{{Related|Rev-deleted-text}}",
        "rev-deleted-text-unhide": "Parameters:\n* $1 - a HTML link to the revision\n{{Related|Rev-deleted-text}}",
        "rev-suppressed-text-unhide": "Parameters:\n* $1 - a HTML link to the revision\n{{Related|Rev-deleted-text}}",
-       "rev-deleted-text-view": "This is an error message which appears if a user tries to view a past revision of a page, where the revision has been hidden from view, although later revisions of the page still exist.",
-       "rev-suppressed-text-view": "{{Related|Rev-deleted-text}}",
+       "rev-deleted-text-view": "This message appears in case a user tries to view a past deleted revision of a page, although later revisions of the page still exist.\n{{Related|Rev-deleted-text}}",
+       "rev-suppressed-text-view": "This message appears in case a user tries to view a past suppressed revision of a page, although later revisions of the page still exist.\n{{Related|Rev-deleted-text}}",
        "rev-deleted-no-diff": "See also:\n* {{msg-mw|Rev-suppressed-no-diff}}",
        "rev-suppressed-no-diff": "See also:\n* {{msg-mw|Rev-deleted-no-diff}}",
        "rev-deleted-unhide-diff": "Parameters:\n* $1 - a HTML link to the diff\n{{Related|Rev-deleted-diff}}",
        "right-deletedtext": "{{doc-right|deletedtext}}",
        "right-browsearchive": "{{doc-right|browsearchive}}",
        "right-undelete": "{{doc-right|undelete}}",
-       "right-suppressrevision": "{{doc-right|suppressrevision}}\nThis user right is part of the [[mw:RevisionDelete|RevisionDelete]] feature.\nIt can be given to the group {{msg-mw|group-suppress}}, although that group is disabled by default.\n\nSee also:\n* {{msg-mw|right-suppressionlog}}\n* {{msg-mw|right-hideuser}}\n* {{msg-mw|right-deletelogentry}}\n* {{msg-mw|right-deleterevision}}",
+       "right-suppressrevision": "{{doc-right|suppressrevision}}\nThis user right is part of the [[mw:RevisionDelete|RevisionDelete]] feature.\nIt can be given to the group {{msg-mw|group-suppress}}, although that group is disabled by default.\n\nSee also:\n* {{msg-mw|right-suppressionlog}}\n* {{msg-mw|right-viewsuppressed}}\n* {{msg-mw|right-hideuser}}\n* {{msg-mw|right-deletelogentry}}\n* {{msg-mw|right-deleterevision}}",
+       "right-viewsuppressed": "{{doc-right|viewsuppressed}}\nThis user right is part of the [[mw:RevisionDelete|RevisionDelete]] feature.\nIt can be given to any group for observation of suppression activities.\n\nSee also:\n* {{msg-mw|right-suppressrevision}}",
        "right-suppressionlog": "{{doc-right|suppressionlog}}\nThis user right is part of the [[mw:RevisionDelete|RevisionDelete]] feature.\nIt can be given to the group {{msg-mw|group-suppress}}, although that group is disabled by default.\n\nSee also\n* {{msg-mw|right-suppressrevision}}\n* {{msg-mw|right-hideuser}}\n* {{msg-mw|right-deletelogentry}}\n* {{msg-mw|right-deleterevision}}",
        "right-block": "{{doc-right|block}}",
        "right-blockemail": "{{doc-right|blockemail}}",
        "recentchanges-legend-bot": "Used as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].\n\nRefers to {{msg-mw|Recentchanges-label-bot}}.",
        "recentchanges-legend-unpatrolled": "Used as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].\n\nRefers to {{msg-mw|Recentchanges-label-unpatrolled}}.",
        "recentchanges-legend-plusminus": "{{optional}}\nA plus/minus sign with a number for the legend.",
-       "rcnotefrom": "This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time.\n\nThe corresponding message is {{msg-mw|Rclistfrom}} (split into date and time).\n\nParameters:\n* $1 - the maximum number of changes that are displayed\n* $2 - a date and time\n* $3 - (Optional) a date\n* $4 - (Optional) a time",
+       "rcnotefrom": "This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time.\n\nThe corresponding message is {{msg-mw|Rclistfrom}}.\n\nParameters:\n* $1 - the maximum number of changes that are displayed\n* $2 - (Optional) a date and time\n* $3 - a date\n* $4 - a time\n* $5 - Number of changes are displayed, for use with PLURAL",
        "rclistfrom": "Used on [[Special:RecentChanges]]. Parameters:\n* $1 - (Currently not use) date and time. The date and the time adds to the rclistfrom description.\n* $2 - time. The time adds to the rclistfrom link description (with split of date and time).\n* $3 - date. The date adds to the rclistfrom link description (with split of date and time).\n\nThe corresponding message is {{msg-mw|Rcnotefrom}}.",
        "rcshowhideminor": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhideminor-show}} or {{msg-mw|rcshowhideminor-hide}}\n{{Identical|Minor edit}}",
        "rcshowhideminor-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideminor}}.\n\nSee also:\n* {{msg-mw|rcshowhideminor-hide}}\n{{Identical|Show}}",
        "watchlist-details": "Message on [[Special:Watchlist]]. Parameters:\n* $1 - number of pages in your watchlist\nThis is paired with the message {{msg-mw|Nowatchlist}} which appears instead of Watchlist-details when $1 is 0.\nSee also:\n* {{msg-mw|Watchlist-options|fieldset}}\n* {{msg-mw|Wlheader-enotif|watchlist header}}\n* {{msg-mw|enotif reset|Submit button text}}\n* {{msg-mw|Watchlistcontains}}",
        "wlheader-enotif": "Message at the top of [[Special:Watchlist]], after {{msg-mw|watchlist-details}}. Has to be a full sentence.\n\nSee also:\n* {{msg-mw|Watchlist-options|fieldset}}\n* {{msg-mw|enotif reset|Submit button text}}",
        "wlheader-showupdated": "Message at the top of [[Special:Watchlist]], after {{msg-mw|watchlist-details}}. Has to be a full sentence.",
-       "wlnote2": "Used on [[Special:Watchlist]] when a maximum number of hours or days is specified.\n\nParameters:\n* $1 - the number of hours for which the changes are shown\n* $2 - a date alone\n* $3 - a time alone\nSee also:\n* {{msg-mw|Wlnote}}",
+       "wlnote": "Used on [[Special:Watchlist]] when a maximum number of hours or days is specified.\n\nParameters:\n* $1 - the number of changes shown\n* $2 - the number of hours for which the changes are shown\n* $3 - a date alone\n* $4 - a time alone",
        "wlshowlast": "Appears on [[Special:Watchlist]]. Parameters:\n* $1 - a choice of different numbers of hours (\"1 | 2 | 6 | 12\")\n* $2 - a choice of different numbers of days (\"1 | 3 | 7\")\n* $3 - {{msg-mw|watchlistall2}}\nClicking 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]]\n\nSee also:\n* {{msg-mw|Watchlist-details|watchlist header}}\n* {{msg-mw|Wlheader-enotif|watchlist header}}\n* {{msg-mw|enotif reset|Submit button text}}",
        "watching": "Text displayed when clicked on the watch tab: {{msg-mw|Watch}}. It means the wiki is adding that page to your watchlist.",
        "importlogpage": "{{doc-logpage}}",
        "importlogpagetext": "This text appears at the top of the [{{canonicalurl:Special:Log|type=import}} import log] special page.",
        "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:\n* $1 is the name of the imported file",
-       "import-logentry-upload-detail": "Used as success message. Parameters:\n* $1 - number of succeeded revisions\nSee also:\n* {{msg-mw|Import-logentry-interwiki-detail}}",
+       "import-logentry-upload-detail": "Used as success message and log entry. Parameters:\n* $1 - number of succeeded revisions\nSee also:\n* {{msg-mw|Import-logentry-interwiki-detail}}",
        "import-logentry-interwiki": "Used as action listed in the log. Parameters:\n* $1 - page title",
-       "import-logentry-interwiki-detail": "Used as success message. Parameters:\n* $1 - number of succeeded revisions\n* $2 - interwiki name\nSee also:\n* {{msg-mw|Import-logentry-upload-detail}}",
+       "import-logentry-interwiki-detail": "Used as success message and log entry. Parameters:\n* $1 - number of succeeded revisions\n* $2 - interwiki name\nSee also:\n* {{msg-mw|Import-logentry-upload-detail}}",
        "javascripttest": "Title of the special page [[Special:JavaScriptTest]].\n\nSee also:\n* {{msg-mw|Javascripttest|title}}\n* {{msg-mw|Javascripttest-pagetext-noframework|summary}}\n* {{msg-mw|Javascripttest-pagetext-unknownframework|error message}}",
        "javascripttest-backlink": "{{optional}}\nUsed as subtitle in [[Special:JavaScriptTest]]. Parameters:\n* $1 - page title",
        "javascripttest-title": "Title of the special page when running a test suite. Parameters:\n* $1 is the name of the framework, for example QUnit.",
        "autosumm-replace": "The auto summary when a user removes a lot of characters in the page.\n\nParameters:\n* $1 - truncated text",
        "autoredircomment": "The auto summary when making a redirect. Parameters:\n* $1 - the page where it redirects to\n* $2 - (Optional) the first X number of characters of the redirect ($2 is usually only used when end users customize the message)",
        "autosumm-new": "The auto summary when creating a new page. $1 are the first X number of characters of the new page.",
+       "autosumm-newblank": "The automatic edit summary when creating a blank page. This is not the same as blanking a page.",
        "autoblock_whitelist": "{{notranslate}}",
        "size-bytes": "{{optional}}\nSize (of a page, typically) in bytes.",
        "size-kilobytes": "{{optional}}\nSize (of a page, typically) in kibibytes (1 kibibyte = 1024 bytes).",
index de09b64..8c084e4 100644 (file)
@@ -40,6 +40,7 @@
        "tog-watchdefault": "Adaugă paginile și fișierele pe care le modific la lista mea de urmărire",
        "tog-watchmoves": "Adaugă paginile și fișierele pe care le redenumesc la lista mea de urmărire",
        "tog-watchdeletion": "Adaugă paginile și fișierele pe care le șterg la lista mea de urmărire",
+       "tog-watchrollback": "Adaugă în lista mea de pagini urmărite acele pagini asupra cărora am efectuat o revenire",
        "tog-minordefault": "Marchează din oficiu toate modificările ca fiind minore",
        "tog-previewontop": "Arată previzualizarea deasupra căsuței de modificare",
        "tog-previewonfirst": "Arată previzualizarea la prima modificare",
        "preview": "Previzualizare",
        "showpreview": "Previzualizare",
        "showdiff": "Afișare diferențe",
+       "blankarticle": "<strong>Atenție:</strong> Pagina pe care o creați este goală.\nDacă faceți din nou clic pe „{{int:savearticle}}”, pagina va fi creată fără niciun conținut.",
        "anoneditwarning": "'''Atenție:''' Nu v-ați autentificat. Adresa IP vă va fi înregistrată în istoricul acestei pagini.",
        "anonpreviewwarning": "''Nu v-ați autentificat. Dacă salvați pagina adresa dumneavoastră IP va fi înregistrată în istoric.''",
        "missingsummary": "'''Atenție:''' Nu ați completat caseta „descriere modificări”. Dacă apăsați din nou butonul „salvează pagina” modificările vor fi salvate fără descriere.",
        "rev-deleted-event": "(intrare ștearsă)",
        "rev-deleted-user-contribs": "[nume de utilizator sau adresă IP ștearsă - modificare ascunsă din contribuții]",
        "rev-deleted-text-permission": "Această versiune a paginii a fost '''ștearsă'''.\nMai multe detalii în [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].",
+       "rev-suppressed-text-permission": "Această versiune a paginii a fost <strong>suprimată</strong>.\nDetalii puteți găsi în [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jurnalul suprimărilor].",
        "rev-deleted-text-unhide": "Această versiune a paginii a fost '''ștearsă'''.\nDetalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].\nCa administrator puteți [$1 vedea această versiune] în continuare, dacă doriți acest lucru.",
        "rev-suppressed-text-unhide": "Această versiune a paginii a fost '''suprimată'''.\nDetalii se pot găsi în [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jurnalul suprimărilor].\nCa administrator puteți [$1 vedea această versiune] în continuare, dacă doriți acest lucru.",
        "rev-deleted-text-view": "Această versiune a paginii a fost '''ștearsă'''.\nCa administrator puteți să o vedeți; detalii puteți găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].",
        "revdelete-text-text": "Versiunile șterse vor continua să fie vizibile în istoricul paginii, însă anumite părți ale conținutului acestora vor fi inaccesibile publicului.",
        "revdelete-text-file": "Versiunile șterse ale fișierului vor continua să fie vizibile în istoricul fișierului, însă anumite părți ale conținutului acestora vor fi inaccesibile publicului.",
        "logdelete-text": "Evenimentele șterse ale jurnalului vor continua să fie vizibile în jurnale, însă anumite părți ale conținutului acestora vor fi inaccesibile publicului.",
-       "revdelete-text-others": "Alți administratori de la {{SITENAME}} vor avea acces în continuare la conținutul ascuns și îl vor putea restaura prin intermediul acestei interfețe, cu excepția cazurilor în care nu sunt activate și restricții suplimentare.",
+       "revdelete-text-others": "Alți administratori vor avea acces în continuare la conținutul ascuns și îl vor restaurarea acestuia, cu excepția cazurilor în care nu sunt activate și restricții suplimentare.",
        "revdelete-confirm": "Vă rugăm să confirmați că intenționați să faceți acest lucru, că înțelegeți consecințele și că faceți asta în conformitate cu [[{{MediaWiki:Policy-url}}|politica]].",
        "revdelete-suppress-text": "Suprimarea trebuie folosită '''doar''' în următoarele cazuri:\n* Informații potențial calomnioase\n* Informații personale inadecvate\n*: ''adrese și numere de telefon personale, CNP, numere de securitate socială etc.''",
        "revdelete-legend": "Restricții de afișare",
        "right-deletedtext": "Vizualizează textul șters și modificările dintre versiunile șterse",
        "right-browsearchive": "Caută pagini șterse",
        "right-undelete": "Recuperează pagini",
-       "right-suppressrevision": "Examinează și restaurează reviziile ascunse față de administratori",
+       "right-suppressrevision": "Vizualizează, ascunde și restaurează versiuni specifice ale paginilor față de orice utilizator",
+       "right-viewsuppressed": "Vizualizează versiuni ascunse față de orice utilizator",
        "right-suppressionlog": "Vizualizează jurnale private",
        "right-block": "Blochează alți utilizatori la modificare",
        "right-blockemail": "Blochează alți utilizatori la trimiterea e-mailurilor",
        "recentchanges-legend-heading": "'''Legendă:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vedeți și [[Special:NewPages|lista cu pagini noi]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Dedesubt sunt modificările începând cu <b>$2</b> (maximum <b>$1</b> afișate).",
+       "rcnotefrom": "Dedesubt {{PLURAL:$5|se află o modificare|sunt modificările}} începând cu <b>$3, $4</b> (maximum <b>$1</b> afișate).",
        "rclistfrom": "Se afișează modificările începând cu $3, $2",
        "rcshowhideminor": "$1 modificările minore",
        "rcshowhideminor-show": "Arată",
        "nolicense": "Nici una selectată",
        "licenses-edit": "Modifică opțiunile pentru licență",
        "license-nopreview": "(Previzualizare indisponibilă)",
-       "upload_source_url": " (un URL valid, accesibil public)",
-       "upload_source_file": " (un fișier de pe computerul dv.)",
+       "upload_source_url": "(fișierul ales de dumneavoastră dintr-un URL valid, accesibil public)",
+       "upload_source_file": "(fișierul ales de dumnevoastră de pe calculatorul dv.)",
        "listfiles-delete": "șterge",
        "listfiles-summary": "Această pagină specială listează toate fișierele încărcate.",
        "listfiles_search_for": "Căutare fișiere după nume:",
        "watchlist-details": "{{PLURAL:$1|O pagină|$1 pagini urmărite|$1 de pagini urmărite}}, fără a include separat paginile de discuție.",
        "wlheader-enotif": "Notificarea prin e-mail este activată.",
        "wlheader-showupdated": "Paginile care au fost modificate după ultima dumneavoastră vizită sunt afișate '''îngroșat'''.",
-       "wlnote2": "Mai jos se află schimbările din {{PLURAL:$1|ultima oră|ultimele <strong>$1</strong> ore|ultimele <strong>$1</strong> de ore}}, așa cum era situația la $2, $3.",
+       "wlnote": "Mai jos se află {{PLURAL:$1|ultima schimbare|ultimele <strong>$1</strong> schimbări|ultimele <strong>$1</strong> de schimbări}} din {{PLURAL:$2|ultima oră|ultimele <strong>$2</strong> ore|ultimele <strong>$2</strong> 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",
        "watching": "Se urmăreș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-error-edit": "Pagina „$1” nu a fost importată deoarece nu vă este permis s-o modificați.",
+       "import-error-create": "Pagina „$1” nu a fost importată deoarece nu vă este permis s-o creați.",
+       "import-error-interwiki": "Pagina „$1” nu a fost importată deoarece numele acesteia este rezervat pentru legături externe (interwiki).",
+       "import-error-special": "Pagina „$1” nu a fost importată deoarece aparține unui spațiu de nume special care nu admite pagini.",
+       "import-error-invalid": "Pagina „$1” nu a fost importată deoarece numele sub care ar fi fost importată nu este valid pe acest wiki.",
        "import-error-unserialize": "Versiunea $2 a paginii „$1” nu poate fi deserializată. Versiunea a fost raportată ca utilizând modelul de conținut $3 serializat ca $4.",
        "import-error-bad-location": "Versiunea $2, care folosește modelul de conținut $3, nu a putut fi stocată în pagina „$1” de pe acest wiki, de vreme ce acel model nu este acceptat pe acea pagină.",
        "import-options-wrong": "{{PLURAL:$2|Opțiune eronată|Opțiuni eronate}}: <nowiki>$1</nowiki>",
        "importlogpage": "Log import",
        "importlogpagetext": "Imoprturi administrative de pagini de la alte wiki, cu istoricul editărilor.",
        "import-logentry-upload": "a importat [[$1]] prin încărcare de fișier",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|versiune|versiuni|de versiuni}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|versiune importată|versiuni importate|de versiuni importate}}",
        "import-logentry-interwiki": "transwikificat $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versiune|versiuni|de versiuni}} de la $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versiune|versiuni|de versiuni}} importate de la $2",
        "javascripttest": "Testare JavaScript",
        "javascripttest-title": "Rulare teste pentru $1",
        "javascripttest-pagetext-noframework": "Această pagină este rezervată rulării testelor JavaScript.",
        "autosumm-replace": "Pagină înlocuită cu „$1”",
        "autoredircomment": "Redirecționat înspre [[$1]]",
        "autosumm-new": "Pagină nouă: $1",
+       "autosumm-newblank": "A creat o pagină goală",
        "lag-warn-normal": "Modificările mai noi de $1 {{PLURAL:$1|secondă|seconde}} pot să nu apară în listă.",
        "lag-warn-high": "Serverul bazei de date este suprasolicitat, astfel încît modificările făcute în ultimele $1 {{PLURAL:$1|secundă|secunde}} pot să nu apară în listă.",
        "watchlistedit-normal-title": "Modificare listă pagini urmărite",
index 2051860..4c817bb 100644 (file)
@@ -67,7 +67,8 @@
                        "아라",
                        "Eroha",
                        "Niklem",
-                       "Agilight"
+                       "Agilight",
+                       "Oleg3280"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
@@ -84,6 +85,7 @@
        "tog-watchdefault": "Добавлять в список наблюдения изменённые мной страницы и описания файлов",
        "tog-watchmoves": "Добавлять в список наблюдения переименованные мной страницы и файлы",
        "tog-watchdeletion": "Добавлять в список наблюдения удалённые мной страницы и файлы",
+       "tog-watchrollback": "Добавлять страницы, где я выполнил откат, в мой список наблюдения",
        "tog-minordefault": "Помечать по умолчанию правки как малозначимые",
        "tog-previewontop": "Помещать предпросмотр перед окном редактирования",
        "tog-previewonfirst": "Показывать предпросмотр при переходе к редактированию",
        "preview": "Предпросмотр",
        "showpreview": "Предварительный просмотр",
        "showdiff": "Внесённые изменения",
+       "blankarticle": "<strong>Предупреждение:</strong> Страница, которую вы создаёте, пуста.\nЕсли снова нажмёте кнопку «{{int:savearticle}}», страница будет создана без какого-либо содержания.",
        "anoneditwarning": "'''Внимание!''' Вы не авторизовались на сайте.\nВ истории изменений этой страницы будет записан ваш IP-адрес.",
        "anonpreviewwarning": "''Вы не представились системе. Сохранение приведёт к записи вашего IP-адреса в историю изменений страницы.''",
        "missingsummary": "'''Напоминание.''' Вы не дали краткого описания изменений. При повторном нажатии на кнопку «{{int:savearticle}}», ваши изменения будут сохранены без комментария.",
        "rev-deleted-event": "(запись удалена)",
        "rev-deleted-user-contribs": "[имя участника или IP-адрес удалены — правка скрыта со страницы вклада]",
        "rev-deleted-text-permission": "Эта версия страницы была '''удалена'''.\nВозможно, объяснения даны в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
+       "rev-suppressed-text-permission": "Эта версия страницы была <strong>скрыта</strong>.\nОбъяснения удаления приведены в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале сокрытий].",
        "rev-deleted-text-unhide": "Эта версия страницы была '''удалена'''.\nОбъяснения приведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].\nПри желании вы можете [$1 просмотреть данную версию].",
        "rev-suppressed-text-unhide": "Эта версия страницы была '''скрыта'''.\nОбъяснения приведены в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале сокрытий].\nПри желании вы можете [$1 просмотреть данную версию].",
        "rev-deleted-text-view": "Эта версия страницы была '''удалена'''.\nВы можете просмотреть её. Объяснения удаления приведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
        "revdelete-text-text": "Удалённые версии будут по-прежнему видны в истории страницы, но части их содержимого будут недоступны для участников.",
        "revdelete-text-file": "Удалённые версии файла будут по-прежнему видны в истории страницы, но части их содержимого будут недоступны для участников.",
        "logdelete-text": "Удалённые события в журнале будут по-прежнему видны в журналах, но части их содержимого будут недоступны для участников.",
-       "revdelete-text-others": "Ð\94Ñ\80Ñ\83гие Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\8b Ð½Ð° {{grammar:genitive|{{SITENAME}}}} Ð¿Ð¾-пÑ\80ежнемÑ\83 Ð±Ñ\83деÑ\82 Ð¸Ð¼ÐµÑ\82Ñ\8c Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñ\81Ñ\82Ñ\8c Ð´Ð¾Ñ\81Ñ\82Ñ\83па Ðº Ñ\81кÑ\80Ñ\8bÑ\82омÑ\83 Ñ\81одеÑ\80жимомÑ\83 Ð¸ Ñ\81могÑ\83Ñ\82 Ð²Ð¾Ñ\81Ñ\81Ñ\82ановиÑ\82Ñ\8c ÐµÐ³Ð¾ Ñ\81нова Ñ\87еÑ\80ез Ñ\8dÑ\82оÑ\82 Ð¶Ðµ Ð¸Ð½Ñ\82еÑ\80Ñ\84ейÑ\81, если не установлены дополнительные ограничения.",
+       "revdelete-text-others": "Ð\94Ñ\80Ñ\83гие Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\8b Ð¿Ð¾-пÑ\80ежнемÑ\83 Ð±Ñ\83дÑ\83Ñ\82 Ð¸Ð¼ÐµÑ\82Ñ\8c Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñ\81Ñ\82Ñ\8c Ð´Ð¾Ñ\81Ñ\82Ñ\83па Ðº Ñ\81кÑ\80Ñ\8bÑ\82омÑ\83 Ñ\81одеÑ\80жимомÑ\83 Ð¸ Ñ\81могÑ\83Ñ\82 Ð²Ð¾Ñ\81Ñ\81Ñ\82ановиÑ\82Ñ\8c ÐµÐ³Ð¾, если не установлены дополнительные ограничения.",
        "revdelete-confirm": "Пожалуйста, подтвердите, что вы действительно желаете совершить это действие, осознаёте последствия, делаете это в соответствии с [[{{MediaWiki:Policy-url}}|правилами]].",
        "revdelete-suppress-text": "Сокрытие может производиться '''только''' в следующих случаях:\n* Потенциально клеветническая информация\n* Неуместная личная информация\n*: ''домашний адрес, номера телефонов, номер паспорта и т. д.''",
        "revdelete-legend": "Установить ограничения:",
        "right-deletedtext": "просмотр удалённого текста и изменений между удалёнными версиями страниц",
        "right-browsearchive": "поиск удалённых страниц",
        "right-undelete": "восстановление страниц",
-       "right-suppressrevision": "просмотр и восстановление скрытых от администраторов версий страниц",
+       "right-suppressrevision": "Просмотр, скрытие и восстановление скрытых версий страниц",
+       "right-viewsuppressed": "Просмотр версий, скрытых от всех участников",
        "right-suppressionlog": "просмотр частных журналов",
        "right-block": "установка ограничений на редактирование для других участников",
        "right-blockemail": "установка запрета на отправку электронной почты",
        "recentchanges-legend-heading": "'''Легенда:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (см. также [[Special:NewPages|список новых страниц]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Ниже перечислены изменения с <strong>$2</strong> (показано не более <strong>$1</strong>).",
+       "rcnotefrom": "Ниже {{PLURAL:$5|указано изменение|перечислены изменения}} с <strong>$3, $4</strong> (показано не более <strong>$1</strong>).",
        "rclistfrom": "Показать изменения с $3 $2.",
        "rcshowhideminor": "$1 малые правки",
        "rcshowhideminor-show": "Показать",
        "upload-preferred": "Предпочтительные типы файлов: $1.",
        "upload-prohibited": "Запрещённые типы файлов: $1.",
        "uploadlogpage": "Журнал загрузок",
-       "uploadlogpagetext": "Ниже представлен список последних загрузок файлов.\nСм. также [[Special:NewFiles|галерею новых файлов]], где сведения о новых загрузках представлены в более наглядном виде.",
+       "uploadlogpagetext": "Ниже представлен список последних загрузок файлов.\nСм. также [[Special:NewFiles|галерею новых файлов]], где сведения о новых загрузках представлены в более наглядном виде, и [[Special:ListFiles|все загруженные файлы]].",
        "filename": "Имя файла",
        "filedesc": "Краткое описание",
        "fileuploadsummary": "Краткое описание:",
        "nolicense": "Отсутствует",
        "licenses-edit": "Изменить параметры лицензии",
        "license-nopreview": "(Предпросмотр недоступен)",
-       "upload_source_url": " (правильный, публично доступный интернет-адрес)",
-       "upload_source_file": " (файл на вашем компьютере)",
+       "upload_source_url": "(вы выбрали правильный, публично доступный интернет-адрес)",
+       "upload_source_file": "(вы выбрали файл на вашем компьютере)",
        "listfiles-delete": "удалить",
        "listfiles-summary": "Эта служебная страница показывает все загруженные файлы.",
        "listfiles_search_for": "Поиск по имени файла:",
        "watchlist-details": "В вашем списке наблюдения $1 {{PLURAL:$1|страница|страниц|страницы}}, не считая страниц обсуждений.",
        "wlheader-enotif": "Уведомления по эл. почте включены.",
        "wlheader-showupdated": "Страницы, изменившиеся с вашего последнего их посещения, выделены '''жирным''' шрифтом.",
-       "wlnote2": "Ниже приведены изменения за {{PLURAL:$1|последний час|последние <strong>$1</strong> часов|последние <strong>$1</strong> часа}} на $2 $3.",
+       "wlnote": "Ниже {{PLURAL:$1|показано последнее изменение|показаны <strong>$1</strong> последних изменений|показаны <strong>$1</strong> последние изменения}} за {{PLURAL:$2|последний час|последние <strong>$2</strong> часов|последние <strong>$2</strong> часа}}, по состоянию на $3 $4.",
        "wlshowlast": "Показать за последние $1 часов $2 дней $3",
        "watchlist-options": "Настройки списка наблюдения",
        "watching": "Добавление в список наблюдения…",
        "import-error-create": "Страница «$1» не была импортирована, так как вам не разрешено её создавать.",
        "import-error-interwiki": "Страница «$1» не была импортирована, так как её название зарезервировано для внешних ссылок (интервики).",
        "import-error-special": "Страница «$1» не была импортирована, так как она относится к особому пространству имён, не позволяющему создавать страницы.",
-       "import-error-invalid": "Страница «$1» не была импортирована из-за недопустимого названия.",
+       "import-error-invalid": "Страница «$1» не была импортирована, так как имя, с которым она должна быть импортирована, недопустима в этой вики.",
        "import-error-unserialize": "Версия $2 страницы «$1» не может быть структурирована (десериализована). Получено сообщение, что в этой версии использована модель содержимого $3,  сериализуемая в формате $4.",
        "import-error-bad-location": "Правка $2, использующая модель содержимого $3, не может быть сохранена в «$1» этой вики, потому что эта модель не поддерживается на данной странице.",
        "import-options-wrong": "{{PLURAL:$2|1=Неверная опция|Неверные опции}}: <nowiki>$1</nowiki>",
        "importlogpage": "Журнал импорта",
        "importlogpagetext": "Импортирование администраторами страниц с историей изменений из других вики.",
        "import-logentry-upload": "«[[$1]]» — импорт из файла",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|версия|версий|версии}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|версия импортирована|версий импортировано|версии импортировано}}",
        "import-logentry-interwiki": "«$1» — межвики импорт",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|версия|версий|версии}} из $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|версия импортирована|версий  импортировано|версии импортировано}} из $2",
        "javascripttest": "Проверка JavaScript",
        "javascripttest-title": "Проводится проверка $1",
        "javascripttest-pagetext-noframework": "Эта страница зарезервирована для запуска JavaScript-тестов.",
        "autosumm-replace": "Содержимое страницы заменено на «$1»",
        "autoredircomment": "Перенаправление на [[$1]]",
        "autosumm-new": "Новая страница: «$1»",
+       "autosumm-newblank": "Создана пустая страница",
        "size-bytes": "$1 байт",
        "size-kilobytes": "$1 КБ",
        "size-megabytes": "$1 МБ",
index b2c68bb..613b3b9 100644 (file)
@@ -7,54 +7,55 @@
                        "Node ue",
                        "לערי ריינהארט",
                        "아라",
-                       "Via maxima"
+                       "Via maxima",
+                       "Uharteko"
                ]
        },
-       "tog-underline": "Sutalìnea is cullegamentos",
-       "tog-hideminor": "Cua is acontzos minores in sa pàgina de is ùrtimas mudàntzias",
-       "tog-hidepatrolled": "Cua is acontzos verificados in is ùrtimas mudàntzias",
-       "tog-newpageshidepatrolled": "Cua is pàginas verificadas dae sa lista de is pàginas noas",
-       "tog-extendwatchlist": "Ammània sa watchlist pro ammustrare totu is mudàntzias, non feti is prus reghentes",
-       "tog-usenewrc": "Poni a pari is mudàntzias de dònnia pàgina in is ùrtimas mudàntzias e in watchlist",
-       "tog-numberheadings": "Auto-numeratzione de is tìtulos",
-       "tog-showtoolbar": "Amosta s'amusta de is ainas pro is acontzos",
-       "tog-editondblclick": "Acontza pàginas cun dòpiu click",
-       "tog-editsectiononrightclick": "Abilita s'acontzu de is setziones cun click a dereta in is tìtulos de is setziones",
-       "tog-watchcreations": "Aciungi is pàginas chi apo creadu e is files chi apo carrigau a sa watchlist mea",
-       "tog-watchdefault": "Aciungi pàginas e files chi apo acontzadu a sa watchlist mea",
-       "tog-watchmoves": "Aciungi pàginas e files chi apo mòvidu a sa watchlist mea",
-       "tog-watchdeletion": "Aciungi pàginas e files chi apo fuliadu a sa watchlist mea",
-       "tog-minordefault": "Signa totu is acontzos comente minores pro difetu",
-       "tog-previewontop": "Ammustra s'antiprima a subra sa casella de acontzu e no a suta",
-       "tog-previewonfirst": "Ammustra s'antiprima pro su primu acontzu",
-       "tog-enotifwatchlistpages": "Spedi·mi una missada eletrònica cando una pàgina o file de sa watchlist mea est acontzada",
-       "tog-enotifusertalkpages": "Spedi·mi una missada eletrònica cando sa pàgina de is cuntierras mias est acontzada",
-       "tog-enotifminoredits": "Spedi·mi una missada eletrònica fintzas pro is acontzos minores de is pàginas e files",
-       "tog-enotifrevealaddr": "Faghe schire s'indiritzu e-mail miu in is notìficas de is e-mails",
-       "tog-shownumberswatching": "Ammustra su nùmeru de is usuàrios ca sunt ponende ogru a sa pàgina",
+       "tog-underline": "Sutalìnia sos ligàmenes",
+       "tog-hideminor": "Cua sos càmbios minores in sa pàgina de sos ùrtimas càmbios",
+       "tog-hidepatrolled": "Cua sos càmbios verificados in sos ùrtimos càmbios",
+       "tog-newpageshidepatrolled": "Cua sas pàginas verificadas dae sa lista de sas pàginas noas",
+       "tog-extendwatchlist": "Ammània sa watchlist pro ammustrare totu sos càmbios, non sos prus reghentes ebbia",
+       "tog-usenewrc": "Pone in pare sos càmbios de cada pàgina in sos ùrtimos càmbios e in sa watchlist",
+       "tog-numberheadings": "Auto-numeratzione de sos tìtulos",
+       "tog-showtoolbar": "Ammustra sa mustra de sa barra de sas ainas",
+       "tog-editondblclick": "Càmbia pàginas cun duos click",
+       "tog-editsectiononrightclick": "Abìlita su càmbiu de sas setziones cun click de dereta in sos tìtulos de sas setziones",
+       "tog-watchcreations": "Agiunghe sas pàginas chi apo creadu e sos documentos chi apo carrigadu in sa watchlist mea",
+       "tog-watchdefault": "Agiunghe pàginas e documentos chi apo cambiadu in sa watchlist mea",
+       "tog-watchmoves": "Agiunghe pàginas e documentos chi apo mòvidu in sa watchlist mea",
+       "tog-watchdeletion": "Agiunghe pàginas e documentos chi apo fuliadu in sa watchlist mea",
+       "tog-minordefault": "Marca comente minores pro difetu totu sos càmbios",
+       "tog-previewontop": "Ammustra s'anteprima in subra de sa casella de càmbiu e no in suta",
+       "tog-previewonfirst": "Ammustra s'anteprima pro su primu càmbiu",
+       "tog-enotifwatchlistpages": "Imbia·mi una post.el. cando b'at àpidu unu càmbiu in una pàgina o in unu documentu de sa watchlist mea",
+       "tog-enotifusertalkpages": "Imbia·mi una post.el. cando sa pàgina de sas cuntierras meas est cambiada",
+       "tog-enotifminoredits": "Imbia·mi una post.el. fintzas pro sos càmbios minores de sas pàginas e documentos",
+       "tog-enotifrevealaddr": "Faghe ischire s'indiritzu de sa post.el. mea in sas notìficas de sa post.els",
+       "tog-shownumberswatching": "Ammustra su nùmeru de sos utentes chi sunt castiende sa pàgina",
        "tog-oldsig": "Firma atuale:",
-       "tog-fancysig": "Trata sa firma comente unu testu wiki (chentza cullegamentos automaticos)",
-       "tog-uselivepreview": "Imprea sa funtzione \"live preview\" (sperimentale)",
-       "tog-forceeditsummary": "Avertimì si su campu ogetu est buidu",
-       "tog-watchlisthideown": "Cua is acontzos meos dae sa watclist",
-       "tog-watchlisthidebots": "Cua is acontzos de is bots dae sa watchlist",
-       "tog-watchlisthideminor": "Cua is acontzos minores dae sa watchlist",
-       "tog-watchlisthideliu": "Cua is acontzos de is usuàrios intraus dae sa watchlist",
-       "tog-watchlisthideanons": "Cua is acontzos de is usuàrios anonimus dae sa watchlist",
-       "tog-watchlisthidepatrolled": "Cua acontzos verificados dae sa watchlist",
-       "tog-ccmeonemails": "Spedi·mi is còpias de is e-mails ca spedu a is àteros usuàrios",
-       "tog-showhiddencats": "Ammustra is categorias cuadas",
+       "tog-fancysig": "Trata sa firma comente unu testu wiki (sena ligàmenes automàticos)",
+       "tog-uselivepreview": "Imprea sa funtzione \"anteprima bia\" (isperimentale)",
+       "tog-forceeditsummary": "Averte·mi si su campu ogetu est bòidu",
+       "tog-watchlisthideown": "Cua sos càmbios meos dae sa watclist",
+       "tog-watchlisthidebots": "Cua sos càmbios de sos bots dae sa watchlist",
+       "tog-watchlisthideminor": "Cua sos càmbios minores dae sa watchlist",
+       "tog-watchlisthideliu": "Cua sos càmbios de sos utentes intrados dae sa watchlist",
+       "tog-watchlisthideanons": "Cua sos càmbios de sos utentes anònimos dae sa watchlist",
+       "tog-watchlisthidepatrolled": "Cua càmbios verificados dae sa watchlist",
+       "tog-ccmeonemails": "Imbia·mi sas còpias de sas post.els chi imbio a sos àteros utentes",
+       "tog-showhiddencats": "Ammustra sas categorias cuadas",
        "tog-useeditwarning": "Amonestamì si lassu una pagina cun mudantzias chena de sarvai.",
-       "tog-prefershttps": "Impera sempiri una linia segura candu fatzu s'intrada.",
+       "tog-prefershttps": "Imprea semper una lìnia segura candu fatzo s'intrada.",
        "underline-always": "Semper",
        "underline-never": "Mai",
-       "underline-default": "Definiduras dae su browser tuo",
-       "editfont-style": "Stile lìteras in s'àrea de acontzu:",
-       "editfont-default": "Definidu dae su browser",
-       "editfont-monospace": "Font monospàtziu",
-       "editfont-sansserif": "Font sans-serif",
-       "editfont-serif": "Font serif",
-       "sunday": "Domìnigu",
+       "underline-default": "Definitziones dae su navigadore tuo",
+       "editfont-style": "Istile de sos caràteres in s'àrea de càmbiu:",
+       "editfont-default": "Definidu dae su navigadore",
+       "editfont-monospace": "Caràtere monospàtziu",
+       "editfont-sansserif": "Caràtere sena gràtzias",
+       "editfont-serif": "Caràtere cun gràtzias",
+       "sunday": "Domìniga",
        "monday": "Lunis",
        "tuesday": "Martis",
        "wednesday": "Mèrcuris",
        "aug": "Aus",
        "sep": "Cab",
        "oct": "Stg",
-       "nov": "Std",
+       "nov": "Sta",
        "dec": "Nad",
-       "january-date": "Gennàrgiu $1",
-       "february-date": "Friàrgiu $1",
+       "january-date": "Ghennàrgiu $1",
+       "february-date": "Freàrgiu $1",
        "march-date": "Martzu $1",
-       "april-date": "Abrili $1",
+       "april-date": "Abrile $1",
        "may-date": "Maju $1",
        "june-date": "Làmpadas $1",
        "july-date": "Trìulas $1",
        "august-date": "Austu $1",
        "september-date": "Cabudanni $1",
-       "october-date": "Santuaine $1",
-       "november-date": "Onniassantu $1",
-       "december-date": "Mesi de Nadali $1",
+       "october-date": "Santugaine $1",
+       "november-date": "Santandria $1",
+       "december-date": "Nadale $1",
        "pagecategories": "{{PLURAL:$1|Categoria|Categorias}}",
        "category_header": "Pàginas in sa categoria \"$1\"",
        "subcategories": "Subcategorias",
        "category-media-header": "Mèdios in sa categoria \"$1\"",
-       "category-empty": "''In custa categoria non bi est peruna pàgina o mèdiu.''",
+       "category-empty": "''In custa categoria non b't peruna pàgina o mèdiu.''",
        "hidden-categories": "{{PLURAL:$1|Categoria cuada|Categorias cuadas}}",
        "hidden-category-category": "Categorias cuadas",
-       "category-subcat-count": "{{PLURAL:$2|Custa categoria cuntenet un'ùnica subcategoria ammustrada a suta.|Custa categoria cuntenet {{PLURAL:$1|sa subcategoria indicada|$1 subcategorias indicadas}} a suta, de $2 totales.}}",
-       "category-subcat-count-limited": "Custa categoria tenet {{PLURAL:$1|una subcategoria, ammustrada|$1 subcategorias, ammustradas}} a suta.",
-       "category-article-count": "{{PLURAL:$2|Custa categoria cuntènnit isceti sa pàgina chi sighit.|Custa categoria cuntènnit {{PLURAL:$1|sa pàgina indicada|is $1 pàginas indicadas}} a suta, dae unu totale de $2.}}",
-       "category-article-count-limited": "{{PLURAL:$1|Sa pàgina ki sighit est|Is $1 pàginas ki sighint sunt}} in custa categoria.",
-       "category-file-count": "{{PLURAL:$2|Custa categoria cuntenet feti su file ki sighit.|{{PLURAL:$1|Su file ki sighit est|Is $1 files ki sighint sunt}} in custa categoria, dae $2 totales.}}",
-       "category-file-count-limited": "{{PLURAL:$1|Su file ki sighit est|Is $1 files ki sighint sunt}} in sa categoria currente.",
+       "category-subcat-count": "{{PLURAL:$2|Custa categoria cuntenet un'ùnica subcategoria ammustrada in suta.|Custa categoria cuntenet {{PLURAL:$1|sa subcategoria inditada|$1 subcategorias inditadas}} in suta, de $2 totales.}}",
+       "category-subcat-count-limited": "Custa categoria tenet {{PLURAL:$1|una subcategoria, ammustrada|$1 subcategorias, ammustradas}} in suta.",
+       "category-article-count": "{{PLURAL:$2|Custa categoria cuntenet feti sa pàgina chi sighit.|Custa categoria cuntenet {{PLURAL:$1|sa pàgina inditada|is $1 pàginas inditadas}} in suta, dae unu totale de $2.}}",
+       "category-article-count-limited": "{{PLURAL:$1|Sa pàgina chi sighit est|Is $1 pàginas chi sighint sunt}} in custa categoria.",
+       "category-file-count": "{{PLURAL:$2|Custa categoria cuntenet feti su documentu chi sighit.|{{PLURAL:$1|Su documentu chi sighit est|Is $1 documentos chi sighint sunt}} in custa categoria, dae $2 totales.}}",
+       "category-file-count-limited": "{{PLURAL:$1|Su documentu chi sighit est|Is $1 documentos chi sighint sunt}} in sa categoria currente.",
        "listingcontinuesabbrev": "sighit",
-       "index-category": "Pàginas indicizadas",
-       "noindex-category": "Pàginas no indicitzadas",
+       "index-category": "Pàginas inditzizadas",
+       "noindex-category": "Pàginas no inditzitzadas",
+       "broken-file-category": "Pàginas cun ligàmenes a sos documentos non funtzionantes",
        "about": "A propòsitu de",
        "article": "Artìculu",
-       "newwindow": "(aberit in una bentana noa)",
+       "newwindow": "(aberit in una ventana noa)",
        "cancel": "Burra",
        "moredotdotdot": "Àteru…",
        "morenotlisted": "Sa lista no est cumpreta",
        "mypage": "Pàgina",
        "mytalk": "Cuntierras meas",
-       "anontalk": "Cuntierras pro custu IP",
-       "navigation": "Navigadura",
+       "anontalk": "Cuntierras pro custu indiritzu IP",
+       "navigation": "Navigatzione",
        "and": "&#32;e",
        "qbfind": "Busca",
        "qbbrowse": "Nàviga",
-       "qbedit": "Acontza",
+       "qbedit": "Càmbia",
        "qbpageoptions": "Possibilidades de sa pàgina",
-       "qbmyoptions": "Is preferèntzias meas",
-       "faq": "Pregontas/Respostas (FAQ)",
+       "qbmyoptions": "Sas preferèntzias meas",
+       "faq": "Pregontas/Rispostas (FAQ)",
        "faqpage": "Project:FAQ",
        "actions": "Atziones",
        "namespaces": "Nùmene-logos",
        "variants": "Variantes",
-       "navigation-heading": "Menu po nàvigu",
+       "navigation-heading": "Menu pro navigatzione",
        "errorpagetitle": "Faddina",
        "returnto": "Torra a $1.",
        "tagline": "Dae {{SITENAME}}",
        "searcharticle": "Bae",
        "history": "Istòria de sa pàgina",
        "history_short": "Istòria",
-       "updatedmarker": "agiornada dae s'ùrtima bìsita mia",
+       "updatedmarker": "atualizada dae s'ùrtima vìsita mea",
        "printableversion": "Versione de imprenta",
-       "permalink": "Acàpiu fitianu",
+       "permalink": "Ligàmene permanente",
        "print": "Imprenta",
-       "view": "Amosta",
-       "view-foreign": "Amosta in $1",
-       "edit": "Acontza",
-       "edit-local": "Acontza sa descridura locali",
+       "view": "Ammustra",
+       "view-foreign": "Ammustra in $1",
+       "edit": "Càmbia",
+       "edit-local": "Càmbia sa descritzione locale",
        "create": "Crea",
-       "create-local": "Aciungi descridura locali",
-       "editthispage": "Acontza custa pàgina",
+       "create-local": "Agiunghe descritzione locale",
+       "editthispage": "Càmbia custa pàgina",
        "create-this-page": "Crea custa pàgina",
-       "delete": "Fùlia",
-       "deletethispage": "Fùlia custa pàgina",
-       "undeletethispage": "Torrandi custa pàgina",
-       "undelete_short": "Restaurare {{PLURAL:$1|un acontzu|$1 acontzos}}",
-       "viewdeleted_short": "Amosta {{PLURAL:$1|unu acontzu burradu|$1 acontzos burrados}}",
+       "delete": "Burra",
+       "deletethispage": "Burra custa pàgina",
+       "undeletethispage": "Non burres custa pàgina",
+       "undelete_short": "Non burres {{PLURAL:$1|unu càmbiu|$1 càmbios}}",
+       "viewdeleted_short": "Ammustra {{PLURAL:$1|unu càmbiu burradu|$1 càmbios burrados}}",
        "protect": "Ampara",
-       "protect_change": "mudàntzia",
+       "protect_change": "càmbiu",
        "protectthispage": "Ampara custa pàgina",
        "unprotect": "Muda amparu",
        "unprotectthispage": "Muda amparu de custa pàgina",
        "talkpagelinktext": "Cuntierra",
        "specialpage": "Pàgina Ispetziale",
        "personaltools": "Ainas personales",
-       "postcomment": "Setzione noa",
        "articlepage": "Càstia s'artìculu",
        "talk": "Cuntierras",
-       "views": "Bisuras",
+       "views": "Vistas",
        "toolbox": "Ainas",
-       "userpage": "Càstia sa pàgina usuàriu",
+       "userpage": "Càstia sa pàgina utente",
        "projectpage": "Càstia sa pàgina meta",
-       "imagepage": "Càstia sa pàgina de su file",
+       "imagepage": "Càstia sa pàgina de su documentu",
        "mediawikipage": "Càstia su messàgiu",
-       "templatepage": "Càstia su template",
+       "templatepage": "Càstia su modellu de documentu",
        "viewhelppage": "Càstia sa pàgina de agiudu",
        "categorypage": "Càstia sa categoria",
        "viewtalkpage": "Càstia cuntierras",
        "otherlanguages": "Àteras limbas",
        "redirectedfrom": "(Reindiritzadu dae $1)",
-       "redirectpagesub": "Pàgina de reindiritzadura",
-       "lastmodifiedat": "Ùrtimu acontzu su $1, a is $2.",
-       "viewcount": "Custu artìculu est stadu lìgiu {{PLURAL:$1|borta|$1 bortas}}.",
+       "redirectpagesub": "Pàgina de reindiritzamentu",
+       "lastmodifiedat": "Ùrtimu càmbiu su $1, a is $2.",
+       "viewcount": "Custu artìculu l'ant lèghidu {{PLURAL:$1|borta|$1 bortas}}.",
        "protectedpage": "Pàgina amparada",
        "jumpto": "Bae a:",
-       "jumptonavigation": "navigadura",
+       "jumptonavigation": "navigatzione",
        "jumptosearch": "chirca",
-       "view-pool-error": "Teni passièntzia, is servers funt càrrigus de traballu.\nIn medas megant de biri custa pàgina.\nPo praxeri, torra a provai tra unu pagu.\n\n$1",
-       "generic-pool-error": "Teni passièntzia, is servers funt càrrigus de traballu.\nIn medas megant de biri custa risorsa.\nPo praxeri, torra a provai tra unu pagu.",
+       "view-pool-error": "Tene passèntzia, sos servidores sunt càrrigos de traballu.\nIn medas chircant de castiare custa pàgina.\nPro praghere, torra a provare luego.\n\n$1",
+       "generic-pool-error": "Tene passèntzia, sos servidores sunt càrrigos de traballu.\nIn medas chircant de castiare custa risorsa.\nPro praghere, torra a provare luego.",
        "pool-errorunknown": "Faddina disconnota",
        "aboutsite": "A propòsitu de {{SITENAME}}",
        "aboutpage": "Project:Informatziones",
-       "copyright": "Cuntènnidu a suta licèntzia $1.",
-       "copyrightpage": "{{ns:project}}:Copyrights",
+       "copyright": "Cuntenutu suta de lissèntzia $1.",
+       "copyrightpage": "{{ns:project}}: Deretos de còpia",
        "currentevents": "Noas",
        "currentevents-url": "Project:Noas",
-       "disclaimers": "Abbertimentos",
-       "disclaimerpage": "Project:Abbertimentos generales",
-       "edithelp": "Agiudu pro s'acontzu o sa scritura",
+       "disclaimers": "Avertèntzias",
+       "disclaimerpage": "Project:Avertèntzias generales",
+       "edithelp": "Agiudu pro su càmbiu o s'iscritura",
        "mainpage": "Pàgina Base",
        "mainpage-description": "Pàgina Base",
        "policy-url": "Project:Polìticas",
        "portal": "Portale comunidade",
-       "privacy": "Polìtica pro is datos privados",
-       "privacypage": "Project:Polìtica pro is datos privados",
+       "portal-url": "Project:Portale Comunidade",
+       "privacy": "Polìtica pro sos datos privados",
+       "privacypage": "Project:Polìtica pro sos datos privados",
        "badaccess": "Permissu non bastante",
-       "ok": "OK",
+       "badaccess-group0": "Non ses autorizadu a fàghere s'atzione chi boles",
+       "badaccess-groups": "S'atzione chi boles est limitada a utentes in {{PLURAL:$2|su grupu|unu de sos grupos}}: $1.",
+       "versionrequired": "Bi bolet sa version $1 de MediaWiki",
+       "versionrequiredtext": "Bi bolet sa versione $1 de MediaWiki pro impreare custa pàgina.\nCàstia [[Special:Version|version page]].",
+       "ok": "Andat bene",
        "pagetitle": "$1 - {{SITENAME}}",
        "pagetitle-view-mainpage": "{{SITENAME}}",
-       "retrievedfrom": "Bogau dae  \"$1\"",
+       "retrievedfrom": "Bogadu dae  \"$1\"",
        "youhavenewmessages": "Tenes $1 ($2).",
+       "youhavenewmessagesmanyusers": "Tenes $1 dae utentes ($2).",
        "youhavenewmessagesmulti": "Tenes messàgios noos in $1",
-       "editsection": "acontza",
-       "editold": "acontza",
-       "viewsourceold": "càstia mitza",
-       "editlink": "acontza",
-       "viewsourcelink": "càstia mitza",
-       "editsectionhint": "Acontza sa setzione: $1",
-       "toc": "Cuntènnidu",
+       "editsection": "càmbia",
+       "editold": "càmbia",
+       "viewsourceold": "càstia testu codificadu",
+       "editlink": "càmbia",
+       "viewsourcelink": "càstia testu codificadu",
+       "editsectionhint": "Càmbia sa setzione: $1",
+       "toc": "Cuntenutu",
        "showtoc": "ammustra",
        "hidetoc": "cua",
-       "collapsible-collapse": "Serra e stringi",
+       "collapsible-collapse": "Serra e istringhe",
        "collapsible-expand": "Aberi",
        "thisisdeleted": "Càstiare o recuperare $1?",
-       "viewdeleted": "Bisi $1?",
-       "restorelink": "{{PLURAL:$1|unu acontzu burradu|$1 acontzos burrados}}",
-       "feedlinks": "Feed:",
+       "viewdeleted": "Vista $1?",
+       "restorelink": "{{PLURAL:$1|unu càmbiu burradu|$1 càmbios burrados}}",
+       "feedlinks": "Alimentatzione:",
        "site-rss-feed": "Feed Atom de $1",
        "site-atom-feed": "Feed Atom de $1",
        "page-rss-feed": "Feed RSS pro \"$1\"",
        "feed-atom": "Atom",
        "feed-rss": "RSS",
        "red-link-title": "$1 (sa pàgina no esistit)",
+       "sort-descending": "Òrdine in falada",
+       "sort-ascending": "Òrdine in artziada",
        "nstab-main": "Pàgina",
-       "nstab-user": "Pàgina usuàriu",
-       "nstab-media": "File multimediale",
+       "nstab-user": "Pàgina utente",
+       "nstab-media": "Documentu multimediale",
        "nstab-special": "Pàgina ispetziale",
        "nstab-project": "Pàgina de servìtziu",
-       "nstab-image": "File",
+       "nstab-image": "Documentu",
        "nstab-mediawiki": "Messàgiu",
-       "nstab-template": "Template",
+       "nstab-template": "Modellu",
        "nstab-help": "Agiudu",
        "nstab-category": "Categoria",
-       "nosuchaction": "No esistit tale atzione",
-       "nosuchactiontext": "S'atzione spetzificada in sa URL no est vàlida.\nEst possìbile ki sa URL siat stada carcada male, o si siat sighidu unu cullegamentu non vàlidu.\nCustu diat a pòder èsser unu \"bug\" de {{SITENAME}}.",
+       "nosuchaction": "No esistit custa atzione",
+       "nosuchactiontext": "S'atzione ispetzificada in sa URL no est vàlida.\nEst possìbile chi sa URL siat istada carcada male, o si siat sighidu unu ligàmene non vàlidu.\nCustu diat pòdere èssere unu \"bug\" de {{SITENAME}}.",
        "nosuchspecialpage": "Custa pàgina ispetziale no esistit",
-       "nospecialpagetext": "<strong>As pediu una pàgina ispetziale non balida.</strong>\n\nUna lista de pàginas ispetziales bàlidas d'agatas in [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nospecialpagetext": "<strong>As pedidu una pàgina ispetziale non vàlida.</strong>\n\nUna lista de pàginas ispetziales vàlidas l'agatas in [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Faddina",
-       "databaseerror": "Faddina de su database",
-       "readonly": "Database bloccadu",
-       "enterlockreason": "Inserta su motivu de su bloccu, ispetzifichende su momentu probabile chi su bloccu at a acabai",
+       "databaseerror": "Faddina de sa base de datos",
+       "readonly": "Base de datos blocada",
+       "enterlockreason": "Inserta su motivu de su blocu, ispetzifichende su momentu probàbile chi su blocu at a agabbare",
        "readonlytext": "In custu momentu su database est bloccadu dae aciunturas e àteras modificas, probabilmente pro ordinaria manutentzione a su database, a pustis de custas at a èssere normale torra.\n\nS'aministradore chi dd'at bloccadu at donadu custa ispiegatzione: $1",
        "missing-article": "Su database no at agatadu su testu de una pàgina ki diat àer agatadu a suta de su nùmene \"$1\" $2.\n\nCustu a su sòlitu si verìficat cando bi est unu ligàmine in sa stòria o in unu cunfrontu intre revisiones de una pàgina ki est stada fuliada.\n\nSi no est custu su casu, s'est agatada una faddina de su software.\nPro praxere signa s'acuntèssidu a unu [[Special:ListUsers/sysop|amministradore]] spetzifichende su URL de sa faddina.",
        "missingarticle-rev": "(revisione nùmeru: $1)",
        "cannotdelete": "No est stadu possìbile burrare sa pàgina o su file \"$1\".\nPodet è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",
+       "viewsource": "Càstia testu codificadu",
        "actionthrottled": "Atzione rimandada",
        "namespaceprotected": "Non tenes su permissu de acontzare is pàginas in su nùmene-lugu '''$1'''.",
        "ns-specialprotected": "Is pàginas ispetziales non podent èssere acontzadas.",
        "virus-scanfailed": "scansione faddida (còdixe $1)",
        "virus-unknownscanner": "antivirus disconnotu:",
        "logouttext": "'''As acabadu sa sessione.'''\n\nImmoe podes sighire a impreare {{SITENAME}} in forma anònima, o ti podes <span class='plainlinks'>[$1 identificare torra]</span> comente su de prima o comente usuàriu diferente.\nTene contu ca is pàginas ki sunt giai abertas in àteras bentanas podent sighire a pàrrer comente cando fias identificadu, fintzas a cando non ddas renfriscas.",
-       "yourname": "Nùmene usuàriu",
-       "yourpassword": "Password:",
-       "yourpasswordagain": "Repite sa password:",
-       "remembermypassword": "Ammenta sa password in custu carculadore (pro unu màssimu de $1 {{PLURAL:$1|die|dies}})",
-       "yourdomainname": "Spetzificare su domìniu",
+       "yourname": "Nùmene utente",
+       "yourpassword": "Paràula de òrdine:",
+       "yourpasswordagain": "Repiti sa paràula de òrdine:",
+       "remembermypassword": "Ammenta sa paràula de òrdine in custu carculadore (pro unu màssimu de $1 {{PLURAL:$1|die|dies}})",
+       "yourdomainname": "Ispetzìfica su domìniu",
        "login": "Intra",
-       "nav-login-createaccount": "Intra / crea account",
-       "loginprompt": "Est netzessàriu abilitare is ''cookies'' pro si registrare in {{SITENAME}}.",
-       "userlogin": "Intra / crea account",
+       "nav-login-createaccount": "Intra / crea contu",
+       "userlogin": "Intra / crea contu",
        "userloginnocreate": "Intra",
        "logout": "Serra sessione",
        "userlogout": "Essida",
        "notloggedin": "Non ses intradu",
-       "nologin": "Non tenes unu account? '''$1'''.",
-       "nologinlink": "Crea unu account",
-       "createaccount": "Crea account",
-       "gotaccount": "Tenes giai unu account? $1.",
-       "gotaccountlink": "Identifica·ti",
+       "nologin": "Non tenes unu contu? '''$1'''.",
+       "nologinlink": "Crea unu contu",
+       "createaccount": "Crea contu",
+       "gotaccount": "Tenes giai unu contu? $1.",
+       "gotaccountlink": "Identìfica·ti",
        "createaccountmail": "via e-mail",
        "createaccountreason": "Motivu:",
-       "badretype": "Sas passwords chi as insertau non currenspundint.",
+       "badretype": "Sas paràulas de òrdine chi as insertadu non currispondent.",
        "userexists": "Su nùmene usuàriu insertadu est giai impreadu.\nSèbera unu nùmene diferente.",
        "loginerror": "Faddina de identificatzione",
-       "noname": "Su nùmene usuàriu insertadu no est vàlidu.",
+       "noname": "Su nùmene utente insertadu no est vàlidu.",
        "loginsuccesstitle": "Ti ses identificadu",
-       "loginsuccess": "'''Immoe ses intradu in {{SITENAME}} cun su nùmene usuàriu \"$1\".'''",
-       "nosuchuser": "Non bi est usuàriu cun su nùmene \"$1\".\nIs nùmenes usuàriu sunt sensìbiles a is lìteras mannas.\nVerìfica su nùmene insertadu o [[Special:UserLogin/signup|crea unu account nou]].",
-       "nouserspecified": "Depes spetzificare unu nùmene usuàriu.",
-       "wrongpassword": "Sa password insertada no est bona. Prova torra.",
-       "wrongpasswordempty": "No as scritu sa password.\nProva torra.",
-       "passwordtooshort": "Is passwords depent tènner a su mancu {{PLURAL:$1|1 caràtere|$1 caràteres}}.",
-       "password-name-match": "Sa password tua depet èsser diferente dae su nùmene usuàriu tuo.",
+       "loginsuccess": "'''Immoe ses intradu in {{SITENAME}} cun su nùmene utente \"$1\".'''",
+       "nosuchuser": "Non b'at un'utente cun su nùmene \"$1\".\nSos nùmenes utente sunt sensìbiles a sas lìteras mannas.\nVerìfica su nùmene insertadu o [[Special:UserLogin/signup|crea unu contu nou]].",
+       "nouserspecified": "Deves ispetzificare unu nùmene utente.",
+       "wrongpassword": "Sa paràula de òrdine insertada no est bona. Prova torra.",
+       "wrongpasswordempty": "No as iscritu sa paràula de òrdine.\nProva torra.",
+       "passwordtooshort": "Sas paràulas de òrdine devent tènnere a su mancu {{PLURAL:$1|1 caràtere|$1 caràteres}}.",
+       "password-name-match": "Sa paràula de òrdine tua devet èssere diferente dae su nùmene utente tuo.",
        "mailmypassword": "Ispedi una password noa a s'indiritzu e-mail miu",
-       "passwordremindertitle": "Servitziu Password Reminder di {{SITENAME}}",
+       "passwordremindertitle": "Servìtziu Password Reminder di {{SITENAME}}",
        "passwordremindertext": "Calicunu (probabilmenti tue, cun s'indiritzu IP $1) at pediu de arritziri una password noa pro intrare a {{SITENAME}} ($4).\nUna password temporanea pro s'usuàriu \"$2\" est istada impostada a \"$3\".\nChi custu fiat ne is intentziones tuas, depis intrare (log in) e scioberari una password noa.\nSa password temporanea tua at a iscadiri in {{PLURAL:$5|una die|$5 dies}}.\n\nChi non ses istadu a pediri sa password, o chi as torrau a agatare sa password torra e non da depis cambiari prus, non cunsideras custu messagiu e sighi a impreare sa password beccia.",
-       "noemail": "Peruna e-mail resurtat registrada pro s'usuàriu \"$1\".",
-       "passwordsent": "Una password noa est stada mandada a s'indiritzu e-mail de s'usuàriu \"$1\".\nPro praxere, cando dda retzis identìfica·ti torra.",
+       "noemail": "Peruna post.el. resurtat registrada pro s'utente \"$1\".",
+       "passwordsent": "Una paràula de òrdine noa est istada imbiada a s'indiritzu post.el. de s'utente \"$1\".\nPro praghere, cando la retzis identìfica·ti torra.",
        "mailerror": "Faddina imbiende su messàgiu: $1",
        "emailauthenticated": "S'indiritzu e-mail tuo est istadu autenticau su $2 a is $3.",
        "emailconfirmlink": "Cunfirma s'indiritzu e-mail tuo",
-       "accountcreated": "Account creadu",
+       "accountcreated": "Contu creadu",
        "accountcreatedtext": "S'account usuàriu pro $1 est stadu creadu.",
-       "createaccount-title": "Creatzione de unu account pro {{SITENAME}}",
+       "createaccount-title": "Creatzione de unu contu pro {{SITENAME}}",
        "loginlanguagelabel": "Limba: $1",
        "createacct-another-realname-tip": "Su nomini beru pois fai de mancu de ddu ponni.\nSi sceberas de du ponni, at a essi imperau po arreconnosci a tui su traballu tuu.",
        "pt-login": "Intra",
        "pt-login-button": "Intra",
-       "pt-createaccount": "Arregistradì",
-       "pt-userlogout": "Bessida",
+       "pt-createaccount": "Registra·ti",
+       "pt-userlogout": "Essida",
        "changepassword": "Càmbia password",
-       "resetpass_header": "Càmbia sa password de su account",
-       "oldpassword": "Password betza:",
-       "newpassword": "Password noa:",
-       "retypenew": "Re-scrie sa password noa:",
-       "resetpass_submit": "Càmbia sa password e identifica·ti",
-       "resetpass_forbidden": "No est possìbile cambiare is passwords",
-       "resetpass-no-info": "Depes èsser identificadu pro abèrrer custa pàgina deretu.",
-       "resetpass-submit-loggedin": "Càmbia password",
+       "resetpass_header": "Càmbia sa paràula de òrdine de su contu",
+       "oldpassword": "Paràula de òrdine betza:",
+       "newpassword": "Paràula de òrdine noa:",
+       "retypenew": "Torra a iscrìere sa paràula de òrdine noa:",
+       "resetpass_submit": "Càmbia sa paràula de òrdine e identìfica·ti",
+       "resetpass_forbidden": "Non faghet a cambiare sas paràulas de òrdine",
+       "resetpass-no-info": "Deves èssere identificadu pro abèrrere custa pàgina deretu.",
+       "resetpass-submit-loggedin": "Càmbia paràula de òrdine",
        "resetpass-submit-cancel": "Burra",
-       "resetpass-temp-password": "Password temporànea:",
-       "bold_sample": "Grassu",
-       "bold_tip": "Grassu",
-       "italic_sample": "Corsivu",
-       "italic_tip": "Corsivu",
-       "link_sample": "Tìtulu cullegamentu",
-       "link_tip": "Cullegamentu internu",
-       "extlink_sample": "http://www.example.com tìtulu de s'acàpiu",
-       "extlink_tip": "Acàpiu a foras (ammenta su prefissu http://)",
+       "resetpass-temp-password": "Paràula de òrdine temporànea:",
+       "bold_sample": "Testu Grassu",
+       "bold_tip": "Testu Grassu",
+       "italic_sample": "Testu Cursivu",
+       "italic_tip": "Testu Cursivu",
+       "link_sample": "Tìtulu ligàmene",
+       "link_tip": "Ligàmene internu",
+       "extlink_sample": "http://www.example.com tìtulu de su ligàmene",
+       "extlink_tip": "Ligàmene esternu (ammenta su prefissu http://)",
        "headline_sample": "Testu de su tìtulu",
-       "headline_tip": "Tìtulu de su de duos livellu",
+       "headline_tip": "Tìtulu de su segundu livellu",
        "nowiki_sample": "Inserta su testu non-formatadu inoghe",
        "nowiki_tip": "Ignora sa formatatzione wiki",
        "image_sample": "Esèmpiu.jpg",
        "image_tip": "Incòrpora una pintura",
        "media_sample": "Esèmpiu.ogg",
-       "media_tip": "Cullegamentu a unu file",
+       "media_tip": "Ligàmene a unu documentu",
        "sig_tip": "Firma cun data e ora",
-       "hr_tip": "Lìnia orizontale (de usare cun critèriu)",
+       "hr_tip": "Lìnia orizontale (de impreare cun critèriu)",
        "summary": "Ogetu:",
        "subject": "Tema/tìtulu:",
-       "minoredit": "Custu est un'acontzu minore:",
+       "minoredit": "Custu est unu càmbiu minore:",
        "watchthis": "Pone custa pàgina in sa watchlist mea",
        "savearticle": "Sarva sa pàgina",
-       "preview": "Antiprima",
-       "showpreview": "Ammustra s'antiprima",
-       "showdiff": "Ammustra is mudàntzias",
-       "anoneditwarning": "'''Atentzione:''' Non ses identificadu (log in).\nS'indiritzu IP tuo at a èsser registradu in sa stòria de custa pàgina.",
-       "anonpreviewwarning": "''Non ses identificadu. Sarbende s'indiritzu IP tuo at a èsser registradu in sa stòria de sa pàgina.''",
-       "missingcommenttext": "Inserta unu cummentu inoghe suta.",
-       "summary-preview": "Antiprima ogetu:",
-       "subject-preview": "Antiprima tema/tìtulu:",
-       "blockedtitle": "S'usuàriu est istadu bloccau",
+       "preview": "Anteprima",
+       "showpreview": "Ammustra s'anteprima",
+       "showdiff": "Ammustra sos càmbios",
+       "anoneditwarning": "'''Dae cara:''' Non ses identificadu (log in).\nS'indiritzu IP tuo at a èssere registradu in s'istòria de custa pàgina.",
+       "anonpreviewwarning": "''Non ses identificadu. Sarvende s'indiritzu IP tuo at a èssere registradu in s'istòria de sa pàgina.''",
+       "missingcommenttext": "Inserta unu cummentu inoghe suta.",
+       "summary-preview": "Anteprima ogetu:",
+       "subject-preview": "Anteprima tema/tìtulu:",
+       "blockedtitle": "S'utente est istadu blocadu",
        "blockedtext": "'''Custu nùmene usuàriu o indiritzu IP est stadu bloccadu.'''\n\nSu bloccu est stadu postu dae $1. Su motivu de su bloccu est: ''$2''\n\n* Su bloccu incumentzat: $8\n* Su bloccu scadit: $6\n* Intervallu de bloccu: $7\n\nSi boles, podes tzerriare $1 o un'àteru [[{{MediaWiki:Grouppage-sysop}}|amministradore]] pro faeddare de su bloccu.\n\nNota ca sa funtzione 'Ispedi un'e-mail a custu usuàriu' no est ativa ki no est stadu registradu un'indiritzu e-mail vàlidu in is [[Special:Preferences|preferèntzias]] tuas o ki s'usu de custa funtzione est stadu bloccadu.\n\nS'indiritzu IP atuale est $3, su nùmeru ID de su bloccu est #$5.\nPro praxere spetzìfica totu is particulares in antis in carche siat pregunta de acrarimentu.",
-       "blockednoreason": "perunu motivu indicadu",
-       "loginreqtitle": "Identificatzione rekesta",
-       "loginreqlink": "identifica·ti",
-       "loginreqpagetext": "Depes èsser $1 pro bìer àteras pàginas.",
-       "accmailtitle": "Password ispedia.",
+       "blockednoreason": "perunu motivu inditadu",
+       "loginreqtitle": "Identificatzione rechesta",
+       "loginreqlink": "identìfica·ti",
+       "loginreqpagetext": "Deves èssere $1 pro bìdere àteras pàginas.",
+       "accmailtitle": "Paràula de òrdine imbiada.",
        "newarticle": "(Nou)",
        "newarticletext": "Custa pàgina no esistit galu.\nPro creare sa pàgina, scrie in su box inoghe in bàsciu (abbàida sa [$1 pàgina de agiudu] pro àteras informatziones).\nSi ses intradu inoghe pro sbàlliu, carca in su browser tuo su butone '''back/indietro'''.",
        "anontalkpagetext": "----''Custa est sa pàgina de cuntierra de unu usuàriu anònimu ki no at creadu unu account galu, o ki non dd'usat. Pro custu impreamus su nùmeru de indiritzos IP pro ddu identificare. Is indiritzos IP podent però èsser cundivìdidos dae unos cantos usuàrios. Si ses unu usuàriu anònimu e ritenes ki custos cummentos non sunt diretos a tue, pro praxere [[Special:UserLogin/signup|crea unu account]] o [[Special:UserLogin|identifica·ti (log in)]] pro evitare cunfusione cun àteros usuàrios anònimos.''",
        "noarticletext": "In custu momentu sa pàgina est bùida.\nPodes [[Special:Search/{{PAGENAME}}|chircare custu tìtulu]] in àteras pàginas, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} chircare in is registros ligados] oppuru [{{fullurl:{{FULLPAGENAME}}|action=edit}} acontzare sa pàgina]</span>.",
        "userpage-userdoesnotexist": "S'account de s'usuàriu \"<nowiki>$1</nowiki>\" no est stadu registradu.\nPro praxere abbàida si boles creare/acontzare custa pàgina.",
        "userpage-userdoesnotexist-view": "S'account de s'usuàriu \"$1\" no est stadu registradu.",
-       "updated": "(Agiornadu)",
+       "updated": "(Atualizadu)",
        "note": "'''Nota:'''",
        "previewnote": "'''Regorda·ti ca custa est feti una ANTIPRIMA. Is mudàntzias tuas non sunt galu sarbadas!'''",
        "previewconflict": "Custa antiprima rapresentat su testu in s'àrea acontzu testu de susu comente at a pàrrer si dda sarbas.",
-       "editing": "Acontzu de $1",
-       "editingsection": "Acontzende $1 (setzione)",
+       "editing": "Càmbiu de $1",
+       "editingsection": "Cambiende $1 (setzione)",
        "editingcomment": "Acontzu de $1 (setzione noa)",
        "editconflict": "Cunflitu de editzione: $1",
        "explainconflict": "Calicunu àteru at acontzadu custa pàgina in su tempus ki dda fias acontzende tue.\nS'àrea de testu de susu cuntènnet su testu de sa pàgina in sa forma atuale.\nIs mudàntzias tuas sunt ammustradas in s'àrea de testu de bàsciu.\nAs a dèper insertare is mudàntzias tuas in su testu atuale, e pro custu a ddas scrìer in s'àrea de susu.\n'''Solu''' su testu in s'àrea de susu at a èsser sarbadu si carcas su butone \"{{int:savearticle}}\".",
        "yourtext": "Su testu tuo",
-       "storedversion": "Revisione in arkìvio",
+       "storedversion": "Revisione in archìviu",
        "editingold": "'''ATENTZIONE: Ses acontzende una revisione non-agiornada de sa pàgina.'''\nSi dda sarbas de aici, totu is acontzos fatos a pustis de custa revisione ant a bènner pèrdidos pro semper.",
        "yourdiff": "Diferèntzias",
        "copyrightwarning": "Abbàida, pro praxere, ki totu is contributziones a {{SITENAME}} sunt cunsideradas lassadas a suta permissu de tipu $2 (càstia $1 pro nde schire de prus). Si non keris ki su scritu tuo potzat èsser acontzadu e re-distribuidu dae kie si siat sena piedade e sena àteros lìmites, non ddu imbies a {{SITENAME}}.<br />\nCun s'imbiu de custu scritu ses garantende, a responsabilidade tua, si su scritu ddu as cumpostu tue de persona e in originale, o puru si est stadu copiadu dae una fonte de domìniu pùblicu, o una fonte de gasi, o puru si as otentu permissu craru de impreare custu scritu e si ddu podes dimustrare. '''NO IMPREARE MATERIALE COBERTU DAE DERETU DE AUTORE SENA PERMISSU CRARU!'''",
        "mergehistory-into": "Pàgina de destinatzione:",
        "mergehistory-no-source": "Sa pàgina de orìgine $1 no esistit.",
        "mergehistory-reason": "Motivu:",
-       "revertmerge": "Fùrria s'unione",
+       "revertmerge": "Iscontza s'unione",
        "history-title": "Istòria de is revisiones de \"$1\"",
        "lineno": "Lìnia $1:",
        "compareselectedversions": "Cumpara versiones scioberadas",
-       "editundo": "annudda",
+       "editundo": "annulla",
        "searchresults": "Resurtados de sa chirca",
        "searchresults-title": "Resurtados pro sa chirca de \"$1\"",
        "titlematches": "Currispondèntzias in su tìtulu de s'artìculu",
        "search-result-score": "Rilevàntzia: $1%",
        "search-redirect": "(redirect $1)",
        "search-section": "(setzione $1)",
-       "search-suggest": "Fortzis fias chirkende: $1",
+       "search-suggest": "Fortzis fias chirchende: $1",
        "search-interwiki-caption": "Progetos frades",
        "search-interwiki-default": "$1 resurtados:",
        "search-interwiki-more": "(àteru)",
        "prefs-editing": "Box de acontzadura",
        "rows": "Lìnias:",
        "columns": "Colunnas:",
-       "searchresultshead": "Settaggio delle preferenze per la ricerca",
+       "searchresultshead": "Chirca",
        "stub-threshold-disabled": "Disativadu",
        "recentchangescount": "Nùmeru de acontzos de amostare pro definidura:",
        "savedprefs": "Is preferèntzias tuas sunt stadas sarbadas.",
        "tooltip-pt-watchlist": "Sa lista de is pàginas chi tue ses ponende ogru",
        "tooltip-pt-mycontris": "Sa lista de is contributziones meas",
        "tooltip-pt-login": "Si cunsìgiat sa registratzione; mancari non siat obligatoria",
-       "tooltip-pt-logout": "Bessida (log out)",
+       "tooltip-pt-logout": "Essida (log out)",
        "tooltip-ca-talk": "Cuntierras a propositu de su cuntestu de sa pàgina",
        "tooltip-ca-edit": "Podes acontzare custa pàgina.\nPro praxere, prima de sarbare càstia s'antiprima",
        "tooltip-ca-addsection": "Incumintza una setzione noa",
index 5c60e43..628e67f 100644 (file)
        "print": "Prent",
        "view": "See",
        "edit": "Eedit",
+       "edit-local": "Eedit local description",
        "create": "Ceaut",
        "editthispage": "Eedit this page",
        "create-this-page": "Creaut this page",
        "talkpagelinktext": "Tauk",
        "specialpage": "Byordinar Page",
        "personaltools": "Personal tuils",
-       "postcomment": "New section",
        "articlepage": "Leuk at content page",
        "talk": "Tauk",
        "views": "Views",
        "jumptonavigation": "navigation",
        "jumptosearch": "rake",
        "view-pool-error": "Sarrie, the servers ar owerlaided at the moment.\nOwer monie uisers ar ettlin tae see this page.\nPlease wait ae while afore ye ettle tae access this page again.\n\n$1",
+       "generic-pool-error": "Sorry, the servers are owerloadit at the moment.\nToo mony uisers are tryin tae view this resoorce.\nPlease wait a while afore you try tae access this resoorce again.",
        "pool-timeout": "Timeout waitin fer the lock",
        "pool-queuefull": "Pool line is ful",
        "pool-errorunknown": "Onknawn mistak.",
        "externaldberror": "Aither thaur wis aen external authentication database mistak, or ye'r naw permitit tae update yer external accoont.",
        "login": "Log in",
        "nav-login-createaccount": "Log in / cræft aen accoont",
-       "loginprompt": "Ye maun hae cookies enabled tae log in tae {{SITENAME}}.",
        "userlogin": "Cræft aen accoont or log in",
        "userloginnocreate": "Log in.",
        "logout": "Log oot",
        "currentrev": "Reveesion the nou",
        "currentrev-asof": "Latest reveesion aes o $1",
        "revisionasof": "Reveesion aes o $1",
-       "revision-info": "Reveesion aes o $1 bi $2",
+       "revision-info": "Reveesion aes o $1 bi {{GENDER:$6|$2}}$7",
        "previousrevision": "← Aulder reveesion",
        "nextrevision": "Newer reveesion →",
        "currentrevisionlink": "Latest reveesion",
        "revdelete-text-text": "Delytit reveesions will still kith in the page histerie, bit pairts o thair content will be onaccessible til the publeec.",
        "revdelete-text-file": "Delytit file versions will still kith in the file histerie, bit pairts o thair content will be onaccessible til the publeec.",
        "logdelete-text": "Delytit log events will still kith in the logs, bit pairts o thair content will be onaccessible til the publeec.",
-       "revdelete-text-others": "Ither admeenistraters oan {{SITENAME}} will still be able tae access the skaukt content n can ondelyte it again throoch this same interface, onless addeetional restreections ar set.",
+       "revdelete-text-others": "Ither admeenistraters will still be able tae access the skaukt content n tae ondelyte it, onless addeetional restreections ar set.",
        "revdelete-confirm": "Please confirm that ye'r ettlin tae dae this, that ye unnerstaunn the consequences, n that ye'r daein this in accordance wi [[{{MediaWiki:Policy-url}}|the policie]].",
        "revdelete-suppress-text": "Suppression shid <strong>yinly</strong> be uised fer the follaein cases:\n* poteentiallie libeloos information\n* galus personal information\n*: <em>hame addresses n telephane nummers, national ideentifeecation nummers, etc.</em>",
        "revdelete-legend": "Set visibeelitie restreections",
        "powersearch-togglelabel": "Chec':",
        "powersearch-toggleall": "Aw",
        "powersearch-togglenone": "Nane",
+       "powersearch-remember": "Remember selection for futur rakes",
        "search-external": "Eixternal rake",
        "searchdisabled": "Rakin throu {{SITENAME}} is disabled fer performance raisons. Ye can rake bi wa o Google juist nou. Mynd that thair indexes o {{SITENAME}} content micht be oot o date.",
        "search-error": "Ae mistak haes occurred while rakin: $1",
        "right-deletedtext": "See delytit tex n chynges atween delytit reveesions",
        "right-browsearchive": "Rake delytit pages",
        "right-undelete": "Ondelyte ae page",
-       "right-suppressrevision": "Luikower n restore reveesions skaukt fae admeenistraters",
+       "right-suppressrevision": "See, skauk n onskauk speceefic reveesions o pages fae onie uiser",
        "right-suppressionlog": "see preevate logs",
        "right-block": "Block ither uisers fae eeditin",
        "right-blockemail": "Block ae uiser fae sendin wab-mail",
        "recentchanges-label-unpatrolled": "This eedit haes no bin patrolled yet",
        "recentchanges-label-plusminus": "The page size chynged bi this nummer o bytes",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (see [[Special:NewPages|leet o new pages]] n aw)",
-       "rcnotefrom": "Ablo ar the chynges sin <strong>$2</strong> (up til <strong>$1</strong> shawn).",
+       "rcnotefrom": "Ablo {{PLURAL:$5|is the chynge|ar the chynges}} sin <strong>$3, $4</strong> (up tae <strong>$1</strong> shawn).",
        "rclistfrom": "Shaw new chynges stertin fae $3 $2",
        "rcshowhideminor": "$1 smaa eedits",
        "rcshowhideminor-show": "Shaw",
        "largefileserver": "This file is bigger than the server is confeeegurt tae allou.",
        "emptyfile": "The file that ye uplaided seems tae be tuim.\nThis micht be cause o ae typeower in the filename.\nPlease check whether ye reallie want tae uplaid this file.",
        "windows-nonascii-filename": "This wiki disna support filenames wi speecial chairacters.",
-       "fileexists": "Ae file wi this name exeests aareadies, please check <strong>[[:$1]]</strong> gif ye'r no sair that ye want tae chynge it.\n[[$1|thumb]]",
+       "fileexists": "Ae file wi this name awreadie exeests, please check <strong>[[:$1]]</strong> gif {{GENDER:|ye}}'r no siccar gif ye want tae chynge it.\n[[$1|thumb]]",
        "filepageexists": "The descreeption page fer this file haes awreadie been cræftit at <strong>[[:$1]]</strong>, bit nae file wi this name exeests the nou.\nThe ootline that ye enter will na kith oan the descreeption page.\nTae mak yer ootline kith thaur, ye'll need tae manuallie eedit it.\n[[$1|thumb]]",
        "fileexists-extension": "Ae file wi ae siclike name exeests: [[$2|thumb]]\n* Name o the uplaidin file: <strong>[[:$1]]</strong>\n* Name o the exeestin file: <strong>[[:$2]]</strong>\nWid ye lik tae chuise ae mair disteencteeve name?",
        "fileexists-thumbnail-yes": "The file seems tae be aen eemage o reduced size ''(thumbnail)''.\n[[$1|thumb]]\nPlease check the file <strong>[[:$1]]</strong>.\nGif the checked file is the same eemage o oreeginal size it's no necessairie tae uplaid aen extra thumbnail.",
        "license": "Licensin:",
        "license-header": "Licensin",
        "nolicense": "Nane selectit",
+       "licenses-edit": "Eedit license options",
        "license-nopreview": "(Luikower naw available)",
        "upload_source_url": "(ae valid, publeeclie accessible URL)",
        "upload_source_file": "(ae file oan yer computer)",
        "wantedtemplates": "Wantit templates",
        "mostlinked": "Maist airtit-tae pages",
        "mostlinkedcategories": "Maist airtit-tae categeries",
-       "mostlinkedtemplates": "Maist linkt-til templates",
+       "mostlinkedtemplates": "Maist transcludit pages",
        "mostcategories": "Airticles wi the maist categeries",
        "mostimages": "Maist uised eemages",
        "mostinterwikis": "Pages wi the maist interwikis",
        "watchlist-details": "{{PLURAL:$1|$1 page|$1 pages}} oan yer watchleet, no coontin tauk pages seperatlie.",
        "wlheader-enotif": "Wab-mail annooncemant is enabled.",
        "wlheader-showupdated": "Pages that hae been chynged sin ye last veesitit thaim ar shawn in '''baud'''.",
-       "wlnote2": "Ablo ar the chynges in the hainmaist {{PLURAL:$1|hoor|<strong>$1</strong> hours}}, aes o $3, $2.",
+       "wlnote": "Ablo {{PLURAL:$1|is the laist chynge|ae the laist '''$1''' chynges}} in the laist {{PLURAL:$2|hoor|'''$2''' hoors}}, aes o $3, $4.",
        "wlshowlast": "Shaw hainmaist $1 hoors $2 days $3",
        "watchlist-options": "Watchleet opties",
        "watching": "Watchin...",
        "import-upload": "Uplaid XML data",
        "import-token-mismatch": "Loss o session data.\nPlease gie it anither gae.",
        "import-invalid-interwiki": "Canna import fae the speceefied wiki.",
-       "import-error-edit": "Page \"$1\" isna importit cause ye'r na permitit tae eedit it.",
-       "import-error-create": "Page \"$1\" is na importit cause ye'r na permitit tae cræft it.",
-       "import-error-interwiki": "Page \"$1\" is na importit cause its name is reserved fer external linkin (interwiki).",
-       "import-error-special": "Page \"$1\" is na importit cause it belangs til ae speecial namespace that disna permit pages.",
-       "import-error-invalid": "Page \"$1\" is na importit cause its name is onvalit.",
+       "import-error-edit": "Page \"$1\" wisna importit cause ye'r na alloued tae eedit it.",
+       "import-error-create": "Page \"$1\" wisna importit cause ye'r no alloued tae creaut it.",
+       "import-error-interwiki": "Page \"$1\" wisna importit cause its name is reserved fer ootby airtinin (interwiki).",
+       "import-error-special": "Page \"$1\" wisna importit cause it belangs til ae byordinair namespace that disna allou pages.",
+       "import-error-invalid": "Page \"$1\" wisna importit cause the name that it wid be importit tae isna valit oan this wiki.",
        "import-error-unserialize": "Reveesion $2 o page \"$1\" coudna be onsereealized. The reveesion wis reported til uiss content model $3 sereealized aes $4.",
        "import-error-bad-location": "Reveesion $2 uisin content model $3 canna be stored oan \"$1\" oan this wiki, syn that model isna supported oan that page.",
        "import-options-wrong": "Wrang {{PLURAL:$2|optie|opties}}: <nowiki>$1</nowiki>",
        "import-rootpage-nosubpage": "Namespace \"$1\" o the ruit page disna permit subpages.",
        "importlogpagetext": "Admeenistrateeve imports o pages wi eedit histerie fae ither wikis.",
        "import-logentry-upload": "imported [[$1]] bi file uplaid",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|reveesion|reveesions}}",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|reveesion|reveesions}} fae $2",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|reveesion|reveesions}} importit",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|reveesion|reveesions}} importit fae $2",
        "javascripttest": "JavaScript testin",
        "javascripttest-title": "Rinnin $1 tests",
        "javascripttest-pagetext-noframework": "This page is reserved fer rinnin JavaScript tests.",
index f20d7e9..b0a5806 100644 (file)
@@ -26,6 +26,7 @@
        "tog-watchdefault": "Na spisek nadzorov dodaj vse članke in datoteke, ki sem jih spremenil/-a",
        "tog-watchmoves": "Dodaj strani in datoteke, ki jih premaknem, na moj spisek nadzorov",
        "tog-watchdeletion": "Dodaj strani in datoteke, ki jih izbrišem, na moj spisek nadzorov",
+       "tog-watchrollback": "Dodaj strani, na katerih sem izvedel vrnitev, na moj spisek nadzorov",
        "tog-minordefault": "Vsa urejanja označi kot manjša",
        "tog-previewontop": "Prikaži predogled pred urejevalnim poljem",
        "tog-previewonfirst": "Ob začetku urejanja prikaži predogled",
        "preview": "Predogled",
        "showpreview": "Prikaži predogled",
        "showdiff": "Prikaži spremembe",
+       "blankarticle": "<strong>Opozorilo:</strong> Stran, ki jo ustvarjate, je prazna.\nČe ponovno kliknete »{{int:savearticle}}«, bomo stran ustvarili brez kakršne koli vsebine.",
        "anoneditwarning": "'''Opozorilo''': niste prijavljeni. V zgodovino strani se bo zapisal vaš IP-naslov.",
        "anonpreviewwarning": "Niste prijavljeni. Ob spremembi strani se bo vaš IP-naslov zapisal v zgodovini urejanja te strani.",
        "missingsummary": "'''Opozorilo:''' Niste napisali povzetka urejanja. Ob ponovnem kliku gumba ''Shrani'' se bo vaše urejanje shranilo brez njega.",
        "rev-deleted-event": "(dnevniški vnos je odstranjen)",
        "rev-deleted-user-contribs": "[uporabniško ime ali IP naslov odstranjeni - urajenje skrito v prispevkih]",
        "rev-deleted-text-permission": "Prikazana redakcija je bila '''izbrisana'''.\nPodrobnosti so na razpolago v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].",
+       "rev-suppressed-text-permission": "Ta redakcija strani je bila <strong>zatrta</strong>.\nPodrobnosti so navedene v [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} dnevniku zatrtij].",
        "rev-deleted-text-unhide": "Ta sprememba je bila '''izbrisana'''.\nPodrobnosti so morda navedene v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].\nŠe vedno lahko [$1 pogledate to redakcijo], če želite nadaljevati.",
-       "rev-suppressed-text-unhide": "Ta sprememba je bila '''zavrnjena'''.\nPodrobnosti so morda navedene v [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} dnevniku zavračanj].\nŠe vedno lahko [$1 pogledate to redakcijo], če želite nadaljevati.",
+       "rev-suppressed-text-unhide": "Ta sprememba je bila <strong>zatrta</strong>.\nPodrobnosti so morda navedene v [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} dnevniku zatrtij].\nŠe vedno lahko [$1 pogledate to redakcijo], če želite nadaljevati.",
        "rev-deleted-text-view": "Prikazana redakacija strani je bila iz javnih arhivov odstranjena.\nLahko si jo ogledate; podrobnosti so morda navedene v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].",
-       "rev-suppressed-text-view": "Ta sprememba je bila '''zavrnjena'''.\nLahko si jo ogledate; podrobnosti so morda navedene v [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} dnevniku zavračanj].",
+       "rev-suppressed-text-view": "Ta sprememba je bila <strong>zatrta</strong>.\nLahko si jo ogledate; podrobnosti so morda navedene v [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} dnevniku zatrtij].",
        "rev-deleted-no-diff": "Povzetka sprememb ne morete videti, ker je bil eden od popravkov '''izbrisan'''.\nPodrobnosti so morda navedene v  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].",
        "rev-suppressed-no-diff": "Ogled redakcije ni mogoč, ker je bila ena od sprememb '''izbrisana'''.",
        "rev-deleted-unhide-diff": "Ena od sprememb v tej redakciji je bila '''izbrisana'''.\nPodrobnosti so morda navedene v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].\nŠe vedno lahko [$1 pogledate to redakcijo], če želite nadaljevati.",
-       "rev-suppressed-unhide-diff": "Ena od sprememb v tej redakciji je bila '''zadržana'''.\nPodrobnosti so morda navedene v [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} dnevniku zadržkov].\nŠe vedno lahko [$1 pogledate to redakcijo], če želite nadaljevati.",
+       "rev-suppressed-unhide-diff": "Ena od sprememb v tej redakciji je bila <strong>zatrta</strong>.\nPodrobnosti so morda navedene v [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} dnevniku zatrtij].\nŠe vedno lahko [$1 pogledate to redakcijo], če želite nadaljevati.",
        "rev-deleted-diff-view": "Ena od sprememb v tej redakciji je bila '''izbrisana'''.\nTo redakcijo si lahko ogledate; podrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].",
-       "rev-suppressed-diff-view": "Ena od sprememb v tej redakciji je bila '''zadržana'''.\nTo redakcijo si lahko ogledate; podrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} dnevniku zadržkov].",
+       "rev-suppressed-diff-view": "Ena od sprememb v tej redakciji je bila <strong>zatrta</strong>.\nTo redakcijo si lahko ogledate; podrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} dnevniku zatrtij].",
        "rev-delundel": "pokaži/skrij",
        "rev-showdeleted": "prikaži",
        "revisiondelete": "Izbriši/obnovi redakcije",
        "revdelete-text-text": "Izbrisane redakcije bodo še vedno prikazane v zgodovini strani, vendar bodo deli njihovih vsebin nedostopni javnosti.",
        "revdelete-text-file": "Izbrisane različice datoteke bodo še vedno prikazane v zgodovini datoteke, vendar bodo deli njihovih vsebin nedostopni javnosti.",
        "logdelete-text": "Izbrisani dnevniški vnosi bodo še vedno prikazani v dnevnikih, vendar bodo deli njihovih vsebin nedostopni javnosti.",
-       "revdelete-text-others": "Drugi administratorji na strani {{SITENAME}} bodo še vedno lahko dostopali do skrite vsebine in jo obnovili z enakim vmesnikom, razen če so nastavljene dodatne omejitve.",
-       "revdelete-confirm": "Prosim potrdite da nameravate to storiti, da se zavedate posledic in da to počnete v skladu s [[{{MediaWiki:Policy-url}}|politiko]].",
-       "revdelete-suppress-text": "Zadrževanje naj bi bilo uporabljeno '''le''' v sledečih primerih:\n* Morebitni klevetniški podatki\n* Neprimerni osebni podatki\n*: ''domači naslovi in telefonske številke, narodne številke istovetnosti itn.''",
+       "revdelete-text-others": "Drugi administratorji bodo še vedno lahko dostopali do skrite vsebine in jo obnovili, razen če so nastavljene dodatne omejitve.",
+       "revdelete-confirm": "Prosimo, potrdite, da nameravate to storiti, da se zavedate posledic in da to počnete v skladu s [[{{MediaWiki:Policy-url}}|politiko]].",
+       "revdelete-suppress-text": "Zatrtje naj bi bilo uporabljeno <strong>le</strong> v sledečih primerih:\n* morebitni klevetniški podatki\n* neprimerni osebni podatki\n*: <em>domači naslovi in telefonske številke, narodne številke istovetnosti itn.</em>",
        "revdelete-legend": "Nastavi omejitve vidnosti",
        "revdelete-hide-text": "Besedilo redakcije",
        "revdelete-hide-image": "Skrij vsebino datoteke.",
        "revdelete-radio-same": "(ne spremeni)",
        "revdelete-radio-set": "Skrito",
        "revdelete-radio-unset": "Vidno",
-       "revdelete-suppress": "Zadrži podatke od administratorjev kakor tudi od ostalih",
+       "revdelete-suppress": "Zatri podatke od administratorjev, kakor tudi od ostalih",
        "revdelete-unsuppress": "Odpraviti omejitve na obnovljenih redakcijah.",
        "revdelete-log": "Razlog:",
        "revdelete-submit": "Uporabi za {{PLURAL:$1|izbrano redakcijo|izbrani redakciji|izbrane redakcije}}",
        "right-deletedtext": "Ogled izbrisanega besedila in primerjava med izbrisanimi redakcijami",
        "right-browsearchive": "Iskanje izbrisanih strani",
        "right-undelete": "Obnavljanje strani",
-       "right-suppressrevision": "Pregled in obnova pred administratorjem skritih redakcij",
+       "right-suppressrevision": "Ogled, skrivanje in obnavljanje določenih redakcij strani katerega koli uporabnika",
+       "right-viewsuppressed": "Ogled redakcij skritih pred vsemi uporabniki",
        "right-suppressionlog": "Ogled zasebnih dnevniških zapisov",
        "right-block": "Preprečitev (blokada) urejanja drugih uporabnikov",
        "right-blockemail": "Drugemu uporabniku lahko prepreči pošiljanje e-pošte",
        "recentchanges-label-plusminus": "uporabnik je velikost strani spremenil za tolikšno število bajtov",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (glej tudi [[Special:NewPages|seznam novih strani]])",
-       "rcnotefrom": "Navedene so spremembe od <strong>$2</strong> dalje (prikazujem jih do <strong>$1</strong>).",
+       "rcnotefrom": "{{PLURAL:$5|Navedena je sprememba|Navedeni sta spremembi|Navedene so spremembe}} od <strong>$3 $4</strong> dalje (prikazujem jih do <strong>$1</strong>).",
        "rclistfrom": "Prikaži spremembe od $3 $2 naprej",
        "rcshowhideminor": "$1 manjša urejanja",
        "rcshowhideminor-show": "Prikaži",
        "nolicense": "Nobeno",
        "licenses-edit": "Urejanje možnosti dovoljenja",
        "license-nopreview": "(Predogled ni na voljo)",
-       "upload_source_url": " (veljaven, javnosti dostopen URL)",
-       "upload_source_file": " (datoteka na vašem računalniku)",
+       "upload_source_url": "(vaša izbrana datoteka z veljavnega, javnosti dostopnega URL-ja)",
+       "upload_source_file": "(vaša izbrana datoteka z vašega računalnika)",
        "listfiles-delete": "izbriši",
        "listfiles-summary": "Ta posebna stran prikazuje vse naložene datoteke.",
        "listfiles_search_for": "Išči po imenu datoteke:",
        "watchlist-details": "Na vašem spisku nadzorov je $1 {{PLURAL:$1|stran|strani|strani}}; pogovorne strani niso štete posebej.",
        "wlheader-enotif": "Obveščanje po elektronski pošti je omogočeno.",
        "wlheader-showupdated": "Strani, spremenjene od vašega zadnjega ogleda, so prikazane '''krepko'''.",
-       "wlnote2": "Spodaj so navedene spremembe v {{PLURAL:$1|zadnji uri|zadnjih <strong>$1</strong> urah}}, od $2, $3.",
+       "wlnote": "{{PLURAL:$1|Navedena je zadnja|Navedeni sta zadnji|Navedene so zadnje|Navedenih je zadnjih}} <strong>$1</strong> {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb}} v {{PLURAL:$2|zadnji <strong>$2</strong> uri|zadnjih <strong>$2</strong> urah}}, od $3, $4.",
        "wlshowlast": "Prikaži zadnjih $1 ur; $2 dni; $3;",
        "watchlist-options": "Možnosti spiska nadzorov",
        "watching": "Nadziranje ...",
        "import-upload": "Naložite podatke XML",
        "import-token-mismatch": "Izguba podatkov o seji.\nProsimo, 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-edit": "Strani »$1« nismo uvozili, ker vam ni dovoljeno, da jo urejate.",
+       "import-error-create": "Strani »$1« nismo uvozili, 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-error-invalid": "Strani »$1« nismo uvozili, ker ime, na katerega bi jo uvozili, na tem wikiju ni veljavno.",
        "import-error-unserialize": "Redakcije $2 strani »$1« ni bilo mogoče deserializirati. Redakcija bi naj uporabljala model vsebine $3, serializiran kot $4.",
        "import-error-bad-location": "Redakcije $2, ki uporablja model vsebine $3, na tem wikiju ne morete straniti na »$1«, saj omenjeni model ni podprt na tej strani.",
        "import-options-wrong": "{{PLURAL:$2|Napačna možnost|Napačni možnosti|Napačne možnosti}}: <nowiki>$1</nowiki>",
        "importlogpage": "Dnevnik uvozov",
        "importlogpagetext": "Administrativni uvozi strani z zgodovino urejanja iz drugih wikijev.",
        "import-logentry-upload": "uvozil [[$1]] z nalaganjem datoteke",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|redakcija|redakciji|redakcije|redakcij|redakcij}}",
+       "import-logentry-upload-detail": "{{PLURAL:$1|Uvožena $1 redakcija|Uvoženi $1 redakciji|Uvožene $1 redakcije|Uvoženih $1 redakcij}}",
        "import-logentry-interwiki": "prenesel $1 med wikiji",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|redakcija|redakciji|redakcije|redakcij}} uporabnika $2",
+       "import-logentry-interwiki-detail": "{{PLURAL:$1|Uvožena $1 redakcija|Uvoženi $1 redakciji|Uvožene $1 redakcije|Uvoženih $1 redakcij}} z $2",
        "javascripttest": "Preizkušanje JavaScripta",
        "javascripttest-title": "Poganjanje $1 preizkusov",
        "javascripttest-pagetext-noframework": "Stran je rezervirana za poganjanje preizkusov JavaScript.",
        "autosumm-replace": "Zamenjava strani s/z '$1'",
        "autoredircomment": "preusmeritev na [[$1]]",
        "autosumm-new": "Nova stran z vsebino: $1",
+       "autosumm-newblank": "Ustvarjena prazna stran",
        "lag-warn-normal": "Spremembe novejše od $1 {{PLURAL:$1|sekunde|sekund}} morda ne bodo prikazane na seznamu.",
        "lag-warn-high": "Zaradi visoke zasedenosti strežniških podatkovnih baz, spremembe novejše od $1 {{PLURAL:$1|sekunde|sekund}} morda ne bodo prikazane na seznamu.",
        "watchlistedit-normal-title": "Uredi spisek nadzorov",
index d2955d8..5a5cc53 100644 (file)
        "category-empty": "<div style=\"margin:2em 1em 0 1em; padding:0.5em; border:1px solid #AAA; text-align:center;\">''Ова категорија тренутно не садржи странице или датотеке.''</div>",
        "hidden-categories": "{{PLURAL:$1|Сакривена категорија|Сакривене категорије}}",
        "hidden-category-category": "Сакривене категорије",
-       "category-subcat-count": "{{PLURAL:$2|Ова категорија садржи само следећу поткатегорију.|Ова категорија има {{PLURAL:$1|следећу поткатегорију|следеће $1 поткатегорије|следећих $1 поткатегорија}}, од укупно $2.}}",
+       "category-subcat-count": "{{PLURAL:$2|1=Ова категорија садржи само следећу поткатегорију.|Ова категорија има {{PLURAL:$1|следећу поткатегорију|следеће $1 поткатегорије|следећих $1 поткатегорија}}, од укупно $2.}}",
        "category-subcat-count-limited": "Ова категорија садржи {{PLURAL:$1|следећу поткатегорију|следеће $1 поткатегорије|следећих $1 поткатегорија}}.",
-       "category-article-count": "{{PLURAL:$2|Ова категорија садржи само следећу страницу.|{{PLURAL:$1|Следећа страница је|Следеће $1 странице су|Следећих $1 страница је}} у овој категорији, од укупно $2.}}",
-       "category-article-count-limited": "{{PLURAL:$1|Следећа страница је|Следеће $1 странице су|Следећих $1 страница је}} у овој категорији.",
-       "category-file-count": "{{PLURAL:$2|Ова категорија садржи само следећу датотеку.|{{PLURAL:$1|Следећа датотека је|Следеће $1 датотеке су|Следећих $1 датотека је}} у овој категорији, од укупно $2.}}",
-       "category-file-count-limited": "{{PLURAL:$1|Следећа датотека је|Следеће $1 датотеке су|Следећих $1 датотека је}} у овој категорији.",
+       "category-article-count": "{{PLURAL:$2|1=Ова категорија садржи само следећу страницу.|{{PLURAL:$1|Следећа страница је|Следеће $1 странице су|Следећих $1 страница је}} у овој категорији, од укупно $2.}}",
+       "category-article-count-limited": "{{PLURAL:$1|1=Следећа страница је|Следеће $1 странице су|Следећих $1 страница је}} у овој категорији.",
+       "category-file-count": "{{PLURAL:$2|1=Ова категорија садржи само следећу датотеку.|{{PLURAL:$1|Следећа датотека је|Следеће $1 датотеке су|Следећих $1 датотека је}} у овој категорији, од укупно $2.}}",
+       "category-file-count-limited": "{{PLURAL:$1|1=Следећа датотека је|Следеће $1 датотеке су|Следећих $1 датотека је}} у овој категорији.",
        "listingcontinuesabbrev": "наст.",
        "index-category": "Пописане странице",
        "noindex-category": "Непописане странице",
        "delete": "Обриши",
        "deletethispage": "Обриши ову страницу",
        "undeletethispage": "Врати ову страницу",
-       "undelete_short": "Врати {{PLURAL:$1|једну обрисану измену|$1 обрисане измене|$1 обрисаних измена}}",
+       "undelete_short": "Врати {{PLURAL:$1|1=једну обрисану измену|$1 обрисане измене|$1 обрисаних измена}}",
        "viewdeleted_short": "Погледај {{PLURAL:$1|обрисану измену|$1 обрисане измене|$1 обрисаних измена}}",
        "protect": "Заштити",
        "protect_change": "промени",
        "loginerror": "Грешка при пријављивању",
        "createacct-error": "Дошло је до грешке при креирању налога",
        "createaccounterror": "Не могу да отворим налог: $1",
-       "nocookiesnew": "Кориснички налог је отворен, али нисте пријављени.\nОвај вики користи колачиће за пријаву. Вама су колачићи онемогућени.\nОмогућите их, па се онда пријавите са својим корисничким именом и лозинком.",
-       "nocookieslogin": "Овај вики користи колачиће за пријављивање корисника.\nВама су колачићи онемогућени. Омогућите их и покушајте поново.",
+       "nocookiesnew": "Кориснички налог је отворен, али нисте пријављени.\n{{SITENAME}} користи колачиће за пријаву. Вама су колачићи онемогућени.\nОмогућите их, па се онда пријавите са својим корисничким именом и лозинком.",
+       "nocookieslogin": "{{SITENAME}} користи колачиће за пријављивање корисника.\nВама су колачићи онемогућени. Омогућите их и покушајте поново.",
        "nocookiesfornew": "Кориснички налог није отворен јер његов извор није потврђен.\nОмогућите колачиће на прегледачу и поново учитајте страницу.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
        "noname": "Унели сте неисправно корисничко име.",
        "password-name-match": "Лозинка се мора разликовати од корисничког имена.",
        "password-login-forbidden": "Коришћење овог корисничког имена и лозинке је забрањено.",
        "mailmypassword": "Ресетуј лозинку",
-       "passwordremindertitle": "{{SITENAME}} â\80\93 Ð¿Ð¾Ð´Ñ\81еÑ\82ник Ð·Ð° Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83",
+       "passwordremindertitle": "{{SITENAME}} â\80\94 Ð¿Ñ\80ивÑ\80емена Ð»Ð¾Ð·Ð¸Ð½ÐºÐ°",
        "passwordremindertext": "Неко, вероватно ви, са ИП адресе $1 је затражио нову лозинку на викију {{SITENAME}} ($4).\nСтворена је привремена лозинка за {{GENDER:$2|корисника|корисницу|корисника}} $2 која гласи $3.\nУколико је ово ваш захтев, сада се пријавите и поставите нову лозинку.\nПривремена лозинка истиче за {{PLURAL:$5|један дан|$5 дана|$5 дана}}.\n\nАко је неко други затражио промену лозинке, или сте се сетили ваше лозинке и не желите да је мењате, занемарите ову поруку.",
-       "noemail": "Не постоји е-адреса за {{GENDER:$1|корисника|корисницу|корисника}} $1.",
+       "noemail": "Не постоји е-адреса за {{GENDER:$1|корисника|корисницу}} $1.",
        "noemailcreate": "Морате навести исправну е-адресу",
        "passwordsent": "Нова лозинка је послата на е-адресу {{GENDER:$1|корисника|кориснице|корисника}} $1.\nПријавите се пошто је примите.",
        "blocked-mailpassword": "Вашој ИП адреси је онемогућено уређивање страница, као и могућност захтевања нове лозинке.",
        "preview": "Претпреглед",
        "showpreview": "Прикажи претпреглед",
        "showdiff": "Прикажи измене",
+       "blankarticle": "<strong>Упозорење:</strong> страница коју правите нема никакав садржај.\nАко још једном притиснете „{{int:savearticle}}“ направићете страницу без садржаја.",
        "anoneditwarning": "'''Упозорење:''' нисте пријављени.\nВаша ИП адреса ће бити забележена у историји ове странице.",
        "anonpreviewwarning": "''Нисте пријављени. Ваша ИП адреса ће бити забележена у историји ове странице.''",
        "missingsummary": "'''Напомена:''' нисте унели опис измене.\nАко поново кликнете на „{{int:savearticle}}“, ваша измена ће бити сачувана без описа.",
        "revdelete-reasonotherlist": "Други разлог",
        "revdelete-edit-reasonlist": "Уреди разлоге за брисање",
        "revdelete-offender": "Аутор измене:",
-       "suppressionlog": "Ð\98Ñ\81Ñ\82оÑ\80иÑ\98а сакривања",
+       "suppressionlog": "Ð\94невник сакривања",
        "suppressionlogtext": "Испод се налази списак брисања и блокирања који укључује садржај сакривен од администратора. Текуће забране и блокирања можете наћи [[Special:BlockList|овде]].",
        "mergehistory": "Споји историје страница",
        "mergehistory-header": "Ова страница вам омогућава да спојите измене неке изворне странице у нову страницу.\nЗапамтите да ће ова измена оставити непромењен садржај историје странице.",
        "action-createaccount": "отварање овог корисничког налога",
        "action-history": "гледање историје ове странице",
        "action-minoredit": "означавање ове измене као мање",
-       "action-move": "пÑ\80емеÑ\81Ñ\82и Ð¾Ð²Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83",
+       "action-move": "пÑ\80емеÑ\88Ñ\82аÑ\9aе Ð¾Ð²Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86е",
        "action-move-subpages": "премештање ове странице и њених подстраница",
        "action-move-rootuserpages": "премештање основних корисничких страница",
-       "action-movefile": "пÑ\80емеÑ\81Ñ\82и Ð¾Ð²Ñ\83 Ð´Ð°Ñ\82оÑ\82екÑ\83",
+       "action-movefile": "пÑ\80емеÑ\88Ñ\82аÑ\9aе Ð¾Ð²Ðµ Ð´Ð°Ñ\82оÑ\82еке",
        "action-upload": "слање ове датотеке",
        "action-reupload": "замењивање постојеће датотеке",
        "action-reupload-shared": "постављање ове датотеке на заједничко складиште",
        "action-rollback": "брзо враћање измена последњег корисника који је мењао одређену страницу",
        "action-import": "увожење страница из других викија",
        "action-importupload": "увожење страница из отпремљене датотеке",
-       "action-patrol": "означавање туђих измена прегледаним",
-       "action-autopatrol": "самоозначавање измена прегледаним",
+       "action-patrol": "означавање туђих измена патролираним",
+       "action-autopatrol": "означавање сопствених измена патролираним",
        "action-unwatchedpages": "прегледање списка ненадгледаних страница",
        "action-mergehistory": "спајање историје ове странице",
        "action-userrights": "уређивање свих корисничких права",
        "action-userrights-interwiki": "уређивање корисничких права на другим викијима",
        "action-siteadmin": "закључавање или откључавање базе података",
        "action-sendemail": "слање е-порука",
-       "action-editmywatchlist": "измени свој списак надгледања",
+       "action-editmywatchlist": "измену сопственог списак надгледања",
        "action-viewmywatchlist": "преглед вашег списак надгледања",
        "action-viewmyprivateinfo": "прегледање ваших личних података",
        "action-editmyprivateinfo": "уређивање ваших личних података",
        "license-header": "Лиценца:",
        "nolicense": "није изабрано",
        "license-nopreview": "(преглед није доступан)",
-       "upload_source_url": " (исправна и јавно доступна адреса)",
+       "upload_source_url": "(исправна и јавно доступна адреса)",
        "upload_source_file": "(датотека на вашем рачунару)",
        "listfiles-delete": "обриши",
        "listfiles-summary": "Ова посебна страница приказује све послате датотеке.",
        "ninterwikis": "$1 {{PLURAL:$1|међувики|међувикија|међувикија}}",
        "nlinks": "$1 {{PLURAL:$1|веза|везе|веза}}",
        "nmembers": "$1 {{PLURAL:$1|члан|члана|чланова}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|члан|члана|чланова}}",
        "nrevisions": "$1 {{PLURAL:$1|измена|измене|измена}}",
        "nviews": "$1 {{PLURAL:$1|преглед|прегледа|прегледа}}",
        "nimagelinks": "Користи се на $1 {{PLURAL:$1|страници|странице|страница}}",
        "watchlist-details": "Имате {{PLURAL:$1|$1 страница|$1 странице|$1 страница}} на вашем списку надгледања, не рачунајући странице за разговор.",
        "wlheader-enotif": "Обавештење е-поруком је омогућено.",
        "wlheader-showupdated": "Странице које су измењене откад сте их последњи пут посетили су '''подебљане'''.",
-       "wlnote2": "Испод су приказане измене у {{PLURAL:$1|последњих један сат|последњих <strong>$1</strong> сата}} закључно са $2, $3.",
+       "wlnote": "Испод {{PLURAL:$1|је последња измена|су последње '''$1''' измене|је последњих '''$1''' измена}} у {{PLURAL:$2|претходном сату|претходна '''$2''' сата|претходних '''$2''' сати}}, закључно са $3, $4.",
        "wlshowlast": "Прикажи последњих $1 сати, $2 дана, $3",
        "watchlist-options": "Поставке списка надгледања",
        "watching": "Надгледање…",
        "delete-edit-reasonlist": "Уреди разлоге брисања",
        "delete-toobig": "Ова страница има велику историју, преко $1 {{PLURAL:$1|измене|измене|измена}}.\nБрисање таквих страница је ограничено да би се спречило случајно оптерећење сервера.",
        "delete-warning-toobig": "Ова страница има велику историју, преко $1 {{PLURAL:$1|измене|изменe|измена}}.\nЊено брисање може пореметити базу података, стога поступајте с опрезом.",
-       "deleting-backlinks-warning": "'''УпозоÑ\80еÑ\9aе:''' Ð\91Ñ\80иÑ\88еÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 ÐºÐ¾Ñ\98а Ñ\98е Ñ\83кÑ\99Ñ\83Ñ\87ена Ñ\83 Ð´Ñ\80Ñ\83ге Ñ\81Ñ\82Ñ\80аниÑ\86е или друге странице воде на њу.",
+       "deleting-backlinks-warning": "'''УпозоÑ\80еÑ\9aе:''' Ð±Ñ\80иÑ\88еÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 ÐºÐ¾Ñ\98а Ñ\98е Ñ\83кÑ\99Ñ\83Ñ\87ена Ñ\83 [[Special:WhatLinksHere/{{FULLPAGENAME}}|дÑ\80Ñ\83ге Ñ\81Ñ\82Ñ\80аниÑ\86е]] или друге странице воде на њу.",
        "rollback": "Врати измене",
        "rollback_short": "Врати",
        "rollbacklink": "врати",
        "sp-contributions-search": "Претрага доприноса",
        "sp-contributions-username": "ИП адреса или корисничко име:",
        "sp-contributions-toponly": "Прикажи само најновије измене",
-       "sp-contributions-newonly": "Ð\9fÑ\80икажи Ñ\81амо Ð¸Ð·Ð¼ÐµÐ½Ðµ ÐºÐ¾Ñ\98има Ñ\81Ñ\83 ÐºÑ\80еиÑ\80ане нове странице",
+       "sp-contributions-newonly": "Ð\9fÑ\80икажи Ñ\81амо Ð¸Ð·Ð¼ÐµÐ½Ðµ ÐºÐ¾Ñ\98има Ñ\81Ñ\83 Ð½Ð°Ð¿Ñ\80авÑ\99ене нове странице",
        "sp-contributions-submit": "Претражи",
        "whatlinkshere": "Шта води овде",
        "whatlinkshere-title": "Странице које су повезане са „$1“",
        "ipb_expiry_invalid": "Време истека је неисправно.",
        "ipb_expiry_temp": "Сакривене блокаде корисника морају бити трајне.",
        "ipb_hide_invalid": "Не могу да потиснем овај налог; има више од {{PLURAL:$1|једне измене|$1 измена}}.",
-       "ipb_already_blocked": "„$1“ је већ блокиран",
+       "ipb_already_blocked": "„$1“ је већ блокиран.",
        "ipb-needreblock": "$1 је већ блокиран. Желите ли да промените подешавања?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Друга блокада|Друге блокаде}}",
        "unblock-hideuser": "Не можете деблокирати овог корисника јер је његово корисничко име сакривено.",
        "movenotallowedfile": "Немате дозволу да премештате датотеке.",
        "cant-move-user-page": "Немате дозволу за премештање основних корисничких страница (осим подстраница).",
        "cant-move-to-user-page": "Немате дозволу за премештање странице на вашу корисничку страницу (осим на корисничку подстраницу).",
+       "cant-move-category-page": "Немате дозволу да премештате странице категорија.",
        "newtitle": "Нови наслов:",
        "move-watch": "Надгледај ову страницу",
        "movepagebtn": "Премести страницу",
        "delete_and_move_reason": "Обрисано да се ослободи место за премештање из „[[$1]]“",
        "selfmove": "Изворни и одредишни наслови су истоветни;\nне могу да преместим страницу преко саме себе.",
        "immobile-source-namespace": "Не могу да преместим странице у именском простору „$1“",
-       "immobile-target-namespace": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80емеÑ\81Ñ\82им Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\83 Ð¸Ð¼ÐµÐ½Ñ\81ком Ð¿Ñ\80оÑ\81Ñ\82оÑ\80Ñ\83 â\80\9e$1â\80\9d",
+       "immobile-target-namespace": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80емеÑ\81Ñ\82им Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\83 Ð¸Ð¼ÐµÐ½Ñ\81ком Ð¿Ñ\80оÑ\81Ñ\82оÑ\80Ñ\83 â\80\9e$1â\80\9c",
        "immobile-target-namespace-iw": "Међувики веза није исправно одредиште за премештање странице.",
        "immobile-source-page": "Ова страница се не може преместити.",
        "immobile-target-page": "Не могу да преместим на жељени наслов.",
        "importinterwiki": "Међувики увоз",
        "import-interwiki-text": "Изаберите вики и наслов странице за увоз.\nДатуми и имена уредника ће бити сачувани.\nСве радње при увозу с других викија су забележене у [[Special:Log/import|дневнику увоза]].",
        "import-interwiki-source": "Извор викија/странице:",
-       "import-interwiki-history": "Копирај све старије измене ове странице",
+       "import-interwiki-history": "Копирај све верзије историје за ову страницу",
        "import-interwiki-templates": "Укључи све шаблоне",
        "import-interwiki-submit": "Увези",
        "import-interwiki-namespace": "Одредишни именски простор:",
        "import-rootpage-nosubpage": "Именски простор „$1“ основне странице не дозвољава подстранице.",
        "importlogpage": "Дневник увоза",
        "importlogpagetext": "Административни увози страница с историјама измена с других викија.",
-       "import-logentry-upload": "{{GENDER:|је увезао|је увезла|уведе}} „[[$1]]“ отпремањем датотеке",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|измена|измене|измена}}",
+       "import-logentry-upload": "увезено [[$1]] отпремањем датотеке",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|измена увезена|измене увезене|измена увезено}}",
        "import-logentry-interwiki": "премештено с другог викија: $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|измена|измене|измена}} од $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|измена увезена|измене увезене|измена увезено}} из $2",
        "javascripttest": "Јаваскрипт тест",
        "javascripttest-title": "Извршавање тестова за $1",
        "javascripttest-pagetext-noframework": "Ова страница је резервисана за извршавање јаваскрипт тестова.",
        "autosumm-replace": "Замена садржаја странице са „$1“",
        "autoredircomment": "Преусмерење на [[$1]]",
        "autosumm-new": "Нова страница: $1",
+       "autosumm-newblank": "Направљена празна страница",
        "size-bytes": "$1 B",
        "size-kilobytes": "$1 kB",
        "size-megabytes": "$1 MB",
        "pagelang-name": "Страница",
        "pagelang-language": "Језик",
        "pagelang-select-lang": "Изабери језик",
-       "right-pagelang": "пÑ\80омена језика странице",
+       "right-pagelang": "меÑ\9aаÑ\9aе језика странице",
        "action-pagelang": "промену језика странице"
 }
index 52294ca..89d2c88 100644 (file)
@@ -40,7 +40,7 @@
        "tog-enotifwatchlistpages": "Pošalji mi e-poruku kada se promeni stranica ili datoteka koju nadgledam",
        "tog-enotifusertalkpages": "Pošalji mi e-poruku kada se promeni moja stranica za razgovor",
        "tog-enotifminoredits": "Pošalji mi e-poruku i za manje izmene u stranicama i datotekama",
-       "tog-enotifrevealaddr": "Otkrij moju e-adresu u porukama obaveštenja",
+       "tog-enotifrevealaddr": "Prikaži moju e-adresu u porukama obaveštenja",
        "tog-shownumberswatching": "Prikaži broj korisnika koji nadgledaju",
        "tog-oldsig": "Tekući potpis:",
        "tog-fancysig": "Smatraj potpis kao vikitekst (bez samopovezivanja)",
        "category-empty": "<div style=\"margin:2em 1em 0 1em; padding:0.5em; border:1px solid #AAA; text-align:center;\">''Ova kategorija trenutno ne sadrži stranice ili datoteke.''</div>",
        "hidden-categories": "{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}}",
        "hidden-category-category": "Sakrivene kategorije",
-       "category-subcat-count": "{{PLURAL:$2|Ova kategorija sadrži samo sledeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|sledeću potkategoriju|sledeće $1 potkategorije|sledećih $1 potkategorija}}, od ukupno $2.}}",
+       "category-subcat-count": "{{PLURAL:$2|1=Ova kategorija sadrži samo sledeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|sledeću potkategoriju|sledeće $1 potkategorije|sledećih $1 potkategorija}}, od ukupno $2.}}",
        "category-subcat-count-limited": "Ova kategorija sadrži {{PLURAL:$1|sledeću potkategoriju|sledeće $1 potkategorije|sledećih $1 potkategorija}}.",
-       "category-article-count": "{{PLURAL:$2|Ova kategorija sadrži samo sledeću stranicu.|{{PLURAL:$1|Sledeća stranica je|Sledeće $1 stranice su|Sledećih $1 stranica je}} u ovoj kategoriji, od ukupno $2.}}",
-       "category-article-count-limited": "{{PLURAL:$1|Sledeća stranica je|Sledeće $1 stranice su|Sledećih $1 stranica je}} u ovoj kategoriji.",
-       "category-file-count": "{{PLURAL:$2|Ova kategorija sadrži samo sledeću datoteku.|{{PLURAL:$1|Sledeća datoteka je|Sledeće $1 datoteke su|Sledećih $1 datoteka je}} u ovoj kategoriji, od ukupno $2.}}",
-       "category-file-count-limited": "{{PLURAL:$1|Sledeća datoteka je|Sledeće $1 datoteke su|Sledećih $1 datoteka je}} u ovoj kategoriji.",
+       "category-article-count": "{{PLURAL:$2|1=Ova kategorija sadrži samo sledeću stranicu.|{{PLURAL:$1|Sledeća stranica je|Sledeće $1 stranice su|Sledećih $1 stranica je}} u ovoj kategoriji, od ukupno $2.}}",
+       "category-article-count-limited": "{{PLURAL:$1|1=Sledeća stranica je|Sledeće $1 stranice su|Sledećih $1 stranica je}} u ovoj kategoriji.",
+       "category-file-count": "{{PLURAL:$2|1=Ova kategorija sadrži samo sledeću datoteku.|{{PLURAL:$1|Sledeća datoteka je|Sledeće $1 datoteke su|Sledećih $1 datoteka je}} u ovoj kategoriji, od ukupno $2.}}",
+       "category-file-count-limited": "{{PLURAL:$1|1=Sledeća datoteka je|Sledeće $1 datoteke su|Sledećih $1 datoteka je}} u ovoj kategoriji.",
        "listingcontinuesabbrev": "nast.",
        "index-category": "Popisane stranice",
        "noindex-category": "Nepopisane stranice",
        "delete": "Obriši",
        "deletethispage": "Obriši ovu stranicu",
        "undeletethispage": "Vrati ovu stranicu",
-       "undelete_short": "Vrati {{PLURAL:$1|jednu obrisanu izmenu|$1 obrisane izmene|$1 obrisanih izmena}}",
+       "undelete_short": "Vrati {{PLURAL:$1|1=jednu obrisanu izmenu|$1 obrisane izmene|$1 obrisanih izmena}}",
        "viewdeleted_short": "Pogledaj {{PLURAL:$1|obrisanu izmenu|$1 obrisane izmene|$1 obrisanih izmena}}",
        "protect": "Zaštiti",
        "protect_change": "promeni",
        "loginerror": "Greška pri prijavljivanju",
        "createacct-error": "Došlo je do greške pri kreiranju naloga",
        "createaccounterror": "Ne mogu da otvorim nalog: $1",
-       "nocookiesnew": "Korisnički nalog je otvoren, ali niste prijavljeni.\nOvaj viki koristi kolačiće za prijavu. Vama su kolačići onemogućeni.\nOmogućite ih, pa se onda prijavite sa svojim korisničkim imenom i lozinkom.",
-       "nocookieslogin": "Ovaj viki koristi kolačiće za prijavljivanje korisnika.\nVama su kolačići onemogućeni. Omogućite ih i pokušajte ponovo.",
+       "nocookiesnew": "Korisnički nalog je otvoren, ali niste prijavljeni.\n{{SITENAME}} koristi kolačiće za prijavu. Vama su kolačići onemogućeni.\nOmogućite ih, pa se onda prijavite sa svojim korisničkim imenom i lozinkom.",
+       "nocookieslogin": "{{SITENAME}} koristi kolačiće za prijavljivanje korisnika.\nVama su kolačići onemogućeni. Omogućite ih i pokušajte ponovo.",
        "nocookiesfornew": "Korisnički nalog nije otvoren jer njegov izvor nije potvrđen.\nOmogućite kolačiće na pregledaču i ponovo učitajte stranicu.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
        "noname": "Uneli ste neispravno korisničko ime.",
        "password-name-match": "Lozinka se mora razlikovati od korisničkog imena.",
        "password-login-forbidden": "Korišćenje ovog korisničkog imena i lozinke je zabranjeno.",
        "mailmypassword": "Resetuj lozinku",
-       "passwordremindertitle": "{{SITENAME}} â\80\93 podsetnik za lozinku",
+       "passwordremindertitle": "{{SITENAME}} â\80\94 privremena lozinka",
        "passwordremindertext": "Neko, verovatno vi, sa IP adrese $1 je zatražio novu lozinku na vikiju {{SITENAME}} ($4).\nStvorena je privremena lozinka za {{GENDER:$2|korisnika|korisnicu|korisnika}} $2 koja glasi $3.\nUkoliko je ovo vaš zahtev, sada se prijavite i postavite novu lozinku.\nPrivremena lozinka ističe za {{PLURAL:$5|jedan dan|$5 dana|$5 dana}}.\n\nAko je neko drugi zatražio promenu lozinke, ili ste se setili vaše lozinke i ne želite da je menjate, zanemarite ovu poruku.",
-       "noemail": "Ne postoji e-adresa za {{GENDER:$1|korisnika|korisnicu|korisnika}} $1.",
+       "noemail": "Ne postoji e-adresa za {{GENDER:$1|korisnika|korisnicu}} $1.",
        "noemailcreate": "Morate navesti ispravnu e-adresu",
        "passwordsent": "Nova lozinka je poslata na e-adresu {{GENDER:$1|korisnika|korisnice|korisnika}} $1.\nPrijavite se pošto je primite.",
        "blocked-mailpassword": "Vašoj IP adresi je onemogućeno uređivanje stranica, kao i mogućnost zahtevanja nove lozinke.",
        "revdelete-reasonotherlist": "Drugi razlog",
        "revdelete-edit-reasonlist": "Uredi razloge za brisanje",
        "revdelete-offender": "Autor izmene:",
-       "suppressionlog": "Istorija sakrivanja",
+       "suppressionlog": "Dnevnik sakrivanja",
        "suppressionlogtext": "Ispod se nalazi spisak brisanja i blokiranja koji uključuje sadržaj sakriven od administratora. Tekuće zabrane i blokiranja možete naći [[Special:BlockList|ovde]].",
        "mergehistory": "Spoji istorije stranica",
        "mergehistory-header": "Ova stranica vam omogućava da spojite izmene neke izvorne stranice u novu stranicu.\nZapamtite da će ova izmena ostaviti nepromenjen sadržaj istorije stranice.",
        "action-createaccount": "otvaranje ovog korisničkog naloga",
        "action-history": "gledanje istorije ove stranice",
        "action-minoredit": "označavanje ove izmene kao manje",
-       "action-move": "premesti ovu stranicu",
+       "action-move": "premeštanje ove stranice",
        "action-move-subpages": "premeštanje ove stranice i njenih podstranica",
        "action-move-rootuserpages": "premeštanje osnovnih korisničkih stranica",
-       "action-movefile": "premesti ovu datoteku",
+       "action-movefile": "premeštanje ove datoteke",
        "action-upload": "slanje ove datoteke",
        "action-reupload": "zamenjivanje postojeće datoteke",
        "action-reupload-shared": "postavljanje ove datoteke na zajedničko skladište",
        "action-import": "uvoženje stranica iz drugih vikija",
        "action-importupload": "uvoženje stranica iz otpremljene datoteke",
        "action-patrol": "označavanje tuđih izmena pregledanim",
-       "action-autopatrol": "samooznačavanje izmena pregledanim",
+       "action-autopatrol": "označavanje sopstvenih izmena patroliranim",
        "action-unwatchedpages": "pregledanje spiska nenadgledanih stranica",
        "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",
-       "action-editmywatchlist": "izmeni svoj spisak nadgledanja",
+       "action-editmywatchlist": "izmenu sopstvenog spisak nadgledanja",
        "action-viewmywatchlist": "pregled vašeg spisak nadgledanja",
        "action-viewmyprivateinfo": "pregledanje vaših ličnih podataka",
        "action-editmyprivateinfo": "uređivanje vaših ličnih podataka",
        "license-header": "Licenca:",
        "nolicense": "nije izabrano",
        "license-nopreview": "(pregled nije dostupan)",
-       "upload_source_url": " (ispravna i javno dostupna adresa)",
+       "upload_source_url": "(ispravna i javno dostupna adresa)",
        "upload_source_file": "(datoteka na vašem računaru)",
        "listfiles-summary": "Ova posebna stranica prikazuje sve poslate datoteke.",
        "listfiles_search_for": "Naziv datoteke:",
        "sharedupload-desc-create": "Ova datoteka se nalazi na $1 i može da se koristi na drugim projektima.\nNjen opis možete da izmenite na [$2 odgovarajućoj stranici].",
        "filepage-nofile": "Ne postoji datoteka s ovim nazivom.",
        "filepage-nofile-link": "Ne postoji datoteka s ovim nazivom, ali je možete [$1 poslati].",
-       "uploadnewversion-linktext": "Pošalji novo izdanje ove datoteke",
+       "uploadnewversion-linktext": "Pošalji novu verziju ove datoteke",
        "shared-repo-from": "iz $1",
        "shared-repo": "zajedničko skladište",
        "shared-repo-name-wikimediacommons": "Vikimedijina ostava",
        "ninterwikis": "$1 {{PLURAL:$1|međuviki|međuvikija|međuvikija}}",
        "nlinks": "$1 {{PLURAL:$1|veza|veze|veza}}",
        "nmembers": "$1 {{PLURAL:$1|član|člana|članova}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|član|člana|članova}}",
        "nrevisions": "$1 {{PLURAL:$1|izmena|izmene|izmena}}",
        "nviews": "$1 {{PLURAL:$1|pregled|pregleda|pregleda}}",
        "nimagelinks": "Koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}",
        "watchlist-details": "Imate {{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica}} na vašem spisku nadgledanja, ne računajući stranice za razgovor.",
        "wlheader-enotif": "Obaveštenje e-porukom je omogućeno.",
        "wlheader-showupdated": "Stranice koje su izmenjene otkad ste ih poslednji put posetili su '''podebljane'''.",
-       "wlnote2": "Ispod su prikazane izmene u {{PLURAL:$1|poslednjih jedan sat|poslednjih <strong>$1</strong> sata}} zaključno sa $2, $3.",
+       "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",
        "watching": "Nadgledanje…",
        "delete-edit-reasonlist": "Uredi razloge brisanja",
        "delete-toobig": "Ova stranica ima veliku istoriju, preko $1 {{PLURAL:$1|izmene|izmene|izmena}}.\nBrisanje takvih stranica je ograničeno da bi se sprečilo slučajno opterećenje servera.",
        "delete-warning-toobig": "Ova stranica ima veliku istoriju, preko $1 {{PLURAL:$1|izmene|izmene|izmena}}.\nNjeno brisanje može poremetiti bazu podataka, stoga postupajte s oprezom.",
-       "deleting-backlinks-warning": "'''Upozorenje:''' Brišete stranicu koja je uključena u druge stranice ili druge stranice vode na nju.",
+       "deleting-backlinks-warning": "'''Upozorenje:''' brišete stranicu koja je uključena u [[Special:WhatLinksHere/{{FULLPAGENAME}}|druge stranice]] ili druge stranice vode na nju.",
        "rollback": "Vrati izmene",
        "rollback_short": "Vrati",
        "rollbacklink": "vrati",
        "sp-contributions-search": "Pretraga doprinosa",
        "sp-contributions-username": "IP adresa ili korisničko ime:",
        "sp-contributions-toponly": "Prikaži samo najnovije izmene",
-       "sp-contributions-newonly": "Prikaži samo izmene kojima su kreirane nove stranice",
+       "sp-contributions-newonly": "Prikaži samo izmene kojima su napravljene nove stranice",
        "sp-contributions-submit": "Pretraži",
        "whatlinkshere": "Šta vodi ovde",
        "whatlinkshere-title": "Stranice koje su povezane sa „$1“",
        "ipb_expiry_invalid": "Vreme isteka je neispravno.",
        "ipb_expiry_temp": "Sakrivene blokade korisnika moraju biti trajne.",
        "ipb_hide_invalid": "Ne mogu da potisnem ovaj nalog; ima više od {{PLURAL:$1|jedne izmene|$1 izmena}}.",
-       "ipb_already_blocked": "„$1“ je već blokiran",
+       "ipb_already_blocked": "„$1“ je već blokiran.",
        "ipb-needreblock": "$1 je već blokiran. Želite li da promenite podešavanja?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Druga blokada|Druge blokade}}",
        "unblock-hideuser": "Ne možete deblokirati ovog korisnika jer je njegovo korisničko ime sakriveno.",
        "movenotallowedfile": "Nemate dozvolu da premeštate datoteke.",
        "cant-move-user-page": "Nemate dozvolu za premeštanje osnovnih korisničkih stranica (osim podstranica).",
        "cant-move-to-user-page": "Nemate dozvolu za premeštanje stranice na vašu korisničku stranicu (osim na korisničku podstranicu).",
+       "cant-move-category-page": "Nemate dozvolu da premeštate stranice kategorija.",
        "newtitle": "Novi naslov:",
        "move-watch": "Nadgledaj ovu stranicu",
        "movepagebtn": "Premesti stranicu",
        "delete_and_move_reason": "Obrisano da se oslobodi mesto za premeštanje iz „[[$1]]“",
        "selfmove": "Izvorni i odredišni naslovi su istovetni;\nne mogu da premestim stranicu preko same sebe.",
        "immobile-source-namespace": "Ne mogu da premestim stranice u imenskom prostoru „$1“",
-       "immobile-target-namespace": "Ne mogu da premestim stranice u imenskom prostoru â\80\9e$1â\80\9d",
+       "immobile-target-namespace": "Ne mogu da premestim stranice u imenskom prostoru â\80\9e$1â\80\9c",
        "immobile-target-namespace-iw": "Međuviki veza nije ispravno odredište za premeštanje stranice.",
        "immobile-source-page": "Ova stranica se ne može premestiti.",
        "immobile-target-page": "Ne mogu da premestim na željeni naslov.",
        "importinterwiki": "Međuviki uvoz",
        "import-interwiki-text": "Izaberite viki i naslov stranice za uvoz.\nDatumi i imena urednika će biti sačuvani.\nSve radnje pri uvozu s drugih vikija su zabeležene u [[Special:Log/import|dnevniku uvoza]].",
        "import-interwiki-source": "Izvor vikija/stranice:",
-       "import-interwiki-history": "Umnoži sve izmene ove stranice",
+       "import-interwiki-history": "Kopiraj sve verzije istorije za ovu stranicu",
        "import-interwiki-templates": "Uključi sve šablone",
        "import-interwiki-submit": "Uvezi",
        "import-interwiki-namespace": "Odredišni imenski prostor:",
        "import-rootpage-nosubpage": "Imenski prostor „$1“ osnovne stranice ne dozvoljava podstranice.",
        "importlogpage": "Dnevnik uvoza",
        "importlogpagetext": "Administrativni uvozi stranica s istorijama izmena s drugih vikija.",
-       "import-logentry-upload": "{{GENDER:|je uvezao|je uvezla|uvede}} „[[$1]]“ otpremanjem datoteke",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|izmena|izmene|izmena}}",
+       "import-logentry-upload": "uvezeno [[$1]] otpremanjem datoteke",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|izmena uvezena|izmene uvezene|izmena uvezeno}}",
        "import-logentry-interwiki": "premešteno s drugog vikija: $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|izmena|izmene|izmena}} od $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|izmena uvezena|izmene uvezene|izmena uvezeno}} iz $2",
        "javascripttest": "Javaskript test",
        "javascripttest-title": "Izvršavanje testova za $1",
        "javascripttest-pagetext-noframework": "Ova stranica je rezervisana za izvršavanje javaskript testova.",
index be3b67e..f4e8b82 100644 (file)
@@ -75,6 +75,7 @@
        "tog-watchdefault": "Lägg till sidor och filer jag redigerar i min bevakningslista",
        "tog-watchmoves": "Lägg till sidor och filer jag flyttar i min bevakningslista",
        "tog-watchdeletion": "Lägg till sidor och filer jag raderar i min bevakningslista",
+       "tog-watchrollback": "Lägg till sidor som jag har utfört en tillbakarullning på i min övervakningslista",
        "tog-minordefault": "Markera automatiskt ändringar som mindre",
        "tog-previewontop": "Visa förhandsgranskningen ovanför redigeringsrutan",
        "tog-previewonfirst": "Visa förhandsgranskning vid första redigeringen",
        "preview": "Förhandsgranska",
        "showpreview": "Visa förhandsgranskning",
        "showdiff": "Visa ändringar",
+       "blankarticle": "<strong>Varning:</strong> Sidan du skapar är tom.\nOm du klickar på \"{{int:savearticle}}\" igen kommer sidan skapas utan något innehåll.",
        "anoneditwarning": "'''Varning:''' Du är inte inloggad.\nDin IP-adress kommer att sparas i historiken för den här sidan.",
        "anonpreviewwarning": "''Du är inte inloggad. Om du sparar kommer din IP-adress registreras på denna sidas redigeringshistorik.''",
        "missingsummary": "'''Påminnelse:''' Du har inte skrivit någon redigeringskommentar.\nOm du klickar på \"{{int:savearticle}}\" igen, kommer din redigering att sparas utan en sådan.",
        "rev-deleted-event": "(loggåtgärd borttagen)",
        "rev-deleted-user-contribs": "[användarnamn eller IP-adress har tagits bort - redigeringen visas ej bland bidragen]",
        "rev-deleted-text-permission": "Denna version av sidan har '''raderats'''.\nDet kan finnas mer information i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].",
+       "rev-suppressed-text-permission": "Denna version av sidan har <strong>undanhållits</strong>.\nDetaljer kan hittas i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} undanhållandeloggen].",
        "rev-deleted-text-unhide": "Den här versionen av sidan har '''raderats'''.\nDet kan finnas mer information i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].\nDu kan fortfarande [$1 se den här versionen] om du önskar att fortsätta.",
        "rev-suppressed-text-unhide": "Den här versionen av sidan har blivit '''undanhållen'''.\nDet kan finnas mer information i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} undanhållandeloggen].\nDu kan fortfarande [$1 se den här versionen] om du önskar att fortsätta.",
        "rev-deleted-text-view": "Denna version av sidan har '''raderats'''.\nDu kan se den; det kan finnas mer information i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].",
        "revdelete-text-text": "Raderade sidversioner kommer fortfarande synas i sidans historik, men delar av innehållet kommer inte att bli tillgängligt offentligt.",
        "revdelete-text-file": "Raderade filversioner kommer fortfarande synas i filens historik, men delar av innehållet kommer inte att bli tillgängligt offentligt.",
        "logdelete-text": "Raderade logghändelser kommer fortfarande synas i loggarna, men delar av innehållet kommer inte att bli tillgängligt offentligt.",
-       "revdelete-text-others": "Andra administratörer på {{SITENAME}} kommer fortfarande att kunna komma åt det dolda innehållet och återställa det igen genom samma gränssnitt om inte tilläggande begränsningar används.",
+       "revdelete-text-others": "Andra administratörer kommer fortfarande att kunna komma åt det dolda innehållet och återställa det igen om inte ytterligare begränsningar används.",
        "revdelete-confirm": "Var god bekräfta att du vill göra detta, och att du förstår konsekvenserna, och att du gör så i enlighet med [[{{MediaWiki:Policy-url}}|policyn]].",
        "revdelete-suppress-text": "Undanhållande ska '''bara''' användas i följande fall:\n* Eventuell förolämpande information\n* Opassande personlig information\n*: ''hemadresser och telefonnummer, personnummer, etc.''",
        "revdelete-legend": "Ändra synlighet",
        "right-deletedtext": "Visa raderad text och ändringar mellan raderade versioner",
        "right-browsearchive": "Sök efter raderade sidor",
        "right-undelete": "Återställ raderade sidor",
-       "right-suppressrevision": "Se och återställa sidversioner som dolts för administratörer",
+       "right-suppressrevision": "Se, dölj och ta fram specifika sidversioner som dolts för alla användare",
+       "right-viewsuppressed": "Se sidversioner som dolts från alla användare",
        "right-suppressionlog": "Se privata loggar",
        "right-block": "Blockera andra användare från att redigera",
        "right-blockemail": "Blockera användare från att skicka e-post",
        "recentchanges-legend-heading": "'''Teckenförklaring:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se även [[Special:NewPages|listan över nya sidor]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Nedan visas ändringar sedan <strong>$2</strong> (upp till <strong>$1</strong> ändringar visas).",
+       "rcnotefrom": "Nedan visas {{PLURAL:$5|ändringar|ändringen}} sedan <strong>$3, $4</strong> (upp till <strong>$1</strong> ändringar visas).",
        "rclistfrom": "Visa ändringar från och med $3 $2",
        "rcshowhideminor": "$1 mindre ändringar",
        "rcshowhideminor-show": "Visa",
        "nolicense": "Ingen angiven",
        "licenses-edit": "Redigera licensalternativ",
        "license-nopreview": "(Förhandsvisning är inte tillgänglig)",
-       "upload_source_url": " (en giltig URL som är allmänt åtkomlig)",
-       "upload_source_file": " (en fil på din dator)",
+       "upload_source_url": "(din valda fil från en giltig webbadress som är allmänt åtkomlig)",
+       "upload_source_file": "(din valda fil från din dator)",
        "listfiles-delete": "radera",
        "listfiles-summary": "Den här specialsidan visar alla filer som laddats upp.",
        "listfiles_search_for": "Sök efter filnamn:",
        "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-cat-noforeign": "Följande filer används men finns inte. Sidor som bäddar in filer som inte finns listas upp i [[:$1]].",
+       "wantedfiletext-cat-noforeign": "Följande filer används men finns inte. Sidor som bäddar in filer som inte finns listas i [[:$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>.",
        "wantedfiletext-nocat-noforeign": "Följande filer används men finns inte.",
        "wantedtemplates": "Önskade mallar",
        "watchlist-details": "Du har {{PLURAL:$1|en sida|$1 sidor}} på din bevakningslista (diskussionssidor är inte separat medräknade).",
        "wlheader-enotif": "E-postmeddelanden är aktiverade.",
        "wlheader-showupdated": "Sidor som har ändrats sedan ditt senaste besök visas i '''fetstil.'''",
-       "wlnote2": "Nedan finns ändringarna från {{PLURAL:$1|den senaste timmen|de senaste <strong>$1</strong> timmarna}}, med början den $2 kl. $3.",
+       "wlnote": "Nedan finns {{PLURAL:$1|den senaste ändringen|de senaste <strong>$1</strong> ändringarna}} under {{PLURAL:$2|den senaste timmen|de senaste <strong>$2</strong> timmarna}} från den $3 kl. $4.",
        "wlshowlast": "Visa senaste $1 timmarna $2 dygnen $3",
        "watchlist-options": "Alternativ för bevakningslistan",
        "watching": "Bevakar...",
        "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-error-edit": "Sidan \"$1\" blev inte importerad eftersom du inte har tillåtelse att redigera den.",
+       "import-error-create": "Sidan \"$1\" blev inte importerad eftersom du inte har tillåtelse att skapa den.",
+       "import-error-interwiki": "Sidan \"$1\" blev inte importerad eftersom dess namn är reserverat för externa länkar (interwiki).",
+       "import-error-special": "Sidan \"$1\" blev inte importerad eftersom den tillhör en särskild namnrymd som inte tillåter sidor.",
+       "import-error-invalid": "Sidan \"$1\" blev inte importerad eftersom namnet den skulle importeras till är ogiltigt på denna wiki.",
        "import-error-unserialize": "Versionen $2 av sidan \"$1\" kunde inte avserialiseras. Versionen rapporterades för att använda innehållsmodellen $3, som serialiserades som $4.",
        "import-error-bad-location": "Sidversionen $2 som använder innehållsmodellen $3 kan inte lagras på \"$1\" i denna wiki eftersom modellen inte stöds på den där sidan.",
        "import-options-wrong": "Fel {{PLURAL:$2|alternativ|alternativ}}: <nowiki>$1</nowiki>",
        "importlogpage": "Importlogg",
        "importlogpagetext": "Administrativa sidimporter med versionshistorik från andra wikier.",
        "import-logentry-upload": "importerade [[$1]] genom filuppladdning",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|version|versioner}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|version|versioner}} importerades",
        "import-logentry-interwiki": "överförde $1 mellan wikier",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|version|versioner}} från $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|version|versioner}} importerades från $2",
        "javascripttest": "JavaScript-testning",
        "javascripttest-title": "Kör $1 tester",
        "javascripttest-pagetext-noframework": "Denna sida är reserverat för att köra JavaScript-tester.",
        "autosumm-replace": "Ersätter sidans innehåll med '$1'",
        "autoredircomment": "Omdirigerar till [[$1]]",
        "autosumm-new": "Skapade sidan med '$1'",
+       "autosumm-newblank": "Skapade tom sida",
        "size-bytes": "$1 byte",
        "size-kilobytes": "$1 kbyte",
        "size-megabytes": "$1 Mbyte",
index df1295c..61e3cf9 100644 (file)
        "talkpagelinktext": "dyskusyjo",
        "specialpage": "Szpecyjolno zajta",
        "personaltools": "Perzůnolne",
-       "postcomment": "Skůmyntuj",
        "articlepage": "Zajta artikla",
        "talk": "Dyskusyjo",
        "views": "Widok",
        "externaldberror": "Je jaki feler we zewnyntrznyj baźe autentyfikacyjnyj, abo ńy mosz uprawńyń potrzebnych do aktualizacyji zewnyntrznego kůnta.",
        "login": "Zaloguj śe",
        "nav-login-createaccount": "Logowańy / Tworzyńy kůnta",
-       "loginprompt": "Muśisz mjeć załůnczůne cookies coby můc śe sam zalogować.",
        "userlogin": "Logowańy / Tworzyńy kůnta",
        "userloginnocreate": "Zaloguj śe",
        "logout": "Wyloguj",
        "explainconflict": "Ftoś zdůnżůł wćepać swoja wersyjo artikla ńim żeś naszkryflou sprowjyńy.\nWe polu edycyji na wjyrchu mosz tekst zajty aktuelńy naszkryflany we baźe danych.\nTwoje pomjyńańo sům we polu edycyji půńiżyj.\nBy wćepać swoje pomjyńańo muśisz pomjyńać tekst we polu na wjyrchu.\n'''Ino''' tekst ze pola na wjyrchu bydźe naszkryflany we baźe jak \nwciśńesz knefel \"{{int:savearticle}}\".",
        "yourtext": "Twůj tekst",
        "storedversion": "Naszkryflano wersyjo",
-       "nonunicodebrowser": "'''Pozůr! Twoja přeglůndorka ńy umje poprowńy rozpoznować kodowańo UTF-8 (Unicode). Bestož wšyjske znoki, kerych Twoja přeglůndorka ńy umje rozpoznować, zamjeńůno na jejich kody heksadecymalne.'''",
-       "editingold": "'''Dej pozůr: Sprowjoš inkšo wersyjo zajty kej bježůnco. Jeli jům naškryfloš, wšyjske půźńyjše pomjyńańa bydům wyćepane.'''",
+       "nonunicodebrowser": "'''Pozůr! Twoja przeglůndorka ńy umi poprawńe rozpoznować kodowańo UTF-8 (Unicode). Bestůż wszyjske znoki, kerych Twojo przeglůndorka ńy umi rozpoznować, zamjeńůno na jejich kody heksadecymalne.'''",
+       "editingold": "'''Dej pozůr: Sprowjosz inkszo wersyjo zajty kej bjeżůnco. Jeli jům naszkryflosz, wszyjske půźńyjsze pomjyńańa bydům wyćepane.'''",
        "yourdiff": "Růżńice",
        "copyrightwarning": "Pamjyntej uo tym, aże cołki wkłod do {{SITENAME}} udostympńůmy wedle zasad $2 (dokładńij we $1). Jak ńy chcesz, coby kożdy můg go půmjyńać a dalij rozpowszychńoć, ńy wćepuj uůnygo sam. Szkryflajůnc sam tukej pośwjadczosz tyż, co te pisańy je twoje własne, abo żeś go wźůn(a) ze materjołůw kere sům na ''public domain'', abo kůmpatybilne.<br />\n'''PROSZA ŃY WĆEPYWAĆ SAM MATYRJOŁŮW KERE SŮM CHRŮŃONE AUTORSKIM PRAWYM BEZ DOZWOLEŃO WŁAŚĆIĆELA!'''",
        "copyrightwarning2": "Pamjyntej uo tym, aże cołki wkłod do {{GRAMMAR:MS.lp|{{SITENAME}}}} może być sprowjany, pomjyńany abo wyćepany bez inkszych użytkownikůw. Jak ńy chcysz, coby kożdy můg uůnygo zmjyńać a dalij rozpowszychńoć bez uograniczyń, ńy wćepuj go sam.<br />\nSzkryflajůnc sam tukej pośwjadczosz tyż, co te pisańy je twoje własne, abo żeś go wźůn(a) ze matyrjołůw kere sům na public domain, abo kůmpatybilne (kuknij tyż: $1).\n'''PROSZA ŃY WĆEPYWAĆ SAM MATYRJOŁŮW KERE SŮM CHRŮŃONE PRAWYM AUTORSKIM BEZ DOZWOLEŃO WŁAŚĆIĆELA!'''",
        "template-protected": "(zawrzity uod sprowjańo)",
        "template-semiprotected": "(tajlowo zawarte)",
        "hiddencategories": "Ta zajta je {{PLURAL:$1|we jednyj schrůńunyj katygoryji|we $1 schrůńunych katygoryjach}}:",
-       "nocreatetext": "Na {{GRAMMAR:MS.lp|{{SITENAME}}}} twořyńy nowych zajtůw uograńičůno.\nMožeš sprowjać te co juž sům, abo [[Special:UserLogin|zalogować śe, abo zauožyć konto]].",
+       "nocreatetext": "Na {{GRAMMAR:MS.lp|{{SITENAME}}}} tworzyńy nowych zajtůw uograńiczůno.\nMoges sprowjać te co już sům, abo [[Special:UserLogin|zalogować śe, abo śa zaregisztrować]].",
        "nocreate-loggedin": "Ńy mosz uprowńyń do tworzyńo nowych zajtůw.",
        "sectioneditnotsupported-title": "Sprowjańy tajli ńymogebne",
        "sectioneditnotsupported-text": "Sprowjańy tajli ńymogebne na tyj zajće.",
        "permissionserrors": "Felerne uprawńyńo",
        "permissionserrorstext": "Ńy mosz uprowńyń do takij akcyje {{PLURAL:$1|skuli tego, co:|bestůż, co:}}",
        "permissionserrorstext-withaction": "Ńy mogesz $2, ze {{PLURAL:$1|takigo powodu|takich powodůw}}:",
-       "recreate-moveddeleted-warn": "'''ůostrzeżyńy: Wćepujesz samo zajta, kery bůu poprzedńo wyćepany.'''\n\nZastanůw śe, czy powinno śe go sam wćepywać.\nRejer wyćepań tyj zajty je podany půńiżej, cobyś mioł wygoda:",
+       "recreate-moveddeleted-warn": "'''Uostrzeżyńy: Wćepujesz ta samo zajta, kero bůła poprzedńo wyćepano.'''\n\nZastanůw śe, czy noleżoło by śe go sam wćepywać.\nRejer wyćepań tyj zajty je podany půńiżej, cobyś mjoł wygoda:",
        "moveddeleted-notice": "Ta zajta zostoła wyćepńynto. Rejer wyćepań tyj zajty je pokozany půńiżyj.",
        "log-fulllog": "Ukoż rejer",
-       "edit-hook-aborted": "Sprowjyńy štopńynte skiž hoka.\nŃy je wjadůme pů jakymu.",
+       "edit-hook-aborted": "Sprowjyńy sztopńynte skiż hoka.\nŃy je wjadůme pů jakymu.",
        "edit-gone-missing": "Ńy idźe zaktualizować zajty.\nZdowo śe, co zostoła wyćepano.",
        "edit-conflict": "Kůnflikt sprowjyń.",
        "edit-no-change": "Twoje sprowjyńe uostoło zignorowane pů takymu, aże ńic żeś we tekśće ńy zmjyńůł.",
        "post-expand-template-inclusion-warning": "Dej pozůr: Dokuplowane mustry sům moc wjelge.\nŃykere mustry ńy bydům dokuplowane.",
        "post-expand-template-inclusion-category": "Zajty, na kerych dokuplowane mustry sům moc wjelge",
        "post-expand-template-argument-warning": "Dej pozůr: Ta zajta zawjyro przinojmyńi jedyn argument we mustrze, kery powoduje co je ůun za wjelgi. Te argumynty bydům pomińynte.",
-       "post-expand-template-argument-category": "Zajty na kerych sům šablůny s pomińyntymi argumyntůma.",
+       "post-expand-template-argument-category": "Zajty na kerych sům mustry ze pomińyntymi argumyntůma.",
        "parser-template-loop-warning": "Wykryto muster zapyntlyńo: [[$1]]",
        "parser-template-recursion-depth-warning": "Przekroczůno limit głymbokośći rekurencyji mustru ($1)",
-       "undo-success": "Sprowjyńy zostouo wycůfane. Proša pomjarkować ukozane půnižyj dyferencyje mjyndzy wersyjami, coby zweryfikować jejich poprawność, potym zaś naškryflać pomjyńańo coby zakońčyć uoperacyjo.",
+       "undo-success": "Sprowjyńy zostoło wycofane. Prosza pomjarkować ukozane půniżyj dyferencyje mjyndzy wersyjůma, coby zweryfikować jejich poprawność, potym zaś naszkryflać pomjyńańo coby zakończyć uoperacyjo.",
        "undo-failure": "Sprowjyńo ńy idźe wycofać skuli kůnflikta ze wersyjůma postrzedńimi.",
        "undo-norev": "Sprowjyńo ńy idźe cofnůńć skuli tego, co ńy istńije abo uostoło wyćepane.",
        "undo-summary": "Wycůfańy wersyji $1 naszkryflanej bez [[Special:Contributions/$2|$2]] ([[User talk:$2|godka]])",
        "cantcreateaccounttitle": "Ńy do śe utworzić kůnta",
-       "cantcreateaccount-text": "Tworzyńy kůnta s tygo adresu IP ('''$1''') zostoło zawarte bez użytkowńika [[User:$3|$3]].\n\nSkuli: ''$2''",
-       "viewpagelogs": "Uoboč rejery uoperacyji lo tyj zajty",
+       "cantcreateaccount-text": "Tworzyńy kůnta s tygo adresu IP ('''$1''') uostoło zawarte bez użytkowńika [[User:$3|$3]].\n\nSkuli: ''$2''",
+       "viewpagelogs": "Uobocz rejery uoperacyji lo tyj zajty",
        "nohistory": "Ta zajta ńy mo swojij historyje sprowjyń.",
        "currentrev": "Aktuelno wersyjo",
        "currentrev-asof": "Aktuelno wersyjo na dźyń $1",
        "revdelete-show-file-confirm": "Jeżeś echt pewny co chcesz uobejzdrzeć wyćepano wersyjo plika „<nowiki>$1</nowiki>” s $2 $3?",
        "revdelete-show-file-submit": "Ja",
        "logdelete-selected": "{{PLURAL:$1|Wybrane zdarzyńy ze rejeru|Wybrane zdarzyńa ze rejeru}}:",
-       "revdelete-legend": "Naštaluj uograńičyńo lo wersyji:",
+       "revdelete-legend": "Nasztaluj uograńiczyńo lo wersyji:",
        "revdelete-hide-text": "Schrůń tekst wersyji",
        "revdelete-hide-image": "Schrůń zawartość plika",
        "revdelete-hide-name": "Schrůń akcyjo a cwek",
        "revdelete-radio-same": "(byz pomjyń)",
        "revdelete-radio-set": "Zakryty",
        "revdelete-radio-unset": "Widoczny",
-       "revdelete-suppress": "Schrůń informacyje zarůwno před admińistratorůma jak i před inkšymi",
-       "revdelete-unsuppress": "Usůń uograńičyńo lo wćepanej nazod historyje pomjyńań",
+       "revdelete-suppress": "Schrůń informacyje zarůwno przed admińistratorůma kej i przed inkszymi",
+       "revdelete-unsuppress": "Usůń uograńiczyńo lo wćepanej nazod historyje pomjyńań",
        "revdelete-log": "Czymu:",
        "revdelete-submit": "Zaakceptuj do wybrany{{PLURAL:$1|j wersyji|ch wersyji}}",
        "revdelete-success": "'''Půmyślńy zmjyńůno widoczność wersyji.'''",
        "pagehist": "Historyjo sprowjyń zajty",
        "deletedhist": "Wyćepano gyszichta sprowjyń",
        "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.",
-       "revdelete-modify-missing": "Feler. Ńy mo elementu $1 w bazie.",
+       "revdelete-show-no-access": "Feler przy ukozoniu wersyji $2, $1. Ńy mosz uprawńyń lo ńygo.",
+       "revdelete-modify-no-access": "Feler przy zmjyńe widoczności wersyji $2, $1. Ńy mosz uprawńeń lo ńygo.",
+       "revdelete-modify-missing": "Feler. Ńy mo tajli $1 w baźe.",
        "revdelete-no-change": "''''Dej pozůr''': element $2, $1 mo już ustawjonům widoczność.",
        "revdelete-concurrent-change": "Feler. Pomjyno już element $2, $1. Prosza uoboczyć to w rejerze.",
-       "revdelete-only-restricted": "Ńy możno ukryć elementu $2, $1 przed administracyjom. Wybjer jydnom ze opcyji.",
+       "revdelete-only-restricted": "Ńy do śe ukryć tajli $2, $1 przed administracyjom. Wybjer jydnom ze uopcyji.",
        "revdelete-reason-dropdown": "* Kůmyntorze lo wyćepańa\n** NPA\n** Prywatność",
        "revdelete-otherreason": "Inkszy/dodatkowy powůd:",
        "revdelete-reasonotherlist": "Inkszy powůd",
        "revdelete-offender": "Autor wersyji:",
        "suppressionlog": "Log schrůńyńć",
        "suppressionlogtext": "Půńiżyj je lista nojnowszych wyćepań a zawarć s uwzglyndńyńym treśći schrůńůnej lo admińistratorůw. Coby przejrzeć lista teroźnych banůw a zawarć, uobezdrzij [[Special:BlockList|IP block list]].",
-       "mergehistory": "Pouůnč historyjo půmjyńań zajtůw",
+       "mergehistory": "Połůncz historyjo půmjyńań zajtůw",
        "mergehistory-header": "Ta zajta dozwolo pouůnčyć historyje půmjyńań jydnyj zajty s inkšům, nowšům zajtům. Dej pozůr, coby sprawjyńy douo ćůnguo historyjo půmjyńań zajty w jeji historyji.",
        "mergehistory-box": "Pouůnč historyjo sprowjyń dwůch zajtůw:",
        "mergehistory-from": "Zajta zdřůduowo:",
        "nolicense": "Ńy wybrano (naškryflej rynčńy!)",
        "license-nopreview": "(Podglůnd ńydostympny)",
        "upload_source_url": " (poprowny, publičńy dostympny URL)",
-       "upload_source_file": " (plik na twojym komputře)",
+       "upload_source_file": "(plik na twojym kůmputrze)",
        "listfiles-summary": "To je ekstra zajta na kery sům pokazywane wšyske pliki wćepane na serwer. Důmyślńy na wiyrchu listy wyśwjetlajům śe pliki wćepane na uostatku. Coby půmjyńić sposůb sortowańo, klikńij na naguůwek kolůmny.",
        "listfiles_search_for": "Šnupej za grafikům uo mjańe:",
        "imgfile": "plik",
        "watchlist-details": "Na pozorliśće {{PLURAL:$1|je 1 artikel|sům $1 artikle|je $1 artikli}} ńy rachujůnc zajtůw godek.",
        "wlheader-enotif": "Wysůuańy powjadůmjyń na adres e-brif je zouůnčůne",
        "wlheader-showupdated": "Zajty, kere bouy sprowjane uod Twoi uostatńi wizyty na ńych zostoy naškryflane '''tuustym'''",
+       "wlnote": "Půńižy pokazano {{PLURAL:$1|ostatńy sprawjyńy dokůnane|ostatńy '''$1''' sprawjyńe dokůnane|ostatńych '''$1''' sprawjyń dokůnanych}} bez {{PLURAL:$2|uostatńo godźina|uostatńich '''$2''' godźin}}.",
        "wlshowlast": "Pokož uostatńy $1 godźin $2 dńi ($3)",
        "watchlist-options": "Uopcyje artikli na kere dowosz pozůr",
        "watching": "Dowom pozor...",
index 512c95a..9698a35 100644 (file)
        "talkpagelinktext": "பேச்சு",
        "specialpage": "சிறப்புப் பக்கம்",
        "personaltools": "தனிப்பட்ட பயன்பாட்டுக் கருவிகள்",
-       "postcomment": "புதிய பகுதி",
        "articlepage": "உள்ளடக்கப் பக்கத்தைப் பார்",
        "talk": "உரையாடல்",
        "views": "பார்வைகள்",
        "externaldberror": "வெளி உறுதிப்படுத்தலில் ஏற்பட்ட தவறு காரணமாக உங்கள் வெளி கணக்கை இற்றைப்படுத்த முடியாது.",
        "login": "புகுபதிகை",
        "nav-login-createaccount": "புகுபதிகை/பயனர் கணக்கு தொடக்கம்",
-       "loginprompt": "{{SITENAME}} தளத்துக்கு புகுபதிகை செய்ய உங்கள் இணைய உலாவியின் ஞாபகிகளை செயற்படுத்த வேண்டும்.",
        "userlogin": "புகுபதிகை/பயனர் கணக்கு தொடக்கம்",
        "userloginnocreate": "புகுபதிகை",
        "logout": "விடுபதிகை",
        "right-deletedtext": " நீக்கப்பட்ட உரை மற்றும் நீக்கப்பட்ட பரிசீலனைகளுக்கு இடையேயான மாற்றங்களை காண்.",
        "right-browsearchive": "நீக்கப்பட்ட பக்கங்களை தேடுக",
        "right-undelete": "பக்கமொன்றை மீட்டெடுக்கவும்",
-       "right-suppressrevision": "நிரà¯\8dவாà®\95ிà®\95ளிà®\9fமிரà¯\81நà¯\8dதà¯\81 à®®à®±à¯\88à®\95à¯\8dà®\95பà¯\8dபà®\9fà¯\8dà®\9f à®¤à®¿à®°à¯\81தà¯\8dதà®\99à¯\8dà®\95ளà¯\88 à®\86யà¯\8dவà¯\81 à®\9aà¯\86யà¯\8dதà¯\81 à®®à¯\80à®\9fà¯\8dà®\9fà¯\86à®\9fà¯\81",
+       "right-suppressrevision": "à®\8eநà¯\8dதவà¯\8aà®°à¯\81 à®ªà®¯à®©à®°à®¿à®\9fமிரà¯\81நà¯\8dதà¯\81à®®à¯\8d à®\95à¯\81றிபà¯\8dபிà®\9fà¯\8dà®\9f à®ªà®\95à¯\8dà®\95தà¯\8d à®¤à®¿à®°à¯\81தà¯\8dதà®\99à¯\8dà®\95ளà¯\88 à®ªà®¾à®°à¯\8dவà¯\88யிà®\9fà¯\81à®\95, à®®à®±à¯\88à®\95à¯\8dà®\95வà¯\81à®®à¯\8d, à®µà¯\86ளிà®\95à¯\8dà®\95ாà®\9fà¯\8dà®\9fவà¯\81à®®à¯\8d",
        "right-suppressionlog": "தனிப்பட்ட பதிவுகளை பார்க்க",
        "right-block": "ஏனைய பயனர்கள் தொகுப்பதை தடுக்கவும்",
        "right-blockemail": "பயனர் மின்னஞ்சல் அனுப்புவதை தடுக்கவும்",
        "nolicense": "தெரிவுச் செய்யப்படவில்லை",
        "license-nopreview": "(முன்தோற்றம் கையிலிருப்பில் இல்லை)",
        "upload_source_url": " (செல்லுபடியான, இணைய முகவரி)",
-       "upload_source_file": " (உங்கள் கணணியில் உள்ள கோப்பு)",
+       "upload_source_file": "(தங்களி்ன் கணினியிலிருந்து தங்களால் தேர்ந்தெடுக்கப்பட்ட கோப்பு)",
        "listfiles-summary": "இச்சிறப்புப் பக்கம் பதிவேற்றப்பட்ட கோப்புகளைப் பட்டியலிடுகிறது.",
        "listfiles_search_for": "பின்வரும் பெயருள்ள ஊடகக் கோப்பைத் தேடு:",
        "imgfile": "கோப்பு",
        "watchlist-details": "பேச்சுப் பக்கங்களைத் தவிர்த்து, {{PLURAL:$1|$1 பக்கம் கவனிக்கப்பட்டது.|$1 பக்கங்கள் கவனிக்கப்பட்டன.}}",
        "wlheader-enotif": "மின்னஞ்சல் அறிவிப்புகள் செயல்படுத்தப்பட்டுள்ளன.",
        "wlheader-showupdated": "உங்கள் கடைசி வருகைக்குப் பின்னர் மாற்றங்கள் செய்யப்பட்ட பக்கங்கள் '''தடித்த எழுத்துக்களில்''' காட்டப்பட்டுள்ளன",
+       "wlnote": "பின்வருவன கடைசி {{PLURAL:$2|மணித்தியாலத்தில்|'''$2''' மணித்தியாலங்களில்}} செய்யப்பட்ட {{PLURAL:$1|கடைசி ஒரு மாற்றமாகும்|கடைசி $1 மாற்றங்களாகும்}}.",
        "wlshowlast": "கடைசி $1 மணித்தியாலங்கள் $2 நாட்களைக் காட்டு $3",
        "watchlist-options": "கவனிப்பு பட்டியலின் விருப்பத் தேர்வுகள்",
        "watching": "கவனிக்கப்படுகிறது...",
        "import-upload": "XML தரவை பதிவேற்று",
        "import-token-mismatch": "உங்கள் அமர்வின் தரவுகள் அழிந்துவிட்டன. அருள்கூர்ந்து மீண்டும் முயல்க.",
        "import-invalid-interwiki": "குறிப்பிட்ட விக்கியில் இருந்து இறக்குமதி செய்யமுடியாது .",
-       "import-error-edit": "பக்கம் \"$1\" ஆனது இறக்குமதி செய்யப்படவில்லை ,ஏனெனில் அதை நீங்கள் திருத்த அனுமதிக்கப்படவில்லை.",
-       "import-error-create": "பக்கம் \"$1\" ஆனது இறக்குமதி செய்யப்படவில்லை ,ஏனெனில் அதை நீங்கள் உருவாக்க  அனுமதிக்கப்படவில்லை.",
+       "import-error-edit": "பக்கம் \"$1\" ஆனது இறக்குமதி செய்யப்படவில்லைஏனெனில் அதை நீங்கள் திருத்த அனுமதிக்கப்படவில்லை.",
+       "import-error-create": "பக்கம் \"$1\" ஆனது இறக்குமதி செய்யப்படவில்லைஏனெனில் அதை நீங்கள் உருவாக்க  அனுமதிக்கப்படவில்லை.",
        "import-error-invalid": "பக்கம் \"$1\" பதிவிறக்கம் செய்யப்படவில்லை, ஏனெனில் அதன் பெயர் செல்லாது.",
        "import-rootpage-invalid": "கொடுக்கப்பட்ட மூலப்பக்கம் செல்லாத தலைப்பாகும்.",
        "importlogpage": "இறக்குமதி பதிகை",
        "duplicate-defaultsort": "'''எச்சரிக்கை:''' இயல்புநிலை வரிசைப்படுத்து விசை ''$2 \" முன்னால் இயல்புநிலை வரிசைப்படுத்து விசை \"$1\" ஐ மீறுகிறது.",
        "version": "பதிப்பு",
        "version-extensions": "நிறுவப்பட்ட நீட்சிகள்",
+       "version-skins": "தோல்கள்",
        "version-specialpages": "சிறப்புப் பக்கங்கள்",
        "version-parserhooks": "இலக்கணப் பாகுபடுத்தி கொக்கிகள்",
        "version-variables": "மாறிகள்",
        "version-antispam": " குப்பை (spam) தடுப்பு",
-       "version-skins": "தோல்கள்",
        "version-other": "பிறர்",
        "version-mediahandlers": "ஊடக கையாளிகள்",
        "version-hooks": "கொக்கிகள்",
index b265193..7858c2a 100644 (file)
        "revdelete-text-text": "รุ่นที่ถูกลบจะยังปรากฏในประวัติหน้า แต่สาธารณะจะไม่สามารถเข้าถึงเนื้อหาบางส่วนได้",
        "revdelete-text-file": "รุ่นที่ถูกลบจะยังปรากฏในประวัติไฟล์ แต่สาธารณะจะไม่สามารถเข้าถึงเนื้อหาบางส่วนได้",
        "logdelete-text": "รายการปูมที่ถูกลบจะยังปรากฏในปูม แต่สาธารณะจะไม่สามารถเข้าถึงเนื้อหาบางส่วนได้",
-       "revdelete-text-others": "à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\84à¸\99อืà¹\88à¸\99à¸\9aà¸\99 {{SITENAME}} à¸\88ะยัà¸\87สามารà¸\96à¹\80à¸\82à¹\89าà¸\96ึà¸\87à¹\80à¸\99ืà¹\89อหาà¸\97ีà¹\88à¸\96ูà¸\81à¸\8bà¹\88อà¸\99 à¹\81ละสามารà¸\96à¸\81ูà¹\89à¸\84ืà¸\99à¹\84à¸\94à¹\89อีà¸\81à¸\9cà¹\88าà¸\99อิà¸\99à¹\80à¸\95อรà¹\8cà¹\80à¸\9fà¸\8bà¹\80à¸\94ียวà¸\81ัà¸\99à¸\99ีà¹\89 à¸¢à¸\81à¹\80วà¹\89à¸\99ตั้งข้อจำกัดเพิ่มเติม",
+       "revdelete-text-others": "à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\84à¸\99อืà¹\88à¸\99à¸\88ะยัà¸\87สามารà¸\96à¹\80à¸\82à¹\89าà¸\96ึà¸\87à¹\80à¸\99ืà¹\89อหาà¸\97ีà¹\88à¸\96ูà¸\81à¸\8bà¹\88อà¸\99 à¹\81ละสามารà¸\96à¸\81ูà¹\89à¸\84ืà¸\99à¹\80à¸\99ืà¹\89อหาà¹\84à¸\94à¹\89 à¸¢à¸\81à¹\80วà¹\89à¸\99มีà¸\81ารตั้งข้อจำกัดเพิ่มเติม",
        "revdelete-confirm": "กรุณายืนยันว่าคุณมีเจตนาลบจริง และเข้าใจผลลัพธ์ และกระทำภายใต้[[{{MediaWiki:Policy-url}}|นโยบาย]]",
        "revdelete-suppress-text": "การระงับควรใช้'''เฉพาะ'''กรณีต่อไปนี้:\n* ข้อมูลที่อาจหมิ่นประมาท\n* ข้อมูลส่วนบุคคลที่ไม่เหมาะสม\n*: ''ที่อยู่บ้านและหมายเลขโทรศัพท์บ้าน, หมายเลขประกันสังคม, ฯลฯ''",
        "revdelete-legend": "ตั้งการจำกัดทัศนวิสัย:",
        "right-deletedtext": "ดูข้อความที่ถูกลบและการเปลี่ยนแปลงระหว่างรุ่นที่ถูกลบ",
        "right-browsearchive": "ค้นหาหน้าที่ถูกลบ",
        "right-undelete": "กู้คืนหน้า",
-       "right-suppressrevision": "à¸\94ูà¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99รุà¹\88à¸\99à¸\97ีà¹\88à¸\8bà¹\88อà¸\99à¸\88าà¸\81à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9a",
+       "right-suppressrevision": "à¸\94ูรุà¹\88à¸\99à¸\95à¹\88าà¸\87 à¹\86 à¸«à¸£à¸·à¸­ à¸\8bà¹\88อà¸\99/à¹\80ลิà¸\81à¸\8bà¹\88อà¸\99รุà¹\88à¸\99à¸\97ีà¹\88à¸\81ำหà¸\99à¸\94à¸\88าà¸\81à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\83à¸\94 à¹\86",
        "right-suppressionlog": "ดูปูมส่วนตัว",
        "right-block": "บล็อกมิให้ผู้ใช้อื่นแก้ไข",
        "right-blockemail": "บล็อกมิให้ผู้ใช้ส่งอีเมล",
        "recentchanges-label-plusminus": "ขนาดของหน้าเปลี่ยนไปด้วยจำนวนไบต์เท่านี้",
        "recentchanges-legend-heading": "'''คำอธิบายสัญลักษณ์:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ดูเพิ่มที่[[Special:NewPages|รายชื่อหน้าใหม่]])",
-       "rcnotefrom": "ด้านล่างเป็นการเปลี่ยนแปลงตั้งแต่ <strong>$2</strong> (มากสุด <strong>$1</strong> รายการ)",
+       "rcnotefrom": "ด้านล่างเป็นการเปลี่ยนแปลงตั้งแต่ <strong>$3, $4</strong> (มากสุด <strong>$1</strong> รายการ)",
        "rclistfrom": "แสดงการเปลี่ยนแปลงใหม่เริ่มตั้งแต่ $3 $2",
        "rcshowhideminor": "$1การแก้ไขเล็กน้อย",
        "rcshowhideminor-show": "แสดง",
        "watchlist-details": "มี $1 หน้าในรายการเฝ้าดูของคุณ ไม่นับแยกหน้าอภิปราย",
        "wlheader-enotif": "การแจ้งเตือนผ่านอีเมลถูกเปิดใช้งาน",
        "wlheader-showupdated": "หน้าที่มีการเปลี่ยนแปลงตั้งแต่คุณเข้าชมล่าสุดแสดงใน'''ตัวหนา'''",
-       "wlnote2": "ด้านล่างเป็นการเปลี่ยนแปลงล่าสุดในช่วง <strong>$1</strong> ชั่วโมงล่าสุด จนถึงวันที่ $2 เวลา $3 น.",
+       "wlnote": "ด้านล่างเป็นการแก้ไข{{PLURAL:$1|ล่าสุด|ล่าสุด '''$1''' รายการ}} ใน{{PLURAL:$2|ชั่วโมง|ช่วง '''$2''' ชั่วโมง}}ที่ผ่านมา จนถึง $3, $4",
        "wlshowlast": "แสดง $1 ชั่วโมง $2 วันล่าสุด $3",
        "watchlist-options": "ตัวเลือกรายการเฝ้าดู",
        "watching": "เฝ้าดู...",
index d8d1b2d..82f0cef 100644 (file)
        "prefs-advancedrendering": "Gelişmiş seçenekler",
        "prefs-advancedsearchoptions": "Gelişmiş seçenekler",
        "prefs-advancedwatchlist": "Gelişmiş seçenekler",
-       "prefs-displayrc": "Görüntü seçenekleri",
+       "prefs-displayrc": "Görüntüleme seçenekleri",
        "prefs-displaywatchlist": "Görüntüleme seçenekleri",
        "prefs-tokenwatchlist": "Anahtar",
        "prefs-diffs": "Farklar",
        "watchlist-details": "Tartışma sayfaları hariç {{PLURAL:$1|$1 sayfa|$1 sayfa}} izleme listenizdedir.",
        "wlheader-enotif": "E-posta bildirimi etkin.",
        "wlheader-showupdated": "Sayfaları son ziyaretinizden beri değişen sayfalar '''kalın''' gösterilmiştir.",
-       "wlnote2": "Aşağıdakiler, son {{PLURAL:$1|bir saat|<strong>$1</strong> saat}} içindeki değişikliklerdir, $2, $3 tarihi itibariyle.",
+       "wlnote": "$3 saat $4 itibariyle son {{PLURAL:$2|bir saatte|'''$2''' saatte}} yapılan {{PLURAL:$1|son değişiklik|son '''$1''' değişiklik}} aşağıdadır.",
        "wlshowlast": "Son $1 saati $2 günü göster $3",
        "watchlist-options": "İzleme listesi seçenekleri",
        "watching": "İzleniyor...",
index b1a48d9..8a3b0ba 100644 (file)
                        "Максим Підліснюк",
                        "Тест",
                        "아라",
-                       "Calak"
+                       "Calak",
+                       "Mykola Swarnyk"
                ]
        },
        "tog-underline": "Підкреслювання посилань:",
        "tog-hideminor": "Приховати незначні редагування у списку останніх змін",
        "tog-hidepatrolled": "Приховувати патрульовані редагування у списку нових редагувань",
        "tog-newpageshidepatrolled": "Приховувати патрульовані сторінки у списку нових сторінок",
-       "tog-extendwatchlist": "Розширений список спостереження, що містить усі зміни, а не лише останню",
-       "tog-usenewrc": "Ð\9dа Ñ\81Ñ\82оÑ\80Ñ\96нкаÑ\85 Ð¾Ñ\81Ñ\82аннÑ\96Ñ\85 Ð·Ð¼Ñ\96ни Ñ\82а Ñ\81пиÑ\81кÑ\83 Ñ\81Ñ\82оÑ\81Ñ\82еÑ\80еженнÑ\8f Ð³Ñ\80Ñ\83пÑ\83ваÑ\82и Ñ\80едагÑ\83вання",
+       "tog-extendwatchlist": "Розгорнути список спостереження, щоб показати всі зміни, а не лише останні",
+       "tog-usenewrc": "Ð\93Ñ\80Ñ\83пÑ\83ваÑ\82и Ñ\80едагÑ\83ваннÑ\8f Ð½Ð° Ñ\81Ñ\82оÑ\80Ñ\96нкаÑ\85 Ð¾Ñ\81Ñ\82аннÑ\96Ñ\85 Ð·Ð¼Ñ\96н Ñ\82а Ñ\81пиÑ\81кÑ\83 Ñ\81поÑ\81Ñ\82еÑ\80еження",
        "tog-numberheadings": "Автоматично нумерувати заголовки",
        "tog-showtoolbar": "Показувати панель інструментів",
-       "tog-editondblclick": "РедагÑ\83ваÑ\82и Ñ\81Ñ\82оÑ\80Ñ\96нки Ð¿Ñ\80и Ð¿Ð¾Ð´Ð²Ñ\96йномÑ\83 ÐºÐ»Ð°Ñ\86аннÑ\96 Ð¼Ð¸Ñ\88коÑ\8e",
-       "tog-editsectiononrightclick": "РедагÑ\83ваÑ\82и Ñ\80оздÑ\96ли Ð¿Ñ\80и ÐºÐ»Ð°Ñ\86аннÑ\96 Ð¿Ñ\80авоÑ\8e ÐºÐ½Ð¾Ð¿ÐºÐ¾Ñ\8e Ð¼Ð¸Ñ\88ки Ð½Ð° Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ðºу",
+       "tog-editondblclick": "Ð\9fеÑ\80ейÑ\82и Ð² Ñ\80ежим Ñ\80едагÑ\83ваннÑ\8f Ñ\81Ñ\82оÑ\80Ñ\96нки Ð¿Ð¾Ð´Ð²Ñ\96йним ÐºÐ»Ð°Ñ\86аннÑ\8fм Ð¼Ð¸Ñ\88ки",
+       "tog-editsectiononrightclick": "Ð\9fеÑ\80ейÑ\82и Ð² Ñ\80ежим Ñ\80едагÑ\83ваннÑ\8f Ñ\80оздÑ\96лÑ\83 ÐºÐ»Ð°Ñ\86аннÑ\8fм Ð¿Ñ\80авоÑ\8e ÐºÐ½Ð¾Ð¿ÐºÐ¾Ñ\8e Ð¼Ð¸Ñ\88ки Ð½Ð° Ð½Ð°Ð·Ð²Ñ\83 Ñ\80оздÑ\96лу",
        "tog-watchcreations": "Додавати створені мною сторінки і завантажені мною файли до мого списку спостереження",
        "tog-watchdefault": "Додавати змінені мною сторінки та файли до мого списку спостереження",
        "tog-watchmoves": "Додавати перейменовані мною сторінки та файли до мого списку спостереження",
        "tog-watchdeletion": "Додавати вилучені мною сторінки та файли до мого списку спостереження",
+       "tog-watchrollback": "Додавати відкочені мною сторінки до мого списку спостереження",
        "tog-minordefault": "Спочатку позначати всі зміни незначними",
        "tog-previewontop": "Показувати попередній перегляд перед вікном редагування, а не після",
        "tog-previewonfirst": "Показувати попередній перегляд під час першого редагування",
        "tog-enotifwatchlistpages": "Повідомляти електронною поштою про зміну сторінки або файлу з мого списку спостереження",
-       "tog-enotifusertalkpages": "Повідомляти електронною поштою про зміну моєї сторінки обговорення",
+       "tog-enotifusertalkpages": "Повідомляти електронною поштою про зміни на моїй сторінці обговорення",
        "tog-enotifminoredits": "Надсилати мені електронного листа навіть при незначних редагуваннях сторінок та файлів",
        "tog-enotifrevealaddr": "Показувати мою поштову адресу в повідомленнях",
        "tog-shownumberswatching": "Показувати число користувачів, які додали сторінку до свого списку спостереження",
        "preview": "Попередній перегляд",
        "showpreview": "Попередній перегляд",
        "showdiff": "Показати зміни",
+       "blankarticle": "<strong>Попередження:</strong> Ви створюєте пусту сторінку.\nЯкщо Ви знову натиснете «{{int:savearticle}}», сторінку буде створено без вмісту.",
        "anoneditwarning": "'''Увага''': Ви не увійшли до системи. Ваша IP-адреса буде записана до історії змін цієї сторінки.",
        "anonpreviewwarning": "''Ви не увійшли в систему. Якщо ви виконаєте збереження, то в історію сторінки буде записана ваша IP-адреса.''",
        "missingsummary": "'''Нагадування''': Ви не дали короткого опису змін.\nНатиснувши кнопку «Зберегти» ще раз, ви збережете зміни без коментаря.",
        "rev-deleted-event": "(запис журналу вилучений)",
        "rev-deleted-user-contribs": "[ім'я користувача або IP-адреса вилучені — редагування приховане у внеску]",
        "rev-deleted-text-permission": "Ця версія сторінки '''вилучена'''.\nМожливо є пояснення в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журналі вилучень].",
+       "rev-suppressed-text-permission": "Цю версію сторінки було <strong>приховано</strong>.\nДетальніше можна подивитися у [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журналі приховування].",
        "rev-deleted-text-unhide": "Ця версія сторінки була '''вилучена'''.\nПодробиці наведені у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журналі вилучень].\nВи все ще можете [$1 переглянути цю версію], якщо забажаєте.",
        "rev-suppressed-text-unhide": "Ця версія сторінки була '''прихована'''.\nПодробиці наведені у [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журналі приховань].\nВи все ще можете [$1 переглянути цю версію], якщо забажаєте.",
        "rev-deleted-text-view": "Ця версія сторінки '''вилучена'''.\nВи можете переглянути її; пояснення дивіться в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журналі вилучень].",
        "revdelete-text-text": "Видалені версії будуть як і раніше видно в історії сторінки, але їх частини вмісту будуть доступні для учасників.",
        "revdelete-text-file": "Видалені версії файлу будуть як і раніше видно в історії сторінки, але їх частини вмісту будуть доступні для учасників.",
        "logdelete-text": "Видалені події в журналі будуть як і раніше видно в журналах, але частини їх вмісту будуть доступні для учасників.",
-       "revdelete-text-others": "Інші адміністратори на {{grammar:genitive|{{SITENAME}}}} як і раніше буде мати можливість доступу до прихованого вмісту і зможуть відновити його знову через цей же інтерфейс, якщо не встановлено додаткові обмеження.",
+       "revdelete-text-others": "Інші адміністратори на як і раніше будуть мати можливість доступу до прихованого вмісту і зможуть відновити його, якщо не встановлено додаткові обмеження.",
        "revdelete-confirm": "Будь ласка, підтвердить, що ви справді бажаєте це здійснити, усвідомлюєте наслідки та робите це згідно з [[{{MediaWiki:Policy-url}}|правилами]].",
        "revdelete-suppress-text": "Приховування може відбуватися '''лише''' в таких випадках:\n* Потенційно наклепницькі відомості\n* Недоречна особиста інформація\n*: ''домашні адреси, номери телефонів, номер паспорта тощо.''",
        "revdelete-legend": "Встановити обмеження видимості",
        "right-deletedtext": "перегляд вилученого тексту та змін між вилученими версіями",
        "right-browsearchive": "Пошук вилучених сторінок",
        "right-undelete": "Відновлення сторінок",
-       "right-suppressrevision": "Перегляд і відновлення версій, прихованих від адміністраторів",
+       "right-suppressrevision": "Перегляд, приховання та відновлення конкретних змін сторінок від будь-якого користувача",
+       "right-viewsuppressed": "Перегляд змін, приховаих від усіх користувачів",
        "right-suppressionlog": "Перегляд приватних журналів",
        "right-block": "Заборона редагувань для інших дописувачів",
        "right-blockemail": "Блокування користувачам надсилання електронної пошти",
        "recentchanges-legend-heading": "'''Легенда:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (див. також [[Special:NewPages|список нових сторінок]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Ð\9dижÑ\87е Ð²Ñ\96добÑ\80аженÑ\96 Ñ\80едагÑ\83ваннÑ\8f Ð· <strong>$2</strong> (до <strong>$1</strong>).",
+       "rcnotefrom": "Ð\9dижÑ\87е Ð·Ð½Ð°Ñ\85одÑ\8fÑ\82Ñ\8cÑ\81Ñ\8f {{PLURAL:$5|Ñ\80едагÑ\83ваннÑ\8f}} Ð· <strong>$3, $4</strong> (вÑ\96добÑ\80ажено до <strong>$1</strong>).",
        "rclistfrom": "Показати редагування починаючи з $3 $2.",
        "rcshowhideminor": "$1 незначні редагування",
        "rcshowhideminor-show": "показати",
        "license": "Ліцензування:",
        "license-header": "Ліцензування",
        "nolicense": "Відсутнє",
+       "licenses-edit": "Редагувати параметри ліцензії",
        "license-nopreview": "(Попередній перегляд недоступний)",
        "upload_source_url": " (вірна, публічно доступна інтернет-адреса)",
        "upload_source_file": " (файл на вашому комп'ютері)",
+       "listfiles-delete": "видалити",
        "listfiles-summary": "Ця спеціальна сторінка показує всі завантажені файли.",
        "listfiles_search_for": "Пошук по назві зображення:",
        "imgfile": "файл",
        "wantedpages-badtitle": "Неправильний заголовок у результатах запиту: $1",
        "wantedfiles": "Необхідні файли",
        "wantedfiletext-cat": "Наступні файли використовують, але вони не існують. У цей список можуть помилково потрапити файли, що знаходяться на зовнішніх сховищах. Такі хибні моменти помічаються <del>перекреслюванням</del>. Крім того, сторінки, що використовують неіснуючі файли, перелічені в [[:$1]].",
+       "wantedfiletext-cat-noforeign": "Наступні файли використовуються, але не існують. Крім того, сторінки, що посилаються на фійли, які не існують, перераховані у [[:$1]].",
        "wantedfiletext-nocat": "Наступні файли використовують, але вони не існують. У цей список можуть помилково потрапити файли, що знаходяться на зовнішніх сховищах. Такі хибні моменти помічаються <del>перекреслюванням</del>.",
+       "wantedfiletext-nocat-noforeign": "Наступні файли використовуються, але не існують.",
        "wantedtemplates": "Необхідні шаблони",
        "mostlinked": "Сторінки, на які найбільше посилань",
        "mostlinkedcategories": "Найбільші категорії",
        "watchlist-details": "У вашому списку спостереження $1 {{PLURAL:$1|сторінка|сторінки|сторінок}} (не враховуючи сторінок обговорення).",
        "wlheader-enotif": "Сповіщення електронною поштою ввімкнено.",
        "wlheader-showupdated": "Сторінки, що змінилися після вашого останнього їх відвідування, виділені '''жирним''' шрифтом.",
-       "wlnote2": "Нижче наведено зміни за {{PLURAL:$1|останню годину|останні <strong>$1</strong> години|останні <strong>$1</strong> годин}} на $2 $3.",
+       "wlnote": "Нижче наведено {{PLURAL:$1|останнє $1 редагування|останні $1 редагування|останні $1 редагувань}} за {{PLURAL:$2|останню|останні|останні}} <strong>$2</strong> {{PLURAL:$2|годину|години|годин}}, на час $3 $4.",
        "wlshowlast": "Показати зміни за останні $1 годин $2 днів $3",
        "watchlist-options": "Налаштування списку спостереження",
        "watching": "Додавання до списку спостереження…",
        "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-error-edit": "Сторінку «$1» не було імпортовано, оскільки Вам не дозволено її редагувати.",
+       "import-error-create": "Сторінку «$1» не було імпортовано, оскільки Вам не дозволено її створювати.",
+       "import-error-interwiki": "Сторінку «$1» не було імпортовано, оскільки її назва зарезервована для зовнішніх посилань (interwiki).",
+       "import-error-special": "Сторінку «$1» не було імпортовано, оскільки вона належить до особливого простору назв, що не дозволяє створення сторінок.",
+       "import-error-invalid": "Сторінку «$1» не було імпортовано, оскільки назва, у яку вона імпортується, неприпустима у цій вікі.",
        "import-error-unserialize": "Версія $2 сторінки «$1» не може бути деструктурованою (десеріалізованою). Отримано повідомлення, що у цій версії використано модель $3 сериалізована як $4.",
        "import-error-bad-location": "Правка $2, що використовує модель вмісту $3, не може бути збережена у «$1» цієї вікі, тому що ця модель не підтримується на цій сторінці.",
        "import-options-wrong": "{{PLURAL:$2|1=Неправильна опція|Неправильні опції}}: <nowiki>$1</nowiki>",
        "importlogpage": "Журнал імпорту",
        "importlogpagetext": "Імпорт адміністраторами сторінок з історією редагувань з інших вікі.",
        "import-logentry-upload": "«[[$1]]» — імпорт з файлу",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|версія|версії|версій}}",
+       "import-logentry-upload-detail": "Імпортовано $1 {{PLURAL:$1|версія|версії|версій}}",
        "import-logentry-interwiki": "«$1» — міжвікі імпорт",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|версія|версії|версій}} з $2",
+       "import-logentry-interwiki-detail": "Імпортовано $1 {{PLURAL:$1|версія|версії|версій}} з $2",
        "javascripttest": "Тестування JavaScript",
        "javascripttest-title": "Працює  $1  випробувань",
        "javascripttest-pagetext-noframework": "Ця сторінка призначений для тестування JavaScript.",
        "autosumm-replace": "Замінено вміст на «$1»",
        "autoredircomment": "Перенаправлено на [[$1]]",
        "autosumm-new": "Створена сторінка: $1",
+       "autosumm-newblank": "Створити порожню сторінку",
        "size-bytes": "$1 байтів",
        "size-kilobytes": "$1 КБ",
        "size-megabytes": "$1 МБ",
        "timezone-utc": "UTC",
        "unknown_extension_tag": "Невідомий тег доповнення «$1»",
        "duplicate-defaultsort": "Увага. Ключ сортування «$2» перекриває попередній ключ сортування «$1».",
+       "duplicate-displaytitle": "<strong>Увага:</strong> Відображений заголовок \"$2\" заміщує раніше відображений заголовок \"$1\".",
        "version": "Версія MediaWiki",
        "version-extensions": "Установлені розширення",
        "version-skins": "Встановлені теми оформлення",
        "version-version": "($1)",
        "version-no-ext-name": "[без назви]",
        "version-svn-revision": "(r$2)",
-       "version-license": "Ліцензія MediaWik",
+       "version-license": "Ліцензія MediaWiki",
        "version-ext-license": "Ліцензія",
        "version-ext-colheader-name": "Розширення",
        "version-skin-colheader-name": "Тема оформлення",
index 63be321..2394e91 100644 (file)
@@ -42,6 +42,7 @@
        "tog-watchdefault": "Tự động theo dõi các trang và tập tin tôi sửa",
        "tog-watchmoves": "Tự động theo dõi các trang và tập tin tôi di chuyển",
        "tog-watchdeletion": "Tự động theo dõi các trang và tập tin tôi xóa",
+       "tog-watchrollback": "Tự động theo dõi các trang tôi lùi sửa",
        "tog-minordefault": "Mặc định đánh dấu tất cả sửa đổi của tôi là sửa đổi nhỏ",
        "tog-previewontop": "Hiển thị phần xem trước nằm trên hộp sửa đổi",
        "tog-previewonfirst": "Hiện xem trước tại ngay khi bắt đầu sửa đổi",
        "preview": "Xem trước",
        "showpreview": "Xem trước",
        "showdiff": "Xem thay đổi",
+       "blankarticle": "<strong>Cảnh báo:</strong> Bạn sẽ tạo ra một trang trống.\nNếu bấm “{{int:savearticle}}” lần nữa, một trang không có nội dung sẽ được tạo ra.",
        "anoneditwarning": "'''Cảnh báo:''' Bạn chưa đăng nhập. Địa chỉ IP của bạn sẽ được ghi lại trong lịch sử sửa đổi của trang.",
        "anonpreviewwarning": "''Bạn chưa đăng nhập. Khi lưu trang này, địa chỉ IP của bạn sẽ được ghi vào lịch sử trang.''",
        "missingsummary": "'''Nhắc nhở:''' Bạn đã không ghi lại tóm lược sửa đổi. Nếu bạn nhấn Lưu trang một lần nữa, sửa đổi của bạn sẽ được lưu mà không có tóm lược.",
        "rev-deleted-event": "(tác vụ nhật trình đã bị xóa)",
        "rev-deleted-user-contribs": "[tên người dùng hay địa chỉ IP bị ẩn – sửa đổi được ẩn khỏi danh sách đóng góp]",
        "rev-deleted-text-permission": "Phiên bản này đã bị '''xóa'''.\nCó thể có thêm chi tiết tại [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} nhật trình xóa].",
+       "rev-suppressed-text-permission": "Phiên bản này đã bị '''ẩn'''.\nCó thêm chi tiết tại [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} nhật trình ẩn].",
        "rev-deleted-text-unhide": "Phiên bản này đã bị '''xóa'''.\nCó thể có thêm chi tiết tại [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} nhật trình xóa].\nBạn vẫn có thể [$1 xem phiên bản này] nếu muốn.",
        "rev-suppressed-text-unhide": "Phiên bản này đã bị '''giấu'''.\nCó thể có thêm chi tiết tại [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} nhật trình giấu].\nBạn vẫn có thể [$1 xem phiên bản này] nếu muốn.",
        "rev-deleted-text-view": "Phiên bản này đã bị '''xóa'''.\nBạn vẫn có thể xem nó; có thể có thêm chi tiết tại [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} nhật trình xóa].",
        "revdelete-text-text": "Các phiên bản đã xóa sẽ tiếp tục xuất hiện trong lịch sử trang, nhưng một số phần của nội dung sẽ bị ẩn khỏi công chúng.",
        "revdelete-text-file": "Các phiên bản tập tin đã xóa sẽ tiếp tục xuất hiện trong lịch sử tập tin, nhưng một số phần của nội dung sẽ bị ẩn khỏi công chúng.",
        "logdelete-text": "Các sự kiện đã xóa sẽ tiếp tục xuất hiện trong nhật trình, nhưng một số phần của nội dung sẽ bị ẩn khỏi công chúng.",
-       "revdelete-text-others": "Các bảo quản viên khác trên {{SITENAME}} sẽ vẫn có quyền truy cập nội dung ẩn và có thể phục hồi nó qua cùng giao diện này, trừ khi có hạn chế bổ sung.",
+       "revdelete-text-others": "Các bảo quản viên khác sẽ vẫn có quyền truy cập nội dung ẩn và phục hồi nó qua cùng giao diện này, trừ khi có hạn chế bổ sung.",
        "revdelete-confirm": "Xin hãy xác nhận rằng bạn có ý định xóa, nhận biết tầm quan trọng của việc này, và việc xóa tuân theo [[{{MediaWiki:Policy-url}}|quy định]].",
        "revdelete-suppress-text": "Việc ẩn giấu '''chỉ''' nên dùng trong các trường hợp sau:\n* Thông tin có thể phỉ báng\n* Thông tin cá nhân không thích hợp\n*: ''địa chỉ nhà và số điện thoại, số chứng minh nhân dân, số an sinh xã hội, v.v.''",
        "revdelete-legend": "Thiết lập hạn chế khả kiến",
        "right-deletedtext": "Xem văn bản đã xóa và các thay đổi giữa phiên bản đã xóa",
        "right-browsearchive": "Tìm kiếm trang đã bị xóa",
        "right-undelete": "Phục hồi trang",
-       "right-suppressrevision": "Xem và phục hồi phiên bản mà bảo quản viên không thấy",
+       "right-suppressrevision": "Xem và hiện/ẩn các phiên bản trang cụ thể đối với mọi người dùng khác",
+       "right-viewsuppressed": "Xem các phiên bản được ẩn mà mọi người khác không thấy được",
        "right-suppressionlog": "Xem nhật trình riêng tư",
        "right-block": "Cấm thành viên khác sửa đổi",
        "right-blockemail": "Cấm người dùng gửi thư điện tử",
        "recentchanges-legend-heading": "'''Chú giải:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (xem thêm [[Special:NewPages|danh sách các trang mới]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Các thay đổi từ <strong>$2</strong> (hiển thị tối đa <strong>$1</strong> thay đổi).",
+       "rcnotefrom": "Dưới đây là {{PLURAL:$5|thay đổi duy nhất|các thay đổi}} từ <strong>$3 $4</strong> (hiển thị tối đa <strong>$1</strong> thay đổi).",
        "rclistfrom": "Xem các thay đổi từ $2 $3 trở về sau",
        "rcshowhideminor": "$1 sửa đổi nhỏ",
        "rcshowhideminor-show": "Hiện",
        "license": "Giấy phép:",
        "license-header": "Giấy phép",
        "nolicense": "chưa chọn",
+       "licenses-edit": "Sửa các giấy phép",
        "license-nopreview": "(Không xem trước được)",
-       "upload_source_url": " (địa chỉ URL đúng, có thể truy cập)",
-       "upload_source_file": " (tập tin trên máy của bạn)",
+       "upload_source_url": "(URL hợp lệ của một tập tin ai có thể truy cập)",
+       "upload_source_file": "(tập tin trên máy của bạn)",
        "listfiles-delete": "xóa",
        "listfiles-summary": "Trang đặc biệt này liệt kê các tập tin được tải lên.",
        "listfiles_search_for": "Tìm kiếm theo tên tập tin:",
        "watchlist-details": "Bạn đang theo dõi {{PLURAL:$1}}$1 trang, không kể riêng các trang thảo luận.",
        "wlheader-enotif": "Đã bật thông báo qua thư điện tử.",
        "wlheader-showupdated": "Các trang đã thay đổi kể từ lần cuối bạn xem chúng được in '''đậm'''",
-       "wlnote2": "Bên dưới có các thay đổi vào <strong>$1</strong> giờ qua, vào lúc $3 $2.",
+       "wlnote": "Dưới đây là {{PLURAL:$1|thay đổi duy nhất|<strong>$1</strong> thay đổi gần nhất}} trong {{PLURAL:$2|giờ|<strong>$2</strong> 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",
        "watching": "Đang theo dõi…",
        "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-error-invalid": "Trang “$1” không được nhập vì ứng với một tên tập tin không hợp lệ trên wiki này.",
        "import-error-unserialize": "Không thể giải tuần tự hóa phiên bản $2 của trang “$1”. Tập tin kết xuất cho rằng phiên bản có mô hình nội dung $3 được tuần tự hóa theo định dạng $4.",
        "import-error-bad-location": "Không thể lưu giữ phiên bản $2 với mô hình nội dung $3 vào “$1” trên wiki này vì trang này không hỗ trợ mô hình đó.",
        "import-options-wrong": "{{PLURAL:$2|Tùy chọn|Các tùy chọn}} có vấn đề: <nowiki>$1</nowiki>",
        "importlogpage": "Nhật trình nhập trang",
        "importlogpagetext": "Đây là danh sách các trang được quản lý nhập vào đây. Các trang này có lịch sử sửa đổi từ hồi ở wiki khác.",
        "import-logentry-upload": "nhập vào [[$1]] bằng cách tải tập tin",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|phiên bản|phiên bản}}",
+       "import-logentry-upload-detail": "Đã nhập $1 phiên bản",
        "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",
+       "import-logentry-interwiki-detail": "Đã nhập $1 phiên bản từ $2",
        "javascripttest": "Kiểm thử JavaScript",
        "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.",
        "autosumm-replace": "Đã thay thế cả nội dung bằng “$1”",
        "autoredircomment": "Đổi hướng đến [[$1]]",
        "autosumm-new": "Tạo trang mới với nội dung “$1”",
+       "autosumm-newblank": "Đã tạo trang trống",
        "size-kilobytes": "$1 kB",
        "bitrate-bits": "$1 bps",
        "bitrate-kilobits": "$1 kbps",
index 62b2328..af52399 100644 (file)
@@ -14,7 +14,8 @@
                        "Mywood",
                        "Cwek",
                        "Duolaimi",
-                       "Impersonator 1"
+                       "Impersonator 1",
+                       "LNDDYL"
                ]
        },
        "tog-underline": "鏈接下橫線:",
        "externaldberror": "迭个作兴是由于验证数据库错误或者侬拨禁止更新侬个外部账号。",
        "login": "登进去",
        "nav-login-createaccount": "登进去 / 建账号",
-       "loginprompt": "必须用缓存(cookies)好登进{{SITENAME}}。",
        "userlogin": "登进去 / 建账号",
        "userloginnocreate": "登录",
        "logout": "登出",
        "filedelete-maintenance-title": "文件刪弗爻",
        "download": "下载",
        "listredirects": "重定向列表",
-       "unusedtemplateswlh": "å\88¥æ¨£鏈接",
+       "unusedtemplateswlh": "å\85¶ä»\96鏈接",
        "randompage": "随便望望",
        "randomincategory": "分類裏個隨便一頁",
        "randomincategory-selectcategory-submit": "去",
index bfb8827..5a8b7e7 100644 (file)
        "preview": "פֿאראויסקוק",
        "showpreview": "ווײַזן פֿאָרױסקוק",
        "showdiff": "ווײַז די ענדערונגען",
+       "blankarticle": "<strong>אזהרה:</strong> דער בלאט איר גייט שאפן איז ליידיק.\nטאמער איר וועט דריקן אויף \"{{int:savearticle}}\" נאכאמאל, וועט דער בלאט ווערן געשאפן אן קיין אינהאלט.",
        "anoneditwarning": "'''ווארענונג:''' איר זענט נישט אריינלאגירט אין אייער קאנטע. אייער איי פי אדרעס וועט ווערן דאקומענטירט אין דעם בלאטס היסטאריע פון ענדערונגען. אויב זארגט איר זיך פאר פריוואטקייטן, ביטע טוט זיך אריינלאגירן.",
        "anonpreviewwarning": "''איר זענט נישט אַרײַנלאגירט. אויפֿהיטן וועט ארײַנשרײַבן אײַער IP אַדרעס אין דער רעדאַקטירונג היסטאריע פונעם בלאַט.''",
        "missingsummary": "'''דערמאנונג:''' איר האט נישט אויסגעפילט דעם קורץ ווארט אויפקלערונג אויף אייער עדיט. אויב וועט איר דרוקן נאכאמאל אויף  \"היט אפ דעם בלאט\", וועט אייער ענדערונג ווערן געהיטן אן דעם.",
        "revdelete-text-text": "אויסגעמעקטע ווערסיעס וועלן נאך דערשיינען אין דער בלאט־היסטאריע, אבער טייל פון זייער אינהאלט וועט נישט זײַן צוגאנגבאר צום עולם.",
        "revdelete-text-file": "אויסגעמעקטע טעקע ווערסיעס וועלן נאך דערשיינען אין דער בלאט־היסטאריע, אבער טייל פון זייער אינהאלט וועט נישט זײַן צוגאנגבאר צום עולם.",
        "logdelete-text": "אויסגעמעקטע לאגביכער־געשעענישן וועלן נאך דערשיינען אינעם לאגבוך, אבער טייל פון זייער אינהאלט וועט נישט זײַן צוגאנגבאר צום עולם.",
-       "revdelete-text-others": "×\90× ×\93ערע ×¡×\99ס×\90פ×\9f ×\91×\99×\99 {{SITENAME}} ×\95×\95×¢×\9c×\9f × ×\90×\9a ×§×¢× ×¢×\9f ×¦×\95ק×\95×\9e×¢×\9f ×¦×\95×\9d ×\91×\90×\94×\90×\9c×\98×¢× ×¢×\9d ×\90×\99× ×\94×\90×\9c×\98 ×\90×\95×\9f ×§×¢× ×¢×\9f ×\90×\99×\9d ×¦×\95ר×\99קש×\98×¢×\9c×\9f ×\93×\95ר×\9b×\9f ×\96×¢×\9c×\91×\9f ×\90×\99×\99×\91ערפ×\9c×\90×\9a, סײַדן ווען מען שטעלט נאך באשרענקונגען.",
+       "revdelete-text-others": "×\90× ×\93ערע ×¡×\99ס×\90פ×\9f ×\95×\95×¢×\9c×\9f × ×\90×\9a ×§×¢× ×¢×\9f ×¦×\95ק×\95×\9e×¢×\9f ×¦×\95×\9d ×\91×\90×\94×\90×\9c×\98×¢× ×¢×\9d ×\90×\99× ×\94×\90×\9c×\98 ×\90×\95×\9f ×§×¢× ×¢×\9f ×\90×\99×\9d ×¦×\95ר×\99קש×\98×¢×\9c×\9f, סײַדן ווען מען שטעלט נאך באשרענקונגען.",
        "revdelete-confirm": "זייט אזוי גוט און באשטעטיקט אז דאס איז טאקע אייער כוונה, אז איר פארשטייט די קאנסעקווענצן, און אז איר טוט דאס לויט  [[{{MediaWiki:Policy-url}}|דער פאליסי]].",
        "revdelete-suppress-text": "אונטערדרוקן זאל בלויז גענוצט ווערן '''נאר''' אין די פאלגנדע פעלער:\n* אינפארמאציע וואס קען זיין מוציא שם רע\n* אויפדעקונג פון פריוואטקייט אינפארמאציע\n*: ''היים אדרעסן, טעלעפאן נומערן, נאציאנאלע אידענטיפיקאציע נומערן, א.א.וו.''",
        "revdelete-legend": "שטעלט ווייזונג באגרענעצונגען",
        "right-deletedtext": "באַקוקן אויסגעמעקטן טעקסט און ענדערונגען צווישן אויסגעמעקטע ווערסיעס",
        "right-browsearchive": "זוכן אויסגעמעקטע בלעטער",
        "right-undelete": "צוריקשטעלן א בלאט",
-       "right-suppressrevision": "קוק-איבער און דריי-צוריק רעוויזיעס באהאלטן פון אדימיניסטראטורן",
+       "right-suppressrevision": "איבערקוקן, באהאלטן און אויפדעקן געוויסע רעוויזיעס פון בלעטער פאר אלע באניצער",
+       "right-viewsuppressed": "באקוקן רעוויזיעס באהאלטן פון אלע באניצער",
        "right-suppressionlog": "זען פריוואַטע לאגביכער",
        "right-block": "בלאקירן אַנדערע באַניצער פֿון רעדאַקטירן",
        "right-blockemail": "בלאקירן א באַניצער פֿון שיקן ע־פאסט",
        "recentchanges-legend-heading": "'''לעגענדע:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (זעט אויך [[Special:NewPages|די רשימה פון נייע בלעטער]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "פֿאלגנד זענען די ענדערונגען זײַט <strong>$2</strong> (ביז <strong>$1</strong>).",
+       "rcnotefrom": "פֿאלגנד {{PLURAL:$5|איז די ענדערונג| זענען די ענדערונגען}} זײַט <strong>$3, $4</strong> (ביז <strong>$1</strong>).",
        "rclistfrom": "װײַזן נײַע ענדערונגען פֿון $3 $2",
        "rcshowhideminor": "$1 מינערדיגע ענדערונגען",
        "rcshowhideminor-show": "ווײַזן",
        "license": "ליצענץ:",
        "license-header": "ליצענץ:",
        "nolicense": "גארנישט",
+       "licenses-edit": "רעדאקטירן ליצענץ אפציעס",
        "license-nopreview": "(פֿאראויסקוק נישט פֿאַראַן)",
-       "upload_source_url": " (א גילטיקע , צוגעגנלעכער URL)",
-       "upload_source_file": "(א טעקע אויף אײַער קאמפיוטער)",
+       "upload_source_url": "(אײַער געקליבענע טעקע פון א גילטיקן, צוגעגנלעכן URL)",
+       "upload_source_file": "(אײַער געקליבענע טעקע פון אײַער קאמפיוטער)",
        "listfiles-delete": "אויסמעקן",
        "listfiles-summary": "דער דאזיקער באזונדערער בלאט ווייזט אלע ארויפגעלאדענע טעקעס.",
        "listfiles_search_for": "זוכן פֿאַר מעדיע נאָמען:",
        "unwatchedpages": "בלעטער וואס זענען נישט אויפגעפאסט",
        "listredirects": "ליסטע פון ווײַטערפֿירונגען",
        "listduplicatedfiles": "ליסטע פון טעקעס מיט דופליקאטן",
+       "listduplicatedfiles-summary": "דאס איז א רשימה פון טעקעס וואו די לעצטיקסטע ווערסיע פון דער טעקע איז א דופליקאט פון דער לעצטיקסטע ווערסיע פון אן אנדער טעקע. נאר לאקאלע טעקעס קומען אין באטראכט.",
        "listduplicatedfiles-entry": "[[:טעקע:$1|$1]] האט [[$3|{{PLURAL:$2|א דופליקאט|$2 דופליקאטן}}]].",
        "unusedtemplates": "נישט באניצטע מוסטערן",
        "unusedtemplatestext": "דער בלאט ווײַזט אלע בלעטער אינעם {{ns:template}} נאמענטייל וואס זענען נישט אײַנגעשלאסן אין אן אנדער בלאט. געדענקט צו באקוקן אנדערע בלעטער פאר לינקען צו די מוסטערן איידער איר מעקט זיי אויס.",
        "wantedpages-badtitle": "אומגילטיקער טיטל אין רעזולטאַט: $1",
        "wantedfiles": "געזוכטע טעקעס",
        "wantedfiletext-cat": "די פֿאלגנדע טעקעס ווערן געניצט אבער זיי עקזיסטירן נישט. טעקעס פון פֿרעמדע רעפאזיטאריעס קענען ווערן אריינגערעכנט טראץ זיי עקזיסטירן יא. אזעלכע גרייזן וועלן ווערן <del>אויסגעשריכן </del>. דערצו, בלעטער וואס ניצן אומעקזיסטירנדע טעקעס ווערן אריינגערעכנט אין [[:$1]].",
+       "wantedfiletext-cat-noforeign": "די פאלגנדע טעקעס ווערן געניצט אבער זענען נישט פאראן. Additionally, pages that embed files that do not exist are listed in [[:$1]].",
        "wantedfiletext-nocat-noforeign": "די פאלגנדע טעקעס ווערן געניצט אבער זענען נישט פאראן.",
        "wantedtemplates": "געזוכטע מוסטערן",
        "mostlinked": "מערסט פֿארבינדענע בלעטער",
        "watchlist-details": "{{PLURAL:$1|$1 בלאט|$1 בלעטער}} אין אייער אויפֿפאסן ליסטע, נישט רעכענען  רעדן בלעטער.",
        "wlheader-enotif": "ע-פאסט מעלדונג ערמעגליכט.",
        "wlheader-showupdated": "בלעטער געענדערט זײַט אײַער לעצטן וויזיט זען געוויזן '''דיק'''.",
-       "wlnote2": "אונטן זענען די ענדערונגען אין די לעצטע  {{PLURAL:$1|שעה|<strong>$1</strong> שעה'ן}}, ביז $2, $3.",
+       "wlnote": "אונטן {{PLURAL:$1|איז די לעצטע ענדערונג|זענען די לעצטע <strong>$1</strong> ענדערונגען}} אין {{PLURAL:$2|דער לעצטער שעה|די לעצטע <strong>$2</strong> שעה'ן}} ביז $3, $4.",
        "wlshowlast": "(ווײַזן די לעצטע $1 שעה'ן | $2 טעג | $3)",
        "watchlist-options": "אויפֿפאַסן ליסטע ברירות",
        "watching": "אויפפאסענדונג…",
        "imageinvalidfilename": "דער ציל טעקע נאָמען איז נישט גילטיק.",
        "fix-double-redirects": "דערהײַנטיקן ווײַטערפֿירונגען צום ארגינעלן טיטל",
        "move-leave-redirect": "איבערלאזן א ווײַטערפֿירונג",
+       "protectedpagemovewarning": "'''ווארענונג:  דער בלאט איז געווארן געשיצט אז בלויז באניצערס מיט סיסאפ פריווילעגיעס קענען אים באוועגן.'''\nדי פארגאנגענע לאגבוך באשרײַבונג ווערט געוויזן דא:",
+       "semiprotectedpagemovewarning": "'''באמערקונג:''' דער דאזיגער בלאַט איז געשיצט אז בלויז איינגעשריבענע באניצערס קענען אים באוועגן.\nדי פֿאַרגאַנגענע לאגבוך באשרײַבונג ווערט געוויזן דאָ:",
        "move-over-sharedrepo": "== טעקע עקזיסטירט ==\n[[:$1]] עקזיסטירט אויף א געטיילטן רעפאזיטאריום. ווען מען באוועגט א טעקע צו דעם טיטל וועט דאס איבערשרייבן די געטיילטע טעקע.",
        "file-exists-sharedrepo": "ס'איז שוין פאראן א טעקע מיטן געקליבענעם נאמען אויף א געמיינזאם רעפאזיטאריום.\nזייט אזוי גוט קלייבט אן אנדער נאמען.",
        "export": "עקספארטירן בלעטער",
        "import-token-mismatch": "אָנווער פון סעסיע דאַטן.\n ביטע פרובירט נאכאמאל.",
        "import-invalid-interwiki": "נישט מעגלעך צו אימפארטירן פון ספעציפֿירטער וויקי.",
        "import-error-edit": "דעם בלאט \"$1\" קען מען נישט אימפארטירן ווייל איר האט נישט די רעכט אים צו רעדאקטירן.",
-       "import-error-create": "×\93×¢×\9d  ×\91×\9c×\90×\98 \"$1\" ×§×¢×\9f ×\9e×¢×\9f × ×\99ש×\98 ×\90×\99×\9eפ×\90ר×\98×\99ר×\9f ווייל איר האט נישט די רעכט צו שאפן אים.",
-       "import-error-interwiki": "×\93×¢×\9d ×\91×\9c×\90×\98 \"$1\"  ×§×¢×\9f ×\9e×¢×\9f × ×\99ש×\98 ×\90×\99×\9eפ×\90ר×\98×\99ר×\9f ×\95×\95×\99×\99ל זיין נאמען איז רעזערווירט פאר דרויסנדיקער פארבינדונג (אינטערוויקי).",
-       "import-error-special": "×\93×¢×\9d ×\91×\9c×\90×\98 \"$1\" ×§×¢×\9f ×\9e×¢×\9f × ×\99ש×\98 ×\90×\99×\9eפ×\90ר×\98×\99ר×\9f ווייל ער געהערט צו א באזונדערן נאמענטייל וואס אנטהאלט נישט קיין בלעטער.",
-       "import-error-invalid": "×\93×¢×\9d ×\91×\9c×\90×\98 \"$1\" ×§×¢×\9f ×\9e×¢×\9f × ×\99ש×\98 ×\90×\99×\9eפ×\90ר×\98×\99ר×\9f ×\95×\95×\99×\99×\9c ×\96×\99×\99×\9f × ×\90×\9e×¢×\9f ×\90×\99×\96 ×\90×\95×\9e×\92×\99×\9c×\98×\99ק.",
+       "import-error-create": "×\93×¢×\9d  ×\91×\9c×\90×\98 \"$1\" ×\94×\90×\98 ×\9e×¢×\9f × ×\99ש×\98 ×\90×\99×\9eפ×\90ר×\98×\99ר×\98 ווייל איר האט נישט די רעכט צו שאפן אים.",
+       "import-error-interwiki": "×\93×¢×\9d ×\91×\9c×\90×\98 \"$1\"  ×\94×\90×\98 ×\9e×¢×\9f × ×\99ש×\98 ×\90×\99×\9eפ×\90ר×\98×\99ר×\98 ×\95×\95ײַל זיין נאמען איז רעזערווירט פאר דרויסנדיקער פארבינדונג (אינטערוויקי).",
+       "import-error-special": "×\93×¢×\9d ×\91×\9c×\90×\98 \"$1\" ×\94×\90×\98 ×\9e×¢×\9f × ×\99ש×\98 ×\90×\99×\9eפ×\90ר×\98×\99ר×\98 ווייל ער געהערט צו א באזונדערן נאמענטייל וואס אנטהאלט נישט קיין בלעטער.",
+       "import-error-invalid": "×\93×¢×\9d ×\91×\9c×\90×\98 \"$1\" ×\94×\90×\98 ×\9e×¢×\9f × ×\99ש×\98 ×\90×\99×\9eפ×\90ר×\98×\99ר×\98 ×\95×\95ײַ×\9c ×\93ער × ×\90×\9e×¢×\9f ×¦×\95 ×\95×\95×\90ס ×¢×¨ ×\95×\95×\90×\9c×\98 ×\95×\95ער×\9f ×\90×\99×\9eפ×\90ר×\98×\99ר×\98 ×\90×\99×\96 ×\90×\95×\9e×\92×\99×\9c×\98×\99ק ×\90×\95×\99×£ ×\93ער ×\95×\95×\99ק×\99.",
        "import-options-wrong": "{{PLURAL:$2|פאלשער אויסקלייב|פאלשע אויסקלייבן}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "געגעבענער שטאמבלאט איז אן אומגילטיקער טיטל.",
        "import-rootpage-nosubpage": "נאמענטייל \"$1\" פונעם שטאמבלאט ערלויבט נישט קיין אונטערבלעטער.",
        "importlogpage": "אימפארט לאגבוך",
        "importlogpagetext": "אַדמיניסטראַטיווער אימפארט פון בלעטער מיט רעדאַגירן היסטאריע פֿון ​​אַנדערע וויקיס.",
        "import-logentry-upload": "האט אימפארטירט [[$1]] דורך טעקע אַרויפֿלאָדן",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}} אימפארטירט",
        "import-logentry-interwiki": "אריבערגעוויקיט $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}} פֿון $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|רע×\95×\95×\99×\96×\99×¢|רע×\95×\95×\99×\96×\99עס}} ×\90×\99×\9eפ×\90ר×\98×\99ר×\98 ×¤Ö¿×\95×\9f $2",
        "javascripttest": "JavaScript טעסט",
        "javascripttest-title": "דורכפירנדיק $1 בדיקות",
        "javascripttest-pagetext-noframework": " דער בלאט איז רעזערווירט פאר JavaScript. פרואוון.",
        "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-archive": "ס'איז שוין געווען {{PLURAL:$1| [$2 אַן אַנדער טעקע] | [$1 עטלעכע אַנדערע טעקעס]}} אויף דעם פּלאַץ מיט דעם זעלביקן תוכן, אָבער {{PLURAL:$1| עס איז | זיי זענען}}  געווארן אויסגעמעקט.",
+       "api-error-duplicate-archive-popup-title": "פֿאַרטאפלטע {{PLURAL:$1| טעקע וואָס איז| טעקעס וואָס זענען}}  שוין געווארן אויסגעמעקט",
        "api-error-duplicate-popup-title": "פֿאַרטאפלטע {{PLURAL:$1| טעקע | טעקעס}}",
        "api-error-empty-file": "די טעקע וואָס איר האט אײַנגעגעבן איז ליידיג.",
        "api-error-emptypage": "שאפן נייע ליידיקע בלעטער איז נישט ערלויבט.",
index a20b6c3..1bb63c5 100644 (file)
@@ -94,6 +94,7 @@
        "tog-watchdefault": "添加我编辑的页面和文件至我的监视列表",
        "tog-watchmoves": "添加我移动的页面和文件至我的监视列表",
        "tog-watchdeletion": "添加我删除的页面和文件至我的监视列表",
+       "tog-watchrollback": "当我对我的监视列表执行回退时加入页面",
        "tog-minordefault": "默认标记所有编辑为小编辑",
        "tog-previewontop": "将预览显示在编辑框上方",
        "tog-previewonfirst": "首次编辑时显示预览",
        "preview": "预览",
        "showpreview": "显示预览",
        "showdiff": "显示更改",
+       "blankarticle": "<strong>警告</strong>:您创建的页面是空白的。如果您再次点击“{{int:savearticle}}”,您将真的创建没有任何内容的页面。",
        "anoneditwarning": "<strong>警告:</strong>您没有登录。您的IP地址将被记录在该页面的编辑历史中。",
        "anonpreviewwarning": "''你没有登录。保存会记录你的IP地址于该页面的编辑历史中。''",
        "missingsummary": "'''提示:'''你没有提供编辑摘要。如果你再次点击“{{int:savearticle}}”,你的编辑将不带编辑摘要保存。",
        "summary-preview": "摘要预览:",
        "subject-preview": "标题预览:",
        "blockedtitle": "用户被封禁",
-       "blockedtext": "'''你的用户名或IP地址已被封禁。'''\n\n执行封禁的管理员是$1。封禁原因是''$2''。\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n你可以联系$1或其他[[{{MediaWiki:Grouppage-sysop}}|管理员]]讨论该封禁。只有当你在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“电邮联系”功能时,才可以使用它。你当前的IP地址是$3,该封禁ID是#$5。请在你的询问中包含上面的所有信息。",
+       "blockedtext": "<strong>你的用户名或IP地址已被封禁。</strong>\n\n执行封禁的管理员是$1。封禁原因是<em>$2</em>。\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n你可以联系$1或其他[[{{MediaWiki:Grouppage-sysop}}|管理员]]讨论该封禁。只有当你在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“电邮联系”功能时,才可以使用它。你当前的IP地址是$3,该封禁ID是#$5。请在你的询问中包含上面的所有信息。",
        "autoblockedtext": "您的IP地址因曾被一位被$1封禁的用户使用而被自动封禁。封禁原因:\n\n:<em>$2</em>\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n您可以联系$1或其他[[{{MediaWiki:Grouppage-sysop}}|管理员]]申诉该封禁。\n\n请注意,只有当您已在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“电邮联系”功能时,才能发送电子邮件联系管理员。\n\n您当前的IP地址为$3,该封禁ID为#$5。\n请您在申诉内容中说明以上所有信息。",
        "blockednoreason": "未给出原因",
        "whitelistedittext": "您必须先$1才可编辑页面。",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "expensive-parserfunction-warning": "<strong>警告:</strong>这个页面有太多高昂的语法功能调用。\n\n它应该少过$2次呼叫,现在有$1次呼叫。",
-       "expensive-parserfunction-category": "有过多高开销解析器函数调用的页面",
+       "expensive-parserfunction-category": "页面中有太多耗费的语法功能呼叫",
        "post-expand-template-inclusion-warning": "'''警告:'''包含模板大小过大。\n一些模板将不会包含。",
-       "post-expand-template-inclusion-category": "模板包含大小超限的页面",
+       "post-expand-template-inclusion-category": "模板包含上限已经超过的页面",
        "post-expand-template-argument-warning": "'''警告:'''本页面包含至少一个模板参数有过大扩展大小。这些参数会被略过。",
        "post-expand-template-argument-category": "含有略过模板参数的页面",
        "parser-template-loop-warning": "检查到模板循环:[[$1]]",
        "parser-template-recursion-depth-warning": "模板递归深度越限($1)",
        "language-converter-depth-warning": "字词转换器深度越限($1)",
-       "node-count-exceeded-category": "节点数超限的页面",
+       "node-count-exceeded-category": "页面的节点数超出限制",
        "node-count-exceeded-category-desc": "节点数溢出页面的分类。",
        "node-count-exceeded-warning": "页面超出了节点数",
-       "expansion-depth-exceeded-category": "展开深度超限的页面",
+       "expansion-depth-exceeded-category": "扩展深度超出限制的页面",
        "expansion-depth-exceeded-category-desc": "这是超出拓展深度页面的分类。",
        "expansion-depth-exceeded-warning": "页面超过了扩展深度",
        "parser-unstrip-loop-warning": "检测到回圈",
        "rev-deleted-event": "(日志操作被删除)",
        "rev-deleted-user-contribs": "[用户名或IP地址被删除 - 编辑在贡献中隐藏]",
        "rev-deleted-text-permission": "本页面版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
+       "rev-suppressed-text-permission": "此页面修订已经被<strong>监督隐藏</strong>。详细信息可在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中找到。",
        "rev-deleted-text-unhide": "本页面版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。如果你想继续操作,你仍然可以[$1 查看本版本]。",
        "rev-suppressed-text-unhide": "该页面版本已经被'''监督隐藏'''。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。如果您想继续的话,您可以仍然[$1 去查看这次版本]。",
        "rev-deleted-text-view": "本页面版本已被'''删除'''。你可以查看它,详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
        "revdelete-text-text": "已删除版本仍将在页面历史中显示,但涉及部分的内容将对公众不可见。",
        "revdelete-text-file": "已删除文件版本仍将在文件历史中显示,但涉及部分的内容将对公众不可见。",
        "logdelete-text": "已删除日志事件仍将在日志中显示,但涉及部分的内容将对公众不可见。",
-       "revdelete-text-others": "å\9c¨{{SITENAME}}ç\9a\84å\85¶ä»\96管ç\90\86å\91\98ä»\8då°\86å\8f¯ä»¥è®¿é\97®é\9a\90è\97\8få\86\85容ï¼\8c并å\9c¨ä¸\80å®\9aæ\9d¡ä»¶ä¸\8bè\83½å¤\9fé\80\9aè¿\87ç\9b¸å\90\8cç\95\8cé\9d¢å\8f\96æ¶\88å\88 é\99¤,除非附加条件被设定。",
+       "revdelete-text-others": "å\85¶ä»\96管ç\90\86å\91\98ä»\8då°\86å\8f¯ä»¥è®¿é\97®é\9a\90è\97\8få\86\85容并å\88 é\99¤å®\83,除非附加条件被设定。",
        "revdelete-confirm": "请确认该操作,明白其后果,并确保该操作符合[[{{MediaWiki:Policy-url}}|方针]]。",
        "revdelete-suppress-text": "阻止应'''仅'''用于以下情况:\n* 潜在的诽谤信息\n* 不合适的个人信息\n*: ''家庭地址、电话号码和社保号码等。''",
        "revdelete-legend": "设置可见性之限制",
        "group-bot": "机器人",
        "group-sysop": "管理员",
        "group-bureaucrat": "行政员",
-       "group-suppress": "监督",
+       "group-suppress": "监督",
        "group-all": "(所有)",
        "group-user-member": "{{GENDER:$1|用户}}",
        "group-autoconfirmed-member": "自动确认用户",
        "group-bot-member": "机器人",
        "group-sysop-member": "{{GENDER:$1|管理员}}",
        "group-bureaucrat-member": "行政员",
-       "group-suppress-member": "监督员",
+       "group-suppress-member": "{{GENDER:$1|监督员}}",
        "grouppage-user": "{{ns:project}}:用户",
        "grouppage-autoconfirmed": "{{ns:project}}:自动确认用户",
        "grouppage-bot": "{{ns:project}}:机器人",
        "grouppage-sysop": "{{ns:project}}:管理员",
        "grouppage-bureaucrat": "{{ns:project}}:行政员",
-       "grouppage-suppress": "{{ns:project}}:监督",
+       "grouppage-suppress": "{{ns:project}}:监督",
        "right-read": "阅读页面",
        "right-edit": "编辑页面",
        "right-createpage": "创建非讨论页面",
        "right-deletedtext": "查看已被删除的文本及已删除版本间的差异",
        "right-browsearchive": "搜索已被删除的页面",
        "right-undelete": "还原页面",
-       "right-suppressrevision": "复核并还原对管理员隐藏的版本",
+       "right-suppressrevision": "查看、隐藏与取消隐藏任何用户对页面做出的特定版本",
+       "right-viewsuppressed": "查看被隐藏的任何用户的修订",
        "right-suppressionlog": "查看非公开日志",
        "right-block": "阻止其他用户编辑",
        "right-blockemail": "阻止用户发送电子邮件",
        "recentchanges-legend-heading": "'''说明:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}(见[[Special:NewPages|新页面列表]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "下面是<strong>$2</strong>之后的更改(最多显示<strong>$1</strong>个)。",
+       "rcnotefrom": "下面{{PLURAL:$5|是}}<strong>$3 $4</strong>之后的更改(最多显示<strong>$1</strong>个)。",
        "rclistfrom": "显示$3 $2之后的新更改",
        "rcshowhideminor": "$1小编辑",
        "rcshowhideminor-show": "显示",
        "nolicense": "未选定",
        "licenses-edit": "编辑许可选项",
        "license-nopreview": "(无预览可用)",
-       "upload_source_url": "ï¼\88æ\9c\89æ\95\88ã\80\81å\8f¯ä»¥å\85¬å¼\80访é\97®ç\9a\84URL)",
-       "upload_source_file": "ï¼\88æ\82¨è®¡ç®\97æ\9cºä¸\8aç\9a\84ä¸\80个文件)",
+       "upload_source_url": "ï¼\88æ\82¨é\80\89æ\8b©ç\9a\84æ\9d¥è\87ªæ\9c\89æ\95\88ã\80\81å\8f¯ä»¥å\85¬å¼\80访é\97®ç\9a\84URLç\9a\84æ\96\87件)",
+       "upload_source_file": "ï¼\88æ\9d¥è\87ªæ\82¨è®¡ç®\97æ\9cºä¸\8aæ\82¨é\80\89æ\8b©ç\9a\84文件)",
        "listfiles-delete": "删除",
        "listfiles-summary": "本特殊页面展示所有上传的文件。",
        "listfiles_search_for": "按媒体名称搜索:",
        "watchlist-details": "不计讨论页,您的监视列表中有$1个页面。",
        "wlheader-enotif": "已启用电子邮件通知。",
        "wlheader-showupdated": "您上次访问后发生更改的页面'''加粗'''显示",
-       "wlnote2": "下面是最近{{PLURAL:$1|<strong>$1</strong>小时}}的更改,截至$2 $3。",
+       "wlnote": "下面是{{PLURAL:$2|过去<strong>$2</strong>小时}}的{{PLURAL:$1|最后<strong>$1</strong>个更改}},截至$3 $4。",
        "wlshowlast": "显示过去$1小时$2天$3",
        "watchlist-options": "监视列表选项",
        "watching": "正在监视...",
        "import-upload": "上传XML数据",
        "import-token-mismatch": "会话数据遗失。请重试。",
        "import-invalid-interwiki": "不能从指定的wiki导入。",
-       "import-error-edit": "\"$1\"页面不导入,因为您不准对其进行编辑。",
-       "import-error-create": "\"$1\"页面不导入,因为您不准创建它。",
-       "import-error-interwiki": "页面“$1”未能导入,因为它的名称需要使用外部跨wiki链接。",
-       "import-error-special": "页面“$1”未导入,因为它需要使用一个不能创建页面的特殊名字空间。",
-       "import-error-invalid": "页面“$1”未能导入,因为它的名字无效。",
+       "import-error-edit": "页面“$1”未导入,因为您不被允许编辑它。",
+       "import-error-create": "页面“$1”未导入,因为您不被允许创建它。",
+       "import-error-interwiki": "页面“$1”未导入,因为它的名字被外部链接(跨wiki链接)保留。",
+       "import-error-special": "页面“$1”未导入,因为它属于不允许页面编辑的特殊名字空间。",
+       "import-error-invalid": "页面“$1”未导入,因为在此wiki导入的名字无效。",
        "import-error-unserialize": "页面“$1”的版本$2无法反序列化。此版本使用内容模型$3序列化为$4。",
        "import-error-bad-location": "在此wiki使用了内容模式$3的版本$2不能被保存至“$1”,这是因为此模式在此页面不被支持。",
        "import-options-wrong": "{{PLURAL:$2|选项}}出错:<nowiki>$1</nowiki>",
        "importlogpage": "导入日志",
        "importlogpagetext": "管理性导入在其他wiki上有编辑历史的页面。",
        "import-logentry-upload": "通过文件上传导入[[$1]]",
-       "import-logentry-upload-detail": "$1个版本",
+       "import-logentry-upload-detail": "已导入$1个{{PLURAL:$1|版本}}",
        "import-logentry-interwiki": "跨wiki$1",
-       "import-logentry-interwiki-detail": "来自$2的$1个{{PLURAL:$1|版本}}",
+       "import-logentry-interwiki-detail": "已从$2导入$1个{{PLURAL:$1|版本}}",
        "javascripttest": "JavaScript测试",
        "javascripttest-title": "运行$1测试",
        "javascripttest-pagetext-noframework": "本页面被保留进行JavaScript测试。",
        "print.css": "/* 放置于这里的CSS将影响打印输出 */",
        "noscript.css": "/* 放置于这里的CSS将影响停用JavaScript的用户 */",
        "group-autoconfirmed.css": "/* 放置于这里的CSS将只影响自动确认用户 */",
+       "group-user.css": "/* 放置于此的CSS将只会影响注册用户 */",
        "group-bot.css": "/* 放置于这里的CSS将只影响机器人 */",
        "group-sysop.css": "/* 放置于这里的CSS将只影响管理员 */",
        "group-bureaucrat.css": "/* 放置于这里的CSS将只影响机行政员 */",
        "common.js": "/* 这里的任何JavaScript将为所有用户在每次页面载入时加载。 */",
        "group-autoconfirmed.js": "/* 这里的任何JavaScript将只为自动确认用户加载 */",
+       "group-user.js": "/* 放置于此的JavaScript将只为注册用户加载 */",
        "group-bot.js": "/* 这里的任何JavaScript将只为机器人加载 */",
        "group-sysop.js": "/* 这里的任何JavaScript将只为管理员加载 */",
        "group-bureaucrat.js": "/* 这里的任何JavaScript将只为行政员加载 */",
        "autosumm-replace": "以“$1”替换内容",
        "autoredircomment": "重定向页面至[[$1]]",
        "autosumm-new": "创建页面,内容为“$1”",
+       "autosumm-newblank": "创建空白页面",
        "size-bytes": "$1字节",
        "lag-warn-normal": "过去$1秒内的更改未必会在这个列表中显示。",
        "lag-warn-high": "由于数据库的过度延迟,过去$1秒的更改未必会在这个列表中显示。",
index 591f047..34c2786 100644 (file)
@@ -72,6 +72,7 @@
        "tog-watchdefault": "將我編輯的頁面和檔案新增至監視清單",
        "tog-watchmoves": "將我移動的頁面和檔案加入監視清單",
        "tog-watchdeletion": "將我刪除的頁面和檔案新增至監視清單",
+       "tog-watchrollback": "將我曾經還原的頁面新增至監視清單",
        "tog-minordefault": "預設標記所有的編輯為小修訂",
        "tog-previewontop": "顯示預覽於編輯框上方",
        "tog-previewonfirst": "第一次編輯時顯示預覽",
        "createacct-emailoptional": "電子郵件位址 (選填)",
        "createacct-email-ph": "輸入您的電子郵件位址",
        "createacct-another-email-ph": "輸入電子郵件位址",
-       "createaccountmail": "使ç\94¨è\87¨æ\99\82ç\9a\84é\9a¨æ©\9få¯\86碼ï¼\8c並å°\87å®\83å¯\84å\88°æ\8c\87å®\9aç\9a\84é\9b»å­\90é\83µä»¶å\9c°址",
+       "createaccountmail": "使ç\94¨è\87¨æ\99\82ç\9a\84é\9a¨æ©\9få¯\86碼ï¼\8c並å°\87å®\83å\82³é\80\81å\88°æ\8c\87å®\9aç\9a\84é\9b»å­\90é\83µä»¶ä½\8d址",
        "createacct-realname": "真實姓名 (選填)",
        "createaccountreason": "原因:",
        "createacct-reason": "原因",
        "passwordremindertext": "不明人士 (可能是您自己,來自 IP 位址 $1) 要求重設在 {{SITENAME}} ($4) 的密碼。\n給使用者 \"$2\" 的臨時密碼設為 \"$3\"。\n如果這個動作是您做的,您需要立即登入並設定一個新的密碼,\n您的臨時密碼將於{{PLURAL:$5|一|$5}}天內過期。\n\n如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
        "noemail": "使用者 \"$1\" 未登記電子郵件位址。",
        "noemailcreate": "您需要提供一個有效的電子郵件位址。",
-       "passwordsent": "使用者 \"$1\" 的新密碼已寄至當出登記的電子郵件址,\n請稍後收到信件後再登入。",
+       "passwordsent": "使用者 \"$1\" 的新密碼已寄至當出登記的電子郵件址,\n請稍後收到信件後再登入。",
        "blocked-mailpassword": "您的 IP 位址已被封鎖不允許編輯,密碼復原的功能也同樣被禁止使用以防止被濫用。",
        "eauthentsent": "已寄出一封確認信到您所設定的電子郵件位址。\n在未收到其它電子郵件前,您必須先依照信件中的指示,確認這個帳號確實是您本人。",
        "throttled-mailpassword": "密碼重設的電子郵件已經在最近 $1 小時內寄出。\n為防止濫用,$1 小時內只能寄出一次密碼重設信件。",
-       "mailerror": "å¯\84å\87º電子郵件錯誤:$1",
+       "mailerror": "å\82³é\80\81電子郵件錯誤:$1",
        "acct_creation_throttle_hit": "使用您目前的 IP 位址的訪客在最近一天建立了 {{PLURAL:$1|1 個帳號|$1 個帳號}},已超出系統允許的上限。\n因此,目前無法讓使用此 IP 位址的訪客建立帳號。",
        "emailauthenticated": "您的電子郵件位址已確認於 $2 的 $3。",
-       "emailnotauthenticated": "您的電子郵件址尚未確認,\n尚不會寄出以下功能的電子郵件給您。",
-       "noemailprefs": "在您的偏好設定中設定電子郵件址,讓您可以使用這些功能。",
+       "emailnotauthenticated": "您的電子郵件址尚未確認,\n尚不會寄出以下功能的電子郵件給您。",
+       "noemailprefs": "在您的偏好設定中設定電子郵件址,讓您可以使用這些功能。",
        "emailconfirmlink": "確認您的電子郵件位址",
-       "invalidemailaddress": "無法接受格式不正確的電子郵件地址,\n請輸入正確的電子郵件地址格式或略過填寫該欄位。",
+       "invalidemailaddress": "無法接受格式不正確的電子郵件位址,\n請輸入正確的電子郵件位址格式或略過填寫該欄位。",
        "cannotchangeemail": "此 Wiki 不允許更改帳號的電子郵件位址。",
-       "emaildisabled": "此網ç«\99ä¸\8dè\83½å¯\84å\87º電子郵件。",
+       "emaildisabled": "此網ç«\99ä¸\8dè\83½å\82³é\80\81電子郵件。",
        "accountcreated": "已建立帳號",
        "accountcreatedtext": "使用者帳號 [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|對話]]) 已建立。",
        "createaccount-title": "{{SITENAME}} 的帳號建立",
        "pt-createaccount": "建立帳號",
        "pt-userlogout": "登出",
        "php-mail-error-unknown": "PHP 的 mail() 函數發生不明錯誤。",
-       "user-mail-no-addy": "試å\9c\96å¯\84å\87º沒有電子郵件位址的信件。",
+       "user-mail-no-addy": "試å\9c\96å\82³é\80\81沒有電子郵件位址的信件。",
        "user-mail-no-body": "試圖寄出一個空的或異常簡短的電子郵件。",
        "changepassword": "變更密碼",
        "resetpass_announce": "要完成登入,您必須設定一個新密碼。",
        "preview": "預覽",
        "showpreview": "顯示預覽",
        "showdiff": "顯示變更",
+       "blankarticle": "<strong>警告:</strong>您正在建立的頁面是空白的。\n如果您再按一下\"{{int:savearticle}}\",將建立沒有任何內容的頁面。",
        "anoneditwarning": "<strong>警告:</strong>您尚未登入。\n您的 IP 位址將記錄在此頁的編輯歷史中。",
        "anonpreviewwarning": "<em>您尚未登入。儲存頁面會將您的 IP 位址記錄在此頁面的編輯歷史中。</em>",
        "missingsummary": "<strong>提醒:</strong>您未填寫編輯摘要。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過摘要直接儲存您的編輯。",
        "summary-preview": "摘要預覽:",
        "subject-preview": "主旨/標題預覽:",
        "blockedtitle": "使用者已被封鎖",
-       "blockedtext": "<strong>您的使用者名稱或 IP 位址以被封鎖。</strong>\n\n您被 $1 封鎖,\n原因爲 <em>$2</em>。\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯繫 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件址,且尚未被封鎖郵件功能,則您可透過 \"傳送電子郵件給這位使用者\" 的功能來聯絡相關管理員。\n您目刖的 IP 位址是 $3,此次封鎖的 ID 爲 #$5。\n請您在詢問時附註以上詳細訊息。",
-       "autoblockedtext": "因先前的另一位使用者被 $1 封鎖,您的 IP 位址已被自動封鎖。\n原因是:\n\n:<em>$2</em>\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯繫 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件址,且尚未被封鎖郵件功能,則您可透過 \"傳送電子郵件給這位使用者\" 的功能來聯絡相關管理員。\n您目刖的 IP 位址是 $3,此次封鎖的 ID 爲 #$5。\n請您在詢問時附註以上詳細訊息。",
+       "blockedtext": "<strong>您的使用者名稱或 IP 位址以被封鎖。</strong>\n\n您被 $1 封鎖,\n原因爲 <em>$2</em>。\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯繫 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件址,且尚未被封鎖郵件功能,則您可透過 \"傳送電子郵件給這位使用者\" 的功能來聯絡相關管理員。\n您目刖的 IP 位址是 $3,此次封鎖的 ID 爲 #$5。\n請您在詢問時附註以上詳細訊息。",
+       "autoblockedtext": "因先前的另一位使用者被 $1 封鎖,您的 IP 位址已被自動封鎖。\n原因是:\n\n:<em>$2</em>\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯繫 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件址,且尚未被封鎖郵件功能,則您可透過 \"傳送電子郵件給這位使用者\" 的功能來聯絡相關管理員。\n您目刖的 IP 位址是 $3,此次封鎖的 ID 爲 #$5。\n請您在詢問時附註以上詳細訊息。",
        "blockednoreason": "未說明原因",
        "whitelistedittext": "請先 $1 才可編輯頁面。",
        "confirmedittext": "在編輯此頁之前您必須確認您的電子郵件位址。\n請透過 [[Special:Preferences|偏好設定]] 設定並驗證您的電子郵件位址。",
        "rev-deleted-event": "(已移除日誌)",
        "rev-deleted-user-contribs": "[使用者名稱或 IP 位址已移除 - 已隱藏貢獻清單中的編輯]",
        "rev-deleted-text-permission": "此頁面修訂已被 <strong>刪除</strong>。\n可至 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌] 取得詳細資訊。",
+       "rev-suppressed-text-permission": "此頁面修訂已被 <strong>禁止顯示</strong>。\n可至 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 禁止顯示日誌] 取得詳細資訊。",
        "rev-deleted-text-unhide": "此頁面修訂已被 <strong>刪除</strong>。\n可至 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌] 取得詳細資訊。\n若您要繼續,您仍可 [$1 檢視此修訂] 。",
        "rev-suppressed-text-unhide": "此頁面修訂已被 <strong>禁止顯示</strong>。\n可至 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 禁止顯示日誌] 取得詳細資訊。\n若您要繼續,您仍可以 [$1 檢視此修訂]。",
        "rev-deleted-text-view": "此頁面修訂已被 <strong>刪除</strong>。\n您可繼續檢視修訂,可至 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌] 取得詳細資訊。",
        "revdelete-text-text": "已刪除的修訂仍會出現於頁面歷史中,但內容將不開放存取。",
        "revdelete-text-file": "已刪除的檔案版本仍會出現於檔案歷史中,但內容將不開放存取。",
        "logdelete-text": "已刪除的日誌活動仍會出現於日誌中,但內容將不開放存取。",
-       "revdelete-text-others": "å\9c¨ {{SITENAME}} ä¸\8aç\9a\84å\85¶ä»\96管ç\90\86å\93¡ä»\8dæ\9c\89æ¬\8aé\99\90å\8f¯ä»¥å­\98å\8f\96é\9a±è\97\8fç\9a\84å\85§å®¹ï¼\8cä¸\94è\83½å¤ å\8f\96æ¶\88å\88ªé\99¤ï¼\8cé\99¤é\9d\9eæ\9c\89é¡\8då¤\96ç\9a\84設å®\9aé\99\90å\88¶ã\80\82",
+       "revdelete-text-others": "å\85¶ä»\96管ç\90\86å\93¡ä»\8dæ\9c\89æ¬\8aé\99\90檢è¦\96é\9a±è\97\8fç\9a\84å\85§å®¹ï¼\8cä¸\94è\83½å¤ å\8f\96æ¶\88å\88ªé\99¤ï¼\8cé\99¤é\9d\9eæ\9c\89é¡\8då¤\96ç\9a\84設å®\9aé\99\90å\88¶ã\80\82",
        "revdelete-confirm": "請確認您是否明白此動作會造成的後果,\n以及您所做的動作是否符合 [[{{MediaWiki:Policy-url}}|政策]] 規範。",
        "revdelete-suppress-text": "禁制顯示應<strong>只有</strong>在下述情形時使用:\n* 潛在誹謗的資訊\n* 不合適個人資料\n*: <em>住家地址、電話號碼、身分證字號等。</em>",
        "revdelete-legend": "設定顯示限制",
        "diff-multi-sameuser": "(未顯示相同使用者於中間所作的 $1 次修訂)",
        "diff-multi-otherusers": "(未顯示由 $2 位使用者於中間所作的 $1 次修訂)",
        "diff-multi-manyusers": "(未顯示由超過 $2 位使用者於中間所作的 $1 次修訂)",
-       "difference-missing-revision": "{{PLURAL:$2|1次修è¨\82|$2 æ¬¡ä¿®è¨\82}}å·®ç\95°($1)ä¸\8då­\98å\9c¨ã\80\82\n\né\80\99é\80\9a常æ\98¯å\9b ç\82ºé\81\8eæ\99\82ç\9a\84é \81é\9d¢ä¿®è¨\82å·®ç\95°é\8f\88æ\8e¥被刪除。\n詳情請閱[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。",
+       "difference-missing-revision": "{{PLURAL:$2|1次修è¨\82|$2 æ¬¡ä¿®è¨\82}}å·®ç\95°($1)ä¸\8då­\98å\9c¨ã\80\82\n\né\80\99é\80\9a常æ\98¯å\9b ç\82ºé\81\8eæ\99\82ç\9a\84é \81é\9d¢ä¿®è¨\82å·®ç\95°é\80£çµ\90被刪除。\n詳情請閱[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。",
        "searchresults": "搜尋結果",
        "searchresults-title": "\"$1\" 的搜尋結果",
        "titlematches": "頁面標題符合",
        "powersearch-togglelabel": "請選擇:",
        "powersearch-toggleall": "全部",
        "powersearch-togglenone": "無",
-       "powersearch-remember": "記住選項用於以後搜",
+       "powersearch-remember": "記住選項用於以後搜",
        "search-external": "外部搜尋",
        "searchdisabled": "{{SITENAME}} 已停用搜尋功能。\n您可以改透過 Google 搜尋。\n請注意,在 Google 中搜尋到的 {{SITENAME}} 頁面內容可能不是最新的。",
        "search-error": "搜尋時發生錯誤:$1",
        "recentchangesdays-max": "最多 $1 {{PLURAL:$1|天}}",
        "recentchangescount": "預設顯示的編輯數:",
        "prefs-help-recentchangescount": "這包含最近變更、頁面歷史以及日誌。",
-       "prefs-help-watchlist-token2": "訂閱您的監視清單所需的密鑰。\n任何人只要知道密鑰就能夠讀取您的監視列表,所以請勿任意與它人共享。\n若有需要 [[Special:ResetTokens|您可重設密鑰]]。",
+       "prefs-help-watchlist-token2": "訂閱您的監視清單所需的密鑰。\n任何人只要知道密鑰就能夠讀取您的監視清单,所以請勿任意與它人共享。\n若有需要 [[Special:ResetTokens|您可重設密鑰]]。",
        "savedprefs": "您的偏好設定已儲存。",
        "timezonelegend": "時區:",
        "localtime": "當地時間:",
        "prefs-help-gender": "此偏好設定為選填欄位。\n系統會使用您選擇的方式稱呼您,對他人提及您時也會使用適當語法稱呼。\n此項資訊會被公開。",
        "email": "電子郵件",
        "prefs-help-realname": "真實姓名為選填欄位。\n若您提供真實姓名,它會用於使用者貢獻署名。",
-       "prefs-help-email": "電子郵件址為選填欄位。\n但在重設密碼時會使用,而您很有可能會忘記密。",
+       "prefs-help-email": "電子郵件址為選填欄位。\n但在重設密碼時會使用,而您很有可能會忘記密。",
        "prefs-help-email-others": "您亦可以選擇讓其他使用者用電子郵件與您聯繫,透過您的使用者或對話頁面上方的連結。\n您的電子郵件位址不會實際告知給其他要聯絡您的使用者。",
        "prefs-help-email-required": "電子郵件地址是必填項目。",
        "prefs-info": "基本資訊",
        "userrights-changeable-col": "您可變更的群組",
        "userrights-unchangeable-col": "您不可變更的群組",
        "userrights-conflict": "使用者權限更改發生衝突!請重新檢視並確認你的更改。",
-       "userrights-removed-self": "您已成功移除自己的權限,故此您沒法再次訪問此頁。",
+       "userrights-removed-self": "您已成功移除自己的權限,故此您無法再次存取此頁。",
        "group": "群組:",
        "group-user": "使用者",
        "group-autoconfirmed": "自動確認使用者",
        "right-deletedtext": "檢視已刪除修訂中已刪除的文字及變更",
        "right-browsearchive": "搜尋已刪除的頁面",
        "right-undelete": "取消刪除頁面",
-       "right-suppressrevision": "複查與還原由管理員隱藏的修訂",
+       "right-suppressrevision": "檢視、隱藏與還原某使用者對頁面的特定修訂",
+       "right-viewsuppressed": "檢視某使用者隱藏的修訂",
        "right-suppressionlog": "檢視非公開日誌",
        "right-block": "封鎖其他使用者的編輯權限",
        "right-blockemail": "封鎖使用者傳送電子郵件的權限",
        "right-editmyuserjs": "編輯自己的使用者 JavaScript 檔",
        "right-viewmywatchlist": "檢視自己的監視清單",
        "right-editmywatchlist": "編輯自己的監視清單。注意,即使無此權限,某些操作仍會新增頁面至監視清單。",
-       "right-viewmyprivateinfo": "檢視自己的私隱資料 (如:電子郵件址及真實姓名)",
-       "right-editmyprivateinfo": "編輯自己的私隱資料 (如:電子郵件址及真實姓名)",
+       "right-viewmyprivateinfo": "檢視自己的私隱資料 (如:電子郵件址及真實姓名)",
+       "right-editmyprivateinfo": "編輯自己的私隱資料 (如:電子郵件址及真實姓名)",
        "right-editmyoptions": "編輯自己的偏好設定",
        "right-rollback": "快速還原最後一位使用者對某一頁面的編輯",
        "right-markbotedits": "標示還原編輯為機械人編輯",
        "action-importupload": "由檔案上傳匯入頁面",
        "action-patrol": "標示其它人的編輯為已巡查",
        "action-autopatrol": "標示您的編輯為已巡查",
-       "action-unwatchedpages": "檢視未監視的頁面列表",
+       "action-unwatchedpages": "檢視未監視的頁面清單",
        "action-mergehistory": "合併此頁面的歷史",
        "action-userrights": "編輯所有使用者的權限",
        "action-userrights-interwiki": "編輯在其它 Wiki 上的使用者權限",
        "action-sendemail": "傳送電子郵件",
        "action-editmywatchlist": "編輯您的監視清單",
        "action-viewmywatchlist": "檢視您的監視清單",
-       "action-viewmyprivateinfo": "æ\9f¥ç\9c\8b您的個人資料",
+       "action-viewmyprivateinfo": "檢è¦\96您的個人資料",
        "action-editmyprivateinfo": "編輯您的個人資料",
        "nchanges": "$1 次變更",
        "enhancedrc-since-last-visit": "自上次訪問已有 $1",
        "recentchanges-legend-heading": "'''說明:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (請參考 [[Special:NewPages|最新頁面]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
-       "rcnotefrom": "以下為自 <strong>$2</strong> 以來的變更 (最多顯示 <strong>$1</strong> 筆)。",
+       "rcnotefrom": "以下{{PLURAL:$5|為}}自 <strong>$3 $4</strong> 以來的變更 (最多顯示 <strong>$1</strong> 筆)。",
        "rclistfrom": "顯示自 $3 $2 以來的最近變更",
        "rcshowhideminor": "$1 小修訂",
        "rcshowhideminor-show": "顯示",
        "nolicense": "尚未選擇",
        "licenses-edit": "編輯授權條款選項",
        "license-nopreview": "(不可預覽)",
-       "upload_source_url": "(有效,可公開存取的 URL)",
-       "upload_source_file": "(在您電腦上的檔案)",
+       "upload_source_url": "(æ\82¨é\81¸æ\93\87ç\9a\84æª\94æ¡\88ä¾\86è\87ªæ\9c\89æ\95\88ï¼\8cå\8f¯å\85¬é\96\8bå­\98å\8f\96ç\9a\84 URL)",
+       "upload_source_file": "(在您電腦上您選擇的檔案)",
        "listfiles-delete": "刪除",
        "listfiles-summary": "此特殊頁面顯示所有上傳過的檔案。",
        "listfiles_search_for": "搜尋媒體名稱:",
        "filehist-dimensions": "尺寸",
        "filehist-filesize": "檔案大小",
        "filehist-comment": "註解",
-       "imagelinks": "檔案使用",
-       "linkstoimage": "下列 $1 個頁面連結到此檔案:",
-       "linkstoimage-more": "超過$1個頁面連接到這個檔案。\n此處只列出首$1個連接到此檔案的頁面。\n您也可以查看[[Special:WhatLinksHere/$2|完整的清單]]。",
+       "imagelinks": "檔案用途",
+       "linkstoimage": "下列 {{PLURAL:$1|頁面連結|$1 個頁面連結}}到此檔案:",
+       "linkstoimage-more": "超過$1個{{PLURAL:$1|頁面連結|頁面連結}}到這個檔案。\n此處只列出{{PLURAL:$1|首個連結|首$1個連結}}到此檔案的頁面。\n您也可以檢視[[Special:WhatLinksHere/$2|完整的清單]]。",
        "nolinkstoimage": "沒有頁面連接到本檔案。",
-       "morelinkstoimage": "檢視連到這個檔案的[[Special:WhatLinksHere/$1|更多連結]]。",
+       "morelinkstoimage": "檢視連到這個檔案的[[Special:WhatLinksHere/$1|更多連結]]。",
        "linkstoimage-redirect": "$1 (檔案重新導向) $2",
        "duplicatesoffile": "以下 $1 個檔案與此檔案重覆 ([[Special:FileDuplicateSearch/$2|了解詳細資訊]]):",
        "sharedupload": "此檔案來自 $1 且可能被其他專案所使用。",
        "wantedpages": "需要的頁面",
        "wantedpages-badtitle": "在結果組上的無效標題: $1",
        "wantedfiles": "需要的檔案",
-       "wantedfiletext-cat": "以ä¸\8bæª\94æ¡\88被使ç\94¨ï¼\8cä½\86ä¸\8då­\98å\9c¨ã\80\82å¤\96é\83¨å\84²å­\98庫ç\9a\84æ\96\87件儘管現有,但可能會在此列出,任何此類的誤報將被<del>剔除</del>。此外,內嵌了不存在的檔案的網頁將在[[:$1]]列出。",
+       "wantedfiletext-cat": "以ä¸\8bæª\94æ¡\88被使ç\94¨ï¼\8cä½\86ä¸\8då­\98å\9c¨ã\80\82å¤\96é\83¨å\84²å­\98庫ç\9a\84æª\94æ¡\88儘管現有,但可能會在此列出,任何此類的誤報將被<del>剔除</del>。此外,內嵌了不存在的檔案的網頁將在[[:$1]]列出。",
        "wantedfiletext-cat-noforeign": "下列檔案已被使用但不存在。 除此之外,頁面已內嵌但不存在的檔案列於 [[:$1]]。",
        "wantedfiletext-nocat": "以下檔案被使用,但不存在。外部儲存庫的文件儘管現有,但可能會在此列出,任何此類的誤報將被<del>剔除</del>。",
        "wantedfiletext-nocat-noforeign": "下列檔案已被使用但不存在。",
        "allpages-hide-redirects": "隱藏重新導向頁面",
        "cachedspecial-viewing-cached-ttl": "你正在瀏覽本頁的緩存版本,至多可能存在$1的延遲。",
        "cachedspecial-viewing-cached-ts": "您正在閱讀此頁的緩存版本,這可能不是完整的版本。",
-       "cachedspecial-refresh-now": "æ\9f¥ç\9c\8b最新。",
+       "cachedspecial-refresh-now": "檢è¦\96最新。",
        "categories": "頁面分類",
        "categoriespagetext": "下列為包含頁面或媒體的{{PLURAL:$1|分類}}。\n[[Special:UnusedCategories|未使用的分類]] 不會在此顯示。\n請參考 [[Special:WantedCategories|需要的分類]]。",
        "categoriesfrom": "顯示由此項起之分類:",
        "deletedcontributions": "已刪除的使用者貢獻",
        "deletedcontributions-title": "已刪除的使用者貢獻",
        "sp-deletedcontributions-contribs": "貢獻",
-       "linksearch": "å¤\96é\83¨é\8f\88æ\8e¥æ\90\9cç´¢",
+       "linksearch": "å¤\96é\83¨é\80£çµ\90æ\90\9cå°\8b",
        "linksearch-pat": "搜尋網址:",
        "linksearch-ns": "命名空間:",
        "linksearch-ok": "搜尋",
        "index-category-desc": "命名空間允許,且含有魔術字 <code><nowiki>__INDEX__</nowiki></code> 被機器人列入索引的頁面。",
        "post-expand-template-inclusion-category-desc": "展開顯示所有樣版後,頁面大小超出 <code>$wgMaxArticleSize</code> 限制,因此部份樣版將不會顯示。",
        "post-expand-template-argument-category-desc": "在展開模樣版參數之後 (有些於三括號中,如 <code>{{{Foo}}}</code>),頁面大小超過<code>$wgMaxArticleSize</code> 設定的限制。",
-       "expensive-parserfunction-category-desc": "頁面包含太多高開銷函數解析器(例如<code>#ifexist</code>)。參見[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]。",
-       "broken-file-category-desc": "黨頁面包含受損檔案連接(連入被嵌入之不存在檔案)時。",
+       "expensive-parserfunction-category-desc": "頁面使用太多消耗系統資源的分析器函數 (如 <code>#ifexist</code>)。\n請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]。",
+       "broken-file-category-desc": "若該頁面包含損壞的檔案連結則新增分類 (內嵌檔案連結的檔案不存在時)",
        "hidden-category-category-desc": "此分類帶有<code><nowiki>__HIDDENCAT__</nowiki></code>,它預設防止於頁面分類連接盒中顯示。",
        "trackingcategories-nodesc": "並無說明。",
        "trackingcategories-disabled": "分類被禁用",
        "mailnologin": "沒有傳送位址",
-       "mailnologintext": "您必須先 [[Special:UserLogin|登入]]\n並在 [[Special:Preferences|偏好設定]]\n中設定一個有效的電子郵件址才可以傳送信件給其他使用者。",
-       "emailuser": "寄信給此使用者",
-       "emailuser-title-target": "寄信給此{{GENDER:$1|使用者}}",
-       "emailuser-title-notarget": "寄信給使用者",
+       "mailnologintext": "您必須先 [[Special:UserLogin|登入]]\n並在 [[Special:Preferences|偏好設定]]\n中設定一個有效的電子郵件址才可以傳送信件給其他使用者。",
+       "emailuser": "E-mail該使用者",
+       "emailuser-title-target": "E-mail該{{GENDER:$1|使用者}}",
+       "emailuser-title-notarget": "E-mail給使用者",
        "emailpage": "E-mail 給使用者",
-       "emailpagetext": "您可以使用以下表格傳送電子郵件給這位 {{Gender:$1|使用者}}。\n您在 [[Special:Preferences|偏好設定]] 中所輸入的電子郵件址將會作為郵件的 \"寄件人\",因此該使用者可直接回覆您。",
+       "emailpagetext": "您可以使用以下表格傳送電子郵件給這位 {{Gender:$1|使用者}}。\n您在 [[Special:Preferences|偏好設定]] 中所輸入的電子郵件址將會作為郵件的 \"寄件人\",因此該使用者可直接回覆您。",
        "defemailsubject": "來自使用者 \"$1\" 於 {{SITENAME}} 寄來的電子郵件",
        "usermaildisabled": "使用者電子郵件已停用",
        "usermaildisabledtext": "您不可傳送信件到這個 Wiki 上的其他使用者",
        "emailsend": "傳送",
        "emailccme": "傳送一份副本到我的電子郵件信箱。",
        "emailccsubject": "您寄給 $1 的訊息副本:$2",
-       "emailsent": "電子郵件已出",
-       "emailsenttext": "您的電子郵件訊息已經出。",
-       "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"傳送信件給使用者\" 功能寄給 $2。",
+       "emailsent": "電子郵件已出",
+       "emailsenttext": "您的電子郵件訊息已經出。",
+       "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"E-mail該使用者\" 功能寄給 $2。",
        "usermessage-summary": "留給系統訊息。",
        "usermessage-editor": "系統訊息",
        "watchlist": "監視清單",
        "watchlist-details": "您的監視清單上共有 $1 個頁面 (不包含對話頁面)。",
        "wlheader-enotif": "已開啟電子郵件通知功能。",
        "wlheader-showupdated": "在您最後一次檢視過後修改的頁面會以 <strong>粗體</strong> 顯示。",
-       "wlnote2": "以下為截至 $2 $3 最近 <strong>$1</strong> 小時的變更。",
+       "wlnote": "以下為自 $3 $4 之後的 <strong>$2</strong> 小時內所做的 <strong>$1</strong> 次變更。",
        "wlshowlast": "顯示最近 $1 小時,$2 天,$3 的修改",
        "watchlist-options": "監視清單選項",
        "watching": "正在監視...",
        "revertpage-nouser": "已還隱藏使用者的編輯為最後 {{GENDER:$1|[[User:$1|$1]]}} 修訂的版本",
        "rollback-success": "已還原 $1 做的編輯;\n更變回最後由 $2 修訂的版本。",
        "sessionfailure-title": "登入資訊失敗",
-       "sessionfailure": "似乎您的登會話有問題;\n為了防止會話劫持,這個操作已經被取消。\n請返回先前的頁面,重新載入該頁面,然後重試。",
+       "sessionfailure": "似乎您的登會話有問題;\n為了防止會話劫持,這個操作已經被取消。\n請返回先前的頁面,重新載入該頁面,然後重試。",
        "protectlogpage": "保護日誌",
        "protectlogtext": "以下為變更頁面保護的列表。\n請參考 [[Special:ProtectedPages|受保護頁面列表]] 檢視目前受保護頁面。",
        "protectedarticle": "已保護 \"[[$1]]\"",
        "unblock": "解除封鎖使用者",
        "blockip": "封鎖使用者",
        "blockip-legend": "封鎖使用者",
-       "blockiptext": "填寫以下單據可封鎖特定 IP 位或使用者名稱的存取權限。\n這個動作應用來避免破壞行為,可根據 [[{{MediaWiki:Policy-url}}|管理政策]]。\n請在下方填寫一個具體的原因 (例如:引述一段破壞頁面的事實)。",
+       "blockiptext": "填寫以下單據可封鎖特定 IP 位或使用者名稱的存取權限。\n這個動作應用來避免破壞行為,可根據 [[{{MediaWiki:Policy-url}}|管理政策]]。\n請在下方填寫一個具體的原因 (例如:引述一段破壞頁面的事實)。",
        "ipaddressorusername": "IP 位址或使用者名稱:",
        "ipbexpiry": "期限:",
        "ipbreason": "原因:",
        "blocklog-showsuppresslog": "此使用者先前被封鎖並且隱藏過。\n以下為禁止顯示紀錄以供參考:",
        "blocklogentry": "已封鎖 [[$1]] 的期限至 $2 $3",
        "reblock-logentry": "更改 [[$1]] 的封鎖期限至 $2 $3",
-       "blocklogtext": "æ­¤ç\82ºä½¿ç\94¨è\80\85ç\9a\84å°\81é\8e\96å\8f\8aå\8f\96æ¶\88å°\81é\8e\96è¨\98é\8c\84ã\80\82\nä¸\8då\8c\85è\87ªå\8b\95å°\81é\8e\96ç\9a\84 IP ä½\8då\9d\80ã\80\82\nè«\8bå\8f\83è\80\83 [[Special:BlockList|å°\81é\8e\96æ¸\85å\96®]] ä»¥æ\9f¥ç\9c\8b目前的封鎖。",
+       "blocklogtext": "æ­¤ç\82ºä½¿ç\94¨è\80\85ç\9a\84å°\81é\8e\96å\8f\8aå\8f\96æ¶\88å°\81é\8e\96è¨\98é\8c\84ã\80\82\nä¸\8då\8c\85è\87ªå\8b\95å°\81é\8e\96ç\9a\84 IP ä½\8då\9d\80ã\80\82\nè«\8bå\8f\83è\80\83 [[Special:BlockList|å°\81é\8e\96æ¸\85å\96®]] ä»¥æª¢è¦\96目前的封鎖。",
        "unblocklogentry": "已解封 $1",
        "block-log-flags-anononly": "僅限匿名使用者",
        "block-log-flags-nocreate": "停用帳號建立",
        "ip_range_invalid": "無效的 IP 範圍。",
        "ip_range_toolarge": "不允許封鎖範圍大於 /$1。",
        "proxyblocker": "代理封鎖器",
-       "proxyblockreason": "因您的 IP 位址是開放代理伺服器,已被封鎖。\n請聯繫您的網服務供應商或您所在組織的技術支援,告知他們此嚴重的安全性問題。",
-       "sorbsreason": "您的IP位址在{{SITENAME}}中被 DNSBL列為屬於開放代理服務器。",
+       "proxyblockreason": "因您的 IP 位址是開放代理伺服器,已被封鎖。\n請聯繫您的網服務供應商或您所在組織的技術支援,告知他們此嚴重的安全性問題。",
+       "sorbsreason": "您的 IP 位址在{{SITENAME}}中被 DNSBL列為屬於開放代理服務器。",
        "sorbs_create_account_reason": "您連線到 {{SITENAME}} 的 IP 位址被 DNSBL 列為開放代理伺服器。\n您不能建立帳號。",
        "xffblockreason": "您的 IP 位址使用 X-Forwarded-For 標頭,您或您使用的代理伺服器已被封鎖。\n封鎖的原因為:$1",
        "cant-see-hidden-user": "您欲封鎖的使用者已經被封鎖並且隱藏。\n您沒有隱藏使用者的權限,您無法檢視或編輯該使用者的封鎖狀態。",
        "import-error-create": "您沒有權限建立頁面 \"$1\",無法匯入。",
        "import-error-interwiki": "頁面 \"$1\" 的名稱已保留作為外部連結 (Interwiki) 使用,無法匯入。",
        "import-error-special": "頁面 \"$1\" 屬於不允許頁面的特殊命名空間,無法匯入。",
-       "import-error-invalid": "é \81é\9d¢ \"$1\" å\90\8d稱無效,無法匯入。",
+       "import-error-invalid": "é \81é\9d¢ \"$1\" å\9b å\85¶å\90\8d稱å\9c¨æ­¤wiki無效,無法匯入。",
        "import-error-unserialize": "頁面 \"$1\" 的修訂 $2 無法反序列反。 此修訂使用 $3 內容模型以 $4 的方式序列化。",
        "import-error-bad-location": "此 Wiki 的頁面 \"$1\" 不支援使用內容模型 $3,修訂 $2 無法儲存至該頁面 。",
        "import-options-wrong": "{{PLURAL:$2|選項}}錯誤:<nowiki>$1</nowiki>",
        "importlogpage": "匯入日誌",
        "importlogpagetext": "管理性匯入其他 Wiki 的頁面及編輯歷史記錄。",
        "import-logentry-upload": "使用檔案上傳匯入 [[$1]]",
-       "import-logentry-upload-detail": "$1 個修訂",
+       "import-logentry-upload-detail": "已匯入 $1 筆{{PLURAL:$1|修訂}}",
        "import-logentry-interwiki": "Transwiki 頁面 $1",
-       "import-logentry-interwiki-detail": "來自 $2 的 $1 個修訂",
+       "import-logentry-interwiki-detail": "已從 $2 匯入 $1 筆{{PLURAL:$1|修訂}}",
        "javascripttest": "JavaScript 測試",
        "javascripttest-title": "執行 $1 測試。",
        "javascripttest-pagetext-noframework": "此頁面保留用來作為 JavaScript 測試使用。",
        "tooltip-pt-userpage": "您的使用者頁面",
        "tooltip-pt-anonuserpage": "您編輯使用的 IP 位址所對應的使用者頁面",
        "tooltip-pt-mytalk": "您的對話頁面",
-       "tooltip-pt-anontalk": "對於來自此IP地址編輯的對話",
+       "tooltip-pt-anontalk": "對於來自此 IP 位址編輯的對話",
        "tooltip-pt-preferences": "您的偏好設定",
        "tooltip-pt-watchlist": "您監視變更頁面清單",
        "tooltip-pt-mycontris": "您的貢獻清單",
        "exif-contrast": "對比度",
        "exif-saturation": "飽和度",
        "exif-sharpness": "銳利度",
-       "exif-devicesettingdescription": "設å\82\99設定描述",
+       "exif-devicesettingdescription": "è£\9dç½®設定描述",
        "exif-subjectdistancerange": "主體距離範圍",
        "exif-imageuniqueid": "唯一影像識別碼",
        "exif-gpsversionid": "GPS 標籤版本",
        "exif-compression-2": "CCITT第3組一維修改霍夫曼遊程編碼",
        "exif-compression-3": "CCITT第3組傳真編碼",
        "exif-compression-4": "CCITT第4組傳真編碼",
-       "exif-compression-6": "JPEG(舊)",
+       "exif-compression-6": "JPEG (舊)",
        "exif-copyrighted-true": "受版權保護",
        "exif-copyrighted-false": "版權所屬者不明",
        "exif-unknowndate": "未知的日期",
        "exif-sharpness-1": "低",
        "exif-sharpness-2": "高",
        "exif-subjectdistancerange-0": "未知",
-       "exif-subjectdistancerange-1": "自動處理程式(宏)",
+       "exif-subjectdistancerange-1": "巨集",
        "exif-subjectdistancerange-2": "近景",
        "exif-subjectdistancerange-3": "遠景",
        "exif-gpslatitude-n": "北緯",
        "namespacesall": "全部",
        "monthsall": "全部",
        "confirmemail": "確認郵箱位址",
-       "confirmemail_noemail": "您尚未於 [[Special:Preferences|偏好設定]] 輸入一個有效的電子郵件址。",
-       "confirmemail_text": "{{SITENAME}}要求您在使用郵件功能之前驗證您的郵箱位址。\n點擊以下按鈕可向您的郵箱發送一封確認郵件。該郵件包含有一行代碼連結;\n請在您的瀏覽器中加載此連結以確認您的郵箱位址是有效的。",
-       "confirmemail_pending": "確認碼已送至您的電子郵件,\n若您才剛建立好您的帳號,可能需要稍後幾分鐘才能收到。\n若沒有收到,請再重新申請一次確認碼。",
+       "confirmemail_noemail": "您尚未於 [[Special:Preferences|偏好設定]] 輸入一個有效的電子郵件址。",
+       "confirmemail_text": "{{SITENAME}}要求您在使用郵件功能之前驗證您的郵箱位址。\n點選以下按鈕可向您的郵箱傳送一封確認郵件。該郵件包含有一行代碼連結;\n請在您的瀏覽器中載入此連結以確認您的郵箱位址是有效的。",
+       "confirmemail_pending": "確認碼已送至您的電子郵件,\n若您才剛建立好您的帳號,可能需要稍後幾分鐘才能收到。\n若沒有收到,請再重新申請一次確認碼。",
        "confirmemail_send": "郵發確認代碼",
-       "confirmemail_sent": "確認郵件已發送。",
-       "confirmemail_oncreate": "一個確認代碼已經被送到您的郵箱。該代碼並不要求您進行登入,\n但若您要啟用在此 wiki 上的任何基於電子郵件的功能,您必須先提交此代碼。",
-       "confirmemail_sendfailed": "{{SITENAME}}無法送確認郵件,請檢查郵箱位址是否包含非法字元。\n\n郵件傳送員回應: $1",
+       "confirmemail_sent": "確認郵件已寄出。",
+       "confirmemail_oncreate": "一個確認代碼已經被送到您的郵箱。該代碼並不要求您進行登入,\n但若您要啟用在此 wiki 上的任何基於電子郵件的功能,您必須先提交此代碼。",
+       "confirmemail_sendfailed": "{{SITENAME}}無法送確認郵件,請檢查郵箱位址是否包含非法字元。\n\n郵件傳送員回應: $1",
        "confirmemail_invalid": "無效的確認碼,該代碼可能已經過期。",
        "confirmemail_needlogin": "您需要$1以確認您的郵箱位址。",
-       "confirmemail_success": "您的郵箱已經被確認。您現在可以[[Special:UserLogin|登]]並使用此網站了。",
+       "confirmemail_success": "您的郵箱已經被確認。您現在可以[[Special:UserLogin|登]]並使用此網站了。",
        "confirmemail_loggedin": "您的郵箱位址現下已被確認。",
        "confirmemail_subject": "{{SITENAME}}郵箱位址確認",
-       "confirmemail_body": "不明人士 (可能是您自己,來自 IP 位址 $1)  已在 {{SITENAME}} 註冊了一個帳號 \"$2\" 並使用了此電子郵件址。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
-       "confirmemail_body_changed": "不明人士 (可能是您自己,來自 IP 位址 $1)  已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件址更改至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
-       "confirmemail_body_set": "不明人士 (可能是您自己,來自 IP 位址 $1)  已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件址設定至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
-       "confirmemail_invalidated": "電郵址確認已取消",
+       "confirmemail_body": "不明人士 (可能是您自己,來自 IP 位址 $1)  已在 {{SITENAME}} 註冊了一個帳號 \"$2\" 並使用了此電子郵件址。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
+       "confirmemail_body_changed": "不明人士 (可能是您自己,來自 IP 位址 $1)  已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件址更改至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
+       "confirmemail_body_set": "不明人士 (可能是您自己,來自 IP 位址 $1)  已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件址設定至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
+       "confirmemail_invalidated": "電郵址確認已取消",
        "invalidateemail": "取消電郵確認",
        "scarytranscludedisabled": "[Interwiki 轉換代碼不可用]",
        "scarytranscludefailed": "[樣版 $1 讀取失敗]",
        "scarytranscludefailed-httpstatus": "[樣版 $1 讀取失敗:HTTP $2]",
-       "scarytranscludetoolong": "[URL 址太長]",
+       "scarytranscludetoolong": "[URL 址太長]",
        "deletedwhileediting": "<strong>警告:</strong>此頁在您開始編輯之後已經被刪除﹗",
        "confirmrecreate": "在您編輯的同時,使用者 [[User:$1|$1]] ([[User talk:$1|對話]]) 刪除了此頁面,原因為:\n: <em>$2</em>\n請確認您是否真的要重新建立此頁面。",
        "confirmrecreate-noreason": "在您編輯的同時,使用者 [[User:$1|$1]] ([[User talk:$1|對話]]) 刪除了此頁面,請確認您是否真的要重新建立此頁面。",
        "autosumm-replace": "使用 \"$1\" 取代內容",
        "autoredircomment": "頁面已重新導向至 [[$1]]",
        "autosumm-new": "已建立頁面,內容為 \"$1\"",
+       "autosumm-newblank": "建立空白頁",
        "size-bytes": "$1 位元組",
        "lag-warn-normal": "此清單可能不會顯示最近 $1 {{PLURAL:$1|秒}}內的變更。",
        "lag-warn-high": "由於資料庫回應延遲,此清單可能不會顯示最近 $1 {{PLURAL:$1|秒}}內的變更。",
        "watchlistedit-clear-legend": "清空監視清單",
        "watchlistedit-clear-explain": "將會移除您的監視清單中所有的標題",
        "watchlistedit-clear-titles": "標題:",
-       "watchlistedit-clear-submit": "清空監視清單無法還原)",
+       "watchlistedit-clear-submit": "清空監視清單 (無法還原)",
        "watchlistedit-clear-done": "已清空您的監視清單。",
        "watchlistedit-clear-removed": "已移除 $1 個標題:",
        "watchlistedit-too-many": "太多要在此處顯示的頁面。",
        "specialpages-group-spam": "反垃圾訊息工具",
        "blankpage": "空白頁面",
        "intentionallyblankpage": "此頁面被故意設為空白。",
-       "external_image_whitelist": " #留下這行一樣的文字<pre>\n#在下面(//之中間部份)輸入正規表達式\n#這些將會跟外部(已超連結的)圖片配合\n#那些配合到出來的會顯示成圖片,否則就只會顯示成連結\n#有 # 開頭的行會當成註解\n#大小寫並無區分\n\n#在這行上面輸入所有的regex。留下這行一樣的文字</pre>",
+       "external_image_whitelist": " #請勿修改本行文字<pre>\n#請於下方填寫正規表示法 (只需 // 之間的內容)\n#將會檢查外部連結的圖片是否符合這些條件\n#符合條件的連結會以圖片顯示,否則只顯示連結\n#以 # 開頭的行會被做為註解\n#此條件不區分大小寫\n\n#請將所有正規表示法輸入在此行上方,請勿修改本行文字</pre>",
        "tags": "有效變更標籤",
        "tag-filter": "[[Special:Tags|標籤]]搜尋:",
        "tag-filter-submit": "搜尋",
        "htmlform-int-toolow": "您所指定的值低於最小值$1",
        "htmlform-int-toohigh": "您所指定的值高於最大值$1",
        "htmlform-required": "此值是必填項",
-       "htmlform-submit": "提交",
+       "htmlform-submit": "送出",
        "htmlform-reset": "還原更改",
        "htmlform-selectorother-other": "其他",
        "htmlform-no": "否",
        "feedback-subject": "主旨:",
        "feedback-message": "訊息:",
        "feedback-cancel": "取消",
-       "feedback-submit": "提交反饋",
+       "feedback-submit": "送出回饋",
        "feedback-adding": "正在頁面添加反饋...",
        "feedback-error1": "錯誤:從API返回無法識別的結果",
        "feedback-error2": "錯誤:編輯失敗",
        "api-error-badaccess-groups": "您沒有權限在此 Wiki 上傳檔案。",
        "api-error-badtoken": "內部錯誤:標記無效。",
        "api-error-copyuploaddisabled": "通過URL上傳的功能已被此伺服器禁用。",
-       "api-error-duplicate": "å\9c¨ç¶²ç«\99ä¸\8aå·²ç¶\93å\85·æ\9c\89ç\9b¸å\90\8cå\85§å®¹ç\9a\84{{PLURAL:$1|[$2 å\8f¦ä¸\80å\80\8bæ\96\87件]|[$2 å\8f¦ä¸\80äº\9bæ\96\87件]}}。",
-       "api-error-duplicate-archive": "å\9c¨ç¶²ç«\99ä¸\8aæ\9b¾ç¶\93å\85·æ\9c\89ç\9b¸å\90\8cå\85§å®¹ç\9a\84{{PLURAL:$1|[$2 å\8f¦ä¸\80å\80\8bæ\96\87件]|[$2 å\8f¦ä¸\80äº\9bæ\96\87件]}},但已被刪除。",
+       "api-error-duplicate": "å\9c¨ç¶²ç«\99ä¸\8aå·²ç¶\93å\85·æ\9c\89ç\9b¸å\90\8cå\85§å®¹ç\9a\84{{PLURAL:$1|[$2 å\8f¦ä¸\80å\80\8bæª\94æ¡\88]|[$2 å\8f¦ä¸\80äº\9bæª\94æ¡\88]}}。",
+       "api-error-duplicate-archive": "å\9c¨ç¶²ç«\99ä¸\8aæ\9b¾ç¶\93å\85·æ\9c\89ç\9b¸å\90\8cå\85§å®¹ç\9a\84{{PLURAL:$1|[$2 å\8f¦ä¸\80å\80\8bæª\94æ¡\88]|[$2 å\8f¦ä¸\80äº\9bæª\94æ¡\88]}},但已被刪除。",
        "api-error-duplicate-archive-popup-title": "已被刪除的重複{{PLURAL:$1|文件}}。",
-       "api-error-duplicate-popup-title": "é\87\8dè¤\87ç\9a\84{{PLURAL:$1|æ\96\87件}}。",
+       "api-error-duplicate-popup-title": "é\87\8dè¤\87ç\9a\84{{PLURAL:$1|æª\94æ¡\88}}。",
        "api-error-empty-file": "您提交的檔案是空的。",
        "api-error-emptypage": "不許創建沒有內容的新頁面。",
-       "api-error-fetchfileerror": "å\85§é\83¨é\8c¯èª¤ï¼\9aç\8d²å\8f\96æ\96\87件時發生錯誤。",
+       "api-error-fetchfileerror": "å\85§é\83¨é\8c¯èª¤ï¼\9aç\8d²å\8f\96æª\94æ¡\88時發生錯誤。",
        "api-error-fileexists-forbidden": "以\" $1 \"命名的檔案已經存在,並且不能被重寫。",
        "api-error-fileexists-shared-forbidden": "以\" $1 \"命名的檔案已經存在於共用檔案儲存庫上,並且不能被重寫。",
        "api-error-file-too-large": "您提交的檔案太大了。",
        "api-error-invalid-file-key": "內部錯誤:於臨時儲存庫中查無檔案。",
        "api-error-missingparam": "內部錯誤:請求中缺少參數。",
        "api-error-missingresult": "內部錯誤:無法確定複製是否成功。",
-       "api-error-mustbeloggedin": "您必須登錄後再上傳文件。",
+       "api-error-mustbeloggedin": "您必須登入後再上傳檔案。",
        "api-error-mustbeposted": "內部錯誤:請求需要 HTTP POST。",
-       "api-error-noimageinfo": "文件成功,但伺服器沒有給我們任何該文件的信息。",
+       "api-error-noimageinfo": "上傳成功,但伺服器沒有給我們任何該檔案的資訊。",
        "api-error-nomodule": "內部錯誤:缺少上傳模塊集。",
        "api-error-ok-but-empty": "內部錯誤:伺服器沒有響應。",
        "api-error-overwrite": "不允許覆蓋現有檔案。",
-       "api-error-stashfailed": "內部錯誤:伺服器存臨時檔案失敗。",
+       "api-error-stashfailed": "內部錯誤:伺服器存臨時檔案失敗。",
        "api-error-publishfailed": "內部錯誤:伺服器發佈臨時檔案失敗。",
        "api-error-stasherror": "上載檔案存檔時出錯。",
        "api-error-timeout": "伺服器沒有在預期的時間內回應。",
        "api-error-unclassified": "發生未知錯誤。",
        "api-error-unknown-code": "未知錯誤:$1",
-       "api-error-unknown-error": "å\85§é\83¨é\8c¯èª¤ï¼\9aå\98\97試ä¸\8aå\82³æ\96\87件時出錯。",
+       "api-error-unknown-error": "å\85§é\83¨é\8c¯èª¤ï¼\9aå\98\97試ä¸\8aå\82³æª\94æ¡\88時出錯。",
        "api-error-unknown-warning": "未知的警告:$1",
        "api-error-unknownerror": "未知錯誤:$1。",
        "api-error-uploaddisabled": "本wiki的上傳檔案功能已停用。",
        "limitreport-cputime-value": "$1 秒",
        "limitreport-walltime": "實際使用時間",
        "limitreport-walltime-value": "$1 秒",
-       "limitreport-ppvisitednodes": "預處理訪問節點次數",
+       "limitreport-ppvisitednodes": "預處理訪問節點次數",
        "limitreport-ppgeneratednodes": "預處理器產生節點次數",
        "limitreport-postexpandincludesize": "展開後的引用大小",
        "limitreport-postexpandincludesize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
index 3729a78..1618bdb 100644 (file)
@@ -57,43 +57,43 @@ $namespaceAliases = array(
 $namespaceGenderAliases = array();
 
 $datePreferences = array(
-    'default',
-    'mdy',
-    'dmy',
-    'ymd',
-    'yyyy-mm-dd',
-    'ISO 8601',
+       'default',
+       'mdy',
+       'dmy',
+       'ymd',
+       'yyyy-mm-dd',
+       'ISO 8601',
 );
 
 $defaultDateFormat = 'ymd';
 
 $datePreferenceMigrationMap = array(
-    'default',
-    'mdy',
-    'dmy',
-    'ymd'
+       'default',
+       'mdy',
+       'dmy',
+       'ymd'
 );
 
 $dateFormats = array(
-    'mdy time' => 'H:i',
-    'mdy date' => 'F j Y "с."',
-    'mdy both' => 'H:i, F j Y "с."',
+       'mdy time' => 'H:i',
+       'mdy date' => 'F j Y "с."',
+       'mdy both' => 'H:i, F j Y "с."',
 
-    'dmy time' => 'H:i',
-    'dmy date' => 'j F Y "с."',
-    'dmy both' => 'H:i, j F Y "с."',
+       'dmy time' => 'H:i',
+       'dmy date' => 'j F Y "с."',
+       'dmy both' => 'H:i, j F Y "с."',
 
-    'ymd time' => 'H:i',
-    'ymd date' => 'Y "с." xg j',
-    'ymd both' => 'H:i, Y "с." xg j',
+       'ymd time' => 'H:i',
+       'ymd date' => 'Y "с." xg j',
+       'ymd both' => 'H:i, Y "с." xg j',
 
-    'yyyy-mm-dd time' => 'xnH:xni:xns',
-    'yyyy-mm-dd date' => 'xnY-xnm-xnd',
-    'yyyy-mm-dd both' => 'xnH:xni:xns, xnY-xnm-xnd',
+       'yyyy-mm-dd time' => 'xnH:xni:xns',
+       'yyyy-mm-dd date' => 'xnY-xnm-xnd',
+       'yyyy-mm-dd both' => 'xnH:xni:xns, xnY-xnm-xnd',
 
-    'ISO 8601 time' => 'xnH:xni:xns',
-    'ISO 8601 date' => 'xnY.xnm.xnd',
-    'ISO 8601 both' => 'xnY.xnm.xnd"T"xnH:xni:xns',
+       'ISO 8601 time' => 'xnH:xni:xns',
+       'ISO 8601 date' => 'xnY.xnm.xnd',
+       'ISO 8601 both' => 'xnY.xnm.xnd"T"xnH:xni:xns',
 );
 
 $separatorTransformTable = array( ','  => '.', '.' => ',' );
index 7fb5df0..6b852b7 100644 (file)
@@ -52,43 +52,43 @@ $namespaceAliases = array(
 );
 
 $datePreferences = array(
-    'default',
-    'mdy',
-    'dmy',
-    'ymd',
-    'yyyy-mm-dd',
-    'ISO 8601',
+       'default',
+       'mdy',
+       'dmy',
+       'ymd',
+       'yyyy-mm-dd',
+       'ISO 8601',
 );
 
 $defaultDateFormat = 'ymd';
 
 $datePreferenceMigrationMap = array(
-    'default',
-    'mdy',
-    'dmy',
-    'ymd'
+       'default',
+       'mdy',
+       'dmy',
+       'ymd'
 );
 
 $dateFormats = array(
-    'mdy time' => 'H:i',
-    'mdy date' => 'F j Y "s."',
-    'mdy both' => 'H:i, F j Y "s."',
+       'mdy time' => 'H:i',
+       'mdy date' => 'F j Y "s."',
+       'mdy both' => 'H:i, F j Y "s."',
 
-    'dmy time' => 'H:i',
-    'dmy date' => 'j F Y "s."',
-    'dmy both' => 'H:i, j F Y "s."',
+       'dmy time' => 'H:i',
+       'dmy date' => 'j F Y "s."',
+       'dmy both' => 'H:i, j F Y "s."',
 
-    'ymd time' => 'H:i',
-    'ymd date' => 'Y "s." xg j',
-    'ymd both' => 'H:i, Y "s." xg j',
+       'ymd time' => 'H:i',
+       'ymd date' => 'Y "s." xg j',
+       'ymd both' => 'H:i, Y "s." xg j',
 
-    'yyyy-mm-dd time' => 'xnH:xni:xns',
-    'yyyy-mm-dd date' => 'xnY-xnm-xnd',
-    'yyyy-mm-dd both' => 'xnH:xni:xns, xnY-xnm-xnd',
+       'yyyy-mm-dd time' => 'xnH:xni:xns',
+       'yyyy-mm-dd date' => 'xnY-xnm-xnd',
+       'yyyy-mm-dd both' => 'xnH:xni:xns, xnY-xnm-xnd',
 
-    'ISO 8601 time' => 'xnH:xni:xns',
-    'ISO 8601 date' => 'xnY.xnm.xnd',
-    'ISO 8601 both' => 'xnY.xnm.xnd"T"xnH:xni:xns',
+       'ISO 8601 time' => 'xnH:xni:xns',
+       'ISO 8601 date' => 'xnY.xnm.xnd',
+       'ISO 8601 both' => 'xnY.xnm.xnd"T"xnH:xni:xns',
 );
 
 $separatorTransformTable = array( ',' => '.', '.' => ',' );
index 2718a48..b796aca 100644 (file)
@@ -261,7 +261,7 @@ $magicWords = array(
  * Date formats list for Special:Preferences
  * see $dateFormats for definitions
  */
-$datePreferences =  array(
+$datePreferences = array(
        'ČSN basic dt',
        'ČSN padded dt',
        'ČSN basic td',
index 4cffd2b..d6f268f 100644 (file)
@@ -35,8 +35,8 @@ $namespaceAliases = array(
 );
 
 $namespaceGenderAliases = array(
-        NS_USER => array( 'male' => 'Wužywaŕ', 'female' => 'Wužywarka' ),
-        NS_USER_TALK => array( 'male' => 'Diskusija_wužywarja', 'female' => 'Diskusija_wužywarki' ),
+       NS_USER => array( 'male' => 'Wužywaŕ', 'female' => 'Wužywarka' ),
+       NS_USER_TALK => array( 'male' => 'Diskusija_wužywarja', 'female' => 'Diskusija_wužywarki' ),
 );
 
 $specialPageAliases = array(
index 8167b19..ccdd310 100644 (file)
@@ -103,9 +103,11 @@ $namespaceAliases = array();
  * Array of gender specific. namespace aliases.
  * Mapping NS_xxx to array of GENDERKEY to alias.
  * Example:
-$namespaceGenderAliases = array(
-       NS_USER => array( 'male' => 'Male_user', 'female' => 'Female_user' ),
-);
+ * @code
+ * $namespaceGenderAliases = array(
+ *     NS_USER => array( 'male' => 'Male_user', 'female' => 'Female_user' ),
+ * );
+ * @endcode
  */
 $namespaceGenderAliases = array();
 
@@ -202,175 +204,175 @@ $bookstoreList = array(
  * This array can be modified at runtime with the LanguageGetMagic hook
  */
 $magicWords = array(
-#   ID                                  CASE  SYNONYMS
-       'redirect'                => array( 0,    '#REDIRECT' ),
-       'notoc'                   => array( 0,    '__NOTOC__' ),
-       'nogallery'               => array( 0,    '__NOGALLERY__' ),
-       'forcetoc'                => array( 0,    '__FORCETOC__' ),
-       'toc'                     => array( 0,    '__TOC__' ),
-       'noeditsection'           => array( 0,    '__NOEDITSECTION__' ),
-       '!'                       => array( 1,    '!' ),
-       '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' ),
-       'namespacenumber'         => array( 1,    'NAMESPACENUMBER' ),
-       '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' ),
-       'rootpagename'            => array( 1,    'ROOTPAGENAME' ),
-       'rootpagenamee'           => array( 1,    'ROOTPAGENAMEE' ),
-       '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,    'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( 1,    'right' ),
-       'img_left'                => array( 1,    'left' ),
-       'img_none'                => array( 1,    'none' ),
-       'img_width'               => array( 1,    '$1px' ),
-       'img_center'              => array( 1,    'center', 'centre' ),
-       'img_framed'              => array( 1,    'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( 1,    'frameless' ),
-       'img_lang'                => array( 1,    'lang=$1' ),
-       'img_page'                => array( 1,    'page=$1', 'page $1' ),
-       'img_upright'             => array( 1,    'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( 1,    'border' ),
-       '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,    'link=$1' ),
-       'img_alt'                 => array( 1,    'alt=$1' ),
-       'img_class'               => array( 1,    'class=$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,    'REVISIONDAY2' ),
-       'revisionmonth'           => array( 1,    'REVISIONMONTH' ),
-       'revisionmonth1'          => array( 1,    'REVISIONMONTH1' ),
-       'revisionyear'            => array( 1,    'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( 1,    'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( 1,    'REVISIONUSER' ),
-       'revisionsize'            => array( 1,    'REVISIONSIZE' ),
-       'plural'                  => array( 0,    'PLURAL:' ),
-       'fullurl'                 => array( 0,    'FULLURL:' ),
-       'fullurle'                => array( 0,    'FULLURLE:' ),
-       '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' ),
-       'nocommafysuffix'         => array( 0,    'NOSEP' ),
-       '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' ),
-       'speciale'                => array( 0,    'speciale' ),
-       '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' ),
-       'cascadingsources'        => array( 1,    'CASCADINGSOURCES' ),
-       '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' ),
-       'displaytitle_noerror'    => array( 0,    'noerror' ),
-       'displaytitle_noreplace'  => array( 0,    'noreplace' ),
-       'pagesincategory_all'     => array( 0,    'all' ),
-       'pagesincategory_pages'   => array( 0,    'pages' ),
-       'pagesincategory_subcats' => array( 0,    'subcats' ),
-       'pagesincategory_files'   => array( 0,    'files' ),
+#   ID                               CASE  SYNONYMS
+       'redirect'                => array( 0, '#REDIRECT' ),
+       'notoc'                   => array( 0, '__NOTOC__' ),
+       'nogallery'               => array( 0, '__NOGALLERY__' ),
+       'forcetoc'                => array( 0, '__FORCETOC__' ),
+       'toc'                     => array( 0, '__TOC__' ),
+       'noeditsection'           => array( 0, '__NOEDITSECTION__' ),
+       '!'                       => array( 1, '!' ),
+       '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' ),
+       'namespacenumber'         => array( 1, 'NAMESPACENUMBER' ),
+       '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' ),
+       'rootpagename'            => array( 1, 'ROOTPAGENAME' ),
+       'rootpagenamee'           => array( 1, 'ROOTPAGENAMEE' ),
+       '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, 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'               => array( 1, 'right' ),
+       'img_left'                => array( 1, 'left' ),
+       'img_none'                => array( 1, 'none' ),
+       'img_width'               => array( 1, '$1px' ),
+       'img_center'              => array( 1, 'center', 'centre' ),
+       'img_framed'              => array( 1, 'framed', 'enframed', 'frame' ),
+       'img_frameless'           => array( 1, 'frameless' ),
+       'img_lang'                => array( 1, 'lang=$1' ),
+       'img_page'                => array( 1, 'page=$1', 'page $1' ),
+       'img_upright'             => array( 1, 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'              => array( 1, 'border' ),
+       '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, 'link=$1' ),
+       'img_alt'                 => array( 1, 'alt=$1' ),
+       'img_class'               => array( 1, 'class=$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, 'REVISIONDAY2' ),
+       'revisionmonth'           => array( 1, 'REVISIONMONTH' ),
+       'revisionmonth1'          => array( 1, 'REVISIONMONTH1' ),
+       'revisionyear'            => array( 1, 'REVISIONYEAR' ),
+       'revisiontimestamp'       => array( 1, 'REVISIONTIMESTAMP' ),
+       'revisionuser'            => array( 1, 'REVISIONUSER' ),
+       'revisionsize'            => array( 1, 'REVISIONSIZE' ),
+       'plural'                  => array( 0, 'PLURAL:' ),
+       'fullurl'                 => array( 0, 'FULLURL:' ),
+       'fullurle'                => array( 0, 'FULLURLE:' ),
+       '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' ),
+       'nocommafysuffix'         => array( 0, 'NOSEP' ),
+       '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' ),
+       'speciale'                => array( 0, 'speciale' ),
+       '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' ),
+       'cascadingsources'        => array( 1, 'CASCADINGSOURCES' ),
+       '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' ),
+       'displaytitle_noerror'    => array( 0, 'noerror' ),
+       'displaytitle_noreplace'  => array( 0, 'noreplace' ),
+       'pagesincategory_all'     => array( 0, 'all' ),
+       'pagesincategory_pages'   => array( 0, 'pages' ),
+       'pagesincategory_subcats' => array( 0, 'subcats' ),
+       'pagesincategory_files'   => array( 0, 'files' ),
 );
 
 /**
@@ -404,7 +406,7 @@ $specialPageAliases = array(
        'Diff'                      => array( 'Diff' ),
        'DoubleRedirects'           => array( 'DoubleRedirects' ),
        'EditWatchlist'             => array( 'EditWatchlist' ),
-       'Emailuser'                 => array( 'EmailUser' ),
+       'Emailuser'                 => array( 'EmailUser', 'Email' ),
        'ExpandTemplates'           => array( 'ExpandTemplates' ),
        'Export'                    => array( 'Export' ),
        'Fewestrevisions'           => array( 'FewestRevisions' ),
@@ -437,6 +439,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'MostRevisions' ),
        'Movepage'                  => array( 'MovePage' ),
        'Mycontributions'           => array( 'MyContributions' ),
+       'MyLanguage'                => array( 'MyLanguage' ),
        'Mypage'                    => array( 'MyPage' ),
        'Mytalk'                    => array( 'MyTalk' ),
        'Myuploads'                 => array( 'MyUploads', 'MyFiles' ),
@@ -448,7 +451,7 @@ $specialPageAliases = array(
        'PermanentLink'             => array( 'PermanentLink', 'PermaLink' ),
        'Popularpages'              => array( 'PopularPages' ),
        'Preferences'               => array( 'Preferences' ),
-       'Prefixindex'               => array( 'PrefixIndex' ) ,
+       'Prefixindex'               => array( 'PrefixIndex' ),
        'Protectedpages'            => array( 'ProtectedPages' ),
        'Protectedtitles'           => array( 'ProtectedTitles' ),
        'Randompage'                => array( 'Random', 'RandomPage' ),
index 88afbe7..da3eb7a 100644 (file)
@@ -371,7 +371,7 @@ $datePreferenceMigrationMap = array(
  * overridden.
  */
 $dateFormats = array(
-    # Please be cautious not to delete the invisible RLM from the beginning of the strings.
+       # Please be cautious not to delete the invisible RLM from the beginning of the strings.
        'mdy time' => '‏H:i',
        'mdy date' => '‏n/j/Y میلادی',
        'mdy both' => '‏n/j/Y میلادی، ساعت H:i',
index ac16028..8682ab0 100644 (file)
 $fallback = 'fr';
 
 $bookstoreList = array(
-    'Amazon.fr'    => 'http://www.amazon.fr/exec/obidos/ISBN=$1',
-    'alapage.fr'   => 'http://www.alapage.com/mx/?tp=F&type=101&l_isbn=$1&donnee_appel=ALASQ&devise=&',
-    'fnac.com'     => 'http://www3.fnac.com/advanced/book.do?isbn=$1',
-    'chapitre.com' => 'http://www.chapitre.com/frame_rec.asp?isbn=$1',
+       'Amazon.fr'    => 'http://www.amazon.fr/exec/obidos/ISBN=$1',
+       'alapage.fr'   => 'http://www.alapage.com/mx/?tp=F&type=101&l_isbn=$1&donnee_appel=ALASQ&devise=&',
+       'fnac.com'     => 'http://www3.fnac.com/advanced/book.do?isbn=$1',
+       'chapitre.com' => 'http://www.chapitre.com/frame_rec.asp?isbn=$1',
 );
 
 $namespaceNames = array(
@@ -290,17 +290,17 @@ $magicWords = array(
 $linkTrail = '/^([a-zàâçéèêîœôû·’æäåāăëēïīòöōùü‘]+)(.*)$/sDu';
 
 $dateFormats = array(
-    'mdy time' => 'H:i',
-    'mdy date' => 'F j, Y',
-    'mdy both' => 'F j, Y "a" H:i',
+       'mdy time' => 'H:i',
+       'mdy date' => 'F j, Y',
+       'mdy both' => 'F j, Y "a" H:i',
 
-    'dmy time' => 'H:i',
-    'dmy date' => 'j F Y',
-    'dmy both' => 'j F Y "a" H:i',
+       'dmy time' => 'H:i',
+       'dmy date' => 'j F Y',
+       'dmy both' => 'j F Y "a" H:i',
 
-    'ymd time' => 'H:i',
-    'ymd date' => 'Y F j',
-    'ymd both' => 'Y F j "a" H:i',
+       'ymd time' => 'H:i',
+       'ymd date' => 'Y F j',
+       'ymd both' => 'Y F j "a" H:i',
 );
 
 $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
index 947e6b1..38e5b0a 100644 (file)
@@ -35,8 +35,8 @@ $namespaceAliases = array(
 );
 
 $namespaceGenderAliases = array(
-        NS_USER => array( 'male' => 'Wužiwar', 'female' => 'Wužiwarka' ),
-        NS_USER_TALK => array( 'male' => 'Diskusija_z_wužiwarjom', 'female' => 'Diskusija_z_wužiwarku' ),
+       NS_USER => array( 'male' => 'Wužiwar', 'female' => 'Wužiwarka' ),
+       NS_USER_TALK => array( 'male' => 'Diskusija_z_wužiwarjom', 'female' => 'Diskusija_z_wužiwarku' ),
 );
 
 $datePreferences = array(
index 3fcc4cc..a33efef 100644 (file)
@@ -106,8 +106,8 @@ $namespaceAliases = array(
 
        # Aliases to renamed kk-arab namespaces
        'مەدياۋيكي'        => NS_MEDIAWIKI,
-       'مەدياۋيكي_تالقىلاۋى'  => NS_MEDIAWIKI_TALK ,
-       'ٷلگٸ'        => NS_TEMPLATE ,
+       'مەدياۋيكي_تالقىلاۋى'  => NS_MEDIAWIKI_TALK,
+       'ٷلگٸ'        => NS_TEMPLATE,
        'ٷلگٸ_تالقىلاۋى'    => NS_TEMPLATE_TALK,
        'ٴۇلگٴى'              => NS_TEMPLATE,
        'ٴۇلگٴى_تالقىلاۋى'    => NS_TEMPLATE_TALK,
index 3e1b7ab..680c2ea 100644 (file)
@@ -77,8 +77,8 @@ $namespaceAliases = array(
 
        # Aliases to renamed kk-arab namespaces
        'مەدياۋيكي'        => NS_MEDIAWIKI,
-       'مەدياۋيكي_تالقىلاۋى'  => NS_MEDIAWIKI_TALK ,
-       'ٷلگٸ'        => NS_TEMPLATE ,
+       'مەدياۋيكي_تالقىلاۋى'  => NS_MEDIAWIKI_TALK,
+       'ٷلگٸ'        => NS_TEMPLATE,
        'ٷلگٸ_تالقىلاۋى'    => NS_TEMPLATE_TALK,
        'ٴۇلگٴى'              => NS_TEMPLATE,
        'ٴۇلگٴى_تالقىلاۋى'    => NS_TEMPLATE_TALK,
index 76aff5b..b7f8c6f 100644 (file)
@@ -72,8 +72,8 @@ $namespaceAliases = array(
 
        # Aliases to renamed kk-arab namespaces
        'مەدياۋيكي'        => NS_MEDIAWIKI,
-       'مەدياۋيكي_تالقىلاۋى'  => NS_MEDIAWIKI_TALK ,
-       'ٷلگٸ'        => NS_TEMPLATE ,
+       'مەدياۋيكي_تالقىلاۋى'  => NS_MEDIAWIKI_TALK,
+       'ٷلگٸ'        => NS_TEMPLATE,
        'ٷلگٸ_تالقىلاۋى'    => NS_TEMPLATE_TALK,
        'ٴۇلگٴى'              => NS_TEMPLATE,
        'ٴۇلگٴى_تالقىلاۋى'    => NS_TEMPLATE_TALK,
index 23cf2ba..ef0d72c 100644 (file)
@@ -206,6 +206,6 @@ $magicWords = array(
 );
 
 $imageFiles = array(
-    'button-italic'   => 'ksh/button_S_italic.png',
+       'button-italic'   => 'ksh/button_S_italic.png',
 );
 
index d5437da..85c0c26 100644 (file)
@@ -126,9 +126,9 @@ $defaultDateFormat = 'zh';
  * overridden.
  */
 $dateFormats = array(
-        'zh time' => 'H時i分',
-        'zh date' => 'Y年n月j日 (l)',
-        'zh both' => 'Y年n月j日 (D) H時i分',
+       'zh time' => 'H時i分',
+       'zh date' => 'Y年n月j日 (l)',
+       'zh both' => 'Y年n月j日 (D) H時i分',
 );
 
 $digitTransformTable = array(
index fdb33e4..49268f6 100644 (file)
@@ -70,7 +70,7 @@ $dateFormats = array(
 );
 
 $bookstoreList = array(
-        'Koninklijke Bibliotheek' => 'http://opc4.kb.nl/DB=1/SET=5/TTL=1/CMD?ACT=SRCH&IKT=1007&SRT=RLV&TRM=$1'
+       'Koninklijke Bibliotheek' => 'http://opc4.kb.nl/DB=1/SET=5/TTL=1/CMD?ACT=SRCH&IKT=1007&SRT=RLV&TRM=$1'
 );
 
 #!!# 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>.
index 5eaccf6..3c65610 100644 (file)
@@ -180,5 +180,5 @@ $magicWords = array(
 );
 
 $linkTrail = '/^((?:[a-z]|а|æ|б|в|г|д|е|ё|ж|з|и|й|к|л|м|н|о|п|р|с|т|у|ф|х|ц|ч|ш|щ|ъ|ы|ь|э|ю|я|“|»)+)(.*)$/sDu';
-$fallback8bitEncoding =  'windows-1251';
+$fallback8bitEncoding = 'windows-1251';
 
index 017b4d0..839a5de 100644 (file)
@@ -51,7 +51,7 @@ $namespaceNames = array(
 );
 
 $namespaceAliases = array(
-        # Aliases for Latin script namespaces
+       # Aliases for Latin script namespaces
        "Medija"                  => NS_MEDIA,
        "Posebno"                 => NS_SPECIAL,
        "Razgovor"                => NS_TALK,
index b359c26..0d64526 100644 (file)
@@ -304,7 +304,7 @@ $magicWords = array(
 );
 
 $linkTrail = '/^([a-zåäöéÅÄÖÉ]+)(.*)$/sDu';
-$separatorTransformTable =  array(
+$separatorTransformTable = array(
        ',' => "\xc2\xa0", // @bug 2749
        '.' => ','
 );
index bc26d31..49a8891 100644 (file)
@@ -34,18 +34,18 @@ $datePreferences = false;
 $defaultDateFormat = 'dmy';
 
 $dateFormats = array(
-        'mdy time' => 'H:i',
-        'mdy date' => 'M j, Y',
-        'mdy both' => 'H:i, M j, Y',
-        'dmy time' => 'H:i',
-        'dmy date' => 'j M Y',
-        'dmy both' => 'j M Y, H:i',
-        'ymd time' => 'H:i',
-        'ymd date' => 'Y M j',
-        'ymd both' => 'H:i, Y M j',
-        'ISO 8601 time' => 'xnH:xni:xns',
-        'ISO 8601 date' => 'xnY-xnm-xnd',
-        'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+       'mdy time' => 'H:i',
+       'mdy date' => 'M j, Y',
+       'mdy both' => 'H:i, M j, Y',
+       'dmy time' => 'H:i',
+       'dmy date' => 'j M Y',
+       'dmy both' => 'j M Y, H:i',
+       'ymd time' => 'H:i',
+       'ymd date' => 'Y M j',
+       'ymd both' => 'H:i, Y M j',
+       'ISO 8601 time' => 'xnH:xni:xns',
+       'ISO 8601 date' => 'xnY-xnm-xnd',
+       'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
 );
 
 $namespaceNames = array(
index 09b5590..8846f79 100644 (file)
@@ -45,18 +45,18 @@ $datePreferences = false;
 $defaultDateFormat = 'dmy';
 
 $dateFormats = array(
-        'mdy time' => 'H:i',
-        'mdy date' => 'M j, Y',
-        'mdy both' => 'H:i, M j, Y',
-        'dmy time' => 'H:i',
-        'dmy date' => 'j M Y',
-        'dmy both' => 'j M Y, H:i',
-        'ymd time' => 'H:i',
-        'ymd date' => 'Y M j',
-        'ymd both' => 'H:i, Y M j',
-        'ISO 8601 time' => 'xnH:xni:xns',
-        'ISO 8601 date' => 'xnY-xnm-xnd',
-        'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+       'mdy time' => 'H:i',
+       'mdy date' => 'M j, Y',
+       'mdy both' => 'H:i, M j, Y',
+       'dmy time' => 'H:i',
+       'dmy date' => 'j M Y',
+       'dmy both' => 'j M Y, H:i',
+       'ymd time' => 'H:i',
+       'ymd date' => 'Y M j',
+       'ymd both' => 'H:i, Y M j',
+       'ISO 8601 time' => 'xnH:xni:xns',
+       'ISO 8601 date' => 'xnY-xnm-xnd',
+       'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
 );
 
 $magicWords = array(
index 5cb6f5f..30bb6ad 100644 (file)
@@ -51,7 +51,7 @@ installations.
        edit.php
        Edit a page to change its content
 
-       findhooks.php
+       findHooks.php
        Find hooks that aren't documented in docs/hooks.txt
 
        importDump.php
@@ -60,9 +60,6 @@ installations.
        importImages.php
        Import images into the wiki
 
-       importTextFile.php
-       Import the contents of a text file into a wiki page
-
        moveBatch.php
        Move a batch of pages
 
diff --git a/maintenance/archives/patch-il_from_namespace.sql b/maintenance/archives/patch-il_from_namespace.sql
new file mode 100644 (file)
index 0000000..4c858f4
--- /dev/null
@@ -0,0 +1,4 @@
+ALTER TABLE /*_*/imagelinks
+  ADD COLUMN il_from_namespace int NOT NULL default 0;
+
+CREATE INDEX /*i*/il_backlinks_namespace ON /*_*/imagelinks (il_to,il_from_namespace,il_from);
\ No newline at end of file
diff --git a/maintenance/archives/patch-pl_from_namespace.sql b/maintenance/archives/patch-pl_from_namespace.sql
new file mode 100644 (file)
index 0000000..2f7ff04
--- /dev/null
@@ -0,0 +1,4 @@
+ALTER TABLE /*_*/pagelinks
+       ADD COLUMN pl_from_namespace int NOT NULL default 0;
+
+CREATE INDEX /*i*/pl_backlinks_namespace ON /*_*/pagelinks (pl_namespace,pl_title,pl_from_namespace,pl_from);
diff --git a/maintenance/archives/patch-tl_from_namespace.sql b/maintenance/archives/patch-tl_from_namespace.sql
new file mode 100644 (file)
index 0000000..8d6c76b
--- /dev/null
@@ -0,0 +1,4 @@
+ALTER TABLE /*_*/templatelinks
+       ADD COLUMN tl_from_namespace int NOT NULL default 0;
+
+CREATE INDEX /*i*/tl_backlinks_namespace ON /*_*/templatelinks (tl_namespace,tl_title,tl_from_namespace,tl_from);
index 93fe660..98441b6 100644 (file)
@@ -79,7 +79,7 @@ class CompareParserCache extends Maintenance {
 
                                $this->output( "Found cache entry found for '{$title->getPrefixedText()}'..." );
                                $oldHtml = trim( preg_replace( '#<!-- .+-->#Us', '', $parserOutputOld->getText() ) );
-                               $newHtml = trim( preg_replace( '#<!-- .+-->#Us', '',$parserOutputNew->getText() ) );
+                               $newHtml = trim( preg_replace( '#<!-- .+-->#Us', '', $parserOutputNew->getText() ) );
                                $diff = wfDiff( $oldHtml, $newHtml );
                                if ( strlen( $diff ) ) {
                                        $this->output( "differences found:\n\n$diff\n\n" );
index a07cbc2..3d30b83 100644 (file)
@@ -30,11 +30,13 @@ require_once __DIR__ . '/Maintenance.php';
 class DeleteEqualMessages extends Maintenance {
        public function __construct() {
                parent::__construct();
-               $this->mDescription = "Deletes all pages in the MediaWiki namespace that are equal to the default message";
+               $this->mDescription = "Deletes all pages in the MediaWiki namespace that are equal to '
+                       . 'the default message";
                $this->addOption( 'delete', 'Actually delete the pages (default: dry run)' );
                $this->addOption( 'delete-talk', 'Don\'t leave orphaned talk pages behind during deletion' );
-               $this->addOption( 'lang-code', 'Check for subpages of this language code (default: root page against content language). ' .
-                       'Use value "*" to run for all mwfile language code subpages (including the base pages that override content language).', false, true );
+               $this->addOption( 'lang-code', 'Check for subpages of this language code (default: root '
+                       . 'page against content language). Use value "*" to run for all mwfile language code '
+                       . 'subpages (including the base pages that override content language).', false, true );
        }
 
        /**
@@ -59,7 +61,8 @@ class DeleteEqualMessages extends Maintenance {
                // Normalise message names for NS_MEDIAWIKI page_title
                $messageNames = array_map( array( $wgContLang, 'ucfirst' ), $messageNames );
 
-               $statuses = AllMessagesTablePager::getCustomisedStatuses( $messageNames, $langCode, $nonContLang );
+               $statuses = AllMessagesTablePager::getCustomisedStatuses(
+                       $messageNames, $langCode, $nonContLang );
                // getCustomisedStatuses is stripping the sub page from the page titles, add it back
                $titleSuffix = $nonContLang ? "/$langCode" : '';
 
@@ -134,8 +137,10 @@ class DeleteEqualMessages extends Maintenance {
                        return;
                }
 
-               $this->output( "\n{$messageInfo['relevantPages']} pages in the MediaWiki namespace override messages." );
-               $this->output( "\n{$messageInfo['equalPages']} pages are equal to the default message (+ {$messageInfo['equalPagesTalks']} talk pages).\n" );
+               $this->output( "\n{$messageInfo['relevantPages']} pages in the MediaWiki namespace ' .
+                       'override messages." );
+               $this->output( "\n{$messageInfo['equalPages']} pages are equal to the default message ' .
+                       '(+ {$messageInfo['equalPagesTalks']} talk pages).\n" );
 
                if ( !$doDelete ) {
                        $list = '';
@@ -182,7 +187,8 @@ class DeleteEqualMessages extends Maintenance {
                                $this->output( "\n* [[$title]]" );
                                $page = WikiPage::factory( $title );
                                $error = ''; // Passed by ref
-                               $page->doDeleteArticle( 'Orphaned talk page of no longer required message', false, 0, false, $error, $user );
+                               $page->doDeleteArticle( 'Orphaned talk page of no longer required message',
+                                       false, 0, false, $error, $user );
                        }
                }
                $this->output( "\n\ndone!\n" );
index f555113..81bc06e 100644 (file)
@@ -1,10 +1,10 @@
-ænglisc
-ævar
 &add
 &amp
 &bar
+&img
 &sim
 &url
+&wap
 ABNF
 API
 Aacute
@@ -366,6 +366,7 @@ abusive
 ac
 acad
 accel
+acceptbilling
 acceptlang
 accessdenied
 accesskey
@@ -430,6 +431,7 @@ ai
 aifc
 aiff
 aiprop
+aisort
 ajaxwatch
 al
 alefsym
@@ -441,6 +443,7 @@ allcategories
 alldata
 alle
 allexamples
+allfileusages
 allhidden
 allimages
 allimit
@@ -458,6 +461,7 @@ allpagesbadtitle
 allpagesprefix
 allpagesredirect
 allpagessubmit
+allredirects
 allrev
 alltitles
 alltransclusions
@@ -470,6 +474,7 @@ alreadyexists
 alreadyrolled
 alunique
 am
+analyticsconfig
 anchor
 anchorclose
 anchorencode
@@ -589,6 +594,7 @@ autogen
 autogenerated
 autohide
 autoload
+autoload
 autoloader
 autoloaders
 autoloading
@@ -683,6 +689,7 @@ bgcolor
 bgzip
 bidi
 bigdelete
+bingbot
 binhex
 bitdepth
 bitfield
@@ -829,12 +836,14 @@ capitalizeallnouns
 captchaid
 captchas
 captchaword
+carriersnoips
 cascade
 cascadeable
 cascadeon
 cascadeprotected
 cascadeprotectedwarning
 cascading
+cascadinglevels
 cascadingness
 categories
 categories's
@@ -1107,6 +1116,7 @@ defaultcontentmodel
 defaultmessagetext
 defaultmissing
 defaultns
+defaultoptions
 defaultsort
 defaultval
 deferr
@@ -1167,6 +1177,7 @@ devangari
 devel
 df
 dflt
+dflts
 dhtml
 diams
 didn
@@ -1233,6 +1244,7 @@ domainpart
 domainparts
 domas
 doms
+dont
 dotdotcount
 dotm
 dotsc
@@ -1317,7 +1329,9 @@ eimissingparam
 eititle
 el
 elapsedreal
+elastica
 elemname
+elems
 elink
 eltitle
 email
@@ -1436,6 +1450,7 @@ externaldberror
 externaldiff
 externaledit
 externaleditor
+externalimages
 externallinks
 externalstore
 extet
@@ -1445,6 +1460,7 @@ extlinks
 extracts
 extradata
 extrafields
+extralanglink
 extraq
 extratags
 exturlusage
@@ -1515,6 +1531,7 @@ filepage
 filepath
 filerenameerror
 filerepo
+filerepoinfo
 filerevert
 filerevisions
 files
@@ -1553,6 +1570,7 @@ flagtype
 flatlist
 flds
 float
+flrevs
 fmttime
 fname
 fnof
@@ -1588,6 +1606,7 @@ found
 founder
 fr
 frac
+frameborder
 frameless
 framesets
 frasl
@@ -1624,12 +1643,15 @@ gadgetcategories
 gadgets
 gaid
 gaifilterredir
+gaifrom
 gallerybox
 gallerycaption
 gallerytext
 gapdir
 gapfilterredir
+gapfrom
 gaplimit
+gapnamespace
 gapprefix
 garber
 gblblock
@@ -1643,6 +1665,7 @@ general
 generatexml
 generator
 geocoordinate
+geodata
 geosearch
 gerrit
 getcookie
@@ -1681,6 +1704,7 @@ globe
 gmail
 gmdate
 goodtitle
+googlebot
 gopher
 graymap
 grayscale
@@ -1845,6 +1869,7 @@ image
 imagegetsize
 imageinfo
 imageinvalidfilename
+imagelimits
 imagelinks
 imagemagick
 imagemaxsize
@@ -1857,6 +1882,7 @@ imagesize
 imagetype
 imagetypemismatch
 imageusage
+imagewhitelistenabled
 imagick
 imgmultigo
 imgmultigoto
@@ -1928,6 +1954,7 @@ interwiki
 interwikimap
 interwikipage
 interwikis
+interwikisearchinfo
 interwikisource
 intnull
 intoken
@@ -1975,6 +2002,8 @@ ipchain
 ipedits
 iphash
 ipinrange
+ipset
+ipsets
 ipusers
 iquest
 irc
@@ -1986,12 +2015,14 @@ isconnected
 iscur
 isin
 isip
+islocal
 ismap
 isminor
 ismodsince
 ismulti
 isnew
 ispermalink
+isroot
 isself
 isset
 istainted
@@ -2037,6 +2068,7 @@ jslint
 jsmimetype
 jsminplus
 json
+jsonconfig
 jsonfm
 jsparse
 jstext
@@ -2055,6 +2087,7 @@ keyname
 keynames
 keytype
 khash
+kikongo
 kludgy
 knownnamespace
 konqueror
@@ -2070,11 +2103,13 @@ langcode
 langcodes
 langconversion
 langlinks
+langname
 langprop
 langs
 language
 languagelinks
 languages
+languageselection
 languageshtml
 laquo
 large
@@ -2135,6 +2170,7 @@ link
 linkarr
 linkcolour
 linkprefix
+linkprefixcharset
 links
 linkstoimage
 linktbl
@@ -2170,6 +2206,7 @@ localdayname
 localdow
 locale
 localhour
+localinterwiki
 localmonth
 localmonthabbrev
 localmonthname
@@ -2236,7 +2273,6 @@ ltitle
 ltrimmed
 lurl
 lysator
-möller
 macr
 magicarr
 magicfile
@@ -2290,12 +2326,14 @@ maxwidth
 mazeland
 mbresponse
 mbstring
+mccmnc
 mckey
 mcklmqw
 mcrypt
 mcvalue
 md
 mdash
+mdot
 medialink
 mediaqueries
 mediatype
@@ -2380,6 +2418,7 @@ mkdir
 mms
 mobile
 mobileformat
+mobilelanding
 mobileview
 modified
 modifiedarticleprotection
@@ -2437,6 +2476,7 @@ msgsmall
 msgtext
 msie
 msmetafile
+msnbot
 mssql
 msvideo
 msword
@@ -2481,10 +2521,13 @@ mysqldump
 mytalk
 mytext
 mywatchlist
+möller
 nabla
 name
 namehidden
 nameinlowercase
+namelookup
+namemsg
 names
 namespace
 namespacealiases
@@ -2780,6 +2823,7 @@ noto
 notoc
 notoggle
 notoken
+notpatrollable
 notransform
 notreviewable
 notrustworthy
@@ -2881,6 +2925,7 @@ oldtitle
 oldtitlemsg
 oline
 oname
+onerror
 onkeyup
 online
 onload
@@ -2891,6 +2936,7 @@ onlyquery
 onsubmit
 onthisday
 ontop
+onuser
 openbasedir
 opendoc
 opendocument
@@ -3110,12 +3156,14 @@ pptm
 pptx
 precaching
 precompiled
+preemptively
 preferences
 preferencestoken
 prefill
 prefilled
 prefix
 prefixindex
+prefixsearch
 prefixsearchdisabled
 prefs
 prefsection
@@ -3131,6 +3179,7 @@ preprocessing
 preprocessors
 presentationml
 presep
+pretransfer
 prevchar
 prevdiff
 previd
@@ -3194,6 +3243,7 @@ protecttoken
 proto
 protocol
 protocols
+protorel
 protos
 proxied
 proxyblocker
@@ -3216,6 +3266,7 @@ purged
 qabardjajəbza
 qbar
 qbsettings
+qlow
 qmoicj
 qp
 quasit
@@ -3234,6 +3285,7 @@ querytype
 question
 queuefull
 quickbar
+quicksorts
 quicktemplate
 quicktime
 qunit
@@ -3329,6 +3381,7 @@ redirectable
 redirectcreated
 redirectedfrom
 redirections
+redirector
 redirectpagesub
 redirectparams
 redirects
@@ -3343,6 +3396,7 @@ redis
 redlink
 redlinks
 redocument
+redux
 reedyboy
 reenables
 reencode
@@ -3380,6 +3434,8 @@ remstudent
 renameuser
 renaming
 renderable
+renderesibanner
+renderwarning
 renormalized
 repeating
 repl
@@ -3565,6 +3621,7 @@ selflink
 selfmove
 semiglobal
 semiprotected
+semiprotectedlevels
 semiprotectedpagewarning
 sendemail
 sendmail
@@ -3686,6 +3743,7 @@ smil
 smtp
 snippet
 sodipodi
+softredirect
 softtabstop
 solaris
 somecontent
@@ -3746,6 +3804,7 @@ startsortkey
 startsortkeyprefix
 starttime
 starttimestamp
+starttransfer
 stash
 stashfailed
 stashimageinfo
@@ -3895,8 +3954,8 @@ talkpagetext
 talkspace
 talkspacee
 talkto
-taraškievica
 tarask
+taraškievica
 target
 tb
 tbase
@@ -3963,6 +4022,7 @@ thumbheight
 thumbhtml
 thumbimage
 thumbinner
+thumblimits
 thumbmime
 thumbnail
 thumbnailing
@@ -4090,6 +4150,7 @@ udpprofile
 ufffd
 ugrave
 ui
+uids
 uint
 ulimit
 ulink
@@ -4115,6 +4176,8 @@ undel
 undelete
 undeleted
 undeletion
+undismissable
+undismissible
 undo
 undoafter
 undofailure
@@ -4156,6 +4219,7 @@ unprotect
 unprotectedarticle
 unprotection
 unprotectthispage
+unreadcount
 unredacted
 unrequest
 unrequested
@@ -4211,6 +4275,7 @@ uploadscripted
 uploadsource
 uploadstash
 uploadvirus
+uploadwarning
 uppercased
 upsih
 urandom
@@ -4504,7 +4569,6 @@ xmldoublequote
 xmlfm
 xmlimport
 xmlns
-xmlsafe
 xmlselect
 xor
 xpinstall
@@ -4517,6 +4581,7 @@ xxxxx
 yacute
 yaml
 yamlfm
+yandex
 year
 yes
 youhavenewmessages
@@ -4538,10 +4603,22 @@ yourvariant
 yourwiki
 yuml
 yyyymmddhhiiss
+zerobanner
+zerobar
+zerobutton
+zeroconfig
+zerodontask
+zerodot
+zeroinfo
+zeroportal
 zhdaemon
 zhengzhu
 zhtable
 zijdel
 zlib
 zoffset
+zrma
 zwnj
+ænglisc
+ævar
+świerkosz
index 47e6a89..28a0545 100644 (file)
@@ -77,17 +77,6 @@ if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
        # Use a callback function to configure MediaWiki
        call_user_func( MW_CONFIG_CALLBACK );
 } else {
-       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?
-               // @codingStandardsIgnoreStart MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
-               global $cluster;
-               $cluster = 'pmtpa';
-               // @codingStandardsIgnoreEnd
-               require "$IP/../wmf-config/wgConf.php";
-       }
        // Require the configuration (probably LocalSettings.php)
        require $maintenance->loadSettings();
 }
index 6bdb15d..75ec12b 100644 (file)
@@ -54,8 +54,6 @@ class EditCLI extends Maintenance {
                $noRC = $this->hasOption( 'no-rc' );
 
                $wgUser = User::newFromName( $userName );
-               $context = RequestContext::getMain();
-               $context->setUser( $wgUser );
                if ( !$wgUser ) {
                        $this->error( "Invalid username", true );
                }
@@ -67,7 +65,6 @@ class EditCLI extends Maintenance {
                if ( !$title ) {
                        $this->error( "Invalid title", true );
                }
-               $context->setTitle( $title );
 
                if ( $this->hasOption( 'nocreate' ) && !$title->exists() ) {
                        $this->error( "Page does not exist", true );
index 1c3f037..94ca604 100644 (file)
@@ -27,7 +27,7 @@ require_once __DIR__ . '/Maintenance.php';
 /**
  * Maintenance script to delete archived (non-current) files from storage.
  *
- * @TODO: Maybe add some simple logging
+ * @todo Maybe add some simple logging
  *
  * @ingroup Maintenance
  * @since 1.22
index a678a92..9568284 100644 (file)
@@ -96,7 +96,6 @@ class FixDoubleRedirects extends Maintenance {
                foreach ( $res as $row ) {
                        $titleA = Title::makeTitle( $row->pa_namespace, $row->pa_title );
                        $titleB = Title::makeTitle( $row->pb_namespace, $row->pb_title );
-                       RequestContext::getMain()->setTitle( $titleA );
 
                        $processedTitles .= "* [[$titleA]]\n";
 
index 83e731a..22d9940 100644 (file)
@@ -80,7 +80,8 @@ class GenerateJsonI18n extends Maintenance {
                        }
                        $this->output( "Searching for supplementary i18n files...\n" );
                        $dir_iterator = new RecursiveDirectoryIterator( dirname( $phpfile ) );
-                       $iterator = new RecursiveIteratorIterator( $dir_iterator, RecursiveIteratorIterator::LEAVES_ONLY );
+                       $iterator = new RecursiveIteratorIterator(
+                               $dir_iterator, RecursiveIteratorIterator::LEAVES_ONLY );
                        foreach ( $iterator as $path => $fileObject ) {
                                if ( fnmatch( "*.i18n.php", $fileObject->getFilename() ) ) {
                                        $this->output( "Converting $path.\n" );
index 1f7cbf5..1f75bcc 100644 (file)
@@ -141,8 +141,7 @@ TEXT;
                } elseif ( $obj instanceof WikiRevision ) {
                        $ns = $obj->title->getNamespace();
                } else {
-                       echo wfBacktrace();
-                       $this->error( "Cannot get namespace of object in " . __METHOD__, true );
+                       throw new MWException( "Cannot get namespace of object in " . __METHOD__ );
                }
 
                return is_array( $this->nsFilter ) && !in_array( $ns, $this->nsFilter );
@@ -182,7 +181,7 @@ TEXT;
        function handleUpload( $revision ) {
                if ( $this->uploads ) {
                        if ( $this->skippedNamespace( $revision ) ) {
-                               return;
+                               return false;
                        }
                        $this->uploadCount++;
                        // $this->report();
@@ -196,6 +195,8 @@ TEXT;
                                return $dbw->deadlockLoop( array( $revision, 'importUpload' ) );
                        }
                }
+
+               return false;
        }
 
        function handleLogItem( $rev ) {
diff --git a/maintenance/importTextFile.php b/maintenance/importTextFile.php
deleted file mode 100644 (file)
index f73dd1c..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-/**
- * Create or edit pages using the contents of a text file.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- * @author Rob Church <robchur@gmail.com>
- */
-
-$options = array( 'help', 'nooverwrite', 'norc' );
-$optionsWithArgs = array( 'title', 'user', 'comment' );
-require_once __DIR__ . '/commandLine.inc';
-echo "Import Text File\n\n";
-
-if ( count( $args ) < 1 || isset( $options['help'] ) ) {
-       showHelp();
-} else {
-
-       $filename = $args[0];
-       echo "Using {$filename}...";
-       if ( is_file( $filename ) ) {
-
-               $title = isset( $options['title'] ) ? $options['title'] : titleFromFilename( $filename );
-               $title = Title::newFromText( $title );
-
-               if ( is_object( $title ) ) {
-
-                       echo "\nUsing title '" . $title->getPrefixedText() . "'...";
-                       if ( !$title->exists() || !isset( $options['nooverwrite'] ) ) {
-                               RequestContext::getMain()->setTitle( $title );
-
-                               $text = file_get_contents( $filename );
-                               $user = isset( $options['user'] ) ? $options['user'] : 'Maintenance script';
-                               $user = User::newFromName( $user );
-
-                               if ( is_object( $user ) ) {
-
-                                       echo "\nUsing username '" . $user->getName() . "'...";
-                                       $wgUser =& $user;
-                                       $comment = isset( $options['comment'] ) ? $options['comment'] : 'Importing text file';
-                                       $flags = 0 | ( isset( $options['norc'] ) ? EDIT_SUPPRESS_RC : 0 );
-
-                                       echo "\nPerforming edit...";
-                                       $page = WikiPage::factory( $title );
-                                       $content = ContentHandler::makeContent( $text, $title );
-                                       $page->doEditContent( $content, $comment, $flags, false, $user );
-                                       echo "done.\n";
-                               } else {
-                                       echo "invalid username.\n";
-                               }
-                       } else {
-                               echo "page exists.\n";
-                       }
-               } else {
-                       echo "invalid title.\n";
-               }
-       } else {
-               echo "does not exist.\n";
-       }
-}
-
-function titleFromFilename( $filename ) {
-       $parts = explode( '/', $filename );
-       $parts = explode( '.', $parts[count( $parts ) - 1] );
-
-       return $parts[0];
-}
-
-function showHelp() {
-       print <<<EOF
-USAGE: php importTextFile.php <options> <filename>
-
-<filename> : Path to the file containing page content to import
-
-Options:
-
---title <title>
-       Title for the new page; default is to use the filename as a base
---user <user>
-       User to be associated with the edit
---comment <comment>
-       Edit summary
---nooverwrite
-       Don't overwrite existing content
---norc
-       Don't update recent changes
---help
-       Show this information
-
-EOF;
-}
index 3b29452..b948b67 100644 (file)
  * @ingroup Maintenance
  */
 
-if ( !function_exists( 'version_compare' ) || ( version_compare( PHP_VERSION, '5.3.2' ) < 0 ) ) {
-       require_once dirname( __FILE__ ) . '/../includes/PHPVersionError.php';
-       wfPHPVersionError( 'cli' );
-}
+// Checking for old versions of PHP is done in Maintenance.php
+// We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
+require_once dirname( __FILE__ ) . '/Maintenance.php';
 
 define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
 define( 'MEDIAWIKI_INSTALL', true );
 
-require_once dirname( __DIR__ ) . '/maintenance/Maintenance.php';
-
 /**
  * Maintenance script to install and configure MediaWiki
  *
- * Default values for the options are defined in DefaultSettings.php (see the mapping in CliInstaller.php)
+ * Default values for the options are defined in DefaultSettings.php
+ * (see the mapping in CliInstaller.php)
  * Default for --dbpath (SQLite-specific) is defined in SqliteInstaller::getGlobalDefaults
  *
  * @ingroup Maintenance
@@ -85,9 +83,11 @@ class CommandLineInstaller extends Maintenance {
                        true
                );
                $this->addOption( 'confpath', "Path to write LocalSettings.php to ($IP)", false, true );
-               $this->addOption( 'dbschema', 'The schema for the MediaWiki DB in PostgreSQL/Microsoft SQL Server (mediawiki)', false, true );
+               $this->addOption( 'dbschema', 'The schema for the MediaWiki DB in '
+                       . 'PostgreSQL/Microsoft SQL Server (mediawiki)', false, true );
                /*
-               $this->addOption( 'namespace', 'The project namespace (same as the "name" argument)', false, true );
+               $this->addOption( 'namespace', 'The project namespace (same as the "name" argument)',
+                       false, true );
                */
                $this->addOption( 'env-checks', "Run environment checks only, don't change anything" );
        }
index 2bb5e6b..db6c315 100644 (file)
@@ -365,7 +365,7 @@ class UcdXmlReader {
                $xml = $this->open();
                $this->callback = $callback;
 
-               while ( $xml->name !== 'repertoire' && $xml->next() ) ;
+               while ( $xml->name !== 'repertoire' && $xml->next() );
 
                while ( $xml->read() ) {
                        if ( $xml->nodeType == XMLReader::ELEMENT ) {
@@ -389,7 +389,7 @@ class UcdXmlReader {
                if ( !$this->xml ) {
                        throw new MWException( __METHOD__ . ": unable to open {$this->fileName}" );
                }
-               while ( $this->xml->name !== 'ucd' && $this->xml->read() ) ;
+               while ( $this->xml->name !== 'ucd' && $this->xml->read() );
                $this->xml->read();
 
                return $this->xml;
@@ -450,7 +450,7 @@ class UcdXmlReader {
                }
 
                $xml = $this->open();
-               while ( $xml->name !== 'blocks' && $xml->read() ) ;
+               while ( $xml->name !== 'blocks' && $xml->read() );
 
                while ( $xml->read() ) {
                        if ( $xml->nodeType == XMLReader::ELEMENT ) {
diff --git a/maintenance/populateBacklinkNamespace.php b/maintenance/populateBacklinkNamespace.php
new file mode 100644 (file)
index 0000000..271a3f6
--- /dev/null
@@ -0,0 +1,93 @@
+<?php
+/**
+ * Optional upgrade script to populate *_from_namespace fields
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script to populate *_from_namespace fields
+ *
+ * @ingroup Maintenance
+ */
+class PopulateBacklinkNamespace extends LoggedUpdateMaintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Populate the *_from_namespace fields";
+       }
+
+       protected function getUpdateKey() {
+               return 'populate *_from_namespace';
+       }
+
+       protected function updateSkippedMessage() {
+               return '*_from_namespace column of backlink tables already populated.';
+       }
+
+       public function doDBUpdates() {
+               $force = $this->getOption( 'force' );
+
+               $db = $this->getDB( DB_MASTER );
+
+               $this->output( "Updating *_from_namespace fields in links tables.\n" );
+
+               $start = $db->selectField( 'page', 'MIN(page_id)', false, __METHOD__ );
+               if ( !$start ) {
+                       $this->output( "Nothing to do." );
+                       return false;
+               }
+               $end = $db->selectField( 'page', 'MAX(page_id)', false, __METHOD__ );
+
+               # Do remaining chunk
+               $end += $this->mBatchSize - 1;
+               $blockStart = $start;
+               $blockEnd = $start + $this->mBatchSize - 1;
+               while ( $blockEnd <= $end ) {
+                       $this->output( "...doing page_id from $blockStart to $blockEnd\n" );
+                       $cond = "page_id BETWEEN $blockStart AND $blockEnd";
+                       $res = $db->select( 'page', array( 'page_id', 'page_namespace' ), $cond, __METHOD__ );
+                       foreach ( $res as $row ) {
+                               $db->update( 'pagelinks',
+                                       array( 'pl_from_namespace' => $row->page_namespace ),
+                                       array( 'pl_from' => $row->page_id ),
+                                       __METHOD__
+                               );
+                               $db->update( 'templatelinks',
+                                       array( 'tl_from_namespace' => $row->page_namespace ),
+                                       array( 'tl_from' => $row->page_id ),
+                                       __METHOD__
+                               );
+                               $db->update( 'imagelinks',
+                                       array( 'il_from_namespace' => $row->page_namespace ),
+                                       array( 'il_from' => $row->page_id ),
+                                       __METHOD__
+                               );
+                       }
+                       $blockStart += $this->mBatchSize - 1;
+                       $blockEnd += $this->mBatchSize - 1;
+                       wfWaitForSlaves();
+               }
+               return true;
+       }
+}
+
+$maintClass = "PopulateBacklinkNamespace";
+require_once RUN_MAINTENANCE_IF_MAIN;
index cf35fe8..400050e 100644 (file)
@@ -206,6 +206,7 @@ CREATE INDEX redirect_ns_title ON redirect (rd_namespace,rd_title,rd_from);
 
 CREATE TABLE pagelinks (
   pl_from       INTEGER   NOT NULL  REFERENCES page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+  pl_from_namespace INTEGER NOT NULL DEFAULT 0,
   pl_namespace  SMALLINT  NOT NULL,
   pl_title      TEXT      NOT NULL
 );
@@ -214,6 +215,7 @@ CREATE INDEX pagelinks_title ON pagelinks (pl_title);
 
 CREATE TABLE templatelinks (
   tl_from       INTEGER  NOT NULL  REFERENCES page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+  tl_from_namespace INTEGER NOT NULL DEFAULT 0,
   tl_namespace  SMALLINT NOT NULL,
   tl_title      TEXT     NOT NULL
 );
@@ -222,6 +224,7 @@ CREATE INDEX templatelinks_from          ON templatelinks (tl_from);
 
 CREATE TABLE imagelinks (
   il_from  INTEGER  NOT NULL  REFERENCES page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+  il_from_namespace INTEGER NOT NULL DEFAULT 0,
   il_to    TEXT     NOT NULL
 );
 CREATE UNIQUE INDEX il_from ON imagelinks (il_to,il_from);
index f0b6ec7..4ce9474 100644 (file)
@@ -160,7 +160,7 @@ class PurgeChangedPages extends Maintenance {
         * If this returns an empty array for a non-empty query result, then all the rows
         * had the same column value and the query should be repeated with a higher LIMIT.
         *
-        * @TODO: move this elsewhere
+        * @todo move this elsewhere
         *
         * @param ResultWrapper $res Query result sorted by $column (ascending)
         * @param string $column
index e1ccb46..1b35292 100755 (executable)
@@ -9,12 +9,12 @@ then
        exit 1
 fi
 
-TARGET_REPO=$(cd $(dirname $0)/../..; pwd)
+TARGET_REPO=$(cd "$(dirname $0)/../.."; pwd)
 TARGET_DIR=resources/lib/oojs-ui
 UI_REPO=$1
 
 function oojsuihash() {
-       grep "OOjs UI v" $TARGET_REPO/$TARGET_DIR/oojs-ui.js \
+       grep "OOjs UI v" "$TARGET_REPO/$TARGET_DIR/oojs-ui.js" \
                | head -n 1 \
                | grep -Eo '\([a-z0-9]+\)' \
                | sed 's/^(//' \
@@ -22,19 +22,19 @@ function oojsuihash() {
 }
 
 function oojsuitag() {
-       grep "OOjs UI v" $TARGET_REPO/$TARGET_DIR/oojs-ui.js \
+       grep "OOjs UI v" "$TARGET_REPO/$TARGET_DIR/oojs-ui.js" \
                | head -n 1 \
                | grep -Eo '\bv[0-9a-z.-]+\b'
 }
 
 function oojsuiversion() {
-       grep "OOjs UI v" $TARGET_REPO/$TARGET_DIR/oojs-ui.js \
+       grep "OOjs UI v" "$TARGET_REPO/$TARGET_DIR/oojs-ui.js" \
                | head -n 1 \
                | grep -Eo '\bv[0-9a-z.-]+\b.*$'
 }
 
 # Prepare working tree
-cd $TARGET_REPO &&
+cd "$TARGET_REPO" &&
 git reset $TARGET_DIR && git checkout $TARGET_DIR && git fetch origin &&
 git checkout -B upstream-oojsui origin/master || exit 1
 
@@ -48,10 +48,10 @@ then
 fi
 if [ "$OLDHASH" == "" ]
 then
-       OLDHASH=$(git rev-parse $OLDTAG)
+       OLDHASH=$(git rev-parse "$OLDTAG")
        if [ $? != 0 ]
        then
-               echo Could not find OOjs UI version
+               echo "Could not find OOjs UI version"
                cd -
                exit 1
        fi
@@ -72,13 +72,13 @@ NEWCHANGESDISPLAY=$(git log $OLDHASH.. --oneline --no-merges --reverse --color=a
 
 # Copy files
 # - Exclude the default non-svg stylesheet
-rsync --recursive --delete --force --exclude 'oojs-ui.css' --exclude 'oojs-ui*.rtl.css' ./dist/ $TARGET_REPO/$TARGET_DIR || exit 1
+rsync --recursive --delete --force --exclude 'oojs-ui.css' --exclude 'oojs-ui*.rtl.css' ./dist/ "$TARGET_REPO/$TARGET_DIR" || exit 1
 
 # Read the new version
 NEWVERSION=$(oojsuiversion)
 
 # Generate commit
-cd $TARGET_REPO
+cd "$TARGET_REPO"
 COMMITMSG=$(cat <<END
 Update OOjs UI to $NEWVERSION
 
index 2c50002..d9e6fb9 100755 (executable)
@@ -7,12 +7,12 @@ then
        exit 1
 fi
 
-REPO_DIR=$(cd $(dirname $0)/../..; pwd) # Root dir of the git repo working tree
-TARGET_DIR=resources/lib/oojs # Destination relative to the root of the repo
-NPM_DIR=`mktemp -d 2>/dev/null || mktemp -d -t 'update-oojs'` # e.g. /tmp/update-oojs.rI0I5Vir
+REPO_DIR=$(cd "$(dirname $0)/../.."; pwd) # Root dir of the git repo working tree
+TARGET_DIR="resources/lib/oojs" # Destination relative to the root of the repo
+NPM_DIR=$(mktemp -d 2>/dev/null || mktemp -d -t 'update-oojs') # e.g. /tmp/update-oojs.rI0I5Vir
 
 # Prepare working tree
-cd $REPO_DIR &&
+cd "$REPO_DIR" &&
 git reset $TARGET_DIR && git checkout $TARGET_DIR && git fetch origin &&
 git checkout -B upstream-oojs origin/master || exit 1
 
@@ -20,7 +20,7 @@ git checkout -B upstream-oojs origin/master || exit 1
 cd $NPM_DIR
 if [ -n "$1" ]
 then
-       npm install oojs@$1 || exit 1
+       npm install "oojs@$1" || exit 1
 else
        npm install oojs || exit 1
 fi
@@ -33,10 +33,10 @@ then
 fi
 
 # Copy file(s)
-rsync --recursive --delete --force ./node_modules/oojs/dist $REPO_DIR/$TARGET_DIR || exit 1
+rsync --force ./node_modules/oojs/dist/oojs.jquery.js "$REPO_DIR/$TARGET_DIR" || exit 1
 
 # Clean up temporary area
-rm -rf $NPM_DIR
+rm -rf "$NPM_DIR"
 
 # Generate commit
 cd $REPO_DIR || exit 1
index 423ae61..40605ce 100644 (file)
@@ -37,6 +37,7 @@ class RunJobs extends Maintenance {
                $this->addOption( 'type', 'Type of job to run', false, true );
                $this->addOption( 'procs', 'Number of processes to use', false, true );
                $this->addOption( 'nothrottle', 'Ignore job throttling configuration', false, false );
+               $this->addOption( 'result', 'Set to JSON to print only a JSON response', false, true );
        }
 
        public function memoryLimit() {
@@ -65,214 +66,28 @@ class RunJobs extends Maintenance {
                        }
                }
 
-               $type = $this->getOption( 'type', false );
-               $maxJobs = $this->getOption( 'maxjobs', false );
-               $maxTime = $this->getOption( 'maxtime', false );
-               $noThrottle = $this->hasOption( 'nothrottle' );
-               $startTime = time();
+               $json = ( $this->getOption( 'result' ) === 'json' );
 
-               $group = JobQueueGroup::singleton();
-               // Handle any required periodic queue maintenance
-               $count = $group->executeReadyPeriodicTasks();
-               if ( $count > 0 ) {
-                       $this->runJobsLog( "Executed $count periodic queue task(s)." );
+               $runner = new JobRunner();
+               if ( !$json ) {
+                       $runner->setDebugHandler( array( $this, 'debugInternal' ) );
                }
-
-               $backoffs = $this->loadBackoffs(); // map of (type => UNIX expiry)
-               $startingBackoffs = $backoffs; // avoid unnecessary writes
-               $backoffExpireFunc = function ( $t ) {
-                       return $t > time();
-               };
-
-               $jobsRun = 0; // counter
-               $flags = JobQueueGroup::USE_CACHE;
-               $lastTime = time(); // time since last slave check
-               do {
-                       $backoffs = array_filter( $backoffs, $backoffExpireFunc );
-                       $blacklist = $noThrottle ? array() : array_keys( $backoffs );
-                       if ( $type === false ) {
-                               $job = $group->pop( JobQueueGroup::TYPE_DEFAULT, $flags, $blacklist );
-                       } elseif ( in_array( $type, $blacklist ) ) {
-                               $job = false; // requested queue in backoff state
-                       } else {
-                               $job = $group->pop( $type ); // job from a single queue
-                       }
-                       if ( $job ) { // found a job
-                               ++$jobsRun;
-                               $this->runJobsLog( $job->toString() . " STARTING" );
-
-                               // Run the job...
-                               wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
-                               $t = microtime( true );
-                               try {
-                                       $status = $job->run();
-                                       $error = $job->getLastError();
-                               } catch ( MWException $e ) {
-                                       MWExceptionHandler::rollbackMasterChangesAndLog( $e );
-                                       $status = false;
-                                       $error = get_class( $e ) . ': ' . $e->getMessage();
-                                       $e->report(); // write error to STDERR and the log
-                               }
-                               $timeMs = intval( ( microtime( true ) - $t ) * 1000 );
-                               wfProfileOut( __METHOD__ . '-' . get_class( $job ) );
-
-                               // Mark the job as done on success or when the job cannot be retried
-                               if ( $status !== false || !$job->allowRetries() ) {
-                                       $group->ack( $job ); // done
-                               }
-
-                               if ( $status === false ) {
-                                       $this->runJobsLog( $job->toString() . " t=$timeMs error={$error}" );
-                               } else {
-                                       $this->runJobsLog( $job->toString() . " t=$timeMs good" );
-                               }
-
-                               // Back off of certain jobs for a while (for throttling and for errors)
-                               $ttw = $this->getBackoffTimeToWait( $job );
-                               if ( $status === false && mt_rand( 0, 49 ) == 0 ) {
-                                       $ttw = max( $ttw, 30 );
-                               }
-                               if ( $ttw > 0 ) {
-                                       $jType = $job->getType();
-                                       $backoffs[$jType] = isset( $backoffs[$jType] ) ? $backoffs[$jType] : 0;
-                                       $backoffs[$jType] = max( $backoffs[$jType], time() + $ttw );
-                               }
-
-                               // Break out if we hit the job count or wall time limits...
-                               if ( $maxJobs && $jobsRun >= $maxJobs ) {
-                                       break;
-                               } elseif ( $maxTime && ( time() - $startTime ) > $maxTime ) {
-                                       break;
-                               }
-
-                               // Don't let any of the main DB slaves get backed up
-                               $timePassed = time() - $lastTime;
-                               if ( $timePassed >= 5 || $timePassed < 0 ) {
-                                       wfWaitForSlaves();
-                                       $lastTime = time();
-                               }
-                               // Don't let any queue slaves/backups fall behind
-                               if ( $jobsRun > 0 && ( $jobsRun % 100 ) == 0 ) {
-                                       $group->waitForBackups();
-                               }
-
-                               // Bail if near-OOM instead of in a job
-                               $this->assertMemoryOK();
-                       }
-               } while ( $job ); // stop when there are no jobs
-               // Sync the persistent backoffs for the next runJobs.php pass
-               $backoffs = array_filter( $backoffs, $backoffExpireFunc );
-               if ( $backoffs !== $startingBackoffs ) {
-                       $this->syncBackoffs( $backoffs );
-               }
-       }
-
-       /**
-        * @param Job $job
-        * @return int Seconds for this runner to avoid doing more jobs of this type
-        * @see $wgJobBackoffThrottling
-        */
-       private function getBackoffTimeToWait( Job $job ) {
-               global $wgJobBackoffThrottling;
-
-               if ( !isset( $wgJobBackoffThrottling[$job->getType()] ) ||
-                       $job instanceof DuplicateJob // no work was done
-               ) {
-                       return 0; // not throttled
-               }
-
-               $itemsPerSecond = $wgJobBackoffThrottling[$job->getType()];
-               if ( $itemsPerSecond <= 0 ) {
-                       return 0; // not throttled
-               }
-
-               $seconds = 0;
-               if ( $job->workItemCount() > 0 ) {
-                       $exactSeconds = $job->workItemCount() / $itemsPerSecond;
-                       // use randomized rounding
-                       $seconds = floor( $exactSeconds );
-                       $remainder = $exactSeconds - $seconds;
-                       $seconds += ( mt_rand() / mt_getrandmax() < $remainder ) ? 1 : 0;
-               }
-
-               return (int)$seconds;
-       }
-
-       /**
-        * Get the previous backoff expiries from persistent storage
-        *
-        * @return array Map of (job type => backoff expiry timestamp)
-        */
-       private function loadBackoffs() {
-               $section = new ProfileSection( __METHOD__ );
-
-               $backoffs = array();
-               $file = wfTempDir() . '/mw-runJobs-backoffs.json';
-               if ( is_file( $file ) ) {
-                       $handle = fopen( $file, 'rb' );
-                       flock( $handle, LOCK_SH );
-                       $content = stream_get_contents( $handle );
-                       flock( $handle, LOCK_UN );
-                       fclose( $handle );
-                       $backoffs = json_decode( $content, true ) ? : array();
-               }
-
-               return $backoffs;
-       }
-
-       /**
-        * Merge the current backoff expiries from persistent storage
-        *
-        * @param array $backoffs Map of (job type => backoff expiry timestamp)
-        */
-       private function syncBackoffs( array $backoffs ) {
-               $section = new ProfileSection( __METHOD__ );
-
-               $file = wfTempDir() . '/mw-runJobs-backoffs.json';
-               $handle = fopen( $file, 'wb+' );
-               flock( $handle, LOCK_EX );
-               $content = stream_get_contents( $handle );
-               $cBackoffs = json_decode( $content, true ) ? : array();
-               foreach ( $backoffs as $type => $timestamp ) {
-                       $cBackoffs[$type] = isset( $cBackoffs[$type] ) ? $cBackoffs[$type] : 0;
-                       $cBackoffs[$type] = max( $cBackoffs[$type], $backoffs[$type] );
-               }
-               ftruncate( $handle, 0 );
-               fwrite( $handle, json_encode( $backoffs ) );
-               flock( $handle, LOCK_UN );
-               fclose( $handle );
-       }
-
-       /**
-        * Make sure that this script is not too close to the memory usage limit.
-        * It is better to die in between jobs than OOM right in the middle of one.
-        * @throws MWException
-        */
-       private function assertMemoryOK() {
-               static $maxBytes = null;
-               if ( $maxBytes === null ) {
-                       $m = array();
-                       if ( preg_match( '!^(\d+)(k|m|g|)$!i', ini_get( 'memory_limit' ), $m ) ) {
-                               list( , $num, $unit ) = $m;
-                               $conv = array( 'g' => 1073741824, 'm' => 1048576, 'k' => 1024, '' => 1 );
-                               $maxBytes = $num * $conv[strtolower( $unit )];
-                       } else {
-                               $maxBytes = 0;
-                       }
-               }
-               $usedBytes = memory_get_usage();
-               if ( $maxBytes && $usedBytes >= 0.95 * $maxBytes ) {
-                       throw new MWException( "Detected excessive memory usage ($usedBytes/$maxBytes)." );
+               $response = $runner->run( array(
+                       'type'     => $this->getOption( 'type', false ),
+                       'maxJobs'  => $this->getOption( 'maxjobs', false ),
+                       'maxTime'  => $this->getOption( 'maxtime', false ),
+                       'throttle' => $this->hasOption( 'nothrottle' ) ? false : true,
+               ) );
+               if ( $json ) {
+                       $this->output( FormatJson::encode( $response, true ) );
                }
        }
 
        /**
-        * Log the job message
-        * @param string $msg The message to log
+        * @param string $s
         */
-       private function runJobsLog( $msg ) {
-               $this->output( wfTimestamp( TS_DB ) . " $msg\n" );
-               wfDebugLog( 'runJobs', $msg );
+       public function debugInternal( $s ) {
+               $this->output( $s );
        }
 }
 
index 6f200b2..4b9a5e2 100644 (file)
@@ -473,6 +473,8 @@ CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id);
 CREATE TABLE /*_*/pagelinks (
   -- Key to the page_id of the page containing the link.
   pl_from int unsigned NOT NULL default 0,
+  -- Namespace for this page
+  pl_from_namespace int NOT NULL default 0,
 
   -- Key to page_namespace/page_title of the target page.
   -- The target page may or may not exist, and due to renames
@@ -483,7 +485,8 @@ CREATE TABLE /*_*/pagelinks (
 ) /*$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 INDEX /*i*/pl_namespace ON /*_*/pagelinks (pl_namespace,pl_title,pl_from);
+CREATE INDEX /*i*/pl_backlinks_namespace ON /*_*/pagelinks (pl_namespace,pl_title,pl_from_namespace,pl_from);
 
 
 --
@@ -492,6 +495,8 @@ CREATE UNIQUE INDEX /*i*/pl_namespace ON /*_*/pagelinks (pl_namespace,pl_title,p
 CREATE TABLE /*_*/templatelinks (
   -- Key to the page_id of the page containing the link.
   tl_from int unsigned NOT NULL default 0,
+  -- Namespace for this page
+  tl_from_namespace int NOT NULL default 0,
 
   -- Key to page_namespace/page_title of the target page.
   -- The target page may or may not exist, and due to renames
@@ -502,7 +507,8 @@ CREATE TABLE /*_*/templatelinks (
 ) /*$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 INDEX /*i*/tl_namespace ON /*_*/templatelinks (tl_namespace,tl_title,tl_from);
+CREATE INDEX /*i*/tl_backlinks_namespace ON /*_*/templatelinks (tl_namespace,tl_title,tl_from_namespace,tl_from);
 
 
 --
@@ -513,6 +519,8 @@ CREATE UNIQUE INDEX /*i*/tl_namespace ON /*_*/templatelinks (tl_namespace,tl_tit
 CREATE TABLE /*_*/imagelinks (
   -- Key to page_id of the page containing the image / media link.
   il_from int unsigned NOT NULL default 0,
+  -- Namespace for this page
+  il_from_namespace int NOT NULL default 0,
 
   -- Filename of target image.
   -- This is also the page_title of the file's description page;
@@ -521,7 +529,8 @@ CREATE TABLE /*_*/imagelinks (
 ) /*$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 INDEX /*i*/il_to ON /*_*/imagelinks (il_to,il_from);
+CREATE INDEX /*i*/il_backlinks_namespace ON /*_*/imagelinks (il_to,il_from_namespace,il_from);
 
 
 --
diff --git a/maintenance/wrapOldPasswords.php b/maintenance/wrapOldPasswords.php
new file mode 100644 (file)
index 0000000..37272a0
--- /dev/null
@@ -0,0 +1,126 @@
+<?php
+/**
+ * Maintenance script to wrap all old-style passwords in a layered type
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script to wrap all passwords of a certain type in a specified layered
+ * type that wraps around the old type.
+ *
+ * @since 1.24
+ * @ingroup Maintenance
+ */
+class WrapOldPasswords extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Wrap all passwords of a certain type in a new layered type";
+               $this->addOption( 'type',
+                       'Password type to wrap passwords in (must inherit LayeredParameterizedPassword)', true, true );
+               $this->addOption( 'verbose', 'Enables verbose output', false, false, 'v' );
+               $this->setBatchSize( 100 );
+       }
+
+       public function execute() {
+               global $wgAuth;
+
+               if ( !$wgAuth->allowSetLocalPassword() ) {
+                       $this->error( '$wgAuth does not allow local passwords. Aborting.', true );
+               }
+
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+
+               $typeInfo = $passwordFactory->getTypes();
+               $layeredType = $this->getOption( 'type' );
+
+               // Check that type exists and is a layered type
+               if ( !isset( $typeInfo[$layeredType] ) ) {
+                       $this->error( 'Undefined password type', true );
+               }
+
+               $passObj = $passwordFactory->newFromType( $layeredType );
+               if ( !$passObj instanceof LayeredParameterizedPassword ) {
+                       $this->error( 'Layered parameterized password type must be used.', true );
+               }
+
+               // Extract the first layer type
+               $typeConfig = $typeInfo[$layeredType];
+               $firstType = $typeConfig['types'][0];
+
+               // Get a list of password types that are applicable
+               $dbw = $this->getDB( DB_MASTER );
+               $typeCond = 'user_password' . $dbw->buildLike( ":$firstType:", $dbw->anyString() );
+
+               $minUserId = 0;
+               do {
+                       $dbw->begin();
+
+                       $res = $dbw->select( 'user',
+                               array( 'user_id', 'user_name', 'user_password' ),
+                               array(
+                                       'user_id > ' . $dbw->addQuotes( $minUserId ),
+                                       $typeCond
+                               ),
+                               __METHOD__,
+                               array(
+                                       'ORDER BY' => 'user_id',
+                                       'LIMIT' => $this->mBatchSize,
+                                       'LOCK IN SHARE MODE',
+                               )
+                       );
+
+                       /** @var User[] $updateUsers */
+                       $updateUsers = array();
+                       foreach ( $res as $row ) {
+                               if ( $this->hasOption( 'verbose' ) ) {
+                                       $this->output( "Updating password for user {$row->user_name} ({$row->user_id}).\n" );
+                               }
+
+                               $user = User::newFromId( $row->user_id );
+                               /** @var ParameterizedPassword $password */
+                               $password = $passwordFactory->newFromCiphertext( $row->user_password );
+                               /** @var LayeredParameterizedPassword $layeredPassword */
+                               $layeredPassword = $passwordFactory->newFromType( $layeredType );
+                               $layeredPassword->partialCrypt( $password );
+
+                               $updateUsers[] = $user;
+                               $dbw->update( 'user',
+                                       array( 'user_password' => $layeredPassword->toString() ),
+                                       array( 'user_id' => $row->user_id ),
+                                       __METHOD__
+                               );
+
+                               $minUserId = $row->user_id;
+                       }
+
+                       $dbw->commit();
+
+                       // Clear memcached so old passwords are wiped out
+                       foreach ( $updateUsers as $user ) {
+                               $user->clearSharedCache();
+                       }
+               } while ( $res->numRows() );
+       }
+}
+
+$maintClass = "WrapOldPasswords";
+require_once RUN_MAINTENANCE_IF_MAIN;
index be176c7..a6cebc3 100644 (file)
@@ -44,7 +44,7 @@ function wfInstallerMain() {
 
        if ( !$installer->startSession() ) {
 
-               if( $installer->request->getVal( "css" ) ) {
+               if ( $installer->request->getVal( "css" ) ) {
                        // Do not display errors on css pages
                        $installer->outputCss();
                        exit;
index 7f80832..d3f8f7d 100644 (file)
@@ -113,7 +113,6 @@ return array(
                // skin over-rides common content styling.
                'skinStyles' => array(
                        'default' => 'resources/src/mediawiki.skinning/content.parsoid.less',
-                       'minerva' => array(),
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
@@ -329,10 +328,6 @@ return array(
                                'resources/lib/jquery.ui/themes/smoothness/jquery.ui.core.css',
                                'resources/lib/jquery.ui/themes/smoothness/jquery.ui.theme.css',
                        ),
-                       'vector' => array(
-                               'resources/src/jquery.ui-themes/vector/jquery.ui.core.css',
-                               'resources/src/jquery.ui-themes/vector/jquery.ui.theme.css',
-                       ),
                ),
                'group' => 'jquery.ui',
        ),
@@ -344,7 +339,6 @@ return array(
                ),
                'skinStyles' => array(
                        'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.accordion.css',
-                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.accordion.css',
                ),
                'group' => 'jquery.ui',
        ),
@@ -358,7 +352,6 @@ return array(
                ),
                'skinStyles' => array(
                        'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.autocomplete.css',
-                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.autocomplete.css',
                ),
                'group' => 'jquery.ui',
        ),
@@ -370,7 +363,6 @@ return array(
                ),
                'skinStyles' => array(
                        'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.button.css',
-                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.button.css',
                ),
                'group' => 'jquery.ui',
        ),
@@ -379,7 +371,6 @@ return array(
                'dependencies' => 'jquery.ui.core',
                'skinStyles' => array(
                        'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.datepicker.css',
-                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.datepicker.css',
                ),
                'languageScripts' => array(
                        'af' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-af.js',
@@ -465,7 +456,6 @@ return array(
                ),
                'skinStyles' => array(
                        'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.dialog.css',
-                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.dialog.css',
                ),
                'group' => 'jquery.ui',
        ),
@@ -517,7 +507,6 @@ return array(
                ),
                'skinStyles' => array(
                        'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.progressbar.css',
-                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.progressbar.css',
                ),
                'group' => 'jquery.ui',
        ),
@@ -530,7 +519,6 @@ return array(
                ),
                'skinStyles' => array(
                        'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.resizable.css',
-                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.resizable.css',
                ),
                'group' => 'jquery.ui',
        ),
@@ -543,7 +531,6 @@ return array(
                ),
                'skinStyles' => array(
                        'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.selectable.css',
-                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.selectable.css',
                ),
                'group' => 'jquery.ui',
        ),
@@ -556,7 +543,6 @@ return array(
                ),
                'skinStyles' => array(
                        'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.slider.css',
-                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.slider.css',
                ),
                'group' => 'jquery.ui',
        ),
@@ -589,7 +575,6 @@ return array(
                ),
                'skinStyles' => array(
                        'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.tabs.css',
-                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.tabs.css',
                ),
                'group' => 'jquery.ui',
        ),
@@ -1049,6 +1034,7 @@ return array(
        'mediawiki.action.edit.editWarning' => array(
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.edit.editWarning.js',
                'dependencies' => array(
+                       'jquery.textSelection',
                        'mediawiki.jqueryMsg'
                ),
                'messages' => array(
@@ -1056,10 +1042,6 @@ return array(
                        'prefs-editing'
                ),
        ),
-       // Alias for backwards compatibility
-       'mediawiki.action.watch.ajax' => array(
-               'dependencies' => 'mediawiki.page.watch.ajax'
-       ),
 
        /* MediaWiki Language */
 
@@ -1197,7 +1179,11 @@ return array(
        ),
        'mediawiki.page.image.pagination' => array(
                'scripts' => 'resources/src/mediawiki.page/mediawiki.page.image.pagination.js',
-               'dependencies' => array( 'jquery.spinner' )
+               'dependencies' => array(
+                       'mediawiki.Uri',
+                       'mediawiki.util',
+                       'jquery.spinner',
+               ),
        ),
 
        /* MediaWiki Special pages */
@@ -1205,9 +1191,6 @@ return array(
        'mediawiki.special' => array(
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.js',
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.css',
-               'skinStyles' => array(
-                       'vector' => 'skins/Vector/special.less', // FIXME this should use $wgStyleDirectory
-               ),
        ),
        'mediawiki.special.block' => array(
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.block.js',
@@ -1257,9 +1240,6 @@ return array(
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.preferences.js',
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.preferences.css',
                'position' => 'top',
-               'skinStyles' => array(
-                       'vector' => 'skins/Vector/special.preferences.less', // FIXME this should use $wgStyleDirectory
-               ),
                'messages' => array(
                        'prefs-tabs-navigation-hint',
                ),
@@ -1449,6 +1429,19 @@ return array(
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'mediawiki.ui.checkbox' => array(
+               'styles' => array(
+                       'resources/src/mediawiki.ui/components/checkbox.less',
+               ),
+       ),
+       // Lightweight module for anchor styles
+       'mediawiki.ui.anchor' => array(
+               'styles' => array(
+                       'resources/src/mediawiki.ui/components/anchors.less',
+               ),
+               'position' => 'top',
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
        // Lightweight module for button styles
        'mediawiki.ui.button' => array(
                'styles' => array(
@@ -1457,6 +1450,13 @@ return array(
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'mediawiki.ui.input' => array(
+               'styles' => array(
+                       'resources/src/mediawiki.ui/components/inputs.less',
+               ),
+               'position' => 'top',
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
 
        /* es5-shim */
        'es5-shim' => array(
@@ -1470,7 +1470,7 @@ return array(
        /* OOjs */
        'oojs' => array(
                'scripts' => array(
-                       'resources/lib/oojs/oojs.js',
+                       'resources/lib/oojs/oojs.jquery.js',
                ),
                'targets' => array( 'desktop', 'mobile' ),
                'dependencies' => array(
@@ -1491,18 +1491,19 @@ return array(
                ),
                'skinStyles' => array(
                        'default' => 'resources/lib/oojs-ui/oojs-ui-apex.css',
+                       // FIXME As of July 2014, this is to be gone "in a couple of months".
                        'minerva' => 'resources/lib/oojs-ui/oojs-ui-agora.css',
                ),
                'messages' => array(
-                       'ooui-dialog-action-close',
                        'ooui-outline-control-move-down',
                        'ooui-outline-control-move-up',
                        'ooui-outline-control-remove',
                        'ooui-toolbar-more',
-                       'ooui-dialog-confirm-title',
-                       'ooui-dialog-confirm-default-prompt',
-                       'ooui-dialog-confirm-default-ok',
-                       'ooui-dialog-confirm-default-cancel'
+                       'ooui-dialog-message-accept',
+                       'ooui-dialog-message-reject',
+                       'ooui-dialog-process-dismiss',
+                       'ooui-dialog-process-error',
+                       'ooui-dialog-process-retry',
                ),
                'dependencies' => array(
                        'es5-shim',
index 95001fb..3fb201c 100644 (file)
@@ -1,12 +1,9 @@
-/*jshint eqnull:true */
 /*!
- * jQuery Cookie Plugin v1.2
+ * jQuery Cookie Plugin v1.3.1
  * https://github.com/carhartl/jquery-cookie
  *
- * Copyright 2011, Klaus Hartl
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.opensource.org/licenses/GPL-2.0
+ * Copyright 2013 Klaus Hartl
+ * Released under the MIT license
  */
 (function ($, document, undefined) {
 
        }
 
        function decoded(s) {
-               return decodeURIComponent(s.replace(pluses, ' '));
+               return unRfc2068(decodeURIComponent(s.replace(pluses, ' ')));
        }
 
-       $.cookie = function (key, value, options) {
+       function unRfc2068(value) {
+               if (value.indexOf('"') === 0) {
+                       // This is a quoted cookie as according to RFC2068, unescape
+                       value = value.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
+               }
+               return value;
+       }
+
+       function fromJSON(value) {
+               return config.json ? JSON.parse(value) : value;
+       }
 
-               // key and at least value given, set cookie...
-               if (value !== undefined && !/Object/.test(Object.prototype.toString.call(value))) {
-                       options = $.extend({}, $.cookie.defaults, options);
+       var config = $.cookie = function (key, value, options) {
+
+               // write
+               if (value !== undefined) {
+                       options = $.extend({}, config.defaults, options);
 
                        if (value === null) {
                                options.expires = -1;
                                t.setDate(t.getDate() + days);
                        }
 
-                       value = String(value);
+                       value = config.json ? JSON.stringify(value) : String(value);
 
                        return (document.cookie = [
-                               encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value),
+                               encodeURIComponent(key), '=', config.raw ? value : encodeURIComponent(value),
                                options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
                                options.path    ? '; path=' + options.path : '',
                                options.domain  ? '; domain=' + options.domain : '',
                        ].join(''));
                }
 
-               // key and possibly options given, get cookie...
-               options = value || $.cookie.defaults || {};
-               var decode = options.raw ? raw : decoded;
+               // read
+               var decode = config.raw ? raw : decoded;
                var cookies = document.cookie.split('; ');
-               for (var i = 0, parts; (parts = cookies[i] && cookies[i].split('=')); i++) {
-                       if (decode(parts.shift()) === key) {
-                               return decode(parts.join('='));
+               var result = key ? null : {};
+               for (var i = 0, l = cookies.length; i < l; i++) {
+                       var parts = cookies[i].split('=');
+                       var name = decode(parts.shift());
+                       var cookie = decode(parts.join('='));
+
+                       if (key && key === name) {
+                               result = fromJSON(cookie);
+                               break;
+                       }
+
+                       if (!key) {
+                               result[name] = fromJSON(cookie);
                        }
                }
 
-               return null;
+               return result;
        };
 
-       $.cookie.defaults = {};
+       config.defaults = {};
 
        $.removeCookie = function (key, options) {
-               if ($.cookie(key, options) !== null) {
+               if ($.cookie(key) !== null) {
                        $.cookie(key, null, options);
                        return true;
                }
index eb39dac..87d7688 100644 (file)
@@ -6,13 +6,13 @@
                        "Xuacu"
                ]
        },
-       "ooui-dialog-action-close": "Zarrar",
        "ooui-outline-control-move-down": "Mover abaxo l'elementu",
        "ooui-outline-control-move-up": "Mover arriba l'elementu",
        "ooui-outline-control-remove": "Desaniciar elementu",
        "ooui-toolbar-more": "Más",
-       "ooui-dialog-confirm-title": "Confirmar",
-       "ooui-dialog-confirm-default-prompt": "¿Tas seguru?",
-       "ooui-dialog-confirm-default-ok": "Aceutar",
-       "ooui-dialog-confirm-default-cancel": "Encaboxar"
+       "ooui-dialog-message-accept": "Aceutar",
+       "ooui-dialog-message-reject": "Encaboxar",
+       "ooui-dialog-process-error": "Daqué funcionó mal",
+       "ooui-dialog-process-dismiss": "Descartar",
+       "ooui-dialog-process-retry": "Vuelvi a intentalo"
 }
index 4555c11..c3e80fe 100644 (file)
@@ -8,11 +8,13 @@
                        "QuimGil",
                        "SMP",
                        "Vriullop",
-                       "Toniher"
+                       "Toniher",
+                       "Edustus"
                ]
        },
        "ooui-outline-control-move-down": "Baixa element",
        "ooui-outline-control-move-up": "Puja element",
        "ooui-toolbar-more": "Més",
-       "ooui-dialog-process-dismiss": "Descarta"
+       "ooui-dialog-process-dismiss": "Descarta",
+       "ooui-dialog-process-retry": "Torneu-ho a provar"
 }
index 602efc8..9e99440 100644 (file)
@@ -1,28 +1,28 @@
 {
-    "@metadata": {
-        "authors": [
-            "Trevor Parscal",
-            "Ed Sanders",
-            "James D. Forrester",
-            "Raimond Spekking",
-            "Erik Moeller",
-            "Moriel Schottlender",
-            "Yuki Shira",
-            "Siebrand Mazeland",
-            "Rob Moen",
-            "Timo Tijhof",
-            "Roan Kattouw",
-            "Christian Williams",
-            "Amir E. Aharoni"
-        ]
-    },
-    "ooui-outline-control-move-down": "Move item down",
-    "ooui-outline-control-move-up": "Move item up",
-    "ooui-outline-control-remove": "Remove item",
-    "ooui-toolbar-more": "More",
-    "ooui-dialog-message-accept": "OK",
-    "ooui-dialog-message-reject": "Cancel",
-    "ooui-dialog-process-error": "Something went wrong",
-    "ooui-dialog-process-dismiss": "Dismiss",
-    "ooui-dialog-process-retry": "Try again"
+       "@metadata": {
+               "authors": [
+                       "Trevor Parscal",
+                       "Ed Sanders",
+                       "James D. Forrester",
+                       "Raimond Spekking",
+                       "Erik Moeller",
+                       "Moriel Schottlender",
+                       "Yuki Shira",
+                       "Siebrand Mazeland",
+                       "Rob Moen",
+                       "Timo Tijhof",
+                       "Roan Kattouw",
+                       "Christian Williams",
+                       "Amir E. Aharoni"
+               ]
+       },
+       "ooui-outline-control-move-down": "Move item down",
+       "ooui-outline-control-move-up": "Move item up",
+       "ooui-outline-control-remove": "Remove item",
+       "ooui-toolbar-more": "More",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Cancel",
+       "ooui-dialog-process-error": "Something went wrong",
+       "ooui-dialog-process-dismiss": "Dismiss",
+       "ooui-dialog-process-retry": "Try again"
 }
index 805897d..7660d4a 100644 (file)
@@ -14,7 +14,8 @@
                        "PoLuX124",
                        "Ralgis",
                        "Thehelpfulone",
-                       "Gloria sah"
+                       "Gloria sah",
+                       "Macofe"
                ]
        },
        "ooui-outline-control-move-down": "Bajar elemento",
@@ -23,5 +24,7 @@
        "ooui-toolbar-more": "Más",
        "ooui-dialog-message-accept": "Aceptar",
        "ooui-dialog-message-reject": "Cancelar",
+       "ooui-dialog-process-error": "Algo salió mal",
+       "ooui-dialog-process-dismiss": "Descartar",
        "ooui-dialog-process-retry": "Intentar de nuevo"
 }
index 5d9e3bb..81a91ed 100644 (file)
@@ -4,13 +4,13 @@
                        "Lam-ang"
                ]
        },
-       "ooui-dialog-action-close": "Irekep",
        "ooui-outline-control-move-down": "Ipababa ti banag",
        "ooui-outline-control-move-up": "Ipangato ti banag",
        "ooui-outline-control-remove": "Ikkaten ti banag",
        "ooui-toolbar-more": "Adu pay",
-       "ooui-dialog-confirm-title": "Pasingkedan",
-       "ooui-dialog-confirm-default-prompt": "Siguradoka kadi?",
-       "ooui-dialog-confirm-default-ok": "Sige",
-       "ooui-dialog-confirm-default-cancel": "Ukasen"
+       "ooui-dialog-message-accept": "Sige",
+       "ooui-dialog-message-reject": "Ukasen",
+       "ooui-dialog-process-error": "Adda madi a napasamak",
+       "ooui-dialog-process-dismiss": "Pugsayen",
+       "ooui-dialog-process-retry": "Padasen manen"
 }
index c2d9bc8..823d493 100644 (file)
@@ -6,12 +6,12 @@
                        "Pizza1016"
                ]
        },
-       "ooui-dialog-action-close": "Tutup",
        "ooui-outline-control-move-down": "Alihkan perkara ke bawah",
        "ooui-outline-control-move-up": "Alihkan perkara ke atas",
        "ooui-outline-control-remove": "Buang perkara",
        "ooui-toolbar-more": "Selebihnya",
-       "ooui-dialog-confirm-title": "Mengesahkan",
-       "ooui-dialog-confirm-default-prompt": "Adakah anda pasti?",
-       "ooui-dialog-confirm-default-cancel": "Batal"
+       "ooui-dialog-message-reject": "Batal",
+       "ooui-dialog-process-error": "Ada masalah",
+       "ooui-dialog-process-dismiss": "Singkir",
+       "ooui-dialog-process-retry": "Cuba lagi"
 }
index 43a64cd..98b6bce 100644 (file)
@@ -8,9 +8,12 @@
                        "Njardarlogar"
                ]
        },
-       "ooui-dialog-action-close": "Lukk",
        "ooui-outline-control-move-down": "Flytt ned",
        "ooui-outline-control-move-up": "Flytt opp",
        "ooui-outline-control-remove": "Fjern element",
-       "ooui-toolbar-more": "Mer"
+       "ooui-toolbar-more": "Mer",
+       "ooui-dialog-message-reject": "Avbryt",
+       "ooui-dialog-process-error": "Noe gikk galt",
+       "ooui-dialog-process-dismiss": "Lukk",
+       "ooui-dialog-process-retry": "Prøv igjen"
 }
index 35e7ee4..c62782e 100644 (file)
@@ -5,9 +5,13 @@
                        "Tumsaa"
                ]
        },
-       "ooui-dialog-action-close": "Cufi",
        "ooui-outline-control-move-down": "Gad buusi",
        "ooui-outline-control-move-up": "Ol baasi",
        "ooui-outline-control-remove": "Balleessi",
-       "ooui-toolbar-more": "Dabalata"
+       "ooui-toolbar-more": "Dabalata",
+       "ooui-dialog-message-accept": "Tole",
+       "ooui-dialog-message-reject": "Dhiisi",
+       "ooui-dialog-process-error": "Dogoggorri wayii ummameera",
+       "ooui-dialog-process-dismiss": "Didi",
+       "ooui-dialog-process-retry": "Itti deebi'ii yaali"
 }
index e8ab9f9..9b3bb60 100644 (file)
@@ -24,8 +24,8 @@
        "ooui-outline-control-move-up": "Tool tip for a button that moves items in a list up one place",
        "ooui-outline-control-remove": "Tool tip for a button that removes items from a list.\n{{Identical|Remove item}}",
        "ooui-toolbar-more": "Label for the toolbar group that contains a list of all other available tools.\n{{Identical|More}}",
-       "ooui-dialog-message-accept": "Default label for the accept button of a message dialog",
-       "ooui-dialog-message-reject": "Default label for the reject button of a message dialog",
+       "ooui-dialog-message-accept": "Default label for the accept button of a message dialog\n{{Identical|OK}}",
+       "ooui-dialog-message-reject": "Default label for the reject button of a message dialog\n{{Identical|Cancel}}",
        "ooui-dialog-process-error": "Title for process dialog error description",
        "ooui-dialog-process-dismiss": "Label for process dialog dismiss error button, visible when describing errors\n{{Identical|Dismiss}}",
        "ooui-dialog-process-retry": "Label for process dialog retry action button, visible when describing recoverable errors\n{{Identical|Try again}}"
index f0ccce5..5737548 100644 (file)
@@ -7,13 +7,13 @@
                        "Yerpo"
                ]
        },
-       "ooui-dialog-action-close": "Zapri",
        "ooui-outline-control-move-down": "Prestavi predmet nižje",
        "ooui-outline-control-move-up": "Prestavi predmet višje",
        "ooui-outline-control-remove": "Odstrani vnos",
        "ooui-toolbar-more": "Več",
-       "ooui-dialog-confirm-title": "Potrdi",
-       "ooui-dialog-confirm-default-prompt": "Ste prepričani?",
-       "ooui-dialog-confirm-default-ok": "V redu",
-       "ooui-dialog-confirm-default-cancel": "Prekliči"
+       "ooui-dialog-message-accept": "V redu",
+       "ooui-dialog-message-reject": "Prekliči",
+       "ooui-dialog-process-error": "Nekaj je šlo narobe",
+       "ooui-dialog-process-dismiss": "Skrij",
+       "ooui-dialog-process-retry": "Poskusi znova"
 }
index 3717cf9..82f7c6c 100644 (file)
@@ -7,11 +7,12 @@
                        "Maidis",
                        "Rapsar",
                        "Talha Samil Cakir",
-                       "TurkishStyles"
+                       "TurkishStyles",
+                       "Sayginer"
                ]
        },
-       "ooui-dialog-action-close": "Kapat",
        "ooui-outline-control-move-down": "Ögeyi aşağı taşı",
        "ooui-outline-control-move-up": "Ögeyi yukarı taşı",
-       "ooui-toolbar-more": "Daha fazla"
+       "ooui-toolbar-more": "Daha fazla",
+       "ooui-dialog-process-retry": "Tekrar dene"
 }
index e26af70..a850fce 100644 (file)
@@ -13,5 +13,6 @@
        "ooui-dialog-message-accept": "יאָ",
        "ooui-dialog-message-reject": "אַנולירן",
        "ooui-dialog-process-error": "עפעס איז דורכגעפאלן",
+       "ooui-dialog-process-dismiss": "צומאַכן",
        "ooui-dialog-process-retry": "פרובירט נאכאמאל"
 }
index 255658b..05fb20d 100644 (file)
                        "Cwlin0416"
                ]
        },
-       "ooui-dialog-action-close": "關閉",
        "ooui-outline-control-move-down": "項目下移",
        "ooui-outline-control-move-up": "項目上移",
        "ooui-outline-control-remove": "移除項目",
        "ooui-toolbar-more": "更多",
-       "ooui-dialog-confirm-title": "確認",
-       "ooui-dialog-confirm-default-prompt": "您確定嗎?",
-       "ooui-dialog-confirm-default-ok": "確定",
-       "ooui-dialog-confirm-default-cancel": "取消"
+       "ooui-dialog-message-accept": "確定",
+       "ooui-dialog-message-reject": "取消",
+       "ooui-dialog-process-error": "發生不明錯誤",
+       "ooui-dialog-process-dismiss": "放棄",
+       "ooui-dialog-process-retry": "再試一次"
 }
index 417bc96..3694391 100644 (file)
@@ -1,9 +1,7 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-        width="15px" height="8px" viewBox="0 0 15 8" style="enable-background:new 0 0 15 8;" xml:space="preserve">
-<g id="anchor">
-       <polygon id="outline" style="fill-rule:evenodd;clip-rule:evenodd;fill:#808080;" points="7.609,2.499 2.096,8 13.125,8"/>
-       <polygon id="fill" style="fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;" points="7.609,3 2.598,8 12.622,8"/>
-</g>
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="15" height="8" viewBox="0 0 15 8">
+    <g id="anchor">
+        <polygon id="outline" style="fill:#808080;" points="7.609,2.499 2.096,8 13.125,8"/>
+        <polygon id="fill" style="fill:#FFFFFF;" points="7.609,3 2.598,8 12.622,8"/>
+    </g>
 </svg>
index ff52c32..b385a74 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="apply" opacity=".75">
-        <path id="check" fill-rule="evenodd" clip-rule="evenodd" d="M19.062 5.139l-1.644-1.139-8.551 12.357-3.454-3.454-1.413 1.413 5.021 5.022z"/>
+    <g id="accept" opacity=".75">
+        <path id="check" d="M19.062 5.139l-1.644-1.139-8.551 12.357-3.454-3.454-1.413 1.413 5.021 5.022z"/>
     </g>
 </svg>
index b25d5b7..c42731a 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="apply" opacity=".75">
-        <path d="M13 8h-2v3h-3v2h3v3h2v-3h3v-2h-3z"/>
+    <g id="add-item" opacity=".75">
+        <path id="plus" d="M13 8h-2v3h-3v2h3v3h2v-3h3v-2h-3z"/>
     </g>
 </svg>
index 223b7fc..0f85e44 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="settings" opacity=".75">
-        <path id="gear" d="M20.869 13.476c.079-.482.131-.972.131-1.476s-.052-.994-.131-1.476l-2.463-.259c-.149-.556-.367-1.082-.648-1.57l1.558-1.924c-.576-.806-1.281-1.511-2.087-2.087l-1.924 1.558c-.488-.281-1.015-.499-1.57-.648l-.259-2.463c-.482-.079-.972-.131-1.476-.131s-.994.052-1.476.131l-.259 2.463c-.555.149-1.081.367-1.57.648l-1.924-1.557c-.805.576-1.51 1.281-2.086 2.086l1.558 1.924c-.281.488-.499 1.015-.648 1.57l-2.463.259c-.08.482-.132.972-.132 1.476s.052.994.131 1.476l2.463.259c.149.556.367 1.082.648 1.57l-1.558 1.924c.576.806 1.281 1.511 2.087 2.087l1.924-1.558c.488.281 1.015.499 1.57.648l.259 2.463c.482.079.972.131 1.476.131s.994-.052 1.476-.131l.259-2.463c.556-.149 1.082-.367 1.57-.648l1.924 1.558c.806-.576 1.511-1.281 2.087-2.087l-1.558-1.924c.281-.488.499-1.015.648-1.57l2.463-.259zm-8.869 2.522c-2.209 0-3.998-1.789-3.998-3.998s1.789-3.998 3.998-3.998 3.998 1.789 3.998 3.998-1.789 3.998-3.998 3.998z" fill-rule="evenodd" clip-rule="evenodd"/>
+        <path id="gear" d="M20.869 13.476c.079-.482.131-.972.131-1.476s-.052-.994-.131-1.476l-2.463-.259c-.149-.556-.367-1.082-.648-1.57l1.558-1.924c-.576-.806-1.281-1.511-2.087-2.087l-1.924 1.558c-.488-.281-1.015-.499-1.57-.648l-.259-2.463c-.482-.079-.972-.131-1.476-.131s-.994.052-1.476.131l-.259 2.463c-.555.149-1.081.367-1.57.648l-1.924-1.557c-.805.576-1.51 1.281-2.086 2.086l1.558 1.924c-.281.488-.499 1.015-.648 1.57l-2.463.259c-.08.482-.132.972-.132 1.476s.052.994.131 1.476l2.463.259c.149.556.367 1.082.648 1.57l-1.558 1.924c.576.806 1.281 1.511 2.087 2.087l1.924-1.558c.488.281 1.015.499 1.57.648l.259 2.463c.482.079.972.131 1.476.131s.994-.052 1.476-.131l.259-2.463c.556-.149 1.082-.367 1.57-.648l1.924 1.558c.806-.576 1.511-1.281 2.087-2.087l-1.558-1.924c.281-.488.499-1.015.648-1.57l2.463-.259zm-8.869 2.522c-2.209 0-3.998-1.789-3.998-3.998s1.789-3.998 3.998-3.998 3.998 1.789 3.998 3.998-1.789 3.998-3.998 3.998z"/>
     </g>
 </svg>
index fb25766..819e062 100644 (file)
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="alert" opacity=".75">
-        <path id="point" fill-rule="evenodd" clip-rule="evenodd" d="M11 16h2v2h-2z"/>
-        <path id="stroke" fill-rule="evenodd" clip-rule="evenodd" d="M13.516 10h-3l.484 5h2z"/>
+        <path id="point" d="M11 16h2v2h-2z"/>
+        <path id="stroke" d="M13.516 10h-3l.484 5h2z"/>
         <path id="triangle" d="M12.017 5.974l7.519 13.026h-15.04l7.521-13.026m0-2.474c-.544 0-1.088.357-1.5 1.071l-7.985 13.831c-.825 1.429-.15 2.598 1.5 2.598h15.968c1.65 0 2.325-1.169 1.5-2.599l-7.983-13.829c-.413-.715-.956-1.072-1.5-1.072z"/>
     </g>
 </svg>
index 88a6a40..9fd2866 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="arched-arrow-ltr" opacity=".75">
-        <path id="arrow" d="M19.925 14.937l-2.391-6.901-1.48 2.329c-.964-.845-2.699-1.85-5.513-1.823-4.887.046-6.524 4.244-6.524 4.244s2.753-2.639 6.925-1.949c1.729.286 3.007 1.206 3.675 1.791l-1.474 2.319 6.782-.01z" fill-rule="evenodd" clip-rule="evenodd"/>
+        <path id="arrow" d="M19.925 14.937l-2.391-6.901-1.48 2.329c-.964-.845-2.699-1.85-5.513-1.823-4.887.046-6.524 4.244-6.524 4.244s2.753-2.639 6.925-1.949c1.729.286 3.007 1.206 3.675 1.791l-1.474 2.319 6.782-.01z"/>
     </g>
 </svg>
index 50541d2..b16c1b4 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="arched-arrow-rtl" opacity=".75">
-        <path id="arrow" d="M13.401 8.542c-2.814-.027-4.549.978-5.513 1.823l-1.48-2.329-2.391 6.901 6.782.009-1.474-2.319c.668-.584 1.945-1.504 3.675-1.791 4.172-.69 6.925 1.949 6.925 1.949s-1.637-4.197-6.524-4.243z" fill-rule="evenodd" clip-rule="evenodd"/>
+        <path id="arrow" d="M13.401 8.542c-2.814-.027-4.549.978-5.513 1.823l-1.48-2.329-2.391 6.901 6.782.009-1.474-2.319c.668-.584 1.945-1.504 3.675-1.791 4.172-.69 6.925 1.949 6.925 1.949s-1.637-4.197-6.524-4.243z"/>
     </g>
 </svg>
index 484a104..8409c67 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="clear" opacity=".75">
-        <path id="circle_with_strike" d="M11.999 5.022c-3.853 0-6.977 3.124-6.977 6.978 0 3.853 3.124 6.978 6.977 6.978 3.854 0 6.979-3.125 6.979-6.978 0-3.854-3.125-6.978-6.979-6.978zm-5.113 6.978c0-1.092.572-3.25.93-2.929l7.113 7.113c.488.525-1.837.931-2.93.931-2.825-.001-5.113-2.291-5.113-5.115zm9.298 2.929l-7.114-7.113c-.445-.483 1.837-.931 2.929-.931 2.827 0 5.115 2.289 5.115 5.114 0 1.093-.364 3.543-.93 2.93z" fill-rule="evenodd" clip-rule="evenodd"/>
+        <path id="circle-with-strike" d="M11.999 5.022c-3.853 0-6.977 3.124-6.977 6.978 0 3.853 3.124 6.978 6.977 6.978 3.854 0 6.979-3.125 6.979-6.978 0-3.854-3.125-6.978-6.979-6.978zm-5.113 6.978c0-1.092.572-3.25.93-2.929l7.113 7.113c.488.525-1.837.931-2.93.931-2.825-.001-5.113-2.291-5.113-5.115zm9.298 2.929l-7.114-7.113c-.445-.483 1.837-.931 2.929-.931 2.827 0 5.115 2.289 5.115 5.114 0 1.093-.364 3.543-.93 2.93z"/>
     </g>
 </svg>
index 15278e9..3c0ab46 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="close" opacity=".75">
-        <path id="x" fill-rule="evenodd" clip-rule="evenodd" d="M18.717 6.697l-1.414-1.414-5.303 5.303-5.303-5.303-1.414 1.414 5.303 5.303-5.303 5.303 1.414 1.414 5.303-5.303 5.303 5.303 1.414-1.414-5.303-5.303z"/>
+        <path id="x" d="M18.717 6.697l-1.414-1.414-5.303 5.303-5.303-5.303-1.414 1.414 5.303 5.303-5.303 5.303 1.414 1.414 5.303-5.303 5.303 5.303 1.414-1.414-5.303-5.303z"/>
     </g>
 </svg>
index 97bdc50..c677e9e 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="collapse" opacity=".75">
-        <path id="arrow" fill-rule="evenodd" clip-rule="evenodd" d="M6.697 15.714l5.303-5.302 5.303 5.302 1.414-1.414-6.717-6.717-6.717 6.717z"/>
+        <path id="arrow" d="M6.697 15.714l5.303-5.302 5.303 5.302 1.414-1.414-6.717-6.717-6.717 6.717z"/>
     </g>
 </svg>
index ebb038e..0348035 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="comment" opacity=".75">
-        <path id="speech_bubble" d="M15 6h-6c-1.657 0-3 1.344-3 3v4c0 1.656 1.343 3 3 3v3l3-3h3c1.657 0 3-1.344 3-3v-4c0-1.656-1.343-3-3-3z" fill-rule="evenodd" clip-rule="evenodd"/>
+        <path id="speech-bubble" d="M15 6h-6c-1.657 0-3 1.344-3 3v4c0 1.656 1.343 3 3 3v3l3-3h3c1.657 0 3-1.344 3-3v-4c0-1.656-1.343-3-3-3z"/>
     </g>
 </svg>
index 81c2ec0..f41b9f9 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="expand" opacity=".75">
-        <path id="arrow" fill-rule="evenodd" clip-rule="evenodd" d="M17.303 8.283l-5.303 5.303-5.303-5.303-1.414 1.414 6.717 6.717 6.717-6.717z"/>
+        <path id="arrow" d="M17.303 8.283l-5.303 5.303-5.303-5.303-1.414 1.414 6.717 6.717 6.717-6.717z"/>
     </g>
 </svg>
index 09117e1..ce129a7 100644 (file)
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="help" opacity=".75" fill-rule="evenodd" clip-rule="evenodd">
+    <g id="help" opacity=".75">
         <path id="circle" d="M12.001 2.085c-5.478 0-9.916 4.438-9.916 9.916 0 5.476 4.438 9.914 9.916 9.914 5.476 0 9.914-4.438 9.914-9.914 0-5.478-4.438-9.916-9.914-9.916zm.001 18c-4.465 0-8.084-3.619-8.084-8.083 0-4.465 3.619-8.084 8.084-8.084 4.464 0 8.083 3.619 8.083 8.084 0 4.464-3.619 8.083-8.083 8.083z"/>
-        <g id="question_mark">
+        <g id="question-mark">
             <path id="top" d="M11.766 6.688c-2.5 0-3.219 2.188-3.219 2.188l1.411.854s.298-.791.901-1.229c.516-.375 1.625-.625 2.219.125.701.885-.17 1.587-1.078 2.719-.953 1.186-1 3.655-1 3.655h1.969s.135-2.318 1.041-3.381c.603-.707 1.443-1.338 1.443-2.494s-1.187-2.437-3.687-2.437z"/>
             <path id="bottom" d="M11 16h2v2h-2z"/>
         </g>
index a89e257..91e072f 100644 (file)
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="history" opacity=".75" fill-rule="evenodd" clip-rule="evenodd">
-        <path id="clock_hands" d="M17.26 15.076s-2.385-1.935-4.005-3.062c.72-2.397 1.702-6.559 1.702-6.559s-4.35 5.363-4.877 6.699c-.463 1.168 1.459 2.209 2.346 1.678 1.9.551 4.834 1.244 4.834 1.244z"/>
+    <g id="history" opacity=".75">
+        <path id="clock-hands" d="M17.26 15.076s-2.385-1.935-4.005-3.062c.72-2.397 1.702-6.559 1.702-6.559s-4.35 5.363-4.877 6.699c-.463 1.168 1.459 2.209 2.346 1.678 1.9.551 4.834 1.244 4.834 1.244z"/>
         <path id="arrow" d="M12.086 2.085c-5.478 0-9.916 4.438-9.916 9.916 0 1.783.476 3.454 1.301 4.898l-2.223 2.04h5.688v-5.219l-2.066 1.896c-.55-1.088-.866-2.312-.866-3.615 0-4.465 3.619-8.084 8.084-8.084 4.464 0 8.083 3.619 8.083 8.084 0 4.464-3.619 8.083-8.083 8.083-1.145 0-2.228-.247-3.213-.678l-.833 1.634c1.235.557 2.602.874 4.045.874 5.476 0 9.914-4.438 9.914-9.914-.001-5.477-4.439-9.915-9.915-9.915z"/>
     </g>
 </svg>
index 22ad9be..9ba57d7 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24">
-    <g id="help" opacity=".75">
-        <path d="M11.499 17c-3.036 0-5.499-2.464-5.499-5.5 0-3.037 2.462-5.5 5.499-5.5 3.037 0 5.501 2.462 5.501 5.5 0 3.036-2.464 5.5-5.501 5.5zm.002-12c-3.591 0-6.501 2.91-6.501 6.5s2.91 6.5 6.501 6.5c3.588 0 6.499-2.911 6.499-6.5s-2.911-6.5-6.499-6.5zM12 10v4h1v1h-3v-1h1v-3h-1v-1zM11 8h1v1h-1z"/>
+    <g id="info" opacity=".75">
+        <path id="circled-i" d="M11.499 17c-3.036 0-5.499-2.464-5.499-5.5 0-3.037 2.462-5.5 5.499-5.5 3.037 0 5.501 2.462 5.501 5.5 0 3.036-2.464 5.5-5.501 5.5zm.002-12c-3.591 0-6.501 2.91-6.501 6.5s2.91 6.5 6.501 6.5c3.588 0 6.499-2.911 6.499-6.5s-2.911-6.5-6.499-6.5zM12 10v4h1v1h-3v-1h1v-3h-1v-1zM11 8h1v1h-1z"/>
     </g>
 </svg>
index 7d8a1ef..fcb06be 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="link" opacity=".75">
         <path id="right" d="M19.188 12.001c0 1.1-.891 2.015-1.988 2.015l-4.195-.015c.538 1.088.963 1.999 1.997 1.999h3c1.656 0 2.998-2.343 2.998-4s-1.342-4-2.998-4h-3c-1.034 0-1.459.911-1.998 1.999l4.195-.015c1.098 0 1.989.917 1.989 2.017z"/>
index 75866f6..2d04789 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="menu" opacity=".75">
         <path id="lines" d="M6 15h12c.553 0 1 .447 1 1v1c0 .553-.447 1-1 1h-12c-.553 0-1-.447-1-1v-1c0-.553.447-1 1-1zm-1-4v1c0 .553.447 1 1 1h12c.553 0 1-.447 1-1v-1c0-.553-.447-1-1-1h-12c-.553 0-1 .447-1 1zm0-5v1c0 .553.447 1 1 1h12c.553 0 1-.447 1-1v-1c0-.553-.447-1-1-1h-12c-.553 0-1 .447-1 1z"/>
index 3c19c4f..eea75d8 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="move-ltr" opacity=".75">
-        <path id="arrow" fill-rule="evenodd" clip-rule="evenodd" d="M8.935 7.181l5.302 5.302-5.302 5.303 1.414 1.414 6.716-6.717-6.716-6.716z"/>
+        <path id="arrow" d="M8.935 7.181l5.302 5.302-5.302 5.303 1.414 1.414 6.716-6.717-6.716-6.716z"/>
     </g>
 </svg>
index d9f35c1..2dc5eaf 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="move-rtl" opacity=".75">
-        <path id="arrow_9_" fill-rule="evenodd" clip-rule="evenodd" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.414-1.414-6.716 6.716 6.716 6.717z"/>
+        <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.414-1.414-6.716 6.716 6.716 6.717z"/>
     </g>
 </svg>
index cd4c0f7..4862fbc 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="picture" opacity=".75" fill-rule="evenodd" clip-rule="evenodd">
+    <g id="picture" opacity=".75">
         <path id="frame" d="M18 4h-12c-2-.007-3 .993-3 2.993l.014 9.007c-.014 2 .986 2.988 2.986 3h12c2-.012 2.994-1 3-3.006v-9.001c-.006-2-1-3-3-2.993zm1 13h-14v-11h14v11z"/>
         <path id="mountains" d="M6 13.5l3.5-3.5 2.328 2.312-1.312 1.094.875 1.032 4.109-3.438 2.5 2v3h-12z"/>
         <path id="sky" d="M6 12l3.516-4.156 3.046 3.172 2.938-2.016 2.5 2v-4h-12z"/>
index 5dd607b..723e70f 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24">
     <g id="remove-item">
-        <path d="M8 11h8v2h-8z"/>
+        <path id="minus" d="M8 11h8v2h-8z"/>
     </g>
 </svg>
index 06c89d7..61f4d2d 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="remove" opacity=".75">
-        <path id="trash_can" d="M12 10h-1v6h1v-6zm-2 0h-1v6h1v-6zm4 0h-1v6h1v-6zm0-4v-1h-5v1h-3v3h1v7.966l1 1.031v-.074.077h6.984l.016-.018v.015l1-1.031v-7.966h1v-3h-3zm1 11h-7v-8h7v8zm1-9h-9v-1h9v1z" fill-rule="evenodd" clip-rule="evenodd"/>
+        <path id="trash-can" d="M12 10h-1v6h1v-6zm-2 0h-1v6h1v-6zm4 0h-1v6h1v-6zm0-4v-1h-5v1h-3v3h1v7.966l1 1.031v-.074.077h6.984l.016-.018v.015l1-1.031v-7.966h1v-3h-3zm1 11h-7v-8h7v8zm1-9h-9v-1h9v1z"/>
     </g>
 </svg>
index ff7144c..75b38c8 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="search" opacity=".75">
-        <path id="magnifying_glass" d="M16.021 15.96l-2.374-2.375-.169-.099c.403-.566.643-1.26.643-2.009-.001-1.92-1.558-3.477-3.477-3.477-1.921 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.749 0 1.442-.239 2.01-.643l.098.169 2.375 2.374c.19.189.543.143.79-.104s.293-.601.104-.791zm-5.377-2.27c-1.221 0-2.213-.991-2.213-2.213 0-1.221.992-2.213 2.213-2.213 1.222 0 2.213.992 2.213 2.213-.001 1.222-.992 2.213-2.213 2.213z"/>
+        <path id="magnifying-glass" d="M16.021 15.96l-2.374-2.375-.169-.099c.403-.566.643-1.26.643-2.009-.001-1.92-1.558-3.477-3.477-3.477-1.921 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.749 0 1.442-.239 2.01-.643l.098.169 2.375 2.374c.19.189.543.143.79-.104s.293-.601.104-.791zm-5.377-2.27c-1.221 0-2.213-.991-2.213-2.213 0-1.221.992-2.213 2.213-2.213 1.222 0 2.213.992 2.213 2.213-.001 1.222-.992 2.213-2.213 2.213z"/>
     </g>
 </svg>
index cbc4efc..6e45b60 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24">
     <g id="settings" opacity=".75">
-        <path d="M3 4h3v2h-3zM12 4h9v2h-9zM8 3h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1zM3 11h9v2h-9zM18 11h3v2h-3zM14 10h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1zM3 18h6v2h-6zM15 18h6v2h-6zM11 17h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1z"/>
+        <path id="gear" d="M3 4h3v2h-3zM12 4h9v2h-9zM8 3h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1zM3 11h9v2h-9zM18 11h3v2h-3zM14 10h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1zM3 18h6v2h-6zM15 18h6v2h-6zM11 17h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1z"/>
     </g>
 </svg>
index 496e7fc..1d61b81 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="tag" opacity=".75">
         <path d="M18.748 11.717c.389.389.389 1.025 0 1.414l-4.949 4.95c-.389.389-1.025.389-1.414 0l-6.01-6.01c-.389-.389-.707-1.157-.707-1.707l-.001-4.364c0-.55.45-1 1-1h4.364c.55 0 1.318.318 1.707.707l6.01 6.01zm-10.644-4.261c-.579.576-.578 1.514-.001 2.093.578.577 1.516.577 2.095.001.576-.578.576-1.517 0-2.095-.581-.576-1.518-.577-2.094.001z"/>
index ad12773..802f295 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="window" opacity=".75">
         <path id="title" d="M7 10h10v1h-10z"/>
index 7cfde44..e2e49a8 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="deprecated" opacity=".75">
+    <g id="alert" opacity=".75">
         <path d="M6 12c-3.314 0-6-2.686-6-6s2.686-6 6-6 6 2.686 6 6-2.686 6-6 6zm-1-5h2v-5h-2zm0 3h2v-2h-2z"/>
     </g>
 </svg>
index d345ec0..55670de 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="down" opacity=".75">
         <path id="arrow" d="M2 3l3.5 6 3.5-6z"/>
index 78e0115..b9d725e 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="up" opacity=".75">
         <path id="arrow" d="M5.5 2l-3.5 6h7z"/>
index 565148a..525304c 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (a1b99bb256)
+ * OOjs UI v0.1.0-pre (dd294dc785)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-07-17T19:17:19Z
+ * Date: 2014-07-30T23:10:53Z
  */
 .oo-ui-dialog-content > .oo-ui-window-head,
 .oo-ui-dialog-content > .oo-ui-window-body,
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonedElement-button {
   min-width: 1.85em;
   min-height: 1.85em;
-  padding-top: 0.75em;
-  padding-bottom: 0.75em;
+  padding: 0.35em 0.75em;
+  border: 1px solid #dddddd;
+  border-radius: 4px;
 }
 
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labeledElement-label,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labeledElement-label,
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labeledElement-label {
   padding: 0 1em;
+  font-weight: bold;
   line-height: 1.85em;
+  color: #777777;
 }
 
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconedElement-icon,
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-  padding: 0;
   vertical-align: middle;
 }
 
-.oo-ui-processDialog-actions-safe.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-primary.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-  margin: 0.75em;
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive .oo-ui-buttonedElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive .oo-ui-buttonedElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggableElement-destructive .oo-ui-buttonedElement-button {
+  border: 1px solid transparent;
 }
 
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
-  background-color: rgba(0, 0, 0, 0.05);
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive .oo-ui-labeledElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive .oo-ui-labeledElement-label,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggableElement-destructive .oo-ui-labeledElement-label {
+  color: #d11d13;
 }
 
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover {
-  background-color: rgba(8, 126, 204, 0.05);
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonedElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonedElement-button {
+  padding: 0.75em 0.35em;
+  border: none;
+  border-radius: 0;
 }
 
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active {
-  background-color: rgba(8, 126, 204, 0.1);
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button {
+  background-color: #347bff;
 }
 
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label {
-  font-weight: bold;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover {
-  background-color: rgba(118, 171, 54, 0.05);
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active {
-  background-color: rgba(118, 171, 54, 0.1);
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active {
-  background-color: rgba(212, 83, 83, 0.1);
+  color: #ffffff;
 }
 
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon {
   padding-right: 2.25em;
 }
 
-.oo-ui-processDialog-actions-other:not(:empty) {
-  padding: 0.75em;
-}
-
-.oo-ui-processDialog-actions-other:not(:empty) .oo-ui-actionWidget {
-  margin: 0 0.75em 0 0;
-  border: solid 1px #ccc;
-  border-radius: 0.25em;
+.oo-ui-processDialog-actions-other {
+  position: absolute;
+  bottom: 1em;
 }
 
 .oo-ui-processDialog > .oo-ui-window-frame {
   padding: 0 0 1em;
 }
 
+.oo-ui-panelLayout {
+  padding: 1em 3.35em;
+}
+
 .oo-ui-optionWidget {
   padding: 0.8em 1em 0.8em 3.35em;
   font-weight: bold;
   background: #347bff;
 }
 
+.oo-ui-menuItemWidget .oo-ui-iconedElement-icon {
+  background-size: 24px auto;
+}
+
 .oo-ui-menuSectionItemWidget {
   font-weight: normal;
   color: #777777;
diff --git a/resources/lib/oojs-ui/oojs-ui-agora.rtl.css b/resources/lib/oojs-ui/oojs-ui-agora.rtl.css
new file mode 100644 (file)
index 0000000..fef9ba5
--- /dev/null
@@ -0,0 +1,420 @@
+/*!
+ * OOjs UI v0.1.0
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: 2014-07-22T21:39:24Z
+ */
+.oo-ui-dialog-content > .oo-ui-window-head,
+.oo-ui-dialog-content > .oo-ui-window-body,
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  position: absolute;
+  left: 0;
+  right: 0;
+  overflow: hidden;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-dialog-content > .oo-ui-window-head {
+  top: 0;
+  z-index: 1;
+}
+
+.oo-ui-dialog-content > .oo-ui-window-body {
+  top: 0;
+  bottom: 0;
+  z-index: 2;
+}
+
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  bottom: 0;
+  z-index: 1;
+}
+
+.oo-ui-dialog-content > .oo-ui-window-overlay {
+  z-index: 3;
+}
+
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  background-color: rgba(255, 255, 255, 0.5);
+  opacity: 0;
+  -webkit-transition: opacity 250ms ease-in-out;
+     -moz-transition: opacity 250ms ease-in-out;
+      -ms-transition: opacity 250ms ease-in-out;
+       -o-transition: opacity 250ms ease-in-out;
+          transition: opacity 250ms ease-in-out;
+}
+
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+  top: 1em;
+  bottom: 1em;
+  background-color: #fff;
+  -webkit-transform: translate3d(0, -200%, 0);
+     -moz-transform: translate3d(0, -200%, 0);
+      -ms-transform: translate3d(0, -200%, 0);
+       -o-transform: translate3d(0, -200%, 0);
+          transform: translate3d(0, -200%, 0);
+  -webkit-transition: transform 250ms ease-in-out;
+     -moz-transition: transform 250ms ease-in-out;
+      -ms-transition: transform 250ms ease-in-out;
+       -o-transition: transform 250ms ease-in-out;
+          transition: transform 250ms ease-in-out;
+}
+
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+  opacity: 1;
+}
+
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+  -webkit-transform: translate3d(0, 0, 0);
+     -moz-transform: translate3d(0, 0, 0);
+      -ms-transform: translate3d(0, 0, 0);
+       -o-transform: translate3d(0, 0, 0);
+          transform: translate3d(0, 0, 0);
+}
+
+.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
+  border: solid 1px #ccc;
+  border-radius: 0.5em;
+  box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
+}
+
+.oo-ui-messageDialog-title,
+.oo-ui-messageDialog-message {
+  display: block;
+  padding-top: 0.5em;
+  text-align: center;
+}
+
+.oo-ui-messageDialog-title {
+  font-size: 1.5em;
+  line-height: 1em;
+  color: #000;
+}
+
+.oo-ui-messageDialog-message {
+  font-size: 0.9em;
+  line-height: 1.25em;
+  color: #666;
+}
+
+.oo-ui-messageDialog-message-verbose {
+  font-size: 1.1em;
+  line-height: 1.5em;
+  text-align: right;
+}
+
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  border-left: solid 1px #e5e5e5;
+}
+
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
+  border-left-width: 0;
+}
+
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  border-bottom: solid 1px #e5e5e5;
+}
+
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
+  border-bottom-width: 0;
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labeledElement-label {
+  padding: 0 2em;
+  line-height: 3.4em;
+  text-align: center;
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
+  background-color: rgba(0, 0, 0, 0.05);
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
+  background-color: rgba(0, 0, 0, 0.1);
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover {
+  background-color: rgba(8, 126, 204, 0.05);
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active {
+  background-color: rgba(8, 126, 204, 0.1);
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label {
+  font-weight: bold;
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover {
+  background-color: rgba(118, 171, 54, 0.05);
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active {
+  background-color: rgba(118, 171, 54, 0.1);
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover {
+  background-color: rgba(212, 83, 83, 0.05);
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active {
+  background-color: rgba(212, 83, 83, 0.1);
+}
+
+.oo-ui-processDialog-content .oo-ui-window-head {
+  height: 3.35em;
+  border-bottom: 1px solid #dddddd;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-processDialog-content .oo-ui-window-body {
+  top: 3.35em;
+  padding: 2em 0;
+}
+
+.oo-ui-processDialog-navigation {
+  position: relative;
+  height: 3.35em;
+  padding: 0 1em;
+}
+
+.oo-ui-processDialog-location {
+  height: 3.35em;
+  padding: 0.25em 0;
+  text-align: center;
+  cursor: default;
+}
+
+.oo-ui-processDialog-title {
+  font-weight: bold;
+  line-height: 1.85em;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonedElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonedElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonedElement-button {
+  min-width: 1.85em;
+  min-height: 1.85em;
+  padding-top: 0.75em;
+  padding-bottom: 0.75em;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labeledElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labeledElement-label,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labeledElement-label {
+  padding: 0 1em;
+  line-height: 1.85em;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconedElement-icon,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconedElement-icon,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconedElement-icon {
+  position: absolute;
+  margin-top: -0.125em;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonedElement-framed {
+  margin: 0.75em 0.75em 0.75em 0;
+  border: solid 1px #ccc;
+  border-radius: 0.25em;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
+  padding: 0;
+  vertical-align: middle;
+}
+
+.oo-ui-processDialog-actions-safe.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
+.oo-ui-processDialog-actions-primary.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
+  margin: 0.75em;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
+  background-color: rgba(0, 0, 0, 0.05);
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
+  background-color: rgba(0, 0, 0, 0.1);
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed {
+  margin: 0.75em;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
+  /* Adjust for border so text aligns with title */
+
+  margin: -1px;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover {
+  background-color: rgba(8, 126, 204, 0.05);
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active {
+  background-color: rgba(8, 126, 204, 0.1);
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label {
+  font-weight: bold;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover {
+  background-color: rgba(118, 171, 54, 0.05);
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active {
+  background-color: rgba(118, 171, 54, 0.1);
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover {
+  background-color: rgba(212, 83, 83, 0.05);
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active {
+  background-color: rgba(212, 83, 83, 0.1);
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon {
+  right: 0.5em;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-labeledElement-label {
+  padding-right: 2.25em;
+}
+
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon {
+  left: 0.5em;
+}
+
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-labeledElement-label {
+  padding-left: 2.25em;
+}
+
+.oo-ui-processDialog > .oo-ui-window-frame {
+  min-height: 5em;
+}
+
+.oo-ui-processDialog-errors {
+  padding: 3em 3em 1.5em 3em;
+  text-align: center;
+  background-color: rgba(255, 255, 255, 0.9);
+}
+
+.oo-ui-processDialog-errors .oo-ui-buttonWidget {
+  margin: 2em 1em 2em 1em;
+}
+
+.oo-ui-processDialog-errors-title {
+  margin-bottom: 2em;
+  font-size: 1.5em;
+  color: #000;
+}
+
+.oo-ui-processDialog-error {
+  padding: 1em;
+  margin: 1em;
+  text-align: right;
+  background-color: #fff7f7;
+  border: solid 1px #ff9e9e;
+  border-radius: 0.25em;
+}
+
+.oo-ui-buttonedElement.oo-ui-indicatedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
+.oo-ui-buttonedElement.oo-ui-iconedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  width: 3.35em;
+  height: 3.35em;
+  background-size: 2em auto;
+}
+
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  padding: 0 0 1em;
+}
+
+.oo-ui-optionWidget {
+  padding: 0.8em 3.35em 0.8em 1em;
+  font-weight: bold;
+  border-bottom: 1px solid #dddddd;
+}
+
+.oo-ui-optionWidget.oo-ui-indicatedElement .oo-ui-labeledElement-label {
+  padding-left: 1.5em;
+}
+
+.oo-ui-optionWidget-level-0 {
+  padding-right: 3.5em;
+}
+
+.oo-ui-optionWidget-level-0 .oo-ui-iconedElement-icon {
+  right: 1em;
+}
+
+.oo-ui-optionWidget-level-1 {
+  padding-right: 5em;
+}
+
+.oo-ui-optionWidget-level-1 .oo-ui-iconedElement-icon {
+  right: 2.5em;
+}
+
+.oo-ui-optionWidget-level-2 {
+  padding-right: 6.5em;
+}
+
+.oo-ui-optionWidget-level-2 .oo-ui-iconedElement-icon {
+  right: 4em;
+}
+
+.oo-ui-buttonOptionWidget {
+  padding: 0;
+}
+
+.oo-ui-lookupWidget-menu {
+  background-color: #fff;
+}
+
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  color: #ffffff;
+  background: #347bff;
+}
+
+.oo-ui-menuSectionItemWidget {
+  font-weight: normal;
+  color: #777777;
+  border: none;
+}
+
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  padding: .8em 1em;
+}
+
+/* Icons */
+
+.oo-ui-icon-check {
+  background: #347bff;
+  background-image: /* @embed */ url(themes/agora/images/icons/check.svg);
+}
\ No newline at end of file
index 1157ff9..1267a3c 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (a1b99bb256)
+ * OOjs UI v0.1.0-pre (dd294dc785)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-07-17T19:17:19Z
+ * Date: 2014-07-30T23:10:53Z
  */
 .oo-ui-dialog-content > .oo-ui-window-head,
 .oo-ui-dialog-content > .oo-ui-window-body,
   margin-top: -0.125em;
 }
 
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonedElement-framed {
+  margin: 0.75em 0 0.75em 0.75em;
+}
+
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
   vertical-align: middle;
 }
 
-.oo-ui-processDialog-actions-safe.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-primary.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-  margin: 0.75em;
-}
-
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
   background-color: rgba(0, 0, 0, 0.05);
   background-color: rgba(0, 0, 0, 0.1);
 }
 
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed {
+  margin: 0.75em;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
+  /* Adjust for border so text aligns with title */
+
+  margin: -1px;
+}
+
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover {
   background-color: rgba(8, 126, 204, 0.05);
   padding-right: 2.25em;
 }
 
-.oo-ui-processDialog-actions-other:not(:empty) {
-  padding: 0.75em;
-}
-
-.oo-ui-processDialog-actions-other:not(:empty) .oo-ui-actionWidget {
-  margin: 0 0.75em 0 0;
-}
-
 .oo-ui-processDialog > .oo-ui-window-frame {
   min-height: 5em;
 }
diff --git a/resources/lib/oojs-ui/oojs-ui-apex.rtl.css b/resources/lib/oojs-ui/oojs-ui-apex.rtl.css
new file mode 100644 (file)
index 0000000..3cbb677
--- /dev/null
@@ -0,0 +1,1103 @@
+/*!
+ * OOjs UI v0.1.0
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: 2014-07-22T21:39:24Z
+ */
+.oo-ui-dialog-content > .oo-ui-window-head,
+.oo-ui-dialog-content > .oo-ui-window-body,
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  position: absolute;
+  left: 0;
+  right: 0;
+  overflow: hidden;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-dialog-content > .oo-ui-window-head {
+  top: 0;
+  z-index: 1;
+}
+
+.oo-ui-dialog-content > .oo-ui-window-body {
+  top: 0;
+  bottom: 0;
+  z-index: 2;
+  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+}
+
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  bottom: 0;
+  z-index: 1;
+}
+
+.oo-ui-dialog-content > .oo-ui-window-overlay {
+  z-index: 3;
+}
+
+.oo-ui-frame-content {
+  font-family: sans-serif;
+  font-size: 0.8em;
+}
+
+.oo-ui-toolbar-bar {
+  background: #f8fbfd;
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f1f7fb));
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  border-bottom: solid 1px #ccc;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#f1f7fb');
+}
+
+.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
+  background: none;
+  border: none;
+}
+
+.oo-ui-toolbar-shadow {
+  bottom: -9px;
+  height: 9px;
+  background-image: /* @embed */ url(images/toolbar-shadow.png);
+  opacity: 0.125;
+  -webkit-transition: opacity 500ms ease-in-out;
+     -moz-transition: opacity 500ms ease-in-out;
+      -ms-transition: opacity 500ms ease-in-out;
+       -o-transition: opacity 500ms ease-in-out;
+          transition: opacity 500ms ease-in-out;
+}
+
+.oo-ui-toolGroup {
+  border: solid 1px transparent;
+  border-radius: 0.25em;
+  -webkit-transition: border-color 300ms ease-in-out;
+     -moz-transition: border-color 300ms ease-in-out;
+      -ms-transition: border-color 300ms ease-in-out;
+       -o-transition: border-color 300ms ease-in-out;
+          transition: border-color 300ms ease-in-out;
+}
+
+.oo-ui-toolGroup.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.1);
+}
+
+.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #000;
+}
+
+.oo-ui-window-content {
+  background: transparent;
+}
+
+.oo-ui-window-overlay {
+  font-family: sans-serif;
+  font-size: 1em;
+  line-height: 1.5em;
+}
+
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  background-color: rgba(255, 255, 255, 0.5);
+  opacity: 0;
+  -webkit-transition: opacity 250ms ease-in-out;
+     -moz-transition: opacity 250ms ease-in-out;
+      -ms-transition: opacity 250ms ease-in-out;
+       -o-transition: opacity 250ms ease-in-out;
+          transition: opacity 250ms ease-in-out;
+}
+
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+  top: 1em;
+  bottom: 1em;
+  background-color: #fff;
+  -webkit-transform: scale(0.5);
+     -moz-transform: scale(0.5);
+      -ms-transform: scale(0.5);
+       -o-transform: scale(0.5);
+          transform: scale(0.5);
+  -webkit-transition: all 250ms ease-in-out;
+     -moz-transition: all 250ms ease-in-out;
+      -ms-transition: all 250ms ease-in-out;
+       -o-transition: all 250ms ease-in-out;
+          transition: all 250ms ease-in-out;
+}
+
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+  opacity: 1;
+}
+
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+  -webkit-transform: scale(1);
+     -moz-transform: scale(1);
+      -ms-transform: scale(1);
+       -o-transform: scale(1);
+          transform: scale(1);
+}
+
+.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
+  border: solid 1px #ccc;
+  border-radius: 0.5em;
+  box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
+}
+
+.oo-ui-messageDialog-content .oo-ui-window-body {
+  box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
+}
+
+.oo-ui-messageDialog-title,
+.oo-ui-messageDialog-message {
+  display: block;
+  padding-top: 0.5em;
+  text-align: center;
+}
+
+.oo-ui-messageDialog-title {
+  font-size: 1.5em;
+  line-height: 1em;
+  color: #000;
+}
+
+.oo-ui-messageDialog-message {
+  font-size: 0.9em;
+  line-height: 1.25em;
+  color: #666;
+}
+
+.oo-ui-messageDialog-message-verbose {
+  font-size: 1.1em;
+  line-height: 1.5em;
+  text-align: right;
+}
+
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  border-left: solid 1px #e5e5e5;
+}
+
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
+  border-left-width: 0;
+}
+
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  border-bottom: solid 1px #e5e5e5;
+}
+
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
+  border-bottom-width: 0;
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labeledElement-label {
+  padding: 0 2em;
+  line-height: 3.4em;
+  text-align: center;
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
+  background-color: rgba(0, 0, 0, 0.05);
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
+  background-color: rgba(0, 0, 0, 0.1);
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover {
+  background-color: rgba(8, 126, 204, 0.05);
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active {
+  background-color: rgba(8, 126, 204, 0.1);
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label {
+  font-weight: bold;
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover {
+  background-color: rgba(118, 171, 54, 0.05);
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active {
+  background-color: rgba(118, 171, 54, 0.1);
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover {
+  background-color: rgba(212, 83, 83, 0.05);
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active {
+  background-color: rgba(212, 83, 83, 0.1);
+}
+
+.oo-ui-processDialog-content .oo-ui-window-head {
+  height: 3.4em;
+}
+
+.oo-ui-processDialog-content .oo-ui-window-body {
+  top: 3.4em;
+  box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
+}
+
+.oo-ui-processDialog-navigation {
+  position: relative;
+  height: 3.4em;
+  padding: 0 1em;
+}
+
+.oo-ui-processDialog-location {
+  height: 1.9em;
+  padding: 0.25em 0;
+  text-align: center;
+  cursor: default;
+}
+
+.oo-ui-processDialog-title {
+  font-weight: bold;
+  line-height: 1.9em;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonedElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonedElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonedElement-button {
+  min-width: 1.9em;
+  min-height: 1.9em;
+  padding-top: 0.75em;
+  padding-bottom: 0.75em;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labeledElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labeledElement-label,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labeledElement-label {
+  padding: 0 1em;
+  line-height: 1.9em;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconedElement-icon,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconedElement-icon,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconedElement-icon {
+  position: absolute;
+  margin-top: -0.125em;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonedElement-framed {
+  margin: 0.75em 0.75em 0.75em 0;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
+  padding: 0;
+  vertical-align: middle;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
+  background-color: rgba(0, 0, 0, 0.05);
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
+  background-color: rgba(0, 0, 0, 0.1);
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed {
+  margin: 0.75em;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
+  /* Adjust for border so text aligns with title */
+
+  margin: -1px;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover {
+  background-color: rgba(8, 126, 204, 0.05);
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active {
+  background-color: rgba(8, 126, 204, 0.1);
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label {
+  font-weight: bold;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover {
+  background-color: rgba(118, 171, 54, 0.05);
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active {
+  background-color: rgba(118, 171, 54, 0.1);
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover {
+  background-color: rgba(212, 83, 83, 0.05);
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active {
+  background-color: rgba(212, 83, 83, 0.1);
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon {
+  right: 0.5em;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-labeledElement-label {
+  padding-right: 2.25em;
+}
+
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon {
+  left: 0.5em;
+}
+
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-labeledElement-label {
+  padding-left: 2.25em;
+}
+
+.oo-ui-processDialog > .oo-ui-window-frame {
+  min-height: 5em;
+}
+
+.oo-ui-processDialog-errors {
+  padding: 3em 3em 1.5em 3em;
+  text-align: center;
+  background-color: rgba(255, 255, 255, 0.9);
+}
+
+.oo-ui-processDialog-errors .oo-ui-buttonWidget {
+  margin: 2em 1em 2em 1em;
+}
+
+.oo-ui-processDialog-errors-title {
+  margin-bottom: 2em;
+  font-size: 1.5em;
+  color: #000;
+}
+
+.oo-ui-processDialog-error {
+  padding: 1em;
+  margin: 1em;
+  text-align: right;
+  background-color: #fff7f7;
+  border: solid 1px #ff9e9e;
+  border-radius: 0.25em;
+}
+
+.oo-ui-buttonedElement > .oo-ui-buttonedElement-button {
+  color: #333;
+}
+
+.oo-ui-buttonedElement.oo-ui-indicatedElement > .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
+.oo-ui-buttonedElement.oo-ui-iconedElement > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  width: 1.9em;
+  height: 1.9em;
+  opacity: 0.8;
+}
+
+.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
+
+  /*.oo-ui-transition(opacity 200ms);*/
+
+}
+
+.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button:hover > .oo-ui-iconedElement-icon,
+.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button:focus > .oo-ui-iconedElement-icon {
+  opacity: 1;
+}
+
+.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button:hover > .oo-ui-labeledElement-label,
+.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button:focus > .oo-ui-labeledElement-label {
+  color: #000;
+}
+
+.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+  color: #333;
+}
+
+.oo-ui-buttonedElement-frameless.oo-ui-flaggableElement-primary > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+  color: #087ecc;
+}
+
+.oo-ui-buttonedElement-frameless.oo-ui-flaggableElement-constructive > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+  color: #76ab36;
+}
+
+.oo-ui-buttonedElement-frameless.oo-ui-flaggableElement-destructive > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+  color: #d45353;
+}
+
+.oo-ui-buttonedElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-buttonedElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+  color: #ccc;
+}
+
+.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button {
+  padding: 0.2em 0.8em;
+  margin: 0.1em 0;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
+  background: #eeeeee;
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  border: 1px #c9c9c9 solid;
+  border-radius: 0.3em;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
+  -webkit-transition: border-color 100ms ease-in-out;
+     -moz-transition: border-color 100ms ease-in-out;
+      -ms-transition: border-color 100ms ease-in-out;
+       -o-transition: border-color 100ms ease-in-out;
+          transition: border-color 100ms ease-in-out;
+}
+
+.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button:hover,
+.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button:focus {
+  border-color: #aaa;
+}
+
+.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
+.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
+  color: black;
+  background: #eeeeee;
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  border-color: #c9c9c9;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
+  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-iconedElement > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  margin-left: -0.5em;
+  margin-right: -0.5em;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-iconedElement.oo-ui-labeledElement > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  margin-left: 0.3em;
+  margin-right: -0.5em;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary > .oo-ui-buttonedElement-button {
+  background: #cde7f4;
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
+  background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  border: solid 1px #a6cee1;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary > .oo-ui-buttonedElement-button:hover,
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary > .oo-ui-buttonedElement-button:focus {
+  border-color: #9dc2d4;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
+  background: #cde7f4;
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
+  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  border: solid 1px #a6cee1;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive > .oo-ui-buttonedElement-button {
+  background: #daf0be;
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f0fbe1), color-stop(100%, #c3e59a));
+  background-image: -webkit-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: -moz-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: -ms-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: -o-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  border: solid 1px #b8d892;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f0fbe1', endColorstr='#c3e59a');
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive > .oo-ui-buttonedElement-button:hover,
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive > .oo-ui-buttonedElement-button:focus {
+  border-color: #adcb89;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
+  background: #daf0be;
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #c3e59a), color-stop(100%, #f0fbe1));
+  background-image: -webkit-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: -moz-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: -ms-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: -o-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  border: solid 1px #b8d892;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#c3e59a', endColorstr='#f0fbe1');
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-destructive > .oo-ui-buttonedElement-button {
+  color: #d45353;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
+  color: #333;
+  background: #eee;
+  border-color: #ccc;
+  opacity: 0.5;
+  box-shadow: none;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button:hover,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active:hover,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed:hover,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button:focus,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active:focus,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed:focus {
+  border-color: #ccc;
+  box-shadow: none;
+}
+
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  padding: 1.5em;
+}
+
+.oo-ui-bookletLayout-outlinePanel {
+  border-left: solid 1px #ddd;
+}
+
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
+}
+
+.oo-ui-fieldLayout-disabled .oo-ui-labeledElement-label {
+  color: #ccc;
+}
+
+.oo-ui-fieldsetLayout {
+  border: none;
+}
+
+.oo-ui-fieldsetLayout > .oo-ui-labeledElement-label {
+  font-size: 1.5em;
+}
+
+.oo-ui-panelLayout-padded {
+  padding: 1.25em;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool {
+  margin: -1px -1px -1px 0;
+  border: solid 1px transparent;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool:first-child {
+  border-bottom-right-radius: 0.25em;
+  border-top-right-radius: 0.25em;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool:last-child {
+  margin-left: -1px;
+  border-top-left-radius: 0.25em;
+  border-bottom-left-radius: 0.25em;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 0.8;
+}
+
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
+  background: #f8fbfd;
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  border-color: rgba(0, 0, 0, 0.2);
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+}
+
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
+  border-right-color: rgba(0, 0, 0, 0.1);
+}
+
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 0.8;
+}
+
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 1;
+}
+
+.oo-ui-barToolGroup.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-listToolGroup .oo-ui-tool {
+  margin: -1px 0;
+  border: solid 1px transparent;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
+  background: #f8fbfd;
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  border-color: rgba(0, 0, 0, 0.1);
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+}
+
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
+  border-top-color: rgba(0, 0, 0, 0.1);
+}
+
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 0.8;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 1;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #ccc;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-listToolGroup.oo-ui-widget-disabled {
+  color: #ccc;
+}
+
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatedElement-indicator,
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-menuToolGroup {
+  border-color: rgba(0, 0, 0, 0.1);
+}
+
+.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
+  border-color: rgba(0, 0, 0, 0.25);
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+  background-color: #e1f3ff;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #ccc;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-menuToolGroup.oo-ui-widget-disabled {
+  color: #ccc;
+  border-color: rgba(0, 0, 0, 0.05);
+}
+
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatedElement-indicator,
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
+  opacity: 0.8;
+}
+
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  background-color: white;
+  border: solid 1px #ccc;
+  box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
+}
+
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled {
+  background: #f8fbfd;
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  border-bottom-left-radius: 0;
+  border-bottom-right-radius: 0;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+}
+
+.oo-ui-optionWidget {
+  padding: 0.5em 3em 0.5em 2em;
+}
+
+.oo-ui-optionWidget-highlighted {
+  background-color: #e1f3ff;
+}
+
+.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
+  background-color: #a7dcff;
+}
+
+.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
+  background-color: #a7dcff;
+}
+
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  color: #ccc;
+}
+
+.oo-ui-menuWidget {
+  margin-top: -1px;
+  background: #fff;
+  border: solid 1px #ccc;
+  border-radius: 0 0 0.25em 0.25em;
+  box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-popupWidget-popup {
+  background-color: #fff;
+  border: solid 1px #ccc;
+  border-radius: 0.25em;
+  box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+  width: 15px;
+  height: 8px;
+  margin-right: -7px;
+  background-image: /* @embed */ url(images/anchor.svg);
+}
+
+.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
+  -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+     -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+      -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+       -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+          transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+}
+
+.oo-ui-popupWidget-body {
+  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+}
+
+.oo-ui-buttonGroupWidget {
+  display: inline-block;
+  white-space: nowrap;
+}
+
+.oo-ui-buttonOptionWidget {
+  padding: 0;
+}
+
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
+  background-color: transparent;
+}
+
+.oo-ui-buttonSelectWidget {
+  border-radius: 0.3em;
+}
+
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button {
+  margin-right: -1px;
+  border-radius: 0;
+}
+
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonedElement-button {
+  margin-right: 0;
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+}
+
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonedElement-button {
+  border-top-left-radius: 0.3em;
+  border-bottom-left-radius: 0.3em;
+}
+
+.oo-ui-inlineMenuWidget-handle {
+  border: solid 1px rgba(0, 0, 0, 0.1);
+  border-radius: 0.25em;
+}
+
+.oo-ui-inlineMenuWidget-handle:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
+  opacity: 0.8;
+}
+
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+  color: #ccc;
+  text-shadow: 0 1px 1px #fff;
+  background-color: #f3f3f3;
+  border-color: #ddd;
+}
+
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatedElement-indicator {
+  opacity: 0.2;
+}
+
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
+}
+
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted,
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
+  background-color: #e1f3ff;
+}
+
+.oo-ui-menuSectionItemWidget {
+  padding: 0.33em 0.75em;
+  color: #888;
+}
+
+.oo-ui-outlineControlsWidget {
+  background-color: #fff;
+}
+
+.oo-ui-outlineControlsWidget > .oo-ui-iconedElement-icon {
+  opacity: 0.2;
+}
+
+.oo-ui-outlineItemWidget {
+  font-size: 1.1em;
+}
+
+.oo-ui-outlineItemWidget.oo-ui-indicatedElement .oo-ui-labeledElement-label {
+  padding-left: 1.5em;
+}
+
+.oo-ui-outlineItemWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator {
+  opacity: 0.5;
+}
+
+.oo-ui-outlineItemWidget-level-0 {
+  padding-right: 3.5em;
+}
+
+.oo-ui-outlineItemWidget-level-0 .oo-ui-iconedElement-icon {
+  right: 1em;
+}
+
+.oo-ui-outlineItemWidget-level-1 {
+  padding-right: 5em;
+}
+
+.oo-ui-outlineItemWidget-level-1 .oo-ui-iconedElement-icon {
+  right: 2.5em;
+}
+
+.oo-ui-outlineItemWidget-level-2 {
+  padding-right: 6.5em;
+}
+
+.oo-ui-outlineItemWidget-level-2 .oo-ui-iconedElement-icon {
+  right: 4em;
+}
+
+.oo-ui-selectWidget-depressed .oo-ui-outlineItemWidget.oo-ui-optionWidget-selected {
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
+  background-color: #a7dcff;
+}
+
+.oo-ui-outlineItemWidget.oo-ui-flaggableElement-important {
+  font-weight: bold;
+}
+
+.oo-ui-outlineItemWidget.oo-ui-flaggableElement-placeholder {
+  font-style: italic;
+}
+
+.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-iconedElement-icon {
+  opacity: 0.5;
+}
+
+.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-labeledElement-label {
+  color: #777;
+}
+
+.oo-ui-searchWidget-query {
+  box-shadow: 0 0 0.5em rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-textInputWidget {
+  width: 20em;
+}
+
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  padding: 0.5em;
+  font-family: sans-serif;
+  font-size: 1em;
+  background-color: #fff;
+  border: solid 1px #ccc;
+  border-radius: 0.25em;
+  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
+  -webkit-transition: border-color 200ms, box-shadow 200ms;
+     -moz-transition: border-color 200ms, box-shadow 200ms;
+      -ms-transition: border-color 200ms, box-shadow 200ms;
+       -o-transition: border-color 200ms, box-shadow 200ms;
+          transition: border-color 200ms, box-shadow 200ms;
+}
+
+.oo-ui-textInputWidget-decorated input,
+.oo-ui-textInputWidget-decorated textarea {
+  padding-right: 2em;
+}
+
+.oo-ui-textInputWidget-icon {
+  width: 2em;
+}
+
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
+  border-color: #a7dcff;
+  outline: none;
+  box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
+}
+
+.oo-ui-textInputWidget input[readonly],
+.oo-ui-textInputWidget textarea[readonly] {
+  color: #777;
+  text-shadow: 0 1px 1px #fff;
+}
+
+.oo-ui-textInputWidget-pending input,
+.oo-ui-textInputWidget-pending textarea {
+  background-color: transparent;
+}
+
+.oo-ui-textInputWidget.oo-ui-widget-disabled input,
+.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+  color: #ccc;
+  text-shadow: 0 1px 1px #fff;
+  background-color: #f3f3f3;
+  border-color: #ddd;
+}
+
+.oo-ui-toggleSwitchWidget {
+  background: #eeeeee;
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  border: solid 1px #ccc;
+  border-radius: 1em;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
+  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
+}
+
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+  opacity: 0.5;
+}
+
+.oo-ui-toggleSwitchWidget-grip {
+  background: #eeeeee;
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  border: 1px #c9c9c9 solid;
+  border-radius: 1em;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
+  box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
+}
+
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
+  border-color: #aaa;
+}
+
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  background: #cde7f4;
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
+  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  border-radius: 1em;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
+  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+}
+
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
+  opacity: 1;
+}
+
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: block;
+  opacity: 0;
+}
\ No newline at end of file
index 6c8deda..737113e 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (a1b99bb256)
+ * OOjs UI v0.1.0-pre (dd294dc785)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-07-17T19:17:19Z
+ * Date: 2014-07-30T23:10:53Z
  */
 ( function ( OO ) {
 
@@ -26,22 +26,22 @@ OO.ui.bind = $.proxy;
  * @property {Object}
  */
 OO.ui.Keys = {
-       'UNDEFINED': 0,
-       'BACKSPACE': 8,
-       'DELETE': 46,
-       'LEFT': 37,
-       'RIGHT': 39,
-       'UP': 38,
-       'DOWN': 40,
-       'ENTER': 13,
-       'END': 35,
-       'HOME': 36,
-       'TAB': 9,
-       'PAGEUP': 33,
-       'PAGEDOWN': 34,
-       'ESCAPE': 27,
-       'SHIFT': 16,
-       'SPACE': 32
+       UNDEFINED: 0,
+       BACKSPACE: 8,
+       DELETE: 46,
+       LEFT: 37,
+       RIGHT: 39,
+       UP: 38,
+       DOWN: 40,
+       ENTER: 13,
+       END: 35,
+       HOME: 36,
+       TAB: 9,
+       PAGEUP: 33,
+       PAGEDOWN: 34,
+       ESCAPE: 27,
+       SHIFT: 16,
+       SPACE: 32
 };
 
 /**
@@ -208,9 +208,9 @@ OO.ui.ActionSet = function OoUiActionSet( config ) {
        // Properties
        this.list = [];
        this.categories = {
-               'actions': 'getAction',
-               'flags': 'getFlags',
-               'modes': 'getModes'
+               actions: 'getAction',
+               flags: 'getFlags',
+               modes: 'getModes'
        };
        this.categorized = {};
        this.special = {};
@@ -469,9 +469,9 @@ OO.ui.ActionSet.prototype.add = function ( actions ) {
        for ( i = 0, len = actions.length; i < len; i++ ) {
                action = actions[i];
                action.connect( this, {
-                       'click': [ 'emit', 'click', action ],
-                       'resize': [ 'emit', 'resize', action ],
-                       'toggle': [ 'onActionChange' ]
+                       click: [ 'emit', 'click', action ],
+                       resize: [ 'emit', 'resize', action ],
+                       toggle: [ 'onActionChange' ]
                } );
                this.list.push( action );
        }
@@ -746,7 +746,7 @@ OO.ui.Element.getFrameOffset = function ( from, to, offset ) {
                to = window;
        }
        if ( !offset ) {
-               offset = { 'top': 0, 'left': 0 };
+               offset = { top: 0, left: 0 };
        }
        if ( from.parent === from ) {
                return offset;
@@ -784,7 +784,7 @@ OO.ui.Element.getFrameOffset = function ( from, to, offset ) {
 OO.ui.Element.getRelativePosition = function ( $from, $to ) {
        var from = $from.offset(),
                to = $to.offset();
-       return { 'top': Math.round( from.top - to.top ), 'left': Math.round( from.left - to.left ) };
+       return { top: Math.round( from.top - to.top ), left: Math.round( from.left - to.left ) };
 };
 
 /**
@@ -807,10 +807,10 @@ OO.ui.Element.getBorders = function ( el ) {
                right = parseFloat( style ? style.borderRightWidth : $el.css( 'borderRightWidth' ) ) || 0;
 
        return {
-               'top': Math.round( top ),
-               'left': Math.round( left ),
-               'bottom': Math.round( bottom ),
-               'right': Math.round( right )
+               top: Math.round( top ),
+               left: Math.round( left ),
+               bottom: Math.round( bottom ),
+               right: Math.round( right )
        };
 };
 
@@ -829,32 +829,32 @@ OO.ui.Element.getDimensions = function ( el ) {
        if ( win === el || el === doc.documentElement ) {
                $win = $( win );
                return {
-                       'borders': { 'top': 0, 'left': 0, 'bottom': 0, 'right': 0 },
-                       'scroll': {
-                               'top': $win.scrollTop(),
-                               'left': $win.scrollLeft()
+                       borders: { top: 0, left: 0, bottom: 0, right: 0 },
+                       scroll: {
+                               top: $win.scrollTop(),
+                               left: $win.scrollLeft()
                        },
-                       'scrollbar': { 'right': 0, 'bottom': 0 },
-                       'rect': {
-                               'top': 0,
-                               'left': 0,
-                               'bottom': $win.innerHeight(),
-                               'right': $win.innerWidth()
+                       scrollbar: { right: 0, bottom: 0 },
+                       rect: {
+                               top: 0,
+                               left: 0,
+                               bottom: $win.innerHeight(),
+                               right: $win.innerWidth()
                        }
                };
        } else {
                $el = $( el );
                return {
-                       'borders': this.getBorders( el ),
-                       'scroll': {
-                               'top': $el.scrollTop(),
-                               'left': $el.scrollLeft()
+                       borders: this.getBorders( el ),
+                       scroll: {
+                               top: $el.scrollTop(),
+                               left: $el.scrollLeft()
                        },
-                       'scrollbar': {
-                               'right': $el.innerWidth() - el.clientWidth,
-                               'bottom': $el.innerHeight() - el.clientHeight
+                       scrollbar: {
+                               right: $el.innerWidth() - el.clientWidth,
+                               bottom: $el.innerHeight() - el.clientHeight
                        },
-                       'rect': el.getBoundingClientRect()
+                       rect: el.getBoundingClientRect()
                };
        }
 };
@@ -922,18 +922,18 @@ OO.ui.Element.scrollIntoView = function ( el, config ) {
        if ( $sc.is( 'body' ) ) {
                // If the scrollable container is the <body> this is easy
                rel = {
-                       'top': eld.rect.top,
-                       'bottom': $win.innerHeight() - eld.rect.bottom,
-                       'left': eld.rect.left,
-                       'right': $win.innerWidth() - eld.rect.right
+                       top: eld.rect.top,
+                       bottom: $win.innerHeight() - eld.rect.bottom,
+                       left: eld.rect.left,
+                       right: $win.innerWidth() - eld.rect.right
                };
        } else {
                // Otherwise, we have to subtract el's coordinates from sc's coordinates
                rel = {
-                       'top': eld.rect.top - ( scd.rect.top + scd.borders.top ),
-                       'bottom': scd.rect.bottom - scd.borders.bottom - scd.scrollbar.bottom - eld.rect.bottom,
-                       'left': eld.rect.left - ( scd.rect.left + scd.borders.left ),
-                       'right': scd.rect.right - scd.borders.right - scd.scrollbar.right - eld.rect.right
+                       top: eld.rect.top - ( scd.rect.top + scd.borders.top ),
+                       bottom: scd.rect.bottom - scd.borders.bottom - scd.scrollbar.bottom - eld.rect.bottom,
+                       left: eld.rect.left - ( scd.rect.left + scd.borders.left ),
+                       right: scd.rect.right - scd.borders.right - scd.scrollbar.right - eld.rect.right
                };
        }
 
@@ -1118,7 +1118,7 @@ OO.ui.Frame = function OoUiFrame( config ) {
        // Initialize
        this.$element
                .addClass( 'oo-ui-frame' )
-               .attr( { 'frameborder': 0, 'scrolling': 'no' } );
+               .attr( { frameborder: 0, scrolling: 'no' } );
 
 };
 
@@ -1292,10 +1292,13 @@ OO.ui.Frame.prototype.load = function () {
 
        // Initialize contents
        doc.open();
+       // The following classes can be used here:
+       // oo-ui-ltr
+       // oo-ui-rtl
        doc.write(
                '<!doctype html>' +
                '<html>' +
-                       '<body class="oo-ui-frame-content oo-ui-' + this.dir + '" style="direction:' + this.dir + ';" dir="' + this.dir + '">' +
+                       '<body class="oo-ui-frame-content oo-ui-' + this.dir + '" dir="' + this.dir + '">' +
                        '</body>' +
                '</html>'
        );
@@ -1324,7 +1327,7 @@ OO.ui.Frame.prototype.load = function () {
  * @chainable
  */
 OO.ui.Frame.prototype.setSize = function ( width, height ) {
-       this.$element.css( { 'width': width, 'height': height } );
+       this.$element.css( { width: width, height: height } );
        return this;
 };
 
@@ -1372,7 +1375,7 @@ OO.mixinClass( OO.ui.Layout, OO.EventEmitter );
  */
 OO.ui.Widget = function OoUiWidget( config ) {
        // Initialize config
-       config = $.extend( { 'disabled': false }, config );
+       config = $.extend( { disabled: false }, config );
 
        // Parent constructor
        OO.ui.Widget.super.call( this, config );
@@ -1546,7 +1549,7 @@ OO.ui.Window = function OoUiWindow( manager, config ) {
        this.opened = null;
        this.timing = null;
        this.size = config.size || this.constructor.static.size;
-       this.frame = new OO.ui.Frame( { '$': this.$ } );
+       this.frame = new OO.ui.Frame( { $: this.$ } );
        this.$frame = this.$( '<div>' );
        this.$ = function () {
                throw new Error( 'this.$() cannot be used until the frame has been initialized.' );
@@ -1800,14 +1803,14 @@ OO.ui.Window.prototype.setSize = function ( size ) {
 OO.ui.Window.prototype.setDimensions = function ( dim ) {
        // Apply width before height so height is not based on wrapping content using the wrong width
        this.$frame.css( {
-               'width': dim.width || '',
-               'min-width': dim.minWidth || '',
-               'max-width': dim.maxWidth || ''
+               width: dim.width || '',
+               minWidth: dim.minWidth || '',
+               maxWidth: dim.maxWidth || ''
        } );
        this.$frame.css( {
-               'height': ( dim.height !== undefined ? dim.height : this.getContentHeight() ) || '',
-               'min-height': dim.minHeight || '',
-               'max-height': dim.maxHeight || ''
+               height: ( dim.height !== undefined ? dim.height : this.getContentHeight() ) || '',
+               minHeight: dim.minHeight || '',
+               maxHeight: dim.maxHeight || ''
        } );
        return this;
 };
@@ -1920,7 +1923,7 @@ OO.ui.Window.prototype.ready = function ( data ) {
        var win = this,
                deferred = $.Deferred();
 
-       this.frame.$content.focus();
+       this.frame.$content[0].focus();
        this.getReadyProcess( data ).execute().done( function () {
                // Force redraw by asking the browser to measure the elements' widths
                win.$element.addClass( 'oo-ui-window-ready' ).width();
@@ -1945,7 +1948,10 @@ OO.ui.Window.prototype.hold = function ( data ) {
                deferred = $.Deferred();
 
        this.getHoldProcess( data ).execute().done( function () {
-               win.frame.$content.find( ':focus' ).blur();
+               var $focused = win.frame.$content.find( ':focus' );
+               if ( $focused.length ) {
+                       $focused[0].blur();
+               }
                // Force redraw by asking the browser to measure the elements' widths
                win.$element.removeClass( 'oo-ui-window-ready' ).width();
                win.frame.$content.removeClass( 'oo-ui-window-content-ready' ).width();
@@ -2021,9 +2027,9 @@ OO.ui.Dialog = function OoUiDialog( manager, config ) {
 
        // Events
        this.actions.connect( this, {
-               'click': 'onActionClick',
-               'resize': 'onActionResize',
-               'change': 'onActionsChange'
+               click: 'onActionClick',
+               resize: 'onActionResize',
+               change: 'onActionsChange'
        } );
 
        // Initialization
@@ -2185,7 +2191,7 @@ OO.ui.Dialog.prototype.getSetupProcess = function ( data ) {
                        );
                        for ( i = 0, len = actions.length; i < len; i++ ) {
                                items.push(
-                                       new OO.ui.ActionWidget( $.extend( { '$': this.$ }, actions[i] ) )
+                                       new OO.ui.ActionWidget( $.extend( { $: this.$ }, actions[i] ) )
                                );
                        }
                        this.actions.add( items );
@@ -2212,7 +2218,7 @@ OO.ui.Dialog.prototype.initialize = function () {
        OO.ui.Dialog.super.prototype.initialize.call( this );
 
        // Properties
-       this.title = new OO.ui.LabelWidget( { '$': this.$ } );
+       this.title = new OO.ui.LabelWidget( { $: this.$ } );
 
        // Events
        if ( this.constructor.static.escapable ) {
@@ -2318,7 +2324,7 @@ OO.ui.Dialog.prototype.popPending = function () {
  *
  * - {@link #closeWindow} or {@link OO.ui.Window#close} methods are used to start closing
  * - `opened` promise is resolved with `closing` promise
- * - {@link #event-opening} is emitted with `closing` promise
+ * - {@link #event-closing} is emitted with `closing` promise
  * - {@link #getHoldDelay} is called the returned value is used to time a pause in execution
  * - {@link OO.ui.Window#getHoldProcess} method is called on the window and its result executed
  * - `hold` progress notification is emitted from opening promise
@@ -2413,19 +2419,19 @@ OO.mixinClass( OO.ui.WindowManager, OO.EventEmitter );
  * @property {Object}
  */
 OO.ui.WindowManager.static.sizes = {
-       'small': {
-               'width': 300
+       small: {
+               width: 300
        },
-       'medium': {
-               'width': 500
+       medium: {
+               width: 500
        },
-       'large': {
-               'width': 700
+       large: {
+               width: 700
        },
-       'full': {
+       full: {
                // These can be non-numeric because they are never used in calculations
-               'width': '100%',
-               'height': '100%'
+               width: '100%',
+               height: '100%'
        }
 };
 
@@ -2603,7 +2609,7 @@ OO.ui.WindowManager.prototype.getWindow = function ( name ) {
                                        'Cannot auto-instantiate window: symbolic name is unrecognized by the factory'
                                ) );
                        } else {
-                               win = this.factory.create( name, this, { '$': this.$ } );
+                               win = this.factory.create( name, this, { $: this.$ } );
                                this.addWindows( [ win ] ).then(
                                        OO.ui.bind( deferred.resolve, deferred, win ),
                                        deferred.reject
@@ -2676,11 +2682,11 @@ OO.ui.WindowManager.prototype.openWindow = function ( win, data ) {
                        if ( manager.modal ) {
                                manager.$( manager.getElementDocument() ).on( {
                                        // Prevent scrolling by keys in top-level window
-                                       'keydown': manager.onDocumentKeyDownHandler
+                                       keydown: manager.onDocumentKeyDownHandler
                                } );
                                manager.$( manager.getElementWindow() ).on( {
                                        // Prevent scrolling by wheel in top-level window
-                                       'mousewheel': manager.onWindowMouseWheelHandler,
+                                       mousewheel: manager.onWindowMouseWheelHandler,
                                        // Start listening for top-level window dimension changes
                                        'orientationchange resize': manager.onWindowResizeHandler
                                } );
@@ -2696,10 +2702,10 @@ OO.ui.WindowManager.prototype.openWindow = function ( win, data ) {
                        manager.updateWindowSize( win );
                        setTimeout( function () {
                                win.setup( data ).then( function () {
-                                       manager.opening.notify( { 'state': 'setup' } );
+                                       manager.opening.notify( { state: 'setup' } );
                                        setTimeout( function () {
                                                win.ready( data ).then( function () {
-                                                       manager.opening.notify( { 'state': 'ready' } );
+                                                       manager.opening.notify( { state: 'ready' } );
                                                        manager.opening = null;
                                                        manager.opened = $.Deferred();
                                                        opening.resolve( manager.opened.promise(), data );
@@ -2766,18 +2772,18 @@ OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) {
                        opened.resolve( closing.promise(), data );
                        setTimeout( function () {
                                win.hold( data ).then( function () {
-                                       closing.notify( { 'state': 'hold' } );
+                                       closing.notify( { state: 'hold' } );
                                        setTimeout( function () {
                                                win.teardown( data ).then( function () {
-                                                       closing.notify( { 'state': 'teardown' } );
+                                                       closing.notify( { state: 'teardown' } );
                                                        if ( manager.modal ) {
                                                                manager.$( manager.getElementDocument() ).off( {
                                                                        // Allow scrolling by keys in top-level window
-                                                                       'keydown': manager.onDocumentKeyDownHandler
+                                                                       keydown: manager.onDocumentKeyDownHandler
                                                                } );
                                                                manager.$( manager.getElementWindow() ).off( {
                                                                        // Allow scrolling by wheel in top-level window
-                                                                       'mousewheel': manager.onWindowMouseWheelHandler,
+                                                                       mousewheel: manager.onWindowMouseWheelHandler,
                                                                        // Stop listening for top-level window dimension changes
                                                                        'orientationchange resize': manager.onWindowResizeHandler
                                                                } );
@@ -3088,16 +3094,16 @@ OO.ui.Process.prototype.execute = function () {
 OO.ui.Process.prototype.createStep = function ( step, context ) {
        if ( typeof step === 'number' || $.isFunction( step.promise ) ) {
                return {
-                       'callback': function () {
+                       callback: function () {
                                return step;
                        },
-                       'context': null
+                       context: null
                };
        }
        if ( $.isFunction( step ) ) {
                return {
-                       'callback': step,
-                       'context': context
+                       callback: step,
+                       context: context
                };
        }
        throw new Error( 'Cannot create process step: number, promise or function expected' );
@@ -3173,8 +3179,8 @@ OO.ui.ToolFactory.prototype.getTools = function ( include, exclude, promote, dem
  *
  * Tools can be specified in the following ways:
  *
- * - A specific tool: `{ 'name': 'tool-name' }` or `'tool-name'`
- * - All tools in a group: `{ 'group': 'group-name' }`
+ * - A specific tool: `{ name: 'tool-name' }` or `'tool-name'`
+ * - All tools in a group: `{ group: 'group-name' }`
  * - All tools: `'*'`
  *
  * @private
@@ -3207,7 +3213,7 @@ OO.ui.ToolFactory.prototype.extract = function ( collection, used ) {
                        item = collection[i];
                        // Allow plain strings as shorthand for named tools
                        if ( typeof item === 'string' ) {
-                               item = { 'name': item };
+                               item = { name: item };
                        }
                        if ( OO.isPlainObject( item ) ) {
                                if ( item.group ) {
@@ -3549,9 +3555,10 @@ OO.ui.ClippableElement.prototype.clip = function () {
 
        var buffer = 10,
                cOffset = this.$clippable.offset(),
-               ccOffset = this.$clippableContainer.offset() || { 'top': 0, 'left': 0 },
-               ccHeight = this.$clippableContainer.innerHeight() - buffer,
-               ccWidth = this.$clippableContainer.innerWidth() - buffer,
+               $container = this.$clippableContainer.is( 'body' ) ? this.$clippableWindow : this.$clippableContainer,
+               ccOffset = $container.offset() || { top: 0, left: 0 },
+               ccHeight = $container.innerHeight() - buffer,
+               ccWidth = $container.innerWidth() - buffer,
                scrollTop = this.$clippableScroller.scrollTop(),
                scrollLeft = this.$clippableScroller.scrollLeft(),
                desiredWidth = ( ccOffset.left + scrollLeft + ccWidth ) - cOffset.left,
@@ -3562,18 +3569,18 @@ OO.ui.ClippableElement.prototype.clip = function () {
                clipHeight = desiredHeight < naturalHeight;
 
        if ( clipWidth ) {
-               this.$clippable.css( { 'overflow-x': 'auto', 'width': desiredWidth } );
+               this.$clippable.css( { overflowX: 'auto', width: desiredWidth } );
        } else {
                this.$clippable.css( 'width', this.idealWidth || '' );
                this.$clippable.width(); // Force reflow for https://code.google.com/p/chromium/issues/detail?id=387290
-               this.$clippable.css( 'overflow-x', '' );
+               this.$clippable.css( 'overflowX', '' );
        }
        if ( clipHeight ) {
-               this.$clippable.css( { 'overflow-y': 'auto', 'height': desiredHeight } );
+               this.$clippable.css( { overflowY: 'auto', height: desiredHeight } );
        } else {
                this.$clippable.css( 'height', this.idealHeight || '' );
                this.$clippable.height(); // Force reflow for https://code.google.com/p/chromium/issues/detail?id=387290
-               this.$clippable.css( 'overflow-y', '' );
+               this.$clippable.css( 'overflowY', '' );
        }
 
        this.clipped = clipWidth || clipHeight;
@@ -3947,7 +3954,7 @@ OO.initClass( OO.ui.IconedElement );
  * additional icon names keyed by language code.
  *
  * Example of i18n icon definition:
- *     { 'default': 'bold-a', 'en': 'bold-b', 'de': 'bold-f' }
+ *     { default: 'bold-a', en: 'bold-b', de: 'bold-f' }
  *
  * @static
  * @inheritable
@@ -4023,7 +4030,7 @@ OO.ui.IndicatedElement = function OoUiIndicatedElement( $indicator, config ) {
        // Initialization
        this.$indicator.addClass( 'oo-ui-indicatedElement-indicator' );
        this.setIndicator( config.indicator || this.constructor.static.indicator );
-       this.setIndicatorTitle( config.indicatorTitle  || this.constructor.static.indicatorTitle );
+       this.setIndicatorTitle( config.indicatorTitle || this.constructor.static.indicatorTitle );
 };
 
 /* Setup */
@@ -4207,7 +4214,7 @@ OO.ui.LabeledElement.prototype.getLabel = function () {
  */
 OO.ui.LabeledElement.prototype.fitLabel = function () {
        if ( this.$label.autoEllipsis && this.autoFitLabel ) {
-               this.$label.autoEllipsis( { 'hasSpan': false, 'tooltip': true } );
+               this.$label.autoEllipsis( { hasSpan: false, tooltip: true } );
        }
        return this;
 };
@@ -4229,9 +4236,9 @@ OO.ui.PopuppableElement = function OoUiPopuppableElement( config ) {
 
        // Properties
        this.popup = new OO.ui.PopupWidget( $.extend(
-               { 'autoClose': true },
+               { autoClose: true },
                config.popup,
-               { '$': this.$, '$autoCloseIgnore': this.$element }
+               { $: this.$, $autoCloseIgnore: this.$element }
        ) );
 };
 
@@ -4348,7 +4355,7 @@ OO.ui.Tool = function OoUiTool( toolGroup, config ) {
        this.title = null;
 
        // Events
-       this.toolbar.connect( this, { 'updateState': 'onUpdateState' } );
+       this.toolbar.connect( this, { updateState: 'onUpdateState' } );
 
        // Initialization
        this.$title.addClass( 'oo-ui-tool-title' );
@@ -4608,7 +4615,7 @@ OO.ui.Toolbar = function OoUiToolbar( toolFactory, toolGroupFactory, config ) {
        // Events
        this.$element
                .add( this.$bar ).add( this.$group ).add( this.$actions )
-               .on( 'mousedown', OO.ui.bind( this.onMouseDown, this ) );
+               .on( 'mousedown touchstart', OO.ui.bind( this.onPointerDown, this ) );
 
        // Initialization
        this.$group.addClass( 'oo-ui-toolbar-tools' );
@@ -4655,7 +4662,7 @@ OO.ui.Toolbar.prototype.getToolGroupFactory = function () {
  *
  * @param {jQuery.Event} e Mouse down event
  */
-OO.ui.Toolbar.prototype.onMouseDown = function ( e ) {
+OO.ui.Toolbar.prototype.onPointerDown = function ( e ) {
        var $closestWidgetToEvent = this.$( e.target ).closest( '.oo-ui-widget' ),
                $closestWidgetToToolbar = this.$element.closest( '.oo-ui-widget' );
        if ( !$closestWidgetToEvent.length || $closestWidgetToEvent[0] === $closestWidgetToToolbar[0] ) {
@@ -4676,8 +4683,8 @@ OO.ui.Toolbar.prototype.initialize = function () {
  *
  * Tools can be specified in the following ways:
  *
- * - A specific tool: `{ 'name': 'tool-name' }` or `'tool-name'`
- * - All tools in a group: `{ 'group': 'group-name' }`
+ * - A specific tool: `{ name: 'tool-name' }` or `'tool-name'`
+ * - All tools in a group: `{ group: 'group-name' }`
  * - All tools: `'*'` - Using this will make the group a list with a "More" label by default
  *
  * @param {Object.<string,Array>} groups List of tool group configurations
@@ -4709,7 +4716,7 @@ OO.ui.Toolbar.prototype.setup = function ( groups ) {
                // Check type has been registered
                type = this.getToolGroupFactory().lookup( group.type ) ? group.type : defaultType;
                items.push(
-                       this.getToolGroupFactory().create( type, this, $.extend( { '$': this.$ }, group ) )
+                       this.getToolGroupFactory().create( type, this, $.extend( { $: this.$ }, group ) )
                );
        }
        this.addItems( items );
@@ -4784,8 +4791,8 @@ OO.ui.Toolbar.prototype.getToolAccelerator = function () {
  *
  * Tools can be specified in the following ways:
  *
- * - A specific tool: `{ 'name': 'tool-name' }` or `'tool-name'`
- * - All tools in a group: `{ 'group': 'group-name' }`
+ * - A specific tool: `{ name: 'tool-name' }` or `'tool-name'`
+ * - All tools in a group: `{ group: 'group-name' }`
  * - All tools: `'*'`
  *
  * @abstract
@@ -4824,14 +4831,14 @@ OO.ui.ToolGroup = function OoUiToolGroup( toolbar, config ) {
 
        // Events
        this.$element.on( {
-               'mousedown': OO.ui.bind( this.onMouseDown, this ),
-               'mouseup': OO.ui.bind( this.onMouseUp, this ),
-               'mouseover': OO.ui.bind( this.onMouseOver, this ),
-               'mouseout': OO.ui.bind( this.onMouseOut, this )
+               'mousedown touchstart': OO.ui.bind( this.onPointerDown, this ),
+               'mouseup touchend': OO.ui.bind( this.onPointerUp, this ),
+               mouseover: OO.ui.bind( this.onMouseOver, this ),
+               mouseout: OO.ui.bind( this.onMouseOut, this )
        } );
-       this.toolbar.getToolFactory().connect( this, { 'register': 'onToolFactoryRegister' } );
-       this.aggregate( { 'disable': 'itemDisable' } );
-       this.connect( this, { 'itemDisable': 'updateDisabled' } );
+       this.toolbar.getToolFactory().connect( this, { register: 'onToolFactoryRegister' } );
+       this.aggregate( { disable: 'itemDisable' } );
+       this.connect( this, { itemDisable: 'updateDisabled' } );
 
        // Initialization
        this.$group.addClass( 'oo-ui-toolGroup-tools' );
@@ -4914,8 +4921,9 @@ OO.ui.ToolGroup.prototype.updateDisabled = function () {
  *
  * @param {jQuery.Event} e Mouse down event
  */
-OO.ui.ToolGroup.prototype.onMouseDown = function ( e ) {
-       if ( !this.isDisabled() && e.which === 1 ) {
+OO.ui.ToolGroup.prototype.onPointerDown = function ( e ) {
+       // e.which is 0 for touch events, 1 for left mouse button
+       if ( !this.isDisabled() && e.which <= 1 ) {
                this.pressed = this.getTargetTool( e );
                if ( this.pressed ) {
                        this.pressed.setActive( true );
@@ -4934,9 +4942,9 @@ OO.ui.ToolGroup.prototype.onMouseDown = function ( e ) {
  */
 OO.ui.ToolGroup.prototype.onCapturedMouseUp = function ( e ) {
        this.getElementDocument().removeEventListener( 'mouseup', this.onCapturedMouseUpHandler, true );
-       // onMouseUp may be called a second time, depending on where the mouse is when the button is
+       // onPointerUp may be called a second time, depending on where the mouse is when the button is
        // released, but since `this.pressed` will no longer be true, the second call will be ignored.
-       this.onMouseUp( e );
+       this.onPointerUp( e );
 };
 
 /**
@@ -4944,10 +4952,11 @@ OO.ui.ToolGroup.prototype.onCapturedMouseUp = function ( e ) {
  *
  * @param {jQuery.Event} e Mouse up event
  */
-OO.ui.ToolGroup.prototype.onMouseUp = function ( e ) {
+OO.ui.ToolGroup.prototype.onPointerUp = function ( e ) {
        var tool = this.getTargetTool( e );
 
-       if ( !this.isDisabled() && e.which === 1 && this.pressed && this.pressed === tool ) {
+       // e.which is 0 for touch events, 1 for left mouse button
+       if ( !this.isDisabled() && e.which <= 1 && this.pressed && this.pressed === tool ) {
                this.pressed.onSelect();
        }
 
@@ -5157,8 +5166,8 @@ OO.ui.MessageDialog.static.title = null;
 OO.ui.MessageDialog.static.message = null;
 
 OO.ui.MessageDialog.static.actions = [
-       { 'label': OO.ui.deferMsg( 'ooui-dialog-message-accept' ), 'flags': 'primary' },
-       { 'label': OO.ui.deferMsg( 'ooui-dialog-message-reject' ), 'flags': 'safe' }
+       { action: 'accept', label: OO.ui.deferMsg( 'ooui-dialog-message-accept' ), flags: 'primary' },
+       { action: 'reject', label: OO.ui.deferMsg( 'ooui-dialog-message-reject' ), flags: 'safe' }
 ];
 
 /* Methods */
@@ -5196,7 +5205,7 @@ OO.ui.MessageDialog.prototype.toggleVerticalActionLayout = function ( value ) {
 OO.ui.MessageDialog.prototype.getActionProcess = function ( action ) {
        if ( action ) {
                return new OO.ui.Process( function () {
-                       this.close( { 'action': action } );
+                       this.close( { action: action } );
                }, this );
        }
        return OO.ui.MessageDialog.super.prototype.getActionProcess.call( this, action );
@@ -5248,13 +5257,13 @@ OO.ui.MessageDialog.prototype.initialize = function () {
        // Properties
        this.$actions = this.$( '<div>' );
        this.container = new OO.ui.PanelLayout( {
-               '$': this.$, 'scrollable': true, 'classes': [ 'oo-ui-messageDialog-container' ]
+               $: this.$, scrollable: true, classes: [ 'oo-ui-messageDialog-container' ]
        } );
        this.text = new OO.ui.PanelLayout( {
-               '$': this.$, 'padded': true, 'expanded': false, 'classes': [ 'oo-ui-messageDialog-text' ]
+               $: this.$, padded: true, expanded: false, classes: [ 'oo-ui-messageDialog-text' ]
        } );
        this.message = new OO.ui.LabelWidget( {
-               '$': this.$, 'classes': [ 'oo-ui-messageDialog-message' ]
+               $: this.$, classes: [ 'oo-ui-messageDialog-message' ]
        } );
 
        // Initialization
@@ -5404,19 +5413,19 @@ OO.ui.ProcessDialog.prototype.initialize = function () {
        this.$primaryActions = this.$( '<div>' );
        this.$otherActions = this.$( '<div>' );
        this.dismissButton = new OO.ui.ButtonWidget( {
-               '$': this.$,
-               'label': OO.ui.msg( 'ooui-dialog-process-dismiss' )
+               $: this.$,
+               label: OO.ui.msg( 'ooui-dialog-process-dismiss' )
        } );
        this.retryButton = new OO.ui.ButtonWidget( {
-               '$': this.$,
-               'label': OO.ui.msg( 'ooui-dialog-process-retry' )
+               $: this.$,
+               label: OO.ui.msg( 'ooui-dialog-process-retry' )
        } );
        this.$errors = this.$( '<div>' );
        this.$errorsTitle = this.$( '<div>' );
 
        // Events
-       this.dismissButton.connect( this, { 'click': 'onDismissErrorButtonClick' } );
-       this.retryButton.connect( this, { 'click': 'onRetryButtonClick' } );
+       this.dismissButton.connect( this, { click: 'onDismissErrorButtonClick' } );
+       this.retryButton.connect( this, { click: 'onRetryButtonClick' } );
 
        // Initialization
        this.title.$element.addClass( 'oo-ui-processDialog-title' );
@@ -5455,7 +5464,7 @@ OO.ui.ProcessDialog.prototype.attachActions = function () {
        others = this.actions.getOthers();
        if ( special.primary ) {
                this.$primaryActions.append( special.primary.$element );
-               special.primary.toggleFramed( false );
+               special.primary.toggleFramed( true );
        }
        if ( others.length ) {
                for ( i = 0, len = others.length; i < len; i++ ) {
@@ -5466,7 +5475,7 @@ OO.ui.ProcessDialog.prototype.attachActions = function () {
        }
        if ( special.safe ) {
                this.$safeActions.append( special.safe.$element );
-               special.safe.toggleFramed( false );
+               special.safe.toggleFramed( true );
        }
 
        this.fitLabel();
@@ -5491,7 +5500,7 @@ OO.ui.ProcessDialog.prototype.fitLabel = function () {
                this.$safeActions.is( ':visible' ) ? this.$safeActions.width() : 0,
                this.$primaryActions.is( ':visible' ) ? this.$primaryActions.width() : 0
        );
-       this.$location.css( { 'padding-left': width, 'padding-right': width } );
+       this.$location.css( { paddingLeft: width, paddingRight: width } );
 
        return this;
 };
@@ -5559,31 +5568,31 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
        this.currentPageName = null;
        this.pages = {};
        this.ignoreFocus = false;
-       this.stackLayout = new OO.ui.StackLayout( { '$': this.$, 'continuous': !!config.continuous } );
+       this.stackLayout = new OO.ui.StackLayout( { $: this.$, continuous: !!config.continuous } );
        this.autoFocus = config.autoFocus === undefined || !!config.autoFocus;
        this.outlineVisible = false;
        this.outlined = !!config.outlined;
        if ( this.outlined ) {
                this.editable = !!config.editable;
                this.outlineControlsWidget = null;
-               this.outlineWidget = new OO.ui.OutlineWidget( { '$': this.$ } );
-               this.outlinePanel = new OO.ui.PanelLayout( { '$': this.$, 'scrollable': true } );
+               this.outlineWidget = new OO.ui.OutlineWidget( { $: this.$ } );
+               this.outlinePanel = new OO.ui.PanelLayout( { $: this.$, scrollable: true } );
                this.gridLayout = new OO.ui.GridLayout(
                        [ this.outlinePanel, this.stackLayout ],
-                       { '$': this.$, 'widths': [ 1, 2 ] }
+                       { $: this.$, widths: [ 1, 2 ] }
                );
                this.outlineVisible = true;
                if ( this.editable ) {
                        this.outlineControlsWidget = new OO.ui.OutlineControlsWidget(
-                               this.outlineWidget, { '$': this.$ }
+                               this.outlineWidget, { $: this.$ }
                        );
                }
        }
 
        // Events
-       this.stackLayout.connect( this, { 'set': 'onStackLayoutSet' } );
+       this.stackLayout.connect( this, { set: 'onStackLayoutSet' } );
        if ( this.outlined ) {
-               this.outlineWidget.connect( this, { 'select': 'onOutlineWidgetSelect' } );
+               this.outlineWidget.connect( this, { select: 'onOutlineWidgetSelect' } );
        }
        if ( this.autoFocus ) {
                // Event 'focus' does not bubble, but 'focusin' does
@@ -5657,13 +5666,16 @@ OO.ui.BookletLayout.prototype.onStackLayoutFocus = function ( e ) {
  * @param {OO.ui.PanelLayout|null} page The page panel that is now the current panel
  */
 OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
-       var layout = this;
+       var $input, layout = this;
        if ( page ) {
-               page.scrollElementIntoView( { 'complete': function () {
+               page.scrollElementIntoView( { complete: function () {
                        if ( layout.autoFocus ) {
                                // Set focus to the first input if nothing on the page is focused yet
                                if ( !page.$element.find( ':focus' ).length ) {
-                                       page.$element.find( ':input:first' ).focus();
+                                       $input = page.$element.find( ':input:first' );
+                                       if ( $input.length ) {
+                                               $input[0].focus();
+                                       }
                                }
                        }
                } } );
@@ -5836,7 +5848,7 @@ OO.ui.BookletLayout.prototype.addPages = function ( pages, index ) {
                name = page.getName();
                this.pages[page.getName()] = page;
                if ( this.outlined ) {
-                       item = new OO.ui.OutlineItemWidget( name, page, { '$': this.$ } );
+                       item = new OO.ui.OutlineItemWidget( name, page, { $: this.$ } );
                        page.setOutlineItem( item );
                        items.push( item );
                }
@@ -5914,6 +5926,7 @@ OO.ui.BookletLayout.prototype.clearPages = function () {
  */
 OO.ui.BookletLayout.prototype.setPage = function ( name ) {
        var selectedItem,
+               $focused,
                page = this.pages[name];
 
        if ( name !== this.currentPageName ) {
@@ -5930,7 +5943,10 @@ OO.ui.BookletLayout.prototype.setPage = function ( name ) {
                                // is not needed if the next page has something focusable because once it is focused
                                // this blur happens automatically
                                if ( this.autoFocus && !page.$element.find( ':input' ).length ) {
-                                       this.pages[this.currentPageName].$element.find( ':focus' ).blur();
+                                       $focused = this.pages[this.currentPageName].$element.find( ':focus' );
+                                       if ( $focused.length ) {
+                                               $focused[0].blur();
+                                       }
                                }
                        }
                        this.currentPageName = name;
@@ -5963,13 +5979,13 @@ OO.ui.BookletLayout.prototype.updateOutlineWidget = function () {
  * @mixins OO.ui.LabeledElement
  *
  * Available label alignment modes include:
- *  - 'left': Label is before the field and aligned away from it, best for when the user will be
+ *  - left: Label is before the field and aligned away from it, best for when the user will be
  *    scanning for a specific label in a form with many fields
- *  - 'right': Label is before the field and aligned toward it, best for forms the user is very
+ *  - right: Label is before the field and aligned toward it, best for forms the user is very
  *    familiar with and will tab through field checking quickly to verify which field they are in
- *  - 'top': Label is before the field and above it, best for when the use will need to fill out all
+ *  - top: Label is before the field and above it, best for when the use will need to fill out all
  *    fields from top to bottom in a form with few fields
- *  - 'inline': Label is after the field and aligned toward it, best for small boolean fields like
+ *  - inline: Label is after the field and aligned toward it, best for small boolean fields like
  *    checkboxes or radio buttons
  *
  * @constructor
@@ -5981,7 +5997,7 @@ OO.ui.BookletLayout.prototype.updateOutlineWidget = function () {
 OO.ui.FieldLayout = function OoUiFieldLayout( field, config ) {
        var popupButtonWidget;
        // Config initialization
-       config = $.extend( { 'align': 'left' }, config );
+       config = $.extend( { align: 'left' }, config );
 
        // Parent constructor
        OO.ui.FieldLayout.super.call( this, config );
@@ -5992,10 +6008,10 @@ OO.ui.FieldLayout = function OoUiFieldLayout( field, config ) {
        if ( config.help ) {
                popupButtonWidget = new OO.ui.PopupButtonWidget( $.extend(
                        {
-                               '$': this.$,
-                               'frameless': true,
-                               'icon': 'info',
-                               'title': config.help
+                               $: this.$,
+                               frameless: true,
+                               icon: 'info',
+                               title: config.help
                        },
                        config,
                        { label: null }
@@ -6013,7 +6029,7 @@ OO.ui.FieldLayout = function OoUiFieldLayout( field, config ) {
        if ( this.field instanceof OO.ui.InputWidget ) {
                this.$label.on( 'click', OO.ui.bind( this.onLabelClick, this ) );
        }
-       this.field.connect( this, { 'disable': 'onFieldDisable' } );
+       this.field.connect( this, { disable: 'onFieldDisable' } );
 
        // Initialization
        this.$element.addClass( 'oo-ui-fieldLayout' );
@@ -6082,6 +6098,11 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
                        this.$element.removeClass( 'oo-ui-fieldLayout-align-' + this.align );
                }
                this.align = value;
+               // The following classes can be used here:
+               // oo-ui-fieldLayout-align-left
+               // oo-ui-fieldLayout-align-right
+               // oo-ui-fieldLayout-align-top
+               // oo-ui-fieldLayout-align-inline
                this.$element.addClass( 'oo-ui-fieldLayout-align-' + this.align );
        }
 
@@ -6313,11 +6334,11 @@ OO.ui.GridLayout.prototype.update = function () {
                        panel = this.panels[i];
                        width = this.widths[x];
                        dimensions = {
-                               'width': Math.round( width * 100 ) + '%',
-                               'height': Math.round( height * 100 ) + '%',
-                               'top': Math.round( top * 100 ) + '%',
+                               width: Math.round( width * 100 ) + '%',
+                               height: Math.round( height * 100 ) + '%',
+                               top: Math.round( top * 100 ) + '%',
                                // HACK: Work around IE bug by setting visibility: hidden; if width or height is zero
-                               'visibility': width === 0 || height === 0 ? 'hidden' : ''
+                               visibility: width === 0 || height === 0 ? 'hidden' : ''
                        };
                        // If RTL, reverse:
                        if ( OO.ui.Element.getDir( this.$.context ) === 'rtl' ) {
@@ -6400,7 +6421,7 @@ OO.inheritClass( OO.ui.PanelLayout, OO.ui.Layout );
  */
 OO.ui.PageLayout = function OoUiPageLayout( name, config ) {
        // Configuration initialization
-       config = $.extend( { 'scrollable': true }, config );
+       config = $.extend( { scrollable: true }, config );
 
        // Parent constructor
        OO.ui.PageLayout.super.call( this, config );
@@ -6516,7 +6537,7 @@ OO.ui.PageLayout.prototype.setActive = function ( active ) {
  */
 OO.ui.StackLayout = function OoUiStackLayout( config ) {
        // Config initialization
-       config = $.extend( { 'scrollable': true }, config );
+       config = $.extend( { scrollable: true }, config );
 
        // Parent constructor
        OO.ui.StackLayout.super.call( this, config );
@@ -6611,7 +6632,7 @@ OO.ui.StackLayout.prototype.removeItems = function ( items ) {
        // Mixin method
        OO.ui.GroupElement.prototype.removeItems.call( this, items );
 
-       if ( $.inArray( this.currentItem, items  ) !== -1 ) {
+       if ( $.inArray( this.currentItem, items ) !== -1 ) {
                if ( this.items.length ) {
                        this.setItem( this.items[0] );
                } else {
@@ -6741,8 +6762,8 @@ OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
 
        // Events
        this.$handle.on( {
-               'mousedown': OO.ui.bind( this.onHandleMouseDown, this ),
-               'mouseup': OO.ui.bind( this.onHandleMouseUp, this )
+               'mousedown touchstart': OO.ui.bind( this.onHandlePointerDown, this ),
+               'mouseup touchend': OO.ui.bind( this.onHandlePointerUp, this )
        } );
 
        // Initialization
@@ -6806,11 +6827,12 @@ OO.ui.PopupToolGroup.prototype.onBlur = function ( e ) {
 /**
  * @inheritdoc
  */
-OO.ui.PopupToolGroup.prototype.onMouseUp = function ( e ) {
-       if ( !this.isDisabled() && e.which === 1 ) {
+OO.ui.PopupToolGroup.prototype.onPointerUp = function ( e ) {
+       // e.which is 0 for touch events, 1 for left mouse button
+       if ( !this.isDisabled() && e.which <= 1 ) {
                this.setActive( false );
        }
-       return OO.ui.PopupToolGroup.super.prototype.onMouseUp.call( this, e );
+       return OO.ui.PopupToolGroup.super.prototype.onPointerUp.call( this, e );
 };
 
 /**
@@ -6818,7 +6840,7 @@ OO.ui.PopupToolGroup.prototype.onMouseUp = function ( e ) {
  *
  * @param {jQuery.Event} e Mouse up event
  */
-OO.ui.PopupToolGroup.prototype.onHandleMouseUp = function () {
+OO.ui.PopupToolGroup.prototype.onHandlePointerUp = function () {
        return false;
 };
 
@@ -6827,8 +6849,9 @@ OO.ui.PopupToolGroup.prototype.onHandleMouseUp = function () {
  *
  * @param {jQuery.Event} e Mouse down event
  */
-OO.ui.PopupToolGroup.prototype.onHandleMouseDown = function ( e ) {
-       if ( !this.isDisabled() && e.which === 1 ) {
+OO.ui.PopupToolGroup.prototype.onHandlePointerDown = function ( e ) {
+       // e.which is 0 for touch events, 1 for left mouse button
+       if ( !this.isDisabled() && e.which <= 1 ) {
                this.setActive( !this.active );
        }
        return false;
@@ -6901,7 +6924,7 @@ OO.ui.MenuToolGroup = function OoUiMenuToolGroup( toolbar, config ) {
        OO.ui.MenuToolGroup.super.call( this, toolbar, config );
 
        // Events
-       this.toolbar.connect( this, { 'updateState': 'onUpdateState' } );
+       this.toolbar.connect( this, { updateState: 'onUpdateState' } );
 
        // Initialization
        this.$element.addClass( 'oo-ui-menuToolGroup' );
@@ -7110,9 +7133,9 @@ OO.ui.LookupInputWidget = function OoUiLookupInputWidget( input, config ) {
        this.lookupInput = input;
        this.$overlay = config.$overlay || this.$( 'body,.oo-ui-window-overlay' ).last();
        this.lookupMenu = new OO.ui.TextInputMenuWidget( this, {
-               '$': OO.ui.Element.getJQuery( this.$overlay ),
-               'input': this.lookupInput,
-               '$container': config.$container
+               $: OO.ui.Element.getJQuery( this.$overlay ),
+               input: this.lookupInput,
+               $container: config.$container
        } );
        this.lookupCache = {};
        this.lookupQuery = null;
@@ -7123,11 +7146,11 @@ OO.ui.LookupInputWidget = function OoUiLookupInputWidget( input, config ) {
        this.$overlay.append( this.lookupMenu.$element );
 
        this.lookupInput.$input.on( {
-               'focus': OO.ui.bind( this.onLookupInputFocus, this ),
-               'blur': OO.ui.bind( this.onLookupInputBlur, this ),
-               'mousedown': OO.ui.bind( this.onLookupInputMouseDown, this )
+               focus: OO.ui.bind( this.onLookupInputFocus, this ),
+               blur: OO.ui.bind( this.onLookupInputBlur, this ),
+               mousedown: OO.ui.bind( this.onLookupInputMouseDown, this )
        } );
-       this.lookupInput.connect( this, { 'change': 'onLookupInputChange' } );
+       this.lookupInput.connect( this, { change: 'onLookupInputChange' } );
 
        // Initialization
        this.$element.addClass( 'oo-ui-lookupWidget' );
@@ -7341,7 +7364,7 @@ OO.ui.LookupInputWidget.prototype.getLookupMenuItemsFromData = function () {
  */
 OO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, config ) {
        // Configuration initialization
-       config = $.extend( { 'icon': 'add-item' }, config );
+       config = $.extend( { icon: 'add-item' }, config );
 
        // Parent constructor
        OO.ui.OutlineControlsWidget.super.call( this, config );
@@ -7354,33 +7377,33 @@ OO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, confi
        this.outline = outline;
        this.$movers = this.$( '<div>' );
        this.upButton = new OO.ui.ButtonWidget( {
-               '$': this.$,
-               'framed': false,
-               'icon': 'collapse',
-               'title': OO.ui.msg( 'ooui-outline-control-move-up' )
+               $: this.$,
+               framed: false,
+               icon: 'collapse',
+               title: OO.ui.msg( 'ooui-outline-control-move-up' )
        } );
        this.downButton = new OO.ui.ButtonWidget( {
-               '$': this.$,
-               'framed': false,
-               'icon': 'expand',
-               'title': OO.ui.msg( 'ooui-outline-control-move-down' )
+               $: this.$,
+               framed: false,
+               icon: 'expand',
+               title: OO.ui.msg( 'ooui-outline-control-move-down' )
        } );
        this.removeButton = new OO.ui.ButtonWidget( {
-               '$': this.$,
-               'framed': false,
-               'icon': 'remove',
-               'title': OO.ui.msg( 'ooui-outline-control-remove' )
+               $: this.$,
+               framed: false,
+               icon: 'remove',
+               title: OO.ui.msg( 'ooui-outline-control-remove' )
        } );
 
        // Events
        outline.connect( this, {
-               'select': 'onOutlineChange',
-               'add': 'onOutlineChange',
-               'remove': 'onOutlineChange'
+               select: 'onOutlineChange',
+               add: 'onOutlineChange',
+               remove: 'onOutlineChange'
        } );
-       this.upButton.connect( this, { 'click': [ 'emit', 'move', -1 ] } );
-       this.downButton.connect( this, { 'click': [ 'emit', 'move', 1 ] } );
-       this.removeButton.connect( this, { 'click': [ 'emit', 'remove' ] } );
+       this.upButton.connect( this, { click: [ 'emit', 'move', -1 ] } );
+       this.downButton.connect( this, { click: [ 'emit', 'move', 1 ] } );
+       this.removeButton.connect( this, { click: [ 'emit', 'remove' ] } );
 
        // Initialization
        this.$element.addClass( 'oo-ui-outlineControlsWidget' );
@@ -7551,7 +7574,7 @@ OO.mixinClass( OO.ui.ButtonGroupWidget, OO.ui.GroupElement );
  */
 OO.ui.ButtonWidget = function OoUiButtonWidget( config ) {
        // Configuration initialization
-       config = $.extend( { 'target': '_blank' }, config );
+       config = $.extend( { target: '_blank' }, config );
 
        // Parent constructor
        OO.ui.ButtonWidget.super.call( this, config );
@@ -7571,8 +7594,8 @@ OO.ui.ButtonWidget = function OoUiButtonWidget( config ) {
 
        // Events
        this.$button.on( {
-               'click': OO.ui.bind( this.onClick, this ),
-               'keypress': OO.ui.bind( this.onKeyPress, this )
+               click: OO.ui.bind( this.onClick, this ),
+               keypress: OO.ui.bind( this.onKeyPress, this )
        } );
 
        // Initialization
@@ -7707,7 +7730,7 @@ OO.ui.ButtonWidget.prototype.setTarget = function ( target ) {
  */
 OO.ui.ActionWidget = function OoUiActionWidget( config ) {
        // Config intialization
-       config = $.extend( { 'framed': false }, config );
+       config = $.extend( { framed: false }, config );
 
        // Parent constructor
        OO.ui.ActionWidget.super.call( this, config );
@@ -8045,7 +8068,7 @@ OO.ui.IndicatorWidget.static.tagName = 'span';
  */
 OO.ui.InlineMenuWidget = function OoUiInlineMenuWidget( config ) {
        // Configuration initialization
-       config = $.extend( { 'indicator': 'down' }, config );
+       config = $.extend( { indicator: 'down' }, config );
 
        // Parent constructor
        OO.ui.InlineMenuWidget.super.call( this, config );
@@ -8057,12 +8080,12 @@ OO.ui.InlineMenuWidget = function OoUiInlineMenuWidget( config ) {
        OO.ui.TitledElement.call( this, this.$label, config );
 
        // Properties
-       this.menu = new OO.ui.MenuWidget( $.extend( { '$': this.$, 'widget': this }, config.menu ) );
+       this.menu = new OO.ui.MenuWidget( $.extend( { $: this.$, widget: this }, config.menu ) );
        this.$handle = this.$( '<span>' );
 
        // Events
-       this.$element.on( { 'click': OO.ui.bind( this.onClick, this ) } );
-       this.menu.connect( this, { 'select': 'onMenuSelect' } );
+       this.$element.on( { click: OO.ui.bind( this.onClick, this ) } );
+       this.menu.connect( this, { select: 'onMenuSelect' } );
 
        // Initialization
        this.$handle
@@ -8151,7 +8174,7 @@ OO.ui.InlineMenuWidget.prototype.onClick = function ( e ) {
  */
 OO.ui.InputWidget = function OoUiInputWidget( config ) {
        // Config intialization
-       config = $.extend( { 'readOnly': false }, config );
+       config = $.extend( { readOnly: false }, config );
 
        // Parent constructor
        OO.ui.InputWidget.super.call( this, config );
@@ -8283,7 +8306,7 @@ OO.ui.InputWidget.prototype.simulateLabelClick = function () {
                if ( this.$input.is( ':checkbox,:radio' ) ) {
                        this.$input.click();
                } else if ( this.$input.is( ':input' ) ) {
-                       this.$input.focus();
+                       this.$input[0].focus();
                }
        }
 };
@@ -8328,7 +8351,7 @@ OO.ui.InputWidget.prototype.setDisabled = function ( state ) {
  * @chainable
  */
 OO.ui.InputWidget.prototype.focus = function () {
-       this.$input.focus();
+       this.$input[0].focus();
        return this;
 };
 
@@ -8338,7 +8361,7 @@ OO.ui.InputWidget.prototype.focus = function () {
  * @chainable
  */
 OO.ui.InputWidget.prototype.blur = function () {
-       this.$input.blur();
+       this.$input[0].blur();
        return this;
 };
 
@@ -8426,7 +8449,7 @@ OO.ui.CheckboxInputWidget.prototype.onEdit = function () {
  */
 OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        var widget = this;
-       config = $.extend( { 'maxRows': 10 }, config );
+       config = $.extend( { maxRows: 10 }, config );
 
        // Parent constructor
        OO.ui.TextInputWidget.super.call( this, config );
@@ -8449,7 +8472,7 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
                        this.$( '<span>' )
                                .addClass( 'oo-ui-textInputWidget-icon oo-ui-icon-' + config.icon )
                                .mousedown( function () {
-                                       widget.$input.focus();
+                                       widget.$input[0].focus();
                                        return false;
                                } )
                );
@@ -8457,6 +8480,7 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        if ( config.placeholder ) {
                this.$input.attr( 'placeholder', config.placeholder );
        }
+       this.$element.attr( 'role', 'textbox' );
 };
 
 /* Setup */
@@ -8506,6 +8530,17 @@ OO.ui.TextInputWidget.prototype.onEdit = function () {
        return OO.ui.TextInputWidget.super.prototype.onEdit.call( this );
 };
 
+/**
+ * @inheritdoc
+ */
+OO.ui.TextInputWidget.prototype.setValue = function ( value ) {
+       // Parent method
+       OO.ui.TextInputWidget.super.prototype.setValue.call( this, value );
+
+       this.adjustSize();
+       return this;
+};
+
 /**
  * Automatically adjust the size of the text input.
  *
@@ -8519,7 +8554,7 @@ OO.ui.TextInputWidget.prototype.adjustSize = function () {
        if ( this.multiline && this.autosize ) {
                $clone = this.$input.clone()
                        .val( this.$input.val() )
-                       .css( { 'height': 0 } )
+                       .css( { height: 0 } )
                        .insertAfter( this.$input );
                // Set inline height property to 0 to measure scroll height
                scrollHeight = $clone[0].scrollHeight;
@@ -8712,6 +8747,7 @@ OO.ui.OptionWidget = function OoUiOptionWidget( data, config ) {
        this.$element
                .data( 'oo-ui-optionWidget', this )
                .attr( 'rel', config.rel )
+               .attr( 'role', 'option' )
                .addClass( 'oo-ui-optionWidget' )
                .append( this.$label );
        this.$element
@@ -8976,13 +9012,15 @@ OO.ui.ButtonOptionWidget.prototype.setSelected = function ( state ) {
  */
 OO.ui.MenuItemWidget = function OoUiMenuItemWidget( data, config ) {
        // Configuration initialization
-       config = $.extend( { 'icon': 'check' }, config );
+       config = $.extend( { icon: 'check' }, config );
 
        // Parent constructor
        OO.ui.MenuItemWidget.super.call( this, data, config );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-menuItemWidget' );
+       this.$element
+               .attr( 'role', 'menuitem' )
+               .addClass( 'oo-ui-menuItemWidget' );
 };
 
 /* Setup */
@@ -9187,11 +9225,11 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
        this.width = config.width !== undefined ? config.width : 320;
        this.height = config.height !== undefined ? config.height : null;
        this.align = config.align || 'center';
-       this.closeButton = new OO.ui.ButtonWidget( { '$': this.$, 'framed': false, 'icon': 'close' } );
+       this.closeButton = new OO.ui.ButtonWidget( { $: this.$, framed: false, icon: 'close' } );
        this.onMouseDownHandler = OO.ui.bind( this.onMouseDown, this );
 
        // Events
-       this.closeButton.connect( this, { 'click': 'onCloseButtonClick' } );
+       this.closeButton.connect( this, { click: 'onCloseButtonClick' } );
 
        // Initialization
        this.toggleAnchor( config.anchor === undefined || config.anchor );
@@ -9366,7 +9404,7 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
                containerLeft = Math.round( this.$container.offset().left ),
                containerWidth = this.$container.innerWidth(),
                containerRight = containerLeft + containerWidth,
-               popupOffset = this.width * ( { 'left': 0, 'center': -0.5, 'right': -1 } )[this.align],
+               popupOffset = this.width * ( { left: 0, center: -0.5, right: -1 } )[this.align],
                anchorWidth = this.$anchor.width(),
                popupLeft = popupOffset - padding,
                popupRight = popupOffset + padding + this.width + padding,
@@ -9395,9 +9433,9 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
 
        // Position body relative to anchor and resize
        this.$popup.css( {
-               'left': popupOffset,
-               'width': this.width,
-               'height': this.height !== null ? this.height : 'auto'
+               left: popupOffset,
+               width: this.width,
+               height: this.height !== null ? this.height : 'auto'
        } );
 
        if ( transition ) {
@@ -9436,23 +9474,23 @@ OO.ui.SearchWidget = function OoUiSearchWidget( config ) {
 
        // Properties
        this.query = new OO.ui.TextInputWidget( {
-               '$': this.$,
-               'icon': 'search',
-               'placeholder': config.placeholder,
-               'value': config.value
+               $: this.$,
+               icon: 'search',
+               placeholder: config.placeholder,
+               value: config.value
        } );
-       this.results = new OO.ui.SelectWidget( { '$': this.$ } );
+       this.results = new OO.ui.SelectWidget( { $: this.$ } );
        this.$query = this.$( '<div>' );
        this.$results = this.$( '<div>' );
 
        // Events
        this.query.connect( this, {
-               'change': 'onQueryChange',
-               'enter': 'onQueryEnter'
+               change: 'onQueryChange',
+               enter: 'onQueryEnter'
        } );
        this.results.connect( this, {
-               'highlight': 'onResultsHighlight',
-               'select': 'onResultsSelect'
+               highlight: 'onResultsHighlight',
+               select: 'onResultsSelect'
        } );
        this.query.$input.on( 'keydown', OO.ui.bind( this.onQueryKeydown, this ) );
 
@@ -9603,9 +9641,9 @@ OO.ui.SelectWidget = function OoUiSelectWidget( config ) {
 
        // Events
        this.$element.on( {
-               'mousedown': OO.ui.bind( this.onMouseDown, this ),
-               'mouseover': OO.ui.bind( this.onMouseOver, this ),
-               'mouseleave': OO.ui.bind( this.onMouseLeave, this )
+               mousedown: OO.ui.bind( this.onMouseDown, this ),
+               mouseover: OO.ui.bind( this.onMouseOver, this ),
+               mouseleave: OO.ui.bind( this.onMouseLeave, this )
        } );
 
        // Initialization
@@ -10158,6 +10196,7 @@ OO.ui.MenuWidget = function OoUiMenuWidget( config ) {
        // Initialization
        this.$element
                .hide()
+               .attr( 'role', 'menu' )
                .addClass( 'oo-ui-menuWidget' );
 };
 
@@ -10330,7 +10369,7 @@ OO.ui.MenuWidget.prototype.toggle = function ( visible ) {
                        // Change focus to enable keyboard navigation
                        if ( this.isolated && this.$input && !this.$input.is( ':focus' ) ) {
                                this.$previousFocus = this.$( ':focus' );
-                               this.$input.focus();
+                               this.$input[0].focus();
                        }
                        if ( this.newItems && this.newItems.length ) {
                                for ( i = 0, len = this.newItems.length; i < len; i++ ) {
@@ -10349,7 +10388,7 @@ OO.ui.MenuWidget.prototype.toggle = function ( visible ) {
                } else {
                        this.unbindKeyDownListener();
                        if ( this.isolated && this.$previousFocus ) {
-                               this.$previousFocus.focus();
+                               this.$previousFocus[0].focus();
                                this.$previousFocus = null;
                        }
                        this.getElementDocument().removeEventListener(
diff --git a/resources/lib/oojs-ui/oojs-ui.rtl.css b/resources/lib/oojs-ui/oojs-ui.rtl.css
new file mode 100644 (file)
index 0000000..deca745
--- /dev/null
@@ -0,0 +1,1271 @@
+/*!
+ * OOjs UI v0.1.0
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: 2014-07-22T21:39:24Z
+ */
+/* Textures */
+
+.oo-ui-texture-pending {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
+
+.oo-ui-texture-transparency {
+  background-image: /* @embed */ url(images/textures/transparency.png);
+}
+
+/* RTL Definitions */
+
+/* @noflip */
+
+.oo-ui-rtl {
+  direction: rtl;
+}
+
+/* @noflip */
+
+.oo-ui-ltr {
+  direction: ltr;
+}
+
+.oo-ui-frame {
+  padding: 0;
+  margin: 0;
+}
+
+.oo-ui-frame-body {
+  padding: 0;
+  margin: 0;
+  background: none;
+}
+
+.oo-ui-frame-content:focus {
+  outline: none;
+}
+
+.oo-ui-toolbar {
+  clear: both;
+}
+
+.oo-ui-toolbar-bar {
+  line-height: 1em;
+}
+
+.oo-ui-toolbar-bottom .oo-ui-toolbar-bar {
+  position: absolute;
+}
+
+.oo-ui-toolbar-actions {
+  float: left;
+}
+
+.oo-ui-toolbar-tools {
+  float: right;
+}
+
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+  -webkit-user-select: all;
+     -moz-user-select: all;
+      -ms-user-select: all;
+          user-select: all;
+  -webkit-touch-callout: default;
+}
+
+.oo-ui-toolbar-shadow {
+  position: absolute;
+  width: 100%;
+  pointer-events: none;
+  background-position: right top;
+  background-repeat: repeat-x;
+}
+
+.oo-ui-toolGroup {
+  display: inline-block;
+  margin: 0.3em;
+  vertical-align: middle;
+}
+
+.oo-ui-toolGroup-empty {
+  display: none;
+}
+
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-window {
+  line-height: 1em;
+}
+
+.oo-ui-window > .oo-ui-window-frame {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-window > .oo-ui-window-frame > .oo-ui-frame {
+  width: 100%;
+  height: 100%;
+}
+
+.oo-ui-window-head,
+.oo-ui-window-foot {
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-window-overlay {
+  position: absolute;
+  top: 0;
+  right: 0;
+}
+
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  position: fixed;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+}
+
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  width: auto;
+  height: auto;
+  padding: 1em;
+}
+
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
+  position: fixed;
+  left: 0;
+  right: 0;
+  max-width: 100%;
+  max-height: 100%;
+  margin: auto;
+  overflow: hidden;
+}
+
+.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
+  top: 0;
+  bottom: 0;
+  width: 100%;
+  height: 100%;
+}
+
+.oo-ui-messageDialog-actions-horizontal {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+}
+
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  display: table-cell;
+  width: 1%;
+}
+
+.oo-ui-messageDialog-actions-vertical {
+  display: block;
+}
+
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget {
+  position: relative;
+  text-align: center;
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonedElement-button {
+  display: block;
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labeledElement-label {
+  position: relative;
+  top: auto;
+  bottom: auto;
+  display: inline;
+  white-space: nowrap;
+}
+
+.oo-ui-processDialog-location {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.oo-ui-processDialog-title {
+  display: inline;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
+  white-space: nowrap;
+}
+
+.oo-ui-processDialog-actions-safe,
+.oo-ui-processDialog-actions-primary {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+}
+
+.oo-ui-processDialog-actions-safe {
+  right: 0;
+}
+
+.oo-ui-processDialog-actions-primary {
+  left: 0;
+}
+
+.oo-ui-processDialog-errors {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  z-index: 2;
+  display: none;
+  padding: 3em 3em 1.5em 3em;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+
+.oo-ui-buttonedElement > .oo-ui-buttonedElement-button {
+  display: inline-block;
+  vertical-align: middle;
+  cursor: pointer;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-buttonedElement > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  display: none;
+  margin-right: 0;
+}
+
+.oo-ui-buttonedElement > .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator {
+  display: none;
+  margin-left: -0.75em;
+}
+
+.oo-ui-buttonedElement.oo-ui-widget-disabled > .oo-ui-buttonedElement-button {
+  cursor: default;
+}
+
+.oo-ui-buttonedElement.oo-ui-indicatedElement > .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
+.oo-ui-buttonedElement.oo-ui-iconedElement > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-buttonedElement-frameless {
+  position: relative;
+  display: inline-block;
+}
+
+.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+  display: inline-block;
+  margin-right: 0.25em;
+  vertical-align: middle;
+}
+
+.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button {
+  display: inline-block;
+  text-align: center;
+  vertical-align: top;
+}
+
+.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+  display: inline-block;
+  line-height: 1.9em;
+  vertical-align: middle;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
+  cursor: default;
+}
+
+.oo-ui-clippableElement-clippable {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+  overflow-y: hidden;
+}
+
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  width: 100%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+  padding: 2em;
+}
+
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 3em;
+  right: 0;
+  overflow-y: auto;
+}
+
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  position: absolute;
+  left: 0;
+  bottom: 0;
+  right: 0;
+}
+
+.oo-ui-fieldLayout {
+  margin-bottom: 1em;
+}
+
+.oo-ui-fieldLayout:last-child {
+  margin-bottom: 0;
+}
+
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+  display: table;
+  content: " ";
+}
+
+.oo-ui-fieldLayout:after {
+  clear: both;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labeledElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
+  display: block;
+  float: right;
+  width: 35%;
+  padding-top: 0.5em;
+  margin-left: 5%;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  display: block;
+  float: right;
+  width: 60%;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
+  text-align: left;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labeledElement-label {
+  display: inline-block;
+  padding: 0.75em 0.5em 0.5em 0.5em;
+  vertical-align: middle;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  display: inline-block;
+  padding: 0.5em 0;
+  vertical-align: middle;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labeledElement-label {
+  display: inline-block;
+  padding: 0.5em 0;
+}
+
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  margin-top: 0.25em;
+}
+
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+  z-index: 1;
+}
+
+.oo-ui-fieldsetLayout {
+  position: relative;
+  padding: 0;
+  margin: 0;
+}
+
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+  margin-top: 2em;
+}
+
+.oo-ui-fieldsetLayout-labeled {
+  margin-top: -0.75em;
+}
+
+.oo-ui-fieldsetLayout > .oo-ui-labeledElement-label {
+  padding: 0.25em 0;
+  margin-bottom: 0.5em;
+}
+
+.oo-ui-fieldsetLayout.oo-ui-iconedElement > .oo-ui-labeledElement-label {
+  padding-right: 1.75em;
+  line-height: 1.33em;
+}
+
+.oo-ui-fieldsetLayout.oo-ui-iconedElement > .oo-ui-iconedElement-icon {
+  position: absolute;
+  top: 0.25em;
+  right: 0;
+  display: block;
+  width: 2em;
+  height: 2em;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-gridLayout {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+}
+
+.oo-ui-labelWidget {
+  display: inline-block;
+  padding: 0.5em 0;
+}
+
+.oo-ui-panelLayout {
+  position: relative;
+}
+
+.oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+
+.oo-ui-panelLayout-expanded {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+}
+
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+  display: none;
+}
+
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+  position: relative;
+  display: block;
+}
+
+.oo-ui-barToolGroup > .oo-ui-iconedElement-icon,
+.oo-ui-barToolGroup > .oo-ui-labeledElement-label {
+  display: none;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool {
+  position: relative;
+  display: inline-block;
+  vertical-align: top;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  display: block;
+  height: 1.5em;
+  padding: 0.25em;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  display: block;
+  width: 1.5em;
+  height: 1.5em;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: none;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-title,
+.oo-ui-barToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
+  cursor: pointer;
+}
+
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool {
+  display: inline-block;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  display: block;
+  padding-left: 0.5em;
+  white-space: nowrap;
+  cursor: pointer;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+  min-width: 8em;
+}
+
+.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em 0 0.25em 0;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool {
+  display: block;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  display: block;
+  padding: 0 0.25em 0 1em;
+  white-space: nowrap;
+  cursor: pointer;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  background-image: none;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  background-image: /* @embed */ url(images/icons/check.svg);
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+
+.oo-ui-popupToolGroup {
+  position: relative;
+  height: 2em;
+  min-width: 2.5em;
+}
+
+.oo-ui-popupToolGroup.oo-ui-indicatedElement.oo-ui-iconedElement {
+  min-width: 3.5em;
+}
+
+.oo-ui-popupToolGroup-handle {
+  display: block;
+  cursor: pointer;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
+  position: absolute;
+  top: 0;
+  width: 2em;
+  height: 2em;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator {
+  left: 0;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
+  right: 0.25em;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
+  margin: 0 1em;
+  font-size: 0.8em;
+  line-height: 2.6em;
+}
+
+.oo-ui-popupToolGroup-header {
+  margin: 0 0.6em;
+  font-size: 0.8em;
+  font-weight: bold;
+  line-height: 2.6em;
+}
+
+.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+  cursor: default;
+}
+
+.oo-ui-popupToolGroup.oo-ui-iconedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
+  margin-right: 3em;
+}
+
+.oo-ui-popupToolGroup.oo-ui-indicatedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
+  margin-left: 2.25em;
+}
+
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  position: absolute;
+  top: 2em;
+  right: -1px;
+  z-index: 4;
+  display: none;
+}
+
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconedElement-icon {
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+  display: block;
+}
+
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  display: inline-block;
+  width: 2em;
+  height: 2em;
+  margin-left: 0.25em;
+  vertical-align: middle;
+}
+
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: inline-block;
+  font-size: 0.8em;
+  line-height: 2em;
+  vertical-align: middle;
+}
+
+.oo-ui-popupToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+
+.oo-ui-popupTool .oo-ui-popupWidget {
+  margin-right: 1.25em;
+  font-size: 0.8em;
+}
+
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-anchor {
+  z-index: 4;
+}
+
+.oo-ui-iconWidget {
+  display: inline-block;
+  width: 1.9em;
+  height: 1.9em;
+  line-height: 2.5em;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  opacity: 0.8;
+}
+
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+
+.oo-ui-indicatorWidget {
+  display: inline-block;
+  width: 1.9em;
+  height: 1.9em;
+  line-height: 2.5em;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  opacity: 0.8;
+}
+
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+
+.oo-ui-selectWidget {
+  padding: 0;
+  margin: 0;
+  list-style: none;
+}
+
+.oo-ui-optionWidget {
+  position: relative;
+  display: block;
+  margin: 0;
+  list-style: none;
+  cursor: pointer;
+  border: none;
+}
+
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+
+.oo-ui-optionWidget .oo-ui-labeledElement-label {
+  display: block;
+  overflow: hidden;
+  line-height: 1.5em;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.oo-ui-decoratedOptionWidget .oo-ui-iconedElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatedElement-indicator {
+  position: absolute;
+  top: 50%;
+  width: 2em;
+  height: 2em;
+  margin-top: -1em;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-decoratedOptionWidget .oo-ui-iconedElement-icon {
+  right: 0.5em;
+}
+
+.oo-ui-decoratedOptionWidget .oo-ui-indicatedElement-indicator {
+  left: 0.5em;
+}
+
+.oo-ui-menuWidget {
+  position: absolute;
+}
+
+.oo-ui-menuWidget input {
+  position: absolute;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+  opacity: 0;
+}
+
+.oo-ui-popupWidget-popup {
+  position: absolute;
+  z-index: 1;
+  overflow: hidden;
+}
+
+.oo-ui-popupWidget-anchor {
+  z-index: 1;
+  display: none;
+}
+
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+  margin-top: 7px;
+}
+
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+  position: absolute;
+  display: block;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-popupWidget-head {
+  height: 2.5em;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  float: left;
+  margin: 0.25em;
+}
+
+.oo-ui-popupWidget-head .oo-ui-labeledElement-label {
+  float: right;
+  margin: 0.75em 1em;
+  cursor: default;
+}
+
+.oo-ui-popupWidget-body {
+  overflow: hidden;
+  clear: both;
+}
+
+.oo-ui-popupWidget-body-padded {
+  padding: 0 1em;
+}
+
+.oo-ui-buttonGroupWidget {
+  border-radius: 0.3em;
+}
+
+.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
+  margin-bottom: -1px;
+  margin-right: -1px;
+  border-radius: 0;
+}
+
+.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:first-child .oo-ui-buttonedElement-button {
+  margin-right: 0;
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+}
+
+.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:last-child .oo-ui-buttonedElement-button {
+  border-top-left-radius: 0.3em;
+  border-bottom-left-radius: 0.3em;
+}
+
+.oo-ui-buttonOptionWidget {
+  display: inline-block;
+  background-color: transparent;
+}
+
+.oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button {
+  position: relative;
+  height: 1.9em;
+}
+
+.oo-ui-buttonOptionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator {
+  position: static;
+  display: inline-block;
+  height: 1.9em;
+  margin-top: 0;
+  vertical-align: middle;
+}
+
+.oo-ui-buttonSelectWidget {
+  display: inline-block;
+  white-space: nowrap;
+}
+
+.oo-ui-buttonWidget {
+  display: inline-block;
+  vertical-align: middle;
+}
+
+.oo-ui-inlineMenuWidget {
+  position: relative;
+  display: inline-block;
+  min-width: 20em;
+  margin: 0.25em 0;
+}
+
+.oo-ui-inlineMenuWidget-handle {
+  display: inline-block;
+  width: 100%;
+  height: 2.5em;
+  cursor: pointer;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
+  position: absolute;
+  top: 0;
+  width: 2.5em;
+  height: 2.5em;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator {
+  left: 0;
+}
+
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
+  right: 0.25em;
+}
+
+.oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
+  margin: 0 0.5em;
+  line-height: 2.5em;
+}
+
+.oo-ui-inlineMenuWidget.oo-ui-iconedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
+  margin-right: 3em;
+}
+
+.oo-ui-inlineMenuWidget.oo-ui-indicatedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
+  margin-left: 2em;
+}
+
+.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+  z-index: 1;
+  width: 100%;
+}
+
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+  cursor: default;
+}
+
+.oo-ui-menuItemWidget {
+  position: relative;
+}
+
+.oo-ui-menuItemWidget .oo-ui-iconedElement-icon {
+  display: none;
+}
+
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
+}
+
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconedElement-icon {
+  display: block;
+}
+
+.oo-ui-menuSectionItemWidget {
+  cursor: default;
+}
+
+.oo-ui-outlineControlsWidget {
+  height: 3em;
+}
+
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+  float: right;
+  height: 2em;
+  padding: 0;
+  margin: 0.5em;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-outlineControlsWidget > .oo-ui-iconedElement-icon {
+  float: right;
+  width: 1.5em;
+  height: 2em;
+  margin: 0.5em 0.5em 0.5em 0;
+  background-position: left center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-outlineControlsWidget-items {
+  float: right;
+  margin-right: 0;
+}
+
+.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
+  float: right;
+}
+
+.oo-ui-outlineControlsWidget-movers {
+  float: left;
+}
+
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+  float: left;
+}
+
+.oo-ui-outlineItemWidget {
+  position: relative;
+  padding: 0.75em;
+  cursor: pointer;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-popupButtonWidget {
+  position: relative;
+}
+
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+  position: absolute;
+  right: 1em;
+  cursor: auto;
+}
+
+.oo-ui-searchWidget-query {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  height: 4em;
+  padding: 0 1em;
+}
+
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+  width: 100%;
+  margin: 0.75em 0;
+}
+
+.oo-ui-searchWidget-results {
+  position: absolute;
+  top: 4em;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  padding: 1em;
+  overflow-x: hidden;
+  overflow-y: auto;
+  line-height: 0;
+}
+
+.oo-ui-textInputWidget {
+  position: relative;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  display: inline-block;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  resize: none;
+}
+
+.oo-ui-textInputWidget-icon {
+  position: absolute;
+  top: 0;
+  right: 0;
+  height: 100%;
+  background-position: left center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-toggleSwitchWidget {
+  position: relative;
+  display: inline-block;
+  width: 4em;
+  height: 2em;
+  overflow: hidden;
+  vertical-align: middle;
+  cursor: pointer;
+  -webkit-transform: translateZ(0);
+     -moz-transform: translateZ(0);
+      -ms-transform: translateZ(0);
+       -o-transform: translateZ(0);
+          transform: translateZ(0);
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+
+.oo-ui-toggleSwitchWidget-grip {
+  position: absolute;
+  top: 0.25em;
+  right: 0.25em;
+  display: block;
+  width: 1.5em;
+  height: 1.5em;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+     -moz-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+      -ms-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+       -o-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+          transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+}
+
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  -webkit-transition: opacity 200ms ease-in-out;
+     -moz-transition: opacity 200ms ease-in-out;
+      -ms-transition: opacity 200ms ease-in-out;
+       -o-transition: opacity 200ms ease-in-out;
+          transition: opacity 200ms ease-in-out;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+  right: 2.25em;
+  margin-right: -2px;
+}
+
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+  right: 0.25em;
+  margin-right: 0;
+}
+
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: none;
+}
+
+/* Icons */
+
+.oo-ui-icon-add-item {
+  background-image: /* @embed */ url(images/icons/add-item.png);
+}
+
+.oo-ui-icon-advanced {
+  background-image: /* @embed */ url(images/icons/advanced.png);
+}
+
+.oo-ui-icon-alert {
+  background-image: /* @embed */ url(images/icons/alert.png);
+}
+
+.oo-ui-icon-check {
+  background-image: /* @embed */ url(images/icons/check.png);
+}
+
+.oo-ui-icon-clear {
+  background-image: /* @embed */ url(images/icons/clear.png);
+}
+
+.oo-ui-icon-close {
+  background-image: /* @embed */ url(images/icons/close.png);
+}
+
+.oo-ui-icon-code {
+  background-image: /* @embed */ url(images/icons/code.png);
+}
+
+.oo-ui-icon-collapse {
+  background-image: /* @embed */ url(images/icons/collapse.png);
+}
+
+.oo-ui-icon-comment {
+  background-image: /* @embed */ url(images/icons/comment.png);
+}
+
+.oo-ui-icon-expand {
+  background-image: /* @embed */ url(images/icons/expand.png);
+}
+
+.oo-ui-icon-help {
+  background-image: /* @embed */ url(images/icons/help.png);
+}
+
+.oo-ui-icon-info {
+  background-image: /* @embed */ url(images/icons/info.png);
+}
+
+.oo-ui-icon-link {
+  background-image: /* @embed */ url(images/icons/link.png);
+}
+
+.oo-ui-icon-menu {
+  background-image: /* @embed */ url(images/icons/menu.png);
+}
+
+.oo-ui-icon-next {
+  background-image: /* @embed */ url(images/icons/move-rtl.png);
+}
+
+.oo-ui-icon-picture {
+  background-image: /* @embed */ url(images/icons/picture.png);
+}
+
+.oo-ui-icon-previous {
+  background-image: /* @embed */ url(images/icons/move-ltr.png);
+}
+
+.oo-ui-icon-redo {
+  background-image: /* @embed */ url(images/icons/arched-arrow-rtl.png);
+}
+
+.oo-ui-icon-remove {
+  background-image: /* @embed */ url(images/icons/remove.png);
+}
+
+.oo-ui-icon-search {
+  background-image: /* @embed */ url(images/icons/search.png);
+}
+
+.oo-ui-icon-settings {
+  background-image: /* @embed */ url(images/icons/settings.png);
+}
+
+.oo-ui-icon-tag {
+  background-image: /* @embed */ url(images/icons/tag.png);
+}
+
+.oo-ui-icon-undo {
+  background-image: /* @embed */ url(images/icons/arched-arrow-ltr.png);
+}
+
+.oo-ui-icon-window {
+  background-image: /* @embed */ url(images/icons/window.png);
+}
+
+/* Indicators */
+
+.oo-ui-indicator-alert {
+  background-image: /* @embed */ url(images/indicators/alert.png);
+}
+
+.oo-ui-indicator-down {
+  background-image: /* @embed */ url(images/indicators/arrow-down.png);
+}
+
+.oo-ui-indicator-next {
+  background-image: /* @embed */ url(images/indicators/arrow-rtl.png);
+}
+
+.oo-ui-indicator-previous {
+  background-image: /* @embed */ url(images/indicators/arrow-ltr.png);
+}
+
+.oo-ui-indicator-required {
+  background-image: /* @embed */ url(images/indicators/required.png);
+}
+
+.oo-ui-indicator-up {
+  background-image: /* @embed */ url(images/indicators/arrow-up.png);
+}
\ No newline at end of file
index 6db85cd..bffc230 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (a1b99bb256)
+ * OOjs UI v0.1.0-pre (dd294dc785)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-07-17T19:17:19Z
+ * Date: 2014-07-30T23:10:53Z
  */
 /* Textures */
 
   margin: 0;
 }
 
-.oo-ui-frame-body {
+.oo-ui-frame-content {
   padding: 0;
   margin: 0;
-  background: none;
 }
 
 .oo-ui-frame-content:focus {
   line-height: 1em;
 }
 
-.oo-ui-toolbar-bottom .oo-ui-toolbar-bar {
-  position: absolute;
-}
-
 .oo-ui-toolbar-actions {
   float: right;
 }
   margin-top: 2em;
 }
 
-.oo-ui-fieldsetLayout-labeled {
-  margin-top: -0.75em;
-}
-
 .oo-ui-fieldsetLayout > .oo-ui-labeledElement-label {
   padding: 0.25em 0;
   margin-bottom: 0.5em;
diff --git a/resources/lib/oojs-ui/oojs-ui.svg.rtl.css b/resources/lib/oojs-ui/oojs-ui.svg.rtl.css
new file mode 100644 (file)
index 0000000..9a7fe08
--- /dev/null
@@ -0,0 +1,1271 @@
+/*!
+ * OOjs UI v0.1.0
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: 2014-07-22T21:39:24Z
+ */
+/* Textures */
+
+.oo-ui-texture-pending {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
+
+.oo-ui-texture-transparency {
+  background-image: /* @embed */ url(images/textures/transparency.png);
+}
+
+/* RTL Definitions */
+
+/* @noflip */
+
+.oo-ui-rtl {
+  direction: rtl;
+}
+
+/* @noflip */
+
+.oo-ui-ltr {
+  direction: ltr;
+}
+
+.oo-ui-frame {
+  padding: 0;
+  margin: 0;
+}
+
+.oo-ui-frame-body {
+  padding: 0;
+  margin: 0;
+  background: none;
+}
+
+.oo-ui-frame-content:focus {
+  outline: none;
+}
+
+.oo-ui-toolbar {
+  clear: both;
+}
+
+.oo-ui-toolbar-bar {
+  line-height: 1em;
+}
+
+.oo-ui-toolbar-bottom .oo-ui-toolbar-bar {
+  position: absolute;
+}
+
+.oo-ui-toolbar-actions {
+  float: left;
+}
+
+.oo-ui-toolbar-tools {
+  float: right;
+}
+
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+  -webkit-user-select: all;
+     -moz-user-select: all;
+      -ms-user-select: all;
+          user-select: all;
+  -webkit-touch-callout: default;
+}
+
+.oo-ui-toolbar-shadow {
+  position: absolute;
+  width: 100%;
+  pointer-events: none;
+  background-position: right top;
+  background-repeat: repeat-x;
+}
+
+.oo-ui-toolGroup {
+  display: inline-block;
+  margin: 0.3em;
+  vertical-align: middle;
+}
+
+.oo-ui-toolGroup-empty {
+  display: none;
+}
+
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-window {
+  line-height: 1em;
+}
+
+.oo-ui-window > .oo-ui-window-frame {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-window > .oo-ui-window-frame > .oo-ui-frame {
+  width: 100%;
+  height: 100%;
+}
+
+.oo-ui-window-head,
+.oo-ui-window-foot {
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-window-overlay {
+  position: absolute;
+  top: 0;
+  right: 0;
+}
+
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  position: fixed;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+}
+
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  width: auto;
+  height: auto;
+  padding: 1em;
+}
+
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
+  position: fixed;
+  left: 0;
+  right: 0;
+  max-width: 100%;
+  max-height: 100%;
+  margin: auto;
+  overflow: hidden;
+}
+
+.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
+  top: 0;
+  bottom: 0;
+  width: 100%;
+  height: 100%;
+}
+
+.oo-ui-messageDialog-actions-horizontal {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+}
+
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  display: table-cell;
+  width: 1%;
+}
+
+.oo-ui-messageDialog-actions-vertical {
+  display: block;
+}
+
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget {
+  position: relative;
+  text-align: center;
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonedElement-button {
+  display: block;
+}
+
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labeledElement-label {
+  position: relative;
+  top: auto;
+  bottom: auto;
+  display: inline;
+  white-space: nowrap;
+}
+
+.oo-ui-processDialog-location {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.oo-ui-processDialog-title {
+  display: inline;
+}
+
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
+  white-space: nowrap;
+}
+
+.oo-ui-processDialog-actions-safe,
+.oo-ui-processDialog-actions-primary {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+}
+
+.oo-ui-processDialog-actions-safe {
+  right: 0;
+}
+
+.oo-ui-processDialog-actions-primary {
+  left: 0;
+}
+
+.oo-ui-processDialog-errors {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  z-index: 2;
+  display: none;
+  padding: 3em 3em 1.5em 3em;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+
+.oo-ui-buttonedElement > .oo-ui-buttonedElement-button {
+  display: inline-block;
+  vertical-align: middle;
+  cursor: pointer;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-buttonedElement > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  display: none;
+  margin-right: 0;
+}
+
+.oo-ui-buttonedElement > .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator {
+  display: none;
+  margin-left: -0.75em;
+}
+
+.oo-ui-buttonedElement.oo-ui-widget-disabled > .oo-ui-buttonedElement-button {
+  cursor: default;
+}
+
+.oo-ui-buttonedElement.oo-ui-indicatedElement > .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
+.oo-ui-buttonedElement.oo-ui-iconedElement > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-buttonedElement-frameless {
+  position: relative;
+  display: inline-block;
+}
+
+.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+  display: inline-block;
+  margin-right: 0.25em;
+  vertical-align: middle;
+}
+
+.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button {
+  display: inline-block;
+  text-align: center;
+  vertical-align: top;
+}
+
+.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+  display: inline-block;
+  line-height: 1.9em;
+  vertical-align: middle;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
+  cursor: default;
+}
+
+.oo-ui-clippableElement-clippable {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+  overflow-y: hidden;
+}
+
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  width: 100%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+  padding: 2em;
+}
+
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 3em;
+  right: 0;
+  overflow-y: auto;
+}
+
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  position: absolute;
+  left: 0;
+  bottom: 0;
+  right: 0;
+}
+
+.oo-ui-fieldLayout {
+  margin-bottom: 1em;
+}
+
+.oo-ui-fieldLayout:last-child {
+  margin-bottom: 0;
+}
+
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+  display: table;
+  content: " ";
+}
+
+.oo-ui-fieldLayout:after {
+  clear: both;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labeledElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
+  display: block;
+  float: right;
+  width: 35%;
+  padding-top: 0.5em;
+  margin-left: 5%;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  display: block;
+  float: right;
+  width: 60%;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
+  text-align: left;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labeledElement-label {
+  display: inline-block;
+  padding: 0.75em 0.5em 0.5em 0.5em;
+  vertical-align: middle;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  display: inline-block;
+  padding: 0.5em 0;
+  vertical-align: middle;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labeledElement-label {
+  display: inline-block;
+  padding: 0.5em 0;
+}
+
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  margin-top: 0.25em;
+}
+
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+  z-index: 1;
+}
+
+.oo-ui-fieldsetLayout {
+  position: relative;
+  padding: 0;
+  margin: 0;
+}
+
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+  margin-top: 2em;
+}
+
+.oo-ui-fieldsetLayout-labeled {
+  margin-top: -0.75em;
+}
+
+.oo-ui-fieldsetLayout > .oo-ui-labeledElement-label {
+  padding: 0.25em 0;
+  margin-bottom: 0.5em;
+}
+
+.oo-ui-fieldsetLayout.oo-ui-iconedElement > .oo-ui-labeledElement-label {
+  padding-right: 1.75em;
+  line-height: 1.33em;
+}
+
+.oo-ui-fieldsetLayout.oo-ui-iconedElement > .oo-ui-iconedElement-icon {
+  position: absolute;
+  top: 0.25em;
+  right: 0;
+  display: block;
+  width: 2em;
+  height: 2em;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-gridLayout {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+}
+
+.oo-ui-labelWidget {
+  display: inline-block;
+  padding: 0.5em 0;
+}
+
+.oo-ui-panelLayout {
+  position: relative;
+}
+
+.oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+
+.oo-ui-panelLayout-expanded {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+}
+
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+  display: none;
+}
+
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+  position: relative;
+  display: block;
+}
+
+.oo-ui-barToolGroup > .oo-ui-iconedElement-icon,
+.oo-ui-barToolGroup > .oo-ui-labeledElement-label {
+  display: none;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool {
+  position: relative;
+  display: inline-block;
+  vertical-align: top;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  display: block;
+  height: 1.5em;
+  padding: 0.25em;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  display: block;
+  width: 1.5em;
+  height: 1.5em;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: none;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-title,
+.oo-ui-barToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
+  cursor: pointer;
+}
+
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool {
+  display: inline-block;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  display: block;
+  padding-left: 0.5em;
+  white-space: nowrap;
+  cursor: pointer;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+  min-width: 8em;
+}
+
+.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em 0 0.25em 0;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool {
+  display: block;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  display: block;
+  padding: 0 0.25em 0 1em;
+  white-space: nowrap;
+  cursor: pointer;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  background-image: none;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  background-image: /* @embed */ url(images/icons/check.svg);
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+
+.oo-ui-popupToolGroup {
+  position: relative;
+  height: 2em;
+  min-width: 2.5em;
+}
+
+.oo-ui-popupToolGroup.oo-ui-indicatedElement.oo-ui-iconedElement {
+  min-width: 3.5em;
+}
+
+.oo-ui-popupToolGroup-handle {
+  display: block;
+  cursor: pointer;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
+  position: absolute;
+  top: 0;
+  width: 2em;
+  height: 2em;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator {
+  left: 0;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
+  right: 0.25em;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
+  margin: 0 1em;
+  font-size: 0.8em;
+  line-height: 2.6em;
+}
+
+.oo-ui-popupToolGroup-header {
+  margin: 0 0.6em;
+  font-size: 0.8em;
+  font-weight: bold;
+  line-height: 2.6em;
+}
+
+.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+  cursor: default;
+}
+
+.oo-ui-popupToolGroup.oo-ui-iconedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
+  margin-right: 3em;
+}
+
+.oo-ui-popupToolGroup.oo-ui-indicatedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
+  margin-left: 2.25em;
+}
+
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  position: absolute;
+  top: 2em;
+  right: -1px;
+  z-index: 4;
+  display: none;
+}
+
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconedElement-icon {
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+  display: block;
+}
+
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  display: inline-block;
+  width: 2em;
+  height: 2em;
+  margin-left: 0.25em;
+  vertical-align: middle;
+}
+
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: inline-block;
+  font-size: 0.8em;
+  line-height: 2em;
+  vertical-align: middle;
+}
+
+.oo-ui-popupToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+
+.oo-ui-popupTool .oo-ui-popupWidget {
+  margin-right: 1.25em;
+  font-size: 0.8em;
+}
+
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-anchor {
+  z-index: 4;
+}
+
+.oo-ui-iconWidget {
+  display: inline-block;
+  width: 1.9em;
+  height: 1.9em;
+  line-height: 2.5em;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  opacity: 0.8;
+}
+
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+
+.oo-ui-indicatorWidget {
+  display: inline-block;
+  width: 1.9em;
+  height: 1.9em;
+  line-height: 2.5em;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  opacity: 0.8;
+}
+
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+
+.oo-ui-selectWidget {
+  padding: 0;
+  margin: 0;
+  list-style: none;
+}
+
+.oo-ui-optionWidget {
+  position: relative;
+  display: block;
+  margin: 0;
+  list-style: none;
+  cursor: pointer;
+  border: none;
+}
+
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+
+.oo-ui-optionWidget .oo-ui-labeledElement-label {
+  display: block;
+  overflow: hidden;
+  line-height: 1.5em;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.oo-ui-decoratedOptionWidget .oo-ui-iconedElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatedElement-indicator {
+  position: absolute;
+  top: 50%;
+  width: 2em;
+  height: 2em;
+  margin-top: -1em;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-decoratedOptionWidget .oo-ui-iconedElement-icon {
+  right: 0.5em;
+}
+
+.oo-ui-decoratedOptionWidget .oo-ui-indicatedElement-indicator {
+  left: 0.5em;
+}
+
+.oo-ui-menuWidget {
+  position: absolute;
+}
+
+.oo-ui-menuWidget input {
+  position: absolute;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+  opacity: 0;
+}
+
+.oo-ui-popupWidget-popup {
+  position: absolute;
+  z-index: 1;
+  overflow: hidden;
+}
+
+.oo-ui-popupWidget-anchor {
+  z-index: 1;
+  display: none;
+}
+
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+  margin-top: 7px;
+}
+
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+  position: absolute;
+  display: block;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-popupWidget-head {
+  height: 2.5em;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  float: left;
+  margin: 0.25em;
+}
+
+.oo-ui-popupWidget-head .oo-ui-labeledElement-label {
+  float: right;
+  margin: 0.75em 1em;
+  cursor: default;
+}
+
+.oo-ui-popupWidget-body {
+  overflow: hidden;
+  clear: both;
+}
+
+.oo-ui-popupWidget-body-padded {
+  padding: 0 1em;
+}
+
+.oo-ui-buttonGroupWidget {
+  border-radius: 0.3em;
+}
+
+.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
+  margin-bottom: -1px;
+  margin-right: -1px;
+  border-radius: 0;
+}
+
+.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:first-child .oo-ui-buttonedElement-button {
+  margin-right: 0;
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+}
+
+.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:last-child .oo-ui-buttonedElement-button {
+  border-top-left-radius: 0.3em;
+  border-bottom-left-radius: 0.3em;
+}
+
+.oo-ui-buttonOptionWidget {
+  display: inline-block;
+  background-color: transparent;
+}
+
+.oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button {
+  position: relative;
+  height: 1.9em;
+}
+
+.oo-ui-buttonOptionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator {
+  position: static;
+  display: inline-block;
+  height: 1.9em;
+  margin-top: 0;
+  vertical-align: middle;
+}
+
+.oo-ui-buttonSelectWidget {
+  display: inline-block;
+  white-space: nowrap;
+}
+
+.oo-ui-buttonWidget {
+  display: inline-block;
+  vertical-align: middle;
+}
+
+.oo-ui-inlineMenuWidget {
+  position: relative;
+  display: inline-block;
+  min-width: 20em;
+  margin: 0.25em 0;
+}
+
+.oo-ui-inlineMenuWidget-handle {
+  display: inline-block;
+  width: 100%;
+  height: 2.5em;
+  cursor: pointer;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
+  position: absolute;
+  top: 0;
+  width: 2.5em;
+  height: 2.5em;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator {
+  left: 0;
+}
+
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
+  right: 0.25em;
+}
+
+.oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
+  margin: 0 0.5em;
+  line-height: 2.5em;
+}
+
+.oo-ui-inlineMenuWidget.oo-ui-iconedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
+  margin-right: 3em;
+}
+
+.oo-ui-inlineMenuWidget.oo-ui-indicatedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
+  margin-left: 2em;
+}
+
+.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+  z-index: 1;
+  width: 100%;
+}
+
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+  cursor: default;
+}
+
+.oo-ui-menuItemWidget {
+  position: relative;
+}
+
+.oo-ui-menuItemWidget .oo-ui-iconedElement-icon {
+  display: none;
+}
+
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
+}
+
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconedElement-icon {
+  display: block;
+}
+
+.oo-ui-menuSectionItemWidget {
+  cursor: default;
+}
+
+.oo-ui-outlineControlsWidget {
+  height: 3em;
+}
+
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+  float: right;
+  height: 2em;
+  padding: 0;
+  margin: 0.5em;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-outlineControlsWidget > .oo-ui-iconedElement-icon {
+  float: right;
+  width: 1.5em;
+  height: 2em;
+  margin: 0.5em 0.5em 0.5em 0;
+  background-position: left center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-outlineControlsWidget-items {
+  float: right;
+  margin-right: 0;
+}
+
+.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
+  float: right;
+}
+
+.oo-ui-outlineControlsWidget-movers {
+  float: left;
+}
+
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+  float: left;
+}
+
+.oo-ui-outlineItemWidget {
+  position: relative;
+  padding: 0.75em;
+  cursor: pointer;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-popupButtonWidget {
+  position: relative;
+}
+
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+  position: absolute;
+  right: 1em;
+  cursor: auto;
+}
+
+.oo-ui-searchWidget-query {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  height: 4em;
+  padding: 0 1em;
+}
+
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+  width: 100%;
+  margin: 0.75em 0;
+}
+
+.oo-ui-searchWidget-results {
+  position: absolute;
+  top: 4em;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  padding: 1em;
+  overflow-x: hidden;
+  overflow-y: auto;
+  line-height: 0;
+}
+
+.oo-ui-textInputWidget {
+  position: relative;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  display: inline-block;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  resize: none;
+}
+
+.oo-ui-textInputWidget-icon {
+  position: absolute;
+  top: 0;
+  right: 0;
+  height: 100%;
+  background-position: left center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-toggleSwitchWidget {
+  position: relative;
+  display: inline-block;
+  width: 4em;
+  height: 2em;
+  overflow: hidden;
+  vertical-align: middle;
+  cursor: pointer;
+  -webkit-transform: translateZ(0);
+     -moz-transform: translateZ(0);
+      -ms-transform: translateZ(0);
+       -o-transform: translateZ(0);
+          transform: translateZ(0);
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+
+.oo-ui-toggleSwitchWidget-grip {
+  position: absolute;
+  top: 0.25em;
+  right: 0.25em;
+  display: block;
+  width: 1.5em;
+  height: 1.5em;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+     -moz-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+      -ms-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+       -o-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+          transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+}
+
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  -webkit-transition: opacity 200ms ease-in-out;
+     -moz-transition: opacity 200ms ease-in-out;
+      -ms-transition: opacity 200ms ease-in-out;
+       -o-transition: opacity 200ms ease-in-out;
+          transition: opacity 200ms ease-in-out;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+  right: 2.25em;
+  margin-right: -2px;
+}
+
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+  right: 0.25em;
+  margin-right: 0;
+}
+
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: none;
+}
+
+/* Icons */
+
+.oo-ui-icon-add-item {
+  background-image: /* @embed */ url(images/icons/add-item.svg);
+}
+
+.oo-ui-icon-advanced {
+  background-image: /* @embed */ url(images/icons/advanced.svg);
+}
+
+.oo-ui-icon-alert {
+  background-image: /* @embed */ url(images/icons/alert.svg);
+}
+
+.oo-ui-icon-check {
+  background-image: /* @embed */ url(images/icons/check.svg);
+}
+
+.oo-ui-icon-clear {
+  background-image: /* @embed */ url(images/icons/clear.svg);
+}
+
+.oo-ui-icon-close {
+  background-image: /* @embed */ url(images/icons/close.svg);
+}
+
+.oo-ui-icon-code {
+  background-image: /* @embed */ url(images/icons/code.svg);
+}
+
+.oo-ui-icon-collapse {
+  background-image: /* @embed */ url(images/icons/collapse.svg);
+}
+
+.oo-ui-icon-comment {
+  background-image: /* @embed */ url(images/icons/comment.svg);
+}
+
+.oo-ui-icon-expand {
+  background-image: /* @embed */ url(images/icons/expand.svg);
+}
+
+.oo-ui-icon-help {
+  background-image: /* @embed */ url(images/icons/help.svg);
+}
+
+.oo-ui-icon-info {
+  background-image: /* @embed */ url(images/icons/info.svg);
+}
+
+.oo-ui-icon-link {
+  background-image: /* @embed */ url(images/icons/link.svg);
+}
+
+.oo-ui-icon-menu {
+  background-image: /* @embed */ url(images/icons/menu.svg);
+}
+
+.oo-ui-icon-next {
+  background-image: /* @embed */ url(images/icons/move-rtl.svg);
+}
+
+.oo-ui-icon-picture {
+  background-image: /* @embed */ url(images/icons/picture.svg);
+}
+
+.oo-ui-icon-previous {
+  background-image: /* @embed */ url(images/icons/move-ltr.svg);
+}
+
+.oo-ui-icon-redo {
+  background-image: /* @embed */ url(images/icons/arched-arrow-rtl.svg);
+}
+
+.oo-ui-icon-remove {
+  background-image: /* @embed */ url(images/icons/remove.svg);
+}
+
+.oo-ui-icon-search {
+  background-image: /* @embed */ url(images/icons/search.svg);
+}
+
+.oo-ui-icon-settings {
+  background-image: /* @embed */ url(images/icons/settings.svg);
+}
+
+.oo-ui-icon-tag {
+  background-image: /* @embed */ url(images/icons/tag.svg);
+}
+
+.oo-ui-icon-undo {
+  background-image: /* @embed */ url(images/icons/arched-arrow-ltr.svg);
+}
+
+.oo-ui-icon-window {
+  background-image: /* @embed */ url(images/icons/window.svg);
+}
+
+/* Indicators */
+
+.oo-ui-indicator-alert {
+  background-image: /* @embed */ url(images/indicators/alert.svg);
+}
+
+.oo-ui-indicator-down {
+  background-image: /* @embed */ url(images/indicators/arrow-down.svg);
+}
+
+.oo-ui-indicator-next {
+  background-image: /* @embed */ url(images/indicators/arrow-rtl.svg);
+}
+
+.oo-ui-indicator-previous {
+  background-image: /* @embed */ url(images/indicators/arrow-ltr.svg);
+}
+
+.oo-ui-indicator-required {
+  background-image: /* @embed */ url(images/indicators/required.svg);
+}
+
+.oo-ui-indicator-up {
+  background-image: /* @embed */ url(images/indicators/arrow-up.svg);
+}
\ No newline at end of file
diff --git a/resources/lib/oojs/oojs.jquery.js b/resources/lib/oojs/oojs.jquery.js
new file mode 100644 (file)
index 0000000..8be7665
--- /dev/null
@@ -0,0 +1,832 @@
+/*!
+ * OOjs v1.0.11
+ * https://www.mediawiki.org/wiki/OOjs
+ *
+ * Copyright 2011-2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: 2014-07-23T20:15:47Z
+ */
+( function ( global ) {
+
+'use strict';
+
+/*exported toString */
+var
+       /**
+        * Namespace for all classes, static methods and static properties.
+        * @class OO
+        * @singleton
+        */
+       oo = {},
+       hasOwn = oo.hasOwnProperty,
+       toString = oo.toString;
+
+/* Class Methods */
+
+/**
+ * Utility to initialize a class for OO inheritance.
+ *
+ * Currently this just initializes an empty static object.
+ *
+ * @param {Function} fn
+ */
+oo.initClass = function ( fn ) {
+       fn.static = fn.static || {};
+};
+
+/**
+ * Utility for common usage of Object#create for inheriting from one
+ * prototype to another.
+ *
+ * Beware: This redefines the prototype, call before setting your prototypes.
+ * Beware: This redefines the prototype, can only be called once on a function.
+ *  If called multiple times on the same function, the previous prototype is lost.
+ *  This is how prototypal inheritance works, it can only be one straight chain
+ *  (just like classical inheritance in PHP for example). If you need to work with
+ *  multiple constructors consider storing an instance of the other constructor in a
+ *  property instead, or perhaps use a mixin (see OO.mixinClass).
+ *
+ *     function Thing() {}
+ *     Thing.prototype.exists = function () {};
+ *
+ *     function Person() {
+ *         Person.super.apply( this, arguments );
+ *     }
+ *     OO.inheritClass( Person, Thing );
+ *     Person.static.defaultEyeCount = 2;
+ *     Person.prototype.walk = function () {};
+ *
+ *     function Jumper() {
+ *         Jumper.super.apply( this, arguments );
+ *     }
+ *     OO.inheritClass( Jumper, Person );
+ *     Jumper.prototype.jump = function () {};
+ *
+ *     Jumper.static.defaultEyeCount === 2;
+ *     var x = new Jumper();
+ *     x.jump();
+ *     x.walk();
+ *     x instanceof Thing && x instanceof Person && x instanceof Jumper;
+ *
+ * @param {Function} targetFn
+ * @param {Function} originFn
+ * @throws {Error} If target already inherits from origin
+ */
+oo.inheritClass = function ( targetFn, originFn ) {
+       if ( targetFn.prototype instanceof originFn ) {
+               throw new Error( 'Target already inherits from origin' );
+       }
+
+       var targetConstructor = targetFn.prototype.constructor;
+
+       // Using ['super'] instead of .super because 'super' is not supported
+       // by IE 8 and below (bug 63303).
+       // Provide .parent as alias for code supporting older browsers which
+       // allows people to comply with their style guide.
+       targetFn['super'] = targetFn.parent = originFn;
+
+       targetFn.prototype = Object.create( originFn.prototype, {
+               // Restore constructor property of targetFn
+               constructor: {
+                       value: targetConstructor,
+                       enumerable: false,
+                       writable: true,
+                       configurable: true
+               }
+       } );
+
+       // Extend static properties - always initialize both sides
+       oo.initClass( originFn );
+       targetFn.static = Object.create( originFn.static );
+};
+
+/**
+ * Utility to copy over *own* prototype properties of a mixin.
+ * The 'constructor' (whether implicit or explicit) is not copied over.
+ *
+ * This does not create inheritance to the origin. If inheritance is needed
+ * use oo.inheritClass instead.
+ *
+ * Beware: This can redefine a prototype property, call before setting your prototypes.
+ * Beware: Don't call before oo.inheritClass.
+ *
+ *     function Foo() {}
+ *     function Context() {}
+ *
+ *     // Avoid repeating this code
+ *     function ContextLazyLoad() {}
+ *     ContextLazyLoad.prototype.getContext = function () {
+ *         if ( !this.context ) {
+ *             this.context = new Context();
+ *         }
+ *         return this.context;
+ *     };
+ *
+ *     function FooBar() {}
+ *     OO.inheritClass( FooBar, Foo );
+ *     OO.mixinClass( FooBar, ContextLazyLoad );
+ *
+ * @param {Function} targetFn
+ * @param {Function} originFn
+ */
+oo.mixinClass = function ( targetFn, originFn ) {
+       var key;
+
+       // Copy prototype properties
+       for ( key in originFn.prototype ) {
+               if ( key !== 'constructor' && hasOwn.call( originFn.prototype, key ) ) {
+                       targetFn.prototype[key] = originFn.prototype[key];
+               }
+       }
+
+       // Copy static properties - always initialize both sides
+       oo.initClass( targetFn );
+       if ( originFn.static ) {
+               for ( key in originFn.static ) {
+                       if ( hasOwn.call( originFn.static, key ) ) {
+                               targetFn.static[key] = originFn.static[key];
+                       }
+               }
+       } else {
+               oo.initClass( originFn );
+       }
+};
+
+/* Object Methods */
+
+/**
+ * Create a new object that is an instance of the same
+ * constructor as the input, inherits from the same object
+ * and contains the same own properties.
+ *
+ * This makes a shallow non-recursive copy of own properties.
+ * To create a recursive copy of plain objects, use #copy.
+ *
+ *     var foo = new Person( mom, dad );
+ *     foo.setAge( 21 );
+ *     var foo2 = OO.cloneObject( foo );
+ *     foo.setAge( 22 );
+ *
+ *     // Then
+ *     foo2 !== foo; // true
+ *     foo2 instanceof Person; // true
+ *     foo2.getAge(); // 21
+ *     foo.getAge(); // 22
+ *
+ * @param {Object} origin
+ * @return {Object} Clone of origin
+ */
+oo.cloneObject = function ( origin ) {
+       var key, r;
+
+       r = Object.create( origin.constructor.prototype );
+
+       for ( key in origin ) {
+               if ( hasOwn.call( origin, key ) ) {
+                       r[key] = origin[key];
+               }
+       }
+
+       return r;
+};
+
+/**
+ * Get an array of all property values in an object.
+ *
+ * @param {Object} Object to get values from
+ * @return {Array} List of object values
+ */
+oo.getObjectValues = function ( obj ) {
+       var key, values;
+
+       if ( obj !== Object( obj ) ) {
+               throw new TypeError( 'Called on non-object' );
+       }
+
+       values = [];
+       for ( key in obj ) {
+               if ( hasOwn.call( obj, key ) ) {
+                       values[values.length] = obj[key];
+               }
+       }
+
+       return values;
+};
+
+/**
+ * Recursively compares properties between two objects.
+ *
+ * A false result may be caused by property inequality or by properties in one object missing from
+ * the other. An asymmetrical test may also be performed, which checks only that properties in the
+ * first object are present in the second object, but not the inverse.
+ *
+ * @param {Object} a First object to compare
+ * @param {Object} b Second object to compare
+ * @param {boolean} [asymmetrical] Whether to check only that b contains values from a
+ * @return {boolean} If the objects contain the same values as each other
+ */
+oo.compare = function ( a, b, asymmetrical ) {
+       var aValue, bValue, aType, bType, k;
+
+       if ( a === b ) {
+               return true;
+       }
+
+       for ( k in a ) {
+               if ( !hasOwn.call( a, k ) ) {
+                       // Support es3-shim: Without this filter, comparing [] to {} will be false in ES3
+                       // because the shimmed "forEach" is enumerable and shows up in Array but not Object.
+                       continue;
+               }
+
+               aValue = a[k];
+               bValue = b[k];
+               aType = typeof aValue;
+               bType = typeof bValue;
+               if ( aType !== bType ||
+                       ( ( aType === 'string' || aType === 'number' ) && aValue !== bValue ) ||
+                       ( aValue === Object( aValue ) && !oo.compare( aValue, bValue, asymmetrical ) ) ) {
+                       return false;
+               }
+       }
+       // If the check is not asymmetrical, recursing with the arguments swapped will verify our result
+       return asymmetrical ? true : oo.compare( b, a, true );
+};
+
+/**
+ * Create a plain deep copy of any kind of object.
+ *
+ * Copies are deep, and will either be an object or an array depending on `source`.
+ *
+ * @param {Object} source Object to copy
+ * @param {Function} [callback] Applied to leaf values before they added to the clone
+ * @return {Object} Copy of source object
+ */
+oo.copy = function ( source, callback ) {
+       var key, sourceValue, sourceType, destination;
+
+       if ( typeof source.clone === 'function' ) {
+               return source.clone();
+       }
+
+       destination = Array.isArray( source ) ? new Array( source.length ) : {};
+
+       for ( key in source ) {
+               sourceValue = source[key];
+               sourceType = typeof sourceValue;
+               if ( Array.isArray( sourceValue ) ) {
+                       // Array
+                       destination[key] = oo.copy( sourceValue, callback );
+               } else if ( sourceValue && typeof sourceValue.clone === 'function' ) {
+                       // Duck type object with custom clone method
+                       destination[key] = callback ?
+                               callback( sourceValue.clone() ) : sourceValue.clone();
+               } else if ( sourceValue && typeof sourceValue.cloneNode === 'function' ) {
+                       // DOM Node
+                       destination[key] = callback ?
+                               callback( sourceValue.cloneNode( true ) ) : sourceValue.cloneNode( true );
+               } else if ( oo.isPlainObject( sourceValue ) ) {
+                       // Plain objects
+                       destination[key] = oo.copy( sourceValue, callback );
+               } else {
+                       // Non-plain objects (incl. functions) and primitive values
+                       destination[key] = callback ? callback( sourceValue ) : sourceValue;
+               }
+       }
+
+       return destination;
+};
+
+/**
+ * Generate a hash of an object based on its name and data.
+ *
+ * Performance optimization: <http://jsperf.com/ve-gethash-201208#/toJson_fnReplacerIfAoForElse>
+ *
+ * To avoid two objects with the same values generating different hashes, we utilize the replacer
+ * argument of JSON.stringify and sort the object by key as it's being serialized. This may or may
+ * not be the fastest way to do this; we should investigate this further.
+ *
+ * Objects and arrays are hashed recursively. When hashing an object that has a .getHash()
+ * function, we call that function and use its return value rather than hashing the object
+ * ourselves. This allows classes to define custom hashing.
+ *
+ * @param {Object} val Object to generate hash for
+ * @return {string} Hash of object
+ */
+oo.getHash = function ( val ) {
+       return JSON.stringify( val, oo.getHash.keySortReplacer );
+};
+
+/**
+ * Helper function for OO.getHash which sorts objects by key.
+ *
+ * This is a callback passed into JSON.stringify.
+ *
+ * @method getHash_keySortReplacer
+ * @param {string} key Property name of value being replaced
+ * @param {Mixed} val Property value to replace
+ * @return {Mixed} Replacement value
+ */
+oo.getHash.keySortReplacer = function ( key, val ) {
+       var normalized, keys, i, len;
+       if ( val && typeof val.getHashObject === 'function' ) {
+               // This object has its own custom hash function, use it
+               val = val.getHashObject();
+       }
+       if ( !Array.isArray( val ) && Object( val ) === val ) {
+               // Only normalize objects when the key-order is ambiguous
+               // (e.g. any object not an array).
+               normalized = {};
+               keys = Object.keys( val ).sort();
+               i = 0;
+               len = keys.length;
+               for ( ; i < len; i += 1 ) {
+                       normalized[keys[i]] = val[keys[i]];
+               }
+               return normalized;
+
+       // Primitive values and arrays get stable hashes
+       // by default. Lets those be stringified as-is.
+       } else {
+               return val;
+       }
+};
+
+/**
+ * Compute the union (duplicate-free merge) of a set of arrays.
+ *
+ * Arrays values must be convertable to object keys (strings).
+ *
+ * By building an object (with the values for keys) in parallel with
+ * the array, a new item's existence in the union can be computed faster.
+ *
+ * @param {Array...} arrays Arrays to union
+ * @return {Array} Union of the arrays
+ */
+oo.simpleArrayUnion = function () {
+       var i, ilen, arr, j, jlen,
+               obj = {},
+               result = [];
+
+       for ( i = 0, ilen = arguments.length; i < ilen; i++ ) {
+               arr = arguments[i];
+               for ( j = 0, jlen = arr.length; j < jlen; j++ ) {
+                       if ( !obj[ arr[j] ] ) {
+                               obj[ arr[j] ] = true;
+                               result.push( arr[j] );
+                       }
+               }
+       }
+
+       return result;
+};
+
+/**
+ * Combine arrays (intersection or difference).
+ *
+ * An intersection checks the item exists in 'b' while difference checks it doesn't.
+ *
+ * Arrays values must be convertable to object keys (strings).
+ *
+ * By building an object (with the values for keys) of 'b' we can
+ * compute the result faster.
+ *
+ * @private
+ * @param {Array} a First array
+ * @param {Array} b Second array
+ * @param {boolean} includeB Whether to items in 'b'
+ * @return {Array} Combination (intersection or difference) of arrays
+ */
+function simpleArrayCombine( a, b, includeB ) {
+       var i, ilen, isInB,
+               bObj = {},
+               result = [];
+
+       for ( i = 0, ilen = b.length; i < ilen; i++ ) {
+               bObj[ b[i] ] = true;
+       }
+
+       for ( i = 0, ilen = a.length; i < ilen; i++ ) {
+               isInB = !!bObj[ a[i] ];
+               if ( isInB === includeB ) {
+                       result.push( a[i] );
+               }
+       }
+
+       return result;
+}
+
+/**
+ * Compute the intersection of two arrays (items in both arrays).
+ *
+ * Arrays values must be convertable to object keys (strings).
+ *
+ * @param {Array} a First array
+ * @param {Array} b Second array
+ * @return {Array} Intersection of arrays
+ */
+oo.simpleArrayIntersection = function ( a, b ) {
+       return simpleArrayCombine( a, b, true );
+};
+
+/**
+ * Compute the difference of two arrays (items in 'a' but not 'b').
+ *
+ * Arrays values must be convertable to object keys (strings).
+ *
+ * @param {Array} a First array
+ * @param {Array} b Second array
+ * @return {Array} Intersection of arrays
+ */
+oo.simpleArrayDifference = function ( a, b ) {
+       return simpleArrayCombine( a, b, false );
+};
+
+/*global $ */
+
+oo.isPlainObject = $.isPlainObject;
+
+/*global hasOwn */
+
+/**
+ * @class OO.EventEmitter
+ *
+ * @constructor
+ */
+oo.EventEmitter = function OoEventEmitter() {
+       // Properties
+
+       /**
+        * Storage of bound event handlers by event name.
+        *
+        * @property
+        */
+       this.bindings = {};
+};
+
+/* Methods */
+
+/**
+ * Add a listener to events of a specific event.
+ *
+ * @param {string} event Type of event to listen to
+ * @param {Function} callback Function to call when event occurs
+ * @param {Array} [args] Arguments to pass to listener, will be prepended to emitted arguments
+ * @param {Object} [context=null] Object to use as context for callback function or call method on
+ * @throws {Error} Listener argument is not a function or method name
+ * @chainable
+ */
+oo.EventEmitter.prototype.on = function ( event, callback, args, context ) {
+       var bindings;
+
+       // Validate callback
+       if ( typeof callback !== 'function' ) {
+               throw new Error( 'Invalid callback. Function or method name expected.' );
+       }
+       // Fallback to null context
+       if ( arguments.length < 4 ) {
+               context = null;
+       }
+       if ( hasOwn.call( this.bindings, event ) ) {
+               bindings = this.bindings[event];
+       } else {
+               // Auto-initialize bindings list
+               bindings = this.bindings[event] = [];
+       }
+       // Add binding
+       bindings.push( {
+               callback: callback,
+               args: args,
+               context: context
+       } );
+       return this;
+};
+
+/**
+ * Adds a one-time listener to a specific event.
+ *
+ * @param {string} event Type of event to listen to
+ * @param {Function} listener Listener to call when event occurs
+ * @chainable
+ */
+oo.EventEmitter.prototype.once = function ( event, listener ) {
+       var eventEmitter = this,
+               listenerWrapper = function () {
+                       eventEmitter.off( event, listenerWrapper );
+                       listener.apply( eventEmitter, Array.prototype.slice.call( arguments, 0 ) );
+               };
+       return this.on( event, listenerWrapper );
+};
+
+/**
+ * Remove a specific listener from a specific event.
+ *
+ * @param {string} event Type of event to remove listener from
+ * @param {Function} [callback] Listener to remove, omit to remove all
+ * @param {Object} [context=null] Object used context for callback function or method
+ * @chainable
+ * @throws {Error} Listener argument is not a function
+ */
+oo.EventEmitter.prototype.off = function ( event, callback, context ) {
+       var i, bindings;
+
+       if ( arguments.length === 1 ) {
+               // Remove all bindings for event
+               delete this.bindings[event];
+       } else {
+               if ( typeof callback !== 'function' ) {
+                       throw new Error( 'Invalid callback. Function expected.' );
+               }
+               if ( !( event in this.bindings ) || !this.bindings[event].length ) {
+                       // No matching bindings
+                       return this;
+               }
+               // Fallback to null context
+               if ( arguments.length < 3 ) {
+                       context = null;
+               }
+               // Remove matching handlers
+               bindings = this.bindings[event];
+               i = bindings.length;
+               while ( i-- ) {
+                       if ( bindings[i].callback === callback && bindings[i].context === context ) {
+                               bindings.splice( i, 1 );
+                       }
+               }
+               // Cleanup if now empty
+               if ( bindings.length === 0 ) {
+                       delete this.bindings[event];
+               }
+       }
+       return this;
+};
+
+/**
+ * Emit an event.
+ *
+ * TODO: Should this be chainable? What is the usefulness of the boolean
+ * return value here?
+ *
+ * @param {string} event Type of event
+ * @param {Mixed} args First in a list of variadic arguments passed to event handler (optional)
+ * @return {boolean} If event was handled by at least one listener
+ */
+oo.EventEmitter.prototype.emit = function ( event ) {
+       var i, len, binding, bindings, args;
+
+       if ( event in this.bindings ) {
+               // Slicing ensures that we don't get tripped up by event handlers that add/remove bindings
+               bindings = this.bindings[event].slice();
+               args = Array.prototype.slice.call( arguments, 1 );
+               for ( i = 0, len = bindings.length; i < len; i++ ) {
+                       binding = bindings[i];
+                       binding.callback.apply(
+                               binding.context,
+                               binding.args ? binding.args.concat( args ) : args
+                       );
+               }
+               return true;
+       }
+       return false;
+};
+
+/**
+ * Connect event handlers to an object.
+ *
+ * @param {Object} context Object to call methods on when events occur
+ * @param {Object.<string,string>|Object.<string,Function>|Object.<string,Array>} methods List of
+ *  event bindings keyed by event name containing either method names, functions or arrays containing
+ *  method name or function followed by a list of arguments to be passed to callback before emitted
+ *  arguments
+ * @chainable
+ */
+oo.EventEmitter.prototype.connect = function ( context, methods ) {
+       var method, callback, args, event;
+
+       for ( event in methods ) {
+               method = methods[event];
+               // Allow providing additional args
+               if ( Array.isArray( method ) ) {
+                       args = method.slice( 1 );
+                       method = method[0];
+               } else {
+                       args = [];
+               }
+               // Allow callback to be a method name
+               if ( typeof method === 'string' ) {
+                       // Validate method
+                       if ( !context[method] || typeof context[method] !== 'function' ) {
+                               throw new Error( 'Method not found: ' + method );
+                       }
+                       // Resolve to function
+                       callback = context[method];
+               } else {
+                       callback = method;
+               }
+               // Add binding
+               this.on.apply( this, [ event, callback, args, context ] );
+       }
+       return this;
+};
+
+/**
+ * Disconnect event handlers from an object.
+ *
+ * @param {Object} context Object to disconnect methods from
+ * @param {Object.<string,string>|Object.<string,Function>|Object.<string,Array>} [methods] List of
+ * event bindings keyed by event name containing either method names or functions
+ * @chainable
+ */
+oo.EventEmitter.prototype.disconnect = function ( context, methods ) {
+       var i, method, callback, event, bindings;
+
+       if ( methods ) {
+               // Remove specific connections to the context
+               for ( event in methods ) {
+                       method = methods[event];
+                       if ( typeof method === 'string' ) {
+                               // Validate method
+                               if ( !context[method] || typeof context[method] !== 'function' ) {
+                                       throw new Error( 'Method not found: ' + method );
+                               }
+                               // Resolve to function
+                               callback = context[method];
+                       } else {
+                               callback = method;
+                       }
+                       this.off( event, callback, context );
+               }
+       } else {
+               // Remove all connections to the context
+               for ( event in this.bindings ) {
+                       bindings = this.bindings[event];
+                       i = bindings.length;
+                       while ( i-- ) {
+                               // bindings[i] may have been removed by the previous step's
+                               // this.off so check it still exists
+                               if ( bindings[i] && bindings[i].context === context ) {
+                                       this.off( event, bindings[i].callback, context );
+                               }
+                       }
+               }
+       }
+
+       return this;
+};
+
+/**
+ * @class OO.Registry
+ * @mixins OO.EventEmitter
+ *
+ * @constructor
+ */
+oo.Registry = function OoRegistry() {
+       // Mixin constructors
+       oo.EventEmitter.call( this );
+
+       // Properties
+       this.registry = {};
+};
+
+/* Inheritance */
+
+oo.mixinClass( oo.Registry, oo.EventEmitter );
+
+/* Events */
+
+/**
+ * @event register
+ * @param {string} name
+ * @param {Mixed} data
+ */
+
+/* Methods */
+
+/**
+ * Associate one or more symbolic names with some data.
+ *
+ * Only the base name will be registered, overriding any existing entry with the same base name.
+ *
+ * @param {string|string[]} name Symbolic name or list of symbolic names
+ * @param {Mixed} data Data to associate with symbolic name
+ * @fires register
+ * @throws {Error} Name argument must be a string or array
+ */
+oo.Registry.prototype.register = function ( name, data ) {
+       var i, len;
+       if ( typeof name === 'string' ) {
+               this.registry[name] = data;
+               this.emit( 'register', name, data );
+       } else if ( Array.isArray( name ) ) {
+               for ( i = 0, len = name.length; i < len; i++ ) {
+                       this.register( name[i], data );
+               }
+       } else {
+               throw new Error( 'Name must be a string or array, cannot be a ' + typeof name );
+       }
+};
+
+/**
+ * Get data for a given symbolic name.
+ *
+ * Lookups are done using the base name.
+ *
+ * @param {string} name Symbolic name
+ * @return {Mixed|undefined} Data associated with symbolic name
+ */
+oo.Registry.prototype.lookup = function ( name ) {
+       return this.registry[name];
+};
+
+/**
+ * @class OO.Factory
+ * @extends OO.Registry
+ *
+ * @constructor
+ */
+oo.Factory = function OoFactory() {
+       oo.Factory.parent.call( this );
+
+       // Properties
+       this.entries = [];
+};
+
+/* Inheritance */
+
+oo.inheritClass( oo.Factory, oo.Registry );
+
+/* Methods */
+
+/**
+ * Register a constructor with the factory.
+ *
+ * Classes must have a static `name` property to be registered.
+ *
+ *     function MyClass() {};
+ *     OO.initClass( MyClass );
+ *     // Adds a static property to the class defining a symbolic name
+ *     MyClass.static.name = 'mine';
+ *     // Registers class with factory, available via symbolic name 'mine'
+ *     factory.register( MyClass );
+ *
+ * @param {Function} constructor Constructor to use when creating object
+ * @throws {Error} Name must be a string and must not be empty
+ * @throws {Error} Constructor must be a function
+ */
+oo.Factory.prototype.register = function ( constructor ) {
+       var name;
+
+       if ( typeof constructor !== 'function' ) {
+               throw new Error( 'constructor must be a function, cannot be a ' + typeof constructor );
+       }
+       name = constructor.static && constructor.static.name;
+       if ( typeof name !== 'string' || name === '' ) {
+               throw new Error( 'Name must be a string and must not be empty' );
+       }
+       this.entries.push( name );
+
+       oo.Factory.parent.prototype.register.call( this, name, constructor );
+};
+
+/**
+ * Create an object based on a name.
+ *
+ * Name is used to look up the constructor to use, while all additional arguments are passed to the
+ * constructor directly, so leaving one out will pass an undefined to the constructor.
+ *
+ * @param {string} name Object name
+ * @param {Mixed...} [args] Arguments to pass to the constructor
+ * @return {Object} The new object
+ * @throws {Error} Unknown object name
+ */
+oo.Factory.prototype.create = function ( name ) {
+       var args, obj, constructor;
+
+       if ( !this.registry.hasOwnProperty( name ) ) {
+               throw new Error( 'No class registered by that name: ' + name );
+       }
+       constructor = this.registry[name];
+
+       // Convert arguments to array and shift the first argument (name) off
+       args = Array.prototype.slice.call( arguments, 1 );
+
+       // We can't use the "new" operator with .apply directly because apply needs a
+       // context. So instead just do what "new" does: create an object that inherits from
+       // the constructor's prototype (which also makes it an "instanceof" the constructor),
+       // then invoke the constructor with the object as context, and return it (ignoring
+       // the constructor's return value).
+       obj = Object.create( constructor.prototype );
+       constructor.apply( obj, args );
+       return obj;
+};
+
+/*jshint node:true */
+if ( typeof module !== 'undefined' && module.exports ) {
+       module.exports = oo;
+} else {
+       global.OO = oo;
+}
+
+}( this ) );
diff --git a/resources/lib/oojs/oojs.js b/resources/lib/oojs/oojs.js
deleted file mode 100644 (file)
index 8ccd50a..0000000
+++ /dev/null
@@ -1,862 +0,0 @@
-/*!
- * OOjs v1.0.10
- * https://www.mediawiki.org/wiki/OOjs
- *
- * Copyright 2011-2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: Wed Jun 18 2014 20:03:40 GMT-0700 (PDT)
- */
-( function ( global ) {
-
-'use strict';
-/*exported toString */
-var
-       /**
-        * Namespace for all classes, static methods and static properties.
-        * @class OO
-        * @singleton
-        */
-       oo = {},
-       hasOwn = oo.hasOwnProperty,
-       toString = oo.toString;
-
-/* Class Methods */
-
-/**
- * Utility to initialize a class for OO inheritance.
- *
- * Currently this just initializes an empty static object.
- *
- * @param {Function} fn
- */
-oo.initClass = function ( fn ) {
-       fn.static = fn.static || {};
-};
-
-/**
- * Utility for common usage of Object#create for inheriting from one
- * prototype to another.
- *
- * Beware: This redefines the prototype, call before setting your prototypes.
- * Beware: This redefines the prototype, can only be called once on a function.
- *  If called multiple times on the same function, the previous prototype is lost.
- *  This is how prototypal inheritance works, it can only be one straight chain
- *  (just like classical inheritance in PHP for example). If you need to work with
- *  multiple constructors consider storing an instance of the other constructor in a
- *  property instead, or perhaps use a mixin (see OO.mixinClass).
- *
- *     function Thing() {}
- *     Thing.prototype.exists = function () {};
- *
- *     function Person() {
- *         Person.super.apply( this, arguments );
- *     }
- *     OO.inheritClass( Person, Thing );
- *     Person.static.defaultEyeCount = 2;
- *     Person.prototype.walk = function () {};
- *
- *     function Jumper() {
- *         Jumper.super.apply( this, arguments );
- *     }
- *     OO.inheritClass( Jumper, Person );
- *     Jumper.prototype.jump = function () {};
- *
- *     Jumper.static.defaultEyeCount === 2;
- *     var x = new Jumper();
- *     x.jump();
- *     x.walk();
- *     x instanceof Thing && x instanceof Person && x instanceof Jumper;
- *
- * @param {Function} targetFn
- * @param {Function} originFn
- * @throws {Error} If target already inherits from origin
- */
-oo.inheritClass = function ( targetFn, originFn ) {
-       if ( targetFn.prototype instanceof originFn ) {
-               throw new Error( 'Target already inherits from origin' );
-       }
-
-       var targetConstructor = targetFn.prototype.constructor;
-
-       // Using ['super'] instead of .super because 'super' is not supported
-       // by IE 8 and below (bug 63303).
-       // Provide .parent as alias for code supporting older browsers which
-       // allows people to comply with their style guide.
-       targetFn['super'] = targetFn.parent = originFn;
-
-       targetFn.prototype = Object.create( originFn.prototype, {
-               // Restore constructor property of targetFn
-               constructor: {
-                       value: targetConstructor,
-                       enumerable: false,
-                       writable: true,
-                       configurable: true
-               }
-       } );
-
-       // Extend static properties - always initialize both sides
-       oo.initClass( originFn );
-       targetFn.static = Object.create( originFn.static );
-};
-
-/**
- * Utility to copy over *own* prototype properties of a mixin.
- * The 'constructor' (whether implicit or explicit) is not copied over.
- *
- * This does not create inheritance to the origin. If inheritance is needed
- * use oo.inheritClass instead.
- *
- * Beware: This can redefine a prototype property, call before setting your prototypes.
- * Beware: Don't call before oo.inheritClass.
- *
- *     function Foo() {}
- *     function Context() {}
- *
- *     // Avoid repeating this code
- *     function ContextLazyLoad() {}
- *     ContextLazyLoad.prototype.getContext = function () {
- *         if ( !this.context ) {
- *             this.context = new Context();
- *         }
- *         return this.context;
- *     };
- *
- *     function FooBar() {}
- *     OO.inheritClass( FooBar, Foo );
- *     OO.mixinClass( FooBar, ContextLazyLoad );
- *
- * @param {Function} targetFn
- * @param {Function} originFn
- */
-oo.mixinClass = function ( targetFn, originFn ) {
-       var key;
-
-       // Copy prototype properties
-       for ( key in originFn.prototype ) {
-               if ( key !== 'constructor' && hasOwn.call( originFn.prototype, key ) ) {
-                       targetFn.prototype[key] = originFn.prototype[key];
-               }
-       }
-
-       // Copy static properties - always initialize both sides
-       oo.initClass( targetFn );
-       if ( originFn.static ) {
-               for ( key in originFn.static ) {
-                       if ( hasOwn.call( originFn.static, key ) ) {
-                               targetFn.static[key] = originFn.static[key];
-                       }
-               }
-       } else {
-               oo.initClass( originFn );
-       }
-};
-
-/* Object Methods */
-
-/**
- * Create a new object that is an instance of the same
- * constructor as the input, inherits from the same object
- * and contains the same own properties.
- *
- * This makes a shallow non-recursive copy of own properties.
- * To create a recursive copy of plain objects, use #copy.
- *
- *     var foo = new Person( mom, dad );
- *     foo.setAge( 21 );
- *     var foo2 = OO.cloneObject( foo );
- *     foo.setAge( 22 );
- *
- *     // Then
- *     foo2 !== foo; // true
- *     foo2 instanceof Person; // true
- *     foo2.getAge(); // 21
- *     foo.getAge(); // 22
- *
- * @param {Object} origin
- * @return {Object} Clone of origin
- */
-oo.cloneObject = function ( origin ) {
-       var key, r;
-
-       r = Object.create( origin.constructor.prototype );
-
-       for ( key in origin ) {
-               if ( hasOwn.call( origin, key ) ) {
-                       r[key] = origin[key];
-               }
-       }
-
-       return r;
-};
-
-/**
- * Get an array of all property values in an object.
- *
- * @param {Object} Object to get values from
- * @return {Array} List of object values
- */
-oo.getObjectValues = function ( obj ) {
-       var key, values;
-
-       if ( obj !== Object( obj ) ) {
-               throw new TypeError( 'Called on non-object' );
-       }
-
-       values = [];
-       for ( key in obj ) {
-               if ( hasOwn.call( obj, key ) ) {
-                       values[values.length] = obj[key];
-               }
-       }
-
-       return values;
-};
-
-/**
- * Recursively compares properties between two objects.
- *
- * A false result may be caused by property inequality or by properties in one object missing from
- * the other. An asymmetrical test may also be performed, which checks only that properties in the
- * first object are present in the second object, but not the inverse.
- *
- * @param {Object} a First object to compare
- * @param {Object} b Second object to compare
- * @param {boolean} [asymmetrical] Whether to check only that b contains values from a
- * @return {boolean} If the objects contain the same values as each other
- */
-oo.compare = function ( a, b, asymmetrical ) {
-       var aValue, bValue, aType, bType, k;
-
-       if ( a === b ) {
-               return true;
-       }
-
-       for ( k in a ) {
-               if ( !hasOwn.call( a, k ) ) {
-                       // Support es3-shim: Without this filter, comparing [] to {} will be false in ES3
-                       // because the shimmed "forEach" is enumerable and shows up in Array but not Object.
-                       continue;
-               }
-
-               aValue = a[k];
-               bValue = b[k];
-               aType = typeof aValue;
-               bType = typeof bValue;
-               if ( aType !== bType ||
-                       ( ( aType === 'string' || aType === 'number' ) && aValue !== bValue ) ||
-                       ( aValue === Object( aValue ) && !oo.compare( aValue, bValue, asymmetrical ) ) ) {
-                       return false;
-               }
-       }
-       // If the check is not asymmetrical, recursing with the arguments swapped will verify our result
-       return asymmetrical ? true : oo.compare( b, a, true );
-};
-
-/**
- * Create a plain deep copy of any kind of object.
- *
- * Copies are deep, and will either be an object or an array depending on `source`.
- *
- * @param {Object} source Object to copy
- * @param {Function} [callback] Applied to leaf values before they added to the clone
- * @return {Object} Copy of source object
- */
-oo.copy = function ( source, callback ) {
-       var key, sourceValue, sourceType, destination;
-
-       if ( typeof source.clone === 'function' ) {
-               return source.clone();
-       }
-
-       destination = Array.isArray( source ) ? new Array( source.length ) : {};
-
-       for ( key in source ) {
-               sourceValue = source[key];
-               sourceType = typeof sourceValue;
-               if ( Array.isArray( sourceValue ) ) {
-                       // Array
-                       destination[key] = oo.copy( sourceValue, callback );
-               } else if ( sourceValue && typeof sourceValue.clone === 'function' ) {
-                       // Duck type object with custom clone method
-                       destination[key] = callback ?
-                               callback( sourceValue.clone() ) : sourceValue.clone();
-               } else if ( sourceValue && typeof sourceValue.cloneNode === 'function' ) {
-                       // DOM Node
-                       destination[key] = callback ?
-                               callback( sourceValue.cloneNode( true ) ) : sourceValue.cloneNode( true );
-               } else if ( oo.isPlainObject( sourceValue ) ) {
-                       // Plain objects
-                       destination[key] = oo.copy( sourceValue, callback );
-               } else {
-                       // Non-plain objects (incl. functions) and primitive values
-                       destination[key] = callback ? callback( sourceValue ) : sourceValue;
-               }
-       }
-
-       return destination;
-};
-
-/**
- * Generate a hash of an object based on its name and data.
- *
- * Performance optimization: <http://jsperf.com/ve-gethash-201208#/toJson_fnReplacerIfAoForElse>
- *
- * To avoid two objects with the same values generating different hashes, we utilize the replacer
- * argument of JSON.stringify and sort the object by key as it's being serialized. This may or may
- * not be the fastest way to do this; we should investigate this further.
- *
- * Objects and arrays are hashed recursively. When hashing an object that has a .getHash()
- * function, we call that function and use its return value rather than hashing the object
- * ourselves. This allows classes to define custom hashing.
- *
- * @param {Object} val Object to generate hash for
- * @return {string} Hash of object
- */
-oo.getHash = function ( val ) {
-       return JSON.stringify( val, oo.getHash.keySortReplacer );
-};
-
-/**
- * Helper function for OO.getHash which sorts objects by key.
- *
- * This is a callback passed into JSON.stringify.
- *
- * @method getHash_keySortReplacer
- * @param {string} key Property name of value being replaced
- * @param {Mixed} val Property value to replace
- * @return {Mixed} Replacement value
- */
-oo.getHash.keySortReplacer = function ( key, val ) {
-       var normalized, keys, i, len;
-       if ( val && typeof val.getHashObject === 'function' ) {
-               // This object has its own custom hash function, use it
-               val = val.getHashObject();
-       }
-       if ( !Array.isArray( val ) && Object( val ) === val ) {
-               // Only normalize objects when the key-order is ambiguous
-               // (e.g. any object not an array).
-               normalized = {};
-               keys = Object.keys( val ).sort();
-               i = 0;
-               len = keys.length;
-               for ( ; i < len; i += 1 ) {
-                       normalized[keys[i]] = val[keys[i]];
-               }
-               return normalized;
-
-       // Primitive values and arrays get stable hashes
-       // by default. Lets those be stringified as-is.
-       } else {
-               return val;
-       }
-};
-
-/**
- * Compute the union (duplicate-free merge) of a set of arrays.
- *
- * Arrays values must be convertable to object keys (strings).
- *
- * By building an object (with the values for keys) in parallel with
- * the array, a new item's existence in the union can be computed faster.
- *
- * @param {Array...} arrays Arrays to union
- * @return {Array} Union of the arrays
- */
-oo.simpleArrayUnion = function () {
-       var i, ilen, arr, j, jlen,
-               obj = {},
-               result = [];
-
-       for ( i = 0, ilen = arguments.length; i < ilen; i++ ) {
-               arr = arguments[i];
-               for ( j = 0, jlen = arr.length; j < jlen; j++ ) {
-                       if ( !obj[ arr[j] ] ) {
-                               obj[ arr[j] ] = true;
-                               result.push( arr[j] );
-                       }
-               }
-       }
-
-       return result;
-};
-
-/**
- * Combine arrays (intersection or difference).
- *
- * An intersection checks the item exists in 'b' while difference checks it doesn't.
- *
- * Arrays values must be convertable to object keys (strings).
- *
- * By building an object (with the values for keys) of 'b' we can
- * compute the result faster.
- *
- * @private
- * @param {Array} a First array
- * @param {Array} b Second array
- * @param {boolean} includeB Whether to items in 'b'
- * @return {Array} Combination (intersection or difference) of arrays
- */
-function simpleArrayCombine( a, b, includeB ) {
-       var i, ilen, isInB,
-               bObj = {},
-               result = [];
-
-       for ( i = 0, ilen = b.length; i < ilen; i++ ) {
-               bObj[ b[i] ] = true;
-       }
-
-       for ( i = 0, ilen = a.length; i < ilen; i++ ) {
-               isInB = !!bObj[ a[i] ];
-               if ( isInB === includeB ) {
-                       result.push( a[i] );
-               }
-       }
-
-       return result;
-}
-
-/**
- * Compute the intersection of two arrays (items in both arrays).
- *
- * Arrays values must be convertable to object keys (strings).
- *
- * @param {Array} a First array
- * @param {Array} b Second array
- * @return {Array} Intersection of arrays
- */
-oo.simpleArrayIntersection = function ( a, b ) {
-       return simpleArrayCombine( a, b, true );
-};
-
-/**
- * Compute the difference of two arrays (items in 'a' but not 'b').
- *
- * Arrays values must be convertable to object keys (strings).
- *
- * @param {Array} a First array
- * @param {Array} b Second array
- * @return {Array} Intersection of arrays
- */
-oo.simpleArrayDifference = function ( a, b ) {
-       return simpleArrayCombine( a, b, false );
-};
-/*global hasOwn, toString */
-
-/**
- * Assert whether a value is a plain object or not.
- *
- * @param {Mixed} obj
- * @return {boolean}
- */
-oo.isPlainObject = function ( obj ) {
-       /*jshint eqnull:true, eqeqeq:false */
-
-       // Any object or value whose internal [[Class]] property is not "[object Object]"
-       // Support IE8: Explicitly filter out DOM nodes
-       // Support IE8: Explicitly filter out Window object (needs loose comparison)
-       if ( !obj || toString.call( obj ) !== '[object Object]' || obj.nodeType || ( obj != null && obj == obj.window ) ) {
-               return false;
-       }
-
-       // The try/catch suppresses exceptions thrown when attempting to access
-       // the "constructor" property of certain host objects suich as window.location
-       // in Firefox < 20 (https://bugzilla.mozilla.org/814622)
-       try {
-               if ( obj.constructor &&
-                               !hasOwn.call( obj.constructor.prototype, 'isPrototypeOf' ) ) {
-                       return false;
-               }
-       } catch ( e ) {
-               return false;
-       }
-
-       return true;
-};
-/**
- * @class OO.EventEmitter
- *
- * @constructor
- */
-oo.EventEmitter = function OoEventEmitter() {
-       // Properties
-
-       /**
-        * Storage of bound event handlers by event name.
-        *
-        * @property
-        */
-       this.bindings = {};
-};
-
-/* Methods */
-
-/**
- * Add a listener to events of a specific event.
- *
- * If the callback/context are already bound to the event, they will not be bound again.
- *
- * @param {string} event Type of event to listen to
- * @param {Function} callback Function to call when event occurs
- * @param {Array} [args] Arguments to pass to listener, will be prepended to emitted arguments
- * @param {Object} [context=null] Object to use as context for callback function or call method on
- * @throws {Error} Listener argument is not a function or method name
- * @chainable
- */
-oo.EventEmitter.prototype.on = function ( event, callback, args, context ) {
-       var i, bindings, binding;
-
-       // Validate callback
-       if ( typeof callback !== 'function' ) {
-               throw new Error( 'Invalid callback. Function or method name expected.' );
-       }
-       // Fallback to null context
-       if ( arguments.length < 4 ) {
-               context = null;
-       }
-       if ( this.bindings.hasOwnProperty( event ) ) {
-               // Check for duplicate callback and context for this event
-               bindings = this.bindings[event];
-               i = bindings.length;
-               while ( i-- ) {
-                       binding = bindings[i];
-                       if ( bindings.callback === callback && bindings.context === context ) {
-                               return this;
-                       }
-               }
-       } else {
-               // Auto-initialize bindings list
-               bindings = this.bindings[event] = [];
-       }
-       // Add binding
-       bindings.push( {
-               callback: callback,
-               args: args,
-               context: context
-       } );
-       return this;
-};
-
-/**
- * Adds a one-time listener to a specific event.
- *
- * @param {string} event Type of event to listen to
- * @param {Function} listener Listener to call when event occurs
- * @chainable
- */
-oo.EventEmitter.prototype.once = function ( event, listener ) {
-       var eventEmitter = this,
-               listenerWrapper = function () {
-                       eventEmitter.off( event, listenerWrapper );
-                       listener.apply( eventEmitter, Array.prototype.slice.call( arguments, 0 ) );
-               };
-       return this.on( event, listenerWrapper );
-};
-
-/**
- * Remove a specific listener from a specific event.
- *
- * @param {string} event Type of event to remove listener from
- * @param {Function} [callback] Listener to remove, omit to remove all
- * @param {Object} [context=null] Object used context for callback function or method
- * @chainable
- * @throws {Error} Listener argument is not a function
- */
-oo.EventEmitter.prototype.off = function ( event, callback, context ) {
-       var i, bindings;
-
-       if ( arguments.length === 1 ) {
-               // Remove all bindings for event
-               if ( event in this.bindings ) {
-                       delete this.bindings[event];
-               }
-       } else {
-               if ( typeof callback !== 'function' ) {
-                       throw new Error( 'Invalid callback. Function expected.' );
-               }
-               if ( !( event in this.bindings ) || !this.bindings[event].length ) {
-                       // No matching bindings
-                       return this;
-               }
-               // Fallback to null context
-               if ( arguments.length < 3 ) {
-                       context = null;
-               }
-               // Remove matching handlers
-               bindings = this.bindings[event];
-               i = bindings.length;
-               while ( i-- ) {
-                       if ( bindings[i].callback === callback && bindings[i].context === context ) {
-                               bindings.splice( i, 1 );
-                       }
-               }
-               // Cleanup if now empty
-               if ( bindings.length === 0 ) {
-                       delete this.bindings[event];
-               }
-       }
-       return this;
-};
-
-/**
- * Emit an event.
- *
- * TODO: Should this be chainable? What is the usefulness of the boolean
- * return value here?
- *
- * @param {string} event Type of event
- * @param {Mixed} args First in a list of variadic arguments passed to event handler (optional)
- * @return {boolean} If event was handled by at least one listener
- */
-oo.EventEmitter.prototype.emit = function ( event ) {
-       var i, len, binding, bindings, args;
-
-       if ( event in this.bindings ) {
-               // Slicing ensures that we don't get tripped up by event handlers that add/remove bindings
-               bindings = this.bindings[event].slice();
-               args = Array.prototype.slice.call( arguments, 1 );
-               for ( i = 0, len = bindings.length; i < len; i++ ) {
-                       binding = bindings[i];
-                       binding.callback.apply(
-                               binding.context,
-                               binding.args ? binding.args.concat( args ) : args
-                       );
-               }
-               return true;
-       }
-       return false;
-};
-
-/**
- * Connect event handlers to an object.
- *
- * @param {Object} context Object to call methods on when events occur
- * @param {Object.<string,string>|Object.<string,Function>|Object.<string,Array>} methods List of
- *  event bindings keyed by event name containing either method names, functions or arrays containing
- *  method name or function followed by a list of arguments to be passed to callback before emitted
- *  arguments
- * @chainable
- */
-oo.EventEmitter.prototype.connect = function ( context, methods ) {
-       var method, callback, args, event;
-
-       for ( event in methods ) {
-               method = methods[event];
-               // Allow providing additional args
-               if ( Array.isArray( method ) ) {
-                       args = method.slice( 1 );
-                       method = method[0];
-               } else {
-                       args = [];
-               }
-               // Allow callback to be a method name
-               if ( typeof method === 'string' ) {
-                       // Validate method
-                       if ( !context[method] || typeof context[method] !== 'function' ) {
-                               throw new Error( 'Method not found: ' + method );
-                       }
-                       // Resolve to function
-                       callback = context[method];
-               } else {
-                       callback = method;
-               }
-               // Add binding
-               this.on.apply( this, [ event, callback, args, context ] );
-       }
-       return this;
-};
-
-/**
- * Disconnect event handlers from an object.
- *
- * @param {Object} context Object to disconnect methods from
- * @param {Object.<string,string>|Object.<string,Function>|Object.<string,Array>} [methods] List of
- * event bindings keyed by event name containing either method names or functions
- * @chainable
- */
-oo.EventEmitter.prototype.disconnect = function ( context, methods ) {
-       var i, method, callback, event, bindings;
-
-       if ( methods ) {
-               // Remove specific connections to the context
-               for ( event in methods ) {
-                       method = methods[event];
-                       if ( typeof method === 'string' ) {
-                               // Validate method
-                               if ( !context[method] || typeof context[method] !== 'function' ) {
-                                       throw new Error( 'Method not found: ' + method );
-                               }
-                               // Resolve to function
-                               callback = context[method];
-                       } else {
-                               callback = method;
-                       }
-                       this.off( event, callback, context );
-               }
-       } else {
-               // Remove all connections to the context
-               for ( event in this.bindings ) {
-                       bindings = this.bindings[event];
-                       i = bindings.length;
-                       while ( i-- ) {
-                               if ( bindings[i].context === context ) {
-                                       this.off( event, bindings[i].callback, context );
-                               }
-                       }
-               }
-       }
-
-       return this;
-};
-/**
- * @class OO.Registry
- * @mixins OO.EventEmitter
- *
- * @constructor
- */
-oo.Registry = function OoRegistry() {
-       // Mixin constructors
-       oo.EventEmitter.call( this );
-
-       // Properties
-       this.registry = {};
-};
-
-/* Inheritance */
-
-oo.mixinClass( oo.Registry, oo.EventEmitter );
-
-/* Events */
-
-/**
- * @event register
- * @param {string} name
- * @param {Mixed} data
- */
-
-/* Methods */
-
-/**
- * Associate one or more symbolic names with some data.
- *
- * Only the base name will be registered, overriding any existing entry with the same base name.
- *
- * @param {string|string[]} name Symbolic name or list of symbolic names
- * @param {Mixed} data Data to associate with symbolic name
- * @fires register
- * @throws {Error} Name argument must be a string or array
- */
-oo.Registry.prototype.register = function ( name, data ) {
-       var i, len;
-       if ( typeof name === 'string' ) {
-               this.registry[name] = data;
-               this.emit( 'register', name, data );
-       } else if ( Array.isArray( name ) ) {
-               for ( i = 0, len = name.length; i < len; i++ ) {
-                       this.register( name[i], data );
-               }
-       } else {
-               throw new Error( 'Name must be a string or array, cannot be a ' + typeof name );
-       }
-};
-
-/**
- * Get data for a given symbolic name.
- *
- * Lookups are done using the base name.
- *
- * @param {string} name Symbolic name
- * @return {Mixed|undefined} Data associated with symbolic name
- */
-oo.Registry.prototype.lookup = function ( name ) {
-       return this.registry[name];
-};
-/**
- * @class OO.Factory
- * @extends OO.Registry
- *
- * @constructor
- */
-oo.Factory = function OoFactory() {
-       oo.Factory.parent.call( this );
-
-       // Properties
-       this.entries = [];
-};
-
-/* Inheritance */
-
-oo.inheritClass( oo.Factory, oo.Registry );
-
-/* Methods */
-
-/**
- * Register a constructor with the factory.
- *
- * Classes must have a static `name` property to be registered.
- *
- *     function MyClass() {};
- *     OO.initClass( MyClass );
- *     // Adds a static property to the class defining a symbolic name
- *     MyClass.static.name = 'mine';
- *     // Registers class with factory, available via symbolic name 'mine'
- *     factory.register( MyClass );
- *
- * @param {Function} constructor Constructor to use when creating object
- * @throws {Error} Name must be a string and must not be empty
- * @throws {Error} Constructor must be a function
- */
-oo.Factory.prototype.register = function ( constructor ) {
-       var name;
-
-       if ( typeof constructor !== 'function' ) {
-               throw new Error( 'constructor must be a function, cannot be a ' + typeof constructor );
-       }
-       name = constructor.static && constructor.static.name;
-       if ( typeof name !== 'string' || name === '' ) {
-               throw new Error( 'Name must be a string and must not be empty' );
-       }
-       this.entries.push( name );
-
-       oo.Factory.parent.prototype.register.call( this, name, constructor );
-};
-
-/**
- * Create an object based on a name.
- *
- * Name is used to look up the constructor to use, while all additional arguments are passed to the
- * constructor directly, so leaving one out will pass an undefined to the constructor.
- *
- * @param {string} name Object name
- * @param {Mixed...} [args] Arguments to pass to the constructor
- * @return {Object} The new object
- * @throws {Error} Unknown object name
- */
-oo.Factory.prototype.create = function ( name ) {
-       var args, obj, constructor;
-
-       if ( !this.registry.hasOwnProperty( name ) ) {
-               throw new Error( 'No class registered by that name: ' + name );
-       }
-       constructor = this.registry[name];
-
-       // Convert arguments to array and shift the first argument (name) off
-       args = Array.prototype.slice.call( arguments, 1 );
-
-       // We can't use the "new" operator with .apply directly because apply needs a
-       // context. So instead just do what "new" does: create an object that inherits from
-       // the constructor's prototype (which also makes it an "instanceof" the constructor),
-       // then invoke the constructor with the object as context, and return it (ignoring
-       // the constructor's return value).
-       obj = Object.create( constructor.prototype );
-       constructor.apply( obj, args );
-       return obj;
-};
-/*jshint node:true */
-if ( typeof module !== 'undefined' && module.exports ) {
-       module.exports = oo;
-} else {
-       global.OO = oo;
-}
-}( this ) );
diff --git a/resources/src/jquery.ui-themes/vector/images/close.png b/resources/src/jquery.ui-themes/vector/images/close.png
deleted file mode 100644 (file)
index ef0dd9e..0000000
Binary files a/resources/src/jquery.ui-themes/vector/images/close.png and /dev/null differ
diff --git a/resources/src/jquery.ui-themes/vector/images/titlebar-fade.png b/resources/src/jquery.ui-themes/vector/images/titlebar-fade.png
deleted file mode 100644 (file)
index 12a80c8..0000000
Binary files a/resources/src/jquery.ui-themes/vector/images/titlebar-fade.png and /dev/null differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-anim_basic_16x16.gif b/resources/src/jquery.ui-themes/vector/images/ui-anim_basic_16x16.gif
deleted file mode 100644 (file)
index 085ccae..0000000
Binary files a/resources/src/jquery.ui-themes/vector/images/ui-anim_basic_16x16.gif and /dev/null differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png b/resources/src/jquery.ui-themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png
deleted file mode 100644 (file)
index 09de537..0000000
Binary files a/resources/src/jquery.ui-themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png and /dev/null differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-bg_flat_70_000000_40x100.png b/resources/src/jquery.ui-themes/vector/images/ui-bg_flat_70_000000_40x100.png
deleted file mode 100644 (file)
index c06dd56..0000000
Binary files a/resources/src/jquery.ui-themes/vector/images/ui-bg_flat_70_000000_40x100.png and /dev/null differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png b/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png
deleted file mode 100644 (file)
index 5308b46..0000000
Binary files a/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png and /dev/null differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png b/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png
deleted file mode 100644 (file)
index 0c8997f..0000000
Binary files a/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png and /dev/null differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png b/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png
deleted file mode 100644 (file)
index 3149255..0000000
Binary files a/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png and /dev/null differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png b/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png
deleted file mode 100644 (file)
index 09b2376..0000000
Binary files a/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png and /dev/null differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png b/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png
deleted file mode 100644 (file)
index 66627c1..0000000
Binary files a/resources/src/jquery.ui-themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png and /dev/null differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png b/resources/src/jquery.ui-themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png
deleted file mode 100644 (file)
index ccb6dc0..0000000
Binary files a/resources/src/jquery.ui-themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png and /dev/null differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-icons_2694e8_256x240.png b/resources/src/jquery.ui-themes/vector/images/ui-icons_2694e8_256x240.png
deleted file mode 100644 (file)
index 998ac3b..0000000
Binary files a/resources/src/jquery.ui-themes/vector/images/ui-icons_2694e8_256x240.png and /dev/null differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-icons_2e83ff_256x240.png b/resources/src/jquery.ui-themes/vector/images/ui-icons_2e83ff_256x240.png
deleted file mode 100644 (file)
index 34e38d1..0000000
Binary files a/resources/src/jquery.ui-themes/vector/images/ui-icons_2e83ff_256x240.png and /dev/null differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-icons_3d80b3_256x240.png b/resources/src/jquery.ui-themes/vector/images/ui-icons_3d80b3_256x240.png
deleted file mode 100644 (file)
index ec129a8..0000000
Binary files a/resources/src/jquery.ui-themes/vector/images/ui-icons_3d80b3_256x240.png and /dev/null differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-icons_666666_256x240.png b/resources/src/jquery.ui-themes/vector/images/ui-icons_666666_256x240.png
deleted file mode 100644 (file)
index a32c57d..0000000
Binary files a/resources/src/jquery.ui-themes/vector/images/ui-icons_666666_256x240.png and /dev/null differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-icons_72a7cf_256x240.png b/resources/src/jquery.ui-themes/vector/images/ui-icons_72a7cf_256x240.png
deleted file mode 100644 (file)
index 88fad1a..0000000
Binary files a/resources/src/jquery.ui-themes/vector/images/ui-icons_72a7cf_256x240.png and /dev/null differ
diff --git a/resources/src/jquery.ui-themes/vector/images/ui-icons_ffffff_256x240.png b/resources/src/jquery.ui-themes/vector/images/ui-icons_ffffff_256x240.png
deleted file mode 100644 (file)
index 29ba7d2..0000000
Binary files a/resources/src/jquery.ui-themes/vector/images/ui-icons_ffffff_256x240.png and /dev/null differ
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.accordion.css b/resources/src/jquery.ui-themes/vector/jquery.ui.accordion.css
deleted file mode 100644 (file)
index 8d8a1a6..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Accordion
-----------------------------------*/
-.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
-.ui-accordion .ui-accordion-li-fix { display: inline; }
-.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
-.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
-/* IE7-/Win - Fix extra vertical space in lists */
-.ui-accordion a { zoom: 1; }
-.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
-.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
-.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
-.ui-accordion .ui-accordion-content-active { display: block; }
\ No newline at end of file
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.autocomplete.css b/resources/src/jquery.ui-themes/vector/jquery.ui.autocomplete.css
deleted file mode 100644 (file)
index da6de45..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Autocomplete
-----------------------------------*/
-.ui-autocomplete { position: absolute; cursor: default; }
-.ui-autocomplete-loading { /* @embed */ background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
-
-/* workarounds */
-* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
-
-/* Menu
-----------------------------------*/
-.ui-menu {
-       list-style:none;
-       padding: 2px;
-       margin: 0;
-       display:block;
-       float: left;
-}
-.ui-menu .ui-menu {
-       margin-top: -3px;
-}
-.ui-menu .ui-menu-item {
-       margin:0;
-       padding: 0;
-       zoom: 1;
-       float: left;
-       clear: left;
-       width: 100%;
-}
-.ui-menu .ui-menu-item a {
-       text-decoration:none;
-       display:block;
-       padding:.2em .4em;
-       line-height:1.5;
-       zoom:1;
-}
-.ui-menu .ui-menu-item a.ui-state-hover,
-.ui-menu .ui-menu-item a.ui-state-active {
-       font-weight: normal;
-       margin: -1px;
-}
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.button.css b/resources/src/jquery.ui-themes/vector/jquery.ui.button.css
deleted file mode 100644 (file)
index 8c2286d..0000000
+++ /dev/null
@@ -1,347 +0,0 @@
-/* Button
-----------------------------------*/
-
-.ui-button {
-       display: inline-block;
-       position: relative;
-       padding: 0;
-       margin-right: .1em;
-       text-decoration: none !important;
-       cursor: pointer;
-       text-align: center;
-       zoom: 1;
-       overflow: visible; /* the overflow property removes extra width in IE */
-}
-
-/*button text element */
-.ui-button .ui-button-text {
-       display: block;
-       line-height: 1.4;
-       text-shadow: 0 1px 1px #fff;
-}
-.ui-button-text-only .ui-button-text {
-       padding: 0.3em 1em 0.25em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
-       padding: 0.3em;
-       text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
-       padding: 0.3em 1em 0.25em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
-       padding: 0.3em 2.1em 0.25em 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: 0.3em 1em;
-}
-
-/*button icon element(s) */
-.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-text-icon .ui-icon,
-.ui-button-icons-only .ui-icon {
-       position: absolute;
-       top: 50%;
-       margin-top: -9px;
-}
-.ui-button-icon-only .ui-icon {
-       left: 50%;
-       margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.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: 0.5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icon .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
-       right: 0.5em;
-}
-
-/*button sets*/
-.ui-buttonset {
-       margin-right: 7px;
-}
-.ui-buttonset .ui-button {
-       margin-left: 0;
-       margin-right: -.4em;
-}
-
-/* workarounds */
-button.ui-button::-moz-focus-inner {
-       border: 0;
-       padding: 0; /* reset extra padding in Firefox */
-}
-/* Disables the annoying dashed border Firefox puts on active buttons */
-body button.ui-button::-moz-focus-inner {
-       border: 0;
-}
-/* Give large buttons some extra padding */
-body .ui-button-large {
-       padding: 5px;
-}
-/* Use white icons for colored buttons */
-.ui-button-green .ui-icon,
-.ui-button-blue .ui-icon,
-.ui-button-red .ui-icon,
-.ui-button-orange .ui-icon {
-       /* @embed */
-       background-image: url(images/ui-icons_ffffff_256x240.png) !important;
-}
-
-/* Corner radius */
-/* This is normally handled in jquery.ui.theme.css, but in our case, the corner
-   styling of our buttons doesn't match our default widget corner styling */
-.ui-button.ui-corner-all,
-.ui-button.ui-corner-top,
-.ui-button.ui-corner-left,
-.ui-button.ui-corner-tl {
-       border-top-left-radius: 4px;
-}
-.ui-button.ui-corner-all,
-.ui-button.ui-corner-top,
-
-.ui-button.ui-corner-right,
-.ui-button.ui-corner-tr {
-       border-top-right-radius: 4px;
-}
-.ui-button.ui-corner-all,
-.ui-button.ui-corner-bottom,
-.ui-button.ui-corner-left,
-.ui-button.ui-corner-bl {
-       border-bottom-left-radius: 4px;
-}
-.ui-button.ui-corner-all,
-.ui-button.ui-corner-bottom,
-.ui-button.ui-corner-right,
-.ui-button.ui-corner-br {
-       border-bottom-right-radius: 4px;
-}
-
-body .ui-button {
-       color: #2779aa;
-       margin: 0.5em 0 0.5em 0.4em;
-       border: 1px solid #aaa !important;
-       background: #f0f0f0 !important;
-       background: -moz-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #fff 0%, #ddd 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#dddddd', GradientType=0); /* IE6-8 */
-       cursor: pointer;
-       font-size: 1em;
-       line-height: 1.4em;
-       width: auto;
-       overflow: visible;
-       box-shadow: 0 1px 3px rgba(0,0,0,.2);
-}
-
-body .ui-button-icon-only {
-       width: 2.2em;
-}
-
-body .ui-button-icons-only {
-       width: 3.4em;
-}
-
-body .ui-button:hover {
-       color: #2779aa;
-       border-color: #bbb !important;
-       background: #fff !important;
-       background: -moz-linear-gradient(top, #fff 0%, #eee 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #fff 0%, #eee 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #fff 0%, #eee 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #fff 0%, #eee 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #fff 0%, #eee 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0); /* IE6-8 */
-       box-shadow: 0 1px 3px rgba(0,0,0,.1);
-}
-body .ui-button:active,
-body .ui-button:focus {
-       border-color: #8ad !important;
-       box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
-}
-body .ui-button:active {
-       background: #e0e0e0 !important;
-       background: -moz-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #f0f0f0 0%, #d0d0d0 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f0f0f0', endColorstr='#d0d0d0', GradientType=0); /* IE6-8 */
-}
-
-/* Green buttons */
-body .ui-button-green,
-body .ui-button-green .ui-button-text {
-       color: white;
-       text-shadow: 0 -1px 1px #072;
-}
-body .ui-button.ui-button-green {
-       border-color: #294 !important;
-       background: #295 !important;
-       background: -moz-linear-gradient(top, #3c8 0%, #295 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #3c8 0%, #295 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #3c8 0%, #295 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #3c8 0%, #295 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #3c8 0%, #295 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33cc88', endColorstr='#229955', GradientType=0); /* IE6-8 */
-       box-shadow: 0 1px 3px rgba(0,0,0,.3);
-}
-body .ui-button.ui-button-green:hover {
-       background: #33a055 !important;
-       background: -moz-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #44d388 0%, #33a055 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#44d388', endColorstr='#33a055', GradientType=0); /* IE6-8 */
-       box-shadow: 0 1px 3px rgba(0,0,0,.25);
-}
-body .ui-button.ui-button-green:active,
-body .ui-button.ui-button-green:focus {
-       border-color: #172 !important;
-       box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
-}
-body .ui-button.ui-button-green:active {
-       background: #338855 !important;
-       background: -moz-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #30c080 0%, #338855 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#30c080', endColorstr='#338855', GradientType=0); /* IE6-8 */
-}
-
-/* Blue buttons */
-body .ui-button-blue,
-body .ui-button-blue .ui-button-text {
-       color: white;
-       text-shadow: 0 -1px 1px #037;
-}
-body .ui-button.ui-button-blue {
-       border-color: #468 !important;
-       background: #36b !important;
-       background: -moz-linear-gradient(top, #48e 0%, #36b 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #48e 0%, #36b 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #48e 0%, #36b 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #48e 0%, #36b 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #48e 0%, #36b 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4488ee', endColorstr='#3366bb', GradientType=0); /* IE6-8 */
-       box-shadow: 0 1px 3px rgba(0,0,0,.35);
-}
-body .ui-button.ui-button-blue:hover {
-       background: #36c !important;
-       background: -moz-linear-gradient(top, #59e 0%, #36c 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #59e 0%, #36c 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #59e 0%, #36c 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #59e 0%, #36c 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #59e 0%, #36c 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5599ee', endColorstr='#3366cc', GradientType=0); /* IE6-8 */
-}
-body .ui-button.ui-button-blue:active,
-body .ui-button.ui-button-blue:focus {
-       border-color: #357 !important;
-       box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
-}
-body .ui-button.ui-button-blue:active {
-       background: #3060a0 !important;
-       background: -moz-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #4080e0 0%, #3060a0 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4080e0', endColorstr='#3060a0', GradientType=0); /* IE6-8 */
-}
-
-/* Red buttons */
-body .ui-button-red,
-body .ui-button-red .ui-button-text {
-       color: white;
-       text-shadow: 0 -1px 1px #700;
-}
-body .ui-button.ui-button-red {
-       border-color: #944 !important;
-       background: #a22 !important;
-       background: -moz-linear-gradient(top, #d44 0%, #a22 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #d44 0%, #a22 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #d44 0%, #a22 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #d44 0%, #a22 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #d44 0%, #a22 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dd4444', endColorstr='#aa2222', GradientType=0); /* IE6-8 */
-       box-shadow: 0 1px 3px rgba(0,0,0,.35);
-}
-body .ui-button.ui-button-red:hover {
-       border-color: #a44 !important;
-       background: #b03333 !important;
-       background: -moz-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #ee4646 0%, #b03333 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee4646', endColorstr='#b03333', GradientType=0); /* IE6-8 */
-       box-shadow: 0 1px 3px rgba(0,0,0,.3);
-}
-body .ui-button.ui-button-red:active,
-body .ui-button.ui-button-red:focus {
-       border-color: #747 !important;
-       box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
-}
-body .ui-button.ui-button-red:active {
-       background: #952020 !important;
-       background: -moz-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #d04545 0%, #952020 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#d04545', endColorstr='#952020', GradientType=0); /* IE6-8 */
-}
-
-/* Disabled buttons */
-body .ui-button-green.disabled,
-body .ui-button-green.disabled:hover,
-body .ui-button-green.disabled:active,
-body .ui-button-green.disabled:focus,
-body .ui-button-blue.disabled,
-body .ui-button-blue.disabled:hover,
-body .ui-button-blue.disabled:active,
-body .ui-button-blue.disabled:focus,
-body .ui-button-red.disabled,
-body .ui-button-red.disabled:hover,
-body .ui-button-red.disabled:active,
-body .ui-button-red.disabled:focus,
-body .ui-button.disabled,
-body .ui-button.disabled:hover {
-       color: #aaa;
-       border-color: #ccc !important;
-       background: #eee !important;
-       background: -moz-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* FF3.6+ */
-       background: -webkit-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* Chrome10+, Safari5.1+ */
-       background: -o-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* Opera 11.10+ */
-       background: -ms-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* IE10+ */
-       background: linear-gradient(to bottom, #f6f6f6 0%, #eee 90%) !important;
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f6f6', endColorstr='#eeeeee', GradientType=0); /* IE6-8 */
-       box-shadow: 0 1px 3px rgba(0,0,0,0);
-}
-body .ui-button-green.disabled .ui-button-text,
-body .ui-button-blue.disabled .ui-button-text,
-body .ui-button-red.disabled .ui-button-text {
-       color: #aaa;
-       text-shadow: 0 1px 1px #fff;
-}
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.core.css b/resources/src/jquery.ui-themes/vector/jquery.ui.core.css
deleted file mode 100644 (file)
index 1931aad..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-* jQuery UI CSS Framework
-* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
-* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
-*/
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden { display: none; }
-.ui-helper-hidden-accessible { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 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-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled { cursor: default !important; }
-
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.datepicker.css b/resources/src/jquery.ui-themes/vector/jquery.ui.datepicker.css
deleted file mode 100644 (file)
index 871bf69..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Datepicker
-----------------------------------*/
-.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; }
-.ui-datepicker .ui-datepicker-prev { left:2px; }
-.ui-datepicker .ui-datepicker-next { right:2px; }
-.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
-.ui-datepicker .ui-datepicker-next-hover { right:1px; }
-.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
-.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
-.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; padding:1px 0; }
-.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
-.ui-datepicker select.ui-datepicker-month, 
-.ui-datepicker select.ui-datepicker-year { width: 49%;}
-.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
-.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
-.ui-datepicker td { border: 0; padding: 1px; }
-.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
-.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .2em 0 0 0; padding: 0 .2em; border-top: 1px solid #DDDDDD; border-left: 0; border-right: 0; border-bottom: 0; }
-.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
-.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
-
-/* with multiple calendars */
-.ui-datepicker.ui-datepicker-multi { width:auto; }
-.ui-datepicker-multi .ui-datepicker-group { float:left; }
-.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
-.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
-.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
-.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
-.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
-.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
-.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
-.ui-datepicker-row-break { clear:both; width:100%; }
-
-/* RTL support */
-/* @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; }
-
-/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
-.ui-datepicker-cover {
-    display: none; /*sorry for IE5*/
-    display/**/: block; /*sorry for IE5*/
-    position: absolute; /*must have*/
-    z-index: -1; /*must have*/
-    filter: mask(); /*must have*/
-    top: -4px; /*must have*/
-    left: -4px; /*must have*/
-    width: 200px; /*must have*/
-    height: 200px; /*must have*/
-}
\ No newline at end of file
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.dialog.css b/resources/src/jquery.ui-themes/vector/jquery.ui.dialog.css
deleted file mode 100644 (file)
index cd85f14..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Dialog
-----------------------------------*/
-.ui-dialog { position: absolute; padding: 0; width: 300px; }
-.ui-dialog .ui-dialog-titlebar { padding: .75em; position: relative;  }
-.ui-dialog .ui-dialog-title { float: left; margin: 0; } 
-.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .75em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
-.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
-.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
-.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
-.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
-.ui-dialog .ui-dialog-buttonpane .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 */
-body .ui-dialog .ui-dialog-titlebar-close:hover {
-       text-decoration: none;
-}
-body .ui-dialog .ui-dialog-content .status-invalid input {
-       border: 2px solid red;
-       padding: 2px 1px;
-}
-body .ui-dialog .ui-dialog-titlebar {
-       padding: 0.9em 1.4em 0.6em !important;
-}
-body .ui-dialog .ui-widget-header {
-       /* @embed */
-       background: #f0f0f0 url(images/titlebar-fade.png) repeat-x scroll 50% 100% !important;
-}
-/* FIXME: Should just update the icon sprite if we're keeping this X */
-body .ui-dialog .ui-icon-closethick {
-       /* @embed */
-       background: url(images/close.png) no-repeat 50% 50% !important;
-}
-body .ui-dialog .ui-dialog-buttonpane {
-       margin-top: 0 !important;
-       padding:0.3em 1.4em 0.5em 1.4em !important;
-}
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.progressbar.css b/resources/src/jquery.ui-themes/vector/jquery.ui.progressbar.css
deleted file mode 100644 (file)
index bc0939e..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Progressbar
-----------------------------------*/
-.ui-progressbar { height:2em; text-align: left; }
-.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
\ No newline at end of file
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.resizable.css b/resources/src/jquery.ui-themes/vector/jquery.ui.resizable.css
deleted file mode 100644 (file)
index f1bd7c5..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Resizable
-----------------------------------*/
-.ui-resizable { position: relative;}
-.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
-.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
-.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
-.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
-/* @noflip */
-.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
-/* @noflip */
-.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
-/* @noflip */
-.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
-/* @noflip */
-.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
-/* @noflip */
-.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
-/* @noflip */
-.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
\ No newline at end of file
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.selectable.css b/resources/src/jquery.ui-themes/vector/jquery.ui.selectable.css
deleted file mode 100644 (file)
index c5d46ce..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Selectable
-----------------------------------*/
-.ui-selectable-helper { border:1px dotted black }
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.slider.css b/resources/src/jquery.ui-themes/vector/jquery.ui.slider.css
deleted file mode 100644 (file)
index 07c6f4e..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Slider
-----------------------------------*/
-.ui-slider { position: relative; text-align: left; }
-.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
-.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
-
-.ui-slider-horizontal { height: .8em; }
-.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
-.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
-.ui-slider-horizontal .ui-slider-range-min { left: 0; }
-.ui-slider-horizontal .ui-slider-range-max { right: 0; }
-
-.ui-slider-vertical { width: .8em; height: 100px; }
-.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
-.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
-.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
-.ui-slider-vertical .ui-slider-range-max { top: 0; }
\ No newline at end of file
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.tabs.css b/resources/src/jquery.ui-themes/vector/jquery.ui.tabs.css
deleted file mode 100644 (file)
index 99e16db..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Tabs
-----------------------------------*/
-.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
-.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
-.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
-.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
-.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
-.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
-.ui-tabs .ui-tabs-hide { display: none !important; }
diff --git a/resources/src/jquery.ui-themes/vector/jquery.ui.theme.css b/resources/src/jquery.ui-themes/vector/jquery.ui.theme.css
deleted file mode 100644 (file)
index 6bde5d3..0000000
+++ /dev/null
@@ -1,246 +0,0 @@
-
-
-/*
-* jQuery UI CSS Framework
-* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
-* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=sans-serif&fwDefault=normal&fsDefault=1.0em&cornerRadius=3px&bgColorHeader=ffffff&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=100&borderColorHeader=aed0ea&fcHeader=222222&iconColorHeader=72a7cf&bgColorContent=f2f5f7&bgTextureContent=04_highlight_hard.png&bgImgOpacityContent=100&borderColorContent=cccccc&fcContent=362b36&iconColorContent=72a7cf&bgColorDefault=d7ebf9&bgTextureDefault=04_highlight_hard.png&bgImgOpacityDefault=80&borderColorDefault=aed0ea&fcDefault=2779aa&iconColorDefault=3d80b3&bgColorHover=e4f1fb&bgTextureHover=03_highlight_soft.png&bgImgOpacityHover=100&borderColorHover=74b2e2&fcHover=0070a3&iconColorHover=2694e8&bgColorActive=f0f0f0&bgTextureActive=06_inset_hard.png&bgImgOpacityActive=100&borderColorActive=cccccc&fcActive=000000&iconColorActive=666666&bgColorHighlight=ffef8f&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=25&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=cd0a0a&bgTextureError=01_flat.png&bgImgOpacityError=15&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=000000&bgTextureOverlay=21_glow_ball.png&bgImgOpacityOverlay=100&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=70&opacityShadow=20&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
-*/
-
-
-/* Component containers
-----------------------------------*/
-.ui-widget { font-family: sans-serif; font-size: 0.8em; }
-.ui-widget .ui-widget { font-size: 1em; }
-.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: sans-serif; font-size: 1em; }
-.ui-widget-content { border: 1px solid #cccccc; /* @embed */ background: #f2f5f7 url(images/ui-bg_highlight-hard_100_f2f5f7_1x100.png) 50% top repeat-x; color: #362b36; }
-.ui-widget-header { border-bottom: 1px solid #bbbbbb; line-height: 1em; /* @embed */ background: #ffffff url(images/ui-bg_highlight-soft_100_ffffff_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #aed0ea; /* @embed */ background: #d7ebf9 url(images/ui-bg_highlight-hard_80_d7ebf9_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #2779aa; }
-.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #2779aa; text-decoration: none; }
-.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #74b2e2; /* @embed */ background: #e4f1fb url(images/ui-bg_highlight-soft_100_e4f1fb_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #0070a3; }
-.ui-state-hover a, .ui-state-hover a:hover { color: #0070a3; text-decoration: none; }
-.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #cccccc; background: #f0f0f0 /* @embed */ url(images/ui-bg_inset-hard_100_f0f0f0_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #000000; }
-.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #000000; text-decoration: none; }
-.ui-widget :active { outline: none; }
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #f9dd34; background: #ffef8f /* @embed */ url(images/ui-bg_highlight-soft_25_ffef8f_1x100.png) 50% top repeat-x; color: #363636; }
-.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
-.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #cd0a0a /* @embed */ url(images/ui-bg_flat_15_cd0a0a_40x100.png) 50% 50% repeat-x; color: #ffffff; }
-.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
-.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
-.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
-.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
-.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon { width: 16px; height: 16px; }
-.ui-icon, .ui-widget-content .ui-icon, .ui-widget-header .ui-icon { /* @embed */ background-image: url(images/ui-icons_72a7cf_256x240.png); }
-.ui-state-default .ui-icon { /* @embed */ background-image: url(images/ui-icons_3d80b3_256x240.png); }
-.ui-state-hover .ui-icon, .ui-state-focus .ui-icon { /* @embed */ background-image: url(images/ui-icons_2694e8_256x240.png); }
-.ui-state-active .ui-icon { /* @embed */ background-image: url(images/ui-icons_666666_256x240.png); }
-.ui-state-highlight .ui-icon { /* @embed */ background-image: url(images/ui-icons_2e83ff_256x240.png); }
-.ui-state-error .ui-icon, .ui-state-error-text .ui-icon { /* @embed */ background-image: url(images/ui-icons_ffffff_256x240.png); }
-
-/* positioning */
-.ui-icon-carat-1-n { background-position: 0 0; }
-.ui-icon-carat-1-ne { background-position: -16px 0; }
-.ui-icon-carat-1-e { background-position: -32px 0; }
-.ui-icon-carat-1-se { background-position: -48px 0; }
-.ui-icon-carat-1-s { background-position: -64px 0; }
-.ui-icon-carat-1-sw { background-position: -80px 0; }
-.ui-icon-carat-1-w { background-position: -96px 0; }
-.ui-icon-carat-1-nw { background-position: -112px 0; }
-.ui-icon-carat-2-n-s { background-position: -128px 0; }
-.ui-icon-carat-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -64px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -64px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-off { background-position: -96px -144px; }
-.ui-icon-radio-on { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.ui-icon-seek-next { background-position: -32px -160px; }
-.ui-icon-seek-prev { background-position: -48px -160px; }
-.ui-icon-seek-end { background-position: -64px -160px; }
-.ui-icon-seek-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.ui-icon-seek-first { background-position: -80px -160px; }
-.ui-icon-stop { background-position: -96px -160px; }
-.ui-icon-eject { background-position: -112px -160px; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-tl { border-top-left-radius: 0; }
-.ui-corner-tr { border-top-right-radius: 0; }
-.ui-corner-bl { border-bottom-left-radius: 0; }
-.ui-corner-br { border-bottom-right-radius: 0; }
-.ui-corner-top { border-top-left-radius: 0; border-top-right-radius: 0; }
-.ui-corner-bottom { border-bottom-left-radius: 0; border-bottom-right-radius: 0; }
-.ui-corner-right {  border-top-right-radius: 0; border-bottom-right-radius: 0; }
-.ui-corner-left { border-top-left-radius: 0; border-bottom-left-radius: 0; }
-.ui-corner-all { border-radius: 0; }
-
-/* Overlays */
-.ui-widget-overlay { background: #000000; opacity: .75;filter:Alpha(Opacity=75); }
-.ui-widget-shadow { margin: -7px 0 0 -7px; padding: 7px; /* @embed */ background: #000000 url(images/ui-bg_flat_70_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); border-radius: 8px; }
index 80b8303..7b49cb2 100644 (file)
@@ -154,7 +154,7 @@ function updateTooltip( element ) {
                        }
                }
 
-               // Search it as parent, because the form control can also inside the label element itself
+               // Search it as parent, because the form control can also be inside the label element itself
                $labelParent = $element.parents( 'label' );
                if ( $labelParent.length === 1 ) {
                        updateTooltipOnElement( element, $labelParent[0] );
index be770a9..a6ff8bc 100644 (file)
 
                        // Look for rgb(num,num,num)
                        if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) {
-                               return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
+                               return [
+                                       parseInt( result[1], 10 ),
+                                       parseInt( result[2], 10 ),
+                                       parseInt( result[3], 10 )
+                               ];
                        }
 
                        // Look for rgb(num%,num%,num%)
                        if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) {
-                               return [parseFloat(result[1],10) * 2.55, parseFloat(result[2],10) * 2.55, parseFloat(result[3]) * 2.55];
+                               return [
+                                       parseFloat( result[1] ) * 2.55,
+                                       parseFloat( result[2] ) * 2.55,
+                                       parseFloat( result[3] ) * 2.55
+                               ];
                        }
 
                        // Look for #a0b1c2
                        if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) {
-                               return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
+                               return [
+                                       parseInt( result[1], 16 ),
+                                       parseInt( result[2], 16 ),
+                                       parseInt( result[3], 16 )
+                               ];
                        }
 
                        // Look for #fff
                        if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) {
-                               return [parseInt(result[1] + result[1],16), parseInt(result[2] + result[2],16), parseInt(result[3] + result[3],16)];
+                               return [
+                                       parseInt( result[1] + result[1], 16 ),
+                                       parseInt( result[2] + result[2], 16 ),
+                                       parseInt( result[3] + result[3], 16)
+                               ];
                        }
 
                        // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
                 * @property {Object}
                 */
                colors: {
-                       aqua: [0,255,255],
-                       azure: [240,255,255],
-                       beige: [245,245,220],
-                       black: [0,0,0],
-                       blue: [0,0,255],
-                       brown: [165,42,42],
-                       cyan: [0,255,255],
-                       darkblue: [0,0,139],
-                       darkcyan: [0,139,139],
-                       darkgrey: [169,169,169],
-                       darkgreen: [0,100,0],
-                       darkkhaki: [189,183,107],
-                       darkmagenta: [139,0,139],
-                       darkolivegreen: [85,107,47],
-                       darkorange: [255,140,0],
-                       darkorchid: [153,50,204],
-                       darkred: [139,0,0],
-                       darksalmon: [233,150,122],
-                       darkviolet: [148,0,211],
-                       fuchsia: [255,0,255],
-                       gold: [255,215,0],
-                       green: [0,128,0],
-                       indigo: [75,0,130],
-                       khaki: [240,230,140],
-                       lightblue: [173,216,230],
-                       lightcyan: [224,255,255],
-                       lightgreen: [144,238,144],
-                       lightgrey: [211,211,211],
-                       lightpink: [255,182,193],
-                       lightyellow: [255,255,224],
-                       lime: [0,255,0],
-                       magenta: [255,0,255],
-                       maroon: [128,0,0],
-                       navy: [0,0,128],
-                       olive: [128,128,0],
-                       orange: [255,165,0],
-                       pink: [255,192,203],
-                       purple: [128,0,128],
-                       violet: [128,0,128],
-                       red: [255,0,0],
-                       silver: [192,192,192],
-                       white: [255,255,255],
-                       yellow: [255,255,0],
-                       transparent: [255,255,255]
+                       aqua: [0, 255, 255],
+                       azure: [240, 255, 255],
+                       beige: [245, 245, 220],
+                       black: [0, 0, 0],
+                       blue: [0, 0, 255],
+                       brown: [165, 42, 42],
+                       cyan: [0, 255, 255],
+                       darkblue: [0, 0, 139],
+                       darkcyan: [0, 139, 139],
+                       darkgrey: [169, 169, 169],
+                       darkgreen: [0, 100, 0],
+                       darkkhaki: [189, 183, 107],
+                       darkmagenta: [139, 0, 139],
+                       darkolivegreen: [85, 107, 47],
+                       darkorange: [255, 140, 0],
+                       darkorchid: [153, 50, 204],
+                       darkred: [139, 0, 0],
+                       darksalmon: [233, 150, 122],
+                       darkviolet: [148, 0, 211],
+                       fuchsia: [255, 0, 255],
+                       gold: [255, 215, 0],
+                       green: [0, 128, 0],
+                       indigo: [75, 0, 130],
+                       khaki: [240, 230, 140],
+                       lightblue: [173, 216, 230],
+                       lightcyan: [224, 255, 255],
+                       lightgreen: [144, 238, 144],
+                       lightgrey: [211, 211, 211],
+                       lightpink: [255, 182, 193],
+                       lightyellow: [255, 255, 224],
+                       lime: [0, 255, 0],
+                       magenta: [255, 0, 255],
+                       maroon: [128, 0, 0],
+                       navy: [0, 0, 128],
+                       olive: [128, 128, 0],
+                       orange: [255, 165, 0],
+                       pink: [255, 192, 203],
+                       purple: [128, 0, 128],
+                       violet: [128, 0, 128],
+                       red: [255, 0, 0],
+                       silver: [192, 192, 192],
+                       white: [255, 255, 255],
+                       yellow: [255, 255, 0],
+                       transparent: [255, 255, 255]
                },
 
                /**
index a4dc33b..c4e2520 100644 (file)
                                        .text( collapseText )
                                        .wrap( '<span class="mw-collapsible-toggle"></span>' )
                                                .parent()
-                                               .prepend( '&nbsp;[' )
-                                               .append( ']&nbsp;' )
+                                               .prepend( '<span class="mw-collapsible-bracket">[</span>' )
+                                               .append( '<span class="mw-collapsible-bracket">]</span>' )
                                                .on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
                        };
 
index 0573f66..289cd22 100644 (file)
                        getContents: function () {
                                return this.val();
                        },
+                       /**
+                        * Set the contents of the textarea, replacing anything that was there before
+                        */
+                       setContents: function ( content ) {
+                               this.val( content );
+                       },
                        /**
                         * Get the currently selected text in this textarea. Will focus the textarea
                         * in some browsers (IE/Opera)
                }
 
                context = $( this ).data( 'wikiEditor-context' );
-               hasWikiEditorSurface = ( context !== undefined );
+               hasWikiEditorSurface = ( context !== undefined && context.$iframe !== undefined );
 
                // IE selection restore voodoo
                needSave = false;
index dcd2b0b..b565440 100644 (file)
@@ -24,8 +24,8 @@
                                // the original values
                                if (
                                        mw.config.get( 'wgAction' ) === 'submit' ||
-                                               $wpTextbox1.data( 'origtext' ) !== $wpTextbox1.val() ||
-                                               $wpSummary.data( 'origtext' ) !== $wpSummary.val()
+                                               $wpTextbox1.data( 'origtext' ) !== $wpTextbox1.textSelection( 'getContents' ) ||
+                                               $wpSummary.data( 'origtext' ) !== $wpSummary.textSelection( 'getContents' )
                                ) {
                                        // Return our message
                                        retval = mw.msg( 'editwarning-warning' );
index 04b7d0a..52e8dd4 100644 (file)
@@ -14,9 +14,9 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                        word = word.replace( /u[ms]$/i, 'i' ); // 2nd declension singular
                        word = word.replace( /ommunia$/i, 'ommunium' ); // 3rd declension neuter plural (partly)
                        word = word.replace( /a$/i, 'ae' ); // 1st declension singular
-                       word = word.replace( /libri$/i,'librorum' ); // 2nd declension plural (partly)
+                       word = word.replace( /libri$/i, 'librorum' ); // 2nd declension plural (partly)
                        word = word.replace( /nuntii$/i, 'nuntiorum' ); // 2nd declension plural (partly)
-                       word = word.replace( /tio$/i,'tionis' ); // 3rd declension singular (partly)
+                       word = word.replace( /tio$/i, 'tionis' ); // 3rd declension singular (partly)
                        word = word.replace( /ns$/i, 'ntis' );
                        word = word.replace( /as$/i, 'atis' );
                        word = word.replace( /es$/i, 'ei' ); // 5th declension singular
@@ -26,9 +26,9 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                        word = word.replace( /u[ms]$/i, 'um' ); // 2nd declension singular
                        word = word.replace( /ommunia$/i, 'am' ); // 3rd declension neuter plural (partly)
                        word = word.replace( /a$/i, 'ommunia' ); // 1st declension singular
-                       word = word.replace( /libri$/i,'libros' ); // 2nd declension plural (partly)
+                       word = word.replace( /libri$/i, 'libros' ); // 2nd declension plural (partly)
                        word = word.replace( /nuntii$/i, 'nuntios' );// 2nd declension plural (partly)
-                       word = word.replace( /tio$/i,'tionem' ); // 3rd declension singular (partly)
+                       word = word.replace( /tio$/i, 'tionem' ); // 3rd declension singular (partly)
                        word = word.replace( /ns$/i, 'ntem' );
                        word = word.replace( /as$/i, 'atem');
                        word = word.replace( /es$/i, 'em' ); // 5th declension singular
@@ -38,9 +38,9 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                        word = word.replace( /u[ms]$/i, 'o' ); // 2nd declension singular
                        word = word.replace( /ommunia$/i, 'ommunibus' ); // 3rd declension neuter plural (partly)
                        word = word.replace( /a$/i, 'a' ); // 1st declension singular
-                       word = word.replace( /libri$/i,'libris' ); // 2nd declension plural (partly)
+                       word = word.replace( /libri$/i, 'libris' ); // 2nd declension plural (partly)
                        word = word.replace( /nuntii$/i, 'nuntiis' ); // 2nd declension plural (partly)
-                       word = word.replace( /tio$/i,'tione' ); // 3rd declension singular (partly)
+                       word = word.replace( /tio$/i, 'tione' ); // 3rd declension singular (partly)
                        word = word.replace( /ns$/i, 'nte' );
                        word = word.replace( /as$/i, 'ate');
                        word = word.replace( /es$/i, 'e' ); // 5th declension singular
index ae08c9f..ec9888f 100644 (file)
@@ -1,30 +1,6 @@
 // ----------------------------------------------------------------------------
 // Form styling mixins
 // ----------------------------------------------------------------------------
-
-// Font is not included.
-.agora-field-styling() {
-
-       border: 1px solid @colorFieldBorder;
-
-       &:focus {
-               // Styling focus of native checkboxes etc on Mac is almost impossible.
-               &:not([type=checkbox]):not([type=radio]) {
-                       outline: 0; // Removes OS field focus
-               }
-
-               box-shadow: lighten(@colorProgressive, 6%) 0 0 5px;
-
-               border-color: lighten(@colorProgressive, 6%);
-       }
-
-       color: @colorText;
-       padding: 0.35em 0.5em 0.35em 0.5em;
-
-       // Ensure that buttons and inputs are nicely aligned when they have differing heights
-       vertical-align: middle;
-}
-
 .agora-label-styling() {
        font-size: 0.9em;
        color: @colorText;
index 931e312..622e818 100644 (file)
 
        function bindPageNavigation( $container ) {
                $container.find( '.multipageimagenavbox' ).one( 'click', 'a', function ( e ) {
-                       loadPage( this.href );
+                       var page, uri;
+
+                       // Generate the same URL on client side as the one generated in ImagePage::openShowImage.
+                       // We avoid using the URL in the link directly since it could have been manipulated (bug 66608)
+                       page = Number( mw.util.getParamValue( 'page', this.href ) );
+                       uri = new mw.Uri( mw.util.wikiScript() )
+                               .extend( { title: mw.config.get( 'wgPageName' ), page: page } )
+                               .toString();
+
+                       loadPage( uri );
                        e.preventDefault();
                } );
 
index 2f1b795..47c3526 100644 (file)
@@ -34,6 +34,9 @@ span.reference {
        font-size: smaller;
        line-height: 1;
        vertical-align: super;
+       unicode-bidi: -moz-isolate;
+       unicode-bidi: -webkit-isolate;
+       unicode-bidi: isolate;
 }
 
 sup, sub {
index 2a4449e..247f814 100644 (file)
@@ -43,7 +43,7 @@
                                        '<label for="wpCaptchaWord">' + mw.message( 'createacct-captcha' ).escaped() + '</label>',
                                        '<div class="mw-createacct-captcha-container">',
                                                '<div class="mw-createacct-captcha-and-reload" />',
-                                               '<input id="wpCaptchaWord" name="wpCaptchaWord" type="text" placeholder="' +
+                                               '<input id="wpCaptchaWord" class="mw-ui-input" name="wpCaptchaWord" type="text" placeholder="' +
                                                        mw.message( 'createacct-imgcaptcha-ph' ).escaped() +
                                                        '" tabindex="' + tabIndex + '" autocapitalize="off" autocorrect="off">',
                                                        helpHtml,
diff --git a/resources/src/mediawiki.ui/components/anchors.less b/resources/src/mediawiki.ui/components/anchors.less
new file mode 100644 (file)
index 0000000..e1b258d
--- /dev/null
@@ -0,0 +1,77 @@
+@import "mediawiki.mixins";
+@import "mediawiki.ui/variables";
+@import "mediawiki.ui/mixins";
+
+// Helpers
+.mw-ui-anchor( @mainColor ) {
+       // Make all context classes take the main color in IE6
+       .select-ie6-only& {
+               &:link, &:visited, &:hover, &:focus, &:active {
+                       color: @mainColor;
+               }
+       }
+
+       // Hover state
+       &:hover {
+               color: lighten( @mainColor, @colorLightenPercentage );
+       }
+       // Focus and active states
+       &:focus, &:active {
+               color: darken( @mainColor, @colorDarkenPercentage );
+               outline: none; // outline fix
+       }
+
+       color: @mainColor;
+
+       // Quiet mode is gray at first
+       &.mw-ui-quiet {
+               .mw-ui-anchor-quiet( @mainColor );
+       }
+}
+
+.mw-ui-anchor-quiet( @mainColor ) {
+       color: @colorTextLight;
+       text-decoration: none;
+
+       &:hover {
+               color: @mainColor;
+       }
+       &:focus, &:active {
+               color: darken( @mainColor, @colorDarkenPercentage );
+       }
+}
+
+/*
+Text & Anchors
+
+Allows you to give text a context as to the type of action it is indicating.
+
+Styleguide 6.
+*/
+
+/*
+Guidelines
+
+This context should only applied on elements without special behavior (DIV, SPAN, etc.), including A elements. These classes cannot be applied for styling purposes on other elements (such as form elements), except when used in combination with .mw-ui-button to alter a button context.
+
+Markup:
+<a href=# class="mw-ui-progressive {$modifiers}">Progressive</a>
+<a href=# class="mw-ui-constructive {$modifiers}">Constructive</a>
+<a href=# class="mw-ui-destructive {$modifiers}">Destructive</a>
+
+.mw-ui-quiet - Quiet until interaction.
+
+Styleguide 6.1.
+*/
+.mw-ui-progressive {
+       .mw-ui-anchor( @colorProgressive );
+}
+.mw-ui-constructive {
+       .mw-ui-anchor( @colorConstructive );
+}
+.mw-ui-destructive {
+       .mw-ui-anchor( @colorDestructive );
+}
+.mw-ui-quiet {
+       .mw-ui-anchor-quiet( @colorTextLight );
+}
index 189dae8..ebf4779 100644 (file)
@@ -24,6 +24,7 @@
 //
 // Styleguide 2.1.
 .mw-ui-button {
+       font-size: 1em;
        // Container layout
        display: inline-block;
        padding: .5em 1em;
diff --git a/resources/src/mediawiki.ui/components/checkbox.less b/resources/src/mediawiki.ui/components/checkbox.less
new file mode 100644 (file)
index 0000000..eced8cf
--- /dev/null
@@ -0,0 +1,94 @@
+@import "mediawiki.mixins";
+
+// Checkbox
+//
+// Styling checkboxes in a way that works cross browser is a tricky problem to solve.
+// In MediaWiki UI we wrap a checkbox and label inside mw-ui-checkbox
+// This renders in all browsers except IE6-8 which do not support the :checked selector
+// these are kept backwards compatible using the :not(#noop) selector
+// Ensure to markup the checkbox and label with id and for attributes respectively
+//
+// Markup:
+// <div class="mw-ui-checkbox">
+//   <input type="checkbox" id="kss-example-5"><label for="kss-example-5">Standard checkbox</label>
+// </div>
+// <div class="mw-ui-checkbox">
+//   <input type="checkbox" id="kss-example-5-2" disabled><label for="kss-example-5-2">Disabled checkbox</label>
+// </div>
+//
+// Styleguide 5.
+.mw-ui-checkbox {
+       display: inline-block;
+       vertical-align: middle;
+}
+
+@checkboxSize: 24px;
+
+// We use the not selector to cancel out styling on IE 8 and below
+.mw-ui-checkbox:not(#noop) {
+       // Position relatively so we can make use of absolute pseudo elements
+       position: relative;
+       line-height: @checkboxSize;
+
+       * {
+               vertical-align: middle;
+       }
+
+       input[type="checkbox"] {
+               // we hide the input element as instead we will style the label that follows
+               // we use opacity so that VoiceOver software can still identify it
+               opacity: 0;
+               // ensure the invisible checkbox takes up the required width
+               width: @checkboxSize;
+               height: @checkboxSize;
+
+               // the pseudo before element of the label after the checkbox now looks like a checkbox
+               & + label {
+                       &::before {
+                                               content: '';
+                                               position: absolute;
+                                               left: 0;
+                                               display: inline-block;
+                                               border-radius: 2px;
+                                               margin-right: 18px;
+                                               width: @checkboxSize;
+                                               height: @checkboxSize;
+                                               background-color: #fff;
+                                               cursor: pointer;
+                                               border: 1px solid grey;
+                                       }
+               }
+
+               // when the input is checked, style the label pseudo before element that followed as a checked checkbox
+               &:checked {
+                       + label {
+                               &::before {
+                                       .background-image-svg('images/checked.svg', 'images/checked.png');
+                                       background-repeat: no-repeat;
+                                       background-position: center top;
+                               }
+                       }
+               }
+
+               @focusBottomBorderSize: 3px;
+               &:active,
+               &:focus {
+                       + label {
+                               &::after {
+                                       content: '';
+                                       position: absolute;
+                                       width: @checkboxSize;
+                                       height: @checkboxSize - @focusBottomBorderSize + 1; // offset by bottom border
+                                       // offset from the checkbox by 1px to account for left border
+                                       left: 1px;
+                                       border-bottom: solid @focusBottomBorderSize lightgrey;
+                               }
+                       }
+               }
+
+               // disabled checked boxes have a gray background
+               &:disabled + label::before {
+                       background-color: lightgrey;
+               }
+       }
+}
index 2e586a6..7c01350 100644 (file)
 // VForm
 //
 // Style a compact vertical stacked form ("VForm") and the elements in divs
-// within it. See button section on guidance of how and when to use mw-ui-constructive.
+// within it. See button and inputs section on guidance of how and when to use them.
 //
 // Markup:
 // <form class="mw-ui-vform">
 //   <div class="mw-ui-vform-field">This is a form example.</div>
 //   <div class="mw-ui-vform-field">
 //     <label>Username </label>
-//     <input value="input">
+//     <input class="mw-ui-input" value="input">
 //   </div>
 //   <div class="mw-ui-vform-field">
 //     <button class="mw-ui-button mw-ui-constructive">Button in vform</button>
@@ -41,7 +41,6 @@
        width: @defaultFormWidth;
 
        // MW currently doesn't use the type attribute everywhere on inputs.
-       input,
        select,
        .mw-ui-button {
                display: block;
                width: 100%;
        }
 
-       // We exclude buttons because they'll generally use mw-ui-button.
-       // Otherwise, we'll unintentionally override that.
-       input:not([type=button]):not([type=submit]):not([type=file]) {
-               .agora-field-styling(); // mixins/forms.less
-       }
-
        // Give dropdown lists the same spacing as input fields for consistency.
        // Values taken from .agora-field-styling() in mixins/form.less
        select {
@@ -63,7 +56,7 @@
                vertical-align: middle;
        }
 
-       label {
+       label {
                display: block;
                .box-sizing(border-box);
                .agora-label-styling();
@@ -73,7 +66,6 @@
        }
 
        // Override input styling just for checkboxes and radio inputs.
-       input[type="checkbox"],
        input[type="radio"] {
                display: inline;
                .box-sizing(content-box);
        margin: 0 0 15px;
        padding: 0;
        width: 100%;
-
-       input {
-               font-size: 1em;
-               line-height: 1.4;
-       }
-}
-
-// Apply mw-ui-input to individual input fields to style them.
-// You generally don't need to use this class if <input> is within an Agora
-// form container such as mw-ui-vform
-.mw-ui-input {
-       .agora-field-styling(); // mixins/forms.less
-       font-size: 1em;
-       line-height: 1.4em;
 }
 
 // Apply mw-ui-label to individual elements to style them.
        .agora-label-styling(); // mixins/forms.less
 }
 
-// Nesting an input checkbox or radio button inside a label with this class
+// Nesting an input  inside a label with this class
 // improves alignment, e.g.
-//     <label class="mw-ui-checkbox-label">
-//             <input type="checkbox">The label text
+//     <label class="mw-ui-radio-label">
+//             <input type="radio">The label text
 //     </label>
-.mw-ui-checkbox-label, .mw-ui-radio-label {
+.mw-ui-radio-label {
        .agora-inline-label-styling();
 }
diff --git a/resources/src/mediawiki.ui/components/images/checked.png b/resources/src/mediawiki.ui/components/images/checked.png
new file mode 100644 (file)
index 0000000..ce4e6b9
Binary files /dev/null and b/resources/src/mediawiki.ui/components/images/checked.png differ
diff --git a/resources/src/mediawiki.ui/components/images/checked.svg b/resources/src/mediawiki.ui/components/images/checked.svg
new file mode 100644 (file)
index 0000000..aea69db
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path d="M4 12l5 5 11-12" stroke="#00B78C" stroke-width="3" fill="none"/></svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.ui/components/inputs.less b/resources/src/mediawiki.ui/components/inputs.less
new file mode 100644 (file)
index 0000000..25dba78
--- /dev/null
@@ -0,0 +1,109 @@
+// Inputs
+
+@import "mediawiki.mixins";
+@import "mediawiki.ui/variables";
+@import "mediawiki.ui/mixins";
+
+// Placeholder text styling helper
+.field-placeholder-styling() {
+       font-style: italic;
+       font-weight: normal;
+}
+// Inputs
+//
+// When using an input or textarea apply the mw-ui-input class.
+//
+// Styleguide 1.
+
+// mw-ui-input
+//
+// Style an input using MediaWiki UI.
+// Currently in draft status and subject to change.
+// When focused a progressive highlight appears to the left of the field.
+//
+// Markup:
+// <input value="input" class="mw-ui-input" value="input">
+// <textarea class="mw-ui-input">textarea</textarea>
+//
+// Styleguide 1.1.
+.mw-ui-input {
+       // turn off default input styling for input[type="search"] fields
+       -webkit-appearance: none;
+       border: 1px solid @colorFieldBorder;
+       .box-sizing(border-box);
+       width: 100%;
+       padding: .3em .3em .3em .6em;
+       display: block;
+       // Override user agent stylesheet properties. Instead use parent element.
+       color: inherit;
+       font-family: inherit;
+       font-size: inherit;
+       line-height: inherit;
+       .transition(~"border linear .2s, box-shadow linear .2s");
+
+       // Placeholder text styling must be set individually for each browser @winter
+       &::-webkit-input-placeholder { // webkit
+               .field-placeholder-styling;
+       }
+       &::-moz-placeholder { // FF 4-18
+               .field-placeholder-styling;
+       }
+       &:-moz-placeholder { // FF >= 19
+               .field-placeholder-styling;
+       }
+       &:-ms-input-placeholder { // IE >= 10
+               .field-placeholder-styling;
+       }
+
+       &:focus {
+               box-shadow: inset .45em 0 0 #5088f7;
+               border-color: @colorGrayDark;
+               // Remove focus glow on input[type="search"]
+               outline: 0;
+       }
+}
+
+textarea.mw-ui-input {
+       min-height: 8em;
+}
+
+// mw-ui-input-inline
+//
+// Use mw-ui-input-inline with mw-ui-input in cases where you want a button to line up with the input.
+//
+// Markup:
+// <input value="input" class="mw-ui-input mw-ui-input-inline" value="input">
+// <button class="mw-ui-button mw-ui-constructive">go</button>
+//
+// Styleguide 1.2.
+.mw-ui-input-inline {
+       display: inline-block;
+       width: auto;
+}
+
+// mw-ui-input-large
+//
+// Use mw-ui-input-large with mw-ui-input in cases where there are multiple inputs on a screen and you
+// want to draw more attention to one instance. For example add topic / reply to post forms.
+// Currently in draft status and subject to change. When used on an input, the text is styled
+// in a large font. When used alongside another mw-ui-input large they are pushed together to seem like
+// one contiguous input.
+//
+// Markup:
+// <input value="input" class="mw-ui-input mw-ui-input-large" value="input">
+// <textarea class="mw-ui-input mw-ui-input-large">textarea</textarea>
+//
+// Styleguide 1.3.
+.mw-ui-input-large {
+       margin-top: 0;
+       margin-bottom: 0;
+       & + .mw-ui-input-large {
+               border-top-width: 0;
+       }
+}
+
+input.mw-ui-input-large {
+       font-size: 1.75em;
+       font-weight: bold;
+       line-height: 1.25em;
+}
index ccfb677..0bbb440 100644 (file)
@@ -1,8 +1,6 @@
 // Utilities
 //
 // Other things which effect the behaviour of components
-//
-// Styleguide 4.
 
 // Flush left
 //
@@ -13,8 +11,6 @@
 //   <label>Username <a href="#" class="mw-ui-flush-left">?</a></label>
 //   <input>
 // </div>
-//
-// Styleguide 4.1.
 .mw-ui-flush-left {
        float: left;
        margin-left: 0;
@@ -30,8 +26,6 @@
 //   <label>Username <a href="#" class="mw-ui-flush-right">?</a></label>
 //   <input>
 // </div>
-//
-// Styleguide 4.2.
 .mw-ui-flush-right {
        float: right;
        padding-right: 0;
@@ -46,8 +40,6 @@
 // <div>
 //   <button class="mw-ui-center-block">click me</button>
 // </div>
-//
-// Styleguide 4.3.
 .mw-ui-center-block {
        display: block;
        margin-left: auto;
index d21b814..c9d6208 100644 (file)
@@ -1,6 +1,5 @@
 /**
  * Provide Agora appearance for mw-ui-* classes.
  */
-
 @import "components/forms";
 @import "components/utilities";
index 88de7d8..1c0d833 100644 (file)
                                                                $feedbackPageLink.clone()
                                                        )
                                                ),
-                                               $( '<div style="margin-top: 1em;"></div>' ).append(
-                                                       mw.msg( 'feedback-subject' ),
+                                               $( '<div style="margin-top: 1em;"></div>' )
+                                               .msg( 'feedback-subject' )
+                                               .append(
                                                        $( '<br>' ),
                                                        $( '<input type="text" class="feedback-subject" name="subject" maxlength="60" style="width: 100%; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;"/>' )
                                                ),
-                                               $( '<div style="margin-top: 0.4em;"></div>' ).append(
-                                                       mw.msg( 'feedback-message' ),
+                                               $( '<div style="margin-top: 0.4em;"></div>' )
+                                               .msg( 'feedback-message' )
+                                               .append(
                                                        $( '<br>' ),
                                                        $( '<textarea name="message" class="feedback-message" 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' ),
+                                       $( '<div class="feedback-mode feedback-submitting" style="text-align: center; margin: 3em 0;"></div>' )
+                                       .msg( 'feedback-adding' )
+                                       .append(
                                                $( '<br>' ),
                                                $( '<span class="feedback-spinner"></span>' )
                                        ),
                        this.$dialog.dialog( {
                                width: 500,
                                autoOpen: false,
-                               title: mw.msg( this.dialogTitleMessageKey ),
+                               title: mw.message( this.dialogTitleMessageKey ).escaped(),
                                modal: true,
                                buttons: fb.buttons
                        } );
                        var subject, message,
                                fb = this;
 
-                       function ok( result ) {
-                               if ( result.edit !== undefined ) {
-                                       if ( result.edit.result === 'Success' ) {
-                                               fb.displayThanks();
-                                       } else {
-                                               // unknown API result
-                                               fb.displayError( 'feedback-error1' );
-                                       }
-                               } else {
-                                       // edit failed
-                                       fb.displayError( 'feedback-error2' );
-                               }
-                       }
-
-                       function err() {
-                               // ajax request failed
-                               fb.displayError( 'feedback-error3' );
-                       }
-
                        // Get the values to submit.
                        subject = this.subjectInput.value;
 
                                subject,
                                message,
                                { redirect: true }
-                       ).done( ok ).fail( err );
+                       )
+                       .done( function ( result ) {
+                               if ( result.edit !== undefined ) {
+                                       if ( result.edit.result === 'Success' ) {
+                                               fb.displayThanks();
+                                       } else {
+                                               // unknown API result
+                                               fb.displayError( 'feedback-error1' );
+                                       }
+                               } else {
+                                       // edit failed
+                                       fb.displayError( 'feedback-error2' );
+                               }
+                       } )
+                       .fail( function () {
+                               // ajax request failed
+                               fb.displayError( 'feedback-error3' );
+                       } );
                },
 
                /**
index 9061acd..380e4e6 100644 (file)
                         *             'skip': 'return !!window.Example', (or) null
                         *
                         *             // Added during implementation
+                        *             'skipped': true,
                         *             'script': ...,
                         *             'style': ...,
                         *             'messages': { 'key': 'value' },
                        /* Private methods */
 
                        function getMarker() {
-                               // Cached ?
-                               if ( $marker ) {
-                                       return $marker;
-                               }
-
-                               $marker = $( 'meta[name="ResourceLoaderDynamicStyles"]' );
-                               if ( $marker.length ) {
-                                       return $marker;
+                               // Cached
+                               if ( !$marker ) {
+                                       $marker = $( 'meta[name="ResourceLoaderDynamicStyles"]' );
+                                       if ( !$marker.length ) {
+                                               mw.log( 'No <meta name="ResourceLoaderDynamicStyles"> found, inserting dynamically' );
+                                               $marker = $( '<meta>' ).attr( 'name', 'ResourceLoaderDynamicStyles' ).appendTo( 'head' );
+                                       }
                                }
-                               mw.log( 'getMarker> No <meta name="ResourceLoaderDynamicStyles"> found, inserting dynamically.' );
-                               $marker = $( '<meta>' ).attr( 'name', 'ResourceLoaderDynamicStyles' ).appendTo( 'head' );
-
                                return $marker;
                        }
 
                                        skip = new Function( registry[module].skip );
                                        registry[module].skip = null;
                                        if ( skip() ) {
+                                               registry[module].skipped = true;
                                                registry[module].dependencies = [];
                                                registry[module].state = 'ready';
                                                handlePending( module );
                                                crossDomain: true,
                                                cache: true,
                                                async: true
-                                       } ).always( function () {
-                                               if ( callback  ) {
-                                                       callback();
-                                               }
-                                       } );
+                                       } ).always( callback );
                                } else {
                                        /*jshint evil:true */
                                        document.write( mw.html.element( 'script', { 'src': src }, '' ) );
                                /**
                                 * Execute a function as soon as one or more required modules are ready.
                                 *
-                                * If the required modules are already loaded, the function will be
-                                * executed immediately and the modules will not be reloaded.
-                                *
                                 * Example of inline dependency on OOjs:
                                 *
                                 *     mw.loader.using( 'oojs', function () {
index c5694b7..7933f1d 100644 (file)
         *
         * @private
         * @param {string} info One of 'groups' or 'rights'
-        * @param {Function} [callback]
         * @return {jQuery.Promise}
         */
-       function getUserInfo( info, callback ) {
+       function getUserInfo( info ) {
                var api;
                if ( !deferreds[info] ) {
 
@@ -42,7 +41,7 @@
 
                }
 
-               return deferreds[info].done( callback ).promise();
+               return deferreds[info].promise();
        }
 
        mw.user = user = {
                 * @return {jQuery.Promise}
                 */
                getGroups: function ( callback ) {
-                       return getUserInfo( 'groups', callback );
+                       return getUserInfo( 'groups' ).done( callback );
                },
 
                /**
                 * @return {jQuery.Promise}
                 */
                getRights: function ( callback ) {
-                       return getUserInfo( 'rights', callback );
+                       return getUserInfo( 'rights' ).done( callback );
                }
        };
 
index d007deb..5fadace 100644 (file)
@@ -4,6 +4,7 @@
                        "Xuacu"
                ]
        },
+       "monobook-desc": "El tema clásicu de MediaWiki dende 2004, llamáu asina pola foto en blanco y negro d'un llibru nel fondu de la páxina",
        "monobook.css": "/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Monobook */",
        "monobook.js": "/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu MonoBook */"
 }
index e20dbb6..bb7745e 100644 (file)
@@ -1,10 +1,12 @@
 {
        "@metadata": {
                "authors": [
-                       "Peter Alberti"
+                       "Peter Alberti",
+                       "Christian List"
                ]
        },
        "skinname-monobook": "MonoBook",
+       "monobook-desc": "Den klassiske MediaWiki hud siden 2004, opkaldt efter det sort-hvide foto af en bog i baggrunden af siderne",
        "monobook.css": "/** CSS inkluderet her vil være aktivt for brugere af Monobook-temaet . */",
        "monobook.js": "/* JavaScript i denne fil vil indlæses for brugere af udseendet MonoBook */"
 }
index 591acff..dd823ee 100644 (file)
@@ -1,3 +1,10 @@
 {
-       "skinname-monobook": "MonoBook"
+       "@metadata": {
+               "authors": [
+                       "Pikne"
+               ]
+       },
+       "skinname-monobook": "MonoBook",
+       "monobook.css": "/* Siin asuv kaskaadilaadistik puudutab kõiki MonoBooki-kujunduse kasutajaid. */",
+       "monobook.js": "/* Siin asuv JavaScript laaditakse MonoBooki-kujunduse kasutajate jaoks. */"
 }
index 89bfb40..9e4f058 100644 (file)
@@ -1,10 +1,12 @@
 {
        "@metadata": {
                "authors": [
-                       "Rotemliss"
+                       "Rotemliss",
+                       "Amire80"
                ]
        },
        "skinname-monobook": "מונובוק",
+       "monobook-desc": "העיצוב הקלאסי של מדיה־ויקי מ־2004, שנקרא על שם הצילום השחור־לבן של ספר ברקע",
        "monobook.css": "/* הסגנונות הנכתבים כאן ישפיעו על העיצוב MonoBook בלבד */",
        "monobook.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Monobook */"
 }
index 33e527b..e645482 100644 (file)
@@ -5,6 +5,7 @@
                        "Siddhartha Ghai"
                ]
        },
+       "monobook-desc": "2004 से मीडियाविकि की क्लासिक त्वचा, जिसका नाम पृष्ठभूमि में पुस्तक के इकरंगा चित्र से पड़ा।",
        "monobook.css": "/* यहां रखी गई css मोनोबुक त्वचा का इस्तेमाल करने वाले सभी सदस्योंपर असर करेगी */",
        "monobook.js": "/* यहाँ पर दी गई जावास्क्रिप्ट मोनोबुक त्वचा का प्रयोग कर रहे सदस्यों के लिए लोड होगी */"
 }
diff --git a/skins/MonoBook/i18n/ilo.json b/skins/MonoBook/i18n/ilo.json
new file mode 100644 (file)
index 0000000..c59ae5f
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Lam-ang"
+               ]
+       },
+       "monobook-desc": "Ti klasiko a kudil ti MediaWiki manipud idi 2004, nanaganan manipud ti nangisit-ken-puraw a retrato ti libro iti likudan ti panid"
+}
index fa975fe..c01a8cc 100644 (file)
@@ -1,9 +1,11 @@
 {
        "@metadata": {
                "authors": [
-                       "Anakmalaysia"
+                       "Anakmalaysia",
+                       "Pizza1016"
                ]
        },
        "skinname-monobook": "MonoBook",
+       "monobook-desc": "Kulit MediaWiki yang klasik sejak tahun 2004, dinamakan selepas foto hitam-dan-putih sebuah buku dalam belakang laman.",
        "monobook.css": "/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Monobook */"
 }
index cb76ae3..1fb9ad4 100644 (file)
@@ -892,11 +892,6 @@ div.mw-lag-warn-high {
        font-size: 90%;
 }
 
-/* God-damned hack for the crappy layout */
-.os-suggest {
-       font-size: 127%;
-}
-
 /* Sometimes people don't want personal tools to be lowercase! */
 .no-text-transform {
        text-transform: none;
index be8719a..a08d121 100644 (file)
@@ -62,3 +62,27 @@ $wgResourceModules['skins.vector.js'] = array(
        'remoteSkinPath' => 'Vector',
        'localBasePath' => __DIR__,
 );
+
+// Apply module customizations
+$wgResourceModuleSkinStyles['vector'] = array(
+       'jquery.tipsy' => 'skinStyles/jquery.tipsy.less',
+       'jquery.ui.core' => array(
+               'skinStyles/jquery.ui/jquery.ui.core.css',
+               'skinStyles/jquery.ui/jquery.ui.theme.css',
+       ),
+       'jquery.ui.accordion' => 'skinStyles/jquery.ui/jquery.ui.accordion.css',
+       'jquery.ui.autocomplete' => 'skinStyles/jquery.ui/jquery.ui.autocomplete.css',
+       'jquery.ui.button' => 'skinStyles/jquery.ui/jquery.ui.button.css',
+       'jquery.ui.datepicker' => 'skinStyles/jquery.ui/jquery.ui.datepicker.css',
+       'jquery.ui.dialog' => 'skinStyles/jquery.ui/jquery.ui.dialog.css',
+       'jquery.ui.progressbar' => 'skinStyles/jquery.ui/jquery.ui.progressbar.css',
+       'jquery.ui.resizable' => 'skinStyles/jquery.ui/jquery.ui.resizable.css',
+       'jquery.ui.selectable' => 'skinStyles/jquery.ui/jquery.ui.selectable.css',
+       'jquery.ui.slider' => 'skinStyles/jquery.ui/jquery.ui.slider.css',
+       'jquery.ui.tabs' => 'skinStyles/jquery.ui/jquery.ui.tabs.css',
+       'mediawiki.notification' => 'skinStyles/mediawiki.notification.less',
+       'mediawiki.special' => 'skinStyles/mediawiki.special.less',
+       'mediawiki.special.preferences' => 'skinStyles/mediawiki.special.preferences.less',
+       'remoteSkinPath' => 'Vector',
+       'localBasePath' => __DIR__,
+);
index 7dc376a..291b761 100644 (file)
@@ -97,7 +97,6 @@ class VectorTemplate extends BaseTemplate {
                <div id="content" class="mw-body" role="main">
                        <a id="top"></a>
 
-                       <div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
                        <?php
                        if ( $this->data['sitenotice'] ) {
                                ?>
@@ -411,25 +410,19 @@ class VectorTemplate extends BaseTemplate {
                                                echo ' emptyPortlet';
                                        }
                                        ?>" aria-labelledby="p-variants-label">
-                                               <h3 id="mw-vector-current-variant">
-                                                       <?php
-                                                       foreach ( $this->data['variant_urls'] as $link ) {
-                                                               ?>
-                                                               <?php
-                                                               if ( stripos( $link['attributes'], 'selected' ) !== false ) {
-                                                                       ?>
-                                                                       <?php
-                                                                       echo htmlspecialchars( $link['text'] )
-                                                                       ?>
-                                                               <?php
-                                                               }
-                                                               ?>
-                                                       <?php
+                                               <?php
+                                               // Replace the label with the name of currently chosen variant, if any
+                                               $variantLabel = $this->getMsg( 'variants' )->text();
+                                               foreach ( $this->data['variant_urls'] as $link ) {
+                                                       if ( stripos( $link['attributes'], 'selected' ) !== false ) {
+                                                               $variantLabel = $link['text'];
+                                                               break;
                                                        }
-                                                       ?>
-                                               </h3>
-
-                                               <h3 id="p-variants-label"><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h3>
+                                               }
+                                               ?>
+                                               <h3 id="p-variants-label"><span
+                                                       style="display: block;" <?php /* Temporary WMF deployment hack, to be removed before 1.24 release */ ?>
+                                                       ><?php echo htmlspecialchars( $variantLabel ) ?></span><a href="#"></a></h3>
 
                                                <div class="menu">
                                                        <ul>
@@ -499,7 +492,9 @@ class VectorTemplate extends BaseTemplate {
                                                echo ' emptyPortlet';
                                        }
                                        ?>" aria-labelledby="p-cactions-label">
-                                               <h3 id="p-cactions-label"><span><?php $this->msg( 'vector-more-actions' ) ?></span><a href="#"></a></h3>
+                                               <h3 id="p-cactions-label"><span><?php
+                                                       $this->msg( 'vector-more-actions' )
+                                               ?></span><a href="#"></a></h3>
 
                                                <div class="menu">
                                                        <ul<?php $this->html( 'userlangattributes' ) ?>>
@@ -551,7 +546,7 @@ class VectorTemplate extends BaseTemplate {
 
                                                <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
                                                        <?php
-                                                       if ($wgVectorUseSimpleSearch) {
+                                                       if ( $wgVectorUseSimpleSearch ) {
                                                        ?>
                                                        <div id="simpleSearch">
                                                                <?php
index 33cd230..1aee34d 100644 (file)
@@ -132,9 +132,3 @@ pre, .mw-code {
        line-height: @content-line-height;
        font-size: @content-font-size;
 }
-
-/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
-// FIXME: Should be part of jquery.tipsy.css
-.tipsy {
-       font-size: 0.8em;
-}
diff --git a/skins/Vector/components/notifications.less b/skins/Vector/components/notifications.less
deleted file mode 100644 (file)
index 5bb6f1a..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/* mediawiki.notification */
-
-// This wrapper class is needed to ensure these rules have larger CSS
-// selector specificity than default styles
-.mediawiki {
-       .mw-notification-area {
-               font-size: 0.8em;
-       }
-
-       .mw-notification-area-layout {
-               top: 7em;
-       }
-
-       .mw-notification {
-               background-color: #fff;
-               background-color: rgba(255, 255, 255, 0.93);
-               padding: 0.75em 1.5em;
-               border: solid 1px @content-border-color;
-               border-radius: 0.75em;
-               box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
-       }
-}
index 9e39fbb..57fe45f 100644 (file)
@@ -144,6 +144,7 @@ div#mw-head div.vectorMenu h3 {
 }
 
 // The "Variants" menu has a really funny structure
+// Temporary WMF deployment hack, to be removed before 1.24 release
 div#mw-head div.vectorMenu#p-variants {
        #p-variants-label span {
                display: none;
index bd3703f..d150812 100644 (file)
@@ -5,6 +5,7 @@
                        "Xuacu"
                ]
        },
+       "vector-skin-desc": "Versión moderna de MonoBook, con un aspeutu frescu y munchos ameyoramientos d'usabilidá",
        "vector.css": "/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Vector */",
        "vector.js": "/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Vector */",
        "vector-action-addsection": "Amestar seición",
@@ -17,5 +18,6 @@
        "vector-view-edit": "Editar",
        "vector-view-history": "Ver historial",
        "vector-view-view": "Lleer",
-       "vector-view-viewsource": "Ver fonte"
+       "vector-view-viewsource": "Ver fonte",
+       "vector-more-actions": "Más"
 }
index f94be4c..f5e80ac 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "CERminator",
                        "DzWiki",
-                       "KWiki"
+                       "KWiki",
+                       "Edinwiki"
                ]
        },
        "vector-action-addsection": "Dodaj temu",
@@ -16,5 +17,6 @@
        "vector-view-edit": "Uredi",
        "vector-view-history": "Pregled historije",
        "vector-view-view": "Čitanje",
-       "vector-view-viewsource": "Pogledaj izvor"
+       "vector-view-viewsource": "Pogledaj izvor",
+       "vector-more-actions": "Više"
 }
diff --git a/skins/Vector/i18n/bto.json b/skins/Vector/i18n/bto.json
new file mode 100644 (file)
index 0000000..4dd54b8
--- /dev/null
@@ -0,0 +1,18 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Filipinayzd"
+               ]
+       },
+       "vector-action-delete": "Puraon",
+       "vector-action-move": "Ilipat",
+       "vector-action-protect": "Protektaran",
+       "vector-action-undelete": "Ibalik",
+       "vector-action-unprotect": "Ribayan a proteksyon",
+       "vector-view-create": "Gumibo",
+       "vector-view-edit": "Balyowan",
+       "vector-view-history": "Baydon a kasaysayan",
+       "vector-view-view": "Basahon",
+       "vector-view-viewsource": "Baydon a ginikanan",
+       "vector-more-actions": "Dakul pa"
+}
index ad56101..1651d66 100644 (file)
@@ -6,6 +6,7 @@
                        "Peter Alberti"
                ]
        },
+       "vector-skin-desc": "Moderne version af MonoBook med frisk udseende og mange forbedringer af brugervenligheden",
        "vector-action-addsection": "Nyt emne",
        "vector-action-delete": "Slet",
        "vector-action-move": "Flyt",
@@ -16,5 +17,6 @@
        "vector-view-edit": "Redigér",
        "vector-view-history": "Se historik",
        "vector-view-view": "Læs",
-       "vector-view-viewsource": "Se kilden"
+       "vector-view-viewsource": "Se kilden",
+       "vector-more-actions": "Mere"
 }
index 718b93c..fc01b32 100644 (file)
@@ -7,6 +7,9 @@
                ]
        },
        "skinname-vector": "Vektor",
+       "vector-skin-desc": "MonoBooki uuem versioon värskema väljanägemise ja mitme kasutajasõbralikuma täiendusega",
+       "vector.css": "/* Siin asuv kaskaadilaadistik puudutab kõiki Vektori-kujunduse kasutajaid. */",
+       "vector.js": "/* Siin asuv JavaScript laaditakse kõigi Vektori-kujunduse kasutajate jaoks. */",
        "vector-action-addsection": "Lisa teema",
        "vector-action-delete": "Kustuta",
        "vector-action-move": "Teisalda",
index 08a9023..887d86b 100644 (file)
@@ -6,6 +6,7 @@
                ]
        },
        "skinname-vector": "וקטור",
+       "vector-skin-desc": "גרסה מודרנית של מונובוק עם מראה רענן והרבה שיפורי שמישות",
        "vector.css": "/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Vector בלבד */",
        "vector.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Vector */",
        "vector-action-addsection": "הוספת נושא",
index 5b5f56b..6b68d3e 100644 (file)
@@ -16,5 +16,6 @@
        "vector-view-edit": "सम्पादन",
        "vector-view-history": "इतिहास देखें",
        "vector-view-view": "पढ़ें",
-       "vector-view-viewsource": "स्रोत देखें"
+       "vector-view-viewsource": "स्रोत देखें",
+       "vector-more-actions": "अधिक"
 }
index f8b322d..79e4601 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Teak",
                        "Vadgt",
-                       "Xelgen"
+                       "Xelgen",
+                       "Arman musikyan"
                ]
        },
        "skinname-vector": "Սովորական",
@@ -17,5 +18,6 @@
        "vector-view-edit": "Խմբագրել",
        "vector-view-history": "Դիտել պատմությունը",
        "vector-view-view": "Կարդալ",
-       "vector-view-viewsource": "Դիտել ելատեքստը"
+       "vector-view-viewsource": "Դիտել ելատեքստը",
+       "vector-more-actions": "Ավելին"
 }
index 817c75f..d83586d 100644 (file)
@@ -5,6 +5,7 @@
                        "Saluyot"
                ]
        },
+       "vector-skin-desc": "Modernno a bersion ti MonoBook nga addaan iti baro a langa ken adu kadagiti naserbi a panagpasayaat",
        "vector-action-addsection": "Agnayon ti topiko",
        "vector-action-delete": "Ikkaten",
        "vector-action-move": "Iyalis",
index 697d1eb..ccd43c5 100644 (file)
@@ -15,5 +15,6 @@
        "vector-view-edit": "Labot",
        "vector-view-history": "Hronoloģija",
        "vector-view-view": "Skatīt",
-       "vector-view-viewsource": "Aplūkot kodu"
+       "vector-view-viewsource": "Aplūkot kodu",
+       "vector-more-actions": "Vairāk"
 }
index 2795e44..73c8e05 100644 (file)
@@ -7,7 +7,9 @@
                ]
        },
        "skinname-vector": "Vector",
+       "vector-skin-desc": "Versi MonoBook yang moden dengan rupa yang segar dan banyak pembaikan kepada kegunaan.",
        "vector.css": "/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Vector */",
+       "vector.js": "/ * Sebarang JavaScript di sini akan dimuatkan untuk pengguna-pengguna yang menggunakan kulit Vector * /",
        "vector-action-addsection": "Buka topik",
        "vector-action-delete": "Hapus",
        "vector-action-move": "Pindah",
@@ -18,5 +20,6 @@
        "vector-view-edit": "Sunting",
        "vector-view-history": "Lihat sejarah",
        "vector-view-view": "Baca",
-       "vector-view-viewsource": "Lihat sumber"
+       "vector-view-viewsource": "Lihat sumber",
+       "vector-more-actions": "Lain"
 }
index 32c9f1a..3fab17f 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Chrisportelli"
+                       "Chrisportelli",
+                       "Leli Forte"
                ]
        },
        "vector-action-addsection": "Żid diskussjoni",
@@ -14,5 +15,6 @@
        "vector-view-edit": "Editja",
        "vector-view-history": "Ara l-kronoloġija",
        "vector-view-view": "Aqra",
-       "vector-view-viewsource": "Ara s-sors"
+       "vector-view-viewsource": "Ara s-sors",
+       "vector-more-actions": "Aktar"
 }
index e7876a6..271f4c7 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Andria",
                        "Marzedu",
-                       "Via maxima"
+                       "Via maxima",
+                       "Uharteko"
                ]
        },
        "vector-action-addsection": "Giunghe cuntierra",
@@ -12,9 +13,9 @@
        "vector-action-protect": "Ampara",
        "vector-action-undelete": "Recùpera",
        "vector-view-create": "Crea",
-       "vector-view-edit": "Acontza",
+       "vector-view-edit": "Càmbia",
        "vector-view-history": "Càstia istòria",
        "vector-view-view": "Leghe",
-       "vector-view-viewsource": "Càstia mitza",
+       "vector-view-viewsource": "Càstia testu codificadu",
        "vector-more-actions": "Prus"
 }
index 85e8574..cfacc3f 100644 (file)
@@ -6,6 +6,7 @@
                        "Yerpo"
                ]
        },
+       "vector-skin-desc": "Sodobna različica MonoBook s svežim videzom in mnogimi izboljšavami uporabnosti",
        "vector-action-addsection": "Dodaj temo",
        "vector-action-delete": "Izbriši",
        "vector-action-move": "Prestavi",
diff --git a/skins/Vector/skinStyles/jquery.tipsy.less b/skins/Vector/skinStyles/jquery.tipsy.less
new file mode 100644 (file)
index 0000000..0e0c8ec
--- /dev/null
@@ -0,0 +1,4 @@
+/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
+.tipsy {
+       font-size: 0.8em;
+}
diff --git a/skins/Vector/skinStyles/jquery.ui/images/close.png b/skins/Vector/skinStyles/jquery.ui/images/close.png
new file mode 100644 (file)
index 0000000..ef0dd9e
Binary files /dev/null and b/skins/Vector/skinStyles/jquery.ui/images/close.png differ
diff --git a/skins/Vector/skinStyles/jquery.ui/images/titlebar-fade.png b/skins/Vector/skinStyles/jquery.ui/images/titlebar-fade.png
new file mode 100644 (file)
index 0000000..12a80c8
Binary files /dev/null and b/skins/Vector/skinStyles/jquery.ui/images/titlebar-fade.png differ
diff --git a/skins/Vector/skinStyles/jquery.ui/images/ui-anim_basic_16x16.gif b/skins/Vector/skinStyles/jquery.ui/images/ui-anim_basic_16x16.gif
new file mode 100644 (file)
index 0000000..085ccae
Binary files /dev/null and b/skins/Vector/skinStyles/jquery.ui/images/ui-anim_basic_16x16.gif differ
diff --git a/skins/Vector/skinStyles/jquery.ui/images/ui-bg_flat_15_cd0a0a_40x100.png b/skins/Vector/skinStyles/jquery.ui/images/ui-bg_flat_15_cd0a0a_40x100.png
new file mode 100644 (file)
index 0000000..09de537
Binary files /dev/null and b/skins/Vector/skinStyles/jquery.ui/images/ui-bg_flat_15_cd0a0a_40x100.png differ
diff --git a/skins/Vector/skinStyles/jquery.ui/images/ui-bg_flat_70_000000_40x100.png b/skins/Vector/skinStyles/jquery.ui/images/ui-bg_flat_70_000000_40x100.png
new file mode 100644 (file)
index 0000000..c06dd56
Binary files /dev/null and b/skins/Vector/skinStyles/jquery.ui/images/ui-bg_flat_70_000000_40x100.png differ
diff --git a/skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png b/skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png
new file mode 100644 (file)
index 0000000..5308b46
Binary files /dev/null and b/skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png differ
diff --git a/skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png b/skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png
new file mode 100644 (file)
index 0000000..0c8997f
Binary files /dev/null and b/skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png differ
diff --git a/skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png b/skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png
new file mode 100644 (file)
index 0000000..3149255
Binary files /dev/null and b/skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png differ
diff --git a/skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_100_ffffff_1x100.png b/skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_100_ffffff_1x100.png
new file mode 100644 (file)
index 0000000..09b2376
Binary files /dev/null and b/skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_100_ffffff_1x100.png differ
diff --git a/skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_25_ffef8f_1x100.png b/skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_25_ffef8f_1x100.png
new file mode 100644 (file)
index 0000000..66627c1
Binary files /dev/null and b/skins/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_25_ffef8f_1x100.png differ
diff --git a/skins/Vector/skinStyles/jquery.ui/images/ui-bg_inset-hard_100_f0f0f0_1x100.png b/skins/Vector/skinStyles/jquery.ui/images/ui-bg_inset-hard_100_f0f0f0_1x100.png
new file mode 100644 (file)
index 0000000..ccb6dc0
Binary files /dev/null and b/skins/Vector/skinStyles/jquery.ui/images/ui-bg_inset-hard_100_f0f0f0_1x100.png differ
diff --git a/skins/Vector/skinStyles/jquery.ui/images/ui-icons_2694e8_256x240.png b/skins/Vector/skinStyles/jquery.ui/images/ui-icons_2694e8_256x240.png
new file mode 100644 (file)
index 0000000..998ac3b
Binary files /dev/null and b/skins/Vector/skinStyles/jquery.ui/images/ui-icons_2694e8_256x240.png differ
diff --git a/skins/Vector/skinStyles/jquery.ui/images/ui-icons_2e83ff_256x240.png b/skins/Vector/skinStyles/jquery.ui/images/ui-icons_2e83ff_256x240.png
new file mode 100644 (file)
index 0000000..84b601b
Binary files /dev/null and b/skins/Vector/skinStyles/jquery.ui/images/ui-icons_2e83ff_256x240.png differ
diff --git a/skins/Vector/skinStyles/jquery.ui/images/ui-icons_3d80b3_256x240.png b/skins/Vector/skinStyles/jquery.ui/images/ui-icons_3d80b3_256x240.png
new file mode 100644 (file)
index 0000000..ec129a8
Binary files /dev/null and b/skins/Vector/skinStyles/jquery.ui/images/ui-icons_3d80b3_256x240.png differ
diff --git a/skins/Vector/skinStyles/jquery.ui/images/ui-icons_666666_256x240.png b/skins/Vector/skinStyles/jquery.ui/images/ui-icons_666666_256x240.png
new file mode 100644 (file)
index 0000000..a32c57d
Binary files /dev/null and b/skins/Vector/skinStyles/jquery.ui/images/ui-icons_666666_256x240.png differ
diff --git a/skins/Vector/skinStyles/jquery.ui/images/ui-icons_72a7cf_256x240.png b/skins/Vector/skinStyles/jquery.ui/images/ui-icons_72a7cf_256x240.png
new file mode 100644 (file)
index 0000000..88fad1a
Binary files /dev/null and b/skins/Vector/skinStyles/jquery.ui/images/ui-icons_72a7cf_256x240.png differ
diff --git a/skins/Vector/skinStyles/jquery.ui/images/ui-icons_ffffff_256x240.png b/skins/Vector/skinStyles/jquery.ui/images/ui-icons_ffffff_256x240.png
new file mode 100644 (file)
index 0000000..29ba7d2
Binary files /dev/null and b/skins/Vector/skinStyles/jquery.ui/images/ui-icons_ffffff_256x240.png differ
diff --git a/skins/Vector/skinStyles/jquery.ui/jquery.ui.accordion.css b/skins/Vector/skinStyles/jquery.ui/jquery.ui.accordion.css
new file mode 100644 (file)
index 0000000..d429fd2
--- /dev/null
@@ -0,0 +1,16 @@
+/*!
+ * jQuery UI Accordion 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+.ui-accordion .ui-accordion-header { display: block; cursor: pointer; position: relative; margin-top: 2px; padding: .5em .5em .5em .7em; zoom: 1; }
+.ui-accordion .ui-accordion-icons { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-noicons { padding-left: .7em; }
+.ui-accordion .ui-accordion-icons .ui-accordion-icons { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; overflow: auto; zoom: 1; }
diff --git a/skins/Vector/skinStyles/jquery.ui/jquery.ui.autocomplete.css b/skins/Vector/skinStyles/jquery.ui/jquery.ui.autocomplete.css
new file mode 100644 (file)
index 0000000..da6de45
--- /dev/null
@@ -0,0 +1,40 @@
+/* Autocomplete
+----------------------------------*/
+.ui-autocomplete { position: absolute; cursor: default; }
+.ui-autocomplete-loading { /* @embed */ background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/* Menu
+----------------------------------*/
+.ui-menu {
+       list-style:none;
+       padding: 2px;
+       margin: 0;
+       display:block;
+       float: left;
+}
+.ui-menu .ui-menu {
+       margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+       margin:0;
+       padding: 0;
+       zoom: 1;
+       float: left;
+       clear: left;
+       width: 100%;
+}
+.ui-menu .ui-menu-item a {
+       text-decoration:none;
+       display:block;
+       padding:.2em .4em;
+       line-height:1.5;
+       zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+       font-weight: normal;
+       margin: -1px;
+}
diff --git a/skins/Vector/skinStyles/jquery.ui/jquery.ui.button.css b/skins/Vector/skinStyles/jquery.ui/jquery.ui.button.css
new file mode 100644 (file)
index 0000000..8c2286d
--- /dev/null
@@ -0,0 +1,347 @@
+/* Button
+----------------------------------*/
+
+.ui-button {
+       display: inline-block;
+       position: relative;
+       padding: 0;
+       margin-right: .1em;
+       text-decoration: none !important;
+       cursor: pointer;
+       text-align: center;
+       zoom: 1;
+       overflow: visible; /* the overflow property removes extra width in IE */
+}
+
+/*button text element */
+.ui-button .ui-button-text {
+       display: block;
+       line-height: 1.4;
+       text-shadow: 0 1px 1px #fff;
+}
+.ui-button-text-only .ui-button-text {
+       padding: 0.3em 1em 0.25em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+       padding: 0.3em;
+       text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+       padding: 0.3em 1em 0.25em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+       padding: 0.3em 2.1em 0.25em 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: 0.3em 1em;
+}
+
+/*button icon element(s) */
+.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-text-icon .ui-icon,
+.ui-button-icons-only .ui-icon {
+       position: absolute;
+       top: 50%;
+       margin-top: -9px;
+}
+.ui-button-icon-only .ui-icon {
+       left: 50%;
+       margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.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: 0.5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icon .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+       right: 0.5em;
+}
+
+/*button sets*/
+.ui-buttonset {
+       margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+       margin-left: 0;
+       margin-right: -.4em;
+}
+
+/* workarounds */
+button.ui-button::-moz-focus-inner {
+       border: 0;
+       padding: 0; /* reset extra padding in Firefox */
+}
+/* Disables the annoying dashed border Firefox puts on active buttons */
+body button.ui-button::-moz-focus-inner {
+       border: 0;
+}
+/* Give large buttons some extra padding */
+body .ui-button-large {
+       padding: 5px;
+}
+/* Use white icons for colored buttons */
+.ui-button-green .ui-icon,
+.ui-button-blue .ui-icon,
+.ui-button-red .ui-icon,
+.ui-button-orange .ui-icon {
+       /* @embed */
+       background-image: url(images/ui-icons_ffffff_256x240.png) !important;
+}
+
+/* Corner radius */
+/* This is normally handled in jquery.ui.theme.css, but in our case, the corner
+   styling of our buttons doesn't match our default widget corner styling */
+.ui-button.ui-corner-all,
+.ui-button.ui-corner-top,
+.ui-button.ui-corner-left,
+.ui-button.ui-corner-tl {
+       border-top-left-radius: 4px;
+}
+.ui-button.ui-corner-all,
+.ui-button.ui-corner-top,
+
+.ui-button.ui-corner-right,
+.ui-button.ui-corner-tr {
+       border-top-right-radius: 4px;
+}
+.ui-button.ui-corner-all,
+.ui-button.ui-corner-bottom,
+.ui-button.ui-corner-left,
+.ui-button.ui-corner-bl {
+       border-bottom-left-radius: 4px;
+}
+.ui-button.ui-corner-all,
+.ui-button.ui-corner-bottom,
+.ui-button.ui-corner-right,
+.ui-button.ui-corner-br {
+       border-bottom-right-radius: 4px;
+}
+
+body .ui-button {
+       color: #2779aa;
+       margin: 0.5em 0 0.5em 0.4em;
+       border: 1px solid #aaa !important;
+       background: #f0f0f0 !important;
+       background: -moz-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #fff 0%, #ddd 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#dddddd', GradientType=0); /* IE6-8 */
+       cursor: pointer;
+       font-size: 1em;
+       line-height: 1.4em;
+       width: auto;
+       overflow: visible;
+       box-shadow: 0 1px 3px rgba(0,0,0,.2);
+}
+
+body .ui-button-icon-only {
+       width: 2.2em;
+}
+
+body .ui-button-icons-only {
+       width: 3.4em;
+}
+
+body .ui-button:hover {
+       color: #2779aa;
+       border-color: #bbb !important;
+       background: #fff !important;
+       background: -moz-linear-gradient(top, #fff 0%, #eee 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #fff 0%, #eee 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #fff 0%, #eee 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #fff 0%, #eee 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #fff 0%, #eee 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0); /* IE6-8 */
+       box-shadow: 0 1px 3px rgba(0,0,0,.1);
+}
+body .ui-button:active,
+body .ui-button:focus {
+       border-color: #8ad !important;
+       box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
+}
+body .ui-button:active {
+       background: #e0e0e0 !important;
+       background: -moz-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #f0f0f0 0%, #d0d0d0 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f0f0f0', endColorstr='#d0d0d0', GradientType=0); /* IE6-8 */
+}
+
+/* Green buttons */
+body .ui-button-green,
+body .ui-button-green .ui-button-text {
+       color: white;
+       text-shadow: 0 -1px 1px #072;
+}
+body .ui-button.ui-button-green {
+       border-color: #294 !important;
+       background: #295 !important;
+       background: -moz-linear-gradient(top, #3c8 0%, #295 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #3c8 0%, #295 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #3c8 0%, #295 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #3c8 0%, #295 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #3c8 0%, #295 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33cc88', endColorstr='#229955', GradientType=0); /* IE6-8 */
+       box-shadow: 0 1px 3px rgba(0,0,0,.3);
+}
+body .ui-button.ui-button-green:hover {
+       background: #33a055 !important;
+       background: -moz-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #44d388 0%, #33a055 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#44d388', endColorstr='#33a055', GradientType=0); /* IE6-8 */
+       box-shadow: 0 1px 3px rgba(0,0,0,.25);
+}
+body .ui-button.ui-button-green:active,
+body .ui-button.ui-button-green:focus {
+       border-color: #172 !important;
+       box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+}
+body .ui-button.ui-button-green:active {
+       background: #338855 !important;
+       background: -moz-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #30c080 0%, #338855 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#30c080', endColorstr='#338855', GradientType=0); /* IE6-8 */
+}
+
+/* Blue buttons */
+body .ui-button-blue,
+body .ui-button-blue .ui-button-text {
+       color: white;
+       text-shadow: 0 -1px 1px #037;
+}
+body .ui-button.ui-button-blue {
+       border-color: #468 !important;
+       background: #36b !important;
+       background: -moz-linear-gradient(top, #48e 0%, #36b 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #48e 0%, #36b 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #48e 0%, #36b 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #48e 0%, #36b 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #48e 0%, #36b 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4488ee', endColorstr='#3366bb', GradientType=0); /* IE6-8 */
+       box-shadow: 0 1px 3px rgba(0,0,0,.35);
+}
+body .ui-button.ui-button-blue:hover {
+       background: #36c !important;
+       background: -moz-linear-gradient(top, #59e 0%, #36c 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #59e 0%, #36c 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #59e 0%, #36c 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #59e 0%, #36c 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #59e 0%, #36c 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5599ee', endColorstr='#3366cc', GradientType=0); /* IE6-8 */
+}
+body .ui-button.ui-button-blue:active,
+body .ui-button.ui-button-blue:focus {
+       border-color: #357 !important;
+       box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+}
+body .ui-button.ui-button-blue:active {
+       background: #3060a0 !important;
+       background: -moz-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #4080e0 0%, #3060a0 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4080e0', endColorstr='#3060a0', GradientType=0); /* IE6-8 */
+}
+
+/* Red buttons */
+body .ui-button-red,
+body .ui-button-red .ui-button-text {
+       color: white;
+       text-shadow: 0 -1px 1px #700;
+}
+body .ui-button.ui-button-red {
+       border-color: #944 !important;
+       background: #a22 !important;
+       background: -moz-linear-gradient(top, #d44 0%, #a22 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #d44 0%, #a22 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #d44 0%, #a22 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #d44 0%, #a22 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #d44 0%, #a22 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dd4444', endColorstr='#aa2222', GradientType=0); /* IE6-8 */
+       box-shadow: 0 1px 3px rgba(0,0,0,.35);
+}
+body .ui-button.ui-button-red:hover {
+       border-color: #a44 !important;
+       background: #b03333 !important;
+       background: -moz-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #ee4646 0%, #b03333 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee4646', endColorstr='#b03333', GradientType=0); /* IE6-8 */
+       box-shadow: 0 1px 3px rgba(0,0,0,.3);
+}
+body .ui-button.ui-button-red:active,
+body .ui-button.ui-button-red:focus {
+       border-color: #747 !important;
+       box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
+}
+body .ui-button.ui-button-red:active {
+       background: #952020 !important;
+       background: -moz-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #d04545 0%, #952020 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#d04545', endColorstr='#952020', GradientType=0); /* IE6-8 */
+}
+
+/* Disabled buttons */
+body .ui-button-green.disabled,
+body .ui-button-green.disabled:hover,
+body .ui-button-green.disabled:active,
+body .ui-button-green.disabled:focus,
+body .ui-button-blue.disabled,
+body .ui-button-blue.disabled:hover,
+body .ui-button-blue.disabled:active,
+body .ui-button-blue.disabled:focus,
+body .ui-button-red.disabled,
+body .ui-button-red.disabled:hover,
+body .ui-button-red.disabled:active,
+body .ui-button-red.disabled:focus,
+body .ui-button.disabled,
+body .ui-button.disabled:hover {
+       color: #aaa;
+       border-color: #ccc !important;
+       background: #eee !important;
+       background: -moz-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #f6f6f6 0%, #eee 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f6f6', endColorstr='#eeeeee', GradientType=0); /* IE6-8 */
+       box-shadow: 0 1px 3px rgba(0,0,0,0);
+}
+body .ui-button-green.disabled .ui-button-text,
+body .ui-button-blue.disabled .ui-button-text,
+body .ui-button-red.disabled .ui-button-text {
+       color: #aaa;
+       text-shadow: 0 1px 1px #fff;
+}
diff --git a/skins/Vector/skinStyles/jquery.ui/jquery.ui.core.css b/skins/Vector/skinStyles/jquery.ui/jquery.ui.core.css
new file mode 100644 (file)
index 0000000..2e088ca
--- /dev/null
@@ -0,0 +1,39 @@
+/*!
+ * jQuery UI CSS Framework 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 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: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); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
diff --git a/skins/Vector/skinStyles/jquery.ui/jquery.ui.datepicker.css b/skins/Vector/skinStyles/jquery.ui/jquery.ui.datepicker.css
new file mode 100644 (file)
index 0000000..871bf69
--- /dev/null
@@ -0,0 +1,61 @@
+/* Datepicker
+----------------------------------*/
+.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; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; padding:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .2em 0 0 0; padding: 0 .2em; border-top: 1px solid #DDDDDD; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; }
+
+/* RTL support */
+/* @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; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}
\ No newline at end of file
diff --git a/skins/Vector/skinStyles/jquery.ui/jquery.ui.dialog.css b/skins/Vector/skinStyles/jquery.ui/jquery.ui.dialog.css
new file mode 100644 (file)
index 0000000..cd85f14
--- /dev/null
@@ -0,0 +1,37 @@
+/* Dialog
+----------------------------------*/
+.ui-dialog { position: absolute; padding: 0; width: 300px; }
+.ui-dialog .ui-dialog-titlebar { padding: .75em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .75em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .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 */
+body .ui-dialog .ui-dialog-titlebar-close:hover {
+       text-decoration: none;
+}
+body .ui-dialog .ui-dialog-content .status-invalid input {
+       border: 2px solid red;
+       padding: 2px 1px;
+}
+body .ui-dialog .ui-dialog-titlebar {
+       padding: 0.9em 1.4em 0.6em !important;
+}
+body .ui-dialog .ui-widget-header {
+       /* @embed */
+       background: #f0f0f0 url(images/titlebar-fade.png) repeat-x scroll 50% 100% !important;
+}
+/* FIXME: Should just update the icon sprite if we're keeping this X */
+body .ui-dialog .ui-icon-closethick {
+       /* @embed */
+       background: url(images/close.png) no-repeat 50% 50% !important;
+}
+body .ui-dialog .ui-dialog-buttonpane {
+       margin-top: 0 !important;
+       padding:0.3em 1.4em 0.5em 1.4em !important;
+}
diff --git a/skins/Vector/skinStyles/jquery.ui/jquery.ui.progressbar.css b/skins/Vector/skinStyles/jquery.ui/jquery.ui.progressbar.css
new file mode 100644 (file)
index 0000000..bd7e403
--- /dev/null
@@ -0,0 +1,12 @@
+/*!
+ * jQuery UI Progressbar 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * 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/skins/Vector/skinStyles/jquery.ui/jquery.ui.resizable.css b/skins/Vector/skinStyles/jquery.ui/jquery.ui.resizable.css
new file mode 100644 (file)
index 0000000..f1bd7c5
--- /dev/null
@@ -0,0 +1,19 @@
+/* Resizable
+----------------------------------*/
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+/* @noflip */
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+/* @noflip */
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+/* @noflip */
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+/* @noflip */
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+/* @noflip */
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+/* @noflip */
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
\ No newline at end of file
diff --git a/skins/Vector/skinStyles/jquery.ui/jquery.ui.selectable.css b/skins/Vector/skinStyles/jquery.ui/jquery.ui.selectable.css
new file mode 100644 (file)
index 0000000..5854c41
--- /dev/null
@@ -0,0 +1,11 @@
+/*!
+ * jQuery UI Selectable 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * 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/skins/Vector/skinStyles/jquery.ui/jquery.ui.slider.css b/skins/Vector/skinStyles/jquery.ui/jquery.ui.slider.css
new file mode 100644 (file)
index 0000000..e579478
--- /dev/null
@@ -0,0 +1,25 @@
+/*!
+ * jQuery UI Slider 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * 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; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }
\ No newline at end of file
diff --git a/skins/Vector/skinStyles/jquery.ui/jquery.ui.tabs.css b/skins/Vector/skinStyles/jquery.ui/jquery.ui.tabs.css
new file mode 100644 (file)
index 0000000..11a000f
--- /dev/null
@@ -0,0 +1,18 @@
+/*!
+ * jQuery UI Tabs 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * 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: 0; margin: 1px .2em 0 0; border-bottom: 0; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-active { margin-bottom: -1px; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-active a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-tabs-loading a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
diff --git a/skins/Vector/skinStyles/jquery.ui/jquery.ui.theme.css b/skins/Vector/skinStyles/jquery.ui/jquery.ui.theme.css
new file mode 100644 (file)
index 0000000..6bde5d3
--- /dev/null
@@ -0,0 +1,246 @@
+
+
+/*
+* jQuery UI CSS Framework
+* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=sans-serif&fwDefault=normal&fsDefault=1.0em&cornerRadius=3px&bgColorHeader=ffffff&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=100&borderColorHeader=aed0ea&fcHeader=222222&iconColorHeader=72a7cf&bgColorContent=f2f5f7&bgTextureContent=04_highlight_hard.png&bgImgOpacityContent=100&borderColorContent=cccccc&fcContent=362b36&iconColorContent=72a7cf&bgColorDefault=d7ebf9&bgTextureDefault=04_highlight_hard.png&bgImgOpacityDefault=80&borderColorDefault=aed0ea&fcDefault=2779aa&iconColorDefault=3d80b3&bgColorHover=e4f1fb&bgTextureHover=03_highlight_soft.png&bgImgOpacityHover=100&borderColorHover=74b2e2&fcHover=0070a3&iconColorHover=2694e8&bgColorActive=f0f0f0&bgTextureActive=06_inset_hard.png&bgImgOpacityActive=100&borderColorActive=cccccc&fcActive=000000&iconColorActive=666666&bgColorHighlight=ffef8f&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=25&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=cd0a0a&bgTextureError=01_flat.png&bgImgOpacityError=15&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=000000&bgTextureOverlay=21_glow_ball.png&bgImgOpacityOverlay=100&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=70&opacityShadow=20&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
+*/
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: sans-serif; font-size: 0.8em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #cccccc; /* @embed */ background: #f2f5f7 url(images/ui-bg_highlight-hard_100_f2f5f7_1x100.png) 50% top repeat-x; color: #362b36; }
+.ui-widget-header { border-bottom: 1px solid #bbbbbb; line-height: 1em; /* @embed */ background: #ffffff url(images/ui-bg_highlight-soft_100_ffffff_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #aed0ea; /* @embed */ background: #d7ebf9 url(images/ui-bg_highlight-hard_80_d7ebf9_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #2779aa; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #2779aa; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #74b2e2; /* @embed */ background: #e4f1fb url(images/ui-bg_highlight-soft_100_e4f1fb_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #0070a3; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #0070a3; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #cccccc; background: #f0f0f0 /* @embed */ url(images/ui-bg_inset-hard_100_f0f0f0_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #000000; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #000000; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #f9dd34; background: #ffef8f /* @embed */ url(images/ui-bg_highlight-soft_25_ffef8f_1x100.png) 50% top repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #cd0a0a /* @embed */ url(images/ui-bg_flat_15_cd0a0a_40x100.png) 50% 50% repeat-x; color: #ffffff; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; }
+.ui-icon, .ui-widget-content .ui-icon, .ui-widget-header .ui-icon { /* @embed */ background-image: url(images/ui-icons_72a7cf_256x240.png); }
+.ui-state-default .ui-icon { /* @embed */ background-image: url(images/ui-icons_3d80b3_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon { /* @embed */ background-image: url(images/ui-icons_2694e8_256x240.png); }
+.ui-state-active .ui-icon { /* @embed */ background-image: url(images/ui-icons_666666_256x240.png); }
+.ui-state-highlight .ui-icon { /* @embed */ background-image: url(images/ui-icons_2e83ff_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon { /* @embed */ background-image: url(images/ui-icons_ffffff_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { border-top-left-radius: 0; }
+.ui-corner-tr { border-top-right-radius: 0; }
+.ui-corner-bl { border-bottom-left-radius: 0; }
+.ui-corner-br { border-bottom-right-radius: 0; }
+.ui-corner-top { border-top-left-radius: 0; border-top-right-radius: 0; }
+.ui-corner-bottom { border-bottom-left-radius: 0; border-bottom-right-radius: 0; }
+.ui-corner-right {  border-top-right-radius: 0; border-bottom-right-radius: 0; }
+.ui-corner-left { border-top-left-radius: 0; border-bottom-left-radius: 0; }
+.ui-corner-all { border-radius: 0; }
+
+/* Overlays */
+.ui-widget-overlay { background: #000000; opacity: .75;filter:Alpha(Opacity=75); }
+.ui-widget-shadow { margin: -7px 0 0 -7px; padding: 7px; /* @embed */ background: #000000 url(images/ui-bg_flat_70_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); border-radius: 8px; }
diff --git a/skins/Vector/skinStyles/mediawiki.notification.less b/skins/Vector/skinStyles/mediawiki.notification.less
new file mode 100644 (file)
index 0000000..55cfe76
--- /dev/null
@@ -0,0 +1,24 @@
+@import "../variables";
+
+/* mediawiki.notification */
+
+// This wrapper class is needed to ensure these rules have larger CSS
+// selector specificity than default styles
+.mediawiki {
+       .mw-notification-area {
+               font-size: 0.8em;
+       }
+
+       .mw-notification-area-layout {
+               top: 7em;
+       }
+
+       .mw-notification {
+               background-color: #fff;
+               background-color: rgba(255, 255, 255, 0.93);
+               padding: 0.75em 1.5em;
+               border: solid 1px @content-border-color;
+               border-radius: 0.75em;
+               box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
+       }
+}
diff --git a/skins/Vector/skinStyles/mediawiki.special.less b/skins/Vector/skinStyles/mediawiki.special.less
new file mode 100644 (file)
index 0000000..6af4b1e
--- /dev/null
@@ -0,0 +1,7 @@
+/**
+ * Adjusts for decreased margin-bottom for h2 elements inside #content div
+ * introduced in March / April 2014 typography update.
+ */
+table.mw-specialpages-table {
+       margin-top: 0;
+}
diff --git a/skins/Vector/skinStyles/mediawiki.special.preferences.less b/skins/Vector/skinStyles/mediawiki.special.preferences.less
new file mode 100644 (file)
index 0000000..592a64d
--- /dev/null
@@ -0,0 +1,114 @@
+@import "mediawiki.mixins";
+@import "../variables";
+
+/**
+ * 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.
+ */
+
+#preftoc {
+       /* Tabs */
+       width: 100%;
+       float: left;
+       clear: both;
+       margin: 0 !important;
+       padding: 0 !important;
+       .background-image('images/preferences/break.png');
+       background-position: bottom left;
+       background-repeat: no-repeat;
+
+       li {
+               /* Tab */
+               float: left;
+               margin: 0;
+               padding: 0;
+               padding-right: 1px;
+               height: 2.25em;
+               white-space: nowrap;
+               list-style-type: none;
+               list-style-image: none;
+               .background-image('images/preferences/break.png');
+               background-position: bottom right;
+               background-repeat: no-repeat;
+
+               /* Sadly, IE6 won't understand this */
+               &:first-child {
+                       margin-left: 1px;
+               }
+
+               &.selected {
+                       a {
+                               .background-image('images/preferences/fade.png');
+                               background-position: bottom;
+                               background-repeat: repeat-x;
+                               color: #333;
+                               text-decoration: none;
+                       }
+               }
+       }
+
+       a,
+       a:active {
+               display: inline-block;
+               position: relative;
+               color: @menu-link-color;
+               padding: 0.5em;
+               text-decoration: none;
+               background-image: none;
+               font-size: 0.9em;
+       }
+
+       a:hover,
+       a:focus {
+               text-decoration: underline;
+       }
+}
+
+#preferences {
+       float: left;
+       width: 100%;
+       margin: 0;
+       margin-top: -2px;
+       clear: both;
+       border: solid 1px #ccc;
+       background-color: #fafafa;
+
+       fieldset {
+               border: none;
+               border-top: solid 1px #ccc;
+
+               &.prefsection {
+                       border: none;
+                       padding: 0;
+                       margin: 1em;
+
+                       legend.mainLegend {
+                               display: none;
+                       }
+               }
+       }
+
+       legend {
+               color: #666;
+       }
+
+       td {
+               padding-left: 0.5em;
+               padding-right: 0.5em;
+       }
+
+       div.mw-prefs-buttons {
+               padding: 1em;
+
+               input {
+                       margin-right: 0.25em;
+               }
+       }
+}
+
+.htmlform-tip {
+       font-size: x-small;
+       padding: .2em 2em;
+       color: #666;
+}
diff --git a/skins/Vector/special.less b/skins/Vector/special.less
deleted file mode 100644 (file)
index 6af4b1e..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * Adjusts for decreased margin-bottom for h2 elements inside #content div
- * introduced in March / April 2014 typography update.
- */
-table.mw-specialpages-table {
-       margin-top: 0;
-}
diff --git a/skins/Vector/special.preferences.less b/skins/Vector/special.preferences.less
deleted file mode 100644 (file)
index a9b1006..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-@import "mediawiki.mixins";
-@import "variables";
-
-/**
- * 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.
- */
-
-#preftoc {
-       /* Tabs */
-       width: 100%;
-       float: left;
-       clear: both;
-       margin: 0 !important;
-       padding: 0 !important;
-       .background-image('images/preferences/break.png');
-       background-position: bottom left;
-       background-repeat: no-repeat;
-
-       li {
-               /* Tab */
-               float: left;
-               margin: 0;
-               padding: 0;
-               padding-right: 1px;
-               height: 2.25em;
-               white-space: nowrap;
-               list-style-type: none;
-               list-style-image: none;
-               .background-image('images/preferences/break.png');
-               background-position: bottom right;
-               background-repeat: no-repeat;
-
-               /* Sadly, IE6 won't understand this */
-               &:first-child {
-                       margin-left: 1px;
-               }
-
-               &.selected {
-                       a {
-                               .background-image('images/preferences/fade.png');
-                               background-position: bottom;
-                               background-repeat: repeat-x;
-                               color: #333;
-                               text-decoration: none;
-                       }
-               }
-       }
-
-       a,
-       a:active {
-               display: inline-block;
-               position: relative;
-               color: @menu-link-color;
-               padding: 0.5em;
-               text-decoration: none;
-               background-image: none;
-               font-size: 0.9em;
-       }
-
-       a:hover,
-       a:focus {
-               text-decoration: underline;
-       }
-}
-
-#preferences {
-       float: left;
-       width: 100%;
-       margin: 0;
-       margin-top: -2px;
-       clear: both;
-       border: solid 1px #ccc;
-       background-color: #fafafa;
-
-       fieldset {
-               border: none;
-               border-top: solid 1px #ccc;
-
-               &.prefsection {
-                       border: none;
-                       padding: 0;
-                       margin: 1em;
-
-                       legend.mainLegend {
-                               display: none;
-                       }
-               }
-       }
-
-       legend {
-               color: #666;
-       }
-
-       td {
-               padding-left: 0.5em;
-               padding-right: 0.5em;
-       }
-
-       div.mw-prefs-buttons {
-               padding: 1em;
-
-               input {
-                       margin-right: 0.25em;
-               }
-       }
-}
-
-.htmlform-tip {
-       font-size: x-small;
-       padding: .2em 2em;
-       color: #666;
-}
index 7b2cc40..392a2a6 100644 (file)
@@ -197,14 +197,18 @@ pre, code, tt, kbd, samp, .mw-code {
 }
 
 code {
+       color: black;
        background-color: #f9f9f9;
+       border: 1px solid #ddd;
+       border-radius: 2px;
+       padding: 1px 4px;
 }
 
 pre, .mw-code {
-       padding: 1em;
-       border: 1px solid #ddd;
        color: black;
        background-color: #f9f9f9;
+       border: 1px solid #ddd;
+       padding: 1em;
 }
 
 /* Tables */
index aedb6a9..17b2039 100644 (file)
        margin-left: 10em;
 }
 
+.config-skins-item {
+       /* Clearfix */
+       clear: left;
+       overflow: hidden;
+}
+
+.config-skins-item .config-input-check {
+       margin-left: 10em;
+       width: 20em;
+       float: left;
+}
+
+.config-skins-item .config-skins-use-as-default {
+       float: left;
+}
+
 .error {
        color: red;
        background-color: #fff;
index 5a8335d..17ec8c6 100644 (file)
@@ -386,60 +386,6 @@ p.mw-upload-editlicenses {
        text-align: right;
 }
 
-/**
- * OpenSearch ajax suggestions
- */
-.os-suggest {
-       overflow: auto;
-       overflow-x: hidden;
-       position: absolute;
-       top: 0;
-       left: 0;
-       width: 0;
-       background-color: white;
-       border-style: solid;
-       border-color: #AAAAAA;
-       border-width: 1px;
-       z-index: 99;
-       font-size: 95%;
-}
-
-table.os-suggest-results {
-       font-size: 95%;
-       cursor: pointer;
-       border: 0;
-       border-collapse: collapse;
-       width: 100%;
-}
-
-.os-suggest-result,
-.os-suggest-result-hl {
-       white-space: nowrap;
-       background-color: white;
-       color: black;
-       padding: 2px;
-}
-
-.os-suggest-result-hl,
-.os-suggest-result-hl-webkit {
-       background-color: #4C59A6;
-       color: white;
-}
-
-.os-suggest-toggle {
-       position: relative;
-       left: 1ex;
-       font-size: 65%;
-}
-
-.os-suggest-toggle-def {
-       position: absolute;
-       top: 0;
-       left: 0;
-       font-size: 65%;
-       visibility: hidden;
-}
-
 /* Page history styling */
 
 /* The auto-generated edit comments */
index 37cf68f..eee34de 100644 (file)
@@ -41,6 +41,7 @@ $wgAutoloadClasses += array(
        'MediaWikiPHPUnitCommand' => "$testDir/phpunit/MediaWikiPHPUnitCommand.php",
        'MediaWikiPHPUnitTestListener' => "$testDir/phpunit/MediaWikiPHPUnitTestListener.php",
        'MediaWikiLangTestCase' => "$testDir/phpunit/MediaWikiLangTestCase.php",
+       'MediaWikiPasswordTestCase' => "$testDir/phpunit/MediaWikiPasswordTestCase.php",
        'ResourceLoaderTestCase' => "$testDir/phpunit/ResourceLoaderTestCase.php",
        'ResourceLoaderTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php",
        'ResourceLoaderFileModuleTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php",
@@ -61,6 +62,9 @@ $wgAutoloadClasses += array(
        'UserWrapper' => "$testDir/phpunit/includes/api/UserWrapper.php",
        'RandomImageGenerator' => "$testDir/phpunit/includes/api/RandomImageGenerator.php",
 
+       # tests/phpunit/includes/changes
+       'TestRecentChangesHelper' => "$testDir/phpunit/includes/changes/TestRecentChangesHelper.php",
+
        # tests/phpunit/includes/content
        'DummyContentHandlerForTesting' => "$testDir/phpunit/includes/content/ContentHandlerTest.php",
        'DummyContentForTesting' => "$testDir/phpunit/includes/content/ContentHandlerTest.php",
index 8921fb6..2265762 100644 (file)
@@ -13,11 +13,11 @@ Install:
 
 Ruby 1.9.3 or higher is required
 Firefox browser is required
-
-cd /tests/browser
-gem update --system
-gem install bundler
-bundle install
+::
+ cd /tests/browser
+ gem update --system
+ gem install bundler
+ bundle install
 
 Run the tests:
 
index 69fda8d..59c18a8 100644 (file)
@@ -7,7 +7,7 @@ module.exports = function ( grunt ) {
        grunt.loadNpmTasks( 'grunt-contrib-jshint' );
        grunt.loadNpmTasks( 'grunt-contrib-watch' );
        grunt.loadNpmTasks( 'grunt-banana-checker' );
-       grunt.loadNpmTasks( 'grunt-jscs-checker' );
+       grunt.loadNpmTasks( 'grunt-jscs' );
        grunt.loadNpmTasks( 'grunt-jsonlint' );
 
        grunt.file.setBase(  __dirname + '/../..' );
index a398596..386f488 100644 (file)
@@ -9,7 +9,7 @@
     "grunt-contrib-jshint": "0.10.0",
     "grunt-contrib-watch": "0.6.1",
     "grunt-banana-checker": "0.1.0",
-    "grunt-jscs-checker": "0.4.4",
+    "grunt-jscs": "0.6.1",
     "grunt-jsonlint": "1.0.4"
   }
 }
index 24c5aba..e76b9df 100644 (file)
@@ -148,7 +148,7 @@ class ParserTest {
                global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc,
                        $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
                        $wgExtraNamespaces, $wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo,
-                       $wgExtraInterlanguageLinkPrefixes,
+                       $wgExtraInterlanguageLinkPrefixes, $wgLocalInterwikis,
                        $parserMemc, $wgThumbnailScriptPath, $wgScriptPath,
                        $wgArticlePath, $wgScript, $wgStylePath, $wgExtensionAssetsPath,
                        $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType, $wgLockManagers;
@@ -208,7 +208,6 @@ class ParserTest {
                $messageMemc = wfGetMessageCacheStorage();
                $parserMemc = wfGetParserCacheStorage();
 
-               // $wgContLang = new StubContLang;
                $wgUser = new User;
                $context = new RequestContext;
                $wgLang = $context->getLanguage();
@@ -219,11 +218,12 @@ class ParserTest {
                if ( $wgStyleDirectory === false ) {
                        $wgStyleDirectory = "$IP/skins";
                }
+
+               self::setupInterwikis();
+               $wgLocalInterwikis = array( 'local', 'mi' );
                // "extra language links"
                // see https://gerrit.wikimedia.org/r/111390
                array_push( $wgExtraInterlanguageLinkPrefixes, 'mul' );
-
-               self::setupInterwikis();
        }
 
        /**
@@ -240,6 +240,11 @@ class ParserTest {
                # for testing inter-language links
                Hooks::register( 'InterwikiLoadPrefix', function ( $prefix, &$iwData ) {
                        static $testInterwikis = array(
+                               'local' => array(
+                                       'iw_url' => 'http://doesnt.matter.org/$1',
+                                       'iw_api' => '',
+                                       'iw_wikiid' => '',
+                                       'iw_local' => 0 ),
                                'wikipedia' => array(
                                        'iw_url' => 'http://en.wikipedia.org/wiki/$1',
                                        'iw_api' => '',
@@ -275,6 +280,11 @@ class ParserTest {
                                        'iw_api' => '',
                                        'iw_wikiid' => '',
                                        'iw_local' => 1 ),
+                               'mi' => array(
+                                       'iw_url' => 'http://mi.wikipedia.org/wiki/$1',
+                                       'iw_api' => '',
+                                       'iw_wikiid' => '',
+                                       'iw_local' => 1 ),
                                'mul' => array(
                                        'iw_url' => 'http://wikisource.org/wiki/$1',
                                        'iw_api' => '',
@@ -723,11 +733,11 @@ class ParserTest {
 
                if ( preg_match_all( $regex, $instring, $matches, PREG_SET_ORDER ) ) {
                        foreach ( $matches as $bits ) {
-                               $key = strtolower( $bits[ 'k' ] );
-                               if ( !isset( $bits[ 'v' ] ) ) {
+                               $key = strtolower( $bits['k'] );
+                               if ( !isset( $bits['v'] ) ) {
                                        $opts[$key] = true;
                                } else {
-                                       preg_match_all( $valueregex, $bits[ 'v' ], $vmatches );
+                                       preg_match_all( $valueregex, $bits['v'], $vmatches );
                                        $opts[$key] = array_map( array( $this, 'cleanupOption' ), $vmatches[0] );
                                        if ( count( $opts[$key] ) == 1 ) {
                                                $opts[$key] = $opts[$key][0];
index 4a3889d..62e160b 100644 (file)
@@ -6392,6 +6392,44 @@ parsoid
 <p data-parsoid='{}'><a rel="mw:ExtLink" href="http://en.wikipedia.org/wiki/Foo" data-parsoid='{"stx":"piped","a":{"href":"http://en.wikipedia.org/wiki/Foo"},"sa":{"href":"wikipedia:Foo"},"isIW":true,"tail":"r"}'>Bar</a></p>
 !! end
 
+!! test
+Local interwiki link
+!! wikitext
+[[local:Template:Foo]]
+!! html
+<p><a href="/wiki/Template:Foo" title="Template:Foo">local:Template:Foo</a>
+</p>
+!! end
+
+!! test
+Local interwiki link: self-link to current page
+!! options
+title=[[Main Page]]
+!! wikitext
+[[local:Main Page]]
+!! html
+<p><strong class="selflink">local:Main Page</strong>
+</p>
+!! end
+
+!! test
+Local interwiki link: prefix only (bug 64167)
+!! wikitext
+[[local:]]
+!! html
+<p><a href="/wiki/Main_Page" title="Main Page">local:</a>
+</p>
+!! end
+
+!! test
+Local interwiki link: with additional interwiki prefix (bug 61357)
+!! wikitext
+[[local:meatball:Hello]]
+!! html
+<p><a href="http://www.usemod.com/cgi-bin/mb.pl?Hello" class="extiw" title="meatball:Hello">local:meatball:Hello</a>
+</p>
+!! end
+
 ###
 ### Interlanguage links
 ### Language links (so that searching for '### language' matches..)
@@ -6410,6 +6448,19 @@ Blah blah blah
 <link rel="mw:PageProp/Language" href="//zh.wikipedia.org/wiki/Chinese"/></p>
 !! end
 
+!! test
+Interlanguage link with spacing
+!! wikitext
+Blah blah blah
+[[   zh  :    Chinese     ]]
+!! html/php
+<p>Blah blah blah
+</p>
+!! html/parsoid
+<p>Blah blah blah
+<link rel="mw:PageProp/Language" href="//zh.wikipedia.org/wiki/Chinese"/></p>
+!! end
+
 !! test
 Double interlanguage link
 !! wikitext
@@ -6538,6 +6589,28 @@ parsoid
 <p><a rel="mw:WikiLink" href="./Foo" data-parsoid='{"stx":"simple","a":{"href":"./Foo"},"sa":{"href":"en:Foo"}}'>Foo</a></p>
 !! end
 
+!! test
+Interlanguage link with preceding local interwiki link (bug 68085)
+!! wikitext
+Blah blah blah
+[[local:es:Spanish]]
+!! html
+<p>Blah blah blah
+<a href="http://es.wikipedia.org/wiki/Spanish" class="extiw" title="es:Spanish">local:es:Spanish</a>
+</p>
+!! end
+
+!! test
+Looks like an interlanguage link, but is actually a local interwiki
+!! wikitext
+Blah blah blah
+[[mi:Template:Foo]]
+!! html
+<p>Blah blah blah
+<a href="/wiki/Template:Foo" title="Template:Foo">mi:Template:Foo</a>
+</p>
+!! end
+
 ###
 ### Redirects, Parsoid-only
 ###
index d7e8b86..9965c43 100644 (file)
@@ -24,7 +24,8 @@
  * @ingroup Testing
  */
 
-$otions = array( 'quick', 'color', 'quiet', 'help', 'show-output', 'record', 'run-disabled', 'run-parsoid' );
+$otions = array( 'quick', 'color', 'quiet', 'help', 'show-output',
+       'record', 'run-disabled', 'run-parsoid' );
 $optionsWithArgs = array( 'regex', 'filter', 'seed', 'setversion' );
 
 require_once __DIR__ . '/../maintenance/commandLine.inc';
index f67fe02..6ebbcb2 100644 (file)
@@ -23,14 +23,8 @@ class LessFileCompilationTest extends MediaWikiTestCase {
         * @param string $file
         * @param ResourceLoaderModule $module The ResourceLoader module that
         *   contains the file
-        * @throws PHPUnit_Framework_Exception When the file parameter isn't a
-        *   string or readable file
         */
        public function __construct( $file, ResourceLoaderModule $module ) {
-               if ( !is_string( $file ) || !is_file( $file ) || !is_readable( $file ) ) {
-                       throw PHPUnit_Util_InvalidArgumentHelper::factory( 1, 'readable file' );
-               }
-
                parent::__construct( 'testLessFileCompilation' );
 
                $this->file = $file;
@@ -38,6 +32,12 @@ class LessFileCompilationTest extends MediaWikiTestCase {
        }
 
        public function testLessFileCompilation() {
+               $thisString = $this->toString();
+               $this->assertTrue(
+                       is_string( $this->file ) && is_file( $this->file ) && is_readable( $this->file ),
+                       "$thisString must refer to a readable file"
+               );
+
                $compiler = ResourceLoader::getLessCompiler();
                $this->assertNotNull( $compiler->compileFile( $this->file ) );
        }
index 9eeb251..8c761b9 100644 (file)
@@ -77,8 +77,6 @@ class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
         * @param PHPUnit_Framework_Test $test
         * @param Exception $e
         * @param float $time
-        *
-        * @since Method available since Release 3.0.0
         */
        public function addSkippedTest( PHPUnit_Framework_Test $test, Exception $e, $time ) {
                wfDebugLog(
@@ -91,7 +89,6 @@ class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
         * A test suite started.
         *
         * @param PHPUnit_Framework_TestSuite $suite
-        * @since Method available since Release 2.2.0
         */
        public function startTestSuite( PHPUnit_Framework_TestSuite $suite ) {
                wfDebugLog( $this->logChannel, 'START suite ' . $suite->getName() );
@@ -101,7 +98,6 @@ class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
         * A test suite ended.
         *
         * @param PHPUnit_Framework_TestSuite $suite
-        * @since Method available since Release 2.2.0
         */
        public function endTestSuite( PHPUnit_Framework_TestSuite $suite ) {
                wfDebugLog( $this->logChannel, 'END suite ' . $suite->getName() );
diff --git a/tests/phpunit/MediaWikiPasswordTestCase.php b/tests/phpunit/MediaWikiPasswordTestCase.php
new file mode 100644 (file)
index 0000000..edf944b
--- /dev/null
@@ -0,0 +1,88 @@
+<?php
+/**
+ * Testing framework for the password hashes
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @since 1.24
+ */
+abstract class MediaWikiPasswordTestCase extends MediaWikiTestCase {
+       /**
+        * @var PasswordFactory
+        */
+       protected $passwordFactory;
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->passwordFactory = new PasswordFactory();
+               foreach ( $this->getTypeConfigs() as $type => $config ) {
+                       $this->passwordFactory->register( $type, $config );
+               }
+       }
+
+       /**
+        * Return an array of configs to be used for this class's password type.
+        *
+        * @return array[]
+        */
+       abstract protected function getTypeConfigs();
+
+       /**
+        * An array of tests in the form of (bool, string, string), where the first
+        * element is whether the second parameter (a password hash) and the third
+        * parameter (a password) should match.
+        *
+        * @return array
+        */
+       abstract public function providePasswordTests();
+
+       /**
+        * @dataProvider providePasswordTests
+        */
+       public function testHashing( $shouldMatch, $hash, $password ) {
+               $hash = $this->passwordFactory->newFromCiphertext( $hash );
+               $password = $this->passwordFactory->newFromPlaintext( $password, $hash );
+               $this->assertSame( $shouldMatch, $hash->equals( $password ) );
+       }
+
+       /**
+        * @dataProvider providePasswordTests
+        */
+       public function testStringSerialization( $shouldMatch, $hash, $password ) {
+               $hashObj = $this->passwordFactory->newFromCiphertext( $hash );
+               $serialized = $hashObj->toString();
+               $unserialized = $this->passwordFactory->newFromCiphertext( $serialized );
+               $this->assertTrue( $hashObj->equals( $unserialized ) );
+       }
+
+       /**
+        * @dataProvider providePasswordTests
+        * @covers InvalidPassword::equals
+        * @covers InvalidPassword::toString
+        */
+       public function testInvalidUnequalNormal( $shouldMatch, $hash, $password ) {
+               $invalid = $this->passwordFactory->newFromCiphertext( null );
+               $normal = $this->passwordFactory->newFromCiphertext( $hash );
+
+               $this->assertFalse( $invalid->equals( $normal ) );
+               $this->assertFalse( $normal->equals( $invalid ) );
+       }
+}
index 3015895..02330a4 100644 (file)
@@ -507,10 +507,10 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         *
         * @since 1.21
         *
-        * @note: the original table prefix is stored in self::$oldTablePrefix. This is used
+        * @note the original table prefix is stored in self::$oldTablePrefix. This is used
         * by teardownTestDB() to return the wiki to using the original table set.
         *
-        * @note: this method only works when first called. Subsequent calls have no effect,
+        * @note this method only works when first called. Subsequent calls have no effect,
         * even if using different parameters.
         *
         * @param DatabaseBase $db The database connection
index 3e5ebb7..7bdb1ca 100644 (file)
@@ -24,14 +24,14 @@ class ArrayUtilsTest extends MediaWikiTestCase {
 
        function provideFindLowerBound() {
                $self = $this;
-               $indexValueCallback = function( $size ) use ( $self ) {
-                       return function( $val ) use ( $self, $size ) {
+               $indexValueCallback = function ( $size ) use ( $self ) {
+                       return function ( $val ) use ( $self, $size ) {
                                $self->assertTrue( $val >= 0 );
                                $self->assertTrue( $val < $size );
                                return $val;
                        };
                };
-               $comparisonCallback = function( $a, $b ) {
+               $comparisonCallback = function ( $a, $b ) {
                        return $a - $b;
                };
 
index 6b8bf27..6537364 100644 (file)
@@ -82,7 +82,7 @@ class EditPageTest extends MediaWikiLangTestCase {
         *              * wpMinorEdit: mark as minor edit
         *              * wpWatchthis: whether to watch the page
         * @param int|null $expectedCode The expected result code (EditPage::AS_XXX constants).
-        *                  Set to null to skip the check. Defaults to EditPage::AS_OK.
+        *                  Set to null to skip the check.
         * @param string|null $expectedText The text expected to be on the page after the edit.
         *                  Set to null to skip the check.
         * @param string|null $message An optional message to show along with any error message.
@@ -90,7 +90,7 @@ class EditPageTest extends MediaWikiLangTestCase {
         * @return WikiPage The page that was just edited, useful for getting the edit's rev_id, etc.
         */
        protected function assertEdit( $title, $baseText, $user = null, array $edit,
-               $expectedCode = EditPage::AS_OK, $expectedText = null, $message = null
+               $expectedCode = null, $expectedText = null, $message = null
        ) {
                if ( is_string( $title ) ) {
                        $ns = $this->getDefaultWikitextNS();
@@ -265,6 +265,19 @@ class EditPageTest extends MediaWikiLangTestCase {
                        null,
                        "expected MediaWiki: page not being created if text equals default message"
                );
+
+               $this->assertEdit(
+                       'EditPageTest_testCreatePage',
+                       null,
+                       null,
+                       array(
+                               'wpTextbox1' => "",
+                               'wpIgnoreBlankArticle' => 1,
+                       ),
+                       EditPage::AS_SUCCESS_NEW_ARTICLE,
+                       "",
+                       "expected empty article being created"
+               )->doDeleteArticleReal( 'EditPageTest_testCreatePage' );
        }
 
        public function testUpdatePage() {
index 91b531d..84799ff 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @group GlobalFunctions
+ */
 class GlobalTest extends MediaWikiTestCase {
        protected function setUp() {
                parent::setUp();
@@ -718,5 +721,5 @@ class GlobalTest extends MediaWikiTestCase {
                        ),
                );
        }
-       /* @TODO many more! */
+       /* @todo many more! */
 }
index cf891e7..9588ffd 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 /**
+ * @group GlobalFunctions
  * @group Database
  */
 class GlobalWithDBTest extends MediaWikiTestCase {
index 9bb7487..13f49f7 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 /**
+ * @group GlobalFunctions
  * @covers ::wfAssembleUrl
  */
 class WfAssembleUrlTest extends MediaWikiTestCase {
index a01c0d4..166d641 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 /**
+ * @group GlobalFunctions
  * @covers ::wfBCP47
  */
 class WfBCP47Test extends MediaWikiTestCase {
@@ -96,7 +97,7 @@ class WfBCP47Test extends MediaWikiTestCase {
                         *  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' ),
+                        *  array( 'az-arab-x-aze-derbend', 'az-Arab-x-AZE-derbend' ),
                         */
 
                        # Private use registry values:
index 79dd91d..dd4f9cc 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 /**
+ * @group GlobalFunctions
  * @covers ::wfBaseConvert
  */
 class WfBaseConvertTest extends MediaWikiTestCase {
index 516c1b9..705730a 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 /**
+ * @group GlobalFunctions
  * @covers ::wfBaseName
  */
 class WfBaseNameTest extends MediaWikiTestCase {
index 9effc30..a69defb 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 /**
+ * @group GlobalFunctions
  * @covers ::wfExpandUrl
  */
 class WfExpandUrlTest extends MediaWikiTestCase {
index bdb3044..bb2b33f 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 /**
+ * @group GlobalFunctions
  * @covers ::wfGetCaller
  */
 class WfGetCallerTest extends MediaWikiTestCase {
index af834f8..232fa92 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 /**
+ * @group GlobalFunctions
  * @covers ::wfParseUrl
  */
 class WfParseUrlTest extends MediaWikiTestCase {
index 238a2c9..05155db 100644 (file)
@@ -1,5 +1,7 @@
 <?php
+
 /**
+ * @group GlobalFunctions
  *@covers ::wfRemoveDotSegments
  */
 class WfRemoveDotSegmentsTest extends MediaWikiTestCase {
diff --git a/tests/phpunit/includes/GlobalFunctions/wfShellExecTest.php b/tests/phpunit/includes/GlobalFunctions/wfShellExecTest.php
new file mode 100644 (file)
index 0000000..fcd26f5
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * @group GlobalFunctions
+ * @covers ::wfShellExec
+ */
+class WfShellExecTest extends MediaWikiTestCase {
+       public function testBug67870() {
+               $command = wfIsWindows()
+                       // 333 = 331 + CRLF
+                       ? ( 'for /l %i in (1, 1, 1001) do @echo ' . str_repeat( '*', 331 ) )
+                       : 'printf "%-333333s" "*"';
+
+               // Test several times because it involves a race condition that may randomly succeed or fail
+               for ( $i = 0; $i < 10; $i++ ) {
+                       $output = wfShellExec( $command );
+                       $this->assertEquals( 333333, strlen( $output ) );
+               }
+       }
+}
index aadec87..67284d2 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 /**
+ * @group GlobalFunctions
  * @covers ::wfShorthandToInteger
  */
 class WfShorthandToIntegerTest extends MediaWikiTestCase {
index fac9b88..bea496c 100644 (file)
@@ -1,5 +1,7 @@
 <?php
-/*
+
+/**
+ * @group GlobalFunctions
  * @covers ::wfTimestamp
  */
 class WfTimestampTest extends MediaWikiTestCase {
@@ -92,7 +94,7 @@ class WfTimestampTest extends MediaWikiTestCase {
                if ( substr( $output, 0, 1 ) === '/' ) {
                        // Bug 64946: Day of the week calculations for very old
                        // timestamps varies from system to system.
-                       $this->assertRegExp(  $output, $timestamp, $message );
+                       $this->assertRegExp( $output, $timestamp, $message );
                } else {
                        $this->assertEquals( $output, $timestamp, $message );
                }
index 783b985..d11668b 100644 (file)
@@ -1,6 +1,9 @@
 <?php
+
 /**
  * The function only need a string parameter and might react to IIS7.0
+ *
+ * @group GlobalFunctions
  * @covers ::wfUrlencode
  */
 class WfUrlencodeTest extends MediaWikiTestCase {
index c1b637b..ae5c9c4 100644 (file)
@@ -40,16 +40,16 @@ class HtmlFormatterTest extends MediaWikiTestCase {
        }
 
        public function getHtmlData() {
-               $removeImages = function( HtmlFormatter $f ) {
+               $removeImages = function ( HtmlFormatter $f ) {
                        $f->setRemoveMedia();
                };
-               $removeTags = function( HtmlFormatter $f ) {
+               $removeTags = function ( HtmlFormatter $f ) {
                        $f->remove( array( 'table', '.foo', '#bar', 'div.baz' ) );
                };
-               $flattenSomeStuff = function( HtmlFormatter $f ) {
+               $flattenSomeStuff = function ( HtmlFormatter $f ) {
                        $f->flatten( array( 's', 'div' ) );
                };
-               $flattenEverything = function( HtmlFormatter $f ) {
+               $flattenEverything = function ( HtmlFormatter $f ) {
                        $f->flattenAllTags();
                };
                return array(
index c561e70..d4d9551 100644 (file)
@@ -707,6 +707,63 @@ class HtmlTest extends MediaWikiTestCase {
                        )
                );
        }
+
+       public function testWrapperInput() {
+               $this->assertEquals(
+                       '<input type=radio value=testval name=testname>',
+                       Html::input( 'testname', 'testval', 'radio' ),
+                       'Input wrapper with type and value.'
+               );
+               $this->assertEquals(
+                       '<input name=testname>',
+                       Html::input( 'testname' ),
+                       'Input wrapper with all default values.'
+               );
+       }
+
+       public function testWrapperCheck() {
+               $this->assertEquals(
+                       '<input type=checkbox value=1 name=testname>',
+                       Html::check( 'testname' ),
+                       'Checkbox wrapper unchecked.'
+               );
+               $this->assertEquals(
+                       '<input checked type=checkbox value=1 name=testname>',
+                       Html::check( 'testname', true ),
+                       'Checkbox wrapper checked.'
+               );
+               $this->assertEquals(
+                       '<input type=checkbox value=testval name=testname>',
+                       Html::check( 'testname', false, array( 'value' => 'testval' ) ),
+                       'Checkbox wrapper with a value override.'
+               );
+       }
+
+       public function testWrapperRadio() {
+               $this->assertEquals(
+                       '<input type=radio value=1 name=testname>',
+                       Html::radio( 'testname' ),
+                       'Radio wrapper unchecked.'
+               );
+               $this->assertEquals(
+                       '<input checked type=radio value=1 name=testname>',
+                       Html::radio( 'testname', true ),
+                       'Radio wrapper checked.'
+               );
+               $this->assertEquals(
+                       '<input type=radio value=testval name=testname>',
+                       Html::radio( 'testname', false, array( 'value' => 'testval' ) ),
+                       'Radio wrapper with a value override.'
+               );
+       }
+
+       public function testWrapperLabel() {
+               $this->assertEquals(
+                       '<label for=testid>testlabel</label>',
+                       Html::label( 'testlabel', 'testid' ),
+                       'Label wrapper'
+               );
+       }
 }
 
 class HtmlTestValue {
index 8895403..f82a756 100644 (file)
@@ -26,8 +26,8 @@ class ImportTest extends MediaWikiLangTestCase {
        public function testHandlePageContainsRedirect( $xml, $redirectTitle ) {
                $source = $this->getInputStreamSource( $xml );
 
-               $redirect = NULL;
-               $callback = function( $title, $origTitle, $revCount, $sRevCount, $pageInfo ) use ( &$redirect ) {
+               $redirect = null;
+               $callback = function ( $title, $origTitle, $revCount, $sRevCount, $pageInfo ) use ( &$redirect ) {
                        if ( array_key_exists( 'redirect', $pageInfo ) ) {
                                $redirect = $pageInfo['redirect'];
                        }
@@ -92,7 +92,7 @@ EOF
 </mediawiki>
 EOF
                        ,
-                               NULL
+                               null
                        ),
                );
        }
index a5dac8d..02f6b2a 100644 (file)
@@ -215,8 +215,8 @@ class LinksUpdateTest extends MediaWikiTestCase {
                $po->setProperty( "bool", true );
                $expected[] = array( "bool", true );
 
-               $po->setProperty( "float", 4.0 + 1.0/4.0 );
-               $expected[] = array( "float", 4.0 + 1.0/4.0 );
+               $po->setProperty( "float", 4.0 + 1.0 / 4.0 );
+               $expected[] = array( "float", 4.0 + 1.0 / 4.0 );
 
                $po->setProperty( "int", -7 );
                $expected[] = array( "int", -7 );
index 350e83f..311350b 100644 (file)
@@ -9,7 +9,7 @@
  * Test class for MWNamespace.
  * Generated by PHPUnit on 2011-02-20 at 21:01:55.
  * @todo covers tags
- * @FIXME this test file is a mess
+ * @todo FIXME: this test file is a mess
  *
  */
 class MWNamespaceTest extends MediaWikiTestCase {
index 7db985b..6a36b4b 100644 (file)
@@ -119,7 +119,8 @@ class MessageTest extends MediaWikiLangTestCase {
         */
        public function testInLanguage() {
                $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inLanguage( 'en' )->text() );
-               $this->assertEquals( 'Заглавная страница', wfMessage( 'mainpage' )->inLanguage( 'ru' )->text() );
+               $this->assertEquals( 'Заглавная страница',
+                       wfMessage( 'mainpage' )->inLanguage( 'ru' )->text() );
 
                // NOTE: make sure internal caching of the message text is reset appropriately
                $msg = wfMessage( 'mainpage' );
index a164ff9..2937790 100644 (file)
@@ -30,7 +30,8 @@ class MimeMagicTest extends MediaWikiTestCase {
                        array( 'tsv', 'text/plain', 'text/tab-separated-values' ),
                        array( 'json', 'text/plain', 'application/json' ),
                        array( 'foo', 'application/x-opc+zip', 'application/zip' ),
-                       array( 'docx', 'application/x-opc+zip', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' ),
+                       array( 'docx', 'application/x-opc+zip',
+                               'application/vnd.openxmlformats-officedocument.wordprocessingml.document' ),
                        array( 'djvu', 'image/x-djvu', 'image/vnd.djvu' ),
                        array( 'wav', 'audio/wav', 'audio/wav' ),
                );
index 5fee505..2cfdfcd 100644 (file)
@@ -38,7 +38,7 @@ class OutputPageTest extends MediaWikiTestCase {
                }
 
                $fauxRequest = new FauxRequest( $queryData, false );
-               $this->setMWGlobals( array(
+               $this->setMwGlobals( array(
                        'wgRequest' => $fauxRequest,
                ) );
 
@@ -179,7 +179,7 @@ mw.loader.implement("test.quux",function($,jQuery){mw.test.baz({token:123});},{"
         * @dataProvider provideMakeResourceLoaderLink
         * @covers OutputPage::makeResourceLoaderLink
         */
-       public function testMakeResourceLoaderLink( $args, $expectedHtml) {
+       public function testMakeResourceLoaderLink( $args, $expectedHtml ) {
                $this->setMwGlobals( array(
                        'wgResourceLoaderDebug' => false,
                        'wgResourceLoaderUseESI' => true,
@@ -195,23 +195,24 @@ mw.loader.implement("test.quux",function($,jQuery){mw.test.baz({token:123});},{"
                $method = $class->getMethod( 'makeResourceLoaderLink' );
                $method->setAccessible( true );
                $ctx = new RequestContext();
+               $ctx->setSkin( Skin::newFromKey( 'vector' ) );
                $ctx->setLanguage( 'en' );
                $out = new OutputPage( $ctx );
                $rl = $out->getResourceLoader();
                $rl->register( array(
-                       'test.foo' => new ResourceLoaderTestModule(array(
+                       'test.foo' => new ResourceLoaderTestModule( array(
                                'script' => 'mw.test.foo( { a: true } );',
                                'styles' => '.mw-test-foo { content: "style"; }',
                        )),
-                       'test.bar' => new ResourceLoaderTestModule(array(
+                       'test.bar' => new ResourceLoaderTestModule( array(
                                'script' => 'mw.test.bar( { a: true } );',
                                'styles' => '.mw-test-bar { content: "style"; }',
                        )),
-                       'test.baz' => new ResourceLoaderTestModule(array(
+                       'test.baz' => new ResourceLoaderTestModule( array(
                                'script' => 'mw.test.baz( { a: true } );',
                                'styles' => '.mw-test-baz { content: "style"; }',
                        )),
-                       'test.quux' => new ResourceLoaderTestModule(array(
+                       'test.quux' => new ResourceLoaderTestModule( array(
                                'script' => 'mw.test.baz( { token: 123 } );',
                                'styles' => '/* pref-animate=off */ .mw-icon { transition: none; }',
                                'group' => 'private',
diff --git a/tests/phpunit/includes/PasswordTest.php b/tests/phpunit/includes/PasswordTest.php
new file mode 100644 (file)
index 0000000..ceb794b
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Testing framework for the Password infrastructure
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class PasswordTest extends MediaWikiTestCase {
+       /**
+        * @covers InvalidPassword::equals
+        */
+       public function testInvalidUnequalInvalid() {
+               $invalid1 = User::getPasswordFactory()->newFromCiphertext( null );
+               $invalid2 = User::getPasswordFactory()->newFromCiphertext( null );
+
+               $this->assertFalse( $invalid1->equals( $invalid2 ) );
+       }
+}
index f13e838..14911f0 100644 (file)
@@ -2,7 +2,7 @@
 
 /**
  * @covers Sanitizer::validateEmail
- * @TODO all test methods in this class should be refactored and...
+ * @todo all test methods in this class should be refactored and...
  *    use a single test method and a single data provider...
  */
 class SanitizerValidateEmailTest extends MediaWikiTestCase {
index 3829f90..b2e4459 100644 (file)
@@ -286,7 +286,7 @@ class StatusTest extends MediaWikiLangTestCase {
        }
 
        public static function provideCleanParams() {
-               $cleanCallback = function( $value ) {
+               $cleanCallback = function ( $value ) {
                        return '-' . $value . '-';
                };
 
@@ -327,7 +327,7 @@ class StatusTest extends MediaWikiLangTestCase {
        public static function provideGetWikiTextAndHtml() {
                $testCases = array();
 
-               $testCases[ 'GoodStatus' ] = array(
+               $testCases['GoodStatus'] = array(
                        new Status(),
                        "Internal error: Status::getWikiText called for a good result, this is incorrect\n",
                        "<p>Internal error: Status::getWikiText called for a good result, this is incorrect\n</p>",
@@ -335,7 +335,7 @@ class StatusTest extends MediaWikiLangTestCase {
 
                $status = new Status();
                $status->ok = false;
-               $testCases[ 'GoodButNoError' ] = array(
+               $testCases['GoodButNoError'] = array(
                        $status,
                        "Internal error: Status::getWikiText: Invalid result object: no error text but not OK\n",
                        "<p>Internal error: Status::getWikiText: Invalid result object: no error text but not OK\n</p>",
@@ -343,7 +343,7 @@ class StatusTest extends MediaWikiLangTestCase {
 
                $status = new Status();
                $status->warning( 'fooBar!' );
-               $testCases[ '1StringWarning' ] = array(
+               $testCases['1StringWarning'] = array(
                        $status,
                        "<fooBar!>",
                        "<p>&lt;fooBar!&gt;\n</p>",
@@ -352,7 +352,7 @@ class StatusTest extends MediaWikiLangTestCase {
                $status = new Status();
                $status->warning( 'fooBar!' );
                $status->warning( 'fooBar2!' );
-               $testCases[ '2StringWarnings' ] = array(
+               $testCases['2StringWarnings'] = array(
                        $status,
                        "* <fooBar!>\n* <fooBar2!>\n",
                        "<ul><li> &lt;fooBar!&gt;</li>\n<li> &lt;fooBar2!&gt;</li></ul>\n",
@@ -360,7 +360,7 @@ class StatusTest extends MediaWikiLangTestCase {
 
                $status = new Status();
                $status->warning( new Message( 'fooBar!', array( 'foo', 'bar' )  ) );
-               $testCases[ '1MessageWarning' ] = array(
+               $testCases['1MessageWarning'] = array(
                        $status,
                        "<fooBar!>",
                        "<p>&lt;fooBar!&gt;\n</p>",
@@ -369,7 +369,7 @@ class StatusTest extends MediaWikiLangTestCase {
                $status = new Status();
                $status->warning( new Message( 'fooBar!', array( 'foo', 'bar' ) ) );
                $status->warning( new Message( 'fooBar2!' ) );
-               $testCases[ '2MessageWarnings' ] = array(
+               $testCases['2MessageWarnings'] = array(
                        $status,
                        "* <fooBar!>\n* <fooBar2!>\n",
                        "<ul><li> &lt;fooBar!&gt;</li>\n<li> &lt;fooBar2!&gt;</li></ul>\n",
@@ -399,7 +399,7 @@ class StatusTest extends MediaWikiLangTestCase {
        public static function provideGetMessage() {
                $testCases = array();
 
-               $testCases[ 'GoodStatus' ] = array(
+               $testCases['GoodStatus'] = array(
                        new Status(),
                        array( "Status::getMessage called for a good result, this is incorrect\n" ),
                        'internalerror_info'
@@ -407,7 +407,7 @@ class StatusTest extends MediaWikiLangTestCase {
 
                $status = new Status();
                $status->ok = false;
-               $testCases[ 'GoodButNoError' ] = array(
+               $testCases['GoodButNoError'] = array(
                        $status,
                        array( "Status::getMessage: Invalid result object: no error text but not OK\n" ),
                        'internalerror_info'
@@ -415,7 +415,7 @@ class StatusTest extends MediaWikiLangTestCase {
 
                $status = new Status();
                $status->warning( 'fooBar!' );
-               $testCases[ '1StringWarning' ] = array(
+               $testCases['1StringWarning'] = array(
                        $status,
                        array(),
                        'fooBar!'
@@ -437,7 +437,7 @@ class StatusTest extends MediaWikiLangTestCase {
 
                $status = new Status();
                $status->warning( new Message( 'fooBar!', array( 'foo', 'bar' )  ) );
-               $testCases[ '1MessageWarning' ] = array(
+               $testCases['1MessageWarning'] = array(
                        $status,
                        array( 'foo', 'bar' ),
                        'fooBar!'
@@ -446,7 +446,7 @@ class StatusTest extends MediaWikiLangTestCase {
                $status = new Status();
                $status->warning( new Message( 'fooBar!', array( 'foo', 'bar' ) ) );
                $status->warning( new Message( 'fooBar2!' ) );
-               $testCases[ '2MessageWarnings' ] = array(
+               $testCases['2MessageWarnings'] = array(
                        $status,
                        array( new Message( 'fooBar!', array( 'foo', 'bar' ) ), new Message( 'fooBar2!' ) ),
                        "* \$1\n* \$2"
@@ -538,7 +538,7 @@ class StatusTest extends MediaWikiLangTestCase {
         */
        public function testWakeUpSanitizesCallback() {
                $status = new Status();
-               $status->cleanCallback = function( $value ) {
+               $status->cleanCallback = function ( $value ) {
                        return '-' . $value . '-';
                };
                $status->__wakeup();
index f0d4c4d..ae82bc4 100644 (file)
@@ -26,7 +26,7 @@ class TimeAdjustTest extends MediaWikiLangTestCase {
                return array(
                        array( '20061231235959', 0, '20061231235959' ),
                        array( '20061231235959', 5, '20070101000459' ),
-                       array( '20061231235959', 15,'20070101001459' ),
+                       array( '20061231235959', 15, '20070101001459' ),
                        array( '20061231235959', 60, '20070101005959' ),
                        array( '20061231235959', 90, '20070101012959' ),
                        array( '20061231235959', 120, '20070101015959' ),
index 55a17ac..5904fac 100644 (file)
@@ -4,8 +4,8 @@
  * @group ContentHandler
  * @group Database
  *
- * @note: We don't make assumptions about the main namespace.
- *        But we do expect the Help namespace to contain Wikitext.
+ * @note We don't make assumptions about the main namespace.
+ *       But we do expect the Help namespace to contain Wikitext.
  */
 class TitleMethodsTest extends MediaWikiTestCase {
 
index 6871582..53e8dc2 100644 (file)
@@ -20,6 +20,19 @@ class TitleTest extends MediaWikiTestCase {
                ) );
        }
 
+       public function addDBData() {
+               $this->db->replace( 'interwiki', 'iw_prefix',
+                       array(
+                               'iw_prefix' => 'externalwiki',
+                               'iw_url' => '//example.com/$1',
+                               'iw_api' => '//example.com/api.php',
+                               'iw_wikiid' => '',
+                               'iw_local' => 0,
+                               'iw_trans' => 0,
+                       )
+               );
+       }
+
        /**
         * @covers Title::legalChars
         */
@@ -46,7 +59,7 @@ class TitleTest extends MediaWikiTestCase {
         * See also mediawiki.Title.test.js
         * @covers Title::secureAndSplit
         * @todo This method should be split into 2 separate tests each with a provider
-        * @note: This mainly tests MediaWikiTitleCodec::parseTitle().
+        * @note This mainly tests MediaWikiTitleCodec::parseTitle().
         */
        public function testSecureAndSplit() {
                $this->setMwGlobals( array(
@@ -606,4 +619,28 @@ class TitleTest extends MediaWikiTestCase {
                $title = Title::newFromText( $full );
                $this->assertEquals( $fragment, $title->getFragment() );
        }
+
+       /**
+        * @covers Title::isAlwaysKnown
+        * @dataProvider provideIsAlwaysKnown
+        * @param string $page
+        * @param bool $isKnown
+        */
+       public function testIsAlwaysKnown( $page, $isKnown ) {
+               $title = Title::newFromText( $page );
+               $this->assertEquals( $isKnown, $title->isAlwaysKnown() );
+       }
+
+       public function provideIsAlwaysKnown() {
+               return array(
+                       array( 'Some nonexistent page', false ),
+                       array( 'UTPage', false ),
+                       array( '#test', true ),
+                       array( 'Special:BlankPage', true ),
+                       array( 'Special:SomeNonexistentSpecialPage', false ),
+                       array( 'MediaWiki:Parentheses', true ),
+                       array( 'MediaWiki:Some nonexistent message', false ),
+                       array( 'externalwiki:Interwiki link', true ),
+               );
+       }
 }
index 7b12a4a..12d7d2a 100644 (file)
@@ -115,7 +115,7 @@ class WebRequestTest extends MediaWikiTestCase {
                        'wgUsePrivateIPs' => $private,
                        'wgHooks' => array(
                                'IsTrustedProxy' => array(
-                                       function( &$ip, &$trusted ) use ( $xffList ) {
+                                       function ( &$ip, &$trusted ) use ( $xffList ) {
                                                $trusted = $trusted || in_array( $ip, $xffList );
                                                return true;
                                        }
index 839a0c5..eb370d9 100644 (file)
@@ -13,13 +13,18 @@ class ActionTest extends MediaWikiTestCase {
        protected function setUp() {
                parent::setUp();
 
+               $context = $this->getContext();
                $this->setMwGlobals( 'wgActions', array(
-                       'null'     => null,
-                       'dummy'    => true,
-                       'string'   => 'NamedDummyAction',
+                       'null' => null,
+                       'disabled' => false,
+                       'view' => true,
+                       'edit' => true,
+                       'revisiondelete' => true,
+                       'dummy' => true,
+                       'string' => 'NamedDummyAction',
                        'declared' => 'NonExistingClassName',
                        'callable' => array( $this, 'dummyActionCallback' ),
-                       'object'   => new InstantiatedDummyAction( $this->getPage(), $this->getContext() ),
+                       'object' => new InstantiatedDummyAction( $context->getWikiPage(), $context ),
                ) );
        }
 
@@ -27,25 +32,32 @@ class ActionTest extends MediaWikiTestCase {
                return WikiPage::factory( Title::makeTitle( 0, 'Title' ) );
        }
 
-       private function getContext() {
-               return new DerivativeContext( RequestContext::getMain() );
+       private function getContext( $requestedAction = null ) {
+               $request = new FauxRequest( array( 'action' => $requestedAction ) );
+
+               $context = new DerivativeContext( RequestContext::getMain() );
+               $context->setRequest( $request );
+               $context->setWikiPage( $this->getPage() );
+
+               return $context;
        }
 
        public function actionProvider() {
                return array(
-                       array( 'dummy',    'DummyAction' ),
-                       array( 'string',   'NamedDummyAction' ),
+                       array( 'dummy', 'DummyAction' ),
+                       array( 'string', 'NamedDummyAction' ),
                        array( 'callable', 'CalledDummyAction' ),
-                       array( 'object',   'InstantiatedDummyAction' ),
+                       array( 'object', 'InstantiatedDummyAction' ),
 
                        // Capitalization is ignored
-                       array( 'STRING',   'NamedDummyAction' ),
+                       array( 'DUMMY', 'DummyAction' ),
+                       array( 'STRING', 'NamedDummyAction' ),
 
                        // Null and non-existing values
-                       array( 'null',       null ),
+                       array( 'null', null ),
                        array( 'undeclared', null ),
-                       array( '',           null ),
-                       array( null,         null ),
+                       array( '', null ),
+                       array( false, null ),
                );
        }
 
@@ -57,7 +69,7 @@ class ActionTest extends MediaWikiTestCase {
        public function testActionExists( $requestedAction, $expected ) {
                $exists = Action::exists( $requestedAction );
 
-               $this->assertEquals( isset( $expected ), $exists );
+               $this->assertSame( $expected !== null, $exists );
        }
 
        public function testActionExists_doesNotRequireInstantiation() {
@@ -73,13 +85,35 @@ class ActionTest extends MediaWikiTestCase {
         * @param string|null $expected
         */
        public function testGetActionName( $requestedAction, $expected ) {
-               $context = $this->getContext();
-               $context->setWikiPage( $this->getPage() );
-               $context->setRequest( new FauxRequest( array( 'action' => $requestedAction ) ) );
+               $context = $this->getContext( $requestedAction );
+               $actionName = Action::getActionName( $context );
+
+               $this->assertEquals( $expected ?: 'nosuchaction', $actionName );
+       }
 
+       public function testGetActionName_editredlinkWorkaround() {
+               // See https://bugzilla.wikimedia.org/show_bug.cgi?id=20966
+               $context = $this->getContext( 'editredlink' );
                $actionName = Action::getActionName( $context );
 
-               $this->assertEquals( isset( $expected ) ? $expected : 'nosuchaction', $actionName );
+               $this->assertEquals( 'edit', $actionName );
+       }
+
+       public function testGetActionName_historysubmitWorkaround() {
+               // See https://bugzilla.wikimedia.org/show_bug.cgi?id=20966
+               $context = $this->getContext( 'historysubmit' );
+               $actionName = Action::getActionName( $context );
+
+               $this->assertEquals( 'view', $actionName );
+       }
+
+       public function testGetActionName_revisiondeleteWorkaround() {
+               // See https://bugzilla.wikimedia.org/show_bug.cgi?id=20966
+               $context = $this->getContext( 'historysubmit' );
+               $context->getRequest()->setVal( 'revisiondelete', true );
+               $actionName = Action::getActionName( $context );
+
+               $this->assertEquals( 'revisiondelete', $actionName );
        }
 
        /**
@@ -88,13 +122,55 @@ class ActionTest extends MediaWikiTestCase {
         * @param string|null $expected
         */
        public function testActionFactory( $requestedAction, $expected ) {
-               $action = Action::factory( $requestedAction, $this->getPage(), $this->getContext() );
+               $context = $this->getContext();
+               $action = Action::factory( $requestedAction, $context->getWikiPage(), $context );
+
+               $this->assertType( $expected ?: 'null', $action );
+       }
+
+       public function testNull_doesNotExist() {
+               $exists = Action::exists( null );
+
+               $this->assertFalse( $exists );
+       }
 
-               $this->assertType( isset( $expected ) ? $expected : 'null', $action );
+       public function testNull_defaultsToView() {
+               $context = $this->getContext( null );
+               $actionName = Action::getActionName( $context );
+
+               $this->assertEquals( 'view', $actionName );
+       }
+
+       public function testNull_canNotBeInstantiated() {
+               $page = $this->getPage();
+               $action = Action::factory( null, $page );
+
+               $this->assertNull( $action );
+       }
+
+       public function testDisabledAction_exists() {
+               $exists = Action::exists( 'disabled' );
+
+               $this->assertTrue( $exists );
+       }
+
+       public function testDisabledAction_isNotResolved() {
+               $context = $this->getContext( 'disabled' );
+               $actionName = Action::getActionName( $context );
+
+               $this->assertEquals( 'nosuchaction', $actionName );
+       }
+
+       public function testDisabledAction_factoryReturnsFalse() {
+               $page = $this->getPage();
+               $action = Action::factory( 'disabled', $page );
+
+               $this->assertFalse( $action );
        }
 
        public function dummyActionCallback() {
-               return new CalledDummyAction( $this->getPage(), $this->getContext() );
+               $context = $this->getContext();
+               return new CalledDummyAction( $context->getWikiPage(), $context );
        }
 
 }
@@ -105,14 +181,18 @@ class DummyAction extends Action {
                return get_called_class();
        }
 
-       public function show() { }
-
-       public function execute() { }
+       public function show() {
+       }
 
+       public function execute() {
+       }
 }
 
-class NamedDummyAction extends DummyAction { }
+class NamedDummyAction extends DummyAction {
+}
 
-class CalledDummyAction extends DummyAction { }
+class CalledDummyAction extends DummyAction {
+}
 
-class InstantiatedDummyAction extends DummyAction { }
+class InstantiatedDummyAction extends DummyAction {
+}
index 9f8c139..3179a45 100644 (file)
@@ -161,14 +161,6 @@ class ApiEditPageTest extends ApiTestCase {
 
                // -- create page (or not) -----------------------------------------
                if ( $text !== null ) {
-                       if ( $text === '' ) {
-                               // can't create an empty page, so create it with some content
-                               $this->doApiRequestWithToken( array(
-                                       'action' => 'edit',
-                                       'title' => $name,
-                                       'text' => '(dummy)', ) );
-                       }
-
                        list( $re ) = $this->doApiRequestWithToken( array(
                                'action' => 'edit',
                                'title' => $name,
index 87ad2cd..0976b1a 100644 (file)
@@ -152,8 +152,8 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
 
                $data = $this->doApiRequest( array(
                        'action' => 'login',
-                       'lgname' => self::$users[ $user ]->username,
-                       'lgpassword' => self::$users[ $user ]->password ) );
+                       'lgname' => self::$users[$user]->username,
+                       'lgpassword' => self::$users[$user]->password ) );
 
                $token = $data[0]['login']['token'];
 
@@ -161,8 +161,8 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                        array(
                                'action' => 'login',
                                'lgtoken' => $token,
-                               'lgname' => self::$users[ $user ]->username,
-                               'lgpassword' => self::$users[ $user ]->password,
+                               'lgname' => self::$users[$user]->username,
+                               'lgpassword' => self::$users[$user]->password,
                        ),
                        $data[2]
                );
index c71faec..fc1f902 100644 (file)
@@ -14,4 +14,9 @@ class ApiFormatJsonTest extends ApiFormatTestBase {
                $this->assertInternalType( 'array', json_decode( $data, true ) );
                $this->assertGreaterThan( 0, count( (array)$data ) );
        }
+
+       public function testJsonpInjection( ) {
+               $data = $this->apiRequest( 'json', array( 'action' => 'query', 'meta' => 'siteinfo', 'callback' => 'myCallback' ) );
+               $this->assertEquals( '/**/myCallback(', substr( $data, 0, 15 ) );
+       }
 }
index d8765ee..bd15f04 100644 (file)
@@ -104,10 +104,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
                        $this->mergeResult( $result, $data );
                        $count++;
                        if ( empty( $continue ) ) {
-                               // $this->assertEquals( $expectedCount, $count, "$id finished early" );
-                               if ( $expectedCount > $count ) {
-                                       print "***** $id Finished early in $count turns. $expectedCount was expected\n";
-                               }
+                               $this->assertEquals( $expectedCount, $count, "$id finished early" );
 
                                return $result;
                        } elseif ( !$useContinue ) {
diff --git a/tests/phpunit/includes/changes/OldChangesListTest.php b/tests/phpunit/includes/changes/OldChangesListTest.php
new file mode 100644 (file)
index 0000000..9783ae3
--- /dev/null
@@ -0,0 +1,157 @@
+<?php
+
+/**
+ * @covers OldChangesList
+ *
+ * @group Database
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < aude.wiki@gmail.com >
+ */
+class OldChangesListTest extends MediaWikiLangTestCase {
+
+       /**
+        * @var TestRecentChangesHelper
+        */
+       private $testRecentChangesHelper;
+
+       public function __construct( $name = null, array $data = array(), $dataName = '' ) {
+               parent::__construct( $name, $data, $dataName );
+
+               $this->testRecentChangesHelper = new TestRecentChangesHelper();
+       }
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       'wgArticlePath' => '/wiki/$1'
+               ) );
+       }
+
+       /**
+        * @dataProvider recentChangesLine_CssForLineNumberProvider
+        */
+       public function testRecentChangesLine_CssForLineNumber( $expected, $linenumber, $message ) {
+               $oldChangesList = $this->getOldChangesList();
+               $recentChange = $this->getEditChange();
+
+               $line = $oldChangesList->recentChangesLine( $recentChange, false, $linenumber );
+
+               $this->assertRegExp( $expected, $line, $message );
+       }
+
+       public function recentChangesLine_CssForLineNumberProvider() {
+               return array(
+                       array( '/mw-line-odd/', 1, 'odd line number' ),
+                       array( '/mw-line-even/', 2, 'even line number' )
+               );
+       }
+
+       public function testRecentChangesLine_NotWatchedCssClass() {
+               $oldChangesList = $this->getOldChangesList();
+               $recentChange = $this->getEditChange();
+
+               $line = $oldChangesList->recentChangesLine( $recentChange, false, 1 );
+
+               $this->assertRegExp( '/mw-changeslist-line-not-watched/', $line );
+       }
+
+       public function testRecentChangesLine_WatchedCssClass() {
+               $oldChangesList = $this->getOldChangesList();
+               $recentChange = $this->getEditChange();
+
+               $line = $oldChangesList->recentChangesLine( $recentChange, true, 1 );
+
+               $this->assertRegExp( '/mw-changeslist-line-watched/', $line );
+       }
+
+       public function testRecentChangesLine_LogTitle() {
+               $oldChangesList = $this->getOldChangesList();
+               $recentChange = $this->getLogChange( 'delete' );
+
+               $line = $oldChangesList->recentChangesLine( $recentChange, false, 1 );
+
+               $message = new Message( 'dellogpage' );
+               $expectedLinkText = $message->inLanguage( 'en' )->text();
+
+               $this->assertRegExp( '/href="\/wiki\/Special:Log\/delete/', $line, 'link has href attribute' );
+               $this->assertRegExp( '/title="Special:Log\/delete/', $line, 'link has title attribute' );
+               $this->assertRegExp( "/$expectedLinkText/", $line, 'link text' );
+       }
+
+       public function testRecentChangesLine_DiffHistLinks() {
+               $oldChangesList = $this->getOldChangesList();
+               $recentChange = $this->getEditChange();
+
+               $line = $oldChangesList->recentChangesLine( $recentChange, false, 1 );
+
+               $this->assertRegExp(
+                       '/title=Cat&amp;curid=20131103212153&amp;diff=5&amp;oldid=191/',
+                       $line,
+                       'assert diff link'
+               );
+
+               $this->assertRegExp( '/tabindex="0"/', $line, 'assert tab index' );
+               $this->assertRegExp(
+                       '/title=Cat&amp;curid=20131103212153&amp;action=history"/',
+                       $line,
+                       'assert history link'
+               );
+       }
+
+       private function getNewBotEditChange() {
+               $user = $this->getTestUser();
+
+               $recentChange = $this->testRecentChangesHelper->makeNewBotEditRecentChange(
+                       $user, 'Abc', '20131103212153', 0, 0
+               );
+
+               return $recentChange;
+       }
+
+       private function getLogChange( $logType ) {
+               $user = $this->getTestUser();
+
+               $recentChange = $this->testRecentChangesHelper->makeLogRecentChange(
+                       $logType, $user, 'Abc', '20131103212153', 0, 0
+               );
+
+               return $recentChange;
+       }
+
+       private function getEditChange() {
+               $user = $this->getTestUser();
+               $recentChange = $this->testRecentChangesHelper->makeEditRecentChange(
+                       $user, 'Cat', '20131103212153', 5, 191, 190, 0, 0
+               );
+
+               return $recentChange;
+       }
+
+       private function getOldChangesList() {
+               $context = $this->getContext();
+               return new OldChangesList( $context );
+       }
+
+       private function getTestUser() {
+               $user = User::newFromName( 'TestRecentChangesUser' );
+
+               if ( !$user->getId() ) {
+                       $user->addToDatabase();
+               }
+
+               return $user;
+       }
+
+       private function getContext() {
+               $user = $this->getTestUser();
+               $context = $this->testRecentChangesHelper->getTestContext( $user );
+
+               $title = Title::newFromText( 'RecentChanges', NS_SPECIAL );
+               $context->setTitle( $title );
+
+               return $context;
+       }
+
+}
index d47cafe..c3b8ce6 100644 (file)
@@ -9,6 +9,18 @@
  * @author Katie Filbert < aude.wiki@gmail.com >
  */
 class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
+
+       /**
+        * @var TestRecentChangesHelper
+        */
+       private $testRecentChangesHelper;
+
+       public function __construct( $name = null, array $data = array(), $dataName = '' ) {
+               parent::__construct( $name, $data, $dataName );
+
+               $this->testRecentChangesHelper = new TestRecentChangesHelper();
+       }
+
        protected function setUp() {
                parent::setUp();
 
@@ -36,7 +48,7 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                );
                $this->assertEquals( $expected['unpatrolled'], $cacheEntry->unpatrolled, 'unpatrolled' );
 
-               $this->assertUserLinks( 'Mary', $cacheEntry );
+               $this->assertUserLinks( 'TestRecentChangesUser', $cacheEntry );
                $this->assertTitleLink( 'Xyz', $cacheEntry );
 
                $this->assertQueryLink( 'cur', $expected['cur'], $cacheEntry->curlink, 'cur link' );
@@ -49,7 +61,7 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                        array(
                                array(
                                        'title' => 'Xyz',
-                                       'user' => 'Mary',
+                                       'user' => 'TestRecentChangesUser',
                                        'diff' => array( 'curid' => 5, 'diff' => 191, 'oldid' => 190 ),
                                        'cur' => array( 'curid' => 5, 'diff' => 0, 'oldid' => 191 ),
                                        'timestamp' => '21:21',
@@ -58,9 +70,9 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                                ),
                                $this->getContext(),
                                $this->getMessages(),
-                               $this->makeEditRecentChange(
-                                       'Xyz',
+                               $this->testRecentChangesHelper->makeEditRecentChange(
                                        $this->getTestUser(),
+                                       'Xyz',
                                        5, // curid
                                        191, // thisid
                                        190, // lastid
@@ -68,28 +80,9 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                                        0, // counter
                                        0 // number of watching users
                                ),
-                               false,
-                               'edit'
-                       )
-               );
-       }
-
-       private function makeEditRecentChange( $title, $user, $curid, $thisid, $lastid,
-               $timestamp, $counter, $watchingUsers
-       ) {
-
-               $attribs = array_merge(
-                       $this->getDefaultAttributes( $title, $timestamp ),
-                       array(
-                               'rc_user' => $user->getId(),
-                               'rc_user_text' => $user->getName(),
-                               'rc_this_oldid' => $thisid,
-                               'rc_last_oldid' => $lastid,
-                               'rc_cur_id' => $curid
+                               false
                        )
                );
-
-               return $this->makeRecentChange( $attribs, $counter, $watchingUsers );
        }
 
        /**
@@ -110,7 +103,7 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                $this->assertEquals( $expected['unpatrolled'], $cacheEntry->unpatrolled, 'unpatrolled' );
 
                $this->assertDeleteLogLink( $cacheEntry );
-               $this->assertUserLinks( 'Mary', $cacheEntry );
+               $this->assertUserLinks( 'TestRecentChangesUser', $cacheEntry );
 
                $this->assertEquals( 'cur', $cacheEntry->curlink, 'cur link for delete log or rev' );
                $this->assertEquals( 'diff', $cacheEntry->difflink, 'diff link for delete log or rev' );
@@ -122,45 +115,24 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                        array(
                                array(
                                        'title' => 'Abc',
-                                       'user' => 'Mary',
+                                       'user' => 'TestRecentChangesUser',
                                        'timestamp' => '21:21',
                                        'numberofWatchingusers' => 0,
                                        'unpatrolled' => false
                                ),
                                $this->getContext(),
                                $this->getMessages(),
-                               $this->makeLogRecentChange(
-                                       'Abc',
+                               $this->testRecentChangesHelper->makeLogRecentChange(
+                                       'delete',
                                        $this->getTestUser(),
+                                       'Abc',
                                        '20131103212153',
                                        0, // counter
                                        0 // number of watching users
                                ),
-                               false,
-                               'delete'
-                       )
-               );
-       }
-
-       private function makeLogRecentChange( $title, $user, $timestamp, $counter, $watchingUsers ) {
-               $attribs = array_merge(
-                       $this->getDefaultAttributes( $title, $timestamp ),
-                       array(
-                               'rc_cur_id' => 0,
-                               'rc_user' => $user->getId(),
-                               'rc_user_text' => $user->getName(),
-                               'rc_this_oldid' => 0,
-                               'rc_last_oldid' => 0,
-                               'rc_old_len' => null,
-                               'rc_new_len' => null,
-                               'rc_type' => 3,
-                               'rc_logid' => 25,
-                               'rc_log_type' => 'delete',
-                               'rc_log_action' => 'delete'
+                               false
                        )
                );
-
-               return $this->makeRecentChange( $attribs, $counter, $watchingUsers );
        }
 
        /**
@@ -195,7 +167,7 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                        array(
                                array(
                                        'title' => 'Zzz',
-                                       'user' => 'Mary',
+                                       'user' => 'TestRecentChangesUser',
                                        'diff' => '',
                                        'cur' => '',
                                        'timestamp' => '21:21',
@@ -204,9 +176,9 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                                ),
                                $this->getContext(),
                                $this->getMessages(),
-                               $this->makeDeletedEditRecentChange(
-                                       'Zzz',
+                               $this->testRecentChangesHelper->makeDeletedEditRecentChange(
                                        $this->getTestUser(),
+                                       'Zzz',
                                        '20131103212153',
                                        191, // thisid
                                        190, // lastid
@@ -214,28 +186,9 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                                        0, // counter
                                        0 // number of watching users
                                ),
-                               false,
-                               'deletedrevuser'
-                       )
-               );
-       }
-
-       private function makeDeletedEditRecentChange( $title, $user, $timestamp, $curid, $thisid,
-               $lastid, $counter, $watchingUsers
-       ) {
-               $attribs = array_merge(
-                       $this->getDefaultAttributes( $title, $timestamp ),
-                       array(
-                               'rc_user' => $user->getId(),
-                               'rc_user_text' => $user->getName(),
-                               'rc_deleted' => 5,
-                               'rc_cur_id' => $curid,
-                               'rc_this_oldid' => $thisid,
-                               'rc_last_oldid' => $lastid
+                               false
                        )
                );
-
-               return $this->makeRecentChange( $attribs, $counter, $watchingUsers );
        }
 
        private function assertUserLinks( $user, $cacheEntry ) {
@@ -341,50 +294,6 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                }
        }
 
-       private function makeRecentChange( $attribs, $counter, $watchingUsers ) {
-               $change = new RecentChange();
-               $change->setAttribs( $attribs );
-               $change->counter = $counter;
-               $change->numberofWatchingusers = $watchingUsers;
-
-               return $change;
-       }
-
-       private function getDefaultAttributes( $title, $timestamp ) {
-               return array(
-                       'rc_id' => 545,
-                       'rc_user' => 0,
-                       'rc_user_text' => '127.0.0.1',
-                       'rc_ip' => '127.0.0.1',
-                       'rc_title' => $title,
-                       'rc_namespace' => 0,
-                       'rc_timestamp' => $timestamp,
-                       'rc_old_len' => 212,
-                       'rc_new_len' => 188,
-                       'rc_comment' => '',
-                       'rc_minor' => 0,
-                       'rc_bot' => 0,
-                       'rc_type' => 0,
-                       'rc_patrolled' => 1,
-                       'rc_deleted' => 0,
-                       'rc_logid' => 0,
-                       'rc_log_type' => null,
-                       'rc_log_action' => '',
-                       'rc_params' => '',
-                       'rc_source' => 'mw.edit'
-               );
-       }
-
-       private function getTestUser() {
-               $user = User::newFromName( 'Mary' );
-
-               if ( !$user->getId() ) {
-                       $user->addToDatabase();
-               }
-
-               return $user;
-       }
-
        private function getMessages() {
                return array(
                        'cur' => 'cur',
@@ -399,15 +308,22 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                );
        }
 
-       private function getContext() {
-               $title = Title::newFromText( 'RecentChanges', NS_SPECIAL );
+       private function getTestUser() {
+               $user = User::newFromName( 'TestRecentChangesUser' );
 
-               $context = new RequestContext();
-               $context->setTitle( $title );
-               $context->setLanguage( Language::factory( 'en' ) );
+               if ( !$user->getId() ) {
+                       $user->addToDatabase();
+               }
+
+               return $user;
+       }
 
+       private function getContext() {
                $user = $this->getTestUser();
-               $context->setUser( $user );
+               $context = $this->testRecentChangesHelper->getTestContext( $user );
+
+               $title = Title::newFromText( 'RecentChanges', NS_SPECIAL );
+               $context->setTitle( $title );
 
                return $context;
        }
diff --git a/tests/phpunit/includes/changes/TestRecentChangesHelper.php b/tests/phpunit/includes/changes/TestRecentChangesHelper.php
new file mode 100644 (file)
index 0000000..bb6ebec
--- /dev/null
@@ -0,0 +1,134 @@
+<?php
+
+/**
+ * Helper for generating test recent changes entries.
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < aude.wiki@gmail.com >
+ */
+class TestRecentChangesHelper {
+
+       public function makeEditRecentChange( User $user, $titleText, $curid, $thisid, $lastid,
+               $timestamp, $counter, $watchingUsers
+       ) {
+
+               $attribs = array_merge(
+                       $this->getDefaultAttributes( $titleText, $timestamp ),
+                       array(
+                               'rc_user' => $user->getId(),
+                               'rc_user_text' => $user->getName(),
+                               'rc_this_oldid' => $thisid,
+                               'rc_last_oldid' => $lastid,
+                               'rc_cur_id' => $curid
+                       )
+               );
+
+               return $this->makeRecentChange( $attribs, $counter, $watchingUsers );
+       }
+
+       public function makeLogRecentChange( $logType, User $user, $titleText, $timestamp, $counter,
+               $watchingUsers
+       ) {
+               $attribs = array_merge(
+                       $this->getDefaultAttributes( $titleText, $timestamp ),
+                       array(
+                               'rc_cur_id' => 0,
+                               'rc_user' => $user->getId(),
+                               'rc_user_text' => $user->getName(),
+                               'rc_this_oldid' => 0,
+                               'rc_last_oldid' => 0,
+                               'rc_old_len' => null,
+                               'rc_new_len' => null,
+                               'rc_type' => 3,
+                               'rc_logid' => 25,
+                               'rc_log_type' => $logType,
+                               'rc_log_action' => $logType,
+                               'rc_source' => 'mw.log'
+                       )
+               );
+
+               return $this->makeRecentChange( $attribs, $counter, $watchingUsers );
+       }
+
+       public function makeDeletedEditRecentChange( User $user, $titleText, $timestamp, $curid,
+               $thisid, $lastid, $counter, $watchingUsers
+       ) {
+               $attribs = array_merge(
+                       $this->getDefaultAttributes( $titleText, $timestamp ),
+                       array(
+                               'rc_user' => $user->getId(),
+                               'rc_user_text' => $user->getName(),
+                               'rc_deleted' => 5,
+                               'rc_cur_id' => $curid,
+                               'rc_this_oldid' => $thisid,
+                               'rc_last_oldid' => $lastid
+                       )
+               );
+
+               return $this->makeRecentChange( $attribs, $counter, $watchingUsers );
+       }
+
+       public function makeNewBotEditRecentChange( User $user, $titleText, $curid, $thisid, $lastid,
+               $timestamp, $counter, $watchingUsers
+       ) {
+
+               $attribs = array_merge(
+                       $this->getDefaultAttributes( $titleText, $timestamp ),
+                       array(
+                               'rc_user' => $user->getId(),
+                               'rc_user_text' => $user->getName(),
+                               'rc_this_oldid' => $thisid,
+                               'rc_last_oldid' => $lastid,
+                               'rc_cur_id' => $curid,
+                               'rc_type' => 1,
+                               'rc_bot' => 1,
+                               'rc_source' => 'mw.new'
+                       )
+               );
+
+               return $this->makeRecentChange( $attribs, $counter, $watchingUsers );
+       }
+
+       private function makeRecentChange( $attribs, $counter, $watchingUsers ) {
+               $change = new RecentChange();
+               $change->setAttribs( $attribs );
+               $change->counter = $counter;
+               $change->numberofWatchingusers = $watchingUsers;
+
+               return $change;
+       }
+
+       private function getDefaultAttributes( $titleText, $timestamp ) {
+               return array(
+                       'rc_id' => 545,
+                       'rc_user' => 0,
+                       'rc_user_text' => '127.0.0.1',
+                       'rc_ip' => '127.0.0.1',
+                       'rc_title' => $titleText,
+                       'rc_namespace' => 0,
+                       'rc_timestamp' => $timestamp,
+                       'rc_old_len' => 212,
+                       'rc_new_len' => 188,
+                       'rc_comment' => '',
+                       'rc_minor' => 0,
+                       'rc_bot' => 0,
+                       'rc_type' => 0,
+                       'rc_patrolled' => 1,
+                       'rc_deleted' => 0,
+                       'rc_logid' => 0,
+                       'rc_log_type' => null,
+                       'rc_log_action' => '',
+                       'rc_params' => '',
+                       'rc_source' => 'mw.edit'
+               );
+       }
+
+       public function getTestContext( User $user ) {
+               $context = new RequestContext();
+               $context->setLanguage( Language::factory( 'en' ) );
+
+               $context->setUser( $user );
+
+               return $context;
+       }
+}
index 0a6bf72..611d304 100644 (file)
@@ -8,7 +8,7 @@ class ConfigFactoryTest extends MediaWikiTestCase {
        public function testRegister() {
                $factory = new ConfigFactory();
                $factory->register( 'unittest', 'GlobalVarConfig::newInstance' );
-               $this->assertTrue( True ); // No exception thrown
+               $this->assertTrue( true ); // No exception thrown
                $this->setExpectedException( 'InvalidArgumentException' );
                $factory->register( 'invalid', 'Invalid callback' );
        }
@@ -37,9 +37,9 @@ class ConfigFactoryTest extends MediaWikiTestCase {
         */
        public function testMakeConfigWithInvalidCallback() {
                $factory = new ConfigFactory();
-               $factory->register( 'unittest', function() {
+               $factory->register( 'unittest', function () {
                        return true; // Not a Config object
-               });
+               } );
                $this->setExpectedException( 'UnexpectedValueException' );
                $factory->makeConfig( 'unittest' );
        }
index 2add9f2..b564a29 100644 (file)
@@ -312,6 +312,23 @@ class ContentHandlerTest extends MediaWikiTestCase {
                }
        }
 
+       /*
+        * Test if we become a "Created blank page" summary from getAutoSummary if no Content added to
+        * page.
+        */
+       public function testGetAutosummary() {
+               $content = new DummyContentHandlerForTesting( CONTENT_MODEL_WIKITEXT );
+               $title = Title::newFromText( 'Help:Test' );
+               // Create a new content object with no content
+               $newContent = ContentHandler::makeContent( '', $title, null, null, CONTENT_MODEL_WIKITEXT );
+               // first check, if we become a blank page created summary with the right bitmask
+               $autoSummary = $content->getAutosummary( null, $newContent, 97 );
+               $this->assertEquals( $autoSummary, 'Created blank page' );
+               // now check, what we become with another bitmask
+               $autoSummary = $content->getAutosummary( null, $newContent, 92 );
+               $this->assertEquals( $autoSummary, '' );
+       }
+
        /*
        public function testSupportsSections() {
                $this->markTestIncomplete( "not yet implemented" );
index 88bf7d9..1db6fae 100644 (file)
@@ -440,12 +440,12 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 
                $databaseCreation = $db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ );
                $this->assertInstanceOf( 'ResultWrapper', $databaseCreation, "Failed to create table a" );
-               $res = $db->select( 'a' , '*');
-               $this->assertEquals( 0,  $db->numFields($res), "expects to get 0 fields for an empty table" );
+               $res = $db->select( 'a', '*' );
+               $this->assertEquals( 0, $db->numFields( $res ), "expects to get 0 fields for an empty table" );
                $insertion = $db->insert( 'a', array( 'a_1' => 10 ), __METHOD__ );
                $this->assertTrue( $insertion, "Insertion failed" );
-               $res = $db->select( 'a' , '*');
-               $this->assertEquals( 1,  $db->numFields($res), "wrong number of fields" );
+               $res = $db->select( 'a', '*' );
+               $this->assertEquals( 1, $db->numFields( $res ), "wrong number of fields" );
 
                $this->assertTrue( $db->close(), "closing database" );
        }
index e642177..17c6224 100644 (file)
@@ -107,7 +107,7 @@ class MWDebugTest extends MediaWikiTestCase {
                        'gitViewUrl', 'time', 'log', 'debugLog', 'queries', 'request', 'memory',
                        'memoryPeak', 'includes', 'profile', '_element' );
 
-               foreach( $expectedKeys as $expectedKey ) {
+               foreach ( $expectedKeys as $expectedKey ) {
                        $this->assertArrayHasKey( $expectedKey, $data['debuginfo'], "debuginfo has $expectedKey" );
                }
 
index e914c72..188ad3f 100644 (file)
@@ -44,7 +44,7 @@ class ArrayDiffFormatterTest extends MediaWikiTestCase {
                        $diffOp->expects( $this->any() )
                                ->method( 'getClosing' )
                                ->with( $this->isType( 'integer' ) )
-                               ->will( $this->returnCallback( function() {
+                               ->will( $this->returnCallback( function () {
                                        return 'mockLine';
                                } ) );
                } else {
index 2eb1c46..dc5dc6a 100644 (file)
@@ -27,7 +27,7 @@ class MWExceptionHandlerTest extends MediaWikiTestCase {
                $hasObject = false;
                $hasArray = false;
                foreach ( $trace as $frame ) {
-                       if ( ! isset( $frame['args'] ) ) {
+                       if ( !isset( $frame['args'] ) ) {
                                continue;
                        }
                        foreach ( $frame['args'] as $arg ) {
@@ -49,7 +49,7 @@ class MWExceptionHandlerTest extends MediaWikiTestCase {
                $redacted = MWExceptionHandler::getRedactedTrace( $e );
 
                foreach ( $redacted as $frame ) {
-                       if ( ! isset( $frame['args'] ) ) {
+                       if ( !isset( $frame['args'] ) ) {
                                continue;
                        }
                        foreach ( $frame['args'] as $arg ) {
index 2c52338..5bdb7e7 100644 (file)
@@ -2,7 +2,7 @@
 class RepoGroupTest extends MediaWikiTestCase {
 
        function testHasForeignRepoNegative() {
-               $this->setMWGlobals( 'wgForeignFileRepos', array() );
+               $this->setMwGlobals( 'wgForeignFileRepos', array() );
                RepoGroup::destroySingleton();
                FileBackendGroup::destroySingleton();
                $this->assertFalse( RepoGroup::singleton()->hasForeignRepos() );
@@ -17,21 +17,23 @@ class RepoGroupTest extends MediaWikiTestCase {
                $this->setUpForeignRepo();
                $fakeCallback = $this->getMock( 'RepoGroupTestHelper' );
                $fakeCallback->expects( $this->once() )->method( 'callback' );
-               RepoGroup::singleton()->forEachForeignRepo( array( $fakeCallback, 'callback' ), array( array() ) );
+               RepoGroup::singleton()->forEachForeignRepo(
+                       array( $fakeCallback, 'callback' ), array( array() ) );
        }
 
        function testForEachForeignRepoNone() {
-               $this->setMWGlobals( 'wgForeignFileRepos', array() );
+               $this->setMwGlobals( 'wgForeignFileRepos', array() );
                RepoGroup::destroySingleton();
                FileBackendGroup::destroySingleton();
                $fakeCallback = $this->getMock( 'RepoGroupTestHelper' );
                $fakeCallback->expects( $this->never() )->method( 'callback' );
-               RepoGroup::singleton()->forEachForeignRepo( array( $fakeCallback, 'callback' ), array( array() ) );
+               RepoGroup::singleton()->forEachForeignRepo(
+                       array( $fakeCallback, 'callback' ), array( array() ) );
        }
 
        private function setUpForeignRepo() {
                global $wgUploadDirectory;
-               $this->setMWGlobals( 'wgForeignFileRepos', array( array(
+               $this->setMwGlobals( 'wgForeignFileRepos', array( array(
                        'class' => 'ForeignAPIRepo',
                        'name' => 'wikimediacommons',
                        'backend' => 'wikimediacommons-backend',
index 9232ce4..ffa9876 100644 (file)
@@ -1,6 +1,34 @@
 <?php
 
-class FileRepoFileTest extends MediaWikiMediaTestCase {
+class FileTest extends MediaWikiMediaTestCase {
+
+       /**
+        * @param $filename String
+        * @param $expected boolean
+        * @dataProvider providerCanAnimate
+        */
+       function testCanAnimateThumbIfAppropriate( $filename, $expected ) {
+               $this->setMwGlobals( 'wgMaxAnimatedGifArea', 9000 );
+               $file = $this->dataFile( $filename );
+               $this->assertEquals( $file->canAnimateThumbIfAppropriate(), $expected );
+       }
+
+       function providerCanAnimate() {
+               return array(
+                       array( 'nonanimated.gif', true ),
+                       array( 'jpeg-comment-utf.jpg', true ),
+                       array( 'test.tiff', true ),
+                       array( 'Animated_PNG_example_bouncing_beach_ball.png', false ),
+                       array( 'greyscale-png.png', true ),
+                       array( 'Toll_Texas_1.svg', true ),
+                       array( 'LoremIpsum.djvu', true ),
+                       array( '80x60-2layers.xcf', true ),
+                       array( 'Soccer_ball_animated.svg', false ),
+                       array( 'Bishzilla_blink.gif', false ),
+                       array( 'animated.gif', true ),
+               );
+       }
+
        /**
         * @dataProvider getThumbnailBucketProvider
         * @covers File::getThumbnailBucket
@@ -14,8 +42,9 @@ class FileRepoFileTest extends MediaWikiMediaTestCase {
                        ->setMethods( array( 'getWidth' ) )
                        ->getMockForAbstractClass();
 
-               $fileMock->expects( $this->any() )->method( 'getWidth' )->will(
-                       $this->returnValue( $data['width'] ) );
+               $fileMock->expects( $this->any() )
+                       ->method( 'getWidth' )
+                       ->will( $this->returnValue( $data['width'] ) );
 
                $this->assertEquals(
                        $data['expectedBucket'],
@@ -118,29 +147,35 @@ class FileRepoFileTest extends MediaWikiMediaTestCase {
 
                $fsFile = new FSFile( 'fsFilePath' );
 
-               $repoMock->expects( $this->any() )->method( 'fileExists' )->will(
-                       $this->returnValue( true ) );
+               $repoMock->expects( $this->any() )
+                       ->method( 'fileExists' )
+                       ->will( $this->returnValue( true ) );
 
-               $repoMock->expects( $this->any() )->method( 'getLocalReference' )->will(
-                       $this->returnValue( $fsFile ) );
+               $repoMock->expects( $this->any() )
+                       ->method( 'getLocalReference' )
+                       ->will( $this->returnValue( $fsFile ) );
 
                $handlerMock = $this->getMock( 'BitmapHandler', array( 'supportsBucketing' ) );
-               $handlerMock->expects( $this->any() )->method( 'supportsBucketing' )->will(
-                       $this->returnValue( $data['supportsBucketing'] ) );
+               $handlerMock->expects( $this->any() )
+                       ->method( 'supportsBucketing' )
+                       ->will( $this->returnValue( $data['supportsBucketing'] ) );
 
                $fileMock = $this->getMockBuilder( 'File' )
                        ->setConstructorArgs( array( 'fileMock', $repoMock ) )
                        ->setMethods( array( 'getThumbnailBucket', 'getLocalRefPath', 'getHandler' ) )
                        ->getMockForAbstractClass();
 
-               $fileMock->expects( $this->any() )->method( 'getThumbnailBucket' )->will(
-                       $this->returnValue( $data['thumbnailBucket'] ) );
+               $fileMock->expects( $this->any() )
+                       ->method( 'getThumbnailBucket' )
+                       ->will( $this->returnValue( $data['thumbnailBucket'] ) );
 
-               $fileMock->expects( $this->any() )->method( 'getLocalRefPath' )->will(
-                       $this->returnValue( 'localRefPath' ) );
+               $fileMock->expects( $this->any() )
+                       ->method( 'getLocalRefPath' )
+                       ->will( $this->returnValue( 'localRefPath' ) );
 
-               $fileMock->expects( $this->any() )->method( 'getHandler' )->will(
-                       $this->returnValue( $handlerMock ) );
+               $fileMock->expects( $this->any() )
+                       ->method( 'getHandler' )
+                       ->will( $this->returnValue( $handlerMock ) );
 
                $reflection = new ReflectionClass( $fileMock );
                $reflection_property = $reflection->getProperty( 'handler' );
@@ -222,15 +257,18 @@ class FileRepoFileTest extends MediaWikiMediaTestCase {
 
                $fileMock = $this->getMockBuilder( 'File' )
                        ->setConstructorArgs( array( 'fileMock', $repoMock ) )
-                       ->setMethods( array( 'getWidth', 'getBucketThumbPath', 'makeTransformTmpFile', 'generateAndSaveThumb', 'getHandler' ) )
+                       ->setMethods( array( 'getWidth', 'getBucketThumbPath', 'makeTransformTmpFile',
+                               'generateAndSaveThumb', 'getHandler' ) )
                        ->getMockForAbstractClass();
 
                $handlerMock = $this->getMock( 'JpegHandler', array( 'supportsBucketing' ) );
-               $handlerMock->expects( $this->any() )->method( 'supportsBucketing' )->will(
-                       $this->returnValue( true ) );
+               $handlerMock->expects( $this->any() )
+                       ->method( 'supportsBucketing' )
+                       ->will( $this->returnValue( true ) );
 
-               $fileMock->expects( $this->any() )->method( 'getHandler' )->will(
-                       $this->returnValue( $handlerMock ) );
+               $fileMock->expects( $this->any() )
+                       ->method( 'getHandler' )
+                       ->will( $this->returnValue( $handlerMock ) );
 
                $reflectionMethod = new ReflectionMethod( 'File', 'generateBucketsIfNeeded' );
                $reflectionMethod->setAccessible( true );
diff --git a/tests/phpunit/includes/filerepo/files/FileTest.php b/tests/phpunit/includes/filerepo/files/FileTest.php
deleted file mode 100644 (file)
index 36b95ea..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-class FileTest extends MediaWikiMediaTestCase {
-
-       function setUp() {
-               $this->setMWGlobals( 'wgMaxAnimatedGifArea', 9000 );
-               parent::setUp();
-       }
-
-       /**
-        * @param $filename String
-        * @param $expected boolean
-        * @dataProvider providerCanAnimate
-        */
-       function testCanAnimateThumbIfAppropriate( $filename, $expected ) {
-               $file = $this->dataFile( $filename );
-               $this->assertEquals( $file->canAnimateThumbIfAppropriate(), $expected );
-       }
-
-       function providerCanAnimate() {
-               return array(
-                       array( 'nonanimated.gif', true ),
-                       array( 'jpeg-comment-utf.jpg', true ),
-                       array( 'test.tiff', true ),
-                       array( 'Animated_PNG_example_bouncing_beach_ball.png', false ),
-                       array( 'greyscale-png.png', true ),
-                       array( 'Toll_Texas_1.svg', true ),
-                       array( 'LoremIpsum.djvu', true ),
-                       array( '80x60-2layers.xcf', true ),
-                       array( 'Soccer_ball_animated.svg', false ),
-                       array( 'Bishzilla_blink.gif', false ),
-                       array( 'animated.gif', true ),
-               );
-       }
-}
index c8b20d2..407f11a 100644 (file)
@@ -221,6 +221,11 @@ class CSSJanusTest extends MediaWikiTestCase {
                                // Don't mangle zeroes
                                '.foo { text-shadow: orange 0 2px; }'
                        ),
+                       array(
+                               // Make sure floats are not considered zero
+                               '.foo { box-shadow: inset .5em 0 0 white; }',
+                               '.foo { box-shadow: inset -.5em 0 0 white; }',
+                       ),
 
                        // Direction
                        // Note: This differs from the Python implementation,
index d779207..c0871f1 100644 (file)
@@ -62,7 +62,7 @@ class DjVuTest extends MediaWikiMediaTestCase {
                $file = $this->dataFile( 'LoremIpsum.djvu', 'image/x.djvu' );
                $this->assertEquals(
                        "Lorem ipsum \n1 \n",
-                       (string) $this->handler->getPageText( $file, 1 ),
+                       (string)$this->handler->getPageText( $file, 1 ),
                        "Text layer of page 1 of file LoremIpsum.djvu should be 'Lorem ipsum \n1 \n'"
                );
        }
index 7b64dfd..1b8ecf2 100644 (file)
@@ -78,7 +78,7 @@ abstract class MediaWikiMediaTestCase extends MediaWikiTestCase {
                        // Autodetect by file extension for the lazy.
                        $magic = MimeMagic::singleton();
                        $parts = explode( $name, '.' );
-                       $type = $magic->guessTypesForExtension( $parts[count( $parts ) - 1]  );
+                       $type = $magic->guessTypesForExtension( $parts[count( $parts ) - 1] );
                }
                return new UnregisteredLocalFile( false, $this->repo,
                        "mwstore://localtesting/data/$name", $type );
index 4c72d1c..1dcc4cd 100644 (file)
@@ -148,6 +148,7 @@ class NewParserTest extends MediaWikiTestCase {
                # proper precedence when resolving links. (bug 51680)
                $tmpGlobals['wgExtraNamespaces'] = array( 100 => 'MemoryAlpha' );
 
+               $tmpGlobals['wgLocalInterwikis'] = array( 'local', 'mi' );
                # "extra language links"
                # see https://gerrit.wikimedia.org/r/111390
                $tmpGlobals['wgExtraInterlanguageLinkPrefixes'] = array( 'mul' );
@@ -494,19 +495,23 @@ class NewParserTest extends MediaWikiTestCase {
                $backend = RepoGroup::singleton()->getLocalRepo()->getBackend();
                $backend->prepare( array( 'dir' => "$base/local-public/3/3a" ) );
                $backend->store( array(
-                       'src' => "$IP/tests/phpunit/data/parser/headbg.jpg", 'dst' => "$base/local-public/3/3a/Foobar.jpg"
+                       'src' => "$IP/tests/phpunit/data/parser/headbg.jpg",
+                       'dst' => "$base/local-public/3/3a/Foobar.jpg"
                ) );
                $backend->prepare( array( 'dir' => "$base/local-public/e/ea" ) );
                $backend->store( array(
-                       'src' => "$IP/tests/phpunit/data/parser/wiki.png", 'dst' => "$base/local-public/e/ea/Thumb.png"
+                       'src' => "$IP/tests/phpunit/data/parser/wiki.png",
+                       'dst' => "$base/local-public/e/ea/Thumb.png"
                ) );
                $backend->prepare( array( 'dir' => "$base/local-public/0/09" ) );
                $backend->store( array(
-                       'src' => "$IP/tests/phpunit/data/parser/headbg.jpg", 'dst' => "$base/local-public/0/09/Bad.jpg"
+                       'src' => "$IP/tests/phpunit/data/parser/headbg.jpg",
+                       'dst' => "$base/local-public/0/09/Bad.jpg"
                ) );
                $backend->prepare( array( 'dir' => "$base/local-public/5/5f" ) );
                $backend->store( array(
-                       'src' => "$IP/tests/phpunit/data/parser/LoremIpsum.djvu", 'dst' => "$base/local-public/5/5f/LoremIpsum.djvu"
+                       'src' => "$IP/tests/phpunit/data/parser/LoremIpsum.djvu",
+                       'dst' => "$base/local-public/5/5f/LoremIpsum.djvu"
                ) );
 
                // No helpful SVG file to copy, so make one ourselves
index 29af2c2..cbf4803 100644 (file)
@@ -78,7 +78,7 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                $wgParser->parse( '<recursivecallparser>baz</recursivecallparser>', $title, $po );
        }
 
-       public function helperParserFunc( $input, $args, $parser) {
+       public function helperParserFunc( $input, $args, $parser ) {
                $title = Title::newFromText( 'foo' );
                $po = new ParserOptions;
                $parser->parse( $input, $title, $po );
diff --git a/tests/phpunit/includes/password/BcryptPasswordTest.php b/tests/phpunit/includes/password/BcryptPasswordTest.php
new file mode 100644 (file)
index 0000000..b4d5f99
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * @group large
+ */
+class BcryptPasswordTestCase extends MediaWikiPasswordTestCase {
+       protected function getTypeConfigs() {
+               return array( 'bcrypt' => array(
+                       'class' => 'BcryptPassword',
+                       'cost' => 9,
+               ) );
+       }
+
+       public function providePasswordTests() {
+               /** @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong */
+               return array(
+                       // Tests from glibc bcrypt implementation
+                       array( true, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW', "U*U" ),
+                       array( true, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$VGOzA784oUp/Z0DY336zx7pLYAy0lwK', "U*U*" ),
+                       array( true, ':bcrypt:5$XXXXXXXXXXXXXXXXXXXXXO$AcXxm9kjPGEMsLznoKqmqw7tc8WCx4a', "U*U*U" ),
+                       array( true, ':bcrypt:5$abcdefghijklmnopqrstuu$5s2v8.iXieOjg/.AySBTTZIIVFJeBui', "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored" ),
+                       array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$CE5elHaaO4EbggVDjb8P19RukzXSM3e', "\xff\xff\xa3" ),
+                       array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq', "\xa3" ),
+                       array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq', "\xa3" ),
+                       array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$o./n25XVfn6oAPaUvHe.Csk4zRfsYPi', "\xff\xa334\xff\xff\xff\xa3345" ),
+                       array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$nRht2l/HRhr6zmCp9vYUvvsqynflf9e', "\xff\xa3345" ),
+                       array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$nRht2l/HRhr6zmCp9vYUvvsqynflf9e', "\xff\xa3345" ),
+                       array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$6IflQkJytoRVc1yuaNtHfiuq.FRlSIS', "\xa3ab" ),
+                       array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$6IflQkJytoRVc1yuaNtHfiuq.FRlSIS', "\xa3ab" ),
+                       array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$swQOIzjOiJ9GHEPuhEkvqrUyvWhEMx6', "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaachars after 72 are ignored as usual" ),
+                       array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$R9xrDjiycxMbQE2bp.vgqlYpW5wx2yy', "\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55" ),
+                       array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$9tQZzcJfm3uj2NvJ/n5xkhpqLrMpWCe', "\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff" ),
+                       array( true, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$7uG0VCzI2bS7j6ymqJi9CdcdxiRTWNy', "" ),
+                       // One or two false sanity tests
+                       array( false, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW', "UXU" ),
+                       array( false, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW', "" ),
+               );
+               /** @codingStandardsIgnoreEnd */
+       }
+}
diff --git a/tests/phpunit/includes/password/LayeredParameterizedPasswordTest.php b/tests/phpunit/includes/password/LayeredParameterizedPasswordTest.php
new file mode 100644 (file)
index 0000000..c552253
--- /dev/null
@@ -0,0 +1,51 @@
+<?php
+
+class LayeredParameterizedPasswordTest extends MediaWikiPasswordTestCase {
+       protected function getTypeConfigs() {
+               return array(
+                       'testLargeLayeredTop' => array(
+                               'class' => 'LayeredParameterizedPassword',
+                               'types' => array(
+                                       'testLargeLayeredBottom',
+                                       'testLargeLayeredBottom',
+                                       'testLargeLayeredBottom',
+                                       'testLargeLayeredBottom',
+                                       'testLargeLayeredFinal',
+                               ),
+                       ),
+                       'testLargeLayeredBottom' => array(
+                               'class' => 'Pbkdf2Password',
+                               'algo' => 'sha512',
+                               'cost' => 1024,
+                               'length' => 512,
+                       ),
+                       'testLargeLayeredFinal' => array(
+                               'class' => 'BcryptPassword',
+                               'cost' => 5,
+                       )
+               );
+       }
+
+       public function providePasswordTests() {
+               /** @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong */
+               return array(
+                       array( true, ':testLargeLayeredTop:sha512:1024:512!sha512:1024:512!sha512:1024:512!sha512:1024:512!5!vnRy+2SrSA0fHt3dwhTP5g==!AVnwfZsAQjn+gULv7FSGjA==!xvHUX3WcpkeSn1lvjWcvBg==!It+OC/N9tu+d3ByHhuB0BQ==!Tb.gqUOiD.aWktVwHM.Q/O!7CcyMfXUPky5ptyATJsR2nq3vUqtnBC', 'testPassword123' ),
+               );
+               /** @codingStandardsIgnoreEnd */
+       }
+
+       /**
+        * @covers LayeredParameterizedPassword::partialCrypt
+        */
+       public function testLargeLayeredPartialUpdate() {
+               /** @var ParameterizedPassword $partialPassword */
+               $partialPassword = $this->passwordFactory->newFromType( 'testLargeLayeredBottom' );
+               $partialPassword->crypt( 'testPassword123' );
+
+               /** @var LayeredParameterizedPassword $totalPassword */
+               $totalPassword = $this->passwordFactory->newFromType( 'testLargeLayeredTop' );
+               $totalPassword->partialCrypt( $partialPassword );
+
+               $this->assertTrue( $totalPassword->equals( 'testPassword123' ) );
+       }
+}
diff --git a/tests/phpunit/includes/password/Pbkdf2PasswordTest.php b/tests/phpunit/includes/password/Pbkdf2PasswordTest.php
new file mode 100644 (file)
index 0000000..c1b65d3
--- /dev/null
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * @group large
+ */
+class Pbkdf2PasswordTest extends MediaWikiPasswordTestCase {
+       protected function getTypeConfigs() {
+               return array( 'pbkdf2' => array(
+                       'class' => 'Pbkdf2Password',
+                       'algo' => 'sha256',
+                       'cost' => '10000',
+                       'length' => '128',
+               ) );
+       }
+
+       public function providePasswordTests() {
+               return array(
+                       array( true, ":pbkdf2:sha1:1:20:c2FsdA==:DGDID5YfDnHzqbUkr2ASBi/gN6Y=", 'password' ),
+                       array( true, ":pbkdf2:sha1:2:20:c2FsdA==:6mwBTcctb4zNHtkqzh1B8NjeiVc=", 'password' ),
+                       array( true, ":pbkdf2:sha1:4096:20:c2FsdA==:SwB5AbdlSJq+rUnZJvch0GWkKcE=", 'password' ),
+                       array( true, ":pbkdf2:sha1:4096:16:c2EAbHQ=:Vvpqp1VICZ3MN9fwNCXgww==", "pass\x00word" ),
+               );
+       }
+}
index 2d31d08..019e532 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 
-// We will use this class with getMockForAbstractClass to create a concrete mock class. That call will die if the
-// contructor is not public, unless we use disableOriginalConstructor(), in which case we could not test the constructor.
+// We will use this class with getMockForAbstractClass to create a concrete mock class.
+// That call will die if the contructor is not public, unless we use disableOriginalConstructor(),
+// in which case we could not test the constructor.
 abstract class PoolCounterAbstractMock extends PoolCounter {
        public function __construct() {
                call_user_func_array( 'parent::__construct', func_get_args() );
@@ -19,8 +20,8 @@ class PoolCounterTest extends MediaWikiTestCase {
 
                $poolCounter = $this->getMockBuilder( 'PoolCounterAbstractMock' )
                        ->setConstructorArgs( array( $poolCounterConfig, 'testCounter', 'someKey' ) )
-                       // don't mock anything - the proper syntax would be setMethods(null), but due to a PHPUnit bug that
-                       // does not work with getMockForAbstractClass()
+                       // don't mock anything - the proper syntax would be setMethods(null), but due
+                       // to a PHPUnit bug that does not work with getMockForAbstractClass()
                        ->setMethods( array( 'idontexist' ) )
                        ->getMockForAbstractClass();
                $this->assertInstanceOf( 'PoolCounter', $poolCounter );
@@ -44,16 +45,15 @@ class PoolCounterTest extends MediaWikiTestCase {
 
        public function testHashKeyIntoSlots() {
                $poolCounter = $this->getMockBuilder( 'PoolCounterAbstractMock' )
-                       // don't mock anything - the proper syntax would be setMethods(null), but due to a PHPUnit bug that
-                       // does not work with getMockForAbstractClass()
+                       // don't mock anything - the proper syntax would be setMethods(null), but due
+                       // to a PHPUnit bug that does not work with getMockForAbstractClass()
                        ->setMethods( array( 'idontexist' ) )
                        ->disableOriginalConstructor()
                        ->getMockForAbstractClass();
 
-               $hashKeyIntoSlots = new ReflectionMethod($poolCounter, 'hashKeyIntoSlots' );
+               $hashKeyIntoSlots = new ReflectionMethod( $poolCounter, 'hashKeyIntoSlots' );
                $hashKeyIntoSlots->setAccessible( true );
 
-
                $keysWithTwoSlots = $keysWithFiveSlots = array();
                foreach ( range( 1, 100 ) as $i ) {
                        $keysWithTwoSlots[] = $hashKeyIntoSlots->invoke( $poolCounter, 'key ' . $i, 2 );
index fa22d34..e98f0e8 100644 (file)
@@ -2,6 +2,14 @@
 
 class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
 
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       'wgValidSkinNames' => array( 'vector' => 'Vector' ),
+               ) );
+       }
+
        /**
         * @covers ResourceLoaderFileModule::getAllSkinStyleFiles
         */
index d3736f5..bd6b3f2 100644 (file)
@@ -130,6 +130,39 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                        ),
                );
        }
+
+       public static function fakeSources() {
+               return array(
+                       'examplewiki' => array(
+                               'loadScript' => '//example.org/w/load.php',
+                               'apiScript' => '//example.org/w/api.php',
+                       ),
+                       'example2wiki' => array(
+                               'loadScript' => '//example.com/w/load.php',
+                               'apiScript' => '//example.com/w/api.php',
+                       ),
+               );
+       }
+
+       /**
+        * @covers ResourceLoader::getLoadScript
+        */
+       public function testGetLoadScript() {
+               $this->setMwGlobals( 'wgResourceLoaderSources', array() );
+               $rl = new ResourceLoader();
+               $sources = self::fakeSources();
+               $rl->addSource( $sources );
+               foreach ( array( 'examplewiki', 'example2wiki' ) as $name ) {
+                       $this->assertEquals( $rl->getLoadScript( $name ), $sources[$name]['loadScript'] );
+               }
+
+               try {
+                       $rl->getLoadScript( 'thiswasneverreigstered' );
+                       $this->assertTrue( false, 'ResourceLoader::getLoadScript should have thrown an exception' );
+               } catch ( MWException $e ) {
+                       $this->assertTrue( true );
+               }
+       }
 }
 
 /* Hooks */
index f224b7d..af314ba 100644 (file)
@@ -72,7 +72,22 @@ class TestSites {
                $site->setLinkPath( "http://spamzz.test/testing/" );
                $sites[] = $site;
 
-               foreach ( array( 'en', 'de', 'nl', 'sv', 'sr', 'no', 'nn' ) as $langCode ) {
+               /**
+                * Add at least one right-to-left language (current RTL languages in MediaWiki core are:
+                * aeb, ar, arc, arz, azb, bcc, bqi, ckb, dv, en_rtl, fa, glk, he, khw, kk_arab, kk_cn,
+                * ks_arab, ku_arab, lrc, mzn, pnb, ps, sd, ug_arab, ur, yi).
+                */
+               $languageCodes = array(
+                       'de',
+                       'en',
+                       'fa', //right-to-left
+                       'nl',
+                       'nn',
+                       'no',
+                       'sr',
+                       'sv',
+               );
+               foreach ( $languageCodes as $langCode ) {
                        $site = new MediaWikiSite();
                        $site->setGlobalId( $langCode . 'wiki' );
                        $site->setGroup( 'wikipedia' );
index 2689236..c042064 100644 (file)
@@ -11,7 +11,7 @@
 class SpecialListFilesTest extends MediaWikiTestCase {
        /**
         * @expectedException MWException
-        * @expectedExceptionMesage invalid_field
+        * @expectedExceptionMessage invalid_field
         * @covers ImageListPager::formatValue
         */
        public function testFormatValuesThrowException() {
diff --git a/tests/phpunit/includes/specials/SpecialMyLanguageTest.php b/tests/phpunit/includes/specials/SpecialMyLanguageTest.php
new file mode 100644 (file)
index 0000000..c09d68c
--- /dev/null
@@ -0,0 +1,65 @@
+<?php
+
+/**
+ * @group Database
+ * @covers SpecialMyLanguage
+ */
+class SpecialMyLanguageTest extends MediaWikiTestCase {
+       public function addDBData() {
+               $titles = array(
+                       'Page/Another',
+                       'Page/Another/ru',
+               );
+               foreach ( $titles as $title ) {
+                       $page = WikiPage::factory( Title::newFromText( $title ) );
+                       if ( $page->getId() == 0 ) {
+                               $page->doEditContent(
+                                       new WikitextContent( 'UTContent' ),
+                                       'UTPageSummary',
+                                       EDIT_NEW,
+                                       false,
+                                       User::newFromName( 'UTSysop' ) );
+                       }
+               }
+       }
+
+       /**
+        * @covers SpecialMyLanguage::findTitle
+        * @dataProvider provideFindTitle
+        * @param $expected
+        * @param $subpage
+        * @param $langCode
+        * @param $userLang
+        */
+       public function testFindTitle( $expected, $subpage, $langCode, $userLang ) {
+               $this->setMwGlobals( 'wgLanguageCode', $langCode );
+               $special = new SpecialMyLanguage();
+               $special->getContext()->setLanguage( $userLang );
+               // Test with subpages both enabled and disabled
+               $this->mergeMwGlobalArrayValue( 'wgNamespacesWithSubpages', array( NS_MAIN => true ) );
+               $this->assertTitle( $expected, $special->findTitle( $subpage ) );
+               $this->mergeMwGlobalArrayValue( 'wgNamespacesWithSubpages', array( NS_MAIN => false ) );
+               $this->assertTitle( $expected, $special->findTitle( $subpage ) );
+       }
+
+       /**
+        * @param string $expected
+        * @param Title|null $title
+        */
+       private function assertTitle( $expected, $title ) {
+               if ( $title ) {
+                       $title = $title->getPrefixedText();
+               }
+               $this->assertEquals( $expected, $title );
+       }
+
+       public function provideFindTitle() {
+               return array(
+                       array( null, '::Fail', 'en', 'en' ),
+                       array( 'Page/Another', 'Page/Another/en', 'en', 'en' ),
+                       array( 'Page/Another', 'Page/Another', 'en', 'en' ),
+                       array( 'Page/Another/ru', 'Page/Another', 'en', 'ru' ),
+                       array( 'Page/Another', 'Page/Another', 'en', 'es' ),
+               );
+       }
+}
index 358b0fe..b13df89 100644 (file)
@@ -9,7 +9,7 @@
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  * GNU General Public License for more details.
-
+ *
  * You should have received a copy of the GNU General Public License along
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -155,7 +155,7 @@ class MediaWikiPageLinkRendererTest extends MediaWikiTestCase {
                $formatter->expects( $this->any() )
                        ->method( 'getFullText' )
                        ->will( $this->returnCallback(
-                               function( TitleValue $title ) {
+                               function ( TitleValue $title ) {
                                        return str_replace( '_', ' ', "$title" );
                                }
                        ));
index 2cf8663..bf06e3b 100644 (file)
@@ -72,7 +72,7 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
 
                $genderCache->expects( $this->any() )
                        ->method( 'getGenderOf' )
-                       ->will( $this->returnCallback( function( $userName ) {
+                       ->will( $this->returnCallback( function ( $userName ) {
                                return preg_match( '/^[^- _]+a( |_|$)/u', $userName ) ? 'female' : 'male';
                        } ) );
 
index ef670df..ec51441 100644 (file)
@@ -457,32 +457,22 @@ class LanguageTest extends LanguageClassesTestCase {
         * @dataProvider provideLanguageCodes
         * @covers Language::isValidBuiltInCode
         */
-       public function testBuiltInCodeValidation( $code, $message = '' ) {
-               $this->assertTrue(
+       public function testBuiltInCodeValidation( $code, $expected, $message = '' ) {
+               $this->assertEquals( $expected,
                        (bool)Language::isValidBuiltInCode( $code ),
                        "validating code $code $message"
                );
        }
 
-       /**
-        * @covers Language::isValidBuiltInCode
-        */
-       public function testBuiltInCodeValidationRejectUnderscore() {
-               $this->assertFalse(
-                       (bool)Language::isValidBuiltInCode( 'be_tarask' ),
-                       "reject underscore in language code"
-               );
-       }
-
        public static function provideLanguageCodes() {
                return array(
-                       array( 'fr', 'Two letters, minor case' ),
-                       array( 'EN', 'Two letters, upper case' ),
-                       array( 'tyv', 'Three letters' ),
-                       array( 'tokipona', 'long language code' ),
-                       array( 'be-tarask', 'With dash' ),
-                       array( 'Zh-classical', 'Begin with upper case, dash' ),
-                       array( 'Be-x-old', 'With extension (two dashes)' ),
+                       array( 'fr', true, 'Two letters, minor case' ),
+                       array( 'EN', false, 'Two letters, upper case' ),
+                       array( 'tyv', true, 'Three letters' ),
+                       array( 'tokipona', true, 'long language code' ),
+                       array( 'be-tarask', true, 'With dash' ),
+                       array( 'be-x-old', true, 'With extension (two dashes)' ),
+                       array( 'be_tarask', false, 'Reject underscores' ),
                );
        }
 
index 4f0d24f..dad30b7 100644 (file)
@@ -32,7 +32,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
         * @param string $text Revisions text
         * @param string $text Revisions summare
         *
-        * @throws MWExcepion
+        * @throws MWException
         */
        protected function addRevision( Page $page, $text, $summary ) {
                $status = $page->doEditContent(
index 42d1d0b..a13f7bf 100644 (file)
@@ -81,7 +81,7 @@ class MaintenanceFixup extends Maintenance {
                        return;
                }
 
-               return call_user_func_array( array( "parent", __FUNCTION__ ), func_get_args() );
+               call_user_func_array( array( "parent", __FUNCTION__ ), func_get_args() );
        }
 
        /**
index 8c40ffe..43f2096 100644 (file)
@@ -102,7 +102,7 @@ class FetchTextTest extends MediaWikiTestCase {
         * @param string $text The revisions text
         * @param string $text The revisions summare
         *
-        * @throws MWExcepion
+        * @throws MWException
         */
        private function addRevision( $page, $text, $summary ) {
                $status = $page->doEditContent(
index d2a4132..c7491d3 100755 (executable)
@@ -105,7 +105,7 @@ class PHPUnitMaintClass extends Maintenance {
                        # The below code injects a parameter just like if the user called
                        # Probably fix bug 29226
                        $key = array_search( '--colors', $_SERVER['argv'] );
-                       if( $key === false ) {
+                       if ( $key === false ) {
                                array_splice( $_SERVER['argv'], 1, 0, '--colors' );
                        }
                }
@@ -115,7 +115,7 @@ class PHPUnitMaintClass extends Maintenance {
                # PHPUnit uses stream_resolve_include_path() internally
                # See bug 32022
                $key = array_search( '--include-path', $_SERVER['argv'] );
-               if( $key === false ) {
+               if ( $key === false ) {
                        array_splice( $_SERVER['argv'], 1, 0,
                                __DIR__
                                . PATH_SEPARATOR
@@ -151,7 +151,7 @@ if ( !class_exists( 'PHPUnit_TextUI_Command' ) ) {
 if ( version_compare( PHP_VERSION, '5.4.0', '<' )
        && version_compare( PHP_VERSION, '5.3.0', '>=' )
 ) {
-       register_shutdown_function( function() {
+       register_shutdown_function( function () {
                gc_collect_cycles();
                gc_disable();
        } );
index d7742a6..647386d 100644 (file)
@@ -37,7 +37,11 @@ class ResourcesTest extends MediaWikiTestCase {
                );
        }
 
-       public function testDependencies() {
+       /**
+        * Verify that nothing explicitly depends on the 'jquery' and 'mediawiki' modules.
+        * They are always loaded, depending on them is unsupported and leads to unexpected behaviour.
+        */
+       public function testIllegalDependencies() {
                $data = self::getAllModules();
                $illegalDeps = array( 'jquery', 'mediawiki' );
 
@@ -52,6 +56,51 @@ class ResourcesTest extends MediaWikiTestCase {
                }
        }
 
+       /**
+        * Verify that all modules specified as dependencies of other modules actually exist.
+        */
+       public function testMissingDependencies() {
+               $data = self::getAllModules();
+               $validDeps = array_keys( $data['modules'] );
+
+               foreach ( $data['modules'] as $moduleName => $module ) {
+                       foreach ( $module->getDependencies() as $dep ) {
+                               $this->assertContains(
+                                       $dep,
+                                       $validDeps,
+                                       "The module '$dep' required by '$moduleName' must exist"
+                               );
+                       }
+               }
+       }
+
+       /**
+        * Verify that all dependencies of all modules are always satisfiable with the 'targets' defined
+        * for the involved modules.
+        *
+        * Example: A depends on B. A has targets: mobile, desktop. B has targets: desktop. Therefore the
+        * dependency is sometimes unsatisfiable: it's impossible to load module A on mobile.
+        */
+       public function testUnsatisfiableDependencies() {
+               $data = self::getAllModules();
+               $validDeps = array_keys( $data['modules'] );
+
+               foreach ( $data['modules'] as $moduleName => $module ) {
+                       $moduleTargets = $module->getTargets();
+                       foreach ( $module->getDependencies() as $dep ) {
+                               $targets = $data['modules'][$dep]->getTargets();
+                               foreach ( $moduleTargets as $moduleTarget ) {
+                                       $this->assertContains(
+                                               $moduleTarget,
+                                               $targets,
+                                               "The module '$moduleName' must not have target '$moduleTarget' "
+                                                       . "because its dependency '$dep' does not have it"
+                                       );
+                               }
+                       }
+               }
+       }
+
        /**
         * Get all registered modules from ResouceLoader.
         */
@@ -115,7 +164,7 @@ class ResourcesTest extends MediaWikiTestCase {
                                                        $media,
                                                        $file,
                                                        // XXX: Wrapped in an object to keep it out of PHPUnit output
-                                                       (object) array( 'cssText' => $readStyleFile->invoke( $module, $file, $flip ) ),
+                                                       (object)array( 'cssText' => $readStyleFile->invoke( $module, $file, $flip ) ),
                                                );
                                        }
                                }
@@ -206,7 +255,7 @@ class ResourcesTest extends MediaWikiTestCase {
                                $cases[] = array(
                                        $method->invoke( $module, $file ),
                                        $moduleName,
-                                       $file,
+                                       ( $file instanceof ResourceLoaderFilePath ? $file->getPath() : $file ),
                                );
                        }
                }
index b27337b..bd82d21 100644 (file)
@@ -62,7 +62,6 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                $messageMemc = wfGetMessageCacheStorage();
                $parserMemc = wfGetParserCacheStorage();
 
-               // $wgContLang = new StubContLang;
                $wgUser = new User;
                $context = new RequestContext;
                $wgLang = $context->getLanguage();
index 2191c3b..56b0fa9 100644 (file)
 
                        $( '#qunit-fixture' ).append( $textarea );
 
-                       // This method is actually missing atm...
-                       //$textarea.textSelection( 'setContents', opt.before.text);
-
-                       // Won't work with the WikiEditor iframe?
-                       $textarea.val( opt.before.text );
+                       $textarea.textSelection( 'setContents', opt.before.text );
 
                        start = opt.before.start;
                        end = opt.before.end;
index 8c24f39..717c5f3 100644 (file)
@@ -352,7 +352,11 @@ class DbTestRecorder extends DbTestPreviewer {
 class TestFileIterator implements Iterator {
        private $file;
        private $fh;
-       private $parserTest; /* An instance of ParserTest (parserTests.php) or MediaWikiParserTest (phpunit) */
+       /**
+        * @var ParserTest|MediaWikiParserTest An instance of ParserTest (parserTests.php)
+        *  or MediaWikiParserTest (phpunit)
+        */
+       private $parserTest;
        private $index = 0;
        private $test;
        private $section = null;
@@ -426,7 +430,9 @@ class TestFileIterator implements Iterator {
                                        $this->checkSection( 'text' );
                                        $this->checkSection( 'article' );
 
-                                       $this->parserTest->addArticle( ParserTest::chomp( $this->sectionData['article'] ), $this->sectionData['text'], $this->lineNum );
+                                       $this->parserTest->addArticle(
+                                               ParserTest::chomp( $this->sectionData['article'] ),
+                                               $this->sectionData['text'], $this->lineNum );
 
                                        $this->clearSection();
 
@@ -497,8 +503,10 @@ class TestFileIterator implements Iterator {
                                        }
 
                                        if ( $input == false || $result == false ||
-                                               ( ( preg_match( '/\\bdisabled\\b/i', $this->sectionData['options'] ) && !$this->parserTest->runDisabled )
-                                               || ( preg_match( '/\\bparsoid\\b/i', $this->sectionData['options'] ) && $result != 'html/php' && !$this->parserTest->runParsoid )
+                                               ( ( preg_match( '/\\bdisabled\\b/i', $this->sectionData['options'] )
+                                                       && !$this->parserTest->runDisabled )
+                                               || ( preg_match( '/\\bparsoid\\b/i', $this->sectionData['options'] )
+                                                       && $result != 'html/php' && !$this->parserTest->runParsoid )
                                                || !preg_match( "/" . $this->parserTest->regex . "/i", $this->sectionData['test'] ) )
                                        ) {
                                                # disabled test
@@ -520,8 +528,8 @@ class TestFileIterator implements Iterator {
 
                                        $this->test = array(
                                                'test' => ParserTest::chomp( $this->sectionData['test'] ),
-                                               'input' => ParserTest::chomp( $this->sectionData[ $input ] ),
-                                               'result' => ParserTest::chomp( $this->sectionData[ $result ] ),
+                                               'input' => ParserTest::chomp( $this->sectionData[$input] ),
+                                               'result' => ParserTest::chomp( $this->sectionData[$result] ),
                                                'options' => ParserTest::chomp( $this->sectionData['options'] ),
                                                'config' => ParserTest::chomp( $this->sectionData['config'] ),
                                        );
@@ -530,7 +538,8 @@ class TestFileIterator implements Iterator {
                                }
 
                                if ( isset( $this->sectionData[$this->section] ) ) {
-                                       throw new MWException( "duplicate section '$this->section' at line {$this->lineNum} of $this->file\n" );
+                                       throw new MWException( "duplicate section '$this->section' "
+                                               . "at line {$this->lineNum} of $this->file\n" );
                                }
 
                                $this->sectionData[$this->section] = '';
@@ -579,7 +588,7 @@ class TestFileIterator implements Iterator {
 
                $data = $this->sectionData;
                $tokens = array_filter( $tokens, function ( $token ) use ( $data ) {
-                       return isset( $data[ $token ] );
+                       return isset( $data[$token] );
                } );
 
                if ( count( $tokens ) == 0 ) {
@@ -605,7 +614,7 @@ class TestFileIterator implements Iterator {
                }
 
                $tokens = array_values( $tokens );
-               return $tokens[ 0 ];
+               return $tokens[0];
        }
 }
 
@@ -640,7 +649,8 @@ class DelayedParserTest {
         */
        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" );
+                       throw new MWException( __METHOD__ . " must be passed an instance of ParserTest or "
+                               . "NewParserTest classes\n" );
                }
 
                # Trigger delayed hooks. Any failure will make us abort
index 89cc834..d53c10c 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -376,7 +376,7 @@ function wfGenerateThumbnail( File $file, array $params, $thumbName, $thumbPath
 
        $done = false;
        // Record failures on PHP fatals in addition to caching exceptions
-       register_shutdown_function( function() use ( &$done, $key ) {
+       register_shutdown_function( function () use ( &$done, $key ) {
                if ( !$done ) { // transform() gave a fatal
                        global $wgMemc;
                        // Randomize TTL to reduce stampedes
@@ -388,7 +388,8 @@ function wfGenerateThumbnail( File $file, array $params, $thumbName, $thumbPath
        $errorHtml = false;
 
        // guard thumbnail rendering with PoolCounter to avoid stampedes
-       // expensive files use a separate PoolCounter config so it is possible to set up a global limit on them
+       // expensive files use a separate PoolCounter config so it is possible
+       // to set up a global limit on them
        if ( $file->isExpensiveToThumbnail() ) {
                $poolCounterType = 'FileRenderExpensive';
        } else {
@@ -399,17 +400,17 @@ function wfGenerateThumbnail( File $file, array $params, $thumbName, $thumbPath
        try {
                $work = new PoolCounterWorkViaCallback( $poolCounterType, sha1( $file->getName() ),
                        array(
-                               'doWork' => function() use ( $file, $params ) {
+                               'doWork' => function () use ( $file, $params ) {
                                        return $file->transform( $params, File::RENDER_NOW );
                                },
-                               'getCachedWork' => function() use ( $file, $params, $thumbPath ) {
+                               'getCachedWork' => function () use ( $file, $params, $thumbPath ) {
                                        // If the worker that finished made this thumbnail then use it.
                                        // Otherwise, it probably made a different thumbnail for this file.
                                        return $file->getRepo()->fileExists( $thumbPath )
                                                ? $file->transform( $params, File::RENDER_NOW )
                                                : false; // retry once more in exclusive mode
                                },
-                               'fallback' => function() {
+                               'fallback' => function () {
                                        return wfMessage( 'generic-pool-error' )->parse();
                                },
                                'error' => function ( $status ) {
@@ -520,7 +521,8 @@ function wfExtractThumbRequestInfo( $thumbRel ) {
        $repo = RepoGroup::singleton()->getLocalRepo();
 
        $hashDirReg = $subdirReg = '';
-       for ( $i = 0; $i < $repo->getHashLevels(); $i++ ) {
+       $hashLevels = $repo->getHashLevels();
+       for ( $i = 0; $i < $hashLevels; $i++ ) {
                $subdirReg .= '[0-9a-f]';
                $hashDirReg .= "$subdirReg/";
        }