Merge "UploadStash us_props fix for Postgres"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 21 Feb 2014 14:40:14 +0000 (14:40 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 21 Feb 2014 14:40:14 +0000 (14:40 +0000)
768 files changed:
.jshintignore
CREDITS
HISTORY
INSTALL
RELEASE-NOTES-1.23
UPGRADE
docs/database.txt
docs/design.txt
docs/distributors.txt
docs/hooks.txt
docs/language.txt
docs/magicword.txt
docs/schema.txt
docs/scripts.txt
docs/skin.txt
includes/AjaxResponse.php
includes/Article.php
includes/AutoLoader.php
includes/Block.php
includes/Collation.php
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/Exception.php
includes/GitInfo.php
includes/GlobalFunctions.php
includes/HttpFunctions.php
includes/OutputPage.php
includes/PoolCounter.php
includes/Preferences.php
includes/QueryPage.php
includes/Setup.php
includes/SkinTemplate.php
includes/SquidPurgeClient.php
includes/Title.php
includes/User.php
includes/WebRequest.php
includes/Wiki.php
includes/WikiPage.php
includes/ZhConversion.php
includes/actions/InfoAction.php
includes/actions/RawAction.php
includes/api/ApiBase.php
includes/api/ApiCreateAccount.php
includes/api/ApiFormatXml.php
includes/api/ApiMain.php
includes/api/ApiOptions.php
includes/api/ApiPageSet.php
includes/api/ApiParse.php
includes/api/ApiProtect.php
includes/api/ApiPurge.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllLinks.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryContributors.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryFileRepoInfo.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiRevisionDelete.php [new file with mode: 0644]
includes/api/ApiWatch.php
includes/cache/HTMLFileCache.php
includes/cache/LocalisationCache.php
includes/cache/MessageCache.php
includes/changes/ChangesList.php
includes/changes/OldChangesList.php
includes/changes/RCCacheEntry.php
includes/changes/RecentChange.php
includes/clientpool/RedisConnectionPool.php
includes/config/Config.php
includes/config/GlobalConfig.php
includes/content/Content.php
includes/content/ContentHandler.php
includes/content/WikitextContent.php
includes/context/RequestContext.php
includes/db/Database.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabaseMysqli.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/DatabaseSqlite.php
includes/db/DatabaseUtility.php
includes/db/LoadBalancer.php
includes/db/LoadMonitor.php
includes/debug/Debug.php
includes/deferred/LinksUpdate.php
includes/deferred/SquidUpdate.php
includes/diff/DifferenceEngine.php
includes/externalstore/ExternalStoreDB.php
includes/externalstore/ExternalStoreMwstore.php
includes/filebackend/FSFile.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendMultiWrite.php
includes/filebackend/FileBackendStore.php
includes/filebackend/FileOpBatch.php
includes/filebackend/MemoryFileBackend.php
includes/filebackend/SwiftFileBackend.php
includes/filebackend/lockmanager/QuorumLockManager.php
includes/filebackend/lockmanager/RedisLockManager.php
includes/filerepo/FileRepo.php
includes/filerepo/ForeignAPIRepo.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/UnregisteredLocalFile.php
includes/gallery/ImageGalleryBase.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/HTMLMultiSelectField.php
includes/htmlform/HTMLRadioField.php
includes/htmlform/HTMLSelectAndOtherField.php
includes/htmlform/HTMLSelectField.php
includes/htmlform/HTMLSelectOrOtherField.php
includes/installer/Installer.i18n.php
includes/installer/Installer.php
includes/installer/LocalSettingsGenerator.php
includes/installer/MssqlInstaller.php [new file with mode: 0644]
includes/installer/MssqlUpdater.php [new file with mode: 0644]
includes/installer/MysqlUpdater.php
includes/installer/OracleUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstallerPage.php
includes/job/JobQueueRedis.php
includes/job/JobSpecification.php
includes/job/aggregator/JobQueueAggregatorRedis.php
includes/job/jobs/HTMLCacheUpdateJob.php
includes/libs/CSSMin.php
includes/libs/MultiHttpClient.php
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/media/Bitmap.php
includes/media/DjVu.php
includes/media/Exif.php
includes/media/ImageHandler.php
includes/objectcache/RedisBagOStuff.php
includes/parser/CoreParserFunctions.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserOutput.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/revisiondelete/RevisionDelete.php
includes/revisiondelete/RevisionDeleteAbstracts.php
includes/search/SearchEngine.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialBlock.php
includes/specials/SpecialContributions.php
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
includes/upload/UploadFromChunks.php
includes/upload/UploadStash.php
includes/utils/ArrayUtils.php
languages/messages/MessagesAce.php
languages/messages/MessagesAeb.php
languages/messages/MessagesAf.php
languages/messages/MessagesAln.php
languages/messages/MessagesAm.php
languages/messages/MessagesAn.php
languages/messages/MessagesAng.php
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesArn.php
languages/messages/MessagesAry.php
languages/messages/MessagesArz.php
languages/messages/MessagesAs.php
languages/messages/MessagesAst.php
languages/messages/MessagesAvk.php
languages/messages/MessagesAz.php
languages/messages/MessagesAzb.php
languages/messages/MessagesBa.php
languages/messages/MessagesBar.php
languages/messages/MessagesBcc.php
languages/messages/MessagesBcl.php
languages/messages/MessagesBe.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBho.php
languages/messages/MessagesBjn.php
languages/messages/MessagesBn.php
languages/messages/MessagesBo.php
languages/messages/MessagesBpy.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesCa.php
languages/messages/MessagesCe.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCo.php
languages/messages/MessagesCps.php
languages/messages/MessagesCrh_cyrl.php
languages/messages/MessagesCrh_latn.php
languages/messages/MessagesCs.php
languages/messages/MessagesCsb.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesDtp.php
languages/messages/MessagesDv.php
languages/messages/MessagesEgl.php
languages/messages/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesEu.php
languages/messages/MessagesExt.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFo.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrp.php
languages/messages/MessagesFrr.php
languages/messages/MessagesFur.php
languages/messages/MessagesFy.php
languages/messages/MessagesGa.php
languages/messages/MessagesGan_hans.php
languages/messages/MessagesGan_hant.php
languages/messages/MessagesGd.php
languages/messages/MessagesGl.php
languages/messages/MessagesGom_latn.php
languages/messages/MessagesGrc.php
languages/messages/MessagesGsw.php
languages/messages/MessagesGu.php
languages/messages/MessagesGv.php
languages/messages/MessagesHak.php
languages/messages/MessagesHe.php
languages/messages/MessagesHi.php
languages/messages/MessagesHif_latn.php
languages/messages/MessagesHil.php
languages/messages/MessagesHr.php
languages/messages/MessagesHsb.php
languages/messages/MessagesHu.php
languages/messages/MessagesHy.php
languages/messages/MessagesIa.php
languages/messages/MessagesId.php
languages/messages/MessagesIe.php
languages/messages/MessagesIg.php
languages/messages/MessagesIlo.php
languages/messages/MessagesInh.php
languages/messages/MessagesIo.php
languages/messages/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesJv.php
languages/messages/MessagesKa.php
languages/messages/MessagesKaa.php
languages/messages/MessagesKab.php
languages/messages/MessagesKhw.php
languages/messages/MessagesKiu.php
languages/messages/MessagesKk_arab.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKk_latn.php
languages/messages/MessagesKm.php
languages/messages/MessagesKn.php
languages/messages/MessagesKo.php
languages/messages/MessagesKrc.php
languages/messages/MessagesKsh.php
languages/messages/MessagesKu_latn.php
languages/messages/MessagesKw.php
languages/messages/MessagesKy.php
languages/messages/MessagesLa.php
languages/messages/MessagesLad.php
languages/messages/MessagesLb.php
languages/messages/MessagesLez.php
languages/messages/MessagesLg.php
languages/messages/MessagesLi.php
languages/messages/MessagesLij.php
languages/messages/MessagesLmo.php
languages/messages/MessagesLo.php
languages/messages/MessagesLrc.php
languages/messages/MessagesLt.php
languages/messages/MessagesLus.php
languages/messages/MessagesLv.php
languages/messages/MessagesLzh.php
languages/messages/MessagesMai.php
languages/messages/MessagesMap_bms.php
languages/messages/MessagesMdf.php
languages/messages/MessagesMg.php
languages/messages/MessagesMhr.php
languages/messages/MessagesMin.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMn.php
languages/messages/MessagesMr.php
languages/messages/MessagesMs.php
languages/messages/MessagesMt.php
languages/messages/MessagesMy.php
languages/messages/MessagesMyv.php
languages/messages/MessagesMzn.php
languages/messages/MessagesNah.php
languages/messages/MessagesNan.php
languages/messages/MessagesNap.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNe.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesNso.php
languages/messages/MessagesOc.php
languages/messages/MessagesOr.php
languages/messages/MessagesOs.php
languages/messages/MessagesPa.php
languages/messages/MessagesPam.php
languages/messages/MessagesPcd.php
languages/messages/MessagesPfl.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPnb.php
languages/messages/MessagesPrg.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesQu.php
languages/messages/MessagesQug.php
languages/messages/MessagesRm.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesRue.php
languages/messages/MessagesSa.php
languages/messages/MessagesSah.php
languages/messages/MessagesSat.php
languages/messages/MessagesScn.php
languages/messages/MessagesSco.php
languages/messages/MessagesSdc.php
languages/messages/MessagesSe.php
languages/messages/MessagesSgs.php
languages/messages/MessagesSh.php
languages/messages/MessagesShi.php
languages/messages/MessagesSi.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSli.php
languages/messages/MessagesSo.php
languages/messages/MessagesSq.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesStq.php
languages/messages/MessagesSu.php
languages/messages/MessagesSv.php
languages/messages/MessagesSw.php
languages/messages/MessagesSzl.php
languages/messages/MessagesTa.php
languages/messages/MessagesTe.php
languages/messages/MessagesTet.php
languages/messages/MessagesTg_cyrl.php
languages/messages/MessagesTg_latn.php
languages/messages/MessagesTh.php
languages/messages/MessagesTk.php
languages/messages/MessagesTl.php
languages/messages/MessagesTly.php
languages/messages/MessagesTo.php
languages/messages/MessagesTr.php
languages/messages/MessagesTru.php
languages/messages/MessagesTs.php
languages/messages/MessagesTt_cyrl.php
languages/messages/MessagesTt_latn.php
languages/messages/MessagesTyv.php
languages/messages/MessagesUg_arab.php
languages/messages/MessagesUk.php
languages/messages/MessagesUr.php
languages/messages/MessagesUz.php
languages/messages/MessagesVec.php
languages/messages/MessagesVep.php
languages/messages/MessagesVi.php
languages/messages/MessagesVmf.php
languages/messages/MessagesVo.php
languages/messages/MessagesVot.php
languages/messages/MessagesVro.php
languages/messages/MessagesWa.php
languages/messages/MessagesWar.php
languages/messages/MessagesWo.php
languages/messages/MessagesWuu.php
languages/messages/MessagesXmf.php
languages/messages/MessagesYi.php
languages/messages/MessagesYo.php
languages/messages/MessagesYue.php
languages/messages/MessagesZea.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
languages/utils/CLDRPluralRuleEvaluator.php
maintenance/Maintenance.php
maintenance/benchmarks/benchmarkParse.php [new file with mode: 0644]
maintenance/checkSyntax.php
maintenance/cleanupSpam.php
maintenance/doMaintenance.php
maintenance/eval.php
maintenance/getConfiguration.php
maintenance/jsduck/categories.json
maintenance/jsduck/config.json
maintenance/language/messageTypes.inc
maintenance/language/messages.inc
maintenance/language/zhtable/Makefile.py
maintenance/mssql/tables.sql
maintenance/postgres/tables.sql
maintenance/updateSpecialPages.php
resources/Resources.php
resources/jquery.tipsy/jquery.tipsy.js
resources/jquery/jquery.ba-throttle-debounce.js [new file with mode: 0644]
resources/jquery/jquery.client.js
resources/jquery/jquery.fullscreen.js
resources/mediawiki.action/mediawiki.action.edit.editWarning.js
resources/mediawiki.action/mediawiki.action.edit.preview.js
resources/mediawiki.api/mediawiki.api.js
resources/mediawiki.language/languages/he.js
resources/mediawiki.less/mediawiki.mixins.less
resources/mediawiki.less/mediawiki.mixins.rotation.less [new file with mode: 0644]
resources/mediawiki.page/mediawiki.page.patrol.ajax.js
resources/mediawiki.page/mediawiki.page.watch.ajax.js
resources/mediawiki.special/mediawiki.special.css
resources/mediawiki.special/mediawiki.special.preferences.js
resources/mediawiki.special/mediawiki.special.userlogin.login.css
resources/mediawiki.ui/components/default/buttons.less
resources/mediawiki.ui/mixins/effects.less
resources/mediawiki.ui/mixins/forms.less
resources/mediawiki.ui/settings/colors.less
resources/mediawiki.ui/settings/typography.less
resources/mediawiki/mediawiki.feedback.js
resources/mediawiki/mediawiki.htmlform.js
resources/mediawiki/mediawiki.inspect.js
resources/mediawiki/mediawiki.jqueryMsg.js
resources/mediawiki/mediawiki.jqueryMsg.peg
resources/mediawiki/mediawiki.js
resources/mediawiki/mediawiki.log.js
resources/mediawiki/mediawiki.notification.hideForPrint.css [new file with mode: 0644]
resources/mediawiki/mediawiki.notification.js
resources/mediawiki/mediawiki.searchSuggest.js
resources/mediawiki/mediawiki.toc.js [new file with mode: 0644]
resources/mediawiki/mediawiki.util.js
resources/moment/LICENSE [new file with mode: 0644]
resources/moment/lang/ar-ma.js [new file with mode: 0644]
resources/moment/lang/ar.js [new file with mode: 0644]
resources/moment/lang/bg.js [new file with mode: 0644]
resources/moment/lang/br.js [new file with mode: 0644]
resources/moment/lang/bs.js [new file with mode: 0644]
resources/moment/lang/ca.js [new file with mode: 0644]
resources/moment/lang/cs.js [new file with mode: 0644]
resources/moment/lang/cv.js [new file with mode: 0644]
resources/moment/lang/cy.js [new file with mode: 0644]
resources/moment/lang/da.js [new file with mode: 0644]
resources/moment/lang/de.js [new file with mode: 0644]
resources/moment/lang/el.js [new file with mode: 0644]
resources/moment/lang/en-au.js [new file with mode: 0644]
resources/moment/lang/en-ca.js [new file with mode: 0644]
resources/moment/lang/en-gb.js [new file with mode: 0644]
resources/moment/lang/eo.js [new file with mode: 0644]
resources/moment/lang/es.js [new file with mode: 0644]
resources/moment/lang/et.js [new file with mode: 0644]
resources/moment/lang/eu.js [new file with mode: 0644]
resources/moment/lang/fa.js [new file with mode: 0644]
resources/moment/lang/fi.js [new file with mode: 0644]
resources/moment/lang/fo.js [new file with mode: 0644]
resources/moment/lang/fr-ca.js [new file with mode: 0644]
resources/moment/lang/fr.js [new file with mode: 0644]
resources/moment/lang/gl.js [new file with mode: 0644]
resources/moment/lang/he.js [new file with mode: 0644]
resources/moment/lang/hi.js [new file with mode: 0644]
resources/moment/lang/hr.js [new file with mode: 0644]
resources/moment/lang/hu.js [new file with mode: 0644]
resources/moment/lang/hy-am.js [new file with mode: 0644]
resources/moment/lang/id.js [new file with mode: 0644]
resources/moment/lang/is.js [new file with mode: 0644]
resources/moment/lang/it.js [new file with mode: 0644]
resources/moment/lang/ja.js [new file with mode: 0644]
resources/moment/lang/ka.js [new file with mode: 0644]
resources/moment/lang/ko.js [new file with mode: 0644]
resources/moment/lang/lb.js [new file with mode: 0644]
resources/moment/lang/lt.js [new file with mode: 0644]
resources/moment/lang/lv.js [new file with mode: 0644]
resources/moment/lang/mk.js [new file with mode: 0644]
resources/moment/lang/ml.js [new file with mode: 0644]
resources/moment/lang/mr.js [new file with mode: 0644]
resources/moment/lang/ms-my.js [new file with mode: 0644]
resources/moment/lang/nb.js [new file with mode: 0644]
resources/moment/lang/ne.js [new file with mode: 0644]
resources/moment/lang/nl.js [new file with mode: 0644]
resources/moment/lang/nn.js [new file with mode: 0644]
resources/moment/lang/pl.js [new file with mode: 0644]
resources/moment/lang/pt-br.js [new file with mode: 0644]
resources/moment/lang/pt.js [new file with mode: 0644]
resources/moment/lang/ro.js [new file with mode: 0644]
resources/moment/lang/rs.js [new file with mode: 0644]
resources/moment/lang/ru.js [new file with mode: 0644]
resources/moment/lang/sk.js [new file with mode: 0644]
resources/moment/lang/sl.js [new file with mode: 0644]
resources/moment/lang/sq.js [new file with mode: 0644]
resources/moment/lang/sv.js [new file with mode: 0644]
resources/moment/lang/ta.js [new file with mode: 0644]
resources/moment/lang/th.js [new file with mode: 0644]
resources/moment/lang/tl-ph.js [new file with mode: 0644]
resources/moment/lang/tr.js [new file with mode: 0644]
resources/moment/lang/tzm-la.js [new file with mode: 0644]
resources/moment/lang/tzm.js [new file with mode: 0644]
resources/moment/lang/uk.js [new file with mode: 0644]
resources/moment/lang/uz.js [new file with mode: 0644]
resources/moment/lang/vn.js [new file with mode: 0644]
resources/moment/lang/zh-cn.js [new file with mode: 0644]
resources/moment/lang/zh-tw.js [new file with mode: 0644]
resources/moment/moment.js [new file with mode: 0644]
resources/oojs-ui/i18n/ace.json [new file with mode: 0644]
resources/oojs-ui/i18n/af.json [new file with mode: 0644]
resources/oojs-ui/i18n/am.json [new file with mode: 0644]
resources/oojs-ui/i18n/ar.json [new file with mode: 0644]
resources/oojs-ui/i18n/arc.json [new file with mode: 0644]
resources/oojs-ui/i18n/ast.json [new file with mode: 0644]
resources/oojs-ui/i18n/az.json [new file with mode: 0644]
resources/oojs-ui/i18n/ba.json [new file with mode: 0644]
resources/oojs-ui/i18n/bcl.json [new file with mode: 0644]
resources/oojs-ui/i18n/be-tarask.json [new file with mode: 0644]
resources/oojs-ui/i18n/be.json [new file with mode: 0644]
resources/oojs-ui/i18n/bg.json [new file with mode: 0644]
resources/oojs-ui/i18n/bn.json [new file with mode: 0644]
resources/oojs-ui/i18n/br.json [new file with mode: 0644]
resources/oojs-ui/i18n/bs.json [new file with mode: 0644]
resources/oojs-ui/i18n/ca.json [new file with mode: 0644]
resources/oojs-ui/i18n/ce.json [new file with mode: 0644]
resources/oojs-ui/i18n/ckb.json [new file with mode: 0644]
resources/oojs-ui/i18n/co.json [new file with mode: 0644]
resources/oojs-ui/i18n/cs.json [new file with mode: 0644]
resources/oojs-ui/i18n/cu.json [new file with mode: 0644]
resources/oojs-ui/i18n/cy.json [new file with mode: 0644]
resources/oojs-ui/i18n/da.json [new file with mode: 0644]
resources/oojs-ui/i18n/de.json [new file with mode: 0644]
resources/oojs-ui/i18n/diq.json [new file with mode: 0644]
resources/oojs-ui/i18n/dsb.json [new file with mode: 0644]
resources/oojs-ui/i18n/el.json [new file with mode: 0644]
resources/oojs-ui/i18n/eml.json [new file with mode: 0644]
resources/oojs-ui/i18n/en.json [new file with mode: 0644]
resources/oojs-ui/i18n/eo.json [new file with mode: 0644]
resources/oojs-ui/i18n/es.json [new file with mode: 0644]
resources/oojs-ui/i18n/et.json [new file with mode: 0644]
resources/oojs-ui/i18n/eu.json [new file with mode: 0644]
resources/oojs-ui/i18n/fa.json [new file with mode: 0644]
resources/oojs-ui/i18n/fi.json [new file with mode: 0644]
resources/oojs-ui/i18n/fo.json [new file with mode: 0644]
resources/oojs-ui/i18n/fr.json [new file with mode: 0644]
resources/oojs-ui/i18n/frr.json [new file with mode: 0644]
resources/oojs-ui/i18n/fur.json [new file with mode: 0644]
resources/oojs-ui/i18n/gl.json [new file with mode: 0644]
resources/oojs-ui/i18n/gu.json [new file with mode: 0644]
resources/oojs-ui/i18n/he.json [new file with mode: 0644]
resources/oojs-ui/i18n/hi.json [new file with mode: 0644]
resources/oojs-ui/i18n/hr.json [new file with mode: 0644]
resources/oojs-ui/i18n/hsb.json [new file with mode: 0644]
resources/oojs-ui/i18n/hu.json [new file with mode: 0644]
resources/oojs-ui/i18n/hy.json [new file with mode: 0644]
resources/oojs-ui/i18n/ia.json [new file with mode: 0644]
resources/oojs-ui/i18n/id.json [new file with mode: 0644]
resources/oojs-ui/i18n/ie.json [new file with mode: 0644]
resources/oojs-ui/i18n/ilo.json [new file with mode: 0644]
resources/oojs-ui/i18n/is.json [new file with mode: 0644]
resources/oojs-ui/i18n/it.json [new file with mode: 0644]
resources/oojs-ui/i18n/ja.json [new file with mode: 0644]
resources/oojs-ui/i18n/jv.json [new file with mode: 0644]
resources/oojs-ui/i18n/ka.json [new file with mode: 0644]
resources/oojs-ui/i18n/kk-cyrl.json [new file with mode: 0644]
resources/oojs-ui/i18n/km.json [new file with mode: 0644]
resources/oojs-ui/i18n/ko.json [new file with mode: 0644]
resources/oojs-ui/i18n/krc.json [new file with mode: 0644]
resources/oojs-ui/i18n/kw.json [new file with mode: 0644]
resources/oojs-ui/i18n/ky.json [new file with mode: 0644]
resources/oojs-ui/i18n/lb.json [new file with mode: 0644]
resources/oojs-ui/i18n/lmo.json [new file with mode: 0644]
resources/oojs-ui/i18n/lt.json [new file with mode: 0644]
resources/oojs-ui/i18n/lv.json [new file with mode: 0644]
resources/oojs-ui/i18n/mg.json [new file with mode: 0644]
resources/oojs-ui/i18n/min.json [new file with mode: 0644]
resources/oojs-ui/i18n/mk.json [new file with mode: 0644]
resources/oojs-ui/i18n/ml.json [new file with mode: 0644]
resources/oojs-ui/i18n/mr.json [new file with mode: 0644]
resources/oojs-ui/i18n/ms.json [new file with mode: 0644]
resources/oojs-ui/i18n/nap.json [new file with mode: 0644]
resources/oojs-ui/i18n/nb.json [new file with mode: 0644]
resources/oojs-ui/i18n/nds-nl.json [new file with mode: 0644]
resources/oojs-ui/i18n/nds.json [new file with mode: 0644]
resources/oojs-ui/i18n/ne.json [new file with mode: 0644]
resources/oojs-ui/i18n/nl.json [new file with mode: 0644]
resources/oojs-ui/i18n/nn.json [new file with mode: 0644]
resources/oojs-ui/i18n/om.json [new file with mode: 0644]
resources/oojs-ui/i18n/or.json [new file with mode: 0644]
resources/oojs-ui/i18n/pa.json [new file with mode: 0644]
resources/oojs-ui/i18n/pl.json [new file with mode: 0644]
resources/oojs-ui/i18n/pms.json [new file with mode: 0644]
resources/oojs-ui/i18n/ps.json [new file with mode: 0644]
resources/oojs-ui/i18n/pt-br.json [new file with mode: 0644]
resources/oojs-ui/i18n/pt.json [new file with mode: 0644]
resources/oojs-ui/i18n/qqq.json [new file with mode: 0644]
resources/oojs-ui/i18n/qu.json [new file with mode: 0644]
resources/oojs-ui/i18n/ro.json [new file with mode: 0644]
resources/oojs-ui/i18n/roa-tara.json [new file with mode: 0644]
resources/oojs-ui/i18n/ru.json [new file with mode: 0644]
resources/oojs-ui/i18n/sah.json [new file with mode: 0644]
resources/oojs-ui/i18n/scn.json [new file with mode: 0644]
resources/oojs-ui/i18n/sh.json [new file with mode: 0644]
resources/oojs-ui/i18n/si.json [new file with mode: 0644]
resources/oojs-ui/i18n/sk.json [new file with mode: 0644]
resources/oojs-ui/i18n/sl.json [new file with mode: 0644]
resources/oojs-ui/i18n/sq.json [new file with mode: 0644]
resources/oojs-ui/i18n/sr-ec.json [new file with mode: 0644]
resources/oojs-ui/i18n/sv.json [new file with mode: 0644]
resources/oojs-ui/i18n/sw.json [new file with mode: 0644]
resources/oojs-ui/i18n/ta.json [new file with mode: 0644]
resources/oojs-ui/i18n/te.json [new file with mode: 0644]
resources/oojs-ui/i18n/th.json [new file with mode: 0644]
resources/oojs-ui/i18n/tl.json [new file with mode: 0644]
resources/oojs-ui/i18n/tr.json [new file with mode: 0644]
resources/oojs-ui/i18n/tt-cyrl.json [new file with mode: 0644]
resources/oojs-ui/i18n/ug-arab.json [new file with mode: 0644]
resources/oojs-ui/i18n/uk.json [new file with mode: 0644]
resources/oojs-ui/i18n/uz.json [new file with mode: 0644]
resources/oojs-ui/i18n/vec.json [new file with mode: 0644]
resources/oojs-ui/i18n/vi.json [new file with mode: 0644]
resources/oojs-ui/i18n/vo.json [new file with mode: 0644]
resources/oojs-ui/i18n/wuu.json [new file with mode: 0644]
resources/oojs-ui/i18n/yi.json [new file with mode: 0644]
resources/oojs-ui/i18n/yo.json [new file with mode: 0644]
resources/oojs-ui/i18n/zh-hans.json [new file with mode: 0644]
resources/oojs-ui/i18n/zh-hant.json [new file with mode: 0644]
resources/oojs-ui/i18n/zh-hk.json [new file with mode: 0644]
resources/oojs-ui/i18n/zh-tw.json [new file with mode: 0644]
resources/oojs-ui/images/fade-down.png [new file with mode: 0644]
resources/oojs-ui/images/fade-up.png [new file with mode: 0644]
resources/oojs-ui/images/icons/accept.png [new file with mode: 0644]
resources/oojs-ui/images/icons/accept.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/add-item.png [new file with mode: 0644]
resources/oojs-ui/images/icons/add-item.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/advanced.png [new file with mode: 0644]
resources/oojs-ui/images/icons/advanced.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/alert.png [new file with mode: 0644]
resources/oojs-ui/images/icons/alert.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/arched-arrow-ltr.png [new file with mode: 0644]
resources/oojs-ui/images/icons/arched-arrow-ltr.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/arched-arrow-rtl.png [new file with mode: 0644]
resources/oojs-ui/images/icons/arched-arrow-rtl.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/check.png [new file with mode: 0644]
resources/oojs-ui/images/icons/check.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/clear.png [new file with mode: 0644]
resources/oojs-ui/images/icons/clear.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/close.png [new file with mode: 0644]
resources/oojs-ui/images/icons/close.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/code.png [new file with mode: 0644]
resources/oojs-ui/images/icons/code.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/collapse.png [new file with mode: 0644]
resources/oojs-ui/images/icons/collapse.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/comment.png [new file with mode: 0644]
resources/oojs-ui/images/icons/comment.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/expand.png [new file with mode: 0644]
resources/oojs-ui/images/icons/expand.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/help.png [new file with mode: 0644]
resources/oojs-ui/images/icons/help.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/history.png [new file with mode: 0644]
resources/oojs-ui/images/icons/history.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/link.png [new file with mode: 0644]
resources/oojs-ui/images/icons/link.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/menu.png [new file with mode: 0644]
resources/oojs-ui/images/icons/menu.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/move-ltr.png [new file with mode: 0644]
resources/oojs-ui/images/icons/move-ltr.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/move-rtl.png [new file with mode: 0644]
resources/oojs-ui/images/icons/move-rtl.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/picture.png [new file with mode: 0644]
resources/oojs-ui/images/icons/picture.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/remove-item.png [new file with mode: 0644]
resources/oojs-ui/images/icons/remove-item.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/remove.png [new file with mode: 0644]
resources/oojs-ui/images/icons/remove.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/search.png [new file with mode: 0644]
resources/oojs-ui/images/icons/search.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/settings.png [new file with mode: 0644]
resources/oojs-ui/images/icons/settings.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/tag.png [new file with mode: 0644]
resources/oojs-ui/images/icons/tag.svg [new file with mode: 0644]
resources/oojs-ui/images/icons/window.png [new file with mode: 0644]
resources/oojs-ui/images/icons/window.svg [new file with mode: 0644]
resources/oojs-ui/images/indicators/down.png [new file with mode: 0644]
resources/oojs-ui/images/indicators/down.svg [new file with mode: 0644]
resources/oojs-ui/images/indicators/required.png [new file with mode: 0644]
resources/oojs-ui/images/indicators/required.svg [new file with mode: 0644]
resources/oojs-ui/images/indicators/up.png [new file with mode: 0644]
resources/oojs-ui/images/indicators/up.svg [new file with mode: 0644]
resources/oojs-ui/images/tail.svg [new file with mode: 0644]
resources/oojs-ui/images/textures/pending.gif [new file with mode: 0644]
resources/oojs-ui/images/textures/transparency.png [new file with mode: 0644]
resources/oojs-ui/images/toolbar-shadow.png [new file with mode: 0644]
resources/oojs-ui/oojs-ui.js [new file with mode: 0644]
resources/oojs-ui/oojs-ui.svg.css [new file with mode: 0644]
resources/oojs/oojs.js
resources/sinonjs/sinon-1.8.1.js [new file with mode: 0644]
resources/sinonjs/sinon-ie-1.8.1.js [new file with mode: 0644]
skins/CologneBlue.php
skins/Vector.php
skins/vector/components/navigation.less
skins/vector/components/search.less
skins/vector/components/tabs.less
skins/vector/components/watchstar.less
skins/vector/images/arrow-collapsed-ltr.svg
skins/vector/images/arrow-collapsed-rtl.svg
skins/vector/images/arrow-down-focus-icon.svg
skins/vector/images/arrow-down-icon.svg
skins/vector/images/arrow-expanded.svg
skins/vector/images/audio-icon.svg
skins/vector/images/document-icon.svg
skins/vector/images/external-link-ltr-icon.svg
skins/vector/images/external-link-rtl-icon.svg
skins/vector/images/file-icon.svg
skins/vector/images/lock-icon.svg
skins/vector/images/mail-icon.svg
skins/vector/images/news-icon.svg
skins/vector/images/page-fade.png [new file with mode: 0644]
skins/vector/images/search-ltr.svg [new file with mode: 0644]
skins/vector/images/search-rtl.svg [new file with mode: 0644]
skins/vector/images/talk-icon.svg
skins/vector/images/unwatch-icon-hl.png [new file with mode: 0644]
skins/vector/images/unwatch-icon-hl.svg [new file with mode: 0644]
skins/vector/images/unwatch-icon.png [new file with mode: 0644]
skins/vector/images/unwatch-icon.svg [new file with mode: 0644]
skins/vector/images/user-icon.svg
skins/vector/images/video-icon.svg
skins/vector/images/watch-icon-hl.png [new file with mode: 0644]
skins/vector/images/watch-icon-hl.svg [new file with mode: 0644]
skins/vector/images/watch-icon-loading.gif [deleted file]
skins/vector/images/watch-icon-loading.png [new file with mode: 0644]
skins/vector/images/watch-icon-loading.svg [new file with mode: 0644]
skins/vector/images/watch-icon.png [new file with mode: 0644]
skins/vector/images/watch-icon.svg [new file with mode: 0644]
skins/vector/images/watch-icons.png [deleted file]
skins/vector/screen-hd.less
skins/vector/variables.less
skins/vector/vector.js
tests/parser/parserTest.inc
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/UserTest.php
tests/phpunit/includes/WikiPageTest.php
tests/phpunit/includes/api/ApiCreateAccountTest.php
tests/phpunit/includes/api/ApiOptionsTest.php
tests/qunit/QUnitTestResources.php
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.client.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
thumb.php

index db4ac44..0e3c679 100644 (file)
@@ -11,8 +11,9 @@ extensions/
 node_modules/
 resources/jquery/jquery.appear.js
 resources/jquery/jquery.async.js
-resources/jquery/jquery.cycle.all.js
+resources/jquery/jquery.ba-throttle-debounce.js
 resources/jquery/jquery.cookie.js
+resources/jquery/jquery.cycle.all.js
 resources/jquery/jquery.farbtastic.js
 resources/jquery/jquery.form.js
 resources/jquery/jquery.hoverIntent.js
@@ -23,12 +24,15 @@ resources/jquery/jquery.mockjax.js
 resources/jquery/jquery.qunit.js
 resources/jquery/jquery.validate.js
 resources/jquery/jquery.xmldom.js
+resources/jquery.chosen/chosen.jquery.js
 resources/jquery.effects/
 resources/jquery.tipsy/
 resources/jquery.ui/
 resources/mediawiki.libs/
-resources/jquery.chosen/chosen.jquery.js
 resources/oojs/
+resources/oojs-ui/
+resources/sinonjs/
+resources/moment/
 
 # github.com/jshint/jshint/issues/729
 tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
diff --git a/CREDITS b/CREDITS
index 21db850..6e28d6d 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -129,6 +129,7 @@ following names for their contribution to the product.
 * Ebrahim Byagowi
 * Edward Z. Yang
 * Elvis Stansvik
+* Eranroz
 * Erwin Dokter
 * Federico Leva
 * FunPika
@@ -216,6 +217,7 @@ following names for their contribution to the product.
 * Salvatore Ingala
 * Santhosh Thottingal
 * Scott Colcord
+* se4598
 * Sébastien Santoro
 * Simon Walker
 * Solitarius
diff --git a/HISTORY b/HISTORY
index 672cb64..b2705f1 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1831,7 +1831,7 @@ Selected changes since MediaWiki 1.17 that may be of interest:
   output.
 * (bug 14202) $wgUseTeX has been superseded by the Math extension. To re-enable
   math conversion after upgrading, obtain the Math extension from SVN or from
-  http://www.mediawiki.org/wiki/Extension:Math and add to LocalSettings.php:
+  https://www.mediawiki.org/wiki/Extension:Math and add to LocalSettings.php:
   require_once "$IP/extensions/Math/Math.php";
 * $wgProfiler is now a configuration array, see StartProfiler.sample for
   details.
@@ -1850,8 +1850,8 @@ Selected changes since MediaWiki 1.17 that may be of interest:
   whether a page is an article or not. $wgUseCommaCount is now deprecated.
 * $wgEnableDublinCoreRdf and $wgEnableCreativeCommonsRdf no longer work in core,
   and the functionality has been moved to the relevant extensions. See
-  http://www.mediawiki.org/wiki/Extension:DublinCoreRdf and
-  http://www.mediawiki.org/wiki/Extension:CreativeCommonsRdf as appropriate.
+  https://www.mediawiki.org/wiki/Extension:DublinCoreRdf and
+  https://www.mediawiki.org/wiki/Extension:CreativeCommonsRdf as appropriate.
 * (bug 21107) Split error "customcssjsprotected" into separate messages for JS and CSS
 * Removed $wgCheckCopyrightUpload from DefaultSettings, since the relevant feature
   was removed in about 1.5.
@@ -5787,7 +5787,7 @@ from first release, but nonessential bugfixes and feature developments
 will be made on the development trunk and appear in the next quarterly release.
 
 Those wishing to use the latest code instead of a branch release can obtain
-it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
+it from source control: https://www.mediawiki.org/wiki/Download_from_SVN
 
 === Configuration changes in 1.12 ===
 * Marking edits as bot edits with Special:Contributions?bot=1 now requires the
@@ -6240,7 +6240,7 @@ extensions which make use of the parser state may need compatibility changes.
 
 The new preprocessor syntax has been documented in Backus-Naur Form at:
 
-http://www.mediawiki.org/wiki/Preprocessor_ABNF
+https://www.mediawiki.org/wiki/Preprocessor_ABNF
 
 The ExpandTemplates extension now has the ability to generate an XML parse
 tree from wikitext source. This parse tree corresponds closely to the grammar
@@ -6248,7 +6248,7 @@ documented on that page.
 
 === API changes in 1.12 ===
 
-Full API documentation is available at http://www.mediawiki.org/wiki/API
+Full API documentation is available at https://www.mediawiki.org/wiki/API
 
 * (bug 11275) Enable descending sort in categorymembers
 * (bug 11308) Allow the API to output the image metadata
@@ -6339,7 +6339,7 @@ from first release, but nonessential bugfixes and feature developments
 will be made on the development trunk and appear in the next quarterly release.
 
 Those wishing to use the latest code instead of a branch release can obtain
-it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
+it from source control: https://www.mediawiki.org/wiki/Download_from_SVN
 
 == Configuration changes since 1.10 ==
 
@@ -6761,7 +6761,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
 
 == API changes since 1.10 ==
 
-Full API documentation is available at http://www.mediawiki.org/wiki/API
+Full API documentation is available at https://www.mediawiki.org/wiki/API
 
 * New properties: links, templates, images, langlinks, categories, external
   links
@@ -6927,7 +6927,7 @@ from first release, but nonessential bugfixes and feature developments
 will be made on the development trunk and appear in the next quarterly release.
 
 Those wishing to use the latest code instead of a branch release can obtain
-it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
+it from source control: https://www.mediawiki.org/wiki/Download_from_SVN
 
 == Configuration changes ==
 
@@ -9945,7 +9945,7 @@ User accounts:
   groups. Note that this does *not* allow you to make pages which are only
   accessible to certain groups.
 
-  For details see: http://www.mediawiki.org/wiki/Manual:User_rights
+  For details see: https://www.mediawiki.org/wiki/Manual:User_rights
 
 E-mail:
   User-to-user e-mail can now be restricted to require a mail-back confirmation
@@ -10195,8 +10195,8 @@ Various bugfixes, small features, and a few experimental things:
 
 * 'live preview' reduces preview reload burden on supported browsers
 * support for external editors for files and wiki pages:
-  http://www.mediawiki.org/wiki/Manual:External_editors
-* Schema reworking: http://www.mediawiki.org/wiki/Proposed_Database_Schema_Changes/October_2004
+  https://www.mediawiki.org/wiki/Manual:External_editors
+* Schema reworking: https://www.mediawiki.org/wiki/Proposed_Database_Schema_Changes/October_2004
 * (bug 15) Allow editors to view diff of their change before actually submitting an edit
 * (bug 190) Hide your own edits on the watchlist
 * (bug 510): Special:Randompage now works for other namespaces than NS_MAIN.
@@ -10879,7 +10879,7 @@ release for relevant bug fixes; see the changelog later in this file.
 If you have trouble, remember to read this whole file and the online FAQ page
 before asking for help:
 
-http://www.mediawiki.org/wiki/Manual:FAQ
+https://www.mediawiki.org/wiki/Manual:FAQ
 
 
 === READ THIS FIRST: Upgrading ===
@@ -10973,7 +10973,7 @@ For background information on nofollow see:
 * More extension hooks have been added.
 * Authentication plugin hook.
 * More internal code documentation, generated with phpdoc:
-  http://www.mediawiki.org/docs/html/
+  https://doc.wikimedia.org/mediawiki-core/master/php/html/
 
 
 === Optimization ===
@@ -11418,7 +11418,7 @@ Documentation for both end-users and site administrators is currently being
 built up on MediaWiki.org, and is covered under the GNU Free Documentation
 License:
 
-  http://www.mediawiki.org/
+  https://www.mediawiki.org/
 
 
 === Mailing list ===
diff --git a/INSTALL b/INSTALL
index 891be73..e8731a1 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -21,7 +21,7 @@ experience problems, as this configuration is not well tested. safe_mode is also
 not tested and unlikely to work.
 
 Support for rendering mathematical formulas requires installing the Math extension,
-see http://www.mediawiki.org/wiki/Extension:Math
+see https://www.mediawiki.org/wiki/Extension:Math
 
 Don't forget to check the RELEASE-NOTES file...
 
@@ -30,7 +30,7 @@ Additional documentation is available online, which may include more detailed
 notes on particular operating systems and workarounds for difficult hosting
 environments:
 
-http://www.mediawiki.org/wiki/Manual:Installation_guide
+https://www.mediawiki.org/wiki/Manual:Installation_guide
 
 
 ******************* WARNING *******************
@@ -56,7 +56,7 @@ ie. /wiki/index.php/Article.
   |  will appear. It is common in this case to use w as the folder name and  |
   |  /wiki/ as the virtual article path where your articles pretend to be.   |
   |                                                                          |
-  |    See: http://www.mediawiki.org/wiki/Manual:Short_URL                   |
+  |    See: https://www.mediawiki.org/wiki/Manual:Short_URL                  |
   +--------------------------------------------------------------------------+
 
 Hop into your browser and surf into the wiki directory. It'll direct you into
index 57080b7..64c2b3b 100644 (file)
@@ -28,10 +28,16 @@ production.
   and talk pages are now watched by them by default.
 * $wgLBFactoryConf: Class names have had underscores removed. The configuration
   should be updated if LBFactory_Simple or LBFactory_Multi is configured.
-* $wgPasswordSenderName has been deprecated. To set a custom mailer name,
-  the system message 'emailsender' should be modified (default: "{{SITENAME}}").
+* $wgPasswordSenderName has been removed and is no longer functional. To set a
+  custom mailer name, the system message 'emailsender' should be modified
+  (default: "{{SITENAME}}").
 * $wgDBAhandler was removed as the only class using it was also removed
 * The 'max threads' setting was removed from $wgDBservers.
+* Support for AdminSettings.php has been completely removed. All configuration
+  belongs in LocalSettings.php.
+* $wgSkipSkin, which has been replaceable by $wgSkipSkins since 2005 (r9249), is
+  now formally deprecated.
+* Removed deprecated $wgDisabledActions as it is hardly used anywhere.
 
 === New features in 1.23 ===
 * ResourceLoader can utilize the Web Storage API to cache modules client-side.
@@ -82,6 +88,23 @@ production.
   revision comparison pages using syntax such as [[Special:Diff/12345]],
   [[Special:Diff/12345/prev]] or [[Special:Diff/12345/98765]].
 * New user accounts' personal and talk pages are now watched by them by default.
+* Added SkinTemplateGetLanguageLink hook to allow changing the html of language
+  links.
+* Added MessageCache::get hook as a new way to customize messages across
+  multiple sites.
+* Added jquery.throttle-debounce ResourceLoader module to limit the number of
+  callbacks for frequently occurring events.
+* Special:ProtectedPages shows now a table. The timestamp, the reason and
+  the protecting user is also shown.
+* Added experimental support for using Microsoft SQL Server as the database
+  backend.
+** Added new Microsoft SQL Server-specific configuration variable
+   $wgDBWindowsAuthentication, which makes the web server authenticate against
+   the database server using Integrated Windows Authentication instead of
+   $wgDBuser/$wgDBpassword.
+* HTMLForm 'select', 'selectandother', 'selectorother', 'multiselect', and
+  'radio' fields can now use message keys as labels via the 'options-messages'
+  parameter, which overrides the 'options' parameter.
 
 === Bug fixes in 1.23 ===
 * (bug 41759) The "updated since last visit" markers (on history pages, recent
@@ -114,6 +137,9 @@ production.
   compiled without support for MySQL yet with support for another DBMS.
 * (bug 56199) Raw option of parser functions must now match complete word,
   to take effect.
+* (bug 60543) Special:PrefixIndex forgot stripprefix=1 for "Next page" link
+* (bug 29762) Undoing an already-undone edit will now display an appropriate
+  message instead of leading the user to make a null edit.
 
 === Web API changes in 1.23 ===
 * (bug 54884) action=parse&prop=categories now indicates hidden and missing
@@ -150,6 +176,15 @@ production.
   list=usercontribs.
 * list=watchlist now uses the querying user's rights rather than the wlowner's
   rights when checking whether wlprop=patrol is allowed.
+* (bug 32151) ApiWatch now has pageset capabilities (titles/pageids/generators).
+  Title parameter is now deprecated.
+* (bug 23005) Added action=revisiondelete.
+* Added siprop=restrictions to API action=query&meta=siteinfo for querying
+  possible page restriction (protection) levels and types.
+* Added prop 'limitreportdata' and 'limitreporthtml' to action=parse.
+* (bug 58627) Provide language names on action=parse&prop=langlinks.
+* Deprecated llurl= in favour of llprop=url for action=query&prop=langlinks.
+* Added llprop=langname and llprop=autonym for action=query&prop=langlinks.
 
 === Languages updated in 1.23 ===
 
@@ -202,6 +237,13 @@ changes to languages because of Bugzilla reports.
   3 headings)" was removed.
 * (bug 52810) Preference "Justify paragraphs" was removed.
 * OutputPage::showErrorPage raises a notice if arguments are incoherent.
+* Thumbnails that keep failing to render in thumb.php will be rate-limited
+  againt further render attempts for 1 hour. $wgAttemptFailureEpoch can be
+  altered to reset all rate-limited thumbnails at once.
+* (bug 56572) Builds of the OOjs and OOjs UI libraries are now available.
+* mw.loader.go and mw.loader.version have been removed.
+* (bug 52815) Preference "Enable simplified search bar (Vector skin only)"
+  was removed.
 
 ==== Removed classes ====
 * FakeMemCachedClient (deprecated in 1.18)
@@ -322,7 +364,7 @@ MediaWiki 1.23 requires PHP 5.3.2 or later.
 
 MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
 support for them is somewhat less mature. There is experimental support for
-Oracle.
+Oracle and Microsoft SQL Server.
 
 The supported versions are:
 
@@ -330,6 +372,7 @@ The supported versions are:
 * PostgreSQL 8.3 or later
 * SQLite 3.3.7 or later
 * Oracle 9.0.1 or later
+* Microsoft SQL Server 2005 (9.00.1399)
 
 == Upgrading ==
 
diff --git a/UPGRADE b/UPGRADE
index 96b5836..1ff98cd 100644 (file)
--- a/UPGRADE
+++ b/UPGRADE
@@ -2,7 +2,7 @@
 This file provides an overview of the MediaWiki upgrade process. For help with
 specific problems, check
 
-* the documentation at http://www.mediawiki.org
+* the documentation at https://www.mediawiki.org
 * the mediawiki-l mailing list archive at
   http://lists.wikimedia.org/pipermail/mediawiki-l/
 * the bug tracker at https://bugzilla.wikimedia.org
@@ -12,7 +12,7 @@ for information and workarounds to common issues.
 == Overview ==
 
 Comprehensive documentation on upgrading to the latest version of the software
-is available at http://www.mediawiki.org/wiki/Manual:Upgrading.
+is available at https://www.mediawiki.org/wiki/Manual:Upgrading.
 
 === Consult the release notes ===
 
@@ -28,7 +28,7 @@ you take a complete backup of your wiki database and files and verify it. While
 the upgrade scripts are somewhat robust, there is no guarantee that things will
 not fail, leaving the database in an inconsistent state.
 
-http://www.mediawiki.org/wiki/Manual:Backing_up_a_wiki provides an overview of
+https://www.mediawiki.org/wiki/Manual:Backing_up_a_wiki provides an overview of
 the backup process. You should also refer to the documentation for your
 database management system for information on backing up a database, and to
 your operating system documentation for information on making copies of files.
index 65a597b..735f26b 100644 (file)
@@ -7,7 +7,7 @@ By Tim Starling, January 2006.
 
 For information about the MediaWiki database layout, such as a 
 description of the tables and their contents, please see:
-  http://www.mediawiki.org/wiki/Manual:Database_layout
+  https://www.mediawiki.org/wiki/Manual:Database_layout
   https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/core.git;a=blob_plain;f=maintenance/tables.sql;hb=HEAD
 
 
index f95ef0f..5c04add 100644 (file)
@@ -3,7 +3,7 @@ design.txt
 This is a brief overview of the new design.
 
 More thorough and up-to-date information is available on the documentation
-wiki at http://www.mediawiki.org/
+wiki at https://www.mediawiki.org/
 
 Primary classes:
 
index 4a65431..efa573d 100644 (file)
@@ -52,7 +52,7 @@ root, is /w (so, e.g., /var/www/w).  Rewrite rules can then be used to enable
 is the convention Wikipedia uses.)  In theory, it should be possible to enable
 the appropriate rewrite rules by default, if you can reconfigure the web
 server, but you'd need to alter LocalSettings.php too.  See
-<http://www.mediawiki.org/wiki/Manual:Short_URL> for details on short URLs.
+<https://www.mediawiki.org/wiki/Manual:Short_URL> for details on short URLs.
 
 If you really must mess around with the directory structure, note that the
 following files *must* all be web-accessible for MediaWiki to function
@@ -122,7 +122,7 @@ needed to rename LocalSettings.php in order to upgrade using the installer).
 == Documentation ==
 
 MediaWiki's official documentation is split between two places: the source
-code, and <http://www.mediawiki.org/>.  The source code documentation is written
+code, and <https://www.mediawiki.org/>.  The source code documentation is written
 exclusively by developers, and so is likely to be reliable (at worst,
 outdated).  However, it can be pretty sparse.  mediawiki.org documentation is
 often much more thorough, but it's maintained by a wiki that's open to
@@ -135,7 +135,7 @@ MediaWiki is a project hosted and led by the Wikimedia Foundation, the
 not-for-profit charity that operates Wikipedia.  Wikimedia employs the lead
 developer and several other paid developers, but commit access is given out
 liberally and there are multiple very active volunteer developers as well.  A
-list of developers can be found at <http://www.mediawiki.org/wiki/Developers>.
+list of developers can be found at <https://www.mediawiki.org/wiki/Developers>.
 
 MediaWiki's bug tracker is at <https://bugzilla.wikimedia.org>.  However, most
 developers follow the bug tracker little or not at all.  The best place to
@@ -179,7 +179,7 @@ perhaps configure it to use them (see Configuration section of this document):
   * Squid: Can provide a drastic speedup and a major cut in resource
   consumption, but enabling it may interfere with other applications.  It might
   be suitable for a separate mediawiki-squid package.  For setup details, see:
-  <http://www.mediawiki.org/wiki/Manual:Squid_caching>
+  <https://www.mediawiki.org/wiki/Manual:Squid_caching>
   * rsvg or other SVG rasterizer: ImageMagick can be used for SVG support, but
   is not ideal.  Wikipedia (as of the time of this writing) uses rsvg.  To
   enable, set "$wgSVGConverter = 'rsvg';" (or other as appropriate).
index cfee2eb..9268f83 100644 (file)
@@ -1667,6 +1667,12 @@ $mediaWiki: The $mediawiki object
 $title: title of the message (string)
 $message: value (string), change it to the message you want to define
 
+'MessageCache::get': When fetching a message. Can be used to override the key
+for customisations. Given and returned message key must be in special format:
+1) first letter must be in lower case according to the content language.
+2) spaces must be replaced with underscores
+&$key: message key (string)
+
 'MessageCacheReplace': When a message page is changed. Useful for updating
 caches.
 $title: name of the page changed.
@@ -1967,6 +1973,12 @@ $form: the PreferencesForm object. This is a ContextSource as well
 $key: the section name
 &$legend: the legend text. Defaults to wfMessage( "prefs-$key" )->text() but may be overridden
 
+'PreferencesFormPreSave': Override preferences being saved
+ $formData: array of user submitted data
+ $form: PreferencesForm object, also a ContextSource
+ $user: User object with preferences to be saved set
+ &$result: boolean indicating success
+
 'PrefixSearchBackend': Override the title prefix search used for OpenSearch and
 AJAX search suggestions. Put results into &$results outparam and return false.
 $ns : array of int namespace keys to search in
@@ -2187,6 +2199,13 @@ link" tab.
 $sktemplate: SkinTemplate object
 $nav_urls: array of tabs
 
+'SkinTemplateGetLanguageLink': After building the data for a language link from
+which the actual html is constructed.
+&$languageLink: array containing data about the link. The following keys can be
+  modified: href, text, title, class, lang, hreflang. Each of them is a string.
+$languageLinkTitle: Title object belonging to the external language link
+$title: Title object of the page the link belongs to
+
 To alter the structured navigation links in SkinTemplates, there are three
 hooks called in different spots:
 
@@ -2230,6 +2249,11 @@ $dummy: Called when SkinTemplateToolboxEnd is used from a BaseTemplate skin,
   dummy parameter with "$dummy=false" in their code and return without echoing
   any HTML to avoid creating duplicate toolbox items.
 
+'SkinVectorStyleModules': Called when defining the list of module styles to be
+loaded by the Vector skin.
+$skin: SkinVector object
+&$styles: Array of module names whose style will be loaded for the skin
+
 'SoftwareInfo': Called by Special:Version for returning information about the
 software.
 $software: The array of software in format 'name' => 'version'. See
@@ -2515,6 +2539,7 @@ $nt: new title
 $user: user who did the move
 $pageid: database ID of the page that's been moved
 $redirid: database ID of the created redirect
+$reason: reason for the move
 
 'TitleReadWhitelist': Called at the end of read permissions checks, just before
 adding the default error message if nothing allows the user to read the page. If
index 42a6027..8f4cf75 100644 (file)
@@ -2,4 +2,4 @@ language.txt
 
 The Language object handles all readable text produced by the software.
 
-See http://www.mediawiki.org/wiki/Localisation#General_use_.28for_developers.29
+See https://www.mediawiki.org/wiki/Localisation#General_use_.28for_developers.29
index 1d9bf7d..46fcecc 100644 (file)
@@ -90,6 +90,6 @@ Note: the 'ParserFirstCallInit' hook is only aviable since 1.12. To work with
 an older version, you'll need to use an extension function.
 
 Online documentation (contains more informations):
-Magic words: http://www.mediawiki.org/wiki/Manual:Magic_words
-Variables: http://www.mediawiki.org/wiki/Manual:Variable
-Parser functions: http://www.mediawiki.org/wiki/Manual:Parser_functions
\ No newline at end of file
+Magic words: https://www.mediawiki.org/wiki/Manual:Magic_words
+Variables: https://www.mediawiki.org/wiki/Manual:Variable
+Parser functions: https://www.mediawiki.org/wiki/Manual:Parser_functions
\ No newline at end of file
index 365576c..7a92d0a 100644 (file)
@@ -6,4 +6,4 @@ That file has been commented with details of the usage for
 each table and field.
 
 Historical information and some other notes are available at
-http://www.mediawiki.org/wiki/Manual:Database_layout
+https://www.mediawiki.org/wiki/Manual:Database_layout
index 0b8ee8f..4f16709 100644 (file)
@@ -9,16 +9,16 @@ Primary scripts:
 
   index.php
     Main access point. It handles the most of requests.
-    See http://www.mediawiki.org/wiki/Manual:Index.php
+    See https://www.mediawiki.org/wiki/Manual:Index.php
 
   api.php
     Script to provide an API for bots to fetch content and informations about
-    the site and also modify it. See http://www.mediawiki.org/wiki/API
+    the site and also modify it. See https://www.mediawiki.org/wiki/API
     for more informations.
 
   img_auth.php
     Script that only serve images to logged in users. To configure the wiki
-    to use that script, see http://www.mediawiki.org/wiki/Manual:Image_Authorisation.
+    to use that script, see https://www.mediawiki.org/wiki/Manual:Image_Authorisation.
 
   load.php
     Used by ResourceLoader to serve minified, concatenated and gzipped CSS and JS.
@@ -40,7 +40,7 @@ Primary scripts:
 
     To enable the profileinfo.php itself, you'll need to set $wgDBadminuser
     and $wgDBadminpassword in your LocalSettings.php, as well as $wgEnableProfileInfo 
-    See also http://www.mediawiki.org/wiki/How_to_debug#Profiling.
+    See also https://www.mediawiki.org/wiki/How_to_debug#Profiling.
 
   thumb.php
     Script used to resize images if it is configured to be done when the web
index 1459d7a..58f77cf 100644 (file)
@@ -55,7 +55,7 @@ These can also be customised on a per-user basis, by editing
 
 This feature has led to a wide variety of "user styles" becoming available:
 
-http://www.mediawiki.org/wiki/Manual:Gallery_of_user_styles
+https://www.mediawiki.org/wiki/Manual:Gallery_of_user_styles
 
 If you want a different look for your wiki, that gallery is a good place to start.
 
@@ -76,7 +76,7 @@ This technique is used by the more ambitious MediaWiki site operators, to
 create complex custom skins for their wikis. It should be preferred over 
 editing the core Monobook skin directly.
 
-See http://www.mediawiki.org/wiki/Manual:Skinning for more information.
+See https://www.mediawiki.org/wiki/Manual:Skinning for more information.
 
 == Extension skins ==
 
index 037ef9a..ac8a9f0 100644 (file)
@@ -220,7 +220,7 @@ class AjaxResponse {
                }
 
                if ( !$wgCachePages ) {
-                       wfDebug( "$fname: CACHE DISABLED\n", false );
+                       wfDebug( "$fname: CACHE DISABLED\n", 'log' );
                        return false;
                }
 
@@ -234,8 +234,8 @@ class AjaxResponse {
                        $modsince = preg_replace( '/;.*$/', '', $_SERVER["HTTP_IF_MODIFIED_SINCE"] );
                        $modsinceTime = strtotime( $modsince );
                        $ismodsince = wfTimestamp( TS_MW, $modsinceTime ? $modsinceTime : 1 );
-                       wfDebug( "$fname: -- client send If-Modified-Since: " . $modsince . "\n", false );
-                       wfDebug( "$fname: --  we might send Last-Modified : $lastmod\n", false );
+                       wfDebug( "$fname: -- client send If-Modified-Since: " . $modsince . "\n", 'log' );
+                       wfDebug( "$fname: --  we might send Last-Modified : $lastmod\n", 'log' );
 
                        if ( ( $ismodsince >= $timestamp ) && $wgUser->validateCache( $ismodsince ) && $ismodsince >= $wgCacheEpoch ) {
                                ini_set( 'zlib.output_compression', 0 );
@@ -243,15 +243,15 @@ class AjaxResponse {
                                $this->disable();
                                $this->mLastModified = $lastmod;
 
-                               wfDebug( "$fname: CACHED client: $ismodsince ; user: {$wgUser->getTouched()} ; page: $timestamp ; site $wgCacheEpoch\n", false );
+                               wfDebug( "$fname: CACHED client: $ismodsince ; user: {$wgUser->getTouched()} ; page: $timestamp ; site $wgCacheEpoch\n", 'log' );
 
                                return true;
                        } else {
-                               wfDebug( "$fname: READY  client: $ismodsince ; user: {$wgUser->getTouched()} ; page: $timestamp ; site $wgCacheEpoch\n", false );
+                               wfDebug( "$fname: READY  client: $ismodsince ; user: {$wgUser->getTouched()} ; page: $timestamp ; site $wgCacheEpoch\n", 'log' );
                                $this->mLastModified = $lastmod;
                        }
                } else {
-                       wfDebug( "$fname: client did not send If-Modified-Since header\n", false );
+                       wfDebug( "$fname: client did not send If-Modified-Since header\n", 'log' );
                        $this->mLastModified = $lastmod;
                }
                return false;
index a5d4d5b..b132ca9 100644 (file)
@@ -611,6 +611,7 @@ class Article implements Page {
                                        if ( !$this->mPage->exists() ) {
                                                wfDebug( __METHOD__ . ": showing missing article\n" );
                                                $this->showMissingArticle();
+                                               $this->mPage->doViewUpdates( $user );
                                                wfProfileOut( __METHOD__ );
                                                return;
                                        }
index 0f1cded..54635e9 100644 (file)
@@ -365,6 +365,7 @@ $wgAutoloadLocalClasses = array(
        'ApiQueryWatchlist' => 'includes/api/ApiQueryWatchlist.php',
        'ApiQueryWatchlistRaw' => 'includes/api/ApiQueryWatchlistRaw.php',
        'ApiResult' => 'includes/api/ApiResult.php',
+       'ApiRevisionDelete' => 'includes/api/ApiRevisionDelete.php',
        'ApiRollback' => 'includes/api/ApiRollback.php',
        'ApiRsd' => 'includes/api/ApiRsd.php',
        'ApiSetNotificationTimestamp' => 'includes/api/ApiSetNotificationTimestamp.php',
@@ -473,7 +474,8 @@ $wgAutoloadLocalClasses = array(
        'LoadMonitorMySQL' => 'includes/db/LoadMonitor.php',
        'LoadMonitorNull' => 'includes/db/LoadMonitor.php',
        'MssqlField' => 'includes/db/DatabaseMssql.php',
-       'MssqlResult' => 'includes/db/DatabaseMssql.php',
+       'MssqlBlob' => 'includes/db/DatabaseMssql.php',
+       'MssqlResultWrapper' => 'includes/db/DatabaseMssql.php',
        'MySQLField' => 'includes/db/DatabaseMysqlBase.php',
        'MySQLMasterPos' => 'includes/db/DatabaseMysqlBase.php',
        'ORAField' => 'includes/db/DatabaseOracle.php',
@@ -610,6 +612,8 @@ $wgAutoloadLocalClasses = array(
        'InstallDocFormatter' => 'includes/installer/InstallDocFormatter.php',
        'Installer' => 'includes/installer/Installer.php',
        'LocalSettingsGenerator' => 'includes/installer/LocalSettingsGenerator.php',
+       'MssqlInstaller' => 'includes/installer/MssqlInstaller.php',
+       'MssqlUpdater' => 'includes/installer/MssqlUpdater.php',
        'MysqlInstaller' => 'includes/installer/MysqlInstaller.php',
        'MysqlUpdater' => 'includes/installer/MysqlUpdater.php',
        'OracleInstaller' => 'includes/installer/OracleInstaller.php',
index 3c22f9b..3575b9d 100644 (file)
@@ -435,13 +435,14 @@ class Block {
         * Update a block in the DB with new parameters.
         * The ID field needs to be loaded first.
         *
-        * @return Int number of affected rows, which should probably be 1 or something has
-        *     gone slightly awry
+        * @return bool|array False on failure, array on success: ('id' => block ID, 'autoIds' => array of autoblock IDs)
         */
        public function update() {
                wfDebug( "Block::update; timestamp {$this->mTimestamp}\n" );
                $dbw = wfGetDB( DB_MASTER );
 
+               $dbw->startAtomic( __METHOD__ );
+
                $dbw->update(
                        'ipblocks',
                        $this->getDatabaseArray( $dbw ),
@@ -449,7 +450,23 @@ class Block {
                        __METHOD__
                );
 
-               return $dbw->affectedRows();
+               $affected = $dbw->affectedRows();
+
+               $dbw->update(
+                       'ipblocks',
+                       $this->getAutoblockUpdateArray(),
+                       array( 'ipb_parent_block_id' => $this->getId() ),
+                       __METHOD__
+               );
+
+               $dbw->endAtomic( __METHOD__ );
+
+               if ( $affected ) {
+                       $auto_ipd_ids = $this->doRetroactiveAutoblock();
+                       return array( 'id' => $this->mId, 'autoIds' => $auto_ipd_ids );
+               }
+
+               return false;
        }
 
        /**
@@ -492,6 +509,20 @@ class Block {
                return $a;
        }
 
+       /**
+        * @return Array
+        */
+       protected function getAutoblockUpdateArray() {
+               return array(
+                       'ipb_by'               => $this->getBy(),
+                       'ipb_by_text'          => $this->getByName(),
+                       'ipb_reason'           => $this->mReason,
+                       'ipb_create_account'   => $this->prevents( 'createaccount' ),
+                       'ipb_deleted'          => (int)$this->mHideName, // typecast required for SQLite
+                       'ipb_allow_usertalk'   => !$this->prevents( 'editownusertalk' ),
+               );
+       }
+
        /**
         * Retroactively autoblocks the last IP used by the user (if it is a user)
         * blocked by this Block.
index b51256b..d2a5797 100644 (file)
@@ -514,7 +514,7 @@ class IcuCollation extends Collation {
         * Do a binary search, and return the index of the largest item that sorts
         * less than or equal to the target value.
         *
-        * @deprecated in 1.22; use ArrayUtils::findLowerBound() instead
+        * @deprecated in 1.23; use ArrayUtils::findLowerBound() instead
         *
         * @param array $valueCallback A function to call to get the value with
         *     a given array index.
@@ -528,7 +528,7 @@ class IcuCollation extends Collation {
         *     sorts before all items.
         */
        function findLowerBound( $valueCallback, $valueCount, $comparisonCallback, $target ) {
-               wfDeprecated( __METHOD__, '1.22' );
+               wfDeprecated( __METHOD__, '1.23' );
                return ArrayUtils::findLowerBound( $valueCallback, $valueCount, $comparisonCallback, $target );
        }
 
index 326a1c2..b3e04d0 100644 (file)
@@ -868,6 +868,13 @@ $wgContentHandlers = array(
        CONTENT_MODEL_TEXT => 'TextContentHandler',
 );
 
+/**
+ * Whether to enable server-side image thumbnailing. If false, images will
+ * always be sent to the client in full resolution, with appropriate width= and
+ * height= attributes on the <img> tag for the client to do its own scaling.
+ */
+$wgUseImageResize = true;
+
 /**
  * Resizing can be done using PHP's internal image libraries or using
  * ImageMagick or another third-party converter, e.g. GraphicMagick.
@@ -883,11 +890,6 @@ $wgUseImageMagick = false;
  */
 $wgImageMagickConvertCommand = '/usr/bin/convert';
 
-/**
- * The identify command shipped with ImageMagick
- */
-$wgImageMagickIdentifyCommand = '/usr/bin/identify';
-
 /**
  * Sharpening parameter to ImageMagick
  */
@@ -1031,6 +1033,14 @@ $wgTiffThumbnailType = false;
  */
 $wgThumbnailEpoch = '20030516000000';
 
+/**
+ * Certain operations are avoided if there were too many recent failures,
+ * for example, thumbnail generation. Bump this value to invalidate all
+ * memory of failed operations and thus allow further attempts to resume.
+ * This is useful when a cause for the failures has been found and fixed.
+ */
+$wgAttemptFailureEpoch = 1;
+
 /**
  * If set, inline scaled images will still produce "<img>" tags ready for
  * output instead of showing an error message.
@@ -1058,11 +1068,6 @@ $wgGenerateThumbnailOnParse = true;
  */
 $wgShowArchiveThumbnails = true;
 
-/**
- * Obsolete, always true, kept for compatibility with extensions
- */
-$wgUseImageResize = true;
-
 /**
  * If set to true, images that contain certain the exif orientation tag will
  * be rotated accordingly. If set to null, try to auto-detect whether a scaler
@@ -1577,7 +1582,7 @@ $wgSQLMode = '';
 /**
  * Mediawiki schema
  */
-$wgDBmwschema = 'mediawiki';
+$wgDBmwschema = null;
 
 /**
  * To override default SQLite data directory ($docroot/../data)
@@ -1797,6 +1802,11 @@ $wgSlaveLagWarning = 10;
  */
 $wgSlaveLagCritical = 30;
 
+/**
+ * Use Windows Authentication instead of $wgDBuser / $wgDBpassword for MS SQL Server
+ */
+$wgDBWindowsAuthentication = false;
+
 /**@}*/ # End of DB settings }
 
 /************************************************************************//**
@@ -2900,6 +2910,8 @@ $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
+ *
+ * @deprecated since 1.23; use $wgSkipSkins instead
  */
 $wgSkipSkin = '';
 
@@ -4017,7 +4029,6 @@ $wgDefaultUserOptions = array(
        'underline' => 2,
        'uselivepreview' => 0,
        'usenewrc' => 0,
-       'vector-simplesearch' => 1,
        'watchcreations' => 1,
        'watchdefault' => 1,
        'watchdeletion' => 0,
@@ -5429,13 +5440,6 @@ if ( !isset( $wgCommandLineMode ) ) {
  */
 $wgCommandLineDarkBg = false;
 
-/**
- * Array for extensions to register their maintenance scripts with the
- * system. The key is the name of the class and the value is the full
- * path to the file
- */
-$wgMaintenanceScripts = array();
-
 /**
  * Set this to a string to put the wiki into read-only mode. The text will be
  * used as an explanation to users.
@@ -5957,21 +5961,22 @@ $wgExtensionMessagesFiles = array();
  *
  * @par Simple example:
  * @code
- *    $wgMessagesDirs['ConfirmEdit'] = __DIR__ . '/i18n';
+ *    $wgMessagesDirs['Example'] = __DIR__ . '/i18n';
  * @endcode
  *
  * @par Complex example:
  * @code
- *    $wgMessagesDirs['VisualEditor'] = array(
+ *    $wgMessagesDirs['Example'] = array(
+ *        __DIR__ . '/lib/ve/i18n',
+ *        __DIR__ . '/lib/oojs-ui/i18n',
  *        __DIR__ . '/i18n',
- *        __DIR__ . '/modules/ve-core/i18n',
- *        __DIR__ . '/modules/qunit/localisation',
- *        __DIR__ . '/modules/oojs-ui/messages',
  *    )
  * @endcode
  * @since 1.23
  */
-$wgMessagesDirs = array();
+$wgMessagesDirs = array(
+       "$IP/resources/oojs-ui/i18n",
+);
 
 /**
  * Array of files with list(s) of extension entry points to be used in
@@ -6162,7 +6167,8 @@ $wgJobQueueAggregator = array(
  * Expensive Querypages are already updated.
  */
 $wgSpecialPageCacheUpdates = array(
-       'Statistics' => array( 'SiteStatsUpdate', 'cacheUpdate' )
+       'Statistics' => array( 'SiteStatsUpdate', 'cacheUpdate' ),
+       'Activeusers' => array( 'SpecialActiveUsers', 'cacheUpdate' ),
 );
 
 /**
@@ -6476,12 +6482,6 @@ $wgActions = array(
        'watch' => true,
 );
 
-/**
- * Array of disabled article actions, e.g. view, edit, delete, etc.
- * @deprecated since 1.18; just set $wgActions['action'] = false instead
- */
-$wgDisabledActions = array();
-
 /** @} */ # end actions }
 
 /*************************************************************************//**
index 015ea9c..19801ec 100644 (file)
@@ -165,11 +165,6 @@ define( 'ALF_NO_BLOCK_LOCK', 8 );
  * Date format selectors; used in user preference storage and by
  * Language::date() and co.
  */
-/*define( 'MW_DATE_DEFAULT', '0' );
-define( 'MW_DATE_MDY', '1' );
-define( 'MW_DATE_DMY', '2' );
-define( 'MW_DATE_YMD', '3' );
-define( 'MW_DATE_ISO', 'ISO 8601' );*/
 define( 'MW_DATE_DEFAULT', 'default' );
 define( 'MW_DATE_MDY', 'mdy' );
 define( 'MW_DATE_DMY', 'dmy' );
index 06bdadd..9a27d23 100644 (file)
@@ -892,7 +892,7 @@ class EditPage {
         * @since 1.21
         */
        protected function getContentObject( $def_content = null ) {
-               global $wgOut, $wgRequest;
+               global $wgOut, $wgRequest, $wgUser, $wgContLang;
 
                wfProfileIn( __METHOD__ );
 
@@ -930,10 +930,6 @@ class EditPage {
                                $undo = $wgRequest->getInt( 'undo' );
 
                                if ( $undo > 0 && $undoafter > 0 ) {
-                                       if ( $undo < $undoafter ) {
-                                               # If they got undoafter and undo round the wrong way, switch them
-                                               list( $undo, $undoafter ) = array( $undoafter, $undo );
-                                       }
 
                                        $undorev = Revision::newFromId( $undo );
                                        $oldrev = Revision::newFromId( $undoafter );
@@ -942,8 +938,6 @@ class EditPage {
                                        # the revisions exist and they were not deleted.
                                        # Otherwise, $content will be left as-is.
                                        if ( !is_null( $undorev ) && !is_null( $oldrev ) &&
-                                               $undorev->getPage() == $oldrev->getPage() &&
-                                               $undorev->getPage() == $this->mTitle->getArticleID() &&
                                                !$undorev->isDeleted( Revision::DELETED_TEXT ) &&
                                                !$oldrev->isDeleted( Revision::DELETED_TEXT ) ) {
 
@@ -953,34 +947,45 @@ class EditPage {
                                                        # Warn the user that something went wrong
                                                        $undoMsg = 'failure';
                                                } else {
-                                                       # Inform the user of our success and set an automatic edit summary
-                                                       $undoMsg = 'success';
-
-                                                       # If we just undid one rev, use an autosummary
-                                                       $firstrev = $oldrev->getNext();
-                                                       if ( $firstrev && $firstrev->getId() == $undo ) {
-                                                               $userText = $undorev->getUserText();
-                                                               if ( $userText === '' ) {
-                                                                       $undoSummary = wfMessage(
-                                                                               'undo-summary-username-hidden',
-                                                                               $undo
-                                                                       )->inContentLanguage()->text();
-                                                               } else {
-                                                                       $undoSummary = wfMessage(
-                                                                               'undo-summary',
-                                                                               $undo,
-                                                                               $userText
-                                                                       )->inContentLanguage()->text();
-                                                               }
-                                                               if ( $this->summary === '' ) {
-                                                                       $this->summary = $undoSummary;
-                                                               } else {
-                                                                       $this->summary = $undoSummary . wfMessage( 'colon-separator' )
-                                                                               ->inContentLanguage()->text() . $this->summary;
+                                                       $oldContent = $this->mArticle->getPage()->getContent( Revision::RAW );
+                                                       $popts = ParserOptions::newFromUserAndLang( $wgUser, $wgContLang );
+                                                       $newContent = $content->preSaveTransform( $this->mTitle, $wgUser, $popts );
+
+                                                       if ( $newContent->equals( $oldContent ) ) {
+                                                               # Tell the user that the undo results in no change,
+                                                               # i.e. the revisions were already undone.
+                                                               $undoMsg = 'nochange';
+                                                               $content = false;
+                                                       } else {
+                                                               # Inform the user of our success and set an automatic edit summary
+                                                               $undoMsg = 'success';
+
+                                                               # If we just undid one rev, use an autosummary
+                                                               $firstrev = $oldrev->getNext();
+                                                               if ( $firstrev && $firstrev->getId() == $undo ) {
+                                                                       $userText = $undorev->getUserText();
+                                                                       if ( $userText === '' ) {
+                                                                               $undoSummary = wfMessage(
+                                                                                       'undo-summary-username-hidden',
+                                                                                       $undo
+                                                                               )->inContentLanguage()->text();
+                                                                       } else {
+                                                                               $undoSummary = wfMessage(
+                                                                                       'undo-summary',
+                                                                                       $undo,
+                                                                                       $userText
+                                                                               )->inContentLanguage()->text();
+                                                                       }
+                                                                       if ( $this->summary === '' ) {
+                                                                               $this->summary = $undoSummary;
+                                                                       } else {
+                                                                               $this->summary = $undoSummary . wfMessage( 'colon-separator' )
+                                                                                       ->inContentLanguage()->text() . $this->summary;
+                                                                       }
+                                                                       $this->undidRev = $undo;
                                                                }
-                                                               $this->undidRev = $undo;
+                                                               $this->formtype = 'diff';
                                                        }
-                                                       $this->formtype = 'diff';
                                                }
                                        } else {
                                                // Failed basic sanity checks.
@@ -989,7 +994,7 @@ class EditPage {
                                                $undoMsg = 'norev';
                                        }
 
-                                       // Messages: undo-success, undo-failure, undo-norev
+                                       // Messages: undo-success, undo-failure, undo-norev, undo-nochange
                                        $class = ( $undoMsg == 'success' ? '' : 'error ' ) . "mw-undo-{$undoMsg}";
                                        $this->editFormPageTop .= $wgOut->parse( "<div class=\"{$class}\">" .
                                                wfMessage( 'undo-' . $undoMsg )->plain() . '</div>', true, /* interface */true );
index 5377add..e91a178 100644 (file)
@@ -38,7 +38,8 @@ class MWException extends Exception {
        function useOutputPage() {
                return $this->useMessageCache() &&
                        !empty( $GLOBALS['wgFullyInitialised'] ) &&
-                       !empty( $GLOBALS['wgOut'] );
+                       !empty( $GLOBALS['wgOut'] ) &&
+                       !defined( 'MEDIAWIKI_INSTALL' );
        }
 
        /**
@@ -317,7 +318,7 @@ class ErrorPageError extends MWException {
         * @param string|Message $msg Message key (string) for error text, or a Message object
         * @param array $params with parameters to wfMessage()
         */
-       function __construct( $title, $msg, $params = null ) {
+       function __construct( $title, $msg, $params = array() ) {
                $this->title = $title;
                $this->msg = $msg;
                $this->params = $params;
@@ -356,7 +357,7 @@ class BadTitleError extends ErrorPageError {
         * @param string|Message $msg A message key (default: 'badtitletext')
         * @param array $params parameter to wfMessage()
         */
-       function __construct( $msg = 'badtitletext', $params = null ) {
+       function __construct( $msg = 'badtitletext', $params = array() ) {
                parent::__construct( 'badtitle', $msg, $params );
        }
 
@@ -426,7 +427,7 @@ class ReadOnlyError extends ErrorPageError {
                parent::__construct(
                        'readonly',
                        'readonlytext',
-                       wfReadOnlyReason()
+                       wfReadOnlyReason() ?: array()
                );
        }
 }
@@ -501,12 +502,12 @@ class UserNotLoggedIn extends ErrorPageError {
         * @param string $titleMsg A message key to set the page title.
         *        Optional, default: 'exception-nologin'
         * @param array $params Parameters to wfMessage().
-        *        Optional, default: null
+        *        Optional, default: array()
         */
        public function __construct(
                $reasonMsg = 'exception-nologin-text',
                $titleMsg = 'exception-nologin',
-               $params = null
+               $params = array()
        ) {
                parent::__construct( $titleMsg, $reasonMsg, $params );
        }
@@ -901,14 +902,14 @@ class MWExceptionHandler {
                if ( !( $e instanceof MWException ) || $e->isLoggable() ) {
                        $log = self::getLogMessage( $e );
                        if ( $wgLogExceptionBacktrace ) {
-                               wfDebugLog( 'exception', $log . "\n" . $e->getTraceAsString() . "\n" );
+                               wfDebugLog( 'exception', $log . "\n" . $e->getTraceAsString() );
                        } else {
                                wfDebugLog( 'exception', $log );
                        }
 
                        $json = self::jsonSerializeException( $e, false, FormatJson::ALL_OK );
                        if ( $json !== false ) {
-                               wfDebugLog( 'exception-json', $json, false );
+                               wfDebugLog( 'exception-json', $json, 'private' );
                        }
                }
 
index e0bd5cd..877c2d2 100644 (file)
@@ -44,13 +44,13 @@ class GitInfo {
         * @param string $dir The root directory of the repo where the .git dir can be found
         */
        public function __construct( $dir ) {
-               $this->basedir = "{$dir}/.git";
+               $this->basedir = $dir . DIRECTORY_SEPARATOR . '.git';
                if ( is_readable( $this->basedir ) && !is_dir( $this->basedir ) ) {
                        $GITfile = file_get_contents( $this->basedir );
                        if ( strlen( $GITfile ) > 8 && substr( $GITfile, 0, 8 ) === 'gitdir: ' ) {
                                $path = rtrim( substr( $GITfile, 8 ), "\r\n" );
                                $isAbsolute = $path[0] === '/' || substr( $path, 1, 1 ) === ':';
-                               $this->basedir = $isAbsolute ? $path : "{$dir}/{$path}";
+                               $this->basedir = $isAbsolute ? $path : $dir . DIRECTORY_SEPARATOR . $path;
                        }
                }
        }
@@ -169,13 +169,15 @@ class GitInfo {
                        return false;
                }
 
+               wfSuppressWarnings();
                $configArray = parse_ini_file( $config, true );
+               wfRestoreWarnings();
                $remote = false;
 
                // Use the "origin" remote repo if available or any other repo if not.
                if ( isset( $configArray['remote origin'] ) ) {
                        $remote = $configArray['remote origin'];
-               } else {
+               } elseif ( is_array( $configArray ) ) {
                        foreach ( $configArray as $sectionName => $sectionConf ) {
                                if ( substr( $sectionName, 0, 6 ) == 'remote' ) {
                                        $remote = $sectionConf;
index 2dda695..6785d0c 100644 (file)
@@ -924,21 +924,33 @@ function wfMatchesDomainList( $url, $domains ) {
  * $wgDebugComments - if on, some debug items may appear in comments in the HTML output.
  *
  * @param $text String
- * @param bool $logonly set true to avoid appearing in HTML when $wgDebugComments is set
- */
-function wfDebug( $text, $logonly = false ) {
+ * @param string|bool $dest Destination of the message:
+ *     - 'all': both to the log and HTML (debug toolbar or HTML comments)
+ *     - 'log': only to the log and not in HTML
+ *   For backward compatibility, it can also take a boolean:
+ *     - true: same as 'all'
+ *     - false: same as 'log'
+ */
+function wfDebug( $text, $dest = 'all' ) {
        global $wgDebugLogFile, $wgProfileOnly, $wgDebugRawPage, $wgDebugLogPrefix;
 
        if ( !$wgDebugRawPage && wfIsDebugRawPage() ) {
                return;
        }
 
+       // Turn $dest into a string if it's a boolean (for b/c)
+       if ( $dest === true ) {
+               $dest = 'all';
+       } elseif ( $dest === false ) {
+               $dest = 'log';
+       }
+
        $timer = wfDebugTimer();
        if ( $timer !== '' ) {
                $text = preg_replace( '/[^\n]/', $timer . '\0', $text, 1 );
        }
 
-       if ( !$logonly ) {
+       if ( $dest === 'all' ) {
                MWDebug::debugMsg( $text );
        }
 
@@ -1019,18 +1031,38 @@ function wfDebugMem( $exact = false ) {
  * @param $text String
  * @param bool $public whether to log the event in the public log if no private
  *                     log file is specified, (default true)
- */
-function wfDebugLog( $logGroup, $text, $public = true ) {
+ * @param string|bool $dest Destination of the message:
+ *     - 'all': both to the log and HTML (debug toolbar or HTML comments)
+ *     - 'log': only to the log and not in HTML
+ *     - 'private': only to the specifc log if set in $wgDebugLogGroups and
+ *       discarded otherwise
+ *   For backward compatibility, it can also take a boolean:
+ *     - true: same as 'all'
+ *     - false: same as 'private'
+ */
+function wfDebugLog( $logGroup, $text, $dest = 'all' ) {
        global $wgDebugLogGroups;
+
        $text = trim( $text ) . "\n";
 
+       // Turn $dest into a string if it's a boolean (for b/c)
+       if ( $dest === true ) {
+               $dest = 'all';
+       } elseif ( $dest === false ) {
+               $dest = 'private';
+       }
+
        if ( !isset( $wgDebugLogGroups[$logGroup] ) ) {
-               if ( $public === true ) {
-                       wfDebug( "[$logGroup] $text", false );
+               if ( $dest !== 'private' ) {
+                       wfDebug( "[$logGroup] $text", $dest );
                }
                return;
        }
 
+       if ( $dest === 'all' ) {
+               MWDebug::debugMsg( "[$logGroup] $text" );
+       }
+
        $logConfig = $wgDebugLogGroups[$logGroup];
        if ( is_array( $logConfig ) ) {
                if ( isset( $logConfig['sample'] ) && mt_rand( 1, $logConfig['sample'] ) !== 1 ) {
@@ -2836,7 +2868,7 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(),
        $pipes = null;
        $proc = proc_open( $cmd, $desc, $pipes );
        if ( !$proc ) {
-               wfDebugLog( 'exec', "proc_open() failed: $cmd\n" );
+               wfDebugLog( 'exec', "proc_open() failed: $cmd" );
                $retval = -1;
                return '';
        }
@@ -2951,7 +2983,7 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(),
        }
 
        if ( $logMsg !== false ) {
-               wfDebugLog( 'exec', "$logMsg: $cmd\n" );
+               wfDebugLog( 'exec', "$logMsg: $cmd" );
        }
 
        return $outBuffer;
index 2536de1..274d4a7 100644 (file)
@@ -845,6 +845,7 @@ class PhpHttpRequest extends MWHttpRequest {
                }
 
                $this->reqHeaders['Accept'] = "*/*";
+               $this->reqHeaders['Connection'] = 'Close';
                if ( $this->method == 'POST' ) {
                        // Required for HTTP 1.0 POSTs
                        $this->reqHeaders['Content-Length'] = strlen( $this->postData );
@@ -853,52 +854,47 @@ class PhpHttpRequest extends MWHttpRequest {
                        }
                }
 
-               $options = array();
-               if ( $this->proxy ) {
-                       $options['proxy'] = $this->urlToTCP( $this->proxy );
-                       $options['request_fulluri'] = true;
-               }
+               // Set up PHP stream context
+               $options = array(
+                       'http' => array(
+                               'method' => $this->method,
+                               'header' => implode( "\r\n", $this->getHeaderList() ),
+                               'protocol_version' => '1.1',
+                               'max_redirects' => $this->followRedirects ? $this->maxRedirects : 0,
+                               'ignore_errors' => true,
+                               'timeout' => $this->timeout,
+                               // Curl options in case curlwrappers are installed
+                               'curl_verify_ssl_host' => $this->sslVerifyHost ? 2 : 0,
+                               'curl_verify_ssl_peer' => $this->sslVerifyCert,
+                       ),
+                       'ssl' => array(
+                               'verify_peer' => $this->sslVerifyCert,
+                               'SNI_enabled' => true,
+                       ),
+               );
 
-               if ( !$this->followRedirects ) {
-                       $options['max_redirects'] = 0;
-               } else {
-                       $options['max_redirects'] = $this->maxRedirects;
+               if ( $this->proxy ) {
+                       $options['http']['proxy'] = $this->urlToTCP( $this->proxy );
+                       $options['http']['request_fulluri'] = true;
                }
 
-               $options['method'] = $this->method;
-               $options['header'] = implode( "\r\n", $this->getHeaderList() );
-               // Note that at some future point we may want to support
-               // HTTP/1.1, but we'd have to write support for chunking
-               // in version of PHP < 5.3.1
-               $options['protocol_version'] = "1.0";
-
-               // This is how we tell PHP we want to deal with 404s (for example) ourselves.
-               // Only works on 5.2.10+
-               $options['ignore_errors'] = true;
-
                if ( $this->postData ) {
-                       $options['content'] = $this->postData;
+                       $options['http']['content'] = $this->postData;
                }
 
-               $options['timeout'] = $this->timeout;
-
                if ( $this->sslVerifyHost ) {
-                       $options['CN_match'] = $this->parsedUrl['host'];
-               }
-               if ( $this->sslVerifyCert ) {
-                       $options['verify_peer'] = true;
+                       $options['ssl']['CN_match'] = $this->parsedUrl['host'];
                }
 
                if ( is_dir( $this->caInfo ) ) {
-                       $options['capath'] = $this->caInfo;
+                       $options['ssl']['capath'] = $this->caInfo;
                } elseif ( is_file( $this->caInfo ) ) {
-                       $options['cafile'] = $this->caInfo;
+                       $options['ssl']['cafile'] = $this->caInfo;
                } elseif ( $this->caInfo ) {
                        throw new MWException( "Invalid CA info passed: {$this->caInfo}" );
                }
 
-               $scheme = $this->parsedUrl['scheme'];
-               $context = stream_context_create( array( "$scheme" => $options ) );
+               $context = stream_context_create( $options );
 
                $this->headerList = array();
                $reqCount = 0;
index 6d06693..efcd838 100644 (file)
@@ -159,8 +159,9 @@ class OutputPage extends ContextSource {
        );
 
        /**
-        * @EasterEgg I just love the name for this self documenting variable.
-        * @todo document
+        * Whether output is disabled.  If this is true, the 'output' method will do nothing.
+        *
+        * @var bool $mDoNothing
         */
        var $mDoNothing = false;
 
@@ -684,7 +685,7 @@ class OutputPage extends ContextSource {
                        return false;
                }
                if ( !$wgCachePages ) {
-                       wfDebug( __METHOD__ . ": CACHE DISABLED\n", false );
+                       wfDebug( __METHOD__ . ": CACHE DISABLED\n", 'log' );
                        return false;
                }
 
@@ -705,7 +706,7 @@ class OutputPage extends ContextSource {
 
                $clientHeader = $this->getRequest()->getHeader( 'If-Modified-Since' );
                if ( $clientHeader === false ) {
-                       wfDebug( __METHOD__ . ": client did not send If-Modified-Since header\n", false );
+                       wfDebug( __METHOD__ . ": client did not send If-Modified-Since header\n", 'log' );
                        return false;
                }
 
@@ -733,17 +734,17 @@ class OutputPage extends ContextSource {
                }
 
                wfDebug( __METHOD__ . ": client sent If-Modified-Since: " .
-                       wfTimestamp( TS_ISO_8601, $clientHeaderTime ) . "\n", false );
+                       wfTimestamp( TS_ISO_8601, $clientHeaderTime ) . "\n", 'log' );
                wfDebug( __METHOD__ . ": effective Last-Modified: " .
-                       wfTimestamp( TS_ISO_8601, $maxModified ) . "\n", false );
+                       wfTimestamp( TS_ISO_8601, $maxModified ) . "\n", 'log' );
                if ( $clientHeaderTime < $maxModified ) {
-                       wfDebug( __METHOD__ . ": STALE, $info\n", false );
+                       wfDebug( __METHOD__ . ": STALE, $info\n", 'log' );
                        return false;
                }
 
                # Not modified
                # Give a 304 response code and disable body output
-               wfDebug( __METHOD__ . ": NOT MODIFIED, $info\n", false );
+               wfDebug( __METHOD__ . ": NOT MODIFIED, $info\n", 'log' );
                ini_set( 'zlib.output_compression', 0 );
                $this->getRequest()->response()->header( "HTTP/1.1 304 Not Modified" );
                $this->sendCacheControl();
@@ -1573,6 +1574,7 @@ class OutputPage extends ContextSource {
                $this->addModuleScripts( $parserOutput->getModuleScripts() );
                $this->addModuleStyles( $parserOutput->getModuleStyles() );
                $this->addModuleMessages( $parserOutput->getModuleMessages() );
+               $this->addJsConfigVars( $parserOutput->getJsConfigVars() );
 
                // Template versioning...
                foreach ( (array)$parserOutput->getTemplateIds() as $ns => $dbks ) {
@@ -1918,7 +1920,7 @@ class OutputPage extends ContextSource {
                                        # We'll purge the proxy cache explicitly, but require end user agents
                                        # to revalidate against the proxy on each visit.
                                        # Surrogate-Control controls our Squid, Cache-Control downstream caches
-                                       wfDebug( __METHOD__ . ": proxy caching with ESI; {$this->mLastModified} **\n", false );
+                                       wfDebug( __METHOD__ . ": proxy caching with ESI; {$this->mLastModified} **\n", 'log' );
                                        # start with a shorter timeout for initial testing
                                        # header( 'Surrogate-Control: max-age=2678400+2678400, content="ESI/1.0"');
                                        $response->header( 'Surrogate-Control: max-age=' . $wgSquidMaxage . '+' . $this->mSquidMaxage . ', content="ESI/1.0"' );
@@ -1928,7 +1930,7 @@ class OutputPage extends ContextSource {
                                        # to revalidate against the proxy on each visit.
                                        # IMPORTANT! The Squid needs to replace the Cache-Control header with
                                        # Cache-Control: s-maxage=0, must-revalidate, max-age=0
-                                       wfDebug( __METHOD__ . ": local proxy caching; {$this->mLastModified} **\n", false );
+                                       wfDebug( __METHOD__ . ": local proxy caching; {$this->mLastModified} **\n", 'log' );
                                        # start with a shorter timeout for initial testing
                                        # header( "Cache-Control: s-maxage=2678400, must-revalidate, max-age=0" );
                                        $response->header( 'Cache-Control: s-maxage=' . $this->mSquidMaxage . ', must-revalidate, max-age=0' );
@@ -1936,7 +1938,7 @@ class OutputPage extends ContextSource {
                        } else {
                                # We do want clients to cache if they can, but they *must* check for updates
                                # on revisiting the page.
-                               wfDebug( __METHOD__ . ": private caching; {$this->mLastModified} **\n", false );
+                               wfDebug( __METHOD__ . ": private caching; {$this->mLastModified} **\n", 'log' );
                                $response->header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', 0 ) . ' GMT' );
                                $response->header( "Cache-Control: private, must-revalidate, max-age=0" );
                        }
@@ -1944,7 +1946,7 @@ class OutputPage extends ContextSource {
                                $response->header( "Last-Modified: {$this->mLastModified}" );
                        }
                } else {
-                       wfDebug( __METHOD__ . ": no caching **\n", false );
+                       wfDebug( __METHOD__ . ": no caching **\n", 'log' );
 
                        # In general, the absence of a last modified header should be enough to prevent
                        # the client from using its cache. We send a few other things just to make sure.
@@ -2509,14 +2511,14 @@ $templates
                        // Our XML declaration is output by Html::htmlHeader.
                        // http://www.whatwg.org/html/semantics.html#attr-meta-http-equiv-content-type
                        // http://www.whatwg.org/html/semantics.html#charset
-                       $ret .= Html::element( 'meta', array( 'charset' => 'UTF-8' ) );
+                       $ret .= Html::element( 'meta', array( 'charset' => 'UTF-8' ) ) . "\n";
                }
 
                $ret .= Html::element( 'title', null, $this->getHTMLTitle() ) . "\n";
 
                // Avoid Internet Explorer "compatibility view", so that
                // jQuery can work correctly.
-               $ret .= Html::element( 'meta', array( 'http-equiv' => 'X-UA-Compatible', 'content' => 'IE=EDGE' ) );
+               $ret .= Html::element( 'meta', array( 'http-equiv' => 'X-UA-Compatible', 'content' => 'IE=EDGE' ) ) . "\n";
 
                $ret .= implode( "\n", array(
                        $this->getHeadLinks(),
@@ -2944,6 +2946,16 @@ $templates
                return $html;
        }
 
+       /**
+        * Get the javascript config vars to include on this page
+        *
+        * @return Array of javascript config vars
+        * @since 1.23
+        */
+       public function getJsConfigVars() {
+               return $this->mJsConfigVars;
+       }
+
        /**
         * Add one or more variables to be set in mw.config in JavaScript.
         *
@@ -3076,7 +3088,7 @@ $templates
                wfRunHooks( 'MakeGlobalVariablesScript', array( &$vars, $this ) );
 
                // Merge in variables from addJsConfigVars last
-               return array_merge( $vars, $this->mJsConfigVars );
+               return array_merge( $vars, $this->getJsConfigVars() );
        }
 
        /**
index 2dac938..b4f14c2 100644 (file)
@@ -186,7 +186,8 @@ abstract class PoolCounterWork {
         * @return void
         */
        function logError( $status ) {
-               wfDebugLog( 'poolcounter', $status->getWikiText() );
+               wfDebugLog( 'poolcounter', "Pool key '{$this->key}':"
+                       . $status->getMessage()->inLanguage( 'en' )->useDatabase( false )->text() );
        }
 
        /**
index dbf4346..9a16383 100644 (file)
@@ -62,6 +62,13 @@ class Preferences {
                'emailaddress',
        );
 
+       /**
+        * @return array
+        */
+       static function getSaveBlacklist() {
+               return self::$saveBlacklist;
+       }
+
        /**
         * @throws MWException
         * @param $user User
@@ -1023,15 +1030,7 @@ class Preferences {
         * @param $defaultPreferences Array
         */
        static function searchPreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               global $wgContLang, $wgVectorUseSimpleSearch;
-
-               if ( $wgVectorUseSimpleSearch ) {
-                       $defaultPreferences['vector-simplesearch'] = array(
-                               'type' => 'toggle',
-                               'label-message' => 'vector-simplesearch-preference',
-                               'section' => 'searchoptions/displaysearchoptions',
-                       );
-               }
+               global $wgContLang;
 
                $defaultPreferences['searcheverything'] = array(
                        'type' => 'toggle',
@@ -1397,10 +1396,9 @@ class Preferences {
         *
         * @param $formData
         * @param $form PreferencesForm
-        * @param $entryPoint string
         * @return bool|Status|string
         */
-       static function tryFormSubmit( $formData, $form, $entryPoint = 'internal' ) {
+       static function tryFormSubmit( $formData, $form ) {
                global $wgHiddenPrefs, $wgAuth;
 
                $user = $form->getModifiedUser();
@@ -1446,6 +1444,7 @@ class Preferences {
                                $user->setOption( $key, $value );
                        }
 
+                       wfRunHooks( 'PreferencesFormPreSave', array( $formData, $form, $user, &$result ) );
                        $user->saveSettings();
                }
 
@@ -1460,7 +1459,7 @@ class Preferences {
         * @return Status
         */
        public static function tryUISubmit( $formData, $form ) {
-               $res = self::tryFormSubmit( $formData, $form, 'ui' );
+               $res = self::tryFormSubmit( $formData, $form );
 
                if ( $res ) {
                        $urlOptions = array( 'success' => 1 );
index 7c2f8f7..bb6a0c3 100644 (file)
@@ -543,9 +543,9 @@ abstract class QueryPage extends SpecialPage {
                if ( $this->shownavigation ) {
                        $out->addHTML( $this->getPageHeader() );
                        if ( $this->numRows > 0 ) {
-                               $out->addHTML( $this->msg( 'showingresults' )->numParams(
+                               $out->addHTML( $this->msg( 'showingresultsinrange' )->numParams(
                                        min( $this->numRows, $this->limit ), # do not show the one extra row, if exist
-                                       $this->offset + 1 )->parseAsBlock() );
+                                       $this->offset + 1, (min( $this->numRows, $this->limit ) + $this->offset) )->parseAsBlock() );
                                # Disable the "next" link when we reach the end
                                $paging = $this->getLanguage()->viewPrevNext( $this->getPageTitle( $par ), $this->offset,
                                        $this->limit, $this->linkParameters(), ( $this->numRows <= $this->limit ) );
index d1269ad..0ae6e9b 100644 (file)
@@ -341,11 +341,6 @@ if ( !$wgEnotifMinorEdits ) {
        $wgHiddenPrefs[] = 'enotifminoredits';
 }
 
-# $wgDisabledActions is deprecated as of 1.18
-foreach ( $wgDisabledActions as $action ) {
-       $wgActions[$action] = false;
-}
-
 # We always output HTML5 since 1.22, overriding these is no longer supported
 # we set them here for extensions that depend on its value.
 $wgHtml5 = true;
@@ -417,8 +412,8 @@ MWExceptionHandler::installHandler();
 wfProfileOut( $fname . '-exception' );
 
 wfProfileIn( $fname . '-includes' );
-require_once "$IP/includes/GlobalFunctions.php";
 require_once "$IP/includes/normal/UtfNormalUtil.php";
+require_once "$IP/includes/GlobalFunctions.php";
 require_once "$IP/includes/normal/UtfNormalDefines.php";
 wfProfileOut( $fname . '-includes' );
 
@@ -457,8 +452,6 @@ if ( !$wgHTCPRouting && $wgHTCPMulticastAddress ) {
        );
 }
 
-$wgDeferredUpdateList = array(); // b/c
-
 wfProfileOut( $fname . '-defaults2' );
 wfProfileIn( $fname . '-misc1' );
 
@@ -503,22 +496,21 @@ if ( $wgCommandLineMode ) {
 }
 
 wfProfileOut( $fname . '-misc1' );
-if ( !defined( 'MW_SETUP_NO_CACHE' ) ) {
-       wfProfileIn( $fname . '-memcached' );
+wfProfileIn( $fname . '-memcached' );
 
-       $wgMemc = wfGetMainCache();
-       $messageMemc = wfGetMessageCacheStorage();
-       $parserMemc = wfGetParserCacheStorage();
-       $wgLangConvMemc = wfGetLangConverterCacheStorage();
+$wgMemc = wfGetMainCache();
+$messageMemc = wfGetMessageCacheStorage();
+$parserMemc = wfGetParserCacheStorage();
+$wgLangConvMemc = wfGetLangConverterCacheStorage();
 
-       wfDebug( 'CACHES: ' . get_class( $wgMemc ) . '[main] ' .
-               get_class( $messageMemc ) . '[message] ' .
-               get_class( $parserMemc ) . "[parser]\n" );
+wfDebug( 'CACHES: ' . get_class( $wgMemc ) . '[main] ' .
+       get_class( $messageMemc ) . '[message] ' .
+       get_class( $parserMemc ) . "[parser]\n" );
 
-       wfProfileOut( $fname . '-memcached' );
-       # # Most of the config is out, some might want to run hooks here.
-       wfRunHooks( 'SetupAfterCache' );
-}
+wfProfileOut( $fname . '-memcached' );
+
+# # Most of the config is out, some might want to run hooks here.
+wfRunHooks( 'SetupAfterCache' );
 
 wfProfileIn( $fname . '-session' );
 
@@ -537,44 +529,42 @@ if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
 }
 
 wfProfileOut( $fname . '-session' );
+wfProfileIn( $fname . '-globals' );
 
-if ( !defined( 'MW_SETUP_NO_CONTEXT' ) ) {
-       wfProfileIn( $fname . '-globals' );
+$wgContLang = Language::factory( $wgLanguageCode );
+$wgContLang->initEncoding();
+$wgContLang->initContLang();
 
-       $wgContLang = Language::factory( $wgLanguageCode );
-       $wgContLang->initEncoding();
-       $wgContLang->initContLang();
+// Now that variant lists may be available...
+$wgRequest->interpolateTitle();
+$wgUser = RequestContext::getMain()->getUser(); # BackCompat
 
-       // Now that variant lists may be available...
-       $wgRequest->interpolateTitle();
-       $wgUser = RequestContext::getMain()->getUser(); # BackCompat
-
-       /**
-        * @var $wgLang Language
-        */
-       $wgLang = new StubUserLang;
+/**
+ * @var $wgLang Language
+ */
+$wgLang = new StubUserLang;
 
-       /**
       * @var OutputPage
       */
-       $wgOut = RequestContext::getMain()->getOutput(); # BackCompat
+/**
+ * @var OutputPage
+ */
+$wgOut = RequestContext::getMain()->getOutput(); # BackCompat
 
-       /**
       * @var $wgParser Parser
       */
-       $wgParser = new StubObject( 'wgParser', $wgParserConf['class'], array( $wgParserConf ) );
+/**
+ * @var $wgParser Parser
+ */
+$wgParser = new StubObject( 'wgParser', $wgParserConf['class'], array( $wgParserConf ) );
 
-       if ( !is_object( $wgAuth ) ) {
-               $wgAuth = new StubObject( 'wgAuth', 'AuthPlugin' );
-               wfRunHooks( 'AuthPluginSetup', array( &$wgAuth ) );
-       }
+if ( !is_object( $wgAuth ) ) {
+       $wgAuth = new AuthPlugin;
+       wfRunHooks( 'AuthPluginSetup', array( &$wgAuth ) );
+}
 
-       # Placeholders in case of DB error
-       $wgTitle = null;
+# Placeholders in case of DB error
+$wgTitle = null;
 
-       wfProfileOut( $fname . '-globals' );
-}
+$wgDeferredUpdateList = array();
 
+wfProfileOut( $fname . '-globals' );
 wfProfileIn( $fname . '-extensions' );
 
 # Extension setup functions for extensions other than skins
index 35183ce..7e229ee 100644 (file)
@@ -175,7 +175,7 @@ class SkinTemplate extends Skin {
                                }
 
                                $ilInterwikiCodeBCP47 = wfBCP47( $ilInterwikiCode );
-                               $languageLinks[] = array(
+                               $languageLink = array(
                                        'href' => $languageLinkTitle->getFullURL(),
                                        'text' => $ilLangName,
                                        'title' => $ilTitle,
@@ -183,6 +183,8 @@ class SkinTemplate extends Skin {
                                        'lang' => $ilInterwikiCodeBCP47,
                                        'hreflang' => $ilInterwikiCodeBCP47,
                                );
+                               wfRunHooks( 'SkinTemplateGetLanguageLink', array( &$languageLink, $languageLinkTitle, $this->getTitle() ) );
+                               $languageLinks[] = $languageLink;
                        }
                }
 
index f5fd195..eadf256 100644 (file)
@@ -373,7 +373,7 @@ class SquidPurgeClient {
         * @param $msg string
         */
        protected function log( $msg ) {
-               wfDebugLog( 'squid', __CLASS__ . " ($this->host): $msg\n" );
+               wfDebugLog( 'squid', __CLASS__ . " ($this->host): $msg" );
        }
 }
 
index bdba578..a705aaa 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Representation a title within %MediaWiki.
+ * Representation of a title within %MediaWiki.
  *
  * See title.txt
  *
@@ -1500,9 +1500,7 @@ class Title {
         * Get a real URL referring to this title, with interwiki link and
         * fragment
         *
-        * See getLocalURL for the arguments.
-        *
-        * @see self::getLocalURL
+        * @see self::getLocalURL for the arguments.
         * @see wfExpandUrl
         * @param $query
         * @param $query2 bool
@@ -1528,8 +1526,12 @@ class Title {
        }
 
        /**
-        * Get a URL with no fragment or server name.  If this page is generated
-        * with action=render, $wgServer is prepended.
+        * Get a URL with no fragment or server name (relative URL) from a Title object.
+        * If this page is generated with action=render, however,
+        * $wgServer is prepended to make an absolute URL.
+        *
+        * @see self::getFullURL to always get an absolute URL.
+        * @see self::newFromText to produce a Title object.
         *
         * @param string|array $query an optional query string,
         *   not used for interwiki links. Can be specified as an associative array as well,
@@ -1542,7 +1544,7 @@ class Title {
         *   The second parameter is deprecated since 1.19. Pass it as a key,value
         *   pair in the first parameter array instead.
         *
-        * @return String the URL
+        * @return String of the URL.
         */
        public function getLocalURL( $query = '', $query2 = false ) {
                global $wgArticlePath, $wgScript, $wgServer, $wgRequest;
@@ -1630,12 +1632,10 @@ class Title {
         * The result obviously should not be URL-escaped, but does need to be
         * HTML-escaped if it's being output in HTML.
         *
-        * See getLocalURL for the arguments.
-        *
         * @param $query
         * @param $query2 bool
         * @param $proto Protocol to use; setting this will cause a full URL to be used
-        * @see self::getLocalURL
+        * @see self::getLocalURL for the arguments.
         * @return String the URL
         */
        public function getLinkURL( $query = '', $query2 = false, $proto = PROTO_RELATIVE ) {
@@ -1655,9 +1655,7 @@ class Title {
         * Get an HTML-escaped version of the URL form, suitable for
         * using in a link, without a server name or fragment
         *
-        * See getLocalURL for the arguments.
-        *
-        * @see self::getLocalURL
+        * @see self::getLocalURL for the arguments.
         * @param $query string
         * @param $query2 bool|string
         * @return String the URL
@@ -1672,9 +1670,7 @@ class Title {
         * Get an HTML-escaped version of the URL form, suitable for
         * using in a link, including the server name and fragment
         *
-        * See getLocalURL for the arguments.
-        *
-        * @see self::getLocalURL
+        * @see self::getLocalURL for the arguments.
         * @return String the URL
         * @deprecated since 1.19
         */
@@ -1692,9 +1688,7 @@ class Title {
         * if $wgInternalServer is not set. If the server variable used is
         * protocol-relative, the URL will be expanded to http://
         *
-        * See getLocalURL for the arguments.
-        *
-        * @see self::getLocalURL
+        * @see self::getLocalURL for the arguments.
         * @return String the URL
         */
        public function getInternalURL( $query = '', $query2 = false ) {
@@ -1713,9 +1707,7 @@ class Title {
         *
         * NOTE: Unlike getInternalURL(), the canonical URL includes the fragment
         *
-        * See getLocalURL for the arguments.
-        *
-        * @see self::getLocalURL
+        * @see self::getLocalURL for the arguments.
         * @return string The URL
         * @since 1.18
         */
@@ -1729,9 +1721,7 @@ class Title {
        /**
         * HTML-escaped version of getCanonicalURL()
         *
-        * See getLocalURL for the arguments.
-        *
-        * @see self::getLocalURL
+        * @see self::getLocalURL for the arguments.
         * @since 1.18
         * @return string
         * @deprecated since 1.19
@@ -1780,7 +1770,6 @@ class Title {
         *
         * @deprecated in 1.19; use userCan(), quickUserCan() or getUserPermissionsErrors() instead
         * @return Bool
-        * @todo fold these checks into userCan()
         */
        public function userCanRead() {
                wfDeprecated( __METHOD__, '1.19' );
@@ -3877,7 +3866,20 @@ class Title {
                                $comment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
                        }
                        // @todo FIXME: $params?
-                       $log->addEntry( 'move_prot', $nt, $comment, array( $this->getPrefixedText() ), $wgUser );
+                       $logId = $log->addEntry( 'move_prot', $nt, $comment, array( $this->getPrefixedText() ), $wgUser );
+
+                       // reread inserted pr_ids for log relation
+                       $insertedPrIds = $dbw->select(
+                               'page_restrictions',
+                               'pr_id',
+                               array( 'pr_page' => $redirid ),
+                               __METHOD__
+                       );
+                       $logRelationsValues = array();
+                       foreach ( $insertedPrIds as $prid ) {
+                               $logRelationsValues[] = $prid->pr_id;
+                       }
+                       $log->addRelations( 'pr_id', $logRelationsValues, $logId );
                }
 
                # Update watchlists
@@ -3892,7 +3894,7 @@ class Title {
 
                $dbw->commit( __METHOD__ );
 
-               wfRunHooks( 'TitleMoveComplete', array( &$this, &$nt, &$wgUser, $pageid, $redirid ) );
+               wfRunHooks( 'TitleMoveComplete', array( &$this, &$nt, &$wgUser, $pageid, $redirid, $reason ) );
                return true;
        }
 
@@ -4063,7 +4065,7 @@ class Title {
                foreach ( $subpages as $oldSubpage ) {
                        $count++;
                        if ( $count > $wgMaximumMovedPages ) {
-                               $retval[$oldSubpage->getPrefixedTitle()] =
+                               $retval[$oldSubpage->getPrefixedText()] =
                                                array( 'movepage-max-pages',
                                                        $wgMaximumMovedPages );
                                break;
@@ -4431,9 +4433,11 @@ class Title {
        }
 
        /**
-        * Get the number of authors between the given revisions or revision IDs.
+        * Get the authors between the given revisions or revision IDs.
         * Used for diffs and other things that really need it.
         *
+        * @since 1.23
+        *
         * @param int|Revision $old Old revision or rev ID (first before range by default)
         * @param int|Revision $new New revision or rev ID (first after range by default)
         * @param int $limit Maximum number of authors
@@ -4442,9 +4446,9 @@ class Title {
         *     'include_new' Include $new in the range; $old is excluded.
         *     'include_both' Include both $old and $new in the range.
         *     Unknown option values are ignored.
-        * @return int Number of revision authors in the range; zero if not both revisions exist
+        * @return array|null Names of revision authors in the range; null if not both revisions exist
         */
-       public function countAuthorsBetween( $old, $new, $limit, $options = array() ) {
+       public function getAuthorsBetween( $old, $new, $limit, $options = array() ) {
                if ( !( $old instanceof Revision ) ) {
                        $old = Revision::newFromTitle( $this, (int)$old );
                }
@@ -4455,8 +4459,9 @@ class Title {
                // Add $old->getPage() != $new->getPage() || $old->getPage() != $this->getArticleID()
                // in the sanity check below?
                if ( !$old || !$new ) {
-                       return 0; // nothing to compare
+                       return null; // nothing to compare
                }
+               $authors = array();
                $old_cmp = '>';
                $new_cmp = '<';
                $options = (array)$options;
@@ -4472,12 +4477,19 @@ class Title {
                }
                // No DB query needed if $old and $new are the same or successive revisions:
                if ( $old->getId() === $new->getId() ) {
-                       return ( $old_cmp === '>' && $new_cmp === '<' ) ? 0 : 1;
+                       return ( $old_cmp === '>' && $new_cmp === '<' ) ? array() : array( $old->getRawUserText() );
                } elseif ( $old->getId() === $new->getParentId() ) {
-                       if ( $old_cmp === '>' || $new_cmp === '<' ) {
-                               return ( $old_cmp === '>' && $new_cmp === '<' ) ? 0 : 1;
+                       if ( $old_cmp === '>=' && $new_cmp === '<=' ) {
+                               $authors[] = $old->getRawUserText();
+                               if ( $old->getRawUserText() != $new->getRawUserText() ) {
+                                       $authors[] = $new->getRawUserText();
+                               }
+                       } elseif ( $old_cmp === '>=' ) {
+                               $authors[] = $old->getRawUserText();
+                       } elseif ( $new_cmp === '<=' ) {
+                               $authors[] = $new->getRawUserText();
                        }
-                       return ( $old->getRawUserText() === $new->getRawUserText() ) ? 1 : 2;
+                       return $authors;
                }
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( 'revision', 'DISTINCT rev_user_text',
@@ -4488,7 +4500,29 @@ class Title {
                        ), __METHOD__,
                        array( 'LIMIT' => $limit + 1 ) // add one so caller knows it was truncated
                );
-               return (int)$dbr->numRows( $res );
+               foreach ( $res as $row ) {
+                       $authors[] = $row->rev_user_text;
+               }
+               return $authors;
+       }
+
+       /**
+        * Get the number of authors between the given revisions or revision IDs.
+        * Used for diffs and other things that really need it.
+        *
+        * @param int|Revision $old Old revision or rev ID (first before range by default)
+        * @param int|Revision $new New revision or rev ID (first after range by default)
+        * @param int $limit Maximum number of authors
+        * @param string|array $options (Optional): Single option, or an array of options:
+        *     'include_old' Include $old in the range; $new is excluded.
+        *     'include_new' Include $new in the range; $old is excluded.
+        *     'include_both' Include both $old and $new in the range.
+        *     Unknown option values are ignored.
+        * @return int Number of revision authors in the range; zero if not both revisions exist
+        */
+       public function countAuthorsBetween( $old, $new, $limit, $options = array() ) {
+               $authors = $this->getAuthorsBetween( $old, $new, $limit, $options );
+               return $authors ? count( $authors ) : 0;
        }
 
        /**
index 7f7a22d..b2a25f9 100644 (file)
@@ -254,14 +254,14 @@ class User {
         * @see newFromSession()
         * @see newFromRow()
         */
-       function __construct() {
+       public function __construct() {
                $this->clearInstanceCache( 'defaults' );
        }
 
        /**
         * @return string
         */
-       function __toString() {
+       public function __toString() {
                return $this->getName();
        }
 
@@ -1418,11 +1418,11 @@ class User {
                                $ipList = gethostbynamel( $host );
 
                                if ( $ipList ) {
-                                       wfDebugLog( 'dnsblacklist', "Hostname $host is {$ipList[0]}, it's a proxy says $base!\n" );
+                                       wfDebugLog( 'dnsblacklist', "Hostname $host is {$ipList[0]}, it's a proxy says $base!" );
                                        $found = true;
                                        break;
                                } else {
-                                       wfDebugLog( 'dnsblacklist', "Requested $host, not found in $base.\n" );
+                                       wfDebugLog( 'dnsblacklist', "Requested $host, not found in $base." );
                                }
                        }
                }
@@ -1625,7 +1625,7 @@ class User {
         * @param bool $bFromSlave whether to check the slave database instead of the master
         * @return bool
         */
-       function isBlockedFrom( $title, $bFromSlave = false ) {
+       public function isBlockedFrom( $title, $bFromSlave = false ) {
                global $wgBlockAllowsUTEdit;
                wfProfileIn( __METHOD__ );
 
@@ -2450,6 +2450,8 @@ class User {
         * - 'registered-checkmatrix' - as above, using the 'checkmatrix' type.
         * - 'userjs' - preferences with names starting with 'userjs-', intended to
         *              be used by user scripts.
+        * - 'special' - "preferences" that are not accessible via User::getOptions
+        *               or User::setOptions.
         * - 'unused' - preferences about which MediaWiki doesn't know anything.
         *              These are usually legacy options, removed in newer versions.
         *
@@ -2466,6 +2468,7 @@ class User {
                        'registered-multiselect',
                        'registered-checkmatrix',
                        'userjs',
+                       'special',
                        'unused'
                );
        }
@@ -2490,6 +2493,13 @@ class User {
                $prefs = Preferences::getPreferences( $this, $context );
                $mapping = array();
 
+               // Pull out the "special" options, so they don't get converted as
+               // multiselect or checkmatrix.
+               $specialOptions = array_fill_keys( Preferences::getSaveBlacklist(), true );
+               foreach ( $specialOptions as $name => $value ) {
+                       unset( $prefs[$name] );
+               }
+
                // Multiselect and checkmatrix options are stored in the database with
                // one key per option, each having a boolean value. Extract those keys.
                $multiselectOptions = array();
@@ -2532,6 +2542,8 @@ class User {
                                $mapping[$key] = 'registered-multiselect';
                        } elseif ( isset( $checkmatrixOptions[$key] ) ) {
                                $mapping[$key] = 'registered-checkmatrix';
+                       } elseif ( isset( $specialOptions[$key] ) ) {
+                               $mapping[$key] = 'special';
                        } elseif ( substr( $key, 0, 7 ) === 'userjs-' ) {
                                $mapping[$key] = 'userjs';
                        } else {
@@ -3545,7 +3557,7 @@ class User {
         * Get whether the user is allowed to create an account.
         * @return bool
         */
-       function isAllowedToCreateAccount() {
+       public function isAllowedToCreateAccount() {
                return $this->isAllowed( 'createaccount' ) && !$this->isBlockedFromCreateAccount();
        }
 
@@ -3873,7 +3885,7 @@ class User {
         * @note Call saveSettings() after calling this function to commit the change.
         * @return bool Returns true
         */
-       function invalidateEmail() {
+       public function invalidateEmail() {
                $this->load();
                $this->mEmailToken = null;
                $this->mEmailTokenExpires = null;
@@ -3886,7 +3898,7 @@ class User {
         * Set the e-mail authentication timestamp.
         * @param string $timestamp TS_MW timestamp
         */
-       function setEmailAuthenticationTimestamp( $timestamp ) {
+       public function setEmailAuthenticationTimestamp( $timestamp ) {
                $this->load();
                $this->mEmailAuthenticated = $timestamp;
                wfRunHooks( 'UserSetEmailAuthenticationTimestamp', array( $this, &$this->mEmailAuthenticated ) );
@@ -4629,20 +4641,20 @@ class User {
                        return;
                }
 
-               $defaultOptions = self::getDefaultOptions();
-
                $userId = $this->getId();
                $insert_rows = array();
-               $changedOptions = array_diff_assoc( $saveOptions, $defaultOptions );
-               foreach ( $changedOptions as $key => $value ) {
-                       if ( $value === false || is_null( $value ) ) {
-                               continue;
+               foreach ( $saveOptions as $key => $value ) {
+                       // Don't bother storing default values
+                       $defaultOption = self::getDefaultOption( $key );
+                       if ( ( is_null( $defaultOption ) &&
+                                       !( $value === false || is_null( $value ) ) ) ||
+                                       $value != $defaultOption ) {
+                               $insert_rows[] = array(
+                                               'up_user' => $userId,
+                                               'up_property' => $key,
+                                               'up_value' => $value,
+                                       );
                        }
-                       $insert_rows[] = array(
-                               'up_user' => $userId,
-                               'up_property' => $key,
-                               'up_value' => $value,
-                       );
                }
 
                $dbw = wfGetDB( DB_MASTER );
index a52894d..399facf 100644 (file)
@@ -795,12 +795,11 @@ class WebRequest {
         * defaults if not given. The limit must be positive and is capped at 5000.
         * Offset must be positive but is not capped.
         *
-        * @param int $deflimit limit to use if no input and the user hasn't set the option.
+        * @param $deflimit Integer: limit to use if no input and the user hasn't set the option.
         * @param string $optionname to specify an option other than rclimit to pull from.
-        * @param int $hardlimit the maximum upper limit to allow, usually 5000
         * @return array first element is limit, second is offset
         */
-       public function getLimitOffset( $deflimit = 50, $optionname = 'rclimit', $hardlimit = 5000 ) {
+       public function getLimitOffset( $deflimit = 50, $optionname = 'rclimit' ) {
                global $wgUser;
 
                $limit = $this->getInt( 'limit', 0 );
@@ -813,8 +812,8 @@ class WebRequest {
                if ( $limit <= 0 ) {
                        $limit = $deflimit;
                }
-               if ( $limit > $hardlimit ) {
-                       $limit = $hardlimit; # We have *some* limits...
+               if ( $limit > 5000 ) {
+                       $limit = 5000; # We have *some* limits...
                }
 
                $offset = $this->getInt( 'offset', 0 );
index 9a6e6b9..99857d9 100644 (file)
@@ -637,12 +637,20 @@ class MediaWiki {
                }
 
                if ( !wfShellExecDisabled() && is_executable( $wgPhpCli ) ) {
-                       // Start a background process to run some of the jobs.
-                       // This will be asynchronous on *nix though not on Windows.
+                       // Start a background process to run some of the jobs
                        wfProfileIn( __METHOD__ . '-exec' );
                        $retVal = 1;
-                       $cmd = wfShellWikiCmd( "$IP/maintenance/runJobs.php", array( '--maxjobs', $n ) );
-                       wfShellExec( "$cmd &", $retVal );
+                       $cmd = wfShellWikiCmd( "$IP/maintenance/runJobs.php",
+                               array( '--wiki', wfWikiID(), '--maxjobs', $n ) );
+                       $cmd .= " >" . wfGetNull() . " 2>&1"; // don't hang PHP on pipes
+                       if ( wfIsWindows() ) {
+                               // Using START makes this async and also works around a bug where using
+                               // wfShellExec() with a quoted script name causes a filename syntax error.
+                               $cmd = "START /B \"bg\" $cmd";
+                       } else {
+                               $cmd = "$cmd &";
+                       }
+                       wfShellExec( $cmd, $retVal );
                        wfProfileOut( __METHOD__ . '-exec' );
                } else {
                        try {
index 5fc5a38..3de0475 100644 (file)
@@ -142,6 +142,11 @@ class WikiPage implements Page, IDBAccessObject {
         * @return WikiPage|null
         */
        public static function newFromID( $id, $from = 'fromdb' ) {
+               // page id's are never 0 or negative, see bug 61166
+               if ( $id < 1 ) {
+                       return null;
+               }
+
                $from = self::convertSelectType( $from );
                $db = wfGetDB( $from === self::READ_LATEST ? DB_MASTER : DB_SLAVE );
                $row = $db->selectRow( 'page', self::selectFields(), array( 'page_id' => $id ), __METHOD__ );
@@ -1168,7 +1173,7 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * Do standard deferred updates after page view
+        * Do standard deferred updates after page view (existing or missing page)
         * @param User $user The relevant user
         * @param int $oldid The revision id being viewed. If not given or 0, latest revision is assumed.
         */
@@ -2350,6 +2355,9 @@ class WikiPage implements Page, IDBAccessObject {
                // Truncate for whole multibyte characters
                $reason = $wgContLang->truncate( $reason, 255 );
 
+               $logRelationsValues = array();
+               $logRelationsField = null;
+
                if ( $id ) { // Protection of existing page
                        if ( !wfRunHooks( 'ArticleProtect', array( &$this, &$user, $limit, $reason ) ) ) {
                                return Status::newGood();
@@ -2384,11 +2392,24 @@ class WikiPage implements Page, IDBAccessObject {
                                return Status::newFatal( 'no-null-revision', $this->mTitle->getPrefixedText() );
                        }
 
+                       $logRelationsField = 'pr_id';
+
                        // Update restrictions table
                        foreach ( $limit as $action => $restrictions ) {
+                               $dbw->delete(
+                                       'page_restrictions',
+                                       array(
+                                               'pr_page' => $id,
+                                               'pr_type' => $action
+                                       ),
+                                       __METHOD__
+                               );
                                if ( $restrictions != '' ) {
-                                       $dbw->replace( 'page_restrictions', array( array( 'pr_page', 'pr_type' ) ),
-                                               array( 'pr_page' => $id,
+                                       $dbw->insert(
+                                               'page_restrictions',
+                                               array(
+                                                       'pr_id' => $dbw->nextSequenceValue( 'page_restrictions_pr_id_seq' ),
+                                                       'pr_page' => $id,
                                                        'pr_type' => $action,
                                                        'pr_level' => $restrictions,
                                                        'pr_cascade' => ( $cascade && $action == 'edit' ) ? 1 : 0,
@@ -2396,9 +2417,7 @@ class WikiPage implements Page, IDBAccessObject {
                                                ),
                                                __METHOD__
                                        );
-                               } else {
-                                       $dbw->delete( 'page_restrictions', array( 'pr_page' => $id,
-                                               'pr_type' => $action ), __METHOD__ );
+                                       $logRelationsValues[] = $dbw->insertId();
                                }
                        }
 
@@ -2451,7 +2470,10 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Update the protection log
                $log = new LogPage( 'protect' );
-               $log->addEntry( $logAction, $this->mTitle, $reason, $params, $user );
+               $logId = $log->addEntry( $logAction, $this->mTitle, $reason, $params, $user );
+               if ( $logRelationsField !== null && count( $logRelationsValues ) ) {
+                       $log->addRelations( $logRelationsField, $logRelationsValues, $logId );
+               }
 
                return Status::newGood();
        }
@@ -2923,27 +2945,6 @@ class WikiPage implements Page, IDBAccessObject {
                        return array( array( 'notvisiblerev' ) );
                }
 
-               $set = array();
-               if ( $bot && $guser->isAllowed( 'markbotedits' ) ) {
-                       // Mark all reverted edits as bot
-                       $set['rc_bot'] = 1;
-               }
-
-               if ( $wgUseRCPatrol ) {
-                       // Mark all reverted edits as patrolled
-                       $set['rc_patrolled'] = 1;
-               }
-
-               if ( count( $set ) ) {
-                       $dbw->update( 'recentchanges', $set,
-                               array( /* WHERE */
-                                       'rc_cur_id' => $current->getPage(),
-                                       'rc_user_text' => $current->getUserText(),
-                                       'rc_timestamp > ' . $dbw->addQuotes( $s->rev_timestamp ),
-                               ), __METHOD__
-                       );
-               }
-
                // Generate the edit summary if necessary
                $target = Revision::newFromId( $s->rev_id );
                if ( empty( $summary ) ) {
@@ -2990,12 +2991,39 @@ class WikiPage implements Page, IDBAccessObject {
                        return $status->getErrorsArray();
                }
 
-               if ( !empty( $status->value['revision'] ) ) {
-                       $revId = $status->value['revision']->getId();
-               } else {
-                       $revId = false;
+               // raise error, when the edit is an edit without a new version
+               if ( empty( $status->value['revision'] ) ) {
+                       $resultDetails = array( 'current' => $current );
+                       return array( array( 'alreadyrolled',
+                                       htmlspecialchars( $this->mTitle->getPrefixedText() ),
+                                       htmlspecialchars( $fromP ),
+                                       htmlspecialchars( $current->getUserText() )
+                       ) );
+               }
+
+               $set = array();
+               if ( $bot && $guser->isAllowed( 'markbotedits' ) ) {
+                       // Mark all reverted edits as bot
+                       $set['rc_bot'] = 1;
                }
 
+               if ( $wgUseRCPatrol ) {
+                       // Mark all reverted edits as patrolled
+                       $set['rc_patrolled'] = 1;
+               }
+
+               if ( count( $set ) ) {
+                       $dbw->update( 'recentchanges', $set,
+                               array( /* WHERE */
+                                       'rc_cur_id' => $current->getPage(),
+                                       'rc_user_text' => $current->getUserText(),
+                                       'rc_timestamp > ' . $dbw->addQuotes( $s->rev_timestamp ),
+                               ), __METHOD__
+                       );
+               }
+
+               $revId = $status->value['revision']->getId();
+
                wfRunHooks( 'ArticleRollbackComplete', array( $this, $guser, $target, $current ) );
 
                $resultDetails = array(
@@ -3608,12 +3636,12 @@ class PoolWorkArticleView extends PoolCounterWork {
                $this->parserOutput = ParserCache::singleton()->getDirty( $this->page, $this->parserOptions );
 
                if ( $this->parserOutput === false ) {
-                       wfDebugLog( 'dirty', "dirty missing\n" );
+                       wfDebugLog( 'dirty', 'dirty missing' );
                        wfDebug( __METHOD__ . ": no dirty cache\n" );
                        return false;
                } else {
                        wfDebug( __METHOD__ . ": sending dirty output\n" );
-                       wfDebugLog( 'dirty', "dirty output {$this->cacheKey}\n" );
+                       wfDebugLog( 'dirty', "dirty output {$this->cacheKey}" );
                        $this->isDirty = true;
                        return true;
                }
index a62df6c..3067b1a 100644 (file)
@@ -3198,8 +3198,8 @@ $zh2Hant = array(
 '不干她' => '不干她',
 '不干它' => '不干它',
 '不干我' => '不干我',
-'不干擾' => '不干擾',
 '不干扰' => '不干擾',
+'不干擾' => '不干擾',
 '不干涉' => '不干涉',
 '不干牠' => '不干牠',
 '不干犯' => '不干犯',
@@ -3220,13 +3220,12 @@ $zh2Hant = array(
 '不负所托' => '不負所托',
 '不通吊庆' => '不通弔慶',
 '不丑' => '不醜',
-'不采声' => '不采聲',
 '不采聲' => '不采聲',
+'不采声' => '不采聲',
 '不锈钢' => '不鏽鋼',
 '不食干腊' => '不食乾腊',
 '不斗' => '不鬥',
 '丑三' => '丑三',
-'丑婆子' => '丑婆子',
 '丑年' => '丑年',
 '丑日' => '丑日',
 '丑旦' => '丑旦',
@@ -3264,23 +3263,21 @@ $zh2Hant = array(
 '中签' => '中籤',
 '中美发表' => '中美發表',
 '中药' => '中藥',
-'中西合并' => '中西合併',
 '中风后' => '中風後',
-'丰儀' => '丰儀',
 '丰仪' => '丰儀',
+'丰儀' => '丰儀',
 '丰南' => '丰南',
 '丰台' => '丰台',
 '丰姿' => '丰姿',
 '丰容' => '丰容',
-'丰度' => '丰度',
 '丰情' => '丰情',
 '丰标' => '丰標',
-'丰標不凡' => '丰標不凡',
 '丰标不凡' => '丰標不凡',
+'丰標不凡' => '丰標不凡',
 '丰神' => '丰神',
 '丰茸' => '丰茸',
 '丰采' => '丰采',
-'丰é\9fµ' => '丰é\9f»',
+'丰é\9fµ' => '丰é\9fµ',
 '丰韻' => '丰韻',
 '丸药' => '丸藥',
 '丹药' => '丹藥',
@@ -3312,15 +3309,17 @@ $zh2Hant = array(
 '九扎' => '九紮',
 '九只' => '九隻',
 '九余' => '九餘',
-'九龙表行' => '九龍表行',
 '九龍表行' => '九龍表行',
+'九龙表行' => '九龍表行',
 '也克制' => '也剋制',
 '也斗了胆' => '也斗了膽',
+'干上' => '乾上',
 '干干' => '乾乾',
 '干干儿的' => '乾乾兒的',
 '干干净净' => '乾乾淨淨',
+'干了' => '乾了',
 '干井' => '乾井',
-'干个够' => '乾個夠',
+'干个' => '乾個',
 '干儿' => '乾兒',
 '干冰' => '乾冰',
 '干冷' => '乾冷',
@@ -3357,10 +3356,12 @@ $zh2Hant = array(
 '干巴' => '乾巴',
 '干式' => '乾式',
 '干弟' => '乾弟',
+'干得' => '乾得',
 '干急' => '乾急',
 '干性' => '乾性',
 '干打雷' => '乾打雷',
 '干折' => '乾折',
+'干掉' => '乾掉',
 '干撂台' => '乾撂台',
 '干撇下' => '乾撇下',
 '干擦' => '乾擦',
@@ -3446,8 +3447,8 @@ $zh2Hant = array(
 '干衣' => '乾衣',
 '干裂' => '乾裂',
 '干亲' => '乾親',
-'乾象历' => '乾象曆',
 '乾象曆' => '乾象曆',
+'乾象历' => '乾象曆',
 '干贝' => '乾貝',
 '干货' => '乾貨',
 '干躁' => '乾躁',
@@ -3496,8 +3497,8 @@ $zh2Hant = array(
 '二缶钟惑' => '二缶鐘惑',
 '二老板' => '二老板',
 '二虎相斗' => '二虎相鬥',
-'二里头' => '二里頭',
 '二里頭' => '二里頭',
+'二里头' => '二里頭',
 '二只' => '二隻',
 '二余' => '二餘',
 '于丹' => '于丹',
@@ -3509,10 +3510,10 @@ $zh2Hant = array(
 '于伟国' => '于偉國',
 '于偉國' => '于偉國',
 '于光新' => '于光新',
-'于光遠' => '于光遠',
 '于光远' => '于光遠',
-'äº\8eå\85\8b\98­å¤\9a縣' => 'äº\8eå\85\8b\98­å¤\9a縣',
+'äº\8eå\85\89é\81 ' => 'äº\8eå\85\89é\81 ',
 '于克-兰多县' => '于克-蘭多縣',
+'于克-蘭多縣' => '于克-蘭多縣',
 '于克勒' => '于克勒',
 '于再清' => '于再清',
 '于冕' => '于冕',
@@ -3529,8 +3530,8 @@ $zh2Hant = array(
 '于吉' => '于吉',
 '于和伟' => '于和偉',
 '于品海' => '于品海',
-'于国桢' => '于國楨',
 '于國楨' => '于國楨',
+'于国桢' => '于國楨',
 '于国治' => '于國治',
 '于國治' => '于國治',
 '于坚' => '于堅',
@@ -3539,15 +3540,15 @@ $zh2Hant = array(
 '于大宝' => '于大寶',
 '于天仁' => '于天仁',
 '于天龙' => '于天龍',
-'于奇库杜克' => '于奇庫杜克',
 '于奇庫杜克' => '于奇庫杜克',
+'于奇库杜克' => '于奇庫杜克',
 '于姓' => '于姓',
 '于娜' => '于娜',
 '于娟' => '于娟',
 '于子千' => '于子千',
 '于孔兼' => '于孔兼',
-'于學忠' => '于學忠',
 '于学忠' => '于學忠',
+'于學忠' => '于學忠',
 '于家堡' => '于家堡',
 '于寘' => '于寘',
 '于小伟' => '于小偉',
@@ -3558,16 +3559,16 @@ $zh2Hant = array(
 '于山' => '于山',
 '于山国' => '于山國',
 '于山國' => '于山國',
-'于帥' => '于帥',
 '于帅' => '于帥',
+'于帥' => '于帥',
 '于幼軍' => '于幼軍',
 '于幼军' => '于幼軍',
 '于康震' => '于康震',
-'于廣洲' => '于廣洲',
 '于广洲' => '于廣洲',
+'于廣洲' => '于廣洲',
 '于式枚' => '于式枚',
-'于從濂' => '于從濂',
 '于从濂' => '于從濂',
+'于從濂' => '于從濂',
 '于德海' => '于德海',
 '于志宁' => '于志寧',
 '于志寧' => '于志寧',
@@ -3575,8 +3576,8 @@ $zh2Hant = array(
 '于思' => '于思',
 '于慎行' => '于慎行',
 '于慧' => '于慧',
-'于成龙' => '于成龍',
 '于成龍' => '于成龍',
+'于成龙' => '于成龍',
 '于振' => '于振',
 '于振武' => '于振武',
 '于敏' => '于敏',
@@ -3587,13 +3588,13 @@ $zh2Hant = array(
 '于斯納爾斯貝里' => '于斯納爾斯貝里',
 '于斯达尔' => '于斯達爾',
 '于斯達爾' => '于斯達爾',
-'于明涛' => '于明濤',
 '于明濤' => '于明濤',
+'于明涛' => '于明濤',
 '于是之' => '于是之',
 '于晨楠' => '于晨楠',
 '于晴' => '于晴',
-'于會泳' => '于會泳',
 '于会泳' => '于會泳',
+'于會泳' => '于會泳',
 '于根伟' => '于根偉',
 '于根偉' => '于根偉',
 '于格' => '于格',
@@ -3601,8 +3602,8 @@ $zh2Hant = array(
 '于枫' => '于楓',
 '于荣光' => '于榮光',
 '于樂' => '于樂',
-'于树洁' => '于樹潔',
 '于樹潔' => '于樹潔',
+'于树洁' => '于樹潔',
 '于欣' => '于欣',
 '于欣源' => '于欣源',
 '于正升' => '于正昇',
@@ -3619,10 +3620,10 @@ $zh2Hant = array(
 '于浩威' => '于浩威',
 '于海' => '于海',
 '于海洋' => '于海洋',
-'于湘兰' => '于湘蘭',
 '于湘蘭' => '于湘蘭',
-'äº\8eæ¼¢è¶\85' => 'äº\8eæ¼¢è¶\85',
+'äº\8eæ¹\98å\85°' => 'äº\8eæ¹\98è\98­',
 '于汉超' => '于漢超',
+'于漢超' => '于漢超',
 '于澄' => '于澄',
 '于泽尔' => '于澤爾',
 '于澤爾' => '于澤爾',
@@ -3631,8 +3632,8 @@ $zh2Hant = array(
 '于熙珍' => '于熙珍',
 '于爾岑' => '于爾岑',
 '于尔岑' => '于爾岑',
-'于爾根' => '于爾根',
 '于尔根' => '于爾根',
+'于爾根' => '于爾根',
 '于尔里克' => '于爾里克',
 '于爾里克' => '于爾里克',
 '于特森' => '于特森',
@@ -3645,8 +3646,8 @@ $zh2Hant = array(
 '于美人' => '于美人',
 '于耘婕' => '于耘婕',
 '于若木' => '于若木',
-'于蔭霖' => '于蔭霖',
 '于荫霖' => '于蔭霖',
+'于蔭霖' => '于蔭霖',
 '于衡' => '于衡',
 '于西翰' => '于西翰',
 '于謙' => '于謙',
@@ -3654,20 +3655,20 @@ $zh2Hant = array(
 '于谨' => '于謹',
 '于貝爾' => '于貝爾',
 '于贝尔' => '于貝爾',
-'于赠' => '于贈',
 '于贈' => '于贈',
+'于赠' => '于贈',
 '于越' => '于越',
 '于军' => '于軍',
 '于軍' => '于軍',
 '于道泉' => '于道泉',
-'于远伟' => '于遠偉',
 '于遠偉' => '于遠偉',
-'于都縣' => '于都縣',
+'于远伟' => '于遠偉',
 '于都县' => '于都縣',
+'于都縣' => '于都縣',
 '于里察' => '于里察',
 '于阗' => '于闐',
-'于雙戈' => '于雙戈',
 '于双戈' => '于雙戈',
+'于雙戈' => '于雙戈',
 '于云鹤' => '于雲鶴',
 '于震' => '于震',
 '于震寰' => '于震寰',
@@ -3680,17 +3681,17 @@ $zh2Hant = array(
 '于风政' => '于風政',
 '于風政' => '于風政',
 '于飞' => '于飛',
-'于飞岛' => '于飛島',
 '于飛島' => '于飛島',
+'于飞岛' => '于飛島',
 '于余曲折' => '于餘曲折',
 '于鬯' => '于鬯',
 '于魁智' => '于魁智',
-'于凤桐' => '于鳳桐',
 '于鳳桐' => '于鳳桐',
+'于凤桐' => '于鳳桐',
 '于凤至' => '于鳳至',
 '于鳳至' => '于鳳至',
-'于默奥' => '于默奧',
 '于默奧' => '于默奧',
+'于默奥' => '于默奧',
 '云乎' => '云乎',
 '云云' => '云云',
 '云何' => '云何',
@@ -3770,8 +3771,8 @@ $zh2Hant = array(
 '件钟' => '件鐘',
 '任何表演' => '任何表演',
 '任何表示' => '任何表示',
-'任何表達' => '任何表達',
 '任何表达' => '任何表達',
+'任何表達' => '任何表達',
 '任何表' => '任何錶',
 '任何钟' => '任何鐘',
 '任何钟表' => '任何鐘錶',
@@ -3983,8 +3984,8 @@ $zh2Hant = array(
 '占过' => '佔過',
 '占道' => '佔道',
 '占零' => '佔零',
-'占領' => '佔領',
 '占领' => '佔領',
+'占領' => '佔領',
 '占头' => '佔頭',
 '占头筹' => '佔頭籌',
 '占饭' => '佔飯',
@@ -4054,8 +4055,8 @@ $zh2Hant = array(
 '占y' => '佔y',
 '占z' => '佔z',
 '何杰' => '何杰',
-'余三胜' => '余三勝',
 '余三勝' => '余三勝',
+'余三胜' => '余三勝',
 '余光中' => '余光中',
 '余光生' => '余光生',
 '余力為' => '余力為',
@@ -4083,7 +4084,7 @@ $zh2Hant = array(
 '并到' => '併到',
 '并合' => '併合',
 '并名' => '併名',
-'并吞下' => '併吞下',
+'并吞' => '併吞',
 '并拢' => '併攏',
 '并案' => '併案',
 '并流' => '併流',
@@ -4245,8 +4246,8 @@ $zh2Hant = array(
 '凶横' => '兇橫',
 '凶殘' => '兇殘',
 '凶残' => '兇殘',
-'凶殺' => '兇殺',
 '凶杀' => '兇殺',
+'凶殺' => '兇殺',
 '凶犯' => '兇犯',
 '凶狠' => '兇狠',
 '凶猛' => '兇猛',
@@ -4263,8 +4264,8 @@ $zh2Hant = array(
 '党太尉' => '党太尉',
 '党怀英' => '党懷英',
 '党进' => '党進',
-'党項' => '党項',
 '党项' => '党項',
+'党項' => '党項',
 '内制' => '內製',
 '内面包' => '內面包',
 '内面包的' => '內面包的',
@@ -4352,8 +4353,8 @@ $zh2Hant = array(
 '准不准我' => '准不准我',
 '准不准许' => '准不准許',
 '准不准谁' => '准不准誰',
-'准保護' => '准保護',
 '准保护' => '准保護',
+'准保護' => '准保護',
 '准保释' => '准保釋',
 '准保釋' => '准保釋',
 '凌蒙初' => '凌濛初',
@@ -4409,8 +4410,8 @@ $zh2Hant = array(
 '划子' => '划子',
 '划得来' => '划得來',
 '划拳' => '划拳',
-'划桨' => '划槳',
 '划槳' => '划槳',
+'划桨' => '划槳',
 '划水' => '划水',
 '划算' => '划算',
 '划船' => '划船',
@@ -4437,7 +4438,6 @@ $zh2Hant = array(
 '利于' => '利於',
 '利欲熏心' => '利欲熏心',
 '刮来刮去' => '刮來刮去',
-'刮着' => '刮著',
 '刮起来' => '刮起來',
 '刮风下雪倒便宜' => '刮風下雪倒便宜',
 '刮胡' => '刮鬍',
@@ -4485,8 +4485,8 @@ $zh2Hant = array(
 '划入' => '劃入',
 '划为' => '劃為',
 '剧药' => '劇藥',
-'刘佳怜' => '劉佳怜',
 '劉佳怜' => '劉佳怜',
+'刘佳怜' => '劉佳怜',
 '刘克庄' => '劉克莊',
 '刘芸后' => '劉芸后',
 '力克制' => '力剋制',
@@ -4542,12 +4542,12 @@ $zh2Hant = array(
 '十出' => '十齣',
 '千个' => '千個',
 '千只可' => '千只可',
-'千只夠' => '千只夠',
 '千只够' => '千只夠',
+'千只夠' => '千只夠',
 '千只怕' => '千只怕',
 '千只能' => '千只能',
-'千只足够' => '千只足夠',
 '千只足夠' => '千只足夠',
+'千只足够' => '千只足夠',
 '千周后' => '千周後',
 '千多只' => '千多隻',
 '千天后' => '千天後',
@@ -4625,8 +4625,8 @@ $zh2Hant = array(
 '口里' => '口裡',
 '口试' => '口試',
 '口钟' => '口鐘',
-'古书云' => '古書云',
 '古書云' => '古書云',
+'古书云' => '古書云',
 '古柯咸' => '古柯鹹',
 '古柯碱' => '古柯鹼',
 '古朴' => '古樸',
@@ -4647,10 +4647,10 @@ $zh2Hant = array(
 '只要功夫深,铁杵磨成锈花针' => '只要功夫深,鐵杵磨成鏽花針',
 '只身上已' => '只身上已',
 '只身上有' => '只身上有',
-'只身上沒' => '只身上沒',
 '只身上没' => '只身上沒',
-'只身上無' => '只身上無',
+'只身上沒' => '只身上沒',
 '只身上无' => '只身上無',
+'只身上無' => '只身上無',
 '只身上的' => '只身上的',
 '只身世' => '只身世',
 '只身份' => '只身份',
@@ -4665,8 +4665,8 @@ $zh2Hant = array(
 '只身旁' => '只身旁',
 '只身材' => '只身材',
 '只身段' => '只身段',
-'只身为' => '只身為',
 '只身為' => '只身為',
+'只身为' => '只身為',
 '只身边' => '只身邊',
 '只身邊' => '只身邊',
 '只身首' => '只身首',
@@ -4712,8 +4712,8 @@ $zh2Hant = array(
 '各辟' => '各闢',
 '各类钟' => '各類鐘',
 '合伙人' => '合伙人',
+'合并' => '合併',
 '合伙' => '合夥',
-'合并' => '合并',
 '合府上' => '合府上',
 '合采' => '合採',
 '合历' => '合曆',
@@ -4751,10 +4751,10 @@ $zh2Hant = array(
 '后丰' => '后豐',
 '后豐' => '后豐',
 '后里' => '后里',
-'后发FK型星' => '后髮FK型星',
 '后髮FK型星' => '后髮FK型星',
-'后髮座' => '后髮座',
+'后发FK型星' => '后髮FK型星',
 '后发座' => '后髮座',
+'后髮座' => '后髮座',
 '后发星系团' => '后髮星系團',
 '后髮星系團' => '后髮星系團',
 '吐哺捉发' => '吐哺捉髮',
@@ -4771,8 +4771,8 @@ $zh2Hant = array(
 '吹发' => '吹髮',
 '吹胡' => '吹鬍',
 '吾为之范我驰驱' => '吾爲之範我馳驅',
-'吕后' => '呂后',
 '呂后' => '呂后',
+'吕后' => '呂后',
 '呆呆傻傻' => '呆呆傻傻',
 '呆呆挣挣' => '呆呆掙掙',
 '呆呆獸' => '呆呆獸',
@@ -4788,8 +4788,8 @@ $zh2Hant = array(
 '周后' => '周后',
 '周四' => '周四',
 '周历' => '周曆',
-'周杰伦' => '周杰倫',
 '周杰倫' => '周杰倫',
+'周杰伦' => '周杰倫',
 '周历史' => '周歷史',
 '周庄王' => '周莊王',
 '周游' => '周遊',
@@ -4883,7 +4883,6 @@ $zh2Hant = array(
 '回历史' => '回歷史',
 '回丝' => '回絲',
 '回着' => '回著',
-'回荡' => '回蕩',
 '回游' => '回遊',
 '回阳荡气' => '回陽蕩氣',
 '因于' => '因於',
@@ -4945,9 +4944,9 @@ $zh2Hant = array(
 '埋头寻钟' => '埋頭尋鐘',
 '埋头寻钟表' => '埋頭尋鐘錶',
 '城里' => '城裡',
-'埔裡社撫墾局' => '埔裏社撫墾局',
-'埔裏社撫墾局' => '埔裏社撫墾局',
 '埔里社抚垦局' => '埔裏社撫墾局',
+'埔裏社撫墾局' => '埔裏社撫墾局',
+'埔裡社撫墾局' => '埔裏社撫墾局',
 '基干' => '基幹',
 '基于' => '基於',
 '基准' => '基準',
@@ -4974,8 +4973,8 @@ $zh2Hant = array(
 '壶里' => '壺裡',
 '壸范' => '壼範',
 '寿面' => '壽麵',
-'夏于乔' => '夏于喬',
 '夏于喬' => '夏于喬',
+'夏于乔' => '夏于喬',
 '夏天里' => '夏天裡',
 '夏日里' => '夏日裡',
 '夏历' => '夏曆',
@@ -5015,7 +5014,6 @@ $zh2Hant = array(
 '伙同' => '夥同',
 '伙众' => '夥眾',
 '伙计' => '夥計',
-'大丑' => '大丑',
 '大伙儿' => '大伙兒',
 '大只可' => '大只可',
 '大只在' => '大只在',
@@ -5050,6 +5048,7 @@ $zh2Hant = array(
 '大言非夸' => '大言非夸',
 '大赞' => '大讚',
 '大周折' => '大週摺',
+'大丑' => '大醜',
 '大金发苔' => '大金髮苔',
 '大钟' => '大鐘',
 '大只' => '大隻',
@@ -5209,8 +5208,8 @@ $zh2Hant = array(
 '宽松' => '寬鬆',
 '寮采' => '寮寀',
 '宝山庄' => '寶山庄',
-'寶曆' => '寶曆',
 '宝历' => '寶曆',
+'寶曆' => '寶曆',
 '宝历史' => '寶歷史',
 '宝庄' => '寶莊',
 '宝里宝气' => '寶裡寶氣',
@@ -5365,23 +5364,20 @@ $zh2Hant = array(
 '年谷' => '年穀',
 '年里' => '年裡',
 '并力' => '并力',
-'并吞' => '并吞',
 '并州' => '并州',
 '并日而食' => '并日而食',
 '并迭' => '并迭',
 '幸免于难' => '幸免於難',
 '幸于' => '幸於',
 '幸运胡' => '幸運鬍',
-'干上' => '幹上',
 '干下去' => '幹下去',
 '干不了' => '幹不了',
 '干不成' => '幹不成',
-'干了' => '幹了',
 '干事' => '幹事',
 '干些' => '幹些',
 '干人' => '幹人',
 '干什么' => '幹什麼',
-'干个' => '幹個',
+'干个够' => '幹個夠',
 '干劲' => '幹勁',
 '干劲冲天' => '幹勁沖天',
 '干吏' => '幹吏',
@@ -5393,10 +5389,9 @@ $zh2Hant = array(
 '干完' => '幹完',
 '干家' => '幹家',
 '干将' => '幹將',
-'干得' => '幹得',
+'干得了' => '幹得了',
 '干性油' => '幹性油',
 '干才' => '幹才',
-'干掉' => '幹掉',
 '干探' => '幹探',
 '干校' => '幹校',
 '干活' => '幹活',
@@ -5409,8 +5404,8 @@ $zh2Hant = array(
 '干略' => '幹略',
 '干当' => '幹當',
 '干的停当' => '幹的停當',
-'干细胞' => '幹細胞',
 '干細胞' => '幹細胞',
+'干细胞' => '幹細胞',
 '干线' => '幹線',
 '干练' => '幹練',
 '干缺' => '幹缺',
@@ -5442,8 +5437,8 @@ $zh2Hant = array(
 '府干政' => '府干政',
 '府干涉' => '府干涉',
 '府干犯' => '府干犯',
-'府干預' => '府干預',
 '府干预' => '府干預',
+'府干預' => '府干預',
 '府干' => '府幹',
 '座钟' => '座鐘',
 '康庄大道' => '康庄大道',
@@ -5751,8 +5746,8 @@ $zh2Hant = array(
 '忠人之托' => '忠人之托',
 '忠仆' => '忠僕',
 '忠于' => '忠於',
-'快干' => '快乾',
 '快克制' => '快剋制',
+'快干' => '快幹',
 '快快当当' => '快快當當',
 '快冲' => '快衝',
 '怎么' => '怎麼',
@@ -5860,8 +5855,8 @@ $zh2Hant = array(
 '所占算' => '所占算',
 '所托' => '所託',
 '扁拟谷盗虫' => '扁擬穀盜蟲',
-'手塚治虫' => '手塚治虫',
 '手冢治虫' => '手塚治虫',
+'手塚治虫' => '手塚治虫',
 '手折' => '手摺',
 '手表态' => '手表態',
 '手表明' => '手表明',
@@ -5872,8 +5867,8 @@ $zh2Hant = array(
 '手表达' => '手表達',
 '手表露' => '手表露',
 '手表面' => '手表面',
+'手里' => '手裏',
 '手里剑' => '手裏劍',
-'手里' => '手裡',
 '手表' => '手錶',
 '手松' => '手鬆',
 '才克制' => '才剋制',
@@ -6318,9 +6313,9 @@ $zh2Hant = array(
 '于国' => '於國',
 '于坏' => '於坏',
 '于垂' => '於垂',
+'於夫羅' => '於夫羅',
 '于夫罗' => '於夫羅',
 '於夫罗' => '於夫羅',
-'於夫羅' => '於夫羅',
 '于她' => '於她',
 '于好' => '於好',
 '于始' => '於始',
@@ -6498,8 +6493,8 @@ $zh2Hant = array(
 '会上签订' => '會上簽訂',
 '会占' => '會佔',
 '会占卜' => '會占卜',
-'会干扰' => '會干擾',
 '會干擾' => '會干擾',
+'会干扰' => '會干擾',
 '会干' => '會幹',
 '会吊' => '會弔',
 '会里' => '會裡',
@@ -6636,8 +6631,8 @@ $zh2Hant = array(
 '棺材里' => '棺材裡',
 '植发' => '植髮',
 '椰枣干' => '椰棗乾',
-'楊雅筑' => '楊雅筑',
 '杨雅筑' => '楊雅筑',
+'楊雅筑' => '楊雅筑',
 '楚庄问鼎' => '楚莊問鼎',
 '楚庄王' => '楚莊王',
 '楚庄绝缨' => '楚莊絕纓',
@@ -6662,8 +6657,8 @@ $zh2Hant = array(
 '模范14棒' => '模范14棒',
 '模范21棒' => '模范21棒',
 '模范七棒' => '模范七棒',
-'模范三军' => '模范三軍',
 '模范三軍' => '模范三軍',
+'模范三军' => '模范三軍',
 '模范棒棒堂' => '模范棒棒堂',
 '模制' => '模製',
 '样范' => '樣範',
@@ -6823,8 +6818,8 @@ $zh2Hant = array(
 '洒濯' => '洒濯',
 '洒然' => '洒然',
 '洒脱' => '洒脫',
-'洗炼' => '洗鍊',
 '洗练' => '洗鍊',
+'洗炼' => '洗鍊',
 '洗发' => '洗髮',
 '洛钟东应' => '洛鐘東應',
 '泄欲' => '洩慾',
@@ -6861,18 +6856,18 @@ $zh2Hant = array(
 '涂序瑄' => '涂序瑄',
 '涂敏恒' => '涂敏恆',
 '涂敏恆' => '涂敏恆',
-'涂澤民' => '涂澤民',
 '涂泽民' => '涂澤民',
+'涂澤民' => '涂澤民',
 '涂绍煃' => '涂紹煃',
 '涂羽卿' => '涂羽卿',
-'涂謹申' => '涂謹申',
 '涂谨申' => '涂謹申',
+'涂謹申' => '涂謹申',
 '涂逢年' => '涂逢年',
 '涂醒哲' => '涂醒哲',
 '涂長望' => '涂長望',
 '涂长望' => '涂長望',
-'涂鸿钦' => '涂鴻欽',
 '涂鴻欽' => '涂鴻欽',
+'涂鸿钦' => '涂鴻欽',
 '消炎药' => '消炎藥',
 '消肿药' => '消腫藥',
 '液晶表' => '液晶錶',
@@ -6903,6 +6898,7 @@ $zh2Hant = array(
 '渠冲' => '渠衝',
 '测试' => '測試',
 '港制' => '港製',
+'游荡' => '游蕩',
 '游离' => '游離',
 '浑朴' => '渾樸',
 '浑个' => '渾箇',
@@ -7003,7 +6999,6 @@ $zh2Hant = array(
 '蒙汜' => '濛汜',
 '蒙蒙细雨' => '濛濛細雨',
 '蒙雾' => '濛霧',
-'蒙松雨' => '濛鬆雨',
 '蒙鸿' => '濛鴻',
 '滨田里佳子' => '濱田里佳子',
 '泻药' => '瀉藥',
@@ -7244,8 +7239,8 @@ $zh2Hant = array(
 '发签' => '發籤',
 '发庄' => '發莊',
 '发着' => '發著',
-'发表' => '發表',
 '發表' => '發表',
+'发表' => '發表',
 '发松' => '發鬆',
 '发面' => '發麵',
 '白干' => '白乾',
@@ -7263,8 +7258,8 @@ $zh2Hant = array(
 '白霉' => '白黴',
 '百个' => '百個',
 '百只可' => '百只可',
-'百只夠' => '百只夠',
 '百只够' => '百只夠',
+'百只夠' => '百只夠',
 '百只怕' => '百只怕',
 '百只足够' => '百只足夠',
 '百只足夠' => '百只足夠',
@@ -7361,6 +7356,7 @@ $zh2Hant = array(
 '瞳蒙' => '瞳矇',
 '蒙事' => '矇事',
 '蒙昧无知' => '矇昧無知',
+'蒙松雨' => '矇松雨',
 '蒙混' => '矇混',
 '蒙瞍' => '矇瞍',
 '蒙眬' => '矇矓',
@@ -7546,15 +7542,15 @@ $zh2Hant = array(
 '筑前' => '筑前',
 '筑北' => '筑北',
 '筑州' => '筑州',
-'筑後' => '筑後',
 '筑后' => '筑後',
+'筑後' => '筑後',
 '筑波' => '筑波',
 '筑紫' => '筑紫',
 '筑肥' => '筑肥',
 '筑西' => '筑西',
 '筑邦' => '筑邦',
-'筑陽' => '筑陽',
 '筑阳' => '筑陽',
+'筑陽' => '筑陽',
 '答复' => '答覆',
 '答覆' => '答覆',
 '筵几' => '筵几',
@@ -7696,8 +7692,8 @@ $zh2Hant = array(
 '丝发' => '絲髮',
 '绑扎' => '綁紮',
 '綑扎' => '綑紮',
-'经有云' => '經有云',
 '經有云' => '經有云',
+'经有云' => '經有云',
 '绿发' => '綠髮',
 '绸缎庄' => '綢緞莊',
 '维系' => '維繫',
@@ -7955,8 +7951,8 @@ $zh2Hant = array(
 '舰只' => '艦隻',
 '良药' => '良藥',
 '色欲' => '色慾',
-'艷后' => '艷后',
 '艳后' => '艷后',
+'艷后' => '艷后',
 '艸木丰丰' => '艸木丰丰',
 '芍药' => '芍藥',
 '芒果干' => '芒果乾',
@@ -7981,16 +7977,16 @@ $zh2Hant = array(
 '茂都淀' => '茂都澱',
 '范文同' => '范文同',
 '范文正公' => '范文正公',
-'范文瀾' => '范文瀾',
 '范文澜' => '范文瀾',
+'范文瀾' => '范文瀾',
 '范文照' => '范文照',
 '范文程' => '范文程',
 '范文芳' => '范文芳',
 '范文藤' => '范文藤',
 '范文虎' => '范文虎',
 '范登堡' => '范登堡',
-'范贤惠' => '范賢惠',
 '范賢惠' => '范賢惠',
+'范贤惠' => '范賢惠',
 '茶几' => '茶几',
 '茶庄' => '茶莊',
 '茶余' => '茶餘',
@@ -8035,8 +8031,8 @@ $zh2Hant = array(
 '华严钟' => '華嚴鐘',
 '华发' => '華髮',
 '菸碱' => '菸鹼',
-'萬一只' => '萬一只',
 '万一只' => '萬一只',
+'萬一只' => '萬一只',
 '万个' => '萬個',
 '万周后' => '萬周後',
 '万多只' => '萬多隻',
@@ -8538,8 +8534,8 @@ $zh2Hant = array(
 '诱奸' => '誘姦',
 '语云' => '語云',
 '语汇' => '語彙',
-'语有云' => '語有云',
 '語有云' => '語有云',
+'语有云' => '語有云',
 '诚征' => '誠徵',
 '诚朴' => '誠樸',
 '诬蔑' => '誣衊',
@@ -8600,6 +8596,7 @@ $zh2Hant = array(
 '豆腐干' => '豆腐乾',
 '竖着' => '豎著',
 '竖起脊梁' => '豎起脊梁',
+'丰度' => '豐度',
 '丰滨' => '豐濱',
 '丰滨乡' => '豐濱鄉',
 '象征' => '象徵',
@@ -8609,17 +8606,17 @@ $zh2Hant = array(
 '贵价' => '貴价',
 '贵干' => '貴幹',
 '贵征' => '貴徵',
-'買凶' => '買兇',
 '买凶' => '買兇',
+'買凶' => '買兇',
 '买断发' => '買斷發',
 '费占' => '費佔',
 '贻范' => '貽範',
 '资金占用' => '資金占用',
-'贾后' => '賈后',
 '賈后' => '賈后',
+'贾后' => '賈后',
 '赏赞' => '賞讚',
-'贤后' => '賢后',
 '賢后' => '賢后',
+'贤后' => '賢后',
 '卖断发' => '賣斷發',
 '卖呆' => '賣獃',
 '质朴' => '質樸',
@@ -8667,10 +8664,10 @@ $zh2Hant = array(
 '较于' => '較於',
 '挽曲' => '輓曲',
 '挽歌' => '輓歌',
-'挽聯' => '輓聯',
 '挽联' => '輓聯',
-'æ\8c½è©\9e' => 'è¼\93è©\9e',
+'æ\8c½è\81¯' => 'è¼\93è\81¯',
 '挽词' => '輓詞',
+'挽詞' => '輓詞',
 '挽诗' => '輓詩',
 '挽詩' => '輓詩',
 '轻于' => '輕於',
@@ -8713,6 +8710,7 @@ $zh2Hant = array(
 '回绕' => '迴繞',
 '回翔' => '迴翔',
 '回肠' => '迴腸',
+'回荡' => '迴蕩',
 '回诵' => '迴誦',
 '回路' => '迴路',
 '回转' => '迴轉',
@@ -8803,7 +8801,6 @@ $zh2Hant = array(
 '游河' => '遊河',
 '游猎' => '遊獵',
 '游玩' => '遊玩',
-'游荡' => '遊盪',
 '游目骋怀' => '遊目騁懷',
 '游程' => '遊程',
 '游丝' => '遊絲',
@@ -8875,10 +8872,10 @@ $zh2Hant = array(
 '部落发' => '部落發',
 '郭后' => '郭后',
 '都于' => '都於',
-'鄉愿' => '鄉愿',
 '乡愿' => '鄉愿',
-'é\84­å\87±äº\91' => 'é\84­å\87±äº\91',
+'é\84\89æ\84¿' => 'é\84\89æ\84¿',
 '郑凯云' => '鄭凱云',
+'鄭凱云' => '鄭凱云',
 '郑庄公' => '鄭莊公',
 '配制饲料' => '配制飼料',
 '配合着' => '配合著',
@@ -8912,6 +8909,7 @@ $zh2Hant = array(
 '丑女' => '醜女',
 '丑女效颦' => '醜女效顰',
 '丑奴儿' => '醜奴兒',
+'丑婆子' => '醜婆子',
 '丑妇' => '醜婦',
 '丑媳' => '醜媳',
 '丑媳妇' => '醜媳婦',
@@ -8953,8 +8951,8 @@ $zh2Hant = array(
 '酿制' => '釀製',
 '衅钟' => '釁鐘',
 '采石之役' => '采石之役',
-'采石之战' => '采石之戰',
 '采石之戰' => '采石之戰',
+'采石之战' => '采石之戰',
 '采石磯' => '采石磯',
 '采石矶' => '采石磯',
 '釉药' => '釉藥',
@@ -9324,10 +9322,10 @@ $zh2Hant = array(
 '音声如钟' => '音聲如鐘',
 '韶山冲' => '韶山沖',
 '响钟' => '響鐘',
-'頁面' => '頁面',
 '页面' => '頁面',
-'é \82å¤\9a' => 'é \82å¤\9a',
+'é \81é\9d¢' => 'é \81é\9d¢',
 '顶多' => '頂多',
+'頂多' => '頂多',
 '项庄' => '項莊',
 '顺于' => '順於',
 '顺钟向' => '順鐘向',
@@ -9349,8 +9347,8 @@ $zh2Hant = array(
 '颜范' => '顏範',
 '颠干倒坤' => '顛乾倒坤',
 '颠覆' => '顛覆',
-'颠颠仆仆' => '顛顛仆仆',
 '顛顛仆仆' => '顛顛仆仆',
+'颠颠仆仆' => '顛顛仆仆',
 '颤栗' => '顫慄',
 '显示表' => '顯示錶',
 '显示钟' => '顯示鐘',
@@ -9365,14 +9363,15 @@ $zh2Hant = array(
 '风范' => '風範',
 '风里' => '風裡',
 '风起云涌' => '風起雲湧',
-'风采' => '風采',
 '風采' => '風采',
+'风采' => '風采',
 '台风' => '颱風',
 '台风后' => '颱風後',
 '刮了' => '颳了',
 '刮倒' => '颳倒',
 '刮去' => '颳去',
 '刮得' => '颳得',
+'刮着' => '颳著',
 '刮走' => '颳走',
 '刮起' => '颳起',
 '刮雪' => '颳雪',
@@ -9539,16 +9538,16 @@ $zh2Hant = array(
 '香干' => '香乾',
 '香山庄' => '香山庄',
 '马干' => '馬乾',
-'马占山' => '馬占山',
 '馬占山' => '馬占山',
+'马占山' => '馬占山',
 '马杆' => '馬杆',
-'馬格里布' => '馬格里布',
 '马格里布' => '馬格里布',
+'馬格里布' => '馬格里布',
 '马表' => '馬錶',
 '驻扎' => '駐紮',
 '骀荡' => '駘蕩',
-'腾格里' => '騰格里',
 '騰格里' => '騰格里',
+'腾格里' => '騰格里',
 '腾冲' => '騰衝',
 '惊赞' => '驚讚',
 '惊钟' => '驚鐘',
@@ -9734,6 +9733,7 @@ $zh2Hant = array(
 '斗而铸锥' => '鬥而鑄錐',
 '斗脚' => '鬥腳',
 '斗舰' => '鬥艦',
+'斗艳' => '鬥艷',
 '斗茶' => '鬥茶',
 '斗草' => '鬥草',
 '斗叶儿' => '鬥葉兒',
@@ -9741,7 +9741,6 @@ $zh2Hant = array(
 '斗着' => '鬥著',
 '斗蟋蟀' => '鬥蟋蟀',
 '斗话' => '鬥話',
-'斗艳' => '鬥豔',
 '斗起' => '鬥起',
 '斗趣' => '鬥趣',
 '斗闲气' => '鬥閑氣',
@@ -9914,11 +9913,11 @@ $zh2Hant = array(
 '黄历' => '黃曆',
 '黄曲霉' => '黃曲霉',
 '黄历史' => '黃歷史',
-'黃詩杰' => '黃詩杰',
 '黄诗杰' => '黃詩杰',
+'黃詩杰' => '黃詩杰',
 '黄金表' => '黃金表',
-'黃鈺筑' => '黃鈺筑',
 '黄钰筑' => '黃鈺筑',
+'黃鈺筑' => '黃鈺筑',
 '黄钟' => '黃鐘',
 '黄发' => '黃髮',
 '黄曲毒素' => '黃麴毒素',
@@ -13244,8 +13243,8 @@ $zh2Hans = array(
 '乘著述' => '乘著述',
 '乾一坛' => '乾一坛',
 '乾一壇' => '乾一坛',
-'乾一组' => '乾一组',
 '乾一組' => '乾一组',
+'乾一组' => '乾一组',
 '乾上乾下' => '乾上乾下',
 '乾為天' => '乾为天',
 '乾為陽' => '乾为阳',
@@ -13265,10 +13264,10 @@ $zh2Hans = array(
 '乾岡' => '乾冈',
 '乾劉' => '乾刘',
 '乾刘' => '乾刘',
-'乾剛' => '乾刚',
 '乾刚' => '乾刚',
-'ä¹¾å\8b\99' => 'ä¹¾å\8a¡',
+'ä¹¾å\89\9b' => 'ä¹¾å\88\9a',
 '乾务' => '乾务',
+'乾務' => '乾务',
 '乾化' => '乾化',
 '乾卦' => '乾卦',
 '乾县' => '乾县',
@@ -13320,12 +13319,12 @@ $zh2Hans = array(
 '乾景' => '乾景',
 '乾晷' => '乾晷',
 '乾曜' => '乾曜',
-'乾构' => '乾构',
 '乾構' => '乾构',
-'ä¹¾æ¨\9e' => 'ä¹¾æ\9e¢',
+'ä¹¾æ\9e\84' => 'ä¹¾æ\9e\84',
 '乾枢' => '乾枢',
-'ä¹¾æ \8b' => 'ä¹¾æ \8b',
+'ä¹¾æ¨\9e' => 'ä¹¾æ\9e¢',
 '乾棟' => '乾栋',
+'乾栋' => '乾栋',
 '乾步' => '乾步',
 '乾氏' => '乾氏',
 '乾沓和' => '乾沓和',
@@ -13335,8 +13334,8 @@ $zh2Hans = array(
 '乾清宮' => '乾清宫',
 '乾清宫' => '乾清宫',
 '乾渥' => '乾渥',
-'乾靈' => '乾灵',
 '乾灵' => '乾灵',
+'乾靈' => '乾灵',
 '乾男' => '乾男',
 '乾皋' => '乾皋',
 '乾盛世' => '乾盛世',
@@ -13355,19 +13354,19 @@ $zh2Hans = array(
 '乾红' => '乾红',
 '乾綱' => '乾纲',
 '乾纲' => '乾纲',
-'乾纽' => '乾纽',
 '乾紐' => '乾纽',
+'乾纽' => '乾纽',
 '乾絡' => '乾络',
 '乾络' => '乾络',
 '乾統' => '乾统',
 '乾统' => '乾统',
 '乾維' => '乾维',
 '乾维' => '乾维',
-'乾羅' => '乾罗',
 '乾罗' => '乾罗',
+'乾羅' => '乾罗',
 '乾花' => '乾花',
-'乾蔭' => '乾荫',
 '乾荫' => '乾荫',
+'乾蔭' => '乾荫',
 '乾行' => '乾行',
 '乾衡' => '乾衡',
 '乾覆' => '乾覆',
@@ -13376,19 +13375,19 @@ $zh2Hans = array(
 '乾象历' => '乾象历',
 '乾贞' => '乾贞',
 '乾貞' => '乾贞',
-'乾貺' => '乾贶',
 '乾贶' => '乾贶',
+'乾貺' => '乾贶',
 '乾车' => '乾车',
 '乾車' => '乾车',
-'乾軸' => '乾轴',
 '乾轴' => '乾轴',
+'乾軸' => '乾轴',
 '乾通' => '乾通',
 '乾造' => '乾造',
 '乾道' => '乾道',
 '乾鑒' => '乾鉴',
 '乾鉴' => '乾鉴',
-'乾钧' => '乾钧',
 '乾鈞' => '乾钧',
+'乾钧' => '乾钧',
 '乾闼' => '乾闼',
 '乾闥' => '乾闼',
 '乾陀' => '乾陀',
@@ -13397,8 +13396,8 @@ $zh2Hans = array(
 '乾音' => '乾音',
 '乾顾' => '乾顾',
 '乾顧' => '乾顾',
-'乾风' => '乾风',
 '乾風' => '乾风',
+'乾风' => '乾风',
 '乾首' => '乾首',
 '乾馬' => '乾马',
 '乾马' => '乾马',
@@ -13406,8 +13405,8 @@ $zh2Hans = array(
 '乾鹄' => '乾鹄',
 '乾鵲' => '乾鹊',
 '乾鹊' => '乾鹊',
-'乾龍' => '乾龙',
 '乾龙' => '乾龙',
+'乾龍' => '乾龙',
 '乾,健也' => '乾,健也',
 '乾,天也' => '乾,天也',
 '爭著' => '争着',
@@ -13420,14 +13419,14 @@ $zh2Hans = array(
 '爭著述' => '争著述',
 '五箇山' => '五箇山',
 '亮著' => '亮着',
-'亮著书' => '亮著书',
 '亮著書' => '亮著书',
+'亮著书' => '亮著书',
 '亮著作' => '亮著作',
 '亮著名' => '亮著名',
 '亮著錄' => '亮著录',
 '亮著录' => '亮著录',
-'亮著称' => '亮著称',
 '亮著稱' => '亮著称',
+'亮著称' => '亮著称',
 '亮著者' => '亮著者',
 '亮著述' => '亮著述',
 '仗著' => '仗着',
@@ -13442,12 +13441,12 @@ $zh2Hans = array(
 '仗著者' => '仗著者',
 '仗著述' => '仗著述',
 '代表著' => '代表着',
-'代表著書' => '代表著书',
 '代表著书' => '代表著书',
+'代表著書' => '代表著书',
 '代表著作' => '代表著作',
 '代表著名' => '代表著名',
-'代表著錄' => '代表著录',
 '代表著录' => '代表著录',
+'代表著錄' => '代表著录',
 '代表著称' => '代表著称',
 '代表著稱' => '代表著称',
 '代表著者' => '代表著者',
@@ -13471,13 +13470,13 @@ $zh2Hans = array(
 '伴著名' => '伴著名',
 '伴著录' => '伴著录',
 '伴著錄' => '伴著录',
-'伴著稱' => '伴著称',
 '伴著称' => '伴著称',
+'伴著稱' => '伴著称',
 '伴著者' => '伴著者',
 '伴著述' => '伴著述',
 '低著' => '低着',
-'低著書' => '低著书',
 '低著书' => '低著书',
+'低著書' => '低著书',
 '低著作' => '低著作',
 '低著名' => '低著名',
 '低著录' => '低著录',
@@ -13493,8 +13492,8 @@ $zh2Hans = array(
 '住著名' => '住著名',
 '住著錄' => '住著录',
 '住著录' => '住著录',
-'住著称' => '住著称',
 '住著稱' => '住著称',
+'住著称' => '住著称',
 '住著者' => '住著者',
 '住著述' => '住著述',
 '佛頭著糞' => '佛头著粪',
@@ -13515,8 +13514,8 @@ $zh2Hans = array(
 '保障著名' => '保障著名',
 '保障著錄' => '保障著录',
 '保障著录' => '保障著录',
-'保障著稱' => '保障著称',
 '保障著称' => '保障著称',
+'保障著稱' => '保障著称',
 '保障著者' => '保障著者',
 '保障著述' => '保障著述',
 '信著' => '信着',
@@ -13526,8 +13525,8 @@ $zh2Hans = array(
 '信著名' => '信著名',
 '信著录' => '信著录',
 '信著錄' => '信著录',
-'信著称' => '信著称',
 '信著稱' => '信著称',
+'信著称' => '信著称',
 '信著者' => '信著者',
 '信著述' => '信著述',
 '修鍊' => '修炼',
@@ -13537,10 +13536,10 @@ $zh2Hans = array(
 '候著书' => '候著书',
 '候著作' => '候著作',
 '候著名' => '候著名',
-'候著录' => '候著录',
 '候著錄' => '候著录',
-'候著稱' => '候著称',
+'候著录' => '候著录',
 '候著称' => '候著称',
+'候著稱' => '候著称',
 '候著者' => '候著者',
 '候著述' => '候著述',
 '藉助' => '借助',
@@ -13550,28 +13549,28 @@ $zh2Hans = array(
 '藉機' => '借机',
 '藉此' => '借此',
 '藉由' => '借由',
+'藉著' => '借着',
 '借著' => '借着',
 '藉着' => '借着',
-'藉著' => '借着',
 '藉端' => '借端',
-'借著書' => '借著书',
 '借著书' => '借著书',
+'借著書' => '借著书',
 '借著作' => '借著作',
 '借著名' => '借著名',
 '借著录' => '借著录',
 '借著錄' => '借著录',
-'借著称' => '借著称',
 '借著稱' => '借著称',
+'借著称' => '借著称',
 '借著者' => '借著者',
 '借著述' => '借著述',
 '藉詞' => '借词',
 '做著' => '做着',
-'做著書' => '做著书',
 '做著书' => '做著书',
+'做著書' => '做著书',
 '做著作' => '做著作',
 '做著名' => '做著名',
-'做著錄' => '做著录',
 '做著录' => '做著录',
+'做著錄' => '做著录',
 '做著稱' => '做著称',
 '做著称' => '做著称',
 '做著者' => '做著者',
@@ -13583,8 +13582,8 @@ $zh2Hans = array(
 '偷著名' => '偷著名',
 '偷著錄' => '偷著录',
 '偷著录' => '偷著录',
-'偷著稱' => '偷著称',
 '偷著称' => '偷著称',
+'偷著稱' => '偷著称',
 '偷著者' => '偷著者',
 '偷著述' => '偷著述',
 '傢俬' => '傢俬',
@@ -13609,25 +13608,25 @@ $zh2Hans = array(
 '關著者' => '关著者',
 '關著述' => '关著述',
 '冀著' => '冀着',
-'冀著書' => '冀著书',
 '冀著书' => '冀著书',
+'冀著書' => '冀著书',
 '冀著作' => '冀著作',
 '冀著名' => '冀著名',
-'冀著錄' => '冀著录',
 '冀著录' => '冀著录',
+'冀著錄' => '冀著录',
 '冀著稱' => '冀著称',
 '冀著称' => '冀著称',
 '冀著者' => '冀著者',
 '冀著述' => '冀著述',
 '冒著' => '冒着',
-'冒著书' => '冒著书',
 '冒著書' => '冒著书',
+'冒著书' => '冒著书',
 '冒著作' => '冒著作',
 '冒著名' => '冒著名',
 '冒著录' => '冒著录',
 '冒著錄' => '冒著录',
-'冒著稱' => '冒著称',
 '冒著称' => '冒著称',
+'冒著稱' => '冒著称',
 '冒著者' => '冒著者',
 '冒著述' => '冒著述',
 '寫著' => '写着',
@@ -13652,10 +13651,10 @@ $zh2Hans = array(
 '制著書' => '制著书',
 '制著作' => '制著作',
 '制著名' => '制著名',
-'制著錄' => '制著录',
 '制著录' => '制著录',
-'制著称' => '制著称',
+'制著錄' => '制著录',
 '制著稱' => '制著称',
+'制著称' => '制著称',
 '制著者' => '制著者',
 '制著述' => '制著述',
 '刻著' => '刻着',
@@ -13686,14 +13685,14 @@ $zh2Hans = array(
 '動著者' => '动著者',
 '動著述' => '动著述',
 '努力著' => '努力着',
-'努力著書' => '努力著书',
 '努力著书' => '努力著书',
+'努力著書' => '努力著书',
 '努力著作' => '努力著作',
 '努力著名' => '努力著名',
-'努力著錄' => '努力著录',
 '努力著录' => '努力著录',
-'努力著称' => '努力著称',
+'努力著錄' => '努力著录',
 '努力著稱' => '努力著称',
+'努力著称' => '努力著称',
 '努力著者' => '努力著者',
 '努力著述' => '努力著述',
 '努著' => '努着',
@@ -13709,14 +13708,14 @@ $zh2Hans = array(
 '努著述' => '努著述',
 '卓著' => '卓著',
 '印著' => '印着',
-'印著书' => '印著书',
 '印著書' => '印著书',
+'印著书' => '印著书',
 '印著作' => '印著作',
 '印著名' => '印著名',
-'印著录' => '印著录',
 '印著錄' => '印著录',
-'印著称' => '印著称',
+'印著录' => '印著录',
 '印著稱' => '印著称',
+'印著称' => '印著称',
 '印著者' => '印著者',
 '印著述' => '印著述',
 '卷舌' => '卷舌',
@@ -13730,12 +13729,12 @@ $zh2Hans = array(
 '壓著述' => '压著述',
 '原著' => '原著',
 '去著' => '去着',
-'去著书' => '去著书',
 '去著書' => '去著书',
+'去著书' => '去著书',
 '去著作' => '去著作',
 '去著名' => '去著名',
-'去著录' => '去著录',
 '去著錄' => '去著录',
+'去著录' => '去著录',
 '去著稱' => '去著称',
 '去著称' => '去著称',
 '去著者' => '去著者',
@@ -13743,12 +13742,12 @@ $zh2Hans = array(
 '反反覆覆' => '反反复复',
 '反覆' => '反复',
 '受著' => '受着',
-'受著書' => '受著书',
 '受著书' => '受著书',
+'受著書' => '受著书',
 '受著作' => '受著作',
 '受著名' => '受著名',
-'受著錄' => '受著录',
 '受著录' => '受著录',
+'受著錄' => '受著录',
 '受著稱' => '受著称',
 '受著称' => '受著称',
 '受著者' => '受著者',
@@ -13762,12 +13761,12 @@ $zh2Hans = array(
 '變著者' => '变著者',
 '變著述' => '变著述',
 '叫著' => '叫着',
-'叫著书' => '叫著书',
 '叫著書' => '叫著书',
+'叫著书' => '叫著书',
 '叫著作' => '叫著作',
 '叫著名' => '叫著名',
-'叫著录' => '叫著录',
 '叫著錄' => '叫著录',
+'叫著录' => '叫著录',
 '叫著称' => '叫著称',
 '叫著稱' => '叫著称',
 '叫著者' => '叫著者',
@@ -13792,8 +13791,8 @@ $zh2Hans = array(
 '向著者' => '向著者',
 '向著述' => '向著述',
 '含著' => '含着',
-'含著書' => '含著书',
 '含著书' => '含著书',
+'含著書' => '含著书',
 '含著作' => '含著作',
 '含著名' => '含著名',
 '含著錄' => '含著录',
@@ -13812,8 +13811,8 @@ $zh2Hans = array(
 '聽著稱' => '听著称',
 '聽著者' => '听著者',
 '聽著述' => '听著述',
-'吴其濬' => '吴其濬',
 '吳其濬' => '吴其濬',
+'吴其濬' => '吴其濬',
 '吹著' => '吹着',
 '吹著書' => '吹著书',
 '吹著书' => '吹著书',
@@ -13827,12 +13826,12 @@ $zh2Hans = array(
 '吹著述' => '吹著述',
 '周易乾' => '周易乾',
 '味著' => '味着',
-'味著书' => '味著书',
 '味著書' => '味著书',
+'味著书' => '味著书',
 '味著作' => '味著作',
 '味著名' => '味著名',
-'味著录' => '味著录',
 '味著錄' => '味著录',
+'味著录' => '味著录',
 '味著称' => '味著称',
 '味著稱' => '味著称',
 '味著者' => '味著者',
@@ -13848,12 +13847,12 @@ $zh2Hans = array(
 '響著述' => '响著述',
 '哪吒' => '哪吒',
 '哭著' => '哭着',
-'哭著書' => '哭著书',
 '哭著书' => '哭著书',
+'哭著書' => '哭著书',
 '哭著作' => '哭著作',
 '哭著名' => '哭著名',
-'哭著錄' => '哭著录',
 '哭著录' => '哭著录',
+'哭著錄' => '哭著录',
 '哭著稱' => '哭著称',
 '哭著称' => '哭著称',
 '哭著者' => '哭著者',
@@ -13865,17 +13864,17 @@ $zh2Hans = array(
 '唱著名' => '唱著名',
 '唱著录' => '唱著录',
 '唱著錄' => '唱著录',
-'唱著称' => '唱著称',
 '唱著稱' => '唱著称',
+'唱著称' => '唱著称',
 '唱著者' => '唱著者',
 '唱著述' => '唱著述',
 '喝著' => '喝着',
-'喝著书' => '喝著书',
 '喝著書' => '喝著书',
+'喝著书' => '喝著书',
 '喝著作' => '喝著作',
 '喝著名' => '喝著名',
-'喝著录' => '喝著录',
 '喝著錄' => '喝著录',
+'喝著录' => '喝著录',
 '喝著稱' => '喝著称',
 '喝著称' => '喝著称',
 '喝著者' => '喝著者',
@@ -13884,12 +13883,12 @@ $zh2Hans = array(
 '嗅得著' => '嗅得着',
 '嗅著' => '嗅着',
 '嚷著' => '嚷着',
-'嚷著書' => '嚷著书',
 '嚷著书' => '嚷著书',
+'嚷著書' => '嚷著书',
 '嚷著作' => '嚷著作',
 '嚷著名' => '嚷著名',
-'嚷著錄' => '嚷著录',
 '嚷著录' => '嚷著录',
+'嚷著錄' => '嚷著录',
 '嚷著称' => '嚷著称',
 '嚷著稱' => '嚷著称',
 '嚷著者' => '嚷著者',
@@ -13898,19 +13897,19 @@ $zh2Hans = array(
 '因著' => '因着',
 '因著〈' => '因著〈',
 '因著《' => '因著《',
-'因著書' => '因著书',
 '因著书' => '因著书',
+'因著書' => '因著书',
 '因著作' => '因著作',
 '因著名' => '因著名',
-'因著錄' => '因著录',
 '因著录' => '因著录',
-'因著稱' => '因著称',
+'因著錄' => '因著录',
 '因著称' => '因著称',
+'因著稱' => '因著称',
 '因著者' => '因著者',
 '因著述' => '因著述',
 '困著' => '困着',
-'困著書' => '困著书',
 '困著书' => '困著书',
+'困著書' => '困著书',
 '困著作' => '困著作',
 '困著名' => '困著名',
 '困著錄' => '困著录',
@@ -13929,8 +13928,8 @@ $zh2Hans = array(
 '圍著述' => '围著述',
 '土著' => '土著',
 '在著' => '在着',
-'在著書' => '在著书',
 '在著书' => '在著书',
+'在著書' => '在著书',
 '在著作' => '在著作',
 '在著名' => '在著名',
 '在著錄' => '在著录',
@@ -13940,12 +13939,12 @@ $zh2Hans = array(
 '在著者' => '在著者',
 '在著述' => '在著述',
 '坐著' => '坐着',
-'坐著书' => '坐著书',
 '坐著書' => '坐著书',
+'坐著书' => '坐著书',
 '坐著作' => '坐著作',
 '坐著名' => '坐著名',
-'坐著录' => '坐著录',
 '坐著錄' => '坐著录',
+'坐著录' => '坐著录',
 '坐著称' => '坐著称',
 '坐著稱' => '坐著称',
 '坐著者' => '坐著者',
@@ -13961,8 +13960,8 @@ $zh2Hans = array(
 '備著述' => '备著述',
 '覆查' => '复查',
 '覆核' => '复核',
-'天道为乾' => '天道为乾',
 '天道為乾' => '天道为乾',
+'天道为乾' => '天道为乾',
 '太閤' => '太阁',
 '夾著' => '夹着',
 '夾著書' => '夹著书',
@@ -13977,8 +13976,8 @@ $zh2Hans = array(
 '字乾生' => '字乾生',
 '存摺' => '存摺',
 '孤著' => '孤着',
-'孤著书' => '孤著书',
 '孤著書' => '孤著书',
+'孤著书' => '孤著书',
 '孤著作' => '孤著作',
 '孤著名' => '孤著名',
 '孤著錄' => '孤著录',
@@ -13996,8 +13995,8 @@ $zh2Hans = array(
 '學著者' => '学著者',
 '學著述' => '学著述',
 '守著' => '守着',
-'守著書' => '守著书',
 '守著书' => '守著书',
+'守著書' => '守著书',
 '守著作' => '守著作',
 '守著名' => '守著名',
 '守著录' => '守著录',
@@ -14037,12 +14036,12 @@ $zh2Hans = array(
 '將軍抽車' => '将军抽車',
 '尼乾陀' => '尼乾陀',
 '展著' => '展着',
-'展著書' => '展著书',
 '展著书' => '展著书',
+'展著書' => '展著书',
 '展著作' => '展著作',
 '展著名' => '展著名',
-'展著錄' => '展著录',
 '展著录' => '展著录',
+'展著錄' => '展著录',
 '展著稱' => '展著称',
 '展著称' => '展著称',
 '展著者' => '展著者',
@@ -14069,50 +14068,50 @@ $zh2Hans = array(
 '乾乾脆脆' => '干干脆脆',
 '乾泉水' => '干泉水',
 '幹著' => '干着',
-'么二三' => '幺二三',
 '幺二三' => '幺二三',
-'么元' => '幺元',
+'么二三' => '幺二三',
 '幺元' => '幺元',
+'么元' => '幺元',
 '幺鳳' => '幺凤',
 '么鳳' => '幺凤',
-'么半群' => '幺半群',
 '幺半群' => '幺半群',
-'幺廝' => '幺厮',
+'么半群' => '幺半群',
 '幺厮' => '幺厮',
+'幺廝' => '幺厮',
 '幺叔' => '幺叔',
 '么叔' => '幺叔',
-'么媽' => '幺妈',
 '幺媽' => '幺妈',
+'么媽' => '幺妈',
 '么妹' => '幺妹',
 '幺妹' => '幺妹',
 '么姓' => '幺姓',
 '幺姓' => '幺姓',
-'么姨' => '幺姨',
 '幺姨' => '幺姨',
-'么娘' => '幺娘',
-'么孃' => '幺娘',
+'么姨' => '幺姨',
 '幺娘' => '幺娘',
 '幺孃' => '幺娘',
+'么孃' => '幺娘',
+'么娘' => '幺娘',
 '幺小' => '幺小',
 '么小' => '幺小',
-'幺氏' => '幺氏',
 '么氏' => '幺氏',
-'么爸' => '幺爸',
+'幺氏' => '幺氏',
 '幺爸' => '幺爸',
-'幺爹' => '幺爹',
+'么爸' => '幺爸',
 '么爹' => '幺爹',
-'么篇' => '幺篇',
+'幺爹' => '幺爹',
 '幺篇' => '幺篇',
+'么篇' => '幺篇',
 '么舅' => '幺舅',
 '幺舅' => '幺舅',
 '么蛾子' => '幺蛾子',
 '幺蛾子' => '幺蛾子',
-'么謙' => '幺谦',
 '幺謙' => '幺谦',
+'么謙' => '幺谦',
 '幺麽' => '幺麽',
 '么麼' => '幺麽',
-'幺麽小丑' => '幺麽小丑',
 '么麼小丑' => '幺麽小丑',
+'幺麽小丑' => '幺麽小丑',
 '庇護著' => '庇护着',
 '應著' => '应着',
 '應著書' => '应著书',
@@ -14124,12 +14123,12 @@ $zh2Hans = array(
 '應著述' => '应著述',
 '康乾' => '康乾',
 '康著' => '康着',
-'康著书' => '康著书',
 '康著書' => '康著书',
+'康著书' => '康著书',
 '康著作' => '康著作',
 '康著名' => '康著名',
-'康著录' => '康著录',
 '康著錄' => '康著录',
+'康著录' => '康著录',
 '康著称' => '康著称',
 '康著稱' => '康著称',
 '康著者' => '康著者',
@@ -14142,8 +14141,8 @@ $zh2Hans = array(
 '開著稱' => '开著称',
 '開著者' => '开著者',
 '開著述' => '开著述',
-'張法乾' => '张法乾',
 '张法乾' => '张法乾',
+'張法乾' => '张法乾',
 '當著' => '当着',
 '當著書' => '当著书',
 '當著作' => '当著作',
@@ -14167,8 +14166,8 @@ $zh2Hans = array(
 '待著述' => '待著述',
 '後姓' => '後姓',
 '得著' => '得着',
-'得著書' => '得著书',
 '得著书' => '得著书',
+'得著書' => '得著书',
 '得著作' => '得著作',
 '得著名' => '得著名',
 '得著錄' => '得著录',
@@ -14178,12 +14177,12 @@ $zh2Hans = array(
 '得著者' => '得著者',
 '得著述' => '得著述',
 '循著' => '循着',
-'循著书' => '循著书',
 '循著書' => '循著书',
+'循著书' => '循著书',
 '循著作' => '循著作',
 '循著名' => '循著名',
-'循著录' => '循著录',
 '循著錄' => '循著录',
+'循著录' => '循著录',
 '循著称' => '循著称',
 '循著稱' => '循著称',
 '循著者' => '循著者',
@@ -14195,13 +14194,13 @@ $zh2Hans = array(
 '心著名' => '心著名',
 '心著录' => '心著录',
 '心著錄' => '心著录',
-'心著稱' => '心著称',
 '心著称' => '心著称',
+'心著稱' => '心著称',
 '心著者' => '心著者',
 '心著述' => '心著述',
 '忍著' => '忍着',
-'忍著书' => '忍著书',
 '忍著書' => '忍著书',
+'忍著书' => '忍著书',
 '忍著作' => '忍著作',
 '忍著名' => '忍著名',
 '忍著录' => '忍著录',
@@ -14211,23 +14210,23 @@ $zh2Hans = array(
 '忍著者' => '忍著者',
 '忍著述' => '忍著述',
 '志著' => '志着',
-'志著書' => '志著书',
 '志著书' => '志著书',
+'志著書' => '志著书',
 '志著作' => '志著作',
 '志著名' => '志著名',
-'志著錄' => '志著录',
 '志著录' => '志著录',
-'志著称' => '志著称',
+'志著錄' => '志著录',
 '志著稱' => '志著称',
+'志著称' => '志著称',
 '志著者' => '志著者',
 '志著述' => '志著述',
 '忙著' => '忙着',
-'忙著书' => '忙著书',
 '忙著書' => '忙著书',
+'忙著书' => '忙著书',
 '忙著作' => '忙著作',
 '忙著名' => '忙著名',
-'忙著录' => '忙著录',
 '忙著錄' => '忙著录',
+'忙著录' => '忙著录',
 '忙著称' => '忙著称',
 '忙著稱' => '忙著称',
 '忙著者' => '忙著者',
@@ -14241,25 +14240,25 @@ $zh2Hans = array(
 '懷著者' => '怀著者',
 '懷著述' => '怀著述',
 '急著' => '急着',
-'急著书' => '急著书',
 '急著書' => '急著书',
+'急著书' => '急著书',
 '急著作' => '急著作',
 '急著名' => '急著名',
-'急著录' => '急著录',
 '急著錄' => '急著录',
+'急著录' => '急著录',
 '急著称' => '急著称',
 '急著稱' => '急著称',
 '急著者' => '急著者',
 '急著述' => '急著述',
 '性著' => '性着',
-'性著书' => '性著书',
 '性著書' => '性著书',
+'性著书' => '性著书',
 '性著作' => '性著作',
 '性著名' => '性著名',
-'性著录' => '性著录',
 '性著錄' => '性著录',
-'性著称' => '性著称',
+'性著录' => '性著录',
 '性著稱' => '性著称',
+'性著称' => '性著称',
 '性著者' => '性著者',
 '性著述' => '性著述',
 '戀著' => '恋着',
@@ -14278,8 +14277,8 @@ $zh2Hans = array(
 '悠著名' => '悠著名',
 '悠著錄' => '悠著录',
 '悠著录' => '悠著录',
-'悠著称' => '悠著称',
 '悠著稱' => '悠著称',
+'悠著称' => '悠著称',
 '悠著者' => '悠著者',
 '悠著述' => '悠著述',
 '慣著' => '惯着',
@@ -14291,14 +14290,14 @@ $zh2Hans = array(
 '慣著者' => '惯著者',
 '慣著述' => '惯著述',
 '想著' => '想着',
-'想著書' => '想著书',
 '想著书' => '想著书',
+'想著書' => '想著书',
 '想著作' => '想著作',
 '想著名' => '想著名',
-'想著錄' => '想著录',
 '想著录' => '想著录',
-'想著称' => '想著称',
+'想著錄' => '想著录',
 '想著稱' => '想著称',
+'想著称' => '想著称',
 '想著者' => '想著者',
 '想著述' => '想著述',
 '戰著' => '战着',
@@ -14310,12 +14309,12 @@ $zh2Hans = array(
 '戰著者' => '战著者',
 '戰著述' => '战著述',
 '戴著' => '戴着',
-'戴著書' => '戴著书',
 '戴著书' => '戴著书',
+'戴著書' => '戴著书',
 '戴著作' => '戴著作',
 '戴著名' => '戴著名',
-'戴著錄' => '戴著录',
 '戴著录' => '戴著录',
+'戴著錄' => '戴著录',
 '戴著稱' => '戴著称',
 '戴著称' => '戴著称',
 '戴著者' => '戴著者',
@@ -14327,17 +14326,17 @@ $zh2Hans = array(
 '扎著名' => '扎著名',
 '扎著錄' => '扎著录',
 '扎著录' => '扎著录',
-'扎著称' => '扎著称',
 '扎著稱' => '扎著称',
+'扎著称' => '扎著称',
 '扎著者' => '扎著者',
 '扎著述' => '扎著述',
 '打著' => '打着',
-'打著書' => '打著书',
 '打著书' => '打著书',
+'打著書' => '打著书',
 '打著作' => '打著作',
 '打著名' => '打著名',
-'打著錄' => '打著录',
 '打著录' => '打著录',
+'打著錄' => '打著录',
 '打著称' => '打著称',
 '打著稱' => '打著称',
 '打著者' => '打著者',
@@ -14362,8 +14361,8 @@ $zh2Hans = array(
 '抓著名' => '抓著名',
 '抓著录' => '抓著录',
 '抓著錄' => '抓著录',
-'抓著称' => '抓著称',
 '抓著稱' => '抓著称',
+'抓著称' => '抓著称',
 '抓著者' => '抓著者',
 '抓著述' => '抓著述',
 '護著' => '护着',
@@ -14379,17 +14378,17 @@ $zh2Hans = array(
 '披著書' => '披著书',
 '披著作' => '披著作',
 '披著名' => '披著名',
-'披著录' => '披著录',
 '披著錄' => '披著录',
-'披著稱' => '披著称',
+'披著录' => '披著录',
 '披著称' => '披著称',
+'披著稱' => '披著称',
 '披著者' => '披著者',
 '披著述' => '披著述',
 '抬著' => '抬着',
 '抬著作' => '抬著作',
 '抬著名' => '抬著名',
-'抬著录' => '抬著录',
 '抬著錄' => '抬著录',
+'抬著录' => '抬著录',
 '抬著稱' => '抬著称',
 '抬著称' => '抬著称',
 '抬著者' => '抬著者',
@@ -14399,8 +14398,8 @@ $zh2Hans = array(
 '抱著名' => '抱著名',
 '抱著录' => '抱著录',
 '抱著錄' => '抱著录',
-'抱著稱' => '抱著称',
 '抱著称' => '抱著称',
+'抱著稱' => '抱著称',
 '抱著者' => '抱著者',
 '抱著述' => '抱著述',
 '拉著' => '拉着',
@@ -14410,8 +14409,8 @@ $zh2Hans = array(
 '拉著名' => '拉著名',
 '拉著录' => '拉著录',
 '拉著錄' => '拉著录',
-'拉著称' => '拉著称',
 '拉著稱' => '拉著称',
+'拉著称' => '拉著称',
 '拉著者' => '拉著者',
 '拉著述' => '拉著述',
 '拉鍊' => '拉链',
@@ -14440,8 +14439,8 @@ $zh2Hans = array(
 '拼著' => '拼着',
 '拼著作' => '拼著作',
 '拼著名' => '拼著名',
-'拼著录' => '拼著录',
 '拼著錄' => '拼著录',
+'拼著录' => '拼著录',
 '拼著稱' => '拼著称',
 '拼著称' => '拼著称',
 '拼著者' => '拼著者',
@@ -14449,10 +14448,10 @@ $zh2Hans = array(
 '拿著' => '拿着',
 '拿著作' => '拿著作',
 '拿著名' => '拿著名',
-'拿著录' => '拿著录',
 '拿著錄' => '拿著录',
-'拿著称' => '拿著称',
+'拿著录' => '拿著录',
 '拿著稱' => '拿著称',
+'拿著称' => '拿著称',
 '拿著者' => '拿著者',
 '拿著述' => '拿著述',
 '持著' => '持着',
@@ -14469,8 +14468,8 @@ $zh2Hans = array(
 '挑著名' => '挑著名',
 '挑著錄' => '挑著录',
 '挑著录' => '挑著录',
-'挑著称' => '挑著称',
 '挑著稱' => '挑著称',
+'挑著称' => '挑著称',
 '挑著者' => '挑著者',
 '挑著述' => '挑著述',
 '擋著' => '挡着',
@@ -14507,10 +14506,10 @@ $zh2Hans = array(
 '捆著' => '捆着',
 '捆著作' => '捆著作',
 '捆著名' => '捆著名',
-'捆著錄' => '捆著录',
 '捆著录' => '捆著录',
-'捆著称' => '捆著称',
+'捆著錄' => '捆著录',
 '捆著稱' => '捆著称',
+'捆著称' => '捆著称',
 '捆著者' => '捆著者',
 '捆著述' => '捆著述',
 '據著' => '据着',
@@ -14524,10 +14523,10 @@ $zh2Hans = array(
 '掖著' => '掖着',
 '掖著作' => '掖著作',
 '掖著名' => '掖著名',
-'掖著錄' => '掖著录',
 '掖著录' => '掖著录',
-'掖著稱' => '掖著称',
+'掖著錄' => '掖著录',
 '掖著称' => '掖著称',
+'掖著稱' => '掖著称',
 '掖著者' => '掖著者',
 '掖著述' => '掖著述',
 '接著' => '接着',
@@ -14540,14 +14539,14 @@ $zh2Hans = array(
 '接著者' => '接著者',
 '接著述' => '接著述',
 '揉著' => '揉着',
-'揉著书' => '揉著书',
 '揉著書' => '揉著书',
+'揉著书' => '揉著书',
 '揉著作' => '揉著作',
 '揉著名' => '揉著名',
-'揉著录' => '揉著录',
 '揉著錄' => '揉著录',
-'揉著称' => '揉著称',
+'揉著录' => '揉著录',
 '揉著稱' => '揉著称',
+'揉著称' => '揉著称',
 '揉著者' => '揉著者',
 '揉著述' => '揉著述',
 '提著' => '提着',
@@ -14575,14 +14574,14 @@ $zh2Hans = array(
 '擺著述' => '摆著述',
 '撰著' => '撰著',
 '撼著' => '撼着',
-'撼著書' => '撼著书',
 '撼著书' => '撼著书',
+'撼著書' => '撼著书',
 '撼著作' => '撼著作',
 '撼著名' => '撼著名',
-'撼著錄' => '撼著录',
 '撼著录' => '撼著录',
-'撼著称' => '撼著称',
+'撼著錄' => '撼著录',
 '撼著稱' => '撼著称',
+'撼著称' => '撼著称',
 '撼著者' => '撼著者',
 '撼著述' => '撼著述',
 '敞著' => '敞着',
@@ -14590,8 +14589,8 @@ $zh2Hans = array(
 '敞著名' => '敞著名',
 '敞著錄' => '敞著录',
 '敞著录' => '敞著录',
-'敞著稱' => '敞著称',
 '敞著称' => '敞著称',
+'敞著稱' => '敞著称',
 '敞著者' => '敞著者',
 '敞著述' => '敞著述',
 '數著' => '数着',
@@ -14617,10 +14616,10 @@ $zh2Hans = array(
 '斥著书' => '斥著书',
 '斥著作' => '斥著作',
 '斥著名' => '斥著名',
-'斥著錄' => '斥著录',
 '斥著录' => '斥著录',
-'斥著稱' => '斥著称',
+'斥著錄' => '斥著录',
 '斥著称' => '斥著称',
+'斥著稱' => '斥著称',
 '斥著者' => '斥著者',
 '斥著述' => '斥著述',
 '新著' => '新著',
@@ -14639,8 +14638,8 @@ $zh2Hans = array(
 '於志賀' => '於志贺',
 '於志贺' => '於志贺',
 '於戲' => '於戏',
-'於梨華' => '於梨华',
 '於梨华' => '於梨华',
+'於梨華' => '於梨华',
 '於氏' => '於氏',
 '於潛縣' => '於潜县',
 '於潜县' => '於潜县',
@@ -14648,34 +14647,34 @@ $zh2Hans = array(
 '於菟' => '於菟',
 '於賢德' => '於贤德',
 '於除鞬' => '於除鞬',
-'旋乾转坤' => '旋乾转坤',
 '旋乾轉坤' => '旋乾转坤',
+'旋乾转坤' => '旋乾转坤',
 '曠若發矇' => '旷若发矇',
 '昂著' => '昂着',
 '昂著书' => '昂著书',
 '昂著書' => '昂著书',
 '昂著作' => '昂著作',
 '昂著名' => '昂著名',
-'昂著錄' => '昂著录',
 '昂著录' => '昂著录',
+'昂著錄' => '昂著录',
 '昂著稱' => '昂著称',
 '昂著称' => '昂著称',
 '昂著者' => '昂著者',
 '昂著述' => '昂著述',
 '易·乾' => '易·乾',
-'易經·乾' => '易经·乾',
 '易经·乾' => '易经·乾',
+'易經·乾' => '易经·乾',
 '易經乾' => '易经乾',
 '易经乾' => '易经乾',
 '映著' => '映着',
-'映著書' => '映著书',
 '映著书' => '映著书',
+'映著書' => '映著书',
 '映著作' => '映著作',
 '映著名' => '映著名',
-'映著錄' => '映著录',
 '映著录' => '映著录',
-'映著稱' => '映著称',
+'映著錄' => '映著录',
 '映著称' => '映著称',
+'映著稱' => '映著称',
 '映著者' => '映著者',
 '映著述' => '映著述',
 '昭著' => '昭著',
@@ -14684,15 +14683,15 @@ $zh2Hans = array(
 '晃著' => '晃着',
 '晃著作' => '晃著作',
 '晃著名' => '晃著名',
-'晃著錄' => '晃著录',
 '晃著录' => '晃著录',
-'晃著称' => '晃著称',
+'晃著錄' => '晃著录',
 '晃著稱' => '晃著称',
+'晃著称' => '晃著称',
 '晃著者' => '晃著者',
 '晃著述' => '晃著述',
 '暗著' => '暗着',
-'暗著书' => '暗著书',
 '暗著書' => '暗著书',
+'暗著书' => '暗著书',
 '暗著作' => '暗著作',
 '暗著名' => '暗著名',
 '暗著錄' => '暗著录',
@@ -14706,17 +14705,17 @@ $zh2Hans = array(
 '有著书' => '有著书',
 '有著作' => '有著作',
 '有著名' => '有著名',
-'有著錄' => '有著录',
 '有著录' => '有著录',
-'有著称' => '有著称',
+'有著錄' => '有著录',
 '有著稱' => '有著称',
+'有著称' => '有著称',
 '有著者' => '有著者',
 '有著述' => '有著述',
 '望著' => '望着',
 '望著作' => '望著作',
 '望著名' => '望著名',
-'望著录' => '望著录',
 '望著錄' => '望著录',
+'望著录' => '望著录',
 '望著稱' => '望著称',
 '望著称' => '望著称',
 '望著者' => '望著者',
@@ -14725,21 +14724,21 @@ $zh2Hans = array(
 '朝著' => '朝着',
 '朝著作' => '朝著作',
 '朝著名' => '朝著名',
-'朝著录' => '朝著录',
 '朝著錄' => '朝著录',
-'朝著稱' => '朝著称',
+'朝著录' => '朝著录',
 '朝著称' => '朝著称',
+'朝著稱' => '朝著称',
 '朝著者' => '朝著者',
 '朝著述' => '朝著述',
 '本著' => '本着',
-'本著书' => '本著书',
 '本著書' => '本著书',
+'本著书' => '本著书',
 '本著作' => '本著作',
 '本著名' => '本著名',
-'本著录' => '本著录',
 '本著錄' => '本著录',
-'本著稱' => '本著称',
+'本著录' => '本著录',
 '本著称' => '本著称',
+'本著稱' => '本著称',
 '本著者' => '本著者',
 '本著述' => '本著述',
 '朴於宇同' => '朴於宇同',
@@ -14760,8 +14759,8 @@ $zh2Hans = array(
 '雜著者' => '杂著者',
 '雜著述' => '杂著述',
 '李乾德' => '李乾德',
-'李乾順' => '李乾顺',
 '李乾顺' => '李乾顺',
+'李乾順' => '李乾顺',
 '李澤鉅' => '李泽钜',
 '來著' => '来着',
 '來著書' => '来著书',
@@ -14777,8 +14776,8 @@ $zh2Hans = array(
 '枕著名' => '枕著名',
 '枕著錄' => '枕著录',
 '枕著录' => '枕著录',
-'枕著稱' => '枕著称',
 '枕著称' => '枕著称',
+'枕著稱' => '枕著称',
 '枕著者' => '枕著者',
 '枕著述' => '枕著述',
 '柳詒徵' => '柳诒徵',
@@ -14850,17 +14849,17 @@ $zh2Hans = array(
 '活著名' => '活著名',
 '活著录' => '活著录',
 '活著錄' => '活著录',
-'活著稱' => '活著称',
 '活著称' => '活著称',
+'活著稱' => '活著称',
 '活著者' => '活著者',
 '活著述' => '活著述',
 '流著' => '流着',
-'流著书' => '流著书',
 '流著書' => '流著书',
+'流著书' => '流著书',
 '流著作' => '流著作',
 '流著名' => '流著名',
-'流著录' => '流著录',
 '流著錄' => '流著录',
+'流著录' => '流著录',
 '流著稱' => '流著称',
 '流著称' => '流著称',
 '流著者' => '流著者',
@@ -14873,8 +14872,8 @@ $zh2Hans = array(
 '浮著名' => '浮著名',
 '浮著录' => '浮著录',
 '浮著錄' => '浮著录',
-'浮著稱' => '浮著称',
 '浮著称' => '浮著称',
+'浮著稱' => '浮著称',
 '浮著者' => '浮著者',
 '浮著述' => '浮著述',
 '潤著' => '润着',
@@ -14890,10 +14889,10 @@ $zh2Hans = array(
 '涵著書' => '涵著书',
 '涵著作' => '涵著作',
 '涵著名' => '涵著名',
-'涵著录' => '涵著录',
 '涵著錄' => '涵著录',
-'涵著稱' => '涵著称',
+'涵著录' => '涵著录',
 '涵著称' => '涵著称',
+'涵著稱' => '涵著称',
 '涵著者' => '涵著者',
 '涵著述' => '涵著述',
 '渴著' => '渴着',
@@ -14903,8 +14902,8 @@ $zh2Hans = array(
 '渴著名' => '渴著名',
 '渴著录' => '渴著录',
 '渴著錄' => '渴著录',
-'渴著称' => '渴著称',
 '渴著稱' => '渴著称',
+'渴著称' => '渴著称',
 '渴著者' => '渴著者',
 '渴著述' => '渴著述',
 '溢著' => '溢着',
@@ -14925,8 +14924,8 @@ $zh2Hans = array(
 '演著名' => '演著名',
 '演著录' => '演著录',
 '演著錄' => '演著录',
-'演著稱' => '演著称',
 '演著称' => '演著称',
+'演著稱' => '演著称',
 '演著者' => '演著者',
 '演著述' => '演著述',
 '漫著' => '漫着',
@@ -14934,8 +14933,8 @@ $zh2Hans = array(
 '漫著书' => '漫著书',
 '漫著作' => '漫著作',
 '漫著名' => '漫著名',
-'漫著录' => '漫著录',
 '漫著錄' => '漫著录',
+'漫著录' => '漫著录',
 '漫著称' => '漫著称',
 '漫著稱' => '漫著称',
 '漫著者' => '漫著者',
@@ -14955,14 +14954,14 @@ $zh2Hans = array(
 '燒著者' => '烧著者',
 '燒著述' => '烧著述',
 '照著' => '照着',
-'照著书' => '照著书',
 '照著書' => '照著书',
+'照著书' => '照著书',
 '照著作' => '照著作',
 '照著名' => '照著名',
-'照著录' => '照著录',
 '照著錄' => '照著录',
-'照著称' => '照著称',
+'照著录' => '照著录',
 '照著稱' => '照著称',
+'照著称' => '照著称',
 '照著者' => '照著者',
 '照著述' => '照著述',
 '愛護著' => '爱护着',
@@ -14996,8 +14995,8 @@ $zh2Hans = array(
 '猜著書' => '猜着书',
 '猜著作' => '猜著作',
 '猜著名' => '猜著名',
-'猜著錄' => '猜著录',
 '猜著录' => '猜著录',
+'猜著錄' => '猜著录',
 '猜著称' => '猜著称',
 '猜著稱' => '猜著称',
 '猜著者' => '猜著者',
@@ -15009,8 +15008,8 @@ $zh2Hans = array(
 '甜著书' => '甜著书',
 '甜著作' => '甜著作',
 '甜著名' => '甜著名',
-'甜著录' => '甜著录',
 '甜著錄' => '甜著录',
+'甜著录' => '甜著录',
 '甜著稱' => '甜著称',
 '甜著称' => '甜著称',
 '甜著者' => '甜著者',
@@ -15028,12 +15027,12 @@ $zh2Hans = array(
 '用著稱' => '用著称',
 '用著者' => '用著者',
 '用著述' => '用著述',
-'男为乾' => '男为乾',
-'男爲乾' => '男为乾',
 '男為乾' => '男为乾',
+'男爲乾' => '男为乾',
+'男为乾' => '男为乾',
 '男性為乾' => '男性为乾',
-'男性爲乾' => '男性为乾',
 '男性为乾' => '男性为乾',
+'男性爲乾' => '男性为乾',
 '留著' => '留着',
 '留著書' => '留着书',
 '留著作' => '留著作',
@@ -15065,12 +15064,12 @@ $zh2Hans = array(
 '皺著者' => '皱著者',
 '皺著述' => '皱著述',
 '盛著' => '盛着',
-'盛著书' => '盛著书',
 '盛著書' => '盛著书',
+'盛著书' => '盛著书',
 '盛著作' => '盛著作',
 '盛著名' => '盛著名',
-'盛著錄' => '盛著录',
 '盛著录' => '盛著录',
+'盛著錄' => '盛著录',
 '盛著稱' => '盛著称',
 '盛著称' => '盛著称',
 '盛著者' => '盛著者',
@@ -15086,14 +15085,14 @@ $zh2Hans = array(
 '盯著者' => '盯著者',
 '盯著述' => '盯著述',
 '盾著' => '盾着',
-'盾著書' => '盾著书',
 '盾著书' => '盾著书',
+'盾著書' => '盾著书',
 '盾著作' => '盾著作',
 '盾著名' => '盾著名',
-'盾著錄' => '盾著录',
 '盾著录' => '盾著录',
-'盾著稱' => '盾著称',
+'盾著錄' => '盾著录',
 '盾著称' => '盾著称',
+'盾著稱' => '盾著称',
 '盾著者' => '盾著者',
 '盾著述' => '盾著述',
 '看不著' => '看不着',
@@ -15104,8 +15103,8 @@ $zh2Hans = array(
 '看著名' => '看著名',
 '看著录' => '看著录',
 '看著錄' => '看著录',
-'看著稱' => '看著称',
 '看著称' => '看著称',
+'看著稱' => '看著称',
 '看著者' => '看著者',
 '看著述' => '看著述',
 '著業' => '着业',
@@ -15213,14 +15212,14 @@ $zh2Hans = array(
 '睡不著' => '睡不着',
 '睡得著' => '睡得着',
 '睡著' => '睡着',
-'睡著書' => '睡著书',
 '睡著书' => '睡著书',
+'睡著書' => '睡著书',
 '睡著作' => '睡著作',
 '睡著名' => '睡著名',
-'睡著錄' => '睡著录',
 '睡著录' => '睡著录',
-'睡著称' => '睡著称',
+'睡著錄' => '睡著录',
 '睡著稱' => '睡著称',
+'睡著称' => '睡著称',
 '睡著者' => '睡著者',
 '睡著述' => '睡著述',
 '睹微知著' => '睹微知著',
@@ -15248,8 +15247,8 @@ $zh2Hans = array(
 '瞪著书' => '瞪著书',
 '瞪著作' => '瞪著作',
 '瞪著名' => '瞪著名',
-'瞪著錄' => '瞪著录',
 '瞪著录' => '瞪著录',
+'瞪著錄' => '瞪著录',
 '瞪著称' => '瞪著称',
 '瞪著稱' => '瞪著称',
 '瞪著者' => '瞪著者',
@@ -15262,10 +15261,10 @@ $zh2Hans = array(
 '福著書' => '福著书',
 '福著作' => '福著作',
 '福著名' => '福著名',
-'福著錄' => '福著录',
 '福著录' => '福著录',
-'福著稱' => '福著称',
+'福著錄' => '福著录',
 '福著称' => '福著称',
+'福著稱' => '福著称',
 '福著者' => '福著者',
 '福著述' => '福著述',
 '穀梁' => '穀梁',
@@ -15276,17 +15275,17 @@ $zh2Hans = array(
 '空著名' => '空著名',
 '空著录' => '空著录',
 '空著錄' => '空著录',
-'空著称' => '空著称',
 '空著稱' => '空著称',
+'空著称' => '空著称',
 '空著者' => '空著者',
 '空著述' => '空著述',
 '穿著' => '穿着',
-'穿著书' => '穿著书',
 '穿著書' => '穿著书',
+'穿著书' => '穿著书',
 '穿著作' => '穿著作',
 '穿著名' => '穿著名',
-'穿著录' => '穿著录',
 '穿著錄' => '穿著录',
+'穿著录' => '穿著录',
 '穿著称' => '穿著称',
 '穿著稱' => '穿著称',
 '穿著者' => '穿著者',
@@ -15300,14 +15299,14 @@ $zh2Hans = array(
 '豎著者' => '竖著者',
 '豎著述' => '竖著述',
 '站著' => '站着',
-'站著书' => '站著书',
 '站著書' => '站著书',
+'站著书' => '站著书',
 '站著作' => '站著作',
 '站著名' => '站著名',
-'站著錄' => '站著录',
 '站著录' => '站著录',
-'站著称' => '站著称',
+'站著錄' => '站著录',
 '站著稱' => '站著称',
+'站著称' => '站著称',
 '站著者' => '站著者',
 '站著述' => '站著述',
 '笑著' => '笑着',
@@ -15317,8 +15316,8 @@ $zh2Hans = array(
 '笑著名' => '笑著名',
 '笑著录' => '笑著录',
 '笑著錄' => '笑著录',
-'笑著称' => '笑著称',
 '笑著稱' => '笑著称',
+'笑著称' => '笑著称',
 '笑著者' => '笑著者',
 '笑著述' => '笑著述',
 '答覆' => '答复',
@@ -15329,8 +15328,8 @@ $zh2Hans = array(
 '管著名' => '管著名',
 '管著录' => '管著录',
 '管著錄' => '管著录',
-'管著稱' => '管著称',
 '管著称' => '管著称',
+'管著稱' => '管著称',
 '管著者' => '管著者',
 '管著述' => '管著述',
 '米澤瑠美' => '米泽瑠美',
@@ -15363,34 +15362,34 @@ $zh2Hans = array(
 '纏著者' => '缠著者',
 '纏著述' => '缠著述',
 '罩著' => '罩着',
-'罩著书' => '罩著书',
 '罩著書' => '罩著书',
+'罩著书' => '罩著书',
 '罩著作' => '罩著作',
 '罩著名' => '罩著名',
-'罩著錄' => '罩著录',
 '罩著录' => '罩著录',
-'罩著称' => '罩著称',
+'罩著錄' => '罩著录',
 '罩著稱' => '罩著称',
+'罩著称' => '罩著称',
 '罩著者' => '罩著者',
 '罩著述' => '罩著述',
 '美著' => '美着',
-'美著书' => '美著书',
 '美著書' => '美著书',
+'美著书' => '美著书',
 '美著作' => '美著作',
 '美著名' => '美著名',
-'美著录' => '美著录',
 '美著錄' => '美著录',
+'美著录' => '美著录',
 '美著稱' => '美著称',
 '美著称' => '美著称',
 '美著者' => '美著者',
 '美著述' => '美著述',
 '耀著' => '耀着',
-'耀著書' => '耀著书',
 '耀著书' => '耀著书',
+'耀著書' => '耀著书',
 '耀著作' => '耀著作',
 '耀著名' => '耀著名',
-'耀著錄' => '耀著录',
 '耀著录' => '耀著录',
+'耀著錄' => '耀著录',
 '耀著称' => '耀著称',
 '耀著稱' => '耀著称',
 '耀著者' => '耀著者',
@@ -15416,8 +15415,8 @@ $zh2Hans = array(
 '背著名' => '背著名',
 '背著录' => '背著录',
 '背著錄' => '背著录',
-'背著称' => '背著称',
 '背著稱' => '背著称',
+'背著称' => '背著称',
 '背著者' => '背著者',
 '背著述' => '背著述',
 '膠著' => '胶着',
@@ -15437,18 +15436,18 @@ $zh2Hans = array(
 '藝著者' => '艺著者',
 '藝著述' => '艺著述',
 '苦著' => '苦着',
-'苦著书' => '苦著书',
 '苦著書' => '苦著书',
+'苦著书' => '苦著书',
 '苦著作' => '苦著作',
 '苦著名' => '苦著名',
-'苦著录' => '苦著录',
 '苦著錄' => '苦著录',
-'苦著稱' => '苦著称',
+'苦著录' => '苦著录',
 '苦著称' => '苦著称',
+'苦著稱' => '苦著称',
 '苦著者' => '苦著者',
 '苦著述' => '苦著述',
-'苧烯' => '苧烯',
 '薴烯' => '苧烯',
+'苧烯' => '苧烯',
 '獲著' => '获着',
 '獲著書' => '获著书',
 '獲著作' => '获著作',
@@ -15466,8 +15465,8 @@ $zh2Hans = array(
 '落著名' => '落著名',
 '落著录' => '落著录',
 '落著錄' => '落著录',
-'落著稱' => '落著称',
 '落著称' => '落著称',
+'落著稱' => '落著称',
 '落著者' => '落著者',
 '落著述' => '落著述',
 '著書' => '著书',
@@ -15484,14 +15483,14 @@ $zh2Hans = array(
 '蒙汗葯' => '蒙汗药',
 '蒙著' => '蒙着',
 '蒙葯' => '蒙药',
-'蒙著書' => '蒙著书',
 '蒙著书' => '蒙著书',
+'蒙著書' => '蒙著书',
 '蒙著作' => '蒙著作',
 '蒙著名' => '蒙著名',
 '蒙著录' => '蒙著录',
 '蒙著錄' => '蒙著录',
-'蒙著稱' => '蒙著称',
 '蒙著称' => '蒙著称',
+'蒙著稱' => '蒙著称',
 '蒙著者' => '蒙著者',
 '蒙著述' => '蒙著述',
 '藏著' => '藏着',
@@ -15501,19 +15500,19 @@ $zh2Hans = array(
 '藏著名' => '藏著名',
 '藏著錄' => '藏著录',
 '藏著录' => '藏著录',
-'藏著称' => '藏著称',
 '藏著稱' => '藏著称',
+'藏著称' => '藏著称',
 '藏著者' => '藏著者',
 '藏著述' => '藏著述',
 '蘸著' => '蘸着',
-'蘸著書' => '蘸著书',
 '蘸著书' => '蘸著书',
+'蘸著書' => '蘸著书',
 '蘸著作' => '蘸著作',
 '蘸著名' => '蘸著名',
 '蘸著录' => '蘸著录',
 '蘸著錄' => '蘸著录',
-'蘸著稱' => '蘸著称',
 '蘸著称' => '蘸著称',
+'蘸著稱' => '蘸著称',
 '蘸著者' => '蘸著者',
 '蘸著述' => '蘸著述',
 '行著' => '行着',
@@ -15521,19 +15520,19 @@ $zh2Hans = array(
 '行著書' => '行著书',
 '行著作' => '行著作',
 '行著名' => '行著名',
-'行著录' => '行著录',
 '行著錄' => '行著录',
-'行著稱' => '行著称',
+'行著录' => '行著录',
 '行著称' => '行著称',
+'行著稱' => '行著称',
 '行著者' => '行著者',
 '行著述' => '行著述',
 '衣著' => '衣着',
-'衣著书' => '衣著书',
 '衣著書' => '衣著书',
+'衣著书' => '衣著书',
 '衣著作' => '衣著作',
 '衣著名' => '衣著名',
-'衣著录' => '衣著录',
 '衣著錄' => '衣著录',
+'衣著录' => '衣著录',
 '衣著稱' => '衣著称',
 '衣著称' => '衣著称',
 '衣著者' => '衣著者',
@@ -15547,14 +15546,14 @@ $zh2Hans = array(
 '裝著者' => '装著者',
 '裝著述' => '装著述',
 '裹著' => '裹着',
-'裹著書' => '裹著书',
 '裹著书' => '裹著书',
+'裹著書' => '裹著书',
 '裹著作' => '裹著作',
 '裹著名' => '裹著名',
 '裹著录' => '裹著录',
 '裹著錄' => '裹著录',
-'裹著称' => '裹著称',
 '裹著稱' => '裹著称',
+'裹著称' => '裹著称',
 '裹著者' => '裹著者',
 '裹著述' => '裹著述',
 '覆蓋' => '覆蓋',
@@ -15603,8 +15602,8 @@ $zh2Hans = array(
 '豫著名' => '豫著名',
 '豫著录' => '豫著录',
 '豫著錄' => '豫著录',
-'豫著称' => '豫著称',
 '豫著稱' => '豫著称',
+'豫著称' => '豫著称',
 '豫著者' => '豫著者',
 '豫著述' => '豫著述',
 '貞著' => '贞着',
@@ -15616,14 +15615,14 @@ $zh2Hans = array(
 '貞著者' => '贞著者',
 '貞著述' => '贞著述',
 '走著' => '走着',
-'走著書' => '走著书',
 '走著书' => '走著书',
+'走著書' => '走著书',
 '走著作' => '走著作',
 '走著名' => '走著名',
-'走著錄' => '走著录',
 '走著录' => '走著录',
-'走著稱' => '走著称',
+'走著錄' => '走著录',
 '走著称' => '走著称',
+'走著稱' => '走著称',
 '走著者' => '走著者',
 '走著述' => '走著述',
 '趕著' => '赶着',
@@ -15639,8 +15638,8 @@ $zh2Hans = array(
 '趴著书' => '趴著书',
 '趴著作' => '趴著作',
 '趴著名' => '趴著名',
-'趴著录' => '趴著录',
 '趴著錄' => '趴著录',
+'趴著录' => '趴著录',
 '趴著称' => '趴著称',
 '趴著稱' => '趴著称',
 '趴著者' => '趴著者',
@@ -15658,8 +15657,8 @@ $zh2Hans = array(
 '跑著书' => '跑著书',
 '跑著作' => '跑著作',
 '跑著名' => '跑著名',
-'跑著录' => '跑著录',
 '跑著錄' => '跑著录',
+'跑著录' => '跑著录',
 '跑著稱' => '跑著称',
 '跑著称' => '跑著称',
 '跑著者' => '跑著者',
@@ -15671,28 +15670,28 @@ $zh2Hans = array(
 '跟著名' => '跟著名',
 '跟著录' => '跟著录',
 '跟著錄' => '跟著录',
-'跟著称' => '跟著称',
 '跟著稱' => '跟著称',
+'跟著称' => '跟著称',
 '跟著者' => '跟著者',
 '跟著述' => '跟著述',
 '跪著' => '跪着',
-'跪著書' => '跪著书',
 '跪著书' => '跪著书',
+'跪著書' => '跪著书',
 '跪著作' => '跪著作',
 '跪著名' => '跪著名',
-'跪著錄' => '跪著录',
 '跪著录' => '跪著录',
+'跪著錄' => '跪著录',
 '跪著稱' => '跪著称',
 '跪著称' => '跪著称',
 '跪著者' => '跪著者',
 '跪著述' => '跪著述',
 '跳著' => '跳着',
-'跳著书' => '跳著书',
 '跳著書' => '跳著书',
+'跳著书' => '跳著书',
 '跳著作' => '跳著作',
 '跳著名' => '跳著名',
-'跳著录' => '跳著录',
 '跳著錄' => '跳著录',
+'跳著录' => '跳著录',
 '跳著称' => '跳著称',
 '跳著稱' => '跳著称',
 '跳著者' => '跳著者',
@@ -15705,13 +15704,13 @@ $zh2Hans = array(
 '踏著名' => '踏著名',
 '踏著錄' => '踏著录',
 '踏著录' => '踏著录',
-'踏著称' => '踏著称',
 '踏著稱' => '踏著称',
+'踏著称' => '踏著称',
 '踏著者' => '踏著者',
 '踏著述' => '踏著述',
 '踩著' => '踩着',
-'踩著书' => '踩著书',
 '踩著書' => '踩著书',
+'踩著书' => '踩著书',
 '踩著作' => '踩著作',
 '踩著名' => '踩著名',
 '踩著录' => '踩著录',
@@ -15721,12 +15720,12 @@ $zh2Hans = array(
 '踩著者' => '踩著者',
 '踩著述' => '踩著述',
 '身著' => '身着',
-'身著书' => '身著书',
 '身著書' => '身著书',
+'身著书' => '身著书',
 '身著作' => '身著作',
 '身著名' => '身著名',
-'身著录' => '身著录',
 '身著錄' => '身著录',
+'身著录' => '身著录',
 '身著稱' => '身著称',
 '身著称' => '身著称',
 '身著者' => '身著者',
@@ -15738,8 +15737,8 @@ $zh2Hans = array(
 '躺著名' => '躺著名',
 '躺著錄' => '躺著录',
 '躺著录' => '躺著录',
-'躺著称' => '躺著称',
 '躺著稱' => '躺著称',
+'躺著称' => '躺著称',
 '躺著者' => '躺著者',
 '躺著述' => '躺著述',
 '轉著' => '转着',
@@ -15788,34 +15787,34 @@ $zh2Hans = array(
 '連著述' => '连著述',
 '迫著' => '迫着',
 '追著' => '追着',
-'追著書' => '追著书',
 '追著书' => '追著书',
+'追著書' => '追著书',
 '追著作' => '追著作',
 '追著名' => '追著名',
-'追著錄' => '追著录',
 '追著录' => '追著录',
+'追著錄' => '追著录',
 '追著称' => '追著称',
 '追著稱' => '追著称',
 '追著者' => '追著者',
 '追著述' => '追著述',
 '逆著' => '逆着',
-'逆著書' => '逆著书',
 '逆著书' => '逆著书',
+'逆著書' => '逆著书',
 '逆著作' => '逆著作',
 '逆著名' => '逆著名',
-'逆著錄' => '逆著录',
 '逆著录' => '逆著录',
-'逆著称' => '逆著称',
+'逆著錄' => '逆著录',
 '逆著稱' => '逆著称',
+'逆著称' => '逆著称',
 '逆著者' => '逆著者',
 '逆著述' => '逆著述',
 '逼著' => '逼着',
-'逼著書' => '逼著书',
 '逼著书' => '逼著书',
+'逼著書' => '逼著书',
 '逼著作' => '逼著作',
 '逼著名' => '逼著名',
-'逼著錄' => '逼著录',
 '逼著录' => '逼著录',
+'逼著錄' => '逼著录',
 '逼著称' => '逼著称',
 '逼著稱' => '逼著称',
 '逼著者' => '逼著者',
@@ -15841,8 +15840,8 @@ $zh2Hans = array(
 '配著名' => '配著名',
 '配著錄' => '配著录',
 '配著录' => '配著录',
-'配著稱' => '配著称',
 '配著称' => '配著称',
+'配著稱' => '配著称',
 '配著者' => '配著者',
 '配著述' => '配著述',
 '釀著' => '酿着',
@@ -15853,14 +15852,14 @@ $zh2Hans = array(
 '釀著稱' => '酿著称',
 '釀著者' => '酿著者',
 '釀著述' => '酿著述',
-'醯壺' => '醯壶',
 '醯壶' => '醯壶',
+'醯壺' => '醯壶',
 '醯醬' => '醯酱',
 '醯酱' => '醯酱',
 '醯醋' => '醯醋',
 '醯醢' => '醯醢',
-'醯鸡' => '醯鸡',
 '醯雞' => '醯鸡',
+'醯鸡' => '醯鸡',
 '重覆' => '重复',
 '金鍊' => '金链',
 '鐵鍊' => '铁链',
@@ -15902,8 +15901,8 @@ $zh2Hans = array(
 '聞得著' => '闻得着',
 '聞著' => '闻着',
 '阳为乾' => '阳为乾',
-'陽爲乾' => '阳为乾',
 '陽為乾' => '阳为乾',
+'陽爲乾' => '阳为乾',
 '阿部正瞭' => '阿部正瞭',
 '附著' => '附着',
 '附睪' => '附睾',
@@ -15911,36 +15910,36 @@ $zh2Hans = array(
 '附著書' => '附著书',
 '附著作' => '附著作',
 '附著名' => '附著名',
-'附著錄' => '附著录',
 '附著录' => '附著录',
+'附著錄' => '附著录',
 '附著称' => '附著称',
 '附著稱' => '附著称',
 '附著者' => '附著者',
 '附著述' => '附著述',
-'陈乾生' => '陈乾生',
 '陳乾生' => '陈乾生',
-'陈公乾生' => '陈公乾生',
+'陈乾生' => '陈乾生',
 '陳公乾生' => '陈公乾生',
+'陈公乾生' => '陈公乾生',
 '陋著' => '陋着',
-'陋著書' => '陋著书',
 '陋著书' => '陋著书',
+'陋著書' => '陋著书',
 '陋著作' => '陋著作',
 '陋著名' => '陋著名',
-'陋著錄' => '陋著录',
 '陋著录' => '陋著录',
-'陋著称' => '陋著称',
+'陋著錄' => '陋著录',
 '陋著稱' => '陋著称',
+'陋著称' => '陋著称',
 '陋著者' => '陋著者',
 '陋著述' => '陋著述',
 '陪著' => '陪着',
-'陪著书' => '陪著书',
 '陪著書' => '陪著书',
+'陪著书' => '陪著书',
 '陪著作' => '陪著作',
 '陪著名' => '陪著名',
-'陪著录' => '陪著录',
 '陪著錄' => '陪著录',
-'陪著称' => '陪著称',
+'陪著录' => '陪著录',
 '陪著稱' => '陪著称',
+'陪著称' => '陪著称',
 '陪著者' => '陪著者',
 '陪著述' => '陪著述',
 '陳堵' => '陳堵',
@@ -15954,26 +15953,26 @@ $zh2Hans = array(
 '隨著者' => '随著者',
 '隨著述' => '随著述',
 '隔著' => '隔着',
-'隔著书' => '隔著书',
 '隔著書' => '隔著书',
+'隔著书' => '隔著书',
 '隔著作' => '隔著作',
 '隔著名' => '隔著名',
-'隔著录' => '隔著录',
 '隔著錄' => '隔著录',
+'隔著录' => '隔著录',
 '隔著称' => '隔著称',
 '隔著稱' => '隔著称',
 '隔著者' => '隔著者',
 '隔著述' => '隔著述',
 '隱睪' => '隱睾',
 '雅著' => '雅着',
-'雅著书' => '雅著书',
 '雅著書' => '雅著书',
+'雅著书' => '雅著书',
 '雅著作' => '雅著作',
 '雅著名' => '雅著名',
-'雅著录' => '雅著录',
 '雅著錄' => '雅著录',
-'雅著称' => '雅著称',
+'雅著录' => '雅著录',
 '雅著稱' => '雅著称',
+'雅著称' => '雅著称',
 '雅著者' => '雅著者',
 '雅著述' => '雅著述',
 '雍乾' => '雍乾',
@@ -15982,8 +15981,8 @@ $zh2Hans = array(
 '靠著名' => '靠著名',
 '靠著錄' => '靠著录',
 '靠著录' => '靠著录',
-'靠著稱' => '靠著称',
 '靠著称' => '靠著称',
+'靠著稱' => '靠著称',
 '靠著者' => '靠著者',
 '靠著述' => '靠著述',
 '頂著' => '顶着',
@@ -16064,8 +16063,8 @@ $zh2Hans = array(
 '高著者' => '高著者',
 '高著述' => '高著述',
 '髭著' => '髭着',
-'髭著书' => '髭著书',
 '髭著書' => '髭著书',
+'髭著书' => '髭著书',
 '髭著作' => '髭著作',
 '髭著名' => '髭著名',
 '髭著錄' => '髭著录',
@@ -16079,17 +16078,17 @@ $zh2Hans = array(
 '魏徵' => '魏徵',
 '魚乾乾' => '鱼干干',
 '麯崇裕' => '麯崇裕',
-'麴義' => '麴义',
 '麴义' => '麴义',
+'麴義' => '麴义',
 '麴英' => '麴英',
 '麽氏' => '麽氏',
-'麽麽' => '麽麽',
 '麼麼' => '麽麽',
+'麽麽' => '麽麽',
 '黄润乾' => '黄润乾',
 '黃潤乾' => '黄润乾',
 '黏著' => '黏着',
-'黏著书' => '黏著书',
 '黏著書' => '黏著书',
+'黏著书' => '黏著书',
 '黏著作' => '黏著作',
 '黏著名' => '黏著名',
 '黏著录' => '黏著录',
@@ -16105,23 +16104,23 @@ $zh2TW = array(
 '”' => '」',
 '‘' => '『',
 '’' => '』',
-'三極管' => '三極體',
 '三极管' => '三極體',
+'三極管' => '三極體',
 '世界裏' => '世界裡',
 '中文裏' => '中文裡',
 '串行' => '串列',
 '串列加速器' => '串列加速器',
 '以太网' => '乙太網',
 '奶酪' => '乳酪',
-'二極管' => '二極體',
 '二极管' => '二極體',
+'二極管' => '二極體',
 '交互式' => '互動式',
 '阿塞拜疆' => '亞塞拜然',
 '人工智能' => '人工智慧',
 '接口' => '介面',
 '服务器' => '伺服器',
-'字節' => '位元組',
 '字节' => '位元組',
+'字節' => '位元組',
 '作品裏' => '作品裡',
 '信道' => '信道',
 '优先级' => '優先順序',
@@ -16136,20 +16135,20 @@ $zh2TW = array(
 '冬日裏' => '冬日裡',
 '凉菜' => '冷盤',
 '冷菜' => '冷盤',
-'凶器' => '凶器',
 '兇器' => '凶器',
-'å\87¶å¾\92' => 'å\87¶å¾\92',
+'å\87¶å\99¨' => 'å\87¶å\99¨',
 '兇徒' => '凶徒',
+'凶徒' => '凶徒',
 '兇手' => '凶手',
 '凶手' => '凶手',
-'兇案' => '凶案',
 '凶案' => '凶案',
-'å\87¶æ®\98' => 'å\87¶æ®\98',
+'å\85\87æ¡\88' => 'å\87¶æ¡\88',
 '兇殘' => '凶殘',
+'凶殘' => '凶殘',
 '凶残' => '凶殘',
 '兇殺' => '凶殺',
-'凶杀' => '凶殺',
 '凶殺' => '凶殺',
+'凶杀' => '凶殺',
 '打印' => '列印',
 '列支敦士登' => '列支敦斯登',
 '剪彩' => '剪綵',
@@ -16159,10 +16158,10 @@ $zh2TW = array(
 '特立尼達和多巴哥' => '千里達托貝哥',
 '特立尼达和托巴哥' => '千里達托貝哥',
 '半角' => '半形',
-'卡塔爾' => '卡達',
 '卡塔尔' => '卡達',
-'打印機' => '印表機',
+'卡塔爾' => '卡達',
 '打印机' => '印表機',
+'打印機' => '印表機',
 '厄立特里亚' => '厄利垂亞',
 '厄立特里亞' => '厄利垂亞',
 '厄瓜多尔' => '厄瓜多',
@@ -16177,17 +16176,17 @@ $zh2TW = array(
 '哈萨克斯坦' => '哈薩克',
 '哥斯達黎加' => '哥斯大黎加',
 '哥斯达黎加' => '哥斯大黎加',
-'格魯吉亞' => '喬治亞',
 '格鲁吉亚' => '喬治亞',
-'佐治亚' => '喬治亞',
+'格魯吉亞' => '喬治亞',
 '佐治亞' => '喬治亞',
+'佐治亚' => '喬治亞',
 '嘴裏' => '嘴裡',
 '土库曼斯坦' => '土庫曼',
 '薯仔' => '土豆',
 '土豆網' => '土豆網',
 '土豆网' => '土豆網',
-'坦桑尼亚' => '坦尚尼亞',
 '坦桑尼亞' => '坦尚尼亞',
+'坦桑尼亚' => '坦尚尼亞',
 '端口' => '埠',
 '塔吉克斯坦' => '塔吉克',
 '塞舌尔' => '塞席爾',
@@ -16202,63 +16201,63 @@ $zh2TW = array(
 '多明尼加國' => '多米尼克',
 '穿梭機' => '太空梭',
 '航天飞机' => '太空梭',
-'尼日利亚' => '奈及利亞',
 '尼日利亞' => '奈及利亞',
+'尼日利亚' => '奈及利亞',
 '字符' => '字元',
 '字号' => '字型大小',
 '字库' => '字型檔',
 '字符集' => '字符集',
 '存盘' => '存檔',
 '學裏' => '學裡',
-'安提瓜和巴布達' => '安地卡及巴布達',
 '安提瓜和巴布达' => '安地卡及巴布達',
+'安提瓜和巴布達' => '安地卡及巴布達',
 '宋元' => '宋元',
 '洪都拉斯' => '宏都拉斯',
 '寻址' => '定址',
 '寒假裏' => '寒假裡',
 '宽带' => '寬頻',
-'老撾' => '寮國',
 '老挝' => '寮國',
+'老撾' => '寮國',
 '打门' => '射門',
 '專輯裏' => '專輯裡',
-'贊比亞' => '尚比亞',
 '赞比亚' => '尚比亞',
-'尼日爾' => '尼日',
+'贊比亞' => '尚比亞',
 '尼日尔' => '尼日',
+'尼日爾' => '尼日',
 '山洞裏' => '山洞裡',
 '巴布亞新畿內亞' => '巴布亞紐幾內亞',
 '巴布亚新几内亚' => '巴布亞紐幾內亞',
 '巴巴多斯' => '巴貝多',
 '布基纳法索' => '布吉納法索',
 '布基納法索' => '布吉納法索',
-'布什' => '布希',
 '布殊' => '布希',
+'布什' => '布希',
 '帕劳' => '帛琉',
 '例程' => '常式',
-'平治之乱' => '平治之亂',
 '平治之亂' => '平治之亂',
+'平治之乱' => '平治之亂',
 '年代裏' => '年代裡',
-'几内亚比绍' => '幾內亞比索',
 '幾內亞比紹' => '幾內亞比索',
+'几内亚比绍' => '幾內亞比索',
 '彩带' => '彩帶',
 '彩排' => '彩排',
 '彩楼' => '彩樓',
 '彩牌楼' => '彩牌樓',
-'復蘇' => '復甦',
 '复苏' => '復甦',
+'復蘇' => '復甦',
 '心裏' => '心裡',
-'快闪存储器' => '快閃記憶體',
 '闪存' => '快閃記憶體',
+'快闪存储器' => '快閃記憶體',
 '想象' => '想像',
 '传感' => '感測',
 '习用' => '慣用',
 '戏彩娱亲' => '戲綵娛親',
 '戲裏' => '戲裡',
-'手电筒' => '手電筒',
 '手电' => '手電筒',
+'手电筒' => '手電筒',
 '括号' => '括弧',
-'拿破侖' => '拿破崙',
 '拿破仑' => '拿破崙',
+'拿破侖' => '拿破崙',
 '積架' => '捷豹',
 '扫瞄仪' => '掃瞄器',
 '挂钩' => '掛鉤',
@@ -16268,12 +16267,12 @@ $zh2TW = array(
 '桌球' => '撞球',
 '便携式' => '攜帶型',
 '故事裏' => '故事裡',
-'调制解调器' => '數據機',
 '調制解調器' => '數據機',
-'斯洛文尼亞' => '斯洛維尼亞',
+'调制解调器' => '數據機',
 '斯洛文尼亚' => '斯洛維尼亞',
-'æ\96°çºªå\85\83' => 'æ\96°ç´\80å\85\83',
+'æ\96¯æ´\9bæ\96\87å°¼äº\9e' => 'æ\96¯æ´\9b維尼äº\9e',
 '新紀元' => '新紀元',
+'新纪元' => '新紀元',
 '日子裏' => '日子裡',
 '春假裏' => '春假裡',
 '春天裏' => '春天裡',
@@ -16285,13 +16284,13 @@ $zh2TW = array(
 '乍得' => '查德',
 '克林頓' => '柯林頓',
 '克林顿' => '柯林頓',
-'格林納達' => '格瑞那達',
 '格林纳达' => '格瑞那達',
+'格林納達' => '格瑞那達',
 '凡高' => '梵谷',
 '森林裏' => '森林裡',
 '棺材裏' => '棺材裡',
-'榴蓮' => '榴槤',
 '榴莲' => '榴槤',
+'榴蓮' => '榴槤',
 '仿真' => '模擬',
 '毛里裘斯' => '模里西斯',
 '毛里求斯' => '模里西斯',
@@ -16302,15 +16301,15 @@ $zh2TW = array(
 '元音' => '母音',
 '永历' => '永曆',
 '文莱' => '汶萊',
-'沙特阿拉伯' => '沙烏地阿拉伯',
 '沙地阿拉伯' => '沙烏地阿拉伯',
-'æ³¢æ\96¯å°¼äº\9eé»\91å¡\9eå\93¥ç¶­é\82£' => '波士尼äº\9e赫å¡\9eå\93¥ç¶­ç´\8d',
+'æ²\99ç\89¹é\98¿æ\8b\89伯' => 'æ²\99ç\83\8få\9c°é\98¿æ\8b\89伯',
 '波斯尼亚和黑塞哥维那' => '波士尼亞赫塞哥維納',
-'博茨瓦纳' => '波札那',
+'波斯尼亞黑塞哥維那' => '波士尼亞赫塞哥維納',
 '博茨瓦納' => '波札那',
+'博茨瓦纳' => '波札那',
 '流程控制' => '流程控制',
-'侯赛因' => '海珊',
 '侯賽因' => '海珊',
+'侯赛因' => '海珊',
 '深淵裏' => '深淵裡',
 '光标' => '游標',
 '鼠标' => '滑鼠',
@@ -16319,18 +16318,18 @@ $zh2TW = array(
 '词组' => '片語',
 '獄裏' => '獄裡',
 '塞拉利昂' => '獅子山',
-'危地马拉' => '瓜地馬拉',
 '危地馬拉' => '瓜地馬拉',
+'危地马拉' => '瓜地馬拉',
 '冈比亚' => '甘比亞',
 '岡比亞' => '甘比亞',
 '疑兇' => '疑凶',
 '疑凶' => '疑凶',
 '百科裏' => '百科裡',
 '皮裏陽秋' => '皮裡陽秋',
-'盧旺達' => '盧安達',
 '卢旺达' => '盧安達',
-'ç\9c\9få\87¶' => 'ç\9c\9få\87',
+'ç\9b§æ\97ºé\81\94' => 'ç\9b§å®\89é\81\94',
 '真兇' => '真凶',
+'真凶' => '真凶',
 '眼睛裏' => '眼睛裡',
 '硅片' => '矽片',
 '硅谷' => '矽谷',
@@ -16348,43 +16347,43 @@ $zh2TW = array(
 '蹦极跳' => '笨豬跳',
 '绑紧跳' => '笨豬跳',
 '等于' => '等於',
-'短訊' => '簡訊',
 '短信' => '簡訊',
+'短訊' => '簡訊',
 '系列裏' => '系列裡',
 '新西蘭' => '紐西蘭',
 '新西兰' => '紐西蘭',
-'所罗门群岛' => '索羅門群島',
 '所羅門群島' => '索羅門群島',
-'索馬里' => '索馬利亞',
+'所罗门群岛' => '索羅門群島',
 '索马里' => '索馬利亞',
+'索馬里' => '索馬利亞',
 '结彩' => '結綵',
 '佛得角' => '維德角',
 '網絡' => '網路',
 '网络' => '網路',
-'互聯網' => '網際網路',
 '因特网' => '網際網路',
+'互聯網' => '網際網路',
 '彩球' => '綵球',
 '彩绸' => '綵綢',
 '彩线' => '綵線',
 '彩船' => '綵船',
 '彩衣' => '綵衣',
 '綫' => '線',
-'缉凶' => '緝凶',
 '緝兇' => '緝凶',
+'缉凶' => '緝凶',
 '緝凶' => '緝凶',
 '意大利' => '義大利',
 '老字号' => '老字號',
 '圣基茨和尼维斯' => '聖克里斯多福及尼維斯',
 '聖吉斯納域斯' => '聖克里斯多福及尼維斯',
-'聖文森特和格林納丁斯' => '聖文森及格瑞那丁',
 '圣文森特和格林纳丁斯' => '聖文森及格瑞那丁',
+'聖文森特和格林納丁斯' => '聖文森及格瑞那丁',
 '圣卢西亚' => '聖露西亞',
 '聖盧西亞' => '聖露西亞',
 '圣马力诺' => '聖馬利諾',
 '聖馬力諾' => '聖馬利諾',
 '肚裏' => '肚裡',
-'肯尼亚' => '肯亞',
 '肯雅' => '肯亞',
+'肯尼亚' => '肯亞',
 '航天大学' => '航天大學',
 '苦裏' => '苦裡',
 '毛里塔尼亚' => '茅利塔尼亞',
@@ -16393,8 +16392,8 @@ $zh2TW = array(
 '万历' => '萬曆',
 '瓦努阿图' => '萬那杜',
 '瓦努阿圖' => '萬那杜',
-'也门' => '葉門',
 '也門' => '葉門',
+'也门' => '葉門',
 '着' => '著',
 '科摩羅' => '葛摩',
 '科摩罗' => '葛摩',
@@ -16403,19 +16402,19 @@ $zh2TW = array(
 '圭亚那' => '蓋亞那',
 '火锅盖帽' => '蓋火鍋',
 '苏里南' => '蘇利南',
-'行凶' => '行凶',
 '行兇' => '行凶',
-'行凶后' => '行凶後',
+'行凶' => '行凶',
 '行兇後' => '行凶後',
 '行凶後' => '行凶後',
-'流動電話' => '行動電話',
+'行凶后' => '行凶後',
 '移动电话' => '行動電話',
+'流動電話' => '行動電話',
 '行程控制' => '行程控制',
 '衞' => '衛',
 '卫生' => '衛生',
 '衞生' => '衛生',
-'埃塞俄比亚' => '衣索比亞',
 '埃塞俄比亞' => '衣索比亞',
+'埃塞俄比亚' => '衣索比亞',
 '裏勾外連' => '裡勾外連',
 '裏面' => '裡面',
 '分辨率' => '解析度',
@@ -16426,39 +16425,39 @@ $zh2TW = array(
 '瑙魯' => '諾魯',
 '变量' => '變數',
 '科特迪瓦' => '象牙海岸',
-'貝寧' => '貝南',
 '贝宁' => '貝南',
+'貝寧' => '貝南',
 '伯利茲' => '貝里斯',
 '伯利兹' => '貝里斯',
 '買兇' => '買凶',
-'买凶' => '買凶',
 '買凶' => '買凶',
+'买凶' => '買凶',
 '数据库' => '資料庫',
 '信息论' => '資訊理論',
 '奔驰' => '賓士',
 '平治' => '賓士',
 '利比里亚' => '賴比瑞亞',
 '利比里亞' => '賴比瑞亞',
-'萊索托' => '賴索托',
 '莱索托' => '賴索托',
+'萊索托' => '賴索托',
 '软驱' => '軟碟機',
-'軟件' => '軟體',
 '软件' => '軟體',
+'軟件' => '軟體',
 '加载' => '載入',
-'津巴布韦' => '辛巴威',
 '津巴布韋' => '辛巴威',
+'津巴布韦' => '辛巴威',
 '词汇' => '辭彙',
-'加纳' => '迦納',
 '加納' => '迦納',
-'追凶' => '追凶',
+'加纳' => '迦納',
 '追兇' => '追凶',
+'追凶' => '追凶',
 '這裏' => '這裡',
-'逞凶鬥狠' => '逞凶鬥狠',
 '逞兇鬥狠' => '逞凶鬥狠',
 '逞凶斗狠' => '逞凶鬥狠',
+'逞凶鬥狠' => '逞凶鬥狠',
 '即食麵' => '速食麵',
-'方便面' => '速食麵',
 '快速面' => '速食麵',
+'方便面' => '速食麵',
 '连字号' => '連字號',
 '进制' => '進位',
 '入球' => '進球',
@@ -16474,8 +16473,8 @@ $zh2TW = array(
 '鈎心鬥角' => '鉤心鬥角',
 '锎' => '鉲',
 '写保护' => '防寫',
-'阿拉伯联合酋长国' => '阿拉伯聯合大公國',
 '阿拉伯聯合酋長國' => '阿拉伯聯合大公國',
+'阿拉伯联合酋长国' => '阿拉伯聯合大公國',
 '噪声' => '雜訊',
 '脱机' => '離線',
 '雪裏紅' => '雪裡紅',
@@ -16485,8 +16484,8 @@ $zh2TW = array(
 '异步' => '非同步',
 '声卡' => '音效卡',
 '缺省' => '預設',
-'颁布' => '頒布',
 '頒佈' => '頒布',
+'颁布' => '頒布',
 '領域裏' => '領域裡',
 '头球' => '頭槌',
 '粒入球' => '顆進球',
@@ -16504,30 +16503,30 @@ $zh2TW = array(
 );
 
 $zh2HK = array(
-'505線' => '505綫',
 '505线' => '505綫',
-'507線' => '507綫',
+'505線' => '505綫',
 '507线' => '507綫',
-'610線' => '610綫',
+'507線' => '507綫',
 '610线' => '610綫',
+'610線' => '610綫',
 '614P線' => '614P綫',
 '614P线' => '614P綫',
-'614线' => '614綫',
 '614線' => '614綫',
+'614线' => '614綫',
 '615P線' => '615P綫',
 '615P线' => '615P綫',
 '615线' => '615綫',
 '615線' => '615綫',
-'705线' => '705綫',
 '705線' => '705綫',
-'706线' => '706綫',
+'705线' => '705綫',
 '706線' => '706綫',
+'706线' => '706綫',
 '751P線' => '751P綫',
 '751P线' => '751P綫',
-'751線' => '751綫',
 '751线' => '751綫',
-'761P线' => '761P綫',
+'751線' => '751綫',
 '761P線' => '761P綫',
+'761P线' => '761P綫',
 '“' => '「',
 '”' => '」',
 '‘' => '『',
@@ -16552,8 +16551,8 @@ $zh2HK = array(
 '乘著錄' => '乘著錄',
 '葉門' => '也門',
 '二極體' => '二極管',
-'網際網路' => '互聯網',
 '因特网' => '互聯網',
+'網際網路' => '互聯網',
 '亮著' => '亮着',
 '亮著作' => '亮著作',
 '亮著名' => '亮著名',
@@ -16607,8 +16606,8 @@ $zh2HK = array(
 '住著述' => '住著述',
 '住著錄' => '住著錄',
 '維德角' => '佛得角',
-'作品裡' => '作品裏',
 '作品里' => '作品裏',
+'作品裡' => '作品裏',
 '來著' => '來着',
 '來著作' => '來著作',
 '來著名' => '來著名',
@@ -16764,8 +16763,8 @@ $zh2HK = array(
 '動著者' => '動著者',
 '動著述' => '動著述',
 '動著錄' => '動著錄',
-'北环线' => '北環綫',
 '北環線' => '北環綫',
+'北环线' => '北環綫',
 '医院里' => '医院裏',
 '波札那' => '博茨瓦納',
 '珍妮弗·卡普里亚蒂' => '卡佩雅蒂',
@@ -16778,13 +16777,13 @@ $zh2HK = array(
 '印著述' => '印著述',
 '印著錄' => '印著錄',
 '瓜地馬拉' => '危地馬拉',
-'泡麵' => '即食麵',
 '方便面' => '即食麵',
-'快速面' => '即食麵',
 '速食麵' => '即食麵',
+'快速面' => '即食麵',
+'泡麵' => '即食麵',
 '厄瓜多' => '厄瓜多爾',
-'厄瓜多爾' => '厄瓜多爾',
 '厄瓜多尔' => '厄瓜多爾',
+'厄瓜多爾' => '厄瓜多爾',
 '厄利垂亞' => '厄立特里亞',
 '去著' => '去着',
 '去著作' => '去著作',
@@ -16933,8 +16932,8 @@ $zh2HK = array(
 '坐著述' => '坐著述',
 '坐著錄' => '坐著錄',
 '坦尚尼亞' => '坦桑尼亞',
-'衣索匹亞' => '埃塞俄比亞',
 '衣索比亞' => '埃塞俄比亞',
+'衣索匹亞' => '埃塞俄比亞',
 '吉里巴斯' => '基里巴斯',
 '塞普勒斯' => '塞浦路斯',
 '塞席爾' => '塞舌爾',
@@ -16946,10 +16945,10 @@ $zh2HK = array(
 '壓著者' => '壓著者',
 '壓著述' => '壓著述',
 '壓著錄' => '壓著錄',
-'夏天里' => '夏天裏',
 '夏天裡' => '夏天裏',
-'夏日里' => '夏日裏',
+'夏天里' => '夏天裏',
 '夏日裡' => '夏日裏',
+'夏日里' => '夏日裏',
 '夢著' => '夢着',
 '夢著作' => '夢著作',
 '夢著名' => '夢著名',
@@ -17003,8 +17002,8 @@ $zh2HK = array(
 '定著述' => '定著述',
 '定著錄' => '定著錄',
 '沃尓沃' => '富豪',
-'寒假裡' => '寒假裏',
 '寒假里' => '寒假裏',
+'寒假裡' => '寒假裏',
 '寫著' => '寫着',
 '寫著作' => '寫著作',
 '寫著名' => '寫著名',
@@ -17013,10 +17012,10 @@ $zh2HK = array(
 '寫著者' => '寫著者',
 '寫著述' => '寫著述',
 '寫著錄' => '寫著錄',
-'将军澳线' => '將軍澳綫',
 '將軍澳線' => '將軍澳綫',
-'专辑里' => '專輯裏',
+'将军澳线' => '將軍澳綫',
 '專輯裡' => '專輯裏',
+'专辑里' => '專輯裏',
 '尋著' => '尋着',
 '尋著作' => '尋著作',
 '尋著名' => '尋著名',
@@ -17033,12 +17032,12 @@ $zh2HK = array(
 '對著者' => '對著者',
 '對著述' => '對著述',
 '對著錄' => '對著錄',
-'奈及利亞' => '尼日利亞',
-'尼日利亚' => '尼日利亞',
 '尼日利亞' => '尼日利亞',
-'å°¼æ\97¥å°\94' => 'å°¼æ\97¥ç\88¾',
-'å°¼æ\97¥ç\88¾' => 'å°¼æ\97¥ç\88¾',
+'å°¼æ\97¥å\88©äº\9a' => 'å°¼æ\97¥å\88©äº\9e',
+'å¥\88å\8f\8aå\88©äº\9e' => 'å°¼æ\97¥å\88©äº\9e',
 '尼日' => '尼日爾',
+'尼日爾' => '尼日爾',
+'尼日尔' => '尼日爾',
 '展著' => '展着',
 '展著作' => '展著作',
 '展著名' => '展著名',
@@ -17081,8 +17080,8 @@ $zh2HK = array(
 '賓士' => '平治',
 '年代里' => '年代裏',
 '年代裡' => '年代裏',
-'幹著' => '幹着',
 '干着' => '幹着',
+'幹著' => '幹着',
 '幾內亞比索' => '幾內亞比紹',
 '康著' => '康着',
 '康著作' => '康著作',
@@ -17125,8 +17124,8 @@ $zh2HK = array(
 '心著者' => '心著者',
 '心著述' => '心著述',
 '心著錄' => '心著錄',
-'心裡' => '心裏',
 '心里' => '心裏',
+'心裡' => '心裏',
 '忍著' => '忍着',
 '忍著作' => '忍著作',
 '忍著名' => '忍著名',
@@ -17233,10 +17232,10 @@ $zh2HK = array(
 '戰著者' => '戰著者',
 '戰著述' => '戰著述',
 '戰著錄' => '戰著錄',
-'戲裡' => '戲裏',
 '戏里' => '戲裏',
-'黛安娜' => '戴安娜',
+'戲裡' => '戲裏',
 '狄安娜' => '戴安娜',
+'黛安娜' => '戴安娜',
 '戴著' => '戴着',
 '戴著作' => '戴著作',
 '戴著名' => '戴著名',
@@ -17469,8 +17468,8 @@ $zh2HK = array(
 '斯洛維尼亞' => '斯洛文尼亞',
 '新著龍虎門' => '新著龍虎門',
 '紐西蘭' => '新西蘭',
-'日子里' => '日子裏',
 '日子裡' => '日子裏',
+'日子里' => '日子裏',
 '昂著' => '昂着',
 '昂著作' => '昂著作',
 '昂著名' => '昂著名',
@@ -17487,12 +17486,12 @@ $zh2HK = array(
 '映著者' => '映著者',
 '映著述' => '映著述',
 '映著錄' => '映著錄',
-'春假里' => '春假裏',
 '春假裡' => '春假裏',
-'æ\98¥å¤©è£¡' => 'æ\98¥å¤©裏',
+'æ\98¥å\81\87é\87\8c' => 'æ\98¥å\81\87裏',
 '春天里' => '春天裏',
-'春日裡' => '春日裏',
+'春天裡' => '春天裏',
 '春日里' => '春日裏',
+'春日裡' => '春日裏',
 '时间里' => '時間裏',
 '時間裡' => '時間裏',
 '晃著' => '晃着',
@@ -17502,8 +17501,8 @@ $zh2HK = array(
 '晃著者' => '晃著者',
 '晃著述' => '晃著述',
 '晃著錄' => '晃著錄',
-'暑假里' => '暑假裏',
 '暑假裡' => '暑假裏',
+'暑假里' => '暑假裏',
 '暗著' => '暗着',
 '暗著作' => '暗著作',
 '暗著名' => '暗著名',
@@ -17547,8 +17546,8 @@ $zh2HK = array(
 '村子裡' => '村子裏',
 '东涌线' => '東涌綫',
 '東涌線' => '東涌綫',
-'東鐵線' => '東鐵綫',
 '东铁线' => '東鐵綫',
+'東鐵線' => '東鐵綫',
 '枕著' => '枕着',
 '枕著作' => '枕著作',
 '枕著名' => '枕著名',
@@ -17566,8 +17565,8 @@ $zh2HK = array(
 '梳著者' => '梳著者',
 '梳著述' => '梳著述',
 '梳著錄' => '梳著錄',
-'森林裡' => '森林裏',
 '森林里' => '森林裏',
+'森林裡' => '森林裏',
 '棺材裡' => '棺材裏',
 '棺材里' => '棺材裏',
 '榴蓮' => '榴槤',
@@ -17582,8 +17581,8 @@ $zh2HK = array(
 '樂著錄' => '樂著錄',
 '寶獅' => '標致',
 '標誌著' => '標誌着',
-'機場快線' => '機場快綫',
 '机场快线' => '機場快綫',
+'機場快線' => '機場快綫',
 '機器人' => '機械人',
 '机器人' => '機械人',
 '历史里' => '歷史裏',
@@ -17616,12 +17615,12 @@ $zh2HK = array(
 '沉著者' => '沉著者',
 '沉著述' => '沉著述',
 '沉著錄' => '沉著錄',
-'沙中线' => '沙中綫',
 '沙中線' => '沙中綫',
+'沙中线' => '沙中綫',
 '沙地阿拉伯' => '沙特阿拉伯',
 '沙烏地阿拉伯' => '沙特阿拉伯',
-'沙田至中環線' => '沙田至中環綫',
 '沙田至中环线' => '沙田至中環綫',
+'沙田至中環線' => '沙田至中環綫',
 '马拉特·萨芬' => '沙芬',
 '沿著' => '沿着',
 '沿著作' => '沿著作',
@@ -17642,8 +17641,8 @@ $zh2HK = array(
 '活著者' => '活著者',
 '活著述' => '活著述',
 '活著錄' => '活著錄',
-'行動電話' => '流動電話',
 '移动电话' => '流動電話',
+'行動電話' => '流動電話',
 '流著' => '流着',
 '流著作' => '流著作',
 '流著名' => '流著名',
@@ -17725,10 +17724,10 @@ $zh2HK = array(
 '无线剧集' => '無綫劇集',
 '無線收費' => '無綫收費',
 '无线收费' => '無綫收費',
-'无线节目' => '無綫節目',
 '無線節目' => '無綫節目',
-'无线电视' => '無綫電視',
+'无线节目' => '無綫節目',
 '無線電視' => '無綫電視',
+'无线电视' => '無綫電視',
 '菸' => '煙',
 '照著' => '照着',
 '照著作' => '照著作',
@@ -17781,8 +17780,8 @@ $zh2HK = array(
 '猜著者' => '猜著者',
 '猜著述' => '猜著述',
 '猜著錄' => '猜著錄',
-'狱里' => '獄裏',
 '獄裡' => '獄裏',
+'狱里' => '獄裏',
 '獨著' => '獨着',
 '獨著作' => '獨著作',
 '獨著名' => '獨著名',
@@ -17845,12 +17844,12 @@ $zh2HK = array(
 '疑著錄' => '疑著錄',
 '发布' => '發佈',
 '發布' => '發佈',
-'百科裡' => '百科裏',
 '百科里' => '百科裏',
+'百科裡' => '百科裏',
 '計程車' => '的士',
 '出租车' => '的士',
-'皮里阳秋' => '皮裏陽秋',
 '皮裡陽秋' => '皮裏陽秋',
+'皮里阳秋' => '皮裏陽秋',
 '皺著' => '皺着',
 '皺著作' => '皺著作',
 '皺著名' => '皺著名',
@@ -17960,8 +17959,8 @@ $zh2HK = array(
 '瞪著錄' => '瞪著錄',
 '簡訊' => '短訊',
 '短信' => '短訊',
-'硬件' => '硬件',
 '硬體' => '硬件',
+'硬件' => '硬件',
 '福斯' => '福士',
 '福著' => '福着',
 '福著作' => '福著作',
@@ -17971,12 +17970,12 @@ $zh2HK = array(
 '福著者' => '福著者',
 '福著述' => '福著述',
 '福著錄' => '福著錄',
-'秋假裡' => '秋假裏',
 '秋假里' => '秋假裏',
-'ç§\8b天裡' => 'ç§\8b天裏',
+'ç§\8bå\81\87裡' => 'ç§\8bå\81\87裏',
 '秋天里' => '秋天裏',
-'秋日里' => '秋日裏',
+'秋天裡' => '秋天裏',
 '秋日裡' => '秋日裏',
+'秋日里' => '秋日裏',
 '葛摩' => '科摩羅',
 '捷豹' => '積架',
 '空著' => '空着',
@@ -17987,8 +17986,8 @@ $zh2HK = array(
 '空著者' => '空著者',
 '空著述' => '空著述',
 '空著錄' => '空著錄',
-'太空梭' => '穿梭機',
 '航天飞机' => '穿梭機',
+'太空梭' => '穿梭機',
 '穿著' => '穿着',
 '穿著作' => '穿著作',
 '穿著名' => '穿著名',
@@ -18100,8 +18099,8 @@ $zh2HK = array(
 '考著者' => '考著者',
 '考著述' => '考著述',
 '考著錄' => '考著錄',
-'圣基茨和尼维斯' => '聖吉斯納域斯',
 '聖克里斯多福及尼維斯' => '聖吉斯納域斯',
+'圣基茨和尼维斯' => '聖吉斯納域斯',
 '聖文森及格瑞那丁' => '聖文森特和格林納丁斯',
 '聖露西亞' => '聖盧西亞',
 '聖馬利諾' => '聖馬力諾',
@@ -18117,8 +18116,8 @@ $zh2HK = array(
 '聽著錄' => '聽著錄',
 '肚里' => '肚裏',
 '肚裡' => '肚裏',
-'肯尼亚' => '肯雅',
 '肯亞' => '肯雅',
+'肯尼亚' => '肯雅',
 '背著' => '背着',
 '背著作' => '背著作',
 '背著名' => '背著名',
@@ -18162,8 +18161,8 @@ $zh2HK = array(
 '苦著錄' => '苦著錄',
 '苦里' => '苦裏',
 '苦裡' => '苦裏',
-'荃湾线' => '荃灣綫',
 '荃灣線' => '荃灣綫',
+'荃湾线' => '荃灣綫',
 '莫三比克' => '莫桑比克',
 '賴索托' => '萊索托',
 '馬自達' => '萬事得',
@@ -18229,8 +18228,8 @@ $zh2HK = array(
 '衣著錄' => '衣著錄',
 '裡勾外連' => '裏勾外連',
 '里勾外连' => '裏勾外連',
-'里面' => '裏面',
 '裡面' => '裏面',
+'里面' => '裏面',
 '裝著' => '裝着',
 '裝著作' => '裝著作',
 '裝著名' => '裝著名',
@@ -18247,8 +18246,8 @@ $zh2HK = array(
 '裹著者' => '裹著者',
 '裹著述' => '裹著述',
 '裹著錄' => '裹著錄',
-'西铁线' => '西鐵綫',
 '西鐵線' => '西鐵綫',
+'西铁线' => '西鐵綫',
 '見著' => '見着',
 '見著作' => '見著作',
 '見著名' => '見著名',
@@ -18442,8 +18441,8 @@ $zh2HK = array(
 '辦著錄' => '辦著錄',
 '近角聪信' => '近角聰信',
 '近角聰信' => '近角聰信',
-'迪士尼线' => '迪士尼綫',
 '迪士尼線' => '迪士尼綫',
+'迪士尼线' => '迪士尼綫',
 '迫著' => '迫着',
 '追著' => '追着',
 '追著作' => '追著作',
@@ -18527,8 +18526,8 @@ $zh2HK = array(
 '醯醢' => '醯醢',
 '醯醬' => '醯醬',
 '醯酱' => '醯醬',
-'醯鸡' => '醯雞',
 '醯雞' => '醯雞',
+'醯鸡' => '醯雞',
 '釀著' => '釀着',
 '釀著作' => '釀著作',
 '釀著名' => '釀著名',
@@ -18641,15 +18640,15 @@ $zh2HK = array(
 '雜著述' => '雜著述',
 '雜著錄' => '雜著錄',
 '冰淇淋' => '雪糕',
-'雪里红' => '雪裏紅',
 '雪裡紅' => '雪裏紅',
+'雪里红' => '雪裏紅',
 '雪裡蕻' => '雪裏蕻',
 '雪里蕻' => '雪裏蕻',
 '靠著' => '靠着',
 '靠著作' => '靠著作',
 '靠著名' => '靠著名',
-'靠著稱' => '靠著稱',
 '靠著称' => '靠著稱',
+'靠著稱' => '靠著稱',
 '靠著者' => '靠著者',
 '靠著述' => '靠著述',
 '靠著錄' => '靠著錄',
@@ -18678,10 +18677,10 @@ $zh2HK = array(
 '順著者' => '順著者',
 '順著述' => '順著述',
 '順著錄' => '順著錄',
-'頒布' => '頒佈',
 '颁布' => '頒佈',
-'é \98å\9f\9f裡' => 'é \98å\9f\9fè£\8f',
+'é \92å¸\83' => 'é \92ä½\88',
 '领域里' => '領域裏',
+'領域裡' => '領域裏',
 '領著' => '領着',
 '領著作' => '領著作',
 '領著名' => '領著名',
@@ -18698,8 +18697,8 @@ $zh2HK = array(
 '飄著者' => '飄著者',
 '飄著述' => '飄著述',
 '飄著錄' => '飄著錄',
-'館裡' => '館裏',
 '馆里' => '館裏',
+'館裡' => '館裏',
 '馬爾地夫' => '馬爾代夫',
 '馬利共和國' => '馬里共和國',
 '土豆' => '馬鈴薯',
@@ -18777,8 +18776,8 @@ $zh2HK = array(
 '點著者' => '點著者',
 '點著述' => '點著述',
 '點著錄' => '點著錄',
-'點裡' => '點裏',
 '点里' => '點裏',
+'點裡' => '點裏',
 );
 
 $zh2CN = array(
@@ -18804,8 +18803,8 @@ $zh2CN = array(
 '互聯網' => '互联网',
 '互動式' => '交互式',
 '人工智慧' => '人工智能',
-'甚麽' => '什么',
 '甚麼' => '什么',
+'甚麽' => '什么',
 '乙太網' => '以太网',
 '優先順序' => '优先级',
 '感測' => '传感',
@@ -18850,16 +18849,16 @@ $zh2CN = array(
 '华乐街' => '华乐街',
 '波札那' => '博茨瓦纳',
 '盧安達' => '卢旺达',
-'衞生' => '卫生',
 '衛生' => '卫生',
+'衞生' => '卫生',
 '瓜地馬拉' => '危地马拉',
 '厄瓜多' => '厄瓜多尔',
-'厄瓜多爾' => '厄瓜多尔',
 '厄瓜多尔' => '厄瓜多尔',
+'厄瓜多爾' => '厄瓜多尔',
 '厄利垂亞' => '厄立特里亚',
 '變數' => '变量',
-'撞球' => '台球',
 '桌球' => '台球',
+'撞球' => '台球',
 '吉布地' => '吉布提',
 '哈薩克' => '哈萨克斯坦',
 '哥斯大黎加' => '哥斯达黎加',
@@ -18868,8 +18867,8 @@ $zh2CN = array(
 '吐瓦魯' => '图瓦卢',
 '土庫曼' => '土库曼斯坦',
 '聖露西亞' => '圣卢西亚',
-'聖吉斯納域斯' => '圣基茨和尼维斯',
 '聖克里斯多福及尼維斯' => '圣基茨和尼维斯',
+'聖吉斯納域斯' => '圣基茨和尼维斯',
 '聖文森及格瑞那丁' => '圣文森特和格林纳丁斯',
 '聖馬利諾' => '圣马力诺',
 '蓋亞那' => '圭亚那',
@@ -18889,11 +18888,11 @@ $zh2CN = array(
 '福斯' => '大众',
 '大衛碧咸' => '大卫·贝克汉姆',
 '頭槌' => '头球',
-'賓士' => '奔驰',
 '平治' => '奔驰',
+'賓士' => '奔驰',
 '忌廉' => '奶油',
-'字元会' => '字元会',
 '字元會' => '字元会',
+'字元会' => '字元会',
 '字元濟' => '字元济',
 '字元济' => '字元济',
 '字型大小' => '字号',
@@ -18901,18 +18900,18 @@ $zh2CN = array(
 '欄位' => '字段',
 '字母' => '字母',
 '字元' => '字符',
-'字節' => '字节',
 '位元組' => '字节',
+'字節' => '字节',
 '存檔' => '存盘',
 '安地卡及巴布達' => '安提瓜和巴布达',
 '巨集' => '宏',
 '寬頻' => '宽带',
 '定址' => '寻址',
-'奈及利亞' => '尼日利亚',
 '尼日利亞' => '尼日利亚',
 '尼日利亚' => '尼日利亚',
-'å°¼æ\97¥ç\88¾' => 'å°¼æ\97¥å°\94',
+'å¥\88å\8f\8aå\88©äº\9e' => 'å°¼æ\97¥å\88©äº\9a',
 '尼日尔' => '尼日尔',
+'尼日爾' => '尼日尔',
 '章節附註' => '尾注',
 '區域網' => '局域网',
 '巴貝多' => '巴巴多斯',
@@ -18926,8 +18925,8 @@ $zh2CN = array(
 '蒲隆地' => '布隆迪',
 '希特拉' => '希特勒',
 '帛琉' => '帕劳',
-'平治之乱' => '平治之乱',
 '平治之亂' => '平治之乱',
+'平治之乱' => '平治之乱',
 '非同步' => '异步',
 '迴圈' => '循环',
 '快閃記憶體' => '快闪存储器',
@@ -18938,8 +18937,8 @@ $zh2CN = array(
 '索羅門群島' => '所罗门群岛',
 '打印' => '打印',
 '列印' => '打印',
-'印表機' => '打印机',
 '打印機' => '打印机',
+'印表機' => '打印机',
 '射門' => '打门',
 '掃瞄器' => '扫瞄仪',
 '括弧' => '括号',
@@ -18953,12 +18952,12 @@ $zh2CN = array(
 '斯洛維尼亞' => '斯洛文尼亚',
 '紐西蘭' => '新西兰',
 '即食麵' => '方便面',
+'速食麵' => '方便面',
 '快速面' => '方便面',
 '泡麵' => '方便面',
-'速食麵' => '方便面',
 '伺服器' => '服务器',
-'機械人' => '机器人',
 '機器人' => '机器人',
+'機械人' => '机器人',
 '許可權' => '权限',
 '寶獅' => '标志',
 '格瑞那達' => '格林纳达',
@@ -18987,16 +18986,16 @@ $zh2CN = array(
 '狗隻' => '犬只',
 '卡佩雅蒂' => '珍妮弗·卡普里亚蒂',
 '諾魯' => '瑙鲁',
-'萬那杜' => '瓦努阿图',
 '溫納圖' => '瓦努阿图',
+'萬那杜' => '瓦努阿图',
 '碟片' => '盘片',
-'短訊' => '短信',
 '簡訊' => '短信',
-'ç\9f½å°\98' => 'ç\9f½å°\98',
+'ç\9f­è¨\8a' => 'ç\9f­ä¿¡',
 '矽塵' => '矽尘',
+'矽尘' => '矽尘',
 '矽肺' => '矽肺',
-'矽钢' => '矽钢',
 '矽鋼' => '矽钢',
+'矽钢' => '矽钢',
 '矽' => '硅',
 '矽片' => '硅片',
 '矽谷' => '硅谷',
@@ -19006,8 +19005,8 @@ $zh2CN = array(
 '磁軌' => '磁道',
 '葛摩' => '科摩罗',
 '象牙海岸' => '科特迪瓦',
-'行動電話' => '移动电话',
 '流動電話' => '移动电话',
+'行動電話' => '移动电话',
 '程式控制' => '程控',
 '突尼西亞' => '突尼斯',
 '谐星' => '笑星',
@@ -19019,11 +19018,11 @@ $zh2CN = array(
 '網路' => '网络',
 '網絡' => '网络',
 '寮國' => '老挝',
-'肯雅' => '肯尼亚',
 '肯亞' => '肯尼亚',
+'肯雅' => '肯尼亚',
 '單車' => '自行车',
-'太空梭' => '航天飞机',
 '穿梭機' => '航天飞机',
+'太空梭' => '航天飞机',
 '節慶' => '节日',
 '晶元' => '芯片',
 '晶片' => '芯片',
@@ -19039,8 +19038,8 @@ $zh2CN = array(
 '尚比亞' => '赞比亚',
 '绑紧跳' => '蹦极跳',
 '笨豬跳' => '蹦极跳',
-'軟體' => '软件',
 '軟件' => '软件',
+'軟體' => '软件',
 '軟碟機' => '软驱',
 '米高奧雲' => '迈克尔·欧文',
 '舒麥加' => '迈克尔·舒马赫',
@@ -19070,15 +19069,15 @@ $zh2SG = array(
 '民乐' => '华乐',
 '夜校' => '夜学',
 '房价' => '屋价',
-'即食麵' => '快速面',
-'速食麵' => '快速面',
 '泡麵' => '快速面',
+'速食麵' => '快速面',
 '方便面' => '快速面',
-'零钱' => '散钱',
+'即食麵' => '快速面',
 '散紙' => '散钱',
+'零钱' => '散钱',
 '榴莲' => '榴梿',
 '榴蓮' => '榴梿',
-'笨豬跳' => '绑紧跳',
 '蹦极跳' => '绑紧跳',
+'笨豬跳' => '绑紧跳',
 '笑星' => '谐星',
 );
index 918fc9e..63f3151 100644 (file)
@@ -289,6 +289,9 @@ class InfoAction extends FormlessAction {
                if ( isset( $pageProperties['noindex'] ) ) {
                        $pOutput->setIndexPolicy( 'noindex' );
                }
+               if ( isset( $pageProperties['index'] ) ) {
+                       $pOutput->setIndexPolicy( 'index' );
+               }
 
                // Use robot policy logic
                $policy = $this->page->getRobotPolicy( 'view', $pOutput );
index bab2f93..b753407 100644 (file)
@@ -165,7 +165,7 @@ class RawAction extends FormlessAction {
                                } elseif ( !$content instanceof TextContent ) {
                                        // non-text content
                                        wfHttpError( 415, "Unsupported Media Type", "The requested page uses the content model `"
-                                                                               . $content->getModel() . "` which is not supported via this interface." );
+                                               . $content->getModel() . "` which is not supported via this interface." );
                                        die();
                                } else {
                                        // want a section?
index c1a4cd3..72b1f88 100644 (file)
@@ -803,25 +803,32 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Die if none of a certain set of parameters is set and not false.
-        * @param array $params of parameter names
+        *
+        * @since 1.23
+        * @param array $params User provided set of parameters
+        * @param string ... List of parameter names to check
         */
        public function requireAtLeastOneParameter( $params ) {
                $required = func_get_args();
                array_shift( $required );
                $p = $this->getModulePrefix();
 
-               $intersection = array_intersect( array_keys( array_filter( $params,
-                       array( $this, "parameterNotEmpty" ) ) ), $required );
+               $intersection = array_intersect(
+                       array_keys( array_filter( $params, array( $this, "parameterNotEmpty" ) ) ),
+                       $required
+               );
 
                if ( count( $intersection ) == 0 ) {
-                       $this->dieUsage( "At least one of the parameters {$p}" . implode( ", {$p}", $required ) . ' is required', "{$p}missingparam" );
+                       $this->dieUsage( "At least one of the parameters {$p}" .
+                               implode( ", {$p}", $required ) . ' is required', "{$p}missingparam" );
                }
        }
 
        /**
         * Generates the possible errors requireAtLeastOneParameter() can die with
         *
-        * @param $params array
+        * @since 1.23
+        * @param $params array Array of parameter key names
         * @return array
         */
        public function getRequireAtLeastOneParameterErrorMessages( $params ) {
@@ -829,7 +836,10 @@ abstract class ApiBase extends ContextSource {
                $params = implode( ", {$p}", $params );
 
                return array(
-                       array( 'code' => "{$p}missingparam", 'info' => "At least one of the parameters {$p}{$params} is required" ),
+                       array(
+                               'code' => "{$p}missingparam",
+                               'info' => "At least one of the parameters {$p}{$params} is required",
+                       ),
                );
        }
 
@@ -1362,13 +1372,13 @@ abstract class ApiBase extends ContextSource {
        }
 
        /**
-        * Throw a UsageException based on the errors in the Status object.
+        * Get error (as code, string) from a Status object.
         *
-        * @since 1.22
+        * @since 1.23
         * @param Status $status Status object
-        * @throws MWException
+        * @return array of code and error string
         */
-       public function dieStatus( $status ) {
+       public function getErrorFromStatus( $status ) {
                if ( $status->isGood() ) {
                        throw new MWException( 'Successful status passed to ApiBase::dieStatus' );
                }
@@ -1396,7 +1406,21 @@ abstract class ApiBase extends ContextSource {
                        // Translate message to code, for backwards compatability
                        $code = ApiBase::$messageMap[$code]['code'];
                }
-               $this->dieUsage( $msg->inLanguage( 'en' )->useDatabase( false )->plain(), $code );
+
+               return array( $code, $msg->inLanguage( 'en' )->useDatabase( false )->plain() );
+       }
+
+       /**
+        * Throw a UsageException based on the errors in the Status object.
+        *
+        * @since 1.22
+        * @param Status $status Status object
+        * @throws MWException
+        */
+       public function dieStatus( $status ) {
+
+               list( $code, $msg ) = $this->getErrorFromStatus( $status );
+               $this->dieUsage( $msg, $code );
        }
 
        // @codingStandardsIgnoreStart Allow long lines. Cannot split these.
index 7727b28..be8286c 100644 (file)
@@ -138,13 +138,13 @@ class ApiCreateAccount extends ApiBase {
                        // since not having the correct token is part of the normal
                        // flow of events.
                        $result['token'] = LoginForm::getCreateaccountToken();
-                       $result['result'] = 'needtoken';
+                       $result['result'] = 'NeedToken';
                } elseif ( !$status->isOK() ) {
                        // There was an error. Die now.
                        $this->dieStatus( $status );
                } elseif ( !$status->isGood() ) {
                        // Status is not good, but OK. This means warnings.
-                       $result['result'] = 'warning';
+                       $result['result'] = 'Warning';
 
                        // Add any warnings to the result
                        $warnings = $status->getErrorsByType( 'warning' );
@@ -157,7 +157,7 @@ class ApiCreateAccount extends ApiBase {
                        }
                } else {
                        // Everything was fine.
-                       $result['result'] = 'success';
+                       $result['result'] = 'Success';
                }
 
                // Give extensions a chance to modify the API result data
@@ -229,9 +229,9 @@ class ApiCreateAccount extends ApiBase {
                        'createaccount' => array(
                                'result' => array(
                                        ApiBase::PROP_TYPE => array(
-                                               'success',
-                                               'warning',
-                                               'needtoken'
+                                               'Success',
+                                               'Warning',
+                                               'NeedToken'
                                        )
                                ),
                                'username' => array(
index e707eb4..764e609 100644 (file)
@@ -156,6 +156,13 @@ class ApiFormatXml extends ApiFormatBase {
                                } elseif ( is_array( $subElemValue ) ) {
                                        $subElements[$subElemId] = $subElemValue;
                                        unset( $elemValue[$subElemId] );
+                               } elseif ( is_bool( $subElemValue ) ) {
+                                       // treat true as empty string, skip false in xml format
+                                       if ( $subElemValue === true ) {
+                                               $subElemValue = '';
+                                       } else {
+                                               unset( $elemValue[$subElemId] );
+                                       }
                                }
                        }
 
index ea61932..2684f51 100644 (file)
@@ -39,7 +39,6 @@
  * @ingroup API
  */
 class ApiMain extends ApiBase {
-
        /**
         * When no format parameter is given, this format will be used
         */
@@ -84,6 +83,7 @@ class ApiMain extends ApiBase {
                'userrights' => 'ApiUserrights',
                'options' => 'ApiOptions',
                'imagerotate' => 'ApiImageRotate',
+               'revisiondelete' => 'ApiRevisionDelete',
        );
 
        /**
@@ -899,7 +899,7 @@ class ApiMain extends ApiBase {
                        }
                }
                $s .= "\n";
-               wfDebugLog( 'api', $s, false );
+               wfDebugLog( 'api', $s, 'private' );
        }
 
        /**
@@ -1147,7 +1147,10 @@ class ApiMain extends ApiBase {
                        array( 'code' => 'maxlag', 'info' => 'Waiting for host: x seconds lagged' ),
                        array( 'code' => 'maxlag', 'info' => 'Waiting for a database server: x seconds lagged' ),
                        array( 'code' => 'assertuserfailed', 'info' => 'Assertion that the user is logged in failed' ),
-                       array( 'code' => 'assertbotfailed', 'info' => 'Assertion that the user has the bot right failed' ),
+                       array(
+                               'code' => 'assertbotfailed',
+                               'info' => 'Assertion that the user has the bot right failed'
+                       ),
                ) );
        }
 
index 929b0b6..fb441a3 100644 (file)
@@ -98,6 +98,9 @@ class ApiOptions extends ApiBase {
                                                $validation = true;
                                        }
                                        break;
+                               case 'special':
+                                       $validation = "cannot be set by this module";
+                                       break;
                                case 'unused':
                                default:
                                        $validation = "not a valid preference";
index 4095fe6..c712539 100644 (file)
@@ -39,7 +39,6 @@
  * @since 1.21 derives from ApiBase instead of ApiQueryBase
  */
 class ApiPageSet extends ApiBase {
-
        /**
         * Constructor flag: The new instance of ApiPageSet will ignore the 'generator=' parameter
         * @since 1.21
@@ -74,6 +73,30 @@ class ApiPageSet extends ApiBase {
         */
        private $mDefaultNamespace = NS_MAIN;
 
+       /**
+        * 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
+        */
+       private static function addValues( array &$result, $values, $flag = null, $name = null ) {
+               foreach ( $values as $val ) {
+                       if ( $val instanceof Title ) {
+                               $v = array();
+                               ApiQueryBase::addTitleInfo( $v, $val );
+                       } elseif ( $name !== null ) {
+                               $v = array( $name => $val );
+                       } else {
+                               $v = $val;
+                       }
+                       if ( $flag !== null ) {
+                               $v[$flag] = '';
+                       }
+                       $result[] = $v;
+               }
+       }
+
        /**
         * Constructor
         * @param $dbSource ApiBase Module implementing getDB().
@@ -498,6 +521,46 @@ class ApiPageSet extends ApiBase {
                return $values;
        }
 
+       /**
+        * Get an array of invalid/special/missing titles.
+        *
+        * @param $invalidChecks List of types of invalid titles to include.
+        *   Recognized values are:
+        *   - invalidTitles: Titles from $this->getInvalidTitles()
+        *   - special: Titles from $this->getSpecialTitles()
+        *   - missingIds: ids from $this->getMissingPageIDs()
+        *   - missingRevIds: ids from $this->getMissingRevisionIDs()
+        *   - missingTitles: Titles from $this->getMissingTitles()
+        *   - interwikiTitles: Titles from $this->getInterwikiTitlesAsResult()
+        * @return array Array suitable for inclusion in the response
+        * @since 1.23
+        */
+       public function getInvalidTitlesAndRevisions( $invalidChecks = array( 'invalidTitles',
+               'special', 'missingIds', 'missingRevIds', 'missingTitles', 'interwikiTitles' )
+       ) {
+               $result = array();
+               if ( in_array( "invalidTitles", $invalidChecks ) ) {
+                       self::addValues( $result, $this->getInvalidTitles(), 'invalid', 'title' );
+               }
+               if ( in_array( "special", $invalidChecks ) ) {
+                       self::addValues( $result, $this->getSpecialTitles(), 'special', 'title' );
+               }
+               if ( in_array( "missingIds", $invalidChecks ) ) {
+                       self::addValues( $result, $this->getMissingPageIDs(), 'missing', 'pageid' );
+               }
+               if ( in_array( "missingRevIds", $invalidChecks ) ) {
+                       self::addValues( $result, $this->getMissingRevisionIDs(), 'missing', 'revid' );
+               }
+               if ( in_array( "missingTitles", $invalidChecks ) ) {
+                       self::addValues( $result, $this->getMissingTitles(), 'missing' );
+               }
+               if ( in_array( "interwikiTitles", $invalidChecks ) ) {
+                       self::addValues( $result, $this->getInterwikiTitlesAsResult() );
+               }
+
+               return $result;
+       }
+
        /**
         * Get the list of revision IDs (requested with the revids= parameter)
         * @return array revID (int) => pageID (int)
index 464fde6..47ad80f 100644 (file)
@@ -186,8 +186,9 @@ class ApiParse extends ApiBase {
                        }
 
                        $popts = $this->makeParserOptions( $pageObj, $params );
+                       $textProvided = !is_null( $text );
 
-                       if ( is_null( $text ) ) {
+                       if ( !$textProvided ) {
                                if ( $titleProvided && ( $prop || $params['generatexml'] ) ) {
                                        $this->setWarning(
                                                "'title' used without 'text', and parsed page properties were requested " .
@@ -200,7 +201,7 @@ class ApiParse extends ApiBase {
 
                        // If we are parsing text, do not use the content model of the default
                        // API title, but default to wikitext to keep BC.
-                       if ( !$titleProvided && is_null( $model ) ) {
+                       if ( $textProvided && !$titleProvided && is_null( $model ) ) {
                                $model = CONTENT_MODEL_WIKITEXT;
                                $this->setWarning( "No 'title' or 'contentmodel' was given, assuming $model." );
                        }
@@ -361,6 +362,15 @@ class ApiParse extends ApiBase {
                        $result_array['properties'] = $this->formatProperties( $p_result->getProperties() );
                }
 
+               if ( isset( $prop['limitreportdata'] ) ) {
+                       $result_array['limitreportdata'] = $this->formatLimitReportData( $p_result->getLimitReportData() );
+               }
+               if ( isset( $prop['limitreporthtml'] ) ) {
+                       $limitreportHtml = EditPage::getPreviewLimitReport( $p_result );
+                       $result_array['limitreporthtml'] = array();
+                       ApiResult::setContent( $result_array['limitreporthtml'], $limitreportHtml );
+               }
+
                if ( $params['generatexml'] ) {
                        if ( $this->content->getModel() != CONTENT_MODEL_WIKITEXT ) {
                                $this->dieUsage( "generatexml is only supported for wikitext content", "notwikitext" );
@@ -389,6 +399,7 @@ class ApiParse extends ApiBase {
                        'sections' => 's',
                        'headitems' => 'hi',
                        'properties' => 'pp',
+                       'limitreportdata' => 'lr',
                );
                $this->setIndexedTagNames( $result_array, $result_mapping );
                $result->addValue( null, $this->getModuleName(), $result_array );
@@ -476,6 +487,10 @@ class ApiParse extends ApiBase {
                        $entry['lang'] = $bits[0];
                        if ( $title ) {
                                $entry['url'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
+                               // localised language name in user language (maybe set by uselang=)
+                               $entry['langname'] = Language::fetchLanguageName( $title->getInterwiki(), $this->getLanguage()->getCode() );
+                               // native language name
+                               $entry['autonym'] = Language::fetchLanguageName( $title->getInterwiki() );
                        }
                        ApiResult::setContent( $entry, $bits[1] );
                        $result[] = $entry;
@@ -644,6 +659,25 @@ class ApiParse extends ApiBase {
                return $result;
        }
 
+       private function formatLimitReportData( $limitReportData ) {
+               $result = array();
+               $apiResult = $this->getResult();
+
+               foreach ( $limitReportData as $name => $value ) {
+                       $entry = array();
+                       $entry['name'] = $name;
+                       if ( !is_array( $value ) ) {
+                               $value = array( $value );
+                       }
+                       $apiResult->setIndexedTagName( $value, 'param' );
+                       $apiResult->setIndexedTagName_recursive( $value, 'param' );
+                       $entry = array_merge( $entry, $value );
+                       $result[] = $entry;
+               }
+
+               return $result;
+       }
+
        private function setIndexedTagNames( &$array, $mapping ) {
                foreach ( $mapping as $key => $name ) {
                        if ( isset( $array[$key] ) ) {
@@ -687,6 +721,8 @@ class ApiParse extends ApiBase {
                                        'iwlinks',
                                        'wikitext',
                                        'properties',
+                                       'limitreportdata',
+                                       'limitreporthtml',
                                )
                        ),
                        'pst' => false,
@@ -717,7 +753,7 @@ class ApiParse extends ApiBase {
                        'summary' => 'Summary to parse',
                        'redirects' => "If the {$p}page or the {$p}pageid parameter is set to a redirect, resolve it",
                        'title' => "Title of page the text belongs to. " .
-                               "If omitted, \"API\" is used as the title with content model $wikitext",
+                               "If omitted, {$p}contentmodel must be specified, and \"API\" will be used as the title",
                        'page' => "Parse the content of this page. Cannot be used together with {$p}text and {$p}title",
                        'pageid' => "Parse the content of this page. Overrides {$p}page",
                        'oldid' => "Parse the content of this revision. Overrides {$p}page and {$p}pageid",
@@ -741,6 +777,10 @@ class ApiParse extends ApiBase {
                                ' iwlinks        - Gives interwiki links in the parsed wikitext',
                                ' wikitext       - Gives the original wikitext that was parsed',
                                ' properties     - Gives various properties defined in the parsed wikitext',
+                               ' limitreportdata - Gives the limit report in a structured way.',
+                               "                   Gives no data, when {$p}disablepp is set.",
+                               ' limitreporthtml - Gives the HTML version of the limit report.',
+                               "                   Gives no data, when {$p}disablepp is set.",
                        ),
                        'effectivelanglinks' => array(
                                'Includes language links supplied by extensions',
@@ -767,8 +807,8 @@ class ApiParse extends ApiBase {
                                "Only valid when used with {$p}text",
                        ),
                        'contentmodel' => array(
-                               "Content model of the input text. Default is the model of the " .
-                               "specified ${p}title, or $wikitext if ${p}title is not specified",
+                               "Content model of the input text. If omitted, ${p}title must be specified, " .
+                                       "and default will be the model of the specified ${p}title",
                                "Only valid when used with {$p}text",
                        ),
                );
@@ -814,7 +854,7 @@ class ApiParse extends ApiBase {
        public function getExamples() {
                return array(
                        'api.php?action=parse&page=Project:Sandbox' => 'Parse a page',
-                       'api.php?action=parse&text={{Project:Sandbox}}' => 'Parse wikitext',
+                       'api.php?action=parse&text={{Project:Sandbox}}&contentmodel=wikitext' => 'Parse wikitext',
                        'api.php?action=parse&text={{PAGENAME}}&title=Test'
                                => 'Parse wikitext, specifying the page title',
                        'api.php?action=parse&summary=Some+[[link]]&prop=' => 'Parse a summary',
index 80c76b3..644e97e 100644 (file)
@@ -92,10 +92,13 @@ class ApiProtect extends ApiBase {
                                }
                                $expiryarray[$p[0]] = $exp;
                        }
-                       $resultProtections[] = array( $p[0] => $protections[$p[0]],
-                               'expiry' => ( $expiryarray[$p[0]] == $db->getInfinity() ?
-                                       'infinite' :
-                                       wfTimestamp( TS_ISO_8601, $expiryarray[$p[0]] ) ) );
+                       $resultProtections[] = array(
+                               $p[0] => $protections[$p[0]],
+                               'expiry' => ( $expiryarray[$p[0]] == $db->getInfinity()
+                                       ? 'infinite'
+                                       : wfTimestamp( TS_ISO_8601, $expiryarray[$p[0]] )
+                               )
+                       );
                }
 
                $cascade = $params['cascade'];
index c0dd808..e5d6a3c 100644 (file)
 class ApiPurge extends ApiBase {
        private $mPageSet;
 
-       /**
-        * 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
-        */
-       private static function addValues( array &$result, $values, $flag = null, $name = null ) {
-               foreach ( $values as $val ) {
-                       if ( $val instanceof Title ) {
-                               $v = array();
-                               ApiQueryBase::addTitleInfo( $v, $val );
-                       } elseif ( $name !== null ) {
-                               $v = array( $name => $val );
-                       } else {
-                               $v = $val;
-                       }
-                       if ( $flag !== null ) {
-                               $v[$flag] = '';
-                       }
-                       $result[] = $v;
-               }
-       }
-
        /**
         * Purges the cache of a page
         */
@@ -67,13 +43,7 @@ class ApiPurge extends ApiBase {
                $pageSet = $this->getPageSet();
                $pageSet->execute();
 
-               $result = array();
-               self::addValues( $result, $pageSet->getInvalidTitles(), 'invalid', 'title' );
-               self::addValues( $result, $pageSet->getSpecialTitles(), 'special', 'title' );
-               self::addValues( $result, $pageSet->getMissingPageIDs(), 'missing', 'pageid' );
-               self::addValues( $result, $pageSet->getMissingRevisionIDs(), 'missing', 'revid' );
-               self::addValues( $result, $pageSet->getMissingTitles(), 'missing' );
-               self::addValues( $result, $pageSet->getInterwikiTitlesAsResult() );
+               $result = $pageSet->getInvalidTitlesAndRevisions();
 
                foreach ( $pageSet->getGoodTitles() as $title ) {
                        $r = array();
index 6bf8075..44bf0cb 100644 (file)
@@ -67,8 +67,12 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                }
 
                $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
-               $from = ( $params['from'] === null ? null : $this->titlePartToKey( $params['from'], NS_CATEGORY ) );
-               $to = ( $params['to'] === null ? null : $this->titlePartToKey( $params['to'], NS_CATEGORY ) );
+               $from = ( $params['from'] === null
+                       ? null
+                       : $this->titlePartToKey( $params['from'], NS_CATEGORY ) );
+               $to = ( $params['to'] === null
+                       ? null
+                       : $this->titlePartToKey( $params['to'], NS_CATEGORY ) );
                $this->addWhereRange( 'cat_title', $dir, $from, $to );
 
                $min = $params['min'];
index 5be304d..bccc25f 100644 (file)
@@ -149,15 +149,14 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
 
                // 'continue' always overrides 'from'
                $from = ( $continue || $params['from'] === null ? null :
-                       $this->titlePartToKey( $params['from'], $params['namespace'] ) );
+                       $this->titlePartToKey( $params['from'], $namespace ) );
                $to = ( $params['to'] === null ? null :
-                       $this->titlePartToKey( $params['to'], $params['namespace'] ) );
+                       $this->titlePartToKey( $params['to'], $namespace ) );
                $this->addWhereRange( $pfx . $fieldTitle, 'newer', $from, $to );
 
-
                if ( isset( $params['prefix'] ) ) {
                        $this->addWhere( $pfx . $fieldTitle . $db->buildLike( $this->titlePartToKey(
-                               $params['prefix'], $params['namespace'] ), $db->anyString() ) );
+                               $params['prefix'], $namespace ), $db->anyString() ) );
                }
 
                $this->addFields( array( 'pl_title' => $pfx . $fieldTitle ) );
index 430dd51..501154a 100644 (file)
@@ -87,8 +87,12 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
 
                $this->addWhereFld( 'page_namespace', $params['namespace'] );
                $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
-               $from = ( $params['from'] === null ? null : $this->titlePartToKey( $params['from'], $params['namespace'] ) );
-               $to = ( $params['to'] === null ? null : $this->titlePartToKey( $params['to'], $params['namespace'] ) );
+               $from = ( $params['from'] === null
+                       ? null
+                       : $this->titlePartToKey( $params['from'], $params['namespace'] ) );
+               $to = ( $params['to'] === null
+                       ? null
+                       : $this->titlePartToKey( $params['to'], $params['namespace'] ) );
                $this->addWhereRange( 'page_title', $dir, $from, $to );
 
                if ( isset( $params['prefix'] ) ) {
index eb51095..9d9f7c3 100644 (file)
@@ -501,6 +501,7 @@ abstract class ApiQueryBase extends ApiBase {
                        // prefix.
                        $this->dieUsageMsg( array( 'invalidtitle', $titlePart ) );
                }
+
                return substr( $t->getDbKey(), 0, -1 );
        }
 
index 6b896e3..37fb489 100644 (file)
@@ -98,6 +98,7 @@ class ApiQueryContributors extends ApiQueryBase {
                                $this->setContinueEnumParameter( 'continue',
                                        $params['continue'] !== null ? $params['continue'] : '0|0'
                                );
+
                                return;
                        }
                }
@@ -144,6 +145,7 @@ class ApiQueryContributors extends ApiQueryBase {
                                        // of anoncontributors
                                        $this->setContinueEnumParameter( 'continue', $continuePages );
                                }
+
                                return;
                        }
                } elseif ( $params['excluderights'] ) {
@@ -182,6 +184,7 @@ class ApiQueryContributors extends ApiQueryBase {
                                // We've reached the one extra which shows that
                                // there are additional pages to be had. Stop here...
                                $this->setContinueEnumParameter( 'continue', $row->page . '|' . $row->user );
+
                                return;
                        }
 
@@ -191,6 +194,7 @@ class ApiQueryContributors extends ApiQueryBase {
                        );
                        if ( !$fit ) {
                                $this->setContinueEnumParameter( 'continue', $row->page . '|' . $row->user );
+
                                return;
                        }
                }
@@ -269,7 +273,6 @@ class ApiQueryContributors extends ApiQueryBase {
                );
        }
 
-
        public function getDescription() {
                return 'Get the list of logged-in contributors and ' .
                        'the count of anonymous contributors to a page';
index 7585ba7..365fe3f 100644 (file)
@@ -176,8 +176,12 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                } elseif ( $mode == 'all' ) {
                        $this->addWhereFld( 'ar_namespace', $params['namespace'] );
 
-                       $from = $params['from'] === null ? null : $this->titlePartToKey( $params['from'], $params['namespace'] );
-                       $to = $params['to'] === null ? null : $this->titlePartToKey( $params['to'], $params['namespace'] );
+                       $from = $params['from'] === null
+                               ? null
+                               : $this->titlePartToKey( $params['from'], $params['namespace'] );
+                       $to = $params['to'] === null
+                               ? null
+                               : $this->titlePartToKey( $params['to'], $params['namespace'] );
                        $this->addWhereRange( 'ar_title', $dir, $from, $to );
 
                        if ( isset( $params['prefix'] ) ) {
index dffe301..d9579a1 100644 (file)
@@ -36,6 +36,7 @@ class ApiQueryFileRepoInfo extends ApiQueryBase {
        protected function getInitialisedRepoGroup() {
                $repoGroup = RepoGroup::singleton();
                $repoGroup->initialiseRepos();
+
                return $repoGroup;
        }
 
index baee9b1..95c1420 100644 (file)
@@ -677,7 +677,8 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                ' (requires url and param ' . $modulePrefix . 'urlwidth)',
                        'mediatype' =>      ' mediatype     - Adds the media type of the image',
                        'metadata' =>       ' metadata      - Lists Exif metadata for the version of the image',
-                       'commonmetadata' => ' commonmetadata - Lists file format generic metadata for the version of the image',
+                       'commonmetadata' => ' commonmetadata - Lists file format generic metadata ' .
+                               'for the version of the image',
                        'extmetadata' =>    ' extmetadata   - Lists formatted metadata combined ' .
                                'from multiple sources. Results are HTML formatted.',
                        'archivename' =>    ' archivename   - Adds the file name of the archive ' .
index a20b855..5a45a28 100644 (file)
@@ -41,11 +41,18 @@ class ApiQueryLangLinks extends ApiQueryBase {
                }
 
                $params = $this->extractRequestParams();
+               $prop = array_flip( (array)$params['prop'] );
 
                if ( isset( $params['title'] ) && !isset( $params['lang'] ) ) {
                        $this->dieUsageMsg( array( 'missingparam', 'lang' ) );
                }
 
+               // Handle deprecated param
+               $this->requireMaxOneParameter( $params, 'url', 'prop' );
+               if ( $params['url'] ) {
+                       $prop = array( 'url' => 1 );
+               }
+
                $this->addFields( array(
                        'll_from',
                        'll_lang',
@@ -104,12 +111,18 @@ class ApiQueryLangLinks extends ApiQueryBase {
                                break;
                        }
                        $entry = array( 'lang' => $row->ll_lang );
-                       if ( $params['url'] ) {
+                       if ( isset( $prop['url'] ) ) {
                                $title = Title::newFromText( "{$row->ll_lang}:{$row->ll_title}" );
                                if ( $title ) {
                                        $entry['url'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
                                }
                        }
+                       if ( isset( $prop['langname'] ) ) {
+                               $entry['langname'] = Language::fetchLanguageName( $row->ll_lang, $params['inlanguagecode'] );
+                       }
+                       if ( isset( $prop['autonym'] ) ) {
+                               $entry['autonym'] = Language::fetchLanguageName( $row->ll_lang );
+                       }
                        ApiResult::setContent( $entry, $row->ll_title );
                        $fit = $this->addPageSubItem( $row->ll_from, $entry );
                        if ( !$fit ) {
@@ -124,6 +137,7 @@ class ApiQueryLangLinks extends ApiQueryBase {
        }
 
        public function getAllowedParams() {
+               global $wgContLang;
                return array(
                        'limit' => array(
                                ApiBase::PARAM_DFLT => 10,
@@ -133,7 +147,18 @@ class ApiQueryLangLinks extends ApiQueryBase {
                                ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
                        ),
                        'continue' => null,
-                       'url' => false,
+                       'url' => array(
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_DEPRECATED => true,
+                       ),
+                       'prop' => array(
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_TYPE => array(
+                                       'url',
+                                       'langname',
+                                       'autonym',
+                               )
+                       ),
                        'lang' => null,
                        'title' => null,
                        'dir' => array(
@@ -143,6 +168,7 @@ class ApiQueryLangLinks extends ApiQueryBase {
                                        'descending'
                                )
                        ),
+                       'inlanguagecode' => $wgContLang->getCode(),
                );
        }
 
@@ -150,10 +176,18 @@ class ApiQueryLangLinks extends ApiQueryBase {
                return array(
                        'limit' => 'How many langlinks to return',
                        'continue' => 'When more results are available, use this to continue',
-                       'url' => 'Whether to get the full URL',
+                       'url' => "Whether to get the full URL (Cannot be used with {$this->getModulePrefix()}prop)",
+                       'prop' => array(
+                               'Which additional properties to get for each interlanguage link',
+                               ' url      - Adds the full URL',
+                               ' langname - Adds the localised language name (best effort, use CLDR extension)',
+                               "            Use {$this->getModulePrefix()}inlanguagecode to control the language",
+                               ' autonym  - Adds the native language name',
+                       ),
                        'lang' => 'Language code',
                        'title' => "Link to search for. Must be used with {$this->getModulePrefix()}lang",
                        'dir' => 'The direction in which to list',
+                       'inlanguagecode' => 'Language code for localised language names',
                );
        }
 
@@ -165,6 +199,14 @@ class ApiQueryLangLinks extends ApiQueryBase {
                                        ApiBase::PROP_TYPE => 'string',
                                        ApiBase::PROP_NULLABLE => true
                                ),
+                               'langname' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'autonym' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
                                '*' => 'string'
                        )
                );
@@ -175,9 +217,14 @@ class ApiQueryLangLinks extends ApiQueryBase {
        }
 
        public function getPossibleErrors() {
-               return array_merge( parent::getPossibleErrors(), array(
-                       array( 'missingparam', 'lang' ),
-               ) );
+               return array_merge( parent::getPossibleErrors(),
+                       $this->getRequireMaxOneParameterErrorMessages(
+                               array( 'url', 'prop' )
+                       ),
+                       array(
+                               array( 'missingparam', 'lang' ),
+                       )
+               );
        }
 
        public function getExamples() {
index bd5c512..65cb16d 100644 (file)
@@ -147,7 +147,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                                if ( !$difftoRev ) {
                                        $this->dieUsageMsg( array( 'nosuchrevid', $params['diffto'] ) );
                                }
-                               if ( !$diffToRev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
+                               if ( !$difftoRev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
                                        $this->setWarning( "Couldn't diff to r{$difftoRev->getID()}: content is hidden" );
                                        $params['diffto'] = null;
                                }
index a81a520..a078013 100644 (file)
@@ -78,6 +78,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                case 'rightsinfo':
                                        $fit = $this->appendRightsInfo( $p );
                                        break;
+                               case 'restrictions':
+                                       $fit = $this->appendRestrictions( $p );
+                                       break;
                                case 'languages':
                                        $fit = $this->appendLanguages( $p );
                                        break;
@@ -124,7 +127,11 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['mainpage'] = $mainPage->getPrefixedText();
                $data['base'] = wfExpandUrl( $mainPage->getFullURL(), PROTO_CURRENT );
                $data['sitename'] = $GLOBALS['wgSitename'];
-               $data['logo'] = $GLOBALS['wgLogo'];
+
+               // wgLogo can either be a relative or an absolute path
+               // make sure we always return an absolute path
+               $data['logo'] = wfExpandUrl( $GLOBALS['wgLogo'], PROTO_RELATIVE );
+
                $data['generator'] = "MediaWiki {$GLOBALS['wgVersion']}";
                $data['phpversion'] = phpversion();
                $data['phpsapi'] = PHP_SAPI;
@@ -250,7 +257,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                }
 
                if ( !empty( $GLOBALS['wgFavicon'] ) ) {
-                       $data['favicon'] = $GLOBALS['wgFavicon'];
+                       // wgFavicon can either be a relative or an absolute path
+                       // make sure we always return an absolute path
+                       $data['favicon'] = wfExpandUrl( $GLOBALS['wgFavicon'], PROTO_RELATIVE );
                }
 
                wfRunHooks( 'APIQuerySiteInfoGeneralInfo', array( $this, &$data ) );
@@ -556,7 +565,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                        $vcsVersion = $gitInfo->getHeadSHA1();
                                        if ( $vcsVersion !== false ) {
                                                $ret['vcs-system'] = 'git';
-                                               $ret['vcs-version'] =  $vcsVersion;
+                                               $ret['vcs-version'] = $vcsVersion;
                                                $ret['vcs-url'] = $gitInfo->getHeadViewUrl();
                                                $ret['vcs-date'] = wfTimestamp( TS_ISO_8601, $gitInfo->getHeadCommitDate() );
                                        } else {
@@ -567,12 +576,20 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                                        $ret['vcs-url'] = isset( $svnInfo['viewvc-url'] ) ? $svnInfo['viewvc-url'] : '';
                                                }
                                        }
+
                                        if ( SpecialVersion::getExtLicenseFileName( $extensionPath ) ) {
                                                $ret['license-name'] = isset( $ext['license-name'] ) ? $ext['license-name'] : '';
-                                               $ret['license'] = SpecialPage::getTitleFor( 'Version', "License/{$ext['name']}" )->getLinkURL();
+                                               $ret['license'] = SpecialPage::getTitleFor(
+                                                       'Version',
+                                                       "License/{$ext['name']}"
+                                               )->getLinkURL();
                                        }
+
                                        if ( SpecialVersion::getExtAuthorsFileName( $extensionPath ) ) {
-                                               $ret['credits'] = SpecialPage::getTitleFor( 'Version', "Credits/{$ext['name']}" )->getLinkURL();
+                                               $ret['credits'] = SpecialPage::getTitleFor(
+                                                       'Version',
+                                                       "Credits/{$ext['name']}"
+                                               )->getLinkURL();
                                        }
                                }
                                $data[] = $ret;
@@ -601,6 +618,25 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
+       protected function appendRestrictions( $property ) {
+               global $wgRestrictionTypes, $wgRestrictionLevels,
+                       $wgCascadingRestrictionLevels, $wgSemiprotectedRestrictionLevels;
+
+               $data = array(
+                       'types' => $wgRestrictionTypes,
+                       'levels' => $wgRestrictionLevels,
+                       'cascadinglevels' => $wgCascadingRestrictionLevels,
+                       'semiprotectedlevels' => $wgSemiprotectedRestrictionLevels,
+               );
+
+               $this->getResult()->setIndexedTagName( $data['types'], 'type' );
+               $this->getResult()->setIndexedTagName( $data['levels'], 'level' );
+               $this->getResult()->setIndexedTagName( $data['cascadinglevels'], 'level' );
+               $this->getResult()->setIndexedTagName( $data['semiprotectedlevels'], 'level' );
+
+               return $this->getResult()->addValue( 'query', $property, $data );
+       }
+
        public function appendLanguages( $property ) {
                $params = $this->extractRequestParams();
                $langCode = isset( $params['inlanguagecode'] ) ? $params['inlanguagecode'] : '';
@@ -723,6 +759,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                        'extensions',
                                        'fileextensions',
                                        'rightsinfo',
+                                       'restrictions',
                                        'languages',
                                        'skins',
                                        'extensiontags',
@@ -764,6 +801,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                ' extensions            - Returns extensions installed on the wiki',
                                ' fileextensions        - Returns list of file extensions allowed to be uploaded',
                                ' rightsinfo            - Returns wiki rights (license) information if available',
+                               ' restrictions          - Returns information on available restriction (protection) types',
                                ' languages             - Returns a list of languages MediaWiki supports' .
                                        "(optionally localised by using {$p}inlanguagecode)",
                                ' skins                 - Returns a list of all enabled skins',
index 7896a2c..b492d9a 100644 (file)
@@ -360,7 +360,13 @@ class ApiQueryContributions extends ApiQueryBase {
                                $vals['commenthidden'] = '';
                                $anyHidden = true;
                        }
-                       if ( Revision::userCanBitfield( $row->rev_deleted, Revision::DELETED_COMMENT, $this->getUser() ) ) {
+
+                       $userCanView = Revision::userCanBitfield(
+                               $row->rev_deleted,
+                               Revision::DELETED_COMMENT, $this->getUser()
+                       );
+
+                       if ( $userCanView ) {
                                if ( $this->fld_comment ) {
                                        $vals['comment'] = $row->rev_comment;
                                }
diff --git a/includes/api/ApiRevisionDelete.php b/includes/api/ApiRevisionDelete.php
new file mode 100644 (file)
index 0000000..05457b3
--- /dev/null
@@ -0,0 +1,254 @@
+<?php
+/**
+ * Created on Jun 25, 2013
+ *
+ * Copyright © 2013 Brad Jorsch <bjorsch@wikimedia.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.23
+ */
+
+/**
+ * API interface to RevDel. The API equivalent of Special:RevisionDelete.
+ * Requires API write mode to be enabled.
+ *
+ * @ingroup API
+ */
+class ApiRevisionDelete extends ApiBase {
+
+       public function execute() {
+               $params = $this->extractRequestParams();
+               $user = $this->getUser();
+
+               if ( !$user->isAllowed( RevisionDeleter::getRestriction( $params['type'] ) ) ) {
+                       $this->dieUsageMsg( 'badaccess-group0' );
+               }
+
+               if ( !$params['ids'] ) {
+                       $this->dieUsage( "At least one value is required for 'ids'", 'badparams' );
+               }
+
+               $hide = $params['hide'] ?: array();
+               $show = $params['show'] ?: array();
+               if ( array_intersect( $hide, $show ) ) {
+                       $this->dieUsage( "Mutually exclusive values for 'hide' and 'show'", 'badparams' );
+               } elseif ( !$hide && !$show ) {
+                       $this->dieUsage( "At least one value is required for 'hide' or 'show'", 'badparams' );
+               }
+               $bits = array(
+                       'content' => RevisionDeleter::getRevdelConstant( $params['type'] ),
+                       'comment' => Revision::DELETED_COMMENT,
+                       'user' => Revision::DELETED_USER,
+               );
+               $bitfield = array();
+               foreach ( $bits as $key => $bit ) {
+                       if ( in_array( $key, $hide ) ) {
+                               $bitfield[$bit] = 1;
+                       } elseif ( in_array( $key, $show ) ) {
+                               $bitfield[$bit] = 0;
+                       } else {
+                               $bitfield[$bit] = -1;
+                       }
+               }
+
+               if ( $params['suppress'] === 'yes' ) {
+                       if ( !$user->isAllowed( 'suppressrevision' ) ) {
+                               $this->dieUsageMsg( 'badaccess-group0' );
+                       }
+                       $bitfield[Revision::DELETED_RESTRICTED] = 1;
+               } elseif ( $params['suppress'] === 'no' ) {
+                       $bitfield[Revision::DELETED_RESTRICTED] = 0;
+               } else {
+                       $bitfield[Revision::DELETED_RESTRICTED] = -1;
+               }
+
+               $targetObj = null;
+               if ( $params['target'] ) {
+                       $targetObj = Title::newFromText( $params['target'] );
+               }
+               $targetObj = RevisionDeleter::suggestTarget( $params['type'], $targetObj, $params['ids'] );
+               if ( $targetObj === null ) {
+                       $this->dieUsage( 'A target title is required for this RevDel type', 'needtarget' );
+               }
+
+               $list = RevisionDeleter::createList(
+                       $params['type'], $this->getContext(), $targetObj, $params['ids']
+               );
+               $status = $list->setVisibility(
+                       array( 'value' => $bitfield, 'comment' => $params['reason'], 'perItemStatus' => true )
+               );
+
+               $result = $this->getResult();
+               $data = $this->extractStatusInfo( $status );
+               $data['target'] = $targetObj->getFullText();
+               $data['items'] = array();
+
+               foreach ( $status->itemStatuses as $id => $s ) {
+                       $data['items'][$id] = $this->extractStatusInfo( $s );
+                       $data['items'][$id]['id'] = $id;
+               }
+
+               $list->reloadFromMaster();
+               // @codingStandardsIgnoreStart Avoid function calls in a FOR loop test part
+               for ( $item = $list->reset(); $list->current(); $item = $list->next() ) {
+                       $data['items'][$item->getId()] += $item->getApiData( $this->getResult() );
+               }
+               // @codingStandardsIgnoreEnd
+
+               $data['items'] = array_values( $data['items'] );
+               $result->setIndexedTagName( $data['items'], 'i' );
+               $result->addValue( null, $this->getModuleName(), $data );
+       }
+
+       private function extractStatusInfo( $status ) {
+               $ret = array(
+                       'status' => $status->isOK() ? 'Success' : 'Fail',
+               );
+               $errors = $this->formatStatusMessages( $status->getErrorsByType( 'error' ) );
+               if ( $errors ) {
+                       $this->getResult()->setIndexedTagName( $errors, 'e' );
+                       $ret['errors'] = $errors;
+               }
+               $warnings = $this->formatStatusMessages( $status->getErrorsByType( 'warning' ) );
+               if ( $warnings ) {
+                       $this->getResult()->setIndexedTagName( $warnings, 'w' );
+                       $ret['warnings'] = $warnings;
+               }
+
+               return $ret;
+       }
+
+       private function formatStatusMessages( $messages ) {
+               if ( !$messages ) {
+                       return array();
+               }
+               $result = $this->getResult();
+               $ret = array();
+               foreach ( $messages as $m ) {
+                       $message = array();
+                       if ( $m['message'] instanceof Message ) {
+                               $msg = $m['message'];
+                               $message = array( 'message' => $msg->getKey() );
+                               if ( $msg->getParams() ) {
+                                       $message['params'] = $msg->getParams();
+                                       $result->setIndexedTagName( $message['params'], 'p' );
+                               }
+                       } else {
+                               $message = array( 'message' => $m['message'] );
+                               $msg = wfMessage( $m['message'] );
+                               if ( isset( $m['params'] ) ) {
+                                       $message['params'] = $m['params'];
+                                       $result->setIndexedTagName( $message['params'], 'p' );
+                                       $msg->params( $m['params'] );
+                               }
+                       }
+                       $message['rendered'] = $msg->useDatabase( false )->inLanguage( 'en' )->plain();
+                       $ret[] = $message;
+               }
+
+               return $ret;
+       }
+
+       public function mustBePosted() {
+               return true;
+       }
+
+       public function isWriteMode() {
+               return true;
+       }
+
+       public function getAllowedParams() {
+               return array(
+                       'type' => array(
+                               ApiBase::PARAM_TYPE => RevisionDeleter::getTypes(),
+                               ApiBase::PARAM_REQUIRED => true
+                       ),
+                       'target' => null,
+                       'ids' => array(
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_REQUIRED => true
+                       ),
+                       'hide' => array(
+                               ApiBase::PARAM_TYPE => array( 'content', 'comment', 'user' ),
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
+                       'show' => array(
+                               ApiBase::PARAM_TYPE => array( 'content', 'comment', 'user' ),
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
+                       'suppress' => array(
+                               ApiBase::PARAM_TYPE => array( 'yes', 'no', 'nochange' ),
+                               ApiBase::PARAM_DFLT => 'nochange',
+                       ),
+                       'token' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true
+                       ),
+                       'reason' => null,
+               );
+       }
+
+       public function getParamDescription() {
+               return array(
+                       'type' => 'Type of revision deletion being performed',
+                       'target' => 'Page title for the revision deletion, if required for the type',
+                       'ids' => 'Identifiers for the revisions to be deleted',
+                       'hide' => 'What to hide for each revision',
+                       'show' => 'What to unhide for each revision',
+                       'suppress' => 'Whether to suppress data from administrators as well as others',
+                       'token' => 'A delete token previously retrieved through action=tokens',
+                       'reason' => 'Reason for the deletion/undeletion',
+               );
+       }
+
+       public function getDescription() {
+               return 'Delete/undelete revisions';
+       }
+
+       public function getPossibleErrors() {
+               return array_merge( parent::getPossibleErrors(),
+                       array(
+                               'needtarget' => 'A target title is required for this RevDel type',
+                               'badparams' => 'Bad value for some parameter',
+                       )
+               );
+       }
+
+       public function needsToken() {
+               return true;
+       }
+
+       public function getTokenSalt() {
+               return '';
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=revisiondelete&target=Main%20Page&type=revision&ids=12345&' .
+                               'hide=content&token=123ABC'
+                               => 'Hide content for revision 12345 on the Main Page',
+                       'api.php?action=revisiondelete&type=logging&ids=67890&hide=content|comment|user&' .
+                               'reason=BLP%20violation&token=123ABC'
+                               => 'Hide all data on log entry 67890 with the reason "BLP violation"',
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Revisiondelete';
+       }
+}
index 759afd7..100ee96 100644 (file)
  * @ingroup API
  */
 class ApiWatch extends ApiBase {
+       private $mPageSet = null;
 
        public function execute() {
                $user = $this->getUser();
                if ( !$user->isLoggedIn() ) {
                        $this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
                }
+
                if ( !$user->isAllowed( 'editmywatchlist' ) ) {
                        $this->dieUsage( 'You don\'t have permission to edit your watchlist', 'permissiondenied' );
                }
 
                $params = $this->extractRequestParams();
-               $title = Title::newFromText( $params['title'] );
+               $pageSet = $this->getPageSet();
+               // by default we use pageset to extract the page to work on.
+               // title is still supported for backward compatibility
+               if ( !isset( $params['title'] ) ) {
+                       $pageSet->execute();
+                       $res = $pageSet->getInvalidTitlesAndRevisions( array(
+                               'invalidTitles',
+                               'special',
+                               'missingIds',
+                               'missingRevIds',
+                               'interwikiTitles'
+                       ) );
+
+                       foreach ( $pageSet->getMissingTitles() as $title ) {
+                               $r = $this->watchTitle( $title, $user, $params );
+                               $r['missing'] = 1;
+                               $res[] = $r;
+                       }
+
+                       foreach ( $pageSet->getGoodTitles() as $title ) {
+                               $r = $this->watchTitle( $title, $user, $params );
+                               $res[] = $r;
+                       }
+                       $this->getResult()->setIndexedTagName( $res, 'w' );
+               } else {
+                       // dont allow use of old title parameter with new pageset parameters.
+                       $extraParams = array_keys( array_filter( $pageSet->extractRequestParams(), function ( $x ) {
+                               return $x !== null && $x !== false;
+                       } ) );
+
+                       if ( $extraParams ) {
+                               $p = $this->getModulePrefix();
+                               $this->dieUsage(
+                                       "The parameter {$p}title can not be used with " . implode( ", ", $extraParams ),
+                                       'invalidparammix'
+                               );
+                       }
+
+                       $title = Title::newFromText( $params['title'] );
+                       if ( !$title || !$title->isWatchable() ) {
+                               $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+                       }
+                       $res = $this->watchTitle( $title, $user, $params, true );
+               }
+               $this->getResult()->addValue( null, $this->getModuleName(), $res );
+       }
 
-               if ( !$title || !$title->isWatchable() ) {
-                       $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+       private function watchTitle( Title $title, User $user, array $params,
+               $compatibilityMode = false
+       ) {
+               if ( !$title->isWatchable() ) {
+                       return array( 'title' => $title->getPrefixedText(), 'watchable' => 0 );
                }
 
                $res = array( 'title' => $title->getPrefixedText() );
@@ -61,15 +111,19 @@ class ApiWatch extends ApiBase {
                }
 
                if ( $params['unwatch'] ) {
-                       $res['unwatched'] = '';
-                       $res['message'] = $this->msg( 'removedwatchtext', $title->getPrefixedText() )
-                               ->title( $title )->parseAsBlock();
                        $status = UnwatchAction::doUnwatch( $title, $user );
+                       if ( $status->isOK() ) {
+                               $res['unwatched'] = '';
+                               $res['message'] = $this->msg( 'removedwatchtext', $title->getPrefixedText() )
+                                       ->title( $title )->parseAsBlock();
+                       }
                } else {
-                       $res['watched'] = '';
-                       $res['message'] = $this->msg( 'addedwatchtext', $title->getPrefixedText() )
-                               ->title( $title )->parseAsBlock();
                        $status = WatchAction::doWatch( $title, $user );
+                       if ( $status->isOK() ) {
+                               $res['watched'] = '';
+                               $res['message'] = $this->msg( 'addedwatchtext', $title->getPrefixedText() )
+                                       ->title( $title )->parseAsBlock();
+                       }
                }
 
                if ( !is_null( $oldLang ) ) {
@@ -77,9 +131,25 @@ class ApiWatch extends ApiBase {
                }
 
                if ( !$status->isOK() ) {
-                       $this->dieStatus( $status );
+                       if ( $compatibilityMode ) {
+                               $this->dieStatus( $status );
+                       }
+                       $res['error'] = $this->getErrorFromStatus( $status );
                }
-               $this->getResult()->addValue( null, $this->getModuleName(), $res );
+
+               return $res;
+       }
+
+       /**
+        * Get a cached instance of an ApiPageSet object
+        * @return ApiPageSet
+        */
+       private function getPageSet() {
+               if ( $this->mPageSet === null ) {
+                       $this->mPageSet = new ApiPageSet( $this );
+               }
+
+               return $this->mPageSet;
        }
 
        public function mustBePosted() {
@@ -98,11 +168,11 @@ class ApiWatch extends ApiBase {
                return 'watch';
        }
 
-       public function getAllowedParams() {
-               return array(
+       public function getAllowedParams( $flags = 0 ) {
+               $result = array(
                        'title' => array(
                                ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
+                               ApiBase::PARAM_DEPRECATED => true
                        ),
                        'unwatch' => false,
                        'uselang' => null,
@@ -111,11 +181,18 @@ class ApiWatch extends ApiBase {
                                ApiBase::PARAM_REQUIRED => true
                        ),
                );
+               if ( $flags ) {
+                       $result += $this->getPageSet()->getFinalParams( $flags );
+               }
+
+               return $result;
        }
 
        public function getParamDescription() {
-               return array(
-                       'title' => 'The page to (un)watch',
+               $psModule = $this->getPageSet();
+
+               return $psModule->getParamDescription() + array(
+                       'title' => 'The page to (un)watch. use titles instead',
                        'unwatch' => 'If set the page will be unwatched rather than watched',
                        'uselang' => 'Language to show the message in',
                        'token' => 'A token previously acquired via prop=info',
@@ -134,7 +211,7 @@ class ApiWatch extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Add or remove a page from/to the current user\'s watchlist';
+               return 'Add or remove pages from/to the current user\'s watchlist';
        }
 
        public function getPossibleErrors() {
@@ -147,8 +224,8 @@ class ApiWatch extends ApiBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=watch&title=Main_Page' => 'Watch the page "Main Page"',
-                       'api.php?action=watch&title=Main_Page&unwatch=' => 'Unwatch the page "Main Page"',
+                       'api.php?action=watch&titles=Main_Page' => 'Watch the page "Main Page"',
+                       'api.php?action=watch&titles=Main_Page&unwatch=' => 'Unwatch the page "Main Page"',
                );
        }
 
index 2629995..3690b70 100644 (file)
@@ -166,7 +166,7 @@ class HTMLFileCache extends FileCacheBase {
                        return $text;
                }
 
-               wfDebug( __METHOD__ . "()\n", false );
+               wfDebug( __METHOD__ . "()\n", 'log' );
 
                $now = wfTimestampNow();
                if ( $this->useGzip() ) {
index cba2ba7..409160c 100644 (file)
@@ -510,9 +510,15 @@ class LocalisationCache {
        protected function readPHPFile( $_fileName, $_fileType ) {
                wfProfileIn( __METHOD__ );
                // Disable APC caching
+               wfSuppressWarnings();
                $_apcEnabled = ini_set( 'apc.cache_by_default', '0' );
+               wfRestoreWarnings();
+
                include $_fileName;
+
+               wfSuppressWarnings();
                ini_set( 'apc.cache_by_default', $_apcEnabled );
+               wfRestoreWarnings();
 
                if ( $_fileType == 'core' || $_fileType == 'extension' ) {
                        $data = compact( self::$allKeys );
@@ -553,6 +559,7 @@ class LocalisationCache {
                                unset( $data[$key] );
                        }
                }
+
                // The JSON format only supports messages, none of the other variables, so wrap the data
                return array( 'messages' => $data );
        }
@@ -569,7 +576,7 @@ class LocalisationCache {
                try {
                        $compiledRules = CLDRPluralRuleEvaluator::compile( $rules );
                } catch ( CLDRPluralRuleError $e ) {
-                       wfDebugLog( 'l10n', $e->getMessage() . "\n" );
+                       wfDebugLog( 'l10n', $e->getMessage() );
 
                        return array();
                }
index 3dee806..daaa915 100644 (file)
@@ -728,11 +728,17 @@ class MessageCache {
 
                // Normalise title-case input (with some inlining)
                $lckey = strtr( $key, ' ', '_' );
-               if ( ord( $key ) < 128 ) {
+               if ( ord( $lckey ) < 128 ) {
                        $lckey[0] = strtolower( $lckey[0] );
-                       $uckey = ucfirst( $lckey );
                } else {
                        $lckey = $wgContLang->lcfirst( $lckey );
+               }
+
+               wfRunHooks( 'MessageCache::get', array( &$lckey ) );
+
+               if ( ord( $lckey ) < 128 ) {
+                       $uckey = ucfirst( $lckey );
+               } else {
                        $uckey = $wgContLang->ucfirst( $lckey );
                }
 
index 470b150..b996894 100644 (file)
@@ -248,6 +248,7 @@ class ChangesList extends ContextSource {
        public function endRecentChangesList() {
                $out = $this->rclistOpen ? "</ul>\n" : '';
                $out .= '</div>';
+
                return $out;
        }
 
index 56630a6..9cb1146 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+
 class OldChangesList extends ChangesList {
        /**
         * Format a line using the old system (aka without any javascript).
index 271dd4a..07a9409 100644 (file)
@@ -17,6 +17,7 @@
  *
  * @file
  */
+
 class RCCacheEntry extends RecentChange {
        public $curlink;
        public $difflink;
index e71a2d5..01ad724 100644 (file)
@@ -60,8 +60,6 @@
  * temporary:       not stored in the database
  *      notificationtimestamp
  *      numberofWatchingusers
- *
- * @todo document functions and variables
  */
 class RecentChange {
        // Constants for the rc_source field.  Extensions may also have
@@ -546,7 +544,6 @@ class RecentChange {
        /**
         * Makes an entry in the database corresponding to page creation
         * Note: the title object must be loaded with the new id using resetArticleID()
-        * @todo Document parameters and return
         *
         * @param $timestamp
         * @param $title Title
index 8a6718f..9e702e3 100644 (file)
@@ -210,7 +210,7 @@ class RedisConnectionPool {
                        }
                } catch ( RedisException $e ) {
                        $this->downServers[$server] = time() + self::SERVER_DOWN_TTL;
-                       wfDebugLog( 'redis', "Redis exception connecting to $server: " . $e->getMessage() . "\n" );
+                       wfDebugLog( 'redis', "Redis exception connecting to $server: " . $e->getMessage() );
 
                        return false;
                }
@@ -277,8 +277,23 @@ class RedisConnectionPool {
         * @param string $server
         * @param RedisConnRef $cref
         * @param RedisException $e
+        * @deprecated 1.23
         */
        public function handleException( $server, RedisConnRef $cref, RedisException $e ) {
+               return $this->handleError( $cref, $e );
+       }
+
+       /**
+        * The redis extension throws an exception in response to various read, write
+        * and protocol errors. Sometimes it also closes the connection, sometimes
+        * not. The safest response for us is to explicitly destroy the connection
+        * object and let it be reopened during the next request.
+        *
+        * @param RedisConnRef $cref
+        * @param RedisException $e
+        */
+       public function handleError( RedisConnRef $cref, RedisException $e ) {
+               $server = $cref->getServer();
                wfDebugLog( 'redis', "Redis exception on server $server: " . $e->getMessage() . "\n" );
                foreach ( $this->connections[$server] as $key => $connection ) {
                        if ( $cref->isConnIdentical( $connection['conn'] ) ) {
index 067b1e4..04afdda 100644 (file)
@@ -25,9 +25,7 @@
  *
  * @since 1.23
  */
-
 abstract class Config {
-
        /**
         * @param string $name configuration variable name without prefix
         * @param string $prefix of the variable name
index 1b1cd89..e16a9ee 100644 (file)
@@ -39,6 +39,7 @@ class GlobalConfig extends Config {
         */
        public function set( $name, $value, $prefix = 'wg' ) {
                $GLOBALS[$prefix . $name] = $value;
+
                return Status::newGood();
        }
 }
index da49ced..947e348 100644 (file)
@@ -252,6 +252,10 @@ interface Content {
         * is needed, $generateHtml can be set to false; in that case,
         * $result->getText() may return null.
         *
+        * @note To control which options are used in the cache key for the
+        *       generated parser output, implementations of this method
+        *       may call ParserOutput::recordOption() on the output object.
+        *
         * @param $title Title The page title to use as a context for rendering
         * @param $revId null|int The revision being rendered (optional)
         * @param $options null|ParserOptions Any parser options
index 200d453..7c51345 100644 (file)
@@ -942,7 +942,7 @@ abstract class ContentHandler {
        }
 
        /**
-        * Get parser options suitable for rendering the primary article wikitext
+        * Get parser options suitable for rendering and caching the article
         *
         * @param IContextSource|User|string $context One of the following:
         *        - IContextSource: Use the User and the Language of the provided
@@ -952,8 +952,6 @@ abstract class ContentHandler {
         *        - 'canonical': Canonical options (anonymous user with default
         *                                            preferences and content language).
         *
-        * @param IContextSource|User|string $context
-        *
         * @throws MWException
         * @return ParserOptions
         */
index a92699b..f495c56 100644 (file)
@@ -202,6 +202,7 @@ class WikitextContent extends TextContent {
         */
        public function getRedirectTarget() {
                list( $title, ) = $this->getRedirectTargetAndText();
+
                return $title;
        }
 
index 978ef03..aabdd9d 100644 (file)
@@ -86,6 +86,7 @@ class RequestContext implements IContextSource {
                if ( $this->config === null ) {
                        $this->config = Config::factory();
                }
+
                return $this->config;
        }
 
index 90e658f..21c868e 100644 (file)
@@ -245,6 +245,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        protected $mTrxPreCommitCallbacks = array();
 
        protected $mTablePrefix;
+       protected $mSchema;
        protected $mFlags;
        protected $mForeign;
        protected $mErrorCount = 0;
@@ -428,6 +429,15 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                return wfSetVar( $this->mTablePrefix, $prefix );
        }
 
+       /**
+        * Get/set the db schema.
+        * @param string $schema The database schema to set, or omitted to leave it unchanged.
+        * @return string The previous db schema.
+        */
+       public function dbSchema( $schema = null ) {
+               return wfSetVar( $this->mSchema, $schema );
+       }
+
        /**
         * Set the filehandle to copy write statements to.
         *
@@ -711,7 +721,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param array $params Parameters passed from DatabaseBase::factory()
         */
        function __construct( $params = null ) {
-               global $wgDBprefix, $wgCommandLineMode, $wgDebugDBTransactions;
+               global $wgDBprefix, $wgDBmwschema, $wgCommandLineMode, $wgDebugDBTransactions;
 
                $this->mTrxAtomicLevels = new SplStack;
 
@@ -722,6 +732,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        $dbName = $params['dbname'];
                        $flags = $params['flags'];
                        $tablePrefix = $params['tablePrefix'];
+                       $schema = $params['schema'];
                        $foreign = $params['foreign'];
                } else { // legacy calling pattern
                        wfDeprecated( __METHOD__ . " method called without parameter array.", "1.23" );
@@ -732,6 +743,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        $dbName = isset( $args[3] ) ? $args[3] : false;
                        $flags = isset( $args[4] ) ? $args[4] : 0;
                        $tablePrefix = isset( $args[5] ) ? $args[5] : 'get from global';
+                       $schema = 'get from global';
                        $foreign = isset( $args[6] ) ? $args[6] : false;
                }
 
@@ -757,6 +769,13 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        $this->mTablePrefix = $tablePrefix;
                }
 
+               /** Get the database schema*/
+               if ( $schema == 'get from global' ) {
+                       $this->mSchema = $wgDBmwschema;
+               } else {
+                       $this->mSchema = $schema;
+               }
+
                $this->mForeign = $foreign;
 
                if ( $user ) {
@@ -792,7 +811,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * @param string $dbType A possible DB type
         * @param array $p An array of options to pass to the constructor.
-        *    Valid options are: host, user, password, dbname, flags, tablePrefix, driver
+        *    Valid options are: host, user, password, dbname, flags, tablePrefix, schema, driver
         * @throws MWException If the database driver or extension cannot be found
         * @return DatabaseBase|null DatabaseBase subclass or null
         */
@@ -832,6 +851,18 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                                " no viable database extension found for type '$dbType'" );
                }
 
+               // Determine schema defaults. Currently Microsoft SQL Server uses $wgDBmwschema,
+               // and everything else doesn't use a schema (e.g. null)
+               // Although postgres and oracle support schemas, we don't use them (yet)
+               // to maintain backwards compatibility
+               $defaultSchemas = array(
+                       'mysql' => null,
+                       'postgres' => null,
+                       'sqlite' => null,
+                       'oracle' => null,
+                       'mssql' => 'get from global',
+               );
+
                $class = 'Database' . ucfirst( $driver );
                if ( class_exists( $class ) && is_subclass_of( $class, 'DatabaseBase' ) ) {
                        $params = array(
@@ -841,6 +872,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                                'dbname' => isset( $p['dbname'] ) ? $p['dbname'] : false,
                                'flags' => isset( $p['flags'] ) ? $p['flags'] : 0,
                                'tablePrefix' => isset( $p['tablePrefix'] ) ? $p['tablePrefix'] : 'get from global',
+                               'schema' => isset( $p['schema'] ) ? $p['schema'] : $defaultSchemas[$dbType],
                                'foreign' => isset( $p['foreign'] ) ? $p['foreign'] : false
                        );
 
@@ -2162,7 +2194,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @return string Full database name
         */
        public function tableName( $name, $format = 'quoted' ) {
-               global $wgSharedDB, $wgSharedPrefix, $wgSharedTables;
+               global $wgSharedDB, $wgSharedPrefix, $wgSharedTables, $wgSharedSchema;
                # Skip the entire process when we have a string quoted on both ends.
                # Note that we check the end so that we will still quote any use of
                # use of `database`.table. But won't break things if someone wants
@@ -2186,10 +2218,17 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                # We reverse the explode so that database.table and table both output
                # the correct table.
                $dbDetails = explode( '.', $name, 2 );
-               if ( count( $dbDetails ) == 2 ) {
+               if ( count( $dbDetails ) == 3 ) {
+                       list( $database, $schema, $table ) = $dbDetails;
+                       # We don't want any prefix added in this case
+                       $prefix = '';
+               } elseif ( count( $dbDetails ) == 2 ) {
                        list( $database, $table ) = $dbDetails;
                        # We don't want any prefix added in this case
+                       # In dbs that support it, $database may actually be the schema
+                       # but that doesn't affect any of the functionality here
                        $prefix = '';
+                       $schema = null;
                } else {
                        list( $table ) = $dbDetails;
                        if ( $wgSharedDB !== null # We have a shared database
@@ -2198,19 +2237,30 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                                && in_array( $table, $wgSharedTables ) # A shared table is selected
                        ) {
                                $database = $wgSharedDB;
+                               $schema = $wgSharedSchema === null ? $this->mSchema : $wgSharedSchema;
                                $prefix = $wgSharedPrefix === null ? $this->mTablePrefix : $wgSharedPrefix;
                        } else {
                                $database = null;
+                               $schema = $this->mSchema; # Default schema
                                $prefix = $this->mTablePrefix; # Default prefix
                        }
                }
 
                # Quote $table and apply the prefix if not quoted.
+               # $tableName might be empty if this is called from Database::replaceVars()
                $tableName = "{$prefix}{$table}";
-               if ( $format == 'quoted' && !$this->isQuotedIdentifier( $tableName ) ) {
+               if ( $format == 'quoted' && !$this->isQuotedIdentifier( $tableName ) && $tableName !== '' ) {
                        $tableName = $this->addIdentifierQuotes( $tableName );
                }
 
+               # Quote $schema and merge it with the table name if needed
+               if ( $schema !== null ) {
+                       if ( $format == 'quoted' && !$this->isQuotedIdentifier( $schema ) ) {
+                               $schema = $this->addIdentifierQuotes( $schema );
+                       }
+                       $tableName = $schema . '.' . $tableName;
+               }
+
                # Quote $database and merge it with the table name if needed
                if ( $database !== null ) {
                        if ( $format == 'quoted' && !$this->isQuotedIdentifier( $database ) ) {
@@ -2696,7 +2746,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                if ( !count( $rows ) ) {
                        return true; // nothing to do
                }
-               $rows = is_array( reset( $rows ) ) ? $rows : array( $rows );
+
+               if ( !is_array( reset( $rows ) ) ) {
+                       $rows = array( $rows );
+               }
 
                if ( count( $uniqueIndexes ) ) {
                        $clauses = array(); // list WHERE clauses that each identify a single row
@@ -2755,7 +2808,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param string $delTable The table to delete from.
         * @param string $joinTable The other table.
         * @param string $delVar The variable to join on, in the first table.
-        * @param string$joinVar The variable to join on, in the second table.
+        * @param string $joinVar The variable to join on, in the second table.
         * @param array $conds Condition array of field names mapped to variables,
         *   ANDed together in the WHERE clause
         * @param string $fname Calling function name (use __METHOD__) for logs/profiling
index 9636da5..163554b 100644 (file)
  * @author Joel Penner <a-joelpe at microsoft dot com>
  * @author Chris Pucci <a-cpucci at microsoft dot com>
  * @author Ryan Biesemeyer <v-ryanbi at microsoft dot com>
+ * @author Ryan Schmidt <skizzerz at gmail dot com>
  */
 
 /**
  * @ingroup Database
  */
 class DatabaseMssql extends DatabaseBase {
-       /** @var resource */
+       protected $mInsertId = null;
        protected $mLastResult = null;
-
-       /** @var int The number of rows affected as an integer */
        protected $mAffectedRows = null;
+       protected $mSubqueryId = 0;
+       protected $mScrollableCursor = true;
+       protected $mPrepareStatements = true;
+       protected $mBinaryColumnCache = null;
+       protected $mBitColumnCache = null;
+       protected $mIgnoreDupKeyErrors = false;
 
-       /**
-        * @var int Post number for database
-        * @todo Unused and can be removed?
-        */
        protected $mPort;
 
-       /** @var int */
-       private $mInsertId = null;
-
-       function cascadingDeletes() {
+       public function cascadingDeletes() {
                return true;
        }
 
-       function cleanupTriggers() {
-               return true;
+       public function cleanupTriggers() {
+               return false;
        }
 
-       function strictIPs() {
-               return true;
+       public function strictIPs() {
+               return false;
        }
 
-       function realTimestamps() {
-               return true;
+       public function realTimestamps() {
+               return false;
        }
 
-       function implicitGroupby() {
+       public function implicitGroupby() {
                return false;
        }
 
-       function implicitOrderby() {
+       public function implicitOrderby() {
                return false;
        }
 
-       function functionalIndexes() {
+       public function functionalIndexes() {
                return true;
        }
 
-       function unionSupportsOrderAndLimit() {
+       public function unionSupportsOrderAndLimit() {
                return false;
        }
 
@@ -84,16 +82,17 @@ class DatabaseMssql extends DatabaseBase {
         * @throws DBConnectionError
         * @return bool|DatabaseBase|null
         */
-       function open( $server, $user, $password, $dbName ) {
+       public function open( $server, $user, $password, $dbName ) {
                # Test for driver support, to avoid suppressed fatal error
                if ( !function_exists( 'sqlsrv_connect' ) ) {
                        throw new DBConnectionError(
                                $this,
-                               "MS Sql Server Native (sqlsrv) functions missing. You can download " .
-                                       "the driver from: http://go.microsoft.com/fwlink/?LinkId=123470\n" );
+                               "Microsoft SQL Server Native (sqlsrv) functions missing.
+                               You can download the driver from: http://go.microsoft.com/fwlink/?LinkId=123470\n"
+                       );
                }
 
-               global $wgDBport;
+               global $wgDBport, $wgDBWindowsAuthentication;
 
                # e.g. the class is being loaded
                if ( !strlen( $user ) ) {
@@ -113,36 +112,19 @@ class DatabaseMssql extends DatabaseBase {
                        $connectionInfo['Database'] = $dbName;
                }
 
-               // Start NT Auth Hack
-               // Quick and dirty work around to provide NT Auth designation support.
-               // Current solution requires installer to know to input 'ntauth' for
-               // both username and password to trigger connection via NT Auth. Ugly,
-               // ugly, ugly!
-               // @todo Make this better and add NT Auth choice to MW installer when
-               // SQL Server option is chosen.
-               $ntAuthUserTest = strtolower( $user );
-               $ntAuthPassTest = strtolower( $password );
-
                // Decide which auth scenerio to use
-               if ( $ntAuthPassTest == 'ntauth' && $ntAuthUserTest == 'ntauth' ) {
-                       // Don't add credentials to $connectionInfo
-               } else {
+               // if we are using Windows auth, don't add credentials to $connectionInfo
+               if ( !$wgDBWindowsAuthentication ) {
                        $connectionInfo['UID'] = $user;
                        $connectionInfo['PWD'] = $password;
                }
-               // End NT Auth Hack
 
                wfSuppressWarnings();
                $this->mConn = sqlsrv_connect( $server, $connectionInfo );
                wfRestoreWarnings();
 
                if ( $this->mConn === false ) {
-                       wfDebug( "DB connection error\n" );
-                       wfDebug( "Server: $server, Database: $dbName, User: $user, Password: " .
-                               substr( $password, 0, 3 ) . "...\n" );
-                       wfDebug( $this->lastError() . "\n" );
-
-                       return false;
+                       throw new DBConnectionError( $this, $this->lastError() );
                }
 
                $this->mOpened = true;
@@ -159,13 +141,34 @@ class DatabaseMssql extends DatabaseBase {
                return sqlsrv_close( $this->mConn );
        }
 
+       /**
+        * @param bool|MssqlResultWrapper|resource $result
+        * @return bool|MssqlResultWrapper
+        */
+       public function resultObject( $result ) {
+               if ( empty( $result ) ) {
+                       return false;
+               } elseif ( $result instanceof MssqlResultWrapper ) {
+                       return $result;
+               } elseif ( $result === true ) {
+                       // Successful write query
+                       return $result;
+               } else {
+                       return new MssqlResultWrapper( $this, $result );
+               }
+       }
+
        /**
         * @param string $sql
         * @return bool|MssqlResult
         * @throws DBUnexpectedError
         */
        protected function doQuery( $sql ) {
-               wfDebug( "SQL: [$sql]\n" );
+               global $wgDebugDumpSql;
+               if ( $wgDebugDumpSql ) {
+                       wfDebug( "SQL: [$sql]\n" );
+               }
+               $this->offset = 0;
 
                // several extensions seem to think that all databases support limits
                // via LIMIT N after the WHERE clause well, MSSQL uses SELECT TOP N,
@@ -184,161 +187,180 @@ class DatabaseMssql extends DatabaseBase {
                }
 
                // perform query
-               $stmt = sqlsrv_query( $this->mConn, $sql );
-               if ( $stmt == false ) {
-                       $message = "A database error has occurred. Did you forget " .
-                               "to run maintenance/update.php after upgrading?  See: " .
-                               "http://www.mediawiki.org/wiki/Manual:Upgrading#Run_the_update_script\n" .
-                               "Query: " . htmlentities( $sql ) . "\n" .
-                               "Function: " . __METHOD__ . "\n";
-                       // process each error (our driver will give us an array of errors unlike other providers)
-                       foreach ( sqlsrv_errors() as $error ) {
-                               $message .= $message . "ERROR[" . $error['code'] . "] " . $error['message'] . "\n";
-                       }
 
-                       throw new DBUnexpectedError( $this, $message );
+               // SQLSRV_CURSOR_STATIC is slower than SQLSRV_CURSOR_CLIENT_BUFFERED (one of the two is
+               // needed if we want to be able to seek around the result set), however CLIENT_BUFFERED
+               // has a bug in the sqlsrv driver where wchar_t types (such as nvarchar) that are empty
+               // strings make php throw a fatal error "Severe error translating Unicode"
+               if ( $this->mScrollableCursor ) {
+                       $scrollArr = array( 'Scrollable' => SQLSRV_CURSOR_STATIC );
+               } else {
+                       $scrollArr = array();
                }
-               // remember number of rows affected
-               $this->mAffectedRows = sqlsrv_rows_affected( $stmt );
 
-               // if it is a SELECT statement, or an insert with a request to output
-               // something we want to return a row.
-               if ( ( preg_match( '#\bSELECT\s#i', $sql ) ) ||
-                       ( preg_match( '#\bINSERT\s#i', $sql ) && preg_match( '#\bOUTPUT\s+INSERTED\b#i', $sql ) )
-               ) {
-                       // this is essentially a rowset, but Mediawiki calls these 'result'
-                       // the rowset owns freeing the statement
-                       $res = new MssqlResult( $stmt );
+               if ( $this->mPrepareStatements ) {
+                       // we do prepare + execute so we can get its field metadata for later usage if desired
+                       $stmt = sqlsrv_prepare( $this->mConn, $sql, array(), $scrollArr );
+                       $success = sqlsrv_execute( $stmt );
                } else {
-                       // otherwise we simply return it was successful, failure throws an exception
-                       $res = true;
+                       $stmt = sqlsrv_query( $this->mConn, $sql, array(), $scrollArr );
+                       $success = (bool)$stmt;
                }
 
-               return $res;
-       }
+               if ( $this->mIgnoreDupKeyErrors ) {
+                       // ignore duplicate key errors, but nothing else
+                       // this emulates INSERT IGNORE in MySQL
+                       if ( $success === false ) {
+                               $errors = sqlsrv_errors( SQLSRV_ERR_ERRORS );
+                               $success = true;
+
+                               foreach ( $errors as $err ) {
+                                       if ( $err['SQLSTATE'] == '23000' && $err['code'] == '2601' ) {
+                                               continue; // duplicate key error
+                                       } elseif ( $err['SQLSTATE'] == '01000' && $err['code'] == '3621' ) {
+                                               continue; // generic "the statement has been terminated" error
+                                       }
 
-       /**
-        * @param mixed|ResultWrapper $res
-        */
-       function freeResult( $res ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
+                                       $success = false; // getting here means we got an error we weren't expecting
+                                       break;
+                               }
+
+                               if ( $success ) {
+                                       $this->mAffectedRows = 0;
+                                       return true;
+                               }
+                       }
+               }
+
+               if ( $success === false ) {
+                       return false;
                }
-               $res->free();
+               // remember number of rows affected
+               $this->mAffectedRows = sqlsrv_rows_affected( $stmt );
+
+               return $stmt;
        }
 
-       /**
-        * @param ResultWrapper|stdClass $res
-        * @return stdClass
-        */
-       function fetchObject( $res ) {
+       public function freeResult( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
-               $row = $res->fetch( 'OBJECT' );
 
-               return $row;
+               sqlsrv_free_stmt( $res );
        }
 
        /**
-        * @return string
+        * @param MssqlResultWrapper $res
+        * @return stdClass
         */
-       function getErrors() {
-               $strRet = '';
-               $retErrors = sqlsrv_errors( SQLSRV_ERR_ALL );
-               if ( $retErrors != null ) {
-                       foreach ( $retErrors as $arrError ) {
-                               $strRet .= "SQLState: " . $arrError['SQLSTATE'] . "\n";
-                               $strRet .= "Error Code: " . $arrError['code'] . "\n";
-                               $strRet .= "Message: " . $arrError['message'] . "\n";
-                       }
-               } else {
-                       $strRet = "No errors found";
-               }
-
-               return $strRet;
+       public function fetchObject( $res ) {
+               // $res is expected to be an instance of MssqlResultWrapper here
+               return $res->fetchObject();
        }
 
        /**
-        * @param resource $res
-        * @return Blob
+        * @param MssqlResultWrapper $res
+        * @return array
         */
-       function fetchRow( $res ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-               $row = $res->fetch( SQLSRV_FETCH_BOTH );
-
-               return $row;
+       public function fetchRow( $res ) {
+               return $res->fetchRow();
        }
 
        /**
         * @param mixed $res
         * @return int
         */
-       function numRows( $res ) {
+       public function numRows( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
 
-               return ( $res ) ? $res->numrows() : 0;
+               return sqlsrv_num_rows( $res );
        }
 
-       function numFields( $res ) {
+       /**
+        * @param mixed $res
+        * @return int
+        */
+       public function numFields( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
 
-               return ( $res ) ? $res->numfields() : 0;
+               return sqlsrv_num_fields( $res );
        }
 
-       function fieldName( $res, $n ) {
+       /**
+        * @param mixed $res
+        * @param int $n
+        * @return int
+        */
+       public function fieldName( $res, $n ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
 
-               return ( $res ) ? $res->fieldname( $n ) : 0;
+               $metadata = sqlsrv_field_metadata( $res );
+               return $metadata[$n]['Name'];
        }
 
        /**
         * This must be called after nextSequenceVal
         * @return int|null
         */
-       function insertId() {
+       public function insertId() {
                return $this->mInsertId;
        }
 
        /**
-        * @param mixed $res
+        * @param MssqlResultWrapper $res
         * @param int $row
         * @return bool
         */
-       function dataSeek( $res, $row ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-
-               return ( $res ) ? $res->seek( $row ) : false;
+       public function dataSeek( $res, $row ) {
+               return $res->seek( $row );
        }
 
-       function lastError() {
-               if ( $this->mConn ) {
-                       return $this->getErrors();
+       /**
+        * @return string
+        */
+       public function lastError() {
+               $strRet = '';
+               $retErrors = sqlsrv_errors( SQLSRV_ERR_ALL );
+               if ( $retErrors != null ) {
+                       foreach ( $retErrors as $arrError ) {
+                               $strRet .= $this->formatError( $arrError ) . "\n";
+                       }
                } else {
-                       return "No database connection";
+                       $strRet = "No errors found";
                }
+
+               return $strRet;
        }
 
-       function lastErrno() {
+       /**
+        * @return string
+        */
+       private function formatError( $err ) {
+               return '[SQLSTATE ' . $err['SQLSTATE'] . '][Error Code ' . $err['code'] . ']' . $err['message'];
+       }
+
+       /**
+        * @return string
+        */
+       public function lastErrno() {
                $err = sqlsrv_errors( SQLSRV_ERR_ALL );
-               if ( $err[0] ) {
+               if ( $err !== null && isset( $err[0] ) ) {
                        return $err[0]['code'];
                } else {
                        return 0;
                }
        }
 
-       function affectedRows() {
+       /**
+        * @return int
+        */
+       public function affectedRows() {
                return $this->mAffectedRows;
        }
 
@@ -357,14 +379,40 @@ class DatabaseMssql extends DatabaseBase {
         * @return mixed Database result resource (feed to Database::fetchObject
         *   or whatever), or false on failure
         */
-       function select( $table, $vars, $conds = '', $fname = __METHOD__,
+       public function select( $table, $vars, $conds = '', $fname = __METHOD__,
                $options = array(), $join_conds = array()
        ) {
                $sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
                if ( isset( $options['EXPLAIN'] ) ) {
-                       sqlsrv_query( $this->mConn, "SET SHOWPLAN_ALL ON;" );
-                       $ret = $this->query( $sql, $fname );
-                       sqlsrv_query( $this->mConn, "SET SHOWPLAN_ALL OFF;" );
+                       try {
+                               $this->mScrollableCursor = false;
+                               $this->mPrepareStatements = false;
+                               $this->query( "SET SHOWPLAN_ALL ON" );
+                               $ret = $this->query( $sql, $fname );
+                               $this->query( "SET SHOWPLAN_ALL OFF" );
+                       } catch ( DBQueryError $dqe ) {
+                               if ( isset( $options['FOR COUNT'] ) ) {
+                                       // likely don't have privs for SHOWPLAN, so run a select count instead
+                                       $this->query( "SET SHOWPLAN_ALL OFF" );
+                                       unset( $options['EXPLAIN'] );
+                                       $ret = $this->select(
+                                               $table,
+                                               'COUNT(*) AS EstimateRows',
+                                               $conds,
+                                               $fname,
+                                               $options,
+                                               $join_conds
+                                       );
+                               } else {
+                                       // someone actually wanted the query plan instead of an est row count
+                                       // let them know of the error
+                                       $this->mScrollableCursor = true;
+                                       $this->mPrepareStatements = true;
+                                       throw $dqe;
+                               }
+                       }
+                       $this->mScrollableCursor = true;
+                       $this->mPrepareStatements = true;
 
                        return $ret;
                }
@@ -385,14 +433,60 @@ class DatabaseMssql extends DatabaseBase {
         *    (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
         * @return string The SQL text
         */
-       function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__,
+       public function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__,
                $options = array(), $join_conds = array()
        ) {
                if ( isset( $options['EXPLAIN'] ) ) {
                        unset( $options['EXPLAIN'] );
                }
 
-               return parent::selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
+               $sql = parent::selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
+
+               // try to rewrite aggregations of bit columns (currently MAX and MIN)
+               if ( strpos( $sql, 'MAX(' ) !== false || strpos( $sql, 'MIN(' ) !== false ) {
+                       $bitColumns = array();
+                       if ( is_array( $table ) ) {
+                               foreach ( $table as $t ) {
+                                       $bitColumns += $this->getBitColumns( $this->tableName( $t ) );
+                               }
+                       } else {
+                               $bitColumns = $this->getBitColumns( $this->tableName( $table ) );
+                       }
+
+                       foreach ( $bitColumns as $col => $info ) {
+                               $replace = array(
+                                       "MAX({$col})" => "MAX(CAST({$col} AS tinyint))",
+                                       "MIN({$col})" => "MIN(CAST({$col} AS tinyint))",
+                               );
+                               $sql = str_replace( array_keys( $replace ), array_values( $replace ), $sql );
+                       }
+               }
+
+               return $sql;
+       }
+
+       public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds,
+               $fname = __METHOD__
+       ) {
+               $this->mScrollableCursor = false;
+               try {
+                       parent::deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname );
+               } catch( Exception $e ) {
+                       $this->mScrollableCursor = true;
+                       throw $e;
+               }
+               $this->mScrollableCursor = true;
+       }
+
+       public function delete( $table, $conds, $fname = __METHOD__ ) {
+               $this->mScrollableCursor = false;
+               try {
+                       parent::delete( $table, $conds, $fname );
+               } catch( Exception $e ) {
+                       $this->mScrollableCursor = true;
+                       throw $e;
+               }
+               $this->mScrollableCursor = true;
        }
 
        /**
@@ -408,16 +502,18 @@ class DatabaseMssql extends DatabaseBase {
         * @param array $options
         * @return int
         */
-       function estimateRowCount( $table, $vars = '*', $conds = '',
+       public function estimateRowCount( $table, $vars = '*', $conds = '',
                $fname = __METHOD__, $options = array()
        ) {
                // http://msdn2.microsoft.com/en-us/library/aa259203.aspx
                $options['EXPLAIN'] = true;
+               $options['FOR COUNT'] = true;
                $res = $this->select( $table, $vars, $conds, $fname, $options );
 
                $rows = -1;
                if ( $res ) {
                        $row = $this->fetchRow( $res );
+
                        if ( isset( $row['EstimateRows'] ) ) {
                                $rows = $row['EstimateRows'];
                        }
@@ -434,7 +530,7 @@ class DatabaseMssql extends DatabaseBase {
         * @param string $fname
         * @return array|bool|null
         */
-       function indexInfo( $table, $index, $fname = __METHOD__ ) {
+       public function indexInfo( $table, $index, $fname = __METHOD__ ) {
                # This does not return the same info as MYSQL would, but that's OK
                # because MediaWiki never uses the returned value except to check for
                # the existance of indexes.
@@ -481,7 +577,7 @@ class DatabaseMssql extends DatabaseBase {
         * @throws DBQueryError
         * @return bool
         */
-       function insert( $table, $arrToInsert, $fname = __METHOD__, $options = array() ) {
+       public function insert( $table, $arrToInsert, $fname = __METHOD__, $options = array() ) {
                # No rows to insert, easy just return now
                if ( !count( $arrToInsert ) ) {
                        return true;
@@ -497,21 +593,24 @@ class DatabaseMssql extends DatabaseBase {
                        $arrToInsert = array( 0 => $arrToInsert ); // make everything multi row compatible
                }
 
-               $allOk = true;
-
                // We know the table we're inserting into, get its identity column
                $identity = null;
-               // strip matching square brackets from table name
-               $tableRaw = preg_replace( '#\[([^\]]*)\]#', '$1', $table );
+               // strip matching square brackets and the db/schema from table name
+               $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
+               $tableRaw = array_pop( $tableRawArr );
                $res = $this->doQuery(
                        "SELECT NAME AS idColumn FROM SYS.IDENTITY_COLUMNS " .
                                "WHERE OBJECT_NAME(OBJECT_ID)='{$tableRaw}'"
                );
-               if ( $res && $res->numrows() ) {
+               if ( $res && sqlsrv_has_rows( $res ) ) {
                        // There is an identity for this table.
-                       $identity = array_pop( $res->fetch( SQLSRV_FETCH_ASSOC ) );
+                       $identityArr = sqlsrv_fetch_array( $res, SQLSRV_FETCH_ASSOC );
+                       $identity = array_pop( $identityArr );
                }
-               unset( $res );
+               sqlsrv_free_stmt( $res );
+
+               // Determine binary/varbinary fields so we can encode data as a hex string like 0xABCDEF
+               $binaryColumns = $this->getBinaryColumns( $table );
 
                foreach ( $arrToInsert as $a ) {
                        // start out with empty identity column, this is so we can return
@@ -526,11 +625,13 @@ class DatabaseMssql extends DatabaseBase {
                                foreach ( $a as $k => $v ) {
                                        if ( $k == $identity ) {
                                                if ( !is_null( $v ) ) {
-                                                       // there is a value being passed to us, we need to turn on and off inserted identity
+                                                       // there is a value being passed to us,
+                                                       // we need to turn on and off inserted identity
                                                        $sqlPre = "SET IDENTITY_INSERT $table ON;";
                                                        $sqlPost = ";SET IDENTITY_INSERT $table OFF;";
                                                } else {
-                                                       // we can't insert NULL into an identity column, so remove the column from the insert.
+                                                       // we can't insert NULL into an identity column,
+                                                       // so remove the column from the insert.
                                                        unset( $a[$k] );
                                                }
                                        }
@@ -545,21 +646,9 @@ class DatabaseMssql extends DatabaseBase {
                        // INSERT IGNORE is not supported by SQL Server
                        // remove IGNORE from options list and set ignore flag to true
                        $ignoreClause = false;
-                       foreach ( $options as $k => $v ) {
-                               if ( strtoupper( $v ) == "IGNORE" ) {
-                                       unset( $options[$k] );
-                                       $ignoreClause = true;
-                               }
-                       }
-
-                       // translate MySQL INSERT IGNORE to something SQL Server can use
-                       // example:
-                       // MySQL: INSERT IGNORE INTO user_groups (ug_user,ug_group) VALUES ('1','sysop')
-                       // MSSQL: IF NOT EXISTS (SELECT * FROM user_groups WHERE ug_user = '1')
-                       //        INSERT INTO user_groups (ug_user,ug_group) VALUES ('1','sysop')
-                       if ( $ignoreClause ) {
-                               $prival = $a[$keys[0]];
-                               $sqlPre .= "IF NOT EXISTS (SELECT * FROM $table WHERE $keys[0] = '$prival')";
+                       if ( in_array( 'IGNORE', $options ) ) {
+                               $options = array_diff( $options, array( 'IGNORE' ) );
+                               $this->mIgnoreDupKeyErrors = true;
                        }
 
                        // Build the actual query
@@ -567,48 +656,49 @@ class DatabaseMssql extends DatabaseBase {
                                " INTO $table (" . implode( ',', $keys ) . ") $identityClause VALUES (";
 
                        $first = true;
-                       foreach ( $a as $value ) {
+                       foreach ( $a as $key => $value ) {
+                               if ( isset( $binaryColumns[$key] ) ) {
+                                       $value = new MssqlBlob( $value );
+                               }
                                if ( $first ) {
                                        $first = false;
                                } else {
                                        $sql .= ',';
                                }
-                               if ( is_string( $value ) ) {
-                                       $sql .= $this->addQuotes( $value );
-                               } elseif ( is_null( $value ) ) {
+                               if ( is_null( $value ) ) {
                                        $sql .= 'null';
                                } elseif ( is_array( $value ) || is_object( $value ) ) {
-                                       if ( is_object( $value ) && strtolower( get_class( $value ) ) == 'blob' ) {
+                                       if ( is_object( $value ) && $value instanceof Blob ) {
                                                $sql .= $this->addQuotes( $value );
                                        } else {
                                                $sql .= $this->addQuotes( serialize( $value ) );
                                        }
                                } else {
-                                       $sql .= $value;
+                                       $sql .= $this->addQuotes( $value );
                                }
                        }
                        $sql .= ')' . $sqlPost;
 
                        // Run the query
-                       $ret = sqlsrv_query( $this->mConn, $sql );
-
-                       if ( $ret === false ) {
-                               throw new DBQueryError( $this, $this->getErrors(), $this->lastErrno(), $sql, $fname );
-                       } elseif ( $ret != null ) {
-                               // remember number of rows affected
-                               $this->mAffectedRows = sqlsrv_rows_affected( $ret );
-                               if ( !is_null( $identity ) ) {
-                                       // then we want to get the identity column value we were assigned and save it off
-                                       $row = sqlsrv_fetch_object( $ret );
-                                       $this->mInsertId = $row->$identity;
-                               }
-                               sqlsrv_free_stmt( $ret );
-                               continue;
+                       $this->mScrollableCursor = false;
+                       try {
+                               $ret = $this->query( $sql );
+                       } catch ( Exception $e ) {
+                               $this->mScrollableCursor = true;
+                               $this->mIgnoreDupKeyErrors = false;
+                               throw $e;
+                       }
+                       $this->mScrollableCursor = true;
+                       $this->mIgnoreDupKeyErrors = false;
+
+                       if ( !is_null( $identity ) ) {
+                               // then we want to get the identity column value we were assigned and save it off
+                               $row = $ret->fetchObject();
+                               $this->mInsertId = $row->$identity;
                        }
-                       $allOk = false;
                }
 
-               return $allOk;
+               return $ret;
        }
 
        /**
@@ -626,69 +716,154 @@ class DatabaseMssql extends DatabaseBase {
         * @throws DBQueryError
         * @return null|ResultWrapper
         */
-       function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
-               $insertOptions = array(), $selectOptions = array() ) {
-               $ret = parent::insertSelect(
-                       $destTable,
-                       $srcTable,
-                       $varMap,
-                       $conds,
-                       $fname,
-                       $insertOptions,
-                       $selectOptions
-               );
-
-               if ( $ret === false ) {
-                       throw new DBQueryError( $this, $this->getErrors(), $this->lastErrno(), /*$sql*/ '', $fname );
-               } elseif ( $ret != null ) {
-                       // remember number of rows affected
-                       // @todo FIXME: $ret type does not appear to be a resource
-                       $this->mAffectedRows = sqlsrv_rows_affected( $ret );
-
-                       return $ret;
+       public function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
+               $insertOptions = array(), $selectOptions = array()
+       ) {
+               $this->mScrollableCursor = false;
+               try {
+                       $ret = parent::insertSelect(
+                               $destTable,
+                               $srcTable,
+                               $varMap,
+                               $conds,
+                               $fname,
+                               $insertOptions,
+                               $selectOptions
+                       );
+               } catch( Exception $e ) {
+                       $this->mScrollableCursor = true;
+                       throw $e;
                }
+               $this->mScrollableCursor = true;
 
-               return null;
+               return $ret;
        }
 
        /**
-        * Return the next in a sequence, save the value for retrieval via insertId()
-        * @param string $seqName
-        * @return int|null
+        * UPDATE wrapper. Takes a condition array and a SET array.
+        *
+        * @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,
+        *                the key gives the field name, and the value gives the data
+        *                to set that field to. The data will be quoted by
+        *                DatabaseBase::addQuotes().
+        *
+        * @param array $conds An array of conditions (WHERE). See
+        *                DatabaseBase::select() for the details of the format of
+        *                condition arrays. Use '*' to update all rows.
+        *
+        * @param string $fname The function name of the caller (from __METHOD__),
+        *                for logging and profiling.
+        *
+        * @param array $options An array of UPDATE options, can be:
+        *                   - IGNORE: Ignore unique key conflicts
+        *                   - LOW_PRIORITY: MySQL-specific, see MySQL manual.
+        * @return bool
         */
-       function nextSequenceValue( $seqName ) {
-               if ( !$this->tableExists( 'sequence_' . $seqName ) ) {
-                       sqlsrv_query(
-                               $this->mConn,
-                               "CREATE TABLE [sequence_$seqName] (id INT NOT NULL IDENTITY PRIMARY KEY, junk varchar(10) NULL)"
-                       );
-               }
-               sqlsrv_query( $this->mConn, "INSERT INTO [sequence_$seqName] (junk) VALUES ('')" );
-               $ret = sqlsrv_query( $this->mConn, "SELECT TOP 1 id FROM [sequence_$seqName] ORDER BY id DESC" );
-               // KEEP ASSOC THERE, weird weird bug dealing with the return value if you don't
-               $row = sqlsrv_fetch_array( $ret, SQLSRV_FETCH_ASSOC );
+       function update( $table, $values, $conds, $fname = __METHOD__, $options = array() ) {
+               $table = $this->tableName( $table );
+               $binaryColumns = $this->getBinaryColumns( $table );
+
+               $opts = $this->makeUpdateOptions( $options );
+               $sql = "UPDATE $opts $table SET " . $this->makeList( $values, LIST_SET, $binaryColumns );
 
-               sqlsrv_free_stmt( $ret );
-               $this->mInsertId = $row['id'];
+               if ( $conds !== array() && $conds !== '*' ) {
+                       $sql .= " WHERE " . $this->makeList( $conds, LIST_AND, $binaryColumns );
+               }
 
-               return $row['id'];
+               $this->mScrollableCursor = false;
+               try {
+                       $ret = $this->query( $sql );
+               } catch ( Exception $e ) {
+                       $this->mScrollableCursor = true;
+                       throw $e;
+               }
+               $this->mScrollableCursor = true;
+               return true;
        }
 
        /**
-        * Return the current value of a sequence. Assumes it has ben nextval'ed in this session.
-        * @param string $seqName
-        * @return int|null
+        * Makes an encoded list of strings from an array
+        * @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
+        *        the documentation for $conds in DatabaseBase::select().
+        *      - LIST_OR:             ORed WHERE clause (without the WHERE)
+        *      - LIST_SET:            comma separated with field names, like a SET clause
+        *      - LIST_NAMES:          comma separated field names
+        * @param array $binaryColumns Contains a list of column names that are binary types
+        *      This is a custom parameter only present for MS SQL.
+        *
+        * @throws MWException|DBUnexpectedError
+        * @return string
         */
-       function currentSequenceValue( $seqName ) {
-               $ret = sqlsrv_query( $this->mConn, "SELECT TOP 1 id FROM [sequence_$seqName] ORDER BY id DESC" );
-               if ( $ret !== false ) {
-                       $row = sqlsrv_fetch_array( $ret );
-                       sqlsrv_free_stmt( $ret );
+       public function makeList( $a, $mode = LIST_COMMA, $binaryColumns = array() ) {
+               if ( !is_array( $a ) ) {
+                       throw new DBUnexpectedError( $this,
+                               'DatabaseBase::makeList called with incorrect parameters' );
+               }
 
-                       return $row['id'];
-               } else {
-                       return $this->nextSequenceValue( $seqName );
+               $first = true;
+               $list = '';
+
+               foreach ( $a as $field => $value ) {
+                       if ( $mode != LIST_NAMES && isset( $binaryColumns[$field] ) ) {
+                               if ( is_array( $value ) ) {
+                                       foreach ( $value as &$v ) {
+                                               $v = new MssqlBlob( $v );
+                                       }
+                               } else {
+                                       $value = new MssqlBlob( $value );
+                               }
+                       }
+
+                       if ( !$first ) {
+                               if ( $mode == LIST_AND ) {
+                                       $list .= ' AND ';
+                               } elseif ( $mode == LIST_OR ) {
+                                       $list .= ' OR ';
+                               } else {
+                                       $list .= ',';
+                               }
+                       } else {
+                               $first = false;
+                       }
+
+                       if ( ( $mode == LIST_AND || $mode == LIST_OR ) && is_numeric( $field ) ) {
+                               $list .= "($value)";
+                       } elseif ( ( $mode == LIST_SET ) && is_numeric( $field ) ) {
+                               $list .= "$value";
+                       } elseif ( ( $mode == LIST_AND || $mode == LIST_OR ) && is_array( $value ) ) {
+                               if ( count( $value ) == 0 ) {
+                                       throw new MWException( __METHOD__ . ": empty input for field $field" );
+                               } elseif ( count( $value ) == 1 ) {
+                                       // Special-case single values, as IN isn't terribly efficient
+                                       // Don't necessarily assume the single key is 0; we don't
+                                       // enforce linear numeric ordering on other arrays here.
+                                       $value = array_values( $value );
+                                       $list .= $field . " = " . $this->addQuotes( $value[0] );
+                               } else {
+                                       $list .= $field . " IN (" . $this->makeList( $value ) . ") ";
+                               }
+                       } elseif ( $value === null ) {
+                               if ( $mode == LIST_AND || $mode == LIST_OR ) {
+                                       $list .= "$field IS ";
+                               } elseif ( $mode == LIST_SET ) {
+                                       $list .= "$field = ";
+                               }
+                               $list .= 'NULL';
+                       } else {
+                               if ( $mode == LIST_AND || $mode == LIST_OR || $mode == LIST_SET ) {
+                                       $list .= "$field = ";
+                               }
+                               $list .= $mode == LIST_NAMES ? $value : $this->addQuotes( $value );
+                       }
                }
+
+               return $list;
        }
 
        /**
@@ -696,7 +871,7 @@ class DatabaseMssql extends DatabaseBase {
         * @param string $field
         * @return int Returns the size of a text field, or -1 for "unlimited"
         */
-       function textFieldSize( $table, $field ) {
+       public function textFieldSize( $table, $field ) {
                $table = $this->tableName( $table );
                $sql = "SELECT CHARACTER_MAXIMUM_LENGTH,DATA_TYPE FROM INFORMATION_SCHEMA.Columns
                        WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'";
@@ -719,21 +894,46 @@ class DatabaseMssql extends DatabaseBase {
         * @param bool|int $offset The SQL offset (default false)
         * @return array|string
         */
-       function limitResult( $sql, $limit, $offset = false ) {
+       public function limitResult( $sql, $limit, $offset = false ) {
                if ( $offset === false || $offset == 0 ) {
                        if ( strpos( $sql, "SELECT" ) === false ) {
                                return "TOP {$limit} " . $sql;
                        } else {
-                               return preg_replace( '/\bSELECT(\s*DISTINCT)?\b/Dsi', 'SELECT$1 TOP ' . $limit, $sql, 1 );
+                               return preg_replace( '/\bSELECT(\s+DISTINCT)?\b/Dsi',
+                                       'SELECT$1 TOP ' . $limit, $sql, 1 );
                        }
                } else {
-                       $sql = '
-                               SELECT * FROM (
-                                       SELECT sub2.*, ROW_NUMBER() OVER(ORDER BY sub2.line2) AS line3 FROM (
-                                               SELECT 1 AS line2, sub1.* FROM (' . $sql . ') AS sub1
-                                       ) as sub2
-                               ) AS sub3
-                               WHERE line3 BETWEEN ' . ( $offset + 1 ) . ' AND ' . ( $offset + $limit );
+                       // This one is fun, we need to pull out the select list as well as any ORDER BY clause
+                       $select = $orderby = array();
+                       $s1 = preg_match( '#SELECT\s+(.+?)\s+FROM#Dis', $sql, $select );
+                       $s2 = preg_match( '#(ORDER BY\s+.+?)(\s*FOR XML .*)?$#Dis', $sql, $orderby );
+                       $overOrder = $postOrder = '';
+                       $first = $offset + 1;
+                       $last = $offset + $limit;
+                       $sub1 = 'sub_' . $this->mSubqueryId;
+                       $sub2 = 'sub_' . ($this->mSubqueryId + 1);
+                       $this->mSubqueryId += 2;
+                       if ( !$s1 ) {
+                               // wat
+                               throw new DBUnexpectedError( $this, "Attempting to LIMIT a non-SELECT query\n" );
+                       }
+                       if ( !$s2 ) {
+                               // no ORDER BY
+                               $overOrder = 'ORDER BY 1';
+                       } else {
+                               if ( !isset( $orderby[2] ) || !$orderby[2] ) {
+                                       // don't need to strip it out if we're using a FOR XML clause
+                                       $sql = str_replace( $orderby[1], '', $sql );
+                               }
+                               $overOrder = $orderby[1];
+                               $postOrder = ' ' . $overOrder;
+                       }
+                       $sql = "SELECT {$select[1]}
+                                       FROM (
+                                               SELECT ROW_NUMBER() OVER({$overOrder}) AS rowNumber, *
+                                               FROM ({$sql}) {$sub1}
+                                       ) {$sub2}
+                                       WHERE rowNumber BETWEEN {$first} AND {$last}{$postOrder}";
 
                        return $sql;
                }
@@ -749,7 +949,7 @@ class DatabaseMssql extends DatabaseBase {
         * @param string $sql
         * @return array|mixed|string
         */
-       function LimitToTopN( $sql ) {
+       public function LimitToTopN( $sql ) {
                // Matches: LIMIT {[offset,] row_count | row_count OFFSET offset}
                $pattern = '/\bLIMIT\s+((([0-9]+)\s*,\s*)?([0-9]+)(\s+OFFSET\s+([0-9]+))?)/i';
                if ( preg_match( $pattern, $sql, $matches ) ) {
@@ -769,16 +969,6 @@ class DatabaseMssql extends DatabaseBase {
                return $sql;
        }
 
-       /**
-        * Timestamp in ISO 8601 format with no timezone: 1986-02-09T20:00:00Z
-        *
-        * @param int $ts Timestamp
-        * @return bool|string The same date in ISO 8601 format with no timezone or false
-        */
-       function timestamp( $ts = 0 ) {
-               return wfTimestamp( TS_ISO_8601, $ts );
-       }
-
        /**
         * @return string Wikitext of a link to the server software's web site
         */
@@ -789,7 +979,7 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * @return string Version information from the database
         */
-       function getServerVersion() {
+       public function getServerVersion() {
                $server_info = sqlsrv_server_info( $this->mConn );
                $version = 'Error';
                if ( isset( $server_info['SQLServerVersion'] ) ) {
@@ -805,11 +995,11 @@ class DatabaseMssql extends DatabaseBase {
         * @param bool $schema
         * @return bool
         */
-       function tableExists( $table, $fname = __METHOD__, $schema = false ) {
+       public function tableExists( $table, $fname = __METHOD__, $schema = false ) {
                $res = sqlsrv_query( $this->mConn, "SELECT * FROM information_schema.tables
                        WHERE table_type='BASE TABLE' AND table_name = '$table'" );
                if ( $res === false ) {
-                       print "Error in tableExists query: " . $this->getErrors();
+                       print "Error in tableExists query: " . $this->lastError();
 
                        return false;
                }
@@ -827,12 +1017,12 @@ class DatabaseMssql extends DatabaseBase {
         * @param string $fname
         * @return bool
         */
-       function fieldExists( $table, $field, $fname = __METHOD__ ) {
+       public function fieldExists( $table, $field, $fname = __METHOD__ ) {
                $table = $this->tableName( $table );
                $res = sqlsrv_query( $this->mConn, "SELECT DATA_TYPE FROM INFORMATION_SCHEMA.Columns
                        WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
                if ( $res === false ) {
-                       print "Error in fieldExists query: " . $this->getErrors();
+                       print "Error in fieldExists query: " . $this->lastError();
 
                        return false;
                }
@@ -843,12 +1033,12 @@ class DatabaseMssql extends DatabaseBase {
                }
        }
 
-       function fieldInfo( $table, $field ) {
+       public function fieldInfo( $table, $field ) {
                $table = $this->tableName( $table );
                $res = sqlsrv_query( $this->mConn, "SELECT * FROM INFORMATION_SCHEMA.Columns
                        WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
                if ( $res === false ) {
-                       print "Error in fieldInfo query: " . $this->getErrors();
+                       print "Error in fieldInfo query: " . $this->lastError();
 
                        return false;
                }
@@ -900,148 +1090,74 @@ class DatabaseMssql extends DatabaseBase {
                if ( strlen( $identifier ) > 128 ) {
                        throw new MWException( "The identifier '$identifier' is too long (max. 128)" );
                }
-               if ( ( strpos( $identifier, '[' ) !== false ) || ( strpos( $identifier, ']' ) !== false ) ) {
+               if ( ( strpos( $identifier, '[' ) !== false )
+                       || ( strpos( $identifier, ']' ) !== false )
+               ) {
                        // It may be allowed if you quoted with double quotation marks, but
                        // that would break if QUOTED_IDENTIFIER is OFF
-                       throw new MWException( "You can't use square brackers in the identifier '$identifier'" );
+                       throw new MWException( "Square brackets are not allowed in '$identifier'" );
                }
 
                return "[$identifier]";
        }
 
        /**
-        * Initial setup.
-        * Precondition: This object is connected as the superuser.
-        * Creates the database, schema, user and login.
+        * @param string $s
+        * @return string
         */
-       function initial_setup( $dbName, $newUser, $loginPassword ) {
-               $dbName = $this->escapeIdentifier( $dbName );
-
-               // It is not clear what can be used as a login,
-               // From http://msdn.microsoft.com/en-us/library/ms173463.aspx
-               // a sysname may be the same as an identifier.
-               $newUser = $this->escapeIdentifier( $newUser );
-               $loginPassword = $this->addQuotes( $loginPassword );
-
-               $this->doQuery( "CREATE DATABASE $dbName;" );
-               $this->doQuery( "USE $dbName;" );
-               $this->doQuery( "CREATE SCHEMA $dbName;" );
-               $this->doQuery( "
-                                               CREATE
-                                                       LOGIN $newUser
-                                               WITH
-                                                       PASSWORD=$loginPassword
-                                               ;
-                                       " );
-               $this->doQuery( "
-                                               CREATE
-                                                       USER $newUser
-                                               FOR
-                                                       LOGIN $newUser
-                                               WITH
-                                                       DEFAULT_SCHEMA=$dbName
-                                               ;
-                                       " );
-               $this->doQuery( "
-                                               GRANT
-                                                       BACKUP DATABASE,
-                                                       BACKUP LOG,
-                                                       CREATE DEFAULT,
-                                                       CREATE FUNCTION,
-                                                       CREATE PROCEDURE,
-                                                       CREATE RULE,
-                                                       CREATE TABLE,
-                                                       CREATE VIEW,
-                                                       CREATE FULLTEXT CATALOG
-                                               ON
-                                                       DATABASE::$dbName
-                                               TO $newUser
-                                               ;
-                                       " );
-               $this->doQuery( "
-                                               GRANT
-                                                       CONTROL
-                                               ON
-                                                       SCHEMA::$dbName
-                                               TO $newUser
-                                               ;
-                                       " );
-       }
-
-       function encodeBlob( $b ) {
-               // we can't have zero's and such, this is a simple encoding to make sure we don't barf
-               return base64_encode( $b );
-       }
-
-       function decodeBlob( $b ) {
-               // we can't have zero's and such, this is a simple encoding to make sure we don't barf
-               return base64_decode( $b );
+       public function strencode( $s ) { # Should not be called by us
+               return str_replace( "'", "''", $s );
        }
 
        /**
-        * @param array $tables
-        * @param array $use_index
-        * @param array $join_conds
+        * @param string $s
         * @return string
         */
-       protected function tableNamesWithUseIndexOrJOIN( $tables, $use_index = array(), $join_conds = array() ) {
-               $ret = array();
-               $retJOIN = array();
-               $use_index_safe = is_array( $use_index ) ? $use_index : array();
-               $join_conds_safe = is_array( $join_conds ) ? $join_conds : array();
-               foreach ( $tables as $table ) {
-                       // Is there a JOIN and INDEX clause for this table?
-                       if ( isset( $join_conds_safe[$table] ) && isset( $use_index_safe[$table] ) ) {
-                               $tableClause = $join_conds_safe[$table][0] . ' ' . $this->tableName( $table );
-                               $tableClause .= ' ' . $this->useIndexClause( implode( ',', (array)$use_index_safe[$table] ) );
-                               $tableClause .= ' ON (' . $this->makeList( (array)$join_conds_safe[$table][1], LIST_AND ) . ')';
-                               $retJOIN[] = $tableClause;
-                       // Is there an INDEX clause?
-                       } elseif ( isset( $use_index_safe[$table] ) ) {
-                               $tableClause = $this->tableName( $table );
-                               $tableClause .= ' ' . $this->useIndexClause( implode( ',', (array)$use_index_safe[$table] ) );
-                               $ret[] = $tableClause;
-                       // Is there a JOIN clause?
-                       } elseif ( isset( $join_conds_safe[$table] ) ) {
-                               $tableClause = $join_conds_safe[$table][0] . ' ' . $this->tableName( $table );
-                               $tableClause .= ' ON (' . $this->makeList( (array)$join_conds_safe[$table][1], LIST_AND ) . ')';
-                               $retJOIN[] = $tableClause;
-                       } else {
-                               $tableClause = $this->tableName( $table );
-                               $ret[] = $tableClause;
-                       }
-               }
-               // We can't separate explicit JOIN clauses with ',', use ' ' for those
-               $straightJoins = !empty( $ret ) ? implode( ',', $ret ) : "";
-               $otherJoins = !empty( $retJOIN ) ? implode( ' ', $retJOIN ) : "";
-
-               // Compile our final table clause
-               return implode( ' ', array( $straightJoins, $otherJoins ) );
-       }
-
-       function strencode( $s ) { # Should not be called by us
-               return str_replace( "'", "''", $s );
-       }
-
-       function addQuotes( $s ) {
-               if ( $s instanceof Blob ) {
-                       return "'" . $s->fetch( $s ) . "'";
+       public function addQuotes( $s ) {
+               if ( $s instanceof MssqlBlob ) {
+                       return $s->fetch();
+               } elseif ( $s instanceof Blob ) {
+                       // this shouldn't really ever be called, but it's here if needed
+                       // (and will quite possibly make the SQL error out)
+                       $blob = new MssqlBlob( $s->fetch() );
+                       return $blob->fetch();
                } else {
+                       if ( is_bool( $s ) ) {
+                               $s = $s ? 1 : 0;
+                       }
                        return parent::addQuotes( $s );
                }
        }
 
+       /**
+        * @param string $s
+        * @return string
+        */
        public function addIdentifierQuotes( $s ) {
                // http://msdn.microsoft.com/en-us/library/aa223962.aspx
                return '[' . $s . ']';
        }
 
+       /**
+        * @param string $name
+        * @return bool
+        */
        public function isQuotedIdentifier( $name ) {
-               return $name[0] == '[' && substr( $name, -1, 1 ) == ']';
+               return strlen( $name ) && $name[0] == '[' && substr( $name, -1, 1 ) == ']';
        }
 
-       function selectDB( $db ) {
-               return ( $this->query( "SET DATABASE $db" ) !== false );
+       /**
+        * @param string $db
+        * @return bool
+        */
+       public function selectDB( $db ) {
+               try {
+                       $this->mDBname = $db;
+                       $this->query( "USE $db" );
+                       return true;
+               } catch ( Exception $e ) {
+                       return false;
+               }
        }
 
        /**
@@ -1049,7 +1165,7 @@ class DatabaseMssql extends DatabaseBase {
         *   an SQL query, valid keys are listed in the function.
         * @return array
         */
-       function makeSelectOptions( $options ) {
+       public function makeSelectOptions( $options ) {
                $tailOpts = '';
                $startOpts = '';
 
@@ -1064,10 +1180,15 @@ class DatabaseMssql extends DatabaseBase {
 
                $tailOpts .= $this->makeOrderBy( $options );
 
-               if ( isset( $noKeyOptions['DISTINCT'] ) && isset( $noKeyOptions['DISTINCTROW'] ) ) {
+               if ( isset( $noKeyOptions['DISTINCT'] ) || isset( $noKeyOptions['DISTINCTROW'] ) ) {
                        $startOpts .= 'DISTINCT';
                }
 
+               if ( isset( $noKeyOptions['FOR XML'] ) ) {
+                       // used in group concat field emulation
+                       $tailOpts .= " FOR XML PATH('')";
+               }
+
                // we want this to be compatible with the output of parent::makeSelectOptions()
                return array( $startOpts, '', $tailOpts, '' );
        }
@@ -1076,25 +1197,158 @@ class DatabaseMssql extends DatabaseBase {
         * Get the type of the DBMS, as it appears in $wgDBtype.
         * @return string
         */
-       function getType() {
+       public function getType() {
                return 'mssql';
        }
 
-       function buildConcat( $stringList ) {
+       /**
+        * @param array $stringList
+        * @return string
+        */
+       public function buildConcat( $stringList ) {
                return implode( ' + ', $stringList );
        }
 
+       /**
+        * Build a GROUP_CONCAT or equivalent statement for a query.
+        * MS SQL doesn't have GROUP_CONCAT so we emulate it with other stuff (and boy is it nasty)
+        *
+        * This is useful for combining a field for several rows into a single string.
+        * NULL values will not appear in the output, duplicated values will appear,
+        * and the resulting delimiter-separated values have no defined sort order.
+        * Code using the results may need to use the PHP unique() or sort() methods.
+        *
+        * @param string $delim Glue to bind the results together
+        * @param string|array $table Table name
+        * @param string $field Field name
+        * @param string|array $conds Conditions
+        * @param string|array $join_conds Join conditions
+        * @return String SQL text
+        * @since 1.23
+        */
+       public function buildGroupConcatField( $delim, $table, $field, $conds = '',
+               $join_conds = array()
+       ) {
+               $gcsq = 'gcsq_' . $this->mSubqueryId;
+               $this->mSubqueryId++;
+
+               $delimLen = strlen( $delim );
+               $fld = "{$field} + {$this->addQuotes( $delim )}";
+               $sql = "(SELECT LEFT({$field}, LEN({$field}) - {$delimLen}) FROM ("
+                       . $this->selectSQLText( $table, $fld, $conds, null, array( 'FOR XML' ), $join_conds )
+                       . ") {$gcsq} ({$field}))";
+
+               return $sql;
+       }
+
+       /**
+        * @return string
+        */
        public function getSearchEngine() {
                return "SearchMssql";
        }
 
        /**
-        * Since MSSQL doesn't recognize the infinity keyword, set date manually.
-        * @todo Remove magic date
+        * Returns an associative array for fields that are of type varbinary, binary, or image
+        * $table can be either a raw table name or passed through tableName() first
+        * @param string $table
+        * @return array
+        */
+       private function getBinaryColumns( $table ) {
+               $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
+               $tableRaw = array_pop( $tableRawArr );
+
+               if ( $this->mBinaryColumnCache === null ) {
+                       $this->populateColumnCaches();
+               }
+
+               return isset( $this->mBinaryColumnCache[$tableRaw] )
+                       ? $this->mBinaryColumnCache[$tableRaw]
+                       : array();
+       }
+
+       /**
+        * @param string $table
+        * @return array
+        */
+       private function getBitColumns( $table ) {
+               $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
+               $tableRaw = array_pop( $tableRawArr );
+
+               if ( $this->mBitColumnCache === null ) {
+                       $this->populateColumnCaches();
+               }
+
+               return isset( $this->mBitColumnCache[$tableRaw] )
+                       ? $this->mBitColumnCache[$tableRaw]
+                       : array();
+       }
+
+       /**
+        * @void
+        */
+       private function populateColumnCaches() {
+               $res = $this->select( 'INFORMATION_SCHEMA.COLUMNS', '*',
+                       array(
+                               'TABLE_CATALOG' => $this->mDBname,
+                               'TABLE_SCHEMA' => $this->mSchema,
+                               'DATA_TYPE' => array( 'varbinary', 'binary', 'image', 'bit' )
+                       ) );
+
+               $this->mBinaryColumnCache = array();
+               $this->mBitColumnCache = array();
+               foreach ( $res as $row ) {
+                       if ( $row->DATA_TYPE == 'bit' ) {
+                               $this->mBitColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row;
+                       } else {
+                               $this->mBinaryColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row;
+                       }
+               }
+       }
+
+       /**
+        * @param string $name
+        * @param string $format
         * @return string
         */
-       public function getInfinity() {
-               return '3000-01-31 00:00:00.000';
+       function tableName( $name, $format = 'quoted' ) {
+               # Replace reserved words with better ones
+               switch ( $name ) {
+                       case 'user':
+                               return $this->realTableName( 'mwuser', $format );
+                       default:
+                               return $this->realTableName( $name, $format );
+               }
+       }
+
+       /**
+        * call this instead of tableName() in the updater when renaming tables
+        * @param string $name
+        * @param string $format
+        * @return string
+        */
+       function realTableName( $name, $format = 'quoted' ) {
+               return parent::tableName( $name, $format );
+       }
+
+       /**
+        * Called in the installer and updater.
+        * Probably doesn't need to be called anywhere else in the codebase.
+        * @param bool|null $value
+        * @return bool|null
+        */
+       public function prepareStatements( $value = null ) {
+               return wfSetVar( $this->mPrepareStatements, $value );
+       }
+
+       /**
+        * Called in the installer and updater.
+        * Probably doesn't need to be called anywhere else in the codebase.
+        * @param bool|null $value
+        * @return bool|null
+        */
+       public function scrollableCursor( $value = null ) {
+               return wfSetVar( $this->mScrollableCursor, $value );
        }
 } // end DatabaseMssql class
 
@@ -1140,232 +1394,104 @@ class MssqlField implements Field {
        }
 }
 
-/**
- * The MSSQL PHP driver doesn't support sqlsrv_num_rows, so we recall all rows
- * into an array and maintain our own cursor index into that array... This is
- * similar to the way the Oracle driver handles this same issue
- *
- * @ingroup Database
- */
-class MssqlResult {
-       /** @var int */
-       private $mCursor;
-
-       /** @var array */
-       private $mRows;
-
-       /** @var bool|int */
-       private $mNumFields;
-
-       /** @var array|bool */
-       private $mFieldMeta;
+class MssqlBlob extends Blob {
+       public function __construct( $data ) {
+               if ( $data instanceof MssqlBlob ) {
+                       return $data;
+               } elseif ( $data instanceof Blob ) {
+                       $this->mData = $data->fetch();
+               } elseif ( is_array( $data ) && is_object( $data ) ) {
+                       $this->mData = serialize( $data );
+               } else {
+                       $this->mData = $data;
+               }
+       }
 
        /**
-        * @param bool|resource $queryresult
+        * Returns an unquoted hex representation of a binary string
+        * for insertion into varbinary-type fields
+        * @return string
         */
-       public function __construct( $queryresult = false ) {
-               $this->mCursor = 0;
-               $this->mRows = array();
-               $this->mNumFields = sqlsrv_num_fields( $queryresult );
-               $this->mFieldMeta = sqlsrv_field_metadata( $queryresult );
-
-               $rows = sqlsrv_fetch_array( $queryresult, SQLSRV_FETCH_ASSOC );
-
-               foreach ( $rows as $row ) {
-                       if ( $row !== null ) {
-                               foreach ( $row as $k => $v ) {
-                                       if ( is_object( $v ) && method_exists( $v, 'format' ) ) { // DateTime Object
-                                               $row[$k] = $v->format( "Y-m-d\TH:i:s\Z" );
-                                       }
-                               }
-                               $this->mRows[] = $row; // read results into memory, cursors are not supported
-                       }
+       public function fetch() {
+               if ( $this->mData === null ) {
+                       return 'null';
+               }
+
+               $ret = '0x';
+               for ( $i = 0; $i < strlen( $this->mData ); $i++ ) {
+                       $ret .= bin2hex( pack( 'C', ord( $this->mData[$i] ) ) );
                }
-               $this->mRowCount = count( $this->mRows );
-               sqlsrv_free_stmt( $queryresult );
+
+               return $ret;
        }
+}
+
+class MssqlResultWrapper extends ResultWrapper {
+       private $mSeekTo = null;
 
        /**
-        * @param array $array
-        * @param stdClass $obj
-        * @return stdClass
+        * @return stdClass|bool
         */
-       private function array_to_obj( $array, &$obj ) {
-               foreach ( $array as $key => $value ) {
-                       if ( is_array( $value ) ) {
-                               $obj->$key = new stdClass();
-                               $this->array_to_obj( $value, $obj->$key );
-                       } else {
-                               if ( !empty( $key ) ) {
-                                       $obj->$key = $value;
-                               }
-                       }
-               }
+       public function fetchObject() {
+               $res = $this->result;
 
-               return $obj;
-       }
+               if ( $this->mSeekTo !== null ) {
+                       $result = sqlsrv_fetch_object( $res, 'stdClass', array(),
+                               SQLSRV_SCROLL_ABSOLUTE, $this->mSeekTo );
+                       $this->mSeekTo = null;
+               } else {
+                       $result = sqlsrv_fetch_object( $res );
+               }
 
-       public function fetch( $mode = SQLSRV_FETCH_BOTH, $object_class = 'stdClass' ) {
-               if ( $this->mCursor >= $this->mRowCount || $this->mRowCount == 0 ) {
+               // MediaWiki expects us to return boolean false when there are no more rows instead of null
+               if ( $result === null ) {
                        return false;
                }
-               $arrNum = array();
-               if ( $mode == SQLSRV_FETCH_NUMERIC || $mode == SQLSRV_FETCH_BOTH ) {
-                       foreach ( $this->mRows[$this->mCursor] as $value ) {
-                               $arrNum[] = $value;
-                       }
-               }
-               switch ( $mode ) {
-                       case SQLSRV_FETCH_ASSOC:
-                               $ret = $this->mRows[$this->mCursor];
-                               break;
-                       case SQLSRV_FETCH_NUMERIC:
-                               $ret = $arrNum;
-                               break;
-                       case 'OBJECT':
-                               $o = new $object_class;
-                               $ret = $this->array_to_obj( $this->mRows[$this->mCursor], $o );
-                               break;
-                       case SQLSRV_FETCH_BOTH:
-                       default:
-                               $ret = $this->mRows[$this->mCursor] + $arrNum;
-                               break;
-               }
-
-               $this->mCursor++;
 
-               return $ret;
+               return $result;
        }
 
-       public function get( $pos, $fld ) {
-               return $this->mRows[$pos][$fld];
-       }
+       /**
+        * @return array|bool
+        */
+       public function fetchRow() {
+               $res = $this->result;
 
-       public function numrows() {
-               return $this->mRowCount;
-       }
+               if ( $this->mSeekTo !== null ) {
+                       $result = sqlsrv_fetch_array( $res, SQLSRV_FETCH_BOTH,
+                               SQLSRV_SCROLL_ABSOLUTE, $this->mSeekTo );
+                       $this->mSeekTo = null;
+               } else {
+                       $result = sqlsrv_fetch_array( $res );
+               }
 
-       public function seek( $iRow ) {
-               $this->mCursor = min( $iRow, $this->mRowCount );
-       }
+               // MediaWiki expects us to return boolean false when there are no more rows instead of null
+               if ( $result === null ) {
+                       return false;
+               }
 
-       public function numfields() {
-               return $this->mNumFields;
+               return $result;
        }
 
-       public function fieldname( $nr ) {
-               $arrKeys = array_keys( $this->mRows[0] );
+       /**
+        * @param int $row
+        * @return bool
+        */
+       public function seek( $row ) {
+               $res = $this->result;
 
-               return $arrKeys[$nr];
-       }
+               // check bounds
+               $numRows = $this->db->numRows( $res );
+               $row = intval( $row );
 
-       public function fieldtype( $nr ) {
-               $i = 0;
-               $intType = -1;
-               foreach ( $this->mFieldMeta as $meta ) {
-                       if ( $nr == $i ) {
-                               $intType = $meta['Type'];
-                               break;
-                       }
-                       $i++;
-               }
-               // http://msdn.microsoft.com/en-us/library/cc296183.aspx contains type table
-               switch ( $intType ) {
-                       case SQLSRV_SQLTYPE_BIGINT:
-                               $strType = 'bigint';
-                               break;
-                       case SQLSRV_SQLTYPE_BINARY:
-                               $strType = 'binary';
-                               break;
-                       case SQLSRV_SQLTYPE_BIT:
-                               $strType = 'bit';
-                               break;
-                       case SQLSRV_SQLTYPE_CHAR:
-                               $strType = 'char';
-                               break;
-                       case SQLSRV_SQLTYPE_DATETIME:
-                               $strType = 'datetime';
-                               break;
-                       case SQLSRV_SQLTYPE_DECIMAL: // ($precision, $scale)
-                               $strType = 'decimal';
-                               break;
-                       case SQLSRV_SQLTYPE_FLOAT:
-                               $strType = 'float';
-                               break;
-                       case SQLSRV_SQLTYPE_IMAGE:
-                               $strType = 'image';
-                               break;
-                       case SQLSRV_SQLTYPE_INT:
-                               $strType = 'int';
-                               break;
-                       case SQLSRV_SQLTYPE_MONEY:
-                               $strType = 'money';
-                               break;
-                       case SQLSRV_SQLTYPE_NCHAR: // ($charCount):
-                               $strType = 'nchar';
-                               break;
-                       case SQLSRV_SQLTYPE_NUMERIC: // ($precision, $scale):
-                               $strType = 'numeric';
-                               break;
-                       case SQLSRV_SQLTYPE_NVARCHAR: // ($charCount)
-                               $strType = 'nvarchar';
-                               break;
-                       // case SQLSRV_SQLTYPE_NVARCHAR('max'):
-                       //       $strType = 'nvarchar(MAX)';
-                       //       break;
-                       case SQLSRV_SQLTYPE_NTEXT:
-                               $strType = 'ntext';
-                               break;
-                       case SQLSRV_SQLTYPE_REAL:
-                               $strType = 'real';
-                               break;
-                       case SQLSRV_SQLTYPE_SMALLDATETIME:
-                               $strType = 'smalldatetime';
-                               break;
-                       case SQLSRV_SQLTYPE_SMALLINT:
-                               $strType = 'smallint';
-                               break;
-                       case SQLSRV_SQLTYPE_SMALLMONEY:
-                               $strType = 'smallmoney';
-                               break;
-                       case SQLSRV_SQLTYPE_TEXT:
-                               $strType = 'text';
-                               break;
-                       case SQLSRV_SQLTYPE_TIMESTAMP:
-                               $strType = 'timestamp';
-                               break;
-                       case SQLSRV_SQLTYPE_TINYINT:
-                               $strType = 'tinyint';
-                               break;
-                       case SQLSRV_SQLTYPE_UNIQUEIDENTIFIER:
-                               $strType = 'uniqueidentifier';
-                               break;
-                       case SQLSRV_SQLTYPE_UDT:
-                               $strType = 'UDT';
-                               break;
-                       case SQLSRV_SQLTYPE_VARBINARY: // ($byteCount)
-                               $strType = 'varbinary';
-                               break;
-                       // case SQLSRV_SQLTYPE_VARBINARY('max'):
-                       //       $strType = 'varbinary(MAX)';
-                       //       break;
-                       case SQLSRV_SQLTYPE_VARCHAR: // ($charCount)
-                               $strType = 'varchar';
-                               break;
-                       // case SQLSRV_SQLTYPE_VARCHAR('max'):
-                       //       $strType = 'varchar(MAX)';
-                       //       break;
-                       case SQLSRV_SQLTYPE_XML:
-                               $strType = 'xml';
-                               break;
-                       default:
-                               $strType = $intType;
+               if ( $numRows === 0 ) {
+                       return false;
+               } elseif ( $row < 0 || $row > $numRows - 1 ) {
+                       return false;
                }
 
-               return $strType;
-       }
-
-       public function free() {
-               unset( $this->mRows );
+               // Unlike MySQL, the seek actually happens on the next access
+               $this->mSeekTo = $row;
+               return true;
        }
 }
index 647a42a..85be31c 100644 (file)
@@ -996,7 +996,10 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                if ( !count( $rows ) ) {
                        return true; // nothing to do
                }
-               $rows = is_array( reset( $rows ) ) ? $rows : array( $rows );
+
+               if ( !is_array( reset( $rows ) ) ) {
+                       $rows = array( $rows );
+               }
 
                $table = $this->tableName( $table );
                $columns = array_keys( $rows[0] );
index d41f3e4..e202f8a 100644 (file)
@@ -244,6 +244,7 @@ class DatabaseMysqli extends DatabaseMysqlBase {
         */
        protected function mysqlFieldType( $res, $n ) {
                $field = $res->fetch_field_direct( $n );
+
                return $field->type;
        }
 
index d304444..f8751a0 100644 (file)
@@ -220,6 +220,7 @@ class DatabaseOracle extends DatabaseBase {
                                'dbname' => isset( $args[3] ) ? $args[3] : false,
                                'flags' => isset( $args[4] ) ? $args[4] : 0,
                                'tablePrefix' => isset( $args[5] ) ? $args[5] : 'get from global',
+                               'schema' => 'get from global',
                                'foreign' => isset( $args[6] ) ? $args[6] : false
                        );
                }
index 6475c8f..c8830d3 100644 (file)
@@ -827,7 +827,9 @@ __INDEXATTR__;
         * 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.
         */
-       function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__, $options = array(), $join_conds = array() ) {
+       function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__,
+               $options = array(), $join_conds = array()
+       ) {
                if ( is_array( $options ) ) {
                        $forUpdateKey = array_search( 'FOR UPDATE', $options );
                        if ( $forUpdateKey !== false && $join_conds ) {
@@ -1063,7 +1065,7 @@ __INDEXATTR__;
 
        /**
         * Return the next in a sequence, save the value for retrieval via insertId()
-        * 
+        *
         * @param string $seqName
         * @return int|null
         */
@@ -1564,7 +1566,7 @@ SQL;
 
                if ( isset( $options['FOR UPDATE'] ) ) {
                        $postLimitTail .= ' FOR UPDATE OF ' . implode( ', ', $options['FOR UPDATE'] );
-               } else if ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
+               } elseif ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
                        $postLimitTail .= ' FOR UPDATE';
                }
 
index 5aaeb65..0fa29a1 100644 (file)
@@ -38,17 +38,14 @@ class DatabaseSqlite extends DatabaseBase {
        /** @var resource */
        protected $mLastResult;
 
-       /**
-        * @var string
-        * @todo Seems to serve no purpose. Remove?
-        */
-       private $mName;
-
        /** @var PDO */
        protected $mConn;
 
+       /** @var FSLockManager (hopefully on the same server as the DB) */
+       protected $lockMgr;
+
        function __construct( $p = null ) {
-               global $wgSharedDB;
+               global $wgSharedDB, $wgSQLiteDataDir;
 
                if ( !is_array( $p ) ) { // legacy calling pattern
                        wfDeprecated( __METHOD__ . " method called without parameter array.", "1.22" );
@@ -60,10 +57,11 @@ class DatabaseSqlite extends DatabaseBase {
                                'dbname' => isset( $args[3] ) ? $args[3] : false,
                                'flags' => isset( $args[4] ) ? $args[4] : 0,
                                'tablePrefix' => isset( $args[5] ) ? $args[5] : 'get from global',
+                               'schema' => 'get from global',
                                'foreign' => isset( $args[6] ) ? $args[6] : false
                        );
                }
-               $this->mName = $p['dbname'];
+               $this->mDBname = $p['dbname'];
                parent::__construct( $p );
                // parent doesn't open when $user is false, but we can work with $dbName
                if ( $p['dbname'] && !$this->isOpen() ) {
@@ -73,6 +71,8 @@ class DatabaseSqlite extends DatabaseBase {
                                }
                        }
                }
+
+               $this->lockMgr = new FSLockManager( array( 'lockDirectory' => "$wgSQLiteDataDir/locks" ) );
        }
 
        /**
@@ -872,6 +872,22 @@ class DatabaseSqlite extends DatabaseBase {
                return $s;
        }
 
+       public function lock( $lockName, $method, $timeout = 5 ) {
+               global $wgSQLiteDataDir;
+
+               if ( !is_dir( "$wgSQLiteDataDir/locks" ) ) { // create dir as needed
+                       if ( !is_writable( $wgSQLiteDataDir ) || !mkdir( "$wgSQLiteDataDir/locks" ) ) {
+                               throw new DBError( "Cannot create directory \"$wgSQLiteDataDir/locks\"." );
+                       }
+               }
+
+               return $this->lockMgr->lock( array( $lockName ), LockManager::LOCK_EX, $timeout )->isOK();
+       }
+
+       public function unlock( $lockName, $method ) {
+               return $this->lockMgr->unlock( array( $lockName ), LockManager::LOCK_EX )->isOK();
+       }
+
        /**
         * Build a concatenation list to feed into a SQL query
         *
index 87687db..36d218a 100644 (file)
@@ -52,7 +52,7 @@ class DBObject {
  */
 class Blob {
        /** @var string */
-       private $mData;
+       protected $mData;
 
        function __construct( $data ) {
                $this->mData = $data;
index 7d0fe34..5f880d6 100644 (file)
@@ -144,10 +144,10 @@ class LoadBalancer {
                foreach ( $lags as $i => $lag ) {
                        if ( $i != 0 ) {
                                if ( $lag === false ) {
-                                       wfDebugLog( 'replication', "Server #$i is not replicating\n" );
+                                       wfDebugLog( 'replication', "Server #$i is not replicating" );
                                        unset( $loads[$i] );
                                } elseif ( isset( $this->mServers[$i]['max lag'] ) && $lag > $this->mServers[$i]['max lag'] ) {
-                                       wfDebugLog( 'replication', "Server #$i is excessively lagged ($lag seconds)\n" );
+                                       wfDebugLog( 'replication', "Server #$i is excessively lagged ($lag seconds)" );
                                        unset( $loads[$i] );
                                }
                        }
@@ -203,7 +203,7 @@ class LoadBalancer {
                        return $this->mReadIndex;
                }
 
-               wfProfileIn( __METHOD__ );
+               $section = new ProfileSection( __METHOD__ );
 
                # Find the relevant load array
                if ( $group !== false ) {
@@ -212,7 +212,6 @@ class LoadBalancer {
                        } else {
                                # No loads for this group, return false and the caller can use some other group
                                wfDebug( __METHOD__ . ": no loads for group $group\n" );
-                               wfProfileOut( __METHOD__ );
 
                                return false;
                        }
@@ -221,7 +220,6 @@ class LoadBalancer {
                }
 
                if ( !count( $nonErrorLoads ) ) {
-                       wfProfileOut( __METHOD__ );
                        throw new MWException( "Empty server array given to LoadBalancer" );
                }
 
@@ -242,7 +240,7 @@ class LoadBalancer {
                                $i = $this->getRandomNonLagged( $currentLoads, $wiki );
                                if ( $i === false && count( $currentLoads ) != 0 ) {
                                        # All slaves lagged. Switch to read-only mode
-                                       wfDebugLog( 'replication', "All slaves lagged. Switch to read-only mode\n" );
+                                       wfDebugLog( 'replication', "All slaves lagged. Switch to read-only mode" );
                                        $wgReadOnly = 'The database has been automatically locked ' .
                                                'while the slave database servers catch up to the master';
                                        $i = ArrayUtils::pickRandom( $currentLoads );
@@ -254,20 +252,20 @@ class LoadBalancer {
                                # pickRandom() returned false
                                # This is permanent and means the configuration or the load monitor
                                # wants us to return false.
-                               wfDebugLog( 'connect', __METHOD__ . ": pickRandom() returned false\n" );
-                               wfProfileOut( __METHOD__ );
+                               wfDebugLog( 'connect', __METHOD__ . ": pickRandom() returned false" );
 
                                return false;
                        }
 
                        wfDebugLog( 'connect', __METHOD__ .
-                               ": Using reader #$i: {$this->mServers[$i]['host']}...\n" );
+                               ": Using reader #$i: {$this->mServers[$i]['host']}..." );
 
                        $conn = $this->openConnection( $i, $wiki );
                        if ( !$conn ) {
-                               wfDebugLog( 'connect', __METHOD__ . ": Failed connecting to $i/$wiki\n" );
+                               wfDebugLog( 'connect', __METHOD__ . ": Failed connecting to $i/$wiki" );
                                unset( $nonErrorLoads[$i] );
                                unset( $currentLoads[$i] );
+                               $i = false;
                                continue;
                        }
 
@@ -283,7 +281,7 @@ class LoadBalancer {
 
                # If all servers were down, quit now
                if ( !count( $nonErrorLoads ) ) {
-                       wfDebugLog( 'connect', "All servers down\n" );
+                       wfDebugLog( 'connect', "All servers down" );
                }
 
                if ( $i !== false ) {
@@ -294,11 +292,10 @@ class LoadBalancer {
                                        $this->mServers[$i]['slave pos'] = $conn->getSlavePos();
                                }
                        }
-                       if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $i !== false ) {
+                       if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $group !== false ) {
                                $this->mReadIndex = $i;
                        }
                }
-               wfProfileOut( __METHOD__ );
 
                return $i;
        }
index b6ba4f2..fa2dd99 100644 (file)
@@ -32,7 +32,7 @@ interface LoadMonitor {
         *
         * @param LoadBalancer $parent
         */
-       function __construct( $parent );
+       public function __construct( $parent );
 
        /**
         * Perform pre-connection load ratio adjustment.
@@ -40,7 +40,7 @@ interface LoadMonitor {
         * @param string|bool $group The selected query group. Default: false
         * @param string|bool $wiki Default: false
         */
-       function scaleLoads( &$loads, $group = false, $wiki = false );
+       public function scaleLoads( &$loads, $group = false, $wiki = false );
 
        /**
         * Return an estimate of replication lag for each server
@@ -50,22 +50,17 @@ interface LoadMonitor {
         *
         * @return array
         */
-       function getLagTimes( $serverIndexes, $wiki );
+       public function getLagTimes( $serverIndexes, $wiki );
 }
 
 class LoadMonitorNull implements LoadMonitor {
-       function __construct( $parent ) {
+       public function __construct( $parent ) {
        }
 
-       function scaleLoads( &$loads, $group = false, $wiki = false ) {
+       public function scaleLoads( &$loads, $group = false, $wiki = false ) {
        }
 
-       /**
-        * @param array $serverIndexes
-        * @param string $wiki
-        * @return array
-        */
-       function getLagTimes( $serverIndexes, $wiki ) {
+       public function getLagTimes( $serverIndexes, $wiki ) {
                return array_fill_keys( $serverIndexes, 0 );
        }
 }
@@ -80,33 +75,21 @@ class LoadMonitorMySQL implements LoadMonitor {
        /** @var LoadBalancer */
        public $parent;
 
-       /**
-        * @param LoadBalancer $parent
-        */
-       function __construct( $parent ) {
+       public function __construct( $parent ) {
                $this->parent = $parent;
        }
 
-       /**
-        * @param array $loads
-        * @param bool $group
-        * @param bool $wiki
-        */
-       function scaleLoads( &$loads, $group = false, $wiki = false ) {
+       public function scaleLoads( &$loads, $group = false, $wiki = false ) {
        }
 
-       /**
-        * @param array $serverIndexes
-        * @param string $wiki
-        * @return array
-        */
-       function getLagTimes( $serverIndexes, $wiki ) {
+       public function getLagTimes( $serverIndexes, $wiki ) {
                if ( count( $serverIndexes ) == 1 && reset( $serverIndexes ) == 0 ) {
                        // Single server only, just return zero without caching
                        return array( 0 => 0 );
                }
 
-               wfProfileIn( __METHOD__ );
+               $section = new ProfileSection( __METHOD__ );
+
                $expiry = 5;
                $requestRate = 10;
 
@@ -124,7 +107,6 @@ class LoadMonitorMySQL implements LoadMonitor {
                        $chance = max( 0, ( $expiry - $elapsed ) * $requestRate );
                        if ( mt_rand( 0, $chance ) != 0 ) {
                                unset( $times['timestamp'] ); // hide from caller
-                               wfProfileOut( __METHOD__ );
 
                                return $times;
                        }
@@ -142,7 +124,6 @@ class LoadMonitorMySQL implements LoadMonitor {
                } elseif ( is_array( $times ) ) {
                        # Could not acquire lock but an old cache exists, so use it
                        unset( $times['timestamp'] ); // hide from caller
-                       wfProfileOut( __METHOD__ );
 
                        return $times;
                }
@@ -163,8 +144,6 @@ class LoadMonitorMySQL implements LoadMonitor {
                $wgMemc->set( $memcKey, $times, $expiry + 10 );
                unset( $times['timestamp'] ); // hide from caller
 
-               wfProfileOut( __METHOD__ );
-
                return $times;
        }
 }
index d0f8916..d105bd0 100644 (file)
@@ -134,7 +134,7 @@ class MWDebug {
         * @since 1.19
         * @param $msg string
         * @param $callerOffset int
-        * @param $level int A PHP error level. See sendWarning()
+        * @param $level int A PHP error level. See sendMessage()
         * @param $log string: 'production' will always trigger a php error, 'auto'
         *        will trigger an error if $wgDevelopmentWarnings is true, and 'debug'
         *        will only write to the debug log(s).
@@ -154,7 +154,7 @@ class MWDebug {
 
                $callerDescription = self::getCallerDescription( $callerOffset );
 
-               self::sendWarning( $msg, $callerDescription, $level );
+               self::sendMessage( $msg, $callerDescription, 'warning', $level );
 
                if ( self::$enabled ) {
                        self::$log[] = array(
@@ -228,9 +228,10 @@ class MWDebug {
 
                if ( $sendToLog ) {
                        global $wgDevelopmentWarnings; // we could have a more specific $wgDeprecationWarnings setting.
-                       self::sendWarning(
+                       self::sendMessage(
                                $msg,
                                $callerDescription,
+                               'deprecated',
                                $wgDevelopmentWarnings ? E_USER_DEPRECATED : false
                        );
                }
@@ -287,21 +288,22 @@ class MWDebug {
        }
 
        /**
-        * Send a warning to the debug log and optionally also trigger a PHP
+        * Send a message to the debug log and optionally also trigger a PHP
         * error, depending on the $level argument.
         *
         * @param $msg string Message to send
         * @param $caller array caller description get from getCallerDescription()
+        * @param $group string log group on which to send the message
         * @param $level int|bool error level to use; set to false to not trigger an error
         */
-       private static function sendWarning( $msg, $caller, $level ) {
+       private static function sendMessage( $msg, $caller, $group, $level ) {
                $msg .= ' [Called from ' . $caller['func'] . ' in ' . $caller['file'] . ']';
 
                if ( $level !== false ) {
                        trigger_error( $msg, $level );
                }
 
-               wfDebug( "$msg\n" );
+               wfDebugLog( $group, $msg, 'log' );
        }
 
        /**
index 8c3b671..79232e5 100644 (file)
@@ -256,7 +256,7 @@ class LinksUpdate extends SqlDataUpdate {
                        $job = new RefreshLinksJob(
                                $title,
                                array(
-                                       'table'     => $table,
+                                       'table' => $table,
                                        'recursive' => true,
                                ) + Job::newRootJobParams( // "overall" refresh links job info
                                        "refreshlinks:{$table}:{$title->getPrefixedText()}"
@@ -869,8 +869,10 @@ class LinksUpdate extends SqlDataUpdate {
         */
        protected function updateLinksTimestamp() {
                if ( $this->mId ) {
+                       // The link updates made here only reflect the freshness of the parser output
+                       $timestamp = $this->mParserOutput->getCacheTime();
                        $this->mDb->update( 'page',
-                               array( 'page_links_updated' => $this->mDb->timestamp() ),
+                               array( 'page_links_updated' => $this->mDb->timestamp( $timestamp ) ),
                                array( 'page_id' => $this->mId ),
                                __METHOD__
                        );
index 85592e8..0dcff44 100644 (file)
@@ -139,7 +139,7 @@ class SquidUpdate {
                        return;
                }
 
-               wfDebugLog( 'squid', __METHOD__ . ': ' . implode( ' ', $urlArr ) . "\n" );
+               wfDebugLog( 'squid', __METHOD__ . ': ' . implode( ' ', $urlArr ) );
 
                if ( $wgHTCPRouting ) {
                        self::HTCPPurge( $urlArr );
@@ -200,7 +200,7 @@ class SquidUpdate {
                if ( !$conn ) {
                        $errstr = socket_strerror( socket_last_error() );
                        wfDebugLog( 'squid', __METHOD__ .
-                               ": Error opening UDP socket: $errstr\n" );
+                               ": Error opening UDP socket: $errstr" );
                        wfProfileOut( __METHOD__ );
 
                        return;
@@ -230,7 +230,7 @@ class SquidUpdate {
                        $conf = self::getRuleForURL( $url, $wgHTCPRouting );
                        if ( !$conf ) {
                                wfDebugLog( 'squid', __METHOD__ .
-                                       "No HTCP rule configured for URL {$url} , skipping\n" );
+                                       "No HTCP rule configured for URL {$url} , skipping" );
                                continue;
                        }
 
@@ -266,7 +266,7 @@ class SquidUpdate {
                                $htcpTransID, $htcpSpecifier, 2 );
 
                        wfDebugLog( 'squid', __METHOD__ .
-                               "Purging URL $url via HTCP\n" );
+                               "Purging URL $url via HTCP" );
                        foreach ( $conf as $subconf ) {
                                socket_sendto( $conn, $htcpPacket, $htcpLen, 0,
                                        $subconf['host'], $subconf['port'] );
index 8cfae33..d6cf694 100644 (file)
@@ -88,7 +88,7 @@ class DifferenceEngine extends ContextSource {
         */
        protected $mReducedLineNumbers = false;
 
-       /** @var string Link to action=markpatrolled  */
+       /** @var string Link to action=markpatrolled */
        protected $mMarkPatrolledLink = null;
 
        /** @var bool Show rev_deleted content if allowed */
@@ -963,7 +963,12 @@ class DifferenceEngine extends ContextSource {
                $nEdits = $this->mNewPage->countRevisionsBetween( $oldRev, $newRev );
                if ( $nEdits > 0 ) {
                        $limit = 100; // use diff-multi-manyusers if too many users
-                       $numUsers = $this->mNewPage->countAuthorsBetween( $oldRev, $newRev, $limit );
+                       $users = $this->mNewPage->getAuthorsBetween( $oldRev, $newRev, $limit );
+                       $numUsers = count( $users );
+
+                       if ( $numUsers == 1 && $users[0] == $newRev->getRawUserText() ) {
+                               $numUsers = 0; // special case to say "by the same user" instead of "by one other user"
+                       }
 
                        return self::intermediateEditsMsg( $nEdits, $numUsers, $limit );
                }
@@ -979,11 +984,13 @@ class DifferenceEngine extends ContextSource {
         * @return string
         */
        public static function intermediateEditsMsg( $numEdits, $numUsers, $limit ) {
-               if ( $numUsers > $limit ) {
+               if ( $numUsers === 0 ) {
+                       $msg = 'diff-multi-sameuser';
+               } elseif ( $numUsers > $limit ) {
                        $msg = 'diff-multi-manyusers';
                        $numUsers = $limit;
                } else {
-                       $msg = 'diff-multi';
+                       $msg = 'diff-multi-otherusers';
                }
 
                return wfMessage( $msg )->numParams( $numEdits, $numUsers )->parse();
index b7e5469..5e7b323 100644 (file)
@@ -187,27 +187,27 @@ class ExternalStoreDB extends ExternalStoreMedium {
                $cacheID = ( $itemID === false ) ? "$cluster/$id" : "$cluster/$id/";
                if ( isset( $externalBlobCache[$cacheID] ) ) {
                        wfDebugLog( 'ExternalStoreDB-cache',
-                               "ExternalStoreDB::fetchBlob cache hit on $cacheID\n" );
+                               "ExternalStoreDB::fetchBlob cache hit on $cacheID" );
 
                        return $externalBlobCache[$cacheID];
                }
 
                wfDebugLog( 'ExternalStoreDB-cache',
-                       "ExternalStoreDB::fetchBlob cache miss on $cacheID\n" );
+                       "ExternalStoreDB::fetchBlob cache miss on $cacheID" );
 
                $dbr = $this->getSlave( $cluster );
                $ret = $dbr->selectField( $this->getTable( $dbr ),
                        'blob_text', array( 'blob_id' => $id ), __METHOD__ );
                if ( $ret === false ) {
                        wfDebugLog( 'ExternalStoreDB',
-                               "ExternalStoreDB::fetchBlob master fallback on $cacheID\n" );
+                               "ExternalStoreDB::fetchBlob master fallback on $cacheID" );
                        // Try the master
                        $dbw = $this->getMaster( $cluster );
                        $ret = $dbw->selectField( $this->getTable( $dbw ),
                                'blob_text', array( 'blob_id' => $id ), __METHOD__ );
                        if ( $ret === false ) {
                                wfDebugLog( 'ExternalStoreDB',
-                                       "ExternalStoreDB::fetchBlob master failed to find $cacheID\n" );
+                                       "ExternalStoreDB::fetchBlob master failed to find $cacheID" );
                        }
                }
                if ( $itemID !== false && $ret !== false ) {
@@ -239,7 +239,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
                if ( $ids ) {
                        wfDebugLog( __CLASS__, __METHOD__ .
                                " master fallback on '$cluster' for: " .
-                               implode( ',', array_keys( $ids ) ) . "\n" );
+                               implode( ',', array_keys( $ids ) ) );
                        // Try the master
                        $dbw = $this->getMaster( $cluster );
                        $res = $dbw->select( $this->getTable( $dbr ),
@@ -247,7 +247,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
                                array( 'blob_id' => array_keys( $ids ) ),
                                __METHOD__ );
                        if ( $res === false ) {
-                               wfDebugLog( __CLASS__, __METHOD__ . " master failed on '$cluster'\n" );
+                               wfDebugLog( __CLASS__, __METHOD__ . " master failed on '$cluster'" );
                        } else {
                                $this->mergeBatchResult( $ret, $ids, $res );
                        }
@@ -255,7 +255,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
                if ( $ids ) {
                        wfDebugLog( __CLASS__, __METHOD__ .
                                " master on '$cluster' failed locating items: " .
-                               implode( ',', array_keys( $ids ) ) . "\n" );
+                               implode( ',', array_keys( $ids ) ) );
                }
 
                return $ret;
index f329b73..89ac734 100644 (file)
@@ -84,8 +84,10 @@ class ExternalStoreMwstore extends ExternalStoreMedium {
                        // Segregate items by wiki ID for the sake of bookkeeping
                        $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : wfWikiID();
 
-                       $url = $be->getContainerStoragePath( 'data' ) . '/' .
-                               rawurlencode( $wiki ) . "/{$rand[0]}/{$rand[1]}/{$rand[2]}/{$id}";
+                       $url = $be->getContainerStoragePath( 'data' ) . '/' . rawurlencode( $wiki );
+                       $url .= ( $be instanceof FSFileBackend )
+                               ? "/{$rand[0]}/{$rand[1]}/{$rand[2]}/{$id}" // keep directories small
+                               : "/{$rand[0]}/{$rand[1]}/{$id}"; // container sharding is only 2-levels
 
                        $be->prepare( array( 'dir' => dirname( $url ), 'noAccess' => 1, 'noListing' => 1 ) );
                        if ( $be->create( array( 'dst' => $url, 'content' => $data ) )->isOK() ) {
index 047aefd..34f6b51 100644 (file)
@@ -30,7 +30,7 @@ class FSFile {
        /** @var string Path to file */
        protected $path;
 
-       /** @var string File SHA-1 in base 36  */
+       /** @var string File SHA-1 in base 36 */
        protected $sha1Base36;
 
        /**
index f5d63b9..716ab6e 100644 (file)
@@ -105,7 +105,7 @@ abstract class FileBackend {
        protected $fileJournal;
 
        /** Flags for supported features */
-       const ATTR_HEADERS  = 1;
+       const ATTR_HEADERS = 1;
        const ATTR_METADATA = 2;
 
        /**
@@ -1189,9 +1189,11 @@ abstract class FileBackend {
        }
 
        /**
-        * Preload persistent file stat and property cache into in-process cache.
+        * Preload persistent file stat cache and property cache into in-process cache.
         * This should be used when stat calls will be made on a known list of a many files.
         *
+        * @see FileBackend::getFileStat()
+        *
         * @param array $paths Storage paths
         */
        public function preloadCache( array $paths ) {
@@ -1201,11 +1203,27 @@ abstract class FileBackend {
         * Invalidate any in-process file stat and property cache.
         * If $paths is given, then only the cache for those files will be cleared.
         *
+        * @see FileBackend::getFileStat()
+        *
         * @param array $paths Storage paths (optional)
         */
        public function clearCache( array $paths = null ) {
        }
 
+       /**
+        * Preload file stat information (concurrently if possible) into in-process cache.
+        * This should be used when stat calls will be made on a known list of a many files.
+        *
+        * @see FileBackend::getFileStat()
+        *
+        * @param array $params Parameters include:
+        *   - srcs        : list of source storage paths
+        *   - latest      : use the latest available data
+        * @since 1.23
+        */
+       public function preloadFileStat( array $params ) {
+       }
+
        /**
         * Lock the files at the given storage paths in the backend.
         * This will either lock all the files or none (on failure).
index 1b2860a..f00ef65 100644 (file)
@@ -45,7 +45,7 @@ class FileBackendMultiWrite extends FileBackend {
         */
        protected $backends = array();
 
-       /** @var int Index of master backend  */
+       /** @var int Index of master backend */
        protected $masterIndex = -1;
 
        /** @var int Bitfield */
@@ -569,6 +569,7 @@ class FileBackendMultiWrite extends FileBackend {
 
        public function getFileXAttributes( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+
                return $this->backends[$this->masterIndex]->getFileXAttributes( $realParams );
        }
 
@@ -661,6 +662,10 @@ class FileBackendMultiWrite extends FileBackend {
                }
        }
 
+       public function preloadFileStat( array $params ) {
+               $this->backends[$this->masterIndex]->preloadFileStat( $params );
+       }
+
        public function getScopedLocksForOps( array $ops, Status $status ) {
                $realOps = $this->substOpBatchPaths( $ops, $this->backends[$this->masterIndex] );
                $fileOps = $this->backends[$this->masterIndex]->getOperationsInternal( $realOps );
index 13f6436..9a2ebb7 100644 (file)
@@ -724,6 +724,7 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileOut( __METHOD__ . '-miss-' . $this->name );
                wfProfileOut( __METHOD__ . '-miss' );
                $this->cheapCache->set( $path, 'xattr', array( 'map' => $fields, 'latest' => $latest ) );
+
                return $fields;
        }
 
@@ -1094,9 +1095,16 @@ abstract class FileBackendStore extends FileBackend {
                        $this->clearCache();
                }
 
-               // Load from the persistent file and container caches
-               $this->primeFileCache( $performOps );
-               $this->primeContainerCache( $performOps );
+               // Build the list of paths involved
+               $paths = array();
+               foreach ( $performOps as $op ) {
+                       $paths = array_merge( $paths, $op->storagePathsRead() );
+                       $paths = array_merge( $paths, $op->storagePathsChanged() );
+               }
+               // Load from the persistent container caches
+               $this->primeContainerCache( $paths );
+               // Get the latest stat info for all the files (having locked them)
+               $this->preloadFileStat( array( 'srcs' => $paths, 'latest' => true ) );
 
                // Actually attempt the operation batch...
                $opts = $this->setConcurrencyFlags( $opts );
@@ -1271,6 +1279,63 @@ abstract class FileBackendStore extends FileBackend {
        protected function doClearCache( array $paths = null ) {
        }
 
+       final public function preloadFileStat( array $params ) {
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+
+               $params['concurrency'] = ( $this->parallelize !== 'off' ) ? $this->concurrency : 1;
+               $stats = $this->doGetFileStatMulti( $params );
+               if ( $stats === null ) {
+                       return; // not supported
+               }
+
+               $latest = !empty( $params['latest'] ); // use latest data?
+               foreach ( $stats as $path => $stat ) {
+                       $path = FileBackend::normalizeStoragePath( $path );
+                       if ( $path === null ) {
+                               continue; // this shouldn't happen
+                       }
+                       if ( is_array( $stat ) ) { // file exists
+                               $stat['latest'] = $latest;
+                               $this->cheapCache->set( $path, 'stat', $stat );
+                               $this->setFileCache( $path, $stat ); // update persistent cache
+                               if ( isset( $stat['sha1'] ) ) { // some backends store SHA-1 as metadata
+                                       $this->cheapCache->set( $path, 'sha1',
+                                               array( 'hash' => $stat['sha1'], 'latest' => $latest ) );
+                               }
+                               if ( isset( $stat['xattr'] ) ) { // some backends store headers/metadata
+                                       $stat['xattr'] = self::normalizeXAttributes( $stat['xattr'] );
+                                       $this->cheapCache->set( $path, 'xattr',
+                                               array( 'map' => $stat['xattr'], 'latest' => $latest ) );
+                               }
+                       } elseif ( $stat === false ) { // file does not exist
+                               $this->cheapCache->set( $path, 'stat',
+                                       $latest ? 'NOT_EXIST_LATEST' : 'NOT_EXIST' );
+                               $this->cheapCache->set( $path, 'xattr',
+                                       array( 'map' => false, 'latest' => $latest ) );
+                               $this->cheapCache->set( $path, 'sha1',
+                                       array( 'hash' => false, 'latest' => $latest ) );
+                               wfDebug( __METHOD__ . ": File $path does not exist.\n" );
+                       } else { // an error occurred
+                               wfDebug( __METHOD__ . ": Could not stat file $path.\n" );
+                       }
+               }
+       }
+
+       /**
+        * Get file stat information (concurrently if possible) for several files
+        *
+        * @see FileBackend::getFileStat()
+        *
+        * @param array $params Parameters include:
+        *   - srcs        : list of source storage paths
+        *   - latest      : use the latest available data
+        * @return array|null Map of storage paths to array|bool|null (returns null if not supported)
+        * @since 1.23
+        */
+       protected function doGetFileStatMulti( array $params ) {
+               return null; // not supported
+       }
+
        /**
         * Is this a key/value store where directories are just virtual?
         * Virtual directories exists in so much as files exists that are
@@ -1527,7 +1592,7 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * Do a batch lookup from cache for container stats for all containers
-        * used in a list of container names, storage paths, or FileOp objects.
+        * used in a list of container names or storage paths objects.
         * This loads the persistent cache values into the process cache.
         *
         * @param array $items
@@ -1539,10 +1604,7 @@ abstract class FileBackendStore extends FileBackend {
                $contNames = array(); // (cache key => resolved container name)
                // Get all the paths/containers from the items...
                foreach ( $items as $item ) {
-                       if ( $item instanceof FileOp ) {
-                               $paths = array_merge( $paths, $item->storagePathsRead() );
-                               $paths = array_merge( $paths, $item->storagePathsChanged() );
-                       } elseif ( self::isStoragePath( $item ) ) {
+                       if ( self::isStoragePath( $item ) ) {
                                $paths[] = $item;
                        } elseif ( is_string( $item ) ) { // full container name
                                $contNames[$this->containerCacheKey( $item )] = $item;
@@ -1628,7 +1690,7 @@ abstract class FileBackendStore extends FileBackend {
         * used in a list of storage paths or FileOp objects.
         * This loads the persistent cache values into the process cache.
         *
-        * @param array $items List of storage paths or FileOps
+        * @param array $items List of storage paths
         */
        final protected function primeFileCache( array $items ) {
                $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
@@ -1637,10 +1699,7 @@ abstract class FileBackendStore extends FileBackend {
                $pathNames = array(); // (cache key => storage path)
                // Get all the paths/containers from the items...
                foreach ( $items as $item ) {
-                       if ( $item instanceof FileOp ) {
-                               $paths = array_merge( $paths, $item->storagePathsRead() );
-                               $paths = array_merge( $paths, $item->storagePathsChanged() );
-                       } elseif ( self::isStoragePath( $item ) ) {
+                       if ( self::isStoragePath( $item ) ) {
                                $paths[] = FileBackend::normalizeStoragePath( $item );
                        }
                }
@@ -1681,12 +1740,15 @@ abstract class FileBackendStore extends FileBackend {
         */
        final protected static function normalizeXAttributes( array $xattr ) {
                $newXAttr = array( 'headers' => array(), 'metadata' => array() );
+
                foreach ( $xattr['headers'] as $name => $value ) {
                        $newXAttr['headers'][strtolower( $name )] = $value;
                }
+
                foreach ( $xattr['metadata'] as $name => $value ) {
                        $newXAttr['metadata'][strtolower( $name )] = $value;
                }
+
                return $newXAttr;
        }
 
index 32b65ba..e90fcb7 100644 (file)
@@ -55,13 +55,12 @@ class FileOpBatch {
         * @return Status
         */
        public static function attempt( array $performOps, array $opts, FileJournal $journal ) {
-               wfProfileIn( __METHOD__ );
+               $section = new ProfileSection( __METHOD__ );
                $status = Status::newGood();
 
                $n = count( $performOps );
                if ( $n > self::MAX_BATCH_SIZE ) {
                        $status->fatal( 'backend-fail-batchsize', $n, self::MAX_BATCH_SIZE );
-                       wfProfileOut( __METHOD__ );
 
                        return $status;
                }
@@ -108,8 +107,6 @@ class FileOpBatch {
                                $status->success[$index] = false;
                                ++$status->failCount;
                                if ( !$ignoreErrors ) {
-                                       wfProfileOut( __METHOD__ );
-
                                        return $status; // abort
                                }
                        }
@@ -123,8 +120,6 @@ class FileOpBatch {
                if ( count( $entries ) ) {
                        $subStatus = $journal->logChangeBatch( $entries, $batchId );
                        if ( !$subStatus->isOK() ) {
-                               wfProfileOut( __METHOD__ );
-
                                return $subStatus; // abort
                        }
                }
@@ -136,8 +131,6 @@ class FileOpBatch {
                // Attempt each operation (in parallel if allowed and possible)...
                self::runParallelBatches( $pPerformOps, $status );
 
-               wfProfileOut( __METHOD__ );
-
                return $status;
        }
 
@@ -149,9 +142,8 @@ class FileOpBatch {
         * within any given sub-batch do not depend on each other.
         * This will abort remaining ops on failure.
         *
-        * @param array $pPerformOps
+        * @param array $pPerformOps Batches of file ops (batches use original indexes)
         * @param Status $status
-        * @return bool Success
         */
        protected static function runParallelBatches( array $pPerformOps, Status $status ) {
                $aborted = false; // set to true on unexpected errors
@@ -172,12 +164,8 @@ class FileOpBatch {
                        // If attemptAsync() returns a Status, it was either due to an error
                        // or the backend does not support async ops and did it synchronously.
                        foreach ( $performOpsBatch as $i => $fileOp ) {
-                               if ( !$fileOp->failed() ) { // failed => already has Status
-                                       // If the batch is just one operation, it's faster to avoid
-                                       // pipelining as that can involve creating new TCP connections.
-                                       $subStatus = ( count( $performOpsBatch ) > 1 )
-                                               ? $fileOp->attemptAsync()
-                                               : $fileOp->attempt();
+                               if ( !isset( $status->success[$i] ) ) { // didn't already fail in precheck()
+                                       $subStatus = $fileOp->attemptAsync();
                                        if ( $subStatus->value instanceof FileBackendStoreOpHandle ) {
                                                $opHandles[$i] = $subStatus->value; // deferred
                                        } else {
@@ -189,7 +177,7 @@ class FileOpBatch {
                        $statuses = $statuses + $backend->executeOpHandlesInternal( $opHandles );
                        // Marshall and merge all the responses (blocking)...
                        foreach ( $performOpsBatch as $i => $fileOp ) {
-                               if ( !$fileOp->failed() ) { // failed => already has Status
+                               if ( !isset( $status->success[$i] ) ) { // didn't already fail in precheck()
                                        $subStatus = $statuses[$i];
                                        $status->merge( $subStatus );
                                        if ( $subStatus->isOK() ) {
@@ -203,7 +191,5 @@ class FileOpBatch {
                                }
                        }
                }
-
-               return $status;
        }
 }
index 6f40957..7c2f825 100644 (file)
@@ -45,11 +45,12 @@ class MemoryFileBackend extends FileBackendStore {
                $dst = $this->resolveHashKey( $params['dst'] );
                if ( $dst === null ) {
                        $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+
                        return $status;
                }
 
                $this->files[$dst] = array(
-                       'data'  => $params['content'],
+                       'data' => $params['content'],
                        'mtime' => wfTimestamp( TS_MW, time() )
                );
 
@@ -62,6 +63,7 @@ class MemoryFileBackend extends FileBackendStore {
                $dst = $this->resolveHashKey( $params['dst'] );
                if ( $dst === null ) {
                        $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+
                        return $status;
                }
 
@@ -70,11 +72,12 @@ class MemoryFileBackend extends FileBackendStore {
                wfRestoreWarnings();
                if ( $data === false ) { // source doesn't exist?
                        $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
+
                        return $status;
                }
 
                $this->files[$dst] = array(
-                       'data'  => $data,
+                       'data' => $data,
                        'mtime' => wfTimestamp( TS_MW, time() )
                );
 
@@ -87,12 +90,14 @@ class MemoryFileBackend extends FileBackendStore {
                $src = $this->resolveHashKey( $params['src'] );
                if ( $src === null ) {
                        $status->fatal( 'backend-fail-invalidpath', $params['src'] );
+
                        return $status;
                }
 
                $dst = $this->resolveHashKey( $params['dst'] );
                if ( $dst === null ) {
                        $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+
                        return $status;
                }
 
@@ -100,11 +105,12 @@ class MemoryFileBackend extends FileBackendStore {
                        if ( empty( $params['ignoreMissingSource'] ) ) {
                                $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
                        }
+
                        return $status;
                }
 
                $this->files[$dst] = array(
-                       'data'  => $this->files[$src]['data'],
+                       'data' => $this->files[$src]['data'],
                        'mtime' => wfTimestamp( TS_MW, time() )
                );
 
@@ -117,6 +123,7 @@ class MemoryFileBackend extends FileBackendStore {
                $src = $this->resolveHashKey( $params['src'] );
                if ( $src === null ) {
                        $status->fatal( 'backend-fail-invalidpath', $params['src'] );
+
                        return $status;
                }
 
@@ -124,6 +131,7 @@ class MemoryFileBackend extends FileBackendStore {
                        if ( empty( $params['ignoreMissingSource'] ) ) {
                                $status->fatal( 'backend-fail-delete', $params['src'] );
                        }
+
                        return $status;
                }
 
@@ -141,7 +149,7 @@ class MemoryFileBackend extends FileBackendStore {
                if ( isset( $this->files[$src] ) ) {
                        return array(
                                'mtime' => $this->files[$src]['mtime'],
-                               'size'  => strlen( $this->files[$src]['data'] ),
+                               'size' => strlen( $this->files[$src]['data'] ),
                        );
                }
 
@@ -167,6 +175,7 @@ class MemoryFileBackend extends FileBackendStore {
                        }
                        $tmpFiles[$srcPath] = $fsFile;
                }
+
                return $tmpFiles;
        }
 
@@ -176,6 +185,7 @@ class MemoryFileBackend extends FileBackendStore {
                $src = $this->resolveHashKey( $params['src'] );
                if ( $src === null || !isset( $this->files[$src] ) ) {
                        $status->fatal( 'backend-fail-stream', $params['src'] );
+
                        return $status;
                }
 
@@ -191,6 +201,7 @@ class MemoryFileBackend extends FileBackendStore {
                                return true;
                        }
                }
+
                return false;
        }
 
@@ -219,6 +230,7 @@ class MemoryFileBackend extends FileBackendStore {
                                }
                        }
                }
+
                return array_keys( $dirs );
        }
 
@@ -237,6 +249,7 @@ class MemoryFileBackend extends FileBackendStore {
                                $files[] = $relPath;
                        }
                }
+
                return $files;
        }
 
@@ -255,6 +268,7 @@ class MemoryFileBackend extends FileBackendStore {
                if ( $relPath === null ) {
                        return null; // invalid
                }
+
                return ( $relPath !== '' ) ? "$fullCont/$relPath" : $fullCont;
        }
 }
index d6bbfbe..dea1666 100644 (file)
@@ -176,7 +176,7 @@ class SwiftFileBackend extends FileBackendStore {
                $headers = array();
 
                // Normalize casing, and strip out illegal headers
-               if ( isset( $params['headers'] )  ) {
+               if ( isset( $params['headers'] ) ) {
                        foreach ( $params['headers'] as $name => $value ) {
                                $name = strtolower( $name );
                                if ( preg_match( '/^content-(type|length)$/', $name ) ) {
@@ -220,20 +220,20 @@ class SwiftFileBackend extends FileBackendStore {
                $contentType = $this->getContentType( $params['dst'], $params['content'], null );
 
                $reqs = array( array(
-                       'method'  => 'PUT',
-                       'url'     => array( $dstCont, $dstRel ),
+                       'method' => 'PUT',
+                       'url' => array( $dstCont, $dstRel ),
                        'headers' => array(
-                               'content-length'           => strlen( $params['content'] ),
-                               'etag'                     => md5( $params['content'] ),
-                               'content-type'             => $contentType,
+                               'content-length' => strlen( $params['content'] ),
+                               'etag' => md5( $params['content'] ),
+                               'content-type' => $contentType,
                                'x-object-meta-sha1base36' => $sha1Hash
                        ) + $this->sanitizeHdrs( $params ),
-                       'body'    => $params['content']
+                       'body' => $params['content']
                ) );
 
                $be = $this;
                $method = __METHOD__;
-               $handler = function( array $request, Status $status ) use ( $be, $method, $params ) {
+               $handler = function ( array $request, Status $status ) use ( $be, $method, $params ) {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
                        if ( $rcode === 201 ) {
                                // good
@@ -275,7 +275,7 @@ class SwiftFileBackend extends FileBackendStore {
                $sha1Hash = wfBaseConvert( $sha1Hash, 16, 36, 31 );
                $contentType = $this->getContentType( $params['dst'], null, $params['src'] );
 
-               $handle = fopen( $params['src'], 'rb+' );
+               $handle = fopen( $params['src'], 'rb' );
                if ( $handle === false ) { // source doesn't exist?
                        $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
 
@@ -283,20 +283,20 @@ class SwiftFileBackend extends FileBackendStore {
                }
 
                $reqs = array( array(
-                       'method'  => 'PUT',
-                       'url'     => array( $dstCont, $dstRel ),
+                       'method' => 'PUT',
+                       'url' => array( $dstCont, $dstRel ),
                        'headers' => array(
-                               'content-length'           => filesize( $params['src'] ),
-                               'etag'                     => md5_file( $params['src'] ),
-                               'content-type'             => $contentType,
+                               'content-length' => filesize( $params['src'] ),
+                               'etag' => md5_file( $params['src'] ),
+                               'content-type' => $contentType,
                                'x-object-meta-sha1base36' => $sha1Hash
                        ) + $this->sanitizeHdrs( $params ),
-                       'body'    => $handle // resource
+                       'body' => $handle // resource
                ) );
 
                $be = $this;
                $method = __METHOD__;
-               $handler = function( array $request, Status $status ) use ( $be, $method, $params ) {
+               $handler = function ( array $request, Status $status ) use ( $be, $method, $params ) {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
                        if ( $rcode === 201 ) {
                                // good
@@ -335,8 +335,8 @@ class SwiftFileBackend extends FileBackendStore {
                }
 
                $reqs = array( array(
-                       'method'  => 'PUT',
-                       'url'     => array( $dstCont, $dstRel ),
+                       'method' => 'PUT',
+                       'url' => array( $dstCont, $dstRel ),
                        'headers' => array(
                                'x-copy-from' => '/' . rawurlencode( $srcCont ) .
                                        '/' . str_replace( "%2F", "/", rawurlencode( $srcRel ) )
@@ -345,7 +345,7 @@ class SwiftFileBackend extends FileBackendStore {
 
                $be = $this;
                $method = __METHOD__;
-               $handler = function( array $request, Status $status ) use ( $be, $method, $params ) {
+               $handler = function ( array $request, Status $status ) use ( $be, $method, $params ) {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
                        if ( $rcode === 201 ) {
                                // good
@@ -385,8 +385,8 @@ class SwiftFileBackend extends FileBackendStore {
 
                $reqs = array(
                        array(
-                               'method'  => 'PUT',
-                               'url'     => array( $dstCont, $dstRel ),
+                               'method' => 'PUT',
+                               'url' => array( $dstCont, $dstRel ),
                                'headers' => array(
                                        'x-copy-from' => '/' . rawurlencode( $srcCont ) .
                                                '/' . str_replace( "%2F", "/", rawurlencode( $srcRel ) )
@@ -395,15 +395,15 @@ class SwiftFileBackend extends FileBackendStore {
                );
                if ( "{$srcCont}/{$srcRel}" !== "{$dstCont}/{$dstRel}" ) {
                        $reqs[] = array(
-                               'method'  => 'DELETE',
-                               'url'     => array( $srcCont, $srcRel ),
+                               'method' => 'DELETE',
+                               'url' => array( $srcCont, $srcRel ),
                                'headers' => array()
                        );
                }
 
                $be = $this;
                $method = __METHOD__;
-               $handler = function( array $request, Status $status ) use ( $be, $method, $params ) {
+               $handler = function ( array $request, Status $status ) use ( $be, $method, $params ) {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
                        if ( $request['method'] === 'PUT' && $rcode === 201 ) {
                                // good
@@ -436,16 +436,15 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               $reqs = array(
-                       array(
-                               'method'  => 'DELETE',
-                               'url'     => array( $srcCont, $srcRel ),
-                               'headers' => array()
+               $reqs = array( array(
+                       'method' => 'DELETE',
+                       'url' => array( $srcCont, $srcRel ),
+                       'headers' => array()
                ) );
 
                $be = $this;
                $method = __METHOD__;
-               $handler = function( array $request, Status $status ) use ( $be, $method, $params ) {
+               $handler = function ( array $request, Status $status ) use ( $be, $method, $params ) {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
                        if ( $rcode === 204 ) {
                                // good
@@ -497,14 +496,14 @@ class SwiftFileBackend extends FileBackendStore {
                $customHdrs = $this->sanitizeHdrs( $params ) + $stat['xattr']['headers'];
 
                $reqs = array( array(
-                       'method'  => 'POST',
-                       'url'     => array( $srcCont, $srcRel ),
+                       'method' => 'POST',
+                       'url' => array( $srcCont, $srcRel ),
                        'headers' => $metaHdrs + $customHdrs
                ) );
 
                $be = $this;
                $method = __METHOD__;
-               $handler = function( array $request, Status $status ) use ( $be, $method, $params ) {
+               $handler = function ( array $request, Status $status ) use ( $be, $method, $params ) {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
                        if ( $rcode === 202 ) {
                                // good
@@ -534,6 +533,7 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status; // already there
                } elseif ( $stat === null ) {
                        $status->fatal( 'backend-fail-internal', $this->name );
+
                        return $status;
                }
 
@@ -603,6 +603,7 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status; // ok, nothing to do
                } elseif ( !is_array( $stat ) ) {
                        $status->fatal( 'backend-fail-internal', $this->name );
+
                        return $status;
                }
 
@@ -616,59 +617,10 @@ class SwiftFileBackend extends FileBackendStore {
        }
 
        protected function doGetFileStat( array $params ) {
-               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
-               if ( $srcRel === null ) {
-                       return false; // invalid storage path
-               }
-
-               $auth = $this->getAuthentication();
-               if ( !$auth ) {
-                       return null;
-               }
-
-               // (a) Check the container
-               $cstat = $this->getContainerStat( $srcCont, true );
-               if ( $cstat === false ) {
-                       return false; // ok, nothing to do
-               } elseif ( !is_array( $cstat ) ) {
-                       return null;
-               }
+               $params['concurrency'] = 1;
+               $stats = $this->doGetFileStatMulti( array( 'srcs' => array( $params['src'] ) ) + $params );
 
-               // (b) Check the file
-               list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
-                       'method'  => 'HEAD',
-                       'url'     => $this->storageUrl( $auth, $srcCont, $srcRel ),
-                       'headers' => $this->authTokenHeaders( $auth ) + $this->headersFromParams( $params )
-               ) );
-               if ( $rcode === 200 || $rcode === 204 ) {
-                       // Update the object if it is missing some headers
-                       $rhdrs = $this->addMissingMetadata( $rhdrs, $params['src'] );
-                       // Fetch all of the custom metadata headers
-                       $metadata = array();
-                       foreach ( $rhdrs as $name => $value ) {
-                               if ( strpos( $name, 'x-object-meta-' ) === 0 ) {
-                                       $metadata[substr( $name, strlen( 'x-object-meta-' ) )] = $value;
-                               }
-                       }
-                       // Fetch all of the custom raw HTTP headers
-                       $headers = $this->sanitizeHdrs( array( 'headers' => $rhdrs ) );
-                       $stat = array(
-                               // Convert various random Swift dates to TS_MW
-                               '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'],
-                               'md5'   => ctype_xdigit( $rhdrs['etag'] ) ? $rhdrs['etag'] : null,
-                               'xattr' => array( 'metadata' => $metadata, 'headers' => $headers )
-                       );
-               } elseif ( $rcode === 404 ) {
-                       $stat = false;
-               } else {
-                       $stat = null;
-                       $this->onError( null, __METHOD__, $params, $rerr, $rcode, $rdesc );
-               }
-
-               return $stat;
+               return reset( $stats );
        }
 
        /**
@@ -684,6 +636,7 @@ class SwiftFileBackend extends FileBackendStore {
        protected function convertSwiftDate( $ts, $format = TS_MW ) {
                try {
                        $timestamp = new MWTimestamp( $ts );
+
                        return $timestamp->getTimestamp( $format );
                } catch ( MWException $e ) {
                        throw new FileBackendError( $e->getMessage() );
@@ -702,12 +655,13 @@ class SwiftFileBackend extends FileBackendStore {
                        return $objHdrs; // nothing to do
                }
 
-               $section = new ProfileSection( __METHOD__ );
+               $section = new ProfileSection( __METHOD__ . '-' . $this->name );
                trigger_error( "$path was not stored with SHA-1 metadata.", E_USER_WARNING );
 
                $auth = $this->getAuthentication();
                if ( !$auth ) {
                        $objHdrs['x-object-meta-sha1base36'] = false;
+
                        return $objHdrs; // failed
                }
 
@@ -721,8 +675,8 @@ class SwiftFileBackend extends FileBackendStore {
                                        $objHdrs['x-object-meta-sha1base36'] = $hash;
                                        list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $path );
                                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
-                                               'method'  => 'POST',
-                                               'url'     => $this->storageUrl( $auth, $srcCont, $srcRel ),
+                                               'method' => 'POST',
+                                               'url' => $this->storageUrl( $auth, $srcCont, $srcRel ),
                                                'headers' => $this->authTokenHeaders( $auth ) + $objHdrs
                                        ) );
                                        if ( $rcode >= 200 && $rcode <= 299 ) {
@@ -745,46 +699,42 @@ class SwiftFileBackend extends FileBackendStore {
                $ep = array_diff_key( $params, array( 'srcs' => 1 ) ); // for error logging
                // Blindly create tmp files and stream to them, catching any exception if the file does
                // not exist. Doing stats here is useless and will loop infinitely in addMissingMetadata().
-               foreach ( array_chunk( $params['srcs'], $params['concurrency'] ) as $pathBatch ) {
-                       $reqs = array(); // (path => op)
-
-                       foreach ( $pathBatch as $path ) { // each path in this concurrent batch
-                               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $path );
-                               if ( $srcRel === null || !$auth ) {
-                                       $contents[$path] = false;
-                                       continue;
-                               }
-                               $data = false;
-                               // Create a new temporary memory file...
-                               $handle = fopen( 'php://temp', 'wb' );
-                               if ( $handle ) {
-                                       $reqs[$path] = array(
-                                               'method'  => 'GET',
-                                               'url'     => $this->storageUrl( $auth, $srcCont, $srcRel ),
-                                               'headers' => $this->authTokenHeaders( $auth )
-                                                       + $this->headersFromParams( $params ),
-                                               'stream'  => $handle,
-                                       );
-                               } else {
-                                       $data = false;
-                               }
-                               $contents[$path] = $data;
+               $reqs = array(); // (path => op)
+
+               foreach ( $params['srcs'] as $path ) { // each path in this concurrent batch
+                       list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $path );
+                       if ( $srcRel === null || !$auth ) {
+                               $contents[$path] = false;
+                               continue;
+                       }
+                       // Create a new temporary memory file...
+                       $handle = fopen( 'php://temp', 'wb' );
+                       if ( $handle ) {
+                               $reqs[$path] = array(
+                                       'method'  => 'GET',
+                                       'url'     => $this->storageUrl( $auth, $srcCont, $srcRel ),
+                                       'headers' => $this->authTokenHeaders( $auth )
+                                               + $this->headersFromParams( $params ),
+                                       'stream'  => $handle,
+                               );
                        }
+                       $contents[$path] = false;
+               }
 
-                       $reqs = $this->http->runMulti( $reqs );
-                       foreach ( $reqs as $path => $op ) {
-                               list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $op['response'];
-                               if ( $rcode >= 200 && $rcode <= 299 ) {
-                                       rewind( $op['stream'] ); // start from the beginning
-                                       $contents[$path] = stream_get_contents( $op['stream'] );
-                               } elseif ( $rcode === 404 ) {
-                                       $contents[$path] = false;
-                               } else {
-                                       $this->onError( null, __METHOD__,
-                                               array( 'src' => $path ) + $ep, $rerr, $rcode, $rdesc );
-                               }
-                               fclose( $op['stream'] ); // close open handle
+               $opts = array( 'maxConnsPerHost' => $params['concurrency'] );
+               $reqs = $this->http->runMulti( $reqs, $opts );
+               foreach ( $reqs as $path => $op ) {
+                       list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $op['response'];
+                       if ( $rcode >= 200 && $rcode <= 299 ) {
+                               rewind( $op['stream'] ); // start from the beginning
+                               $contents[$path] = stream_get_contents( $op['stream'] );
+                       } elseif ( $rcode === 404 ) {
+                               $contents[$path] = false;
+                       } else {
+                               $this->onError( null, __METHOD__,
+                                       array( 'src' => $path ) + $ep, $rerr, $rcode, $rdesc );
                        }
+                       fclose( $op['stream'] ); // close open handle
                }
 
                return $contents;
@@ -796,6 +746,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( $status->isOk() ) {
                        return ( count( $status->value ) );
                }
+
                return null; // error
        }
 
@@ -853,20 +804,25 @@ class SwiftFileBackend extends FileBackendStore {
                                        $dirs[] = $object; // directories end in '/'
                                }
                        }
-               // Recursive: list all dirs under $dir and its subdirs
                } else {
-                       $getParentDir = function( $path ) {
+                       // Recursive: list all dirs under $dir and its subdirs
+                       $getParentDir = function ( $path ) {
                                return ( strpos( $path, '/' ) !== false ) ? dirname( $path ) : false;
                        };
+
                        // Get directory from last item of prior page
                        $lastDir = $getParentDir( $after ); // must be first page
                        $status = $this->objectListing( $fullCont, 'names', $limit, $after, $prefix );
+
                        if ( !$status->isOk() ) {
                                return $dirs; // error
                        }
+
                        $objects = $status->value;
+
                        foreach ( $objects as $object ) { // files
                                $objectDir = $getParentDir( $object ); // directory of object
+
                                if ( $objectDir !== false && $objectDir !== $dir ) {
                                        // Swift stores paths in UTF-8, using binary sorting.
                                        // See function "create_container_table" in common/db.py.
@@ -924,20 +880,23 @@ class SwiftFileBackend extends FileBackendStore {
                        } else {
                                $status = $this->objectListing( $fullCont, 'names', $limit, $after, $prefix, '/' );
                        }
-               // Recursive: list all files under $dir and its subdirs
                } else {
+                       // Recursive: list all files under $dir and its subdirs
                        if ( !empty( $params['adviseStat'] ) ) {
                                $status = $this->objectListing( $fullCont, 'info', $limit, $after, $prefix );
                        } else {
                                $status = $this->objectListing( $fullCont, 'names', $limit, $after, $prefix );
                        }
                }
+
                // Reformat this list into a list of (name, stat array or null) entries
                if ( !$status->isOk() ) {
                        return $files; // error
                }
+
                $objects = $status->value;
                $files = $this->buildFileObjectListing( $params, $dir, $objects );
+
                // Page on the unfiltered object listing (what is returned may be filtered)
                if ( count( $objects ) < $limit ) {
                        $after = INF; // avoid a second RTT
@@ -969,6 +928,7 @@ class SwiftFileBackend extends FileBackendStore {
                                        // Convert various random Swift dates to TS_MW
                                        'mtime'  => $this->convertSwiftDate( $object->last_modified, TS_MW ),
                                        'size'   => (int)$object->bytes,
+                                       // Note: manifiest ETags are not an MD5 of the file
                                        'md5'    => ctype_xdigit( $object->hash ) ? $object->hash : null,
                                        'latest' => false // eventually consistent
                                );
@@ -1000,6 +960,7 @@ class SwiftFileBackend extends FileBackendStore {
                                $this->clearCache( array( $params['src'] ) );
                                $stat = $this->getFileStat( $params );
                        }
+
                        return $stat['xattr'];
                } else {
                        return false;
@@ -1032,17 +993,18 @@ class SwiftFileBackend extends FileBackendStore {
                $auth = $this->getAuthentication();
                if ( !$auth || !is_array( $this->getContainerStat( $srcCont ) ) ) {
                        $status->fatal( 'backend-fail-stream', $params['src'] );
+
                        return $status;
                }
 
                $handle = fopen( 'php://output', 'wb' );
 
                list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
-                       'method'  => 'GET',
-                       'url'     => $this->storageUrl( $auth, $srcCont, $srcRel ),
+                       'method' => 'GET',
+                       'url' => $this->storageUrl( $auth, $srcCont, $srcRel ),
                        'headers' => $this->authTokenHeaders( $auth )
                                + $this->headersFromParams( $params ),
-                       'stream'  => $handle,
+                       'stream' => $handle,
                ) );
 
                if ( $rcode >= 200 && $rcode <= 299 ) {
@@ -1064,54 +1026,52 @@ class SwiftFileBackend extends FileBackendStore {
                $ep = array_diff_key( $params, array( 'srcs' => 1 ) ); // for error logging
                // Blindly create tmp files and stream to them, catching any exception if the file does
                // not exist. Doing a stat here is useless causes infinite loops in addMissingMetadata().
-               foreach ( array_chunk( $params['srcs'], $params['concurrency'] ) as $pathBatch ) {
-                       $reqs = array(); // (path => op)
-
-                       foreach ( $pathBatch as $path ) { // each path in this concurrent batch
-                               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $path );
-                               if ( $srcRel === null || !$auth ) {
-                                       $tmpFiles[$path] = null;
-                                       continue;
-                               }
-                               $tmpFile = null;
-                               // Get source file extension
-                               $ext = FileBackend::extensionFromPath( $path );
-                               // Create a new temporary file...
-                               $tmpFile = TempFSFile::factory( 'localcopy_', $ext );
-                               if ( $tmpFile ) {
-                                       $handle = fopen( $tmpFile->getPath(), 'wb' );
-                                       if ( $handle ) {
-                                               $reqs[$path] = array(
-                                                       'method'  => 'GET',
-                                                       'url'     => $this->storageUrl( $auth, $srcCont, $srcRel ),
-                                                       'headers' => $this->authTokenHeaders( $auth )
-                                                               + $this->headersFromParams( $params ),
-                                                       'stream'  => $handle,
-                                               );
-                                       } else {
-                                               $tmpFile = null;
-                                       }
-                               }
-                               $tmpFiles[$path] = $tmpFile;
-                       }
+               $reqs = array(); // (path => op)
 
-                       $reqs = $this->http->runMulti( $reqs );
-                       foreach ( $reqs as $path => $op ) {
-                               list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $op['response'];
-                               fclose( $op['stream'] ); // close open handle
-                               if ( $rcode >= 200 && $rcode <= 299
-                                       // double check that the disk is not full/broken
-                                       && $tmpFiles[$path]->getSize() == $rhdrs['content-length']
-                               ) {
-                                       // good
-                               } elseif ( $rcode === 404 ) {
-                                       $tmpFiles[$path] = false;
+               foreach ( $params['srcs'] as $path ) { // each path in this concurrent batch
+                       list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $path );
+                       if ( $srcRel === null || !$auth ) {
+                               $tmpFiles[$path] = null;
+                               continue;
+                       }
+                       // Get source file extension
+                       $ext = FileBackend::extensionFromPath( $path );
+                       // Create a new temporary file...
+                       $tmpFile = TempFSFile::factory( 'localcopy_', $ext );
+                       if ( $tmpFile ) {
+                               $handle = fopen( $tmpFile->getPath(), 'wb' );
+                               if ( $handle ) {
+                                       $reqs[$path] = array(
+                                               'method'  => 'GET',
+                                               'url'     => $this->storageUrl( $auth, $srcCont, $srcRel ),
+                                               'headers' => $this->authTokenHeaders( $auth )
+                                                       + $this->headersFromParams( $params ),
+                                               'stream'  => $handle,
+                                       );
                                } else {
-                                       $tmpFiles[$path] = null;
-                                       $this->onError( null, __METHOD__,
-                                               array( 'src' => $path ) + $ep, $rerr, $rcode, $rdesc );
+                                       $tmpFile = null;
                                }
                        }
+                       $tmpFiles[$path] = $tmpFile;
+               }
+
+               $opts = array( 'maxConnsPerHost' => $params['concurrency'] );
+               $reqs = $this->http->runMulti( $reqs, $opts );
+               foreach ( $reqs as $path => $op ) {
+                       list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $op['response'];
+                       fclose( $op['stream'] ); // close open handle
+                       if ( $rcode >= 200 && $rcode <= 299
+                               // double check that the disk is not full/broken
+                               && $tmpFiles[$path]->getSize() == $rhdrs['content-length']
+                       ) {
+                               // good
+                       } elseif ( $rcode === 404 ) {
+                               $tmpFiles[$path] = false;
+                       } else {
+                               $tmpFiles[$path] = null;
+                               $this->onError( null, __METHOD__,
+                                       array( 'src' => $path ) + $ep, $rerr, $rcode, $rdesc );
+                       }
                }
 
                return $tmpFiles;
@@ -1142,6 +1102,7 @@ class SwiftFileBackend extends FileBackendStore {
                                        "GET\n{$expires}\n{$contPath}/{$srcRel}",
                                        $this->swiftTempUrlKey
                                );
+
                                return "{$url}?temp_url_sig={$signature}&temp_url_expires={$expires}";
                        } else { // give S3 API URL for rgw
                                // Path for signature starts with the bucket
@@ -1199,6 +1160,7 @@ class SwiftFileBackend extends FileBackendStore {
                        foreach ( $fileOpHandles as $index => $fileOpHandle ) {
                                $statuses[$index] = Status::newFatal( 'backend-fail-connect', $this->name );
                        }
+
                        return $statuses;
                }
 
@@ -1218,7 +1180,8 @@ class SwiftFileBackend extends FileBackendStore {
                }
 
                // Run all requests for the first stage, then the next, and so on
-               for ( $stage = 0; $stage < count( $httpReqsByStage ); ++$stage ) {
+               $reqCount = count( $httpReqsByStage );
+               for ( $stage = 0; $stage < $reqCount; ++$stage ) {
                        $httpReqs = $this->http->runMulti( $httpReqsByStage[$stage] );
                        foreach ( $httpReqs as $index => $httpReq ) {
                                // Run the callback for each request of this operation
@@ -1262,18 +1225,19 @@ class SwiftFileBackend extends FileBackendStore {
         */
        protected function setContainerAccess( $container, array $readGrps, array $writeGrps ) {
                $status = Status::newGood();
-
                $auth = $this->getAuthentication();
+
                if ( !$auth ) {
                        $status->fatal( 'backend-fail-connect', $this->name );
+
                        return $status;
                }
 
                list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
-                       'method'  => 'POST',
-                       'url'     => $this->storageUrl( $auth, $container ),
+                       'method' => 'POST',
+                       'url' => $this->storageUrl( $auth, $container ),
                        'headers' => $this->authTokenHeaders( $auth ) + array(
-                               'x-container-read'  => implode( ',', $readGrps ),
+                               'x-container-read' => implode( ',', $readGrps ),
                                'x-container-write' => implode( ',', $writeGrps )
                        )
                ) );
@@ -1294,6 +1258,8 @@ class SwiftFileBackend extends FileBackendStore {
         * @return array|bool|null False on 404, null on failure
         */
        protected function getContainerStat( $container, $bypassCache = false ) {
+               $section = new ProfileSection( __METHOD__ . '-' . $this->name );
+
                if ( $bypassCache ) { // purge cache
                        $this->containerStatCache->clear( $container );
                } elseif ( !$this->containerStatCache->has( $container, 'stat' ) ) {
@@ -1305,11 +1271,13 @@ class SwiftFileBackend extends FileBackendStore {
                                return null;
                        }
 
+                       wfProfileIn( __METHOD__. "-{$this->name}-miss" );
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
-                               'method'  => 'HEAD',
-                               'url'     => $this->storageUrl( $auth, $container ),
+                               'method' => 'HEAD',
+                               'url' => $this->storageUrl( $auth, $container ),
                                'headers' => $this->authTokenHeaders( $auth )
                        ) );
+                       wfProfileOut( __METHOD__ . "-{$this->name}-miss" );
 
                        if ( $rcode === 204 ) {
                                $stat = array(
@@ -1320,12 +1288,14 @@ class SwiftFileBackend extends FileBackendStore {
                                        return $stat;
                                } else {
                                        $this->containerStatCache->set( $container, 'stat', $stat ); // cache it
+                                       $this->setContainerCache( $container, $stat ); // update persistent cache
                                }
                        } elseif ( $rcode === 404 ) {
                                return false;
                        } else {
                                $this->onError( null, __METHOD__,
                                        array( 'cont' => $container ), $rerr, $rcode, $rdesc );
+
                                return null;
                        }
                }
@@ -1346,6 +1316,7 @@ class SwiftFileBackend extends FileBackendStore {
                $auth = $this->getAuthentication();
                if ( !$auth ) {
                        $status->fatal( 'backend-fail-connect', $this->name );
+
                        return $status;
                }
 
@@ -1358,10 +1329,10 @@ class SwiftFileBackend extends FileBackendStore {
                $writeGrps = array( $this->swiftUser ); // sanity
 
                list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
-                       'method'  => 'PUT',
-                       'url'     => $this->storageUrl( $auth, $container ),
+                       'method' => 'PUT',
+                       'url' => $this->storageUrl( $auth, $container ),
                        'headers' => $this->authTokenHeaders( $auth ) + array(
-                               'x-container-read'  => implode( ',', $readGrps ),
+                               'x-container-read' => implode( ',', $readGrps ),
                                'x-container-write' => implode( ',', $writeGrps )
                        )
                ) );
@@ -1390,12 +1361,13 @@ class SwiftFileBackend extends FileBackendStore {
                $auth = $this->getAuthentication();
                if ( !$auth ) {
                        $status->fatal( 'backend-fail-connect', $this->name );
+
                        return $status;
                }
 
                list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
-                       'method'  => 'DELETE',
-                       'url'     => $this->storageUrl( $auth, $container ),
+                       'method' => 'DELETE',
+                       'url' => $this->storageUrl( $auth, $container ),
                        'headers' => $this->authTokenHeaders( $auth )
                ) );
 
@@ -1432,6 +1404,7 @@ class SwiftFileBackend extends FileBackendStore {
                $auth = $this->getAuthentication();
                if ( !$auth ) {
                        $status->fatal( 'backend-fail-connect', $this->name );
+
                        return $status;
                }
 
@@ -1450,9 +1423,9 @@ class SwiftFileBackend extends FileBackendStore {
                }
 
                list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
-                       'method'  => 'GET',
-                       'url'     => $this->storageUrl( $auth, $fullCont ),
-                       'query'   => $query,
+                       'method' => 'GET',
+                       'url' => $this->storageUrl( $auth, $fullCont ),
+                       'query' => $query,
                        'headers' => $this->authTokenHeaders( $auth )
                ) );
 
@@ -1480,6 +1453,82 @@ class SwiftFileBackend extends FileBackendStore {
                }
        }
 
+       protected function doGetFileStatMulti( array $params ) {
+               $stats = array();
+
+               $auth = $this->getAuthentication();
+
+               $reqs = array();
+               foreach ( $params['srcs'] as $path ) {
+                       list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $path );
+                       if ( $srcRel === null ) {
+                               $stats[$path] = false;
+                               continue; // invalid storage path
+                       } elseif ( !$auth ) {
+                               $stats[$path] = null;
+                               continue;
+                       }
+
+                       // (a) Check the container
+                       $cstat = $this->getContainerStat( $srcCont, true );
+                       if ( $cstat === false ) {
+                               $stats[$path] = false;
+                               continue; // ok, nothing to do
+                       } elseif ( !is_array( $cstat ) ) {
+                               $stats[$path] = null;
+                               continue;
+                       }
+
+                       $reqs[$path] = array(
+                               'method'  => 'HEAD',
+                               'url'     => $this->storageUrl( $auth, $srcCont, $srcRel ),
+                               'headers' => $this->authTokenHeaders( $auth ) + $this->headersFromParams( $params )
+                       );
+               }
+
+               $opts = array( 'maxConnsPerHost' => $params['concurrency'] );
+               $reqs = $this->http->runMulti( $reqs, $opts );
+
+               foreach ( $params['srcs'] as $path ) {
+                       if ( array_key_exists( $path, $stats ) ) {
+                               continue; // some sort of failure above
+                       }
+                       // (b) Check the file
+                       list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $reqs[$path]['response'];
+                       if ( $rcode === 200 || $rcode === 204 ) {
+                               // Update the object if it is missing some headers
+                               $rhdrs = $this->addMissingMetadata( $rhdrs, $path );
+                               // Fetch all of the custom metadata headers
+                               $metadata = array();
+                               foreach ( $rhdrs as $name => $value ) {
+                                       if ( strpos( $name, 'x-object-meta-' ) === 0 ) {
+                                               $metadata[substr( $name, strlen( 'x-object-meta-' ) )] = $value;
+                                       }
+                               }
+                               // Fetch all of the custom raw HTTP headers
+                               $headers = $this->sanitizeHdrs( array( 'headers' => $rhdrs ) );
+                               $stat = array(
+                                       // Convert various random Swift dates to TS_MW
+                                       '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'],
+                                       // Note: manifiest ETags are not an MD5 of the file
+                                       'md5'   => ctype_xdigit( $rhdrs['etag'] ) ? $rhdrs['etag'] : null,
+                                       'xattr' => array( 'metadata' => $metadata, 'headers' => $headers )
+                               );
+                       } elseif ( $rcode === 404 ) {
+                               $stat = false;
+                       } else {
+                               $stat = null;
+                               $this->onError( null, __METHOD__, $params, $rerr, $rcode, $rdesc );
+                       }
+                       $stats[$path] = $stat;
+               }
+
+               return $stats;
+       }
+
        /**
         * @return array|null Credential map
         */
@@ -1505,29 +1554,35 @@ class SwiftFileBackend extends FileBackendStore {
                                $this->authSessionTimestamp = time() - ceil( $this->authTTL / 2 );
                        } else { // cache miss
                                list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
-                                       'method'  => 'GET',
-                                       'url'     => "{$this->swiftAuthUrl}/v1.0",
+                                       'method' => 'GET',
+                                       'url' => "{$this->swiftAuthUrl}/v1.0",
                                        'headers' => array(
-                                               'x-auth-user' => $this->swiftUser, 'x-auth-key' => $this->swiftKey )
+                                               'x-auth-user' => $this->swiftUser,
+                                               'x-auth-key' => $this->swiftKey
+                                       )
                                ) );
 
                                if ( $rcode >= 200 && $rcode <= 299 ) { // OK
                                        $this->authCreds = array(
-                                               'auth_token'  => $rhdrs['x-auth-token'],
+                                               'auth_token' => $rhdrs['x-auth-token'],
                                                'storage_url' => $rhdrs['x-storage-url']
                                        );
+                                       $this->srvCache->set( $cacheKey, $this->authCreds, ceil( $this->authTTL / 2 ) );
                                        $this->authSessionTimestamp = time();
                                } elseif ( $rcode === 401 ) {
                                        $this->onError( null, __METHOD__, array(), "Authentication failed.", $rcode );
                                        $this->authErrorTimestamp = time();
+
                                        return null;
                                } else {
                                        $this->onError( null, __METHOD__, array(), "HTTP return code: $rcode", $rcode );
                                        $this->authErrorTimestamp = time();
+
                                        return null;
                                }
                        }
                }
+
                return $this->authCreds;
        }
 
@@ -1545,6 +1600,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( strlen( $object ) ) {
                        $parts[] = str_replace( "%2F", "/", rawurlencode( $object ) );
                }
+
                return implode( '/', $parts );
        }
 
@@ -1563,7 +1619,7 @@ class SwiftFileBackend extends FileBackendStore {
         * @return string
         */
        private function getCredsCacheKey( $username ) {
-               return wfMemcKey( 'backend', $this->getName(), 'usercreds', $username );
+               return 'swiftcredentials:' . md5( $username . ':' . $this->swiftAuthUrl );
        }
 
        /**
index d17074e..a692012 100644 (file)
@@ -178,8 +178,8 @@ abstract class QuorumLockManager extends LockManager {
                foreach ( $this->srvsByBucket[$bucket] as $lockSrv ) {
                        if ( !$this->isServerUp( $lockSrv ) ) {
                                $status->warning( 'lockmanager-fail-svr-release', $lockSrv );
-                       // Attempt to release the lock on this peer
                        } else {
+                               // Attempt to release the lock on this peer
                                $status->merge( $this->freeLocksOnServer( $lockSrv, $pathsByType ) );
                                ++$yesVotes; // success for this peer
                                // Normally the first peers form the quorum, and the others are ignored.
index e37e567..ff4cba5 100644 (file)
@@ -153,7 +153,7 @@ LUA;
                        );
                } catch ( RedisException $e ) {
                        $res = false;
-                       $this->redisPool->handleException( $server, $conn, $e );
+                       $this->redisPool->handleError( $conn, $e );
                }
 
                if ( $res === false ) {
@@ -221,7 +221,7 @@ LUA;
                        );
                } catch ( RedisException $e ) {
                        $res = false;
-                       $this->redisPool->handleException( $server, $conn, $e );
+                       $this->redisPool->handleError( $conn, $e );
                }
 
                if ( $res === false ) {
index ca8c219..534d7f2 100644 (file)
@@ -55,7 +55,7 @@ class FileRepo {
        /** @var Array Map of zones to config */
        protected $zones = array();
 
-       /** @var string URL of thumb.php  */
+       /** @var string URL of thumb.php */
        protected $thumbScriptUrl;
 
        /** @var bool Whether to skip media file transformation on parse and rely
@@ -111,7 +111,7 @@ class FileRepo {
         */
        protected $abbrvThreshold;
 
-       /** @var string The URL of the repo's favicon, if any  */
+       /** @var string The URL of the repo's favicon, if any */
        protected $favicon;
 
        /**
@@ -505,7 +505,7 @@ class FileRepo {
                                $searchName = File::normalizeTitle( $title )->getDBkey(); // must be valid
                                if ( $flags & self::NAME_AND_TIME_ONLY ) {
                                        $result[$searchName] = array(
-                                               'title'     => $file->getTitle()->getDBkey(),
+                                               'title' => $file->getTitle()->getDBkey(),
                                                'timestamp' => $file->getTimestamp()
                                        );
                                } else {
index 8906834..4e48932 100644 (file)
@@ -59,10 +59,10 @@ class ForeignAPIRepo extends FileRepo {
        /** @var int Redownload thumbnail files after a month (86400*30) */
        protected $fileCacheExpiry = 2592000;
 
-       /** @var array  */
+       /** @var array */
        protected $mFileExists = array();
 
-       /** @var array  */
+       /** @var array */
        private $mQueryCache = array();
 
        /**
@@ -485,6 +485,10 @@ class ForeignAPIRepo extends FileRepo {
 
                        $info['articlepath'] = $general['articlepath'];
                        $info['server'] = $general['server'];
+
+                       if ( isset( $general['favicon'] ) ) {
+                               $info['favicon'] = $general['favicon'];
+                       }
                }
 
                return $info;
index bcccb71..3f7adb0 100644 (file)
@@ -258,11 +258,12 @@ class LocalRepo extends FileRepo {
                        }
                }
 
-               $fileMatchesSearch = function( File $file, array $search ) {
+               $fileMatchesSearch = function ( File $file, array $search ) {
                        // Note: file name comparison done elsewhere (to handle redirects)
                        $user = ( !empty( $search['private'] ) && $search['private'] instanceof User )
                                ? $search['private']
                                : null;
+
                        return (
                                $file->exists() &&
                                (
@@ -275,7 +276,7 @@ class LocalRepo extends FileRepo {
                };
 
                $repo = $this;
-               $applyMatchingFiles = function( ResultWrapper $res, &$searchSet, &$finalFiles )
+               $applyMatchingFiles = function ( ResultWrapper $res, &$searchSet, &$finalFiles )
                        use ( $repo, $fileMatchesSearch, $flags )
                {
                        global $wgContLang;
@@ -290,7 +291,7 @@ class LocalRepo extends FileRepo {
                                        $dbKeysLook[] = $wgContLang->lcfirst( $file->getName() );
                                }
                                foreach ( $dbKeysLook as $dbKey ) {
-                                       if ( isset( $searchSet[$dbKey])
+                                       if ( isset( $searchSet[$dbKey] )
                                                && $fileMatchesSearch( $file, $searchSet[$dbKey] )
                                        ) {
                                                $finalFiles[$dbKey] = ( $flags & FileRepo::NAME_AND_TIME_ONLY )
@@ -309,6 +310,7 @@ class LocalRepo extends FileRepo {
                foreach ( array_keys( $searchSet ) as $dbKey ) {
                        $imgNames[] = $this->getNameFromTitle( File::normalizeTitle( $dbKey ) );
                }
+
                if ( count( $imgNames ) ) {
                        $res = $dbr->select( 'image',
                                LocalFile::selectFields(), array( 'img_name' => $imgNames ), __METHOD__ );
@@ -328,6 +330,7 @@ class LocalRepo extends FileRepo {
                                );
                        }
                }
+
                if ( count( $oiConds ) ) {
                        $res = $dbr->select( 'oldimage',
                                OldLocalFile::selectFields(), $dbr->makeList( $oiConds, LIST_OR ), __METHOD__ );
@@ -339,15 +342,17 @@ class LocalRepo extends FileRepo {
                        if ( !empty( $search['ignoreRedirect'] ) ) {
                                continue;
                        }
+
                        $title = File::normalizeTitle( $dbKey );
                        $redir = $this->checkRedirect( $title ); // hopefully hits memcached
+
                        if ( $redir && $redir->getNamespace() == NS_FILE ) {
                                $file = $this->newFile( $redir );
                                if ( $file && $fileMatchesSearch( $file, $search ) ) {
                                        $file->redirectedFrom( $title->getDBkey() );
                                        if ( $flags & FileRepo::NAME_AND_TIME_ONLY ) {
                                                $finalFiles[$dbKey] = array(
-                                                       'title'     => $file->getTitle()->getDBkey(),
+                                                       'title' => $file->getTitle()->getDBkey(),
                                                        'timestamp' => $file->getTimestamp()
                                                );
                                        } else {
@@ -503,6 +508,7 @@ class LocalRepo extends FileRepo {
         */
        function getInfo() {
                global $wgFavicon;
+
                return array_merge( parent::getInfo(), array(
                        'favicon' => wfExpandUrl( $wgFavicon ),
                ) );
index 33ab8ae..18432a1 100644 (file)
@@ -42,7 +42,7 @@ class RepoGroup {
        /** @var array */
        protected $foreignInfo;
 
-       /** @var ProcessCacheLRU  */
+       /** @var ProcessCacheLRU */
        protected $cache;
 
        /** @var RepoGroup */
index 26699c4..439c25f 100644 (file)
@@ -470,7 +470,6 @@ class ArchivedFile {
                }
 
                throw new MWException( "Unknown type '$type'." );
-
        }
 
        /**
index c9e435e..950baea 100644 (file)
@@ -97,10 +97,10 @@ abstract class File {
        /** @var Title|string|bool */
        protected $title;
 
-       /** @var string Text of last error  */
+       /** @var string Text of last error */
        protected $lastError;
 
-       /** @var string Main part of the title, with underscores (Title::getDBkey)  */
+       /** @var string Main part of the title, with underscores (Title::getDBkey) */
        protected $redirected;
 
        /** @var Title */
@@ -586,6 +586,7 @@ abstract class File {
                if ( !$handler ) {
                        return false;
                }
+
                return $handler->getCommonMetaArray( $this );
        }
 
@@ -1328,7 +1329,7 @@ abstract class File {
                $this->assertRepoDefined();
 
                return $this->repo->getZonePath( 'thumb' ) . '/' .
-                       $this->getArchiveThumbRel( $archiveName, $suffix );
+               $this->getArchiveThumbRel( $archiveName, $suffix );
        }
 
        /**
index 687c549..c7b257a 100644 (file)
@@ -2249,10 +2249,10 @@ class LocalFileRestoreBatch {
        /** @var array List of file IDs to restore */
        private $ids;
 
-       /** @var bool Add all revisions of the file  */
+       /** @var bool Add all revisions of the file */
        private $all;
 
-       /** @var bool Wether to remove all settings for suppressed fields  */
+       /** @var bool Wether to remove all settings for suppressed fields */
        private $unsuppress = false;
 
        /**
@@ -2620,16 +2620,12 @@ class LocalFileMoveBatch {
        /** @var Title */
        protected $target;
 
-       /** @var   */
        protected $cur;
 
-       /** @var   */
        protected $olds;
 
-       /** @var   */
        protected $oldCount;
 
-       /** @var   */
        protected $archive;
 
        /** @var DatabaseBase */
index 782e23a..5a3e4e9 100644 (file)
@@ -34,7 +34,7 @@
  * @ingroup FileAbstraction
  */
 class UnregisteredLocalFile extends File {
-       /** @var Title  */
+       /** @var Title */
        protected $title;
 
        /** @var string */
index a341601..d2e4689 100644 (file)
  * @ingroup Media
  */
 abstract class ImageGalleryBase extends ContextSource {
-       /** @var array Gallery images  */
+       /** @var array Gallery images */
        protected $mImages;
 
-       /** @var bool Whether to show the filesize in bytes in categories   */
+       /** @var bool Whether to show the filesize in bytes in categories */
        protected $mShowBytes;
 
        /** @var bool Whether to show the filename. Default: true */
@@ -242,7 +242,7 @@ abstract class ImageGalleryBase extends ContextSource {
         * @param string $html Additional HTML text to be shown. The name and size
         *   of the image are always shown.
         * @param string $alt Alt text for the image
-        * @param string $link  Override image link (optional)
+        * @param string $link Override image link (optional)
         * @param array $handlerOpts Array of options for image handler (aka page number)
         */
        function insert( $title, $html = '', $alt = '', $link = '', $handlerOpts = array() ) {
index 0aea070..3e2a09e 100644 (file)
  *    'default'             -- default value when the form is displayed
  *    'id'                  -- HTML id attribute
  *    'cssclass'            -- CSS class
- *    'options'             -- varies according to the specific object.
+ *    'options'             -- associative array mapping labels to values.
+ *                             Some field types support multi-level arrays.
+ *    'options-messages'    -- associative array mapping message keys to values.
+ *                             Some field types support multi-level arrays.
+ *    'options-message'     -- message key to be parsed to extract the list of
+ *                             options (like 'ipbreason-dropdown').
  *    'label-message'       -- message key for a message to use as the label.
  *                             can be an array of msg key and then parameters to
  *                             the message.
@@ -306,15 +311,22 @@ class HTMLForm extends ContextSource {
        }
 
        /**
-        * Initialise a new Object for the field
+        * Get the HTMLFormField subclass for this descriptor.
+        *
+        * The descriptor can be passed either 'class' which is the name of
+        * a HTMLFormField subclass, or a shorter 'type' which is an alias.
+        * This makes sure the 'class' is always set, and also is returned by
+        * this function for ease.
+        *
+        * @since 1.23
         *
-        * @param $fieldname string
-        * @param string $descriptor input Descriptor, as described above
+        * @param string $fieldname Name of the field
+        * @param array $descriptor Input Descriptor, as described above
         *
         * @throws MWException
-        * @return HTMLFormField subclass
+        * @return string Name of a HTMLFormField subclass
         */
-       static function loadInputFromParameters( $fieldname, $descriptor ) {
+       public static function getClassFromDescriptor( $fieldname, &$descriptor ) {
                if ( isset( $descriptor['class'] ) ) {
                        $class = $descriptor['class'];
                } elseif ( isset( $descriptor['type'] ) ) {
@@ -325,8 +337,22 @@ class HTMLForm extends ContextSource {
                }
 
                if ( !$class ) {
-                       throw new MWException( "Descriptor with no class: " . print_r( $descriptor, true ) );
+                       throw new MWException( "Descriptor with no class for $fieldname: " . print_r( $descriptor, true ) );
                }
+               return $class;
+       }
+
+       /**
+        * Initialise a new Object for the field
+        *
+        * @param string $fieldname Name of the field
+        * @param array $descriptor Input Descriptor, as described above
+        *
+        * @throws MWException
+        * @return HTMLFormField subclass
+        */
+       public static function loadInputFromParameters( $fieldname, $descriptor ) {
+               $class = self::getClassFromDescriptor( $fieldname, $descriptor );
 
                $descriptor['fieldname'] = $fieldname;
 
@@ -790,7 +816,7 @@ class HTMLForm extends ContextSource {
         * @return String HTML.
         */
        function getButtons() {
-               $html = '<span class="mw-htmlform-submit-buttons">';
+               $buttons = '';
 
                if ( $this->mShowSubmit ) {
                        $attribs = array();
@@ -812,27 +838,27 @@ class HTMLForm extends ContextSource {
                        if ( $this->isVForm() ) {
                                // mw-ui-block is necessary because the buttons aren't necessarily in an
                                // immediate child div of the vform.
-                               array_push( $attribs['class'], 'mw-ui-button', 'mw-ui-big', 'mw-ui-primary', 'mw-ui-block' );
+                               // @todo Let client specify if the primary submit button is progressive or destructive
+                               array_push(
+                                       $attribs['class'],
+                                       'mw-ui-button',
+                                       'mw-ui-big',
+                                       'mw-ui-constructive',
+                                       'mw-ui-block'
+                               );
                        }
 
-                       $html .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
-
-                       // Buttons are top-level form elements in table and div layouts,
-                       // but vform wants all elements inside divs to get spaced-out block
-                       // styling.
-                       if ( $this->isVForm() ) {
-                               $html = Html::rawElement( 'div', null, "\n$html\n" );
-                       }
+                       $buttons .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
                }
 
                if ( $this->mShowReset ) {
-                       $html .= Html::element(
-                                       'input',
-                                       array(
-                                               'type' => 'reset',
-                                               'value' => $this->msg( 'htmlform-reset' )->text()
-                                       )
-                               ) . "\n";
+                       $buttons .= Html::element(
+                               'input',
+                               array(
+                                       'type' => 'reset',
+                                       'value' => $this->msg( 'htmlform-reset' )->text()
+                               )
+                       ) . "\n";
                }
 
                foreach ( $this->mButtons as $button ) {
@@ -850,10 +876,18 @@ class HTMLForm extends ContextSource {
                                $attrs['id'] = $button['id'];
                        }
 
-                       $html .= Html::element( 'input', $attrs );
+                       $buttons .= Html::element( 'input', $attrs ) . "\n";
                }
 
-               $html .= '</span>';
+               $html = Html::rawElement( 'span',
+                       array( 'class' => 'mw-htmlform-submit-buttons' ), "\n$buttons" ) . "\n";
+
+               // Buttons are top-level form elements in table and div layouts,
+               // but vform wants all elements inside divs to get spaced-out block
+               // styling.
+               if ( $this->mShowSubmit && $this->isVForm() ) {
+                       $html = Html::rawElement( 'div', null, "\n$html" ) . "\n";
+               }
 
                return $html;
        }
index 622dd94..27d9594 100644 (file)
@@ -14,6 +14,8 @@ abstract class HTMLFormField {
        protected $mID;
        protected $mClass = '';
        protected $mDefault;
+       protected $mOptions = false;
+       protected $mOptionsLabelsNotFromMessage = false;
 
        /**
         * @var bool If true will generate an empty div element with no label
@@ -495,7 +497,7 @@ abstract class HTMLFormField {
 
                $ret = array();
 
-               foreach( $list as $key ) {
+               foreach ( $list as $key ) {
                        if ( in_array( $key, $boolAttribs ) ) {
                                if ( !empty( $this->mParams[$key] ) ) {
                                        $ret[$key] = '';
@@ -508,6 +510,88 @@ abstract class HTMLFormField {
                return $ret;
        }
 
+       /**
+        * Given an array of msg-key => value mappings, returns an array with keys
+        * being the message texts. It also forces values to strings.
+        *
+        * @param array $options
+        * @return array
+        */
+       private function lookupOptionsKeys( $options ) {
+               $ret = array();
+               foreach ( $options as $key => $value ) {
+                       $key = $this->msg( $key )->plain();
+                       $ret[$key] = is_array( $value )
+                               ? $this->lookupOptionsKeys($field, $value)
+                               : strval( $value );
+               }
+               return $ret;
+       }
+
+       /**
+        * Recursively forces values in an array to strings, because issues arise
+        * with integer 0 as a value.
+        *
+        * @param array $array
+        * @return array
+        */
+       static function forceToStringRecursive( $array ) {
+               if ( is_array( $array ) ) {
+                       return array_map( array( __CLASS__, 'forceToStringRecursive' ), $array );
+               } else {
+                       return strval( $array );
+               }
+       }
+
+       /**
+        * Fetch the array of options from the field's parameters. In order, this
+        * checks 'options-messages', 'options', then 'options-message'.
+        *
+        * @return array|null Options array
+        */
+       public function getOptions() {
+               if ( $this->mOptions === false ) {
+                       if ( array_key_exists( 'options-messages', $this->mParams ) ) {
+                               $this->mOptions = $this->lookupOptionsKeys( $this->mParams['options-messages'] );
+                       } elseif ( array_key_exists( 'options', $this->mParams ) ) {
+                               $this->mOptionsLabelsNotFromMessage = true;
+                               $this->mOptions = self::forceToStringRecursive( $this->mParams['options'] );
+                       } elseif ( array_key_exists( 'options-message', $this->mParams ) ) {
+                               /** @todo This is copied from Xml::listDropDown(), deprecate/avoid duplication? */
+                               $message = $this->msg( $this->mParams['options-message'] )->plain();
+
+                               $optgroup = false;
+                               $this->mOptions = array();
+                               foreach ( explode( "\n", $message ) as $option ) {
+                                       $value = trim( $option );
+                                       if ( $value == '' ) {
+                                               continue;
+                                       } elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) {
+                                               # A new group is starting...
+                                               $value = trim( substr( $value, 1 ) );
+                                               $optgroup = $value;
+                                       } elseif ( substr( $value, 0, 2 ) == '**' ) {
+                                               # groupmember
+                                               $opt = trim( substr( $value, 2 ) );
+                                               if ( $optgroup === false ) {
+                                                       $this->mOptions[$opt] = $opt;
+                                               } else {
+                                                       $this->mOptions[$optgroup][$opt] = $opt;
+                                               }
+                                       } else {
+                                               # groupless reason list
+                                               $optgroup = false;
+                                               $this->mOptions[$option] = $option;
+                                       }
+                               }
+                       } else {
+                               $this->mOptions = null;
+                       }
+               }
+
+               return $this->mOptions;
+       }
+
        /**
         * flatten an array of options to a single array, for instance,
         * a set of "<options>" inside "<optgroups>".
index 09576d4..2944c24 100644 (file)
@@ -17,7 +17,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
 
                # If all options are valid, array_intersect of the valid options
                # and the provided options will return the provided options.
-               $validOptions = HTMLFormField::flattenOptions( $this->mParams['options'] );
+               $validOptions = HTMLFormField::flattenOptions( $this->getOptions() );
 
                $validValues = array_intersect( $value, $validOptions );
                if ( count( $validValues ) == count( $value ) ) {
@@ -28,7 +28,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
        }
 
        function getInputHTML( $value ) {
-               $html = $this->formatOptions( $this->mParams['options'], $value );
+               $html = $this->formatOptions( $this->getOptions(), $value );
 
                return $html;
        }
@@ -37,6 +37,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                $html = '';
 
                $attribs = $this->getAttributes( array( 'disabled', 'tabindex' ) );
+               $elementFunc = array( 'Html', $this->mOptionsLabelsNotFromMessage ? 'rawElement' : 'element' );
 
                foreach ( $options as $label => $info ) {
                        if ( is_array( $info ) ) {
@@ -50,7 +51,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                                        in_array( $info, $value, true ),
                                        $attribs + $thisAttribs
                                );
-                               $checkbox .= '&#160;' . Html::rawElement(
+                               $checkbox .= '&#160;' . call_user_func( $elementFunc,
                                        'label',
                                        array( 'for' => "{$this->mID}-$info" ),
                                        $label
@@ -102,7 +103,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
        }
 
        function filterDataForSubmit( $data ) {
-               $options = HTMLFormField::flattenOptions( $this->mParams['options'] );
+               $options = HTMLFormField::flattenOptions( $this->getOptions() );
 
                $res = array();
                foreach ( $options as $opt ) {
index f206ed6..aa0ea5d 100644 (file)
@@ -15,7 +15,7 @@ class HTMLRadioField extends HTMLFormField {
                        return false;
                }
 
-               $validOptions = HTMLFormField::flattenOptions( $this->mParams['options'] );
+               $validOptions = HTMLFormField::flattenOptions( $this->getOptions() );
 
                if ( in_array( $value, $validOptions ) ) {
                        return true;
@@ -33,7 +33,7 @@ class HTMLRadioField extends HTMLFormField {
         * @return String
         */
        function getInputHTML( $value ) {
-               $html = $this->formatOptions( $this->mParams['options'], $value );
+               $html = $this->formatOptions( $this->getOptions(), $value );
 
                return $html;
        }
@@ -42,6 +42,7 @@ class HTMLRadioField extends HTMLFormField {
                $html = '';
 
                $attribs = $this->getAttributes( array( 'disabled', 'tabindex' ) );
+               $elementFunc = array( 'Html', $this->mOptionsLabelsNotFromMessage ? 'rawElement' : 'element' );
 
                # @todo Should this produce an unordered list perhaps?
                foreach ( $options as $label => $info ) {
@@ -51,7 +52,7 @@ class HTMLRadioField extends HTMLFormField {
                        } else {
                                $id = Sanitizer::escapeId( $this->mID . "-$info" );
                                $radio = Xml::radio( $this->mName, $info, $info == $value, $attribs + array( 'id' => $id ) );
-                               $radio .= '&#160;' . Html::rawElement( 'label', array( 'for' => $id ), $label );
+                               $radio .= '&#160;' . call_user_func( $elementFunc, 'label', array( 'for' => $id ), $label );
 
                                $html .= ' ' . Html::rawElement(
                                        'div',
index 044670d..2e91a23 100644 (file)
@@ -19,63 +19,17 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                        $params['other'] = null;
                }
 
-               if ( array_key_exists( 'options', $params ) ) {
-                       # Options array already specified
-               } elseif ( array_key_exists( 'options-message', $params ) ) {
-                       # Generate options array from a system message
-                       $params['options'] =
-                               self::parseMessage( wfMessage( $params['options-message'] )->inContentLanguage()->plain(),
-                                       $params['other'] );
-               } else {
-                       # Sulk
-                       throw new MWException( 'HTMLSelectAndOtherField called without any options' );
-               }
-               $this->mFlatOptions = self::flattenOptions( $params['options'] );
-
                parent::__construct( $params );
-       }
 
-       /**
-        * Build a drop-down box from a textual list.
-        *
-        * @param string $string message text
-        * @param string $otherName name of "other reason" option
-        *
-        * @return Array
-        * @todo This is copied from Xml::listDropDown(), deprecate/avoid duplication?
-        */
-       public static function parseMessage( $string, $otherName = null ) {
-               if ( $otherName === null ) {
-                       $otherName = wfMessage( 'htmlform-selectorother-other' )->plain();
+               if ( $this->getOptions() === null ) {
+                       # Sulk
+                       throw new MWException( 'HTMLSelectAndOtherField called without any options' );
                }
-
-               $optgroup = false;
-               $options = array( $otherName => 'other' );
-
-               foreach ( explode( "\n", $string ) as $option ) {
-                       $value = trim( $option );
-                       if ( $value == '' ) {
-                               continue;
-                       } elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) {
-                               # A new group is starting...
-                               $value = trim( substr( $value, 1 ) );
-                               $optgroup = $value;
-                       } elseif ( substr( $value, 0, 2 ) == '**' ) {
-                               # groupmember
-                               $opt = trim( substr( $value, 2 ) );
-                               if ( $optgroup === false ) {
-                                       $options[$opt] = $opt;
-                               } else {
-                                       $options[$optgroup][$opt] = $opt;
-                               }
-                       } else {
-                               # groupless reason list
-                               $optgroup = false;
-                               $options[$option] = $option;
-                       }
+               if ( !in_array( 'other', $this->mOptions, true ) ) {
+                       $this->mOptions[$params['other']] = 'other';
                }
+               $this->mFlatOptions = self::flattenOptions( $this->getOptions() );
 
-               return $options;
        }
 
        function getInputHTML( $value ) {
index 9d719f6..0437480 100644 (file)
@@ -11,7 +11,7 @@ class HTMLSelectField extends HTMLFormField {
                        return $p;
                }
 
-               $validOptions = HTMLFormField::flattenOptions( $this->mParams['options'] );
+               $validOptions = HTMLFormField::flattenOptions( $this->getOptions() );
 
                if ( in_array( $value, $validOptions ) ) {
                        return true;
@@ -23,16 +23,6 @@ class HTMLSelectField extends HTMLFormField {
        function getInputHTML( $value ) {
                $select = new XmlSelect( $this->mName, $this->mID, strval( $value ) );
 
-               # If one of the options' 'name' is int(0), it is automatically selected.
-               # because PHP sucks and thinks int(0) == 'some string'.
-               # Working around this by forcing all of them to strings.
-               foreach ( $this->mParams['options'] as &$opt ) {
-                       if ( is_int( $opt ) ) {
-                               $opt = strval( $opt );
-                       }
-               }
-               unset( $opt ); # PHP keeps $opt around as a reference, which is a bit scary
-
                if ( !empty( $this->mParams['disabled'] ) ) {
                        $select->setAttribute( 'disabled', 'disabled' );
                }
@@ -45,7 +35,7 @@ class HTMLSelectField extends HTMLFormField {
                        $select->setAttribute( 'class', $this->mClass );
                }
 
-               $select->addOptions( $this->mParams['options'] );
+               $select->addOptions( $this->getOptions() );
 
                return $select->getHTML();
        }
index 08be435..045b8df 100644 (file)
@@ -5,38 +5,29 @@
  */
 class HTMLSelectOrOtherField extends HTMLTextField {
        function __construct( $params ) {
-               if ( !in_array( 'other', $params['options'], true ) ) {
+               parent::__construct( $params );
+               $this->getOptions();
+               if ( !in_array( 'other', $this->mOptions, true ) ) {
                        $msg =
                                isset( $params['other'] )
                                        ? $params['other']
                                        : wfMessage( 'htmlform-selectorother-other' )->text();
-                       $params['options'][$msg] = 'other';
+                       $this->mOptions[$msg] = 'other';
                }
 
-               parent::__construct( $params );
-       }
-
-       static function forceToStringRecursive( $array ) {
-               if ( is_array( $array ) ) {
-                       return array_map( array( __CLASS__, 'forceToStringRecursive' ), $array );
-               } else {
-                       return strval( $array );
-               }
        }
 
        function getInputHTML( $value ) {
                $valInSelect = false;
 
                if ( $value !== false ) {
-                       $valInSelect = in_array( $value, HTMLFormField::flattenOptions( $this->mParams['options'] ) );
+                       $valInSelect = in_array( $value, HTMLFormField::flattenOptions( $this->getOptions() ) );
                }
 
                $selected = $valInSelect ? $value : 'other';
 
-               $opts = self::forceToStringRecursive( $this->mParams['options'] );
-
                $select = new XmlSelect( $this->mName, $this->mID, $selected );
-               $select->addOptions( $opts );
+               $select->addOptions( $this->getOptions() );
 
                $select->setAttribute( 'class', 'mw-htmlform-select-or-other' );
 
index 892fb2a..9f39a87 100644 (file)
@@ -241,6 +241,7 @@ Consider putting the database somewhere else altogether, for example in <code>/v
        'config-type-postgres'            => 'PostgreSQL',
        'config-type-sqlite'              => 'SQLite',
        'config-type-oracle'              => 'Oracle',
+       'config-type-mssql'               => 'Microsoft SQL Server',
        'config-support-info'             => 'MediaWiki supports the following database systems:
 
 $1
@@ -250,10 +251,12 @@ If you do not see the database system you are trying to use listed below, then f
        'config-dbsupport-postgres'       => '* [{{int:version-db-postgres-url}} PostgreSQL] is a popular open source database system as an alternative to MySQL. There may be some minor outstanding bugs, and it is not recommended for use in a production environment. ([http://www.php.net/manual/en/pgsql.installation.php How to compile PHP with PostgreSQL support])',
        'config-dbsupport-sqlite'         => '* [{{int:version-db-sqlite-url}} SQLite] is a lightweight database system that is very well supported. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], uses PDO)',
        'config-dbsupport-oracle'         => '* [{{int:version-db-oracle-url}} Oracle] is a commercial enterprise database. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
+       'config-dbsupport-mssql'          => '* [{{int:version-db-mssql-url}} Microsoft SQL Server] is a commercial enterprise database for Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php How to compile PHP with SQLSRV support])',
        'config-header-mysql'             => 'MySQL settings',
        'config-header-postgres'          => 'PostgreSQL settings',
        'config-header-sqlite'            => 'SQLite settings',
        'config-header-oracle'            => 'Oracle settings',
+       'config-header-mssql'             => 'Microsoft SQL Server settings',
        'config-invalid-db-type'          => 'Invalid database type',
        'config-missing-db-name'          => 'You must enter a value for "Database name"',
        'config-missing-db-host'          => 'You must enter a value for "Database host"',
@@ -272,6 +275,7 @@ Use only ASCII letters (a-z, A-Z), numbers (0-9) and underscores (_).',
        'config-db-sys-create-oracle' => 'Installer only supports using a SYSDBA account for creating a new account.',
        'config-db-sys-user-exists-oracle' => 'User account "$1" already exists. SYSDBA can only be used for creating of a new account!',
        'config-postgres-old'             => 'PostgreSQL $1 or later is required. You have $2.',
+       'config-mssql-old'                => 'Microsoft SQL Server $1 or later is required. You have $2.',
        'config-sqlite-name-help'         => 'Choose a name that identifies your wiki.
 Do not use spaces or hyphens.
 This will be used for the SQLite data file name.',
@@ -352,6 +356,13 @@ This is more efficient than MySQL's UTF-8 mode, and allows you to use the full r
 
 In <strong>UTF-8 mode</strong>, MySQL will know what character set your data is in, and can present and convert it appropriately, but it will not let you store characters above the [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
 
+       'config-mssql-auth'               => 'Authentication type:',
+       'config-mssql-install-auth'       => 'Select the authentication type that will be used to connect to the database during the installation process.
+If you select "Windows Authentication", the credentials of whatever user the webserver is running as will be used.',
+       'config-mssql-web-auth'           => 'Select the authentication type that the web server will use to connect to the database server, during ordinary operation of the wiki.
+If you select "Windows Authentication", the credentials of whatever user the webserver is running as will be used.',
+       'config-mssql-sqlauth'            => 'SQL Server Authentication',
+       'config-mssql-windowsauth'        => 'Windows Authentication',
        'config-site-name'                => 'Name of wiki:',
        'config-site-name-help'           => "This will appear in the title bar of the browser and in various other places.",
        'config-site-name-blank'          => 'Enter a site name.',
@@ -377,7 +388,6 @@ This is the name you will use to log in to the wiki.',
        'config-admin-name-invalid'       => 'The specified username "<nowiki>$1</nowiki>" is invalid.
 Specify a different username.',
        'config-admin-password-blank'     => 'Enter a password for the administrator account.',
-       'config-admin-password-same'      => 'The password must not be the same as the username.',
        'config-admin-password-mismatch'  => 'The two passwords you entered do not match.',
        'config-admin-email'              => 'Email address:',
        'config-admin-email-help'         => 'Enter an email address here to allow you to receive email from other users on the wiki, reset your password, and be notified of changes to pages on your watchlist. You can leave this field empty.',
@@ -706,6 +716,8 @@ Used in help box.',
        'config-type-postgres' => '{{optional}}',
        'config-type-sqlite' => '{{optional}}',
        'config-type-oracle' => '{{optional}}',
+       'config-type-mssql' => '{{optional}}',
+       'config-header-mssql' => 'Used as a section heading on the installer form, inside of a fieldset',
        'config-support-info' => 'Parameters:
 * $1 - a list of DBMSs that MediaWiki supports, composed with config-dbsupport-* messages.',
        'config-support-mysql' => 'Parameters:
@@ -724,6 +736,8 @@ Used in help box.',
 * $1 - database server name
 See also:
 * {{msg-mw|Config-db-host-oracle-help}}',
+       'config-support-mssql' => 'Parameters:
+* $1 - a link to the Microsoft SQL Server home page, the anchor text of which is "Microsoft SQL Server".',
        'config-invalid-db-name' => 'Used as error message. Parameters:
 * $1 - database name
 See also:
@@ -741,6 +755,9 @@ If you\'re translating this message to a right-to-left language, consider writin
        'config-postgres-old' => 'Used as error message. Used as warning. Parameters:
 * $1 - minimum version
 * $2 - the version of PostgreSQL that has been installed',
+       'config-mssql-old' => 'Used as an error message. Parameters:
+* $1 - minimum version
+* $2 - the version of Microsoft SQL Server that has been installed',
        'config-sqlite-parent-unwritable-group' => 'Used as SQLite error message. Parameters:
 * $1 - data directory
 * $2 - "dirname" part of $1
@@ -763,6 +780,11 @@ See also:
 * $1 - filename',
        'config-sqlite-cant-create-db' => 'Used as SQLite error message. Parameters:
 * $1 - filename',
+       'config-mssql-auth' => 'radio button label',
+       'config-mssql-install-auth' => 'Used as the help text for the "Authentication type" radio button when typing in database settings for installation',
+       'config-mssql-web-auth' => 'Used as the help text for the "Authentication type" radio button when typing in database settings for normal wiki usage',
+       'config-mssql-sqlauth' => 'Radio button',
+       'config-mssql-windowsauth' => 'Radio button. The official term is "Integrated Windows Authentication" but Microsoft itself uses "Windows Authentication" elsewhere in Microsoft SQL Server as a synonym.',
        'config-can-upgrade' => 'Parameters:
 * $1 - Version or Revision indicator.',
        'config-upgrade-done' => 'Used as success message. Parameters:
@@ -4895,7 +4917,7 @@ Instalación anulada.',
        'config-using531' => 'MediaWiki no puede utilizarse con PHP $1 debido a un error con los parámetros de referencia para <code>__call()</code> .
 Actualice el sistema a PHP 5.3.2 o superior, o vuelva a la versión PHP 5.3.0 para resolver este problema.
 Instalación anulada.',
-       'config-suhosin-max-value-length' => 'Suhosin está instalado y limita el parámetro <code>length</code> GET a $1 bytes. 
+       'config-suhosin-max-value-length' => 'Suhosin está instalado y limita el parámetro <code>length</code> GET a $1 bytes.
 El componente ResourceLoader (gestor de recursos) de MediaWiki trabajará en este límite, pero eso perjudicará el rendimiento.
 Si es posible, deberías establecer <code>suhosin.get.max_value_length</code> en el valor 1024 o superior en <code>php.ini</code> y establecer <code>$wgResourceLoaderMaxQueryLength</code> en el mismo valor en <code>php.ini</code>.',
        'config-db-type' => 'Tipo de base de datos',
@@ -4933,7 +4955,7 @@ Esta no es la contraseña para la cuenta de MediaWiki; esta es la contraseña pa
        'config-db-wiki-help' => 'Introduce el nombre de usuario y la contraseña que serán usados para acceder a la base de datos durante la operación normal del wiki.
 Si esta cuenta no existe y la cuenta de instalación tiene suficientes privilegios, se creará esta cuenta de usuario con los privilegios mínimos necesarios para la operación normal del wiki.',
        'config-db-prefix' => 'Prefijo para las tablas de la base de datos:',
-       'config-db-prefix-help' => 'Si necesita compartir una base de datos entre múltiples wikis, o entre MediaWiki y otra aplicación web, puede optar por agregar un prefijo a todos los nombres de tabla para evitar conflictos. 
+       'config-db-prefix-help' => 'Si necesita compartir una base de datos entre múltiples wikis, o entre MediaWiki y otra aplicación web, puede optar por agregar un prefijo a todos los nombres de tabla para evitar conflictos.
 No utilice espacios.
 
 Normalmente se deja este campo vacío.',
@@ -15510,7 +15532,7 @@ Jeśli korzystasz ze współdzielonego hostingu, dostawca usługi hostingowej mo
 
 Możesz utworzyć konto użytkownika bazy danych podczas instalacji MediaWiki. Wówczas należy podać nazwę i hasło użytkownika z rolą SYSDBA w celu użycia go przez instalator do utworzenia nowe konta użytkownika, z którego korzystać będzie MediaWiki.
 
-Możesz również skorzystać z konta użytkownika bazy danych utworzonego bezpośrednio w Oracle i wówczas wystarczy podać tylko nazwę i hasło tego użytkownika. Konto z rolą SYSDBA nie będzie potrzebne, jednak konto użytkownika powinno mieć uprawnienia do utworzenia obiektów w schemacie bazy danych. Możesz też podać dwa konta - konto dla instalatora, z pomocą którego zostaną obiekty w schemacie bazy danych i drugie konto, z którego będzie MediaWiki korzystać będzie do pracy. 
+Możesz również skorzystać z konta użytkownika bazy danych utworzonego bezpośrednio w Oracle i wówczas wystarczy podać tylko nazwę i hasło tego użytkownika. Konto z rolą SYSDBA nie będzie potrzebne, jednak konto użytkownika powinno mieć uprawnienia do utworzenia obiektów w schemacie bazy danych. Możesz też podać dwa konta - konto dla instalatora, z pomocą którego zostaną obiekty w schemacie bazy danych i drugie konto, z którego będzie MediaWiki korzystać będzie do pracy.
 
 W podkatalogu "maintenance/oracle" znajduje się skrypt do tworzenia konta użytkownika. Korzystanie z konta użytkownika z ograniczonymi uprawnieniami spowoduje wyłączenie funkcji związanych z aktualizacją oprogramowania MediaWiki.',
        'config-db-install-account' => 'Konto użytkownika dla instalatora',
@@ -15901,7 +15923,7 @@ A la trovrà an LocalSetting.php.",
 Për agiorné sta instalassion, për piasì fà anvece giré <code>update.php</code>",
        'config-localsettings-key' => "Ciav d'agiornament:",
        'config-localsettings-badkey' => "La ciav ch'it l'has dàit a l'é pa giusta.",
-       'config-upgrade-key-missing' => "A l'é stàita trovà n'istalassion esistenta ëd MediaWiki. 
+       'config-upgrade-key-missing' => "A l'é stàita trovà n'istalassion esistenta ëd MediaWiki.
 Për agiorné soa istalassion, për piasì ch'a buta la linia sì-sota al fond ëd sò <code>LocalSettings.php</code>:
 
 $1",
@@ -19594,7 +19616,7 @@ Ang mas masasalimuot na mga kaayusan ng mga karapatan ng tagagamit ay makukuha p
        'config-license-gfdl' => 'Lisensiyang 1.3 ng Malayang Dokumentasyon ng GNU o mas lalong huli',
        'config-license-pd' => 'Nasasakupan ng Madla',
        'config-license-cc-choose' => 'Pumili ng isang pasadyang Lisensiya ng Malikhaing mga Pangkaraniwan',
-       'config-license-help' => "Maraming mga pangmadlang wiki ang naglalagay ng lahat ng mga ambag sa ilalim ng [http://freedomdefined.org/Definition lisensiyang malaya]. 
+       'config-license-help' => "Maraming mga pangmadlang wiki ang naglalagay ng lahat ng mga ambag sa ilalim ng [http://freedomdefined.org/Definition lisensiyang malaya].
 Nakakatulong ito sa paglikha ng isang diwa ng pagmamay-ari ng pamayanan at nakapanghihikayat ng ambag na pangmahabang panahon.
 Sa pangkalahatan, hindi kailangan ang isang wiking pribado o pangsamahan.
 
@@ -20024,7 +20046,7 @@ MediaWiki вимагає підтримку UTF-8 для коректної ро
        'config-mysql-old' => 'Необхідна MySQL $1 або пізніша, а у Вас $2.',
        'config-db-port' => 'Порт бази даних:',
        'config-db-schema' => 'Схема для MediaWiki',
-       'config-db-schema-help' => 'Ця схема зазвичай працює добре. 
+       'config-db-schema-help' => 'Ця схема зазвичай працює добре.
 Змінюйте її тільки якщо знаєте, що Вам це потрібно.',
        'config-pg-test-error' => "Не вдається підключитися до бази даних '''$1''': $2",
        'config-sqlite-dir' => 'Папка даних SQLite:',
@@ -20251,7 +20273,7 @@ GFDL — допустима ліцензія, але у ній важко роз
        'config-upload-deleted-help' => 'Оберіть папку для архівації видалених файлів.
 В ідеалі, вона не має бути доступною через інтернет.',
        'config-logo' => 'URL логотипу:',
-       'config-logo-help' => 'Стандартна схема оформлення MediaWiki містить вільне для логотипу місце над бічною панеллю розміром 135x160 пікселів. 
+       'config-logo-help' => 'Стандартна схема оформлення MediaWiki містить вільне для логотипу місце над бічною панеллю розміром 135x160 пікселів.
 
 Завантажте зображення відповідного розміру і введіть тут його URL.
 
@@ -20371,9 +20393,9 @@ $messages['ur'] = array(
        'config-git' => 'Git ورژن کنٹرول مصنع لطیف ملا: <code>$1</code> ۔',
        'config-git-bad' => 'GIT ورژن کنٹرول مصنع لطیف نہيں ملا ۔',
        'config-mysql-only-myisam-dep' => "' ' تنبیہ: ' '[[MyISAM|مائ اسام]] واحد دستیاب 'ذخیرہ جاتی انجن' ہے جو مائی ایس کیو ایل کے لیے ہے ، جو کہ ناموزوں ہے میڈیا وکی کے لیے ،کیوں کہ :
-* یہ ہموار قطاروں کی سہولت بمشکل فراہم کرتا ہے 
+* یہ ہموار قطاروں کی سہولت بمشکل فراہم کرتا ہے
 * یہ دوسرے انجنوں کے مقابلے  زیادہ بگڑ جاتا ہے
-* میڈیا وکی کوڈ بیس ہمیشہ سنبھال نہيں پاتا مائی اسام کو ۔ 
+* میڈیا وکی کوڈ بیس ہمیشہ سنبھال نہيں پاتا مائی اسام کو ۔
 
 آپ کا مائی ایس کیو ایل کا نصب ہمیشہ اننو ڈی بی کی سہولت نہيں دے سکتا ، ہو سکتا ہے یہ مزید ترقیاتی کام چاہے", # Fuzzy
        'config-profile-fishbowl' => 'صرف مجاز ایڈیٹرز',
index 8b15f0c..55ca014 100644 (file)
@@ -102,6 +102,7 @@ abstract class Installer {
                'mysql',
                'postgres',
                'oracle',
+               'mssql',
                'sqlite',
        );
 
@@ -505,8 +506,7 @@ abstract class Installer {
        }
 
        /**
-        * Determine if LocalSettings.php exists. If it does, return its variables,
-        * merged with those from AdminSettings.php, as an array.
+        * Determine if LocalSettings.php exists. If it does, return its variables.
         *
         * @return Array
         */
@@ -524,9 +524,6 @@ abstract class Installer {
 
                require "$IP/includes/DefaultSettings.php";
                require "$IP/LocalSettings.php";
-               if ( file_exists( "$IP/AdminSettings.php" ) ) {
-                       require "$IP/AdminSettings.php";
-               }
 
                return get_defined_vars();
        }
@@ -645,15 +642,19 @@ abstract class Installer {
                if ( !$status->isOK() ) {
                        return $status;
                }
-               $status->value->insert( 'site_stats', array(
-                       'ss_row_id' => 1,
-                       'ss_total_views' => 0,
-                       'ss_total_edits' => 0,
-                       'ss_good_articles' => 0,
-                       'ss_total_pages' => 0,
-                       'ss_users' => 0,
-                       'ss_images' => 0 ),
-                       __METHOD__, 'IGNORE' );
+               $status->value->insert(
+                       'site_stats',
+                       array(
+                               'ss_row_id' => 1,
+                               'ss_total_views' => 0,
+                               'ss_total_edits' => 0,
+                               'ss_good_articles' => 0,
+                               'ss_total_pages' => 0,
+                               'ss_users' => 0,
+                               'ss_images' => 0
+                       ),
+                       __METHOD__, 'IGNORE'
+               );
 
                return Status::newGood();
        }
index 68664c9..77c35b8 100644 (file)
@@ -223,7 +223,8 @@ class LocalSettingsGenerator {
                        }
                        if ( $this->groupPermissions['*']['edit'] === false
                                && $this->groupPermissions['*']['createaccount'] === false
-                               && $this->groupPermissions['*']['read'] !== false ) {
+                               && $this->groupPermissions['*']['read'] !== false
+                       ) {
                                $noFollow = "\n# 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"
diff --git a/includes/installer/MssqlInstaller.php b/includes/installer/MssqlInstaller.php
new file mode 100644 (file)
index 0000000..952b902
--- /dev/null
@@ -0,0 +1,692 @@
+<?php
+/**
+ * Microsoft SQL Server-specific installer.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+/**
+ * Class for setting up the MediaWiki database using Microsoft SQL Server.
+ *
+ * @ingroup Deployment
+ * @since 1.23
+ */
+class MssqlInstaller extends DatabaseInstaller {
+
+       protected $globalNames = array(
+               'wgDBserver',
+               'wgDBname',
+               'wgDBuser',
+               'wgDBpassword',
+               'wgDBmwschema',
+               'wgDBprefix',
+               'wgDBWindowsAuthentication',
+       );
+
+       protected $internalDefaults = array(
+               '_InstallUser' => 'sa',
+               '_InstallWindowsAuthentication' => 'sqlauth',
+               '_WebWindowsAuthentication' => 'sqlauth',
+       );
+
+       public $minimumVersion = '9.00.1399'; // SQL Server 2005 RTM (TODO: are SQL Express version numbers different?)
+
+       // These are schema-level privs
+       // Note: the web user will be created will full permissions if possible, this permission
+       // list is only used if we are unable to grant full permissions.
+       public $webUserPrivs = array(
+               'DELETE',
+               'INSERT',
+               'SELECT',
+               'UPDATE',
+               'EXECUTE',
+       );
+
+       /**
+        * @return string
+        */
+       public function getName() {
+               return 'mssql';
+       }
+
+       /**
+        * @return Bool
+        */
+       public function isCompiled() {
+               return self::checkExtension( 'sqlsrv' );
+       }
+
+       /**
+        * @return string
+        */
+       public function getConnectForm() {
+               if ( $this->getVar( '_InstallWindowsAuthentication' ) == 'windowsauth' ) {
+                       $displayStyle = 'display: none;';
+               } else {
+                       $displayStyle = 'display: block;';
+               }
+
+               return $this->getTextBox(
+                       'wgDBserver',
+                       'config-db-host',
+                       array(),
+                       $this->parent->getHelpBox( 'config-db-host-help' )
+               ) .
+                       Html::openElement( 'fieldset' ) .
+                       Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
+                       $this->getTextBox( 'wgDBname', 'config-db-name', array( 'dir' => 'ltr' ),
+                               $this->parent->getHelpBox( 'config-db-name-help' ) ) .
+                       $this->getTextBox( 'wgDBmwschema', 'config-db-schema', array( 'dir' => 'ltr' ),
+                               $this->parent->getHelpBox( 'config-db-schema-help' ) ) .
+                       $this->getTextBox( 'wgDBprefix', 'config-db-prefix', array( 'dir' => 'ltr' ),
+                               $this->parent->getHelpBox( 'config-db-prefix-help' ) ) .
+                       Html::closeElement( 'fieldset' ) .
+                       Html::openElement( 'fieldset' ) .
+                       Html::element( 'legend', array(), wfMessage( 'config-db-install-account' )->text() ) .
+                       $this->getRadioSet( array(
+                               'var' => '_InstallWindowsAuthentication',
+                               'label' => 'config-mssql-auth',
+                               'itemLabelPrefix' => 'config-mssql-',
+                               'values' => array( 'sqlauth', 'windowsauth' ),
+                               'itemAttribs' => array(
+                                       'sqlauth' => array(
+                                               'class' => 'showHideRadio',
+                                               'rel' => 'dbCredentialBox',
+                                       ),
+                                       'windowsauth' => array(
+                                               'class' => 'hideShowRadio',
+                                               'rel' => 'dbCredentialBox',
+                                       )
+                               ),
+                               'help' => $this->parent->getHelpBox( 'config-mssql-install-auth' )
+                       ) ) .
+                       Html::openElement( 'div', array( 'id' => 'dbCredentialBox', 'style' => $displayStyle ) ) .
+                       $this->getTextBox(
+                               '_InstallUser',
+                               'config-db-username',
+                               array( 'dir' => 'ltr' ),
+                               $this->parent->getHelpBox( 'config-db-install-username' )
+                       ) .
+                       $this->getPasswordBox(
+                               '_InstallPassword',
+                               'config-db-password',
+                               array( 'dir' => 'ltr' ),
+                               $this->parent->getHelpBox( 'config-db-install-password' )
+                       ) .
+                       Html::closeElement( 'div' ) .
+                       Html::closeElement( 'fieldset' );
+       }
+
+       public function submitConnectForm() {
+               // Get variables from the request.
+               $newValues = $this->setVarsFromRequest( array( 'wgDBserver', 'wgDBname', 'wgDBmwschema', 'wgDBprefix' ) );
+
+               // Validate them.
+               $status = Status::newGood();
+               if ( !strlen( $newValues['wgDBserver'] ) ) {
+                       $status->fatal( 'config-missing-db-host' );
+               }
+               if ( !strlen( $newValues['wgDBname'] ) ) {
+                       $status->fatal( 'config-missing-db-name' );
+               } elseif ( !preg_match( '/^[a-z0-9_]+$/i', $newValues['wgDBname'] ) ) {
+                       $status->fatal( 'config-invalid-db-name', $newValues['wgDBname'] );
+               }
+               if ( !preg_match( '/^[a-z0-9_]*$/i', $newValues['wgDBmwschema'] ) ) {
+                       $status->fatal( 'config-invalid-schema', $newValues['wgDBmwschema'] );
+               }
+               if ( !preg_match( '/^[a-z0-9_]*$/i', $newValues['wgDBprefix'] ) ) {
+                       $status->fatal( 'config-invalid-db-prefix', $newValues['wgDBprefix'] );
+               }
+               if ( !$status->isOK() ) {
+                       return $status;
+               }
+
+               // Check for blank schema and remap to dbo
+               if ( $newValues['wgDBmwschema'] === '' ) {
+                       $this->setVar( 'wgDBmwschema', 'dbo' );
+               }
+
+               // User box
+               $this->setVarsFromRequest( array( '_InstallUser', '_InstallPassword', '_InstallWindowsAuthentication' ) );
+
+               // Try to connect
+               $status = $this->getConnection();
+               if ( !$status->isOK() ) {
+                       return $status;
+               }
+               /**
+                * @var $conn DatabaseBase
+                */
+               $conn = $status->value;
+
+               // Check version
+               $version = $conn->getServerVersion();
+               if ( version_compare( $version, $this->minimumVersion ) < 0 ) {
+                       return Status::newFatal( 'config-mssql-old', $this->minimumVersion, $version );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @return Status
+        */
+       public function openConnection() {
+               global $wgDBWindowsAuthentication;
+               $status = Status::newGood();
+               $user = $this->getVar( '_InstallUser' );
+               $password = $this->getVar( '_InstallPassword' );
+
+               if ( $this->getVar( '_InstallWindowsAuthentication' ) == 'windowsauth' ) {
+                       // Use Windows authentication for this connection
+                       $wgDBWindowsAuthentication = true;
+               } else {
+                       $wgDBWindowsAuthentication = false;
+               }
+
+               try {
+                       $db = DatabaseBase::factory( 'mssql', array(
+                               'host' => $this->getVar( 'wgDBserver' ),
+                               'user' => $user,
+                               'password' => $password,
+                               'dbname' => false,
+                               'flags' => 0,
+                               'tablePrefix' => $this->getVar( 'wgDBprefix' ) ) );
+                       $db->prepareStatements( false );
+                       $db->scrollableCursor( false );
+                       $status->value = $db;
+               } catch ( DBConnectionError $e ) {
+                       $status->fatal( 'config-connection-error', $e->getMessage() );
+               }
+
+               return $status;
+       }
+
+       public function preUpgrade() {
+               global $wgDBuser, $wgDBpassword;
+
+               $status = $this->getConnection();
+               if ( !$status->isOK() ) {
+                       $this->parent->showStatusError( $status );
+
+                       return;
+               }
+               /**
+                * @var $conn DatabaseBase
+                */
+               $conn = $status->value;
+               $conn->selectDB( $this->getVar( 'wgDBname' ) );
+
+               # Normal user and password are selected after this step, so for now
+               # just copy these two
+               $wgDBuser = $this->getVar( '_InstallUser' );
+               $wgDBpassword = $this->getVar( '_InstallPassword' );
+       }
+
+       /**
+        * Return true if the install user can create accounts
+        *
+        * @return bool
+        */
+       public function canCreateAccounts() {
+               $status = $this->getConnection();
+               if ( !$status->isOK() ) {
+                       return false;
+               }
+               /** @var $conn DatabaseBase */
+               $conn = $status->value;
+
+               // We need the server-level ALTER ANY LOGIN permission to create new accounts
+               $res = $conn->query( "SELECT permission_name FROM sys.fn_my_permissions( NULL, 'SERVER' )" );
+               $serverPrivs = array(
+                       'ALTER ANY LOGIN' => false,
+                       'CONTROL SERVER' => false,
+               );
+
+               foreach ( $res as $row ) {
+                       $serverPrivs[$row->permission_name] = true;
+               }
+
+               if ( !$serverPrivs['ALTER ANY LOGIN'] ) {
+                       return false;
+               }
+
+               // Check to ensure we can grant everything needed as well
+               // We can't actually tell if we have WITH GRANT OPTION for a given permission, so we assume we do
+               // and just check for the permission
+               // http://technet.microsoft.com/en-us/library/ms178569.aspx
+               // The following array sets up which permissions imply whatever permissions we specify
+               $implied = array(
+                       // schema           database   server
+                       'DELETE'  => array( 'DELETE',  'CONTROL SERVER' ),
+                       'EXECUTE' => array( 'EXECUTE', 'CONTROL SERVER' ),
+                       'INSERT'  => array( 'INSERT',  'CONTROL SERVER' ),
+                       'SELECT'  => array( 'SELECT',  'CONTROL SERVER' ),
+                       'UPDATE'  => array( 'UPDATE',  'CONTROL SERVER' ),
+               );
+
+               $grantOptions = array_flip( $this->webUserPrivs );
+
+               // Check for schema and db-level permissions, but only if the schema/db exists
+               $schemaPrivs = $dbPrivs = array(
+                       'DELETE' => false,
+                       'EXECUTE' => false,
+                       'INSERT' => false,
+                       'SELECT' => false,
+                       'UPDATE' => false,
+               );
+
+               $dbPrivs['ALTER ANY USER'] = false;
+
+               if ( $this->databaseExists( $this->getVar( 'wgDBname' ) ) ) {
+                       $conn->selectDB( $this->getVar( 'wgDBname' ) );
+                       $res = $conn->query( "SELECT permission_name FROM sys.fn_my_permissions( NULL, 'DATABASE' )" );
+
+                       foreach ( $res as $row ) {
+                               $dbPrivs[$row->permission_name] = true;
+                       }
+
+                       // If the db exists, we need ALTER ANY USER privs on it to make a new user
+                       if ( !$dbPrivs['ALTER ANY USER'] ) {
+                               return false;
+                       }
+
+                       if ( $this->schemaExists( $this->getVar( 'wgDBmwschema' ) ) ) {
+                               // wgDBmwschema is validated to only contain alphanumeric + underscore, so this is safe
+                               $res = $conn->query( "SELECT permission_name FROM sys.fn_my_permissions( '{$this->getVar( 'wgDBmwschema' )}', 'SCHEMA' )" );
+
+                               foreach ( $res as $row ) {
+                                       $schemaPrivs[$row->permission_name] = true;
+                               }
+                       }
+               }
+
+               // Now check all the grants we'll need to be doing to see if we can
+               foreach ( $this->webUserPrivs as $permission ) {
+                       if ( ( isset( $schemaPrivs[$permission] ) && $schemaPrivs[$permission] )
+                                       || ( isset( $dbPrivs[$implied[$permission][0]] ) && $dbPrivs[$implied[$permission][0]] )
+                                       || ( isset( $serverPrivs[$implied[$permission][1]] ) && $serverPrivs[$implied[$permission][1]] ) ) {
+
+                               unset( $grantOptions[$permission] );
+                       }
+               }
+
+               if ( count( $grantOptions ) ) {
+                       // Can't grant everything
+                       return false;
+               }
+
+               return true;
+       }
+
+       /**
+        * @return string
+        */
+       public function getSettingsForm() {
+               if ( $this->canCreateAccounts() ) {
+                       $noCreateMsg = false;
+               } else {
+                       $noCreateMsg = 'config-db-web-no-create-privs';
+               }
+               $wrapperStyle = $this->getVar( '_SameAccount' ) ? 'display: none' : '';
+               $displayStyle = $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth' ? 'display: none' : '';
+               $s = Html::openElement( 'fieldset' ) .
+                       Html::element( 'legend', array(), wfMessage( 'config-db-web-account' )->text() ) .
+                       $this->getCheckBox(
+                               '_SameAccount', 'config-db-web-account-same',
+                               array( 'class' => 'hideShowRadio', 'rel' => 'dbOtherAccount' )
+                       ) .
+                       Html::openElement( 'div', array( 'id' => 'dbOtherAccount', 'style' => $wrapperStyle ) ) .
+                       $this->getRadioSet( array(
+                               'var' => '_WebWindowsAuthentication',
+                               'label' => 'config-mssql-auth',
+                               'itemLabelPrefix' => 'config-mssql-',
+                               'values' => array( 'sqlauth', 'windowsauth' ),
+                               'itemAttribs' => array(
+                                       'sqlauth' => array(
+                                               'class' => 'showHideRadio',
+                                               'rel' => 'dbCredentialBox',
+                                       ),
+                                       'windowsauth' => array(
+                                               'class' => 'hideShowRadio',
+                                               'rel' => 'dbCredentialBox',
+                                       )
+                               ),
+                               'help' => $this->parent->getHelpBox( 'config-mssql-web-auth' )
+                       ) ) .
+                       Html::openElement( 'div', array( 'id' => 'dbCredentialBox', 'style' => $displayStyle ) ) .
+                       $this->getTextBox( 'wgDBuser', 'config-db-username' ) .
+                       $this->getPasswordBox( 'wgDBpassword', 'config-db-password' ) .
+                       Html::closeElement( 'div' );
+
+               if ( $noCreateMsg ) {
+                       $s .= $this->parent->getWarningBox( wfMessage( $noCreateMsg )->plain() );
+               } else {
+                       $s .= $this->getCheckBox( '_CreateDBAccount', 'config-db-web-create' );
+               }
+
+               $s .= Html::closeElement( 'div' ) . Html::closeElement( 'fieldset' );
+
+               return $s;
+       }
+
+       /**
+        * @return Status
+        */
+       public function submitSettingsForm() {
+               $this->setVarsFromRequest(
+                       array( 'wgDBuser', 'wgDBpassword', '_SameAccount', '_CreateDBAccount', '_WebWindowsAuthentication' )
+               );
+
+               if ( $this->getVar( '_SameAccount' ) ) {
+                       $this->setVar( '_WebWindowsAuthentication', $this->getVar( '_InstallWindowsAuthentication' ) );
+                       $this->setVar( 'wgDBuser', $this->getVar( '_InstallUser' ) );
+                       $this->setVar( 'wgDBpassword', $this->getVar( '_InstallPassword' ) );
+               }
+
+               if ( $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth' ) {
+                       $this->setVar( 'wgDBuser', '' );
+                       $this->setVar( 'wgDBpassword', '' );
+                       $this->setVar( 'wgDBWindowsAuthentication', true );
+               } else {
+                       $this->setVar( 'wgDBWindowsAuthentication', false );
+               }
+
+               if ( $this->getVar( '_CreateDBAccount' ) && $this->getVar( '_WebWindowsAuthentication' ) == 'sqlauth' && strval( $this->getVar( 'wgDBpassword' ) ) == '' ) {
+                       return Status::newFatal( 'config-db-password-empty', $this->getVar( 'wgDBuser' ) );
+               }
+
+               // Validate the create checkbox
+               $canCreate = $this->canCreateAccounts();
+               if ( !$canCreate ) {
+                       $this->setVar( '_CreateDBAccount', false );
+                       $create = false;
+               } else {
+                       $create = $this->getVar( '_CreateDBAccount' );
+               }
+
+               if ( !$create ) {
+                       // Test the web account
+                       $user = $this->getVar( 'wgDBuser' );
+                       $password = $this->getVar( 'wgDBpassword' );
+
+                       if ( $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth' ) {
+                               $user = 'windowsauth';
+                               $password = 'windowsauth';
+                       }
+
+                       try {
+                               DatabaseBase::factory( 'mssql', array(
+                                       'host' => $this->getVar( 'wgDBserver' ),
+                                       'user' => $user,
+                                       'password' => $password,
+                                       'dbname' => false,
+                                       'flags' => 0,
+                                       'tablePrefix' => $this->getVar( 'wgDBprefix' ),
+                                       'schema' => $this->getVar( 'wgDBmwschema' ),
+                               ) );
+                       } catch ( DBConnectionError $e ) {
+                               return Status::newFatal( 'config-connection-error', $e->getMessage() );
+                       }
+               }
+
+               return Status::newGood();
+       }
+
+       public function preInstall() {
+               # Add our user callback to installSteps, right before the tables are created.
+               $callback = array(
+                       'name' => 'user',
+                       'callback' => array( $this, 'setupUser' ),
+               );
+               $this->parent->addInstallStep( $callback, 'tables' );
+       }
+
+       /**
+        * @return Status
+        */
+       public function setupDatabase() {
+               $status = $this->getConnection();
+               if ( !$status->isOK() ) {
+                       return $status;
+               }
+               /** @var DatabaseBase $conn */
+               $conn = $status->value;
+               $dbName = $this->getVar( 'wgDBname' );
+               $schemaName = $this->getVar( 'wgDBmwschema' );
+               if ( !$this->databaseExists( $dbName ) ) {
+                       $conn->query( "CREATE DATABASE " . $conn->addIdentifierQuotes( $dbName ), __METHOD__ );
+                       $conn->selectDB( $dbName );
+                       if ( !$this->schemaExists( $schemaName ) ) {
+                               $conn->query( "CREATE SCHEMA " . $conn->addIdentifierQuotes( $schemaName ), __METHOD__ );
+                       }
+                       if ( !$this->catalogExists( $schemaName ) ) {
+                               $conn->query( "CREATE FULLTEXT CATALOG " . $conn->addIdentifierQuotes( $schemaName ), __METHOD__ );
+                       }
+               }
+               $this->setupSchemaVars();
+
+               return $status;
+       }
+
+       /**
+        * @return Status
+        */
+       public function setupUser() {
+               $dbUser = $this->getVar( 'wgDBuser' );
+               if ( $dbUser == $this->getVar( '_InstallUser' )
+                               || ( $this->getVar( '_InstallWindowsAuthentication' ) == 'windowsauth'
+                                       && $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth' ) ) {
+                       return Status::newGood();
+               }
+               $status = $this->getConnection();
+               if ( !$status->isOK() ) {
+                       return $status;
+               }
+
+               $this->setupSchemaVars();
+               $dbName = $this->getVar( 'wgDBname' );
+               $this->db->selectDB( $dbName );
+               $server = $this->getVar( 'wgDBserver' );
+               $password = $this->getVar( 'wgDBpassword' );
+               $schemaName = $this->getVar( 'wgDBmwschema' );
+
+               if ( $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth' ) {
+                       $dbUser = 'windowsauth';
+                       $password = 'windowsauth';
+               }
+
+               if ( $this->getVar( '_CreateDBAccount' ) ) {
+                       $tryToCreate = true;
+               } else {
+                       $tryToCreate = false;
+               }
+
+               $escUser = $this->db->addIdentifierQuotes( $dbUser );
+               $escDb = $this->db->addIdentifierQuotes( $dbName );
+               $escSchema = $this->db->addIdentifierQuotes( $schemaName );
+               $grantableNames = array();
+               if ( $tryToCreate ) {
+                       $escPass = $this->db->addQuotes( $password );
+
+                       if ( !$this->loginExists( $dbUser ) ) {
+                               try {
+                                       $this->db->begin();
+                                       $this->db->selectDB( 'master' );
+                                       $logintype = $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth' ? 'FROM WINDOWS' : "WITH PASSWORD = $escPass";
+                                       $this->db->query( "CREATE LOGIN $escUser $logintype" );
+                                       $this->db->selectDB( $dbName );
+                                       $this->db->query( "CREATE USER $escUser FOR LOGIN $escUser WITH DEFAULT_SCHEMA = $escSchema" );
+                                       $this->db->commit();
+                                       $grantableNames[] = $dbUser;
+                               } catch ( DBQueryError $dqe ) {
+                                       $this->db->rollback();
+                                       $status->warning( 'config-install-user-create-failed', $dbUser, $dqe->getText() );
+                               }
+                       } elseif ( !$this->userExists( $dbUser ) ) {
+                               try {
+                                       $this->db->begin();
+                                       $this->db->selectDB( $dbName );
+                                       $this->db->query( "CREATE USER $escUser FOR LOGIN $escUser WITH DEFAULT_SCHEMA = $escSchema" );
+                                       $this->db->commit();
+                                       $grantableNames[] = $dbUser;
+                               } catch ( DBQueryError $dqe ) {
+                                       $this->db->rollback();
+                                       $status->warning( 'config-install-user-create-failed', $dbUser, $dqe->getText() );
+                               }
+                       } else {
+                               $status->warning( 'config-install-user-alreadyexists', $dbUser );
+                               $grantableNames[] = $dbUser;
+                       }
+               }
+
+               // Try to grant to all the users we know exist or we were able to create
+               $this->db->selectDB( $dbName );
+               foreach ( $grantableNames as $name ) {
+                       try {
+                               // First try to grant full permissions
+                               $fullPrivArr = array(
+                                       'BACKUP DATABASE', 'BACKUP LOG', 'CREATE FUNCTION', 'CREATE PROCEDURE',
+                                       'CREATE TABLE', 'CREATE VIEW', 'CREATE FULLTEXT CATALOG', 'SHOWPLAN'
+                               );
+                               $fullPrivList = implode( ', ', $fullPrivArr );
+                               $this->db->begin();
+                               $this->db->query( "GRANT $fullPrivList ON DATABASE :: $escDb TO $escUser", __METHOD__ );
+                               $this->db->query( "GRANT CONTROL ON SCHEMA :: $escSchema TO $escUser", __METHOD__ );
+                               $this->db->commit();
+                       } catch ( DBQueryError $dqe ) {
+                               // If that fails, try to grant the limited subset specified in $this->webUserPrivs
+                               try {
+                                       $privList = implode( ', ', $this->webUserPrivs );
+                                       $this->db->rollback();
+                                       $this->db->begin();
+                                       $this->db->query( "GRANT $privList ON SCHEMA :: $escSchema TO $escUser", __METHOD__ );
+                                       $this->db->commit();
+                               } catch ( DBQueryError $dqe ) {
+                                       $this->db->rollback();
+                                       $status->fatal( 'config-install-user-grant-failed', $dbUser, $dqe->getText() );
+                               }
+                               // Also try to grant SHOWPLAN on the db, but don't fail if we can't
+                               // (just makes a couple things in mediawiki run slower since
+                               // we have to run SELECT COUNT(*) instead of getting the query plan)
+                               try {
+                                       $this->db->query( "GRANT SHOWPLAN ON DATABASE :: $escDb TO $escUser", __METHOD__ );
+                               } catch ( DBQueryError $dqe ) {
+                               }
+                       }
+               }
+
+               return $status;
+       }
+
+       public function createTables() {
+               $status = parent::createTables();
+
+               // Do last-minute stuff like fulltext indexes (since they can't be inside a transaction)
+               if ( $status->isOk() ) {
+                       $searchindex = $this->db->tableName( 'searchindex' );
+                       $schema = $this->db->addIdentifierQuotes( $this->getVar( 'wgDBmwschema' ) );
+                       try {
+                               $this->db->query( "CREATE FULLTEXT INDEX ON $searchindex (si_title, si_text) KEY INDEX si_page ON $schema" );
+                       } catch ( DBQueryError $dqe ) {
+                               $status->fatal( 'config-install-tables-failed', $dqe->getText() );
+                       }
+               }
+
+               return $status;
+       }
+
+       /**
+        * Try to see if the login exists
+        * @param string $user Username to check
+        * @return boolean
+        */
+       private function loginExists( $user ) {
+               $res = $this->db->selectField( 'sys.sql_logins', 1, array( 'name' => $user ) );
+               return (bool)$res;
+       }
+
+       /**
+        * Try to see if the user account exists
+        * We assume we already have the appropriate database selected
+        * @param string $user Username to check
+        * @return boolean
+        */
+       private function userExists( $user ) {
+               $res = $this->db->selectField( 'sys.sysusers', 1, array( 'name' => $user ) );
+               return (bool)$res;
+       }
+
+       /**
+        * Try to see if a given database exists
+        * @param string $dbName Database name to check
+        * @return boolean
+        */
+       private function databaseExists( $dbName ) {
+               $res = $this->db->selectField( 'sys.databases', 1, array( 'name' => $dbName ) );
+               return (bool)$res;
+       }
+
+       /**
+        * Try to see if a given schema exists
+        * We assume we already have the appropriate database selected
+        * @param string $schemaName Schema name to check
+        * @return boolean
+        */
+       private function schemaExists( $schemaName ) {
+               $res = $this->db->selectField( 'sys.schemas', 1, array( 'name' => $schemaName ) );
+               return (bool)$res;
+       }
+
+       /**
+        * Try to see if a given fulltext catalog exists
+        * We assume we already have the appropriate database selected
+        * @param string $schemaName Catalog name to check
+        * @return boolean
+        */
+       private function catalogExists( $catalogName ) {
+               $res = $this->db->selectField( 'sys.fulltext_catalogs', 1, array( 'name' => $catalogName ) );
+               return (bool)$res;
+       }
+
+       /**
+        * Get variables to substitute into tables.sql and the SQL patch files.
+        *
+        * @return array
+        */
+       public function getSchemaVars() {
+               return array(
+                       'wgDBname' => $this->getVar( 'wgDBname' ),
+                       'wgDBmwschema' => $this->getVar( 'wgDBmwschema' ),
+                       'wgDBuser' => $this->getVar( 'wgDBuser' ),
+                       'wgDBpassword' => $this->getVar( 'wgDBpassword' ),
+               );
+       }
+
+       public function getLocalSettings() {
+               $schema = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgDBmwschema' ) );
+               $prefix = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgDBprefix' ) );
+               $windowsauth = $this->getVar( 'wgDBWindowsAuthentication' ) ? 'true' : 'false';
+
+               return "# MSSQL specific settings
+\$wgDBWindowsAuthentication = {$windowsauth};
+\$wgDBmwschema = \"{$schema}\";
+\$wgDBprefix = \"{$prefix}\";";
+       }
+}
diff --git a/includes/installer/MssqlUpdater.php b/includes/installer/MssqlUpdater.php
new file mode 100644 (file)
index 0000000..7d3833b
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Microsoft SQL Server-specific installer.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+/**
+ * Class for setting up the MediaWiki database using Microsoft SQL Server.
+ *
+ * @ingroup Deployment
+ * @since 1.23
+ */
+
+class MssqlUpdater extends DatabaseUpdater {
+
+       /**
+        * @var DatabaseMssql
+        */
+       protected $db;
+
+       protected function getCoreUpdateList() {
+               return array(
+                       array( 'disableContentHandlerUseDB' ),
+
+                       // 1.23
+
+               );
+       }
+}
index 9dfbff8..33ff65e 100644 (file)
@@ -28,7 +28,6 @@
  * @since 1.17
  */
 class MysqlUpdater extends DatabaseUpdater {
-
        protected function getCoreUpdateList() {
                return array(
                        array( 'disableContentHandlerUseDB' ),
@@ -246,8 +245,9 @@ class MysqlUpdater extends DatabaseUpdater {
 
                        // 1.23
                        array( 'addField', 'recentchanges', 'rc_source', 'patch-rc_source.sql' ),
-                       array( 'addIndex', 'logging', 'log_user_text_type_time',  'patch-logging_user_text_type_time_index.sql' ),
-                       array( 'addIndex', 'logging', 'log_user_text_time',  'patch-logging_user_text_time_index.sql' ),
+                       array( 'addIndex', 'logging', 'log_user_text_type_time',
+                               'patch-logging_user_text_type_time_index.sql' ),
+                       array( 'addIndex', 'logging', 'log_user_text_time', 'patch-logging_user_text_time_index.sql' ),
                        array( 'addField', 'page', 'page_links_updated', 'patch-page_links_updated.sql' ),
                );
        }
index 88e5fbd..6c56b3a 100644 (file)
@@ -94,8 +94,8 @@ class OracleUpdater extends DatabaseUpdater {
                                'patch-ufg_group-length-increase-255.sql' ),
 
                        //1.23
-                       array( 'addIndex', 'logging', 'i06',  'patch-logging_user_text_type_time_index.sql' ),
-                       array( 'addIndex', 'logging', 'i07',  'patch-logging_user_text_time_index.sql' ),
+                       array( 'addIndex', 'logging', 'i06', 'patch-logging_user_text_type_time_index.sql' ),
+                       array( 'addIndex', 'logging', 'i07', 'patch-logging_user_text_time_index.sql' ),
 
                        // KEEP THIS AT THE BOTTOM!!
                        array( 'doRebuildDuplicateFunction' ),
index fa58a62..1e0651c 100644 (file)
@@ -27,7 +27,6 @@
  * @ingroup Deployment
  * @since 1.17
  */
-
 class PostgresUpdater extends DatabaseUpdater {
 
        /**
@@ -169,6 +168,7 @@ class PostgresUpdater extends DatabaseUpdater {
                                "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('archive_ar_id_seq')" ),
                        array( 'addPgField', 'externallinks', 'el_id',
                                "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('externallinks_el_id_seq')" ),
+                       array( 'addPgField', 'uploadstash', 'us_props', "BYTEA" ),
 
                        # type changes
                        array( 'changeField', 'archive', 'ar_deleted', 'smallint', '' ),
@@ -259,7 +259,8 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgIndex', 'job', 'job_cmd_token', '(job_cmd, job_token, job_random)' ),
                        array( 'addPgIndex', 'job', 'job_cmd_token_id', '(job_cmd, job_token, job_id)' ),
                        array( 'addPgIndex', 'filearchive', 'fa_sha1', '(fa_sha1)' ),
-                       array( 'addPgIndex', 'logging', 'logging_user_text_type_time', '(log_user_text, log_type, log_timestamp)' ),
+                       array( 'addPgIndex', 'logging', 'logging_user_text_type_time',
+                               '(log_user_text, log_type, log_timestamp)' ),
                        array( 'addPgIndex', 'logging', 'logging_user_text_time', '(log_user_text, log_timestamp)' ),
 
                        array( 'checkIndex', 'pagelink_unique', array(
index 3db3758..2869d1f 100644 (file)
@@ -123,8 +123,9 @@ class SqliteUpdater extends DatabaseUpdater {
 
                        // 1.23
                        array( 'addField', 'recentchanges', 'rc_source', 'patch-rc_source.sql' ),
-                       array( 'addIndex', 'logging', 'log_user_text_type_time',  'patch-logging_user_text_type_time_index.sql' ),
-                       array( 'addIndex', 'logging', 'log_user_text_time',  'patch-logging_user_text_time_index.sql' ),
+                       array( 'addIndex', 'logging', 'log_user_text_type_time',
+                               'patch-logging_user_text_type_time_index.sql' ),
+                       array( 'addIndex', 'logging', 'log_user_text_time', 'patch-logging_user_text_time_index.sql' ),
                        array( 'addField', 'page', 'page_links_updated', 'patch-page_links_updated.sql' ),
                );
        }
index d4b3d65..f83db54 100644 (file)
@@ -380,7 +380,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
 
        /**
         * Initiate an upgrade of the existing database
-        * @param array $vars Variables from LocalSettings.php and AdminSettings.php
+        * @param array $vars Variables from LocalSettings.php
         * @return Status
         */
        protected function handleExistingUpgrade( $vars ) {
@@ -827,7 +827,11 @@ class WebInstaller_Name extends WebInstallerPage {
                $msg = false;
                $pwd = $this->getVar( '_AdminPassword' );
                $user = User::newFromName( $cname );
-               $valid = $user && $user->getPasswordValidity( $pwd );
+               if ( $user ) {
+                       $valid = $user->getPasswordValidity( $pwd );
+               } else {
+                       $valid = 'config-admin-name-invalid';
+               }
                if ( strval( $pwd ) === '' ) {
                        # $user->getPasswordValidity just checks for $wgMinimalPasswordLength.
                        # This message is more specific and helpful.
@@ -835,8 +839,6 @@ class WebInstaller_Name extends WebInstallerPage {
                } elseif ( $pwd !== $this->getVar( '_AdminPassword2' ) ) {
                        $msg = 'config-admin-password-mismatch';
                } elseif ( $valid !== true ) {
-                       # As of writing this will only catch the username being e.g. 'FOO' and
-                       # the password 'foo'
                        $msg = $valid;
                }
                if ( $msg !== false ) {
@@ -1291,7 +1293,7 @@ class WebInstaller_Complete extends WebInstallerPage {
                ) {
                        // JS appears to be the only method that works consistently with IE7+
                        $this->addHtml( "\n<script>jQuery( function () { document.location = " .
-                       Xml::encodeJsVar( $lsUrl ) . "; } );</script>\n" );
+                               Xml::encodeJsVar( $lsUrl ) . "; } );</script>\n" );
                } else {
                        $this->parent->request->response()->header( "Refresh: 0;url=$lsUrl" );
                }
index 212871e..3422664 100644 (file)
@@ -120,7 +120,7 @@ class JobQueueRedis extends JobQueue {
                try {
                        return $conn->lSize( $this->getQueueKey( 'l-unclaimed' ) );
                } catch ( RedisException $e ) {
-                       $this->throwRedisException( $this->server, $conn, $e );
+                       $this->throwRedisException( $conn, $e );
                }
        }
 
@@ -141,7 +141,7 @@ class JobQueueRedis extends JobQueue {
 
                        return array_sum( $conn->exec() );
                } catch ( RedisException $e ) {
-                       $this->throwRedisException( $this->server, $conn, $e );
+                       $this->throwRedisException( $conn, $e );
                }
        }
 
@@ -158,7 +158,7 @@ class JobQueueRedis extends JobQueue {
                try {
                        return $conn->zSize( $this->getQueueKey( 'z-delayed' ) );
                } catch ( RedisException $e ) {
-                       $this->throwRedisException( $this->server, $conn, $e );
+                       $this->throwRedisException( $conn, $e );
                }
        }
 
@@ -175,7 +175,7 @@ class JobQueueRedis extends JobQueue {
                try {
                        return $conn->zSize( $this->getQueueKey( 'z-abandoned' ) );
                } catch ( RedisException $e ) {
-                       $this->throwRedisException( $this->server, $conn, $e );
+                       $this->throwRedisException( $conn, $e );
                }
        }
 
@@ -229,7 +229,7 @@ class JobQueueRedis extends JobQueue {
                        JobQueue::incrStats( 'job-insert-duplicate', $this->type,
                                count( $items ) - $failed - $pushed );
                } catch ( RedisException $e ) {
-                       $this->throwRedisException( $this->server, $conn, $e );
+                       $this->throwRedisException( $conn, $e );
                }
 
                return true;
@@ -300,7 +300,7 @@ LUA;
                // Push ready delayed jobs into the queue every 10 jobs to spread the load.
                // This is also done as a periodic task, but we don't want too much done at once.
                if ( $this->checkDelay && mt_rand( 0, 9 ) == 0 ) {
-                       $this->releaseReadyDelayedJobs();
+                       $this->recyclePruneAndUndelayJobs();
                }
 
                $conn = $this->getConnection();
@@ -309,7 +309,7 @@ LUA;
                                if ( $this->claimTTL > 0 ) {
                                        // Keep the claimed job list down for high-traffic queues
                                        if ( mt_rand( 0, 99 ) == 0 ) {
-                                               $this->recycleAndDeleteStaleJobs();
+                                               $this->recyclePruneAndUndelayJobs();
                                        }
                                        $blob = $this->popAndAcquireBlob( $conn );
                                } else {
@@ -326,11 +326,11 @@ LUA;
                                        continue;
                                }
 
-                               // If $item is invalid, recycleAndDeleteStaleJobs() will cleanup as needed
+                               // If $item is invalid, recyclePruneAndUndelayJobs() will cleanup as needed
                                $job = $this->getJobFromFields( $item ); // may be false
                        } while ( !$job ); // job may be false if invalid
                } catch ( RedisException $e ) {
-                       $this->throwRedisException( $this->server, $conn, $e );
+                       $this->throwRedisException( $conn, $e );
                }
 
                return $job;
@@ -442,7 +442,7 @@ LUA;
                                        return false;
                                }
                        } catch ( RedisException $e ) {
-                               $this->throwRedisException( $this->server, $conn, $e );
+                               $this->throwRedisException( $conn, $e );
                        }
                }
 
@@ -473,7 +473,7 @@ LUA;
                        // Update the timestamp of the last root job started at the location...
                        return $conn->set( $key, $params['rootJobTimestamp'], self::ROOTJOB_TTL ); // 2 weeks
                } catch ( RedisException $e ) {
-                       $this->throwRedisException( $this->server, $conn, $e );
+                       $this->throwRedisException( $conn, $e );
                }
        }
 
@@ -494,7 +494,7 @@ LUA;
                        // Get the last time this root job was enqueued
                        $timestamp = $conn->get( $this->getRootJobCacheKey( $params['rootJobSignature'] ) );
                } catch ( RedisException $e ) {
-                       $this->throwRedisException( $this->server, $conn, $e );
+                       $this->throwRedisException( $conn, $e );
                }
 
                // Check if a new root job was started at the location after this one's...
@@ -519,7 +519,7 @@ LUA;
 
                        return ( $conn->delete( $keys ) !== false );
                } catch ( RedisException $e ) {
-                       $this->throwRedisException( $this->server, $conn, $e );
+                       $this->throwRedisException( $conn, $e );
                }
        }
 
@@ -542,7 +542,7 @@ LUA;
                                } )
                        );
                } catch ( RedisException $e ) {
-                       $this->throwRedisException( $this->server, $conn, $e );
+                       $this->throwRedisException( $conn, $e );
                }
        }
 
@@ -565,7 +565,7 @@ LUA;
                                } )
                        );
                } catch ( RedisException $e ) {
-                       $this->throwRedisException( $this->server, $conn, $e );
+                       $this->throwRedisException( $conn, $e );
                }
        }
 
@@ -580,8 +580,8 @@ LUA;
        protected function doGetSiblingQueueSizes( array $types ) {
                $sizes = array(); // (type => size)
                $types = array_values( $types ); // reindex
+               $conn = $this->getConnection();
                try {
-                       $conn = $this->getConnection();
                        $conn->multi( Redis::PIPELINE );
                        foreach ( $types as $type ) {
                                $conn->lSize( $this->getQueueKey( 'l-unclaimed', $type ) );
@@ -593,7 +593,7 @@ LUA;
                                }
                        }
                } catch ( RedisException $e ) {
-                       $this->throwRedisException( $this->server, $conn, $e );
+                       $this->throwRedisException( $conn, $e );
                }
 
                return $sizes;
@@ -623,58 +623,18 @@ LUA;
 
                        return $job;
                } catch ( RedisException $e ) {
-                       $this->throwRedisException( $this->server, $conn, $e );
-               }
-       }
-
-       /**
-        * Release any ready delayed jobs into the queue
-        *
-        * @return int Number of jobs released
-        * @throws JobQueueError
-        */
-       public function releaseReadyDelayedJobs() {
-               $count = 0;
-
-               $conn = $this->getConnection();
-               try {
-                       static $script =
-<<<LUA
-                       local kDelayed, kUnclaimed = unpack(KEYS)
-                       -- Get the list of ready delayed jobs, sorted by readiness
-                       local ids = redis.call('zRangeByScore',kDelayed,0,ARGV[1])
-                       -- Migrate the jobs from the "delayed" set to the "unclaimed" list
-                       for k,id in ipairs(ids) do
-                               redis.call('lPush',kUnclaimed,id)
-                               redis.call('zRem',kDelayed,id)
-                       end
-                       return #ids
-LUA;
-                       $count += (int)$conn->luaEval( $script,
-                               array(
-                                       $this->getQueueKey( 'z-delayed' ), // KEYS[1]
-                                       $this->getQueueKey( 'l-unclaimed' ), // KEYS[2]
-                                       time() // ARGV[1]; max "delay until" UNIX timestamp
-                               ),
-                               2 # first two arguments are keys
-                       );
-               } catch ( RedisException $e ) {
-                       $this->throwRedisException( $this->server, $conn, $e );
+                       $this->throwRedisException( $conn, $e );
                }
-
-               return $count;
        }
 
        /**
         * Recycle or destroy any jobs that have been claimed for too long
+        * and release any ready delayed jobs into the queue
         *
-        * @return int Number of jobs recycled/deleted
+        * @return int Number of jobs recycled/deleted/undelayed
         * @throws MWException|JobQueueError
         */
-       public function recycleAndDeleteStaleJobs() {
-               if ( $this->claimTTL <= 0 ) { // sanity
-                       throw new MWException( "Cannot recycle jobs since acknowledgements are disabled." );
-               }
+       public function recyclePruneAndUndelayJobs() {
                $count = 0;
                // For each job item that can be retried, we need to add it back to the
                // main queue and remove it from the list of currenty claimed job items.
@@ -685,8 +645,8 @@ LUA;
                        $now = time();
                        static $script =
 <<<LUA
-                       local kClaimed, kAttempts, kUnclaimed, kData, kAbandoned = unpack(KEYS)
-                       local released,abandoned,pruned = 0,0,0
+                       local kClaimed, kAttempts, kUnclaimed, kData, kAbandoned, kDelayed = unpack(KEYS)
+                       local released,abandoned,pruned,undelayed = 0,0,0,0
                        -- Get all non-dead jobs that have an expired claim on them.
                        -- The score for each item is the last claim timestamp (UNIX).
                        local staleClaims = redis.call('zRangeByScore',kClaimed,0,ARGV[1])
@@ -715,7 +675,15 @@ LUA;
                                redis.call('hDel',kData,id)
                                pruned = pruned + 1
                        end
-                       return {released,abandoned,pruned}
+                       -- Get the list of ready delayed jobs, sorted by readiness (UNIX timestamp)
+                       local ids = redis.call('zRangeByScore',kDelayed,0,ARGV[4])
+                       -- Migrate the jobs from the "delayed" set to the "unclaimed" list
+                       for k,id in ipairs(ids) do
+                               redis.call('lPush',kUnclaimed,id)
+                               redis.call('zRem',kDelayed,id)
+                       end
+                       undelayed = #ids
+                       return {released,abandoned,pruned,undelayed}
 LUA;
                        $res = $conn->luaEval( $script,
                                array(
@@ -724,20 +692,22 @@ LUA;
                                        $this->getQueueKey( 'l-unclaimed' ), # KEYS[3]
                                        $this->getQueueKey( 'h-data' ), # KEYS[4]
                                        $this->getQueueKey( 'z-abandoned' ), # KEYS[5]
+                                       $this->getQueueKey( 'z-delayed' ), # KEYS[6]
                                        $now - $this->claimTTL, # ARGV[1]
                                        $now - self::MAX_AGE_PRUNE, # ARGV[2]
-                                       $this->maxTries # ARGV[3]
+                                       $this->maxTries, # ARGV[3]
+                                       $now # ARGV[4]
                                ),
-                               5 # number of first argument(s) that are keys
+                               6 # number of first argument(s) that are keys
                        );
                        if ( $res ) {
-                               list( $released, $abandoned, $pruned ) = $res;
-                               $count += $released + $pruned;
+                               list( $released, $abandoned, $pruned, $undelayed ) = $res;
+                               $count += $released + $pruned + $undelayed;
                                JobQueue::incrStats( 'job-recycle', $this->type, $released );
                                JobQueue::incrStats( 'job-abandon', $this->type, $abandoned );
                        }
                } catch ( RedisException $e ) {
-                       $this->throwRedisException( $this->server, $conn, $e );
+                       $this->throwRedisException( $conn, $e );
                }
 
                return $count;
@@ -747,21 +717,19 @@ LUA;
         * @return array
         */
        protected function doGetPeriodicTasks() {
-               $tasks = array();
+               $periods = array( 3600 ); // standard cleanup (useful on config change)
                if ( $this->claimTTL > 0 ) {
-                       $tasks['recycleAndDeleteStaleJobs'] = array(
-                               'callback' => array( $this, 'recycleAndDeleteStaleJobs' ),
-                               'period' => ceil( $this->claimTTL / 2 )
-                       );
+                       $periods[] = ceil( $this->claimTTL / 2 ); // avoid bad timing
                }
                if ( $this->checkDelay ) {
-                       $tasks['releaseReadyDelayedJobs'] = array(
-                               'callback' => array( $this, 'releaseReadyDelayedJobs' ),
-                               'period' => 300 // 5 minutes
-                       );
+                       $periods[] = 300; // 5 minutes
                }
-
-               return $tasks;
+               return array(
+                       'recyclePruneAndUndelayJobs' => array(
+                               'callback' => array( $this, 'recyclePruneAndUndelayJobs' ),
+                               'period'   => max( min( $periods ), 30 ) // sanity
+                       )
+               );
        }
 
        /**
@@ -854,13 +822,12 @@ LUA;
        }
 
        /**
-        * @param $server string
         * @param $conn RedisConnRef
         * @param $e RedisException
         * @throws JobQueueError
         */
-       protected function throwRedisException( $server, RedisConnRef $conn, $e ) {
-               $this->redisPool->handleException( $server, $conn, $e );
+       protected function throwRedisException( RedisConnRef $conn, $e ) {
+               $this->redisPool->handleError( $conn, $e );
                throw new JobQueueError( "Redis server error: {$e->getMessage()}\n" );
        }
 
index 5bfee0b..e074e5c 100644 (file)
@@ -92,7 +92,7 @@ class JobSpecification implements IJobSpecification {
        protected $title;
 
        /** @var bool Expensive jobs may set this to true */
-       protected $removeDuplicates;
+       protected $ignoreDuplicates;
 
        /**
         * @param string $type
@@ -108,7 +108,7 @@ class JobSpecification implements IJobSpecification {
                $this->type = $type;
                $this->params = $params;
                $this->title = $title ?: Title::newMainPage();
-               $this->removeDuplicates = !empty( $opts['removeDuplicates'] );
+               $this->ignoreDuplicates = !empty( $opts['removeDuplicates'] );
        }
 
        /**
@@ -158,7 +158,7 @@ class JobSpecification implements IJobSpecification {
         * @return bool Whether only one of each identical set of jobs should be run
         */
        public function ignoreDuplicates() {
-               return $this->removeDuplicates;
+               return $this->ignoreDuplicates;
        }
 
        /**
index c654933..2aec3c9 100644 (file)
@@ -175,7 +175,7 @@ class JobQueueAggregatorRedis extends JobQueueAggregator {
         * @return void
         */
        protected function handleException( RedisConnRef $conn, $e ) {
-               $this->redisPool->handleException( $conn->getServer(), $conn, $e );
+               $this->redisPool->handleError( $conn, $e );
        }
 
        /**
index 61d100c..a7c5dc0 100644 (file)
@@ -116,20 +116,29 @@ class HTMLCacheUpdateJob extends Job {
                }
 
                $dbw = wfGetDB( DB_MASTER );
-               $timestamp = $dbw->timestamp();
 
-               // Don't invalidated pages that were already invalidated
-               $touchedCond = isset( $this->params['rootJobTimestamp'] )
-                       ? array( "page_touched < " .
-                               $dbw->addQuotes( $dbw->timestamp( $this->params['rootJobTimestamp'] ) ) )
-                       : array();
+               // The page_touched field will need to be bumped for these pages.
+               // Only bump it to the present time if no "rootJobTimestamp" was known.
+               // If it is known, it can be used instead, which avoids invalidating output
+               // that was in fact generated *after* the relevant dependency change time
+               // (e.g. template edit). This is particularily useful since refreshLinks jobs
+               // save back parser output and usually run along side htmlCacheUpdate jobs;
+               // their saved output would be invalidated by using the current timestamp.
+               if ( isset( $this->params['rootJobTimestamp'] ) ) {
+                       $touchTimestamp = $this->params['rootJobTimestamp'];
+               } else {
+                       $touchTimestamp = wfTimestampNow();
+               }
 
                // Update page_touched (skipping pages already touched since the root job).
                // Check $wgUpdateRowsPerQuery for sanity; batch jobs are sized by that already.
                foreach ( array_chunk( $pageIds, $wgUpdateRowsPerQuery ) as $batch ) {
                        $dbw->update( 'page',
-                               array( 'page_touched' => $timestamp ),
-                               array( 'page_id' => $batch ) + $touchedCond,
+                               array( 'page_touched' => $dbw->timestamp( $touchTimestamp ) ),
+                               array( 'page_id' => $batch,
+                                       // don't invalidated pages that were already invalidated
+                                       "page_touched < " . $dbw->addQuotes( $dbw->timestamp( $touchTimestamp ) )
+                               ),
                                __METHOD__
                        );
                }
@@ -137,7 +146,7 @@ class HTMLCacheUpdateJob extends Job {
                $titleArray = TitleArray::newFromResult( $dbw->select(
                        'page',
                        array( 'page_namespace', 'page_title' ),
-                       array( 'page_id' => $pageIds, 'page_touched' => $timestamp ),
+                       array( 'page_id' => $pageIds, 'page_touched' => $dbw->timestamp( $touchTimestamp ) ),
                        __METHOD__
                ) );
 
index 318448a..3b79684 100644 (file)
@@ -223,8 +223,6 @@ class CSSMin {
                                return $ruleWithRemapped;
                        }
                }, $source );
-
-               return $source;
        }
 
        /**
index 0675b38..00cd257 100644 (file)
@@ -1,9 +1,29 @@
 <?php
+/**
+ * HTTP service client
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 to handle concurrent HTTP requests
  *
- * HTTP request maps use the following format:
+ * HTTP request maps are arrays that use the following format:
  *   - method   : GET/HEAD/PUT/POST/DELETE
  *   - url      : HTTP/HTTPS URL
  *   - query    : <query parameter field/value associative array> (uses RFC 3986)
@@ -14,6 +34,7 @@
  *                array bodies are encoded as multipart/form-data and strings
  *                use application/x-www-form-urlencoded (headers sent automatically)
  *   - stream   : resource to stream the HTTP response body to
+ * Request maps can use integer index 0 instead of 'method' and 1 instead of 'url'.
  *
  * @author Aaron Schulz
  * @since 1.23
@@ -24,12 +45,20 @@ class MultiHttpClient {
        /** @var string|null SSL certificates path  */
        protected $caBundlePath;
        /** @var integer */
-       protected $connTimeout;
+       protected $connTimeout = 10;
        /** @var integer */
-       protected $reqTimeout;
+       protected $reqTimeout = 300;
+       /** @var bool */
+       protected $usePipelining = false;
+       /** @var integer */
+       protected $maxConnsPerHost = 50;
 
        /**
         * @param array $options
+        *   - connTimeout     : default connection timeout
+        *   - reqTimeout      : default request timeout
+        *   - usePipelining   : whether to use HTTP pipelining if possible (for all hosts)
+        *   - maxConnsPerHost : maximum number of concurrent connections (per host)
         */
        public function __construct( array $options ) {
                if ( isset( $options['caBundlePath'] ) ) {
@@ -38,9 +67,11 @@ class MultiHttpClient {
                                throw new Exception( "Cannot find CA bundle: " . $this->caBundlePath );
                        }
                }
-               static $defaults = array( 'connTimeout' => 10, 'reqTimeout' => 300 );
-               foreach ( $defaults as $key => $default ) {
-                       $this->$key = isset( $options[$key] ) ? $options[$key] : $default;
+               static $opts = array( 'connTimeout', 'reqTimeout', 'usePipelining', 'maxConnsPerHost' );
+               foreach ( $opts as $key ) {
+                       if ( isset( $options[$key] ) ) {
+                               $this->$key = $options[$key];
+                       }
                }
        }
 
@@ -58,15 +89,18 @@ class MultiHttpClient {
         *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $req;
         *  </code>
         * @param array $req HTTP request array
+        * @param array $opts
+        *   - connTimeout    : connection timeout per request
+        *   - reqTimeout     : post-connection timeout per request
         * @return array Response array for request
         */
-       public function run( array $req ) {
-               $req = $this->runMulti( array( $req ) );
+       final public function run( array $req, array $opts = array() ) {
+               $req = $this->runMulti( array( $req ), $opts );
                return $req[0]['response'];
        }
 
        /**
-        * Execute a set of HTTP(S) request concurrently
+        * Execute a set of HTTP(S) requests concurrently
         *
         * The maps are returned by this method with the 'response' field set to a map of:
         *   - code    : HTTP response code or 0 if there was a serious cURL error
@@ -79,13 +113,19 @@ class MultiHttpClient {
         *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $req;
         *  </code>
         * All headers in the 'headers' field are normalized to use lower case names.
-        * This is true for the request headers and the response headers.
+        * This is true for the request headers and the response headers. Integer-indexed
+        * method/URL entries will also be changed to use the corresponding string keys.
         *
         * @param array $req Map of HTTP request arrays
+        * @param array $opts
+        *   - connTimeout     : connection timeout per request
+        *   - reqTimeout      : post-connection timeout per request
+        *   - usePipelining   : whether to use HTTP pipelining if possible
+        *   - maxConnsPerHost : maximum number of concurrent connections (per host)
         * @return array $reqs With response array populated for each
         */
-       public function runMulti( array $reqs ) {
-               $multiHandle = $this->getCurlMulti();
+       public function runMulti( array $reqs, array $opts = array() ) {
+               $chm = $this->getCurlMulti();
 
                // Normalize $reqs and add all of the required cURL handles...
                $handles = array();
@@ -97,6 +137,14 @@ class MultiHttpClient {
                                'body'     => '',
                                'error'    => ''
                        );
+                       if ( isset( $req[0] ) ) {
+                               $req['method'] = $req[0]; // short-form
+                               unset( $req[0] );
+                       }
+                       if ( isset( $req[1] ) ) {
+                               $req['url'] = $req[1]; // short-form
+                               unset( $req[1] );
+                       }
                        if ( !isset( $req['method'] ) ) {
                                throw new Exception( "Request has no 'method' field set." );
                        } elseif ( !isset( $req['url'] ) ) {
@@ -114,34 +162,54 @@ class MultiHttpClient {
                                $req['body'] = '';
                                $req['headers']['content-length'] = 0;
                        }
-                       $handles[$index] = $this->getCurlHandle( $req );
+                       $handles[$index] = $this->getCurlHandle( $req, $opts );
                        if ( count( $reqs ) > 1 ) {
                                // https://github.com/guzzle/guzzle/issues/349
                                curl_setopt( $handles[$index], CURLOPT_FORBID_REUSE, true );
                        }
-                       curl_multi_add_handle( $multiHandle, $handles[$index] );
                }
+               unset( $req ); // don't assign over this by accident
 
-               // Execute the cURL handles concurrently...
-               $active = null; // handles still being processed
-               do {
-                       // Do any available work...
+               $indexes = array_keys( $reqs );
+               if ( function_exists( 'curl_multi_setopt' ) ) { // PHP 5.5
+                       if ( isset( $opts['usePipelining'] ) ) {
+                               curl_multi_setopt( $chm, CURLMOPT_PIPELINING, (int)$opts['usePipelining'] );
+                       }
+                       if ( isset( $opts['maxConnsPerHost'] ) ) {
+                               // Keep these sockets around as they may be needed later in the request
+                               curl_multi_setopt( $chm, CURLMOPT_MAXCONNECTS, (int)$opts['maxConnsPerHost'] );
+                       }
+               }
+
+               // @TODO: use a per-host rolling handle window (e.g. CURLMOPT_MAX_HOST_CONNECTIONS)
+               $batches = array_chunk( $indexes, $this->maxConnsPerHost );
+
+               foreach ( $batches as $batch ) {
+                       // Attach all cURL handles for this batch
+                       foreach ( $batch as $index ) {
+                               curl_multi_add_handle( $chm, $handles[$index] );
+                       }
+                       // Execute the cURL handles concurrently...
+                       $active = null; // handles still being processed
                        do {
-                               $mrc = curl_multi_exec( $multiHandle, $active );
-                       } while ( $mrc == CURLM_CALL_MULTI_PERFORM );
-                       // Wait (if possible) for available work...
-                       if ( $active > 0 && $mrc == CURLM_OK ) {
-                               if ( curl_multi_select( $multiHandle, 10 ) == -1 ) {
-                                       // PHP bug 63411; http://curl.haxx.se/libcurl/c/curl_multi_fdset.html
-                                       usleep( 5000 ); // 5ms
+                               // Do any available work...
+                               do {
+                                       $mrc = curl_multi_exec( $chm, $active );
+                               } while ( $mrc == CURLM_CALL_MULTI_PERFORM );
+                               // Wait (if possible) for available work...
+                               if ( $active > 0 && $mrc == CURLM_OK ) {
+                                       if ( curl_multi_select( $chm, 10 ) == -1 ) {
+                                               // PHP bug 63411; http://curl.haxx.se/libcurl/c/curl_multi_fdset.html
+                                               usleep( 5000 ); // 5ms
+                                       }
                                }
-                       }
-               } while ( $active > 0 && $mrc == CURLM_OK );
+                       } while ( $active > 0 && $mrc == CURLM_OK );
+               }
 
                // Remove all of the added cURL handles and check for errors...
                foreach ( $reqs as $index => &$req ) {
                        $ch = $handles[$index];
-                       curl_multi_remove_handle( $multiHandle, $ch );
+                       curl_multi_remove_handle( $chm, $ch );
                        if ( curl_errno( $ch ) !== 0 ) {
                                $req['error'] = "(curl error: " . curl_errno( $ch ) . ") " . curl_error( $ch );
                        }
@@ -158,19 +226,31 @@ class MultiHttpClient {
                                unset( $req['_closeHandle'] );
                        }
                }
+               unset( $req ); // don't assign over this by accident
+
+               // Restore the default settings
+               if ( function_exists( 'curl_multi_setopt' ) ) { // PHP 5.5
+                       curl_multi_setopt( $chm, CURLMOPT_PIPELINING, (int)$this->usePipelining );
+                       curl_multi_setopt( $chm, CURLMOPT_MAXCONNECTS, (int)$this->maxConnsPerHost );
+               }
 
                return $reqs;
        }
 
        /**
         * @param array $req HTTP request map
+        * @param array $opts
+        *   - connTimeout    : default connection timeout
+        *   - reqTimeout     : default request timeout
         * @return resource
         */
-       protected function getCurlHandle( array &$req ) {
+       protected function getCurlHandle( array &$req, array $opts = array() ) {
                $ch = curl_init();
 
-               curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $this->connTimeout );
-               curl_setopt( $ch, CURLOPT_TIMEOUT, $this->reqTimeout );
+               curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT,
+                       isset( $opts['connTimeout'] ) ? $opts['connTimeout'] : $this->connTimeout );
+               curl_setopt( $ch, CURLOPT_TIMEOUT,
+                       isset( $opts['reqTimeout'] ) ? $opts['reqTimeout'] : $this->reqTimeout );
                curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
                curl_setopt( $ch, CURLOPT_MAXREDIRS, 4 );
                curl_setopt( $ch, CURLOPT_HEADER, 0 );
@@ -290,7 +370,12 @@ class MultiHttpClient {
         */
        protected function getCurlMulti() {
                if ( !$this->multiHandle ) {
-                       $this->multiHandle = curl_multi_init();
+                       $cmh = curl_multi_init();
+                       if ( function_exists( 'curl_multi_setopt' ) ) { // PHP 5.5
+                               curl_multi_setopt( $cmh, CURLMOPT_PIPELINING, (int)$this->usePipelining );
+                               curl_multi_setopt( $cmh, CURLMOPT_MAXCONNECTS, (int)$this->maxConnsPerHost );
+                       }
+                       $this->multiHandle = $cmh;
                }
                return $this->multiHandle;
        }
index ead418d..f0f297f 100644 (file)
@@ -502,6 +502,7 @@ class LogEventsList extends ContextSource {
         * - wrap String Wrap the message in html (usually something like "<div ...>$1</div>").
         * - flags Integer display flags (NO_ACTION_LINK,NO_EXTRA_USER_LINKS)
         * - useRequestParams boolean Set true to use Pager-related parameters in the WebRequest
+        * - useMaster boolean Use master DB
         * @return int Number of total log items (not limited by $lim)
         */
        public static function showLogExtract(
@@ -515,6 +516,7 @@ class LogEventsList extends ContextSource {
                        'wrap' => "$1",
                        'flags' => 0,
                        'useRequestParams' => false,
+                       'useMaster' => false,
                );
                # The + operator appends elements of remaining keys from the right
                # handed array to the left handed, whereas duplicated keys are NOT overwritten.
@@ -548,6 +550,9 @@ class LogEventsList extends ContextSource {
                        $pager->mIsBackwards = false;
                }
 
+               if ( $param['useMaster'] ) {
+                       $pager->mDb = wfGetDB( DB_MASTER );
+               }
                if ( isset( $param['offset'] ) ) { # Tell pager to ignore WebRequest offset
                        $pager->setOffset( $param['offset'] );
                }
index 9e7f056..4f44d75 100644 (file)
@@ -573,7 +573,7 @@ class LogFormatter {
        }
 
        /**
-        * Gets the luser provided comment
+        * Gets the user provided comment
         * @return string HTML
         */
        public function getComment() {
index 7f108c8..607c4e5 100644 (file)
@@ -307,27 +307,27 @@ class BitmapHandler extends ImageHandler {
                global $wgSharpenReductionThreshold, $wgSharpenParameter, $wgMaxAnimatedGifArea,
                        $wgImageMagickTempDir, $wgImageMagickConvertCommand;
 
-               $quality = '';
-               $sharpen = '';
+               $quality = array();
+               $sharpen = array();
                $scene = false;
-               $animation_pre = '';
-               $animation_post = '';
-               $decoderHint = '';
+               $animation_pre = array();
+               $animation_post = array();
+               $decoderHint = array();
                if ( $params['mimeType'] == 'image/jpeg' ) {
-                       $quality = "-quality 80"; // 80%
+                       $quality = array( '-quality', '80' ); // 80%
                        # Sharpening, see bug 6193
                        if ( ( $params['physicalWidth'] + $params['physicalHeight'] )
                                / ( $params['srcWidth'] + $params['srcHeight'] )
                                < $wgSharpenReductionThreshold
                        ) {
-                               $sharpen = "-sharpen " . wfEscapeShellArg( $wgSharpenParameter );
+                               $sharpen = array( '-sharpen', $wgSharpenParameter );
                        }
                        if ( version_compare( $this->getMagickVersion(), "6.5.6" ) >= 0 ) {
                                // JPEG decoder hint to reduce memory, available since IM 6.5.6-2
-                               $decoderHint = "-define jpeg:size={$params['physicalDimensions']}";
+                               $decoderHint = array( '-define', "jpeg:size={$params['physicalDimensions']}" );
                        }
                } elseif ( $params['mimeType'] == 'image/png' ) {
-                       $quality = "-quality 95"; // zlib 9, adaptive filtering
+                       $quality = array( '-quality', '95' ); // zlib 9, adaptive filtering
 
                } elseif ( $params['mimeType'] == 'image/gif' ) {
                        if ( $this->getImageArea( $image ) > $wgMaxAnimatedGifArea ) {
@@ -336,15 +336,15 @@ class BitmapHandler extends ImageHandler {
                                $scene = 0;
                        } elseif ( $this->isAnimatedImage( $image ) ) {
                                // Coalesce is needed to scale animated GIFs properly (bug 1017).
-                               $animation_pre = '-coalesce';
+                               $animation_pre = array( '-coalesce' );
                                // We optimize the output, but -optimize is broken,
                                // use optimizeTransparency instead (bug 11822)
                                if ( version_compare( $this->getMagickVersion(), "6.3.5" ) >= 0 ) {
-                                       $animation_post = '-fuzz 5% -layers optimizeTransparency';
+                                       $animation_post = array( '-fuzz', '5%', '-layers', 'optimizeTransparency' );
                                }
                        }
                } elseif ( $params['mimeType'] == 'image/x-xcf' ) {
-                       $animation_post = '-layers merge';
+                       $animation_post = array( '-layers', 'merge' );
                }
 
                // Use one thread only, to avoid deadlock bugs on OOM
@@ -356,26 +356,28 @@ class BitmapHandler extends ImageHandler {
                $rotation = $this->getRotation( $image );
                list( $width, $height ) = $this->extractPreRotationDimensions( $params, $rotation );
 
-               $cmd =
-                       wfEscapeShellArg( $wgImageMagickConvertCommand ) .
+               $cmd = call_user_func_array( 'wfEscapeShellArg', array_merge(
+                       array( $wgImageMagickConvertCommand ),
+                       $quality,
                        // Specify white background color, will be used for transparent images
                        // in Internet Explorer/Windows instead of default black.
-                       " {$quality} -background white" .
-                       " {$decoderHint} " .
-                       wfEscapeShellArg( $this->escapeMagickInput( $params['srcPath'], $scene ) ) .
-                       " {$animation_pre}" .
+                       array( '-background', 'white' ),
+                       $decoderHint,
+                       array( $this->escapeMagickInput( $params['srcPath'], $scene ) ),
+                       $animation_pre,
                        // For the -thumbnail option a "!" is needed to force exact size,
                        // or ImageMagick may decide your ratio is wrong and slice off
                        // a pixel.
-                       " -thumbnail " . wfEscapeShellArg( "{$width}x{$height}!" ) .
+                       array( '-thumbnail', "{$width}x{$height}!" ),
                        // Add the source url as a comment to the thumb, but don't add the flag if there's no comment
                        ( $params['comment'] !== ''
-                               ? " -set comment " . wfEscapeShellArg( $this->escapeMagickProperty( $params['comment'] ) )
-                               : '' ) .
-                       " -depth 8 $sharpen " .
-                       " -rotate -$rotation " .
-                       " {$animation_post} " .
-                       wfEscapeShellArg( $this->escapeMagickOutput( $params['dstPath'] ) );
+                               ? array( '-set', 'comment', $this->escapeMagickProperty( $params['comment'] ) )
+                               : array() ),
+                       array( '-depth', 8 ),
+                       $sharpen,
+                       array( '-rotate', "-$rotation" ),
+                       $animation_post,
+                       array( $this->escapeMagickOutput( $params['dstPath'] ) ) ) );
 
                wfDebug( __METHOD__ . ": running ImageMagick: $cmd\n" );
                wfProfileIn( 'convert' );
@@ -485,8 +487,8 @@ class BitmapHandler extends ImageHandler {
                $dst = wfEscapeShellArg( $params['dstPath'] );
                $cmd = $wgCustomConvertCommand;
                $cmd = str_replace( '%s', $src, str_replace( '%d', $dst, $cmd ) ); # Filenames
-               $cmd = str_replace( '%h', $params['physicalHeight'],
-                       str_replace( '%w', $params['physicalWidth'], $cmd ) ); # Size
+               $cmd = str_replace( '%h', wfEscapeShellArg( $params['physicalHeight'] ),
+                       str_replace( '%w', wfEscapeShellArg( $params['physicalWidth'] ), $cmd ) ); # Size
                wfDebug( __METHOD__ . ": Running custom convert command $cmd\n" );
                wfProfileIn( 'convert' );
                $retval = 0;
@@ -790,13 +792,12 @@ class BitmapHandler extends ImageHandler {
                        case 'im':
                                $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . " " .
                                        wfEscapeShellArg( $this->escapeMagickInput( $params['srcPath'], $scene ) ) .
-                                       " -rotate -$rotation " .
+                                       " -rotate " . wfEscapeShellArg( "-$rotation" ) . " " .
                                        wfEscapeShellArg( $this->escapeMagickOutput( $params['dstPath'] ) );
                                wfDebug( __METHOD__ . ": running ImageMagick: $cmd\n" );
                                wfProfileIn( 'convert' );
                                $retval = 0;
-                               // @todo FIXME: Undefined variable %env
-                               $err = wfShellExecWithStderr( $cmd, $retval, $env );
+                               $err = wfShellExecWithStderr( $cmd, $retval );
                                wfProfileOut( 'convert' );
                                if ( $retval !== 0 ) {
                                        $this->logErrorForExternalProcess( $retval, $err, $cmd );
index 7da5a4c..1202c9a 100644 (file)
@@ -180,9 +180,12 @@ class DjVuHandler extends ImageHandler {
                $srcPath = $image->getLocalRefPath();
                # Use a subshell (brackets) to aggregate stderr from both pipeline commands
                # before redirecting it to the overall stdout. This works in both Linux and Windows XP.
-               $cmd = '(' . wfEscapeShellArg( $wgDjvuRenderer ) . " -format=ppm -page={$page}" .
-                       " -size={$params['physicalWidth']}x{$params['physicalHeight']} " .
-                       wfEscapeShellArg( $srcPath );
+               $cmd = '(' . wfEscapeShellArg(
+                       $wgDjvuRenderer,
+                       "-format=ppm",
+                       "-page={$page}",
+                       "-size={$params['physicalWidth']}x{$params['physicalHeight']}",
+                       $srcPath );
                if ( $wgDjvuPostProcessor ) {
                        $cmd .= " | {$wgDjvuPostProcessor}";
                }
index 844aef2..1cb5542 100644 (file)
@@ -829,13 +829,13 @@ class Exif {
                }
 
                if ( $action === true ) {
-                       wfDebugLog( $this->log, "$class::$fname: accepted: '$in' (type: $type)\n" );
+                       wfDebugLog( $this->log, "$class::$fname: accepted: '$in' (type: $type)" );
                } elseif ( $action === false ) {
-                       wfDebugLog( $this->log, "$class::$fname: rejected: '$in' (type: $type)\n" );
+                       wfDebugLog( $this->log, "$class::$fname: rejected: '$in' (type: $type)" );
                } elseif ( $action === null ) {
-                       wfDebugLog( $this->log, "$class::$fname: input was: '$in' (type: $type)\n" );
+                       wfDebugLog( $this->log, "$class::$fname: input was: '$in' (type: $type)" );
                } else {
-                       wfDebugLog( $this->log, "$class::$fname: $action (type: $type; content: '$in')\n" );
+                       wfDebugLog( $this->log, "$class::$fname: $action (type: $type; content: '$in')" );
                }
        }
 
@@ -851,9 +851,9 @@ class Exif {
                }
                $class = ucfirst( __CLASS__ );
                if ( $io ) {
-                       wfDebugLog( $this->log, "$class::$fname: begin processing: '{$this->basename}'\n" );
+                       wfDebugLog( $this->log, "$class::$fname: begin processing: '{$this->basename}'" );
                } else {
-                       wfDebugLog( $this->log, "$class::$fname: end processing: '{$this->basename}'\n" );
+                       wfDebugLog( $this->log, "$class::$fname: end processing: '{$this->basename}'" );
                }
        }
 }
index 4dd79a8..8a12e7e 100644 (file)
@@ -93,6 +93,7 @@ abstract class ImageHandler extends MediaHandler {
                if ( !isset( $params['page'] ) ) {
                        $params['page'] = 1;
                } else {
+                       $params['page'] = intval( $params['page'] );
                        if ( $params['page'] > $image->pageCount() ) {
                                $params['page'] = $image->pageCount();
                        }
index 3c97480..427143c 100644 (file)
@@ -84,7 +84,7 @@ class RedisBagOStuff extends BagOStuff {
                        $result = $this->unserialize( $value );
                } catch ( RedisException $e ) {
                        $result = false;
-                       $this->handleException( $server, $conn, $e );
+                       $this->handleException( $conn, $e );
                }
 
                $this->logRequest( 'get', $key, $server, $result );
@@ -108,7 +108,7 @@ class RedisBagOStuff extends BagOStuff {
                        }
                } catch ( RedisException $e ) {
                        $result = false;
-                       $this->handleException( $server, $conn, $e );
+                       $this->handleException( $conn, $e );
                }
 
                $this->logRequest( 'set', $key, $server, $result );
@@ -142,7 +142,7 @@ class RedisBagOStuff extends BagOStuff {
                        $result = ( $conn->exec() == array( true ) );
                } catch ( RedisException $e ) {
                        $result = false;
-                       $this->handleException( $server, $conn, $e );
+                       $this->handleException( $conn, $e );
                }
 
                $this->logRequest( 'cas', $key, $server, $result );
@@ -162,7 +162,7 @@ class RedisBagOStuff extends BagOStuff {
                        $result = true;
                } catch ( RedisException $e ) {
                        $result = false;
-                       $this->handleException( $server, $conn, $e );
+                       $this->handleException( $conn, $e );
                }
 
                $this->logRequest( 'delete', $key, $server, $result );
@@ -201,7 +201,7 @@ class RedisBagOStuff extends BagOStuff {
                                        }
                                }
                        } catch ( RedisException $e ) {
-                               $this->handleException( $server, $conn, $e );
+                               $this->handleException( $conn, $e );
                        }
                }
 
@@ -229,7 +229,7 @@ class RedisBagOStuff extends BagOStuff {
                        }
                } catch ( RedisException $e ) {
                        $result = false;
-                       $this->handleException( $server, $conn, $e );
+                       $this->handleException( $conn, $e );
                }
 
                $this->logRequest( 'add', $key, $server, $result );
@@ -260,7 +260,7 @@ class RedisBagOStuff extends BagOStuff {
                        }
                } catch ( RedisException $e ) {
                        $result = false;
-                       $this->handleException( $server, $conn, $e );
+                       $this->handleException( $conn, $e );
                }
 
                $this->logRequest( 'replace', $key, $server, $result );
@@ -290,7 +290,7 @@ class RedisBagOStuff extends BagOStuff {
                        $result = $this->unserialize( $conn->incrBy( $key, $value ) );
                } catch ( RedisException $e ) {
                        $result = false;
-                       $this->handleException( $server, $conn, $e );
+                       $this->handleException( $conn, $e );
                }
 
                $this->logRequest( 'incr', $key, $server, $result );
@@ -343,7 +343,7 @@ class RedisBagOStuff extends BagOStuff {
         * Log a fatal error
         */
        protected function logError( $msg ) {
-               wfDebugLog( 'redis', "Redis error: $msg\n" );
+               wfDebugLog( 'redis', "Redis error: $msg" );
        }
 
        /**
@@ -352,8 +352,8 @@ class RedisBagOStuff extends BagOStuff {
         * not. The safest response for us is to explicitly destroy the connection
         * object and let it be reopened during the next request.
         */
-       protected function handleException( $server, RedisConnRef $conn, $e ) {
-               $this->redisPool->handleException( $server, $conn, $e );
+       protected function handleException( RedisConnRef $conn, $e ) {
+               $this->redisPool->handleError( $conn, $e );
        }
 
        /**
index 3966b9e..67b1c66 100644 (file)
@@ -209,7 +209,12 @@ class CoreParserFunctions {
        }
 
        static function localurle( $parser, $s = '', $arg = null ) {
-               return htmlspecialchars( self::urlFunction( 'getLocalURL', $s, $arg ) );
+               $temp = self::urlFunction( 'getLocalURL', $s, $arg );
+               if( !is_string( $temp ) ) {
+                       return $temp;
+               } else {
+                       return htmlspecialchars( $temp );
+               }
        }
 
        static function fullurl( $parser, $s = '', $arg = null ) {
@@ -217,7 +222,12 @@ class CoreParserFunctions {
        }
 
        static function fullurle( $parser, $s = '', $arg = null ) {
-               return htmlspecialchars( self::urlFunction( 'getFullURL', $s, $arg ) );
+               $temp = self::urlFunction( 'getFullURL', $s, $arg );
+               if( !is_string( $temp ) ) {
+                       return $temp;
+               } else {
+                       return htmlspecialchars( $temp );
+               }
        }
 
        static function canonicalurl( $parser, $s = '', $arg = null ) {
index 9157619..340f462 100644 (file)
@@ -4594,14 +4594,13 @@ class Parser {
 
        /**
         * Pre-save transform helper function
-        * @private
         *
         * @param $text string
         * @param $user User
         *
         * @return string
         */
-       function pstPass2( $text, $user ) {
+       private function pstPass2( $text, $user ) {
                global $wgContLang;
 
                # Note: This is the timestamp saved as hardcoded wikitext to
index 9eaa3e2..040c74f 100644 (file)
@@ -112,7 +112,14 @@ class ParserCache {
        }
 
        /**
-        * Used to provide a unique id for the PoolCounter.
+        * Generates a key for caching the given article considering
+        * the given parser options.
+        *
+        * @note Which parser options influence the cache key
+        * is controlled via ParserOutput::recordOption() or
+        * ParserOptions::addExtraKey().
+        *
+        * @note Used by Article to provide a unique id for the PoolCounter.
         * It would be preferable to have this code in get()
         * instead of having Article looking in our internals.
         *
@@ -141,6 +148,7 @@ class ParserCache {
                                return false;
                        }
 
+                       // $optionsKey->mUsedOptions is set by save() by calling ParserOutput::getUsedOptions()
                        $usedOptions = $optionsKey->mUsedOptions;
                        wfDebug( "Parser cache options found.\n" );
                } else {
index 8cd978b..b2c9757 100644 (file)
@@ -41,6 +41,7 @@ class ParserOutput extends CacheTime {
                $mModuleScripts = array(),    # Modules of which only the JS will be loaded by the resource loader
                $mModuleStyles = array(),     # Modules of which only the CSSS will be loaded by the resource loader
                $mModuleMessages = array(),   # Modules of which only the messages will be loaded by the resource loader
+               $mJsConfigVars = array(),     # JavaScript config variable for mw.config combined with this page
                $mOutputHooks = array(),      # Hook tags as per $wgParserOutputHooks
                $mWarnings = array(),         # Warning text to be returned to the user. Wikitext formatted, in the key only
                $mSections = array(),         # Table of contents
@@ -134,6 +135,8 @@ class ParserOutput extends CacheTime {
        function getModuleScripts()          { return $this->mModuleScripts; }
        function getModuleStyles()           { return $this->mModuleStyles; }
        function getModuleMessages()         { return $this->mModuleMessages; }
+       /** @since 1.23 */
+       function getJsConfigVars()           { return $this->mJsConfigVars; }
        function getOutputHooks()            { return (array)$this->mOutputHooks; }
        function getWarnings()               { return array_keys( $this->mWarnings ); }
        function getIndexPolicy()            { return $this->mIndexPolicy; }
@@ -318,6 +321,24 @@ class ParserOutput extends CacheTime {
                $this->mModuleMessages = array_merge( $this->mModuleMessages, (array)$modules );
        }
 
+       /**
+        * Add one or more variables to be set in mw.config in JavaScript.
+        *
+        * @param $keys {String|Array} Key or array of key/value pairs.
+        * @param $value {Mixed} [optional] Value of the configuration variable.
+        * @since 1.23
+        */
+       public function addJsConfigVars( $keys, $value = null ) {
+               if ( is_array( $keys ) ) {
+                       foreach ( $keys as $key => $value ) {
+                               $this->mJsConfigVars[$key] = $value;
+                       }
+                       return;
+               }
+
+               $this->mJsConfigVars[$keys] = $value;
+       }
+
        /**
         * Copy items from the OutputPage object into this one
         *
@@ -328,6 +349,7 @@ class ParserOutput extends CacheTime {
                $this->addModuleScripts( $out->getModuleScripts() );
                $this->addModuleStyles( $out->getModuleStyles() );
                $this->addModuleMessages( $out->getModuleMessages() );
+               $this->addJsConfigVars( $out->getJsConfigVars() );
 
                $this->mHeadItems = array_merge( $this->mHeadItems, $out->getHeadItemsArray() );
        }
@@ -453,10 +475,15 @@ class ParserOutput extends CacheTime {
        }
 
        /**
-        * Callback passed by the Parser to the ParserOptions to keep track of which options are used.
-        * @access private
+        * Tags a parser option for use in the cache key for this parser output.
+        * Registered as a watcher at ParserOptions::registerWatcher() by Parser::clearState().
+        *
+        * @see ParserCache::getKey
+        * @see ParserCache::save
+        * @see ParserOptions::addExtraKey
+        * @see ParserOptions::optionsHash
         */
-       function recordOption( $option ) {
+       public function recordOption( $option ) {
                $this->mAccessedOptions[$option] = true;
        }
 
index b6c9cec..557c1f6 100644 (file)
@@ -289,7 +289,7 @@ class ResourceLoader {
 
                // Get core test suites
                $testModules = array();
-               $testModules['qunit'] = include "$IP/tests/qunit/QUnitTestResources.php";
+               $testModules['qunit'] = array();
                // Get other test suites (e.g. from extensions)
                wfRunHooks( 'ResourceLoaderTestModules', array( &$testModules, &$this ) );
 
@@ -300,9 +300,11 @@ class ResourceLoader {
                        // on document-ready, it will run once and finish. If some tests arrive
                        // later (possibly after QUnit has already finished) they will be ignored.
                        $module['position'] = 'top';
-                       $module['dependencies'][] = 'mediawiki.tests.qunit.testrunner';
+                       $module['dependencies'][] = 'test.mediawiki.qunit.testrunner';
                }
 
+               $testModules['qunit'] = ( include "$IP/tests/qunit/QUnitTestResources.php" ) + $testModules['qunit'];
+
                foreach ( $testModules as $id => $names ) {
                        // Register test modules
                        $this->register( $testModules[$id] );
index 22ff6a7..b90ca44 100644 (file)
@@ -83,8 +83,6 @@ class ResourceLoaderContext {
         */
        public static function expandModuleNames( $modules ) {
                $retval = array();
-               // For backwards compatibility with an earlier hack, replace ! with .
-               $modules = str_replace( '!', '.', $modules );
                $exploded = explode( '|', $modules );
                foreach ( $exploded as $group ) {
                        if ( strpos( $group, ',' ) === false ) {
index eaff86f..23d5825 100644 (file)
@@ -674,6 +674,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *
         * @param bool $flip
         *
+        * @throws MWException
         * @return array: List of concatenated and remapped CSS data from $styles,
         *     keyed by media type
         */
@@ -683,14 +684,11 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                }
                foreach ( $styles as $media => $files ) {
                        $uniqueFiles = array_unique( $files );
-                       $styles[$media] = implode(
-                               "\n",
-                               array_map(
-                                       array( $this, 'readStyleFile' ),
-                                       $uniqueFiles,
-                                       array_fill( 0, count( $uniqueFiles ), $flip )
-                               )
-                       );
+                       $styleFiles = array();
+                       foreach ( $uniqueFiles as $file ) {
+                               $styleFiles[] = $this->readStyleFile( $file, $flip );
+                       }
+                       $styles[$media] = implode( "\n", $styleFiles );
                }
                return $styles;
        }
index 0c887e4..0509008 100644 (file)
@@ -279,6 +279,30 @@ class RevDel_RevisionItem extends RevDel_Item {
                }
                return "<li>$difflink $revlink $userlink $comment</li>";
        }
+
+       public function getApiData( ApiResult $result ) {
+               $rev = $this->revision;
+               $user = $this->list->getUser();
+               $ret = array(
+                       'id' => $rev->getId(),
+                       'timestamp' => wfTimestamp( TS_ISO_8601, $rev->getTimestamp() ),
+               );
+               $ret += $rev->isDeleted( Revision::DELETED_USER ) ? array( 'userhidden' => '' ) : array();
+               $ret += $rev->isDeleted( Revision::DELETED_COMMENT ) ? array( 'commenthidden' => '' ) : array();
+               $ret += $rev->isDeleted( Revision::DELETED_TEXT ) ? array( 'texthidden' => '' ) : array();
+               if ( $rev->userCan( Revision::DELETED_USER, $user ) ) {
+                       $ret += array(
+                               'userid' => $rev->getUser( Revision::FOR_THIS_USER ),
+                               'user' => $rev->getUserText( Revision::FOR_THIS_USER ),
+                       );
+               }
+               if ( $rev->userCan( Revision::DELETED_COMMENT, $user ) ) {
+                       $ret += array(
+                               'comment' => $rev->getComment( Revision::FOR_THIS_USER ),
+                       );
+               }
+               return $ret;
+       }
 }
 
 /**
@@ -708,6 +732,50 @@ class RevDel_FileItem extends RevDel_Item {
                return '<li>' . $this->getLink() . ' ' . $this->getUserTools() . ' ' .
                        $data . ' ' . $this->getComment() . '</li>';
        }
+
+       public function getApiData( ApiResult $result ) {
+               $file = $this->file;
+               $user = $this->list->getUser();
+               $ret = array(
+                       'title' => $this->list->title->getPrefixedText(),
+                       'archivename' => $file->getArchiveName(),
+                       'timestamp' => wfTimestamp( TS_ISO_8601, $file->getTimestamp() ),
+                       'width' => $file->getWidth(),
+                       'height' => $file->getHeight(),
+                       'size' => $file->getSize(),
+               );
+               $ret += $file->isDeleted( Revision::DELETED_USER ) ? array( 'userhidden' => '' ) : array();
+               $ret += $file->isDeleted( Revision::DELETED_COMMENT ) ? array( 'commenthidden' => '' ) : array();
+               $ret += $this->isDeleted() ? array( 'contenthidden' => '' ) : array();
+               if ( !$this->isDeleted() ) {
+                       $ret += array(
+                               'url' => $file->getUrl(),
+                       );
+               } elseif ( $this->canViewContent() ) {
+                       $ret += array(
+                               'url' => SpecialPage::getTitleFor( 'Revisiondelete' )->getLinkURL(
+                                       array(
+                                               'target' => $this->list->title->getPrefixedText(),
+                                               'file' => $file->getArchiveName(),
+                                               'token' => $user->getEditToken( $file->getArchiveName() )
+                                       ),
+                                       false, PROTO_RELATIVE
+                               ),
+                       );
+               }
+               if ( $file->userCan( Revision::DELETED_USER, $user ) ) {
+                       $ret += array(
+                               'userid' => $file->user,
+                               'user' => $file->user_text,
+                       );
+               }
+               if ( $file->userCan( Revision::DELETED_COMMENT, $user ) ) {
+                       $ret += array(
+                               'comment' => $file->description,
+                       );
+               }
+               return $ret;
+       }
 }
 
 /**
@@ -962,4 +1030,41 @@ class RevDel_LogItem extends RevDel_Item {
 
                return "<li>$loglink $date $action $comment</li>";
        }
+
+       public function getApiData( ApiResult $result ) {
+               $logEntry = DatabaseLogEntry::newFromRow( $this->row );
+               $user = $this->list->getUser();
+               $ret = array(
+                       'id' => $logEntry->getId(),
+                       'type' => $logEntry->getType(),
+                       'action' => $logEntry->getSubtype(),
+               );
+               $ret += $logEntry->isDeleted( LogPage::DELETED_USER ) ? array( 'userhidden' => '' ) : array();
+               $ret += $logEntry->isDeleted( LogPage::DELETED_COMMENT ) ? array( 'commenthidden' => '' ) : array();
+               $ret += $logEntry->isDeleted( LogPage::DELETED_ACTION ) ? array( 'actionhidden' => '' ) : array();
+
+               if ( LogEventsList::userCan( $this->row, LogPage::DELETED_ACTION, $user ) ) {
+                       ApiQueryLogEvents::addLogParams(
+                               $result,
+                               $ret,
+                               $logEntry->getParameters(),
+                               $logEntry->getType(),
+                               $logEntry->getSubtype(),
+                               $logEntry->getTimestamp(),
+                               $logEntry->isLegacy()
+                       );
+               }
+               if ( LogEventsList::userCan( $this->row, LogPage::DELETED_USER, $user ) ) {
+                       $ret += array(
+                               'userid' => $this->row->log_user,
+                               'user' => $this->row->log_user_text,
+                       );
+               }
+               if ( LogEventsList::userCan( $this->row, LogPage::DELETED_COMMENT, $user ) ) {
+                       $ret += array(
+                               'comment' => $this->row->log_comment,
+                       );
+               }
+               return $ret;
+       }
 }
index 803467e..3874602 100644 (file)
@@ -80,13 +80,16 @@ abstract class RevDel_List extends RevisionListBase {
         * transactions are done here.
         *
         * @param array $params Associative array of parameters. Members are:
-        *     value:       The integer value to set the visibility to
-        *     comment:     The log comment.
+        *     value:         The integer value to set the visibility to
+        *     comment:       The log comment.
+        *     perItemStatus: Set if you want per-item status reports
         * @return Status
+        * @since 1.23 Added 'perItemStatus' param
         */
        public function setVisibility( $params ) {
                $bitPars = $params['value'];
                $comment = $params['comment'];
+               $perItemStatus = isset( $params['perItemStatus'] ) ? $params['perItemStatus'] : false;
 
                $this->res = false;
                $dbw = wfGetDB( DB_MASTER );
@@ -98,16 +101,27 @@ abstract class RevDel_List extends RevisionListBase {
                $idsForLog = array();
                $authorIds = $authorIPs = array();
 
+               if ( $perItemStatus ) {
+                       $status->itemStatuses = array();
+               }
+
                for ( $this->reset(); $this->current(); $this->next() ) {
                        $item = $this->current();
                        unset( $missing[$item->getId()] );
 
+                       if ( $perItemStatus ) {
+                               $itemStatus = Status::newGood();
+                               $status->itemStatuses[$item->getId()] = $itemStatus;
+                       } else {
+                               $itemStatus = $status;
+                       }
+
                        $oldBits = $item->getBits();
                        // Build the actual new rev_deleted bitfield
                        $newBits = RevisionDeleter::extractBitfield( $bitPars, $oldBits );
 
                        if ( $oldBits == $newBits ) {
-                               $status->warning( 'revdelete-no-change', $item->formatDate(), $item->formatTime() );
+                               $itemStatus->warning( 'revdelete-no-change', $item->formatDate(), $item->formatTime() );
                                $status->failCount++;
                                continue;
                        } elseif ( $oldBits == 0 && $newBits != 0 ) {
@@ -120,7 +134,7 @@ abstract class RevDel_List extends RevisionListBase {
 
                        if ( $item->isHideCurrentOp( $newBits ) ) {
                                // Cannot hide current version text
-                               $status->error( 'revdelete-hide-current', $item->formatDate(), $item->formatTime() );
+                               $itemStatus->error( 'revdelete-hide-current', $item->formatDate(), $item->formatTime() );
                                $status->failCount++;
                                continue;
                        }
@@ -128,13 +142,13 @@ abstract class RevDel_List extends RevisionListBase {
                                // Cannot access this revision
                                $msg = ( $opType == 'show' ) ?
                                        'revdelete-show-no-access' : 'revdelete-modify-no-access';
-                               $status->error( $msg, $item->formatDate(), $item->formatTime() );
+                               $itemStatus->error( $msg, $item->formatDate(), $item->formatTime() );
                                $status->failCount++;
                                continue;
                        }
                        // Cannot just "hide from Sysops" without hiding any fields
                        if ( $newBits == Revision::DELETED_RESTRICTED ) {
-                               $status->warning( 'revdelete-only-restricted', $item->formatDate(), $item->formatTime() );
+                               $itemStatus->warning( 'revdelete-only-restricted', $item->formatDate(), $item->formatTime() );
                                $status->failCount++;
                                continue;
                        }
@@ -151,19 +165,22 @@ abstract class RevDel_List extends RevisionListBase {
                                        $authorIPs[] = $item->getAuthorName();
                                }
                        } else {
-                               $status->error( 'revdelete-concurrent-change', $item->formatDate(), $item->formatTime() );
+                               $itemStatus->error( 'revdelete-concurrent-change', $item->formatDate(), $item->formatTime() );
                                $status->failCount++;
                        }
                }
 
                // Handle missing revisions
                foreach ( $missing as $id => $unused ) {
-                       $status->error( 'revdelete-modify-missing', $id );
+                       if ( $perItemStatus ) {
+                               $status->itemStatuses[$id] = Status::newFatal( 'revdelete-modify-missing', $id );
+                       } else {
+                               $status->error( 'revdelete-modify-missing', $id );
+                       }
                        $status->failCount++;
                }
 
                if ( $status->successCount == 0 ) {
-                       $status->ok = false;
                        $dbw->rollback( __METHOD__ );
                        return $status;
                }
@@ -325,4 +342,12 @@ abstract class RevDel_Item extends RevisionItemBase {
         * @return boolean success
         */
        abstract public function setBits( $newBits );
+
+       /**
+        * Get the return information about the revision for the API
+        * @since 1.23
+        * @param ApiResult $result API result object
+        * @return array Data for the API result
+        */
+       abstract public function getApiData( ApiResult $result );
 }
index 2b149cd..882919f 100644 (file)
@@ -65,16 +65,6 @@ class SearchEngine {
                return null;
        }
 
-       /**
-        * If this search backend can list/unlist redirects
-        * @deprecated since 1.18 Call supports( 'list-redirects' );
-        * @return bool
-        */
-       function acceptListRedirects() {
-               wfDeprecated( __METHOD__, '1.18' );
-               return $this->supports( 'list-redirects' );
-       }
-
        /**
         * @since 1.18
         * @param $feature String
@@ -324,7 +314,7 @@ class SearchEngine {
                        $this->namespaces = null;
                        $parsed = substr( $query, strlen( $allkeyword ) );
                } elseif ( strpos( $query, ':' ) !== false ) {
-                       $prefix = substr( $query, 0, strpos( $query, ':' ) );
+                       $prefix = str_replace( ' ', '_', substr( $query, 0, strpos( $query, ':' ) ) );
                        $index = $wgContLang->getNsIndex( $prefix );
                        if ( $index !== false ) {
                                $this->namespaces = array( $index );
@@ -682,6 +672,15 @@ class SearchResultSet {
        function free() {
                // ...
        }
+
+       /**
+        * Did the search contain search syntax?  If so, Special:Search won't offer
+        * the user a link to a create a page named by the search string because the
+        * name would contain the search syntax.
+        */
+       public function searchContainedSyntax() {
+               return false;
+       }
 }
 
 /**
index c088adb..4e2556c 100644 (file)
@@ -192,7 +192,6 @@ abstract class ChangesListSpecialPage extends SpecialPage {
 
        /**
         * Return an array of conditions depending of options set in $opts
-        * @todo Whyyyy is this mutating $opts…
         *
         * @param FormOptions $opts
         * @return array
@@ -202,15 +201,15 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                $user = $this->getUser();
                $conds = array();
 
-               // It makes no sense to hide both anons and logged-in users
-               // Where this occurs, force anons to be shown
-               $botsOnly = false;
+               // It makes no sense to hide both anons and logged-in users. When this occurs, try a guess on
+               // what the user meant and either show only bots or force anons to be shown.
+               $botsonly = false;
+               $hideanons = $opts['hideanons'];
                if ( $opts['hideanons'] && $opts['hideliu'] ) {
-                       // Check if the user wants to show bots only
                        if ( $opts['hidebots'] ) {
-                               $opts['hideanons'] = false;
+                               $hideanons = false;
                        } else {
-                               $botsOnly = true;
+                               $botsonly = true;
                        }
                }
 
@@ -224,13 +223,13 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                if ( $user->useRCPatrol() && $opts['hidepatrolled'] ) {
                        $conds['rc_patrolled'] = 0;
                }
-               if ( $botsOnly ) {
+               if ( $botsonly ) {
                        $conds['rc_bot'] = 1;
                } else {
                        if ( $opts['hideliu'] ) {
                                $conds[] = 'rc_user = 0';
                        }
-                       if ( $opts['hideanons'] ) {
+                       if ( $hideanons ) {
                                $conds[] = 'rc_user != 0';
                        }
                }
@@ -269,13 +268,44 @@ abstract class ChangesListSpecialPage extends SpecialPage {
 
        /**
         * Process the query
-        * @todo This should build some basic processing here…
         *
         * @param array $conds
         * @param FormOptions $opts
-        * @return bool|ResultWrapper Result or false (for Recentchangeslinked only)
+        * @return bool|ResultWrapper Result or false
         */
-       abstract public function doMainQuery( $conds, $opts );
+       public function doMainQuery( $conds, $opts ) {
+               $tables = array( 'recentchanges' );
+               $fields = RecentChange::selectFields();
+               $query_options = array();
+               $join_conds = array();
+
+               ChangeTags::modifyDisplayQuery(
+                       $tables,
+                       $fields,
+                       $conds,
+                       $join_conds,
+                       $query_options,
+                       ''
+               );
+
+               // @todo Fire a Special{$this->getName()}Query hook here
+               // @todo Uncomment and document
+               // if ( !wfRunHooks( 'ChangesListSpecialPageQuery',
+               //      array( &$tables, &$fields, &$conds, &$query_options, &$join_conds, $opts ) )
+               // ) {
+               //      return false;
+               // }
+
+               $dbr = $this->getDB();
+               return $dbr->select(
+                       $tables,
+                       $fields,
+                       $conds,
+                       __METHOD__,
+                       $query_options,
+                       $join_conds
+               );
+       }
 
        /**
         * Return a DatabaseBase object for reading
@@ -288,16 +318,36 @@ abstract class ChangesListSpecialPage extends SpecialPage {
 
        /**
         * Send output to the OutputPage object, only called if not used feeds
-        * @todo This should do most, if not all, of the outputting now done by subclasses
         *
         * @param ResultWrapper $rows Database rows
         * @param FormOptions $opts
         */
-       abstract public function webOutput( $rows, $opts );
+       public function webOutput( $rows, $opts ) {
+               if ( !$this->including() ) {
+                       $this->outputFeedLinks();
+                       $this->doHeader( $opts );
+               }
+
+               $this->outputChangesList( $rows, $opts );
+       }
+
+       /**
+        * Output feed links.
+        */
+       public function outputFeedLinks() {
+               // nothing by default
+       }
+
+       /**
+        * Build and output the actual changes list.
+        *
+        * @param array $rows Database rows
+        * @param FormOptions $opts
+        */
+       abstract public function outputChangesList( $rows, $opts );
 
        /**
         * Return the text to be displayed above the changes
-        * @todo Not called by anything, should be called by webOutput()
         *
         * @param FormOptions $opts
         * @return string XHTML
index 792d0a6..dea65f3 100644 (file)
@@ -180,7 +180,6 @@ class SpecialPageFactory {
                global $wgSpecialPages;
                global $wgDisableCounters, $wgDisableInternalSearch, $wgEmailAuthentication;
                global $wgEnableEmail, $wgEnableJavaScriptTest;
-               global $wgMiserMode;
 
                if ( !is_object( self::$list ) ) {
                        wfProfileIn( __METHOD__ );
@@ -206,9 +205,7 @@ class SpecialPageFactory {
                                self::$list['JavaScriptTest'] = 'SpecialJavaScriptTest';
                        }
 
-                       if ( !$wgMiserMode ) {
-                               self::$list['Activeusers'] = 'SpecialActiveUsers';
-                       }
+                       self::$list['Activeusers'] = 'SpecialActiveUsers';
 
                        // Add extension special pages
                        self::$list = array_merge( self::$list, $wgSpecialPages );
index 705dab5..641c046 100644 (file)
@@ -87,39 +87,31 @@ class ActiveUsersPager extends UsersPager {
        }
 
        function getIndexField() {
-               return 'rc_user_text';
+               return 'qcc_title';
        }
 
        function getQueryInfo() {
                $dbr = $this->getDatabase();
 
-               $conds = array( 'rc_user > 0' ); // Users - no anons
-               $conds[] = 'rc_log_type IS NULL OR rc_log_type != ' . $dbr->addQuotes( 'newusers' );
-               $conds[] = 'rc_timestamp >= ' . $dbr->addQuotes(
-                       $dbr->timestamp( wfTimestamp( TS_UNIX ) - $this->RCMaxAge * 24 * 3600 ) );
-
+               $conds = array(
+                       'qcc_type' => 'activeusers',
+                       'qcc_namespace' => NS_USER,
+                       'user_name = qcc_title',
+                       'rc_user_text = qcc_title'
+               );
                if ( $this->requestedUser != '' ) {
-                       $conds[] = 'rc_user_text >= ' . $dbr->addQuotes( $this->requestedUser );
+                       $conds[] = 'qcc_title >= ' . $dbr->addQuotes( $this->requestedUser );
                }
-
                if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
                        $conds[] = 'NOT EXISTS (' . $dbr->selectSQLText(
-                               'ipblocks', '1', array( 'rc_user=ipb_user', 'ipb_deleted' => 1 )
+                               'ipblocks', '1', array( 'ipb_user=user_id', 'ipb_deleted' => 1 )
                        ) . ')';
                }
 
                return array(
-                       'tables' => array( 'recentchanges' ),
-                       'fields' => array(
-                               'user_name' => 'rc_user_text', // for Pager inheritance
-                               'rc_user_text', // for Pager
-                               'user_id' => 'MAX(rc_user)', // Postgres
-                               'recentedits' => 'COUNT(*)'
-                       ),
-                       'options' => array(
-                               'GROUP BY' => array( 'rc_user_text' ),
-                               'USE INDEX' => array( 'recentchanges' => 'rc_user_text' )
-                       ),
+                       'tables' => array( 'querycachetwo', 'user', 'recentchanges' ),
+                       'fields' => array( 'user_name', 'user_id', 'recentedits' => 'COUNT(*)', 'qcc_title' ),
+                       'options' => array( 'GROUP BY' => array( 'qcc_title' ) ),
                        'conds' => $conds
                );
        }
@@ -249,6 +241,12 @@ class SpecialActiveUsers extends SpecialPage {
                $out->wrapWikiMsg( "<div class='mw-activeusers-intro'>\n$1\n</div>",
                        array( 'activeusers-intro', $this->getLanguage()->formatNum( $wgActiveUserDays ) ) );
 
+               // Occasionally merge in new updates
+               $seconds = self::mergeActiveUsers( 600 );
+               // Mention the level of staleness
+               $out->addWikiMsg( 'cachedspecial-viewing-cached-ttl',
+                       $this->getLanguage()->formatDuration( $seconds ) );
+
                $up = new ActiveUsersPager( $this->getContext(), null, $par );
 
                # getBody() first to check, if empty
@@ -269,4 +267,141 @@ class SpecialActiveUsers extends SpecialPage {
        protected function getGroupName() {
                return 'users';
        }
+
+       /**
+        * @param integer $period Seconds (do updates no more often than this)
+        * @return integer How many seconds old the cache is
+        */
+       public static function mergeActiveUsers( $period ) {
+               global $wgActiveUserDays;
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $cTime = $dbr->selectField( 'querycache_info',
+                       'qci_timestamp',
+                       array( 'qci_type' => 'activeusers' )
+               );
+               if ( !wfReadOnly() ) {
+                       if ( !$cTime || ( time() - wfTimestamp( TS_UNIX, $cTime ) ) > $period ) {
+                               $dbw = wfGetDB( DB_MASTER );
+                               self::doQueryCacheUpdate( $dbw, 2 * $period );
+                       }
+               }
+               return ( time() -
+                       ( $cTime ? wfTimestamp( TS_UNIX, $cTime ) : $wgActiveUserDays * 86400 ) );
+       }
+
+       /**
+        * @param DatabaseBase $dbw Passed in from updateSpecialPages.php
+        * @return void
+        */
+       public static function cacheUpdate( DatabaseBase $dbw ) {
+               global $wgActiveUserDays;
+
+               self::doQueryCacheUpdate( $dbw, $wgActiveUserDays * 86400 );
+       }
+
+       /**
+        * Update the query cache as needed
+        *
+        * @param DatabaseBase $dbw
+        * @param integer $window Maximum time range of new data to scan (in seconds)
+        * @return bool Success
+        */
+       protected static function doQueryCacheUpdate( DatabaseBase $dbw, $window ) {
+               global $wgActiveUserDays;
+
+               $lockKey = wfWikiID() . '-activeusers';
+               if ( !$dbw->lock( $lockKey, __METHOD__, 1 ) ) {
+                       return false; // exclusive update (avoids duplicate entries)
+               }
+
+               $now = time();
+               $cTime = $dbw->selectField( 'querycache_info',
+                       'qci_timestamp',
+                       array( 'qci_type' => 'activeusers' )
+               );
+               $cTimeUnix = $cTime ? wfTimestamp( TS_UNIX, $cTime ) : 1;
+
+               // Pick the date range to fetch from. This is normally from the last
+               // update to till the present time, but has a limited window for sanity.
+               // If the window is limited, multiple runs are need to fully populate it.
+               $sTimestamp = max( $cTimeUnix, $now - $wgActiveUserDays * 86400 );
+               $eTimestamp = min( $sTimestamp + $window, $now );
+
+               // Get all the users active since the last update
+               $res = $dbw->select(
+                       array( 'recentchanges' ),
+                       array( 'rc_user_text', 'lastedittime' => 'MAX(rc_timestamp)' ),
+                       array(
+                               'rc_user > 0', // actual accounts
+                               'rc_log_type IS NULL OR rc_log_type != ' . $dbw->addQuotes( 'newusers' ),
+                               'rc_timestamp >= ' . $dbw->addQuotes( $dbw->timestamp( $sTimestamp ) ),
+                               'rc_timestamp <= ' . $dbw->addQuotes( $dbw->timestamp( $eTimestamp ) )
+                       ),
+                       __METHOD__,
+                       array(
+                               'GROUP BY' => array( 'rc_user_text' ),
+                               'ORDER BY' => 'NULL' // avoid filesort
+                       )
+               );
+               $names = array();
+               foreach ( $res as $row ) {
+                       $names[$row->rc_user_text] = $row->lastedittime;
+               }
+
+               // Rotate out users that have not edited in too long (according to old data set)
+               $dbw->delete( 'querycachetwo',
+                       array(
+                               'qcc_type' => 'activeusers',
+                               'qcc_value < ' . $dbw->addQuotes( $now - $wgActiveUserDays * 86400 ) // TS_UNIX
+                       ),
+                       __METHOD__
+               );
+
+               // Find which of the recently active users are already accounted for
+               if ( count( $names ) ) {
+                       $res = $dbw->select( 'querycachetwo',
+                               array( 'user_name' => 'qcc_title' ),
+                               array(
+                                       'qcc_type' => 'activeusers',
+                                       'qcc_namespace' => NS_USER,
+                                       'qcc_title' => array_keys( $names ) ),
+                               __METHOD__
+                       );
+                       foreach ( $res as $row ) {
+                               unset( $names[$row->user_name] );
+                       }
+               }
+
+               // Insert the users that need to be added to the list (which their last edit time
+               if ( count( $names ) ) {
+                       $newRows = array();
+                       foreach ( $names as $name => $lastEditTime ) {
+                               $newRows[] = array(
+                                       'qcc_type'  => 'activeusers',
+                                       'qcc_namespace' => NS_USER,
+                                       'qcc_title' => $name,
+                                       'qcc_value' => wfTimestamp( TS_UNIX, $lastEditTime ),
+                                       'qcc_namespacetwo' => 0, // unused
+                                       'qcc_titletwo' => '' // unused
+                               );
+                       }
+                       foreach ( array_chunk( $newRows, 500 ) as $rowBatch ) {
+                               $dbw->insert( 'querycachetwo', $rowBatch, __METHOD__ );
+                               wfWaitForSlaves();
+                       }
+               }
+
+               // Touch the data freshness timestamp
+               $dbw->replace( 'querycache_info',
+                       array( 'qci_type' ),
+                       array( 'qci_type' => 'activeusers',
+                               'qci_timestamp' => $dbw->timestamp( $eTimestamp ) ), // not always $now
+                       __METHOD__
+               );
+
+               $dbw->unlock( $lockKey, __METHOD__ );
+
+               return true;
+       }
 }
index d2ee0df..57f23d3 100644 (file)
@@ -729,8 +729,17 @@ class SpecialBlock extends FormSpecialPage {
                                        return array( 'cant-see-hidden-user' );
                                }
 
-                               $currentBlock->delete();
-                               $status = $block->insert();
+                               $currentBlock->isHardblock( $block->isHardblock() );
+                               $currentBlock->prevents( 'createaccount', $block->prevents( 'createaccount' ) );
+                               $currentBlock->mExpiry = $block->mExpiry;
+                               $currentBlock->isAutoblocking( $block->isAutoblocking() );
+                               $currentBlock->mHideName = $block->mHideName;
+                               $currentBlock->prevents( 'sendemail', $block->prevents( 'sendemail' ) );
+                               $currentBlock->prevents( 'editownusertalk', $block->prevents( 'editownusertalk' ) );
+                               $currentBlock->mReason = $block->mReason;
+
+                               $status = $currentBlock->update();
+
                                $logaction = 'reblock';
 
                                # Unset _deleted fields if requested
index 08768b6..c594807 100644 (file)
@@ -132,34 +132,37 @@ class SpecialContributions extends IncludableSpecialPage {
                }
 
                $feedType = $request->getVal( 'feed' );
+
+               $feedParams = array(
+                       'action' => 'feedcontributions',
+                       'user' => $target,
+               );
+               if ( $this->opts['topOnly'] ) {
+                       $feedParams['toponly'] = true;
+               }
+               if ( $this->opts['deletedOnly'] ) {
+                       $feedParams['deletedonly'] = true;
+               }
+               if ( $this->opts['tagfilter'] !== '' ) {
+                       $feedParams['tagfilter'] = $this->opts['tagfilter'];
+               }
+               if ( $this->opts['namespace'] !== '' ) {
+                       $feedParams['namespace'] = $this->opts['namespace'];
+               }
+               // Don't use year and month for the feed URL, but pass them on if
+               // we redirect to API (if $feedType is specified)
+               if ( $feedType && $this->opts['year'] !== null ) {
+                       $feedParams['year'] = $this->opts['year'];
+               }
+               if ( $feedType && $this->opts['month'] !== null ) {
+                       $feedParams['month'] = $this->opts['month'];
+               }
+
                if ( $feedType ) {
                        // Maintain some level of backwards compatability
                        // If people request feeds using the old parameters, redirect to API
-                       $apiParams = array(
-                               'action' => 'feedcontributions',
-                               'feedformat' => $feedType,
-                               'user' => $target,
-                       );
-                       if ( $this->opts['topOnly'] ) {
-                               $apiParams['toponly'] = true;
-                       }
-                       if ( $this->opts['deletedOnly'] ) {
-                               $apiParams['deletedonly'] = true;
-                       }
-                       if ( $this->opts['tagfilter'] !== '' ) {
-                               $apiParams['tagfilter'] = $this->opts['tagfilter'];
-                       }
-                       if ( $this->opts['namespace'] !== '' ) {
-                               $apiParams['namespace'] = $this->opts['namespace'];
-                       }
-                       if ( $this->opts['year'] !== null ) {
-                               $apiParams['year'] = $this->opts['year'];
-                       }
-                       if ( $this->opts['month'] !== null ) {
-                               $apiParams['month'] = $this->opts['month'];
-                       }
-
-                       $url = wfAppendQuery( wfScript( 'api' ), $apiParams );
+                       $feedParams['feedformat'] = $feedType;
+                       $url = wfAppendQuery( wfScript( 'api' ), $feedParams );
 
                        $out->redirect( $url, '301' );
 
@@ -167,7 +170,7 @@ class SpecialContributions extends IncludableSpecialPage {
                }
 
                // Add RSS/atom links
-               $this->addFeedLinks( array( 'action' => 'feedcontributions', 'user' => $target ) );
+               $this->addFeedLinks( $feedParams );
 
                if ( wfRunHooks( 'SpecialContributionsBeforeMainOutput', array( $id, $userObj, $this ) ) ) {
                        if ( !$this->including() ) {
@@ -605,6 +608,9 @@ class ContribsPager extends ReverseChronologicalPager {
        public $mDb;
        public $preventClickjacking = false;
 
+       /** @var DatabaseBase */
+       public $mDbSecondary;
+
        /**
         * @var array
         */
@@ -641,6 +647,10 @@ class ContribsPager extends ReverseChronologicalPager {
                $month = isset( $options['month'] ) ? $options['month'] : false;
                $this->getDateCond( $year, $month );
 
+               // Most of this code will use the 'contributions' group DB, which can map to slaves
+               // with extra user based indexes or partioning by user. The additional metadata
+               // queries should use a regular slave since the lookup pattern is not all by user.
+               $this->mDbSecondary = wfGetDB( DB_SLAVE ); // any random slave
                $this->mDb = wfGetDB( DB_SLAVE, 'contributions' );
        }
 
@@ -860,7 +870,7 @@ class ContribsPager extends ReverseChronologicalPager {
                                $batch->add( $row->page_namespace, $row->page_title );
                        }
                }
-               $this->mParentLens = Revision::getParentLengths( $this->getDatabase(), $revIds );
+               $this->mParentLens = Revision::getParentLengths( $this->mDbSecondary, $revIds );
                $batch->execute();
                $this->mResult->seek( 0 );
        }
index 57d314f..7982d5c 100644 (file)
@@ -139,7 +139,7 @@ class SpecialJavaScriptTest extends SpecialPage {
 
                $out = $this->getOutput();
 
-               $out->addModules( 'mediawiki.tests.qunit.testrunner' );
+               $out->addModules( 'test.mediawiki.qunit.testrunner' );
                $qunitTestModules = $out->getResourceLoader()->getTestModuleNames( 'qunit' );
                $out->addModules( $qunitTestModules );
 
index 8e56574..082eed0 100644 (file)
@@ -277,7 +277,7 @@ class SpecialPasswordReset extends FormSpecialPage {
 
                $title = $this->msg( 'passwordreset-emailtitle' );
 
-               $this->result = $firstUser->sendMail( $title->escaped(), $this->email->text() );
+               $this->result = $firstUser->sendMail( $title->text(), $this->email->text() );
 
                if ( isset( $data['Capture'] ) && $data['Capture'] ) {
                        // Save the user, will be used if an error occurs when sending the email
index c6307f0..4548b63 100644 (file)
@@ -264,6 +264,7 @@ class SpecialPrefixindex extends SpecialAllpages {
                                        'from' => $s->page_title,
                                        'prefix' => $prefix,
                                        'hideredirects' => $this->hideRedirects,
+                                       'stripprefix' => $this->stripPrefix,
                                );
 
                                if ( $namespace || $prefix == '' ) {
index 09284d0..e505ecb 100644 (file)
@@ -38,6 +38,7 @@ class SpecialProtectedpages extends SpecialPage {
        public function execute( $par ) {
                $this->setHeaders();
                $this->outputHeader();
+               $this->getOutput()->addModuleStyles( 'mediawiki.special' );
 
                // Purge expired entries on one in every 10 queries
                if ( !mt_rand( 0, 10 ) ) {
@@ -81,7 +82,7 @@ class SpecialProtectedpages extends SpecialPage {
                if ( $pager->getNumRows() ) {
                        $this->getOutput()->addHTML(
                                $pager->getNavigationBar() .
-                                       '<ul>' . $pager->getBody() . '</ul>' .
+                                       $pager->getBody() .
                                        $pager->getNavigationBar()
                        );
                } else {
@@ -89,105 +90,6 @@ class SpecialProtectedpages extends SpecialPage {
                }
        }
 
-       /**
-        * Callback function to output a restriction
-        * @param Title $row Protected title
-        * @return string Formatted "<li>" element
-        */
-       public function formatRow( $row ) {
-               wfProfileIn( __METHOD__ );
-
-               static $infinity = null;
-
-               if ( is_null( $infinity ) ) {
-                       $infinity = wfGetDB( DB_SLAVE )->getInfinity();
-               }
-
-               $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
-               if ( !$title ) {
-                       wfProfileOut( __METHOD__ );
-
-                       return Html::rawElement(
-                               'li',
-                               array(),
-                               Html::element(
-                                       'span',
-                                       array( 'class' => 'mw-invalidtitle' ),
-                                       Linker::getInvalidTitleDescription(
-                                               $this->getContext(),
-                                               $row->page_namespace,
-                                               $row->page_title
-                                       )
-                               )
-                       ) . "\n";
-               }
-
-               $link = Linker::link( $title );
-
-               $description_items = array();
-
-               // Messages: restriction-level-sysop, restriction-level-autoconfirmed
-               $protType = $this->msg( 'restriction-level-' . $row->pr_level )->escaped();
-
-               $description_items[] = $protType;
-
-               if ( $row->pr_cascade ) {
-                       $description_items[] = $this->msg( 'protect-summary-cascade' )->text();
-               }
-
-               $stxt = '';
-               $lang = $this->getLanguage();
-
-               $expiry = $lang->formatExpiry( $row->pr_expiry, TS_MW );
-               if ( $expiry != $infinity ) {
-                       $user = $this->getUser();
-                       $description_items[] = $this->msg(
-                               'protect-expiring-local',
-                               $lang->userTimeAndDate( $expiry, $user ),
-                               $lang->userDate( $expiry, $user ),
-                               $lang->userTime( $expiry, $user )
-                       )->escaped();
-               }
-
-               if ( !is_null( $size = $row->page_len ) ) {
-                       $stxt = $lang->getDirMark() . ' ' . Linker::formatRevisionSize( $size );
-               }
-
-               // Show a link to the change protection form for allowed users otherwise
-               // a link to the protection log
-               if ( $this->getUser()->isAllowed( 'protect' ) ) {
-                       $changeProtection = Linker::linkKnown(
-                               $title,
-                               $this->msg( 'protect_change' )->escaped(),
-                               array(),
-                               array( 'action' => 'unprotect' )
-                       );
-               } else {
-                       $ltitle = SpecialPage::getTitleFor( 'Log' );
-                       $changeProtection = Linker::linkKnown(
-                               $ltitle,
-                               $this->msg( 'protectlogpage' )->escaped(),
-                               array(),
-                               array(
-                                       'type' => 'protect',
-                                       'page' => $title->getPrefixedText()
-                               )
-                       );
-               }
-
-               $changeProtection = ' ' . $this->msg( 'parentheses' )->rawParams( $changeProtection )
-                       ->escaped();
-
-               wfProfileOut( __METHOD__ );
-
-               return Html::rawElement(
-                       'li',
-                       array(),
-                       $lang->specialList( $link . $stxt, $lang->commaList( $description_items ), false ) .
-                               $changeProtection
-               ) . "\n";
-       }
-
        /**
         * @param int $namespace
         * @param string $type Restriction type
@@ -388,7 +290,7 @@ class SpecialProtectedpages extends SpecialPage {
  * @todo document
  * @ingroup Pager
  */
-class ProtectedPagesPager extends AlphabeticPager {
+class ProtectedPagesPager extends TablePager {
        public $mForm, $mConds;
        private $type, $level, $namespace, $sizetype, $size, $indefonly, $cascadeonly, $noredirect;
 
@@ -408,19 +310,185 @@ class ProtectedPagesPager extends AlphabeticPager {
                parent::__construct( $form->getContext() );
        }
 
-       function getStartBody() {
+       function preprocessResults( $result ) {
                # Do a link batch query
                $lb = new LinkBatch;
-               foreach ( $this->mResult as $row ) {
+               $userids = array();
+
+               foreach ( $result as $row ) {
                        $lb->add( $row->page_namespace, $row->page_title );
+                       // field is nullable, maybe null on old protections
+                       if ( $row->log_user !== null ) {
+                               $userids[] = $row->log_user;
+                       }
+               }
+
+               // fill LinkBatch with user page and user talk
+               if ( count( $userids ) ) {
+                       $userCache = UserCache::singleton();
+                       $userCache->doQuery( $userids, array(), __METHOD__ );
+                       foreach ( $userids as $userid ) {
+                               $name = $userCache->getProp( $userid, 'name' );
+                               if ( $name !== false ) {
+                                       $lb->add( NS_USER, $name );
+                                       $lb->add( NS_USER_TALK, $name );
+                               }
+                       }
                }
+
                $lb->execute();
+       }
 
-               return '';
+       function getFieldNames() {
+               static $headers = null;
+
+               if ( $headers == array() ) {
+                       $headers = array(
+                               'log_timestamp' => 'protectedpages-timestamp',
+                               'pr_page' => 'protectedpages-page',
+                               'pr_expiry' => 'protectedpages-expiry',
+                               'log_user' => 'protectedpages-performer',
+                               'pr_params' => 'protectedpages-params',
+                               'log_comment' => 'protectedpages-reason',
+                       );
+                       foreach ( $headers as $key => $val ) {
+                               $headers[$key] = $this->msg( $val )->text();
+                       }
+               }
+
+               return $headers;
        }
 
-       function formatRow( $row ) {
-               return $this->mForm->formatRow( $row );
+       /**
+        * @param string $field
+        * @param string $value
+        * @return string
+        * @throws MWException
+        */
+       function formatValue( $field, $value ) {
+               /** @var $row object */
+               $row = $this->mCurrentRow;
+
+               $formatted = '';
+
+               switch ( $field ) {
+                       case 'log_timestamp':
+                               // when timestamp is null, this is a old protection row
+                               if ( $value === null ) {
+                                       $formatted = Html::rawElement(
+                                               'span',
+                                               array( 'class' => 'mw-protectedpages-unknown' ),
+                                               $this->msg( 'protectedpages-unknown-timestamp' )->escaped()
+                                       );
+                               } else {
+                                       $formatted = $this->getLanguage()->userTimeAndDate( $value, $this->getUser() );
+                               }
+                               break;
+
+                       case 'pr_page':
+                               $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
+                               if ( !$title ) {
+                                       $formatted = Html::element(
+                                               'span',
+                                               array( 'class' => 'mw-invalidtitle' ),
+                                               Linker::getInvalidTitleDescription(
+                                                       $this->getContext(),
+                                                       $row->page_namespace,
+                                                       $row->page_title
+                                               )
+                                       );
+                               } else {
+                                       $formatted = Linker::link( $title );
+                               }
+                               if ( !is_null( $row->page_len ) ) {
+                                       $formatted .= $this->getLanguage()->getDirMark() .
+                                               ' ' . Html::rawElement(
+                                               'span',
+                                               array( 'class' => 'mw-protectedpages-length' ),
+                                               Linker::formatRevisionSize( $row->page_len )
+                                       );
+                               }
+                               break;
+
+                       case 'pr_expiry':
+                               $formatted = $this->getLanguage()->formatExpiry( $value, /* User preference timezone */true );
+                               $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
+                               if ( $this->getUser()->isAllowed( 'protect' ) && $title ) {
+                                       $changeProtection = Linker::linkKnown(
+                                               $title,
+                                               $this->msg( 'protect_change' )->escaped(),
+                                               array(),
+                                               array( 'action' => 'unprotect' )
+                                       );
+                                       $formatted .= ' ' . Html::rawElement(
+                                               'span',
+                                               array( 'class' => 'mw-protectedpages-actions' ),
+                                               $this->msg( 'parentheses' )->rawParams( $changeProtection )->escaped()
+                                       );
+                               }
+                               break;
+
+                       case 'log_user':
+                               // when timestamp is null, this is a old protection row
+                               if ( $row->log_timestamp === null ) {
+                                       $formatted = Html::rawElement(
+                                               'span',
+                                               array( 'class' => 'mw-protectedpages-unknown' ),
+                                               $this->msg( 'protectedpages-unknown-performer' )->escaped()
+                                       );
+                               } else {
+                                       $username = UserCache::singleton()->getProp( $value, 'name' );
+                                       if ( LogEventsList::userCanBitfield( $row->log_deleted, LogPage::DELETED_USER, $this->getUser() ) ) {
+                                               if ( $username === false ) {
+                                                       $formatted = htmlspecialchars( $value );
+                                               } else {
+                                                       $formatted = Linker::userLink( $value, $username )
+                                                               . Linker::userToolLinks( $value, $username );
+                                               }
+                                       } else {
+                                               $formatted = $this->msg( 'rev-deleted-user' )->escaped();
+                                       }
+                                       if ( LogEventsList::isDeleted( $row, LogPage::DELETED_USER ) ) {
+                                               $formatted = '<span class="history-deleted">' . $formatted . '</span>';
+                                       }
+                               }
+                               break;
+
+                       case 'pr_params':
+                               $params = array();
+                               // Messages: restriction-level-sysop, restriction-level-autoconfirmed
+                               $params[] = $this->msg( 'restriction-level-' . $row->pr_level )->escaped();
+                               if ( $row->pr_cascade ) {
+                                       $params[] = $this->msg( 'protect-summary-cascade' )->text();
+                               }
+                               $formatted = $this->getLanguage()->commaList( $params );
+                               break;
+
+                       case 'log_comment':
+                               // when timestamp is null, this is a old protection row
+                               if ( $row->log_timestamp === null ) {
+                                       $formatted = Html::rawElement(
+                                               'span',
+                                               array( 'class' => 'mw-protectedpages-unknown' ),
+                                               $this->msg( 'protectedpages-unknown-reason' )->escaped()
+                                       );
+                               } else {
+                                       if ( LogEventsList::userCanBitfield( $row->log_deleted, LogPage::DELETED_COMMENT, $this->getUser() ) ) {
+                                               $formatted = Linker::formatComment( $value !== null ? $value : '' );
+                                       } else {
+                                               $formatted = $this->msg( 'rev-deleted-comment' )->escaped();
+                                       }
+                                       if ( LogEventsList::isDeleted( $row, LogPage::DELETED_COMMENT ) ) {
+                                               $formatted = '<span class="history-deleted">' . $formatted . '</span>';
+                                       }
+                               }
+                               break;
+
+                       default:
+                               throw new MWException( "Unknown field '$field'" );
+               }
+
+               return $formatted;
        }
 
        function getQueryInfo() {
@@ -455,14 +523,51 @@ class ProtectedPagesPager extends AlphabeticPager {
                }
 
                return array(
-                       'tables' => array( 'page_restrictions', 'page' ),
-                       'fields' => array( 'pr_id', 'page_namespace', 'page_title', 'page_len',
-                               'pr_type', 'pr_level', 'pr_expiry', 'pr_cascade' ),
-                       'conds' => $conds
+                       'tables' => array( 'page', 'page_restrictions', 'log_search', 'logging' ),
+                       'fields' => array(
+                               'pr_id',
+                               'page_namespace',
+                               'page_title',
+                               'page_len',
+                               'pr_type',
+                               'pr_level',
+                               'pr_expiry',
+                               'pr_cascade',
+                               'log_timestamp',
+                               'log_user',
+                               'log_comment',
+                               'log_deleted',
+                       ),
+                       'conds' => $conds,
+                       'join_conds' => array(
+                               'log_search' => array(
+                                       'LEFT JOIN', array(
+                                               'ls_field' => 'pr_id', 'ls_value = pr_id'
+                                       )
+                               ),
+                               'logging' => array(
+                                       'LEFT JOIN', array(
+                                               'ls_log_id = log_id'
+                                       )
+                               )
+                       )
                );
        }
 
+       public function getTableClass() {
+               return 'TablePager mw-protectedpages';
+       }
+
        function getIndexField() {
                return 'pr_id';
        }
+
+       function getDefaultSort() {
+               return 'pr_id';
+       }
+
+       function isFieldSortable( $field ) {
+               // no index for sorting exists
+               return false;
+       }
 }
index fdf8dcb..d266e3f 100644 (file)
@@ -144,11 +144,11 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
        public function validateOptions( FormOptions $opts ) {
                global $wgFeedLimit;
                $opts->validateIntBounds( 'limit', 0, $this->feedFormat ? $wgFeedLimit : 5000 );
+               parent::validateOptions( $opts );
        }
 
        /**
         * Return an array of conditions depending of options set in $opts
-        * @todo Whyyyy is this mutating $opts…
         *
         * @param FormOptions $opts
         * @return array
@@ -182,35 +182,34 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
         * @return bool|ResultWrapper Result or false (for Recentchangeslinked only)
         */
        public function doMainQuery( $conds, $opts ) {
-               $tables = array( 'recentchanges' );
-               $join_conds = array();
-               $query_options = array();
+               global $wgAllowCategorizedRecentChanges;
 
-               $uid = $this->getUser()->getId();
                $dbr = $this->getDB();
-               $limit = $opts['limit'];
-               $namespace = $opts['namespace'];
-               $invert = $opts['invert'];
-               $associated = $opts['associated'];
+               $user = $this->getUser();
 
+               $tables = array( 'recentchanges' );
                $fields = RecentChange::selectFields();
+               $query_options = array();
+               $join_conds = array();
+
                // JOIN on watchlist for users
-               if ( $uid && $this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
+               if ( $user->getId() && $user->isAllowed( 'viewmywatchlist' ) ) {
                        $tables[] = 'watchlist';
                        $fields[] = 'wl_user';
                        $fields[] = 'wl_notificationtimestamp';
                        $join_conds['watchlist'] = array( 'LEFT JOIN', array(
-                               'wl_user' => $uid,
+                               'wl_user' => $user->getId(),
                                'wl_title=rc_title',
                                'wl_namespace=rc_namespace'
                        ) );
                }
-               if ( $this->getUser()->isAllowed( 'rollback' ) ) {
+
+               if ( $user->isAllowed( 'rollback' ) ) {
                        $tables[] = 'page';
                        $fields[] = 'page_latest';
                        $join_conds['page'] = array( 'LEFT JOIN', 'rc_cur_id=page_id' );
                }
-               // Tag stuff.
+
                ChangeTags::modifyDisplayQuery(
                        $tables,
                        $fields,
@@ -228,30 +227,43 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
 
                // rc_new is not an ENUM, but adding a redundant rc_new IN (0,1) gives mysql enough
                // knowledge to use an index merge if it wants (it may use some other index though).
-               return $dbr->select(
+               $rows = $dbr->select(
                        $tables,
                        $fields,
                        $conds + array( 'rc_new' => array( 0, 1 ) ),
                        __METHOD__,
-                       array( 'ORDER BY' => 'rc_timestamp DESC', 'LIMIT' => $limit ) + $query_options,
+                       array( 'ORDER BY' => 'rc_timestamp DESC', 'LIMIT' => $opts['limit'] ) + $query_options,
                        $join_conds
                );
+
+               // Build the final data
+               if ( $wgAllowCategorizedRecentChanges ) {
+                       $this->filterByCategories( $rows, $opts );
+               }
+
+               return $rows;
+       }
+
+       /**
+        * Output feed links.
+        */
+       public function outputFeedLinks() {
+               $feedQuery = $this->getFeedQuery();
+               if ( $feedQuery !== '' ) {
+                       $this->getOutput()->setFeedAppendQuery( $feedQuery );
+               } else {
+                       $this->getOutput()->setFeedAppendQuery( false );
+               }
        }
 
        /**
-        * Send output to the OutputPage object, only called if not used feeds
+        * Build and output the actual changes list.
         *
         * @param array $rows Database rows
         * @param FormOptions $opts
         */
-       public function webOutput( $rows, $opts ) {
-               global $wgRCShowWatchingUsers, $wgShowUpdatedMarker, $wgAllowCategorizedRecentChanges;
-
-               // Build the final data
-
-               if ( $wgAllowCategorizedRecentChanges ) {
-                       $this->filterByCategories( $rows, $opts );
-               }
+       public function outputChangesList( $rows, $opts ) {
+               global $wgRCShowWatchingUsers, $wgShowUpdatedMarker;
 
                $limit = $opts['limit'];
 
@@ -302,21 +314,6 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                }
                $rclistOutput .= $list->endRecentChangesList();
 
-               // Print things out
-
-               if ( !$this->including() ) {
-                       // Output options box
-                       $this->doHeader( $opts );
-               }
-
-               // And now for the content
-               $feedQuery = $this->getFeedQuery();
-               if ( $feedQuery !== '' ) {
-                       $this->getOutput()->setFeedAppendQuery( $feedQuery );
-               } else {
-                       $this->getOutput()->setFeedAppendQuery( false );
-               }
-
                if ( $rows->numRows() === 0 ) {
                        $this->getOutput()->addHtml(
                                '<div class="mw-changeslist-empty">' . $this->msg( 'recentchanges-noresult' )->parse() . '</div>'
@@ -509,7 +506,6 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
        public function getFeedQuery() {
                global $wgFeedLimit;
 
-               $this->getOptions()->validateIntBounds( 'limit', 0, $wgFeedLimit );
                $options = $this->getOptions()->getChangedValues();
 
                // wfArrayToCgi() omits options set to null or false
@@ -520,6 +516,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                }
                unset( $value );
 
+               if ( isset( $options['limit'] ) && $options['limit'] > $wgFeedLimit ) {
+                       $options['limit'] = $wgFeedLimit;
+               }
+
                return wfArrayToCgi( $options );
        }
 
index 804f7a9..3599dc6 100644 (file)
@@ -55,6 +55,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        /** The RevDel_List object, storing the list of items to be deleted/undeleted */
        var $list;
 
+       /** Was the DB modified in this request */
+       protected $wasSaved = false;
+
        /**
         * UI labels for each type.
         */
@@ -177,14 +180,24 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                # Show relevant lines from the deletion log
                $deleteLogPage = new LogPage( 'delete' );
                $output->addHTML( "<h2>" . $deleteLogPage->getName()->escaped() . "</h2>\n" );
-               LogEventsList::showLogExtract( $output, 'delete',
-                       $this->targetObj, '', array( 'lim' => 25, 'conds' => $qc ) );
+               LogEventsList::showLogExtract(
+                       $output,
+                       'delete',
+                       $this->targetObj,
+                       '', /* user */
+                       array( 'lim' => 25, 'conds' => $qc, 'useMaster' => $this->wasSaved )
+               );
                # Show relevant lines from the suppression log
                if ( $user->isAllowed( 'suppressionlog' ) ) {
                        $suppressLogPage = new LogPage( 'suppress' );
                        $output->addHTML( "<h2>" . $suppressLogPage->getName()->escaped() . "</h2>\n" );
-                       LogEventsList::showLogExtract( $output, 'suppress',
-                               $this->targetObj, '', array( 'lim' => 25, 'conds' => $qc ) );
+                       LogEventsList::showLogExtract(
+                               $output,
+                               'suppress',
+                               $this->targetObj,
+                               '',
+                               array( 'lim' => 25, 'conds' => $qc, 'useMaster' => $this->wasSaved )
+                       );
                }
        }
 
@@ -523,6 +536,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        protected function success() {
                $this->getOutput()->setPageTitle( $this->msg( 'actioncomplete' ) );
                $this->getOutput()->wrapWikiMsg( "<span class=\"success\">\n$1\n</span>", $this->typeLabels['success'] );
+               $this->wasSaved = true;
                $this->list->reloadFromMaster();
                $this->showForm();
        }
index 18e777a..b89522d 100644 (file)
@@ -105,7 +105,6 @@ class SpecialSearch extends SpecialPage {
 
                if ( $request->getVal( 'fulltext' )
                        || !is_null( $request->getVal( 'offset' ) )
-                       || !is_null( $request->getVal( 'searchx' ) )
                ) {
                        $this->showResults( $search );
                } else {
@@ -120,7 +119,7 @@ class SpecialSearch extends SpecialPage {
         */
        public function load() {
                $request = $this->getRequest();
-               list( $this->limit, $this->offset ) = $request->getLimitOffset( 20, '', 500 );
+               list( $this->limit, $this->offset ) = $request->getLimitOffset( 20 );
                $this->mPrefix = $request->getVal( 'prefix', '' );
 
                $user = $this->getUser();
@@ -199,7 +198,7 @@ class SpecialSearch extends SpecialPage {
                if ( !is_null( $t ) ) {
                        global $wgGoToEdit;
                        wfRunHooks( 'SpecialSearchNogomatch', array( &$t ) );
-                       wfDebugLog( 'nogomatch', $t->getText(), false );
+                       wfDebugLog( 'nogomatch', $t->getText(), 'private' );
 
                        # If the feature is enabled, go straight to the edit page
                        if ( $wgGoToEdit ) {
@@ -376,7 +375,7 @@ class SpecialSearch extends SpecialPage {
                // prev/next links
                if ( $num || $this->offset ) {
                        // Show the create link ahead
-                       $this->showCreateLink( $t, $num );
+                       $this->showCreateLink( $t, $num, $titleMatches, $textMatches );
                        $prevnext = $this->getLanguage()->viewPrevNext( $this->getPageTitle(), $this->offset, $this->limit,
                                $this->powerSearchOptions() + array( 'search' => $term ),
                                max( $titleMatchesNum, $textMatchesNum ) < $this->limit
@@ -422,7 +421,7 @@ class SpecialSearch extends SpecialPage {
                        } else {
                                $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>",
                                        array( 'search-nonefound', wfEscapeWikiText( $term ) ) );
-                               $this->showCreateLink( $t, $num );
+                               $this->showCreateLink( $t, $num, $titleMatches, $textMatches );
                        }
                }
                $out->addHtml( "</div>" );
@@ -437,12 +436,16 @@ class SpecialSearch extends SpecialPage {
        /**
         * @param $t Title
         * @param int $num The number of search results found
+        * @param $titleMatches null|SearchResultSet results from title search
+        * @param $textMatches null|SearchResultSet results from text search
         */
-       protected function showCreateLink( $t, $num ) {
+       protected function showCreateLink( $t, $num, $titleMatches, $textMatches ) {
                // show direct page/create link if applicable
 
                // Check DBkey !== '' in case of fragment link only.
-               if ( is_null( $t ) || $t->getDBkey() === '' ) {
+               if ( is_null( $t ) || $t->getDBkey() === '' ||
+                               ( $titleMatches !== null && $titleMatches->searchContainedSyntax() ) ||
+                               ( $textMatches !== null && $textMatches->searchContainedSyntax() ) ) {
                        // invalid title
                        // preserve the paragraph for margins etc...
                        $this->getOutput()->addHtml( '<p></p>' );
@@ -1109,7 +1112,7 @@ class SpecialSearch extends SpecialPage {
                $out .= Html::hidden( 'fulltext', 'Search' ) . "\n";
                $out .= Xml::submitButton(
                        $this->msg( 'searchbutton' )->text(),
-                       array( 'class' => array( 'mw-ui-button', 'mw-ui-primary' ) )
+                       array( 'class' => array( 'mw-ui-button', 'mw-ui-progressive' ) )
                ) . "\n";
                return $out . $this->didYouMeanHtml;
        }
index 014408e..a6b3602 100644 (file)
@@ -152,6 +152,10 @@ class UserrightsPage extends SpecialPage {
                        }
 
                        $targetUser = $status->value;
+                       if ( $targetUser instanceof User ) { // UserRightsProxy doesn't have this method (bug 61252)
+                               $targetUser->clearInstanceCache(); // bug 38989
+                       }
+
 
                        if ( $request->getVal( 'conflictcheck-originalgroups' ) !== implode( ',', $targetUser->getGroups() ) ) {
                                $out->addWikiMsg( 'userrights-conflict' );
index e8aa9b4..c38b009 100644 (file)
@@ -675,7 +675,7 @@ class SpecialVersion extends SpecialPage {
                        }
                } elseif ( isset( $extension['description'] ) ) {
                        // Non localized version
-                       $description = $out->parseInline( $extension['description'] );
+                       $description = $extension['description'];
                } else {
                        $description = '';
                }
index a98447b..fbdaec4 100644 (file)
@@ -178,6 +178,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
 
                $dbr = $this->getDB();
                $user = $this->getUser();
+
                # Toggle watchlist content (all recent edits or just the latest)
                if ( $opts['extended'] ) {
                        $limitWatchlist = $user->getIntOption( 'wllimit' );
@@ -201,6 +202,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
 
                $tables = array( 'recentchanges', 'watchlist' );
                $fields = RecentChange::selectFields();
+               $query_options = array( 'ORDER BY' => 'rc_timestamp DESC' );
                $join_conds = array(
                        'watchlist' => array(
                                'INNER JOIN',
@@ -211,12 +213,12 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                                ),
                        ),
                );
-               $options = array( 'ORDER BY' => 'rc_timestamp DESC' );
+
                if ( $wgShowUpdatedMarker ) {
                        $fields[] = 'wl_notificationtimestamp';
                }
                if ( $limitWatchlist ) {
-                       $options['LIMIT'] = $limitWatchlist;
+                       $query_options['LIMIT'] = $limitWatchlist;
                }
 
                $rollbacker = $user->isAllowed( 'rollback' );
@@ -245,10 +247,26 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                }
 
 
-               ChangeTags::modifyDisplayQuery( $tables, $fields, $conds, $join_conds, $options, '' );
-               wfRunHooks( 'SpecialWatchlistQuery', array( &$conds, &$tables, &$join_conds, &$fields, $opts ) );
+               ChangeTags::modifyDisplayQuery(
+                       $tables,
+                       $fields,
+                       $conds,
+                       $join_conds,
+                       $query_options,
+                       ''
+               );
+
+               wfRunHooks( 'SpecialWatchlistQuery',
+                       array( &$conds, &$tables, &$join_conds, &$fields, $opts ) );
 
-               return $dbr->select( $tables, $fields, $conds, __METHOD__, $options, $join_conds );
+               return $dbr->select(
+                       $tables,
+                       $fields,
+                       $conds,
+                       __METHOD__,
+                       $query_options,
+                       $join_conds
+               );
        }
 
        /**
@@ -261,16 +279,39 @@ class SpecialWatchlist extends ChangesListSpecialPage {
        }
 
        /**
-        * Send output to the OutputPage object, only called if not used feeds
+        * Output feed links.
+        */
+       public function outputFeedLinks() {
+               $user = $this->getUser();
+               $wlToken = $user->getTokenFromOption( 'watchlisttoken' );
+               if ( $wlToken ) {
+                       $this->addFeedLinks( array(
+                               'action' => 'feedwatchlist',
+                               'allrev' => 1,
+                               'wlowner' => $user->getName(),
+                               'wltoken' => $wlToken,
+                       ) );
+               }
+       }
+
+       /**
+        * Build and output the actual changes list.
         *
         * @param ResultWrapper $rows Database rows
         * @param FormOptions $opts
         */
-       public function webOutput( $rows, $opts ) {
+       public function outputChangesList( $rows, $opts ) {
                global $wgShowUpdatedMarker, $wgRCShowWatchingUsers;
 
                $dbr = $this->getDB();
                $user = $this->getUser();
+               $output = $this->getOutput();
+
+               # Show a message about slave lag, if applicable
+               $lag = wfGetLB()->safeGetLag( $dbr );
+               if ( $lag > 0 ) {
+                       $output->showLagWarning( $lag );
+               }
 
                $dbr->dataSeek( $rows, 0 );
 
@@ -309,35 +350,6 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                }
                $s .= $list->endRecentChangesList();
 
-               // Print things out
-
-               $output = $this->getOutput();
-
-               $output->addSubtitle(
-                       $this->msg( 'watchlistfor2', $user->getName() )
-                               ->rawParams( SpecialEditWatchlist::buildTools( null ) )
-               );
-
-               // Output options box
-               $this->doHeader( $opts );
-
-               // Add feed links
-               $wlToken = $user->getTokenFromOption( 'watchlisttoken' );
-               if ( $wlToken ) {
-                       $this->addFeedLinks( array(
-                               'action' => 'feedwatchlist',
-                               'allrev' => 1,
-                               'wlowner' => $user->getName(),
-                               'wltoken' => $wlToken,
-                       ) );
-               }
-
-               # Show a message about slave lag, if applicable
-               $lag = wfGetLB()->safeGetLag( $dbr );
-               if ( $lag > 0 ) {
-                       $output->showLagWarning( $lag );
-               }
-
                if ( $rows->numRows() == 0 ) {
                        $output->wrapWikiMsg(
                                "<div class='mw-changeslist-empty'>\n$1\n</div>", 'recentchanges-noresult'
@@ -356,6 +368,11 @@ class SpecialWatchlist extends ChangesListSpecialPage {
        public function doHeader( $opts ) {
                $user = $this->getUser();
 
+               $this->getOutput()->addSubtitle(
+                       $this->msg( 'watchlistfor2', $user->getName() )
+                               ->rawParams( SpecialEditWatchlist::buildTools( null ) )
+               );
+
                $this->setTopText( $opts );
 
                $lang = $this->getLanguage();
index 3f9b98d..789ea76 100644 (file)
@@ -152,10 +152,6 @@ class SpecialWhatLinksHere extends SpecialPage {
                // Read an extra row as an at-end check
                $queryLimit = $limit + 1;
 
-               // Enforce join order, sometimes namespace selector may
-               // trigger filesorts which are far less efficient than scanning many entries
-               $options[] = 'STRAIGHT_JOIN';
-
                $options['LIMIT'] = $queryLimit;
                $fields = array( 'page_id', 'page_namespace', 'page_title', 'rd_from' );
 
index 12210d0..0cb83d5 100644 (file)
@@ -254,7 +254,7 @@ class UsercreateTemplate extends BaseTemplate {
                                        $this->getMsg( $this->data['loggedin'] ? 'createacct-another-submit' : 'createacct-submit' ),
                                        'submit',
                                        array(
-                                               'class' => "mw-ui-button mw-ui-big mw-ui-block mw-ui-primary",
+                                               'class' => "mw-ui-button mw-ui-big mw-ui-block mw-ui-constructive",
                                                'id' => 'wpCreateaccount',
                                                'tabindex' => $tabIndex++
                                        )
index 38e071c..8ed15c0 100644 (file)
@@ -149,7 +149,7 @@ class UserloginTemplate extends BaseTemplate {
                                echo Html::input( 'wpLoginAttempt', $this->getMsg( 'login' )->text(), 'submit', array(
                                        'id' => 'wpLoginAttempt',
                                        'tabindex' => '6',
-                                       'class' => 'mw-ui-button mw-ui-big mw-ui-block mw-ui-primary'
+                                       'class' => 'mw-ui-button mw-ui-big mw-ui-block mw-ui-constructive'
                                ) );
                                ?>
                        </div>
@@ -160,11 +160,11 @@ class UserloginTemplate extends BaseTemplate {
                        <?php if ( $this->haveData( 'createOrLoginHref' ) ) { ?>
                                <?php if ( $this->data['loggedin'] ) { ?>
                                        <div id="mw-createaccount-another">
-                                               <h3 id="mw-userloginlink"><a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7"  class="mw-ui-button"><?php $this->msg( 'userlogin-createanother' ); ?></a></h3>
+                                               <a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7"  class="mw-ui-button"><?php $this->msg( 'userlogin-createanother' ); ?></a>
                                        </div>
                                <?php } else { ?>
                                        <div id="mw-createaccount-cta">
-                                               <h3 id="mw-userloginlink"><?php $this->msg( 'userlogin-noaccount' ); ?><a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7"  class="mw-ui-button mw-ui-constructive"><?php $this->msg( 'userlogin-joinproject' ); ?></a></h3>
+                                               <?php $this->msg( 'userlogin-noaccount' ); ?><a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7"  class="mw-ui-button mw-ui-progressive"><?php $this->msg( 'userlogin-joinproject' ); ?></a>
                                        </div>
                                <?php } ?>
                        <?php } ?>
index b572499..bdcc9a1 100644 (file)
@@ -139,7 +139,7 @@ class UploadFromChunks extends UploadFromFile {
                if ( !$status->isOk() ) {
                        return $status;
                }
-               wfDebugLog( 'fileconcatenate', "Combined $i chunks in $tAmount seconds.\n" );
+               wfDebugLog( 'fileconcatenate', "Combined $i chunks in $tAmount seconds." );
 
                // File system path
                $this->mTempPath = $tmpPath;
@@ -158,7 +158,7 @@ class UploadFromChunks extends UploadFromFile {
                $this->mLocalFile = parent::stashFile( $this->user );
                $tAmount = microtime( true ) - $tStart;
                $this->mLocalFile->setLocalReference( $tmpFile ); // reuse (e.g. for getImageInfo())
-               wfDebugLog( 'fileconcatenate', "Stashed combined file ($i chunks) in $tAmount seconds.\n" );
+               wfDebugLog( 'fileconcatenate', "Stashed combined file ($i chunks) in $tAmount seconds." );
 
                return $status;
        }
index ecebd07..f50eb49 100644 (file)
@@ -260,7 +260,7 @@ class UploadStash {
                        'us_key' => $key,
                        'us_orig_path' => $path,
                        'us_path' => $stashPath, // virtual URL
-                       'us_props' => serialize( $fileProps ),
+                       'us_props' => $dbw->encodeBlob( serialize( $fileProps ) ),
                        'us_size' => $fileProps['size'],
                        'us_sha1' => $fileProps['sha1'],
                        'us_mime' => $fileProps['mime'],
index 802cdbc..037663c 100644 (file)
@@ -22,6 +22,8 @@
 
 /**
  * A collection of static methods to play with arrays.
+ *
+ * @since 1.21
  */
 class ArrayUtils {
        /**
@@ -94,13 +96,15 @@ class ArrayUtils {
         * Do a binary search, and return the index of the largest item that sorts
         * less than or equal to the target value.
         *
+        * @since 1.23
+        *
         * @param array $valueCallback A function to call to get the value with
         *     a given array index.
-        * @param $valueCount int The number of items accessible via $valueCallback,
+        * @param int $valueCount The number of items accessible via $valueCallback,
         *     indexed from 0 to $valueCount - 1
-        * @param $comparisonCallback array A callback to compare two values, returning
+        * @param array $comparisonCallback A callback to compare two values, returning
         *     -1, 0 or 1 in the style of strcmp().
-        * @param $target string The target value to find.
+        * @param string $target The target value to find.
         *
         * @return int|bool The item index of the lower bound, or false if the target value
         *     sorts before all items.
@@ -142,9 +146,11 @@ class ArrayUtils {
         *
         * Note: empty arrays are removed.
         *
-        * @param $array1 array The array to compare from
-        * @param $array2 array An array to compare against
-        * @param ... array More arrays to compare against
+        * @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
         * @return array An array containing all the values from array1
         *               that are not present in any of the other arrays.
         */
index 0338da0..a79079b 100644 (file)
@@ -165,7 +165,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Bôh garéh yup peunawôt:',
-'tog-justify' => 'Peurata paragraf',
 'tog-hideminor' => 'Peusom neuandam bacut bak neuubah barô',
 'tog-hidepatrolled' => 'Peusom neuandam teurunda bak neuubah barô',
 'tog-newpageshidepatrolled' => 'Peusom laman teurunda nibak dapeuta ôn barô',
@@ -174,9 +173,7 @@ $messages = array(
 'tog-numberheadings' => 'Bôh numbôi nan keudroë',
 'tog-showtoolbar' => 'Peuleumah bateuëng alat andam',
 'tog-editondblclick' => 'Andam laman ngön duwa gö teugön',
-'tog-editsection' => 'Peujeuet andam bideuëng röt hubông [andam]',
 'tog-editsectiononrightclick' => 'Peujeuët andam bideueng ngön teugön blah uneun bak nan bideueng',
-'tog-showtoc' => 'Peuleumah dapeuta asoe (keu laman-laman nyang na leubèh nibak 3 boh aneuk ulèë)',
 'tog-rememberpassword' => 'Ingat lôn tamöng bak peuramban nyoë (keu paléng trép $1 {{PLURAL:$1|uroë}})',
 'tog-watchcreations' => 'Tamah laman nyang lôn peugöt u dapeuta keunalön',
 'tog-watchdefault' => 'Tamah laman nyang lôn-andam u dapeuta keunalon',
@@ -898,7 +895,6 @@ Dalèh $3 nyoe nakeuh ''$2''",
 'compareselectedversions' => 'Peubandéng curak teupiléh',
 'editundo' => 'pubateuë',
 'diff-empty' => '(Hana bida)',
-'diff-multi' => '({{PLURAL:$1|Saboh|$1}} geunantoë antara nyang geupeugot le {{PLURAL:$2|sidroe|$2}} ureueng nguy hana geupeuleumah)',
 
 # Search results
 'searchresults' => 'Hasé mita',
@@ -965,7 +961,6 @@ Dalèh $3 nyoe nakeuh ''$2''",
 'prefs-editing' => 'Neuandam',
 'rows' => 'Baréh:',
 'searchresultshead' => 'Mita',
-'resultsperpage' => 'Hasé lam saboh laman:',
 'stub-threshold-disabled' => 'Geupeumaté',
 'timezoneuseoffset' => "La'én (peuteuntèe bidajih)",
 'timezoneregion-america' => 'Amirika',
index d80a2bd..5f75e99 100644 (file)
@@ -19,7 +19,6 @@ $rtl = true;
 $messages = array(
 # User preference toggles
 'tog-underline' => 'ضع خطا تحت الوصلات:',
-'tog-justify' => 'ساو الفقرات',
 'tog-hideminor' => 'أخف التعديلات الطفيفة في أحدث التغييرات',
 'tog-hidepatrolled' => 'أخف التعديلات المراجعة في أحدث التغييرات',
 'tog-newpageshidepatrolled' => 'أخف الصفحات المراجعة من قائمة الصفحات الجديدة',
@@ -29,7 +28,6 @@ $messages = array(
 'tog-showtoolbar' => 'أظهر شريط التحرير (يتطلب جافاسكربت)',
 'tog-editondblclick' => 'عدل الصفحات عند الضغط المزدوج (جافاسكربت)',
 'tog-editsectiononrightclick' => 'فعل تعديل الأقسام بواسطة كبسة الفأرة اليمين على عناوين الأقسام (جافاسكريبت)',
-'tog-showtoc' => 'اعرض فهرس المحتويات (للصفحات التي تحتوي على أكثر من 3 عناوين)',
 'tog-rememberpassword' => 'تذكر دخولي على هذا المتصفح (إلى {{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يومًا|$1 يوم}} كحد أقصى)',
 'tog-watchcreations' => 'أضف الصفحات التي أنشئها والملفات التي أرفعها إلى قائمة مراقبتي.',
 'tog-watchdefault' => 'أضف الصفحات والملفات التي أعدلها إلى قائمة مراقبتي',
@@ -963,7 +961,6 @@ $1",
 'compareselectedversions' => 'قارن بين النسختين المختارتين',
 'showhideselectedversions' => 'أظهر/أخف المراجعات المختارة',
 'editundo' => 'Rajjaε',
-'diff-multi' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتين أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} {{PLURAL:$2||مستخدم واحد|مستخدمان|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
 'diff-multi-manyusers' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتان أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} أكثر من {{PLURAL:$2||مستخدم واحد|مستخدمين|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
 
 # Search results
index 2fc7320..224121e 100644 (file)
@@ -210,7 +210,6 @@ $linkTrail = "/^([a-z]+)(.*)$/sD";
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Onderstreep skakels.',
-'tog-justify' => 'Justeer paragrawe.',
 'tog-hideminor' => 'Moenie klein wysigings in die onlangse wysigingslys wys nie.',
 'tog-hidepatrolled' => 'Versteek gepatrolleerde wysigings in onlangse wysigingslys',
 'tog-newpageshidepatrolled' => 'Versteek gepatrolleerde wysigings van nuwe bladsy lys',
@@ -1242,7 +1241,6 @@ Let op dat die gebruik van navigasieskakels hierdie kolom se waardes sal herstel
 'showhideselectedversions' => 'Wys/versteek gekose weergawes',
 'editundo' => 'maak ongedaan',
 'diff-empty' => '(Geen verskil)',
-'diff-multi' => '({{PLURAL:$1|Een tussenin wysiging|$1 tussenin wysigings}} deur {{PLURAL:$2|een gebruiker|$2 gebruikers}} word nie gewys nie)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Een tussenin wysiging|$1 tussenin wysigings}} deur meer as $2 {{PLURAL:$2|gebruiker|gebruikers}} nie gewys nie)',
 'difference-missing-revision' => "{{PLURAL:$2|'n Weergawe|$2 weergawes}} van die verskil ($1) {{PLURAL:$2|is|is}} nie gevind nie.
 
@@ -1263,7 +1261,7 @@ Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} s
 'shown-title' => '$1 {{PLURAL:$1|resultaat|resultate}} per bladsy',
 'viewprevnext' => 'Wys ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Daar is reeds 'n bladsy genaamd \"[[:\$1]]\" op die wiki'''",
-'searchmenu-new' => "'''Skep die bladsy \"[[:\$1]]\" op hierdie wiki'''",
+'searchmenu-new' => '<strong>Skep die bladsy "[[:$1]]" op hierdie wiki</strong> {{PLURAL:$2|0=|Sien ook die bladsy wat in u soektog gevind is.|Sien ook die soekresultate wat gevind is.}}',
 'searchprofile-articles' => 'Inhoudelike bladsye',
 'searchprofile-project' => 'Hulp- en projekbladsye',
 'searchprofile-images' => 'Multimedia',
@@ -1999,8 +1997,10 @@ Miskien wil u eerder die beskrywing daar op die [$2 lêerbeskrywing] bywerk.',
 'randompage-nopages' => 'Daar is geen bladsye in die volgende {{PLURAL:$2|naamruimte|naamruimtes}} nie: $1.',
 
 # Random page in category
+'randomincategory' => 'Lukrake bladsy in die kategorie',
 'randomincategory-invalidcategory' => '"$1" is nie \'n geldige kategorienaam nie.',
 'randomincategory-nopages' => 'Daar is geen bladsye in kategorie [[:Category:$1|$1]].',
+'randomincategory-selectcategory' => "Kry 'n lukrake bladsy uit hierdie kategorie: $1 $2.",
 'randomincategory-selectcategory-submit' => 'Gaan',
 
 # Random redirect
@@ -2285,7 +2285,6 @@ Toekomstige wysigings aan hierdie bladsy en sy bybehorende besprekingsblad sal h
 'watchmethod-list' => 'kontroleer bladsye op dophoulys vir wysigings',
 'watchlistcontains' => 'Jou dophoulys bevat $1 {{PLURAL:$1|bladsy|bladsye}}.',
 'iteminvalidname' => "Probleem met item '$1', ongeldige naam...",
-'wlnote' => "Hier volg die laaste {{PLURAL:$1|verandering|'''$1''' veranderings}} binne die laaste {{PLURAL:$2|uur|'''$2''' ure}}, soos vanaf $3 om $4.",
 'wlshowlast' => 'Wys afgelope $1 ure, $2 dae of $3',
 'watchlist-options' => 'Opsies vir dophoulys',
 
@@ -2845,6 +2844,7 @@ Gaan na [https://www.mediawiki.org/wiki/Localisation MediaWiki-lokalisasie] en [
 'allmessages-prefix' => 'Filter op voorvoegsel:',
 'allmessages-language' => 'Taal:',
 'allmessages-filter-submit' => 'Laat waai',
+'allmessages-filter-translate' => 'Vertaal',
 
 # Thumbnails
 'thumbnail-more' => 'Vergroot',
@@ -2941,7 +2941,6 @@ Die lêer is slegs gedeeltelik opgelaai.',
 'tooltip-pt-watchlist' => 'Die lys bladsye wat u vir veranderinge dophou',
 'tooltip-pt-mycontris' => 'Lys van my bydraes',
 'tooltip-pt-login' => 'U word aangemoedig om aan te meld. Dit is egter nie verpligtend nie.',
-'tooltip-pt-anonlogin' => 'U word aangemoedig om aan te meld. Dit is egter nie verpligtend nie',
 'tooltip-pt-logout' => 'Teken uit',
 'tooltip-ca-talk' => 'Bespreking oor die inhoudbladsy',
 'tooltip-ca-edit' => 'U kan hierdie bladsy wysig. Gebruik asseblief die voorskoufunksie vóór u dit stoor.',
@@ -3779,7 +3778,15 @@ U kan ook die [[Special:EditWatchlist|standaard opdaterigskerm gebruik]].',
 'version-hook-name' => 'Hoek naam',
 'version-hook-subscribedby' => 'Gebruik deur',
 'version-version' => '(Weergawe $1)',
-'version-license' => 'Lisensie',
+'version-license' => 'MediaWiki se lisensie',
+'version-ext-license' => 'Lisensie',
+'version-ext-colheader-name' => 'Uitbreiding',
+'version-ext-colheader-version' => 'Weergawe',
+'version-ext-colheader-license' => 'Lisensie',
+'version-ext-colheader-description' => 'Beskrywing',
+'version-ext-colheader-credits' => 'Outeurs',
+'version-license-title' => 'Lisensie vir $1',
+'version-credits-title' => 'Krediete vir $1',
 'version-poweredby-credits' => "Hierdie wiki word aangedryf deur '''[https://www.mediawiki.org/ MediaWiki]''', kopiereg © 2001-$1 $2.",
 'version-poweredby-others' => 'andere',
 'version-poweredby-translators' => 'translatewiki.net-vertalers',
@@ -3804,6 +3811,7 @@ Saam met die program moes u \'n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van van
 'redirect-lookup' => 'Soek volgens:',
 'redirect-value' => 'Waarde:',
 'redirect-user' => 'Gebruiker-ID',
+'redirect-page' => 'Bladsy-ID',
 'redirect-revision' => 'Bladsy-weergawe',
 'redirect-file' => 'Lêernaam',
 'redirect-not-exists' => 'Waarde nie gevind nie',
index 9974749..df60817 100644 (file)
@@ -69,7 +69,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Nënvizoji vegzat',
-'tog-justify' => 'Drejto kryerreshtat',
 'tog-hideminor' => 'Mshef redaktimet e vogla të bâme së voni',
 'tog-hidepatrolled' => 'Mshef redaktimet e mbikëqyruna në ndryshimet e fundit',
 'tog-newpageshidepatrolled' => 'Mshef redaktimet e mbikëqyruna prej listës së faqeve të reja',
@@ -78,9 +77,7 @@ $messages = array(
 'tog-numberheadings' => 'Numëro automatikisht mbititujt',
 'tog-showtoolbar' => 'Trego butonat për redaktim (JavaScript)',
 'tog-editondblclick' => 'Redakto faqet me klikim të dyfishtë (JavaScript)',
-'tog-editsection' => 'Lejo redaktimin e seksioneve me opcionin [redakto]',
 'tog-editsectiononrightclick' => 'Lejo redaktimin e seksioneve tue klikue me të djathtë mbi titull (JavaScript)',
-'tog-showtoc' => 'Trego përmbajtjen<br />(për faqet me mâ shum se 3 tituj)',
 'tog-rememberpassword' => 'Ruej fjalëkalimin tem në këtë shfletues (për $1 {{PLURAL:$1|ditë|ditë}})',
 'tog-watchcreations' => 'Shtoji në listë mbikëqyrëse faqet që i krijoj vetë',
 'tog-watchdefault' => 'Shtoji në listë mbikëqyrëse faqet që i redaktoj',
@@ -858,7 +855,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
 'lineno' => 'Rreshti $1:',
 'compareselectedversions' => 'Krahasoni versionet e zgjedhme',
 'editundo' => 'ktheje',
-'diff-multi' => '({{PLURAL:$1|Një redaktim ndërmjet nuk është|$1 redaktime ndërmjet nuk janë}} treguar.)',
 
 # Search results
 'searchresults' => 'Rezultatet e kërkimit',
@@ -939,7 +935,6 @@ Vini re se indeksat e tyne të përmbajtjes së {{SITENAME}} munden me qenë të
 'rows' => 'Rreshta:',
 'columns' => 'Kolona:',
 'searchresultshead' => 'Kërkimi',
-'resultsperpage' => 'Gjetje për faqe:',
 'stub-threshold' => 'Pragu për formatimin e <a href="#" class="stub">vegzave të cungueme</a> në (byte):',
 'recentchangesdays' => 'Numri i ditëve për me i tregue te ndryshimet e freskëta:',
 'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|ditë|ditë}})',
index f6fdbc9..d6eb658 100644 (file)
@@ -49,7 +49,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'በመያያዣ ስር አስምር',
-'tog-justify' => 'አንቀጾችን አስተካክል',
 'tog-hideminor' => 'በቅርብ ጊዜ የተደረጉ አነስተኛ እርማቶችን ደብቅ',
 'tog-hidepatrolled' => 'ተደጋጋሚ እርማቶችን ከቅርብ ጌዜ እርማቶች ዝርዝር ውስጥ ደብቅ',
 'tog-newpageshidepatrolled' => 'በተደጋጋሚ የታዩ ገፆችን ከአዲስ ገፆች ዝርዝር ውስጥ ደብቅ።',
@@ -58,9 +57,7 @@ $messages = array(
 'tog-numberheadings' => 'አርዕስቶችን በራስገዝ ቁጥር ስጥ',
 'tog-showtoolbar' => '«አርም» ትዕዛዝ-መስጫ ይታይ (JavaScript)',
 'tog-editondblclick' => 'ሁለቴ መጫን ገጹን ማረም ያስችል (JavaScript ያስፈልጋል)',
-'tog-editsection' => 'በ[አርም] መያያዣ ክፍል ማረምን አስችል',
 'tog-editsectiononrightclick' => 'የክፍል አርዕስት ላይ በቀኝ በመጫን ክፍል ማረምን አስችል (JavaScript)',
-'tog-showtoc' => 'ከ3 አርዕስቶች በላይ ሲሆን የማውጫ ሰንጠረዥ ይታይ',
 'tog-rememberpassword' => 'ለሚቀጥለው ጊዜ በዚህ ኮምፒውተር ላይ በአባልነት ስሜ መግባቴን (ቢበዛ ለ$1 {{PLURAL:$1|ቀን|ቀናት}}) አስታውስ።',
 'tog-watchcreations' => 'እኔ የምፈጥራቸውን ገጾችና የምልካቸውን ፋይሎች ወደምከታተላቸው ገጾች ዝርዝር ውስጥ ጨምር',
 'tog-watchdefault' => 'ያረምኳቸውን ገጾች እና ፋይሎች ወደምከታተላቸው ገጾች ዝርዝር ውስጥ ጨምር',
@@ -790,7 +787,6 @@ $1ን ወይም ማንም ሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
 'lineno' => 'መስመር፡ $1፦',
 'compareselectedversions' => 'የተመረጡትን እትሞች ለማነፃፀር',
 'editundo' => 'ለውጡ ይገልበጥ',
-'diff-multi' => '(ከነዚህ 2 እትሞች መካከል በ{{PLURAL:$2|አንድ አባል |$2 አባላት}} {{PLURAL:$1|የተደረገ አንድ ለውጥ አይታይም|የተደረጉ $1 ለውጦች አይታዩም}}።)',
 
 # Search results
 'searchresults' => 'የፍለጋ ውጤቶች',
@@ -1514,7 +1510,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watchmethod-recent' => 'የቅርብ ለውጦችን ለሚከታተሉት ገጾች በመፈለግ',
 'watchmethod-list' => 'የሚከታተሉትን ገጾች ለቅርብ ለውጦች በመፈለግ',
 'watchlistcontains' => 'አሁን በሙሉ $1 ገጾች እየተከታተሉ ነው።',
-'wlnote' => 'ባለፉት <b>$2</b> ሰዓቶች የተደረጉት $1 መጨረሻ ለውጦች እታች ይገኛሉ።',
 'wlshowlast' => 'ያለፉት $1 ሰዓት፤ $2 ቀን፤ $3 ይታዩ።',
 'watchlist-options' => 'የዝርዝሩ ምርጫዎች',
 
@@ -1953,7 +1948,6 @@ Please visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation
 'tooltip-pt-watchlist' => 'እርስዎ ስለ ለውጦች የሚከታተሏቸው ገጾች',
 'tooltip-pt-mycontris' => 'የተሳተፍክባቸው/ሽባቸው ቦታዎች ዝርዝር',
 'tooltip-pt-login' => 'በብዕር ስም መግባትዎ ጠቃሚ ቢሆንም አስፈላጊነት አይደለም',
-'tooltip-pt-anonlogin' => 'በብዕር ስም መግባትዎ ጠቃሚ ቢሆንም አስፈላጊነት አይደለም',
 'tooltip-pt-logout' => 'ከብዕር ስምዎ ለመውጣት',
 'tooltip-ca-talk' => 'ስለ ገጹ ለመወያየት',
 'tooltip-ca-edit' => 'ይህን ገጽ ለማዘጋጀት ይችላሉ!',
index e2fd0d6..e26ae09 100644 (file)
@@ -131,7 +131,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Subrayar os vinclos:',
-'tog-justify' => 'Achustar parrafos',
 'tog-hideminor' => 'Amagar edicions menors en a pachina de "zaguers cambeos"',
 'tog-hidepatrolled' => 'Amagar as edicions patrullatas en os zaguers cambeos',
 'tog-newpageshidepatrolled' => "Amagar as pachinas patrulladas d'a lista de pachinas nuevas",
@@ -499,6 +498,7 @@ Puede continar navegando por {{SITENAME}} anonimament, u puede <span class='plai
 'yourname' => "Nombre d'usuario:",
 'yourpassword' => "Clau d'acceso:",
 'yourpasswordagain' => 'Torne a escribir a clau:',
+'createacct-yourpasswordagain' => 'Confirma a clau',
 'remembermypassword' => "Remerar o mío nombre d'usuario y a clau entre sesions en iste navegador (como muito por $1 {{PLURAL:$1|día|días}})",
 'yourdomainname' => 'Dominio:',
 'externaldberror' => "Bi habió una error d'autenticación externa d'a base de datos u bien no tiene premisos ta esviellar a suya cuenta externa.",
@@ -510,14 +510,19 @@ Puede continar navegando por {{SITENAME}} anonimament, u puede <span class='plai
 'logout' => "Salir d'a sesión",
 'userlogout' => 'Salir',
 'notloggedin' => 'No ha dentrato en o sistema',
+'userlogin-noaccount' => 'No tiene garra cuenta?',
 'nologin' => "No tiene garra cuenta? '''$1'''.",
 'nologinlink' => 'Creyar una nueva cuenta',
 'createaccount' => 'Creyar una nueva cuenta',
 'gotaccount' => "Tiene ya una cuenta? '''$1'''.",
 'gotaccountlink' => 'Identificar-se y encetar sesión',
 'userlogin-resetlink' => "Ha xublidau os suyos datos d'acceso?",
+'createacct-join' => 'Fica os tuyos datos debaixo.',
+'createacct-another-email-ph' => 'Establir una adreza de correu-e',
 'createaccountmail' => 'por correu electronico',
 'createaccountreason' => 'Razón:',
+'createacct-imgcaptcha-ph' => "Escribe o texto d'alto",
+'createacct-benefit-body3' => '{{PLURAL:$1|colaborador recient|colaboradors recients}}',
 'badretype' => 'As claus que ha escrito no son iguals.',
 'userexists' => "O nombre d'usuario que ha escrito ya ye en uso.
 Por favor, trigue-ne uno de diferent.",
@@ -540,7 +545,7 @@ Comprebe si ha escrito bien o nombre u [[Special:UserLogin/signup|creye una nuev
 'passwordtooshort' => 'As claus han de tener a lo menos {{PLURAL:$1|1 caracter|$1 caracters}}.',
 'password-name-match' => "A clau ha d'estar diferent d'o suyo nombre d'usuario.",
 'password-login-forbidden' => "No se permite d'emplegar iste nombre d'usuario y clau.",
-'mailmypassword' => 'Ninviar una nueva clau por correu electronico',
+'mailmypassword' => 'Tornar a fixar a clau',
 'passwordremindertitle' => 'Nueva clau temporal de {{SITENAME}}',
 'passwordremindertext' => 'Bell un (probablement vusté mesmo, dende l\'adreza IP $1) demandó una nueva clau d\'acceso ta la suya cuenta en {{SITENAME}} ($4). S\'ha creyato una nueva clau temporal ta l\'usuario "$2", que ye "$3".
 Si isto ye o que quereba, ha d\'encetar agora una sesión y trigar una nueva clau.
@@ -1002,7 +1007,6 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
 'compareselectedversions' => 'Confrontar as versions trigatas',
 'showhideselectedversions' => 'Amostrar/amagar as versions trigadas',
 'editundo' => 'desfer',
-'diff-multi' => "(No s'amuestra {{PLURAL:$1|una edición entremeya feita|$1 edicions entremeyas feitas}} por {{PLURAL:$2|un usuario|$2 usuarios}}).",
 'diff-multi-manyusers' => "(No s'amuestra {{PLURAL:$1|una edición entremeya|$1 edicions entremeyas}} feitas por más {{PLURAL:$2|d'un usuario|de $2 usuarios}})",
 
 # Search results
@@ -1019,7 +1023,7 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
 'shown-title' => 'Amostrar $1 {{PLURAL:$1|resultau|resultaus}} por pachina',
 'viewprevnext' => 'Veyer ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Bi ha una pachina clamada \"[[\$1]]\" en ista wiki'''",
-'searchmenu-new' => "'''Creyar a pachina \"[[:\$1]]\" en ista wiki!'''",
+'searchmenu-new' => '<strong>Creyar a pachina "[[:$1]]" en iste wiki!</strong> {{PLURAL:$2|0=|Mire-se tamién a pachina que s\'ha trobau.|Mire-se tamién os resultaus d\'a busca.}}',
 'searchprofile-articles' => 'Pachinas de conteniu',
 'searchprofile-project' => "Pachinas d'aduya y d'o prochecto",
 'searchprofile-images' => 'Multimedia',
@@ -1957,7 +1961,6 @@ L\'adreza de correu-e que endicó en as suyas [[Special:Preferences|preferencias
 'watchmethod-list' => 'mirando edicions recients en as pachinas cosiratas',
 'watchlistcontains' => 'A suya lista de seguimiento tiene $1 {{PLURAL:$1|pachina|pachinas}}.',
 'iteminvalidname' => "Bi ha un problema con l'articlo '$1', o nombre no ye conforme...",
-'wlnote' => "Contino se i {{PLURAL:$1|amuestra o solo cambeo|amuestran os zaguers '''$1''' cambeos}} feitos en {{PLURAL:$2|a zaguer hora|as zagueras '''$2''' horas}}, o $3 a las $4.",
 'wlshowlast' => 'Amostrar as zagueras $1 horas, $2 días u $3',
 'watchlist-options' => "Opcions d'a lista de seguimiento",
 
@@ -2072,7 +2075,7 @@ Se veiga a [[Special:ProtectedPages|lista de pachinas protechitas]] ta conoixer
 'protect_expiry_invalid' => 'O tiempo de circumducción ye incorrecto.',
 'protect_expiry_old' => 'O tiempo de circumducción ye una calendata ya pasata.',
 'protect-unchain-permissions' => 'Desbloqueyar opcions de protección abanzatas',
-'protect-text' => "Puetz veyer y cambiar o livel e protección d'a pachina '''$1'''.",
+'protect-text' => "Puetz veyer y cambiar o livel de protección d'a pachina '''$1'''.",
 'protect-locked-blocked' => "No puede cambiar os livels de protección mientres ye bloqueyato. Contino se i amuestran as opcions actuals d'a pachina '''$1''':",
 'protect-locked-dblock' => "Os livels de protección no se pueden cambiar por un bloqueyo activo d'a base de datos.
 Contino se i amuestran as opcions actuals d'a pachina '''$1''':",
@@ -2564,7 +2567,6 @@ Alce-lo en o suyo ordenador y cargue-lo aquí.",
 'tooltip-pt-watchlist' => 'A lista de pachinas que en ye cosirando os cambeos',
 'tooltip-pt-mycontris' => "Lista d'as suyas contrebucions",
 'tooltip-pt-login' => 'Le recomendamos que se rechistre, encara que no ye obligatorio',
-'tooltip-pt-anonlogin' => 'Li alentamos a rechistrar-se, anque no ye obligatorio',
 'tooltip-pt-logout' => 'Rematar a sesión',
 'tooltip-ca-talk' => "Descusión sobre l'articlo",
 'tooltip-ca-edit' => 'Puede editar ista pachina. Por favor, faiga servir o botón de visualización previa antes de grabar.',
@@ -2730,7 +2732,7 @@ En executar-lo, podría meter en un contornillo a seguridat d'o suyo sistema.",
 'file-info-size-pages' => "$1 × $2 pixels, grandaria d'o fichero: $3, tipo MIME: $4, $5 {{PLURAL:$5|pachina|pachinas}}",
 'file-nohires' => 'No bi ha garra versión con resolución más gran.',
 'svg-long-desc' => 'fichero SVG, nominalment $1 × $2 píxels, grandaria: $3',
-'show-big-image' => 'Imachen en a maxima resolución',
+'show-big-image' => 'Fichero orichinal',
 'show-big-image-preview' => "Grandaria d'ista previsualización: $1.",
 'show-big-image-other' => '{{PLURAL:$2|Unatra resolución|Atras resolucions}}: $1.',
 'show-big-image-size' => '$1 × $2 pixels',
index b25a417..6ba9cc1 100644 (file)
@@ -45,7 +45,6 @@ $namespaceAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Mearc under hlencan:',
-'tog-justify' => 'Macian cwidfloccas rihte',
 'tog-hideminor' => 'Hȳdan lytela adihtunga in nīwra andwendinga getæle',
 'tog-hidepatrolled' => 'Hȳdan weardoda adihtunga in nīwra andwendinga getæle',
 'tog-newpageshidepatrolled' => 'Hȳdan weardode trametas in nīwra andwendinga getæle',
@@ -54,9 +53,7 @@ $messages = array(
 'tog-numberheadings' => 'Settan rīm on fōrecwidas selflīce',
 'tog-showtoolbar' => 'Īwan þā adihtunge tōlmearce',
 'tog-editondblclick' => 'Adihtan trametas mid twifealdum mȳs swenge',
-'tog-editsection' => 'Þafian dǣla adihtunge mid [adihtan] hlencum',
 'tog-editsectiononrightclick' => 'Þafian dǣla adihtunge þurh swīðran healfe mȳs swengas on dǣla titulum',
-'tog-showtoc' => 'Īwan innunge tabulan (for trametum þe mā þonne 3 fōrecwidas habbaþ)',
 'tog-rememberpassword' => 'Gemynan mīne inmeldunge on þissum spearctellende (oþ $1 {{PLURAL:$1|dæg|dagas}} lengest)',
 'tog-watchcreations' => 'Ēacnian mīn behealdungtæl mid trametum þā ic scieppe and ymelum þā ic hlade on nett.',
 'tog-watchdefault' => 'Ēacnian mīn behealdungtæl mid trametum and ymelum þā ic adihte.',
@@ -210,7 +207,6 @@ $messages = array(
 'vector-action-protect' => 'Beorgan',
 'vector-action-undelete' => 'Scieppan tramet eft',
 'vector-action-unprotect' => 'Andwendan beorgunge',
-'vector-simplesearch-preference' => 'Ānfealdlīc sēcunge mearc (synderlīce on Vector scinne)',
 'vector-view-create' => 'Scieppan',
 'vector-view-edit' => 'Adihtan',
 'vector-view-history' => 'Stǣr',
@@ -283,7 +279,7 @@ $1',
 'pool-errorunknown' => 'Uncūþ wōh',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
-'aboutsite' => 'Gecȳþness ymbe {{SITENAME}}',
+'aboutsite' => 'Gecȳþness ymbe {{GRAMMAR:wrēgendlīc|{{SITENAME}}}}',
 'aboutpage' => 'Project:Gecȳþness',
 'copyright' => 'Man mæg innunge under $1 findan.',
 'copyrightpage' => '{{ns:project}}:Gelīcnessriht',
@@ -896,7 +892,6 @@ Gif se brūcend asifte hine. synderlīce sind ymelan geīwda þǣre þe se brūc
 'unwatchthispage' => 'Ablinnan behealdunge',
 'watchlist-details' => '{{PLURAL:$1|Þǣr is $1 tramet|Þǣr sind $1 trameta}} on þīnum behealdunggetæle, nā arīmedum mōtunga trametum.',
 'watchlistcontains' => 'Þīn behealdungtæl hæfþ $1 {{PLURAL:$1|tramet|trameta}}.',
-'wlnote' => "Niðer {{PLURAL:$1|is sēo nīwoste andwendung|sind þā nīwostan '''$1''' andwendunga}} in {{PLURAL:$2|þǣre latostan tīde|þǣm latostan '''$2''' tīda}}, fram: $3, $4.",
 'wlshowlast' => 'Īwan þā nīwostan $1 tīda $2 daga $3',
 'watchlist-options' => 'Behealdungtæles cyras',
 
index 0f36188..259e290 100644 (file)
@@ -489,7 +489,6 @@ $imageFiles = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'سطر تحت الوصلات:',
-'tog-justify' => 'تسوية عرض الفقرات',
 'tog-hideminor' => 'أخف التعديلات الطفيفة في أحدث التغييرات',
 'tog-hidepatrolled' => 'أخف التعديلات المراجعة في أحدث التغييرات',
 'tog-newpageshidepatrolled' => 'أخف الصفحات المعاينة من قائمة الصفحات الجديدة',
@@ -652,7 +651,6 @@ $messages = array(
 'vector-action-protect' => 'احم',
 'vector-action-undelete' => 'ألغ الحذف',
 'vector-action-unprotect' => 'غير الحماية',
-'vector-simplesearch-preference' => 'تفعيل شريط البحث المبسط (لمظهر فكتور فقط)',
 'vector-view-create' => 'أنشئ',
 'vector-view-edit' => 'عدل',
 'vector-view-history' => 'اعرض التاريخ',
@@ -688,7 +686,7 @@ $messages = array(
 'undelete_short' => 'استرجاع {{PLURAL:$1||تعديل واحد|تعديلين|$1 تعديلات|$1 تعديلاً|$1 تعديل}}',
 'viewdeleted_short' => 'استعرض {{PLURAL:$1||تعديل واحد|تعديلين|$1 تعديلات|$1 تعديلاً|$1 تعديل}}',
 'protect' => 'حماية',
-'protect_change' => 'غيّر',
+'protect_change' => 'غير',
 'protectthispage' => 'احم هذه الصفحة',
 'unprotect' => 'غير الحماية',
 'unprotectthispage' => 'غير حماية هذه الصفحة',
@@ -1056,6 +1054,7 @@ $2',
 'retypenew' => 'أعد كتابة كلمة السر الجديدة:',
 'resetpass_submit' => 'ضبط كلمة السر والدخول',
 'changepassword-success' => 'تم تغيير كلمة السر بنجاح!',
+'changepassword-throttled' => 'لديك محاولات تسجيل دخول كثيرة حديثة. من فضلك انتظر $1 قبل المحاولة ثانية.',
 'resetpass_forbidden' => 'كلمات السر لا يمكن تغييرها',
 'resetpass-no-info' => 'يجب أن تكون مسجل الدخول للوصول إلى هذه الصفحة مباشرة.',
 'resetpass-submit-loggedin' => 'تغيير كلمة السر',
@@ -1107,6 +1106,8 @@ $2
 'changeemail-password' => 'كلمة سر {{SITENAME}} الخاصة بك:',
 'changeemail-submit' => 'غيّر البريد الإلكتروني',
 'changeemail-cancel' => 'إلغاء',
+'changeemail-throttled' => 'أنت قمت بمحاولات تسجيل دخول كثيرة.
+من فضلك انتظر $1 قبل المحاولة ثانية.',
 
 # Special:ResetTokens
 'resettokens' => 'غير المفاتيح',
@@ -1331,8 +1332,8 @@ $2
 'content-failed-to-parse' => 'فشل في تحليل $2 محتوى لـ $1 نموذج: $3',
 'invalid-content-data' => 'بيانات المحتوى غير صالحة',
 'content-not-allowed-here' => '"$1" المحتوى غير مسموح على صفحة [[$2]]',
-'editwarning-warning' => 'Ù\82د ØªØªØ³Ø¨Ø¨ Ù\85غادرة Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة بخسارتك لأي تغييرات أجريتها.
-يمكنك تعطيل هذا التحذير إذا كنت والجًا في قسم "التحرير" في تفضيلاتك.',
+'editwarning-warning' => 'Ù\85غادرة Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة Ù\82د ØªØªØ³Ø¨Ø¨ بخسارتك لأي تغييرات أجريتها.
+إذا كنت مسجل الدخول، فيمكنك تعطيل هذا التحذير في قسم "{{int:prefs-editing}}" في تفضيلاتك.',
 'editpage-notsupportedcontentformat-title' => 'تنسيق المحتوى غير مدعوم',
 'editpage-notsupportedcontentformat-text' => 'تنسيق المحتوى $1 غير مدعوم بواسطة نموذج المحتوى $2.',
 
@@ -1369,6 +1370,7 @@ $2
 تحقق من المقارنة بالأسفل للتأكد من أن هذا هو ما تريد أن تفعله، ثم احفظ التغييرات بالأسفل للانتهاء من استرجاع التعديل.',
 'undo-failure' => 'لم يمكن استرجاع التعديل بسبب تعديلات متعارضة تمت على الصفحة.',
 'undo-norev' => 'فشل في الرجوع عن التعديل حيث أنه غير موجود أو تم حذفه.',
+'undo-nochange' => 'التعديل يبدو أنه قد تم الترجع عنه بالفعل.',
 'undo-summary' => 'الرجوع عن التعديل $1 بواسطة [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]])',
 'undo-summary-username-hidden' => 'الرجوع عن المراجعة $1 التي أجراها مستخدمي مخفي',
 
@@ -1377,9 +1379,9 @@ $2
 'cantcreateaccount-text' => "إنشاء الحسابات من عنوان الأيبي هذا ('''$1''') تم منعه بواسطة [[User:$3|$3]].
 
 السبب المعطى بواسطة $3 هو ''$2''",
-'cantcreateaccount-range-text' => "إنشاء الحسابات من عناوين الآيبي في النطاق '''$1'''، التي تحتوي على الآيبي الخاص بك ('''$4''')، قد حظرها [[مستخدم:$3|$3]].
+'cantcreateaccount-range-text' => "إنشاء الحسابات من عناوين الآيبي في النطاق '''$1'''، التي تحتوي على الآيبي الخاص بك ('''$4''')، قد منعها [[User:$3|$3]].
 
³Ø¨Ø¨ Ø§Ù\84حظر Ø§Ù\84Ø°Ù\8a Ù\82اÙ\84Ù\87 $3 هو ''$2''",
§Ù\84سبب Ø§Ù\84Ù\85عطÙ\89 Ø¨Ù\88اسطة $3 هو ''$2''",
 
 # History pages
 'viewpagelogs' => 'اعرض سجلات هذه الصفحة',
@@ -1552,7 +1554,8 @@ $1",
 'showhideselectedversions' => 'أظهر/أخف المراجعات المختارة',
 'editundo' => 'رجوع',
 'diff-empty' => '(لا فرق)',
-'diff-multi' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتين أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} {{PLURAL:$2||مستخدم واحد|مستخدمان|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
+'diff-multi-sameuser' => '({{PLURAL:$1|مراجعة متوسطة واحدة|$1 مراجعات متوسطة}} بواسطة نفس المستخدم غير معروضة)',
+'diff-multi-otherusers' => '({{PLURAL:$1|مراجعة متوسطة واحدة|$1 مراجعات متوسطة}} بواسطة {{PLURAL:$2|مستخدم واحد آخر|$2 مستخدما}} غير معروضة)',
 'diff-multi-manyusers' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتان أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} أكثر من {{PLURAL:$2||مستخدم واحد|مستخدمين|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
 'difference-missing-revision' => '{{PLURAL:$2|مراجعة واحدة|$2 مراجعات}} لهذا الفرق ($1) {{PLURAL:$2|لم|لم}} يتم إيجادها.
 
@@ -1573,7 +1576,7 @@ $1",
 'shown-title' => 'عرض $1 {{PLURAL:$1|نتيجة|نتيجة}} لكل صفحة',
 'viewprevnext' => 'عرض ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''توجد صفحة اسمها \"[[:\$1]]\" على هذه الويكي.''' {{PLURAL:\$2|0=|انظر ايضا نتائج البحث الأخرى.}}",
-'searchmenu-new' => "'''أنشئ الصفحة \"[[:\$1]]\" على هذه الويكي!''' {{PLURAL:\$2|0=|انظر أيضا الصفحة التي تم العثور عليها من بحثك.|انظر ايضا نتائج البحث.}}",
+'searchmenu-new' => '<strong>أنشئ الصفحة "[[:$1]]" على هذه الويكي!</strong>  {{PLURAL:$2|0=|انظر أيضا الصفحة التي تم العثور عليها من بحثك.|انظر ايضا نتائج البحث.}}',
 'searchprofile-articles' => 'صفحات المحتوى',
 'searchprofile-project' => 'صفحات المساعدة والمشروع',
 'searchprofile-images' => 'الوسائط المتعددة',
@@ -1599,6 +1602,7 @@ $1",
 'searchrelated' => 'مرتبطة',
 'searchall' => 'الكل',
 'showingresults' => "معروض بالأسفل {{PLURAL:$1|'''1''' نتيجة|'''$1''' نتيجة}} بدءا من رقم '''$2'''.",
+'showingresultsinrange' => 'معروض بالأسفل حتى {{PLURAL:$1|<strong>1</strong> نتيجة|<strong>$1</strong> نتائج}} في النطاق #<strong>$2</strong> إلى #<strong>$3</strong>.',
 'showingresultsnum' => "معروض بالأسفل {{PLURAL:$3|'''نتيجة واحدة'''|'''$3''' نتيجة}} بدءا من رقم'''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|النتيجة '''$1''' من'''$3'''|النتائج '''$1 - $2''' من'''$3'''}} ل'''$4'''",
 'search-nonefound' => 'لا توجد نتائج تطابق الاستعلام.',
@@ -1912,13 +1916,13 @@ $1",
 'recentchanges-feed-description' => 'تابع أحدث التغييرات للويكي عبر هذه التلقيمة.',
 'recentchanges-label-newpage' => 'أنشأ هذا التعديل صفحة جديدة',
 'recentchanges-label-minor' => 'هذا تعديل طفيف',
-'recentchanges-label-bot' => 'Ø£Ù\8fجÙ\92رÙ\90Ù\8aÙ\8e Ù\87ذا Ø§Ù\84تعدÙ\8aÙ\84 Ø¨Ù\88اسطة بوت',
+'recentchanges-label-bot' => 'تعدÙ\8aÙ\84 Ø£Ø¬Ø±Ø§Ù\87 بوت',
 'recentchanges-label-unpatrolled' => 'لم يراجع هذا التعديل إلى الآن',
 'recentchanges-label-plusminus' => 'حجم الصفحة تغير بهذا العدد من وحدات البايت',
 'recentchanges-legend-heading' => 'شرح',
 'recentchanges-legend-newpage' => '(راجع أيضا [[Special:NewPages|قائمة الصفحات الجديدة]])',
 'rcnotefrom' => "بالأسفل التغييرات منذ '''$2''' (إلى '''$1''' معروضة).",
-'rclistfrom' => 'أظهر التغييرات بدءا من $1',
+'rclistfrom' => 'أظهر التغييرات بدء من $1',
 'rcshowhideminor' => '$1 التعديلات الطفيفة',
 'rcshowhidebots' => '$1 البوتات',
 'rcshowhideliu' => '$1 {{GENDER:$1|مستخدمين مسجلين|مستخدمات مسجلات|مستخدمون مسجلون}}',
@@ -2482,7 +2486,7 @@ $1',
 'alphaindexline' => '$1 إلى $2',
 'nextpage' => 'الصفحة التالية ($1)',
 'prevpage' => 'الصفحة السابقة ($1)',
-'allpagesfrom' => 'اعرض Ø§Ù\84صÙ\81حات Ø¨Ø¯Ø¡Ø§Ù\8b من:',
+'allpagesfrom' => 'اعرض Ø§Ù\84صÙ\81حات Ø§Ø¨ØªØ¯Ø§Ø¡ من:',
 'allpagesto' => 'اعرض الصفحات المنتهية عند:',
 'allarticles' => 'كل الصفحات',
 'allinnamespace' => 'كل الصفحات (في نطاق $1)',
@@ -2503,7 +2507,7 @@ $1',
 'categoriespagetext' => '{{PLURAL:$1|التصنيف التالي يحتوي|التصنيفات التالية تحتوي}} على صفحات أو وسائط.
 [[Special:UnusedCategories|التصنيفات غير المستخدمة]] غير معروضة هنا.
 انظر أيضاً [[Special:WantedCategories|التصنيفات المطلوبة]].',
-'categoriesfrom' => 'أظÙ\87ر Ø§Ù\84تصÙ\86Ù\8aÙ\81ات Ø¨Ø¯Ø¡Ø§Ù\8b من:',
+'categoriesfrom' => 'اعرض Ø§Ù\84تصÙ\86Ù\8aÙ\81ات Ø§Ø¨ØªØ¯Ø§Ø¡ من:',
 'special-categories-sort-count' => 'رتب بالعدد',
 'special-categories-sort-abc' => 'رتب هجائياً',
 
@@ -2533,7 +2537,7 @@ $1',
 'activeusers' => 'قائمة المستخدمين النشطين',
 'activeusers-intro' => 'هذه قائمة بالمستخدمين الذين مارسوا نوعاً من النشاط خلال {{PLURAL:$1||اليوم الماضي|اليومين الماضيين|ال$1 أيام الماضية|ال$1 يوماً ماضياً|ال$1 يوم ماضي}}.',
 'activeusers-count' => '{{PLURAL:$1|لا أفعال|فعل واحد|فعلان اثنان|$1 أفعال|$1 فعلاً|$1 فعل}} منذ {{PLURAL:$3||يوم|يومين|$3 أيام|$3 يوماً|$1 يوم}}',
-'activeusers-from' => 'اعرض Ø§Ù\84Ù\85ستخدÙ\85Ù\8aÙ\86 Ø¨Ø¯Ø¡Ø§Ù\8b من:',
+'activeusers-from' => 'اعرض Ø§Ù\84Ù\85ستخدÙ\85Ù\8aÙ\86 Ø§Ø¨ØªØ¯Ø§Ø¡ من:',
 'activeusers-hidebots' => 'أخف البوتات',
 'activeusers-hidesysops' => 'أخف الإداريين',
 'activeusers-noresult' => 'لم يعثر على أي مستخدمين',
@@ -2621,6 +2625,7 @@ $1',
 'watchmethod-list' => 'فحص الصفحات المراقبة للتعديلات الحديثة',
 'watchlistcontains' => 'تحتوي قائمة مراقبتك على {{PLURAL:$1|لا صفحات|صفحة واحدة|صفحتان|$1 صفحات|$1 صفحة}}.',
 'iteminvalidname' => "مشكلة في المدخل '$1'، اسم غير صحيح...",
+'wlnote2' => 'فيما يلي تعرض التعديلات التي أجريت في آخر {{PLURAL:$1|ساعة|ساعتين|<strong>$1</strong> ساعات|<strong>$1</strong> ساعة}}، وذلك اعتبارا من $2، $3.',
 'wlshowlast' => 'عرض آخر $1 ساعات $2 أيام $3',
 'watchlist-options' => 'خيارات قائمة المراقبة',
 
@@ -2992,8 +2997,8 @@ $1',
 'change-blocklink' => 'تغيير المنع',
 'contribslink' => 'مساهمات',
 'emaillink' => 'أرسل بريدا إلكترونيا',
-'autoblocker' => 'تم منعك تلقائياً لأن الأيبي الخاص بك تم استخدامه مؤخراً بواسطة «[[User:$1|$1]]».
-السبب المعطى لمنع $1 هو: «$2»',
+'autoblocker' => 'تم منعك تلقائيا لأن الأيبي الخاص بك تم استخدامه مؤخرا بواسطة "[[User:$1|$1]]".
+السبب المعطى لمنع $1 هو: "$2"',
 'blocklogpage' => 'سجل المنع',
 'blocklog-showlog' => 'سبق منع هذا المستخدم.
 سجل المنع معروض بالأسفل كمرجع:',
@@ -3190,6 +3195,7 @@ $1',
 'allmessages-prefix' => 'رشح حسب البادئة:',
 'allmessages-language' => 'اللغة:',
 'allmessages-filter-submit' => 'اذهب',
+'allmessages-filter-translate' => 'ترجم',
 
 # Thumbnails
 'thumbnail-more' => 'كبّر',
@@ -3243,7 +3249,7 @@ $2',
 هناك مجلد مؤقت مفقود.',
 'import-parse-failure' => 'فشل تحليل استيراد XML',
 'import-noarticle' => 'لا صفحة للاستيراد!',
-'import-nonewrevisions' => 'Ù\83Ù\84 Ø§Ù\84Ù\85راجعات ØªÙ\85 Ø§Ø³ØªÙ\8aرادÙ\87ا Ù\85Ù\86 Ù\82بÙ\84.',
+'import-nonewrevisions' => 'Ù\84ا Ù\85راجعات ØªÙ\85 Ø§Ø³ØªÙ\8aرادÙ\87ا (Ù\83Ù\84 Ø§Ù\84Ù\85راجعات Ø¥Ù\85ا Ø£Ù\86Ù\87ا Ù\83اÙ\86ت Ù\85Ù\88جÙ\88دة Ø¨Ø§Ù\84Ù\81عÙ\84Ø\8c Ù\88Ø£Ù\88 ØªÙ\85 ØªØ¬Ø§Ù\88زÙ\87ا Ù\86تÙ\8aجة Ø£Ø®Ø·Ø§Ø¡).',
 'xml-error-string' => '$1 عند السطر $2، العمود $3 (بايت $4): $5',
 'import-upload' => 'رفع بيانات XML',
 'import-token-mismatch' => 'فقد لبيانات الجلسة. من فضلك حاول مرة أخرى.',
@@ -3254,6 +3260,7 @@ $2',
 '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|خيار|خيارات}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'إن عنوان الصفحة الجذر المعطاة هي ذات عنوان غير صالح.',
 'import-rootpage-nosubpage' => 'إن النطاق "$1" لصفحة الجذر لا يسمح بصفحات فرعية.',
@@ -4538,7 +4545,7 @@ $5
 'limitreport-ppvisitednodes' => 'زار المعالج عقدة إحصاء',
 'limitreport-ppgeneratednodes' => 'أحدث المعالج عقدة إحصاء',
 'limitreport-postexpandincludesize' => 'بعد توسيع المساحة الشاملة',
-'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|بايت|بايت}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|بايت}}',
 'limitreport-templateargumentsize' => 'حجم نقاش القالب',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|بايت}}',
 'limitreport-expansiondepth' => 'أكثر عمق توسعي',
index 9c1ad4f..3d2810c 100644 (file)
@@ -138,13 +138,11 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'ܪܫܘܡ ܣܪܛܐ ܬܚܝܬ ܐܣܪܐ:',
-'tog-justify' => 'ܫܘܐ ܦܬܓܡ̈ܐ',
 'tog-hideminor' => 'ܛܫܝ ܫܘܚܠܦ̈ܐ ܙܥܘܪ̈ܐ ܒܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ',
 'tog-hidepatrolled' => 'ܛܫܝ ܫܘܚܠܦ̈ܐ ܟܪ̈ܝܟܐ ܒܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ',
 'tog-newpageshidepatrolled' => 'ܛܫܝ ܦܐܬܬ̈ܐ ܟܪ̈ܝܟܬܐ ܡܢ ܡܟܬܒܘܬܐ ܕܦܐܬܐ ܚܕܬܐ',
 'tog-extendwatchlist' => 'ܐܪܘܚ ܪ̈ܗܝܬܐ ܠܚܘܘܝܐ ܕܟܠܗܘܢ ܫܘܚܠܦ̈ܐ، ܠܐ ܚܕ̈ܬܐ ܒܠܚܘܕ',
 'tog-editondblclick' => 'ܫܚܠܦ ܦܐܬܬ̈ܐ ܒܢܩܪܐ ܙܘܓܢܝܐ',
-'tog-editsection' => 'ܡܫܟܚ ܫܘܚܠܦܐ ܕܦܘܣܩ̈ܐ ܒܐܘܪܚܐ ܕܐܝܨܘܪ̈ܐ  [ܫܚܠܦ]',
 'tog-rememberpassword' => 'ܕܟܘܪ ܥܠܠܬܝ ܥܠ ܡܦܐܬܢܐ ܗܢܐ (ܠܡܬܚܐ ܥܠܝܐ ܕ $1 {{PLURAL:$1|ܝܘܡܐ|ܝܘܡܬ̈ܐ}})',
 'tog-watchcreations' => 'ܐܘܣܦ ܦܐܬܬ̈ܐ ܕܒܪܐ ܐܢܐ ܘܠܠܦ̈ܐ ܕܐܣܩ ܐܢܐ ܠܪ̈ܗܝܬܝ',
 'tog-watchdefault' => 'ܐܘܣܦ ܦܐܬܬ̈ܐ ܘܠܦܦ̈ܐ ܕܫܚܠܦ ܐܢܐ ܠܪ̈ܗܝܬܝ',
@@ -509,6 +507,7 @@ $1',
 'passwordreset-username' => 'ܫܡܐ ܕܡܦܠܚܢܐ:',
 'passwordreset-domain' => 'ܪܘܚܬܐ:',
 'passwordreset-email' => 'ܡܘܢܥܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ:',
+'passwordreset-emailsent' => 'ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܐܫܬܕܪ ܠܣܘܝܡ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢ ܐܚܪܝܢ',
 
 # Special:ChangeEmail
 'changeemail' => 'ܫܚܠܦ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
@@ -661,7 +660,6 @@ $1',
 'compareselectedversions' => 'ܦܚܘܡ ܒܝܢܝ  ܬܪܝܢ ܬܢܝܬ̈ܐ ܓܒܝܬ̈ܐ',
 'showhideselectedversions' => 'ܚܘܝ/ܛܫܝ ܬܢܝܬ̈ܐ ܓܒܝܬ̈ܐ',
 'editundo' => 'ܠܐ ܬܥܒܕ',
-'diff-multi' => '({{PLURAL:$1|ܚܕܐ ܬܢܝܬܐ ܡܨܥܝܬܐ|$1 ܬܢܝܬ̈ܐ ܡܨܥܝܬ̈ܐ}} ܒܝܕ {{PLURAL:$2|ܚܕ ܡܦܠܚܢܐ ܠܐ ܓܠܝܚܬܐ|$2 ܡܦܠܚܢ̈ܐ ܠܐ ܓܠܝܚܬ̈ܐ}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|ܚܕܐ ܬܢܝܬܐ ܡܨܥܝܬܐ ܠܐ ܓܠܝܚܬܐ|$1 ܬܢܝܬ̈ܐ ܡܨܥܝܬ̈ܐ ܠܐ ܓܠܝܚܬ̈ܐ}} ܒܝܕ ܝܬܝܪ ܡܢ $2 {{PLURAL:$2|ܚܕ ܡܦܠܚܢܐ|ܡܦܠܚܢ̈ܐ}})',
 
 # Search results
@@ -1236,7 +1234,6 @@ $1',
 'unwatchthispage' => 'ܟܠܝ ܪܗܝܐ',
 'watchlist-details' => '{{PLURAL:$1|$1 ܦܐܬܐ|$1 ܦܐܬܬ̈ܐ}} ܒܪ̈ܗܝܬܟ, ܫܒܘܩ ܡܢ ܦܐܬܬ̈ܐ ܕܡܡܠܠܐ.',
 'wlheader-showupdated' => "ܦܐܬܬ̈ܐ ܕܐܫܬܚܠܦܢ ܡܢ ܒܬܪ ܣܘܥܪܢܐ ܐܚܪܝܐ ܠܗܝܢ ܡܬܓܠܚܢ ܒܣܪܛܐ '''ܚܠܝܡܐ'''",
-'wlnote' => "ܠܬܚܬ {{PLURAL:$1|ܫܘܚܠܦܐ ܐܚܪܝܐ| '''$1''' ܫܘܚܠܦ̈ܐ ܐܚܪ̈ܝܐ}} {{PLURAL:$2|ܒܫܥܬܐ ܐܚܪܝܬܐ|'''$2''' ܒܫܥܬ̈ܐ ܐܚܪ̈ܝܬܐ}}, ܠܦܘܬ $3, $4.",
 'wlshowlast' => 'ܚܘܝ $1 ܫܥܬ̈ܐ $2 ܝܘܡܬ̈ܐ ܐܚܪ̈ܝܐ $3',
 'watchlist-options' => 'ܨܒܝܢܝܘܬ̈ܐ ܕܪ̈ܗܝܬܐ',
 
index 2451748..76efe63 100644 (file)
@@ -20,7 +20,6 @@ $fallback = 'es';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Miñcewirilpe lasun',
-'tog-justify' => 'Xvrvmpe cijkantvkun',
 'tog-showtoolbar' => 'Pengelün kümeelün ñi chemkün',
 'tog-editondblclick' => 'Wirin pakina epu klik mew',
 'tog-rememberpassword' => 'Amulen tañi nülküwküleael tüfa mew (alürumechi $1 {{PLURAL:$1 antü}})',
@@ -388,7 +387,6 @@ Rulpakünuy feychi kangelkülelu dungu.",
 'lineno' => 'Wif $1:',
 'compareselectedversions' => 'Trürümün dullinngelu malün',
 'editundo' => 'wüñoeltun',
-'diff-multi' => '(Pengelngelay {{PLURAL:$1 trürümün epu malün engu}} ta dewmafi {{PLURAL:$2|kiñe kellufe|$2 pu kellufe}})',
 
 # Search results
 'searchresults' => 'Tripalu chi kintun mew',
index 276c785..31a4121 100644 (file)
@@ -18,7 +18,6 @@
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Ṣetter l-lyanaṫ:',
-'tog-justify' => 'Jusṫifyé l-paragrafaṫ',
 'tog-hideminor' => 'Ĥebbi ṫ-ṫeĝdilaṫ l-leĥĥrin',
 'tog-hidepatrolled' => 'Ĥebbi ṫ-ṫeĝdilaṫ l-mraqbin fe ṫ-ṫeĝdilaṫ l-leĥĥrin',
 'tog-newpageshidepatrolled' => 'Ĥebbi ṣ-ṣefḫaṫ l-mraqbin men ṣ-ṣefḫaṫ j-jdad',
@@ -27,9 +26,7 @@ $messages = array(
 'tog-numberheadings' => 'Nemra otomaṫikiya dyal l-ĝanawin',
 'tog-showtoolbar' => 'Werri l-barra dyal ṫ-ṫeĝdilaṫ (kayḫṫaj JavaScript)',
 'tog-editondblclick' => 'Baċ ṫṣayeb ṣ-ṣefḫa ĥaṣek ṫbrek 2 merraṫ (kayḫṫaj JavaScript)',
-'tog-editsection' => 'Aktivé ṫ-ṫeĝdilaṫ dyal s-seksyon be l-lyanaṫ « [Ĝeddel] »',
 'tog-editsectiononrightclick' => 'Baċ ṫbeddel l-ĝonwan dyal ċi seksyon brek ĝlih be l-imniya (kayḫṫaj JavaScript)',
-'tog-showtoc' => 'biyn lfahras dyal lmohtawayat (bnisba lsafahat li ktr mn 3 dlaanawin)',
 'tog-rememberpassword' => 'Ĝqel ĝla smiyṫi fe had l-ordinaṫør (ġir limoddaṫ {{PLURAL:$1|yom waḫed|$1 iyyam}})',
 'tog-watchcreations' => 'zid sfahi li nchatha f qaaimat lmoraqaba',
 'tog-watchdefault' => 'zid sfahi li adltha f qaaimat lmoraqaba',
@@ -870,7 +867,6 @@ $1",
 'compareselectedversions' => 'Qaren lé-versyon li meĝzolin',
 'showhideselectedversions' => 'wrri/ĥbbi l-morajaĝṫ l-mĥṫaṛa',
 'editundo' => 'Rjeĝ',
-'diff-multi' => '({{PLURAL:$1|ṃoṛajaĝa waṣita wḫda|$1 dl-ṃoṛajaĝaṫ l-waṣita}} ṫaĝṫ {{PLURAL:$2|mosṫĥdim waḫf|$2 dl-mosṫĥdimin}} ma mbeyyna-ċ)',
 'diff-multi-manyusers' => '({{PLURAL:$1|ṃoṛajaĝa waṣita wḫda|$1 dl-ṃoṛajaĝaṫ l-waṣita}} ṫaĝṫ kṫr mn $2 {{PLURAL:$2|l-mosṫĥdim|dl-mosṫĥdimin}} ma mbeyyna-ċ)',
 
 # Search results
index 26a2788..c8fc7a4 100644 (file)
@@ -303,7 +303,6 @@ $digitTransformTable = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'حط خط تحت اللينكات:',
-'tog-justify' => 'ساوى الپاراجرافات',
 'tog-hideminor' => 'خبى التعديلات الصغيره من اجدد التغييرات',
 'tog-hidepatrolled' => 'خبى التعديلات المتراجعه من اخر التعديلات',
 'tog-newpageshidepatrolled' => 'خبى الصفح المتراجعه من ليستة الصفح الجديده',
@@ -1197,7 +1196,6 @@ $1",
 'compareselectedversions' => 'قارن بين النسختين المختارتين',
 'showhideselectedversions' => 'عرض/تخبية المراجعات المختاره.',
 'editundo' => 'استرجاع',
-'diff-multi' => '({{PLURAL:$1|نسخه واحده متوسطه|$1 نسخ متوسطه}} by {{PLURAL:$2|يوزر واحد |$2 يوزرات}}  مش معروضه)',
 'diff-multi-manyusers' => '({{PLURAL:$1|نسخه واحده متوسطه|$1 نسخ متوسطه}} by {{PLURAL:$2|يوزر واحد |$2 يوزرات}}  مش معروضه)',
 
 # Search results
index fd4dd72..2a609bb 100644 (file)
@@ -183,7 +183,6 @@ $digitGroupingPattern = "##,##,###";
 $messages = array(
 # User preference toggles
 'tog-underline' => 'সংযোগসমূহ অধোৰেখিত কৰক:',
-'tog-justify' => 'দফাৰ সীমা সমান কৰাক',
 'tog-hideminor' => 'সাম্প্ৰতিক সাল-সলনিত অগুৰুত্বপূৰ্ণ সম্পাদনা নেদেখুৱাব',
 'tog-hidepatrolled' => 'সাম্প্ৰতিক সাল-সলনিত তহলদাৰী সম্পাদনা নেদেখুৱাব',
 'tog-newpageshidepatrolled' => 'নতুন পৃষ্ঠা তালিকাত তহলদাৰী পৃষ্ঠাসমূহ নেদেখুৱাব',
@@ -202,7 +201,7 @@ $messages = array(
 'tog-previewontop' => 'সম্পাদনা বাকছৰ ওপৰত খচৰা দেখুৱাওক',
 'tog-previewonfirst' => 'প্ৰথম সম্পাদনাৰ পিছত খচৰা দেখুৱাওক',
 'tog-enotifwatchlistpages' => 'মোৰ লক্ষ্য-তালিকাত থকা পৃষ্ঠা সলনি হলে মোলৈ ই-মেইল পঠাব',
-'tog-enotifusertalkpages' => 'মোৰ বাৰ্তা পৃষ্ঠা সলনি হলে মোলৈ ই-মেইল পঠাব',
+'tog-enotifusertalkpages' => 'মà§\8bৰ à¦¬à¦¾à§°à§\8dতা à¦ªà§\83ষà§\8dঠা à¦¸à¦²à¦¨à¦¿ à¦¹à¦²à§\87 à¦®à§\8bলà§\88 à¦\87-মà§\87à¦\87ল à¦ªà¦ à¦¿à¦¯à¦¼à¦¾à¦¬',
 'tog-enotifminoredits' => "অগুৰুত্বপূৰ্ণ সম্পাদনা হ'লেও মোলৈ ই-মেইল পঠাব",
 'tog-enotifrevealaddr' => 'জাননী ই-মেইল বোৰত মোৰ ই-মেইল ঠিকনা দেখুৱাব',
 'tog-shownumberswatching' => 'লক্ষ্য কৰি থকা সদস্য সমূহৰ সংখ্যা দেখুৱাওক',
@@ -442,7 +441,7 @@ $1',
 
 'badaccess' => 'অনুমোদন ত্ৰুটি',
 'badaccess-group0' => 'আপুনি কৰিব বিচৰা কামতো কৰাৰ অধিকাৰ আপোনাৰ নাই।',
-'badaccess-groups' => 'à¦\86পà§\81নি à¦\85নà§\81ৰà§\8bধ à¦\95ৰা à¦\95াৰà§\8dয à¦\95à§\87ৱল {{PLURAL:$2|à¦\97à§\8bà¦\9fৰ|à¦\97à§\8bà¦\9fৰ}} সদস্যৰ বাবে সীমিত: $1',
+'badaccess-groups' => 'à¦\86পà§\81নি à¦\85নà§\81ৰà§\8bধ à¦\95ৰা à¦\95াৰà§\8dয à¦\95à§\87ৱল {{PLURAL:$2|à¦\8fà¦\87 à¦\97à§\8bà¦\9fৰ|à¦\8fà¦\87 à¦\97à§\8bà¦\9fসমà§\82হৰ à¦¯à¦¿à¦\95à§\8bনà§\8b à¦\8fà¦\9fাৰ}} সদস্যৰ বাবে সীমিত: $1',
 
 'versionrequired' => 'মিডিয়াৱিকিৰ $1 সংকলন থাকিব লাগিব ।',
 'versionrequiredtext' => 'এই পৃষ্ঠাটো ব্যৱহাৰ কৰিবলৈ মিডিয়াৱিকিৰ $1 সংস্কৰণ থাকিব লাগিব । [[Special:Version|সংস্কৰণ পৃষ্ঠা]] চাওক।',
@@ -742,6 +741,8 @@ $2',
 'retypenew' => 'নতুন গুপ্তশব্দ আকৌ লিখক',
 'resetpass_submit' => 'গুপ্তশব্দ বহুৱাওক আৰু প্ৰৱেশ কৰক',
 'changepassword-success' => 'আপোনাৰ গুপ্তশব্দ সফলতাৰে সলনি কৰা হৈছে!',
+'changepassword-throttled' => 'আপুনি স‍ম্প্ৰতি অজস্ৰবাৰ লগ্‌-ইনৰ প্ৰয়াস কৰিছে।
+অনুগ্ৰহ কৰি $1 সময়ৰ পিছত আকৌ চেষ্টা কৰক।',
 'resetpass_forbidden' => 'গুপ্তশব্দ সলনি কৰিব নোৱাৰি',
 'resetpass-no-info' => 'এই পৃষ্ঠাটোত প্ৰৱেশাধিকাৰ পাবলৈ আপুনি লগ্‌ ইন কৰিব লাগিব ।',
 'resetpass-submit-loggedin' => 'গুপ্তশব্দ সলনি কৰক',
@@ -791,6 +792,8 @@ $2
 'changeemail-password' => 'আপোনাৰ  {{SITENAME}} গুপ্তশব্দ:',
 'changeemail-submit' => 'ই-মেইল ঠিকনা সলনি কৰক',
 'changeemail-cancel' => 'বাতিল কৰক',
+'changeemail-throttled' => 'আপুনি স‍ম্প্ৰতি অজস্ৰবাৰ লগ্‌-ইনৰ প্ৰয়াস কৰিছে।
+অনুগ্ৰহ কৰি $1 সময়ৰ পিছত আকৌ চেষ্টা কৰক।',
 
 # Special:ResetTokens
 'resettokens' => "ট'কেন ৰিছে'ট কৰক",
@@ -1020,6 +1023,8 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'invalid-content-data' => 'অবৈধ সমল তথ্য',
 'content-not-allowed-here' => '[[$2]] পৃষ্ঠাত "$1" সমল অনুমোদিত নহয়',
 'editwarning-warning' => 'এই পৃষ্ঠাটো এৰিলে আপুনি কৰা পৰিবৰ্তনসমূহ হেৰাব পাৰে। যদি আপুনি প্ৰৱেশ কৰা অৱস্থাত আছে, আপুনি এই সতৰ্কবাৰ্তাক আপোনাৰ পছন্দসমূহৰ "সম্পাদনা" অংশত অসামৰ্থবান কৰিব পাৰিব।',
+'editpage-notsupportedcontentformat-title' => 'সমলৰ ফৰ্মেট সমৰ্থিত নহয়।',
+'editpage-notsupportedcontentformat-text' => 'সমল মডেল $2ৱে সমল ফৰ্মেট $1 সমৰ্থন নকৰে।',
 
 # Content models
 'content-model-wikitext' => 'ৱিকিপাঠ্য',
@@ -1062,7 +1067,9 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'cantcreateaccount-text' => "আই পি ঠিকনা ('''$1''')ৰ পৰা একাউণ্ট সৃষ্টিত [[User:$3|$3]]’য়ে বাধা প্ৰদান কৰিছে ।
 
 $3 য়ে আগবঢ়োৱা ইয়াৰ কাৰণ হৈছে ''$2''",
-'cantcreateaccount-range-text' => " $3 য়ে ''$2'' বুলি কাৰণ দিছে",
+'cantcreateaccount-range-text' => "[[User:$3|$3]]য়ে '''$1''' পৰিসীমাৰ আই পি ঠিকনাৰ পৰা একাউণ্ট সৃষ্টি বাৰণ কৰিছে যাৰ ভিতৰত আপোনাৰ আই ই ঠিকনাও ('''$4''') আছে।
+
+ $3য়ে ''$2'' বুলি কাৰণ দৰ্শাইছে",
 
 # History pages
 'viewpagelogs' => 'এই পৃষ্ঠাৰ অভিলেখ চাওক ।',
@@ -1222,7 +1229,7 @@ $1",
 'mergelog' => 'অভিলেখ একত্ৰীকৰণ',
 'pagemerge-logentry' => "[[$1]] [[$2]]-ত মিলোৱা হ'ল (সংশোধনসমূহ $3-লৈ)",
 'revertmerge' => 'একত্ৰীকৰণ বাতিল কৰক',
-'mergelogpagetext' => 'à¦\8fà¦\96ন পৃষ্ঠাৰ ইতিহাস আন এখনৰ লগত কৰা একত্ৰীকৰণৰ সকলোতকৈ শেহতীয়া তালিকা তলত দিয়া হ’ল ।',
+'mergelogpagetext' => 'à¦\8fà¦\9fা পৃষ্ঠাৰ ইতিহাস আন এখনৰ লগত কৰা একত্ৰীকৰণৰ সকলোতকৈ শেহতীয়া তালিকা তলত দিয়া হ’ল ।',
 
 # Diffs
 'history-title' => '"$1" ৰ সংশোধনৰ ইতিহাস',
@@ -1234,7 +1241,8 @@ $1",
 'showhideselectedversions' => 'নিৰ্বাচিত সংশোধনসমূহ দেখুৱাওক/আঁৰ কৰক',
 'editundo' => 'পূৰ্ববত কৰক',
 'diff-empty' => '(কোনো পাৰ্থক্য নাই)',
-'diff-multi' => '({{PLURAL:$2|এজন সদস্যৰ|$2জন সদস্যৰ}} দ্বাৰা {{PLURAL:$1|এটা মধ্যৱৰ্তী সংশোধন|$1-টা মধ্যৱৰ্তী সংশোধন}} দেখোৱা হোৱা নাই)',
+'diff-multi-sameuser' => 'একেজন সদস্যই কৰা ({{PLURAL:$1|এটা মধ্যৱৰ্তী সংশোধন|$1টা মধ্যৱৰ্তী সংশোধন}} দেখুওৱা হোৱা নাই',
+'diff-multi-otherusers' => '{{PLURAL:$2|আন এজন সদস্যই|$2জন সদস্যই}} কৰা ({{PLURAL:$1|এটা মধ্যৱৰ্তী সংশোধন|$1টা মধ্যৱৰ্তী সংশোধন}} দেখুওৱা হোৱা নাই।',
 'diff-multi-manyusers' => '({{PLURAL:$2|এজনতকৈ|$2-জনতকৈ}} অধিক সদস্যৰ দ্বাৰা {{PLURAL:$1|এটা মধ্যৱৰ্তী সংশোধন|$1-টা মধ্যৱৰ্তী সংশোধন}} দেখুওৱা হোৱা নাই)',
 'difference-missing-revision' => '{{PLURAL:$2|এটা সংস্কৰণ|$2 সংস্কৰণসমূহৰ}} সংশোধনৰ পাৰ্থক্য  ($1) {{PLURAL:$2| পোৱা নগ’ল}}।
 
@@ -1257,7 +1265,8 @@ $1",
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) চাওক।',
 'searchmenu-exists' => "'''এই ৱিকিত \"[[:\$1]]\" নামৰ এটা পৃষ্ঠা আছে।'''
 {{PLURAL:\$2|0=|আন সন্ধান ফলাফলবোৰ চাওক।}}",
-'searchmenu-new' => "'''এই ৱিকিত \"[[:\$1]]\" পৃষ্ঠাখন সৃষ্টি কৰক!'''",
+'searchmenu-new' => '<strong>এই ৱিকিত "[[:$1]]" পৃষ্ঠাখন সৃষ্টি কৰক!</strong> 
+{{PLURAL:$2|0=|আপোনাৰ সন্ধানত পোৱা পৃষ্ঠাবোৰো চাওক।|সন্ধান ফলাফলসমূহো চাওক।}}',
 'searchprofile-articles' => 'বিষয়বস্তুৰ পৃষ্ঠা',
 'searchprofile-project' => 'সহায় আৰু প্ৰকল্প পৃষ্ঠাসমূহ',
 'searchprofile-images' => 'মাল্টিমিডিয়া',
@@ -1273,6 +1282,7 @@ $1",
 'search-result-score' => 'যথাৰ্থতা: $1%',
 'search-redirect' => '(পুনৰ্নিৰ্দেশনা $1)',
 'search-section' => '(অনুচ্ছেদ $1)',
+'search-file-match' => '(ফাইলৰ বিষয়বস্তুৰ লগত মিল পোৱা গৈছে)',
 'search-suggest' => 'আপুনি $1 বুজাব খুজিছে নেকি?',
 'search-interwiki-caption' => 'সহপ্ৰকল্পসমূহ',
 'search-interwiki-default' => '$1 ফলাফলসমূহ:',
@@ -1518,7 +1528,7 @@ $1",
 'right-viewmyprivateinfo' => 'আপোনাৰ ব্যক্তিগত তথ্য চাওক (যেনে- ইমেইল ঠিকনা, প্ৰকৃত নাম)',
 'right-editmyprivateinfo' => 'আপোনাৰ ব্যক্তিগত তথ্য সম্পাদনা কৰক (যেনে- ইমেইল ঠিকনা, প্ৰকৃত নাম)',
 'right-editmyoptions' => 'আপোনাৰ নিজৰ পছন্দসমূহ সম্পাদনা কৰক',
-'right-rollback' => 'শà§\87ষৰà¦\9cন à¦¸à¦¦à¦¸à§\8dযà¦\87 à¦\8fà¦\96ন নিৰ্দিষ্ট পৃষ্টাত কৰা সম্পাদনা পূৰ্বৰ অৱস্থালৈ ঘূৰাই আনক',
+'right-rollback' => 'শà§\87ষৰà¦\9cন à¦¸à¦¦à¦¸à§\8dযà¦\87 à¦\8fà¦\9fা নিৰ্দিষ্ট পৃষ্টাত কৰা সম্পাদনা পূৰ্বৰ অৱস্থালৈ ঘূৰাই আনক',
 'right-markbotedits' => 'ৰ’ল্ড-বেক সম্পাদনাসমূহ বট সম্পাদনা বুলি চিহ্নিত কৰক',
 'right-noratelimit' => 'গতি সীমাৰ দ্বাৰা প্ৰভাৱিত নহ’ব',
 'right-import' => 'আন ৱিকিৰ পৰা পৃষ্ঠা আমদানী কৰক',
@@ -1728,6 +1738,8 @@ $1",
 'file-exists-duplicate' => 'এই ফাইলটো {{PLURAL:$1|ফাইলৰ|ফাইলবোৰৰ}} প্ৰতিলিপি:',
 'file-deleted-duplicate' => "এই ফাইল ([[:$1]]) ৰ  লগত মিল থকা আন এটা ফাইল ইতিপূৰ্বে বিলোপ কৰা হৈছে ।
 পুনৰ আপল'ড কৰাৰ আগেয়ে আপুনি সেই ফাইলটোৰ অৱলুপ্তি ইতিহাস পৰীক্ষা কৰা উচিত ।",
+'file-deleted-duplicate-notitle' => "এই ফাইলৰ লগত মিল থকা আন এটা ফাইল ইতিপূৰ্বে বিলোপ কৰা হৈছে আৰু শিৰোনামাটো আঁতৰোৱা হৈছে।
+ফাইলটো পুনৰ আপল'ড কৰাৰ আগতে আপুনি অৱদমিত ফাইল তথ্য চোৱাৰ অধিকাৰ থকা কোনোবা এজনক সুধি লোৱা উচিত।",
 'uploadwarning' => 'আপল’ড সতৰ্কবাণী',
 'uploadwarning-text' => 'অনুগ্ৰহ কৰি তলত ফাইলৰ বিৱৰণী পৰিৱৰ্তন কৰক আৰু পুনৰ চেষ্টা কৰক ।',
 'savefile' => 'সংৰক্ষণ',
@@ -1904,7 +1916,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 # File description page
 'file-anchor-link' => 'চিত্ৰ',
 'filehist' => 'ফাইলৰ ইতিবৃত্ত',
-'filehist-help' => 'ফাà¦\87লৰ à¦\86à¦\97ৰ à¦\85ৱà§\8dসà§\8dথা à¦\9aাবলà§\88 à¦¸à§\87à¦\87 à¦¤à¦¾à§°à¦¿à¦\96/সময়ত à¦\9fিপা à¦®à¦¾à§°à¦\95 ।',
+'filehist-help' => 'ফাà¦\87লৰ à¦\86à¦\97ৰ à¦\85ৱসà§\8dথা à¦\9aাবলà§\88 à¦¸à§\87à¦\87 à¦¤à¦¾à§°à¦¿à¦\96/সময়ত à¦\95à§\8dলিà¦\95 à¦\95ৰà¦\95।',
 'filehist-deleteall' => 'সকলো বিলোপ কৰক',
 'filehist-deleteone' => 'বিলোপ কৰক',
 'filehist-revert' => 'আগৰ অৱস্থালৈ ঘূৰি যাওক',
@@ -2102,6 +2114,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'protectedpages' => 'সুৰক্ষিত পৃষ্ঠাসমূহ',
 'protectedpages-indef' => 'কেৱল অনিৰ্দিষ্ট সুৰক্ষা',
 'protectedpages-cascade' => 'কেৱল প্ৰপাতাকাৰ সুৰক্ষা',
+'protectedpages-noredirect' => 'পুনঃনিৰ্দেশ লুকুৱাওক',
 'protectedpagesempty' => 'এই পাৰামিটাৰবোৰেৰে কোনো পৃষ্ঠা এতিয়া সুৰক্ষিত কৰা হোৱা নাই ।',
 'protectedtitles' => 'সুৰক্ষিত শিৰোনামাসমূহ',
 'protectedtitlesempty' => 'এই পাৰামিটাৰবোৰেৰে কোনো শিৰোনামা এতিয়া সুৰক্ষিত কৰা হোৱা নাই ।',
@@ -2681,7 +2694,7 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'range_block_disabled' => 'প্ৰশাসকৰ পৰিসীমা প্ৰতিবন্ধক সৃষ্টি কৰিব পৰা ক্ষমতা নিষ্ক্ৰিয় কৰা হৈছে ।',
 'ipb_expiry_invalid' => 'অবৈধ ম্যাদ উকলা সময়',
 'ipb_expiry_temp' => 'গুপ্ত সদস্যনাম অৱৰোধ স্থায়ী হ’ব লাগিব ।',
-'ipb_hide_invalid' => 'এই বিষয়বস্তু নিবাৰণ কৰিব পৰা নগ’ল; ইয়াত বহুতো সম্পাদনা আছে ।',
+'ipb_hide_invalid' => 'এই বিষয়বস্তু নিবাৰণ কৰিব পৰা নগ’ল; ইয়াত {{PLURAL:$1|এটা সম্পাদনা|$1টা সম্পাদনা}} আছে ।',
 'ipb_already_blocked' => '"$1"ক ইতিমধ্যে অৱৰোধ কৰা হৈছে',
 'ipb-needreblock' => '$1ক ইতিমধ্যে অৱৰোধ কৰা হৈছে । আপুনি ছেটিং সলাব বিচাৰিছে নেকি ?',
 'ipb-otherblocks-header' => 'আন {{PLURAL:$1|প্ৰতিবন্ধক|প্ৰতিবন্ধকসমূহ}}',
@@ -2928,7 +2941,7 @@ $2',
 
 # Import log
 'importlogpage' => 'আমদানিৰ অভিলেখ',
-'importlogpagetext' => 'আন ৱিকিৰ পৰা সম্পাদনা ইতিহাস সহ প্ৰশাসনীয় পৃষ্ঠা আমদানি ।',
+'importlogpagetext' => 'আন ৱিকিৰ পৰা সম্পাদনা ইতিহাসসহ প্ৰশাসনীয় পৃষ্ঠা আমদানি।',
 'import-logentry-upload' => "নথি আপল'ডৰ মাধ্যমেৰে [[$1]] আমদানি কৰা হ'ল",
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|টা সংশোধন|টা সংশোধন}}',
 'import-logentry-interwiki' => 'আন্তঃৱিকি-স্থানান্তৰিত $1',
@@ -3688,7 +3701,7 @@ $5
 # action=purge
 'confirm_purge_button' => 'শুদ্ধ',
 'confirm-purge-top' => 'এই পৃষ্ঠাৰ কেচ্‌ খালী কৰা হওক ?',
-'confirm-purge-bottom' => "à¦\8fà¦\96ন পৃষ্ঠাক শোধিত কৰিলে কেচ্‌ আতৰি যায় আৰু সকলোতকৈ শেহতীয়া সংশোধন প্ৰদৰ্শিত হ'বলৈ বাধ্য কৰে।",
+'confirm-purge-bottom' => "à¦\8fà¦\9fা পৃষ্ঠাক শোধিত কৰিলে কেচ্‌ আতৰি যায় আৰু সকলোতকৈ শেহতীয়া সংশোধন প্ৰদৰ্শিত হ'বলৈ বাধ্য কৰে।",
 
 # action=watch/unwatch
 'confirm-watch-button' => 'শুদ্ধ',
index f89cc13..fd3fff6 100644 (file)
@@ -65,7 +65,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Sorrayar enllaces:',
-'tog-justify' => 'Xustificar párrafos',
 'tog-hideminor' => 'Anubrir les ediciones menores nos cambeos recientes',
 'tog-hidepatrolled' => 'Anubrir les ediciones vixilaes nos cambeos recientes',
 'tog-newpageshidepatrolled' => 'Anubrir les páxines vixilaes na llista de páxines nueves',
@@ -228,7 +227,6 @@ $messages = array(
 'vector-action-protect' => 'Protexer',
 'vector-action-undelete' => 'Restaurar',
 'vector-action-unprotect' => 'Camudar la proteición',
-'vector-simplesearch-preference' => 'Activar la barra de búsqueda simplificada (namái tema Vector)',
 'vector-view-create' => 'Crear',
 'vector-view-edit' => 'Editar',
 'vector-view-history' => 'Ver historial',
@@ -240,7 +238,7 @@ $messages = array(
 
 'navigation-heading' => 'Menú de navegación',
 'errorpagetitle' => 'Error',
-'returnto' => 'Tornar a $1.',
+'returnto' => 'Volver a $1.',
 'tagline' => 'De {{SITENAME}}',
 'help' => 'Ayuda',
 'search' => 'Buscar',
@@ -289,7 +287,7 @@ $messages = array(
 'otherlanguages' => "N'otres llingües",
 'redirectedfrom' => '(Redirixío dende $1)',
 'redirectpagesub' => 'Páxina de redireición',
-'lastmodifiedat' => "Esta páxina camudóse la postrera vegada'l $1 a les $2.",
+'lastmodifiedat' => "L'últimu cambiu d'esta páxina foi el $1, a les $2.",
 'viewcount' => 'Esta páxina visitóse {{PLURAL:$1|una vegada|$1 vegaes}}.',
 'protectedpage' => 'Páxina protexida',
 'jumpto' => 'Saltar a:',
@@ -512,7 +510,7 @@ Nun t'escaezas de camudar les tos [[Special:Preferences|preferencies de {{SITENA
 'nologinlink' => 'Crear una cuenta',
 'createaccount' => 'Crear una cuenta',
 'gotaccount' => '¿Yá tienes una cuenta? $1.',
-'gotaccountlink' => 'Entrar',
+'gotaccountlink' => 'Aniciar sesión',
 'userlogin-resetlink' => "¿Escaeció los datos d'accesu?",
 'userlogin-resetpassword-link' => '¿Escaeció la contraseña?',
 'helplogin-url' => 'Help:Aniciar sesión',
@@ -717,7 +715,7 @@ Tendría de facelo si los compartió con alguién de mou accidental o si la so c
 'link_tip' => 'Enllaz internu',
 'extlink_sample' => 'http://www.example.com títulu del enllaz',
 'extlink_tip' => "Enllaz esternu (recuerda'l prefixu http://)",
-'headline_sample' => 'Testu del titular',
+'headline_sample' => 'Testu de cabecera',
 'headline_tip' => 'Cabecera de nivel 2',
 'nowiki_sample' => 'Pon equí testu ensin formatu',
 'nowiki_tip' => 'Inorar el formatu wiki',
@@ -730,15 +728,15 @@ Tendría de facelo si los compartió con alguién de mou accidental o si la so c
 
 # Edit pages
 'summary' => 'Resume:',
-'subject' => 'Asuntu/titular:',
+'subject' => 'Asuntu/títulu:',
 'minoredit' => 'Esta ye una edición menor',
 'watchthis' => 'Vixilar esta páxina',
 'savearticle' => 'Guardar la páxina',
-'preview' => 'Previsualización',
+'preview' => 'Vista previa',
 'showpreview' => 'Amosar previsualización',
 'showlivepreview' => 'Vista rápida',
 'showdiff' => 'Amosar cambeos',
-'anoneditwarning' => "'''Avisu:''' Nun anició sesión.
+'anoneditwarning' => "<strong>Avisu:</strong> Nun anició sesión.
 La direición IP quedará grabada nel historial d'edición d'esta páxina.",
 'anonpreviewwarning' => "''Nun aniciasti sesión. Al guardar quedará rexistrada la to direición IP nel historial d'edición d'esta páxina.''",
 'missingsummary' => "'''Recordatoriu:''' Nun conseñasti un resume d'edición.
@@ -837,7 +835,7 @@ Les páxines personalizaes de .css y .js usen un títulu en minúscules, p. ex.
 ¡Los cambios entá nun se guardaron!",
 'continue-editing' => "Dir al área d'edición",
 'previewconflict' => "Esta vista previa amuesa'l testu del área d'edición d'arriba tal como apaecerá si escueyes guardar.",
-'session_fail_preview' => "'''¡Sentímoslo muncho! Nun pudimos procesar la to edición por aciu d'una perda de datos de la sesión.'''
+'session_fail_preview' => "'''¡Sentímoslo muncho! Nun pudimos procesar la to edición porque hebo una perda de datos de la sesión.'''
 Por favor, vuelvi a intentalo.
 Si inda nun funciona, intenta [[Special:UserLogout|colar]] y volver a aniciar sesión.",
 'session_fail_preview_html' => "'''¡Sentímoslo! Nun pudo procesase la to edición por aciu d'una perda de datos de la sesión.'''
@@ -864,9 +862,9 @@ Vas tener que fusionar los tos cambios dientro del testu esistente.
 'nonunicodebrowser' => "'''Avisu: El to navegador nun cumple la norma Unicode.''' Hai un sistema alternativu que te permite editar páxines de forma segura: los caráuteres non-ASCII apaecerán nel cuadru d'edición como códigos hexadecimales.",
 'editingold' => "'''AVISU: Tas editando una revisión vieya d'esta páxina. Si la grabes, los cambios que se ficieron dende esta revisión van perdese.'''",
 'yourdiff' => 'Diferencies',
-'copyrightwarning' => "Por favor, ten en cuenta que toles collaboraciones de {{SITENAME}} considerense espublizaes baxo la $2 (ver $1 pa más detalles). Si nun quies que'l to trabayu s'edite ensin midida y se distribuya al debalu, nun lu pongas equí.<br />
-Amás tas prometiendonos qu'escribisti esto tu mesmu o que copiastilo d'una fonte llibre de dominiu públicu o asemeyao.
-'''¡Nun unvies obres con drechos d'autor ensin permisu!'''",
+'copyrightwarning' => "Por favor, ten en cuenta que toles collaboraciones de {{SITENAME}} considérense espublizaes baxo la $2 (ver $1 pa más detalles). Si nun quies que'l to trabayu s'edite ensin midida y se distribuya al debalu, nun lu pongas equí.<br />
+Amás tas prometiéndonos qu'escribisti esto tu mesmu, o que lo copiasti d'una fonte llibre, de dominiu públicu o asemeyada.
+<strong>¡Nun unvies obres con drechos d'autor ensin permisu!</strong>",
 'copyrightwarning2' => "Por favor, ten en cuenta que toles contribuciones de {{SITENAME}} se puen editar, alterar o desaniciar por otros usuarios. Si nun quies que'l to trabayu s'edite ensin midida, nun lu pongas equí.<br />
 Amás tas dexándonos afitao qu'escribisti esto tu mesmu, o que lo copiasti d'una fonte llibre de dominiu públicu o asemeyao (ver $1 pa más detalles).
 '''¡Nun pongas trabayos con drechos d'autor ensin permisu!'''",
@@ -918,8 +916,8 @@ Esta yá esiste.',
 'content-failed-to-parse' => 'Fallu al analizar el conteníu $2 pal modelu $1: $3',
 'invalid-content-data' => 'Datos del conteníu inválidos',
 'content-not-allowed-here' => 'El conteníu «$1» nun se permite na páxina [[$2]]',
-'editwarning-warning' => 'Salir d\'esta páxina pue causar la perda de cualesquier cambiu fechu.
-Si aniciasti sesión, pue desactivase esti avisu na seición "Edición" de les tos preferencies.',
+'editwarning-warning' => "Salir d'esta páxina pue causar la perda de cualesquier cambiu fechu.
+Si anició sesión, pue desactivar esti avisu na seición «{{int:prefs-editing}}» de les preferencies.",
 'editpage-notsupportedcontentformat-title' => 'El formatu del conteníu nun tien sofitu',
 'editpage-notsupportedcontentformat-text' => 'El formatu del conteníu, $1, nun tien sofitu del modelu de conteníu $2.',
 
@@ -956,6 +954,7 @@ Estos parámetros s'omitieron.",
 Por favor comprueba la comparanza d'abaxo pa confirmar que ye eso lo que quies facer, y depués guarda los cambios p'acabar d'esfacer la edición.",
 'undo-failure' => "Nun pudo esfacese la edición por aciu d'ediciones intermedies conflictives.",
 'undo-norev' => 'Nun se pudo esfacer la edición porque nun esiste o se desanició.',
+'undo-nochange' => 'Paez que la edición yá ta desfecha.',
 'undo-summary' => 'Esfacer la revisión $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|alderique]])',
 'undo-summary-username-hidden' => "Desfacer la revisión $1 d'un usuariu tapecíu",
 
@@ -1085,7 +1084,7 @@ Comprueba los rexistros, por favor.",
 ** Violación del Copyright
 ** Información personal o comentariu non apropiáu
 ** Nome d'usuariu non apropiáu
-** Información potencialmente bilordiosa",
+** Información potencialmente falsa",
 'revdelete-otherreason' => 'Motivu distintu/adicional:',
 'revdelete-reasonotherlist' => 'Otru motivu',
 'revdelete-edit-reasonlist' => 'Editar motivos del desaniciu',
@@ -1135,7 +1134,8 @@ Asegúrate de qu'esti cambéu caltenga la continuidá del históricu de la páxi
 'showhideselectedversions' => 'Amosar/anubrir les versiones seleicionaes',
 'editundo' => 'desfacer',
 'diff-empty' => '(Nun hai diferencies)',
-'diff-multi' => "({{PLURAL:$1|Nun s'amuesa 1 revisión intermedia|Nun s'amuesen $1 revisiones intermedies}} {{PLURAL:$2|d'un usuariu|de $2 usuarios}} )",
+'diff-multi-sameuser' => "({{PLURAL:$1|Nun s'amuesa una revisión intermedia|Nun s'amuesen $1 revisiones intermedies}} del mesmu usuariu)",
+'diff-multi-otherusers' => "(Nun s'{{PLURAL:$1|amuesa una revisión intermedia|amuesen $1 revisiones intermedies}} {{PLURAL:$2|d'otru usuariu|de $2 usuarios}})",
 'diff-multi-manyusers' => "({{PLURAL:$1|Nun s'amuesa una revisión intermedia|Nun s'amuesen $1 revisiones intermedies}} de más de $2 {{PLURAL:$2|usuariu|usuarios}})",
 'difference-missing-revision' => "{{PLURAL:$2|Nun s'alcontró|Nun s'alcontraron}} {{PLURAL:$2|una revisión|$2 revisiones}} d'esta diferencia ($1).
 
@@ -1156,7 +1156,7 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
 'shown-title' => 'Amosar $1 {{PLURAL:$1|resultáu|resultaos}} por páxina',
 'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Hai una páxina nomada \"[[\$1]]\" nesta wiki'''",
-'searchmenu-new' => "'''¡Crear la páxina \"[[:\$1]]\" nesta wiki!'''",
+'searchmenu-new' => "<strong>¡Crear la páxina «[[:$1]]» nesta wiki!</strong> {{PLURAL:$2|0=|Vea tamién la páxina que s'alcontró cola gueta.|Vea tamién los resultaos qu'alcontró la gueta.}}",
 'searchprofile-articles' => 'Páxines de conteníu',
 'searchprofile-project' => 'Páxines de proyeutu y ayuda',
 'searchprofile-images' => 'Multimedia',
@@ -1182,6 +1182,7 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
 'searchrelated' => 'rellacionáu',
 'searchall' => 'toos',
 'showingresults' => "Abaxo {{PLURAL:$1|amuésase '''un''' resultáu|amuésense '''$1''' resultaos}}, entamando col #'''$2'''.",
+'showingresultsinrange' => "Más abaxo s'{{PLURAL:$1|amuesa|amuesen}} fasta {{PLURAL:$1|<strong>1</strong> resultáu|<strong>$1</strong> resultaos}} nel rangu ente #<strong>$2</strong> y #<strong>$3</strong>.",
 'showingresultsnum' => "Abaxo {{PLURAL:$3|amuésase '''un''' resultáu|amuésense '''$3''' resultaos}}, entamando col #'''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Resultáu '''$1''' de '''$3'''|Resultaos '''$1 - $2''' de '''$3'''}} pa '''$4'''",
 'search-nonefound' => 'Nun hebo resultaos que casaren cola consulta.',
@@ -1485,7 +1486,7 @@ Esta información sedrá pública.',
 'nchanges' => '{{PLURAL:$1|un cambiu|$1 cambios}}',
 'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|dende la última visita}}',
 'enhancedrc-history' => 'historial',
-'recentchanges' => 'Cambios recientes',
+'recentchanges' => 'Cambeos recientes',
 'recentchanges-legend' => 'Opciones de cambios recientes',
 'recentchanges-summary' => 'Sigui los cambios más recientes na wiki nesta páxina.',
 'recentchanges-noresult' => 'Nengún cambiu nel periodu conseñáu coincide con esos criterios.',
@@ -1506,7 +1507,7 @@ Esta información sedrá pública.',
 'rcshowhideanons' => '$1 usuarios anónimos',
 'rcshowhidepatr' => '$1 ediciones supervisaes',
 'rcshowhidemine' => '$1 les mios ediciones',
-'rclinks' => 'Amosar los caberos $1 cambios de los caberos $2 díes <br />$3',
+'rclinks' => 'Amosar los caberos $1 cambeos de los caberos $2 díes <br />$3',
 'diff' => 'dif',
 'hist' => 'hist',
 'hide' => 'Anubrir',
@@ -1524,7 +1525,7 @@ Esta información sedrá pública.',
 'rc-old-title' => 'creada orixinalmente como «$1»',
 
 # Recent changes linked
-'recentchangeslinked' => 'Cambios rellacionaos',
+'recentchangeslinked' => 'Cambeos rellacionaos',
 'recentchangeslinked-feed' => 'Cambios rellacionaos',
 'recentchangeslinked-toolbox' => 'Cambios rellacionaos',
 'recentchangeslinked-title' => 'Cambios rellacionaos con "$1"',
@@ -1929,7 +1930,7 @@ Alcuérdate de comprobar otros enllaces a les plantíes enantes d'esborrales.",
 'statistics-edits' => "Ediciones de páxines dende qu'entamó {{SITENAME}}",
 'statistics-edits-average' => "Media d'ediciones por páxina",
 'statistics-views-total' => 'Visites totales',
-'statistics-views-total-desc' => "Les vistes de páxines non-esistentes y especiales nun s'incluyen",
+'statistics-views-total-desc' => "Nun s'incluyen les visites a les páxines inesistentes y especiales",
 'statistics-views-peredit' => 'Visites por edición',
 'statistics-users' => '[[Special:ListUsers|Usuarios]] rexistraos',
 'statistics-users-active' => 'Usuarios activos',
@@ -2011,6 +2012,14 @@ Les entraes <del>tachaes</del> tan resueltes.',
 'protectedpages-cascade' => 'Namái proteiciones en cascada',
 'protectedpages-noredirect' => 'Anubrir redireiciones',
 'protectedpagesempty' => 'Nun hai páxines protexíes anguaño con estos parámetros.',
+'protectedpages-timestamp' => "Marca d'hora",
+'protectedpages-page' => 'Páxina',
+'protectedpages-expiry' => 'Caduca',
+'protectedpages-performer' => 'Usuariu que protexe',
+'protectedpages-params' => 'Parámetros de proteición',
+'protectedpages-reason' => 'Motivu',
+'protectedpages-unknown-timestamp' => 'Desconocida',
+'protectedpages-unknown-performer' => 'Usuariu desconocíu',
 'protectedtitles' => 'Títulos protexíos',
 'protectedtitlesempty' => 'Nun hai títulos protexíos anguaño con estos parámetros.',
 'listusers' => "Llista d'usuarios",
@@ -2044,8 +2053,8 @@ Date cuenta de qu'otros sitios web puen enllazar a un ficheru con una URL direut
 'booksources-invalid-isbn' => 'El códigu ISBN que puxisti nun paez que valga; mira que te vien copiáu de la fonte orixinal.',
 
 # Special:Log
-'specialloguserlabel' => 'Pol usuariu:',
-'speciallogtitlelabel' => 'Col títulu:',
+'specialloguserlabel' => 'Fecho por:',
+'speciallogtitlelabel' => 'Oxetivu (títulu o usuariu):',
 'log' => 'Rexistros',
 'all-logs-page' => 'Tolos rexistros públicos',
 'alllogstext' => "Visualización combinada de tolos rexistros disponibles de {{SITENAME}}.
@@ -2076,8 +2085,8 @@ Pues filtrar la visualización seleicionando una mena de rexistru, el nome d'usu
 
 # Special:Categories
 'categories' => 'Categoríes',
-'categoriespagetext' => "{{PLURAL:$1|La categoría darréu contién|Les categoríes darréu contienen}} páxines o ficheros multimedia.
-Les [[Special:UnusedCategories|categoríes non usaes]] nun s'amuesen equí.
+'categoriespagetext' => "{{PLURAL:$1|La siguiente categoría contién|Les siguientes categoríes contienen}} páxines o ficheros multimedia.
+Les [[Special:UnusedCategories|categoríes nun usaes]] nun s'amuesen equí.
 Ver tamién les [[Special:WantedCategories|categoríes más buscaes]].",
 'categoriesfrom' => "Amosar categoríes qu'emprimen por:",
 'special-categories-sort-count' => 'ordenar por tamañu',
@@ -2197,6 +2206,7 @@ Los futuro cambeos nesta páxina y na so páxina d\'alderique asociada apaecerá
 'watchmethod-list' => 'comprobando ediciones recientes nes páxines vixilaes',
 'watchlistcontains' => 'La to llista de vixilancia tien $1 {{PLURAL:$1|páxina|páxines}}.',
 'iteminvalidname' => "Problema col elementu '$1', nome non válidu...",
+'wlnote2' => 'Abaxo tan los cambios {{PLURAL:$1|na cabera hora|nes caberes <strong>$1</strong> hores}}, el día $2 a les $3.',
 'wlshowlast' => 'Amosar les últimes $1 hores $2 díes $3',
 'watchlist-options' => 'Opciones de la llista de vixilancia',
 
@@ -2564,7 +2574,7 @@ Mira na [[Special:BlockList|llista de bloqueos]] pa revisar los bloqueos.',
 'change-blocklink' => 'camudar el bloquéu',
 'contribslink' => 'contribuciones',
 'emaillink' => 'unviar corréu',
-'autoblocker' => 'Bloquiáu automáticamente porque la to direición IP foi usada recién por "[[User:$1|$1]]". El motivu del bloquéu de $1 ye: "$2"',
+'autoblocker' => 'Bloquiáu automáticamente porque la so direición IP usóla de recién «[[User:$1|$1]]». El motivu del bloquéu de $1 ye «$2»',
 'blocklogpage' => 'Rexistru de bloqueos',
 'blocklog-showlog' => "Esti usuariu recibió un bloquéu previamente.
 El rexistru de bloqueos s'ufre darréu pa referencia:",
@@ -2754,6 +2764,7 @@ Por favor visita [https://www.mediawiki.org/wiki/Localisation Llocalización de
 'allmessages-prefix' => 'Peñerar pol prefixu:',
 'allmessages-language' => 'Llingua:',
 'allmessages-filter-submit' => 'Dir',
+'allmessages-filter-translate' => 'Traducir',
 
 # Thumbnails
 'thumbnail-more' => 'Agrandar',
@@ -2770,6 +2781,7 @@ $2",
 'thumbnail_image-type' => "Triba d'imaxe ensin sofitu",
 'thumbnail_gd-library' => 'Configuración incompleta de la biblioteca GD: falta la función $1',
 'thumbnail_image-missing' => "Paez que falta'l ficheru: $1",
+'thumbnail_image-failure-limit' => 'Hebo demasiaos intentos recientes que fallaron ($1 o más) al representar esta miniatura. Vuelva a intentalo más sero.',
 
 # Special:Import
 'import' => 'Importar páxines',
@@ -2805,7 +2817,7 @@ Guárdalu nel ordenador y xúbilu equí.",
 'importuploaderrortemp' => "Falló la xubida del archivu d'importación. Falta una carpeta temporal.",
 'import-parse-failure' => "Fallu nel análisis d'importación XML",
 'import-noarticle' => '¡Nun hai páxina pa importar!',
-'import-nonewrevisions' => 'Toles revisiones fueran importaes previamente.',
+'import-nonewrevisions' => "Nun s'importó denguna revision (o yá taben toes presentes, o se saltaron por errores).",
 'xml-error-string' => '$1 na llinia $2, col $3 (byte $4): $5',
 'import-upload' => 'Xubir datos XML',
 'import-token-mismatch' => 'Perdiéronse los datos de la sesión. Intentalo otra vuelta.',
@@ -2816,6 +2828,7 @@ Guárdalu nel ordenador y xúbilu equí.",
 'import-error-special' => "La páxina «$1» nun s'importó porque pertenez a un espaciu de nomes especial que nun permite les páxines.",
 'import-error-invalid' => "La páxina «$1» nun s'importó porque tien un nome inválidu.",
 'import-error-unserialize' => 'Nun se pudo quitar la serialización de la revisión $2 de la páxina "$1". Nel informe figura que la revisión usa\'l modelu de conteníu $3 serializáu como $4.',
+'import-error-bad-location' => 'La revisión $2 qu\'usa\'l modelu de conteníu $3 nun pue guardase na páxina "$1" d\'esta wiki, porque esi modelu nun tien sofitu na páxina.',
 'import-options-wrong' => '{{PLURAL:$2|Opción enquivocada|Opciones enquivocaes}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'La páxina raíz dada ye un títulu inválidu.',
 'import-rootpage-nosubpage' => 'L\'espaciu de nomes "$1" de la páxina raíz nun permite subpáxines.',
@@ -2939,7 +2952,7 @@ Pues ver el so códigu fonte.',
 'anonymous' => '{{PLURAL:$1|Usuariu anónimu|Usuarios anónimos}} de {{SITENAME}}',
 'siteuser' => '{{SITENAME}} usuariu $1',
 'anonuser' => 'usuariu anónimu de {{SITENAME}} $1',
-'lastmodifiedatby' => "Esta páxina se camudó por cabera vegada'l $1 a les $2 por $3.",
+'lastmodifiedatby' => "L'últimu cambiu d'esta páxina foi el $1, a les $2, por $3.",
 'othercontribs' => 'Basao nel trabayu fechu por $1.',
 'others' => 'otros',
 'siteusers' => '{{SITENAME}} {{PLURAL:$2|usuariu|usuarios}} $1',
@@ -3046,8 +3059,8 @@ $1",
 # Media information
 'mediawarning' => "'''Avisu''': Esta triba de ficheru pue contener códigu maliciosu.
 Al executalu pues comprometer el to sistema.",
-'imagemaxsize' => "Llende del tamañu d'imaxe: <br />''(pa les páxines de descripción de ficheru)''",
-'thumbsize' => 'Tamañu de la muestra:',
+'imagemaxsize' => "Llende del tamañu d'imaxe: <br /><em>(pa les páxines de descripción de ficheru)</em>",
+'thumbsize' => 'Tamañu de la miniatura:',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|páxina|páxines}}',
 'file-info' => "tamañu d'archivu: $1, triba MIME: $2",
 'file-info-size' => '$1 × $2 píxels, tamañu de ficheru: $3, triba MIME: $4',
@@ -3641,8 +3654,8 @@ Por favor confirma que daveres quies volver a crear esta páxina.",
 'descending_abbrev' => 'desc',
 'table_pager_next' => 'Páxina siguiente',
 'table_pager_prev' => 'Páxina anterior',
-'table_pager_first' => 'Primer páxina',
-'table_pager_last' => 'Postrer páxina',
+'table_pager_first' => 'Primera páxina',
+'table_pager_last' => 'Última páxina',
 'table_pager_limit' => 'Amosar $1 elementos por páxina',
 'table_pager_limit_label' => 'Elementos por páxina:',
 'table_pager_limit_submit' => 'Dir',
@@ -3652,7 +3665,7 @@ Por favor confirma que daveres quies volver a crear esta páxina.",
 'autosumm-blank' => 'Desaniciáu el conteníu de la páxina',
 'autosumm-replace' => "Sustituyendo la páxina por '$1'",
 'autoredircomment' => 'Redirixendo a [[$1]]',
-'autosumm-new' => "Páxina creada con '$1'",
+'autosumm-new' => 'Páxina creada con «$1»',
 
 # Size units
 'size-gigabytes' => '$1 XB',
@@ -4004,6 +4017,5 @@ En realidá cuasi tolo qu'apaeza ente llaves dobles.",
 'expand_templates_preview' => 'Vista previa',
 
 # Unknown messages
-'createaccount-hook-aborted' => '$1',
 'uploadinvalidxml' => "Nun pudo interpretase'l XML del ficheru cargáu.",
 );
index e91b274..8554b20 100644 (file)
@@ -101,7 +101,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Levconhani gluyasiki se',
-'tog-justify' => 'Emaven kuparkieem',
 'tog-hideminor' => 'Palsera va <i>Noeltaf betakseem</i> mezolonaf',
 'tog-hidepatrolled' => 'Palsera va fieyen betaks div noeltaf betakseem',
 'tog-newpageshidepatrolled' => 'Palsera va fieyenu bu mal vexala dem warzafu bu',
@@ -110,9 +109,7 @@ $messages = array(
 'tog-numberheadings' => 'Mivaskafa vergumveltotukara',
 'tog-showtoolbar' => 'Nedira va tidexekak ke betararude',
 'tog-editondblclick' => 'Ta bubetara tolon vulegal (JavaScript tir adraf)',
-'tog-editsection' => 'Betara va gabot kan "[Betara]" gluyasiki',
 'tog-editsectiononrightclick' => 'Betara va gabot talton vulegason<br /> va gabotvergumvelt',
-'tog-showtoc' => 'Nedira va ugak<br /> (icde teliz dem lo 3 gabot)',
 'tog-rememberpassword' => 'Mo bati nedisiki va jinaf remravlem setiker (cugon $1 {{PLURAL:$1|viel|viel}})',
 'tog-watchcreations' => 'Kosuzdasikira va jinon betayan bueem',
 'tog-watchdefault' => 'Va jinon reduyun ik betayan telizeem suzdá',
@@ -780,7 +777,6 @@ Ta ropasusu warzafu bu yo va [[Special:Search|aneyara ko wiki]] yawal.',
 'compareselectedversions' => 'Dodisukera va toloy reban siatos',
 'showhideselectedversions' => 'Nedira/palsera va reban betaks',
 'editundo' => 'dimaskira',
-'diff-multi' => '({{PLURAL:$1|1 walif betaks|$1 walif betaks}} gan {{PLURAL:$2|tanoy webesik|$2 webesik}} me zo nedid)',
 
 # Search results
 'searchresults' => 'Aneyaradanekseem',
@@ -1420,7 +1416,6 @@ Ta sulara va batu bu div rinafi suzdasiki, koe grablexo va « Mea suzdá » vule
 'watchmethod-list' => 'ageltara va suzdan bueem icde noeltafa betara',
 'watchlistcontains' => 'Rinafi suzdasiki va $1 bu ruldar',
 'iteminvalidname' => 'Zvak icde « $1 » teliz : yolt tir mewadaf...',
-'wlnote' => "Vleveon tid tela '''$1''' ironokafa betara mali '''$2''' ironokaf bartiv.",
 'wlshowlast' => 'Nedira va ironokaf $1 bartiv isu $2 viel isu $3',
 'watchlist-options' => 'Suzdasikiolkeem',
 
@@ -1825,7 +1820,6 @@ Va [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] is [//tr
 'tooltip-pt-watchlist' => 'Rinon suzdan betan bueem',
 'tooltip-pt-mycontris' => 'Jinaf webekseem',
 'tooltip-pt-login' => 'Pataredura zo koldar voxe me tir vrebafa.',
-'tooltip-pt-anonlogin' => 'Zo bristul da va int kogluyal, wori batcoba me tir vrebafa.',
 'tooltip-pt-logout' => 'Voldogluyara',
 'tooltip-ca-talk' => 'Keyaksera va telizbu',
 'tooltip-ca-edit' => 'Va batu bu robetal. Va "Abdinedira" vulegasiki abdi giwara vay favel !',
index fd69777..f6ea06f 100644 (file)
@@ -17,6 +17,7 @@
  * @author Gulmammad
  * @author Kaganer
  * @author Khan27
+ * @author Matma Rex
  * @author Mushviq Abdulla
  * @author PPerviz
  * @author PrinceValiant
@@ -84,7 +85,6 @@ $separatorTransformTable = array( ',' => '.', '.' => ',' );
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Keçidlərin altını xətlə:',
-'tog-justify' => 'Mətni səhifə boyu payla',
 'tog-hideminor' => 'Son dəyişikliklərdə kiçik redaktələri gizlə',
 'tog-hidepatrolled' => 'Yoxlanılmış redaktələri son dəyişikliklərdə göstərmə',
 'tog-newpageshidepatrolled' => 'Yoxlanılmış səhifələri yeni səhifə siyahısında göstərmə',
@@ -847,11 +847,9 @@ $3 tərəfindən verilən səbəb ''$2''",
 'last' => 'son',
 'page_first' => 'birinci',
 'page_last' => 'sonuncu',
-'histlegend' => "<div id=\"histlegend\"><span style=\"white-space:nowrap;\">Aşağıda sadalanan hər hansı bir versiyası görmək üçün, tarixinin üzərinə tıklayın.</span> <span style=\"white-space:nowrap;\">Daha çox kömək üçün, [[Kömək:Səhifə keçmişi|səhifə keçmişi]] səhifəsinə baxın.</span><br /><span style=\"white-space:nowrap;\">Xarici vasitələr: <!-- [http://toolserver.org/~tparis/articleinfo/index.php?article={{FULLPAGENAMEE}}&lang=tr&wiki=wikipedia Təftiş keçmişinin statistikası] '''·'''</span> <span style=\"white-space:nowrap;\"> -->[http://wikipedia.ramselehof.de/wikiblame.php?lang=tr&article={{FULLPAGENAMEE}} Təftiş keçmişini axtarmaq] '''·'''</span> <span style=\"white-space:nowrap;\">[http://toolserver.org/~daniel/WikiSense/Contributors.php?wikilang=tr&wikifam=.wikipedia.org&grouped=on&page={{FULLPAGENAMEE}} Töhfəsi olanlar] '''·'''</span> <span style=\"white-space:nowrap;\">[http://toolserver.org/~mzmcbride/cgi-bin/watcher.py?db=trwiki_p&titles={{FULLPAGENAMEE}} İzləyənlərin sayı] '''·'''</span> <span style=\"white-space:nowrap;\">[http://stats.grok.se/tr/latest/{{FULLPAGENAMEE}} Səhifəyə baxılma statistikası]</span></div>
-----
-Fərqləri seçmə və göstərmə: müqayisə etmək istədiyiniz versiyaların yanındakı radio qutularına işarə qoyun və daxil etmə düyməsinə (enter+a) və ya \"müqayisə et\" düyməsinə vurun.
+'histlegend' => 'Fərqləri seçmə və göstərmə: müqayisə etmək istədiyiniz versiyaların yanındakı radio qutularına işarə qoyun və daxil etmə düyməsinə (enter+a) və ya "müqayisə et" düyməsinə vurun.
 
-Açıqlama: '''(hh)''' = hal-hazırkı versiya ilə olan fərqlər, '''(son)''' = əvvəlki versiya ilə olan fərqlər, '''k''' = kiçik redaktələr.</span>",
+Açıqlama: <strong>({{int:cur}})</strong> = hal-hazırkı versiya ilə olan fərqlər, <strong>({{int:last}})</strong> = əvvəlki versiya ilə olan fərqlər, <strong>{{int:minoreditletter}}</strong> = kiçik redaktələr.</span>',
 'history-fieldset-title' => 'Tarixçəni nəzərdən keçir',
 'history-show-deleted' => 'Yalnız silinənlər',
 'histfirst' => 'Ən əvvəlki',
@@ -956,7 +954,6 @@ $1",
 'compareselectedversions' => 'Seçilən versiyaları müqayisə et',
 'showhideselectedversions' => 'Seçilən versiyaları göstər/gizlə',
 'editundo' => 'əvvəlki halına qaytar',
-'diff-multi' => '({{PLURAL:$2|Bir istifadəçi|$2 istifadəçi}} tərəfindən edilən {{PLURAL:$1|bir ara redaktə|$1 ara redaktə}} göstərilmir)',
 'diff-multi-manyusers' => '({{PLURAL:$2|Bir istifadəçi|$2 istifadəçi}} tərəfindən edilən {{PLURAL:$1|bir ara redaktə|$1 ara redaktə}} göstərilmir)',
 
 # Search results
@@ -1764,7 +1761,6 @@ Fərdi hüquqlar haqqında əlavə məlumatı [[{{MediaWiki:Listgrouprights-help
 'watchmethod-list' => 'izlənilən səhifələr yeni dəyişikliklər üçün yoxlanılır',
 'watchlistcontains' => 'İzləmə siyahınızda $1 {{PLURAL:$1|səhifə|səhifə}} var.',
 'iteminvalidname' => "'$1' ilə bağlı problem, adı düzgün deyil...",
-'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ədiyim səhifələrin nizamlamaları',
 
@@ -2238,7 +2234,6 @@ Zəhmət olmasa başqa ad seçin.',
 'tooltip-pt-watchlist' => 'İzləməyə götürdüyüm səhifələr',
 'tooltip-pt-mycontris' => 'Etdiyim dəyişikliklərin siyahısı',
 'tooltip-pt-login' => 'Daxil olmanız tövsiyə olunur, amma bu məcburi tələb deyil.',
-'tooltip-pt-anonlogin' => 'Daxil olmanız tövsiyə olunur, amma tələb olunmur.',
 'tooltip-pt-logout' => 'Sistemdən çıx',
 'tooltip-ca-talk' => 'Məqalə haqqındə müzakirə edib, münasibətivi bildir',
 'tooltip-ca-edit' => 'Bu səhifəni redaktə edə bilərsiniz. Lütfən əvvəlcə sınaq gostərişi edin.',
index 14417b1..cc4480b 100644 (file)
@@ -12,6 +12,7 @@
  * @author Calak
  * @author E THP
  * @author Ebrahimi-amir
+ * @author Ebraminio
  * @author Erdemaslancan
  * @author Mousa
  * @author Shirayuki
@@ -88,7 +89,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'باغلانتی‌لارین آلتینی خطله:',
-'tog-justify' => 'متنی صحیفه بویو پایلا',
 'tog-hideminor' => 'سون دییشیکلیکلرده کیچیک‌لری گیزلت',
 'tog-hidepatrolled' => 'نظارتلنمیش دَییشیکلیکلری سون دییشیکلیکلرده گیزلت',
 'tog-newpageshidepatrolled' => 'نظارتلنمیش صحیفه‌لری یئنی صحیفه‌لر سیاهی‌سیندان گیزلت',
@@ -1084,7 +1084,6 @@ $1",
 'compareselectedversions' => 'سئچیلمیش نوسخه‌لری قارشیلاشدیر',
 'showhideselectedversions' => 'سئچیلمیش نوسخه‌لری گؤستر/گیزلد',
 'editundo' => 'قایتار',
-'diff-multi' => '({{PLURAL:$2|بیر|$2}} ایستیفاده‌چی طرفیندن ائدیلن {{PLURAL:$1|بیر|$1}} اورتا دَییشیکلیک گؤستریلمیر)',
 'diff-multi-manyusers' => '{{PLURAL:$2|بیر|$2}}-دن چوخ ایستیفاده‌چی یارادان {{PLURAL:$1|بیر|$1}} نوسخه، گؤستریلمه‌ییب‌دیر',
 'difference-missing-revision' => 'بو فرقین ($1) {{PLURAL:$2|بیر|$2}} نوسخه‌سی تاپیلانمادی.
 
@@ -2110,7 +2109,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization صحیفه‌‌سین
 'watchmethod-list' => 'ایزلنیلن صحیفه‌لر یئنی دییشیک‌لیک‌لر اوچون یوخلانیلیر',
 'watchlistcontains' => 'ایزلمه سیاهینیزدا $1 {{PLURAL:$1|صحیفه}} وار.',
 'iteminvalidname' => "'$1 ایله باغ‌لی پروبلئم، آدی دوزگون دئییل...",
-'wlnote' => "آشاغیداکی {{PLURAL:$1|'''$1''' ديَیشیک‌لیک|'''$1'''ديَیشیک‌لیک}}  سون {{PLURAL:$2|ساعتدا|'''$2''' ساعتدا}} ائدیلمیشدیر.$3، $4",
 'wlshowlast' => 'سون $1 ساعات $2 گون گؤستر $3',
 'watchlist-options' => 'ایزله‌دیکلر سئچمه‌لری',
 
@@ -2752,7 +2750,6 @@ $2',
 'tooltip-pt-watchlist' => 'دییشمکلرینی ایزله‌دیگینیز صفحه‌لرین سیاهی‌سی',
 'tooltip-pt-mycontris' => 'سیزین چالیشمالارینیزین لیستی',
 'tooltip-pt-login' => 'گیریش ائتمه‌یینیز توصیه اولونور؛ اما گرکلی دئییل',
-'tooltip-pt-anonlogin' => 'داخیل اولمانیز توصیه‌‌ اولونور، آمما طلب اولونمور.',
 'tooltip-pt-logout' => 'چیخیش',
 'tooltip-ca-talk' => 'ایچینده‌کیلره گؤره دانیشیق',
 'tooltip-ca-edit' => 'سیز بو صحیفه‌نی دَییشدیره بیلرسینیز. لوطفاً قئید ائتمه‌دن اونجه اؤن‌گؤستریش دویگه‌سینی ایشلدین',
index 539f857..ba84fc8 100644 (file)
@@ -149,7 +149,6 @@ $linkTrail = '/^((?:[a-z]|а|б|в|г|д|е|ё|ж|з|и|й|к|л|м|н|о|п|р|
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Һылтанмалар аҫтына һыҙыу:',
-'tog-justify' => 'Һөйләмдәр теҙмәһен бит киңлегенә тигеҙләргә',
 'tog-hideminor' => 'Әһәмиәте ҙур булмаған төҙәтеүҙәрҙе һуңғы үҙгәртеүҙәр исемлегендә күрһәтмәҫкә',
 'tog-hidepatrolled' => 'Һуңғы үҙгәртеүҙәр исемлегендә тикшерелгән үҙгәртеүҙәрҙе йәшер',
 'tog-newpageshidepatrolled' => 'Яңы биттәр исемлегендә тикшерелгән үҙгәртеүҙәрҙе йәшер',
@@ -1177,7 +1176,6 @@ $1",
 'showhideselectedversions' => 'Һайланған версияларҙы күрһәтергә/йәшерергә',
 'editundo' => 'кире алыу',
 'diff-empty' => '(айырмалар юҡ)',
-'diff-multi' => '({{PLURAL:$2|$2 ҡатнашыусының}} {{PLURAL:$1|ваҡытлы версияһы}} күрһәтелмәгән)',
 'diff-multi-manyusers' => '(Кәмендә {{PLURAL:$2|$2 ҡатнашыусының}} {{PLURAL:$1|ваҡытлы версияһы}} күрһәтелмәгән)',
 'difference-missing-revision' => '$1 айырмаһының {{PLURAL:$2|1=бер өлгөһө|$2 өлгөһө}} табылманы.
 
@@ -2221,7 +2219,6 @@ $1',
 'watchmethod-list' => 'аҙаҡҡы үҙгәртеүҙәр өсөн күҙәтелгән биттәрҙе ҡарау',
 'watchlistcontains' => 'Һеҙҙең күҙәтеү исемлегендә $1 {{PLURAL:$1|1=бит|бит}}бар.',
 'iteminvalidname' => '«$1» менән ҡыйынлыҡтар, исеме дөрөҫ түгел...',
-'wlnote' => "Түбәндә $3 $4 ваҡытына тиклем аҙаҡҡы {{PLURAL:$2|1=сәғәт|'''$2''' сәғәт}} эсендә эшләнгән {{PLURAL:$1|1=үҙгәртеү|'''$1''' үҙгәртеү}} күрһәтелгән.",
 'wlshowlast' => 'Һуңғы $1 сәғәт $2 көн өсөн күрһәт $3',
 'watchlist-options' => 'Күҙәтеү исемлеге көйләүҙәре',
 
@@ -2880,7 +2877,6 @@ JavaScript тикшереү',
 'tooltip-pt-watchlist' => 'Һеҙ күҙәткән биттәр исемлеге',
 'tooltip-pt-mycontris' => 'Кереткән өлөшөгөҙ',
 'tooltip-pt-login' => 'Бында теркәлеү үтергә була, әммә был эш мәжбүри түгел.',
-'tooltip-pt-anonlogin' => 'Бында танылыу үтергә була, әммә был эш мәжбүри түгел.',
 'tooltip-pt-logout' => 'Сығырға',
 'tooltip-ca-talk' => 'Биттең эстәлеге тураһында фекерләшеү',
 'tooltip-ca-edit' => 'Һеҙ был битте үҙгәртә алаһығыҙ. Зинһар, яҙып ҡуйыр алдынан ҡарап сығығыҙ',
index 5869bce..9df2e4d 100644 (file)
@@ -61,7 +61,6 @@ $namespaceAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Links unterstreichen:',
-'tog-justify' => 'Text ois Blocksotz',
 'tog-hideminor' => 'Kloane Änderrungen ausblenden',
 'tog-hidepatrolled' => 'Kontroilirde Änderrungen in dé „Létzten Änderrungen“ ausblenden',
 'tog-newpageshidepatrolled' => 'Kóntróilirde Seiten auf da Listen „Neiche Seiten“ vaberng',
@@ -70,9 +69,7 @@ $messages = array(
 'tog-numberheadings' => 'Ywerschriften autómaatisch nummerrirn',
 'tog-showtoolbar' => 'Beorweiten-Werkzeigleisten åzoang (JavaScript werd braucht)',
 'tog-editondblclick' => 'Seiten mid am Dóppedrucker beorweiden (JavaScript werd braucht)',
-'tog-editsection' => "Links zum beorweiten voh d' oahzelnen Obschnitt åzoang",
 'tog-editsectiononrightclick' => 'Oahzelne Obschnitt mid am Rechtsdrucker beorweiten (JavaScript werd braucht)',
-'tog-showtoc' => 'Åzoang vom Inhoidsvazeichnis bei Seiten mid merer ois drei Ywerschriften',
 'tog-rememberpassword' => 'Mim Browser dauerhoft ågmödt bleim (maximaal $1 {{PLURAL:$1|Toog|Toog}})',
 'tog-watchcreations' => 'Voh mir söwer eihgstöde Seiten autómaatisch beówochten',
 'tog-watchdefault' => 'Voh mir söwer gänderde Seiten autómaatisch beówochten',
@@ -665,7 +662,6 @@ Details stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}
 'lineno' => 'Zein $1:',
 'compareselectedversions' => 'Ausgwejde Versiona vagleicha',
 'editundo' => 'zruck doa',
-'diff-multi' => '({{PLURAL:$1|A dazwischnliegade Version|$1 dazwiscenliegade Versiona}} {{PLURAL:$2|vonam Nutza|vo $2 Nutzan}} {{PLURAL:$1|wead|wean}} ned ozoagt)',
 
 # Search results
 'searchresults' => 'Suachergebniss',
@@ -1107,7 +1103,6 @@ Waunnst dé Seiten wieder voh deiner Beówochtungslisten weggerddoah mechst, dru
 'watchmethod-list' => 'Ywerpriaffm voh da Beówochtungslisten auf létzde Beorwatungen',
 'watchlistcontains' => 'Deih Beówochtungslisten enthoitt $1 {{PLURAL:$1|Seiten|Seiten}}.',
 'iteminvalidname' => 'Próblém mim Eihtrog „$1“, néd gütiger Naum.',
-'wlnote' => "Es {{PLURAL:$1|fóigt d' létzde Änderrung|fóing d' létzden '''$1''' Änderrungen}} voh da/dé {{PLURAL:$2|Stund| '''$2''' Stunden}}. Staund: $3, $4 Uar.",
 'wlshowlast' => 'Zoag dé Änderrungen voh dé létzden $1 Stunden, $2 Dog óder $3 (in dé létzden 30 Dog).',
 'watchlist-options' => 'Mei Beobochta: Optiona',
 
index f96bcd2..8077ba6 100644 (file)
@@ -143,7 +143,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => ':لینکانآ خط کش',
-'tog-justify' => 'پاراگرافنآ همتراز کن',
 'tog-hideminor' => 'هوردین تغییراتآ ته نوکین تغییرات پناه کن',
 'tog-hidepatrolled' => 'ته نوکین تغییرات اصلاحاتی که گردگ بیتگن پناه کن',
 'tog-newpageshidepatrolled' => 'پناه کتن صفحاتی که گردگ بوتگن چه لیست نوکین صفحه',
@@ -906,7 +905,6 @@ $1",
 'compareselectedversions' => 'مقایسه انتخاب بوتگین نسخه یان',
 'showhideselectedversions' => 'نمایش/پنهان کتن نسخ انتخابی',
 'editundo' => 'خنثی کتن',
-'diff-multi' => '({{PLURAL:$1|یک متوسطین بازبینیان میانی}} پیش دارگ نه بیت .)',
 
 # Search results
 'searchresults' => 'نتایج گردگ',
@@ -1702,7 +1700,6 @@ PICT # misc.
 'watchmethod-list' => 'کنترل صفحاتی که چارگ بنت په نوکین اصلاحات',
 'watchlistcontains' => 'شمی لیست چارگ شامل  $1 {{PLURAL:$1|صفحه|صفحات}}.',
 'iteminvalidname' => "مشکل گون آیتم  '$1', نامعتبر  این نام",
-'wlnote' => "جهلء {{PLURAL:$1|آهرین تغییر هست|آهرین هست'''$1''' تغییرات}} ته آهرین {{PLURAL:$2|ساعت|'''$2''' ساعات}}.",
 'wlshowlast' => 'پیش دار آهرین $1  ساعات $2 روچان $3',
 'watchlist-options' => 'گزینه یان لیست چارگ',
 
@@ -2240,7 +2237,6 @@ $1',
 'tooltip-pt-watchlist' => 'لیست صفحیانی که شما تغییرات آیانا رند گرگیت',
 'tooltip-pt-mycontris' => 'لیست شمی مشارکتان',
 'tooltip-pt-login' => 'شر ترنت که وارد بیت، بله شی اجبار نهنت',
-'tooltip-pt-anonlogin' => 'چه شما دست بندی بیت وارد بیت، بله شی هنگت ضرورت نهنت.',
 'tooltip-pt-logout' => 'در بیگ',
 'tooltip-ca-talk' => 'بحث دباره محتوای صفحه',
 'tooltip-ca-edit' => 'شما تونیت ای صفحه یا اصلاح کنیت. لطفا چه بازبین دکمه پیش چه ذخیره کتن استفاده کنیت.',
index 9696a73..dac65f5 100644 (file)
@@ -99,7 +99,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Linyahan an kilyawan:',
-'tog-justify' => 'Pantayón an mga talodtód',
 'tog-hideminor' => 'Tagóon an mga saradít na paghirá sa nakakaági pa sanáng pagbabàgo',
 'tog-hidepatrolled' => 'Tagóa an patrolyadong mga paghirá sa nakakaági pa sanáng pagbabàgo',
 'tog-newpageshidepatrolled' => 'Tagóa an patrolyadong mga pahina gikan sa listahan kan bàgong pahina',
@@ -1144,7 +1143,6 @@ Tandaan na an paggagamit kan nabigasyong nin mga kasurugponan makakapagliwat kai
 'showhideselectedversions' => 'Ihayag/itago mga piniling pagbabago',
 'editundo' => 'sulíton',
 'diff-empty' => '(Mayong kalaenan)',
-'diff-multi' => '({{PLURAL:$1|Saro intermediate na pagbabago|$1 mga intermediate na mga pagbabago}} by {{PLURAL:$2|sarong paragamit|$2 mga paragamit}} dae pinaghahayag)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Sarong intermediate na pagbabago|$1 mga intermediate na mga pagbabago}} na sobra sa $2 {{PLURAL:$2|paragamit|mga paragamit}} dae pinaghahayag)',
 'difference-missing-revision' => '{{PLURAL:$2|sarong rebisyon|$2 mga rebisyon}} kaining diperensiya ($1) {{PLURAL:$2|na iyo an|kaidto na iyo an}} dae nanagboan.
 
index 88947c8..0ac06c3 100644 (file)
@@ -93,7 +93,6 @@ $linkTrail = '/^([абвгґджзеёжзійклмнопрстуўфхцчшы
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Падкрэсліваць спасылкі:',
-'tog-justify' => 'Разганяць абзацы',
 'tog-hideminor' => 'Не паказваць дробных правак',
 'tog-hidepatrolled' => 'Без паказу ўхваленых правак у нядаўніх змяненнях',
 'tog-newpageshidepatrolled' => 'Без паказу ўхваленых правак у пераліку новых старонак',
@@ -1013,7 +1012,6 @@ $1",
 'compareselectedversions' => 'Параўнаць азначаныя версіі',
 'showhideselectedversions' => 'Паказаць/схаваць выбраныя версіі',
 'editundo' => 'адкат',
-'diff-multi' => '(не паказан{{PLURAL:$1|а адна прамежкавая версія|ы $1 прамежкавых версій}}, зроблен{{PLURAL:$2|ая ўдзельнікам|ыя $2 удзельнікамі}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|не паказана $1 прамежкавая версія|не паказаны $1 прамежкавыя версіі|не паказаны $1 прамежкавых версій}}, зробленыя больш чым {{PLURAL:$2|$1 удзельнікам|$2 удзельнікамі}})',
 
 # Search results
@@ -1952,7 +1950,6 @@ $1',
 'watchmethod-list' => 'правяраем наяўнасць нядаўніх правак ў назіраных старонках',
 'watchlistcontains' => 'У вашым спісе назірання $1 {{PLURAL:$1|старонка|старонкі|старонак}}.',
 'iteminvalidname' => "Праблема са складнікам '$1', недапушчальная назва...",
-'wlnote' => "Ніжэй {{PLURAL:$1|паказана апошняе $1 змена|паказаны апошнія $1 змены|паказаны апошнія $1 змен}} за {{PLURAL:$2|апошнюю|апошнія|апошнія}} '''$2''' {{PLURAL:$2|гадзіну|гадзіны|гадзіны}}, на момант часу $3 $4.",
 'wlshowlast' => 'Паказваць апошнія $1 гадз. $2 дзён $3',
 'watchlist-options' => 'Магчымасці назірання',
 
@@ -2564,7 +2561,6 @@ $1',
 'tooltip-pt-watchlist' => 'Пералік старонак, за змяненнямі ў якіх вы сочыце',
 'tooltip-pt-mycontris' => 'Пералік вашага ўкладу',
 'tooltip-pt-login' => 'Уваходзіць у сістэму неабавязкова, але вас вельмі запрашаюць гэтак зрабіць.',
-'tooltip-pt-anonlogin' => 'Вас запрашаюць уваходзіць у сістэму, хоць гэта і не абавязкова.',
 'tooltip-pt-logout' => 'Выйсці з сістэмы',
 'tooltip-ca-talk' => 'Размовы пра змест гэтай старонкі',
 'tooltip-ca-edit' => 'Старонку можна правіць; ужывайце папярэдні паказ перад замацоўваннем.',
index 948698b..845512a 100644 (file)
@@ -263,7 +263,6 @@ $imageFiles = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Падкрэсьліваць спасылкі:',
-'tog-justify' => 'Выраўноўваць тэкст па шырыні старонкі',
 'tog-hideminor' => 'Хаваць дробныя праўкі ў сьпісе апошніх зьменаў',
 'tog-hidepatrolled' => 'Хаваць патруляваныя праўкі ў сьпісе апошніх зьменаў',
 'tog-newpageshidepatrolled' => 'Хаваць патруляваныя старонкі ў сьпісе новых старонак',
@@ -278,7 +277,7 @@ $messages = array(
 'tog-watchdefault' => 'Дадаваць у мой сьпіс назіраньня старонкі і файлы, якія я {{GENDER:|рэдагаваў|рэдагавала}}',
 'tog-watchmoves' => 'Дадаваць у мой сьпіс назіраньня перанесеныя мною старонкі і файлы',
 'tog-watchdeletion' => 'Дадаваць у мой сьпіс назіраньня старонкі і файлы, якія я выдаляю',
-'tog-minordefault' => 'Ð\9fа Ð·Ð¼Ð¾Ñ\9eÑ\87анÑ\8cнÑ\96 Ð¿Ð°Ð·Ð½Ð°Ñ\87аÑ\86Ñ\8c Ñ\83Ñ\81е Ð·Ñ\8cменÑ\8b дробнымі',
+'tog-minordefault' => 'Ð\9fа Ð·Ð¼Ð¾Ñ\9eÑ\87анÑ\8cнÑ\96 Ð¿Ð°Ð·Ð½Ð°Ñ\87аÑ\86Ñ\8c Ñ\83Ñ\81е Ð¼Ð°Ðµ Ð¿Ñ\80аÑ\9eкÑ\96 дробнымі',
 'tog-previewontop' => 'Паказваць папярэдні прагляд старонкі над полем рэдагаваньня',
 'tog-previewonfirst' => 'Папярэдні прагляд пры першым рэдагаваньні',
 'tog-enotifwatchlistpages' => 'Паведамляць мне праз электронную пошту пра зьмены старонак і файлаў у маім сьпісе назіраньня',
@@ -287,7 +286,7 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Не хаваць мой адрас электроннай пошты ў паведамленьнях',
 'tog-shownumberswatching' => 'Паказваць колькасьць назіральнікаў',
 'tog-oldsig' => 'Цяперашні подпіс:',
-'tog-fancysig' => 'Апрацоўваць подпіс як вікі-тэкст (без аўтаматычнай спасылкі)',
+'tog-fancysig' => 'Апрацоўваць подпіс як вікітэкст (без аўтаматычнай спасылкі)',
 'tog-uselivepreview' => 'Выкарыстоўваць хуткі папярэдні прагляд (экспэрымэнтальна)',
 'tog-forceeditsummary' => 'Папярэджваць пра адсутнасьць кароткага апісаньня зьменаў',
 'tog-watchlisthideown' => 'Хаваць мае праўкі ў сьпісе назіраньня',
@@ -296,7 +295,7 @@ $messages = array(
 'tog-watchlisthideliu' => 'Хаваць праўкі зарэгістраваных удзельнікаў у сьпісе назіраньня',
 'tog-watchlisthideanons' => 'Хаваць праўкі ананімаў у сьпісе назіраньня',
 'tog-watchlisthidepatrolled' => 'Хаваць патруляваныя праўкі ў сьпісе назіраньня',
-'tog-ccmeonemails' => 'Ð\94аÑ\81Ñ\8bлаць мне копіі лістоў, якія я дасылаю іншым удзельнікам',
+'tog-ccmeonemails' => 'Ð\90дпÑ\80аÑ\9eлÑ\8fць мне копіі лістоў, якія я дасылаю іншым удзельнікам',
 'tog-diffonly' => 'Не паказваць зьмест старонкі пад параўнаньнем зьменаў',
 'tog-showhiddencats' => 'Паказваць схаваныя катэгорыі',
 'tog-noconvertlink' => 'Забараніць канвэртацыю назваў спасылак',
@@ -389,9 +388,9 @@ $messages = array(
 'hidden-category-category' => 'Схаваныя катэгорыі',
 'category-subcat-count' => '{{PLURAL:$2|Гэтая катэгорыя зьмяшчае наступную падкатэгорыю.|Гэтая катэгорыя зьмяшчае {{PLURAL:$1|наступную $1 падкатэгорыю|наступныя $1 падкатэгорыі|наступныя $1 падкатэгорыяў}} з $2 агулам.}}',
 'category-subcat-count-limited' => 'У гэтай катэгорыі $1 {{PLURAL:$1|падкатэгорыя|падкатэгорыі|падкатэгорыяў}}.',
-'category-article-count' => '{{PLURAL:$2|Гэтая катэгорыя ўтрымлівае толькі адну старонку.|{{PLURAL:$1|Паказаная $1 старонка|Паказаныя $1 старонкі|Паказаныя $1 старонак}} гэтай катэгорыі з $2.}}',
+'category-article-count' => '{{PLURAL:$2|1=Гэтая катэгорыя ўтрымлівае толькі адну старонку.|{{PLURAL:$1|Паказаная $1 старонка|Паказаныя $1 старонкі|Паказаныя $1 старонак}} гэтай катэгорыі з $2.}}',
 'category-article-count-limited' => 'У гэтай катэгорыі $1 {{PLURAL:$1|старонка|старонкі|старонак}}.',
-'category-file-count' => '{{PLURAL:$2|Гэтая катэгорыя ўтрымлівае толькі адзін файл.|{{PLURAL:$1|Паказаны $1 файл|Паказаныя $1 файлы|Паказаныя $1 файлаў}} гэтай катэгорыі з $2.}}',
+'category-file-count' => '{{PLURAL:$2|1=Гэтая катэгорыя ўтрымлівае толькі адзін файл.|{{PLURAL:$1|Паказаны $1 файл|Паказаныя $1 файлы|Паказаныя $1 файлаў}} гэтай катэгорыі з $2.}}',
 'category-file-count-limited' => 'У гэтай катэгорыі $1 {{PLURAL:$1|файл|файлы|файлаў}}.',
 'listingcontinuesabbrev' => ' (працяг)',
 'index-category' => 'Індэксаваныя старонкі',
@@ -426,7 +425,6 @@ $messages = array(
 'vector-action-protect' => 'Абараніць',
 'vector-action-undelete' => 'Аднавіць',
 'vector-action-unprotect' => 'Зьмяніць абарону',
-'vector-simplesearch-preference' => 'Уключыць спрошчанае поле пошуку (толькі для афармленьня «Вэктар»)',
 'vector-view-create' => 'Стварыць',
 'vector-view-edit' => 'Рэдагаваць',
 'vector-view-history' => 'Паказаць гісторыю',
@@ -817,7 +815,7 @@ $2',
 'oldpassword' => 'Стары пароль:',
 'newpassword' => 'Новы пароль:',
 'retypenew' => 'Паўтарыце новы пароль:',
-'resetpass_submit' => 'Ð\9dаÑ\81Ñ\82авÑ\96Ñ\86Ñ\8c Ð¿Ð°Ñ\80олÑ\8c Ñ\96 Ñ\83вайсьці',
+'resetpass_submit' => 'Ð\97аÑ\85аваÑ\86Ñ\8c Ð¿Ð°Ñ\80олÑ\8c Ñ\96 Ñ\9eвайсьці',
 'changepassword-success' => 'Ваш пароль быў пасьпяхова зьменены!',
 'changepassword-throttled' => 'Вы зрабілі зашмат спробаў увайсьці ў сыстэму.
 Калі ласка, пачакайце $1 перад наступнай спробай.',
@@ -1088,7 +1086,7 @@ $2
 'invalid-content-data' => 'Няслушныя зьвесткі',
 'content-not-allowed-here' => 'Зьмест тыпу «$1» на старонцы [[$2]] не дазволены',
 'editwarning-warning' => 'Пакінуўшы гэтую старонку, вы можаце страціць усе ўнесеныя зьмены.
-Калі вы ўвайшлі ў сыстэму, Вы можаце адключыць гэтае папярэджаньне ў сэкцыі «Рэдагаваньне» вашых наладаў.',
+Калі вы ўвайшлі ў сыстэму, Вы можаце адключыць гэтае папярэджаньне ў сэкцыі «{{int:prefs-editing}}» вашых наладаў.',
 'editpage-notsupportedcontentformat-title' => 'Фармат зьмесьціва не падтрымліваецца',
 'editpage-notsupportedcontentformat-text' => 'Фармат зьмесьціва $1 не падтрымліваецца мадэльлю зьмесьціва $2.',
 
@@ -1124,6 +1122,7 @@ $2
 'undo-success' => 'Рэдагаваньне можа быць адмененае. Калі ласка, параўнайце адрозьненьні паміж вэрсіямі, каб упэўніцца, што гэта адпаведныя зьмены, а потым запішыце зьмены для сканчэньня рэдагаваньня.',
 'undo-failure' => 'Рэдагаваньне ня можа быць скасаванае праз канфлікт паміж папярэднімі рэдагаваньнямі.',
 'undo-norev' => 'Рэдагаваньне ня можа быць адмененае, таму што яно не існуе альбо было выдаленае.',
+'undo-nochange' => 'Выглядае, што праўка ўжо была адмененая.',
 'undo-summary' => 'Скасаваньне праўкі $1 {{GENDER:$2|удзельніка|удзельніцы}} [[Special:Contributions/$2|$2]] ([[User talk:$2|гутаркі]])',
 'undo-summary-username-hidden' => 'Вэрсія $1 скасаваная схаваным удзельнікам',
 
@@ -1305,7 +1304,8 @@ $1",
 'showhideselectedversions' => 'Паказаць/схаваць вызначаныя вэрсіі',
 'editundo' => 'скасаваць',
 'diff-empty' => '(Розьніцы няма)',
-'diff-multi' => '($1 {{PLURAL:$1|прамежная вэрсія|прамежныя вэрсіі|прамежных вэрсіяў}} $2 {{PLURAL:$2|удзельніка|удзельнікаў|удзельнікаў}} {{PLURAL:$1|не паказаная|не паказаныя|не паказаныя}})',
+'diff-multi-sameuser' => '(не {{PLURAL:$1|паказаная $1 прамежная вэрсія|паказаныя $1 прамежныя вэрсіі|паказаныя $1 прамежных вэрсіяў}} аўтарства таго ж удзельніка)',
+'diff-multi-otherusers' => '(не {{PLURAL:$1|паказаная $1 прамежная вэрсія|паказаныя $1 прамежныя вэрсіі|паказаныя $1 прамежных вэрсіяў}} аўтарства {{PLURAL:$2|1=яшчэ аднаго ўдзельніка|$2 удзельнікаў}})',
 'diff-multi-manyusers' => '($1 {{PLURAL:$1|прамежная вэрсія|прамежныя вэрсіі|прамежных вэрсіяў}} $2 {{PLURAL:$2|удзельніка|удзельнікаў|удзельнікаў}} {{PLURAL:$1|не паказаная|не паказаныя|не паказаныя}})',
 'difference-missing-revision' => '{{PLURAL:$2|$2 вэрсія|$2 вэрсіі|$2 вэрсіяў}} з гэтымі адрозьненьнямі ($1) {{PLURAL:$2|не была|не былі}} знойдзеныя.
 
@@ -1326,7 +1326,7 @@ $1",
 'shown-title' => 'Паказваць $1 {{PLURAL:$1|вынік|вынікі|вынікаў}} на старонцы',
 'viewprevnext' => 'Паказаць ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "* Старонка '''[[$1]]'''",
-'searchmenu-new' => "'''Стварыць старонку «[[:$1|$1]]» у {{GRAMMAR:месны|{{SITENAME}}}}!'''",
+'searchmenu-new' => '<strong>Стварыць старонку «[[:$1]]» у {{GRAMMAR:месны|{{SITENAME}}}}!</strong> {{PLURAL:$2|0=|Глядзіце таксама старонку, знойдзеную ў выніку пошуку.|Глядзіце таксама вынікі пошуку.}}',
 'searchprofile-articles' => 'Старонкі са зьместам',
 'searchprofile-project' => 'Старонкі дапамогі і праекту',
 'searchprofile-images' => 'Мультымэдыя',
@@ -1352,6 +1352,7 @@ $1",
 'searchrelated' => 'зьвязаны',
 'searchall' => 'усе',
 'showingresults' => "Ніжэй {{PLURAL:$1|паданы|паданыя|паданыя}} да '''$1''' {{PLURAL:$1|выніку|вынікаў|вынікаў}}, пачынаючы з #<b>$2</b>.",
+'showingresultsinrange' => 'Ніжэй паказаныя да {{PLURAL:$1|<strong>$1</strong> выніку ў|<strong>$1</strong> вынікаў у}} дыяпазоне ад <strong>$2</strong> да <strong>$3</strong>.',
 'showingresultsnum' => "Ніжэй паказаны сьпіс з '''$3''' {{PLURAL:$3|выніка|вынікаў|вынікаў}}, пачынаючы ад № '''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|1=Вынік '''$1''' з '''$3'''|Вынікі '''$1—$2''' з '''$3'''}} для '''$4'''",
 'search-nonefound' => 'Супадзеньняў па запыце ня знойдзена.',
@@ -1481,6 +1482,7 @@ $1",
 'prefs-tokenwatchlist' => 'Токен',
 'prefs-diffs' => 'Розьніцы вэрсіяў',
 'prefs-help-prefershttps' => 'Гэтая налада набудзе моц пры наступным уваходзе ў сыстэму.',
+'prefs-tabs-navigation-hint' => 'Падказка: вы можаце пераходзіць паміж укладкамі ў сьпісе ўкладак з дапамогай клявішаў налева і направа.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Выглядае слушна',
@@ -1748,8 +1750,8 @@ $1",
 'filetype-bad-ie-mime' => 'Немагчыма загрузіць гэты файл, таму што Internet Explorer вызначыў яго як «$1», што азначае, што тып гэтага файла забаронены і патэнцыяльна небясьпечны.',
 'filetype-unwanted-type' => '<strong>«.$1»</strong> — непажаданы тып файла.
 {{PLURAL:$3|1=Пажаданым тыпам файла зьяўляецца|Пажаданымі тыпамі файлаў зьяўляюцца:}} $2.',
-'filetype-banned-type' => "'''«.$1»''' — {{PLURAL:$4|1=забаронены тып файлаў|забароненыя тыпы файлаў}}.
-{{PLURAL:$3|1=Дазволены тып файлаў|Дазволеныя тыпы файлаў}}: $2.",
+'filetype-banned-type' => '<strong>«.$1»</strong> — {{PLURAL:$4|1=забаронены тып файлаў|забароненыя тыпы файлаў}}.
+{{PLURAL:$3|1=Дазволены тып файлаў|Дазволеныя тыпы файлаў}}: $2.',
 'filetype-missing' => 'Файл ня мае пашырэньня (напрыклад, «.jpg»).',
 'empty-file' => 'Дасланы Вамі файл пусты.',
 'file-too-large' => 'Дасланы Вамі файл занадта вялікі.',
@@ -1789,6 +1791,8 @@ $1",
 Калі Вы жадаеце загрузіць Ваш файл, вярніцеся назад і загрузіце гэты файл з новай назвай. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Гэты файл дублюе {{PLURAL:$1|1=наступны файл|наступныя файлы}}:',
 'file-deleted-duplicate' => 'Падобны файл ([[:$1]]) ужо выдаляўся. Калі ласка, паглядзіце гісторыю выдаленьняў гэтага файла перад яго паўторнай загрузкай.',
+'file-deleted-duplicate-notitle' => 'Файл, ідэнтычны гэтаму файлу, раней ужо быў выдалены, а назва файла была забароненая.
+Вам трэба зьвярнуцца да некага з правамі прагляду зьвестак забароненых файлаў, каб прааналізаваць сытуацыю перад тым, як загружаць файл ізноў.',
 'uploadwarning' => 'Папярэджаньне',
 'uploadwarning-text' => 'Калі ласка, зьмяніце апісаньне файла ніжэй і паспрабуйце ізноў.',
 'savefile' => 'Захаваць файл',
@@ -2159,7 +2163,15 @@ $1',
 'protectedpages' => 'Абароненыя старонкі',
 'protectedpages-indef' => 'Толькі бестэрміновыя абароны',
 'protectedpages-cascade' => 'Толькі каскадныя абароны',
+'protectedpages-noredirect' => 'Схаваць перанакіраваньні',
 'protectedpagesempty' => 'Цяпер няма абароненых старонак з пазначанымі парамэтрамі.',
+'protectedpages-timestamp' => 'Дата і час',
+'protectedpages-page' => 'Старонка',
+'protectedpages-expiry' => 'Сканчаецца',
+'protectedpages-performer' => 'Хто абараніў',
+'protectedpages-params' => 'Парамэтры абароны',
+'protectedpages-reason' => 'Прычына',
+'protectedpages-unknown-timestamp' => 'Невядома',
 'protectedtitles' => 'Забароненыя старонкі',
 'protectedtitlesempty' => 'Цяпер няма абароненых назваў з пазначанымі парамэтрамі.',
 'listusers' => 'Сьпіс удзельнікаў і ўдзельніц',
@@ -2226,7 +2238,7 @@ $1',
 
 # Special:Categories
 'categories' => 'Катэгорыі',
-'categoriespagetext' => '{{PLURAL:$1|1=Наступная катэгорыя зьмяшчае|Наступныя катэгорыі зьмяшчаюць}} старонкі і/альбо мэдыяфайлы.
+'categoriespagetext' => '{{PLURAL:$1|1=Наступная катэгорыя зьмяшчае|Наступныя катэгорыі зьмяшчаюць}} старонкі альбо мэдыяфайлы.
 Тут не паказаныя [[Special:UnusedCategories|катэгорыі, якія не выкарыстоўваюцца]].
 Глядзіце таксама [[Special:WantedCategories|сьпіс запатрабаваных катэгорыяў]].',
 'categoriesfrom' => 'Паказаць катэгорыі, пачынаючы з:',
@@ -2243,7 +2255,7 @@ $1',
 'linksearch-pat' => 'Узор для пошуку:',
 'linksearch-ns' => 'Прастора назваў:',
 'linksearch-ok' => 'Шукаць',
-'linksearch-text' => 'Можна ўжываць сымбалі падстаноўкі, напрыклад, «*.wikipedia.org».<br />
+'linksearch-text' => 'Можна ўжываць сымбалі падстаноўкі, напрыклад, «*.wikipedia.org».
 Неабходны дамэн першага ўзроўню, напрыклад, «*.org».<br />
 {{PLURAL:$2|1=Пратакол, які падтрымліваецца|Пратаколы, якія падтрымліваюцца}}: <code>$1</code> (дапомна http://, калі пратакол не пазначаны).',
 'linksearch-line' => 'Спасылка на $1 з $2',
@@ -2275,12 +2287,12 @@ $1',
 'listgrouprights-rights' => 'Правы',
 'listgrouprights-helppage' => 'Help:Правы групаў удзельнікаў',
 'listgrouprights-members' => '(сьпіс удзельнікаў групы)',
-'listgrouprights-addgroup' => 'можа дадаваць {{PLURAL:$2|1=групу|групы}}: $1',
-'listgrouprights-removegroup' => 'можа выдаляць {{PLURAL:$2|1=групу|групы}}: $1',
+'listgrouprights-addgroup' => 'можа дадаваць у {{PLURAL:$2|1=групу|групы}}: $1',
+'listgrouprights-removegroup' => 'можа выдаляць з {{PLURAL:$2|1=групы|групаў}}: $1',
 'listgrouprights-addgroup-all' => 'можа дадаваць усе групы',
 'listgrouprights-removegroup-all' => 'можа выдаляць усе групы',
-'listgrouprights-addgroup-self' => 'Ð\9cожа дадаць уласны рахунак да {{PLURAL:$2|1=групы|групаў}}: $1',
-'listgrouprights-removegroup-self' => 'Ð\9cожа выдаліць уласны рахунак з {{PLURAL:$2|1=групы|групаў}}: $1',
+'listgrouprights-addgroup-self' => 'можа дадаць уласны рахунак да {{PLURAL:$2|1=групы|групаў}}: $1',
+'listgrouprights-removegroup-self' => 'можа выдаліць уласны рахунак з {{PLURAL:$2|1=групы|групаў}}: $1',
 'listgrouprights-addgroup-self-all' => 'Можа дадаць уласны рахунак да ўсіх груп',
 'listgrouprights-removegroup-self-all' => 'Можа выдаліць уласны рахунак з ўсіх груп',
 
@@ -2347,6 +2359,7 @@ $1',
 'watchmethod-list' => 'прагляд старонак са сьпісу назіраньня дзеля апошніх зьменах',
 'watchlistcontains' => 'Ваш сьпіс назіраньня зьмяшчае $1 {{PLURAL:$1|старонка|старонкі|старонак}}.',
 'iteminvalidname' => 'Праблема з элемэнтам «$1», няслушная назва…',
+'wlnote2' => 'Ніжэй паказаныя зьмены за {{PLURAL:$1|<strong>$1</strong> гадзіну|<strong>$1</strong> гадзіны|<strong>$1</strong> гадзінаў}} на $3 $2.',
 'wlshowlast' => 'Паказаць: за апошнія $1 гадзінаў, $2 дзён, $3',
 'watchlist-options' => 'Налады сьпісу назіраньня',
 
@@ -2378,10 +2391,10 @@ $PAGEINTRO $NEWPAGE
 Апісаньне зьменаў: $PAGESUMMARY $PAGEMINOREDIT
 
 Зьвязацца з рэдактарам:
-па электроннай пошце: $PAGEEDITOR_EMAIL
+праз электронную пошту: $PAGEEDITOR_EMAIL
 празь вікі-старонку: $PAGEEDITOR_WIKI
 
\9fаведамленÑ\8cнÑ\96 Ð½Ñ\8f Ð±Ñ\83дÑ\83Ñ\86Ñ\8c Ð´Ð°Ñ\81Ñ\8bлаÑ\86Ñ\86а Ñ\9e Ð²Ñ\8bпадкÑ\83 Ð¿Ð°Ñ\9eÑ\82оÑ\80нÑ\8bÑ\85 Ñ\80Ñ\8dдагаванÑ\8cнÑ\8fÑ\9e, Ð¿Ð°ÐºÑ\83лÑ\8c Ð\92Ñ\8b Ð½Ðµ Ð½Ð°Ð²ÐµÐ´Ð°ÐµÑ\86е Ð³Ñ\8dÑ\82Ñ\83Ñ\8e Ñ\81Ñ\82аÑ\80онкÑ\83. Ð\92Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е Ð¿Ð°Ð·Ð½Ð°Ñ\87Ñ\8bÑ\86Ñ\8c Ñ\81Ñ\8cÑ\86Ñ\8fжкÑ\96 Ð´Ð°Ñ\81Ñ\8bлкÑ\96 Ð¿Ð°Ð²ÐµÐ´Ð°Ð¼Ð»ÐµÐ½Ñ\8cнÑ\8fÑ\9e Ð´Ð»Ñ\8f Ñ\9eÑ\81Ñ\96Ñ\85 Ñ\81Ñ\82аÑ\80онкаÑ\85 Ð½Ð°Ð·Ñ\96Ñ\80анÑ\8cнÑ\8f Вашага сьпісу назіраньня.
\9fаведамленÑ\8cнÑ\96 Ð½Ñ\8f Ð±Ñ\83дÑ\83Ñ\86Ñ\8c Ð´Ð°Ñ\81Ñ\8bлаÑ\86Ñ\86а Ñ\9e Ð²Ñ\8bпадкÑ\83 Ð½Ð¾Ð²Ñ\8bÑ\85 Ð´Ð·ÐµÑ\8fнÑ\8cнÑ\8fÑ\9e, Ð¿Ð°ÐºÑ\83лÑ\8c Ð\92Ñ\8b Ð½Ðµ Ð½Ð°Ð²ÐµÐ´Ð°ÐµÑ\86е Ð³Ñ\8dÑ\82Ñ\83Ñ\8e Ñ\81Ñ\82аÑ\80онкÑ\83 Ð¿Ð° Ñ\9eваÑ\85одзе Ñ\9e Ñ\81Ñ\8bÑ\81Ñ\82Ñ\8dмÑ\83. Ð\92Ñ\8b Ñ\82акÑ\81ама Ð¼Ð¾Ð¶Ð°Ñ\86е Ð°Ð´ÐºÐ»Ñ\8eÑ\87Ñ\8bÑ\86Ñ\8c Ð¿Ð°Ð²ÐµÐ´Ð°Ð¼Ð»ÐµÐ½Ñ\8cнÑ\96 Ð¿Ñ\80а Ð·Ñ\8cменÑ\8b Ð´Ð»Ñ\8f Ñ\9eÑ\81Ñ\96Ñ\85 Ñ\81Ñ\82аÑ\80онак Ð· Вашага сьпісу назіраньня.
 
              Сыстэма паведамленьняў {{GRAMMAR:родны|{{SITENAME}}}}
 
@@ -2434,7 +2447,7 @@ $UNWATCHURL
 Выдаленьне такіх старонак было забароненае, каб пазьбегнуць праблемаў у працы {{GRAMMAR:родны|{{SITENAME}}}}.',
 'delete-warning-toobig' => 'Гэтая старонка мае доўгую гісторыю рэдагаваньняў, больш за $1 {{PLURAL:$1|вэрсію|вэрсіі|вэрсіяў}}.
 Яе выдаленьне можа выклікаць праблемы ў працы базы зьвестак {{GRAMMAR:родны|{{SITENAME}}}}; будзьце асьцярожны.',
-'deleting-backlinks-warning' => "'''Увага:''' іншыя старонкі спасылаюцца на старонку, якую вы зьбіраецеся выдаліць.",
+'deleting-backlinks-warning' => "'''Увага:''' Ñ\96нÑ\88Ñ\8bÑ\8f Ñ\81Ñ\82аÑ\80онкÑ\96 Ñ\9eклÑ\8eÑ\87аÑ\8eÑ\86Ñ\8c Ð°Ð±Ð¾ Ñ\81паÑ\81Ñ\8bлаÑ\8eÑ\86Ñ\86а Ð½Ð° Ñ\81Ñ\82аÑ\80онкÑ\83, Ñ\8fкÑ\83Ñ\8e Ð²Ñ\8b Ð·Ñ\8cбÑ\96Ñ\80аеÑ\86еÑ\81Ñ\8f Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c.",
 
 # Rollback
 'rollback' => 'Адкаціць рэдагаваньні',
@@ -2533,7 +2546,7 @@ $UNWATCHURL
 'undeletepage' => 'Прагляд і аднаўленьне выдаленых старонак',
 'undeletepagetitle' => "'''Ніжэй паданыя выдаленыя вэрсіі [[:$1|$1]]'''.",
 'viewdeletedpage' => 'Паказаць выдаленыя старонкі',
-'undeletepagetext' => '{{PLURAL:$1|1=Ð\9dаÑ\81Ñ\82Ñ\83пнаÑ\8f Ñ\81Ñ\82аÑ\80онка Ð±Ñ\8bла Ð²Ñ\8bдаленаÑ\8f, Ð°Ð»Ðµ Ñ\8fна Ð·Ð½Ð°Ñ\85одзÑ\8fцца ў архіве і можа быць адноўленая|Наступныя старонкі былі выдаленыя, але яны знаходзяцца ў архіве і могуць быць адноўленыя}}.
+'undeletepagetext' => '{{PLURAL:$1|1=Ð\9dаÑ\81Ñ\82Ñ\83пнаÑ\8f Ñ\81Ñ\82аÑ\80онка Ð±Ñ\8bла Ð²Ñ\8bдаленаÑ\8f, Ð°Ð»Ðµ Ñ\8fна Ð·Ð½Ð°Ñ\85одзÑ\96цца ў архіве і можа быць адноўленая|Наступныя старонкі былі выдаленыя, але яны знаходзяцца ў архіве і могуць быць адноўленыя}}.
 Архіў пэрыядычна чысьціцца.',
 'undelete-fieldset-title' => 'Аднавіць вэрсіі',
 'undeleteextrahelp' => "Для поўнага аднаўленьня гісторыі рэдагаваньня старонкі, пакіньце ўсе адзнакі нявызначнымі і націсьніце '''''{{int:undeletebtn}}'''''.
@@ -2672,6 +2685,7 @@ $1',
 Глядзіце [[Special:BlockList|сьпіс блякаваньняў]] дзеля іх перагляду.',
 'ipb-blockingself' => 'Вы зьбіраецеся заблякаваць самога сябе! Вы ўпэўнены, што жадаеце гэта зрабіць?',
 'ipb-confirmhideuser' => 'Вы зьбіраецеся заблякаваць удзельніка са статусам «схаваны». Гэтае дзеяньне прывядзе да таго, што яго імя зьявіцца ва ўсіх сьпісах і журналах уваходу. Вы ўпэўнены, што жадаеце гэта зрабіць?',
+'ipb-confirmaction' => 'Калі вы ўпэўненыя, што сапраўды хочаце зрабіць гэта, калі ласка, адзначце поле «{{int:ipb-confirm}}» ніжэй.',
 'ipb-edit-dropdown' => 'Рэдагаваць прычыны блякіровак',
 'ipb-unblock-addr' => 'Разблякаваць $1',
 'ipb-unblock' => 'Разблякаваць рахунак ўдзельніка ці IP-адрас',
@@ -2713,7 +2727,8 @@ $1',
 'change-blocklink' => 'зьмяніць блякаваньне',
 'contribslink' => 'унёсак',
 'emaillink' => 'даслаць ліст',
-'autoblocker' => "Вы аўтаматычна заблякаваныя, таму што Ваш IP-адрас нядаўна ўжываўся «[[User:$1|$1]]». Прычына блякаваньня $1 наступная: «'''$2'''»",
+'autoblocker' => 'Вы аўтаматычна заблякаваныя, таму што Ваш IP-адрас нядаўна ўжываўся «[[User:$1|$1]]».
+Прычына блякаваньня $1 наступная: «$2»',
 'blocklogpage' => 'Журнал блякаваньняў',
 'blocklog-showlog' => 'Гэты ўдзельнік ужо заблякаваны. Журнал блякаваньняў пададзены ніжэй:',
 'blocklog-showsuppresslog' => 'Гэты ўдзельнік ужо заблякаваны і схаваны. Журнал хаваньняў пададзены ніжэй:',
@@ -2733,7 +2748,7 @@ $1',
 'range_block_disabled' => 'Адміністратарам забаронена блякаваць дыяпазоны.',
 'ipb_expiry_invalid' => 'Няслушны тэрмін блякаваньня.',
 'ipb_expiry_temp' => 'Блякаваньні са схаваньнем імя ўдзельніка павінны быць бестэрміновымі.',
-'ipb_hide_invalid' => 'Ð\9dемагÑ\87Ñ\8bма Ñ\81Ñ\85аваÑ\86Ñ\8c Ð³Ñ\8dÑ\82Ñ\8b Ñ\80аÑ\85Ñ\83нак; Ð²ÐµÑ\80агодна Ð·Ñ\8c Ñ\8fго Ð·Ñ\80облена Ð·Ð°Ñ\88маÑ\82 Ñ\80Ñ\8dдагаванÑ\8cнÑ\8fÑ\9e.',
+'ipb_hide_invalid' => 'Ð\9dемагÑ\87Ñ\8bма Ñ\81Ñ\85аваÑ\86Ñ\8c Ð³Ñ\8dÑ\82Ñ\8b Ñ\80аÑ\85Ñ\83нак; Ð·Ñ\8c Ñ\8fго Ð·Ñ\80облена Ð±Ð¾Ð»Ñ\8cÑ\88 Ñ\87Ñ\8bм {{PLURAL:$1|$1 Ñ\80Ñ\8dдагаванÑ\8cне|$1 Ñ\80Ñ\8dдагаванÑ\8cнÑ\96|$1 Ñ\80Ñ\8dдагаванÑ\8cнÑ\8fÑ\9e}}.',
 'ipb_already_blocked' => '«$1» ужо заблякаваны',
 'ipb-needreblock' => '$1 ужо заблякаваны. Вы жадаеце зьмяніць парамэтры?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|1=Іншае блякаваньне|Іншыя блякаваньні}}',
@@ -2904,6 +2919,7 @@ $1',
 'allmessages-prefix' => 'Фільтар па прэфіксе:',
 'allmessages-language' => 'Мова:',
 'allmessages-filter-submit' => 'Паказаць',
+'allmessages-filter-translate' => 'Перакласьці',
 
 # Thumbnails
 'thumbnail-more' => 'Павялічыць',
@@ -2958,7 +2974,7 @@ $2',
 Не стае часовай дырэкторыі.',
 'import-parse-failure' => 'Памылка разбору XML пры імпартаваньні',
 'import-noarticle' => 'Няма старонкі для імпартаваньня!',
-'import-nonewrevisions' => 'УÑ\81е Ð²Ñ\8dÑ\80Ñ\81Ñ\96Ñ\96 Ð±Ñ\8bлÑ\96 Ñ\96мпаÑ\80Ñ\82аванÑ\8bÑ\8f Ñ\80аней.',
+'import-nonewrevisions' => 'Ð\9dÑ\96Ñ\8fкÑ\96Ñ\8f Ð¿Ñ\80аÑ\9eкÑ\96 Ð½Ðµ Ð±Ñ\8bлÑ\96 Ñ\96мпаÑ\80Ñ\82аванÑ\8bÑ\8f (Ñ\83Ñ\81е Ñ\9eжо Ð°Ð±Ð¾ Ð±Ñ\8bлÑ\96 Ð°Ð¿Ñ\80аÑ\86аванÑ\8bÑ\8f, Ð°Ð±Ð¾ Ð¿Ñ\80апÑ\83Ñ\88Ñ\87анÑ\8bÑ\8f Ð¿Ñ\80аз Ð¿Ð°Ð¼Ñ\8bлкÑ\96).',
 'xml-error-string' => '$1 у радку $2, пазыцыі $3 (байт $4): $5',
 'import-upload' => 'Загрузіць XML-зьвесткі',
 'import-token-mismatch' => 'Страчаныя зьвесткі сэсіі. Калі ласка, паспрабуйце ізноў.',
@@ -3107,7 +3123,7 @@ $2',
 'pageinfo-robot-noindex' => 'Не дазволеная',
 'pageinfo-views' => 'Колькасьць праглядаў',
 'pageinfo-watchers' => 'Колькасьць назіральнікаў і назіральніц',
-'pageinfo-few-watchers' => 'Менш за $1 {{PLURAL:$1|1=назіральніка|назіральнікаў}}',
+'pageinfo-few-watchers' => 'Менш за $1 {{PLURAL:$1|назіральніка|назіральнікі|назіральнікаў}}',
 'pageinfo-redirects-name' => 'Перанакіраваньняў на гэтую старонку',
 'pageinfo-subpages-name' => 'Колькасьць падстаронак',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|перанакіраваньне|перанакіраваньні|перанакіраваньняў}}; $3 {{PLURAL:$3|звычайная|звычайныя|звычайных}})',
@@ -4125,5 +4141,5 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'expand_templates_preview' => 'Папярэдні прагляд',
 
 # Unknown messages
-'createaccount-hook-aborted' => '$1',
+'uploadinvalidxml' => 'Не атрымалася прааналізаваць XML у загружаным файле.',
 );
index 851729d..e8e3dec 100644 (file)
@@ -243,7 +243,6 @@ $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Подчертаване на препратките:',
-'tog-justify' => 'Двустранно подравняване на абзаците',
 'tog-hideminor' => 'Скриване на малки редакции в последните промени',
 'tog-hidepatrolled' => 'Скриване на патрулираните редакции от списъка с последните промени',
 'tog-newpageshidepatrolled' => 'Скриване на патрулираните редакции от списъка на новите страници',
@@ -1242,7 +1241,6 @@ $1",
 'showhideselectedversions' => 'Показване/скриване на избрани версии',
 'editundo' => 'връщане',
 'diff-empty' => '(Няма разлика)',
-'diff-multi' => '({{PLURAL:$1|Не е показана една междинна версия|Не са показани $1 междинни версии}} от {{PLURAL:$2|един потребител|$2 потребителя}}.)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Не е показана една междинна версия|Не са показани $1 междинни версии}} от повече от $2 {{PLURAL:$2|потребител|потребителя}})',
 'difference-missing-revision' => '{{PLURAL:$2|Не беше открита|Не бяха открити}} {{PLURAL:$2|една версия|$2 версии}} от тази разликова препратка ($1).
 
@@ -2185,7 +2183,6 @@ $1',
 'watchmethod-list' => 'проверка на наблюдаваните страници за скорошни редакции',
 'watchlistcontains' => 'Списъкът ви за наблюдение съдържа {{PLURAL:$1|една страница|$1 страници}}.',
 'iteminvalidname' => 'Проблем с „$1“, грешно име…',
-'wlnote' => "{{PLURAL:$1|Показана е последната промяна|Показани са последните '''$1''' промени}} през {{PLURAL:$2|последния час|последните '''$2''' часа}}.",
 'wlshowlast' => 'Показване на последните $1 часа $2 дни $3',
 'watchlist-options' => 'Опции на списъка за наблюдение',
 
@@ -2802,7 +2799,6 @@ $2',
 'tooltip-pt-watchlist' => 'Списък на страници, чиито промени сте избрали да наблюдавате',
 'tooltip-pt-mycontris' => 'Списък на вашите приноси',
 'tooltip-pt-login' => 'Насърчаваме ви да влезете, въпреки че не е задължително.',
-'tooltip-pt-anonlogin' => 'Насърчаваме ви да влезете, въпреки че не е задължително.',
 'tooltip-pt-logout' => 'Излизане от {{SITENAME}}',
 'tooltip-ca-talk' => 'Беседа относно страницата',
 'tooltip-ca-edit' => 'Можете да редактирате страницата. Използвайте бутона за предварителен преглед преди да съхраните.',
index f6a5fe1..bdaac16 100644 (file)
@@ -48,7 +48,6 @@ $digitTransformTable = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'लिंक के नीचे रेखा',
-'tog-justify' => 'पैराग्राफ जस्टीफाई',
 'tog-hideminor' => 'हाल के परिवर्तन में मामूली संपादन छुपाईं',
 'tog-hidepatrolled' => 'हाल के परिवर्तन में मामूली संपादन छुपाईं',
 'tog-newpageshidepatrolled' => 'नयका पृष्ठ के सूची में से जाँचल पृष्क के छुपाँई',
@@ -57,9 +56,7 @@ $messages = array(
 'tog-numberheadings' => 'स्वयं-सांख्यिकी शिर्षक',
 'tog-showtoolbar' => 'सम्पादन औजार् बक्सा के दिखाइल् जाए',
 'tog-editondblclick' => 'दुई क्लिक पर पृष्ठ संपादित करीं (जावास्क्रिप्ट आवश्यक बा)',
-'tog-editsection' => '[संपादित करीं] कड़ि द्वारा अनुभाग संपादन सक्षम करीं',
 'tog-editsectiononrightclick' => 'अनुभाग शीर्षक पर दायाँ क्लिक कर अनुभाग सम्पादित करीं (जावास्क्रिप्ट आवश्यक बा)',
-'tog-showtoc' => 'अनुक्रम दिखाईं (जे पृष्ठ पर तीन से अधिक अनुभाग होखे)',
 'tog-rememberpassword' => 'इ ब्राउजर पर हमार प्रवेश जारी रहे (अधिकतम $1 {{PLURAL:$1|दिन|दिन}})',
 'tog-watchcreations' => 'हमरा द्वारा निर्मित पृष्ठ आ हमरा द्वारा लादल फ़ाइलन के हमार ध्यानसूची में जोड़ी',
 'tog-watchdefault' => 'हमरा द्वारा निर्मित पृष्ठ आ हमरा द्वारा लादल फ़ाइलन के हमार ध्यानसूची में जोड़ी',
@@ -836,7 +833,6 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'compareselectedversions' => 'चुनल गईल संशोधन में अन्तर देखीं',
 'showhideselectedversions' => 'चुनल गईल संशोधन दिखाईं/छुपाईं',
 'editundo' => 'पूर्ववत',
-'diff-multi' => '({{PLURAL:$2|एगो योगदानकर्ता|$2 योगदानकर्ताओं}} द्वारा {{PLURAL:$1|कियल गईल बीच के एगो|कियल गईल बीच के $1}} अवतरण नईखे दर्शावल बा।)',
 
 # Search results
 'searchresults' => 'खोज परिणाम',
@@ -1082,7 +1078,6 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'tooltip-pt-watchlist' => 'राउर ध्यान दियल पन्ना के सूची',
 'tooltip-pt-mycontris' => 'राउर योगदान के सूची',
 'tooltip-pt-login' => 'रउआ के खाता प्रवेश खातिर प्रोत्साहित करल जा रहल बा, बाकि ई अनिवार्य नईखे',
-'tooltip-pt-anonlogin' => 'रउआ के खाता प्रवेश खातिर प्रोत्साहित करल जा रहल बा, बाँकि ई अनिवार्य नईखे',
 'tooltip-pt-logout' => 'खाता से बाहर',
 'tooltip-ca-talk' => 'सामग्री पन्ना के बारे में बात-चीत',
 'tooltip-ca-edit' => 'रउआ ई पन्ना के सम्पादन कर सकत बानी। कृपया पन्ना सुरक्षित करे से पहिले पूर्वावलोकन बटन के इस्तेमाल करीं।',
index 81c4298..91664e9 100644 (file)
@@ -145,7 +145,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Garisi di bawah tautan',
-'tog-justify' => 'Ratakan paragraf',
 'tog-hideminor' => 'Sungkupakan babakan sapalih dalam paubahan pahanyarnya',
 'tog-hidepatrolled' => 'Sungkupakan babakan taawasi dalam paubahan pahanyarnya',
 'tog-newpageshidepatrolled' => 'Sungkupakan tungkaran nang diitihi matan daptar tungkaran hanyar',
@@ -1093,7 +1092,6 @@ Catatan bahwasa mamuruk tautan napigasi akan mambulikakan setelan kolum ngini.',
 'compareselectedversions' => 'Tandingakan ralatan nang dipilih',
 'showhideselectedversions' => 'Tampaiakan/sungkupakan ralatan-ralatan',
 'editundo' => 'walangi',
-'diff-multi' => '({{PLURAL:$1|Asa ralatan tangah|$1 raralatan tangah}} ulih {{PLURAL:$2|asa pamakai|$2 papamakai}} kada ditampaiakan)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Asa ralatan tangah|$1 raralatan tangah}} ulih labih pada $2 {{PLURAL:$2|pamuruk|papamuruk}} kada ditampaiakan)',
 
 # Search results
@@ -2067,7 +2065,6 @@ Paubahan-paubahan salanjutnya pada tungkaran ngini dan tungkaran pamandiran tara
 'watchmethod-list' => 'pariksa tutungkaran nang diitihi gasan bababakan pahanyarnya',
 'watchlistcontains' => 'Paitihan Pian mangandung $1 {{PLURAL:$1|tungkaran|tutungkaran}}.',
 'iteminvalidname' => "Masalah awan barang '$1', bangaran kada sah...",
-'wlnote' => "Di bawah naya adalah {{PLURAL:$1|paubahan|'''$1''' paubahan}} tauncit dalam '''$2''' jam tauncit, par $3, $4.",
 'wlshowlast' => 'Tampaiakan $1 jam $2 hari pahabisan $3',
 'watchlist-options' => 'Pilihan daptar itihan',
 
@@ -2701,7 +2698,6 @@ Muhun cubai pulang.',
 'tooltip-pt-watchlist' => 'Daptar tungkaran-tungkaran nang Pian itihi paubahannya',
 'tooltip-pt-mycontris' => 'Daptar sumbangan Pian',
 'tooltip-pt-login' => 'Pian sabaiknya babuat ka dalam log; tagal ngini kada kawajiban pang',
-'tooltip-pt-anonlogin' => 'Pian sabaiknya babuat ka dalam log; tagal ini kada kawajiban pang',
 'tooltip-pt-logout' => 'Kaluar',
 'tooltip-ca-talk' => 'Pamandiran pasal isi tungkaran',
 'tooltip-ca-edit' => 'Pian kawa mambabak tungkaran ngini. Tabéngkéng amun mamakai picikan titilikan sabalum manyimpan',
index 4da1542..b365b72 100644 (file)
@@ -74,7 +74,6 @@ $digitGroupingPattern = "##,##,###";
 $messages = array(
 # User preference toggles
 'tog-underline' => 'সংযোগগুলির নিচে দাগ দেখানো হোক:',
-'tog-justify' => 'অনুচ্ছেদগুলি যথাযথ ফাঁক দিয়ে সাজানো (justify) হোক',
 'tog-hideminor' => 'অনুল্লেখ্য সম্পাদনাগুলো সাম্প্রতিক পরিবর্তনে না দেখানো হোক',
 'tog-hidepatrolled' => 'পরীক্ষিত সম্পাদনা গুলো সাম্প্রতিক পরিবর্তনসমূহে আড়াল করো',
 'tog-newpageshidepatrolled' => 'পরীক্ষিত পাতা গুলো নতুন পাতার তালিকায় আড়াল করো',
@@ -236,7 +235,6 @@ $messages = array(
 'vector-action-protect' => 'সুরক্ষা',
 'vector-action-undelete' => 'পুনরুদ্ধার',
 'vector-action-unprotect' => 'সুরক্ষা পরিবর্তন',
-'vector-simplesearch-preference' => 'সরল অনুসন্ধান সক্রিয় করুন (শুধুমাত্র ভেক্টর স্কিনের জন্য)',
 'vector-view-create' => 'তৈরি',
 'vector-view-edit' => 'সম্পাদনা',
 'vector-view-history' => 'ইতিহাস',
@@ -895,6 +893,7 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'content-not-allowed-here' => '"$1" কন্টেন্টটি [[$2]] পাতায় অনুমোদিত নয়',
 'editwarning-warning' => 'এই পাতাটি ত্যাগ করলে আপনার আপনার করা পরিবর্তনগুলো হারিয়ে যেতে পারে।
 আপনি যদি লগইন করা থাকেন, আপনি এই সতর্কীকরণ বার্তাটি আপনার পছন্দের "সম্পাদনা" অনুচ্ছেদ থেকে নিস্ক্রিয় করতে পারেন।',
+'editpage-notsupportedcontentformat-title' => 'উল্লেখিত পদ্ধতি সমর্থনযোগ্য নয়।',
 
 # Content models
 'content-model-wikitext' => 'উইকিটেক্সট',
@@ -1105,7 +1104,6 @@ $1",
 'showhideselectedversions' => 'নির্বাচিত সংশোধনগুলো দেখাও/লুকাও',
 'editundo' => 'পূর্বাবস্থায় আনো',
 'diff-empty' => '(কোন পার্থক্য নেই)',
-'diff-multi' => '({{PLURAL:$2|একজন ব্যবহারকারী |$2 জন ব্যবহারকারী}} সম্পাদিত {{PLURAL:$1|একটি অন্তর্বর্তীকালীন সংশোধন|$1টি অন্তর্বর্তীকালীন সংশোধন}} দেখানো হয়নি।)',
 'diff-multi-manyusers' => '($2 জন {{PLURAL:$2|ব্যবহারাকারীর}} সম্পাদিত {{PLURAL:$1|একটি সাম্প্রতিক সংস্করণ|$1 টি সাম্প্রতিক সংস্করণ}} প্রদর্শিত হচ্ছে না)',
 'difference-missing-revision' => '$1 পার্থক্যের {{PLURAL:$2|একটি সংস্করণ|$2টি সংস্করণসমূহ}} খুজে পাওয়া যাচ্ছে না।
 
@@ -1126,7 +1124,7 @@ $1",
 'shown-title' => 'প্রতি পাতায় $1 {{PLURAL:$1|ফলাফল|ফলাফলসমূহ}} দেখাও',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) দেখানো হোক।',
 'searchmenu-exists' => "'''এই উইকিতে \"[[:\$1]]\" নামে একটি পাতা রয়েছে'''",
-'searchmenu-new' => "'''\"[[:\$1]]\" পাতাটি এই উইকিতে তৈরি করুন!'''",
+'searchmenu-new' => '<strong>"[[:$1]]" পাতাটি এই উইকিতে তৈরি করুন!</strong> {{PLURAL:$2|0=|এছাড়া আপনার অনুসন্ধানের সাথে পাওয়া পাতা দেখুন।|এছাড়া অনুসন্ধানে পাওয়া ফলাফলগুলি দেখুন।}}',
 'searchprofile-articles' => 'বিষয়বস্তুর পাতা',
 'searchprofile-project' => 'সহায়িকা এবং প্রকল্প পাতা',
 'searchprofile-images' => 'মাল্টিমিডিয়া',
@@ -1957,6 +1955,11 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'protectedpages-cascade' => 'শুধুমাত্র প্রপাতাকার সুরক্ষা',
 'protectedpages-noredirect' => 'পুনর্নির্দেশনাগুলো লুকাও',
 'protectedpagesempty' => 'কোন পাতা বর্তমানে এই প্যারামিটারগুলিসহ সুরক্ষিত নয়।',
+'protectedpages-page' => 'পাতা',
+'protectedpages-params' => 'সুরক্ষা প্যারামিটার',
+'protectedpages-reason' => 'কারণ',
+'protectedpages-unknown-timestamp' => 'অজানা',
+'protectedpages-unknown-performer' => 'অজানা ব্যবহারকারী',
 'protectedtitles' => 'সুরক্ষিত শিরোনামগুলি',
 'protectedtitlesempty' => 'কোন শিরোনাম বর্তমানে এই প্যারামিটারগুলিসহ সুরক্ষিত নয়।',
 'listusers' => 'ব্যবহারকারীর তালিকা',
@@ -2231,7 +2234,7 @@ $UNWATCHURL
 'delete-warning-toobig' => 'এই পাতাটির একটি বৃহৎ সম্পাদনা ইতিহাস রয়েছে, যা $1 {{PLURAL:$1|সংস্করণেরও|সংস্করণেরও}} বেশি।
 এই পাতাটি মুছে ফেললে তা {{SITENAME}} সাইটের ডেটাবেজ সমস্যার কারণ হতে পারে;
 সাবধানতার সাথে এগিয়ে যান।',
-'deleting-backlinks-warning' => "'''সতর্কীকরণ:''' আপনি যেটি মুছে ফেলতে যাচ্ছেন তা অন্যান্য পাতাসমূহের সাথে সংযুক্ত আছে।",
+'deleting-backlinks-warning' => "'''সতরà§\8dà¦\95à§\80à¦\95রণ:''' à¦\86পনি à¦¯à§\87à¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লতà§\87 à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87ন à¦¤à¦¾ à¦\85নà§\8dযানà§\8dয à¦ªà¦¾à¦¤à¦¾à¦¸à¦®à§\82হà§\87র à¦¸à¦¾à¦¥à§\87 à¦¸à¦\82যà§\81à¦\95à§\8dত à¦\85থবা à¦\85নà§\8dতরà§\8dভà§\81à¦\95à§\8dত à¦\95রা à¦\86à¦\9bà§\87।",
 
 # Rollback
 'rollback' => 'সম্পাদনা ফিরিয়ে নিন',
@@ -2528,7 +2531,7 @@ $1',
 'range_block_disabled' => 'প্রশাসকের পক্ষে আইপি ঠিকানার শ্রেণী বাধাদানের ক্ষমতা নিষ্ক্রিয় আছে।',
 'ipb_expiry_invalid' => 'মেয়াদোত্তীর্ণকাল অবৈধ।',
 'ipb_expiry_temp' => 'লুকানো ব্যবহারকারীনাম বাধা চিরস্থায়ী হতে হবে।',
-'ipb_hide_invalid' => 'à¦\8fà¦\87 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¬à¦¾à¦§à¦¾ à¦¦à§\87য়া à¦¸à¦®à§\8dভব à¦¨à¦¯à¦¼; à¦¹à¦¯à¦¼à¦¤à§\8b à¦¸à¦®à§\8dপাদনার à¦¸à¦\82à¦\96à§\8dযা à¦\85নà§\87à¦\95 à¦¬à§\87শি।',
+'ipb_hide_invalid' => 'à¦\8fà¦\87 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¬à¦¾à¦§à¦¾ à¦¦à§\87য়া à¦¸à¦®à§\8dভব à¦¨à¦¯à¦¼; à¦\8fà¦\9fি {{PLURAL:$1|à¦\8fà¦\95à§\87র à¦\85ধিà¦\95|$1à¦\9fি}} à¦¸à¦®à§\8dপাদনা à¦\95রà§\87à¦\9bà§\87।',
 'ipb_already_blocked' => '"$1" ইতিমধ্যে ব্লক',
 'ipb-needreblock' => '$1 পূর্বেই ব্লক রয়েছেন। আপনি কি সেটিংস পরিবর্তন করতে চান?',
 'ipb-otherblocks-header' => 'অন্যান্য {{PLURAL:$1|বাধাঁ|বাধাঁসমূহ}}',
@@ -3666,6 +3669,9 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'version-ext-colheader-license' => 'লাইসেন্স',
 'version-ext-colheader-description' => 'বিবরণ',
 'version-ext-colheader-credits' => 'লেখক',
+'version-license-title' => '$1-এর জন্য লাইসেন্স',
+'version-credits-title' => '$1-এর জন্য কৃতিত্ব',
+'version-credits-not-found' => 'এই এক্সটেনশনটির জন্য কোনো বিস্তারিত কৃতিত্ব তথ্য পাওয়া যায়নি।',
 'version-poweredby-credits' => "এইক উইকিটি পরিচালিত হচ্ছে '''[https://www.mediawiki.org/ মিডিয়াউইকি]'''-এর মাধ্যমে, কপিরাইট © ২০০১-$1 $2।",
 'version-poweredby-others' => 'অন্যান্য',
 'version-poweredby-translators' => 'translatewiki.net অনুবাদকগণ',
@@ -3685,7 +3691,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 # Special:Redirect
 'redirect' => 'পাতা, ফাইল, ব্যবহারকরী, অথবা সংশোধন আইডি দ্বারা পুনঃনির্দেশ করা হয়েছে',
 'redirect-legend' => 'একটি ফাইল অথবা পাতায় পুনঃনির্দেশ করা হয়েছে',
-'redirect-summary' => 'à¦\8fà¦\87 à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦ªà§\81নà¦\83নিরà§\8dদà§\87শিত à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 à¦\8fà¦\95à¦\9fি à¦«à¦¾à¦\87লà§\87 (ফাà¦\87লà§\87র à¦¨à¦¾à¦®), à¦\8fà¦\95à¦\9fি à¦ªà¦¾à¦¤à¦¾ (রিভিশন à¦\86à¦\87ডি), à¦\85থবা à¦\8fà¦\95à¦\9fি à¦¬à§\8dযবহারà¦\95রà§\80 à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ (সà¦\82à¦\96à§\8dযায় à¦²à§\87à¦\96া à¦¬à§\8dযবহারà¦\95ারà§\80 à¦\86à¦\87ডি)। à¦¬à§\8dযবহার: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]]।',
+'redirect-summary' => 'à¦\8fà¦\87 à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\8fà¦\95à¦\9fি à¦«à¦¾à¦\87লà§\87 (ফাà¦\87লà§\87র à¦¨à¦¾à¦®), à¦\8fà¦\95à¦\9fি à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ (সà¦\82সà§\8dà¦\95রণ à¦\86à¦\87ডি à¦¬à¦¾ à¦ªà¦¾à¦¤à¦¾ à¦\86à¦\87ডি), à¦\85থবা à¦\8fà¦\95à¦\9fি à¦¬à§\8dযবহারà¦\95রà§\80 à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ (সà¦\82à¦\96à§\8dযায় à¦²à§\87à¦\96া à¦¬à§\8dযবহারà¦\95ারà§\80 à¦\86à¦\87ডি) à¦ªà§\81নà¦\83নিরà§\8dদà§\87শিত à¦¹à¦¯à¦¼à§\87à¦\9bà§\87। à¦¬à§\8dযবহার:  [[{{#Special:Redirect}}/file/à¦\89দাহরণ.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], à¦\85থবা [[{{#Special:Redirect}}/user/101]]।',
 'redirect-submit' => 'যাও',
 'redirect-lookup' => 'দেখুন:',
 'redirect-value' => 'মান:',
index 11ef600..155e30a 100644 (file)
@@ -30,7 +30,6 @@ $digitTransformTable = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'འོག་ཐིག་འཐེན་པ།',
-'tog-justify' => 'ཚིག་གི་ཚད་སྙོམས་པ།',
 'tog-hideminor' => 'རྩོམ་སྒྲིག་ཆུང་ཚགས་སྦས་བ།',
 'tog-hidepatrolled' => 'ལྟ་ཞིབ་བྱས་པའི་རྩོམ་སྒྲིག་སྦས་བ།',
 'tog-newpageshidepatrolled' => 'ཤོག་ངོས་གསར་བར་ལྟ་ཞིབ་བྱས་པའི་རྩོམ་སྒྲིག་སྦས་བ།',
@@ -39,7 +38,6 @@ $messages = array(
 'tog-numberheadings' => 'རང་སྒྲིག་ཨང་རྟགས་འགོ་བརྗོད།',
 'tog-showtoolbar' => 'རྩོམ་སྒྲིག་ལག་ཆ་སྟོན།(JavaScript ཡི་བརྡ་ཆད་དགོས།)',
 'tog-editondblclick' => 'ཤོག་ངོས་རྩོམ་སྒྲིག་བྱེད་པར་ལན་གཉིས་རྡེབ།(JavaScript ཡི་བརྡ་ཆད་དགོས།)',
-'tog-editsection' => '[སྒྲིག་བཅོས།]འབྲེལ་མཐུད་གནོན་ཏེ་སྒྲིགབཅོས་སྡེ་ཚན་ཡོད་པར་འགྱིས།',
 'tog-rememberpassword' => 'ངའི་ནང་འཛུལ་བཤར་ལྟ་ཆས་འདི་རུ་མང་མཐའ་ཉིན $1 {{PLURAL:$1}} དྲན་པར་མཛོད།',
 'tog-watchcreations' => 'ངའི་ལྟ་ཐོའི་གྲས་སུ་གསར་བཟོ་བྱས་པ་ལ་ཤོག་ངོས་ཁ་སྣོན།',
 'tog-watchdefault' => 'ངའི་ལྟ་ཐོའི་གྲས་སུ་རྩོམ་སྒྲིག་བྱས་པ་ལ་ཤོག་ངོས་ཁ་སྣོན།',
index baaa328..2d95199 100644 (file)
@@ -48,7 +48,6 @@ $digitTransformTable = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'লিঙ্কর তলে দুরগ দিক:',
-'tog-justify' => 'অনুচ্ছেদহানির দুরগি দ্বিয়পারাদেত্ত মান্নাকরিক',
 'tog-hideminor' => 'হুরু পতানি গুর',
 'tog-hidepatrolled' => 'পরীক্ষাইসে পতা অতা হাদিএহানর পতানিত আরুম কর',
 'tog-newpageshidepatrolled' => 'পরীক্ষাইসে পতা অতা নুৱা পাতার লাতঙে আরুম কর',
@@ -57,9 +56,7 @@ $messages = array(
 'tog-numberheadings' => 'নিজেলত্ত পাজালার চিঙনাঙ',
 'tog-showtoolbar' => 'পতানির আতিয়ার দেহাদে (জাভাস্ক্রিপ্ট)',
 'tog-editondblclick' => 'দ্বিমাউ যাতিয়া পতাহান পতিক (জাভাস্ক্রিপ্ট)',
-'tog-editsection' => '[পতিক] লিঙ্ক এহান্ন পরিচ্ছদ পতানি অক',
 'tog-editsectiononrightclick' => 'পরিচ্ছদ পতানির য়্যাথাঙহান বাতেদের গোথামগ <br /> পরিচ্ছদর চিঙনাঙর গজে যাতিলে দে (জাভাস্ক্রিপ্ট)',
-'tog-showtoc' => 'বিষয়র মাঠেলহানি দেহাদে (যে পাতারতা ৩হানর গজে চিঙনাঙ আসে)',
 'tog-rememberpassword' => 'এরে ব্রাউজারর গজে সেশনর কা খন্তাচাবি মনে থ(সর্বোচ্চ $1 {{PLURAL:$1|দিনর|দিনর}} কা)',
 'tog-watchcreations' => 'যে পতাহানি মি ইকরিসু অতা মর তালাবির তালিকাত থ',
 'tog-watchdefault' => 'যে পতাহানি মি পতাসু অতা মর তালাবির তালিকাত থ',
@@ -792,7 +789,6 @@ $2',
 'compareselectedversions' => 'বাসাইল সংস্করণহানি তুলনা কর',
 'showhideselectedversions' => 'বাসিসি রিভিশনহানি দেখাদে/গুর',
 'editundo' => 'আলকর',
-'diff-multi' => '({{PLURAL:$2|আতাকুরা আগ |$2 গ আতাকুরা}} সম্পাদন অসে {{PLURAL:$1|হমবুকর রিভিসন আহান|$1 হমবুকর রিভিসন হানি}} দেহাদেনা এহাত না মিহিসে।)',
 
 # Search results
 'searchresults' => 'বিসারলে অতার ফলাফল',
index a6c665f..f8fdb42 100644 (file)
@@ -181,7 +181,6 @@ $linkTrail = "/^((?:c\'h|C\'H|C\'h|c’h|C’H|C’h|[a-zA-Zàâçéèêîôûä
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Liammoù islinennet',
-'tog-justify' => 'Rannbennadoù marzekaet',
 'tog-hideminor' => "Kuzhat ar c'hemmoù nevez dister",
 'tog-hidepatrolled' => "Kuzhat ar c'hemmoù evezhiet e-touez ar c'hemmoù diwezhañ",
 'tog-newpageshidepatrolled' => 'Kuzhat ar pajennoù evezhiet diouzh roll ar pajennoù nevez',
@@ -344,7 +343,6 @@ $messages = array(
 'vector-action-protect' => 'Gwareziñ',
 'vector-action-undelete' => 'Diziverkañ',
 'vector-action-unprotect' => 'Cheñch gwarez',
-'vector-simplesearch-preference' => "Aotren ar c'hinnigoù klask gwellaet (gant Vektor nemetken)",
 'vector-view-create' => 'Krouiñ',
 'vector-view-edit' => 'Kemmañ',
 'vector-view-history' => 'Gwelet an istor',
@@ -627,6 +625,8 @@ Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}
 'userlogin-resetpassword-link' => 'Ankouaet ho peus ho ker-tremen ?',
 'helplogin-url' => 'Help:Kevreañ',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Skoazell evit kevreañ]]',
+'userlogin-loggedin' => "Kevreet oc'h dija evel {{GENDER:$1|$1}}.
+Implijit ar furmskrid amañ dindan evit kevreañ evel un implijer all.",
 'userlogin-createanother' => 'Krouiñ ur gont all',
 'createacct-join' => 'Skrivit ho titouroù amañ dindan.',
 'createacct-another-join' => 'Ebarzhiñ titouroù ar gont nevez amañ dindan.',
@@ -730,6 +730,8 @@ Gortozit $1, mar plij, a-raok esaeañ en-dro.",
 'retypenew' => 'Adskrivañ ar ger-tremen nevez :',
 'resetpass_submit' => 'Cheñch ar ger-tremen ha kevreañ',
 'changepassword-success' => 'Cheñchet eo bet ho ker-tremen !',
+'changepassword-throttled' => "Betek re hoc'h heus klasket kevreañ en aner.
+Gortozit $1, mar plij, a-raok esaeañ en-dro.",
 'resetpass_forbidden' => "N'haller ket cheñch ar gerioù-termen",
 'resetpass-no-info' => "Ret eo deoc'h bezañ kevreet a-benn mont d'ar bajenn-se war-eeun.",
 'resetpass-submit-loggedin' => 'Cheñch ger-tremen',
@@ -780,6 +782,8 @@ Ger-tremen da c'hortoz : $2",
 'changeemail-password' => 'Ho ker-tremen war {{SITENAME}}:',
 'changeemail-submit' => "Cheñch chomlec'h postel",
 'changeemail-cancel' => 'Nullañ',
+'changeemail-throttled' => "Betek re hoc'h heus klasket kevreañ en aner.
+Gortozit $1, mar plij, a-raok esaeañ en-dro.",
 
 # Special:ResetTokens
 'resettokens' => 'Adderaouekaat ar jedoueroù',
@@ -1027,6 +1031,7 @@ A-gostez eo bet lezet an arventenn-se.',
 'undo-success' => "Gallout a reer dizober ar c'hemmoù-mañ. Gwiriit, mar plij, gant ar geñveriadenn a-is evit bezañ sur eo an dra-se a fell deoc'h ober; goude-se enrollit ar c'hemmoù a-is a-benn echuiñ disteurel ar c'hemmoù.",
 'undo-failure' => "N'eus ket bet tu da zisteuler ar c'hemm-mañ abalamour d'un tabut gant kemmoù degaset e-keit-se.",
 'undo-norev' => "N'eus ket bet gallet degas ar c'hemmoù-mañ rak pe n'eus ket anezho pe int bet diverket.",
+'undo-nochange' => "War a seblant eo bet nullet ar c'hemm dija.",
 'undo-summary' => 'Dizober kemmoù $1 a-berzh [[Special:Contributions/$2|$2]] ([[User talk:$2|kaozeal]])',
 'undo-summary-username-hidden' => 'Dizober ar reizhadenn $1 gant un implijer kuzhet',
 
@@ -1201,7 +1206,6 @@ Gwiriit ne vo ket torret red istor ar bajenn gant ar c'hemm-mañ.",
 'showhideselectedversions' => 'Diskouez/Kuzhat ar stummoù diuzet',
 'editundo' => 'dizober',
 'diff-empty' => '(Disheñvelder ebet)',
-'diff-multi' => "({{PLURAL:$1|Ur reizhadenn da c'hortoz|$1 reizhadenn da c'hortoz}} gant {{PLURAL:$2|un implijer|$2 implijer}} kuzhet.)",
 'diff-multi-manyusers' => "({{PLURAL:$1|Ur reizhadenn da c'hortoz|$1 reizhadenn da c'hortoz}} gant muioc'h eget $2 {{PLURAL:$2|implijer|implijer}} kuzhet.)",
 'difference-missing-revision' => "!!{{PLURAL:$2|Un adweladur|$2 adweladurioù}} eus an disheñvelder ($1) {{PLURAL:$2|n'eo ket bet kavet|n'int ket bet adkavet}}.
 
@@ -1238,6 +1242,7 @@ Gallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'search-result-score' => 'Klotadusted : $1%',
 'search-redirect' => '(adkas $1)',
 'search-section' => '(rann $1)',
+'search-file-match' => "(klotañ a ra gant endalc'had ar restr)",
 'search-suggest' => "N'hoc'h eus ket soñjet kentoc'h e : $1",
 'search-interwiki-caption' => 'Raktresoù kar',
 'search-interwiki-default' => "$1 disoc'h :",
@@ -1524,8 +1529,8 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
 'action-block' => 'mirout ouzh an impplijer-mañ da zegas kemmoù',
 'action-protect' => 'kemmañ liveoù gwareziñ ar bajenn-mañ',
 'action-rollback' => 'disteuler prim kemmoù an implijer diwezhañ kemmet gantañ ur bajenn resis',
-'action-import' => 'Enporzhiañ ar bajenn-mañ adal ur wiki all',
-'action-importupload' => 'Enporzhiañ ar bajenn-mañ adal ur restr pellgarget',
+'action-import' => 'Enporzhiañ pajennoù eus ur wiki all',
+'action-importupload' => 'Enporzhiañ pajennoù eus ur restr pellgarget',
 'action-patrol' => 'merkañ kemmoù ar re all evel gwiriet',
 'action-autopatrol' => 'bezañ merket ho tegasadennoù evel gwiriet',
 'action-unwatchedpages' => "gwelet roll ar pajennoù n'int ket evezhiet",
@@ -1553,7 +1558,7 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
 'recentchanges-label-bot' => "Gant ur bot eo bet degaset ar c'hemm-mañ.",
 'recentchanges-label-unpatrolled' => "N'eo ket bet gwiriet ar c'hemm-mañ evit c'hoazh.",
 'recentchanges-label-plusminus' => 'Kemmet eo ment ar bajenn eus an niver-mañ a oktedoù',
-'recentchanges-legend-heading' => '"Alc\'hwez :"',
+'recentchanges-legend-heading' => "'''Alc'hwez :'''",
 'recentchanges-legend-newpage' => '(gwelet ivez [[Special:NewPages|roll ar pajennoù nevez]])',
 'rcnotefrom' => "Setu aze roll ar c'hemmoù c'hoarvezet abaoe an '''$2''' ('''$1''' d'ar muiañ).",
 'rclistfrom' => "Diskouez ar c'hemmoù diwezhañ abaoe an $1.",
@@ -2053,6 +2058,14 @@ $1 {{PLURAL:$1|rummad|rummad}}',
 'protectedpages-cascade' => 'Gwarez dre skalierad hepken',
 'protectedpages-noredirect' => 'Kuzhat an adkasoù',
 'protectedpagesempty' => "N'eus pajenn gwarezet ebet gant an arventennoù-mañ evit poent.",
+'protectedpages-timestamp' => 'Deiziad hag eur',
+'protectedpages-page' => 'Pajenn',
+'protectedpages-expiry' => "A ya d'e dermen",
+'protectedpages-performer' => 'Gwareziñ an implijer',
+'protectedpages-params' => 'Arventennoù gwareziñ',
+'protectedpages-reason' => 'Abeg',
+'protectedpages-unknown-timestamp' => 'Dianav',
+'protectedpages-unknown-performer' => 'Implijer dianav',
 'protectedtitles' => 'Titloù gwarezet',
 'protectedtitlesempty' => "N'eus bet gwarezet titl ebet dezhañ an arventennoù-se evit poent.",
 'listusers' => 'Roll an implijerien',
@@ -2242,7 +2255,6 @@ Amañ e vo rollet ar c\'hemmoù da zont evit ar bajenn-mañ hag ar bajenn gaozea
 'watchmethod-list' => "Gwiriañ ar c'hemmoù diwezhañ evit ar pajennoù evezhiet",
 'watchlistcontains' => '$1 {{PLURAL:$1|pajenn|pajenn}} zo en ho rollad evezhiañ',
 'iteminvalidname' => "Ur gudenn zo gant ar pennad « $1 » : n'eo ket mat e anv...",
-'wlnote' => "Setu aze {{PLURAL:$1|ar c'hemm diwezhañ|ar '''$1''' kemm diwezhañ}} 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ñ',
 
@@ -2790,6 +2802,7 @@ Kit da welet [https://www.mediawiki.org/wiki/Localisation Lec'heladur MediaWiki]
 'allmessages-prefix' => 'Silañ dre rakger',
 'allmessages-language' => 'Yezh :',
 'allmessages-filter-submit' => 'Mont',
+'allmessages-filter-translate' => 'Treiñ',
 
 # Thumbnails
 'thumbnail-more' => 'Brasaat',
@@ -2881,7 +2894,6 @@ Enrollit ar bajenn war hoc'h urzhiataer ha kargit anezhi amañ.",
 'tooltip-pt-watchlist' => "Roll ar pajennoù evezhiet ganeoc'h.",
 'tooltip-pt-mycontris' => 'Roll ho tegasadennoù',
 'tooltip-pt-login' => "Daoust ma n'eo ket ret, ec'h aliomp deoc'h kevreañ",
-'tooltip-pt-anonlogin' => "Daoust ma n'eo ket ret, ec'h aliomp deoc'h kevreañ.",
 'tooltip-pt-logout' => 'Digevreañ',
 'tooltip-ca-talk' => 'Kaozeadennoù diwar-benn ar pennad',
 'tooltip-ca-edit' => 'Gallout a rit kemmañ ar bajenn-mañ. Implijit ar stokell Rakwelet a-raok enrollañ, mar plij.',
@@ -3083,7 +3095,7 @@ Ma vez erounezet ganeoc'h e c'hallje tagañ ho reizhiad.",
 'svg-long-desc' => 'restr SVG file, pizhder $1 × $2 piksel, ment ar restr : $3',
 'svg-long-desc-animated' => 'Restr SVG bev, ment $1 × $2 piksel, ment ar restr: $3',
 'svg-long-error' => 'Restr SVG direizh : $1',
-'show-big-image' => 'Pizhder leun',
+'show-big-image' => 'Restr orin',
 'show-big-image-preview' => 'Ment ar rakweled-mañ : $1.',
 'show-big-image-other' => '{{PLURAL:$2|pizhder all|pizhderioù all}} : $1.',
 'show-big-image-size' => '$1 × $2 piksel',
@@ -3649,6 +3661,7 @@ Kadarnait mar plij e fell deoc'h krouiñ ar pennad-mañ da vat.",
 
 # Language selector for translatable SVGs
 'img-lang-default' => '(yezh dre ziouer)',
+'img-lang-info' => 'Diskouez ar skeudenn-mañ e $1. $2',
 'img-lang-go' => 'Mont',
 
 # Table pager
@@ -4009,9 +4022,8 @@ A-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc
 'expandtemplates' => 'Emled ar patromoù',
 'expand_templates_intro' => "Kemer a ra ar bajenn dibar-mañ tammoù testenn hag astenn a ra an holl batromoù enni en un doare azkizat.
 Astenn a ra ivez an arc'hwelioù parser evel
-<nowiki>{{</nowiki>#language:…}}, hag an argemmoù evel
-<nowiki>{{</nowiki>CURRENTDAY}}&mdash; e gwirionez, koulz lavaret kement tra zo etre briataennoù.
-Ober a ra kement-mañ dre c'hervel ar bazenn a zegouezh digant parser MediaWiki e-unan.",
+<code><nowiki>{{</nowiki>#language:…}}</code>, hag an argemmoù evel
+<code><nowiki>{{</nowiki>CURRENTDAY}}</code. E gwirionez, koulz lavaret kement tra zo etre briataennoù doubl.",
 'expand_templates_title' => 'Titl ar gendestenn, evit {{FULLPAGENAME}} h.a. :',
 'expand_templates_input' => 'Merkañ ho testenn amañ :',
 'expand_templates_output' => "Disoc'h",
index 4f9a24a..e14b5f5 100644 (file)
@@ -14,6 +14,7 @@
  * @author Edinwiki
  * @author Fulup
  * @author Geitost
+ * @author KWiki
  * @author Kaganer
  * @author Kal-El
  * @author Malafaya
@@ -282,7 +283,6 @@ $linkTrail = '/^([a-zćčžšđž]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Podvuci veze:',
-'tog-justify' => 'Uravnjaj pasuse',
 'tog-hideminor' => 'Sakrij male izmjene u spisku nedavnih izmjena',
 'tog-hidepatrolled' => 'Sakrij patrolirane izmjene u nedavnim promjenama',
 'tog-newpageshidepatrolled' => 'Sakrij patrolirane stranice sa spiska novih stranica',
@@ -1310,7 +1310,6 @@ Korištenje navigacionih linkova će resetovati ovaj stupac.',
 'showhideselectedversions' => 'Pokaži/sakrij odabrane verzije',
 'editundo' => 'ukloni ovu izmjenu',
 'diff-empty' => '(Nema razlike)',
-'diff-multi' => '({{PLURAL:$1|Nije prikazana jedna međurevizija|Nisu prikazane $1 međurevizije|Nije prikazano $1 međurevizija}} od {{PLURAL:$2|jednog korisnika|$2 korisnika}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Jedna međurevizija|$1 međurevizije|$1 međurevizija}} od više od $2 {{PLURAL:$2|korisnika|korisnika}} {{PLURAL:$1|nije prikazana|nisu prikazane}})',
 'difference-missing-revision' => '{{PLURAL:$2|Jedna izmjena|$2 izmjene}} od ove razlike ($1) ne {{PLURAL:$2|postoji|postoje}}.
 
@@ -1656,11 +1655,11 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
 'recentchanges-legend' => 'Postavke nedavnih izmjena',
 'recentchanges-summary' => 'Na ovoj stranici možete pratiti nedavne izmjene.',
 'recentchanges-feed-description' => 'Na ovoj stranici možete pratiti nedavne izmjene.',
-'recentchanges-label-newpage' => 'Ovom izmjenom se pravi nova stranica',
+'recentchanges-label-newpage' => 'Ovom izmjenom pravi se nova stranica',
 'recentchanges-label-minor' => 'Ovo je mala izmjena',
-'recentchanges-label-bot' => 'Ova izmjenu je načinio bot',
+'recentchanges-label-bot' => 'Ovu izmjenu napravio je bot',
 'recentchanges-label-unpatrolled' => 'Ova izmjena još nije patrolirana',
-'recentchanges-label-plusminus' => 'Veličina stranice je se promjenila za ovoliko bajtova',
+'recentchanges-label-plusminus' => 'Veličina stranice promijenila se za ovoliko bajtova',
 'recentchanges-legend-heading' => "'''Legenda:'''",
 'recentchanges-legend-newpage' => '(također pogledajte [[Special:NewPages|spisak novih stranica]])',
 'rcnotefrom' => 'Ispod su izmjene od <b>$2</b> (do <b>$1</b> prikazano).',
@@ -2337,7 +2336,6 @@ Buduće promjene ove stranice i njoj pridružene stranice za razgovor će biti n
 'watchmethod-list' => 'provjerava se da li ima nedavnih izmjena u praćenim stranicama',
 'watchlistcontains' => 'Vaš spisak praćenih članaka sadrži $1 {{PLURAL:$1|stranicu|stranica}}.',
 'iteminvalidname' => "Problem sa '$1', neispravno ime...",
-'wlnote' => "Ispod je {{PLURAL:$1|najskorija izmjena|'''$1''' najskorije izmjene|'''$1''' najskorijih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih '''$2''' sata|u posljednjih '''$2''' sati}}, od $3, $4.",
 'wlshowlast' => 'Prikaži posljednjih $1 sati $2 dana $3',
 'watchlist-options' => 'Opcije spiska praćenja',
 
@@ -2458,7 +2456,7 @@ Pogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za pregled tr
 'protect-title-notallowed' => 'Pregled stepena zaštite za "$1"',
 'prot_1movedto2' => 'članak [[$1]] premješten na [[$2]]',
 'protect-badnamespace-title' => 'Nezaštitljiv imenski prostor',
-'protect-badnamespace-text' => 'Stranice u ovom imenskom prostoru se ne mogu zaštititi.',
+'protect-badnamespace-text' => 'Stranice u ovom imenskom prostoru ne mogu se zaštititi.',
 'protect-norestrictiontypes-text' => 'Ova stranica se ne može zaštititi jer nema dostupnih oblika ograničenja.',
 'protect-norestrictiontypes-title' => 'Nezaštitljiva strana',
 'protect-legend' => 'Potvrdite zaštitu',
@@ -2526,8 +2524,8 @@ Arhiva moše biti periodično čišćena.',
 'undeleteextrahelp' => "Da vratite cijelu historiju članka, ostavite sve kutijice neoznačene i kliknite '''''{{int:undeletebtn}}'''''.
 Da bi izvršili selektivno vraćanje, odaberite kutijice koje odgovaraju revizijama koje želite vratiti, i kliknite '''''{{int:undeletebtn}}'''''.",
 'undeleterevisions' => '{{PLURAL:$1|$1 revizija arhivirana|$1 revizije arhivirane|$1 revizija arhivirano}}',
-'undeletehistory' => 'Ako vratite stranicu, sve revizije će biti vraćene njenoj historiji.
-Ako je nova stranica istog imena napravljena od brisanja, vraćene revizije će se pojaviti u njenoj ranijoj historiji.',
+'undeletehistory' => 'Ako vratite stranicu, sve će revizije biti vraćene u njenu historiju.
+Ako je nova stranica istog imena napravljena od brisanja, vraćene revizije pojavit će se u njenoj ranijoj historiji.',
 'undeleterevdel' => 'Vraćanje obrisanog se neće izvršiti ako bi rezultiralo da zaglavlje stranice ili revizija datoteke bude djelimično obrisano.
 U takvim slučajevima, morate ukloniti označene ili otkriti sakrivene najskorije obrisane revizije.',
 'undeletehistorynoadmin' => 'Ova stranica je izbrisana.  Ispod se nalazi dio historije brisanja i historija revizija izbrisane stranice.  Tekst izbrisane stranice je vidljiv samo korisnicima koji su administratori.',
@@ -2989,7 +2987,6 @@ Nedostaje privremeni folder.',
 'tooltip-pt-watchlist' => 'Spisak članaka koje pratite.',
 'tooltip-pt-mycontris' => 'Spisak vašeg doprinosa',
 'tooltip-pt-login' => 'Predlažemo da se prijavite, ali nije obvezno.',
-'tooltip-pt-anonlogin' => 'Prijava nije obavezna, ali donosi mnogo koristi.',
 'tooltip-pt-logout' => 'Odjava sa projekta {{SITENAME}}',
 'tooltip-ca-talk' => 'Razgovor o sadržaju',
 'tooltip-ca-edit' => 'Možete da uređujete ovaj članak. Molimo Vas, koristite dugme "Prikaži izgled',
index 52128da..fd77c8e 100644 (file)
@@ -205,7 +205,6 @@ $linkTrail = "/^((?:[a-zàèéíòóúç·ïü]|'(?!'))+)(.*)$/sDu";
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Subratlla els enllaços:',
-'tog-justify' => 'Alineació justificada dels paràgrafs',
 'tog-hideminor' => 'Amaga les edicions menors en la pàgina de canvis recents',
 'tog-hidepatrolled' => 'Amaga edicions patrullades als canvis recents',
 'tog-newpageshidepatrolled' => 'Amaga pàgines patrullades de la llista de pàgines noves',
@@ -1026,7 +1025,7 @@ Ja existeix.",
 'invalid-content-data' => 'Dades de contingut no vàlides',
 'content-not-allowed-here' => 'No és permés el contingut "$1" a la pàgina [[$2]]',
 'editwarning-warning' => "Si sortiu d'aquesta pàgina perdreu tots els canvis que hàgiu fet.
-Si teniu un compte d'usuari, podeu eliminar aquest avís a la secció «Caixa d'edició» de les vostres preferències.",
+Si teniu un compte d'usuari, podeu eliminar aquest avís a la secció «{{int:prefs-editing}}» de les vostres preferències.",
 'editpage-notsupportedcontentformat-title' => "No s'admet el format del contingut",
 'editpage-notsupportedcontentformat-text' => "No s'admet el format del contingut $1 pel model de contingut $2.",
 
@@ -1062,6 +1061,7 @@ Se n'han omès els arguments.",
 'undo-success' => "Pot desfer-se la modificació. Si us plau, reviseu la comparació de sota per a assegurar-vos que és el que voleu fer; llavors deseu els canvis per a finalitzar la desfeta de l'edició.",
 'undo-failure' => 'No pot desfer-se la modificació perquè hi ha edicions entre mig que hi entren en conflicte.',
 'undo-norev' => "No s'ha pogut desfer l'edició perquè no existeix o s'ha suprimit.",
+'undo-nochange' => "Sembla que ja s'ha desfet la modificació.",
 'undo-summary' => 'Es desfà la revisió $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussió]])',
 'undo-summary-username-hidden' => "Desfés la revisió $1 d'un usuari ocult",
 
@@ -1242,7 +1242,7 @@ Assegureu-vos que aquest canvi mantindrà la continuïtat històrica de la pàgi
 'showhideselectedversions' => 'Mostra/oculta les versions seleccionades',
 'editundo' => 'desfés',
 'diff-empty' => '(Cap diferència)',
-'diff-multi' => '({{PLURAL:$1|Hi ha una revisió intermèdia |Hi ha $1 revisions intermèdies}} sense mostrar fetes per {{PLURAL:$2|un usuari|$2 usuaris}})',
+'diff-multi-sameuser' => '({{PLURAL:$1|Hi ha una revisió intermèdia|Hi ha $1 revisions intermèdies}} del mateix usuari que no es mostren)',
 'diff-multi-manyusers' => "({{PLURAL:$1|Hi ha una revisió intermèdia|Hi ha $1 revisions intermèdies}} sense mostrar fetes per més {{PLURAL:$2|d'un usuari|de $2 usuaris}})",
 'difference-missing-revision' => "{{PLURAL:$2|Una revisió|$2 revisions}} d'aquesta diferència ($1) no {{PLURAL:$2|s'ha|s'han}} trobat.
 
@@ -1263,7 +1263,7 @@ Es pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{F
 'shown-title' => 'Mostra $1 {{PLURAL:$1|resultat|resultats}} per pàgina',
 'viewprevnext' => 'Vés a ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Hi ha una pàgina anomenada «[[:$1]]» en aquest wiki'''",
-'searchmenu-new' => "'''Creeu la pàgina «[[:$1]]» en aquest wiki!'''",
+'searchmenu-new' => '<strong>Crea la pàgina «[[:$1]]» en aquest wiki!</strong> {{PLURAL:$2|0=|Vegeu també la pàgina trobada amb la cerca.|Vegeu també els resultats de cerca trobats.}}',
 'searchprofile-articles' => 'Pàgines de contingut',
 'searchprofile-project' => "Pàgines d'ajuda i de projecte",
 'searchprofile-images' => 'Multimèdia',
@@ -2044,7 +2044,7 @@ Les entrades <del>ratllades</del> s\'han resolt.',
 'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|enllaç|enllaços}}',
 'nmembers' => '$1 {{PLURAL:$1|membre|membres}}',
-'nmemberschanged' => '$1 → $2 {{PLURAL:$2|membre|membres}}',
+'nmemberschanged' => '$1 → $2 {{PLURAL:$2|element|elements}}',
 'nrevisions' => '$1 {{PLURAL:$1|revisió|revisions}}',
 'nviews' => '$1 {{PLURAL:$1|visita|visites}}',
 'nimagelinks' => "S'utilitza en {{PLURAL:$1|una pàgina|$1 pàgines}}",
@@ -2271,6 +2271,7 @@ S\'hi mostraran els canvis futurs que tinguin lloc en aquesta pàgina i la corre
 'watchmethod-list' => "s'està comprovant si hi ha edicions recents en les pàgines vigilades",
 'watchlistcontains' => 'La vostra llista de seguiment conté {{PLURAL:$1|una única pàgina|$1 pàgines}}.',
 'iteminvalidname' => "Hi ha un problema amb l'element '$1': el nom no és vàlid...",
+'wlnote2' => "A continuació es presenten els canvis durant {{PLURAL:$1|l'última hora|les últimes <strong>$1</strong> hores}}, a partir de $2, $3.",
 'wlshowlast' => '<small>- Mostra les darreres $1 hores, els darrers $2 dies o $3</small>',
 'watchlist-options' => 'Opcions de la llista de seguiment',
 
@@ -2828,6 +2829,7 @@ En el darrer cas, podeu fer servir un enllaç com ara [[{{#Special:Export}}/{{Me
 'allmessages-prefix' => 'Filtra per prefix:',
 'allmessages-language' => 'Idioma:',
 'allmessages-filter-submit' => 'Vés-hi',
+'allmessages-filter-translate' => 'Tradueix',
 
 # Thumbnails
 'thumbnail-more' => 'Amplia',
@@ -2879,7 +2881,7 @@ Deseu-lo al vostre ordinador i carregueu-ne una còpia ací.",
 'importuploaderrortemp' => "La càrrega del fitxer d'importació ha fallat. Manca una carpeta temporal.",
 'import-parse-failure' => "error a en importar l'XML",
 'import-noarticle' => 'No hi ha cap pàgina per importar!',
-'import-nonewrevisions' => "Totes les revisions s'havien importat abans.",
+'import-nonewrevisions' => "No s'ha importat cap revisió (ja hi eren abans o s'han omès a causa d'errors).",
 'xml-error-string' => '$1 a la línia $2, columna $3 (byte $4): $5',
 'import-upload' => 'Carrega dades XML',
 'import-token-mismatch' => 'Pèrdua de dades de sessió. Torneu-ho a intentar.',
index fc31320..a8b99ed 100644 (file)
@@ -320,7 +320,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Кlел сиз хьака хьажориган:',
-'tog-justify' => 'Нисде йоза шораллий агlонца',
 'tog-hideminor' => 'Къайладаха кигийра нисдарш оц могӀама керла хийцамехь',
 'tog-hidepatrolled' => 'Къайладаха гӀаролладина нисдарш оц могӀама керла нисдаршкахь',
 'tog-newpageshidepatrolled' => 'Къайлайаха гlароллайина агlонаш оц могlама керла агlонашкахь',
@@ -480,11 +479,10 @@ $messages = array(
 # Vector skin
 'vector-action-addsection' => 'ТӀетоха хьедар',
 'vector-action-delete' => 'ДӀаяккха',
-'vector-action-move' => 'Цlе хийца',
+'vector-action-move' => 'ЦӀе хийца',
 'vector-action-protect' => 'Гlаролла дé',
 'vector-action-undelete' => 'Меттахlоттадé',
 'vector-action-unprotect' => 'ГӀароллех къаста',
-'vector-simplesearch-preference' => 'Атта лахаран хьехар лата де («Векторан» кечярна бен)',
 'vector-view-create' => 'Кхоллар',
 'vector-view-edit' => 'Нисйé',
 'vector-view-history' => 'АгӀона хийцамаш',
@@ -688,7 +686,7 @@ URL язъеш гӀалат даьлла хила мега.
 ХӀу бахьна ду билгал дина дац.',
 'no-null-revision' => '«$1» агӀона нисдар дан цаделира',
 'badtitle' => 'Цамегаш йолу цlе',
-'badtitletext' => 'Дехарца йолу агlонан цlе нийса яц, йаьсса ю, хила мега нийса ца хlоттийна меттаюкъар йа юкъарвики цlе. Хила мега, цlарца цамагош йолу саберг.',
+'badtitletext' => 'Дехарца йолу агӀонан цӀе нийса яц, йаьсса ю, хила мега нийса ца хӀоттийна меттаюкъар йа юкъарвики цӀе. Хила мега, цӀарца цамагош йолу символаш.',
 'perfcached' => 'Лахара хаам схьаэца кэша чура цундела тӀехьарлаьра хийцамаш гойтуш бац. Кэша чохь латтаё оцул $1  кӀезиг {{PLURAL:$1|1=дӀаяздар|дӀаяздарш}}.',
 'perfcachedts' => 'Лахара хаам схьаэца кэша чура иза тӀаьхьара карла ялла $1. Кэша чохь латта до оцул $4 кӀезиг {{PLURAL:$4|1=дӀаяздар|дӀаяздарш}}.',
 'querypage-no-updates' => 'ХӀинца хӀара агӀо карлаякхар дӀадайина ду.
@@ -1104,7 +1102,7 @@ URL язъеш гӀалат даьлла хила мега.
 'revdelete-hide-image' => 'Къайлабаккха файлан чулацам',
 'revdelete-hide-name' => 'Къайлаяккха дешдерг а цуна объект а',
 'revdelete-hide-comment' => 'Хийцамах лаьцнарг',
-'revdelete-hide-user' => 'Ð\9aÑ\8aайлаÑ\8fккÑ\85а Ð°Ð²Ñ\82оÑ\80ан Ñ\86Ó\80е',
+'revdelete-hide-user' => 'Ð\94екÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ñ\86Ó\80е/IP-адÑ\80еÑ\81',
 'revdelete-radio-same' => '(ма хийца)',
 'revdelete-radio-set' => 'Къайлаяьккхина',
 'revdelete-radio-unset' => 'Гуш ерг',
@@ -1157,16 +1155,18 @@ $1",
 # Diffs
 'history-title' => '$1 — хийцаман истори',
 'difference-title' => '$1 — Версешан башхалла',
-'lineno' => 'Могlа $1:',
+'lineno' => 'МогӀа $1:',
 'compareselectedversions' => 'Хаьржина версеш муха ю хьажа',
 'showhideselectedversions' => 'Гайта/къайлаяха хаьржина башхонаш',
 'editundo' => 'цаоьшу',
 'diff-empty' => '(башхалла яц)',
-'diff-multi' => '({{PLURAL:$1|1=гайтина яц $1 юккъера верси|гайтина яц $1 юккъера версеш}} {{PLURAL:$2|1=$2 декъашхочун|$2 декъашхой}})',
+'diff-multi-sameuser' => '(ца {{PLURAL:$1|гайтина юккъера цхьа верси|гайтина юккъера цхьа версеш}} оьцу декъашхочун)',
+'diff-multi-otherusers' => '(ца {{PLURAL:$1|гайтина юккъера верси|гайтина юккъера версеш}} {{PLURAL:$2|кхин цхьан декъашхочун|$2 декъашхойн}})',
 
 # Search results
 'searchresults' => 'Лахарна хилам',
 'searchresults-title' => 'Лаха «$1»',
+'titlematches' => 'АгӀонийн цӀераш цхьаьнанисялар',
 'notextmatches' => 'Агlонаш чура йозанашца цхьатера йогlуш яц',
 'prevn' => 'хьалхарнаш {{PLURAL:$1|$1}}',
 'nextn' => 'тӀаьхьйогӀурш {{PLURAL:$1|$1}}',
@@ -1175,7 +1175,7 @@ $1",
 'shown-title' => 'АгӀона чохь $1 {{PLURAL:$1|1=дӀаяздар|дӀаяздарш}} гайта',
 'viewprevnext' => 'Хьажа ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''ХӀокху вики чохь йолуш ю ишта агӀо «[[:$1]]»'''",
-'searchmenu-new' => "'''Кхолла ишта агlо «[[:$1]]» хlокху вики-кхолламашчохь!'''",
+'searchmenu-new' => "'''Кхолла ишта агӀо «[[:$1]]» хӀокху {{PLURAL:$2|0=|вики-проектехь.}}'''",
 'searchprofile-articles' => 'Къаьстина агlонаш',
 'searchprofile-project' => 'ГӀона а проектан а агӀонаш',
 'searchprofile-images' => 'Мультимедиа',
@@ -1472,7 +1472,7 @@ $1",
 'rc_categories_any' => 'Муьлхаа',
 'rc-change-size-new' => 'Хийцам бинчул тӀехьа болу барам: $1 {{PLURAL:$1|байт}}',
 'newsectionsummary' => '/* $1 */ Керла хьедар',
-'rc-enhanced-expand' => 'Гайта ма дарра дерг (лелош ю JavaScript)',
+'rc-enhanced-expand' => 'Гайта мадарра',
 'rc-enhanced-hide' => 'Ма дарра дерг къайладаккха',
 'rc-old-title' => 'дуьххьара кхоьллина яра цӀарца «$1»',
 
@@ -1514,6 +1514,9 @@ $1",
 'ignorewarning' => 'ХӀума дац чуяккха файл',
 'ignorewarnings' => 'ДӀахедар тергал ца дан',
 'badfilename' => 'Файлан цӀе хийцина → $1.',
+'filetype-mime-mismatch' => 'Файлан шоръелла «.$1» оцунна MIME-тайпанца йогӀуш яц ($2).',
+'filetype-banned-type' => "'''«.$1»''' — {{PLURAL:$4|1=ца магийна файлан тайп|ца магийна файлийн тайпанаш}}.
+{{PLURAL:$3|1=Магийна файлан тайп ю|Магийна файлийн тайпанаш ю:}} $2.",
 'emptyfile' => 'Ахьа чуйоккхуш йолу файл еса хийла там бу. Иза гӀалат хийла мега файлан цӀе нийса язйина йоцу дела. Дехар до хьажа бакъалла и юьй ахьа чуйоккхуш йолу файл.',
 'fileexists' => 'Иштта цӀе йолу файл йолуш ю. Дехар до, хьажа <strong>[[:$1]]</strong>, лаьий хьуна и хийца. 
 [[$1|thumb]]',
@@ -1563,6 +1566,9 @@ MGP # Pentax
 PICT # тайп тайпан
  #</pre> <!-- битийша хlара могlа ша мабарра -->',
 
+# File backend
+'backend-fail-readonly' => 'ХӀара «$1» хӀинца еша бен таро яц. Бахьна: «$2»',
+
 # HTTP errors
 'http-timed-out' => 'Хьежаран хан чекхели HTTP-жоп дехаран.',
 
@@ -1625,9 +1631,12 @@ PICT # тайп тайпан
 'filedelete' => '$1 — дӀаяккхар',
 'filedelete-legend' => 'ДӀаяккха файл',
 'filedelete-intro' => "Хьо файл '''[[Media:$1|$1]]''' дӀаяккха гӀерта цунна массо истори цхьан.",
+'filedelete-intro-old' => '<span class="plainlinks">Ахьа дӀайоккхуш ю верси \'\'\'[[Media:$1|$1]]\'\'\' цу [$4 $3, $2].</span>',
 'filedelete-comment' => 'Бахьан:',
 'filedelete-submit' => 'ДӀаяккха',
 'filedelete-success' => '$1 дӀаяккхи.',
+'filedelete-success-old' => "Верси '''[[Media:$1|$1]]''' цу $3 $2 дӀаяьккхина.",
+'filedelete-nofile' => "'''$1''' яц.",
 'filedelete-otherreason' => 'Кхин бахьан:',
 'filedelete-reason-otherlist' => 'Кхин бахьан',
 'filedelete-reason-dropdown' => '* Даржина долу дӀаяккхаран баьхьанаш 
@@ -1688,7 +1697,7 @@ PICT # тайп тайпан
 'doubleredirects' => 'Шалха дIасахьажийнарш',
 'doubleredirectstext' => 'ХӀокху агӀонехь ю дӀасахьажорашан тӀе хьажийна йолу дӀасахьажораш.
 <del>ТӀехула сиз хаькхна </del>нисйина чарна.',
-'double-redirect-fixed-move' => 'Агlон [[$1]] цlе хийцна, хlинца иза дlахьажийна оцу [[$2]]',
+'double-redirect-fixed-move' => 'АгӀон [[$1]] цӀе хийцина, хӀинца иза дӀахьажийна оцу [[$2]]',
 
 'brokenredirects' => 'ДIахаьдна долу дIасахьажораш',
 'brokenredirectstext' => 'Лахара дӀасахьажийнарш ю йоцучу агӀонийн тӀе хьажийна:',
@@ -1741,6 +1750,14 @@ PICT # тайп тайпан
 'protectedpages' => 'ГIаролла дина агIонаш',
 'protectedpages-indef' => 'Хан йоцуш гӀоралла динарш бен',
 'protectedpages-cascade' => 'Чахчарин гӀоралла бен',
+'protectedpages-timestamp' => 'Терахь/хан',
+'protectedpages-page' => 'АгӀо',
+'protectedpages-expiry' => 'Чекхйолу',
+'protectedpages-performer' => 'Декъашхо ларор',
+'protectedpages-params' => 'ГӀаролийн параметраш',
+'protectedpages-reason' => 'Бахьан',
+'protectedpages-unknown-timestamp' => 'Хууш дац',
+'protectedpages-unknown-performer' => 'Хууш доцу декъашхо',
 'protectedtitles' => 'ГIаролла дина цIераш',
 'listusers' => 'Декъашхой могlам',
 'listusers-editsonly' => 'Цхаъ мукъане а хийцам бина декъашхой гайта',
@@ -1750,8 +1767,8 @@ PICT # тайп тайпан
 'newpages' => 'Керла агlонаш',
 'newpages-username' => 'Декъашхо:',
 'ancientpages' => 'Яззамаш оцу терахьца тӀаьххьара тадар дина долу',
-'move' => 'Цlе хийца',
-'movethispage' => 'Хlокху агlон цlе хийца',
+'move' => 'ЦӀе хийца',
+'movethispage' => 'ХӀокху агӀон цӀе хийца',
 'unusedimagestext' => 'Дехар до, тидаме эца, кхин йолу дуьнана машан-меттигаш а лелош хила мега нийсса йогӀу хьажораг (URL) хӀокху хӀуман, хӀокху могӀаме йогӀуш ялахь яцахь а иза хила мега жигара лелош.',
 'unusedcategoriestext' => 'ХӀокху категорешан чохь агӀонаш я кхин категореш яц.',
 'notargettitle' => 'Ӏалашо билгал йина яц',
@@ -1788,7 +1805,7 @@ PICT # тайп тайпан
 'allinnamespace' => 'Массо агlонаш оцу цlери анахь «$1»',
 'allpagessubmit' => 'Кхочушдé',
 'allpagesprefix' => 'Лаха агlонаш, дlайуьлалуш йолу:',
-'allpagesbadtitle' => 'Цамагош йолу агlон цlе. Коьрта могlан юкъах ю юкъарвики меттанашан юкъе тlечlагlйина йолу хьаьрк йа магийна доцу оцу коьрта моlанца сабол элп йа кхин.',
+'allpagesbadtitle' => 'Цамагош йолу агӀон цӀе. Коьрта могӀан юкъах ю юкъарвики меттанашан юкъе тӀечӀагӀйина йолу хьаьрк йа магийна доцу оцу коьрта моӀанца символаш йа кхин.',
 'allpages-bad-ns' => '{{SITENAME}} кху чохь ана цlераш яц «$1».',
 'allpages-hide-redirects' => 'Къайлаяха дӀасахьажийнарш',
 
@@ -1828,7 +1845,7 @@ PICT # тайп тайпан
 'activeusers-noresult' => 'Декъашхой цакарий.',
 
 # Special:ListGroupRights
-'listgrouprights' => 'Ð\94екÑ\8aаÑ\88Ñ\85ойн Ñ\82обанаÑ\88и бакъонаш',
+'listgrouprights' => 'Ð\94екÑ\8aаÑ\88Ñ\85ойн Ñ\82обанийн бакъонаш',
 'listgrouprights-summary' => 'Лахахьа гойту декъашхошна яла йиш йолу бакъонаш. [[{{MediaWiki:Listgrouprights-helppage}}|хьажа кхин хааме]].',
 'listgrouprights-key' => 'Легенда:
 * <span class="listgrouprights-granted">Ела бакъонаш</span>
@@ -1876,6 +1893,7 @@ PICT # тайп тайпан
 'notanarticle' => 'Бац яззам',
 'watchlist-details' => 'Хьан тергаме могlамца $1 {{PLURAL:$1|агlо|агlонаш|агlонаш}} ю, дийцаре агlонаша йоцуш.',
 'wlheader-showupdated' => "Хийцам бина агӀонаш '''Ӏаьржа''' шрифтцан билгальяха ю.",
+'wlnote2' => 'Лахахьа гайтина {{PLURAL:$1|тӀеххьара сахьт}} чохь бина хийцамаш $2 $3.',
 'wlshowlast' => 'Гайта тlаьххьара $1 сахьташ $2 денош $3',
 'watchlist-options' => 'Тергаме могlаман гlирс нисбар',
 
@@ -1912,6 +1930,7 @@ PICT # тайп тайпан
 ** авторан лаамца
 ** авторан бакъонаш талхор',
 'delete-edit-reasonlist' => 'Бахьанин список нисяр',
+'deleting-backlinks-warning' => "'''ДӀахьедар.''' Ахьа дӀайоккхуш йолчун тӀе товжийна кхин агӀонаш ю.",
 
 # Rollback
 'rollback' => 'Юхабаккха хийцам',
@@ -1938,7 +1957,7 @@ PICT # тайп тайпан
 'unprotectedarticle' => 'ГӀоролла дӀадаьстина «[[$1]]»',
 'movedarticleprotection' => '«[[$2]]» агӀона тӀера гӀаролла «[[$1]]» агӀона тӀе даьккхина',
 'protect-title' => 'Оцунна «$1» гӀоралла дар',
-'prot_1movedto2' => '«[[$1]]» цlе хийцина оцу «[[$2]]»',
+'prot_1movedto2' => '«[[$1]]» цӀе хийцина оцу «[[$2]]»',
 'protect-legend' => 'Бакъде гӀоралла дар',
 'protectcomment' => 'Бахьан:',
 'protectexpiry' => 'Чекхйолу:',
@@ -2182,24 +2201,24 @@ PICT # тайп тайпан
 '''ДӀАХЬЕДАР!'''
 
 ЦӀе хийцар бахьнехь гӀаръялла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.",
-'movepagetalktext' => "Тlе хlоьттина йолу дийцаре агlо ишта цlе хийцина хира ю, '''цхьа йолу ханчохь, маца:'''
+'movepagetalktext' => "ТӀе хӀоьттина йолу дийцаре агӀо ишта цӀе хийцина хира ю, '''цхьа йолу ханчохь, маца:'''
 
-*Йаьсса йоцу дийцаре агlо йолуш ю оцу цlарца йа
-*Ахьа къастаман харжам цабиняхь а къастам хlотточехь.
+*Йаьсса йоцу дийцаре агӀо йолуш ю оцу цӀарца йа
+*Ахьа къастаман харжам цабиняхь а къастам хӀотточехь.
 
-Ишта чу ханчохь, ахьа дехьа яккха йезар ю йа куьйга хlоттайар, нагахь иза хьашт йалахь.",
+Ишта чу ханчохь, ахьа дехьа яккха йезар ю йа куьйга хӀоттайар, нагахь иза хьашт йалахь.",
 'movearticle' => 'Цle хийца хlокху агlон',
 'moveuserpage-warning' => "'''Тергам бе.''' Хьо декъашхочун агӀона цӀе хийца гӀерта. Дехар до, тергам бе, декъашхочун агӀона цӀе бен хийца лур яц, декъашхочун дӀаяздаран цӀе хийца лур яц.",
 'newtitle' => 'Керла цlе',
 'move-watch' => 'Латайé хӀара агӀо тергаме могӀанан юкъахь',
-'movepagebtn' => 'Агlон цlе хийца',
-'pagemovedsub' => 'Агlон цlе хийцина',
-'movepage-moved' => "'''Агlон цlе «$1» хийцина хlокху «$2»'''",
+'movepagebtn' => 'АгӀон цӀе хийца',
+'pagemovedsub' => 'АгӀон цӀе хийцина',
+'movepage-moved' => "'''АгӀон цӀе «$1» хийцина хӀокху «$2»'''",
 'movepage-moved-redirect' => 'Кхоьллина дӀасахьажориг.',
 'movepage-moved-noredirect' => 'ДӀасхьажориг кхоллар дохина.',
-'articleexists' => 'Хlарасанна цlе йолу агlо йолуш ю йа ахьа гойтуш йолу цlе магош яц.
-Дехар до, харжа кхин цlе.',
-'movetalk' => 'Цуьнца йогlуш йолу дийцаре агlон цlе хийцар',
+'articleexists' => 'ХӀарасанна цӀе йолу агӀо йолуш ю йа ахьа гойтуш йолу цӀе магош яц.
+Дехар до, харжа кхин цӀе.',
+'movetalk' => 'Цуьнца йогӀуш йолу дийцаре агӀон цӀе хийцар',
 'move-subpages' => 'ЦӀeрш хийцае бухара агӀонаши ($1 кхаччалц)',
 'move-talk-subpages' => 'ЦӀе хийца бухара агӀонаши а агӀонашан дийцаре а ($1  кхаччалц)',
 'movepage-page-exists' => 'Агӏо $1 йолуш ю цундела и ша юху дӏаязъян йиш яц.',
@@ -2220,6 +2239,10 @@ PICT # тайп тайпан
 'selfmove' => 'АгӀона цӏе хийца йиш яц: и цӏе хӏокху агӏона йолуш ю.',
 'immobile-source-page' => 'ХӀокху агӏона цӏе хийца йиш яц.',
 'bad-target-model' => 'Йиш яц хийца $1 оцу $2: цхьаьна ца догӀу моделин хаамаш.',
+'imagenocrossnamespace' => 'Кхечу цӀерийн меттигийн чура цӀе файлан тилла йиш яц',
+'nonfile-cannot-move-to-file' => 'АгӀонийн цӀераш хийца йиш яц',
+'imagetypemismatch' => 'Файлан керла шоръелла оцунна тайпанца йогӀуш яц',
+'imageinvalidfilename' => 'Файлан цӀе гӀалате ю',
 'move-leave-redirect' => 'Ӏадйита дӀасахьажораг',
 'protectedpagemovewarning' => "'''ДӀахьедар.''' ХӀара агӀо гӀаролла йина ю; цӀе хийца я нисйа а бакъо йолуш куьйгалхой бе бац.
 Лахахьа тептаро балийна тӀаьхьаралера дӀаязбина хаам:",
@@ -2244,10 +2267,11 @@ PICT # тайп тайпан
 # Namespace 8 related
 'allmessages' => 'Гlирса хаамаш',
 'allmessagesname' => 'Хаам',
-'allmessagesdefault' => 'Шаьшха йоза',
+'allmessagesdefault' => 'Ӏад дитарца йоза',
 'allmessagescurrent' => 'Карарчу хенан йоза',
 'allmessagestext' => 'ХӀара «MediaWiki» цӀерийн меттигера системан хаамийн могӀа бу.
 Хьайна MediaWiki тая лууш делахь, дехар до, проект [//translatewiki.net translatewiki.net] [https://www.mediawiki.org/wiki/Localisation юьйцучу хьажа].',
+'allmessagesnotsupportedDB' => "'''\$wgUseDatabaseMessages''' дӀаяйина хилар бахьнехь хӀара агӀо дӀачӀаьгӀна ю.",
 'allmessages-filter-legend' => 'Литтар',
 'allmessages-filter' => 'Литтар оцу хьола хийцамца:',
 'allmessages-filter-unmodified' => 'Хийцан йоцурш',
@@ -2256,6 +2280,7 @@ PICT # тайп тайпан
 'allmessages-prefix' => 'Литтар оцу дешахьалхе:',
 'allmessages-language' => 'Мотт:',
 'allmessages-filter-submit' => 'Дехьа гӀо',
+'allmessages-filter-translate' => 'Гочйе',
 
 # Thumbnails
 'thumbnail-more' => 'Доккха де',
@@ -2290,7 +2315,7 @@ PICT # тайп тайпан
 'tooltip-ca-protect' => 'Гlаролла дé хlокху агlон хийцам цабайта',
 'tooltip-ca-unprotect' => 'Дlадаккха хlокху агlонна долу гаролла',
 'tooltip-ca-delete' => 'ДӀаяккха хӀара агӀо',
-'tooltip-ca-move' => 'Агlон цlе хийца',
+'tooltip-ca-move' => 'АгӀон цӀе хийца',
 'tooltip-ca-watch' => 'ТӀетоха хӀара агӀо сан тергаме могӀанан юкъа',
 'tooltip-ca-unwatch' => 'ДӀаяккха хӀара агӀо хьай тергаме могӀанан юкъар',
 'tooltip-search' => 'Лаха иза дош',
@@ -2371,7 +2396,7 @@ PICT # тайп тайпан
 'skinname-vector' => 'Векторни',
 
 # Patrolling
-'markaspatrolledtext' => 'Ð\9fайден Ð°Ð³Ó\8fо Ñ\85илаÑ\80 Ð±Ð¸Ð»Ð³Ð°Ð»Ð¾ Ñ\8fн',
+'markaspatrolledtext' => 'Ð\91илгала Ð¹Ðµ Ñ\85Ó\80аÑ\80а Ð°Ð³Ó\80о Ñ\85Ñ\8cаÑ\8cжна Ñ\81ана',
 'markedaspatrollednotify' => 'АгӀо «$1» пайдане хилар билгалдина',
 
 # Patrol log
@@ -2391,7 +2416,7 @@ PICT # тайп тайпан
 'file-info-size' => '$1 × $2 пиксель, файлан барам: $3, MIME-тайп: $4',
 'file-info-size-pages' => '$1 × $2 пиксель, файлан барам: $3, MIME-тайп: $4, $5 {{PLURAL:$5|1=агӀо|агӀонаш}}',
 'file-nohires' => 'Кхи йоккха гlоле башхо яц.',
-'svg-long-desc' => 'SVG-файл, лартӀахь ю $1 × $2 {{PLURAL:$2|пиксель|пикселш|пикселш}}, файлан барам: $3',
+'svg-long-desc' => 'SVG-файл, лартӀахь ю $1 × $2 пиксель, файлан барам: $3',
 'svg-long-desc-animated' => 'Анимироват йина SVG-файл, номиналан $1 × $2 пиксель, файлан барам: $3',
 'show-big-image' => 'Сурт цlанал лаккхара бакъонца',
 'show-big-image-preview' => 'Барам хьажале: $1.',
@@ -2409,6 +2434,8 @@ PICT # тайп тайпан
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'seconds-abbrev' => '$1оцу',
+'minutes-abbrev' => '$1 мин',
+'hours-abbrev' => '$1 сахь.',
 'hours' => '{{PLURAL:$1|1 сахьт}}',
 'days' => '{{PLURAL:$1|$1 де}}',
 'weeks' => '{{PLURAL:$1|$1 кӀира}}',
@@ -2460,8 +2487,10 @@ PICT # тайп тайпан
 'exif-bitspersample' => 'Бесан кIоргалла',
 'exif-photometricinterpretation' => 'Беснин модель',
 'exif-orientation' => 'Суьртан хьал',
+'exif-ycbcrpositioning' => 'Y а C а компонентин листаран кеп',
 'exif-xresolution' => 'Шоралла',
 'exif-yresolution' => 'Локхалла',
+'exif-referenceblackwhite' => 'Ӏаьржа а къай а тӀадамийн меттиг',
 'exif-datetime' => 'Файл хийцина терахь а хан',
 'exif-imagedescription' => 'Суьртан цӏе',
 'exif-make' => 'Камера арахоьцург',
@@ -2469,17 +2498,33 @@ PICT # тайп тайпан
 'exif-software' => 'Лелина программа',
 'exif-copyright' => 'Авторан бакъо ерг',
 'exif-exifversion' => 'Верси Exif',
+'exif-flashpixversion' => 'Ловш йолу верси FlashPix',
 'exif-colorspace' => 'Беснашан хьал',
+'exif-componentsconfiguration' => 'Бесара компонентин конфигураци',
 'exif-compressedbitsperpixel' => 'Бесан кIоргалла дацдина чул тӀехьа',
 'exif-pixelxdimension' => 'Суьртан локхалла',
 'exif-datetimeoriginal' => 'Дуьххьарлера терахь а хан',
 'exif-datetimedigitized' => 'Оцифровк йина терахь а хан а',
-'exif-exposuretime' => 'Экспозицин хан',
+'exif-subsectime' => 'Файлан хийцам баран хан секундашкахь',
+'exif-exposuretime' => 'Сурт доккхуш йолу серлон хьал',
 'exif-fnumber' => 'Диафрагмин дукхалла',
-'exif-maxaperturevalue' => 'Минимальни диафрагмин дукхалла',
+'exif-shutterspeedvalue' => 'APEX чура дешнаш',
+'exif-aperturevalue' => 'APEX чура оьз',
+'exif-exposurebiasvalue' => 'Сурт доккхуш яла оьшу серло меттаяло',
+'exif-maxaperturevalue' => 'Минимальни оьзан дукхалла',
+'exif-meteringmode' => 'Сурт доккхуш яла серло юьстаран хьал',
+'exif-flash' => 'Серлона статус',
 'exif-focallength' => 'Фокусни бохалла',
+'exif-focalplanexresolution' => 'X магийна фокалан тӀапа',
+'exif-focalplaneyresolution' => 'Y магийна фокалан тӀапа',
+'exif-focalplaneresolutionunit' => 'Магоран фокалан дустар',
 'exif-sensingmethod' => 'Сенсоран тайп',
 'exif-filesource' => 'Файлан хьост',
+'exif-customrendered' => 'Кхин тӀе кечдар',
+'exif-exposuremode' => 'Сурт доккхуш йолу серлон хьал харжар',
+'exif-whitebalance' => 'Къайн баланс',
+'exif-digitalzoomratio' => 'Терхьаш дукха хиларан коэффициент',
+'exif-scenecapturetype' => 'Сурт доккхуш йолу меттиган тайп',
 'exif-imageuniqueid' => 'Суьртан номер (ID)',
 'exif-gpslatitude' => 'Шоралла',
 'exif-gpslongitude' => 'Дохалла',
@@ -2513,15 +2558,29 @@ PICT # тайп тайпан
 'exif-orientation-1' => 'Лартӏахь',
 
 'exif-xyresolution-i' => '$1 тӏадамаш дюйман',
+'exif-xyresolution-c' => '$1 тӀадамаш сантиметрна',
+
+'exif-meteringmode-5' => 'Матрин',
 
 'exif-lightsource-1' => 'Ден хьехам',
+'exif-lightsource-4' => 'Серло',
 'exif-lightsource-9' => 'Хаза хенан хӀоттам',
 'exif-lightsource-10' => 'Мархаш йолу',
 
+'exif-focalplaneresolutionunit-2' => 'дюйм',
+
 'exif-filesource-3' => 'Терахьийн суртдохку аппарат',
 
 'exif-scenetype-1' => 'Сурт даьккхина нис дуьххьал',
 
+'exif-customrendered-0' => 'ХӀума дийна дац',
+'exif-customrendered-1' => 'Нийса доцу кечдар',
+
+'exif-whitebalance-0' => 'Къайн автоматически баланс',
+'exif-whitebalance-1' => 'Куьйга хӀоттийна къайн баланс',
+
+'exif-scenecapturetype-0' => 'Стандартан',
+
 'exif-gaincontrol-0' => 'Яц',
 
 'exif-contrast-0' => 'Лартӏахь',
@@ -2530,6 +2589,8 @@ PICT # тайп тайпан
 
 'exif-sharpness-0' => 'Лартӏахь',
 
+'exif-ycbcrpositioning-1' => 'Юкъйина',
+
 'exif-dc-date' => 'Терахь(ш)',
 'exif-dc-rights' => 'Бакъонаш',
 
@@ -2616,6 +2677,7 @@ PICT # тайп тайпан
 'version-ext-colheader-credits' => 'Автораш',
 'version-poweredby-credits' => "ХӀара вики болх беш ю '''[https://www.mediawiki.org/ MediaWiki]''' движок тӀехь, copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'кхин',
+'version-poweredby-translators' => 'гочдархой translatewiki.net',
 'version-license-info' => 'MediaWiki ю маьрша программин латораг, шу йиш ю фондас арахецна йолу GNU General Public License лицензица и яржо я хийца а.
 
 MediaWiki яржош ю и шуна пайдане хир яц те аьлла, амма  ЦХЬА ЮКЪАРАХИЛАР ДОЦУШ. Хь. кхин. лицензи мадарра GNU General Public License .
@@ -2623,6 +2685,10 @@ MediaWiki яржош ю и шуна пайдане хир яц те аьлла,
 Шоьга кхача езаш яра [{{SERVER}}{{SCRIPTPATH}}/COPYING копи GNU General Public License] хӀокху программица, кхаьчна яцахь язъе Free Software Foundation, Inc., адрес тӀе: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA я [//www.gnu.org/licenses/old-licenses/gpl-2.0.html еша и онлайнехь].',
 'version-software' => 'ДӀахӀоттийна программин латтор',
 'version-software-version' => 'Верси',
+'version-entrypoints' => 'ЧугӀо адресин тӀадамаш',
+'version-entrypoints-header-entrypoint' => 'Яздаран тӀадам',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath АгӀона тӀе некъ]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Скриптан тӀе некъ]',
 
 # Special:Redirect
 'redirect' => 'Декъашхочун файлан тӀера дӀасхьажор',
@@ -2729,7 +2795,7 @@ MediaWiki яржош ю и шуна пайдане хир яц те аьлла,
 'logentry-newusers-newusers' => '{{GENDER:$2|ДӀавазвелла|ДӀаязелла}} керла декъашхо $1',
 'logentry-newusers-create' => '{{GENDER:$2|ДӀавазвелла|ДӀаязелла}} керла декъашхо $1',
 'logentry-newusers-autocreate' => 'Автоматически кхоьллина {{GENDER:$2|декъашхочун}} $1 дӀаяздар',
-'logentry-rights-rights' => '$1 {{GENDER:$2|хийцина}} хӀокхуна $3 бакъо $4 → $5',
+'logentry-rights-rights' => '$1 {{GENDER:$2|хийцина}} $3 бакъо $4 → $5',
 'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|хийцина}} хӏокхуна $3 бакъо',
 'rightsnone' => '(яц)',
 
index d752e19..9af4e9b 100644 (file)
@@ -187,7 +187,6 @@ $dateFormats = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'ھێڵ ھێنان بەژێر بەستەرەکان:',
-'tog-justify' => 'پەرەگرافەکان پڕاوپر نیشان بدە',
 'tog-hideminor' => 'دەستکارییە بچووکەکان لە دوایین گۆڕانکارییەکاندا بشارەوە',
 'tog-hidepatrolled' => 'لە دوایین گۆڕانکارییەکاندا دەستکارییە پاس دراوەکان بشارەوە',
 'tog-newpageshidepatrolled' => 'لە پێرستی پەڕە نوێکاندا پەڕە پاس دراوەکان بشارەوە',
@@ -1172,7 +1171,6 @@ $1",
 'compareselectedversions' => 'پیاچوونەوە ھەڵبژێردراوەکان ھەڵسەنگێنە',
 'showhideselectedversions' => 'پیاچوونەوە ھەڵبژێردراوەکان نیشانبدە/بشارەوە',
 'editundo' => 'پووچەڵکردنەوە',
-'diff-multi' => '({{PLURAL:$1|پیاچوونەوەیەکی نێوانی|$1 پیاچوونەوەی نێوانی}}ی {{PLURAL:$2|بەکارھێنەرێک|$2 بەکارھێنەر}} نیشان نەدراوە)',
 
 # Search results
 'searchresults' => 'ئاکامەکانی گەڕان',
@@ -2086,7 +2084,6 @@ $1',
 'watchmethod-list' => 'سەرنج‌دانی لاپەڕە چاودێری‌کراوەکان بۆ دوایین دەستکاریەکان',
 'watchlistcontains' => 'لیستی چاودێڕییەکانت $1 {{PLURAL:$1|پەڕە|پەڕە}}ی تێدایە.',
 'iteminvalidname' => "ھەڵە لەگەڵ بابەتی '$1'، ناوی نادروست...",
-'wlnote' => "خوارەوە {{PLURAL:$1|دوایین گۆڕانکارییە|دوایین '''$1''' گۆڕانکارییە}} لە دوایین {{PLURAL:$2|کاتژمێر|'''$2''' کاتژمێر}}دا ھەتا $4 لە $3.",
 'wlshowlast' => 'دوایین $1 کاتژمێر $2 ڕۆژی $3 نیشان بدە',
 'watchlist-options' => 'ھەڵبژاردەکانی لیستی چاودێری',
 
@@ -2696,7 +2693,6 @@ $1',
 'tooltip-pt-watchlist' => 'پێرستی ئەو پەڕانە کە چاودێریی گۆڕانکارییەکانیانی دەکەی',
 'tooltip-pt-mycontris' => 'پێرستی بەشدارییەکانت',
 'tooltip-pt-login' => 'پێشنیارت پێدەکرێ بچیتە ژوورەوە؛ ھەرچەندە زۆرت لێناکرێ',
-'tooltip-pt-anonlogin' => 'پێشنیار دەکەین بڕۆیتەژوورەوە، ئەگەرچی ئەوە زۆرەملیی نیە',
 'tooltip-pt-logout' => 'دەرچوون',
 'tooltip-ca-talk' => 'لێدوان دەربارەی ناوەڕۆکی پەرە',
 'tooltip-ca-edit' => 'دەتوانی دەستکاریی ئەم پەڕەیە بکەیت. تکایە پێش پاشەکەوتکردن دوگمەی پێشبینین بەکاربێنە.',
index f742c57..3295de0 100644 (file)
 $fallback = 'it';
 
 $messages = array(
+# User preference toggles
+'tog-hideminor' => "Piattà e mudifiche minore in l'ultime mudifiche",
+'tog-hidepatrolled' => "Piattà e mudifiche verificate in l'ultime mudifiche",
+'tog-newpageshidepatrolled' => 'Piattà e pagine verificate da a lista di e pagine più recente',
+'tog-watchlisthidebots' => 'Piattà e mudifiche di i boti in e pagine speciale',
+'tog-showhiddencats' => 'Mustrà e categurie nascoste',
+
 'underline-always' => 'Sempre',
 'underline-never' => 'Mai',
 
@@ -70,7 +77,12 @@ $messages = array(
 'oct' => 'ott',
 'nov' => 'nuv',
 'dec' => 'dic',
+'january-date' => '{{PLURAL:$1|1°|$1}} ghjennaghju',
+'february-date' => '{{PLURAL:$1|1°|$1}} ferraghju',
+'march-date' => '{{PLURAL:$1|1°|$1}} marzu',
 'may-date' => '{{PLURAL:$1|1°|$1}} maghju',
+'june-date' => '{{PLURAL:$1|1°|$1}} ghjugnu',
+'july-date' => '{{PLURAL:$1|1°|$1}} lugliu',
 'august-date' => '{{PLURAL:$1|1°|$1}} aostu',
 'september-date' => '{{PLURAL:$1|1°|$1}} sittembre',
 'november-date' => '{{PLURAL:$1|1°|$1}} nuvembre',
@@ -88,6 +100,7 @@ $messages = array(
 'article' => 'Articulu',
 'newwindow' => '(si apre in una nova finestra)',
 'cancel' => 'Annullà',
+'moredotdotdot' => 'Di più...',
 'morenotlisted' => "'Ssa lista ùn hè micca cumpletta",
 'mypage' => 'A me pagina',
 'mytalk' => 'Discussione',
@@ -97,6 +110,8 @@ $messages = array(
 
 # Cologne Blue skin
 'qbfind' => 'Truvà',
+'qbbrowse' => 'Sfuglià',
+'qbedit' => 'Mudificà',
 'qbpageoptions' => 'Issa pagina',
 'qbmyoptions' => 'E mo pagine',
 
@@ -192,6 +207,7 @@ $messages = array(
 'toc' => 'Cuntenutu',
 'showtoc' => 'mustrà',
 'hidetoc' => 'piattà',
+'collapsible-collapse' => 'Cumprime',
 'feed-atom' => 'Atomu',
 'red-link-title' => '$1 (a pagina ùn esiste micca)',
 
@@ -280,6 +296,7 @@ $messages = array(
 'previewnote' => "'''Attentu: questa ùn hè ch'è una previsualisazzione.'''
 E to mudifiche ùn sò ancora state salvate!",
 'editing' => 'Mudifica di $1',
+'creating' => 'A pagina $1 hà da esse creata',
 'editingsection' => 'Mudifica di $1 (sezzione)',
 'editingcomment' => 'Mudifica di $1 (cummentu)',
 'editconflict' => 'Cunflittu di mudificazione: $1',
@@ -306,6 +323,7 @@ Parechji mudelli ùn seranu micca inclusi.",
 'revision-info' => 'Versione di e $4 à e $5 di $2',
 'previousrevision' => '← Versione menu ricente',
 'currentrevisionlink' => 'Ultima revisione',
+'cur' => 'att',
 'page_first' => 'prima',
 'history-fieldset-title' => 'Parcorre a cronolugia',
 'history-show-deleted' => 'Solu quelli cancellati',
@@ -407,6 +425,7 @@ Parechji mudelli ùn seranu micca inclusi.",
 'recentchanges-label-bot' => 'Sta mudifica hè stata effettuata da un botu',
 'recentchanges-label-unpatrolled' => 'Sta mudifica ùn hè ancu stata verificata',
 'recentchanges-label-plusminus' => "A dimensione di a pagina hè stata cambiata di 'ssu numaru d'ottetti",
+'recentchanges-legend-newpage' => '(vede ancu [[Special:NewPages|a lista di e pagine nove]])',
 'rcnotefrom' => "Quì seguitanu e mudifiche dapoi u '''$2''' ('''$1''' à u massimu).",
 'rclistfrom' => 'Mustrà e mudifiche dapoi u $1',
 'rcshowhideminor' => '$1 i cambiamenti minori',
@@ -712,6 +731,9 @@ Parechji mudelli ùn seranu micca inclusi.",
 'anonymous' => '{{PLURAL:$1|Utilizatore anonimu|Utilizatori anonimi}} di {{SITENAME}}',
 'others' => 'altri',
 
+# Info page
+'pageinfo-toolboxlink' => 'Infurmazione annantu à a pagina',
+
 # Media information
 'file-nohires' => 'Una diversione incù una risoluzione più alta ùn hè micca dispunibile.',
 'show-big-image' => 'Schedariu originale',
index f549c7e..1a71328 100644 (file)
@@ -15,7 +15,6 @@
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Kuritan sa idalum ang mga link',
-'tog-justify' => 'Tadlungon ang mga talata',
 'tog-hideminor' => 'Itago ang mga gamay nga ginliwat sang mini lang ginbag-o',
 'tog-hidepatrolled' => 'Itago ang mga napatrolya nga mga na-islan sang mini lang ginbag-o',
 'tog-newpageshidepatrolled' => 'Itago ang mga napatrolya nga mga pahina halin sa bag-o nga lista sang pahina',
@@ -24,9 +23,7 @@ $messages = array(
 'tog-numberheadings' => 'Insigida nga pag-isip sang numero sa mga titulo',
 'tog-showtoolbar' => 'Ipakita ang toolbar sang pag-ilis (kinahanglan ang JavaScript)',
 'tog-editondblclick' => 'Liwaton ang mga pahina sa duwa ka pindot {kinahanglan ang Javascript}',
-'tog-editsection' => 'Pasugtan ang pagilis sang mga seksyon pamaagi sa mga [ilis] nga link',
 'tog-editsectiononrightclick' => 'Pasugtan ang pag-ilis sang mga bahin pama-agi sa tu-o nga pagpindot sa mga titulo sang pahina {kinanglan ang JavaScript}',
-'tog-showtoc' => 'Ipakita ang listahan sang mga kaundan (sa mga pahina nga may madamu pa sa 3 ka titulo)',
 'tog-rememberpassword' => 'Dumduma ang pagsulod ko sa mini nga kompyuter (pinakadamu na ang $1 {{PLURAL:$1|adlaw|mga adlaw}})',
 'tog-watchcreations' => 'Idugang sa akon balantayan ang mga pahina nga gin-ubra ko.',
 'tog-watchdefault' => 'Idugang sa akon balantayan ang mga pahina nga akon na-islan',
index 268bcab..6ee57e5 100644 (file)
@@ -108,7 +108,6 @@ $linkPrefixCharset = 'a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-яёА-ЯЁ«„';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Багълантыларнынъ тюбюни сызув:',
-'tog-justify' => 'Метинни эки янгъа тегизле',
 'tog-hideminor' => '"Сонъки денъиштирмелер" саифесинде кичик денъиштирмелерни гизле',
 'tog-hidepatrolled' => 'Сонъки денъиштирмелер косьтергенде тешкерильген денъиштирмелерни гизле',
 'tog-newpageshidepatrolled' => 'Янъы саифелер косьтергенде тешкерильген саифелерни гизле',
@@ -117,9 +116,7 @@ $messages = array(
 'tog-numberheadings' => 'Серлеваларны автоматик номераландыр',
 'tog-showtoolbar' => 'Саифени денъиштирген вакъытта ярдымджы дёгмелерни косьтер. (JavaScript)',
 'tog-editondblclick' => 'Саифени чифт басып денъиштирмеге башла (JavaScript)',
-'tog-editsection' => 'Болюклерни [денъиштир] багълантысы вастасынен денъиштирмеге рухсет бер',
 'tog-editsectiononrightclick' => 'Болюк серлевасына онъ баскъанда денъиштирюв пенджересини ач. (JavaScript)',
-'tog-showtoc' => 'Мундеридже джедвели косьтер (3 данеден зияде серлевасы олгъан саифелер ичюн)',
 'tog-rememberpassword' => 'Киришимни бу браузерде хатырла (энъ чокъ $1 {{PLURAL:$1|1=кунь|кунь}} ичюн)',
 'tog-watchcreations' => 'Яраткъан саифелеримни ве юклеген файлларымны козетюв джедвелиме кирсет',
 'tog-watchdefault' => 'Денъиштирген саифе ве файлларымны козетюв джедвелиме кирсет',
@@ -806,7 +803,6 @@ $3 мына бу себепни бильдирди: ''$2''",
 'compareselectedversions' => 'Сайлангъан версияларны тенъештир',
 'showhideselectedversions' => 'Сайлангъан версияларны косьтер/гизле',
 'editundo' => 'лягъу эт',
-'diff-multi' => '({{PLURAL:$2|1=Бир къулланыджы|$2 къулланыджы}}нынъ япкъан {{PLURAL:$1|1=бир ара версиясы|$1 ара версиясы}} косьтерильмей)',
 'diff-multi-manyusers' => '($2-ден зияде {{PLURAL:$2|1=къулланыджы|къулланыджы}}нынъ япкъан {{PLURAL:$1|1=бир ара версиясы|$1 ара версиясы}} косьтерильмей)',
 
 # Search results
@@ -1376,7 +1372,6 @@ $3 мына бу себепни бильдирди: ''$2''",
 'watchmethod-list' => 'козетюв джедвелиндеки саифелер тешкериле',
 'watchlistcontains' => 'Сизинъ козетюв джедвелинъизде {{PLURAL:$1|1=1|$1}} саифе бар.',
 'iteminvalidname' => '"$1" саифеси мунасебетинен проблема олып чыкъты, эльверишли олмагъан исимдир…',
-'wlnote' => "Ашагъыда саат $3, $4 ичюн сонъки {{PLURAL:$2|1=саат|'''$2''' саат}} ичинде япылгъан сонъки {{PLURAL:$1|1=денъиштирме|'''$1''' денъиштирме}} косьтериле.",
 'wlshowlast' => 'Сонъки $1 саат ичюн, $2 кунь ичюн я да $3 косьтер',
 'watchlist-options' => 'Козетюв джедвели сазламалары',
 
@@ -1671,7 +1666,6 @@ MediaWiki интерфейсининъ чешит тиллерге терджи
 'tooltip-pt-watchlist' => 'Козетювге алгъан саифелеринъиз',
 'tooltip-pt-mycontris' => 'Къошкъан исселеринъизнинъ джедвели',
 'tooltip-pt-login' => 'Отурым ачманъыз тевсие олуныр амма меджбур дегильсинъиз.',
-'tooltip-pt-anonlogin' => 'Отурым ачманъыз тевсие олуныр амма меджбур дегильсинъиз.',
 'tooltip-pt-logout' => 'Системадан чыкъув',
 'tooltip-ca-talk' => 'Саифедеки малюматнен багълы музакере',
 'tooltip-ca-edit' => 'Бу саифени денъиштирип оласынъыз. Сакъламаздан эвель бакъып чыкъмагъа унутманъыз.',
index 602d9b3..76fcec0 100644 (file)
@@ -102,7 +102,6 @@ $linkPrefixCharset = 'a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-яёА-ЯЁ«„';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Bağlantılarnıñ tübüni sızuv:',
-'tog-justify' => 'Metinni eki yanğa tegizle',
 'tog-hideminor' => '"Soñki deñiştirmeler" saifesinde kiçik deñiştirmelerni gizle',
 'tog-hidepatrolled' => 'Soñki deñiştirmeler köstergende teşkerilgen deñiştirmelerni gizle',
 'tog-newpageshidepatrolled' => 'Yañı saifeler köstergende teşkerilgen saifelerni gizle',
@@ -111,9 +110,7 @@ $messages = array(
 'tog-numberheadings' => 'Serlevalarnı avtomatik nomeralandır',
 'tog-showtoolbar' => 'Saifeni deñiştirgen vaqıtta yardımcı dögmelerni köster. (JavaScript)',
 'tog-editondblclick' => 'Saifeni çift basıp deñiştirmege başla (JavaScript)',
-'tog-editsection' => 'Bölüklerni [deñiştir] bağlantısı vastasınen deñiştirmege ruhset ber',
 'tog-editsectiononrightclick' => 'Bölük serlevasına oñ basqanda deñiştirüv penceresini aç. (JavaScript)',
-'tog-showtoc' => 'Münderice cedveli köster (3 daneden ziyade serlevası olğan saifeler içün)',
 'tog-rememberpassword' => 'Kirişimni bu brauzerde hatırla (eñ çoq $1 {{PLURAL:$1|kün|kün}} içün)',
 'tog-watchcreations' => 'Yaratqan saifelerimni ve yüklegen fayllarımnı közetüv cedvelime kirset',
 'tog-watchdefault' => 'Deñiştirgen saife ve fayllarımnı közetüv cedvelime kirset',
@@ -802,7 +799,6 @@ Vikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].',
 'compareselectedversions' => 'Saylanğan versiyalarnı teñeştir',
 'showhideselectedversions' => 'Saylanğan versiyalarnı köster/gizle',
 'editundo' => 'lâğu et',
-'diff-multi' => '({{PLURAL:$2|Bir qullanıcı|$2 qullanıcı}}nıñ yapqan {{PLURAL:$1|bir ara versiyası|$1 ara versiyası}} kösterilmey)',
 'diff-multi-manyusers' => '($2-den ziyade {{PLURAL:$2|qullanıcı|qullanıcı}}nıñ yapqan {{PLURAL:$1|bir ara versiyası|$1 ara versiyası}} kösterilmey)',
 
 # Search results
@@ -880,7 +876,6 @@ Vikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].',
 'rows' => 'Satır',
 'columns' => 'Sutun',
 'searchresultshead' => 'Qıdıruv',
-'resultsperpage' => 'Saifede kösterilecek tapılğan saife sayısı',
 'recentchangesdays' => 'Soñki deñiştirmeler saifesinde kösterilecek kün sayısı:',
 'recentchangesdays-max' => '(eñ çoq $1 {{PLURAL:$1|kün|kün}})',
 'recentchangescount' => 'Ög belgilengen kösterilecek deñiştirmeler sayısı:',
@@ -1372,7 +1367,6 @@ Bundan soñ, bu saifede ve onıñ muzakere saifesinde yapılacaq deñiştirmeler
 'watchmethod-list' => 'közetüv cedvelindeki saifeler teşkerile',
 'watchlistcontains' => 'Siziñ közetüv cedveliñizde {{PLURAL:$1|1|$1}} saife bar.',
 'iteminvalidname' => '"$1" saifesi munasebetinen problema olıp çıqtı, elverişli olmağan isimdir…',
-'wlnote' => "Aşağıda saat $3, $4 içün soñki {{PLURAL:$2|saat|'''$2''' saat}} içinde yapılğan soñki {{PLURAL:$1|deñiştirme|'''$1''' deñiştirme}} kösterile.",
 'wlshowlast' => 'Soñki $1 saat içün, $2 kün içün ya da $3 köster',
 'watchlist-options' => 'Közetüv cedveli sazlamaları',
 
@@ -1666,7 +1660,6 @@ MediaWiki interfeysiniñ çeşit tillerge tercime etüvde iştirak etmege istese
 'tooltip-pt-watchlist' => 'Közetüvge alğan saifeleriñiz',
 'tooltip-pt-mycontris' => 'Qoşqan isseleriñizniñ cedveli',
 'tooltip-pt-login' => 'Oturım açmañız tevsiye olunır amma mecbur degilsiñiz.',
-'tooltip-pt-anonlogin' => 'Oturım açmañız tevsiye olunır amma mecbur degilsiñiz.',
 'tooltip-pt-logout' => 'Sistemadan çıquv',
 'tooltip-ca-talk' => 'Saifedeki malümatnen bağlı muzakere',
 'tooltip-ca-edit' => 'Bu saifeni deñiştirip olasıñız. Saqlamazdan evel baqıp çıqmağa unutmañız.',
index 74628fd..5b9aec3 100644 (file)
  * @author Littledogboy
  * @author Martin Kozák
  * @author Matěj Grabovský
+ * @author Matěj Suchánek
  * @author Mercy
  * @author Michawiki
  * @author Mormegil
  * @author Mr. Richard Bolla
+ * @author Paxt
  * @author Quinn
  * @author Ragimiri
  * @author Reaperman
@@ -366,7 +368,6 @@ $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Podtrhávat odkazy:',
-'tog-justify' => 'Zarovnat odstavce do bloku',
 'tog-hideminor' => 'Skrýt malé editace v posledních změnách',
 'tog-hidepatrolled' => 'Skrýt patrolované editace v posledních změnách',
 'tog-newpageshidepatrolled' => 'Skrýt patrolované stránky ze seznamu nových stránek',
@@ -529,7 +530,6 @@ $messages = array(
 'vector-action-protect' => 'Zamknout',
 'vector-action-undelete' => 'Obnovit',
 'vector-action-unprotect' => 'Změnit zámek',
-'vector-simplesearch-preference' => 'Zapnout zjednodušené vyhledávání (pouze vzhled Vektor)',
 'vector-view-create' => 'Založit',
 'vector-view-edit' => 'Editovat',
 'vector-view-history' => 'Zobrazit historii',
@@ -921,7 +921,7 @@ Pokud se ho rozhodnete uvést, bude použito pro označení autorství vaší pr
 'resetpass_submit' => 'Nastavit heslo a přihlásit se',
 'changepassword-success' => 'Vaše heslo bylo úspěšně změněno!',
 'changepassword-throttled' => 'Provedli jste příliš mnoho pokusů o přihlášení.
-Než to zkusíte znovu, musíte počkat na vypršení lhůty $1.',
+Čekejte prosím $1 a zkuste to znovu.',
 'resetpass_forbidden' => 'Hesla nelze změnit.',
 'resetpass-no-info' => 'K této stránce mají přímý přístup jen přihlášení uživatelé.',
 'resetpass-submit-loggedin' => 'Změnit heslo',
@@ -979,7 +979,7 @@ Dočasné heslo: $2',
 'changeemail-submit' => 'Změnit e-mail',
 'changeemail-cancel' => 'Storno',
 'changeemail-throttled' => 'Provedli jste příliš mnoho pokusů o přihlášení.
-Než to zkusíte znovu, musíte počkat na vypršení lhůty $1.',
+Čekejte prosím $1 a zkuste to znovu.',
 
 # Special:ResetTokens
 'resettokens' => 'Reinicializace klíčů',
@@ -1189,7 +1189,7 @@ Zřejmě byla smazána.',
 'invalid-content-data' => 'Obsažená data jsou chybná',
 'content-not-allowed-here' => 'Obsah typu $1 není na stránce [[$2]] dovolen.',
 'editwarning-warning' => 'Opuštěním této stránky se mohou veškeré provedené změny ztratit.
-Přihlášení uživatelé si mohou toto varování vypnout na záložce „Editace“ v uživatelském nastavení.',
+Přihlášení uživatelé si mohou toto varování vypnout na záložce „{{int:prefs-editing}}“ v uživatelském nastavení.',
 'editpage-notsupportedcontentformat-title' => 'Nepodporovaný formát obsahu',
 'editpage-notsupportedcontentformat-text' => 'Model obsahu $2 nepodporuje formát obsahu $1.',
 
@@ -1225,6 +1225,7 @@ Tyto argumenty byly vynechány.',
 'undo-success' => 'Editace může být zrušena. Zkontrolujte a pak potvrďte změny zobrazené níže.',
 'undo-failure' => 'Editace nemohla být zrušena kvůli konfliktu mezilehlých editací.',
 'undo-norev' => 'Tuto editaci není možné vrátit, protože neexistuje nebo byla smazána.',
+'undo-nochange' => 'Zdá se, že editace již byla zrušena.',
 'undo-summary' => 'Zrušena verze $1 od uživatele [[Special:Contributions/$2|$2]] ([[User talk:$2|diskuse]])',
 'undo-summary-username-hidden' => 'Zrušena verze $1 od skrytého uživatele',
 
@@ -1404,7 +1405,8 @@ Ujistěte se, že tato změna udrží souvislost a posloupnost verzí v historii
 'showhideselectedversions' => 'Zobrazit/skrýt vybrané revize',
 'editundo' => 'zrušit editaci',
 'diff-empty' => '(Žádný rozdíl)',
-'diff-multi' => '({{PLURAL:$1|Není zobrazena 1 mezilehlá verze|Nejsou zobrazeny $1 mezilehlé verze|Není zobrazeno $1 mezilehlých verzí}} od {{PLURAL:$2|1 uživatele|$2 uživatelů}}.)',
+'diff-multi-sameuser' => '({{PLURAL:$1|Není zobrazena 1 mezilehlá verze|Nejsou zobrazeny $1 mezilehlé verze|Není zobrazeno $1 mezilehlých verzí}} od stejného uživatele.)',
+'diff-multi-otherusers' => '({{PLURAL:$1|Není zobrazena 1 mezilehlá verze|Nejsou zobrazeny $1 mezilehlé verze|Není zobrazeno $1 mezilehlých verzí}} od {{PLURAL:$2|1 dalšího uživatele|$2 dalších uživatelů}}.)',
 'diff-multi-manyusers' => '(Není zobrazeno $1 mezilehlých verzí od více než $2 {{PLURAL:$2|uživatele|uživatelů}}.)',
 'difference-missing-revision' => '{{PLURAL:$2|Jedna z revizí|$2 revize|$2 revizí}} k požadovanému porovnání ($1) {{PLURAL:$2|neexistuje|neexistují|neexistuje}}.
 
@@ -1425,7 +1427,7 @@ Podrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'shown-title' => 'Zobrazit $1 {{PLURAL:$1|výsledek|výsledky|výsledků}} na stránku',
 'viewprevnext' => 'Ukázat ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Na této wiki existuje stránka nazvaná „[[:$1]]“.'''",
-'searchmenu-new' => "'''Vytvořte na této wiki stránku „[[:$1]]“!'''",
+'searchmenu-new' => '<strong>Vytvořte na této wiki stránku „[[:$1]]“!</strong> {{PLURAL:$2|0=|Prohlédněte si také stránku nalezenou vaším hledáním.|Prohlédněte si také stránky nalezené vaším hledáním.}}',
 'searchprofile-articles' => 'Články',
 'searchprofile-project' => 'Nápověda a projektové stránky',
 'searchprofile-images' => 'Multimédia',
@@ -1441,7 +1443,7 @@ Podrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'search-result-score' => 'Relevantnost: $1 %',
 'search-redirect' => '(přesměrování $1)',
 'search-section' => '(část $1)',
-'search-file-match' => '(odpovídá obsah souboru)',
+'search-file-match' => '(odpovídá obsahu souboru)',
 'search-suggest' => 'Mysleli jste: $1',
 'search-interwiki-caption' => 'Sesterské projekty',
 'search-interwiki-default' => 'Výsledky z $1:',
@@ -1450,7 +1452,8 @@ Podrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'searcheverything-enable' => 'Hledat ve všech jmenných prostorech',
 'searchrelated' => 'související',
 'searchall' => 'vše',
-'showingresults' => 'Zobrazuji <strong>$1</strong> {{PLURAL:$1|výsledek|výsledky|výsledků}} počínaje od <strong>$2</strong>.',
+'showingresults' => 'Níže zobrazuji nejvýše <strong>$1</strong> {{PLURAL:$1|výsledek|výsledky|výsledků}} počínaje od <strong>$2</strong>.',
+'showingresultsinrange' => 'Níže zobrazuji nejvýše <strong>$1</strong> {{PLURAL:$1|výsledek|výsledky|výsledků}} v rozsahu #<strong>$2</strong>–#<strong>$3</strong>.',
 'showingresultsnum' => 'Zobrazuji <strong>$3</strong> {{PLURAL:$3|výsledek|výsledky|výsledků}} počínaje od <strong>$2</strong>.',
 'showingresultsheader' => "{{PLURAL:$5|Výsledek '''$1''' z '''$3'''|Výsledky '''$1–$2''' z '''$3'''}} pro '''$4'''",
 'search-nonefound' => 'Na váš dotaz nebyly nalezeny žádné výsledky.',
@@ -2266,6 +2269,14 @@ Každý řádek obsahuje odkaz na první a druhé přesměrování a k tomu cíl
 'protectedpages-cascade' => 'Pouze kaskádové zámky',
 'protectedpages-noredirect' => 'Skrýt přesměrování',
 'protectedpagesempty' => 'Žádná stránka není zamčena s těmito parametry.',
+'protectedpages-timestamp' => 'Datum a čas',
+'protectedpages-page' => 'Stránka',
+'protectedpages-expiry' => 'Vyprší',
+'protectedpages-performer' => 'Zamykající',
+'protectedpages-params' => 'Nastavení zámku',
+'protectedpages-reason' => 'Důvod',
+'protectedpages-unknown-timestamp' => 'Neznámé',
+'protectedpages-unknown-performer' => 'Neznámý uživatel',
 'protectedtitles' => 'Zamčené názvy stránek',
 'protectedtitlesempty' => 'S těmito parametry nejsou zamčeny žádné názvy.',
 'listusers' => 'Uživatelé',
@@ -2520,7 +2531,8 @@ Rady a kontakt:
 'confirmdeletetext' => 'Chystáte se smazat stránku s celou její historií. 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]].',
 'actioncomplete' => 'Provedeno',
 'actionfailed' => 'Operace se nezdařila',
-'deletedtext' => 'Stránka nebo soubor „$1“ byla smazána. $2 zaznamenává poslední smazání.',
+'deletedtext' => '„$1“ bylo smazáno.
+$2 zaznamenává poslední smazání.',
 'dellogpage' => 'Kniha smazaných stránek',
 'dellogpagetext' => 'Zde je seznam posledních smazaných stránek.',
 'deletionlog' => 'Kniha smazaných stránek',
@@ -2537,7 +2549,7 @@ Rady a kontakt:
 'delete-edit-reasonlist' => 'Editovat důvody smazání',
 'delete-toobig' => 'Tato stránka má velkou historii editací, přes $1 {{PLURAL:$1|verzi|verze|verzí}}. Mazání takových stránek je omezeno, aby se předešlo nechtěnému narušení {{grammar:2sg|{{SITENAME}}}}.',
 'delete-warning-toobig' => 'Tato stránka má velkou historii editací, přes $1 {{PLURAL:$1|verzi|verze|verzí}}. Mazání takových stránek může narušit databázové operace {{grammar:2sg|{{SITENAME}}}}; postupujte opatrně.',
-'deleting-backlinks-warning' => "'''Upozornění:''' Stránka, kterou se chystáte smazat, je na jiných stránkách odkazována nebo vkládána.",
+'deleting-backlinks-warning' => "'''Upozornění:''' Stránka, kterou se chystáte smazat, je na jiných stránkách odkazována nebo je do nich vložena.",
 
 # Rollback
 'rollback' => 'Vrátit zpět editace',
@@ -2549,7 +2561,7 @@ Rady a kontakt:
 'cantrollback' => 'Nelze vrátit zpět poslední editaci, neboť poslední přispěvatel je jediným autorem této stránky.',
 'alreadyrolled' => 'Nelze vrátit zpět poslední editaci [[:$1]] od uživatele [[User:$2|$2]] ([[User talk:$2|diskuse]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), protože někdo jiný již stránku editoval nebo vrátil tuto změnu zpět.
 
-Poslední editaci této stránky provedl(a) [[User:$3|$3]] ([[User talk:$3|diskuse]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
+Poslední editaci této stránky {{PLURAL:$3|provedl|provedla|provedl uživatel}} [[User:$3|$3]] ([[User talk:$3|diskuse]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "Shrnutí editace bylo: ''„$1“''.",
 'revertpage' => 'Editace uživatele „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|diskuse]]) vráceny do předchozího stavu, jehož autorem je „[[User:$1|$1]]“',
 'revertpage-nouser' => 'Editace skrytého uživatele vráceny do předchozího stavu, jehož {{GENDER:$1|autorem|autorkou}} je „[[User:$1|$1]]“',
@@ -2810,7 +2822,8 @@ Můžete si prohlédnout [[Special:BlockList|seznam zablokovaných uživatelů]]
 'change-blocklink' => 'změnit blok',
 'contribslink' => 'příspěvky',
 'emaillink' => 'poslat e-mail',
-'autoblocker' => 'Byli jste automaticky zablokováni, protože sdílíte IP adresu s uživatelem „[[User:$1|$1]]“. Důvod zablokování tohoto uživatele: „$2“',
+'autoblocker' => '{{GENDER:|Byl jste automaticky zablokován|Byla jste automaticky zablokována|Byli jste automaticky zablokováni}}, protože vaši IP adresu nedávno {{GENDER:$1|používal uživatel|používala uživatelka}} „[[User:$1|$1]]“.
+Důvod zablokování {{GENDER:$1|uživatele $1|uživatelky $1}}: „$2“',
 'blocklogpage' => 'Kniha zablokování',
 'blocklog-showlog' => '{{GENDER:$1|Tento uživatel byl dříve blokován.|Tato uživatelka byla dříve blokována.|Tento uživatel byl dříve blokován.}}
 Zde je pro přehled zobrazen výpis z knihy zablokování:',
@@ -3010,6 +3023,7 @@ $2',
 'thumbnail_image-type' => 'Nepodporovaný typ obrázku',
 'thumbnail_gd-library' => 'Neúplná konfigurace knihovny GD: chybí funkce $1',
 'thumbnail_image-missing' => 'Soubor patrně chybí: $1',
+'thumbnail_image-failure-limit' => 'V poslední době došlo k příliš mnoha neúspěšným pokusům (nejméně $1) o vytvoření tohoto náhledu. Zkuste to později.',
 
 # Special:Import
 'import' => 'Import stránek',
@@ -3043,7 +3057,7 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 'importuploaderrortemp' => 'Nepodařilo se načíst importní soubor. Není k dispozici dočasná složka.',
 'import-parse-failure' => 'Chyba při importu XML',
 'import-noarticle' => 'Není určena žádná stránka na import!',
-'import-nonewrevisions' => 'Všechny verze již byly dříve importovány.',
+'import-nonewrevisions' => 'Žádné revize nebyly importovány (buď již byly všechny importovány dříve, nebo byly přeskočeny kvůli chybám).',
 'xml-error-string' => '$1 na řádku $2, sloupec $3 (bajt $4): $5',
 'import-upload' => 'Importovat XML data',
 'import-token-mismatch' => 'Ztratila se data relace. Zkuste to znovu.',
@@ -3054,6 +3068,7 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 '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-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>',
 'import-rootpage-invalid' => 'Zadaný název kořenové stránky je neplatný.',
 'import-rootpage-nosubpage' => 'Ve jmenném prostoru „$1“ kořenové stránky nejsou dovoleny podstránky.',
@@ -4293,6 +4308,5 @@ V podstatě rozbalí prakticky všechno v dvojitých složených závorkách.',
 'expand_templates_preview' => 'Náhled',
 
 # Unknown messages
-'createaccount-hook-aborted' => '$1',
 'uploadinvalidxml' => 'XML v načteném souboru nelze zpracovat.',
 );
index 3018965..47b2968 100644 (file)
@@ -40,7 +40,6 @@ $namespaceNames = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Pòdsztrëchiwùjë lënczi:',
-'tog-justify' => 'Wërównanié (justifikacëjô) paragrafów',
 'tog-hideminor' => 'Zatacë môłi edicëje w slédnëch zmianach',
 'tog-hidepatrolled' => 'Zatacë sprôdzoné edicëje slédnych zjinakach',
 'tog-newpageshidepatrolled' => 'Zatacë sprôdzoné edicëje w lësce nowich starnów',
@@ -49,9 +48,7 @@ $messages = array(
 'tog-numberheadings' => 'Aùtomatné numerowanié nôgłówków',
 'tog-showtoolbar' => 'Wëskrzrni listwã nôrzãdzów edicëji (nót je JavaScript)',
 'tog-editondblclick' => 'Editëjë starnë przez dëbeltné klëkniãcé (nót je JavaScript)',
-'tog-editsection' => 'Włączô edicëjã dzélów starnë przez lënczi [edicëjô]',
 'tog-editsectiononrightclick' => 'Włączë edicëjã sekcëji bez klëkniãcé prawą knąpą mëszë<br />na titlu sekcëji (JavaScript)',
-'tog-showtoc' => 'Pòkażë spisënk zamkłoscë (dlô starnów z wicy jak 3 nôgłówkama)',
 'tog-rememberpassword' => 'Spamiãtôj mòją parolã na tim kòmpùtrze (maksymalno przez $1 {{PLURAL:$1|dzéń|dni|dniów}})',
 'tog-watchcreations' => 'Dodôwôj starnë, chtërné ùsôdzã, do mòji lëstë ùzérónëch artiklów',
 'tog-watchdefault' => 'Dodôwôj starnë, chtërné editëjã do mòji lëstë ùzérónëch artiklów',
@@ -584,7 +581,6 @@ Administrator, chtëren jã zablokòwôł, pòdôł przëczënã: $1",
 'rows' => 'Régów:',
 'columns' => 'Kòlumnów:',
 'searchresultshead' => 'Szëkba',
-'resultsperpage' => 'Rezultatów na starnã:',
 'stub-threshold' => 'Greńca dlô fòrmatowaniô <a href="#" class="stub">lënków stubów</a>:',
 'recentchangesdays' => 'Kùli dni pòkazëwac w slédnëch edicëjach:',
 'recentchangescount' => 'Domëslnô wielëna wëskrzëniónych edicëjów',
@@ -888,7 +884,6 @@ Czej chcesz remôc starnã z lëste ùzéronëch artiklów, klikni ''Òprzestôj
 'wlheader-showupdated' => "Artiklë jakczé òsta zmienioné òd Twòji slédny wizytë są wëapratnioné '''pògrëbieniém'''",
 'watchmethod-list' => 'szëkba ùzérónëch artiklów westrzód pòslédnëch edicëjów',
 'watchlistcontains' => 'Na twòji lësce ùzérónëch artiklów {{PLURAL:$1|je 1 strana|są $1 starnë|je $1 starnów}}.',
-'wlnote' => "Niżi môsz wëskrzënioné {{PLURAL:$1|slédną zmianã|'''$1''' slédnëch zmianów}} zrobioné òb {{PLURAL:$2|gòdzënã|'''$2''' gòdzënë/gòdzënów}}.",
 'wlshowlast' => 'Wëskrzëni zjinaczi z $1 gòdzënów $2 dni $3',
 'watchlist-options' => 'Òptacëje ùzérónych',
 
index 0a00faa..5b194d8 100644 (file)
@@ -120,7 +120,6 @@ $linkTrail = "/^([àáâèéêìíîïòóôûŵŷa-z]+)(.*)$/sDu";
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Tanlinellu cysylltiadau:',
-'tog-justify' => 'Unioni paragraffau',
 'tog-hideminor' => 'Cuddio golygiadau bychain yn rhestr y newidiadau diweddar',
 'tog-hidepatrolled' => 'Cuddio golygiadau sydd wedi derbyn ymweliad patrôl rhag y rhestr newidiadau diweddar',
 'tog-newpageshidepatrolled' => 'Cuddio tudalennau sydd wedi derbyn ymweliad patrôl rhag rhestr y tudalennau newydd',
@@ -282,7 +281,6 @@ $messages = array(
 'vector-action-protect' => 'Diogelu',
 'vector-action-undelete' => 'Adfer',
 'vector-action-unprotect' => 'Newid y diogelwch',
-'vector-simplesearch-preference' => 'Galluogi bar chwilio syml (gwedd Vector yn unig)',
 'vector-view-create' => 'Dechrau',
 'vector-view-edit' => 'Golygu',
 'vector-view-history' => 'Gweld yr hanes',
@@ -928,7 +926,7 @@ Mae ar gael yn barod.',
 'invalid-content-data' => "Data annilys i'r cynnwys",
 'content-not-allowed-here' => 'Nid yw cynnwys ar ffurf "$1" yn cael ei ganiatau ar y dudalen [[$2]]',
 'editwarning-warning' => 'Os y gadewch y dudalen hon mae\'n bosib y collwch eich newidiadau iddi.
-Os ydych wedi mewngofnodi gallwch ddiddymu\'r rhybudd hwn yn yr adran "Golygu" yn eich dewisiadau.',
+Os ydych wedi mewngofnodi gallwch ddiddymu\'r rhybudd hwn yn yr adran "{{int:prefs-editing}}" yn eich dewisiadau.',
 
 # Content models
 'content-model-wikitext' => 'cystrawen wici',
@@ -1142,7 +1140,6 @@ Pan yn gwneud hyn dylid sicrhau nad yw dilyniant hanes tudalennau yn cael ei ddi
 'showhideselectedversions' => 'Dangos/cuddio y diwygiadau dewisedig',
 'editundo' => 'dadwneud',
 'diff-empty' => '(Dim gwahaniaeth)',
-'diff-multi' => '(Ni ddangosir {{PLURAL:$1|yr $1 diwygiad|yr $1 diwygiad|y $1 ddiwygiad|y $1 diwygiad|y $1 diwygiad|y $1 diwygiad}} rhyngol gan {{PLURAL:$2||un defnyddiwr|$2 ddefnyddiwr|$2 defnyddiwr|$2 o ddefnyddwyr|$2 o ddefnyddwyr}}.)',
 'diff-multi-manyusers' => '(Ni ddangosir {{PLURAL:$1|yr $1 diwygiad|yr $1 diwygiad|y $1 ddiwygiad|y $1 diwygiad|y $1 diwygiad|y $1 diwygiad}} rhyngol gan mwy na $2 {{PLURAL:$2|o ddefnyddwyr}}.)',
 'difference-missing-revision' => "Ni chafwyd hyd i $1 {{PLURAL:$2|diwygiad|diwygiad|ddiwygiad|diwygiad}} o'r gwahaniaeth ($1) {{PLURAL:$2|hwn}}.
 
@@ -1163,7 +1160,7 @@ Mae manylion pellach i'w cael yn [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'shown-title' => 'Dangos $1 {{PLURAL:$1|canlyiad|canlyniad|ganlyniad|chanlyniad|chanlyniad|canlyniad}} y dudalen',
 'viewprevnext' => 'Dangos ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Mae tudalen o'r enw \"[[\$1]]\" ar y wici hwn'''",
-'searchmenu-new' => "'''Creu'r dudalen \"[[:\$1]]\" ar y wici hwn!'''",
+'searchmenu-new' => "'''Creu'r dudalen \"[[:\$1]]\" ar y wici hwn!''' {{PLURAL:\$2||Gweler hefyd y dudalen a ganfyddwyd wrth chwilio.|Gweler hefyd y canlyniadau chwilio.}}",
 'searchprofile-articles' => 'Tudalennau pwnc (erthyglau/ffeiliau)',
 'searchprofile-project' => 'Tudalennau Cymorth a Phrosiect',
 'searchprofile-images' => 'Ffeiliau amlgyfrwng',
@@ -2001,6 +1998,14 @@ Gosodwyd <del>llinell</del> drwy'r eitemau sydd eisoes wedi eu datrys.",
 'protectedpages-cascade' => 'A sgydol-ddiogelwyd yn unig',
 'protectedpages-noredirect' => 'Cuddio ailgyfeiriadau',
 'protectedpagesempty' => "Does dim tudalennau wedi eu diogelu gyda'r paramedrau hyn.",
+'protectedpages-timestamp' => 'Stamp amser',
+'protectedpages-page' => 'Tudalen',
+'protectedpages-expiry' => 'Daw i ben',
+'protectedpages-performer' => 'Y diogelwr',
+'protectedpages-params' => "Paramedrau'r diogelu",
+'protectedpages-reason' => 'Rheswm',
+'protectedpages-unknown-timestamp' => 'Anhysbys',
+'protectedpages-unknown-performer' => 'Defnyddiwr anhysbys',
 'protectedtitles' => 'Teitlau wedi eu diogelu',
 'protectedtitlesempty' => "Ar hyn o bryd nid oes unrhyw deitlau wedi eu diogelu a'r paramedrau hyn.",
 'listusers' => 'Rhestr defnyddwyr',
@@ -2189,7 +2194,6 @@ Pan fydd y dudalen hon, neu ei thudalen sgwrs, yn newid, fe fyddant yn ymddangos
 'watchmethod-list' => "yn chwilio'r tudalennau ar y rhestr wylio am ddiwygiadau diweddar",
 'watchlistcontains' => '{{PLURAL:$1|Nid oes dim tudalennau|Mae $1 dudalen|Mae $1 dudalen|Mae $1 tudalen|Mae $1 thudalen|Mae $1 o dudalennau}} ar eich rhestr wylio.',
 'iteminvalidname' => "Problem gyda'r eitem '$1', enw annilys...",
-'wlnote' => "{{PLURAL:\$1|Ni fu unrhyw newid|Isod mae'r '''\$1''' newid diweddaraf|Isod mae'r '''\$1''' newid diweddaraf|Isod mae'r '''\$1''' newid diweddaraf|Isod mae'r '''\$1''' newid diweddaraf|Isod mae'r '''\$1''' newid diweddaraf}} yn ystod {{PLURAL:\$2||yr awr|y ddwyawr|y teirawr|y \"\$2\" awr|y(r) \"\$2\" awr}} ddiwethaf, fel ag yr oedd am \$4, \$3.",
 'wlshowlast' => "Dangoser newidiadau'r $1 awr ddiwethaf neu'r $2 {{PLURAL:$2|diwrnod|diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}} diwethaf neu'r $3 newidiadau.",
 'watchlist-options' => 'Dewisiadau ar gyfer y rhestr wylio',
 
@@ -2277,7 +2281,7 @@ Gwelwch y $2 am gofnod o\'r dileuon diweddar.',
 Cyfyngwyd ar y gallu i ddileu tudalennau sydd wedi eu golygu cymaint â hyn, er mwyn osgoi amharu ar weithrediad databas {{SITENAME}} yn ddamweiniol.",
 'delete-warning-toobig' => "Cafwyd dros $1 {{PLURAL:$1|o olygiadau}} i'r dudalen hon.
 Gallai dileu tudalen, gyda hanes golygu cymaint â hyn iddi, beri dryswch i weithrediadau'r databas ar {{SITENAME}}; ewch ati'n ofalus.",
-'deleting-backlinks-warning' => "'''Rhybudd:''' Mae tudalennau eraill yn cysylltu i'r dudalen yr ydych ar fin ei dileu.",
+'deleting-backlinks-warning' => "'''Rhybudd:''' Mae tudalennau eraill yn cysylltu i'r dudalen yr ydych ar fin ei dileu, neu'n trawsgynnwys y dudalen hon.",
 
 # Rollback
 'rollback' => 'Gwrthdroi golygiadau',
@@ -2578,7 +2582,7 @@ Gallwch weld rhestr y rhwystrau a'r gwaharddiadau sydd yn weithredol ar hyn o br
 'range_block_disabled' => 'Nid oes modd i weinyddwyr greu rhwystrau ystod.',
 'ipb_expiry_invalid' => 'Amser terfynu yn annilys.',
 'ipb_expiry_temp' => "Mae'n rhaid i rwystr ar ddefnyddiwr fod yn barhaus os am guddio'r enw.",
-'ipb_hide_invalid' => "Ddim yn gallu cuddio'r cyfrif hwn; efallai bod ganddo ormod o olygiadau.",
+'ipb_hide_invalid' => "Ddim yn gallu cuddio'r cyfrif hwn; mae mwy {{PLURAL:$1||nag 1 golygiad|na $1 olygiad|na $1 golygiad}} iddo.",
 'ipb_already_blocked' => 'Mae "$1" eisoes wedi\'i rwystro',
 'ipb-needreblock' => "Mae $1 wedi' rwystro'n barod. A ydych am newid y gosodiadau?",
 'ipb-otherblocks-header' => '{{PLURAL:$1|Rhwystr|Rhwystr|Rhwystrau|Rhwystrau|Rhwystrau|Rhwystrau}} eraill',
@@ -2748,6 +2752,7 @@ Os ydych am gyfrannu at y gwaith o gyfieithu ar gyfer holl prosiectau MediaWiki
 'allmessages-prefix' => 'Hidlo yn ôl rhagddodiad:',
 'allmessages-language' => 'Iaith:',
 'allmessages-filter-submit' => 'Eler',
+'allmessages-filter-translate' => 'Cyfieithu',
 
 # Thumbnails
 'thumbnail-more' => 'Chwyddo',
@@ -2801,7 +2806,7 @@ Dim ond rhan o'r ffeil sydd wedi ei huwchlwytho.",
 Mae ffolder dros dro yn eisiau.',
 'import-parse-failure' => "Wedi methu dosrannu'r mewnforiad XML",
 'import-noarticle' => "Ni chafwyd tudalen i'w mewnforio!",
-'import-nonewrevisions' => "Mae'r holl ddiwygiadau eisoes wedi eu mewnforio.",
+'import-nonewrevisions' => 'Ni fewnforwyd unrhyw ddiwygiadau (y cwbl eisoes yn bresennol, neu wedi eu hepgor oherwydd eu bod yn wallus).',
 'xml-error-string' => '$1 ar linell $2, col $3 (beit $4): $5',
 'import-upload' => 'Uwchlwytho data XML',
 'import-token-mismatch' => "Collwyd data'r sesiwn. Ceisiwch eto.",
@@ -2843,7 +2848,6 @@ Mae ffolder dros dro yn eisiau.',
 'tooltip-pt-watchlist' => 'Rydych yn dilyn hynt y tudalennau sydd ar y rhestr hon',
 'tooltip-pt-mycontris' => 'Rhestr eich cyfraniadau yn nhrefn amser',
 'tooltip-pt-login' => "Fe'ch anogir i fewngofnodi, er nad oes rhaid gwneud.",
-'tooltip-pt-anonlogin' => "Fe'ch anogir i fewngofnodi, er nad oes rhaid gwneud.",
 'tooltip-pt-logout' => 'Allgofnodi',
 'tooltip-ca-talk' => 'Sgwrsio am y dudalen',
 'tooltip-ca-edit' => "Gallwch olygu'r dudalen hon. Da o beth fyddai defnyddio'r botwm 'Dangos rhagolwg' cyn rhoi ar gadw.",
@@ -3950,7 +3954,10 @@ Defnydd:
 'expand_templates_ok' => 'Iawn',
 'expand_templates_remove_comments' => 'Peidio â dangos sylwadau',
 'expand_templates_remove_nowiki' => "Cuddio'r tagiau <nowiki> wrth ehangu",
+'expand_templates_generate_xml' => 'Dangos y goeden dosrannu XML',
 'expand_templates_generate_rawhtml' => 'Dangos HTML crai',
 'expand_templates_preview' => 'Rhagolwg',
 
+# Unknown messages
+'uploadinvalidxml' => "Ni ellid dosrannu'r XML yn y ffeil a uwchlwythwyd.",
 );
index ac1dd4e..b46cbe9 100644 (file)
@@ -195,7 +195,6 @@ $linkTrail = '/^([a-zæøå]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Understreg henvisninger:',
-'tog-justify' => 'Vis afsnit med lige marginer',
 'tog-hideminor' => 'Skjul mindre ændringer i listen over seneste ændringer',
 'tog-hidepatrolled' => 'Skjul patruljerede redigeringer i seneste ændringer',
 'tog-newpageshidepatrolled' => 'Skjul patruljerede sider på listen over nye sider',
@@ -418,7 +417,7 @@ $messages = array(
 'viewtalkpage' => 'Se diskussion',
 'otherlanguages' => 'Andre sprog',
 'redirectedfrom' => '(Omdirigeret fra $1)',
-'redirectpagesub' => 'Omdirigering',
+'redirectpagesub' => 'Omdirigeringsside',
 'lastmodifiedat' => 'Denne side blev senest ændret $1 kl. $2.',
 'viewcount' => 'Siden er vist {{PLURAL:$1|en gang|$1 gange}}.',
 'protectedpage' => 'Beskyttet side',
@@ -749,6 +748,8 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 'retypenew' => 'Gentag ny adgangskode:',
 'resetpass_submit' => 'Gem adgangskode og log på',
 'changepassword-success' => 'Din adgangskode er nu ændret!',
+'changepassword-throttled' => 'Du har forsøgt at logge på for mange gange for nylig.
+Vent venligst $1, før du prøver igen.',
 'resetpass_forbidden' => 'Adgangskoder kan ikke ændres',
 'resetpass-no-info' => 'Du skal være logget på for at komme direkte til denne side.',
 'resetpass-submit-loggedin' => 'Skift adgangskode',
@@ -800,6 +801,8 @@ Midlertidig adgangskode: $2',
 'changeemail-password' => 'Din adgangskode til {{SITENAME}}:',
 'changeemail-submit' => 'Ændre e-mail',
 'changeemail-cancel' => 'Afbryd',
+'changeemail-throttled' => 'Du har forsøgt at logge på for mange gange.
+Vent venligst $1, før du prøver igen.',
 
 # Special:ResetTokens
 'resettokens' => 'Nulstil nøgler',
@@ -1017,7 +1020,7 @@ Den ser du til at være slettet.',
 'invalid-content-data' => 'Ugyldig indholdsdata',
 'content-not-allowed-here' => '"$1" indhold er ikke tilladt på siden [[$2]]',
 'editwarning-warning' => 'Hvis du forlader siden nu, risikerer du at miste alle ændringer, som du har lavet.
-Denne advarsel kan slås fra under "Redigering" i dine indstillinger.',
+Denne advarsel kan slås fra under "{{int:prefs-editing}}" i dine indstillinger.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1229,7 +1232,6 @@ Vær opmæksom på at bevare kontinuiteten i sidehistorikken.
 'showhideselectedversions' => 'Vis/skjul udvalgte versioner',
 'editundo' => 'fjern redigering',
 'diff-empty' => '(Ingen forskel)',
-'diff-multi' => '({{PLURAL:$1|En mellemliggende version|$1 mellemliggende versioner}} af {{PLURAL:$2|en bruger|$2 brugere}} ikke vist)',
 'diff-multi-manyusers' => '({{PLURAL:$1|En mellemliggende version|$1 mellemliggende versioner}} af mere end $2 {{PLURAL:$2|bruger|brugere}} ikke vist)',
 'difference-missing-revision' => '{{PLURAL:$2|En revision|$2 revisioner}} af denne forskel ($1) {{PLURAL:$2|blev|blev}} ikke fundet.
 
@@ -2002,7 +2004,7 @@ Husk at kontrollere for andre henvisninger til skabelonerne før de slettes.',
 'statistics' => 'Statistik',
 'statistics-header-pages' => 'Sidestatistik',
 'statistics-header-edits' => 'Redigeringsstatistik',
-'statistics-header-views' => 'Visningsstatistik',
+'statistics-header-views' => 'Statistik over sidevisninger',
 'statistics-header-users' => 'Statistik om brugere på {{SITENAME}}',
 'statistics-header-hooks' => 'Anden statistik',
 'statistics-articles' => 'Indholdssider',
@@ -2281,7 +2283,6 @@ Fremtidige ændringer af denne side og dens tilknyttede diskussionsside vil bliv
 'watchmethod-list' => 'Tjekker seneste ændringer for sider i din overvågningsliste',
 'watchlistcontains' => 'Din overvågningsliste indeholder $1 {{PLURAL:$1|side|sider}}.',
 'iteminvalidname' => "Problem med '$1', ugyldigt navn...",
-'wlnote' => "Nedenfor ses {{PLURAL:$1|den seneste ændring|de seneste '''$1''' ændringer}} i {{PLURAL:$2|den sidste time|'''de sidste $2 timer}}''' op til den $3 kl. $4.",
 'wlshowlast' => 'Vis de seneste $1 timer $2 dage $3',
 'watchlist-options' => 'Indstillinger for overvågningslisten',
 
@@ -2919,7 +2920,6 @@ Alle Transwiki import-aktioner protokolleres i [[Special:Log/import|import-logge
 'tooltip-pt-watchlist' => 'Listen over sider du overvåger for ændringer.',
 'tooltip-pt-mycontris' => 'Liste over dine bidrag',
 'tooltip-pt-login' => 'Du opfordres til at logge på, men det er ikke obligatorisk.',
-'tooltip-pt-anonlogin' => 'Du opfordres til at logge på, men det er ikke obligatorisk',
 'tooltip-pt-logout' => 'Log af',
 'tooltip-ca-talk' => 'Diskussion om indholdet på siden',
 'tooltip-ca-edit' => 'Du kan redigere denne side. Brug venligst forhåndsvisning før du gemmer.',
@@ -2973,7 +2973,7 @@ Du kan se på kildeteksten.',
 'tooltip-watch' => 'Tilføj denne side til din overvågningsliste',
 'tooltip-watchlistedit-normal-submit' => 'Fjern titler',
 'tooltip-watchlistedit-raw-submit' => 'Opdater overvågningsliste',
-'tooltip-recreate' => 'Opret side, selv om den blev slettet.',
+'tooltip-recreate' => 'Genopret side, selv om den blev slettet.',
 'tooltip-upload' => 'Upload fil',
 'tooltip-rollback' => '"Rul tilbage" fjerner den sidste bidragsyders redigering(er) af denne side med et klik',
 'tooltip-undo' => '"Fjern redigering" fjerner denne redigering og åbner redigeringssiden med forhåndsvisning.
@@ -3009,7 +3009,7 @@ Det giver mulighed for at tilføje en begrundelse i beskrivelsen.',
 'spamprotectiontext' => 'Siden du ønskede at gemme, blev blokeret af spamfilteret.
 Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
 'spamprotectionmatch' => 'Følgende tekst udløste vores spamfilter: $1',
-'spambot_username' => 'MediaWiki spam-rensning',
+'spambot_username' => 'MediaWikis spamoprydning',
 'spam_reverting' => 'Sidste version uden henvisning til $1 gendannet.',
 'spam_blanking' => 'Alle versioner, som indeholdt henvisninger til $1, er renset.',
 'spam_deleting' => 'Alle versioner indeholder henvisninger til $1, sletter',
@@ -3656,7 +3656,7 @@ hvorfor siden blev slettet. Hvis du gemmer siden bliver den oprettet igen.",
 : ''$2''
 Bekræft venligst, at du virkelig vil oprette denne side igen.",
 'confirmrecreate-noreason' => '[[User:$1|$1]] ([[User talk:$1|diskussion]]) har slettet denne side, efter du begyndte at redigere. Bekræft venligst, at du gerne vil genoprette siden.',
-'recreate' => 'Opret igen',
+'recreate' => 'Genopret',
 
 # action=purge
 'confirm_purge_button' => 'O.k.',
index c39df8d..83bbb66 100644 (file)
@@ -50,6 +50,7 @@
  * @author Purodha
  * @author Raimond Spekking (Raymond) <raimond.spekking@gmail.com> since January 2007
  * @author Red Baron
+ * @author Reditec
  * @author Reedy
  * @author Remember the dot
  * @author Revolus
@@ -425,7 +426,6 @@ $imageFiles = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Links unterstreichen:',
-'tog-justify' => 'Text als Blocksatz',
 'tog-hideminor' => 'Kleine Änderungen in den „Letzten Änderungen“ ausblenden',
 'tog-hidepatrolled' => 'Kontrollierte Änderungen in den „Letzten Änderungen“ ausblenden',
 'tog-newpageshidepatrolled' => 'Kontrollierte Seiten bei den „Neuen Seiten“ ausblenden',
@@ -588,7 +588,6 @@ $messages = array(
 'vector-action-protect' => 'Schützen',
 'vector-action-undelete' => 'Wiederherstellen',
 'vector-action-unprotect' => 'Seitenschutz ändern',
-'vector-simplesearch-preference' => 'Vereinfachte Suchleiste aktivieren (nur Vector)',
 'vector-view-create' => 'Erstellen',
 'vector-view-edit' => 'Bearbeiten',
 'vector-view-history' => 'Versionsgeschichte',
@@ -609,7 +608,7 @@ $messages = array(
 'searcharticle' => 'Seite',
 'history' => 'Versionen',
 'history_short' => 'Versionsgeschichte',
-'updatedmarker' => 'Änderung seit meinem letzten Besuch',
+'updatedmarker' => 'Änderung seit deinem letzten Besuch',
 'printableversion' => 'Druckversion',
 'permalink' => 'Permanenter Link',
 'print' => 'Drucken',
@@ -650,7 +649,7 @@ $messages = array(
 'redirectedfrom' => '(Weitergeleitet von $1)',
 'redirectpagesub' => 'Weiterleitung',
 'lastmodifiedat' => 'Diese Seite wurde zuletzt am $1 um $2 Uhr geändert.',
-'viewcount' => 'Diese Seite wurde bisher {{PLURAL:$1|einmal|$1-mal}} abgerufen.',
+'viewcount' => 'Diese Seite wurde bisher {{PLURAL:$1|einmal|$1 mal}} abgerufen.',
 'protectedpage' => 'Geschützte Seite',
 'jumpto' => 'Wechseln zu:',
 'jumptonavigation' => 'Navigation',
@@ -1255,7 +1254,7 @@ Sie wurde anscheinend gelöscht.',
 'invalid-content-data' => 'Ungültige Inhaltsdaten',
 'content-not-allowed-here' => 'Der Inhalt „$1“ ist auf der Seite [[$2]] nicht erlaubt',
 'editwarning-warning' => 'Das Verlassen dieser Seite kann dazu führen, dass deine Änderungen verloren gehen.
-Wenn du angemeldet bist, kannst du das Anzeigen dieser Warnung im Bereich „Bearbeiten“ deiner Einstellungen abschalten.',
+Wenn du angemeldet bist, kannst du das Anzeigen dieser Warnung im Bereich „{{int:prefs-editing}}“ deiner Einstellungen abschalten.',
 'editpage-notsupportedcontentformat-title' => 'Das Inhaltsformat wird nicht unterstützt',
 'editpage-notsupportedcontentformat-text' => 'Das Inhaltsformat $1 wird vom Inhaltsmodell $2 nicht unterstützt.',
 
@@ -1290,6 +1289,7 @@ Sie darf nicht mehr als $2 {{PLURAL:$2|Aufruf|Aufrufe}} haben, es {{PLURAL:$1|is
 Bitte prüfe den Vergleich unten, um sicherzustellen, dass du dies tun möchtest, und speichere dann unten deine Änderungen, um die Bearbeitung rückgängig zu machen.',
 'undo-failure' => 'Die Änderung konnte nicht rückgängig gemacht werden, da der betroffene Abschnitt zwischenzeitlich verändert wurde.',
 'undo-norev' => 'Die Bearbeitung konnte nicht rückgängig gemacht werden, da sie nicht vorhanden ist oder gelöscht wurde.',
+'undo-nochange' => 'Anscheinend wurde diese Bearbeitung bereits rückgängig gemacht.',
 'undo-summary' => 'Änderung $1 von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) rückgängig gemacht.',
 'undo-summary-username-hidden' => 'Änderung $1 eines versteckten Benutzers rückgängig gemacht.',
 
@@ -1468,7 +1468,8 @@ Stelle sicher, dass die Versionsgeschichte einer Seite historisch korrekt ist.',
 'showhideselectedversions' => 'Gewählte Versionen zeigen/verstecken',
 'editundo' => 'rückgängig machen',
 'diff-empty' => '(kein Unterschied)',
-'diff-multi' => '({{PLURAL:$1|Eine dazwischenliegende Version|$1 dazwischenliegende Versionen}} von {{PLURAL:$2|einem Benutzer|$2 Benutzern}} {{PLURAL:$1|wird|werden}} nicht angezeigt)',
+'diff-multi-sameuser' => '({{PLURAL:$1|Eine dazwischenliegende Version|$1 dazwischenliegende Versionen}} des gleichen Benutzers werden nicht angezeigt)',
+'diff-multi-otherusers' => '({{PLURAL:$1|Eine dazwischenliegende Version|$1 dazwischenliegende Versionen}} von {{PLURAL:$2|einem anderen Benutzer|$2 Benutzern}} werden nicht angezeigt)',
 'diff-multi-manyusers' => '({{PLURAL:$1|$1 dazwischenliegende Versionen}} von mehr als {{PLURAL:$2|$2 Benutzern}}, die nicht angezeigt werden)',
 'difference-missing-revision' => '{{PLURAL:$2|Eine Version|$2 Versionen}} dieser Unterschiedsanzeige ($1) {{PLURAL:$2|wurde|wurden}} nicht gefunden.
 
@@ -1489,7 +1490,7 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'shown-title' => 'Zeige $1 {{PLURAL:$1|Ergebnis|Ergebnisse}} pro Seite',
 'viewprevnext' => 'Zeige ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Es gibt eine Seite, die den Namen „[[:$1]]“ hat.'''",
-'searchmenu-new' => "'''Erstelle die Seite „[[:$1]]“ in diesem Wiki.'''",
+'searchmenu-new' => '<strong>Erstelle die Seite „[[:$1]]“ in diesem Wiki.</strong> {{PLURAL:$2|0=|Siehe auch die mit deiner Suche gefundene Seite.|Siehe auch die gefundenen Suchergebnisse.}}',
 'searchprofile-articles' => 'Inhaltsseiten',
 'searchprofile-project' => 'Hilfe- und Projektseiten',
 'searchprofile-images' => 'Multimedia',
@@ -1515,6 +1516,7 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'searchrelated' => 'verwandt',
 'searchall' => 'alle',
 'showingresults' => "Hier {{PLURAL:$1|ist '''1''' Ergebnis|sind '''$1''' Ergebnisse}}, beginnend mit Nummer '''$2.'''",
+'showingresultsinrange' => 'Unten {{PLURAL:$1|wird <strong>ein</strong> Ergebnis|werden bis zu <strong>$1</strong> Ergebnisse}} im Bereich <strong>$2</strong> bis <strong>$3</strong> angezeigt.',
 'showingresultsnum' => "Hier {{PLURAL:$3|ist '''1''' Ergebnis|sind '''$3''' Ergebnisse}}, beginnend mit Nummer '''$2.'''",
 'showingresultsheader' => "{{PLURAL:$5|Ergebnis '''$1''' von '''$3'''|Ergebnisse '''$1–$2''' von '''$3'''}} für '''$4'''",
 'search-nonefound' => 'Zu deiner Suchanfrage wurden keine Ergebnisse gefunden.',
@@ -2333,10 +2335,20 @@ Jede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel de
 'deadendpagestext' => 'Die folgenden Seiten verweisen nicht auf andere Seiten von {{SITENAME}}.',
 'protectedpages' => 'Geschützte Seiten',
 'protectedpages-indef' => 'Nur unbeschränkt geschützte Seiten zeigen',
+'protectedpages-summary' => 'Diese Seite listet vorhandene Seiten auf, die derzeit geschützt sind. Für eine Liste vor Erstellung geschützter Titel, siehe [[{{#special:ProtectedTitles}}]].',
 'protectedpages-cascade' => 'Nur Seiten mit Kaskadenschutz',
 'protectedpages-noredirect' => 'Weiterleitungen ausblenden',
 'protectedpagesempty' => 'Aktuell sind keine Seiten mit diesen Parametern geschützt.',
+'protectedpages-timestamp' => 'Zeitstempel',
+'protectedpages-page' => 'Seite',
+'protectedpages-expiry' => 'Gültig bis',
+'protectedpages-performer' => 'Geschützt von',
+'protectedpages-params' => 'Schutzparameter',
+'protectedpages-reason' => 'Grund',
+'protectedpages-unknown-timestamp' => 'Unbekannt',
+'protectedpages-unknown-performer' => 'Unbekannter Benutzer',
 'protectedtitles' => 'Geschützte Seitennamen',
+'protectedtitles-summary' => 'Diese Seite listet Titel auf, die derzeit vor der Erstellung geschützt sind. Für eine Liste vorhandener geschützter Seiten, siehe [[{{#special:ProtectedPages}}]].',
 'protectedtitlesempty' => 'Zurzeit sind mit den angegebenen Parametern keine Seiten zur Neuerstellung gesperrt.',
 'listusers' => 'Benutzerverzeichnis',
 'listusers-editsonly' => 'Zeige nur Benutzer mit Beiträgen',
@@ -2510,7 +2522,7 @@ Spätere Änderungen an dieser Seite und der zugehörigen Diskussionsseite werde
 'removedwatchtext' => 'Die Seite „[[:$1]]“ wurde von deiner [[Special:Watchlist|Beobachtungsliste]] entfernt.',
 'watch' => 'Beobachten',
 'watchthispage' => 'Seite beobachten',
-'unwatch' => 'nicht mehr beobachten',
+'unwatch' => 'Nicht mehr beobachten',
 'unwatchthispage' => 'Nicht mehr beobachten',
 'notanarticle' => 'Keine Seite',
 'notvisiblerev' => 'Version wurde gelöscht',
@@ -2527,7 +2539,7 @@ Spätere Änderungen an dieser Seite und der zugehörigen Diskussionsseite werde
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Beobachten …',
-'unwatching' => 'Nicht beobachten …',
+'unwatching' => 'Nicht mehr beobachten …',
 'watcherrortext' => 'Beim Ändern der Beobachtungslisteneinstellungen für „$1“ ist ein Fehler aufgetreten.',
 
 'enotif_mailer' => '{{SITENAME}}-E-Mail-Benachrichtigungsdienst',
@@ -2876,7 +2888,8 @@ Zur Aufhebung der Sperre siehe die [[Special:BlockList|Liste aller aktiven Sperr
 'change-blocklink' => 'Sperre ändern',
 'contribslink' => 'Beiträge',
 'emaillink' => 'E-Mail senden',
-'autoblocker' => 'Automatische Sperre, da du eine gemeinsame IP-Adresse mit [[User:$1|$1]] benutzt. Grund der Benutzersperre: „$2“.',
+'autoblocker' => 'Automatische Sperre, da du eine gemeinsame IP-Adresse mit [[User:$1|$1]] benutzt.
+Grund der Benutzersperre: „$2“',
 'blocklogpage' => 'Benutzersperr-Logbuch',
 'blocklog-showlog' => '{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} wurde schon früher gesperrt. Es folgt der Eintrag aus dem Benutzersperr-Logbuch:',
 'blocklog-showsuppresslog' => '{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} wurde schon früher gesperrt und versteckt.
@@ -3080,6 +3093,7 @@ $2',
 'thumbnail_image-type' => 'Bildtyp nicht unterstützt',
 'thumbnail_gd-library' => 'Unvollständige Konfiguration der GD-Bibliothek: Fehlende Funktion $1',
 'thumbnail_image-missing' => 'Datei scheint fehlend zu sein: $1',
+'thumbnail_image-failure-limit' => 'Es wurden in letzter Zeit zu viele Versuche ($1 oder mehr) unternommen, dieses Vorschaubild zu rendern. Bitte versuche es später erneut.',
 
 # Special:Import
 'import' => 'Seiten importieren',
@@ -3115,7 +3129,7 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 'importuploaderrortemp' => 'Das Hochladen der Importdatei ist fehlgeschlagen. Ein temporäres Verzeichnis fehlt.',
 'import-parse-failure' => 'Fehler beim XML-Import:',
 'import-noarticle' => 'Es wurde keine zu importierende Seite angegeben!',
-'import-nonewrevisions' => 'Alle Versionen wurden bereits zu einem früheren Zeitpunkt importiert.',
+'import-nonewrevisions' => 'Es wurden keine Versionen importiert. Entweder waren alle bereits vorhanden oder wurden aufgrund von Fehlern übersprungen.',
 'xml-error-string' => '$1 Zeile $2, Spalte $3, (Byte $4): $5',
 'import-upload' => 'XML-Dateien importieren',
 'import-token-mismatch' => 'Verlust der Sessiondaten. Bitte versuche es erneut.',
@@ -3126,6 +3140,7 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 '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-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>',
 'import-rootpage-invalid' => 'Der angegebene Stammseitenname ist ungültig.',
 'import-rootpage-nosubpage' => 'Im Namensraum „$1“ der Stammseite sind keine Unterseiten erlaubt.',
@@ -3538,7 +3553,7 @@ Weitere werden standardmäßig nicht angezeigt.
 'exif-gpssatellites' => 'Für die Messung benutzte Satelliten',
 'exif-gpsstatus' => 'Empfängerstatus',
 'exif-gpsmeasuremode' => 'Messverfahren',
-'exif-gpsdop' => 'Maßpräzision',
+'exif-gpsdop' => 'Messgenauigkeit',
 'exif-gpsspeedref' => 'Geschwindigkeitseinheit',
 'exif-gpsspeed' => 'Geschwindigkeit des GPS-Empfängers',
 'exif-gpstrackref' => 'Referenz für Bewegungsrichtung',
@@ -4333,6 +4348,5 @@ faktisch alles was in doppelten geschweiften Klammern enthalten ist.',
 'expand_templates_preview' => 'Vorschau',
 
 # Unknown messages
-'createaccount-hook-aborted' => '$1',
 'uploadinvalidxml' => 'Das XML in der hochgeladenen Datei konnte nicht geparst werden.',
 );
index b24c903..d6c1cbf 100644 (file)
@@ -332,7 +332,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Bınê gırey de xete bance:',
-'tog-justify' => 'Paragrafan eyar ke',
 'tog-hideminor' => 'Vurnayışanê şenıkan pela vurnayışanê peyênan de bınımne',
 'tog-hidepatrolled' => 'Vurnayışanê qontrolkerdeyan pela vurnayışê peyêni de bınımne',
 'tog-newpageshidepatrolled' => 'Pelanê qontrolkerdeyan lista pelanê neweyan de bınımne',
@@ -355,7 +354,7 @@ $messages = array(
 'tog-enotifminoredits' => 'Pelan de vurnayışanê qıckekan u dosyan de ki mı rê e-mail bırışe',
 'tog-enotifrevealaddr' => 'Adresa e-posteyê mı posteyê xeberan de bımocne',
 'tog-shownumberswatching' => 'Amarê karberanê seyrkerdoğan bımocne',
-'tog-oldsig' => 'İmza mewcude:',
+'tog-oldsig' => 'İmzaya mewcude:',
 'tog-fancysig' => 'İmza rê mameleyê wikimeqaley bıke (bê gıreyo otomatik)',
 'tog-uselivepreview' => 'Verqayto giyane bıgureyne (cerrebane)',
 'tog-forceeditsummary' => 'Mı ke xulasa veng verdaye, hay a mı ser de',
@@ -492,12 +491,11 @@ $messages = array(
 
 # Vector skin
 'vector-action-addsection' => 'Mewzu vıraze',
-'vector-action-delete' => 'Bestern',
-'vector-action-move' => 'Ber',
-'vector-action-protect' => 'Star ke',
+'vector-action-delete' => 'Bestere',
+'vector-action-move' => 'Bere',
+'vector-action-protect' => 'Bışevekne',
 'vector-action-undelete' => 'Esterıtışi peyser bıgê',
 'vector-action-unprotect' => 'Starkerdışi bıvurne',
-'vector-simplesearch-preference' => 'Çuweya cı geyreyış de rehater aktiv ke (Tenya vector skin de)',
 'vector-view-create' => 'Vıraze',
 'vector-view-edit' => 'Bıvurne',
 'vector-view-history' => 'Verênan bıvêne',
@@ -532,7 +530,7 @@ $messages = array(
 'undeletethispage' => 'Na perer mebesterne',
 'undelete_short' => '{{PLURAL:$1|Yew vurnayışi|$1 Vurnayışan}} mestere',
 'viewdeleted_short' => '{{PLURAL:$1|Yew vurnayışo esterıte|$1 Vurnayışanê esterıtan}} bımocne',
-'protect' => 'Star ke',
+'protect' => 'Bışevekne',
 'protect_change' => 'bıvurne',
 'protectthispage' => 'Ena pele bıpawe',
 'unprotect' => 'Starkerdışi bıvurne',
@@ -643,7 +641,7 @@ $1',
 'nstab-user' => 'Pela karberi',
 'nstab-media' => 'Pera Medya',
 'nstab-special' => 'Pela xase',
-'nstab-project' => 'Pera proci',
+'nstab-project' => 'Pela procey',
 'nstab-image' => 'Dosya',
 'nstab-mediawiki' => 'Mesac',
 'nstab-template' => 'Şablon',
@@ -738,6 +736,7 @@ Xızmetkarê  kılitkerdışi wa bewni ro enay wa çımra ravyarno: "$3".',
 'invalidtitle-unknownnamespace' => 'Sernameye nêşınasiya yana amraiya canameyo  $1 u metno "$2" xırab',
 'exception-nologin' => 'Şıma cıkewtış nêvıraşto',
 'exception-nologin-text' => 'Na pera ya zi na karkerdışi de  na wiki de [[Special:Userlogin|cıkewtış]] icab keno.',
+'exception-nologin-text-manual' => 'Na pele resayışi re $1 bıgire.',
 
 # Virus scanner
 'virus-badscanner' => "Eyaro şaş: no virus-cıgerayox nêzanyeno: ''$1''",
@@ -836,7 +835,7 @@ Nuştışê xo qonrol kerên, ya zi [[Special:UserLogin/signup|yew hesabo newe a
 'login-userblocked' => 'No karber/na karbere blokekerdeyo/blokekerdiya. Cıkewtışi rê musade çıniyo.',
 'wrongpassword' => 'Parola ğeleta. Rêna / fına bıcerrebne .',
 'wrongpasswordempty' => 'Parola tola, venga. tekrar bınuse.',
-'passwordtooshort' => 'Derganiya parola wa tewr tayn {{PLURAL:$1|1 karakter|$1 karakteran}} dı bo.',
+'passwordtooshort' => 'Paroley gani tewr senık be {{PLURAL:$1|1 karakter|$1 karakteran}} derg bê.',
 'password-name-match' => 'Parola u nameyê şıma gani zeypê (seypê) nêbo.',
 'password-login-forbidden' => 'No namey karberi u parola karkerdışê cı  kerdo xırab.',
 'mailmypassword' => 'Parola reset ke',
@@ -874,6 +873,8 @@ Bıne vındere u newe ra dest pê bıkere.',
 'login-abort-generic' => 'Dekewtışê şıma xırabo-terkneyayo',
 'loginlanguagelabel' => 'Zıwan: $1',
 'suspicious-userlogout' => 'Waştişê tu ya veciyayişi kebul nibiya cunki ihtimal o ke waştiş yew browser ya zi proksiyê heripiyaye ra ameya.',
+'createacct-another-realname-tip' => 'Nameyo raştıkên keyfiyo.
+Şıma nameyo xoyo raştıkên ke bımocnê, seba iştırakanê karberi be ney ra istıfade beno.',
 
 # Email sending
 'php-mail-error-unknown' => "PHP's mail() fonksiyoni de xırabin vıcyê.",
@@ -890,6 +891,7 @@ Bıne vındere u newe ra dest pê bıkere.',
 'retypenew' => 'Parola newiye tekrar ke:',
 'resetpass_submit' => 'Parola eyar kere u newe ra dekewe',
 'changepassword-success' => 'Parola şıma be serkewtış vuriye!',
+'changepassword-throttled' => 'Şıma zaf ronıştış akerdış ke.Kerem ke verdi dekewten $1 bıpawe.',
 'resetpass_forbidden' => 'parolayi nêvuryayi',
 'resetpass-no-info' => 'şıma gani hesab akere u hona bıeşke bırese cı',
 'resetpass-submit-loggedin' => 'Parola bıvurne',
@@ -941,9 +943,14 @@ Parola vêrdiye: $2',
 'changeemail-password' => 'Parolay şımawa {{SITENAME}}i:',
 'changeemail-submit' => 'E-postay xo bıvırnên',
 'changeemail-cancel' => 'Bıtexelne',
+'changeemail-throttled' => 'Şıma zaf ronıştış akerdış ke.
+Kerem ke verdi dekewten $1 bıpawe.',
 
 # Special:ResetTokens
 'resettokens' => 'Nışanan reset ke',
+'resettokens-text' => 'Şıma tiya de hesabê şıma ra elaqedar tayê kılitê icazetê cıresayışê melumati şenê sıfır kerê.
+
+Şıma be ğeletiye ra ke nê kerdê vıla ya zi hesabê şıma de xırabiye ke esta, naye bıkerê.',
 'resettokens-no-tokens' => 'Nışanê reseti çıniyê',
 'resettokens-legend' => 'Nışanan reset ke',
 'resettokens-tokens' => 'Nışani:',
@@ -957,9 +964,9 @@ Parola vêrdiye: $2',
 'bold_tip' => 'Metno qalın',
 'italic_sample' => 'Metno çewt',
 'italic_tip' => 'Metno çewt',
-'link_sample' => 'Namey gırey',
-'link_tip' => 'Gırey miyani',
-'extlink_sample' => 'http://www.misal.com sernamey gırey',
+'link_sample' => 'Sernameyê gırey',
+'link_tip' => 'Gıreyê miyani',
+'extlink_sample' => 'http://www.misal.com sernameyê gırey',
 'extlink_tip' => 'Gırey teberi (xo vira mekerên http:// prefix)',
 'headline_sample' => 'metnê sernamey',
 'headline_tip' => 'Sewiya 2ıne sername',
@@ -968,7 +975,7 @@ Parola vêrdiye: $2',
 'image_sample' => 'Misal resim.jpg',
 'image_tip' => 'Dosya tewrkerdiye',
 'media_sample' => 'misal.jpg',
-'media_tip' => 'Gırey dosya',
+'media_tip' => 'Gıreyê dosya',
 'sig_tip' => 'İmzay şıma be morê zemani',
 'hr_tip' => 'Xeta verardiye (teserrufın bıgureyne/bıxebetne)',
 
@@ -1152,8 +1159,9 @@ Pel ca ra esto.',
 'content-failed-to-parse' => 'Qandê madela $3 zereyê $1, $2 sero nêagozyayo',
 'invalid-content-data' => 'Zerrey malumati nêravêrdeyo',
 'content-not-allowed-here' => '"$1" sero per da [[$2]] rê mısade nêdeyêno',
-'editwarning-warning' => 'ihtimal o ke wexta şıma peli ra bıveci, vurnayiş o ke şıma kerdo, hewna şiyêro .
-eke şıma kewtê hesabê xo, no hişyari tercihanê xo ra şıma eşkeni "{{int:prefs-editing}}" bıvındarnî .',
+'editwarning-warning' => 'Wexto ke şıma na pele ra veciyê, beno ke vurnayışê şıma vindi bê.
+Eke şı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 models
 'content-model-wikitext' => 'wikimetin',
@@ -1210,10 +1218,10 @@ Sebebo ke terefê $3 ra diyao ''$2''",
 'last' => 'peyên',
 'page_first' => 'verên',
 'page_last' => 'peyên',
-'histlegend' => "Ferqê weçinayışi: Qutiya versiyonan mor ke u  ''enter''i bıpıloxne ya zi makera cêrêne bıpıloxne.<br /> 
-Lecant: '''({{int:cur}})''' = ferqê versiyonê peyêni, '''({{int:last}})''' = ferqê versiyonê verêni, '''{{int:minoreditletter}}''' = vurnayışo werdi.",
-'history-fieldset-title' => 'Bewni tarixer',
-'history-show-deleted' => 'Tenya esterıt',
+'histlegend' => "Ferqê weçinıtışi: Qutiya versiyonan seba têversanayış işaret ke û dest be ''enter''i ya zi gocega cêrêne ro ne.<br />
+Cedwel: <strong>({{int:ferq}})</strong> = ferqê verziyonê peyêni, <strong>({{int:peyên}})</strong> = ferqê versiyonê verêni, <strong>{{int:q}}</strong> = vurnayışo werdi.",
+'history-fieldset-title' => 'Tarixi bıvêne',
+'history-show-deleted' => 'Tenya esterıtey',
 'histfirst' => 'Verênêr',
 'histlast' => 'Peyênêr',
 'historysize' => '({{PLURAL:$1|1 bayt|$1 bayti}})',
@@ -1362,7 +1370,8 @@ no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 'showhideselectedversions' => 'Revizyonanê weçinıtan bımocne/bınımne',
 'editundo' => 'peyser bıgê',
 'diff-empty' => '(Babetna niyo)',
-'diff-multi' => '({{PLURAL:$1|Yew revizyono miyanên|$1 revizyonê miyanêni}} terefê {{PLURAL:$2|yew karberi|$2 karberan}} nêmocno)',
+'diff-multi-sameuser' => '(Terefê eyni karberi ra {{PLURAL:$1|yew revizyono miyanên nêmocno|$1 revizyonê miyanêni nêmocnê}})',
+'diff-multi-otherusers' => '(Terefê {{PLURAL:$2|yew karberi|$2 karberan}} ra {{PLURAL:$1|yew revizyono miyanên nêmocno|$1 revizyonê miyanêni nêmocnê}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|jew timar kerdışo qıckeko|$1 timar kerdışo qıckeko}} timar kerdo, $2 {{PLURAL:$2|Karber|karberi}} memocne)',
 'difference-missing-revision' => 'Ferqê {{PLURAL:$2|Yew rewizyonê|$2 rewizyonê}} {{PLURAL:$2|dı|dı}} ($1) sero çıniyo.
 
@@ -1370,7 +1379,7 @@ No normal de werênayış dê pelanê besterneyan dı ena xırabin asena.
 Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} tiya dı] aseno.',
 
 # Search results
-'searchresults' => 'Neticeya geyrayışi',
+'searchresults' => 'Neticeyê geyrayışi',
 'searchresults-title' => 'Qandê "$1" neticeyê geyrayışi',
 'toomanymatches' => 'Zêde teki (zewci) peyser çarnay, şıma rê zehmet, be persê do bin ra bıcerrebnên.',
 'titlematches' => 'Tekê (zewcê) sernameyê pele',
@@ -1383,7 +1392,7 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'shown-title' => 'bimocne $1î  {{PLURAL:$1|netice|neticeyan}} ser her pel',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) bıvênên',
 'searchmenu-exists' => "''Ena 'Wikipediya de ser \"[[:\$1]]\" yew pel esto'''",
-'searchmenu-new' => "''Na Wiki de pelay \"[[:\$1]]\" vıraze!'''",
+'searchmenu-new' => '<strong>Na wiki de pela "[[:$1]]" vıraze!</strong> {{PLURAL:$2|0=|Sewbina pela ke şıma geyrayê cı aye bıvênê.|Yew zi neticanê cıgeyrayışê xo bıvênê.}}',
 'searchprofile-articles' => 'Pelê tedeestey',
 'searchprofile-project' => 'Pelê peşti û procey',
 'searchprofile-images' => 'Multimedya',
@@ -1397,8 +1406,9 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'search-result-size' => '$1 ({{PLURAL:$2|1 çekuyo|$2 çekuyê}})',
 'search-result-category-size' => '{{PLURAL:$1|1 eza|$1 ezayan}} ({{PLURAL:$2|1 kategoriyê bini|$2 kategirayanê binan}}, {{PLURAL:$3|1 dosya|$3 dosyayan}})',
 'search-result-score' => 'Eleqa: $1%',
-'search-redirect' => '(ber $1)',
+'search-redirect' => '($1 ra ardış)',
 'search-section' => '(qısmê $1)',
+'search-file-match' => '(zerreyê dosya yewbini gêno)',
 'search-suggest' => 'To va: $1',
 'search-interwiki-caption' => 'Projey Bıray',
 'search-interwiki-default' => '$1 neticeyan:',
@@ -1407,14 +1417,15 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'searcheverything-enable' => 'cayê nameyê hemi de bigêre',
 'searchrelated' => 'eleqeyın',
 'searchall' => 'pêro',
-'showingresults' => "#$2 netican ra {{PLURAL:$1|'''1''' netica|'''$1''' neticey}} cêr deyê.",
-'showingresultsnum' => "'''$2''' netican ra {{PLURAL:$3|'''1''' netice|'''$3''' neticey}} cêr derê.",
+'showingresults' => '#<strong>$2</strong> netican ra {{PLURAL:$1|<strong>1</strong> netice cêr dero|<strong>$1</strong> neticey cêr derê}}.',
+'showingresultsinrange' => '{{PLURAL:$1|<strong>1</strong> netice|<strong>$1</strong> neticey}} be mabeynê #<strong>$2</strong> ra be #<strong>$3</strong> cêr asenê.',
+'showingresultsnum' => '#<strong>$2</strong> netican ra {{PLURAL:$3|<strong>1</strong> netice cêr dero|<strong>$3</strong> neticey cêr derê}}.',
 'showingresultsheader' => "{{PLURAL:$5|Neticeyê '''$1''' of '''$3'''|Neticeyanê '''$1 - $2''' hetê '''$3'''}} qe '''$4'''",
 'search-nonefound' => 'Zey perskerdışê şıma netice nêvêniya.',
 'powersearch-legend' => 'Cıgeyrayışo hera',
 'powersearch-ns' => 'Cayanê nameyan de cıgeyrayış:',
 'powersearch-redir' => 'Listeya hetenayışan',
-'powersearch-togglelabel' => 'Qontrol ke:',
+'powersearch-togglelabel' => 'Kontrol ke:',
 'powersearch-toggleall' => 'Pêro',
 'powersearch-togglenone' => 'Çıniyo',
 'search-external' => 'Cıgeyrayışê teberi',
@@ -1449,7 +1460,7 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'prefs-rendering' => 'Asayış',
 'saveprefs' => 'Qeyd ke',
 'restoreprefs' => 'Sazanê hesıbyaya pêron newe ke',
-'prefs-editing' => 'Cay pela nustısi',
+'prefs-editing' => 'Vurnayış',
 'rows' => 'Xeti:',
 'columns' => 'Estûni:',
 'searchresultshead' => 'Cı geyre',
@@ -1502,12 +1513,12 @@ Na game tepeya nêerziyena.',
 'yourlanguage' => 'Zıwan:',
 'yourvariant' => 'Varyante miyandê zuwani:',
 'prefs-help-variant' => 'Zerrey ena viki mocnayışi rê varyant yana ortografi re şıre tercihan dê xo.',
-'yournick' => 'imza:',
+'yournick' => 'Leqebe:',
 'prefs-help-signature' => 'Peran de vatenana de vatışi"<nowiki>~~~~</nowiki>" ya do imza bé, no bahdo beno çerğé imza u wahdey zemani',
 'badsig' => 'Îmzayê tu raşt niyo.
 Etiketê HTMLî kontrol bike.',
-'badsiglength' => 'İmzayê şıma zaf dergo.
-$1 gani bınê no {{PLURAL:$1|karakter|karakter}} de bıbo.',
+'badsiglength' => 'İmzaya şıma zaf derga.
+A gani be $1 {{PLURAL:$1|karakter|karakteran}} ra zêde mebo.',
 'yourgender' => 'Çıçiy cı esto?',
 'gender-unknown' => 'Ez detay nivana',
 'gender-male' => 'Perané wiki camérd deyne ezo vırnena',
@@ -1565,6 +1576,8 @@ Eka tu wazene ke nameyo raşt xo bide, ma nameyo raşt ti iştirakanê ti de moc
 'userrights-changeable-col' => 'Grubê ke şıma şenê bıvurnê',
 'userrights-unchangeable-col' => 'Grubê ke şıma nêşenê bıvurnê',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Heqan de karberi de dıbare vıcyayo! Kerem ke vurnayışane xo çımser ra ravyarne  u tesdiq keri.',
+'userrights-removed-self' => 'Heqi şıma usula hewadeyay. Qan de coy şıma hendana nişeni ena pela resi.',
 
 # Groups
 'group' => 'Grube:',
@@ -1716,7 +1729,7 @@ Eka tu wazene ke nameyo raşt xo bide, ma nameyo raşt ti iştirakanê ti de moc
 'recentchanges' => 'Vurnayışê peyêni',
 'recentchanges-legend' => 'Tercihê vurnayışanê peyênan',
 'recentchanges-summary' => 'Ena pele de wiki sero vurnayışanê peyênan teqib ke.',
-'recentchanges-noresult' => 'Zey kiterandé şıma vırnayış névineya',
+'recentchanges-noresult' => 'Goreyê kriteranê kıfşkerdeyan ra qet yew vurnayış nêvêniya.',
 'recentchanges-feed-description' => 'Ena feed dı vurnayişanê tewr peniyan teqip bık.',
 'recentchanges-label-newpage' => 'Enê vurnayışi ra yew pela newiye vıraziye',
 'recentchanges-label-minor' => 'Eno yew vurnayışo werdiyo',
@@ -1757,11 +1770,11 @@ Eka tu wazene ke nameyo raşt xo bide, ma nameyo raşt ti iştirakanê ti de moc
 'recentchangeslinked' => 'Vurnayışê elaqeyıni',
 'recentchangeslinked-feed' => 'Vurnayışê elaqeyıni',
 'recentchangeslinked-toolbox' => 'Vurnayışê elaqeyıni',
-'recentchangeslinked-title' => 'vurnayışan ser "$1"',
+'recentchangeslinked-title' => 'Heqa "$1" de vurnayışi',
 'recentchangeslinked-summary' => "Lista cêrêne, pela bêlikerdiye rê (ya zi karberanê kategoriya bêlikerdiye rê) pelanê gırêdayoğan de lista de vurnayışê peyênana.
 [[Special:Watchlist|Lista şımaya seyrkedışi de]] peli be nuşteyo '''qolınd''' bêli kerdê.",
 'recentchangeslinked-page' => 'Nameyê pele:',
-'recentchangeslinked-to' => 'Pelayan ke ena pela ri gire bi, ser ayi vurnayışi bımoc',
+'recentchangeslinked-to' => 'Heruna pela ke yena dayene, vurnayışanê pelanê ke daye ra gırêdayiyê inan bımocne',
 
 # Upload
 'upload' => 'Dosya bar ke',
@@ -2019,7 +2032,7 @@ keyepel nıka zaf meşğulo yew dema herayi de newe ra tesel bıkerê.',
 'listfiles_name' => 'Name',
 'listfiles_user' => 'Karber',
 'listfiles_size' => 'Gırdiye',
-'listfiles_description' => 'Sılasnayış',
+'listfiles_description' => 'Şınasnayış',
 'listfiles_count' => 'Versiyoni',
 'listfiles-show-all' => 'Asayışa versiyonandé verénan',
 'listfiles-latestversion' => 'Versiyono verin',
@@ -2029,7 +2042,7 @@ keyepel nıka zaf meşğulo yew dema herayi de newe ra tesel bıkerê.',
 # File description page
 'file-anchor-link' => 'Dosya',
 'filehist' => 'Ravêrdê dosya',
-'filehist-help' => 'bıploxne ser yew tarih u aye tarih dı versionê dosya bıvin.',
+'filehist-help' => 'Seba diyayışê viyarteyê dosya tarixê ke qısımê tarix/zemani derê inan bıtıkne.',
 'filehist-deleteall' => 'pêro bestere',
 'filehist-deleteone' => 'bestere',
 'filehist-revert' => 'reyna biyere',
@@ -2070,7 +2083,7 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 
 # File reversion
 'filerevert' => '$1 reyna biyere',
-'filerevert-legend' => 'Dosya ber weziyet do verên',
+'filerevert-legend' => 'Dosya raçarne',
 'filerevert-intro' => "Ti ho ena dosyayê '''[[Media:$1|$1]]'''î  [$4 versiyonê $3, $2] rê reyna anî.",
 'filerevert-comment' => 'Sebeb:',
 'filerevert-defaultcomment' => 'Versiyonê $2, $1 rê reyna ard',
@@ -2223,8 +2236,18 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'deadendpagestext' => 'Ena pelan ke {{SITENAME}} de zerrî ey de link çini yo.',
 'protectedpages' => 'Pelê pawıtiyey',
 'protectedpages-indef' => 'têna pawıteyê bêmuddeti',
+'protectedpages-summary' => 'têna pawıteyê têdimî',
 'protectedpages-cascade' => 'Kilit biyaye ke teyna cascadiye',
+'protectedpages-noredirect' => 'Hetenayışan bınımnê',
 'protectedpagesempty' => 'pê ney parametreyan pelê pawiteyi çinî',
+'protectedpages-timestamp' => 'Mareyê demi',
+'protectedpages-page' => 'Pele',
+'protectedpages-expiry' => 'Wextê qediyayışi',
+'protectedpages-performer' => 'Şeveknayışê karberi',
+'protectedpages-params' => 'Parametreyê şeveknayışi',
+'protectedpages-reason' => 'Sebeb',
+'protectedpages-unknown-timestamp' => 'Nêzanaye',
+'protectedpages-unknown-performer' => 'Karbero nêzanaye',
 'protectedtitles' => 'Sernameyê pawıtiyey',
 'protectedtitlesempty' => 'pê ney parametreyan sernuşteyê pawite çinê',
 'listusers' => 'Listeyê Karberan',
@@ -2252,7 +2275,7 @@ Xo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gı
 
 # Book sources
 'booksources' => 'Çımey kitaban',
-'booksources-search-legend' => 'Ser çımey kitaban bıgeyr',
+'booksources-search-legend' => 'Seba çımeyanê kıtaban cı geyre',
 'booksources-isbn' => 'ISBN:',
 'booksources-go' => 'Şo',
 'booksources-text' => 'listeya cêrıni, keyepelê kitap rotoxan o.',
@@ -2270,7 +2293,7 @@ tipa rocaneyi, nameyê karberi (herfa pil u qıci re hessas a), ya zi peli (reyn
 'showhideselectedlogentries' => 'Qeydê weçinayışê bımocne/bınımne dekerê',
 
 # Special:AllPages
-'allpages' => 'Peri pêro',
+'allpages' => 'Peli pêro',
 'alphaindexline' => '$1 ra $2ine',
 'nextpage' => 'Pela badê cû ($1)',
 'prevpage' => 'Pela verêne ($1)',
@@ -2414,6 +2437,7 @@ Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni.',
 'watchmethod-list' => 'pel ê ke şıma temaşa kenî vuryayişê peyinê ey konrol beno',
 'watchlistcontains' => 'listeya seyrkerdışê şıma de $1 tene {{PLURAL:$1|peli|peli}} estî.',
 'iteminvalidname' => "pê no '$1' unsuri problem bı, nameyo nemeqbul...",
+'wlnote2' => 'Cêr vurnayışê {{PLURAL:$1|saeta|<strong>$1</strong> saetanê}} peyênan estê, $2 ra be hetan $3.',
 'wlshowlast' => 'Peyni de vurnayışan ra  $1 seata u $2 roca $3 bımocnê',
 'watchlist-options' => 'Tercihê liste da seyri',
 
@@ -2587,7 +2611,7 @@ Tı eşkeno seviyeye kılit kerdışi bıvurno, feqat tı nıeşken "cascading p
 
 # Restrictions (nouns)
 'restriction-edit' => 'Bıvurne',
-'restriction-move' => 'Ber',
+'restriction-move' => 'Bere',
 'restriction-create' => 'Vıraze',
 'restriction-upload' => 'Bar ke',
 
@@ -2661,8 +2685,8 @@ $1',
 'contribsub2' => 'Qandê {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Ena kriteriya de vurnayîş çini yo.',
 'uctop' => '(weziyet)',
-'month' => 'Aşm:',
-'year' => 'Ser:',
+'month' => 'Aşme:',
+'year' => 'Serre:',
 
 'sp-contributions-newbies' => 'Tenya iştıraqanê karberanê neweyan bımocne',
 'sp-contributions-newbies-sub' => 'Qe hesebê newe',
@@ -2725,7 +2749,7 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'ipbenableautoblock' => 'verniyê IPadresa peyin ê no karberi u wexta ke vurnayişi kerd ê IPadresani otomotik bıger.',
 'ipbsubmit' => 'Ena karber blok bike',
 'ipbother' => 'Waxtê bini:',
-'ipboptions' => '2 seat:2 hours,1 roc:1 day,3 roci:3 days,1 hefte:1 week,2 heftey:2 weeks,1 aşm:1 month,3 aşm:3 months,6 aşmi:6 months,1 ser:1 year,ebedi:infinite',
+'ipboptions' => '2 saeti:2 hours,1 roce:1 day,3 roci:3 days,1 hefte:1 week,2 heftey:2 weeks,1 aşme:1 month,3 aşmi:3 months,6 aşmi:6 months,1 serre:1 year,ebedi:infinite',
 'ipbhidename' => 'Nameyê karberî listeyan u vurnayîşan ra binumne',
 'ipbwatchuser' => 'Pela miniqaşe u pela ena karberî seyr bike',
 'ipb-disableusertalk' => 'No karber wexto ke bloqedeyo wa pela da xodı vurnayış kerdışi rê izin medı',
@@ -2778,8 +2802,8 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'change-blocklink' => 'kılitkerdışi bıvurne',
 'contribslink' => 'iştıraqi',
 'emaillink' => 'e-poste bırışe',
-'autoblocker' => 'Şıma otomatikmen kılit biy, çıke adresa şımawa \'\'IP\'\'y terefê "[[User:$1|$1]]" gureniyena.
-Sebebê kılit-biyayışê $1\'i: "$2"o',
+'autoblocker' => 'Şıma otomatikmen kılit biy, çıke adresa şımaya \'\'IP\'\'y terefê "[[User:$1|$1]]" gureniyena.
+Sebebê kılitbiyayışê $1\'i "$2"o',
 'blocklogpage' => 'Qeydê bloqi',
 'blocklog-showlog' => 'verniyê no/na karberi cıwa ver geriyayo/ya.',
 'blocklog-showsuppresslog' => 'verniyê no/na karberi cıwa ver geriyayo/ya.',
@@ -2799,7 +2823,7 @@ Seba lista karberanê ke heta nıka kılit biyê [[Special:BlockList|lista kıli
 'range_block_disabled' => 'Desturê administorî ke viraştişê blokê rangeyî kefiliyo.',
 'ipb_expiry_invalid' => 'Wextê qediyayışi nêvêreno.',
 'ipb_expiry_temp' => 'Kılitbiyayışê karberê nımıtey gani ebedi bo.',
-'ipb_hide_invalid' => 'hesabê karberi pinani nêbeno; belka semedê zaf vurnayişi ra yo.',
+'ipb_hide_invalid' => 'Hesabê karberi pinani nêbeno; belka semedê {{PLURAL:$1|yew vurnayışi|$1 vurnayışan}} ra yo.',
 'ipb_already_blocked' => '"$1" zaten blok biya',
 'ipb-needreblock' => '$1 xora engel biyo. Tı wazenay eyaran bıvurnê?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Kılitkerdışo bin|Kılitkerdışê bini}}',
@@ -2906,7 +2930,7 @@ Yewna name bınus.',
 'movenosubpage' => 'pelê bınıni yê no peli çino.',
 'movereason' => 'Sebeb:',
 'revertmove' => 'peyser bia',
-'delete_and_move' => 'Bestern u ber',
+'delete_and_move' => 'Bestere û bere',
 'delete_and_move_text' => '==gani hewn a bıbıo/bıesteriyo==
 
 " no [[:$1]]" name de yew pel ca ra esto. şıma wazeni pê hewn a kerdışê ey peli vurnayişê nameyi bıkeri?',
@@ -2971,6 +2995,7 @@ eke şıma qayili paşt bıdi mahalli kerdışê wikimedyayi, kerem kerê pelê
 'allmessages-prefix' => 'pê prefiks filtre bıker',
 'allmessages-language' => 'Zıwan:',
 'allmessages-filter-submit' => 'Şo',
+'allmessages-filter-translate' => 'Açarnayış',
 
 # Thumbnails
 'thumbnail-more' => 'Gırd ke',
@@ -3023,7 +3048,7 @@ têna yew qısımê dosyayi ey bar bı',
 dosyaya emaneti vindbiyo',
 'import-parse-failure' => 'Împortê XML-parse nebiyo',
 'import-noarticle' => 'Pel çino ke împort bike!',
-'import-nonewrevisions' => 'Revizyonê hemi vernî de împort biyê.',
+'import-nonewrevisions' => 'Qet versiyoni nêardi (nê pêro ya vera biyê ya zi qandê xeteyan ra nayinan sera xıl diyayo).',
 'xml-error-string' => '$1 çizgi de $2 col $3 (bit $4): $5',
 'import-upload' => 'Dosyayê XML bar bike',
 'import-token-mismatch' => "vindibiyayişê ma'lumatê hesabi. kerem kerê newe ra tesel/cereb bıkerê.",
@@ -3104,14 +3129,14 @@ dosyaya emaneti vindbiyo',
 'tooltip-ca-nstab-user' => 'Pela karberi bıvêne',
 'tooltip-ca-nstab-media' => 'Pera medya bıvin',
 'tooltip-ca-nstab-special' => 'Na yew pela xasa, şıma nêşenê sero vurnayış bıkerê',
-'tooltip-ca-nstab-project' => 'Pera proci bıvin',
+'tooltip-ca-nstab-project' => 'Pela procey bıvêne',
 'tooltip-ca-nstab-image' => 'Pera dosyayer bıvin',
 'tooltip-ca-nstab-mediawiki' => 'Mesacané sistemi bıvin',
 'tooltip-ca-nstab-template' => 'Şabloni bıvin',
 'tooltip-ca-nstab-help' => 'Pela peşti bıvêne',
 'tooltip-ca-nstab-category' => 'Pela kategoriye bıvêne',
 'tooltip-minoredit' => 'Nay vırnayışa werdi nışan bıkeré',
-'tooltip-save' => 'Vurnayışa qeyd ke',
+'tooltip-save' => 'Vurnayışanê xo qeyd ke',
 'tooltip-preview' => 'Vurnayışané ğo çımra ravyarné. Verdé qeyd kerdışi eneri bıkarné!',
 'tooltip-diff' => 'Metni sero vurnayışan mocneno',
 'tooltip-compareselectedversions' => 'Ena per de ferqê rewziyonan de dı weçinaya bıvinê',
@@ -3279,7 +3304,7 @@ Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
 'noimages' => 'Çik çini yo.',
 'ilsubmit' => 'Cı geyre',
 'bydate' => 'goreyê zemani',
-'sp-newimages-showfrom' => '$1, sehat $2 ra tepya dosyayané newan bıasné',
+'sp-newimages-showfrom' => 'Dosyayanê newiyanê ke be $1, $2 ra dest pêkenê bımocne',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'video-dims' => '$1, $2 × $3',
@@ -4101,10 +4126,18 @@ Ti hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].',
 'version-parser-function-hooks' => 'Çengelê ekstensiyon ê parserî',
 'version-hook-name' => 'Nameyê çengelî',
 'version-hook-subscribedby' => 'Eza biyayoğ',
-'version-version' => '(Versiyon $1)',
+'version-version' => '($1)',
 'version-svn-revision' => '(r$2)',
-'version-license' => 'Lisans',
+'version-license' => 'Lisansê MediaWiki',
 'version-ext-license' => 'Lisans',
+'version-ext-colheader-name' => 'Dergiye',
+'version-ext-colheader-version' => 'Versiyon',
+'version-ext-colheader-license' => 'Lisans',
+'version-ext-colheader-description' => 'Şınasnayış',
+'version-ext-colheader-credits' => 'Nuştekari',
+'version-license-title' => 'Semedê $1 ra lisans',
+'version-license-not-found' => 'Seba na derganiye melumatê lisansê detayıni nêvêniya.',
+'version-credits-title' => 'Semedê $1 ra krediy',
 'version-poweredby-credits' => "Ena wiki, dezginda '''[https://www.mediawiki.org/ MediaWiki]''' ya piya vıraziyaya, heqê telifi © 2001-$1 $2.",
 'version-poweredby-others' => 'Zewmi',
 'version-poweredby-translators' => "Açernere translatewiki.net'i",
@@ -4324,6 +4357,7 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
 'api-error-overwrite' => 'Ser yew dosyayê ke hama esta, ser ey qeyd nibena.',
 'api-error-stashfailed' => 'Xırabiya zerrek:Wasteri idari dosyey kerdi vıni.',
 'api-error-publishfailed' => 'Xetaya zerrey: Cıgeyrayoği nêşiya dosyaya rocaniye akero.',
+'api-error-stasherror' => 'Dosya embari rê ke bar biye xeta veciye.',
 'api-error-timeout' => 'Cıwab dayışê wasteri peyra mend.',
 'api-error-unclassified' => 'Yew xeteyê nizanyeni biya.',
 'api-error-unknown-code' => "$1'dı jew xeta vıciye",
@@ -4381,4 +4415,6 @@ Eneri Medya wiki sera xo keno.',
 'expand_templates_generate_rawhtml' => "Xam HTML'i bıvin",
 'expand_templates_preview' => 'Verqayt',
 
+# Unknown messages
+'uploadinvalidxml' => 'Dosyaya barkerdiye de XML nêgureniya.',
 );
index 7c3b3b1..879f221 100644 (file)
@@ -161,7 +161,6 @@ $dateFormats = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Wótkaze pódšmarnuś:',
-'tog-justify' => 'Tekst do bloka zrownaś',
 'tog-hideminor' => 'Małe změny w aktualnych změnach schowaś',
 'tog-hidepatrolled' => 'Doglědowane změny w aktualnych změnach schowaś',
 'tog-newpageshidepatrolled' => 'Doglědowane boki z lisćiny nowych bokow schowaś',
@@ -323,7 +322,6 @@ $messages = array(
 'vector-action-protect' => 'Šćitaś',
 'vector-action-undelete' => 'Wótnowiś',
 'vector-action-unprotect' => 'Šćit změniś',
-'vector-simplesearch-preference' => 'Zjadnorjonu pytańsku lejstwu zmóžniś (jano drastwa Vector)',
 'vector-view-create' => 'Napóraś',
 'vector-view-edit' => 'Wobźěłaś',
 'vector-view-history' => 'Wersije a awtory',
@@ -957,7 +955,7 @@ Eksistěrujo južo.',
 'invalid-content-data' => 'Njepłaśiwe wopśimjeśowe daty',
 'content-not-allowed-here' => 'Wopśimjeśe "$1" njejo na boku [[$2]] dowólone',
 'editwarning-warning' => 'Gaž toś ten bok se spušća, mógu se změny zgubiś, kótarež sy pśewjadł.
-Jolic sy pśizjawjeny, móžoš toś to warnowanje we wótrězku „Wobźěłaś“ swójich nastajenjow znjemóžniś.',
+Jolic sy pśizjawjeny, móžoš toś to warnowanje we wótrězku „{{int:prefs-editing}}“ swójich nastajenjow znjemóžniś.',
 'editpage-notsupportedcontentformat-title' => 'Wopśimjeśowy format se njepódpěra.',
 'editpage-notsupportedcontentformat-text' => 'Wopśimjeśowy format $1 njepódpěra se pśez wopśimjeśowy model $2.',
 
@@ -991,6 +989,7 @@ Njesmějo daś wěcej nježli $2 {{PLURAL:$2|wołanja|wołanjowu|wołanjow|woła
 'undo-success' => 'Wobźěłanje móžo se wótpóraś. Pšosym pśeglěduj dołojcne pśirownowanje aby se wěsty był, až to wót wěrnosći coš, a pón składuj změny, aby se wobźěłanje doskóńcnje wótpórało.',
 'undo-failure' => 'Změna njejo se mógała wótpóraś, dokulaž jo něchten pótrjefjony wótrězk mjaztym změnił.',
 'undo-norev' => 'Změna njeda se wótwrośiś, dokulaž njeeksistěčujo abo jo se wulašowała.',
+'undo-nochange' => 'Zda se, až změna jo se južo anulěrowała.',
 'undo-summary' => 'Wersija $1 wót [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskusija]]) jo se anulěrowała',
 'undo-summary-username-hidden' => 'Změna $1 schowanego wužywarja jo se anulěrowała',
 
@@ -1171,7 +1170,8 @@ Zaruc, až historija wersijow nastawka jo njepśetergnjona.',
 'showhideselectedversions' => 'Wubrane wersije pokazaś/schowaś',
 'editundo' => 'wótwrośiś',
 'diff-empty' => '(Žeden rozdźěl)',
-'diff-multi' => '({{PLURAL:$1|Jadna mjazywersija|$1 mjazywersiji|$1 mjazywersije|$1 mjazywersijow}} wót {{PLURAL:$2|jadnogo wužywarja|$2 wužywarjowu|$2 wužywarjow|$2 wužywarjow}} {{PLURAL:$1|njepokazana|njepokazanej|njepokazane|njepokazane}})',
+'diff-multi-sameuser' => '({{PLURAL:$1|Jadna mjazywersija|$1 mjazywersiji|$1 mjazywersije|$1 mjazywersijow}} wót togo samskego wužywarja {{PLURAL:$1|njepokazana|njepokazanej|njepokazane}})',
+'diff-multi-otherusers' => '({{PLURAL:$1|Jadna mjazywersija|$1 mjazywersiji|$1 mjazywersije|$1 mjazywersijow}} wót {{PLURAL:$2|jadnogo dalšnego wužywarja|$2 wužywarjow}} {{PLURAL:$1|njepokazana|njepokazanej|njepokazane}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Jadna mjazywersija|$1 mjazywersiji|$1 mjazywersije|$1 mjazywersijow}} wót wěcej ako {{PLURAL:$2|jadnogo wužywarja|$2 wužywarjowu|$2 wužywarjow|$2 wužywarjow}} {{PLURAL:$1|njepokazana|njepokazanej|njepokazane|njepokazane}})',
 'difference-missing-revision' => '{{PLURAL:$2|Jadna wersija|$2 wersiji|$2 wersije|$2 wersijow}} toś togo rozdźěla ($1) {{PLURAL:$2|njejo se namakała|njejstej se namakałej|njejsu namakali|njejo se namakało}}.
 
@@ -1192,7 +1192,7 @@ Drobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'shown-title' => '$1 {{PLURAL:$1|wuslědk|wuslědka|wuslědki|wuslědkow}} na bok pokazaś',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) pokazaś',
 'searchmenu-exists' => "'''Jo bok z mjenim \"[[\$1]]\" na toś tom wikiju'''",
-'searchmenu-new' => "'''Napóraj bok \"[[:\$1|\$1]]\" na toś tom wikiju!'''",
+'searchmenu-new' => '<strong>Napóraj bok "[[:$1]]" na toś tom wikiju!</strong> {{PLURAL:$2|0=|Glej teke bok namakany z twójim pytanim.|Glej teke namakane pytańske wuslědki.}}',
 'searchprofile-articles' => 'Wopśimjeśowe boki',
 'searchprofile-project' => 'Pomoc a projektowe boki',
 'searchprofile-images' => 'Multimedia',
@@ -1218,6 +1218,7 @@ Drobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'searchrelated' => 'swójźbne',
 'searchall' => 'wše',
 'showingresults' => "How {{PLURAL:|jo '''1''' wuslědk|stej '''$1''' wuslědka|su '''$1''' wuslědki}} wót cysła '''$2'''.",
+'showingresultsinrange' => 'Dołojce pokazujo se do {{PLURAL:$1|<strong>1</strong> wuslědka|<strong>$1</strong> wuslědkowu|<strong>$1</strong> wuslědkow}} we wobłuku <strong>$2</strong> až do <strong>$3</strong>.',
 'showingresultsnum' => "How {{PLURAL:$3|jo '''1''' wuslědk|stej '''$3''' wuslědka|su '''$3''' wuslědki}} wót cysła '''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Wuslědk '''$1''' z '''$3'''|Wuslědki '''$1 - $2''' z '''$3'''}} za '''$4'''",
 'search-nonefound' => 'Njejsu se wuslědki namakali, kótarež wótpowěduju napšašowanjeju.',
@@ -2026,9 +2027,18 @@ Kužda smužka wopśimjejo wótkaze na prědne a druge dalejpósrědnjenje a tek
 'deadendpagestext' => 'Slědujuce boki njewótkazuju na druge boki we {{GRAMMAR:lokatiw|{{SITENAME}}}}.',
 'protectedpages' => 'Šćitane boki',
 'protectedpages-indef' => 'Jano boki pokazaś, kótarež su na njewěsty cas šćitane',
+'protectedpages-summary' => 'Toś ten specialny bok pokazujo wšykne boki, kótarež njamgu se mimo wósebnych pšawow wobźěłowaś a pśesuwaś.',
 'protectedpages-cascade' => 'Jano boki z kaskadowym šćitom',
 'protectedpages-noredirect' => 'Dalejpósrědnjenja schowaś',
 'protectedpagesempty' => 'Z toś tymi parametrami njejsu tuchylu žedne boki šćitane.',
+'protectedpages-timestamp' => 'Casowy kołk',
+'protectedpages-page' => 'Bok',
+'protectedpages-expiry' => 'Płaśiwy až do',
+'protectedpages-performer' => 'Šćitajucy wužywaŕ',
+'protectedpages-params' => 'Šćitowe parametry',
+'protectedpages-reason' => 'Pśicyna',
+'protectedpages-unknown-timestamp' => 'Njeznaty',
+'protectedpages-unknown-performer' => 'Njeznaty wužywaŕ',
 'protectedtitles' => 'Šćitane titele',
 'protectedtitlesempty' => 'Tuchylu njejsu žedne boki z pódanych parametrami šćitane.',
 'listusers' => 'Lisćina wužywarjow',
@@ -2213,6 +2223,7 @@ Pózdźejšne změny na toś tom boku a w pśisłušecej diskusiji se tam nalicu
 'watchmethod-list' => 'Pśepytanje wobglědowanych bokow za aktualnymi změnami',
 'watchlistcontains' => 'Twója wobglědowańka wopśimujo $1 {{PLURAL:$1|bok|boka|boki|bokow}}.',
 'iteminvalidname' => 'Problem ze zapisom „$1“, njepłaśece mě.',
+'wlnote2' => 'Slěduju změny {{PLURAL:$1|zachadneje góźiny|zachadneju <strong>$1</strong> góźinowu|zachadnych <strong>$1</strong> góźinow}} Staw: $2, $3.',
 'wlshowlast' => 'Pokaž změny slědnych $1 góźinow, $2 dnjow abo $3 (w slědnych 30 dnjach).',
 'watchlist-options' => 'Opcije wobglědowańki',
 
@@ -2569,7 +2580,7 @@ Glědaj do [[Special:BlockList|lisćiny blokěrowanjow]], aby blokěrowanja pśe
 'change-blocklink' => 'Blokěrowanje změniś',
 'contribslink' => 'pśinoski',
 'emaillink' => 'E-mail pósłaś',
-'autoblocker' => 'Awtomatiski blokěrowany, dokulaž twója IP-adresa jo se rowno wót "[[User:$1|$1]]". Pśicyna za blokěrowanje wužywarja $1 jo: "$2".',
+'autoblocker' => 'Awtomatiski blokěrowany, dokulaž twója IP-adresa jo se rowno wót "[[User:$1|$1]]" wužyła. Pśicyna za blokěrowanje wužywarja $1 jo: "$2".',
 'blocklogpage' => 'Protokol blokěrowanjow',
 'blocklog-showlog' => 'Toś ten wužywaŕ jo se pjerwjej zablokěrował. Protokol blokěrowanjow pódawa se dołojce ako referenca:',
 'blocklog-showsuppresslog' => 'Toś ten wužywaŕ jo se pjerwjej zablokěrował a schował. Protokol pódtłocowanjow pódawa se dołojce ako referenca:',
@@ -2749,6 +2760,7 @@ Pšosym wobglědaj [https://www.mediawiki.org/wiki/Localisation lokalizaciju Med
 'allmessages-prefix' => 'Pó prefiksu filtrěrowaś:',
 'allmessages-language' => 'Rěc:',
 'allmessages-filter-submit' => 'Wótpósłaś',
+'allmessages-filter-translate' => 'Pśełožyś',
 
 # Thumbnails
 'thumbnail-more' => 'Pówětšyś',
@@ -2765,6 +2777,7 @@ $2',
 'thumbnail_image-type' => 'Wobrazy typ se njepódpěra',
 'thumbnail_gd-library' => 'Njedopołna konfiguracija GD-biblioteki: felujuca funkcija $1',
 'thumbnail_image-missing' => 'Zda se, až dataja felujo: $1',
+'thumbnail_image-failure-limit' => 'Njedawno jo pśewjele wopytow było, kótarež jo se njeraźiło ($1 abo wěcej), aby toś tu miniaturu kresliło. Pšosym wopytajśo pózdźej hyšći raz.',
 
 # Special:Import
 'import' => 'Boki importěrowaś',
@@ -2799,7 +2812,7 @@ Wšykne transwiki-importowe akcije protokolěruju se w [[Special:Log/import|log-
 'importuploaderrortemp' => 'Nagrawanje importoweje dataje njejo se raźiło. Temporarny zapis felujo.',
 'import-parse-failure' => 'Zmólka pśi XML-imporśe:',
 'import-noarticle' => 'Žeden bok za import!',
-'import-nonewrevisions' => 'Wšykne wersije buchu južo pjerwjej importowane.',
+'import-nonewrevisions' => 'Žedne wersije zaimportěrowane (wšykne pak su južo eksistěrowali pak su so zmólkow dla pśeskócyli).',
 'xml-error-string' => '$1 smužka $2, słup $3, (Byte $4): $5',
 'import-upload' => 'XML-daty nagraś',
 'import-token-mismatch' => 'Zgubjenje posejźeńskich datow. Pšosym wopytaj hyšći raz.',
@@ -2810,6 +2823,7 @@ Wšykne transwiki-importowe akcije protokolěruju se w [[Special:Log/import|log-
 'import-error-special' => 'Bok "$1" se njeimportěrujo, dokulaž słuša k wósebnemu mjenjowemu rumoju, kótaryž njedowólujo boki.',
 'import-error-invalid' => 'Bok "$1" se njeimportěrujo, dokulaž jogo mě jo njepłaśiwe.',
 'import-error-unserialize' => 'Wersija $2 boka "$1" njedajo se wótserializěrowaś. Wersija jo se za wužywanje wopśimjeśowego $3 k wěsći dała, kótaryž jo ako $4 serializěrowany.',
+'import-error-bad-location' => 'Wersija $2, kótaraž wužywa wopśimjeśowy model $3, njedajo se pód "$1" w toś tom wikiju składowaś, dokulaž model njepódpěra se na toś tom boku.',
 'import-options-wrong' => '{{PLURAL:$2|Wopacna opcija|Wopacnej opciji|Wopacne opcije|Wopacne opcije}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Pódany kórjenjowy bok jo njepłaśiwy.',
 'import-rootpage-nosubpage' => 'Mjenjowy rum "$1" kórjenjowego boka njedowólujo pódboki.',
@@ -3971,6 +3985,5 @@ Hować móžoš slědujucy jadnory formular wužywaś. Twój komentar pśidajo s
 'expand_templates_preview' => 'Pśeglěd',
 
 # Unknown messages
-'createaccount-hook-aborted' => '$1',
 'uploadinvalidxml' => 'XML w nagratej dataji njedajo se parsowaś.',
 );
index d7db293..cf35434 100644 (file)
@@ -16,7 +16,6 @@ $fallback = 'ms';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Mangagaris pioputan:',
-'tog-justify' => 'Kasagaan kiparagrap',
 'tog-hideminor' => 'Lisoko idit tokoro ih wagu kaalanai.',
 'tog-hidepatrolled' => 'Lisoko idit tinamangan ih wagu kaalanai',
 'tog-newpageshidepatrolled' => 'Lisoko bolikon tinamangan mantad lis bolikon kawawagu',
@@ -25,9 +24,7 @@ $messages = array(
 'tog-numberheadings' => 'oporian-mongonumbur it tuluhon',
 'tog-showtoolbar' => 'Pokitono kakamotbar mongidit (momoguno JawaSikrip)',
 'tog-editondblclick' => 'Idito bolikon momoguno induaan todos (momoguno JawaSikrip)',
-'tog-editsection' => 'Pabanaro sikson mongidit mamakai noputan (idit)',
 'tog-editsectiononrightclick' => 'Pabanaro sikson mongidit momoguno todos golibang id sikson tuluon (momoguno JawaSikrip)',
-'tog-showtoc' => 'Pokitono mija sinuang-suang (montok bolikon di kolobi do 3 tuluhon)',
 'tog-rememberpassword' => 'Soroho ot loginku id popogihuman diti (gisom solinaid do $1 {{PLURAL:$1|tadau|madau}})',
 'tog-watchcreations' => 'Ruhangai bolikon di winonsoiku om nogi pail pinosuangku id lisintanganku',
 'tog-watchdefault' => 'Ruhangai bolikon om tangapail di niditku id lisintanganku',
@@ -900,7 +897,6 @@ Intaai [[Special:BlockList|lis nantaban]] montok lis kawawagu karaja mogoduh om
 'compareselectedversions' => 'Popitimbang sinimakan nopili',
 'showhideselectedversions' => 'Pokitono/polisoko sinimakan nopili',
 'editundo' => 'suguto mongidit',
-'diff-multi' => '({{PLURAL:$1|Iso sinimakan pintangaan|$1 tongosinimakan pintangaan}} di {{PLURAL:$2|iso momomoguno|$2 momomoguno}} awu pokitonon)',
 
 # Search results
 'searchresults' => 'Kootuson nihuman',
index 95c8291..3146f10 100644 (file)
@@ -670,7 +670,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watchthispage' => 'މި ޞަފްޙާއަށް ނަޒަރުބަހައްޓަވާ',
 'unwatch' => 'ހާއްސަ ނަޒަރުން އުނިކުރޭ',
 'watchlistcontains' => 'ތިޔަބޭފުޅާގެ ހާއްސަ ނަޒަރު ފިހުރިސްތުގައި ވަނީ $1 ޞަފްޙާއެވެ.',
-'wlnote' => 'ތިރީގައި މިވަނީ އެއީ ފާއިތުވި <b>$2</b> ގަޑި އިރުގެ ތެރޭގައިގެނެވިފައިވާ ފަހު $1 ބަދަލެވެ.',
 
 'changed' => 'ބަދަލުކުރެވިއްޖެ',
 
index 81e3ca4..d90623f 100644 (file)
@@ -16,7 +16,6 @@ $fallback = 'it';
 $messages = array(
 # User preference toggles
 'tog-underline' => "Tîra 'na rîga sòta i colegamèint.",
-'tog-justify' => 'Mésa in ōrdin di carâter di peréiod.',
 'tog-hideminor' => "Lōga 'l mudéfichi pió céchi int al j ûltmi mudéfichi.",
 'tog-hidepatrolled' => "Lōga 'l mudéfichi verifichêdi int al j ûltmi mudéfichi",
 'tog-newpageshidepatrolled' => "Lōga al pàgini verifichêdi da l'elèinch dal pàgini pió nōvi.",
@@ -178,7 +177,6 @@ $messages = array(
 'vector-action-protect' => 'Prutēz',
 'vector-action-undelete' => 'Fà al recóper',
 'vector-action-unprotect' => 'Câmbia la prutesiòun',
-'vector-simplesearch-preference' => 'Drōva la bâra per la sērca pió fâcila (sōl per la skin Vector)',
 'vector-view-create' => 'Invèinta',
 'vector-view-edit' => 'Mudéfica',
 'vector-view-history' => 'Guêrda la stôria',
@@ -433,6 +431,7 @@ Guêrda che soquânti pàgini a prén vèdres incòra cme s'ét fós incòra col
 'remembermypassword' => "Tîn a mèint la cêva 'd ingrès insém a cól navigadōr ché (per un mâsim ed $1{{PLURAL:$1|dé}}).",
 'userlogin-remembermypassword' => 'Sèimper coleghê',
 'userlogin-signwithsecure' => 'Drōva un colegamèint sicûr',
+'yourdomainname' => 'Precişêr al duméni:',
 'password-change-forbidden' => "An n'é mìa pusébil mudifichêr la cêva 'd ingrès insém a sté wiki.",
 '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',
@@ -528,20 +527,87 @@ Se l'inscrisiòun l'é stêda fâta per şbâli, es pōl scanşlêr sté mesâg.
 'login-abort-generic' => "An t'é mìa stê arcgnusû - Scanşlê",
 'loginlanguagelabel' => 'Léngva: $1',
 'suspicious-userlogout' => "La tó dmânda per destachêret l'é stēda rifiutêda perchè la sèmbra spidîda da un navigadōr ch' al funsiòuna mìa o da un proxy di caching.",
+'createacct-another-realname-tip' => "Druvêr al nòm vèira l'é 'na siēlta personêla; s' es pèinsa 'd ruvêrel al gnirâ uşê per dêr la paternitê di lavōr spidî.",
+
+# Email sending
+'php-mail-error-unknown' => 'Erōr mìa cngusû int la funsiòun PHP mail().',
+'user-mail-no-addy' => "T'é serchê de spidîr un mesâg cun la pôsta eletrônica sèinsa 'n indirés.",
+'user-mail-no-body' => "A s'é serchê de spidîr un mesâg ed pôsta eltrônica vōd o dimòndi cûrt.",
 
 # Change password dialog
 'changepassword' => "Câmbia la cêva 'd ingrès",
+'resetpass_announce' => "L'ingrès l'é stê fâ cun un côdis pruvişôri, spidî cun la pôsta eletrônica. Per finîr l'ingrès l'é necesâri impustêr 'na nōva cêva 'd ingrès.",
+'resetpass_header' => "Câmbia la cêva 'd ingrès ed l'inscrisiòun.",
 'oldpassword' => "Cêva 'd ingès vècia:",
 'newpassword' => "Nōva cêva 'd ingrès:",
+'retypenew' => "Scrév incòra la nōva cêva 'd ingrès:",
+'resetpass_submit' => "Scrév la cêva 'd ingrès e và dèinter al sît",
+'changepassword-success' => "La cêva 'd ingrès l'é stêda nudifichêda!",
+'changepassword-throttled' => "În stê fât trôp tentatîv 'd ingrès in pôch tèimp. Spèta $1 e pó tōrna pruvêr.",
+'resetpass_forbidden' => "An 'né mìa pusébil mudifichêr la cêva 'd ingrès",
+'resetpass-no-info' => "Per andêr dèinter a cla pàgina ché 't gh'ê da fêr l'ingrès.",
 'resetpass-submit-loggedin' => "Câmbia la cêva 'd ingrès",
 'resetpass-submit-cancel' => 'Scanşèla',
+'resetpass-wrong-oldpass' => "Cêva 'd ingrès pruvişôria o còla 'd adès mìa vâlida.
+La cêva 'd ingrès la pré èser stêda bèle cambiêda, opór n'in pré èser stê dmandê 'na nōva pruvişôria.",
 'resetpass-temp-password' => "Cêva 'd ingrès pruvişôria:",
+'resetpass-abort-generic' => "La mudéfica 'd la cêva 'd ingrès l'é stêda fermêda da un şlungamèint.",
 
 # Special:PasswordReset
 'passwordreset' => "Câmbia la cêva 'd ingrès",
+'passwordreset-text-one' => "Impés cól môdul ché per  turnêr a impustêr la tó cêva 'd ingrès.",
+'passwordreset-text-many' => "{{PLURAL:$1|Impés ûn di câmp per ricēver 'na cêva 'd ingrès pruvişôria per mèz ed la pôsta eletrônica}}",
 'passwordreset-legend' => "Tōrna mèter la cêva 'd ingrès",
+'passwordreset-disabled' => "In cla wiki ché an pōlen mia turnêr impustêr al cêvi 'd ingrès",
+'passwordreset-emaildisabled' => 'In cla wiki ché è stê bluchê al funsiòun ed la pôsta eletrônica.',
 'passwordreset-username' => 'Nòm utèint:',
 'passwordreset-domain' => 'Proprietê:',
+'passwordreset-capture' => 'Vōt vèder còl che dèinter int al mesâg ed pôsta eletrônica?',
+'passwordreset-capture-help' => "S' es sernés cla caşèla ché, l'indirés ed pôsta eletrônica (cun la cêva 'd ingrès pruvişôria), év vîn fâ vèder, d'ed là 'd èser spidî a l'utèint.",
+'passwordreset-email' => 'Indirés pôsta eletrônica',
+'passwordreset-emailtitle' => "Particulêr ed l'utèint só {{SITENAME}}",
+'passwordreset-emailtext-ip' => "Quelchidûn (prubabilmèint té, cun l'indirés IP $1) l'à dmandê de spidîregh 'na nōva cêva 'd ingrès per andêr dèinter a {{SITENAME}} ($4). {{PLURAL:$3|L'utèint inscrét| J utèint inscrét}} a sté indirés ed pôsta eletrônica în:
+$2 
+
+{{PLURAL:$3|Cla cêva 'd ingrès pruvişôria la scadrà| St' al cêvi 'd ingrès pruvişôri ché scadrân}} dôp {{PLURAL:$5|ûn dé|$5 dé}}. Ét duvrés andêr dèinter e sernîr 'na cêva 'd ingrès nōva adès. 
+
+Se t'é mìa stê té a fêr la dmânda, o s' ét t'é ricurdê la cêva 'd ingrès uriginêla e an 't vō mia pió cambiêrla, ét pō scanşlêr cól mesâg ché e cuntinvêr a druvêr la tó cêva 'd ingrès vècia.",
+'passwordreset-emailtext-user' => "L'utèint $1 ed {{SITENAME}} l'à dmandê de spidîregh 'na nōva cêva 'd ingrès per andêr dèinter a {{SITENAME}} ($4). {{PLURAL:$3|L'utèint inscrét| J utèint inscrét}} a sté indirés ed pôsta eletrônica în:
+
+$2 
+
+{{PLURAL:$3|Cla cêva 'd ingrès pruvişôria ché la scadrà| St' al cêvi 'd ingrès pruvişôri ché scadrân}} dôp {{PLURAL:$5|ûn dé|$5 dé}}. Ét duvrés andêr dèinter e sernîr 'na cêva 'd ingrès nōva adès. 
+
+Se t'é mìa stê té a fêr la dmânda, o s' ét t'é ricurdê la cêva 'd ingrès uriginêla e an 't vō mia pió cambiêrla, ét pō scanşlêr cól mesâg ché e cuntinvêr a druvêr la tó cêva 'd ingrès vècia",
+'passwordreset-emailelement' => "Nòm utèint: $1.
+Cêva 'd ingrès pruvişôria: $2",
+'passwordreset-emailsent' => "É stê spidî un mesâg ed pôsta eletrônica per turnêr a impustêr la cêva 'd ingrès.",
+'passwordreset-emailsent-capture' => "É stê spidî un mesâg ed pôsta eletrônica per turnêr a impustêr la cêva 'd ingrès, ché sòta a gh'é al tèst che gh'é scrét.",
+'passwordreset-emailerror-capture' => "É stê fât un mesâg ed pôsta eletrônica per turnêr a impustêr la cêva 'd ingrès, scréta ché 'd sègvit. La spedisiòun {{GENDER:$2|a l'utèint}} an n'é mia 'riusîda:$1",
+
+# Special:ChangeEmail
+'changeemail' => "Câmbia l'indirés ed la pôsta eletrônica",
+'changeemail-header' => "Câmbia l'indirés ed la pôsta eletrônica 'd la tó inscrisiòun.",
+'changeemail-text' => "Impés sté mòdul per cambiêr al tó indirés ed pòsta eletrônica. A srà necesâri mèter dèinter la cêva 'd ingrès per cunfermêr la mudéfica.",
+'changeemail-no-info' => "Per andêr dèinter diretamèint a cla pàgina ché 't gh'ê da fêr l'ingrès.",
+'changeemail-oldemail' => "L'indirés ed la pôsta eletrànica 'd adès.",
+'changeemail-newemail' => 'Nōv indirés ed pàsta eletrônica:',
+'changeemail-none' => '(nisûn)',
+'changeemail-password' => "La cêva 'd ingrès só {{SITENAME}}:",
+'changeemail-submit' => "Cambiêr l'indirés ed pôsta eletrônica",
+'changeemail-cancel' => 'Scanşèla',
+'changeemail-throttled' => "În stê fât trôp tentatîv 'd ingrès in pôch tèimp. Spèta $1 e pó tōrna pruvêr dôp.",
+
+# Special:ResetTokens
+'resettokens' => "Tōrna 'd impustêr la cêva",
+'resettokens-text' => "Ché 't pō turnêr a impustêr al cêvi ch'ét permèten l'ingrès a precîşi infurmasiòun privêdi lighêdi a la tó utèinsa. Ét duvrés fêrel se per chêş ét j ê spartîdi cun quelchidûn o se al j infurmasiòun ed la tó utèinsa în  in perécol.",
+'resettokens-no-tokens' => "An gh'é mìa di token da turnêr a impustêr.",
+'resettokens-legend' => "Tōrna 'd impustêr la cêva",
+'resettokens-token-label' => "$1 (valōr 'd adèsa: $2)",
+'resettokens-watchlist-token' => "Token p'r al feed web (Atom/RSS) dal [[Special:Watchlist|mudéfichi al pàgini ch'ét tîn sòt' ôc]]",
+'resettokens-done' => 'Token turnê a impustêr.',
+'resettokens-resetbutton' => 'Més a zēro i token sernî',
 
 # Edit page toolbar
 'bold_sample' => 'Grasèt',
@@ -563,21 +629,82 @@ Se l'inscrisiòun l'é stêda fâta per şbâli, es pōl scanşlêr sté mesâg.
 
 # Edit pages
 'summary' => 'Sûnt:',
+'subject' => 'Argumèint (tétol):',
 'minoredit' => "Còsta l'é 'na mudéfica céca",
 'watchthis' => 'Tîn adrē a cla pàgina ché',
 'savearticle' => 'Sêlva la pàgina',
 'preview' => 'Guêrda préma',
 'showpreview' => "Guêrda préma 'd salvêr",
+'showlivepreview' => 'Guêrda préma diretamèint',
 'showdiff' => 'Guêrda i cambiamèint',
 'anoneditwarning' => "'''Atensiòun:''' Ingrès mìa fât. Al tó indirés IP al srà sgnê int la stòria ed cla pàgina chè.",
+'anonpreviewwarning' => "\"An n'é mìa stê fât l'ingrès. Mèinter es sêlva la pàgina, l'indirés IP al srà sgnê int la stòria 'd la pàgina.\"",
+'missingsummary' => "'''Atensiòun:''' an n'é mìa stê precişê al mutîv de sté mudéfica. S'es tōrna a clichêr insém a \"{{int:savearticle}}\" la mudéfica la gnirà salvêda cun al mutîv vōd.",
+'missingcommenttext' => 'Scréver un cumèint ché sòta.',
+'missingcommentheader' => "'''Atensiòun:''' an n'é mìa stê precişê al mutîv/al tétol de sté mudéfica. S'es tōrna a clichêr insém a \"{{int:savearticle}}\" la mudéfica la gnirà salvêda sèinsa tétol.",
+'summary-preview' => 'Guêrda préma sûnt:',
+'subject-preview' => 'Guêrda préma argumèint/tétol:',
 'blockedtitle' => 'Utèint bluchê',
+'blockedtext' => " '''Al tō nòm utèint o indirés IP l'é stê bluchê.'''
+
+Al blôch l'é stê fât da $1. Al mutîv dal blôch l'é còst:  ''$2''.
+
+*Inési dal blôch: $8
+*Scadèinsa dal blôch: $6
+*Intervâl ed blôch: $7
+
+S' ét vō, l'é pusébil mètres in cuntât cun $1 o 'n êter [[{{MediaWiki:Grouppage-sysop}}|aministradōr]] per discóter dal blôch.
+
+Guêrda che la funsiòun 'Scrév a l'utèint' an n'é mìa in ôvra s' an n'é mìa stê registrtê un indirés ed pôsta eletrônica vâlid int al tō [[Special:Preferences| preferèinsi]] o se sté funsiòun l'é stêda bluchêda. L'indirés IP 'd adèsa l'é $3, al nóme ID dal blôch l'é #$5. T'é perghê ed precişêr tót j elemèint ed préma per ògni dmânda de spiegasiòun",
+'autoblockedtext' => "Cl'indirés IP ché l'è stê bluchê in avtomâtich perché spartî cun 'n êter utèint, bluchê ânca ló da $1. Al mutîv dal blôch l'é còst:
+
+''$2''
+*Inési dal blôch: $8 
+*Scadèinsa dal blôch: $6 
+*Intervâl ed blôch: $7
+S' ét vō, l'é pusébil mètres in cuntât cun $1 o 'n êter [[{{MediaWiki:Grouppage-sysop}}|aministradōr]] per dmandêr spiegasiòun insém al blôch. Guêrda che la funsiòun 'Scrév a l'utèint' an n'é mìa in ôvra s' an n'é mìa stê registrtê un indirés ed pôsta eletrônica vâlid int al tō [[Special:Preferences| preferèinsi]] e, in tót al manēri, se int al tachêr al blôch, sté funsiòun l'é stêda bluchêda. L'indirés IP 'd adèsa l'é $3, al nóme ID dal blôch l'é #$5. T'é perghê ed precişêr tót j elemèint ed préma per ògni dmânda de spiegasiòun",
+'blockednoreason' => 'nisûn mutîv sgnê',
+'whitelistedittext' => 'Per mudifichêr al pàgini è necesâri $1.',
+'confirmedittext' => "Per avèir al permès ed mudufichêr dal pàgini l'è necesâri cunfermêr al tó indirés ed pôsta eletrônica.
+Per impustêr e cunfermêr l'indirés dervîres dal [[Special:Preferences|preferèinsi]].",
+'nosuchsectiontitle' => 'Impusébil catêr la sesiòun',
+'nosuchsectiontext' => "A  t' é pruvê 'd mudifichêr 'na sesiòun ch' l' an gh'è mìa. La pré èser stêda spustêda e scanşlêda mèinter t'ēr adrē vèder la pàgina.",
+'loginreqtitle' => 'Ingrès e-dmandê',
+'loginreqlink' => "fêr l'ingrès",
+'loginreqpagetext' => 'Per vèder dal j êtri pàgini è necesâri $1.',
+'accmailtitle' => "Cêva 'd ingrès spidîda.",
+'accmailtext' => "'Na cêva 'd ingrés l'è stêda fâta a chêş per [[User talk:$1|$1]] e l'è stêda spidîda a $2. Cla cêva 'd ingrès ché la pōl èser cambiêda int la pàgina per ''[[Special:ChangePassword|cambiêr la cêva 'd ingrès]]'' subét dôp avèir fât l'ingrès.",
 'newarticle' => '(Nōv)',
 'newarticletext' => "Al colegamèint apèina fât al cumbîna cun 'na pàgina ch' an n'é mìa incòra stêda fâta. S'ét vō fêr la pàgina adès, l'é asê cumincêr a scréver al tèst int la caşèla ché sòt (per vedèr infurmasiòun pió precîşi guêrda la [[{{MediaWiki:Helppage}}|pàgina 'd ajót]]). Se al colegamèint  l'é stê avêrt per erōr, l'é asê clichêr al pulsânt \"Indrē\" dal tó navigadōr.",
+'anontalkpagetext' => "----'' Còsta l'è la pàgina 'd discusiòun ed 'n utèint sèinsa nòm, ch' an n' à mìa incòra fât 'n' utèinsa o in tót al manēri an n'è mìa drē druvêrla. Per arcgnòsrel l'è dòunca necesâri druvê al só indirés IP. J indirés IP a pōlen èser spartî cun êter utèint. Se t'è un utèint sèinsa nòm e 't pèins che i cumèint in cla pàgina ché an riguêrden mìa tè, [[Special:UserLogin/signup|fa 'n' utèinsa nōva]] o [[Special:UserLogin|vîn dèinter cun còla ch' ét gh'ê bèle]] per schivşêr, in futûr,  'd èser cunfûş cun 'd j êter utèint sèinsa nòm.''",
 'noarticletext' => 'In cól mumèint ché la pàgina serchêda l\'é vōda. L\'é pusébil [[Special:Search/{{PAGENAME}}|serchêr sté tétol]] int al j êtri pàgini dal sît, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serchêr int i regéster coleghê] opór  [{{fullurl:{{FULLPAGENAME}}|action=edit}} mudifichêr la pàgina adèsa]</span>.',
 'noarticletext-nopermission' => "In cól mumèint ché la pàgina serchêda l'é vōda. L'é pusébil [[Special:Search/{{PAGENAME}}|serchêr sté tétol]] int al j êtri pàgini dal sît o<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serchêr int i regéster coleghê] <span>, mó an 't gh'ê mìa al permès ed fêr cla pàgina ché.",
+'missing-revision' => "La revişiòun #\$1 'd la pagina \"{{PAGENAME}}\" l' an gh'è mìa. Còst, ed sôlit, a sucēd mèint'r as va drē a 'n colegamèint a 'na pàgina scanşlêda, in 'na stòria, di lavōr fât, mìa arnuvêda. I particulêr a 's pōlen catêr int al [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} regéster dal scanşladûri].",
+'userpage-userdoesnotexist' => 'L\'inscrisiòun "<nowiki>$1</nowiki>" la cumbîna mìa cun \'n utèint registrê. Ét sicûr ed vrèir fêr o mudifichêr cla pàgina ché.',
+'userpage-userdoesnotexist-view' => 'L\'utèin "$1" an n\'à mìa fât l\'inscrisiòun.',
+'blocked-notice-logextract' => "Cl'utèint ché adèsa l'é bluchê. 
+Per infurmasiòun l'ûltem elemèint dal regéster di blôch l'é scrét ché sòta:",
+'clearyourcache' => "'''Nôta:''' dôpa vèir salvê a pré èser necesâri pulîr la memôria pruvişôria dal navigadôr per vèder i cambiamèint.
+*'''Firefox / Safari''': tgnîr cucê al tâst dal lètri grândi e clichêr insém a \"Ricarica\" opór cucêr i tâst ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' insém a un Mac)
+*'''Google Chrome''': cucêr i tâst ''Ctrl-Shift-R'' (''⌘-Shift-R'' insém a un Mac) 
+*'''Internet Explorer''': tgnîr cucê al tâst ''Ctrl'' mènter es fà cléch insém a ''Refresh'', opór cucêr ''Ctrl-F5'' 
+*'''Opera''': svudêr dal tót la memôria pruvişôria 'd la lésta ''Strumenti → Preferenze''",
+'usercssyoucanpreview' => "'''Cunséli:''' drōva al tâst 'Guêrda préma' per pruvêr al tó nōv CSS préma 'd salvêrel'''",
+'userjsyoucanpreview' => "'''Cunséli:''' drōva al tâst 'Guêrda préma' per pruvêr al tó nōv  JavaScript préma 'd salvêrel'''",
+'usercsspreview' => "'''Còsta l'é sōl 'na guardêda al tó CSS préma 'd salvêr al mudéfichi ch'în stêdi fâti.Ricôrdet che al mudéfichi în mìa incòra stêdi salvêdi!'''",
+'userjspreview' => "'''Còsta l'é sōl 'na guardêda préma 'd salvêr al mudéfichi per pruvêr al tó JavaScript personêl. Ricôrdet che al mudéfichi în mìa incòra stêdi salvêdi!'''",
+'sitecsspreview' => "'''Còsta l'é sōl 'na guardêda 'l CSS préma 'd salvêrel. Ricôrdet che al mudéfichi în mìa incòra stêdi salvêdi!'''",
+'sitejspreview' => "'''Còsta l'é sōl 'na guardêda préma per pruvêr al JavaScript. Ricôrdet che al mudéfichi în mìa incòra stêdi salvêdi!'''",
+'userinvalidcssjstitle' => "'''Atensiòun:''' An gh'é nisóna skin cun al nòm \"\$1\". As fà nutêr che al pàgini per i .css e .js personêl a gh'àn la préma lètra dal tétol in céch, per eşèimpi {{ns:user}}:Eşèimpi/vector.css e non {{ns:user}}:Eşèimpi/Vector.css.",
+'updated' => '(Arnuvê)',
 'note' => "'''Nôta:'''",
 'previewnote' => "'''Ricôrdet che còsta l'é sōl 'na guardêda préma 'd salvêr.'''
 Al tō mudéfichi în MIA incòra stêdi salvêdi.",
+'continue-editing' => "Và int la zôna 'd mudéfica",
+'previewconflict' => "La vésta la cumbîna cun al tèst int la zôna 'd mudéfica tèst ché d'ed sōver e l'é cme la srà la pàgina s'ed decéd ed clichêr insém a \"Sêlva la pàgina\" in cól mumèint ché.",
+'session_fail_preview' => "'''An n'é mìa stê pusébil registrêr la mudéfica perchè a s' în pêrsi al j infurmasiòun relatîvi a la sesiòun. Tōrna a pruvêr. Se al prublēma al cunténva, a 's pōl pruvêr [[Special:UserLogout|ed coleghêres]] e fêr un ingrès nōv.'''",
 'editing' => 'Mudéfica ed $1',
 'editingsection' => 'Mudéfica ed $1 (sesiòun)',
 'editingcomment' => 'Mudéfica e $1 (sesiòun nōva)',
@@ -641,7 +768,6 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 'lineno' => 'Rîga $1:',
 'compareselectedversions' => 'Cunfrûnta al versiòun sernîdi.',
 'editundo' => 'scanşèla',
-'diff-multi' => "({{PLURAL:$2|'Na revişion ed mèz|$1 revişiòun ed mèz}} di {{PLURAL:$2|un utèint|$2 utèint}} mìa {{PLURAL:$1|fâta vèder|fâti vèder}})",
 
 # Search results
 'searchresults' => "Rişultê 'd la sērca",
@@ -654,7 +780,7 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 'viewprevnext' => 'Guêrda ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Int al sît a gh'é 'na pàgina cun al nòm [[:$1]].'''
 {{PLURAL:$2|0=|Guêrda ânca chiêter ch'în stê catê.}}",
-'searchmenu-new' => "'''Şvilópa la pàgina \"[[:\$1]]\" insém a cól sît ché! '''{{PLURAL:\$2|0=|Guêrda ânch i rişultêt catê}}.",
+'searchmenu-new' => '<strong>Şvilópa la pàgina "[[:$1]]" insém a cól sît ché!</strong> {{PLURAL:$2|0=|Guêrda ânch la pàgina che t\'é serchê|Guêrda ânch i rişultêt catê}}.',
 'searchprofile-articles' => "Pàgini 'd j argumèint",
 'searchprofile-project' => "Pàgini 'd ajót e relatîvi al prugèt.",
 'searchprofile-images' => 'Multimèdia',
index 5f0422a..b1a80a0 100644 (file)
@@ -372,12 +372,11 @@ $dateFormats = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Υπογράμμιση συνδέσμων:',
-'tog-justify' => 'Στοίχιση παραγράφων',
 'tog-hideminor' => 'Απόκρυψη μικροεπεξεργασιών στις πρόσφατες αλλαγές',
 'tog-hidepatrolled' => 'Απόκρυψη ελεγμένων επεξεργασιών στις πρόσφατες αλλαγές',
 'tog-newpageshidepatrolled' => 'Απόκρυψη ελεγμένων σελίδων από τον κατάλογο νέων σελίδων',
 'tog-extendwatchlist' => 'Επέκταση της λίστας παρακολούθησης ώστε να δείχνει όλες τις αλλαγές, όχι μόνο τις πιο πρόσφατες',
-'tog-usenewrc' => 'Ομαδοποίηση αλλαγών ανά σελίδα στις πρόσφατες αλλαγές και στη λίστα παρακολούθησης (απαιτεί JavaScript)',
+'tog-usenewrc' => 'Ομαδοποίηση αλλαγών ανά σελίδα στις πρόσφατες αλλαγές και στη λίστα παρακολούθησης',
 'tog-numberheadings' => 'Αυτόματη αρίθμηση επικεφαλίδων',
 'tog-showtoolbar' => 'Εμφάνιση μπάρας εργαλείων επεξεργασίας',
 'tog-editondblclick' => 'Επεξεργασία σελίδων με διπλό κλικ',
@@ -397,7 +396,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Εμφάνιση του αριθμού των συνδεδεμένων χρηστών',
 'tog-oldsig' => 'Υπάρχουσα υπογραφή:',
 'tog-fancysig' => 'Μεταχείριση υπογραφής ως κώδικα wiki (χωρίς αυτόματο σύνδεσμο)',
-'tog-uselivepreview' => 'Χρήση ζωντανής προεπισκόπησης (απαιτεί JavaScript) (πειραματικό)',
+'tog-uselivepreview' => 'Χρήση ζωντανής προεπισκόπησης (πειραματικό)',
 'tog-forceeditsummary' => 'Να ειδοποιούμαι κατά την εισαγωγή κενής σύνοψης επεξεργασίας',
 'tog-watchlisthideown' => 'Απόκρυψη των επεξεργασιών μου από τη λίστα παρακολούθησης',
 'tog-watchlisthidebots' => 'Απόκρυψη των επεξεργασιών των bot από τη λίστα παρακολούθησης',
@@ -535,7 +534,6 @@ $messages = array(
 'vector-action-protect' => 'Προστασία',
 'vector-action-undelete' => 'Επαναφορά',
 'vector-action-unprotect' => 'Αλλαγή προστασίας',
-'vector-simplesearch-preference' => 'Ενεργοποίηση απλοποιημένης μπάρας αναζήτησης (μόνον για skin Vector)',
 'vector-view-create' => 'Δημιουργία',
 'vector-view-edit' => 'Επεξεργασία',
 'vector-view-history' => 'Προβολή ιστορικού',
@@ -614,7 +612,7 @@ $1',
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Σχετικά με {{SITENAME}}',
 'aboutpage' => 'Project:Σχετικά',
-'copyright' => 'Το περιεχόμενο είναι διαθέσιμο σύμφωνα με την $1.',
+'copyright' => 'Το περιεχόμενο είναι διαθέσιμο σύμφωνα με την $1 εκτός αν αναφέρεται διαφορετικά.',
 'copyrightpage' => '{{ns:project}}:Πνευματικά Δικαιώματα',
 'currentevents' => 'Τρέχοντα γεγονότα',
 'currentevents-url' => 'Project:Τρέχοντα γεγονότα',
@@ -642,8 +640,8 @@ $1',
 'youhavenewmessages' => 'Έχετε $1 ($2).',
 'youhavenewmessagesfromusers' => 'Έχετε $1 από {{PLURAL:$3|έναν άλλο χρήστη|$3 χρήστες}} ($2).',
 'youhavenewmessagesmanyusers' => 'Έχετε $1 από πολλούς χρήστες ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|ένα νέο μήνυμα|νέα μηνύματα}}',
-'newmessagesdifflinkplural' => '{{PLURAL:$1|τελευταία αλλαγή|τελευταίες αλλαγές}}',
+'newmessageslinkplural' => '{{PLURAL:$1|ένα νέο μήνυμα|999=νέα μηνύματα}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|τελευταία αλλαγή|999=τελευταίες αλλαγές}}',
 'youhavenewmessagesmulti' => 'Έχετε νέα μηνύματα στο $1',
 'editsection' => 'επεξεργασία',
 'editold' => 'επεξεργασία',
@@ -695,6 +693,11 @@ $1',
 # General errors
 'error' => 'Σφάλμα',
 'databaseerror' => 'Σφάλμα στη βάση δεδομένων',
+'databaseerror-text' => 'Παρουσιάστηκε ένα σφάλμα ερωτήματος βάσης δεδομένων.
+Αυτό μπορεί να υποδεικνύει ένα σφάλμα στο λογισμικό.',
+'databaseerror-textcl' => 'Παρουσιάστηκε ένα σφάλμα ερωτήματος βάσης δεδομένων.',
+'databaseerror-query' => 'Ερώτημα: $1',
+'databaseerror-function' => 'Λειτουργία: $1',
 'databaseerror-error' => 'Σφάλμα: $1',
 'laggedslavemode' => "'''Προειδοποίηση:''' Η σελίδα μπορεί να μην περιέχει πρόσφατες ενημερώσεις.",
 'readonly' => 'Κλειδωμένη βάση δεδομένων',
@@ -764,7 +767,8 @@ $2',
 'invalidtitle-knownnamespace' => 'Μη έγκυρος τίτλος με χώρο ονομάτων «$2» και κείμενο «$3»',
 'invalidtitle-unknownnamespace' => 'Μη έγκυρος τίτλος με άγνωστο αριθμό χώρου ονομάτων $1 και κείμενο «$2»',
 'exception-nologin' => 'Δεν έχετε συνδεθεί.',
-'exception-nologin-text' => 'Αυτή η σελίδα ή η ενέργεια απαιτεί να είστε {{GENDER:|συνδεμένος|συνδεμένη}} στο wiki.',
+'exception-nologin-text' => 'Παρακαλούμε να [[Special:Userlogin|συνδεθείτε]] για να μπορείτε να αποκτήσετε πρόσβαση σε αυτήν τη σελίδα ή την ενέργεια.',
+'exception-nologin-text-manual' => 'Παρακαλούμε $1 για να μπορείτε να έχετε πρόσβαση σε αυτή τη σελίδα ή ενέργεια.',
 
 # Virus scanner
 'virus-badscanner' => "Λάθος ρύθμιση: άγνωστος ανιχνευτής ιών: ''$1''",
@@ -814,6 +818,9 @@ $2',
 'userlogin-resetpassword-link' => 'Ξεχάσατε τον κωδικό πρόσβασης;',
 'helplogin-url' => 'Help:Σύνδεση',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Βοήθεια για τη σύνδεσή σας]]',
+'userlogin-loggedin' => 'Είστε ήδη {{GENDER:$1|συνδεδεμένος|συνδεδεμένη}} ως $1.
+Χρησιμοποιήστε την παρακάτω φόρμα για να συνδεθείτε ως άλλος χρήστης.',
+'userlogin-createanother' => 'Δημιουργήσετε έναν άλλο λογαριασμό',
 'createacct-join' => 'Εισάγετε τα στοιχεία σας παρακάτω.',
 'createacct-another-join' => 'Εισάγετε τα στοιχεία του νέου λογαριασμού παρακάτω.',
 'createacct-emailrequired' => 'Διεύθυνση ηλεκτρονικού ταχυδρομείου',
@@ -857,7 +864,7 @@ $2',
 'passwordtooshort' => 'Οι κωδικοί πρέπει να περιέχουν τουλάχιστον {{PLURAL:$1|1 χαρακτήρα|$1 χαρακτήρες}}.',
 'password-name-match' => 'Ο κωδικός σου θα πρέπει να είναι διαφορετικός από το όνομα χρήστη σου.',
 'password-login-forbidden' => 'Η χρήση αυτού του ονόματος χρήστη και συνθηματικού έχουν  απαγορευτεί.',
-'mailmypassword' => 'Î\91Ï\80οÏ\83Ï\84ολή Î½Î­Î¿Ï\85 ÎºÏ\89δικοÏ\8d Î¼Îµ Î·Î»ÎµÎºÏ\84Ï\81ονικÏ\8c Ï\84αÏ\87Ï\85δÏ\81ομείο',
+'mailmypassword' => 'Î\95Ï\80αναÏ\86οÏ\81ά ÎºÏ\89δικοÏ\8d',
 'passwordremindertitle' => 'Καινούργιος προσωρινός κωδικός για το {{SITENAME}}',
 'passwordremindertext' => 'Κάποιος (πιθανώς εσείς, από την διεύθυνση IP $1) ζήτησε να σας στείλουμε ένα νέο κωδικό πρόσβασης για τον ιστότοπο {{SITENAME}} ($4). Ο κωδικός πρόσβασης για το χρήστη "$2" είναι τώρα "$3". Αν το κάνατε εσείς, θα πρέπει να συνδεθείτε και να αλλάξετε τον κωδικό πρόσβασης σας τώρα. Ο προσωρινός σας κωδικός πρόσβασης θα λήξει σε {{PLURAL:$5|μια ημέρα|$5 ημέρες}}.
 
@@ -868,7 +875,8 @@ $2',
 Σας παρακαλούμε να ξανασυνδεθείτε μόλις τον λάβετε.',
 'blocked-mailpassword' => 'Η διεύθυνση IP σας είναι αποκλεισμένη από επεξεργασία, και έτσι
 δεν επιτρέπεται να χρησιμοποιήσει την λειτουργία ανάκτησης κωδικού πρόσβασης, για την αποφυγή κατάχρησης.',
-'eauthentsent' => 'Ένα μήνυμα επαλήθευσης έχει σταλεί στην ηλεκτρονική διεύθυνση που έχετε δηλώσει στο σύστημα. Πριν αρχίσει η αποστολή μηνυμάτων στη συγκεκριμένη διεύθυνση, πρέπει να ακολουθήσετε τις οδηγίες που βρίσκονται στο μήνυμα που σας έχει σταλεί για να επαληθεύσετε ότι η συγκεκριμένη ηλεκτρονική διεύθυνση ανήκει πραγματικά σε εσάς.',
+'eauthentsent' => 'Ένα μήνυμα επαλήθευσης έχει σταλεί στην ηλεκτρονική διεύθυνση που έχετε δηλώσει.
+Πριν αρχίσει η αποστολή μηνυμάτων στη συγκεκριμένη διεύθυνση, πρέπει να ακολουθήσετε τις οδηγίες που βρίσκονται στο μήνυμα που σας έχει σταλεί, για να επαληθεύσετε ότι η συγκεκριμένη ηλεκτρονική διεύθυνση ανήκει πραγματικά σε εσάς.',
 'throttled-mailpassword' => 'Ένα email επαναφοράς κωδικού έχει ήδη αποσταλεί, μέσα {{PLURAL:$1|στην τελευταία ώρα|στις τελευταίες $1 ώρες}}.
 Για την αποφυγή κατάχρησης, μόνο ένα email επαναφοράς κωδικού θα στέλνεται ανά {{PLURAL:$1|ώρα|$1 ώρες}}.',
 'mailerror' => 'Σφάλμα στην αποστολή του μηνύματος: $1',
@@ -912,6 +920,8 @@ $2',
 'retypenew' => 'Πληκτρολογήστε ξανά το νέο κωδικό.',
 'resetpass_submit' => 'Δώστε κωδικό πρόσβασης και συνδεθείτε',
 'changepassword-success' => 'Ο κωδικός πρόσβασής σας άλλαξε επιτυχώς!',
+'changepassword-throttled' => 'Κάνατε πάρα πολλές πρόσφατες απόπειρες σύνδεσης.
+Παρακαλούμε περιμένετε $1 προτού ξαναδοκιμάσετε.',
 'resetpass_forbidden' => 'Οι κωδικοί πρόσβασης δεν μπορούν να αλλαχθούν',
 'resetpass-no-info' => 'Πρέπει να είστε συνδεδεμένος για να δείτε αυτήν την σελίδα απευθείας',
 'resetpass-submit-loggedin' => 'Αλλαγή κωδικού',
@@ -963,6 +973,8 @@ $2
 'changeemail-password' => 'Ο κωδικός πρόσβασής σας στο εγχείρημα {{SITENAME}}:',
 'changeemail-submit' => 'Αλλαγή διεύθυνσης ηλεκτρονικού ταχυδρομείου',
 'changeemail-cancel' => 'Ακύρωση',
+'changeemail-throttled' => 'Κάνατε πάρα πολλές απόπειρες σύνδεσης.
+Παρακαλούμε περιμένετε $1 προτού ξαναδοκιμάσετε.',
 
 # Special:ResetTokens
 'resettokens' => 'Επαναφορά των κλειδιών',
@@ -973,7 +985,7 @@ $2
 'resettokens-legend' => 'Επαναφορά των κλειδιών',
 'resettokens-tokens' => 'Κλειδιά:',
 'resettokens-token-label' => '$1 (τρέχουσα τιμή: $2)',
-'resettokens-watchlist-token' => 'Κλειδί ροής της λίστα παρακολούθησης',
+'resettokens-watchlist-token' => 'Κλειδί για την δικτυακή ροή (Atom/RSS) των [[Special:Watchlist|αλλαγών σε σελίδες στη λίστα παρακολούθησής σας]]',
 'resettokens-done' => 'Επαναφορά κλειδιών.',
 'resettokens-resetbutton' => 'Επαναφορά επιλεγμένων κλειδιών',
 
@@ -1174,11 +1186,13 @@ $2
 'content-failed-to-parse' => 'Απέτυχε η ανάλυση  περιεχομένου του $2 για το μοντέλο $1:$3',
 'invalid-content-data' => 'Μη έγκυρα δεδομένα περιεχομένου',
 'content-not-allowed-here' => 'Το περιεχόμενο «$1» δεν επιτρέπεται στη σελίδα [[$2]]',
-'editwarning-warning' => 'Αφήνοντας αυτή τη σελίδα μπορεί να σας κάνει να χάσετε κάποιες αλλαγές που έχετε κάνει.
-Αν έχετε συνδεθεί, μπορείτε να απενεργοποιήσετε αυτή την προειδοποίηση στην  ενότητα "Επεξεργασία" των προτιμήσεών σας.',
+'editwarning-warning' => 'Αφήνοντας αυτή τη σελίδα μπορεί να έχει ως συνέπεια να χαθούν κάποιες αλλαγές που έχετε κάνει.
+Αν έχετε συνδεθεί, μπορείτε να απενεργοποιήσετε αυτή την προειδοποίηση στην  ενότητα "{{int:prefs-editing}}"  των προτιμήσεών σας.',
+'editpage-notsupportedcontentformat-title' => 'Μορφή περιεχομένου που δεν υποστηρίζεται',
+'editpage-notsupportedcontentformat-text' => 'Η μορφή του περιεχομένου $1 δεν υποστηρίζεται από το μοντέλο περιεχομένου $2.',
 
 # Content models
-'content-model-wikitext' => 'βικικείμενο',
+'content-model-wikitext' => 'κείμενο wiki',
 'content-model-text' => 'απλό κείμενο',
 'content-model-javascript' => 'JavaScript',
 'content-model-css' => 'CSS',
@@ -1209,6 +1223,7 @@ $2
 'undo-success' => 'Η επεξεργασία μπορεί να αναστραφεί. Παρακαλώ ελέγξτε την σύγκριση παρακάτω για να επιβεβαιώσετε ότι αυτό είναι το οποίο θέλετε να κάνετε, και έπειτα αποθηκεύστε τις αλλαγές παρακάτω για να τελειώσετε την αναστροφή της επεξεργασίας.',
 'undo-failure' => 'Η επεξεργασία δεν μπορούσε να αναστραφεί λόγω αντικρουόμενων ενδιάμεσων επεξεργασιών.',
 'undo-norev' => 'Η ανάκληση αυτής της επεξεργασίας δεν ηταν δυνατό να πραγματοποιηθεί επειδή δεν υπάρχει ή επειδή έχει διαγραφεί.',
+'undo-nochange' => 'Η επεξεργασία φαίνεται να έχει ήδη αναιρεθεί.',
 'undo-summary' => 'Αναίρεση αναθεώρησης $1 υπό τον/την [[Special:Contributions/$2|$2]] ([[User talk:$2|Συζήτηση]])',
 'undo-summary-username-hidden' => 'Αναίρεση αναθεώρησης $1 από ένα κρυμμένο χρήστη',
 
@@ -1217,6 +1232,9 @@ $2
 'cantcreateaccount-text' => "Η δημιουργία λογαριασμού από αυτή τη διεύθυνση IP ('''$1''') έχει αποτραπεί από τον [[User:$3|$3]].
 
 Ο λόγος που δόθηκε από τον $3 είναι ''$2''",
+'cantcreateaccount-range-text' => "Η δημιουργία λογαριασμού από διευθύνσεις IP στην περιοχή  '''\$1''', που περιλαμβάνει τη δική σας διεύθυνση IP ('''\$4'''), έχει αποκλειστεί από τον [[User:\$3|\$3]].
+
+Η αιτιολογία που δόθηκε από τον \$3 είναι \"\$2\"",
 
 # History pages
 'viewpagelogs' => 'Προβολή αρχείων καταγραφών για αυτήν τη σελίδα',
@@ -1293,19 +1311,20 @@ Mπορείτε να δείτε αυτή την διαφορά. Λεπτομέρ
 'revdelete-text' => "'''Οι διεγραμμένες αναθεωρήσεις και τα γεγονότα θα εμφανίζονται ακόμα στο ιστορικό της σελίδας και στα αρχεία καταγραφών, αλλά μέρη του περιεχομένου τους θα είναι απροσπέλαστα στο κοινό.'''
 Άλλοι διαχειριστές στον ιστότοπο {{SITENAME}} θα είναι ακόμα ικανοί να προσπελάσουν το κρυμμένο περιεχόμενο και μπορούν να το επαναφέρουν ξανά μέσω αυτής της διεπαφής, εκτός αν τεθούν πρόσθετοι περιορισμοί.",
 'revdelete-confirm' => 'Παρακαλούμε επιβεβαιώστε ότι σκοπεύετε να το κάνετε αυτό, ότι αντιλαμβάνεσθε τις συνέπειες, και ότι το κάνετε σύμφωνα με την [[{{MediaWiki:Policy-url}}|πολιτική]].',
-'revdelete-suppress-text' => "Η καταστολή μπορεί να χρησιμοποιηθεί ''' μόνο ''' για τις ακόλουθες περιπτώσεις:
+'revdelete-suppress-text' => 'Η καταστολή μπορεί να χρησιμοποιηθεί <strong> μόνο </strong> για τις ακόλουθες περιπτώσεις:
+* Ενδεχόμενη συκοφαντική δυσφήμιση
 * Ακατάλληλες προσωπικές πληροφορίες
-*: ''διευθύνσεις κατοικίας και αριθμοί τηλεφώνου, αριθμοί ταυτότητας, κλπ. ''",
+*: <em>διευθύνσεις κατοικίας και αριθμοί τηλεφώνου, αριθμοί ταυτότητας, κλπ. </em>',
 'revdelete-legend' => 'Θέστε περιορισμούς ορατότητας',
-'revdelete-hide-text' => 'Κρύψε κείμενο αναθεώρησης',
+'revdelete-hide-text' => 'Κείμενο αναθεώρησης',
 'revdelete-hide-image' => 'Κρύψε περιεχόμενο αρχείου',
 'revdelete-hide-name' => 'Κρύψε ενέργεια και στόχο',
-'revdelete-hide-comment' => 'Î\9aÏ\81Ï\8dÏ\88ε Ï\83Ï\87Ï\8cλιο επεξεργασίας',
-'revdelete-hide-user' => 'Î\9aÏ\81Ï\8dÏ\88ε Ï\8cνομα Ï\87Ï\81ήÏ\83Ï\84η/IP Ï\83Ï\85νÏ\84άκÏ\84η',
+'revdelete-hide-comment' => 'ΣÏ\8dνοÏ\88η επεξεργασίας',
+'revdelete-hide-user' => 'Όνομα χρήστη/IP συντάκτη',
 'revdelete-hide-restricted' => 'Απόκρυψη δεδομένων από διαχειριστές καθώς και από άλλους',
 'revdelete-radio-same' => '(μην αλλάξετε)',
-'revdelete-radio-set' => 'Î\95μÏ\86ανέÏ\82',
-'revdelete-radio-unset' => 'Î\9aÏ\81Ï\85Ï\86Ï\8c',
+'revdelete-radio-set' => 'Î\9aÏ\81Ï\85μμένο',
+'revdelete-radio-unset' => 'Î\95μÏ\86ανέÏ\82',
 'revdelete-suppress' => 'Απόκρυψε δεδομένα από διαχειριστές όπως και από άλλους',
 'revdelete-unsuppress' => 'Αφαίρεσε περιορισμούς στις αποκατεστημένες αναθεωρήσεις',
 'revdelete-log' => 'Αιτία:',
@@ -1383,7 +1402,7 @@ $1",
 'showhideselectedversions' => 'Εμφάνιση/απόκρυψη των επιλεγμένων εκδοχών',
 'editundo' => 'αναίρεση',
 'diff-empty' => '(Καμία διαφορά)',
-'diff-multi' => '({{PLURAL:$1|Μία ενδιάμεση αναθεώρηση|$1 ενδιάμεσες αναθεωρήσεις}} από {{PLURAL:$2|ένα χρήστη|$2 χρήστες}} δεν {{PLURAL:$1|εμφανίζεται|εμφανίζονται}})',
+'diff-multi-sameuser' => '({{PLURAL:$1|Μία ενδιάμεση αναθεώρηση|$1 ενδιάμεσες αναθεωρήσεις}} από τον ίδιο χρήστη δεν εμφανίζεται)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Μία ενδιάμεση αναθεώρηση|$1 ενδιάμεσες αναθεωρήσεις}} από περισσότερο από $2 {{PLURAL:$2|χρήστη|χρήστες}} δεν εμφανίζ{{PLURAL:$1|εται|ονται}})',
 'difference-missing-revision' => '{{PLURAL:$2|Μία αναθεώρηση|$2 αναθεωρήσεις}} αυτής της διαφοράς ($1) δεν {{PLURAL:$2|μπόρεσε να βρεθεί|μπόρεσαν να βρεθούν}}.
 
@@ -1420,6 +1439,7 @@ $1",
 'search-result-score' => 'Σχετικότητα: $1%',
 'search-redirect' => '(ανακατεύθυνση $1)',
 'search-section' => '(ενότητα $1)',
+'search-file-match' => '(ταιριάζει με το περιεχόμενο του αρχείου)',
 'search-suggest' => 'Μήπως εννοούσατε: $1',
 'search-interwiki-caption' => 'Αδελφικά εγχειρήματα',
 'search-interwiki-default' => '$1 αποτελέσματα:',
@@ -1446,6 +1466,7 @@ $1",
 'preferences' => 'Προτιμήσεις',
 'mypreferences' => 'Προτιμήσεις',
 'prefs-edits' => 'Αριθμός επεξεργασιών:',
+'prefsnologintext2' => 'Παρακαλούμε $1 για να αλλάξετε τις προτιμήσεις σας.',
 'prefs-skin' => 'Οπτική οργάνωση (skin)',
 'skin-preview' => 'Προεπισκόπηση',
 'datedefault' => 'Χωρίς προτίμηση',
@@ -1468,7 +1489,7 @@ $1",
 'prefs-email' => 'Επιλογές e-mail',
 'prefs-rendering' => 'Εμφάνιση',
 'saveprefs' => 'Αποθήκευση',
-'restoreprefs' => 'Επαναφορά όλων των προεπιλεγμένων ρυθμίσεων',
+'restoreprefs' => 'Επαναφορά όλων των προεπιλεγμένων ρυθμίσεων (σε όλα τα τμήματα)',
 'prefs-editing' => 'Επεξεργασία',
 'rows' => 'Σειρές',
 'columns' => 'Στήλες',
@@ -1481,7 +1502,7 @@ $1",
 'prefs-help-recentchangescount' => 'Αυτό περιλαμβάνει τις πρόσφατες αλλαγές, τα ιστορικά των σελίδων, και τα αρχεία διαγραφών.',
 'prefs-help-watchlist-token2' => 'Αυτό είναι το μυστικό κλειδί για την web τροφοδοσία  της λίστας παρακολούθησής σας.
 Όποιος το γνωρίζει θα είναι σε θέση να διαβάσει την λίστα παρακολούθησης σας, οπότε μην τον μοιράζεστε.
-[[Special: ResetTokens|Κάνε κλικ εδώ εάν θέλετε να τον επαναφέρετε]].',
+[[Special:ResetTokens|Κάνε κλικ εδώ εάν θέλετε να τον επαναφέρετε]].',
 'savedprefs' => 'Οι προτιμήσεις σας έχουν αποθηκευτεί.',
 'timezonelegend' => 'Ζώνη ώρας:',
 'localtime' => 'Εμφάνιση τοπικής ώρας:',
@@ -1554,6 +1575,7 @@ $1",
 'prefs-tokenwatchlist' => 'Κλειδί',
 'prefs-diffs' => 'Διαφορές',
 'prefs-help-prefershttps' => 'Αυτή η προτίμηση θα τεθεί σε ισχύ στην επόμενή σας σύνδεση.',
+'prefs-tabs-navigation-hint' => 'Συμβουλή: Μπορείτε να χρησιμοποιήσετε τα πλήκτρα διευθύνσεων αριστερά και δεξιά για να πλοηγηθείτε μεταξύ των καρτελών στη λίστα καρτελών.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Η διεύθυνση ηλεκτρονικού ταχυδρομείου φαίνεται έγκυρη',
@@ -1708,8 +1730,8 @@ $1",
 'action-block' => 'να φράξετε τις επεξεργασίες αυτού του χρήστη',
 'action-protect' => 'να αλλάξετε τα επίπεδα προστασίας για αυτή τη σελίδα',
 'action-rollback' => 'γρήγορη επαναφορά των επεξεργασιών του τελευταίου χρήστη που επεξεργάστηκε μια συγκεκριμένη σελίδα',
-'action-import' => 'να ÎµÎ¹Ï\83άγεÏ\84ε Î±Ï\85Ï\84ή Ï\84η Ï\83ελίδα από άλλο wiki',
-'action-importupload' => 'να ÎµÎ¹Ï\83άγεÏ\84ε Î±Ï\85Ï\84ή Ï\84η Ï\83ελίδα Î±Ï\80Ï\8c Ï\86Ï\8cÏ\81Ï\84Ï\89Ï\83η Î±Ï\81Ï\87είοÏ\85',
+'action-import' => 'ειÏ\83άγεÏ\84ε Ï\83ελίδεÏ\82 από άλλο wiki',
+'action-importupload' => 'εισάγετε αυτή τη σελίδα από φόρτωση αρχείου',
 'action-patrol' => 'να επισημάνετε τις επεξεργασίες άλλων ως ελεγμένες',
 'action-autopatrol' => 'να επισημάνετε την επεξεργασία σας ως ελεγμένη',
 'action-unwatchedpages' => 'να εμφανίσετε τον κατάλογο μη παρακολουθούμενων σελίδων',
@@ -1730,6 +1752,7 @@ $1",
 'recentchanges' => 'Πρόσφατες αλλαγές',
 'recentchanges-legend' => 'Επιλογές πρόσφατων αλλαγών',
 'recentchanges-summary' => 'Παρακολουθήστε σε αυτή τη σελίδα τις πιο πρόσφατες αλλαγές στο Wiki.',
+'recentchanges-noresult' => 'Χωρίς αλλαγές κατά τη διάρκεια της συγκεκριμένης χρονικής περιόδου, με αυτά τα κριτήρια.',
 'recentchanges-feed-description' => 'Παρακολούθηση των πιο πρόσφατων αλλαγών στο wiki σε αυτή τη ροή.',
 'recentchanges-label-newpage' => 'Αυτή η επεξεργασία δημιούργησε μια νέα σελίδα',
 'recentchanges-label-minor' => 'Αυτή είναι μια μικροαλλαγή',
@@ -1742,7 +1765,7 @@ $1",
 'rclistfrom' => 'Εμφάνιση νέων αλλαγών αρχίζοντας από $1',
 'rcshowhideminor' => '$1 μικροεπεξεργασιών',
 'rcshowhidebots' => '$1 ρομπότ',
-'rcshowhideliu' => '$1 συνδεδεμένων χρηστών',
+'rcshowhideliu' => '$1 εγγεγραμμένων χρηστών',
 'rcshowhideanons' => '$1 ανωνύμων χρηστών',
 'rcshowhidepatr' => '$1 ελεγμένων επεξεργασιών',
 'rcshowhidemine' => '$1 των επεξεργασιών μου',
@@ -1759,7 +1782,7 @@ $1",
 'rc_categories_any' => 'Οποιαδήποτε',
 'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} μετά από την αλλαγή',
 'newsectionsummary' => '/* $1 */ νέα ενότητα',
-'rc-enhanced-expand' => 'Εμφάνιση λεπτομερειών (απαιτείται JavaScript)',
+'rc-enhanced-expand' => 'Εμφάνιση λεπτομερειών',
 'rc-enhanced-hide' => 'Απόκρυψη λεπτομερειών',
 'rc-old-title' => 'αρχικά δημιουργήθηκε ως " $1 "',
 
@@ -1779,7 +1802,7 @@ $1",
 'reuploaddesc' => 'Επιστροφή στη φόρμα φόρτωσης',
 'upload-tryagain' => 'Η καταχώρηση άλλαξε την περιγραφή αρχείου',
 'uploadnologin' => 'Δεν έχετε συνδεθεί!',
-'uploadnologintext' => 'Î\93ια Î½Î± Ï\86οÏ\81Ï\84Ï\8eÏ\83εÏ\84ε Î±Ï\81Ï\87εία Ï\80Ï\81έÏ\80ει Ï\80Ï\81Ï\8eÏ\84α Î½Î± [[Special:UserLogin|Ï\83Ï\85νδεθείÏ\84ε]].',
+'uploadnologintext' => 'ΠαÏ\81ακαλÏ\8e $1 Î³Î¹Î± Î½Î± ÎµÏ\80ιÏ\86οÏ\81Ï\84Ï\8eÏ\83εÏ\84ε Î±Ï\81Ï\87εία.',
 'upload_directory_missing' => 'Λείπει το αποθηκευτήριο επιφορτώσεων ($1) και δεν μπορεί να δημιουργηθεί από τον webserver.',
 'upload_directory_read_only' => 'Δεν είναι δυνατή η εγγραφή στον κατάλογο ($1) από τον server.',
 'uploaderror' => 'Σφάλμα στη φόρτωση αρχείου',
@@ -2012,8 +2035,7 @@ $1',
 'upload_source_file' => ' (ένα αρχείο στον υπολογιστή σας)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Αυτή η ειδική σελίδα δείχνει όλα τα αρχεία που έχουν φορτωθεί.
-Όταν γίνεται φιλτράρισμα από τον χρήστη, εμφανίζονται μόνο οι πιο πρόσφατες εκδόσεις των αρχείων που αυτός έχει φορτώσει.',
+'listfiles-summary' => 'Αυτή η ειδική σελίδα δείχνει όλα τα επιφορτωμένα αρχεία.',
 'listfiles_search_for' => 'Αναζήτηση για όνομα πολυμέσου:',
 'imgfile' => 'αρχείο',
 'listfiles' => 'Κατάλογος εικόνων',
@@ -2220,12 +2242,20 @@ $1',
 'protectedpages' => 'Προστατευμένες σελίδες',
 'protectedpages-indef' => 'Προστασίες επαόριστον μόνο',
 'protectedpages-cascade' => 'Μόνο διαδοχικές προστασίες',
+'protectedpages-noredirect' => 'Απόκρυψη ανακατευθύνσεων',
 'protectedpagesempty' => 'Καμία σελίδα με αυτές τις παραμέτρους δεν είναι προς το παρόν προστατευμένη.',
+'protectedpages-timestamp' => 'Χρονική σήμανση',
+'protectedpages-page' => 'Σελίδα',
+'protectedpages-expiry' => 'Λήγει',
+'protectedpages-performer' => 'Προστασία χρήστη',
+'protectedpages-unknown-timestamp' => 'Άγνωστο',
+'protectedpages-unknown-performer' => 'Άγνωστος χρήστης',
 'protectedtitles' => 'Προστατευμένοι τίτλοι',
 'protectedtitlesempty' => 'Δεν υπάρχουν προστατευμένοι τίτλοι με αυτές τις παραμέτρους.',
 'listusers' => 'Κατάλογος χρηστών',
 'listusers-editsonly' => 'Εμφάνιση μόνο των χρηστών με επεξεργασίες',
 'listusers-creationsort' => 'Ταξινόμηση κατά ημερομηνία δημιουργίας',
+'listusers-desc' => 'Η ταξινόμηση κατά φθίνουσα σειρά',
 'usereditcount' => '$1 {{PLURAL:$1|επεξεργασία|επεξεργασίες}}',
 'usercreated' => '{{GENDER:$3|Δημιουργήθηκε}} στις $1 στις $2',
 'newpages' => 'Νέες σελίδες',
@@ -2408,7 +2438,6 @@ $1',
 'watchmethod-list' => 'Έλεγχος σελίδων υπό παρακολούθηση για πρόσφατες αλλαγές',
 'watchlistcontains' => 'Η λίστα παρακολούθησής σας περιέχει $1 {{PLURAL:$1|σελίδα|σελίδες}}.',
 'iteminvalidname' => 'Πρόβλημα με το στοιχείο "$1", άκυρο όνομα...',
-'wlnote' => "Παρακάτω είναι {{PLURAL:$1|η πιο πρόσφατη αλλαγή|οι '''$1''' πιο πρόσφατες αλλαγές}} κατά τη διάρκεια {{PLURAL:$2|της τελευταίας ώρας|των '''$2''' τελευταίων ωρών}} ως προς την $3, $4.",
 'wlshowlast' => 'Εμφάνιση των τελευταίων $1 ωρών $2 ημερών $3',
 'watchlist-options' => 'Επιλογές λίστας παρακολούθησης',
 
@@ -2508,7 +2537,7 @@ $UNWATCHURL
 Τελευταία αλλαγή από το χρήστη ([[User:$3|$3]] ([[User talk:$3|Συζήτηση]]){{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "Το σχόλιο της επεξεργασίας ήταν: \"''\$1''\".",
 'revertpage' => 'Ανάκληση των αλλαγών $2 (επιστροφή στην προηγούμενη αναθεώρηση $1)',
-'revertpage-nouser' => 'Αναστράφηκαν οι επεξεργασίες από τον (όνομα χρήστη αφαιρέθηκε) στη τελευταία έκδοση από τον/την [[User:$1|$1]]',
+'revertpage-nouser' => 'Αναστράφηκαν οι επεξεργασίες από τον (όνομα χρήστη αφαιρέθηκε) στη τελευταία έκδοση από τον/την {{GENDER:$1|[[User:$1|$1]]}}φ',
 'rollback-success' => 'Ανεστραμμένες εκδόσεις από $1, αλλάχθηκαν στην προηγούμενη έκδοση από $2.',
 
 # Edit tokens
@@ -2646,7 +2675,7 @@ $1',
 'contributions' => 'Συνεισφορές {{GENDER:$1|χρήστη|χρήστριας}}',
 'contributions-title' => 'Συνεισφορές χρήστη για {{GENDER:$1|τον|την}} $1',
 'mycontris' => 'Συνεισφορές',
-'contribsub2' => 'Για {{GENDER:$1|τον|την}} $1 ($2)',
+'contribsub2' => 'Για {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Δεν βρέθηκαν αλλαγές με αυτά τα κριτήρια.',
 'uctop' => '(τρέχουσα)',
 'month' => 'Από το μήνα (και νωρίτερα):',
@@ -2767,7 +2796,8 @@ $1',
 'change-blocklink' => 'αλλαγή φραγής',
 'contribslink' => 'συνεισφορές',
 'emaillink' => 'αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου',
-'autoblocker' => 'Έχετε υποστεί αυτόματα φραγή από το σύστημα επειδή χρησιμοποιείτε την ίδια διεύθυνση IP με το χρήστη "[[User:$1|$1]]". Η αιτιολογία για την φραγή του $1 είναι "$2".',
+'autoblocker' => 'Έχετε υποστεί αυτόματα φραγή από το σύστημα επειδή η διεύθυνση IP σας έχει πρόσφατα χρησιμοποιηθεί από το χρήστη "[[User:$1|$1]]". 
+Η αιτιολογία για την φραγή του $1 είναι "$2".',
 'blocklogpage' => 'Αρχείο καταγραφών φραγών',
 'blocklog-showlog' => 'Αυτός ο χρήστης έχει φραγεί προηγουμένως.
 Το αρχείο γραφής παράσχεται παρακάτω για παραπομπή:',
@@ -2789,7 +2819,7 @@ $1',
 'range_block_disabled' => 'Η δυνατότητα του διαχειριστή να δημιουργεί περιοχές φραγής είναι απενεργοποιημένη.',
 'ipb_expiry_invalid' => 'Άκυρος χρόνος λήξης',
 'ipb_expiry_temp' => 'Οι κρυμμένες φραγές ονομάτων χρηστών πρέπει να είναι μόνιμες.',
-'ipb_hide_invalid' => 'Î\9cη ÎµÏ\86ικÏ\84ή ÎºÎ±Ï\84αÏ\83Ï\84ολή Î±Ï\85Ï\84οÏ\8d Ï\84οÏ\85 Î»Î¿Î³Î±Ï\81ιαÏ\83μοÏ\8d. Î\9cÏ\80οÏ\81εί Î½Î± Î­Ï\87ει Ï\80άÏ\81α Ï\80ολλέÏ\82 ÎµÏ\80εξεÏ\81γαÏ\83ίεÏ\82.',
+'ipb_hide_invalid' => 'Î\9cη ÎµÏ\86ικÏ\84ή ÎºÎ±Ï\84αÏ\83Ï\84ολή Î±Ï\85Ï\84οÏ\8d Ï\84οÏ\85 Î»Î¿Î³Î±Ï\81ιαÏ\83μοÏ\8d. Î\9cÏ\80οÏ\81εί Î½Î± Î­Ï\87ει Ï\80εÏ\81ιÏ\83Ï\83Ï\8cÏ\84εÏ\81εÏ\82 Î±Ï\80Ï\8c {{PLURAL:$1|μια ÎµÏ\80εξεÏ\81γαÏ\83ία|$1 ÎµÏ\80εξεÏ\81γαÏ\83ίεÏ\82}}.',
 'ipb_already_blocked' => 'Η διεύθυνση IP "$1" είναι ήδη φραγμένη',
 'ipb-needreblock' => '$1 είναι ήδη αποκλεισμένη. Θέλετε να αλλάξετε τις ρυθμίσεις?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Άλλη φραγή|Άλλες φραγές}}',
@@ -2955,6 +2985,7 @@ $1',
 'allmessages-prefix' => 'Φίλτρο κατά πρόθεμα:',
 'allmessages-language' => 'Γλώσσα:',
 'allmessages-filter-submit' => 'Μετάβαση',
+'allmessages-filter-translate' => 'Μετάφραση',
 
 # Thumbnails
 'thumbnail-more' => 'Μεγέθυνση',
@@ -3006,7 +3037,7 @@ $2',
 'importuploaderrortemp' => 'Η επιφόρτωση του εισαγόμενου αρχείου απέτυχε. Λείπει ένας προσωρινός φάκελος.',
 'import-parse-failure' => 'Σφάλμα παραμέτρου XML κατά την  εισαγωγή',
 'import-noarticle' => 'Καμία σελίδα για εισαγωγή!',
-'import-nonewrevisions' => 'Î\8cλεÏ\82 Î¿Î¹ Î±Î½Î±Î¸ÎµÏ\89Ï\81ήÏ\83ειÏ\82 ÎµÎ¹Ï\83άÏ\87θηκαν Ï\80Ï\81οηγοÏ\85μένÏ\89Ï\82.',
+'import-nonewrevisions' => 'Î\9aαμία Î±Î½Î±Î¸ÎµÏ\8eÏ\81ηÏ\83η Î´ÎµÎ½ ÎµÎ¹Ï\83ήÏ\87θει (Ï\8cλεÏ\82 ÎµÎ¯Ï\84ε Î®Ï\84αν Î®Î´Î· Ï\80αÏ\81οÏ\8dÏ\83εÏ\82, Î® Ï\80αÏ\81αλήÏ\86θηκαν Î»Ï\8cγÏ\89 Ï\83Ï\86αλμάÏ\84Ï\89ν).',
 'xml-error-string' => '$1 στη γραμμή $2, στήλη $3 (byte $4): $5',
 'import-upload' => 'Επιφόρτωση δεδομένων XML',
 'import-token-mismatch' => 'Απώλεια των στοιχείων της συνόδου. Παρακαλούμε προσπαθήστε ξανά.',
@@ -3046,7 +3077,6 @@ $2',
 'tooltip-pt-watchlist' => 'Η λίστα με τις σελίδες που παρακολουθείτε για αλλαγές',
 'tooltip-pt-mycontris' => 'Κατάλογος των συνεισφορών σας',
 'tooltip-pt-login' => 'Σας ενθαρρύνουμε να συνδεθείτε&middot; ωστόσο δεν είναι υποχρεωτικό',
-'tooltip-pt-anonlogin' => 'Σας προτείνουμε να συνδεθείτε παρόλο που δεν είναι αναγκαίο.',
 'tooltip-pt-logout' => 'Έξοδος',
 'tooltip-ca-talk' => 'Συζήτηση για τη σελίδα περιεχομένου',
 'tooltip-ca-edit' => 'Μπορείτε να επεξεργαστείτε αυτή τη σελίδα. Παρακαλούμε χρησιμοποιήστε το κουμπί προεπισκόπησης πριν την αποθήκευση.',
@@ -3146,8 +3176,8 @@ $2',
 'spam_reverting' => 'Επαναφορά στην τελευταία έκδοση που δεν περιέχει συνδέσμους στο $1',
 'spam_blanking' => 'Όλες οι αναθεωρήσεις περιείχαν συνδέσμους προς το $1, εξάλειψη',
 'spam_deleting' => 'Διαγραφή όλων των αναθεωρήσεων που περιείχαν συνδέσμους προς το $1',
-'simpleantispam-label' => "Έλεγχος anti-spam.
-'''ΜΗΝ''' το συμπληρώσετε αυτό!",
+'simpleantispam-label' => 'Έλεγχος για spam.
+<strong>ΜΗΝ</strong> το συμπληρώσετε αυτό!',
 
 # Info page
 'pageinfo-title' => 'Πληροφορίες για "$1"',
@@ -3161,7 +3191,8 @@ $2',
 'pageinfo-length' => 'Μήκος σελίδας (σε bytes)',
 'pageinfo-article-id' => 'Αναγνωριστικό σελίδας',
 'pageinfo-language' => 'Γλώσσα σελίδας περιεχομένου',
-'pageinfo-robot-policy' => 'Στάτους μηχανής αναζήτησης',
+'pageinfo-content-model' => 'Μοντέλο περιεχομένου σελίδας',
+'pageinfo-robot-policy' => 'Ευρετηρίαση από ρομπότ',
 'pageinfo-robot-index' => 'Επιτρεπτό',
 'pageinfo-robot-noindex' => 'Μη επιτρεπτό',
 'pageinfo-views' => 'Αριθμός προβολών',
@@ -3245,7 +3276,7 @@ $1',
 'svg-long-desc' => 'Αρχείο SVG, ονομαστικό μέγεθος $1 × $2 εικονοστοιχεία, μέγεθος αρχείου: $3',
 'svg-long-desc-animated' => 'Κινούμενο αρχείο SVG, ονομαστικό μέγεθος σε pixels: $1 × $2, μέγεθος αρχείου: $3',
 'svg-long-error' => 'Μη έγκυρο αρχείο SVG: $1',
-'show-big-image' => 'ΠλήÏ\81ηÏ\82 Î±Î½Î¬Î»Ï\85Ï\83η',
+'show-big-image' => 'Î\91Ï\81Ï\87ικÏ\8c Î±Ï\81Ï\87είο',
 'show-big-image-preview' => 'Μέγεθος αυτής της προεπισκόπησης: $1 .',
 'show-big-image-other' => 'Άλλες {{PLURAL:$2|ανάλυση|αναλύσεις}}: $1.',
 'show-big-image-size' => '$1 × $2 εικονοστοιχεία',
@@ -3768,7 +3799,7 @@ $5
 όρισε αυτήν τη διεύθυνση ηλεκτρονικού ταχυδρομείου ως διεύθυνση ηλεκτρονικού ταχυδρομείου
 του λογαριασμού χρήστη «$2» στον ιστότοπο {{SITENAME}}.
 
-Για να επιβεβαιώσετε ότι αυτός ο λογαριασμός χρήστη ανήκει πραγματικά σε σας και να ενεργοποιήσετε πάλι
+Για να επιβεβαιώσετε ότι αυτός ο λογαριασμός χρήστη ανήκει πραγματικά σε σας και να ενεργοποιήσετε 
 τις δυνατότητες ηλεκτρονικού ταχυδρομείου στον ιστότοπο {{SITENAME}}, ανοίξτε στον περιηγητή σας αυτόν το σύνδεσμο:
 
 $3
@@ -3778,7 +3809,7 @@ $3
 
 $5
 
-Αυτός ο κωδικός επιβεβαίωσης θα λήξει στις $6, στις $7.',
+Αυτός ο κωδικός επιβεβαίωσης θα λήξει στις $4.',
 'confirmemail_invalidated' => 'Η επιβεβαίωσης της διεύθυνσης e-mail ακυρώθηκε',
 'invalidateemail' => 'Ακύρωση επιβεβαίωσης της διεύθυνσης e-mail',
 
@@ -3814,6 +3845,11 @@ $5
 'imgmultigo' => 'Πήγαινε!',
 'imgmultigoto' => 'Μετάβαση στη σελίδα $1',
 
+# Language selector for translatable SVGs
+'img-lang-default' => '(προεπιλεγμένη γλώσσα)',
+'img-lang-info' => 'Απόδοση της εικόνας στα $1. $2',
+'img-lang-go' => 'Μετάβαση',
+
 # Table pager
 'ascending_abbrev' => 'αυξ',
 'descending_abbrev' => 'φθιν',
@@ -3891,7 +3927,14 @@ $5
 'version-hook-name' => 'Όνομα άγκιστρου',
 'version-hook-subscribedby' => 'Υπογεγραμμένο από',
 'version-version' => '(Έκδοση $1)',
-'version-license' => 'Άδεια χρήσης',
+'version-license' => 'Άδεια MediaWiki',
+'version-ext-license' => 'Άδεια χρήσης',
+'version-ext-colheader-name' => 'Επέκταση',
+'version-ext-colheader-version' => 'Έκδοση',
+'version-ext-colheader-license' => 'Άδεια χρήσης',
+'version-ext-colheader-description' => 'Περιγραφή',
+'version-ext-colheader-credits' => 'Δημιουργοί',
+'version-license-title' => 'Άδεια χρήσης για $1',
 'version-poweredby-credits' => "Αυτό το wiki λειτουργεί με το λογισμικό '''[https://www.mediawiki.org/ MediaWiki]''', πνευματική ιδιοκτησία © 2001-$1 $2.",
 'version-poweredby-others' => 'άλλοι',
 'version-poweredby-translators' => 'translatewiki.net μεταφραστές',
@@ -3909,11 +3952,13 @@ $5
 'version-entrypoints-header-url' => 'URL',
 
 # Special:Redirect
+'redirect' => 'Ανακατεύθυνση κατά αρχείο, χρήστη, σελίδα ή αναγνωριστικό αναθεώρησης',
 'redirect-legend' => 'Ανακατεύθυνση σε ένα αρχείο ή μια σελίδα',
 'redirect-submit' => 'Μετάβαση',
 'redirect-lookup' => 'Αναζήτηση:',
 'redirect-value' => 'Τιμή:',
 'redirect-user' => 'Αναγνωριστικό χρήση',
+'redirect-page' => 'Αναγνωριστικό σελίδας',
 'redirect-revision' => 'Αναθεώρηση σελίδας',
 'redirect-file' => 'Όνομα αρχείου',
 'redirect-not-exists' => 'Η τιμή δε βρέθηκε',
@@ -3931,9 +3976,9 @@ $5
 
 # Special:SpecialPages
 'specialpages' => 'Ειδικές σελίδες',
+'specialpages-note-top' => 'Υπόμνημα',
 'specialpages-note' => '* Κανονικές ειδικές σελίδες.
-* <span class="mw-specialpagerestricted">Ειδικές σελίδες με περιορισμούς.</span>
-* <span class="mw-specialpagecached">Ειδικές σελίδες αποθηκευμένες προσωρινά (μπορεί να είναι παρωχημένες).</span>',
+* <span class="mw-specialpagerestricted">Ειδικές σελίδες με περιορισμούς.</span>',
 'specialpages-group-maintenance' => 'Αναφορές συντήρησης',
 'specialpages-group-other' => 'Άλλες ειδικές σελίδες',
 'specialpages-group-login' => 'Σύνδεση / δημιουργία λογαριασμού',
@@ -3965,11 +4010,13 @@ $5
 'tags' => 'Έγκυρες ετικέτες αλλαγής',
 'tag-filter' => 'Φίλτρο [[Special:Tags|ετικετών]]:',
 'tag-filter-submit' => 'Φίλτρο',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Ετικέτα|Ετικέτες}}]]: $2)',
 'tags-title' => 'Ετικέτες',
 'tags-intro' => 'Η σελίδα συγκαταλέγει τις ετικέτες (καθώς και το τι σημαίνει η κάθε μία) με τις οποίες το software μπορεί να μαρκάρει μία επεξεργασία.',
 'tags-tag' => 'Όνομα ετικέτας',
 'tags-display-header' => 'Εμφάνιση στις λίστες αλλαγής',
 'tags-description-header' => 'Πλήρης περιγραφή του νοήματος',
+'tags-active-header' => 'Ενεργή;',
 'tags-hitcount-header' => 'Αλλαγές με ετικέτα',
 'tags-active-yes' => 'Ναι',
 'tags-active-no' => 'Όχι',
@@ -3992,6 +4039,7 @@ $5
 'dberr-problems' => 'Λυπούμαστε! Αυτός ο ιστότοπος αντιμετωπίζει τεχνικές δυσκολίες.',
 'dberr-again' => 'Δοκιμάστε να περιμενένετε λίγα λεπτά και να ανανεώσετε.',
 'dberr-info' => '(Δεν μπορεί να επικοινωνήσει με τον εξυπηρετητή της βάσης δεδομένων: $1)',
+'dberr-info-hidden' => '(Δεν είναι δυνατή η επικοινωνία με τον εξυπηρετητή της βάσης δεδομένων)',
 'dberr-usegoogle' => 'Μπορείτε να δοκιμάσετε να ψάξετε στο Google εν τω μεταξύ.',
 'dberr-outofdate' => 'Σημειώστε ότι οι ενδείξεις τους περί του περιεχομένου μας ενδέχεται να μην είναι ενημερωμένες.',
 'dberr-cachederror' => 'Το ακόλουθο είναι ένα αντίγραφο από την μνήμη της σελίδας που ζητήσατε και ενδέχεται να μην είναι ενημερωμένο.',
@@ -4130,7 +4178,9 @@ $5
 # Limit report
 'limitreport-title' => 'Δεδομένα που σκιαγραφούν το προφίλ του συντακτικού αναλυτή:',
 'limitreport-cputime' => 'Χρόνος χρήσης CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|δευτερόλεπτο|δευτερόλεπτα}}',
 'limitreport-walltime' => 'Χρήση πραγματικού χρόνου',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|δευτερόλεπτο|δευτερόλεπτα}}',
 'limitreport-ppvisitednodes' => 'Καταμέτρηση κόμβων επισκεφθέντων από τον προεπεξεργαστή',
 'limitreport-ppgeneratednodes' => 'Καταμέτρηση κόμβων παραχθέντων από τον προεπεξεργαστή',
 'limitreport-postexpandincludesize' => 'Μέγεθος συμπερίληψης πριν την ανάπτυξη',
@@ -4149,10 +4199,12 @@ $5
 'expand_templates_input' => 'Κείμενο εισόδου:',
 'expand_templates_output' => 'Αποτέλεσμα',
 'expand_templates_xml_output' => 'Έξοδος XML',
+'expand_templates_html_output' => 'Ανεπεξέργαστη έξοδος HTML',
 'expand_templates_ok' => 'Εντάξει',
 'expand_templates_remove_comments' => 'Αφαίρεση σχολίων',
 'expand_templates_remove_nowiki' => 'Απόκρυψη της ετικέτας <nowiki> στο αποτέλεσμα',
 'expand_templates_generate_xml' => 'Εμφάνιση δέντρου συντακτικής ανάλυσης XML',
+'expand_templates_generate_rawhtml' => 'Εμφάνιση ανεπεξέργαστης HTML',
 'expand_templates_preview' => 'Προεπισκόπηση',
 
 );
index ae76b91..c382bbf 100644 (file)
@@ -825,7 +825,6 @@ future releases. Also note that since each list value is wrapped in a unique
 'vector-action-protect'          => 'Protect',
 'vector-action-undelete'         => 'Undelete',
 'vector-action-unprotect'        => 'Change protection',
-'vector-simplesearch-preference' => 'Enable simplified search bar (Vector skin only)',
 'vector-view-create'             => 'Create',
 'vector-view-edit'               => 'Edit',
 'vector-view-history'            => 'View history',
@@ -1579,7 +1578,7 @@ It already exists.',
 'invalid-content-data'             => 'Invalid content data',
 'content-not-allowed-here'         => '"$1" content is not allowed on page [[$2]]',
 'editwarning-warning'              => 'Leaving this page may cause you to lose any changes you have made.
-If you are logged in, you can disable this warning in the "Editing" section of your preferences.',
+If you are logged in, you can disable this warning in the "{{int:prefs-editing}}" section of your preferences.',
 'editpage-notsupportedcontentformat-title'=> 'Content format not supported',
 'editpage-notsupportedcontentformat-text' => 'The content format $1 is not supported by the content model $2.',
 
@@ -1616,6 +1615,7 @@ These arguments have been omitted.",
 Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.',
 'undo-failure'                 => 'The edit could not be undone due to conflicting intermediate edits.',
 'undo-norev'                   => 'The edit could not be undone because it does not exist or was deleted.',
+'undo-nochange'                => 'The edit appears to have already been undone.',
 'undo-summary'                 => 'Undo revision $1 by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])',
 'undo-summary-username-hidden' => 'Undo revision $1 by a hidden user',
 
@@ -1803,7 +1803,8 @@ Note that using the navigation links will reset this column.',
 'showhideselectedversions'    => 'Change visibility of selected revisions',
 'editundo'                    => 'undo',
 'diff-empty'                  => '(No difference)',
-'diff-multi'                  => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one user|$2 users}} not shown)',
+'diff-multi-sameuser'         => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by the same user not shown)',
+'diff-multi-otherusers'       => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one other user|$2 users}} not shown)',
 'diff-multi-manyusers'        => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by more than $2 {{PLURAL:$2|user|users}} not shown)',
 'difference-missing-revision' => '{{PLURAL:$2|One revision|$2 revisions}} of this difference ($1) {{PLURAL:$2|was|were}} not found.
 
@@ -1853,6 +1854,7 @@ Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'searchrelated'                    => 'related',
 'searchall'                        => 'all',
 'showingresults'                   => "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} starting with #<strong>$2</strong>.",
+'showingresultsinrange'            => "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} in range #<strong>$2</strong> to #<strong>$3</strong>.",
 'showingresultsnum'                => "Showing below {{PLURAL:$3|<strong>1</strong> result|<strong>$3</strong> results}} starting with #<strong>$2</strong>.",
 'showingresultsheader'             => "{{PLURAL:$5|Result <strong>$1</strong> of <strong>$3</strong>|Results <strong>$1 - $2</strong> of <strong>$3</strong>}} for <strong>$4</strong>",
 'search-nonefound'                 => 'There were no results matching the query.',
@@ -1925,7 +1927,7 @@ Note that their indexes of {{SITENAME}} content may be out of date.',
 'prefs-help-recentchangescount' => 'This includes recent changes, page histories, and logs.',
 'prefs-help-watchlist-token2'   => 'This is the secret key to the web feed of your watchlist.
 Anyone who knows it will be able to read your watchlist, so do not share it.
-[[Special:ResetTokens|Click here if you need to reset it]].',
+If you need to, [[Special:ResetTokens|you can reset it]].',
 'savedprefs'                    => 'Your preferences have been saved.',
 'timezonelegend'                => 'Time zone:',
 'localtime'                     => 'Local time:',
@@ -2760,12 +2762,21 @@ It now redirects to [[$2]].',
 'deadendpagestext'                => 'The following pages do not link to other pages in {{SITENAME}}.',
 'protectedpages'                  => 'Protected pages',
 'protectedpages-indef'            => 'Indefinite protections only',
-'protectedpages-summary'          => '', # do not translate or duplicate this message to other languages
+'protectedpages-summary'          => 'This page lists existing pages that are currently protected. For a list of titles that are protected from creation, see [[{{#special:ProtectedTitles}}]].',
 'protectedpages-cascade'          => 'Cascading protections only',
 'protectedpages-noredirect'       => 'Hide redirects',
 'protectedpagesempty'             => 'No pages are currently protected with these parameters.',
+'protectedpages-timestamp'        => 'Timestamp',
+'protectedpages-page'             => 'Page',
+'protectedpages-expiry'           => 'Expires',
+'protectedpages-performer'        => 'Protecting user',
+'protectedpages-params'           => 'Protection parameters',
+'protectedpages-reason'           => 'Reason',
+'protectedpages-unknown-timestamp' => 'Unknown',
+'protectedpages-unknown-performer' => 'Unknown user',
+'protectedpages-unknown-reason'   => '—', # do not translate or duplicate this message to other languages
 'protectedtitles'                 => 'Protected titles',
-'protectedtitles-summary'         => '', # do not translate or duplicate this message to other languages
+'protectedtitles-summary'         => 'This page lists titles that are currently protected from creation. For a list of existing pages that are protected, see [[{{#special:ProtectedPages}}]].',
 'protectedtitlesempty'            => 'No titles are currently protected with these parameters.',
 'listusers'                       => 'User list',
 'listusers-summary'               => '', # do not translate or duplicate this message to other languages
@@ -3357,7 +3368,7 @@ See the [[Special:BlockList|block list]] to review blocks.',
 'contribslink'                    => 'contribs',
 'emaillink'                       => 'send email',
 'autoblocker'                     => 'Autoblocked because your IP address has been recently used by "[[User:$1|$1]]".
-The reason given for $1\'s block is "<em>$2</em>"',
+The reason given for $1\'s block is "$2"',
 'blocklogpage'                    => 'Block log',
 'blocklog-showlog'                => 'This user has been blocked previously.
 The block log is provided below for reference:',
@@ -3574,6 +3585,7 @@ $2',
 'thumbnail_image-type'     => 'Image type not supported',
 'thumbnail_gd-library'     => 'Incomplete GD library configuration: Missing function $1',
 'thumbnail_image-missing'  => 'File seems to be missing: $1',
+'thumbnail_image-failure-limit' => 'There have been too many recent failed attempts ($1 or more) to render this thumbnail. Please try again later.',
 
 # Special:Import
 'import'                     => 'Import pages',
index 9bbd032..40888f6 100644 (file)
@@ -326,27 +326,26 @@ $dateFormats = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Substreki ligilojn',
-'tog-justify' => 'Alkadrigi liniojn',
 'tog-hideminor' => 'Kaŝi malgrandajn redaktetojn ĉe <i>Lastaj ŝanĝoj</i>',
 'tog-hidepatrolled' => 'Kaŝi patrolitajn redaktojn en lastaj ŝanĝoj',
 'tog-newpageshidepatrolled' => 'Kaŝi patrolitajn paĝojn de listo de novaj paĝoj',
 'tog-extendwatchlist' => 'Etendi la atentaron por montri ĉiujn ŝanĝojn, ne nur la plej lastajn',
-'tog-usenewrc' => 'Grupigi ŝanĝoj laŭ paĝo en "Lastaj ŝanĝoj" kaj "Atentaro" (bezonas Ĝavaskripton)',
+'tog-usenewrc' => 'Grupigi ŝanĝojn laŭ paĝo en "Lastaj ŝanĝoj" kaj "Atentaro" (bezonas Ĝavaskripton)',
 'tog-numberheadings' => 'Aŭtomate numerigi sekciojn',
-'tog-showtoolbar' => 'Montri redakto-breton (per JavaScript)',
-'tog-editondblclick' => 'Redakti per duobla alklako (per JavaScript)',
-'tog-editsectiononrightclick' => 'Ŝalti sekcian redaktadon per dekstra musklako de sekciaj titoloj (kun JavaScript)',
-'tog-rememberpassword' => 'Memori mian ensalutadon ĉe ĉi tiu retumilo (daŭrante maksimume $1 {{PLURAL:$1|tagon|tagojn}})',
-'tog-watchcreations' => 'Aldoni miajn kreatajn paĝojn al mia atentaro',
-'tog-watchdefault' => 'Aldoni al mia atentaro paĝojn redaktitajn de mi',
-'tog-watchmoves' => 'Aldoni paĝojn, kiujn mi movas, al mia atentaro',
-'tog-watchdeletion' => 'Aldoni paĝojn, kiujn mi forigas, al mia atentaro',
+'tog-showtoolbar' => 'Montri redakto-breton (per Ĝavaskripto)',
+'tog-editondblclick' => 'Redakti per duobla alklako (per Ĝavaskripto)',
+'tog-editsectiononrightclick' => 'Ŝalti sekcian redaktadon per dekstra musklako de sekciaj titoloj (per Ĝavaskripto)',
+'tog-rememberpassword' => 'Memori mian ensalutadon en ĉi tiu retumilo (daŭrante maksimume $1 {{PLURAL:$1|tagon|tagojn}})',
+'tog-watchcreations' => 'Aldoni miajn kreatajn paĝojn kaj miajn alŝutaĵojn al mia atentaro',
+'tog-watchdefault' => 'Aldoni al mia atentaro paĝojn kaj dosierojn redaktitajn de mi',
+'tog-watchmoves' => 'Aldoni paĝojn kaj dosierojn, kiujn mi movas, al mia atentaro',
+'tog-watchdeletion' => 'Aldoni paĝojn kaj dosierojn, kiujn mi forigas, al mia atentaro',
 'tog-minordefault' => 'Marki defaŭlte ĉiujn redaktojn kiel etajn',
 'tog-previewontop' => 'Montri antaŭrigardon antaŭ redaktilo',
 'tog-previewonfirst' => 'Montri antaŭrigardon je unua redakto',
-'tog-enotifwatchlistpages' => 'Sendi al mi retmesaĝon kiam tiu paĝo en mia atentaro estas ŝanĝita',
+'tog-enotifwatchlistpages' => 'Sendi al mi retmesaĝon kiam paĝo aŭ dosiero en mia atentaro estas ŝanĝita',
 'tog-enotifusertalkpages' => 'Sendi al mi retmesaĝon kiam mia diskutpaĝo estas ŝanĝita',
-'tog-enotifminoredits' => 'Sendi al mi ankaŭ retmesaĝojn pro malgrandaj redaktoj de paĝoj',
+'tog-enotifminoredits' => 'Sendi al mi ankaŭ retmesaĝojn pro malgrandaj redaktoj de paĝoj kaj dosieroj',
 'tog-enotifrevealaddr' => 'Malkaŝi mian retadreson en informaj retpoŝtaĵoj',
 'tog-shownumberswatching' => 'Montri la nombron da priatentaj uzantoj',
 'tog-oldsig' => 'Ekzistanta subskribo:',
@@ -354,16 +353,17 @@ $messages = array(
 'tog-uselivepreview' => 'Uzi tujan antaŭrigardon (per ĜavaSkripto) (Eksperimenta)',
 'tog-forceeditsummary' => 'Averti min kiam mi konservas malplenan redaktoresumon',
 'tog-watchlisthideown' => 'Kaŝi miajn redaktojn de la atentaro',
-'tog-watchlisthidebots' => 'Kaŝi bot-redaktojn de la atentaro',
+'tog-watchlisthidebots' => 'Kaŝi robotajn redaktojn de la atentaro',
 'tog-watchlisthideminor' => 'Kaŝi malgrandajn redaktojn de la atentaro',
 'tog-watchlisthideliu' => 'Kaŝi redaktojn de ensalutitaj uzantoj de la atentaro',
 'tog-watchlisthideanons' => 'Kaŝi redaktojn de anonimuloj de la atentaro',
 'tog-watchlisthidepatrolled' => 'Kaŝi patrolitajn redaktojn de la atentaro',
 'tog-ccmeonemails' => 'Sendi al mi kopiojn de retpoŝtaĵoj, kiujn mi sendis al aliaj uzantoj.',
-'tog-diffonly' => 'Ne montri paĝan enhavon sub la ŝanĝoj',
+'tog-diffonly' => 'Ne montri paĝan enhavon sub la ŝanĝmontrilo',
 'tog-showhiddencats' => 'Montri kaŝitajn kategoriojn',
 'tog-norollbackdiff' => 'Preterlasi ŝanĝoelmontron post malfaro',
 'tog-useeditwarning' => 'Averti min kiam mi forlasas redaktan paĝon kun nekonservitaj ŝanĝoj',
+'tog-prefershttps' => 'Ĉiam uzu sekuran konekton ensalutite',
 
 'underline-always' => 'Ĉiam',
 'underline-never' => 'Neniam',
@@ -448,7 +448,7 @@ $messages = array(
 'category-empty' => "''Ĉi tiu kategorio momente ne enhavas artikolojn aŭ mediojn.''",
 'hidden-categories' => '{{PLURAL:$1|Kaŝita kategorio|Kaŝitaj kategorioj}}',
 'hidden-category-category' => 'Kaŝitaj kategorioj',
-'category-subcat-count' => '{{PLURAL:$2|Ĉi tiu kategorio havas nur la suban subkategorion.|Ĉi tiu kategorio havas la {{PLURAL:$1|suban subkategorion|$1 subajn subkategoriojn}}, el $2 entute.}}',
+'category-subcat-count' => '{{PLURAL:$2|Ĉi tiu kategorio havas nur la jenan subkategorion.|Ĉi tiu kategorio havas la {{PLURAL:$1|jenan subkategorion|$1 jenajn subkategoriojn}}, el $2 entute.}}',
 'category-subcat-count-limited' => 'Ĉi tiu kategorio havas la {{PLURAL:$1|jenan subkategorion|jenajn $1 subkategoriojn}}.',
 'category-article-count' => '{{PLURAL:$2|Ĉi tiu kategorio enhavas nur la jenan paĝon.|La {{PLURAL:$1|jena paĝo|jenaj $1 paĝoj}} estas en ĉi tiu kategorio, el $2 entute.}}',
 'category-article-count-limited' => 'La {{PLURAL:$1|jena paĝo|jenaj $1 paĝoj}} estas en la nuna kategorio.',
@@ -459,7 +459,7 @@ $messages = array(
 'noindex-category' => 'Neindeksitaj paĝoj',
 'broken-file-category' => 'Paĝoj kun eraraj dosierligiloj',
 
-'about' => 'Enkonduko',
+'about' => 'Pri',
 'article' => 'Artikolo',
 'newwindow' => '(en nova fenestro)',
 'cancel' => 'Nuligi',
@@ -467,7 +467,7 @@ $messages = array(
 'morenotlisted' => 'Ĉi tiu listo ne estas kompleta.',
 'mypage' => 'Paĝo',
 'mytalk' => 'Diskuto',
-'anontalk' => 'Diskutpaĝo por tiu ĉi IP',
+'anontalk' => 'Diskutpaĝo por tiu ĉi IP-adreso',
 'navigation' => 'Navigado',
 'and' => '&#32;kaj',
 
@@ -475,8 +475,8 @@ $messages = array(
 'qbfind' => 'Trovi',
 'qbbrowse' => 'Foliumi',
 'qbedit' => 'Redakti',
-'qbpageoptions' => 'Paĝagado',
-'qbmyoptions' => 'Personaĵoj',
+'qbpageoptions' => 'Ĉi tiu paĝo',
+'qbmyoptions' => 'Miaj paĝoj',
 'faq' => 'Oftaj demandoj',
 'faqpage' => 'Project:Oftaj demandoj',
 
@@ -487,7 +487,6 @@ $messages = array(
 'vector-action-protect' => 'Protekti',
 'vector-action-undelete' => 'Malforigi',
 'vector-action-unprotect' => 'Ŝanĝi protektadon',
-'vector-simplesearch-preference' => 'Ebligi simpligitan serĉan strion (nur Vektora etoso)',
 'vector-view-create' => 'Krei',
 'vector-view-edit' => 'Redakti',
 'vector-view-history' => 'Vidi historion',
@@ -508,7 +507,7 @@ $messages = array(
 'searcharticle' => 'Ek!',
 'history' => 'Historio de versioj',
 'history_short' => 'Historio',
-'updatedmarker' => 'ĝisdatita de post mia lasta vizito',
+'updatedmarker' => 'ĝisdatigita de post mia lasta vizito',
 'printableversion' => 'Presebla versio',
 'permalink' => 'Konstanta ligilo',
 'print' => 'Printi',
@@ -556,7 +555,7 @@ $messages = array(
 'jumptosearch' => 'serĉi',
 'view-pool-error' => 'Bedaŭrinde la serviloj estas tro uzataj ĉi-momente.
 Tro da uzantoj provas vidi ĉi tiun paĝon.
-Bonvolu atendi iom antaŭ provi atingi ĝin denove.
+Bonvolu atendi iom antaŭ ol provi atingi ĝin denove.
 
 $1',
 'pool-timeout' => 'Tempolimo atingita dum atendo de ŝlosado',
@@ -582,7 +581,7 @@ $1',
 'privacy' => 'Regularo pri respekto de la privateco',
 'privacypage' => 'Project:Respekto de la privateco',
 
-'badaccess' => 'Vi ne havas sufiĉe da redaktorajtoj por tiu paĝo.',
+'badaccess' => 'Vi ne havas sufiĉe da redaktorajtoj por ĉi tiu paĝo.',
 'badaccess-group0' => 'Vi ne rajtas plenumi la agon, kiun vi petis.',
 'badaccess-groups' => 'La ago, kiun vi petis, estas limigita al uzantoj en {{PLURAL:$2|la grupo|unu el la grupoj}}: $1.',
 
@@ -591,7 +590,7 @@ $1',
 
 'ok' => 'Ek!',
 'retrievedfrom' => 'Elŝutita el  "$1"',
-'youhavenewmessages' => 'Por vi estas $1 ($2).',
+'youhavenewmessages' => '{{PLURAL:$3|Vi havas}} $1 ($2).',
 'youhavenewmessagesfromusers' => 'Riceviĝis $1 de {{PLURAL:$3|alia uzanto|$3 uzantoj}} ($2).',
 'youhavenewmessagesmanyusers' => 'Riceviĝis $1 de multaj uzantoj ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|nova mesaĝo|999=novaj mesaĝoj}}',
@@ -636,9 +635,9 @@ $1',
 
 # Main script and global functions
 'nosuchaction' => 'Ne ekzistas tia ago',
-'nosuchactiontext' => "La ago ('action') nomita de la URL estas malvalida.
+'nosuchactiontext' => 'La ago nomita de la URL estas malvalida.
 Eble vi mistajpis la URL-on, aŭ sekvis malvalidan ligilon.
-Eble ankaŭ ĉi tiel indikus problemon de la programaro de {{SITENAME}}.",
+Eble ankaŭ ĉi tiel indikus problemon de la programaro de {{SITENAME}}.',
 'nosuchspecialpage' => 'Ne ekzistas tia speciala paĝo',
 'nospecialpagetext' => '<strong>Vi petis malvalidan specialan paĝon.</strong>
 
@@ -654,20 +653,20 @@ Listo de validaj specialaj paĝoj estas trovebla ĉe [[Special:SpecialPages|{{in
 'databaseerror-function' => 'Funkcio: $1',
 'databaseerror-error' => 'Eraro: $1',
 'laggedslavemode' => 'Avertu: la paĝo eble ne enhavas lastatempajn ĝisdatigojn.',
-'readonly' => 'Datumaro ŝlosita, nurlega',
-'enterlockreason' => 'Bonvolu klarigi, kial oni ŝlosas la datumaron, kaj
+'readonly' => 'Datumbazo ŝlosita, nurlega',
+'enterlockreason' => 'Bonvolu klarigi, kial oni ŝlosas la datumbazon, kaj
 la estimatan tempon de malŝlosado.',
-'readonlytext' => 'La datumaro de {{SITENAME}} estas nun ŝlosita kontraŭ
-novaj aldonaj kaj aliaj ŝanĝoj, verŝajne pro laŭkutima flegado de la datumaro.
+'readonlytext' => 'La datumbazo de {{SITENAME}} estas nun ŝlosita kontraŭ
+novaj aldonaj kaj aliaj ŝanĝoj, verŝajne pro laŭkutima flegado de la datumbazo.
 Bonvolu reprovi post iom da tempo.
 
 La ŝlosinta administranto lasis la jenan klarigon:
 <p>$1</p>',
 'missing-article' => 'La datumbazo ne trovis la tekston de paĝo kiun ĝi devas trovi, nomita "$1" $2.
 
-Ĉi tiel ofte estas kaŭzite de sekvado de malfreŝa \'\'diff\'\' aŭ historia ligilo al paĝo kiu estis forigita.
+Ĉi tio ofte estas kaŭzita de sekvado de malfreŝa \'\'diff\'\' aŭ historia ligilo al paĝo kiu estis forigita.
 
-Se ĉi tiel ne okazis, verŝajne vi trovis cimon en la softvaro.
+Se ĉi tio ne okazis, verŝajne vi trovis cimon en la softvaro.
 Bonvolu raporti ĉi tiun al [[Special:ListUsers/sysop|administranto]], notante la TTT-adreson.',
 'missingarticle-rev' => '(versio#: $1)',
 'missingarticle-diff' => '(Diferenco inter versioj: $1, $2)',
@@ -677,60 +676,63 @@ Bonvolu raporti ĉi tiun al [[Special:ListUsers/sysop|administranto]], notante l
 'fileappenderrorread' => 'Ne eblis legi "$1" dum postaldonado.',
 'fileappenderror' => 'Ne eblis postaldoni "$1" al "$2".',
 'filecopyerror' => 'Ne povis kopii dosieron  "$1" al "$2".',
-'filerenameerror' => 'Neeblis alinomi dosieron "$1" al "$2".',
+'filerenameerror' => 'Ne eblis alinomigi dosieron "$1" al "$2".',
 'filedeleteerror' => 'Neeblis forigi dosieron "$1".',
 'directorycreateerror' => 'Ne povis krei dosierujon "$1".',
-'filenotfound' => 'Neeblis trovi dosieron "$1".',
+'filenotfound' => 'Ne eblis trovi dosieron "$1".',
 'fileexistserror' => 'Ne povas skribi en la dosieron "$1": dosiero ekzistas',
 'unexpected' => 'Neatendita valoro: "$1"="$2".',
-'formerror' => 'Eraro: neeblis liveri formulon',
+'formerror' => 'Eraro: ne eblis liveri formulon',
 'badarticleerror' => 'Tiun ĉi agon oni ne povas apliki al tiu ĉi artikolo.',
 'cannotdelete' => 'Ne eblis forigi la elektitan paĝon aŭ dosieron "$1".
 Eble ĝi estis jam forigita de iu alia.',
 'cannotdelete-title' => 'Ne eblas forigi paĝon "$1"',
-'delete-hook-aborted' => 'Forigo ĉesigis per hoko.
+'delete-hook-aborted' => 'Forigo estis ĉesigita per programa etendaĵo de MediaWiki.
 Ĝi ne donis eksplikon.',
+'no-null-revision' => 'Ne eblis krei novan nulan revizion por paĝo "$1"',
 'badtitle' => 'Fuŝa titolo',
 'badtitletext' => 'La petita paĝotitolo estis malvalida, malplena, aŭ malĝuste ligita interlingva aŭ intervikia titolo.
-Ĝi eble enhavas unu aŭ pliaj signoj kiu ne povas esti uzata en titoloj.',
+Ĝi eble enhavas unu aŭ pliaj signoj, kiuj ne povas esti uzataj en titoloj.',
 'perfcached' => 'La sekvantaj informoj venas el kaŝmemoro kaj eble ne estas ĝisdataj. Maksimumo de {{PLURAL:$1|unu rezulto estas disponebla|$1 rezultoj estas disponeblaj}} en la kaŝmemoro.',
 'perfcachedts' => 'La jenaj datumoj estas el kaŝmemoro kaj estis laste ĝisdatigitaj $1. Maksimumo de {{PLURAL:$4|unu rezulto estas disponebla|$4 rezultoj estas disponeblaj}} en la kaŝmemoro.',
-'querypage-no-updates' => 'Ĝisdatigoj por ĉi paĝo estas nune neebligitaj.
-Datenoj ĉi tie ne estos nune refreŝigitaj.',
+'querypage-no-updates' => 'Ĝisdatigoj por ĉi tiu paĝo estas nune neebligitaj.
+Datumoj ĉi tie ne estos nune refreŝigitaj.',
 'viewsource' => 'Rigardi vikitekston',
 'viewsource-title' => 'Vidi fonton por $1',
 'actionthrottled' => 'Agado limigita',
-'actionthrottledtext' => 'Por kontraŭigi spamon, vi estas limigita farante ĉi tiun agon tro pluroble en mallonga tempdaŭro, kaj vi plialtigis ĉi tiun limon. Bonvolu refaru post kelkaj minutoj.',
+'actionthrottledtext' => 'Por kontraŭigi spamon, vi estas limigita farante ĉi tiun agon tro pluroble en mallonga tempdaŭro, kaj vi transpasis ĉi tiun limon. Bonvolu refaru post kelkaj minutoj.',
 'protectedpagetext' => 'Tiu ĉi paĝo estas ŝlosita por malebligi redaktadon.',
 'viewsourcetext' => 'Vi povas rigardi kaj kopii la fonton de la paĝo:',
 'viewyourtext' => "Vi povas vidi kaj kopii la fonton de '''viaj redaktoj''' al ĉi tiu paĝo:",
 'protectedinterface' => 'Ĉi tiu paĝo provizas interfacan tekston por la programaro, kaj estas ŝlosita por malebligi misuzon.
-Por aldoni aŭ ŝanĝi tradukojn por ĉiuj vikioj, bonvolu uzi [//translatewiki.net/ translatewiki.net], la projekto por provizi tradukojn por MediaWiki.',
+Por aldoni aŭ ŝanĝi tradukojn por ĉiuj vikioj, bonvolu uzi [//translatewiki.net/ translatewiki.net], la projekton por provizi tradukojn por MediaWiki.',
 'editinginterface' => "'''Atentu:''' Vi redaktas paĝon, kiu provizas interfacan tekston por la programaro.
 Ŝanĝoj de ĉi tiu teksto ŝanĝos aspekton de la interfaco por aliaj uzantoj de ĉi tiu vikio.
 Por aldoni aŭ ŝanĝi tradukojn por ĉiuj vikioj, bonvolu uzi [//translatewiki.net/ translatewiki.net], la projekton por provizi tradukojn por MediaWiki.",
-'cascadeprotected' => 'Ĉi tiu paĝo estas protektita kontraŭ redaktado, ĉar ĝi estas inkludita en la {{PLURAL:$1|sekvan paĝon, kiu|sekvajn paĝojn, kiuj}} estas {{PLURAL:$1|protektata|protektataj}} kun la "kaskada" opcio turnita sur:
+'cascadeprotected' => 'Ĉi tiu paĝo estas protektita kontraŭ redaktado, ĉar ĝi estas inkludita en la {{PLURAL:$1|sekvan paĝon, kiu|sekvajn paĝojn, kiuj}} estas {{PLURAL:$1|protektata|protektataj}} kun la "kaskada" opcio ŝaltita sur:
 $2',
 'namespaceprotected' => "Vi ne rajtas redakti paĝojn en la '''$1''' nomspaco.",
 'customcssprotected' => 'Vi ne rajtas redakti ĉi tiun CSS-paĝon, ĉar ĝi enhavas personajn alĝustigojn de alia uzanto.',
-'customjsprotected' => 'Vi ne rajtas redakti ĉi tiun JavaScript-paĝon, ĉar ĝi enhavas personajn alĝustigojn de alia uzanto.',
+'customjsprotected' => 'Vi ne rajtas redakti ĉi tiun Ĝavaskriptan paĝon, ĉar ĝi enhavas personajn alĝustigojn de alia uzanto.',
 'mycustomcssprotected' => 'Vi ne havas la rajton redakti tiun ĉi CSS-paĝon.',
 'mycustomjsprotected' => 'Vi ne havas la rajton redakti tiun ĉi JavaScript-paĝon.',
+'myprivateinfoprotected' => 'Vi ne havas permeson por redakti vian privatan informon.',
+'mypreferencesprotected' => 'Vi ne havas permeson por redakti viajn preferojn.',
 'ns-specialprotected' => 'Paĝoj en la {{ns:special}} nomspaco ne povas esti redaktataj.',
-'titleprotected' => "Ĉi titolo estas protektita de kreado de [[User:$1|$1]].
+'titleprotected' => "Ĉi tiu titolo estas protektita de kreado de [[User:$1|$1]].
 La kialo donata estis ''$2''.",
 'filereadonlyerror' => 'La dosiero "$1" ne estas modifebla, ĉar la datumbazujo "$2" estas en nurlegebla modo.
 
-La administranto kiu ŝlosis ĝin proponis tiun klarigon: "$3".',
+La administranto, kiu ŝlosis ĝin, proponis tiun klarigon: "$3".',
 'invalidtitle-knownnamespace' => 'Nevalida titolo kun nomspaco "$2" kaj teksto "$3"',
 'invalidtitle-unknownnamespace' => 'Nevalida titolo kun nekonata nomspaca numero $1 kaj teksto "$2"',
-'exception-nologin' => 'Ne ensalutita',
+'exception-nologin' => 'Ne ensalutinta',
 'exception-nologin-text' => 'Bonvolu [[Special:Userlogin|ensaluti]] por atingi ĉi tiun paĝon aŭ agon.',
 
 # Virus scanner
 'virus-badscanner' => "Malbona konfiguro: nekonata virusa skanilo: ''$1''",
 'virus-scanfailed' => 'skano malsukcesis (kun kodo $1)',
-'virus-unknownscanner' => 'nekonata kontraŭviruso:',
+'virus-unknownscanner' => 'nekonata kontraŭvirusilo:',
 
 # Login and logout pages
 'logouttext' => "'''Vi nun estas elsalutinta.'''
@@ -742,6 +744,7 @@ Ne forgesu ŝanĝi viajn [[Special:Preferences|{{SITENAME}}-preferojn]]',
 'yourname' => 'Salutnomo:',
 'userlogin-yourname' => 'Uzantonomo',
 'userlogin-yourname-ph' => 'Enigu vian uzantonomon',
+'createacct-another-username-ph' => 'Enigu la salutnomon:',
 'yourpassword' => 'Pasvorto:',
 'userlogin-yourpassword' => 'Pasvorto',
 'userlogin-yourpassword-ph' => 'Enigu vian pasvorton',
@@ -774,10 +777,15 @@ Ne forgesu ŝanĝi viajn [[Special:Preferences|{{SITENAME}}-preferojn]]',
 'userlogin-resetpassword-link' => 'Ĉu vi forgesis vian pasvorton?',
 'helplogin-url' => 'Help:Ensalutado',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Helpo pri ensalutado]]',
+'userlogin-loggedin' => 'Vi jam estas ensalutita kiel {{GENDER:$1|$1}}.
+Uzu la formularon suben por ensaluti kiel alia uzanto.',
+'userlogin-createanother' => 'Krei alian konton',
 'createacct-join' => 'Suben enigu informojn pri vi',
+'createacct-another-join' => 'Enigu la informon de la nova konto suben.',
 'createacct-emailrequired' => 'Retpoŝta adreso',
 'createacct-emailoptional' => 'Retpoŝta adreso (nedeviga)',
 'createacct-email-ph' => 'Enigu vian retpoŝtan adreson',
+'createacct-another-email-ph' => 'Enigu la retpoŝtan adreson',
 'createaccountmail' => 'Uzi provizoran hazardsignan pasvorton kaj sendi ĝin al la retpoŝta adreso ĉi-suba',
 'createacct-realname' => 'Vera nomo (nedeviga)',
 'createaccountreason' => 'Kialo:',
@@ -791,73 +799,73 @@ Ne forgesu ŝanĝi viajn [[Special:Preferences|{{SITENAME}}-preferojn]]',
 'createacct-benefit-body1' => '{{PLURAL:$1|redakto|redaktoj}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|paĝo|paĝoj}}',
 'createacct-benefit-body3' => '{{PLURAL:$1|lasta kontribuanto|lastaj kontribuantoj}}',
-'badretype' => 'La pasvortojn kiujn vi tajpis ne egalas.',
+'badretype' => 'La pasvortoj, kiujn vi tajpis, ne egalas.',
 'userexists' => 'Salutnomo enigita jam estas uzata.
 Bonvolu elekti alian nomon.',
 'loginerror' => 'Ensaluta eraro',
 'createacct-error' => 'Eraro pri kreado de konto',
 'createaccounterror' => 'Ne eblis krei konton: $1',
-'nocookiesnew' => 'La uzantokonto estis kreita sed vi ne estas ensalutinta. *** E-igo lcfirst {{SITENAME}} uzas kuketojn por akcepti uzantojn. Kuketoj esta malaktivigitaj ĉe vi. Bonvolu aktivigi ilin kaj ensalutu per viaj novaj salutnomo kaj pasvorto.',
+'nocookiesnew' => 'La uzantokonto estis kreita sed vi ne estas ensalutinta. {{SITENAME}} uzas kuketojn por akcepti uzantojn. Kuketoj esta malaktivigitaj ĉe vi. Bonvolu aktivigi ilin kaj ensalutu per viaj novaj salutnomo kaj pasvorto.',
 'nocookieslogin' => '{{SITENAME}} uzas kuketojn por akcepti uzantojn. Kuketoj esta malaktivigitaj ĉe vi. Bonvolu aktivigi ilin kaj provu denove.',
-'nocookiesfornew' => 'La uzantokonto ne estis kreita, ĉar ne konfirmeblas ĝia fonto. Certiginte ke kuketoj estas ebligitaj, reŝargu tiun ĉi pagon kaj reprovu.',
+'nocookiesfornew' => 'La uzantokonto ne estis kreita, ĉar ne konfirmeblas ĝia fonto. Certiginte ke kuketoj estas ebligitaj, reŝargu tiun ĉi paĝon kaj reprovu.',
 'noname' => 'Vi ne tajpis validan salutnomon.',
 'loginsuccesstitle' => 'Ensalutado sukcesis',
 'loginsuccess' => 'Vi ensalutis ĉe {{SITENAME}} kiel uzanto "$1".',
 'nosuchuser' => 'Neniu uzanto havas nomon "$1".
-Nomoj por uzantoj estas usklecodistinga.
+Nomoj por uzantoj estas usklecodistingaj.
 Kontrolu vian literumadon, aŭ [[Special:UserLogin/signup|kreu novan konton]].',
 'nosuchusershort' => 'Ne ekzistas uzanto kun la nomo "$1". Bonvolu kontroli vian ortografion.',
 'nouserspecified' => 'Vi devas entajpi salutnomon.',
 'login-userblocked' => 'Ĉi tiu uzanto estas forbarita. Ensalutado ne estas permesita.',
 'wrongpassword' => 'Vi tajpis malĝustan pasvorton. Bonvolu provi denove.',
 'wrongpasswordempty' => 'Vi tajpis malplenan pasvorton. Bonvolu provi denove.',
-'passwordtooshort' => 'Pasvortoj devas esti almenaŭ  $1 {{PLURAL:$1|1 signon|$1 signojn}}.',
+'passwordtooshort' => 'Pasvortoj devas esti longaj almenaŭ  $1 {{PLURAL:$1|1 signon|$1 signojn}}.',
 'password-name-match' => 'Via pasvorto devas nepre malsami vian salutnomon.',
 'password-login-forbidden' => 'Estas malpermesite uzi tiun ĉi salutnomon kaj pasvorton.',
 'mailmypassword' => 'Refari pasvorton',
-'passwordremindertitle' => 'Rememorigo el {{SITENAME}} pri perdita pasvorto',
+'passwordremindertitle' => 'Nova provizora pasvorto por {{SITENAME}}',
 'passwordremindertext' => 'Iu (probable vi, el IP-adreso $1) petis novan
 pasvorton por {{SITENAME}} ($4). Provizora pasvorto por uzanto
 "$2" estis kreita kaj estis farita al "$3". Se ĉi tiu estis via
-intencio, vi devos ensaluti kaj elekti novan pasvorton nun. Via provizora pasvorto malvalidiĝos post  {{PLURAL:$5|unu tago|$5 tagoj}}.
+intenco, vi devos ensaluti kaj elekti novan pasvorton nun. Via provizora pasvorto malvalidiĝos post  {{PLURAL:$5|unu tago|$5 tagoj}}.
 
-Se iu alia faris ĉi tiun peton, aŭ se vi estas rememorita vian pasvorton,
+Se iu alia faris ĉi tiun peton, aŭ se vi estas rememorinta vian pasvorton,
 kaj ne plu volas ŝanĝi ĝin, vi povas ignori ĉi tiun mesaĝon kaj
 kontinui uzante vian malnovan pasvorton.',
 'noemail' => 'Retpoŝtadreso ne estas registrita por uzanto "$1".',
 'noemailcreate' => 'Vi devas provizi validan retadreson',
 'passwordsent' => 'Oni sendis novan pasvorton al la retpoŝtadreso
 registrita por "$1".
-Bonvolu saluti denove ricevinte ĝin.',
-'blocked-mailpassword' => 'Via IP adreso estas forbarita de redaktado, kaj tial
+Bonvolu ensaluti denove ricevinte ĝin.',
+'blocked-mailpassword' => 'Via IP-adreso estas forbarita de redaktado, kaj tial
 ne rajtas uzi la pasvorto-rekovran funkcion por malebligi misuzon.',
 'eauthentsent' => 'Konfirma retmesaĝo estis sendita al la nomita retadreso. Antaŭ ol iu ajn alia mesaĝo estos sendita al la konto, vi devos sekvi la instrukciojn en la mesaĝo por konfirmi ke la konto ja estas via.',
 'throttled-mailpassword' => 'Retpoŝto kun reŝargita pasvorto estis jam sendita ene de la {{PLURAL:$1|lasta horo|lastaj $1 horoj}}.
 Por preventi misuzon, nur unu reŝargita pasvorto estos sendita dum {{PLURAL:$1|horo|$1 horoj}}.',
 'mailerror' => 'Okazis eraro sendante retpoŝtaĵon: $1',
-'acct_creation_throttle_hit' => 'Vizitintoj al ĉi tiu vikio uzintaj vian IP-adreson kreis {{PLURAL:$1|1 konton|$1 kontojn}} dum la lasta tago, kiu estas la maksimume permesita en ĉi tiu tempoperiodo.
-Tial, vizitantoj kun ĉi tiu IP-adreso ne povas krei pluajn kontojn ĉi-momente.',
-'emailauthenticated' => 'Via retadreso estis konfirmita ekde $2 $3.',
+'acct_creation_throttle_hit' => 'Vizitintoj al ĉi tiu vikio uzintaj vian IP-adreson kreis {{PLURAL:$1|1 konton|$1 kontojn}} dum la lasta tago, {{PLURAL:$1|kiu|kiuj}} estas la maksimume permesita en ĉi tiu tempoperiodo.
+Tial, vizitantoj kun ĉi tiu IP-adreso ne povas krei pliajn kontojn ĉi-momente.',
+'emailauthenticated' => 'Via retadreso estis konfirmita ekde $2 je $3.',
 'emailnotauthenticated' => 'Via retadreso ne jam estas aŭtentigata.
-Neniu retpoŝto estos sendita pro iuj jenaj kialoj.',
-'noemailprefs' => 'Specifu retpoŝtan adreson por ĉi tiuj ecoj funkcii.',
+Neniu retpoŝto estos sendita por iu el la jenaj funkcioj.',
+'noemailprefs' => 'Donu retpoŝtan adreson en viaj preferoj, por ke ĉi tiuj funkcioj estu je dispono.',
 'emailconfirmlink' => 'Konfirmu vian retpoŝtan adreson',
 'invalidemailaddress' => 'La retadreso ne povas esti akceptita, ĉar ĝi verŝajne havas malvalidan formaton.
-Enigi bone formatita adreso aŭ malplenigi tiun kampon.',
-'cannotchangeemail' => 'Kontaj retpoŝtadresoj ne povas esti ŝanĝita en ĉi tiu vikio.',
+Bonvolu enigi bone formatitan adreson aŭ malplenigi tiun kampon.',
+'cannotchangeemail' => 'Kontaj retpoŝtadresoj ne povas esti ŝanĝitaj en ĉi tiu vikio.',
 'emaildisabled' => 'Ĉi tiu paĝaro ne povas sendi retpoŝtojn.',
 'accountcreated' => 'Konto kreita',
 'accountcreatedtext' => 'La uzanto-konto por [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskuto]])  estas kreita.',
 'createaccount-title' => 'Konto-kreado por {{SITENAME}}',
 'createaccount-text' => 'Iu kreis konton por via retadreso en {{SITENAME}} ($4) nomata "$2", kun pasvorto "$3". Vi ensalutu kaj ŝanĝu vian pasvorton nun.
 
-Vi povas ignori ĉi mesaĝon, se ĉi konto estis kreita erare.',
-'usernamehasherror' => 'Salutnomo ne povas enhavi kriphaketaĵajn signojn',
+Vi povas ignori ĉi tiun mesaĝon, se ĉi tiu konto estis kreita erare.',
+'usernamehasherror' => 'Salutnomo ne povas enhavi signojn de kriptaj haketaĵoj',
 'login-throttled' => 'Vi ĵus tro ofte provis ensaluti.
 Bonvolu ĝisatendi $1 antaŭ reprovi.',
 'login-abort-generic' => 'Via ensaluto malsukcesis - Ĉesigita',
 'loginlanguagelabel' => 'Lingvo: $1',
-'suspicious-userlogout' => 'Via peto por elsaluti estis malpermesita ĉar verŝajne ĝi estis sendita de trompita retumilo aŭ kaŝiganta proksima servilo.',
+'suspicious-userlogout' => 'Via peto por elsaluti estis malpermesita, ĉar verŝajne ĝi estis sendita de trompita retumilo aŭ kaŝiĝanta prokura servilo.',
 'createacct-another-realname-tip' => 'La vera nomo estas nenecesa.
 Se vi decidas indiki ĝin, ĝi estos uzata por montri atribuadon de viaj kontribuoj.',
 
@@ -868,7 +876,7 @@ Se vi decidas indiki ĝin, ĝi estos uzata por montri atribuadon de viaj kontrib
 
 # Change password dialog
 'changepassword' => 'Ŝanĝi pasvorton',
-'resetpass_announce' => 'Vi ensalutis kun provizora retpoŝtita pasvorto. Por kompleti ensalutadon, vi devas fari novan pasvorton ĉi tien:',
+'resetpass_announce' => 'Vi ensalutis kun provizora retpoŝtita pasvorto. Por kompleti ensalutadon, vi devas fari novan pasvorton ĉi tie:',
 'resetpass_text' => '<!-- Aldonu tekston ĉi tien -->',
 'resetpass_header' => 'Ŝanĝi kontan pasvorton',
 'oldpassword' => 'Malnova pasvorto',
@@ -888,13 +896,14 @@ Vi eble jam ŝanĝis vian pasvorton aŭ petis novan provizoran pasvorton.',
 # Special:PasswordReset
 'passwordreset' => 'Restarigo de pasvorto',
 'passwordreset-text-one' => 'Plenigu ĉi tiun formularon por renovigi vian pasvorton.',
+'passwordreset-text-many' => '{{PLURAL:$1|Plenumu unu el la kampoj por restarigi vian pasvorton.}}',
 'passwordreset-legend' => 'Refari pasvorton',
 'passwordreset-disabled' => 'Pasvortaj restarigoj estis malŝaltitaj en ĉi tiu vikio.',
 'passwordreset-emaildisabled' => 'Retpoŝtaj funkcioj estas malfunkciigitaj en tiu ĉi vikio.',
 'passwordreset-username' => 'Salutnomo:',
 'passwordreset-domain' => 'Domajno:',
 'passwordreset-capture' => 'Vidi la rezultan retpoŝton?',
-'passwordreset-capture-help' => 'Se vi marki ĉi tiun skatoleton, la retpoŝto (kun provizora pasvorto) estos montrita al vi kaj estos sendita al la uzanto.',
+'passwordreset-capture-help' => 'Se vi markis ĉi tiun skatoleton, la retpoŝto (kun provizora pasvorto) estos montrita al vi kaj estos sendita al la uzanto.',
 'passwordreset-email' => 'Retpoŝtadreso:',
 'passwordreset-emailtitle' => 'Kontaj detaloj en {{SITENAME}}',
 'passwordreset-emailtext-ip' => 'Iu (verŝajne vi, de IP-adreso $1) petis restarigon de via pasvorto por {{SITENAME}} ($4). La {{PLURAL:$3|jena uzanto-konto estas asociita|jenaj uzanto-kontoj estas asociitaj}} kun ĉi tiu retpoŝtadreso:
@@ -918,7 +927,7 @@ aŭ se vi memoris vian originalan pasvorton, kaj vi ne plu volas ŝanĝi
 'passwordreset-emailelement' => 'Salutnomo: $1
 Provizora pasvorto: $2',
 'passwordreset-emailsent' => 'Renovigita pasvorto estis retpoŝte sendita.',
-'passwordreset-emailsent-capture' => 'Retpoŝto kun renovigita pasvorto estis sendita, kiu estas montrata sube.',
+'passwordreset-emailsent-capture' => 'Retpoŝto kun renovigita pasvorto estis sendita, kiu estas montrata malsupre.',
 'passwordreset-emailerror-capture' => 'Retpoŝto kun renovigita pasvorto estis generita, montrata sube, sed sendado al la {{GENDER:$2|uzanto}} malsukcesis: $1',
 
 # Special:ChangeEmail
@@ -934,6 +943,7 @@ Provizora pasvorto: $2',
 'changeemail-cancel' => 'Nuligi',
 
 # Special:ResetTokens
+'resettokens' => 'Renovigi ŝlosilojn',
 'resettokens-no-tokens' => 'Ne estas ŝlosiloj renovigeblaj.',
 'resettokens-legend' => 'Renovigi ŝlosilojn',
 'resettokens-tokens' => 'Ŝlosiloj:',
@@ -947,18 +957,18 @@ Provizora pasvorto: $2',
 'italic_sample' => 'Kursiva teksto',
 'italic_tip' => 'Kursiva teksto',
 'link_sample' => 'Ligtitolo',
-'link_tip' => 'Interna ligo',
+'link_tip' => 'Interna ligilo',
 'extlink_sample' => 'http://www.example.com ligtitolo',
-'extlink_tip' => 'Ekstera ligo (memoru http:// prefikson)',
+'extlink_tip' => 'Ekstera ligilo (memoru http:// prefikson)',
 'headline_sample' => 'Titola teksto',
 'headline_tip' => 'Titololinio je dua nivelo',
-'nowiki_sample' => 'Enigi ne formatitan tekston ĉi tien',
+'nowiki_sample' => 'Enigi ne formatitan tekston ĉi tie',
 'nowiki_tip' => 'Ignori vikiformatadon',
 'image_sample' => 'Ekzemplo.jpg',
-'image_tip' => 'Enŝutita bildo',
+'image_tip' => 'Enigita dosiero',
 'media_sample' => 'Ekzemplo.ogg',
-'media_tip' => 'Ligo al dosiero sona ...',
-'sig_tip' => 'Via subskribo kun tempstampo',
+'media_tip' => 'Ligilo al dosiero',
+'sig_tip' => 'Via subskribo kun tempindiko',
 'hr_tip' => 'Horizontala linio (uzu ŝpareme)',
 
 # Edit pages
@@ -973,7 +983,7 @@ Provizora pasvorto: $2',
 'showdiff' => 'Montri ŝanĝojn',
 'anoneditwarning' => "'''Averto:''' Vi ne estas ensalutinta.
 Via IP-adreso enregistriĝos en la redakta historio de tiu ĉi paĝo.",
-'anonpreviewwarning' => "''Vi ne estas ensalutita. La konservo de la paĝo registros vian IP-adreson en kronologio de ĉi tiu paĝo.''",
+'anonpreviewwarning' => "''Vi ne estas ensalutita. La konservo de la paĝo registros vian IP-adreson en redakta historio de ĉi tiu paĝo.''",
 'missingsummary' => "'''Rememorigilo:''' Vi ne provizis redaktan resumon. Se vi alklakos denove la konservan butonon, via redaktaĵo estos konservita sen resumo.",
 'missingcommenttext' => 'Bonvolu entajpi komenton malsupre.',
 'missingcommentheader' => "'''Atenton:''' Vi ne provizis temon aŭ subtitolon por ĉi tiu komento.
@@ -992,7 +1002,7 @@ La skribita kialo estas ''$2''.
 
 Vi rajtas kontakti $1 aŭ alian [[{{MediaWiki:Grouppage-sysop}}|administranton]] por pridiskuti la forbaradon.
 Vi ne povas uzi la 'retpoŝtan' funkcion, escepte se vi indikis validan retpoŝtan adreson en viaj [[Special:Preferences|kontaj agordoj]] kaj vi ne estas blokita uzi ĝin.
-Via IP-adreso estas $3 kaj la ID de la forbarado ests $5.
+Via IP-adreso estas $3 kaj la ID de la forbarado estas $5.
 Bonvolu mencii jenajn indikojn en viaj ĉi-temaj kontaktoj.",
 'autoblockedtext' => 'Via IP-adreso estas aŭtomate forbarita, ĉar uzis ĝin alia uzanto, kiun baris $1.
 La donita kialo estas:
@@ -1023,7 +1033,7 @@ Bonvolu inkluzivi tiujn detalojn en iuj ajn demandoj kiun vi farus.',
 
 La pasvorto por ĉi tiu nova konto povas esti ŝanĝita en la paĝo ''[[Special:ChangePassword|ŝanĝi pasvorton]]'' dum ensalutado.",
 'newarticle' => '(Nova)',
-'newarticletext' => 'Vi sekvis ligilon al paĝo ankoraŭ ne ekzistanta. Se vi volas krei ĝin, ektajpu sube (vidu la [[{{MediaWiki:Helppage}}|helpopaĝon]] por klarigoj.) Se vi malintence alvenis ĉi tien, simple alklaku la retrobutonon de via retumilo.',
+'newarticletext' => 'Vi sekvis ligilon al paĝo ankoraŭ ne ekzistanta. Se vi volas krei ĝin, ektajpu malsupre (vidu la [[{{MediaWiki:Helppage}}|helpopaĝon]] por klarigoj.) Se vi malintence alvenis ĉi tien, simple alklaku la retrobutonon de via retumilo.',
 'anontalkpagetext' => "---- ''Jen diskutopaĝo por anonima kontribuanto kiu ne jam kreis konton aŭ ne uzas ĝin.
 Ni tial devas uzi la cifran IP-adreson por identigi lin/ŝin.
 Ĉi tia IP-adreso povas esti uzata de pluraj uzantoj.
@@ -1037,8 +1047,8 @@ Vi povas [[Special:Search/{{PAGENAME}}|serĉi ĉi tiun paĝan titolon]] en aliaj
 aŭ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serĉi la rilatajn protokolojn]</span>, sed vi ne rajtas krei ĉi tiun paĝon.',
 'missing-revision' => 'La revizio n-ro $1 de la paĝo nomata "{{PAGENAME}}" ne ekzistas.
 
-La kutima kaŭzo estas sekvi malaktualan historio-ligilon al paĝo forviŝita.
-Detaloj troveblos en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de forviŝoj].',
+Tio kutime estas kaŭzata per sekvado de malaktuala historio-ligilo al paĝo forigita.
+Detaloj troveblos en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de forigoj].',
 'userpage-userdoesnotexist' => 'Uzantokonto "<nowiki>$1</nowiki>" ne estas registrita. Bonvolu konfirmi se vi volas krei/redakti ĉi tiun paĝon.',
 'userpage-userdoesnotexist-view' => 'Uzanto-konto "$1" ne estas registrita.',
 'blocked-notice-logextract' => 'Ĉi tiu uzanto estas ĉi-momente forbarita.
@@ -1049,10 +1059,10 @@ La lasta protokolero estas jene montrata por via referenco:',
 * '''Interreta Esplorilo''': Premu ''Stir'' klakante ''Refreŝu'', aŭ premu ''Stir-F5'' 
 * '''Opera:''' Nuligi la kaŝmemoro en ''Iloj → Preferoj''",
 'usercssyoucanpreview' => "'''Konsileto:''' Uzu la butonon \"Antaŭrigardi\" por provi vian novan CSS-kodon antaŭ konservado.",
-'userjsyoucanpreview' => "'''Konsileto:''' Uzu la butonon \"{{int:showpreview}}\" por provi vian novan JS-kodon antaŭ konservado.",
+'userjsyoucanpreview' => "'''Konsileto:''' Uzu la butonon \"{{int:showpreview}}\" por provi vian novan Ĝavaskriptan kodon antaŭ konservado.",
 'usercsspreview' => "'''Notu ke vi nur antaŭvidas vian uzanto-CSS.
 Ĝi ne jam estis konservita!'''",
-'userjspreview' => "'''Memoru ke vi nun nur provas kaj antaŭrigardas vian uzantan javaskripton, ĝi ne estas jam konservita'''",
+'userjspreview' => "'''Memoru ke vi nun nur provas kaj antaŭrigardas vian uzantan Ĝavaskripton, ĝi ne estas jam konservita'''",
 'sitecsspreview' => "'''Konsciu ke vi nur antaŭrigardas tiun ĉi CSS.'''
 '''Ĝi ne jam estis savita!''",
 'sitejspreview' => "'''Konsciu ke vi nur antaŭrigardas tiun ĉi Ĝavaskripta kodon''. ''Ĝi ne jam estis konservita''.",
@@ -1068,15 +1078,15 @@ kiel ĝi aperos se vi elektos konservi la paĝon.',
 'session_fail_preview' => "'''Ni ne povas procezi vian redakton pro perdo de seancaj datenoj.
 Bonvolu reprovi.
 Se ankoraŭ ne funkcios, provu [[Special:UserLogout|elsaluti]] kaj reensaluti.'''",
-'session_fail_preview_html' => "'''Bedaŭrinde, ne povas trakti vian redakton pro manko de seancaj datenoj.'''
+'session_fail_preview_html' => "'''Bedaŭrinde, ni ne povas trakti vian redakton pro manko de seancaj datenoj.'''
 
-''Ĉar {{SITENAME}} ebligas krudan HTML-kodon, ĉi tiu antaŭrigardo estas kaŝita kiel prevento kontraŭ Javascript-atakoj.''
+''Ĉar {{SITENAME}} ebligas krudan HTML-kodon, ĉi tiu antaŭrigardo estas kaŝita kiel prevento kontraŭ Ĝavaskriptaj atakoj.''
 
 '''Se ĉi tiu estas taŭga provo por redakti, bonvolu reprovi.'''
 Se ankoraŭ ne funkcias, provu [[Special:UserLogout|elsaluti]] kaj reensaluti.",
-'token_suffix_mismatch' => "'''Via redakto estis malpermesita ĉar via klienta fuŝis la interpunkcio en la redakto-signo.
-La redakto estis malpermesita por preventi koruptado de la teksto de la paĝo.
-Ĉi tiel malofte okazas kiam vi uzas fuŝan TTT-an anoniman prokurilon.'''",
+'token_suffix_mismatch' => "'''Via redakto estis malpermesita ĉar via kliento fuŝis la interpunkcion en la redakto-signo.
+La redakto estis malpermesita por preventi koruptadon de la teksto de la paĝo.
+Ĉi tio kelkfoje okazas, kiam vi uzas fuŝan retbazan anoniman prokuran servon.'''",
 'edit_form_incomplete' => "'''Kelkaj partoj de la redaktada formo ne atingis la servilon; rekontrolu ke via redakto estas ĝusta kaj reprovu.'''",
 'editing' => 'Redaktado de $1',
 'creating' => 'Kreado de $1',
@@ -1097,7 +1107,7 @@ Se vi konservos vian redakton, ĉiuj ŝanĝoj faritaj post tiu versio perdiĝos.
 'copyrightwarning' => "Bonvolu noti, ke ĉiu kontribuaĵo al la {{SITENAME}} estu rigardata kiel eldonita laŭ \$2 (vidu je \$1). Se vi volas, ke via verkaĵo ne estu redaktota senkompate kaj disvastigota laŭvole, ne alklaku \"Konservi\".<br />
 Vi ankaŭ ĵuras, ke vi mem verkis la tekston, aŭ ke vi kopiis ĝin el fonto senkopirajta.
 '''NE UZU AŬTORRAJTE PROTEKTATAJN VERKOJN SENPERMESE!'''",
-'copyrightwarning2' => "Bonvolu noti ke ĉiuj kontribuoj al {{SITENAME}} povas esti reredaktita, ŝanĝita aŭ forigita de aliaj kontribuantoj. Se vi ne deziras ke viaj verkoj estu senkompate reredaktitaj, ne publikigu ilin ĉi tie.<br />
+'copyrightwarning2' => "Bonvolu noti ke ĉiuj kontribuoj al {{SITENAME}} povas esti reredaktitaj, ŝanĝitaj aŭ forigitaj de aliaj kontribuantoj. Se vi ne deziras, ke viaj verkoj estu senkompate reredaktitaj, ne publikigu ilin ĉi tie.<br />
 Vi ankaŭ promesu al ni ke vi verkis tion mem aŭ kopiis el publika domajno aŭ simila libera fonto (vidu $1 por detaloj).
 '''NE PROPONU KOPIRAJTITAJN VERKOJN SEN PERMESO!'''",
 'longpageerror' => "'''Eraro: La teksto, kiun vi prezentis, longas {{PLURAL:$1|$1 kilobajton|$1 kilobajtojn}}, kio estas pli longa ol la maksimumo de {{PLURAL:$2|$2 kilobajto|$2 kilobajtoj}}.'''
@@ -1113,9 +1123,9 @@ Jen la lasta protokolero por via referenco:",
 'cascadeprotectedwarning' => "'''Averto:''' Ĉi tiu paĝo estas ŝlosita tiel ke nur uzantoj kun administrantaj privilegioj povas redakti ĝin, ĉar ĝi estas inkludita en la {{PLURAL:$1|sekvan kaskade protektitan paĝon|sekvajn kaskade protektitajn paĝojn}}:",
 'titleprotectedwarning' => "'''Averto: Ĉi tiu paĝo estis ŝlosita tial nur [[Special:ListGroupRights|specifaj rajtoj]] estas bezonaj por krei ĝin.'''
 Jen la lasta protokolero por via referenco:",
-'templatesused' => '{{PLURAL:$1|Ŝablono uzataj|Ŝablonoj uzataj}} en ĉi tiu paĝo:',
+'templatesused' => '{{PLURAL:$1|Ŝablono uzata|Ŝablonoj uzataj}} en ĉi tiu paĝo:',
 'templatesusedpreview' => '{{PLURAL:$1|Ŝablono uzata|Ŝablonoj uzataj}} en ĉi tiu antaŭrigardo:',
-'templatesusedsection' => '{{PLURAL:$1|Ŝablono uzata|Ŝablonojuzataj}} en ĉi tiu sekcio:',
+'templatesusedsection' => '{{PLURAL:$1|Ŝablono uzata|Ŝablonoj uzataj}} en ĉi tiu sekcio:',
 'template-protected' => '(protektita)',
 'template-semiprotected' => '(duone protektita)',
 'hiddencategories' => 'Ĉi tiu paĝo estas membro de {{PLURAL:$1|1 kaŝita kategorio|$1 kaŝitaj kategorioj}}:',
@@ -1134,7 +1144,7 @@ Jen la protokolo de forigoj kaj alinomigado por via oportuno:",
 'moveddeleted-notice' => 'Ĉi tiu paĝo estis forigita.
 Jen la protokolo pri forigado kaj alinomigado por via referenco.',
 'log-fulllog' => 'Vidi kompletan protokolon',
-'edit-hook-aborted' => 'Redakto ĉesigis per hoko.
+'edit-hook-aborted' => 'Redakto estis ĉesigita per etendaĵo de la Vikia softvaro.
 Ĝi ne donis eksplikon.',
 'edit-gone-missing' => 'Ne eblis ĝisdatigi la paĝon.
 Verŝajne ĝi estis forigita.',
@@ -1148,7 +1158,7 @@ Verŝajne ĝi estis forigita.',
 'invalid-content-data' => 'Enhavo estas malvalida',
 'content-not-allowed-here' => 'Enhavo de $1 ne estas permesita en paĝo [[$2]]',
 'editwarning-warning' => 'Forlaso de ĉi tiu paĝo kaŭzos al vi perdi iun ajn ŝanĝojn kiujn vi faris.
-Se vi ensalutas, vi povas malŝalti ĉi tiun averton en la sekcio "{{int:prefs-editing}}" de viaj preferoj.',
+Se vi estas ensalutinta, vi povas malŝalti ĉi tiun averton en la sekcio "{{int:prefs-editing}}" de viaj preferoj.',
 
 # Content models
 'content-model-wikitext' => 'vikiteksto',
@@ -1164,11 +1174,11 @@ Se vi ensalutas, vi povas malŝalti ĉi tiun averton en la sekcio "{{int:prefs-e
 'post-expand-template-inclusion-warning' => 'Averto: Inkluziva pezo de ŝablonoj estas tro granda.
 Iuj ŝablonoj ne estos inkluzivitaj.',
 'post-expand-template-inclusion-category' => 'Paĝoj kie inkluziva pezo de ŝablonoj estas tro granda.',
-'post-expand-template-argument-warning' => 'Averto: Ĉit tiu paĝo enhavas almenaŭ unu ŝablonan argumenton kiu havas tro grandan etendan pezon.
+'post-expand-template-argument-warning' => 'Averto: Ĉi tiu paĝo enhavas almenaŭ unu ŝablonan argumenton, kiu havas tro grandan etendan pezon.
 Ĉi tiuj argumentoj estis forlasitaj.',
 'post-expand-template-argument-category' => 'Paĝoj enhavantaj forlasitajn argumentojn de ŝablonoj',
 'parser-template-loop-warning' => 'Rekursiva ŝablono estis trovita: [[$1]]',
-'parser-template-recursion-depth-warning' => 'Limo de ŝablona profundeco pligrandiĝis ($1)',
+'parser-template-recursion-depth-warning' => 'Ŝablona profundeco transpasis limon ($1)',
 'language-converter-depth-warning' => 'Profundo de lingvo-konvertilo preterpasis limon ($1)',
 'node-count-exceeded-category' => 'Paĝoj kie la nombro da nodoj estas preterpasita',
 'node-count-exceeded-warning' => 'Paĝo preterpasis la nombron da nodoj.',
@@ -1180,9 +1190,9 @@ Iuj ŝablonoj ne estos inkluzivitaj.',
 
 # "Undo" feature
 'undo-success' => 'La redakto estas malfarebla.
-Bonvolu konfirmi la jenan komparaĵon por verigi ĉi tiel vi volas, kaj konservi la ŝanĝojn suben fini malfarante la redakton.',
+Bonvolu kontroli la jenan komparaĵon por certiĝi ĉu tio estas tio, kion vi volas, kaj konservi la ŝanĝojn malsupre por fine malfari la redakton.',
 'undo-failure' => 'Ne povis nuligi redakton pro konfliktaj intermezaj redaktoj.',
-'undo-norev' => 'La redakto ne eblis esti malfarita ĉar ĝi aŭ ne ekzistas aŭ estis forigita.',
+'undo-norev' => 'La redakto ne povis esti malfarita ĉar ĝi aŭ ne ekzistas aŭ estis forigita.',
 'undo-summary' => 'Nuligis version $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuto]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])',
 'undo-summary-username-hidden' => 'Malfari ŝanĝon $1 de kaŝita uzulo',
 
@@ -1203,13 +1213,13 @@ La kialo donata de $3 estas ''$2''.",
 'nextrevision' => 'Sekva versio →',
 'currentrevisionlink' => 'Rigardi nunan version',
 'cur' => 'nuna',
-'next' => 'sekv',
+'next' => 'sekva',
 'last' => 'antaŭa',
 'page_first' => 'unua',
 'page_last' => 'lasta',
 'histlegend' => 'Klarigo: (nuna) = vidu malsamojn kompare kun la nuna versio, (antaŭa) = malsamojn kompare kun la antaŭa versio, <strong>E</strong> = malgranda redakteto',
 'history-fieldset-title' => 'Traserĉi historion',
-'history-show-deleted' => 'Forigitaĵoj nur',
+'history-show-deleted' => 'Nur forigitaĵoj',
 'histfirst' => 'plej malnova',
 'histlast' => 'plej nova',
 'historysize' => '({{PLURAL:$1|1 bajto|$1 bajtoj}})',
@@ -1359,7 +1369,6 @@ Certigu ke ĉi tiu ŝanĝo tenos kontinuecon de la historia paĝo.',
 'showhideselectedversions' => 'Montri/kaŝi elektitajn versiojn',
 'editundo' => 'malfari',
 'diff-empty' => '(Neniu diferenco)',
-'diff-multi' => '({{PLURAL:$1|Unu intermeza versio|$1 intermezaj versioj}} de {{PLURAL:$2|unu uzanto|$2 uzantoj}} ne estas {{PLURAL:$1|montrata|montrataj}}.)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Unu intermeza versio|$1 intermezaj versioj}} de pli ol {{PLURAL:$2|unu uzanto|$2 uzantoj}} ne estas {{PLURAL:$1|montrata|montrataj}}.)',
 'difference-missing-revision' => '{{PLURAL:$2|Unu revizio|$2 revizioj}} de ĉi tiu malsameco ($1) ne {{PLURAL:$2|estis|estis}} trovebla.
 
@@ -1380,7 +1389,7 @@ Detaloj troveblos en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
 'shown-title' => 'Montri {{PLURAL:$1|$1 rezulton|$1 rezultojn}} en paĝo',
 'viewprevnext' => 'Montri ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Estas paĝo nomita \"[[:\$1]]\" en ĉi tiu vikio'''",
-'searchmenu-new' => "'''Krei la paĝon \"[[:\$1]]\" en ĉi tiu vikio!'''",
+'searchmenu-new' => '<strong>Krei la paĝon "[[:$1]]" en ĉi tiu vikio!</strong>{{PLURAL:$2|0=|Vidu ankaŭ la paĝon trovitan per via serĉo.|Vidu ankaŭ la trovitajn serĉrezultojn.}}',
 'searchprofile-articles' => 'Enhavaj paĝoj',
 'searchprofile-project' => 'Paĝoj pri Helpo kaj Projektoj',
 'searchprofile-images' => 'Plurmedio',
@@ -1620,6 +1629,7 @@ indekso pro troŝarĝita servilo. Intertempe, vi povas serĉi per <i>guglo</i> a
 'right-unblockself' => 'Malforbari oni mem',
 'right-protect' => 'Ŝanĝi protektniveloj kaj redakti protektitajn paĝojn',
 'right-editprotected' => 'Redakti protektitajn paĝojn (sen kaskada protektado)',
+'right-editsemiprotected' => 'Redakti paĝojn protektitajn kiel "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Redakti la uzantointerfacon',
 'right-editusercssjs' => 'Redaktu CSS- kaj JS-dosierojn de aliaj uzantoj',
 'right-editusercss' => 'Redaktu CSS-dosierojn de aliaj uzantoj',
@@ -1629,6 +1639,7 @@ indekso pro troŝarĝita servilo. Intertempe, vi povas serĉi per <i>guglo</i> a
 'right-viewmywatchlist' => 'Rigardi vian atentaron',
 'right-viewmyprivateinfo' => 'Vidi viajn proprajn privatajn informojn (ekz. retpoŝtan adreson, veran nomon)',
 'right-editmyprivateinfo' => 'Redakti viajn proprajn privatajn informojn (ekz. retpoŝtan adreson, veran nomon)',
+'right-editmyoptions' => 'Redakti proprajn preferojn',
 'right-rollback' => 'Tuj malfari la redaktojn de la lasta uzanto kiu redaktis specifan paĝon',
 'right-markbotedits' => 'Marki restarigitajn redaktojn kiel robotajn redaktojn',
 'right-noratelimit' => 'Ne influita de po-limoj',
@@ -1697,6 +1708,7 @@ indekso pro troŝarĝita servilo. Intertempe, vi povas serĉi per <i>guglo</i> a
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|ŝanĝo|ŝanĝoj}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|ekde lasta vizito}}',
 'enhancedrc-history' => 'historio',
 'recentchanges' => 'Lastaj ŝanĝoj',
 'recentchanges-legend' => 'Opcioj pri lastaj ŝanĝoj',
@@ -1991,6 +2003,8 @@ Kiam oni filtras ĝin laŭ uzanto, nur la aktuala versio de la dosiero estos mon
 'listfiles_size' => 'Grandeco',
 'listfiles_description' => 'Priskribo',
 'listfiles_count' => 'Versioj',
+'listfiles-show-all' => 'Inkluzivi malaktualajn versiojn de bildoj',
+'listfiles-latestversion' => 'Nuna versio',
 'listfiles-latestversion-yes' => 'Jes',
 'listfiles-latestversion-no' => 'Ne',
 
@@ -2088,6 +2102,13 @@ Bonvolu kontroli aliajn ligilojn al la ŝablonoj antaŭ ol forigi ilin.',
 'randompage' => 'Hazarda paĝo',
 'randompage-nopages' => 'Ne ekzistas paĝoj en la {{PLURAL:$2|nomspaco|nomspacoj}}: "$1".',
 
+# Random page in category
+'randomincategory' => 'Hazarda paĝo en kategorio',
+'randomincategory-invalidcategory' => '"$1" ne estas valida kategoria nomo.',
+'randomincategory-nopages' => 'Ne estas paĝoj en la kategorio [[:Category:$1|$1]].',
+'randomincategory-selectcategory' => 'Iri al hazarda paĝo el kategorio: $1 $2.$1',
+'randomincategory-selectcategory-submit' => 'Ek!',
+
 # Random redirect
 'randomredirect' => 'Hazarda alidirekto',
 'randomredirect-nopages' => 'Estas neniuj alidirektiloj en la nomspaco "$1".',
@@ -2115,6 +2136,7 @@ Bonvolu kontroli aliajn ligilojn al la ŝablonoj antaŭ ol forigi ilin.',
 
 'pageswithprop' => 'Paĝoj kun paĝa atributo',
 'pageswithprop-legend' => 'Paĝoj kun paĝa atributo',
+'pageswithprop-text' => 'Ĉi tiu paĝo listigas paĝoj kiu uzas iajn paĝajn ecojn.',
 'pageswithprop-prop' => 'Nomo de la atributo:',
 'pageswithprop-submit' => 'Ek',
 
@@ -2182,6 +2204,11 @@ Bonvolu kontroli aliajn ligilojn al la ŝablonoj antaŭ ol forigi ilin.',
 'protectedpages-indef' => 'Nur ĉiamaj protektaĵoj',
 'protectedpages-cascade' => 'Nur kaskadaj protektoj',
 'protectedpagesempty' => 'Neniuj paĝoj estas momente protektitaj kun ĉi tiuj parametroj.',
+'protectedpages-timestamp' => 'Tempindiko',
+'protectedpages-page' => 'Paĝo',
+'protectedpages-reason' => 'Kialo',
+'protectedpages-unknown-timestamp' => 'Nekonata',
+'protectedpages-unknown-performer' => 'Nekonata uzanto',
 'protectedtitles' => 'Protektitaj titoloj',
 'protectedtitlesempty' => 'Neniuj titoloj estas nune protektitaj kun ĉi parametroj.',
 'listusers' => 'Uzantaro',
@@ -2367,6 +2394,7 @@ La retadreso kiun vi enigis en [[Special:Preferences|viaj preferoj]] aperos kiel
 'watchmethod-list' => 'traserĉas priatentitajn',
 'watchlistcontains' => 'Via atentaro enhavas $1 {{PLURAL:$1|paĝon|paĝojn}}.',
 'iteminvalidname' => 'Ia eraro pri "$1", nevalida titolo...',
+'wlnote2' => 'Malsupre estas la ŝanĝoj en la {{PLURAL:$1|lasta horo|lastaj <strong>$1</strong> horoj}}, ekde $2, $3.',
 'wlshowlast' => 'Montri el lastaj $1 horoj $2 tagoj $3',
 'watchlist-options' => 'Opcioj por atentaro',
 
@@ -2728,7 +2756,7 @@ forbarita IP-adreso/nomo la povon enskribi en la vikio.',
 'change-blocklink' => 'ŝanĝi forbaron',
 'contribslink' => 'kontribuoj',
 'emaillink' => 'sendi retpoŝton',
-'autoblocker' => 'Aŭtomate forbarita ĉar via IP-adreso estis lastatempe uzita de "[[User:$1|$1]]".
+'autoblocker' => 'Aŭtomate forbarita, ĉar via IP-adreso estis lastatempe uzita de "[[User:$1|$1]]".
 La kialo donita por la forbaro de $1 estis: "$2"',
 'blocklogpage' => 'Protokolo pri forbaroj',
 'blocklog-showlog' => 'Ĉi tiu uzanto estis forbarita antaŭe. Jen la forbara protokolo por referenco:',
@@ -2747,7 +2775,7 @@ La kialo donita por la forbaro de $1 estis: "$2"',
 'range_block_disabled' => 'La ebleco de administranto krei forbaritajn intervalojn da IP-adresoj estas malebligita.',
 'ipb_expiry_invalid' => 'Nevalida blokdaŭro.',
 'ipb_expiry_temp' => 'Kaŝitaj salutnomaj blokoj estu daŭraj.',
-'ipb_hide_invalid' => 'Ne povas subpremi ĉi tiun konton; ĝi eble havas tro multajn redaktojn.',
+'ipb_hide_invalid' => 'Ne povas subpremi ĉi tiun konton; ĝi havas {{PLURAL:$1|unu redakton|$1 redaktojn}}.',
 'ipb_already_blocked' => '"$1" estas jam forbarita',
 'ipb-needreblock' => '$1 estas jam forbarita. Ĉu vi volas ŝanĝi la opciojn?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Alia forbaro|Aliaj forbaroj}}',
@@ -2925,6 +2953,8 @@ se vi volus kontribui al la komuna MediaWiki-asimilado.',
 'thumbnail-more' => 'Pligrandigi',
 'filemissing' => 'Mankanta dosiero',
 'thumbnail_error' => 'Okazis eraro ĉe kreado de antaŭvida bildeto: $1',
+'thumbnail_error_remote' => 'Eraro-mesaĝo de $1:
+$2',
 'djvu_page_error' => 'DjVu-a paĝo el intervalo',
 'djvu_no_xml' => 'Ne povas akiri XML por DjVu dosiero',
 'thumbnail-temp-create' => 'Ne povas krei provizoran bildetan dosieron',
@@ -2968,7 +2998,7 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 'importuploaderrortemp' => 'Alŝutigo de import-dosiero malsukcesis. Labor-dosierujo ne estas trovita.',
 'import-parse-failure' => 'sintaksa fuŝo de XML-importo',
 'import-noarticle' => 'Neniu paĝo por importi!',
-'import-nonewrevisions' => 'Ĉiuj versioj estis antaŭe importitaj.',
+'import-nonewrevisions' => 'Neniuj versioj estis antaŭe importitaj. Aŭ ili ĉiuj jam ekzistis aŭ estis ellasitaj pro eraroj.',
 'xml-error-string' => '$1 ĉe linio $2, kolumno $3 (bitiko $4): $5',
 'import-upload' => 'Alŝuti XML-datenojn',
 'import-token-mismatch' => 'Seancaj datenoj perdiĝis. Bonvolu reprovi.',
@@ -3068,6 +3098,7 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 'tooltip-undo' => '"Malfari" malfaris ĉi tiun redakton kaj malfermas la redakto-paĝon en antaŭvida reĝimo. Permesas aldoni kialon en la resumo.',
 'tooltip-preferences-save' => 'Konservi preferojn',
 'tooltip-summary' => 'Enigu mallongan resumon',
+'interlanguage-link-title' => '$1 — $2',
 
 # Stylesheets
 'common.css' => '/* La jena CSS influos la aspekton de ĉiaj temoj. */',
@@ -3152,6 +3183,7 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 'pageinfo-magic-words' => '{{PLURAL:$1|Magia vorto|Magiaj vortoj}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Kaŝita kategorio|Kaŝitaj kategorioj}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Inkluzivita ŝablono|Inkluzivitaj ŝablonoj}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Paĝo transinkluzivita|Paĝoj transinkluzivitaj}} en ($1)',
 'pageinfo-toolboxlink' => 'Informoj pri la paĝo',
 'pageinfo-redirectsto' => 'Alidirektas al',
 'pageinfo-redirectsto-info' => 'Informo',
@@ -3255,6 +3287,14 @@ $1',
 'hours-ago' => 'antaŭ $1 {{PLURAL:$1|horo|horoj}}',
 'minutes-ago' => 'antaŭ $1 {{PLURAL:$1|minuto|minutoj}}',
 'seconds-ago' => 'antaŭ $1 {{PLURAL:$1|sekundo|sekundoj}}',
+'monday-at' => 'Lundo je $1',
+'tuesday-at' => 'Mardo je $1',
+'wednesday-at' => 'Merkredo je $1',
+'thursday-at' => 'Ĵaŭdo je $1',
+'friday-at' => 'Vendredo je $1',
+'saturday-at' => 'Sabato je $1',
+'sunday-at' => 'Dimanĉo je $1',
+'yesterday-at' => 'Hieraŭ je $1',
 
 # Bad image list
 'bad_image_list' => 'La formato estas jen:
@@ -3911,6 +3951,7 @@ Vi povas ankaŭ [[Special:EditWatchlist|redakti norme]].',
 'version-license' => 'Permesilo de MediaWiki',
 'version-poweredby-credits' => "Ĉi tiu vikio funkcias per '''[https://www.mediawiki.org/ MediaWiki]''', aŭtorrajto ©&thinsp;2001–$1 $2.",
 'version-poweredby-others' => 'aliaj',
+'version-poweredby-translators' => 'tradukantoj de translatewiki.net',
 'version-credits-summary' => 'Ni ŝatus agnoski la sekvajn personojn pro siaj kontribuoj al [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki estas libera programaro. Vi povas redistribui ĝin kaj/aŭ modifi ĝin sub la kondiĉoj de la GNU General Public Licens (GNU Ĝenerala Publika Permesilo) en ties eldono de la Free Software Foundation (Libera Softvara Fondaĵo) - aŭ versio 2 de la Permesilo, aŭ (laŭ via elekto) iu ajn posta versio.
 
@@ -3926,6 +3967,12 @@ Oni devis doni al vi [{{SERVER}}{{SCRIPTPATH}}/COPYING ekzempleron de la GNU Gen
 
 # Special:Redirect
 'redirect-submit' => 'Ek',
+'redirect-lookup' => 'Traserĉi:',
+'redirect-value' => 'Valoro:',
+'redirect-user' => 'Salutnomo',
+'redirect-revision' => 'Revizio de la paĝo',
+'redirect-file' => 'Dosiernomo',
+'redirect-not-exists' => 'Valoro ne trovita',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Serĉu duplikatajn dosierojn',
@@ -3973,12 +4020,16 @@ Oni devis doni al vi [{{SERVER}}{{SCRIPTPATH}}/COPYING ekzempleron de la GNU Gen
 'tags' => 'Validaj ŝanĝaj etikedoj',
 'tag-filter' => '[[Special:Tags|Etikeda]] filtrilo:',
 'tag-filter-submit' => 'Filtrilo',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etikedo|Etikedoj}}]]: $2)',
 'tags-title' => 'Etikedoj',
 'tags-intro' => 'Ĉi tiu paĝo montras la etikedojn kun kiuj la programaro markus redakton, kaj iliaj signifoj.',
 'tags-tag' => 'Etikeda nomo',
 'tags-display-header' => 'Aspekto en ŝanĝaj listoj',
 'tags-description-header' => 'Plena priskribo pri signifo',
+'tags-active-header' => 'Aktiva',
 'tags-hitcount-header' => 'Markitaj ŝanĝoj',
+'tags-active-yes' => 'Jes',
+'tags-active-no' => 'Ne',
 'tags-edit' => 'redakti',
 'tags-hitcount' => '$1 {{PLURAL:$1|ŝanĝo|ŝanĝoj}}',
 
@@ -3997,7 +4048,8 @@ Oni devis doni al vi [{{SERVER}}{{SCRIPTPATH}}/COPYING ekzempleron de la GNU Gen
 'dberr-header' => 'Ĉi tiu vikio havas problemon',
 'dberr-problems' => 'Bedaŭrinde, ĉi tiu retejo suferas pro teknikaj problemoj.',
 'dberr-again' => 'Bonvolu atendi kelkajn minutojn kaj reŝargi.',
-'dberr-info' => '(Ne povas kontakti la datenbazan servilon: $1)',
+'dberr-info' => '(Ne eblas kontakti la datenbazan servilon: $1)',
+'dberr-info-hidden' => '(Ne eblas kontakti la datenbazan servilon)',
 'dberr-usegoogle' => 'Vi povas serĉi Guglon dume.',
 'dberr-outofdate' => 'Notu ke iliaj indeksoj de nia enhavo eble ne estas ĝisdatigaj.',
 'dberr-cachederror' => 'Jen kaŝmemorigita kopio de la petita paĝo, kaj eble ne estas ĝisdatigita.',
@@ -4015,6 +4067,7 @@ Oni devis doni al vi [{{SERVER}}{{SCRIPTPATH}}/COPYING ekzempleron de la GNU Gen
 'htmlform-selectorother-other' => 'Alia',
 'htmlform-no' => 'Ne',
 'htmlform-yes' => 'Jes',
+'htmlform-chosen-placeholder' => 'Elektu opcion',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 kun tut-teksta subteno',
@@ -4129,6 +4182,15 @@ Aŭ vi povas uzi la facilan formularon sube. Via komento estos aldonita al la pa
 'duration-centuries' => '$1 {{PLURAL:$1|jarcento|jarcentoj}}',
 'duration-millennia' => '$1 {{PLURAL:$1|jarmilo|jarmiloj}}',
 
+# Image rotation
+'rotate-comment' => 'Bildo pivotita $1 {{PLURAL:$1|gradon|gradojn}} dekstren',
+
+# Limit report
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekundo|sekundoj}}',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekundo|sekundoj}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bitoko|bitokoj}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bitoko|bitokoj}}',
+
 # Special:ExpandTemplates
 'expandtemplates' => 'Ampleksigi ŝablonojn',
 'expand_templates_intro' => 'Ĉi tiu speciala paĝo traktas tekston kaj ampleksigas ĉiujn ŝablonojn en ĝi rekursie.
@@ -4145,4 +4207,6 @@ Aŭ vi povas uzi la facilan formularon sube. Via komento estos aldonita al la pa
 'expand_templates_generate_xml' => 'Montri XML-sintaksarbon',
 'expand_templates_preview' => 'Antaŭrigardo',
 
+# Unknown messages
+'uploadinvalidxml' => 'Ne eblas interpreti la XML-sintakson en la alŝutita dosiero',
 );
index 415328a..7dcca1a 100644 (file)
@@ -387,7 +387,6 @@ $linkTrail = '/^([a-záéíóúñ]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Subrayar los enlaces:',
-'tog-justify' => 'Justificar los párrafos',
 'tog-hideminor' => 'Ocultar las ediciones menores en los cambios recientes',
 'tog-hidepatrolled' => 'Ocultar las ediciones patrulladas en los cambios recientes',
 'tog-newpageshidepatrolled' => 'Ocultar las páginas patrulladas de la lista de páginas nuevas',
@@ -550,7 +549,6 @@ $messages = array(
 'vector-action-protect' => 'Proteger',
 'vector-action-undelete' => 'Restaurar',
 'vector-action-unprotect' => 'Cambiar protección',
-'vector-simplesearch-preference' => 'Activar la barra de búsqueda simplificada (sólo con la apariencia Vector)',
 'vector-view-create' => 'Crear',
 'vector-view-edit' => 'Editar',
 'vector-view-history' => 'Ver historial',
@@ -1221,8 +1219,8 @@ Ya existe.',
 'content-failed-to-parse' => 'No se pudo analizar el contenido $2 del modelo $1: $3',
 'invalid-content-data' => 'Datos de contenido inválidos',
 'content-not-allowed-here' => 'El contenido "$1" no está permitido en la página [[$2]]',
-'editwarning-warning' => 'Si abandonas esta página perderás tus cambios.
-Si estás identificado, puedes deshabilitar esta advertencia en la sección "Edición" de tus preferencias.',
+'editwarning-warning' => 'Se perderán los cambios si se cierra esta página.
+Si has iniciado sesión, puedes desactivar este aviso en la sección «{{int:prefs-editing}}» de las preferencias.',
 'editpage-notsupportedcontentformat-title' => 'Formato de contenido no admitido',
 'editpage-notsupportedcontentformat-text' => 'El formato de contenido $1 no es compatible con el modelo de contenido  $2.',
 
@@ -1258,6 +1256,7 @@ Ese o esos parámetros han sido omitidos.',
 'undo-success' => 'La edición puede deshacerse. Antes de deshacer la edición, comprueba la siguiente comparación para verificar que realmente es lo que quieres hacer, y entonces guarda los cambios para así deshacer la edición.',
 'undo-failure' => 'No se puede deshacer la edición ya que otro usuario ha realizado una edición intermedia.',
 'undo-norev' => 'La edición no puede ser deshecha porque no existe o ha sido borrada.',
+'undo-nochange' => 'Parece que ya se ha deshecho la modificación.',
 'undo-summary' => 'Deshecha la revisión $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc.]])',
 'undo-summary-username-hidden' => 'Deshacer revisión $1 por usuario oculto',
 
@@ -1439,7 +1438,7 @@ Nota que usar los enlaces de navegación borrará las selecciones de esta column
 'showhideselectedversions' => 'Mostrar/ocultar versiones seleccionadas',
 'editundo' => 'deshacer',
 'diff-empty' => '(Sin diferencias)',
-'diff-multi' => '(No se {{PLURAL:$1|muestra una edición intermedia realizada|muestran $1 ediciones intermedias realizadas}} por {{PLURAL:$2|un usuario|$2 usuarios}})',
+'diff-multi-sameuser' => '({{PLURAL:$1|Una revisión intermedia|$1 revisiones intermedias}} por el mismo usuario no mostrado)',
 'diff-multi-manyusers' => '(No se {{PLURAL:$1|muestra una edición intermedia|muestran $1 ediciones intermedias}} de {{PLURAL:$2|un usuario|$2 usuarios}})',
 'difference-missing-revision' => 'No {{PLURAL:$2|se ha encontrado|se han encontrado}} {{PLURAL:$2|una revisión|$2 revisiones}} de esta diferencia ($1).
 
@@ -1460,7 +1459,7 @@ Los detalles pueden encontrarse en el [{{fullurl:{{#Special:Log}}/delete|page={{
 'shown-title' => 'Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página',
 'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Hay una página llamada \"[[:\$1]]\" en esta wiki.'''",
-'searchmenu-new' => "'''¡Crea la página «[[:$1]]» en este wiki!'''",
+'searchmenu-new' => '<strong>Crear la página «[[:$1]]» en este wiki.</strong> {{PLURAL:$2|0=|Véase también la página encontrada con la búsqueda.|Véanse también los resultados de la búsqueda.}}',
 'searchprofile-articles' => 'Páginas de contenido',
 'searchprofile-project' => 'Páginas de ayuda y de proyecto',
 'searchprofile-images' => 'Multimedia',
@@ -2491,6 +2490,7 @@ La dirección de correo electrónico que indicaste en [[Special:Preferences|tus
 'watchmethod-list' => 'revisando las páginas vigiladas en busca de cambios recientes',
 'watchlistcontains' => 'Tu lista de seguimiento posee $1 {{PLURAL:$1|página|páginas}}.',
 'iteminvalidname' => "Problema con el artículo '$1', nombre inválido...",
+'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.',
 'wlshowlast' => 'Ver los cambios de las últimas $1 horas, $2 días  $3',
 'watchlist-options' => 'Opciones de la lista de seguimiento',
 
@@ -2854,7 +2854,8 @@ Véase la [[Special:BlockList|lista de bloqueos]] para revisarlo.',
 'change-blocklink' => 'cambiar bloqueo',
 'contribslink' => 'contribuciones',
 'emaillink' => 'enviar correo electrónico',
-'autoblocker' => 'Has sido bloqueado automáticamente porque tu dirección IP ha sido usada recientemente por «[[User:$1|$1]]». La razón dada para bloquear a «[[User:$1|$1]]» fue «$2».',
+'autoblocker' => 'Has sido bloqueado automáticamente porque tu dirección IP ha sido usada recientemente por «[[User:$1|$1]]».
+El motivo por el que se bloqueó a [[User:$1|$1]] es «$2».',
 'blocklogpage' => 'Registro de bloqueos',
 'blocklog-showlog' => 'Este usuario ha sido bloqueado previamente. Debajo se provee el registro de bloqueos para mayor referencia:',
 'blocklog-showsuppresslog' => 'Este usuario ha sido bloqueado y ocultado. Se provee el registro de supresiones para más detalle:',
@@ -3095,7 +3096,7 @@ Se subió sólo parcialmente.',
 No hay un directorio temporal.',
 'import-parse-failure' => 'Error de lectura al importar XML',
 'import-noarticle' => '¡No hay páginas para importar!',
-'import-nonewrevisions' => 'Todas las revisiones fueron previamente importadas.',
+'import-nonewrevisions' => 'Ninguna revisión fue importada (todas ya estaban presentes o fueron omitido debido a errores).',
 'xml-error-string' => '$1 en la línea $2, col $3 (byte $4): $5',
 'import-upload' => 'Subir datos XML',
 'import-token-mismatch' => 'Pérdida de datos de sesión. Por favor, inténtalo de nuevo.',
@@ -4089,7 +4090,7 @@ Has recibido [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Licencia Pública
 #Colocar todos los fragmentos regex arriba de esta línea. Deja esta línea exactamente como está</pre>',
 
 # Special:Tags
-'tags' => 'Cambio de etiquetas válida',
+'tags' => 'Etiquetas de cambios',
 'tag-filter' => 'Filtro de [[Special:Tags|etiquetas]]:',
 'tag-filter-submit' => 'Filtro',
 'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetas}}]]: $2)',
index 6b539e2..417d85e 100644 (file)
@@ -307,7 +307,6 @@ $dateFormats = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Linkide allakriipsutus:',
-'tog-justify' => 'Lõikude rööpjoondus',
 'tog-hideminor' => 'Peida pisiparandused viimastes muudatustes',
 'tog-hidepatrolled' => 'Peida kontrollitud redaktsioonid viimastes muudatustes',
 'tog-newpageshidepatrolled' => 'Peida uute lehtede loendis kontrollitud leheküljed',
@@ -469,7 +468,6 @@ $messages = array(
 'vector-action-protect' => 'Kaitse',
 'vector-action-undelete' => 'Taasta',
 'vector-action-unprotect' => 'Muuda kaitset',
-'vector-simplesearch-preference' => 'Kasuta lihtsustatud otsiriba (ainult Vektori-kujunduses)',
 'vector-view-create' => 'Loo',
 'vector-view-edit' => 'Muuda',
 'vector-view-history' => 'Näita ajalugu',
@@ -1132,7 +1130,7 @@ See on juba olemas.',
 'invalid-content-data' => 'Vigased sisuandmed',
 'content-not-allowed-here' => 'Lehekülg [[$2]] ei või sisaldada $1i.',
 'editwarning-warning' => 'Sellelt leheküljelt lahkumise tõttu võivad tehtud muudatused kaotsi minna.
-Kui oled sisse loginud, saad selle hoiatuse eelistuste alaosas "Toimetamine" keelata.',
+Kui oled sisse loginud, saad selle hoiatuse eelistuste alaosas "{{int:prefs-editing}}" keelata.',
 'editpage-notsupportedcontentformat-title' => 'Sisuvormingu tugi puudub',
 'editpage-notsupportedcontentformat-text' => 'Sisumudelil $2 puudub sisuvormingu $1 tugi.',
 
@@ -1163,6 +1161,7 @@ Need argumendid on välja jäetud.",
 'undo-success' => 'Selle redaktsiooni käigus tehtud muudatusi saab eemaldada. Palun kontrolli allolevat võrdlust veendumaks, et tahad need muudatused tõepoolest eemaldada. Seejärel saad lehekülje salvestada.',
 'undo-failure' => 'Muudatust ei saa vahapeal tehtud redigeerimiste tõttu tühistada.',
 'undo-norev' => 'Muudatust ei saanud tühistada, kuna seda ei ole või see kustutati.',
+'undo-nochange' => 'Paistab, et see muudatus on juba eemaldatud.',
 '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',
 
@@ -1344,7 +1343,8 @@ Pane tähele, et navigeerimislinkide kasutamine lähtestab redaktsioonide valiku
 'showhideselectedversions' => 'Muuda valitud redaktsioonide nähtavust',
 'editundo' => 'eemalda',
 'diff-empty' => '(Erinevus puudub)',
-'diff-multi' => '({{PLURAL:$1|Ühte|$1}} vahepealset {{PLURAL:$2|ühe|$2}} kasutaja redaktsiooni ei näidata.)',
+'diff-multi-sameuser' => '(ei näidata sama kasutaja {{PLURAL:$1|üht|$1}} vahepealset redaktsiooni)',
+'diff-multi-otherusers' => '(ei näidata {{PLURAL:$2|ühe teise|$2}} kasutaja {{PLURAL:$1|üht|$1}} vahepealset redaktsiooni)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Ühte|$1}} vahepealset rohkem kui {{PLURAL:$2|ühe|$2}} kasutaja redaktsiooni ei näidata.)',
 'difference-missing-revision' => 'Selle erinevuste vaate {{PLURAL:$2|üht|$2}} redaktsiooni ($1) ei leitud.
 
@@ -1365,7 +1365,7 @@ Harilikult tähendab see seda, et sind siia juhatanud link on vananenud ja siin
 'shown-title' => 'Näita lehekülje kohta $1 {{PLURAL:$1|tulemus|tulemust}}',
 'viewprevnext' => 'Näita ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Lehekülg pealkirjaga \"[[:\$1]]\" on olemas.'''",
-'searchmenu-new' => "'''Loo lehekülg pealkirjaga \"[[:\$1]]\".'''",
+'searchmenu-new' => '<strong>Loo lehekülg pealkirjaga "[[:$1]]".</strong> {{PLURAL:$2|0=|Vaata ka leitud lehekülge.|Vaata ka leitud otsitulemusi.}}',
 'searchprofile-articles' => 'Sisuleheküljed',
 'searchprofile-project' => 'Abi- ja projektilehed',
 'searchprofile-images' => 'Multimeedia',
@@ -1391,6 +1391,7 @@ Harilikult tähendab see seda, et sind siia juhatanud link on vananenud ja siin
 'searchrelated' => 'seotud',
 'searchall' => 'kõik',
 'showingresults' => "Allpool näidatakse '''{{PLURAL:$1|ühte|$1}}''' tulemust alates '''$2'''. tulemusest.",
+'showingresultsinrange' => 'Allpool näidatakse {{PLURAL:$1|<strong>üht</strong>|<strong>$1</strong>}} tulemust vahemikus <strong>$2</strong>–<strong>$3</strong>.',
 'showingresultsnum' => "Allpool näitame {{PLURAL:$3|'''ühte''' tulemit|'''$3''' tulemit}} alates tulemist #'''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|'''$1''' '''$3'''-st vastest|Vasted '''$1–$2''' '''$3'''-st}} päringule '''$4'''",
 'search-nonefound' => 'Päringule ei leitud vasteid.',
@@ -2190,6 +2191,14 @@ Igal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise 
 'protectedpages-cascade' => 'Ainult kaskaadkaitsega',
 'protectedpages-noredirect' => 'Peida ümbersuunamised',
 'protectedpagesempty' => 'Selliste parameetritega ei ole praegu ühtegi lehekülge kaitstud.',
+'protectedpages-timestamp' => 'Ajatempel',
+'protectedpages-page' => 'Lehekülg',
+'protectedpages-expiry' => 'Aegumistähtaeg',
+'protectedpages-performer' => 'Kaitsja',
+'protectedpages-params' => 'Kaitse parameetrid',
+'protectedpages-reason' => 'Põhjus',
+'protectedpages-unknown-timestamp' => 'Teadmata',
+'protectedpages-unknown-performer' => 'Teadmata kasutaja',
 'protectedtitles' => 'Kaitstud pealkirjad',
 'protectedtitlesempty' => 'Hetkel pole ükski pealkiri kaitstud.',
 'listusers' => 'Kasutajad',
@@ -2376,6 +2385,7 @@ Edasised muudatused sellel leheküljel ja seotud aruteluleheküljel tuuakse ära
 'watchmethod-list' => 'jälgitavate lehekülgede viimased muudatused',
 'watchlistcontains' => 'Sinu jälgimisloendis on $1 {{PLURAL:$1|lehekülg|lehekülge}}.',
 'iteminvalidname' => "Probleem üksusega '$1'. Selle nimes on viga.",
+'wlnote2' => 'Allpool on viimase {{PLURAL:$1|tunni|<strong>$1</strong> tunni}} jooksul tehtud muudatused seisuga $2, $3.',
 'wlshowlast' => 'Näita viimast $1 tundi $2 päeva. $3',
 'watchlist-options' => 'Jälgimisloendi seaded',
 
@@ -2742,7 +2752,8 @@ Kehtivaid blokeeringuid vaata [[Special:BlockList|blokeerimisnimekirjast]].',
 'change-blocklink' => 'muuda blokeeringut',
 'contribslink' => 'kaastöö',
 'emaillink' => 'saada e-kiri',
-'autoblocker' => 'Automaatselt blokeeritud, kuna [[User:$1|$1]] on hiljuti sinu IP-aadressi kasutanud. Põhjus: $2',
+'autoblocker' => 'Automaatselt blokeeritud, kuna [[User:$1|$1]] on hiljuti sinu IP-aadressi kasutanud.
+Põhjus: $2',
 'blocklogpage' => 'Blokeerimislogi',
 'blocklog-showlog' => 'See kasutaja on varem blokeeritud. Allpool on toodud blokeerimislogi sissekanne:',
 'blocklog-showsuppresslog' => 'See kasutaja on varem blokeeritud ja peidetud. Allpool on toodud varjamislogi:',
@@ -2933,6 +2944,7 @@ Kui soovid MediaWiki tarkvara tõlkimises osaleda, siis vaata lehti [https://www
 'allmessages-prefix' => 'Eesliitefilter:',
 'allmessages-language' => 'Keel:',
 'allmessages-filter-submit' => 'Mine',
+'allmessages-filter-translate' => 'Tõlgi',
 
 # Thumbnails
 'thumbnail-more' => 'Suurenda',
@@ -2949,6 +2961,7 @@ $2',
 'thumbnail_image-type' => 'Selline pildi tüüp ei ole toetatav',
 'thumbnail_gd-library' => 'GD teegi häälestus on poolik: funktsioon $1 puudub',
 'thumbnail_image-missing' => 'Fail näib puuduvat: $1',
+'thumbnail_image-failure-limit' => 'Selle pisipildi viimistlemine on hiljuti liiga palju kordi ($1 või rohkem) ebaõnnestunud. Palun proovi hiljem uuesti.',
 
 # Special:Import
 'import' => 'Lehekülgede import',
@@ -2987,7 +3000,7 @@ Fail oli vaid osaliselt üleslaaditud.',
 Puudub ajutine kataloog.',
 'import-parse-failure' => 'Viga XML-i importimisel',
 'import-noarticle' => 'Ühtki lehekülge polnud importida!',
-'import-nonewrevisions' => 'Kõik versioonid on eelnevalt imporditud.',
+'import-nonewrevisions' => 'Ühtegi redaktsiooni ei imporditud (kõik on juba olemas või tõrgete tõttu vahele jäetud).',
 'xml-error-string' => '$1 real $2, tulbas $3 (bait $4): $5',
 'import-upload' => 'Laadi üles XML-andmed',
 'import-token-mismatch' => 'Seansiandmed läksid kaduma.
@@ -2998,6 +3011,7 @@ Palun ürita uuesti.',
 '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-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.',
 'import-rootpage-nosubpage' => 'Juurlehekülje nimeruumis "$1" pole alamleheküljed lubatud.',
index 4522c2e..f717947 100644 (file)
@@ -17,6 +17,7 @@
  * @author Malafaya
  * @author Nemo bis
  * @author Reedy
+ * @author Subi
  * @author Theklan
  * @author Unai Fdz. de Betoño
  * @author Urhixidur
@@ -127,7 +128,6 @@ $separatorTransformTable = array( ',' => '.', '.' => ',' ); /* Bug 15717 */
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Loturak azpimarratu:',
-'tog-justify' => 'Paragrafoak justifikatu',
 'tog-hideminor' => 'Azken aldaketetan aldaketa txikiak ezkutatu',
 'tog-hidepatrolled' => 'Ezkutatu patruilatutako aldaketa azken aldaketetan',
 'tog-newpageshidepatrolled' => 'Ezkutatu patruilatutako orriak, orri-zerrenda berritik',
@@ -289,7 +289,6 @@ $messages = array(
 'vector-action-protect' => 'Babestu',
 'vector-action-undelete' => 'Berreskuratu',
 'vector-action-unprotect' => 'Babesa aldatu',
-'vector-simplesearch-preference' => 'Bilaketa barra sinplifikatua gaitu (Vector itxurarekin bakarrik)',
 'vector-view-create' => 'Sortu',
 'vector-view-edit' => 'Aldatu',
 'vector-view-history' => 'Historia ikusi',
@@ -819,10 +818,10 @@ Baliteke orrialdea begiratzen zenuen bitartean norbaitek ezabatu edo izenburua a
 Bere IP helbidea erabili beharko da beraz identifikatzeko.
 Erabiltzaile batek baino gehiagok IP bera erabil dezakete ordea.
 Erabiltzaile anonimoa bazara eta zurekin zerikusirik ez duten mezuak jasotzen badituzu, mesedez [[Special:UserLogin/signup|Izena eman]] edo [[Special:UserLogin|saioa hasi]] etorkizunean horrelakoak gerta ez daitezen.''",
-'noarticletext' => 'Oraindik ez dago testurik orrialde honetan.
-Beste orrialde batzuetan [[Special:Search/{{PAGENAME}}|bilatu dezakezu izenburu hau]],
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} bilatu lotutako logak],
-edo [{{fullurl:{{FULLPAGENAME}}|action=edit}} berau aldatu ere egin dezakezu]</span>.',
+'noarticletext' => 'Oraindik ez dago testurik orri honetan.
+Edukiz hornitzeko, aukera hauek dituzu: beste orri batzuetan [[Special:Search/{{PAGENAME}}|orri izenburu hau bilatzea]],
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} lotutako logak bilatzea],
+edo [{{fullurl:{{FULLPAGENAME}}|action=edit}} orri hau editatzea]</span>.',
 'noarticletext-nopermission' => 'Une honetan ez dago testurik orrialde honetan.
 Beste orrialdeetan [[Special:Search/{{PAGENAME}}|izenburu hau bilatu dezakezu]],
 edo <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} erlazionatutako erregistroak bilatu]</span>, baina ez duzu orrialde hau sortzeko baimenik.',
@@ -861,7 +860,7 @@ Zure aldaketak ez dira oraindik gorde!",
 Aldaketa ezeztatua izan da testuaren galtzea galarazteko.
 Hau batzuetan gertatzen da buggyan oinarritutako web proxy zerbitzua erabiltzean.'''",
 'edit_form_incomplete' => "'''Aldaketa formularioaren atal batzuk ez dira iritsi zerbitzarira; bi aldiz ziurtatu zure aldaketak osorik daudela eta berriro saiatu.'''",
-'editing' => '$1 aldatzen',
+'editing' => '«$1» aldatzen',
 'creating' => '$1 sortzen',
 'editingsection' => '$1 aldatzen (atala)',
 'editingcomment' => '$1 aldatzen (atal berria)',
@@ -1140,7 +1139,6 @@ Kontura zaitez nabigazio loturek, zutabea ezabatu dezakela.',
 'showhideselectedversions' => 'Erakutsi/ezkutatu aukeratutako berrikuspenak',
 'editundo' => 'desegin',
 'diff-empty' => '(Ez dago alderik)',
-'diff-multi' => '({{PLURAL:$1|Ez da tarteko berrikuspen bat|Ez dira tarteko $1 berrikuspen}} erakusten {{PLURAL:$2|lankide batena|$2 lankiderena}}.)',
 
 # Search results
 'searchresults' => 'Bilaketaren emaitzak',
@@ -2239,7 +2237,7 @@ Ikus [[Special:ProtectedPages|orri babestuen zerrenda]], orain indarrean dauden
 'movedarticleprotection' => 'babes hobespenak "[[$2]]"tik "[[$1]]"(e)ra mugitu dira',
 'protect-title' => '«$1» babesten',
 'protect-title-notallowed' => '"$1"en babes maila ikusi',
-'prot_1movedto2' => '$1 izenburua $2(r)engatik aldatu da',
+'prot_1movedto2' => '«[[$1]]» orria «[[$2]]» izenera aldatu da',
 'protect-badnamespace-title' => 'Izen-tarte ez babesgarria',
 'protect-badnamespace-text' => 'Izen-tarte honetako orrialdeak ezin dira babestu.',
 'protect-norestrictiontypes-text' => 'Orrialde hau ezin da babestu ez daudelako mugapen mota eskuragarririk.',
@@ -2250,7 +2248,7 @@ Ikus [[Special:ProtectedPages|orri babestuen zerrenda]], orain indarrean dauden
 'protect_expiry_invalid' => 'Babesaldiaren bukaerako data ez da baliozkoa.',
 'protect_expiry_old' => 'Babesaldiaren bukaera iraganekoa da.',
 'protect-unchain-permissions' => 'Babes aukerak desblokeatu',
-'protect-text' => "'''$1''' orrialdearen babes maila ikusi eta aldatu egin beharko zenuke.",
+'protect-text' => '«$1» orriaren babes maila ikusi eta aldatu egin beharko zenuke.',
 'protect-locked-blocked' => "Babes-mailak ezin dira aldatu blokeatuta dagoen bitartean.
 Hemen daude '''$1''' orrialdearen egungo ezarpenak:",
 'protect-locked-dblock' => "Babes-mailak ezin dira aldatu, datu-basea blokeatuta baitago.
@@ -2533,18 +2531,24 @@ Hala ere, $2-(r)en parte denez, blokeoa kendu daiteke.',
 # Move page
 'move-page' => 'Mugitu «$1»',
 'move-page-legend' => 'Orrialdea mugitu',
-'movepagetext' => "Beheko formularioa erabiliz orrialde baten izena aldatuko da, historia osoa izen berrira mugituz.
-Izenburu zaharra izenburu berrira daraman birbideratze bilakatuko da.
-Jatorrizko izenburura doazen birbideratzeak automatikoki egunera ditzakezu.
-Ezetz aukeratzen baduzu, egiazta itzazu birbideratze [[Special:DoubleRedirects|bikoitz]] edo [[Special:BrokenRedirects|apurtuak]].
-Loturak modu zuzenean mantentzea zure erantzukizuna da.
-
-Konturatu zaitez orrialdea '''ez''' dela mugituko izenburu berria duen orrialde bat badago jadanik, ez bada aldaketa-historiarik gabeko orrialde huts edo birbideratze bat.
+'movepagetext' => "Konturatu zaitez orrialdea '''ez''' dela mugituko izenburu berria duen orrialde bat badago jadanik, ez bada aldaketa-historiarik gabeko orrialde huts edo birbideratze bat.
 Horrek esan nahi du hanka sartzekotan orrialde baten jatorrizko izenburua berreskuratu daitekeela, baina ezin dela jada existitzen den orrialde baten gainean idatzi.
 
 '''Oharra!'''
 Aldaketa hau drastikoa eta ustekabekoa izan daiteke orrialde oso ezagunetan;
-mesedez, egiazta ezazu honen ondorioak ulertzen dituzula, jarraitu baino lehen.",
+mesedez, egiazta ezazu honen ondorioak ulertzen dituzula, jarraitu baino lehen.
+Inprimaki hau erabiliz, orri baten izena aldatuko da, eta haren historia izen berrira eraman.
+Izenburu zaharra izenburu berrirantz birzuzendutako orri bihurtuko da.
+Jatorrizko izenburura doazen birzuzenketak automatikoki egunera ditzakezu.
+Halako eguneratze automatikorik ez egitea aukeratzen baduzu, egiazta itzazu birbideratze [[Special:DoubleRedirects|bikoitzak]] eta [[Special:BrokenRedirects|apurtuak]].
+Zure ardura da loturak behar den tokirantz bideratzea.
+
+Gogoan izan ezazu ezazu: orriaren izena <strong>ez</strong> da aldatuko baldin jarri nahi duzun izenburua duen orria dagoeneko sortuta badago, salbu eta historiarik gabeko birzuzenketa orri bat bada.
+Hau da, nahasten baldin bazara, mugitu duzun orria lehengo izenburura itzultzeko modua badago, eta ezin duzun lehendik sortuta dagoen orri bat gainidatzi.
+
+<strong>Kontuz!</strong>
+Oso erabilia den orri batean, aldaketa hau bat-batekoa eta ustekabekoa izan liteke;
+zalantzarik baldin baduzu, lehenbizi adieraz ezazu zure asmoa eztabaida orrian, beste wikilarien iritziak jasotzeko.",
 'movepagetalktext' => "Dagokion eztabaida orrialdea berarekin batera mugitu da, honako kasu hauetan '''ezik:'''
 * Hutsik ez dagoen eztabaida orrialde bat existitzen bada izen berrian.
 * Beheko koadroa hautatzen ez baduzu.
@@ -2640,6 +2644,7 @@ Mesedez bisitatu [https://www.mediawiki.org/wiki/Localisation MediaWiki] eta [//
 'allmessages-prefix' => 'Aurrizkiaren arabera iragazi:',
 'allmessages-language' => 'Hizkuntza:',
 'allmessages-filter-submit' => 'Joan',
+'allmessages-filter-translate' => 'Itzuli',
 
 # Thumbnails
 'thumbnail-more' => 'Handitu',
@@ -3550,7 +3555,13 @@ Halaber [[Special:EditWatchlist|aldatzaile estandarra]] erabil dezakezu.',
 'version-hook-name' => 'Estentsioaren izena',
 'version-hook-subscribedby' => 'Hauen harpidetzarekin',
 'version-version' => '(Bertsioa $1)',
-'version-license' => 'Lizentzia',
+'version-license' => 'MediaWiki Lizentzia',
+'version-ext-license' => 'Lizentzia',
+'version-ext-colheader-name' => 'Luzapena',
+'version-ext-colheader-version' => 'Bertsioa',
+'version-ext-colheader-license' => 'Lizentzia',
+'version-ext-colheader-description' => 'Deskribapena',
+'version-ext-colheader-credits' => 'Egileak',
 'version-poweredby-credits' => "Wiki hau '''[https://www.mediawiki.org/ MediaWiki]'''k sustatzen du (copyright © 2001-$1 $2).",
 'version-poweredby-others' => 'beste batzuk',
 'version-poweredby-translators' => 'translatewiki.net itzultzaileak',
index 5b711e2..8a40873 100644 (file)
@@ -21,7 +21,6 @@ $namespaceNames = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Surrayal atihus:',
-'tog-justify' => 'Encahal párrafus',
 'tog-hideminor' => 'Açonchal eicionis chiqueninas en "úrtimus chambus"',
 'tog-hidepatrolled' => 'Açonchal eicionis vegilás en úrtimus chambus',
 'tog-newpageshidepatrolled' => 'Açonchal páginas vegilás ena nueva lista',
@@ -30,9 +29,7 @@ $messages = array(
 'tog-numberheadings' => 'Autu-numeral entítulus',
 'tog-showtoolbar' => "Muestral la barra d'eición (JavaScript)",
 'tog-editondblclick' => 'Eital páhinas haziendu dobri click (JavaScript)',
-'tog-editsection' => 'Premitil eital mensahis gastandu el atihu [eital]',
 'tog-editsectiononrightclick' => 'Premitil eital secionis pulsandu el botón de la derecha<br /> enus entítulus de secionis (JavaScript)',
-'tog-showtoc' => 'Muestral cuairu e continius (pa páhinas con mas de 3 entítulus)',
 'tog-rememberpassword' => 'Recordal la mi cuenta nesti ordinaol (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'tog-watchcreations' => 'Vehilal las páhinas que yo crei',
 'tog-watchdefault' => "Vehilal las páhinas qu'eiti",
@@ -727,7 +724,6 @@ Asigurati e qu'esti chambu mantenga la continuiá el estorial la páhina.",
 'lineno' => 'Línia $1:',
 'compareselectedversions' => 'Comparal velsionis aseñalás',
 'editundo' => 'esjazel',
-'diff-multi' => '(Nu se {{PLURAL:$1|muestra una revisión entelmeya|muestran $1 revisionis entelmeyas}}.)',
 
 # Search results
 'searchresults' => 'Landeal resurtaus',
@@ -1347,7 +1343,6 @@ Si quieis ehal de vehilal la páhina, pursa sobri \"Ehal de vehilal\".",
 'watchmethod-list' => 'Revisandu las páhinas vehilás en cata los úrtimus chambus',
 'watchlistcontains' => 'Ai $1 {{PLURAL:$1|páhina|páhinas}} ena tu lista e seguimientu.',
 'iteminvalidname' => "Pobrema con el artículu '$1', nombri nu premitiu...",
-'wlnote' => "Embahu {{PLURAL:$1|es el úrtimu chambu|son los úrtimus '''$1''' chambus}} enas úrtimas {{PLURAL:$2|oras|'''$2''' oras}}.",
 'wlshowlast' => 'Muestral úrtimus $1 oras $2 dias $3',
 'watchlist-options' => 'Ocionis de la mi lista e seguimientu',
 
@@ -1782,7 +1777,6 @@ Tolas acionis d'emporteau transwiki se rustrin nel [[Special:Log/import|rustrihu
 'tooltip-pt-watchlist' => 'Lista e páhinas enas que vehilas los chambus',
 'tooltip-pt-mycontris' => 'Los mis endirguis',
 'tooltip-pt-login' => 'Te recomendamus que te rustris, inque nu es mestel.',
-'tooltip-pt-anonlogin' => 'Te recomendamus que te rustris, inque nu es mestel.',
 'tooltip-pt-logout' => 'Salil',
 'tooltip-ca-talk' => 'Caraba al tentu el artículu',
 'tooltip-ca-edit' => 'Pueis eital esta página.
index 3f28adf..8cbf7a5 100644 (file)
@@ -455,7 +455,6 @@ $imageFiles = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'پیوند خط کشی شده در زیر:',
-'tog-justify' => 'توجیه پاراگراف',
 'tog-hideminor' => 'تغییرات جزئی از فهرست تغییرات اخیر پنهان شوند',
 'tog-hidepatrolled' => 'ویرایش‌های گشت‌خورده از فهرست تغییرات اخیر پنهان شوند',
 'tog-newpageshidepatrolled' => 'صفحه‌های گشت‌خورده از فهرست صفحه‌های تازه پنهان شوند',
@@ -618,7 +617,6 @@ $messages = array(
 'vector-action-protect' => 'محافظت',
 'vector-action-undelete' => 'احیا',
 'vector-action-unprotect' => 'تغییر سطح حفاظت',
-'vector-simplesearch-preference' => 'فعال‌کردن نوار جستجوی ساده‌شده (فقط در پوستهٔ برداری)',
 'vector-view-create' => 'ایجاد',
 'vector-view-edit' => 'ویرایش',
 'vector-view-history' => 'نمایش تاریخچه',
@@ -1304,8 +1302,8 @@ $2
 'content-failed-to-parse' => 'عدم موفقیت در تجزیه محتوای $2 برای مدل $1: $3',
 'invalid-content-data' => 'داده محتوای نامعتبر',
 'content-not-allowed-here' => 'محتوای «$1» در صفحهٔ [[$2]] مجاز نیست',
-'editwarning-warning' => 'خرÙ\88ج Ø§Ø² Ø§Û\8cÙ\86 ØµÙ\81Ø­Ù\87 Ù\85Ù\85Ú©Ù\86 Ø§Ø³Øª Ø¨Ø§Ø¹Ø« Ø§Ø² Ø¯Ø³Øª Ø±Ù\81تÙ\86 Ù\87رÚ\86Ù\87 Ù\86Ù\88شتÙ\87â\80\8cاÛ\8cد Ø´Ù\88د.
-اگر شما با نام کاربری وارد شده‌اید می‌توانید این هشدار را در بخش «در حال ویرایش» ترجیحاتتان بیابید.',
+'editwarning-warning' => 'خرÙ\88ج Ø§Ø² Ø§Û\8cÙ\86 ØµÙ\81Ø­Ù\87 Ù\85Ù\85Ú©Ù\86 Ø§Ø³Øª Ø¨Ø§Ø¹Ø« Ø´Ù\88د Ú©Ù\87 Ø´Ù\85ا Ù\87ر Ø´Ø§Ù\86سÛ\8c Ú©Ù\87 Ø¨Ù\87 Ù\88جÙ\88د Ø¢Ù\88ردÙ\87 Ø§Û\8cد Ø±Ø§ Ø§Ø² Ø¯Ø³Øª Ø¨Ø¯Ù\87Û\8cد.
+اگر شما وارد سیستم شده‌اید، می‌توانید این هشدار را در بخش «در حال ویرایش» ترجیحاتتان غیرفعال کنید.',
 'editpage-notsupportedcontentformat-title' => 'فرمت محتوا پشتیبانی نشده',
 'editpage-notsupportedcontentformat-text' => 'فرمت محتوای $1 توسط مدل محتوای $2 پشتیبانی نشده‌است.',
 
@@ -1342,6 +1340,7 @@ $2
 لطفاً تفاوت زیر را بررسی کنید تا تأیید کنید که این چیزی است که می‌خواهید انجام دهید، سپس تغییرات زیر را ذخیره کنید تا خنثی‌سازی ویرایش را به پایان ببرید.',
 'undo-failure' => 'به علت تعارض با ویرایش‌های میانی، این ویرایش را نمی‌توان خنثی کرد.',
 'undo-norev' => 'این ویرایش را نمی‌توان خنثی کرد چون وجود ندارد یا حذف شده‌است.',
+'undo-nochange' => 'به نظر می‌رسد ویرایش در حال حاضر باطل بوده است.',
 'undo-summary' => 'خنثی‌سازی ویرایش $1 توسط [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]])',
 'undo-summary-username-hidden' => 'خنثی‌سازی نسخهٔ $1 به دست یک کاربر پنهان‌شده',
 
@@ -1519,7 +1518,8 @@ $1",
 'showhideselectedversions' => 'نمایش/نهفتن نسخه‌های انتخاب شده',
 'editundo' => 'خنثی‌سازی',
 'diff-empty' => '(بدون تفاوت)',
-'diff-multi' => '({{PLURAL:$1|یک|$1}} ویرایش میانی توسط {{PLURAL:$2|یک|$2}} کاربر نشان داده نشده‌است)',
+'diff-multi-sameuser' => '({{PLURAL:$1|یک نسخهٔ متوسط|$1 نسخه‌های متوسط}} توسط کاربر مشابهی که نشان داده نشده)',
+'diff-multi-otherusers' => '({{PLURAL:$1|یک نسخهٔ متوسط|$1 نسخه‌های متوسط}} توسط {{PLURAL:$2|کاربر دیگری|$2 کاربران}} نشان داده نشده)',
 'diff-multi-manyusers' => '({{PLURAL:$1|یک|$1}} ویرایش میانی توسط بیش از {{PLURAL:$2|یک|$2}} کاربر نشان داده نشده‌است)',
 'difference-missing-revision' => '{{PLURAL:$2|یک ویرایش|$2 ویرایش}}  از تفاوت نسخه‌ها ($1) {{PLURAL:$2|یافت|یافت}}  نشد.
 
@@ -1540,7 +1540,7 @@ $1",
 'shown-title' => 'نمایش $1 {{PLURAL:$1|نتیجه|نتیجه}} در هر صفحه',
 'viewprevnext' => 'نمایش ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''صفحه‌ای با عنوان «[[:$1]]» در این ویکی وجود دارد.'''",
-'searchmenu-new' => "'''صفحهٔ «[[:$1]]» را در این ویکی بسازید!'''",
+'searchmenu-new' => '<strong>ایجاد صفحه "[[:$1]]" در این ویکی!</strong> {{PLURAL:$2|0=|همچنین مشاهدهٔ صفحهٔ پیدا شده با جستجوی شما.|همچنین مشاهدهٔ جستجوی نتایج پیدا شده.}}',
 'searchprofile-articles' => 'صفحه‌های محتوایی',
 'searchprofile-project' => 'صفحه‌های راهنما و پروژه',
 'searchprofile-images' => 'چندرسانه‌ای',
@@ -1566,6 +1566,7 @@ $1",
 'searchrelated' => 'مرتبط',
 'searchall' => 'همه',
 'showingresults' => "نمایش حداکثر {{PLURAL:$1|'''۱''' نتیجه|'''$1''' نتیجه}} در پایین، آغاز از شماره '''$2'''.",
+'showingresultsinrange' => 'نمایش در پائین تا {{PLURAL:$1|<strong>1</strong> نتیجه|<strong>$1</strong> نتیجه}} in range #<strong>$2</strong> تا #<strong>$3</strong>.',
 'showingresultsnum' => "نمایش حداکثر '''$3''' {{PLURAL:$3|نتیجه|نتیجه}} در پایین، آغاز از شماره '''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|نتیجهٔ '''$1''' از '''$3'''|نتایج '''$1 تا $2''' از '''$3'''}} برای '''$4'''",
 'search-nonefound' => 'نتیجه‌ای منطبق با درخواست پیدا نشد.',
@@ -1864,7 +1865,7 @@ $1",
 'action-userrights' => 'ویرایش همهٔ اختیارات کاربری',
 'action-userrights-interwiki' => 'ویرایش اختیارات کاربری کاربران یک ویکی دیگر',
 'action-siteadmin' => 'قفل‌کردن و بازکردن پایگاه داده‌ها',
-'action-sendemail' => 'ارساÙ\84 Ø§Û\8cÙ\85Û\8cÙ\84',
+'action-sendemail' => 'ارساÙ\84 Ø±Ø§Û\8cاÙ\86اÙ\85Ù\87',
 'action-editmywatchlist' => 'فهرست پیگیری‌های خود را ویرایش کنید',
 'action-viewmywatchlist' => 'فهرست پیگیری‌های خود را ببینید',
 'action-viewmyprivateinfo' => 'اطلاعات خصوصی خود را ببینید',
@@ -2393,6 +2394,14 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'protectedpages-cascade' => 'فقط محافظت‌های آبشاری',
 'protectedpages-noredirect' => 'پنهان‌کردن تغییر مسیرها',
 'protectedpagesempty' => 'در حال حاضر هیچ‌صفحه‌ای محافظت نشده‌است.',
+'protectedpages-timestamp' => 'برچسب زمان',
+'protectedpages-page' => 'صفحه',
+'protectedpages-expiry' => 'انقضا',
+'protectedpages-performer' => 'در حال حفاظت از کاربر',
+'protectedpages-params' => 'پارامترهای حفاظت',
+'protectedpages-reason' => 'دلیل',
+'protectedpages-unknown-timestamp' => 'ناشناس',
+'protectedpages-unknown-performer' => 'کاربر ناشناس',
 'protectedtitles' => 'عنوان‌های محافظت‌شده',
 'protectedtitlesempty' => 'در حال حاضر هیچ عنوانی با این پارامترها محافظت نشده‌است.',
 'listusers' => 'فهرست کاربران',
@@ -2520,7 +2529,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'mailnologin' => 'نشانی‌ای از فرستنده موجود نیست',
 'mailnologintext' => 'برای فرستادن رایانامه به کاربران دیگر باید [[Special:UserLogin|به سامانه وارد شوید]] و نشانی رایانامهٔ معتبری در [[Special:Preferences|ترجیحات]] خود داشته باشید.',
 'emailuser' => 'فرستادن نامه به این کاربر',
-'emailuser-title-target' => 'اÛ\8cÙ\85Û\8cÙ\84 Ø§Û\8cÙ\86 {{GENDER:$1| کاربر}}',
+'emailuser-title-target' => 'راÛ\8cاÙ\86اÙ\85Ù\87 Ø¨Ù\87 {{GENDER:$1|کاربر}}',
 'emailuser-title-notarget' => 'رایانامه به کاربر',
 'emailpage' => 'رایانامه به کاربر',
 'emailpagetext' => 'شما می‌توانید از فرم زیر برای ارسال یک رایانامه به این {{GENDER:$1|کاربر}} استفاده کنید.
@@ -2579,6 +2588,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'watchmethod-list' => 'بررسی صفحه‌های مورد پی‌گیری برای ویرایش‌های اخیر',
 'watchlistcontains' => 'فهرست پی‌گیری‌های شما حاوی $1 {{PLURAL:$1|صفحه|صفحه}} است.',
 'iteminvalidname' => 'مشکل با مورد «$1»، نام نامعتبر است...',
+'wlnote2' => 'در زیر تغییرات اخیر وجود دارد {{PLURAL:$1|ساعت|<strong>$1</strong> ساعت‌ها}}, به عنوان $2, $3.',
 'wlshowlast' => 'نمایش آخرین $1 ساعت $2 روز $3',
 'watchlist-options' => 'گزینه‌های پی‌گیری',
 
@@ -2953,7 +2963,7 @@ $1',
 'contribslink' => 'مشارکت‌ها',
 'emaillink' => 'ارسال رایانامه',
 'autoblocker' => 'به طور خودکار بسته شد چون آی‌پی شما به تازگی توسط کاربر «[[User:$1|$1]]» استفاده شده‌است.
-دلیل قطع دسترسی $1 چنین است: «$2»',
+دلیل قطع دسترسی $1 چنین است "$2"',
 'blocklogpage' => 'سیاههٔ بسته‌شدن‌ها',
 'blocklog-showlog' => 'دسترسی این کاربر در گذشته بسته شده‌است.
 سیاههٔ قطع دسترسی در زیر نمایش یافته است:',
@@ -3165,6 +3175,7 @@ $2',
 'thumbnail_image-type' => 'تصویر از نوع پشتیبانی نشده',
 'thumbnail_gd-library' => 'تنظیمات ناقص کتابخانهٔ GD: عملکرد $1 وجود ندارد',
 'thumbnail_image-missing' => 'پرونده به نظر گم شده‌است: $1',
+'thumbnail_image-failure-limit' => 'تلاش‌های ناموفق اخیر بسیاری ($1 یا بیشتر) برای ارائهٔ این تصویر کوچک وجود داشته‌ است. لطفأ بعداً دوباره تلاش کنید.',
 
 # Special:Import
 'import' => 'درون‌ریزی صفحه‌ها',
@@ -3202,7 +3213,7 @@ $2',
 پوشهٔ موقت پیدا نشد.',
 'import-parse-failure' => 'خطا در تجزیهٔ اکس‌ام‌ال بارگذاری‌شده',
 'import-noarticle' => 'صفحه‌ای برای بارگذاری وجود ندارد!',
-'import-nonewrevisions' => 'تمام نسخه‌ها قبلاً بارگذاری شده‌اند.',
+'import-nonewrevisions' => 'هیچ بازبینی وارد نشده (همه یا در حال حاضر وجود دارند، یا به دلیل خطا‌ها نادیده گرفته شده‌اند).',
 'xml-error-string' => '$1 در سطر $2، ستون $3 (بایت $4): $5',
 'import-upload' => 'بارگذاری داده اکس‌ام‌ال',
 'import-token-mismatch' => 'از دست رفتن اطلاعات نشست کاربری. لطفاً دوباره امتحان کنید.',
@@ -3213,6 +3224,7 @@ $2',
 '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|جزئیات|جزئیات}} اشتباه: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'با توجه به ریشه صفحه عنوان نامعتبر است.',
 'import-rootpage-nosubpage' => 'فضای نام  "$1" صفحهٔ مبنا اجازهٔ زیرصفحه نمی‌دهد.',
@@ -3915,7 +3927,7 @@ $1',
 
 # Email address confirmation
 'confirmemail' => 'تأیید نشانی رایانامه',
-'confirmemail_noemail' => 'شما در صفحهٔ [[Special:Preferences|ترجیحات کاربری]] خود نشانی رایانامه معتبری وارد نکرده‌اید.',
+'confirmemail_noemail' => 'شما در صفحهٔ [[Special:Preferences|ترجیحات کاربری]] خود نشانی رایانامهٔ معتبری وارد نکرده‌اید.',
 'confirmemail_text' => 'این ویکی شما را ملزم به تأیید اعتبار رایانامه خود، پیش از استفاده از خدمات رایانامه در اینجا می‌کند. دکمهٔ زیرین را فعال کنید تا نامهٔ تأییدی به نشانی رایانامهٔ شما فرستاده شود. این نامه دربردارندهٔ پیوندی خواهد بود که حاوی یک کد است. پیوند را در مرورگر خود بار کنید (اجرا) کنید تا اعتبار نشانی رایانامهٔ شما تایید شود.',
 'confirmemail_pending' => 'یک کد تأییدی پیشتر برای شما به صورت نامه فرستاده شده‌است. اگر همین اواخر حساب خود را باز کرده‌اید شاید بد نباشد که پیش از درخواست یک کد جدید چند دقیقه درنگ کنید تا شاید نامهٔ قبلی برسد.',
 'confirmemail_send' => 'پُست‌کردن یک کد تأیید',
@@ -4442,6 +4454,5 @@ $5
 'expand_templates_preview' => 'پیش‌نمایش',
 
 # Unknown messages
-'createaccount-hook-aborted' => '$1',
 'uploadinvalidxml' => 'XML در پروندهٔ بارگذاری‌شده نمی‌تواند تجزیه شود.',
 );
index 965e031..92ae6b1 100644 (file)
@@ -321,7 +321,6 @@ $linkTrail = '/^([a-zäö]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Linkkien alleviivaus:',
-'tog-justify' => 'Tasaa kappaleet',
 'tog-hideminor' => 'Piilota pienet muutokset tuoreet muutokset -listasta',
 'tog-hidepatrolled' => 'Piilota tarkastetut muutokset tuoreet muutokset -listasta',
 'tog-newpageshidepatrolled' => 'Piilota tarkastetut sivut uusien sivujen listalta',
@@ -484,7 +483,6 @@ $messages = array(
 'vector-action-protect' => 'Suojaa',
 'vector-action-undelete' => 'Palauta',
 'vector-action-unprotect' => 'Muuta suojausta',
-'vector-simplesearch-preference' => 'Ota käyttöön yksinkertaistettu hakupalkki (vain Vector-ulkoasu)',
 'vector-view-create' => 'Luo',
 'vector-view-edit' => 'Muokkaa',
 'vector-view-history' => 'Näytä historia',
@@ -1135,8 +1133,9 @@ Se on jo olemassa.',
 'invalid-content-data' => 'Virheellinen sisältö',
 'content-not-allowed-here' => 'Sivun [[$2]] sisältö ei voi olla tyyppiä $1.',
 'editwarning-warning' => 'Tältä sivulta poistuminen saattaa aiheuttaa kaikkien tekemiesi muutosten katoamisen.
-Jos olet kirjautuneena sisään, voit poistaa tämän varoituksen käytöstä asetuksissa osiossa "Muokkaus".',
+Jos olet kirjautunut sisään, voit poistaa tämän varoituksen käytöstä omien asetuksien osiossa "{{int:prefs-editing}}".',
 'editpage-notsupportedcontentformat-title' => 'Sisällön muotoa ei tueta',
+'editpage-notsupportedcontentformat-text' => 'Sisällön muotoa $1 ei tueta sisältömallilla $2.',
 
 # Content models
 'content-model-wikitext' => 'wikiteksti',
@@ -1170,6 +1169,7 @@ Nämä muuttujat on jätetty käsittelemättä.",
 Varmista alla olevasta vertailusta, että haluat saada aikaan tämän lopputuloksen, ja sen jälkeen tallenna alla näkyvät muutokset.',
 'undo-failure' => 'Muokkausta ei voi kumota välissä olevien ristiriitaisten muutosten vuoksi.',
 'undo-norev' => 'Muokkausta ei voida kumota, koska sitä ei ole olemassa tai se on poistettu.',
+'undo-nochange' => 'Tämä muokkaus näyttää olevan jo kumottu.',
 'undo-summary' => 'Kumottu muokkaus $1, jonka teki [[Special:Contributions/$2|$2]] ([[User talk:$2|keskustelu]])',
 'undo-summary-username-hidden' => 'Kumottu muokkaus $1, jonka on tehnyt piilotettu käyttäjä',
 
@@ -1349,7 +1349,8 @@ Uuden ja vanhan sivun muutoksien pitää muodostaa jatkumo – ne eivät saa men
 'showhideselectedversions' => 'Näytä tai piilota valitut versiot',
 'editundo' => 'kumoa',
 'diff-empty' => '(ei eroavaisuuksia)',
-'diff-multi' => '(Näytettyjen versioiden välissä on {{PLURAL:$1|yksi muokkaus|$1 versiota, jotka ovat {{PLURAL:$2|yhden käyttäjän tekemiä|$2 eri käyttäjän tekemiä}}}}.)',
+'diff-multi-sameuser' => '({{PLURAL:$1|Yhtä välissä olevaa versiota|$1 välissä olevaa versiota}} samalta käyttäjältä ei näytetä)',
+'diff-multi-otherusers' => '({{PLURAL:$1|Yhtä välissä olevaa versiota|$1 välissä olevaa versiota}} {{PLURAL:$2|toisen käyttäjän tekemänä|$2 käyttäjän tekeminä}} ei näytetä)',
 'diff-multi-manyusers' => '(Versioiden välissä on {{PLURAL:$1|yksi muu muokkaus|$1 muuta muokkausta, jotka on tehnyt {{PLURAL:$2|yksi käyttäjä|yli $2 eri käyttäjää}}}}.)',
 'difference-missing-revision' => '{{PLURAL:$2|Yhtä versiota|$2 versiota}} tästä vertailusta ($1) {{PLURAL:$2|ei}} löytynyt.
 
@@ -1372,7 +1373,8 @@ Lisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 
 $1 {{int:pipe-separator}} $2',
 'searchmenu-exists' => "'''Tässä wikissä on sivu nimellä [[:$1]].'''",
-'searchmenu-new' => "'''Luo sivu ''[[:$1]]'' tähän wikiin.'''",
+'searchmenu-new' => '<strong>Luo sivu "[[:$1]]" tähän wikiin.</strong>{{PLURAL:$2|0=|Katso myös sivua, joka löytyi hakutoiminnolla.
+|Katso myös hakutuloksia.}}',
 'searchprofile-articles' => 'Sisältösivut',
 'searchprofile-project' => 'Ohje- ja projektisivut',
 'searchprofile-images' => 'Kuvat ja tiedostot',
@@ -1397,7 +1399,8 @@ $1 {{int:pipe-separator}} $2',
 'searcheverything-enable' => 'Hae kaikista nimiavaruuksista',
 'searchrelated' => 'samankaltainen',
 'searchall' => 'kaikki',
-'showingresults' => "{{PLURAL:$1|'''Yksi''' tulos|'''$1''' tulosta}} tuloksesta '''$2''' alkaen.",
+'showingresults' => '{{PLURAL:$1|<strong>Yksi</strong> tulos|<strong>$1</strong> tulosta}} tuloksesta <strong>$2</strong> alkaen.',
+'showingresultsinrange' => 'Alla näytetään enintään {{PLURAL:$1|<strong>1</strong> tulos|<strong>$1</strong> tulosta}} väliltä <strong>$2</strong> – <strong>$3</strong>.',
 'showingresultsnum' => "Alla on {{PLURAL:$3|'''Yksi''' hakutulos|'''$3''' hakutulosta}} alkaen '''$2.''' tuloksesta.",
 'showingresultsheader' => "{{PLURAL:$5|Tulokset '''$1'''–'''$3'''|Tulokset '''$1'''–'''$2''' kaikkiaan '''$3''' osuman joukosta}} haulle '''$4'''",
 'search-nonefound' => 'Hakusi ei tuottanut tulosta.',
@@ -1826,6 +1829,8 @@ Jos sinulla on tämän kuvan alkuperäinen versio, tallenna se. Muussa tapaukses
 'fileexists-shared-forbidden' => 'Samanniminen tiedosto on jo olemassa jaetussa mediavarastossa. Tallenna tiedosto jollakin toisella nimellä. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Tämä tiedosto on kaksoiskappale {{PLURAL:$1|seuraavasta tiedostosta|seuraavista tiedostoista}}:',
 'file-deleted-duplicate' => 'Tiedosto, joka on identtinen tämän tiedoston kanssa ([[:$1]]) on aiemmin poistettu. Katso kyseisen tiedoston poistoloki ennen kuin jatkat uudelleentallentamista.',
+'file-deleted-duplicate-notitle' => 'Tämän tiedoston kanssa samanlainen tiedosto on aikaisemmin poistettu ja tiedoston nimi on häivytetty.
+Sinun on syytä pyytää jotakuta häivytettyjen tietojen näkemiseen oikeutettua käyttäjää katsomaan tiedoston tiedot asian arvioimiseksi ennen kuin jatkat tiedoston lataamista tietokantaan.',
 'uploadwarning' => 'Tallennusvaroitus',
 'uploadwarning-text' => 'Muuta alla olevaa tiedostokuvausta ja yritä uudelleen.',
 'savefile' => 'Tallenna',
@@ -2197,10 +2202,20 @@ Jokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen o
 'deadendpagestext' => 'Seuraavat sivut eivät linkitä muihin sivuihin wikissä.',
 'protectedpages' => 'Suojatut sivut',
 'protectedpages-indef' => 'Vain ikuisesti suojatut',
+'protectedpages-summary' => 'Tällä sivulla on luetteloitu ne sivut, jotka ovat tällä hetkellä suojattuja. Jos haluat nähdä luettelon niistä sivujen nimistä, jotka on suojattu uudelleenluonnilta, katso  [[{{#special:ProtectedTitles}}]].',
 'protectedpages-cascade' => 'Vain tarttuvasti suojatut',
 'protectedpages-noredirect' => 'Piilota ohjaukset',
 'protectedpagesempty' => 'Mitään sivuja ei ole tällä hetkellä suojattu näillä asetuksilla.',
+'protectedpages-timestamp' => 'Aikaleima',
+'protectedpages-page' => 'Sivu',
+'protectedpages-expiry' => 'Vanhentuu',
+'protectedpages-performer' => 'Suojauksen asettanut',
+'protectedpages-params' => 'Suojauksen asetukset',
+'protectedpages-reason' => 'Syy',
+'protectedpages-unknown-timestamp' => 'Tuntematon',
+'protectedpages-unknown-performer' => 'Tuntematon käyttäjä',
 'protectedtitles' => 'Suojatut sivunimet',
+'protectedtitles-summary' => 'Tällä sivulla on lueteltu ne sivut, jotka ovat tällä hetkellä suojatut uudelleenluonnilta. Jos haluat nähdä luettelon suojatuista olemassa olevista sivuista, katso [[{{#special:ProtectedPages}}]].',
 'protectedtitlesempty' => 'Ei suojattuja sivunimiä näillä hakuehdoilla.',
 'listusers' => 'Käyttäjälista',
 'listusers-editsonly' => 'Näytä vain käyttäjät, joilla on muokkauksia',
@@ -2386,6 +2401,7 @@ Tulevaisuudessa sivuun ja sen keskustelusivuun tehtävät muutokset listataan t
 'watchmethod-list' => 'tarkistetaan tarkkailtujen sivujen tuoreimmat muutokset',
 'watchlistcontains' => 'Tarkkailulistallasi on {{PLURAL:$1|yksi sivu|$1 sivua}}.',
 'iteminvalidname' => 'Sivun $1 kanssa oli ongelmia. Sivun nimessä on vikaa.',
+'wlnote2' => 'Alla on muutokset viimeisen {{PLURAL:$1|tunnin|<strong>$1</strong> tunnin}} ajalta $2 kello $3 asti.',
 'wlshowlast' => 'Näytä viimeiset $1 tuntia tai $2 päivää, $3',
 'watchlist-options' => 'Tarkkailulistan asetukset',
 
@@ -2539,8 +2555,8 @@ Viimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|k
 ** Suuri näkyvyys',
 'protect-edit-reasonlist' => 'Muokkaa suojaussyitä',
 'protect-expiry-options' => '1 tunti:1 hour,1 päivä:1 day,1 viikko:1 week,2 viikkoa:2 weeks,1 kuukausi:1 month,3 kuukautta:3 months,6 kuukautta:6 months,1 vuosi:1 year,ikuinen:infinite',
-'restriction-type' => 'Rajoitus',
-'restriction-level' => 'Suojaus',
+'restriction-type' => 'Rajoitus:',
+'restriction-level' => 'Suojaustaso:',
 'minimum-size' => 'Vähimmäiskoko',
 'maximum-size' => 'Enimmäiskoko',
 'pagesize' => 'tavua',
@@ -2554,7 +2570,7 @@ Viimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|k
 # Restriction levels
 'restriction-level-sysop' => 'täysin suojattu',
 'restriction-level-autoconfirmed' => 'osittaissuojattu',
-'restriction-level-all' => 'mikä tahansa suojaus',
+'restriction-level-all' => 'kaikki tasot',
 
 # Undelete
 'undelete' => 'Tarkastele poistettuja sivuja',
@@ -2742,7 +2758,7 @@ Voimassa olevat estot näkyvät [[Special:BlockList|estolistasta]].',
 'contribslink' => 'muokkaukset',
 'emaillink' => 'lähetä sähköpostia',
 'autoblocker' => 'Olet automaattisesti estetty, koska jaat IP-osoitteen käyttäjän [[User:$1|$1]] kanssa. 
-Käyttäjän $1 saaman eston syy on: $2.',
+Käyttäjän $1 saaman eston syy on: "$2".',
 'blocklogpage' => 'Estoloki',
 'blocklog-showlog' => 'Tämä käyttäjä on ollut aiemmin estettynä.
 Alla on ote estolokista.',
@@ -2941,6 +2957,8 @@ $2',
 'thumbnail_image-type' => 'Kuvamuoto ei ole tuettu',
 'thumbnail_gd-library' => 'GD-kirjastoa ei ole asennettu oikein. Funktio $1 puuttuu.',
 'thumbnail_image-missing' => 'Tiedosto näyttää puuttuvan: $1',
+'thumbnail_image-failure-limit' => 'Tätä kuvan näyttöasettelua (thumbnail) on yritetty toteuttaa liian monta kertaa epäonnistuneesti ($1 tai enemmän).
+Ole hyvä ja yritä myöhemmin uudelleen.',
 
 # Special:Import
 'import' => 'Tuo sivuja',
@@ -2976,7 +2994,7 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 'importuploaderrortemp' => 'Tuontitiedoston tallennus epäonnistui. Väliaikaistiedostojen kansio puuttuu.',
 'import-parse-failure' => 'XML-tuonti epäonnistui jäsennysvirheen takia.',
 'import-noarticle' => 'Ei sivua tuotavaksi!',
-'import-nonewrevisions' => 'Kaikki versiot on tuotu aiemmin.',
+'import-nonewrevisions' => 'Ei tuotu yhtään versiota, koska kaikki versiot ovat jo täällä tai ne on ohitettu virheiden vuoksi.',
 'xml-error-string' => '$1 rivillä $2, sarakkeessa $3 (tavu $4): $5',
 'import-upload' => 'Tallenna XML-tiedosto',
 'import-token-mismatch' => 'Istuntotiedot ovat kadonneet. Yritä uudelleen.',
@@ -4159,4 +4177,6 @@ Toisin sanoen melkein kaiken, joka on kaksoisaaltosulkeiden sisällä.',
 'expand_templates_generate_rawhtml' => 'Näytä raaka HTML',
 'expand_templates_preview' => 'Esikatselu',
 
+# Unknown messages
+'uploadinvalidxml' => 'Ladatun tiedoston XML-koodia ei voitu jäsentää kunnolla.',
 );
index 556ed60..8b948b2 100644 (file)
@@ -113,7 +113,6 @@ $linkTrail = '/^([áðíóúýæøa-z]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Undirstrika leinki:',
-'tog-justify' => 'Lat tekstin fáa javnan kant til høgru',
 'tog-hideminor' => 'Krógva minni broytingar í seinastu broytingum',
 'tog-hidepatrolled' => 'Krógva eftirkannaðar rættingar í seinastu broytingum',
 'tog-newpageshidepatrolled' => 'Goym eftirkannaðar síður frá listanum yvir nýggjar síður',
@@ -122,9 +121,7 @@ $messages = array(
 'tog-numberheadings' => 'Sjálvvirkandi talmerking av yvirskriftum',
 'tog-showtoolbar' => 'Vís rættingar-tóllinju',
 'tog-editondblclick' => 'Rætta síður við at tvíklikkja',
-'tog-editsection' => 'Rætta greinpart við hjálp av [rætta] leinkjum',
 'tog-editsectiononrightclick' => 'Rætta reglubrot við at høgraklikkja á reglubrotsyvirskrift',
-'tog-showtoc' => 'Vís innihaldsyvirlit (fyri síður við meira enn trimun yvirskriftum)',
 'tog-rememberpassword' => 'Minst til mítt loyniorð á hesum kaga (í mesta lagi í $1 {{PLURAL:$1|dag|dagar}})',
 'tog-watchcreations' => 'Legg síður, sum eg stovni og fílur sum eg leggi út, afturat mínum eftirlitslista',
 'tog-watchdefault' => 'Legg síður sum eg rætti afturat mínum eftirlitslista',
@@ -615,7 +612,7 @@ Eftirkanna um tú hevur stavað rætt, ella [[Special:UserLogin/signup|stovna ei
 'passwordtooshort' => 'Loyniorð mugu vera í minsta lagi {{PLURAL:$1|1 bókstav, tal, tekn|$1 bókstavir, tøl og tekn}}.',
 'password-name-match' => 'Loyniorðið hjá tær má vera annarleiðis enn títt brúkaranavn.',
 'password-login-forbidden' => 'Tað er ikki loyvt at brúka hetta brúkaranavnið og loyniorðið.',
-'mailmypassword' => 'Send mær eitt nýtt loyniorð við t-posti',
+'mailmypassword' => 'Nullstilla loyniorðið',
 'passwordremindertitle' => 'Nýtt fyribils loyniorð fyri {{SITENAME}}',
 'passwordremindertext' => 'Onkur (óivað tú, frá IP adressu $1) hevur umbiðið eitt nýtt loyniorð fyri {{SITENAME}}  $4. Eitt fyribils loyniorð fyri brúkara "$2" er nú gjørt og er sent til "$3". Um hetta var tað tú vildi, so mást tú rita inn og velja eitt nýtt loyniorð nú. 
 Títt fyribils loyniorð gongur út um {{PLURAL:$5|ein dag|$5 dagar}}.
@@ -676,6 +673,8 @@ Fyri at gera innritanina lidna, mást tú velja tær eitt nýtt loyniorð her:',
 'retypenew' => 'Skriva nýtt loyniorð umaftur:',
 'resetpass_submit' => 'Vel loyniorð og rita inn',
 'changepassword-success' => 'Títt loyniorð er nú broytt!',
+'changepassword-throttled' => 'Tú hevur roynt at rita inn ov nógvar ferðir nýliga.
+Vinarliga bíða $1 áðrenn tú roynir aftur.',
 'resetpass_forbidden' => 'Loyniorð kunnu ikki broytast',
 'resetpass-no-info' => 'Tú mást vera loggaður á fyri at fáa beinleiðis atgongd til hesa síðu.',
 'resetpass-submit-loggedin' => 'Broyt loyniorð',
@@ -688,7 +687,7 @@ Møguliga hevur tú longu broytt títt loyniorð ella biðið um eitt nýtt fyri
 # Special:PasswordReset
 'passwordreset' => 'Nullstilla loyniorðið',
 'passwordreset-text-one' => 'Útfyll henda teigin fyri at nullstilla títt loyniorð.',
-'passwordreset-text-many' => '{{PLURAL:$1|Útfyll ein av teigunum fyri at nullstilla títt loyniorð.}}',
+'passwordreset-text-many' => '{{PLURAL:$1|Útfyll í ein av teigunum fyri at móttaka eitt fyribils loyniorð við telduposti.}}',
 'passwordreset-legend' => 'Nulstilla loyniorðið',
 'passwordreset-disabled' => 'Tað ber ikki til at nullstilla loyniorðið á hesi wiki.',
 'passwordreset-emaildisabled' => 'Teldupost funksjónir eru óvirknar á hesi wiki.',
@@ -729,6 +728,8 @@ Fyribils loyniorð: $2',
 'changeemail-password' => 'Títt {{SITENAME}} loyniorð:',
 'changeemail-submit' => 'Broyt t-post',
 'changeemail-cancel' => 'Ógilda',
+'changeemail-throttled' => 'Tú hevur roynt at rita inn ov nógvar ferðir.
+Vinarliga bíða $1 áðrenn tú roynir aftur.',
 
 # Special:ResetTokens
 'resettokens' => 'Nullstilla lyklar',
@@ -953,7 +954,7 @@ Síðan er longu til.',
 'invalid-content-data' => 'Ógyldug innihalds dáta',
 'content-not-allowed-here' => '"$1" innihald er ikki loyvt á síðu [[$2]]',
 'editwarning-warning' => 'Um tú fert frá hesi síðuni, so kanst tú missa tær broytingar ið tú hevur gjørt.
-Um tú hevur ritað inn, so kanst tú sláa hesa ávaring frá í "Rættingar" partinum í tínum innstillingum.',
+Um tú hevur ritað inn, so kanst tú sláa hesa ávaring frá í "{{int:prefs-editing}}" partinum í tínum innstillingum.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1144,7 +1145,6 @@ Tryggja tær, at henda broyting fer at varðveita framhaldssøguna hjá síðuni
 'showhideselectedversions' => 'Vís/fjal valdu versjónir',
 'editundo' => 'afturstilla',
 'diff-empty' => '(Ongin munur)',
-'diff-multi' => '({{PLURAL:$1|Ein versjón herímillum|$1 versjónir sum liggja ímillum}} av {{PLURAL:$2|einum brúkara|$2 brúkarar}} ikki víst)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Ein versjón sum liggur ímillum|$1 versjónir sum liggja ímillum}} skrivaðar av meira enn $2 {{PLURAL:$2|brúkara|brúkarum}} ikki víst)',
 
 # Search results
@@ -1161,7 +1161,7 @@ Tryggja tær, at henda broyting fer at varðveita framhaldssøguna hjá síðuni
 'shown-title' => 'Vís $1 {{PLURAL:$1|úrslit|úrslit}} á hvørjari síðu',
 'viewprevnext' => 'Vís ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Tað er longu ein síða sum eitur \"[[:\$1]]\" á hesi wiki.'''",
-'searchmenu-new' => "'''Stovna síðuna \"[[:\$1]]\" á hesi wiki!'''",
+'searchmenu-new' => '<strong>\'\'\'Stovna síðuna "[[:$1]]" á hesi wiki!</strong> {{PLURAL:$2|0=|Sí eisini síðuna sum varð funnin við tínari leiting.|Sí eisini leitiúrslitini ið funnin vóru.}}',
 'searchprofile-articles' => 'Innihaldssíður',
 'searchprofile-project' => 'Hjálpar og verkætlanar síður',
 'searchprofile-images' => 'Fjølmiðlar - multimedia',
@@ -1490,12 +1490,13 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'recentchanges-label-minor' => 'Hetta er ein lítil rætting',
 'recentchanges-label-bot' => 'Henda rætting varð gjørd av einum botti',
 'recentchanges-label-unpatrolled' => 'Henda rætting er ikki blivin eftirkannað enn',
+'recentchanges-legend-heading' => "'''Teknfrágreiðing:'''",
 'recentchanges-legend-newpage' => '(sí eisini [[Special:NewPages|yvirlit yvir nýggjar síður]])',
 'rcnotefrom' => "Niðanfyri standa broytingarnar síðani '''$2''', (upp til '''$1''' er sýndar).",
 'rclistfrom' => 'Sýn nýggjar broytingar byrjandi við $1',
 'rcshowhideminor' => '$1 minni rættingar',
 'rcshowhidebots' => '$1 bottar',
-'rcshowhideliu' => '$1 skrásettar brúkarar',
+'rcshowhideliu' => '$1 skrásettir brúkarar',
 'rcshowhideanons' => '$1 navnleysar brúkarar',
 'rcshowhidepatr' => '$1 eftirhugdar rættingar',
 'rcshowhidemine' => '$1 mínar rættingar',
@@ -2127,7 +2128,6 @@ Framtíðar broytingar á hesi síðu og tilknýttu kjaksíðuni verða at sígg
 'watchmethod-list' => 'kannar síður undir eftirliti fyri feskar broytingar',
 'watchlistcontains' => 'Títt eftirlit inniheldur {{PLURAL:$1|eina síðu|$1 síður}}.',
 'iteminvalidname' => "Trupulleiki við luti '$1', ógyldugt navn...",
-'wlnote' => "Niðanfyri {{PLURAL:$1|stendur seinasta broytingin|standa seinastu '''$1''' broytingarnar}} seinasta/u {{PLURAL:$2| tíman|'''$2''' tímarnar}} hin $3 kl. $4",
 'wlshowlast' => 'Vís seinastu $1 tímar $2 dagar $3',
 'watchlist-options' => 'Møguleikar í ansingarlistanum',
 
@@ -2189,6 +2189,10 @@ Sí $2 fyri fulla skráseting av strikingum.',
 'delete-edit-reasonlist' => 'Rætta orsøkir til striking',
 'delete-toobig' => 'Henda síðan hevur eina langa rættingar søgu, meira enn $1 {{PLURAL:$1|versjón|versjónir}}. 
 Striking av slíkum síðum er avmarkað fyri at forða fyri at onkur av óvart kemur til at forstýra {{SITENAME}}.',
+'delete-warning-toobig' => 'Henda síðan hevur eina langa rættingarsøgu, yvir $1 {{PLURAL:$1|versjón|versjónir}}.
+Um tú slettar hana kann tað órógva virksemi hjá dátugrunninum {{SITENAME}};
+far varliga fram.',
+'deleting-backlinks-warning' => "'''Ávaring:''' Aðrar síður slóða til ella hava síðuna við, ið tú ert í ferð við at sletta.",
 
 # Rollback
 'rollback' => 'Rulla broytingar aftur',
@@ -2232,6 +2236,8 @@ Sí [[Special:ProtectedPages|listan fyri vardar síður]] fyri at síggja listan
 'protect-legend' => 'Vátta friðing',
 'protectcomment' => 'Orsøk:',
 'protectexpiry' => 'Gongur út:',
+'protect_expiry_invalid' => 'Útloypstíðin er ógyldug.',
+'protect_expiry_old' => 'Útgongutíðin er longu farin.',
 'protect-text' => "Her kanst tú síggja og broyta verjustøðuna fyri síðuna '''$1'''.",
 'protect-locked-blocked' => "Tú kanst ikki broyta verjustøðu á síðu, meðan tú ert sperrað/ur.
 Her er aktuella innstillingin hjá síðuni '''$1''':",
@@ -2437,7 +2443,7 @@ Sí [[Special:BlockList|sperringarlistan]] fyri at síggja allar sperringar.',
 'contribslink' => 'íkøst',
 'emaillink' => 'send teldupost',
 'autoblocker' => 'Sjálvvirkandi sperring tí at tín IP adressa nýliga er blivin brúkt av "[[User:$1|$1]]".
-Orsøkin ið varð nevnd fyri at sperra $1 er "\'\'$2\'\'"',
+Orsøkin ið varð nevnd fyri at sperra $1 er "$2"',
 'blocklogpage' => 'Bannagerðabók',
 'blocklog-showlog' => 'Hesin brúkarin hevur fyrr verið sperraður.
 Sperringarloggurin er vístur niðanfyri til kunningar:',
@@ -2599,6 +2605,7 @@ Vinarliga vitja [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisat
 'allmessages-prefix' => 'Filtrera eftir forstavilsi:',
 'allmessages-language' => 'Mál:',
 'allmessages-filter-submit' => 'Far',
+'allmessages-filter-translate' => 'Týð',
 
 # Thumbnails
 'thumbnail-more' => 'Víðka',
@@ -2613,6 +2620,7 @@ $2',
 'thumbnail_invalid_params' => 'Ógyldug thumbnail parametur',
 'thumbnail_dest_directory' => 'Tað bar ikki til at upprætta málmappu',
 'thumbnail_image-type' => 'Myndaslagið verður ikki stuðlað',
+'thumbnail_gd-library' => 'Ófullkomin GD bókasavns konfigurasjón: manglar funksjón $1',
 'thumbnail_image-missing' => 'Fílan sær út til at mangla: $1',
 
 # Special:Import
@@ -2644,7 +2652,7 @@ Goym hana á tínari teldu og legg hana so út her.",
 'importuploaderrorsize' => 'Útleggjan av innflutningsfílu miseydnaðist.
 Fílan er størri enn mest loyvda upload-støddin.',
 'import-noarticle' => 'Ongin síða at innflyta!',
-'import-nonewrevisions' => 'Allar versjónir eru longu innfluttar.',
+'import-nonewrevisions' => 'Ongar versjónir vóru innfluttar (allar vóru antin longu tilstaðar, ella koyrdar burtur orsakað av feilum).',
 'xml-error-string' => '$1 á linju $2, rekkju $3 (byte $4): $5',
 'import-upload' => 'Legg út XML dáta',
 'import-token-mismatch' => 'Misti setunardáta (sesjónsdáta).
@@ -2675,7 +2683,6 @@ Vinarliga royn aftur.',
 'tooltip-pt-watchlist' => 'Ein listi við síðum sum tú eftiransar fyri broytingum',
 'tooltip-pt-mycontris' => 'Yvirlit yvir títt íkast',
 'tooltip-pt-login' => 'Vit mæla til at tú ritar inn, tað er tó ikki eitt krav.',
-'tooltip-pt-anonlogin' => 'Vit mæla til at tú ritar inn, tað er tó ikki eitt krav',
 'tooltip-pt-logout' => 'Rita út',
 'tooltip-ca-talk' => 'Kjak um innihaldssíðuna',
 'tooltip-ca-edit' => 'Tú kanst broyta hesa síðuna. Vinarliga nýt forskoðanarknøttin áðrenn tú goymir.',
@@ -2968,11 +2975,23 @@ Onnur metadáta verða fjald sum standard.
 
 'exif-meteringmode-0' => 'Ókent',
 'exif-meteringmode-1' => 'Miðal',
+'exif-meteringmode-255' => 'Annað',
 
+'exif-lightsource-0' => 'Ókent',
 'exif-lightsource-1' => 'Dagsljós',
+'exif-lightsource-2' => 'Ljósrør',
+'exif-lightsource-3' => 'Gløðilampa',
+'exif-lightsource-4' => 'Blits',
 'exif-lightsource-9' => 'Gott veður',
 'exif-lightsource-10' => 'Skýggjað veður',
 'exif-lightsource-11' => 'Skuggi',
+'exif-lightsource-12' => 'Dagsljós ljósrør (D 5700 – 7100K)',
+'exif-lightsource-13' => 'Dagshvítt ljósrør (N 4600 – 5400K)',
+'exif-lightsource-14' => 'Kalthvítt ljósrør (W 3900 – 4500K)',
+'exif-lightsource-15' => 'Hvítt ljósrør (WW 3200 – 3700K)',
+'exif-lightsource-17' => 'Standardljós A',
+'exif-lightsource-18' => 'Standardljós B',
+'exif-lightsource-19' => 'Standardljós C',
 
 'exif-scenecapturetype-1' => 'Landsskap',
 'exif-scenecapturetype-2' => 'Portrett',
@@ -3104,8 +3123,8 @@ Hendan váttanarkoda fer úr gildi tann $4.',
 'version-other' => 'Annað',
 'version-hooks' => 'Krókur',
 'version-hook-name' => 'Krókurnavn',
-'version-version' => '(Útgáva $1)',
-'version-license' => 'Lisensur',
+'version-version' => '(Versjón $1)',
+'version-license' => 'MediaWiki Lisensur',
 'version-poweredby-credits' => "Henda wiki verður rikin av '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'onnur',
 'version-poweredby-translators' => 'translatewiki.net týðarar',
index 58e703d..124fcea 100644 (file)
@@ -20,6 +20,7 @@
  * @author Crochet.david
  * @author Csisc
  * @author Damouns
+ * @author Darkdadaah
  * @author DavidL
  * @author Delhovlyn
  * @author Dereckson
@@ -419,7 +420,6 @@ $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Souligner les liens :',
-'tog-justify' => 'Justifier les paragraphes',
 'tog-hideminor' => 'Masquer les modifications mineures dans les changements récents',
 'tog-hidepatrolled' => 'Masquer les modifications surveillées dans les modifications récentes',
 'tog-newpageshidepatrolled' => 'Masquer les pages surveillées dans la liste des nouvelles pages',
@@ -458,7 +458,7 @@ $messages = array(
 'tog-noconvertlink' => 'Désactiver la conversion des titres',
 'tog-norollbackdiff' => "Ne pas afficher le diff lors d'une révocation",
 'tog-useeditwarning' => "M'avertir quand je quitte une page de modification sans publier les changements",
-'tog-prefershttps' => 'Toujours utiliser une connexion sécurisée en étant connecté(e)',
+'tog-prefershttps' => 'Toujours utiliser une connexion sécurisée en étant connecté',
 
 'underline-always' => 'Toujours',
 'underline-never' => 'Jamais',
@@ -582,7 +582,6 @@ $messages = array(
 'vector-action-protect' => 'Protéger',
 'vector-action-undelete' => 'Rétablir',
 'vector-action-unprotect' => 'Changer la protection',
-'vector-simplesearch-preference' => "Activer la barre de recherche simplifiée (seulement pour l'habillage Vector)",
 'vector-view-create' => 'Créer',
 'vector-view-edit' => 'Modifier',
 'vector-view-history' => "Afficher l'historique",
@@ -685,6 +684,7 @@ $1",
 '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 »',
 'youhavenewmessages' => '{{PLURAL:$3|Vous avez}} $1 ($2).',
 'youhavenewmessagesfromusers' => "{{PLURAL:$4|Vous avez}} $1 {{PLURAL:$3|d'un autre utilisateur|de $3 autres utilisateurs}} ($2).",
@@ -815,7 +815,7 @@ Le motif avancé est « ''$2'' ».",
 L'administrateur qui l'a verrouillé a fourni ce motif : « $3 ».",
 'invalidtitle-knownnamespace' => "Titre invalide avec l'espace de noms « $2 » et l'intitulé « $3 »",
 'invalidtitle-unknownnamespace' => "Titre invalide avec le numéro d'espace de noms $1 et l'intitulé « $2 » inconnus",
-'exception-nologin' => 'Non connecté(e)',
+'exception-nologin' => 'Non connecté',
 'exception-nologin-text' => 'Veuillez [[Special:Userlogin|vous connecter]] pour pouvoir accéder à cette page ou cette action.',
 'exception-nologin-text-manual' => 'Veuillez $1 pour pouvoir accéder à cette page ou cette action.',
 
@@ -867,7 +867,7 @@ N'oubliez pas de modifier [[Special:Preferences|vos préférences pour {{SITENAM
 'userlogin-resetpassword-link' => 'Mot de passe oublié ?',
 'helplogin-url' => 'Help:Connexion',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Aide à la connexion]]',
-'userlogin-loggedin' => 'Vous êtes déjà connecté{{GENDER:$1||e|(e)}} en tant que {{GENDER:$1|$1}}.
+'userlogin-loggedin' => 'Vous êtes déjà connecté{{GENDER:$1||e}} en tant que {{GENDER:$1|$1}}.
 Utilisez le formulaire ci-dessous pour vous connecter avec un autre compte utilisateur.',
 'userlogin-createanother' => 'Créer un autre compte',
 'createacct-join' => 'Entrez vos informations ci-dessous.',
@@ -976,7 +976,7 @@ Si vous décidez de le fournir, il sera utilisé pour attribuer à l’utilisate
 'changepassword-throttled' => 'Vous avez fait trop de tentatives de connexion récemment.
 Veuillez attendre $1 avant de réessayer.',
 'resetpass_forbidden' => 'Les mots de passe ne peuvent pas être changés',
-'resetpass-no-info' => 'Vous devez être connecté(e) pour avoir accès à cette page.',
+'resetpass-no-info' => 'Vous devez être connecté pour avoir accès à cette page.',
 'resetpass-submit-loggedin' => 'Changer de mot de passe',
 'resetpass-submit-cancel' => 'Annuler',
 'resetpass-wrong-oldpass' => 'Mot de passe actuel ou temporaire invalide.
@@ -1017,7 +1017,7 @@ Mot de passe temporaire : $2",
 'changeemail' => 'Changer l’adresse de courriel',
 'changeemail-header' => 'Changer l’adresse de courriel du compte',
 'changeemail-text' => 'Remplissez ce formulaire pour changer votre adresse de courriel. Vous devrez entrer votre mot de passe pour confirmer ce changement.',
-'changeemail-no-info' => 'Vous devez être connecté(e) pour pouvoir accéder directement à cette page.',
+'changeemail-no-info' => 'Vous devez être connecté pour pouvoir accéder directement à cette page.',
 'changeemail-oldemail' => 'Adresse de courriel actuelle :',
 'changeemail-newemail' => 'Nouvelle adresse de courriel :',
 'changeemail-none' => '(aucune)',
@@ -1071,7 +1071,7 @@ Vous devriez le faire si vous les avez partagés accidentellement avec quelqu'un
 'showlivepreview' => 'Aperçu rapide',
 'showdiff' => 'Voir les modifications',
 'anoneditwarning' => "'''Attention :''' vous n'êtes pas identifié(e). Votre adresse IP sera enregistrée dans l'historique de cette page.",
-'anonpreviewwarning' => "''Vous n'êtes pas identifié(e). Sauvegarder enregistrera votre adresse IP dans l'historique des modifications de la page.''",
+'anonpreviewwarning' => "''Vous n'êtes pas identifié. Sauvegarder enregistrera votre adresse IP dans l'historique des modifications de la page.''",
 'missingsummary' => "'''Rappel :''' vous n'avez pas encore fourni le résumé de votre modification.
 Si vous cliquez de nouveau sur le bouton « {{int:savearticle}} », la publication sera faite sans nouvel avertissement.",
 'missingcommenttext' => 'Veuillez entrer un commentaire ci-dessous.',
@@ -1120,7 +1120,7 @@ Elle a peut-être été déplacée ou supprimée depuis que vous avez lu cette p
 'loginreqpagetext' => 'Vous devez vous $1 pour voir les autres pages.',
 'accmailtitle' => 'Mot de passe envoyé.',
 'accmailtext' => "Un mot de passe généré aléatoirement pour [[User talk:$1|$1]] a été envoyé à $2.
-Il peut être modifié sur la page ''[[Special:ChangePassword|Changement de mot de passe]]'' après s’être connecté{{GENDER:$1||e|(e)}}.",
+Il peut être modifié sur la page ''[[Special:ChangePassword|Changement de mot de passe]]'' après connexion.",
 'newarticle' => '(Nouveau)',
 'newarticletext' => "Vous avez suivi un lien vers une page qui n’existe pas encore ou qui a été [{{fullurl:Special:Log|type=delete&page={{FULLPAGENAMEE}}}} effacée]. 
 Pour créer cette page, entrez votre texte dans la boîte ci-après (vous pouvez consulter [[{{MediaWiki:Helppage}}|la page d’aide]] pour plus d’informations). 
@@ -1215,6 +1215,7 @@ La dernière entrée du journal est affichée ci-dessous pour référence :",
 'template-semiprotected' => '(semi-protégé)',
 'hiddencategories' => '{{PLURAL:$1|Catégorie cachée|Catégories cachées}} dont cette page fait partie :',
 'edittools' => '<!-- Tout texte entré ici sera affiché sous les boîtes de modification ou les formulaires de téléversement de fichier. -->',
+'edittools-upload' => '—',
 'nocreatetext' => '{{SITENAME}} a restreint la possibilité de créer de nouvelles pages.
 Vous pouvez revenir en arrière et modifier une page existante, ou bien [[Special:UserLogin|vous connecter ou créer un compte]].',
 'nocreate-loggedin' => "Vous n'avez pas la permission de créer de nouvelles pages.",
@@ -1242,7 +1243,7 @@ Elle existe déjà.",
 'invalid-content-data' => 'Données du contenu non valides',
 'content-not-allowed-here' => 'Le contenu « $1 » n’est pas autorisé sur la page [[$2]]',
 'editwarning-warning' => 'Quitter cette page vous fera perdre toutes les modifications que vous avez faites.
-Si vous êtes connecté, vous pouvez désactiver cet avertissement dans la section « Modification » de vos préférences.',
+Si vous êtes connecté, vous pouvez désactiver cet avertissement dans la section « {{int:prefs-editing}} » de vos préférences.',
 'editpage-notsupportedcontentformat-title' => 'Format de contenu non pris en charge',
 'editpage-notsupportedcontentformat-text' => "Le format de contenu $1 n'est pas pris en charge par le modèle de contenu $2 .",
 
@@ -1276,6 +1277,7 @@ Il devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu'il y en a mainten
 'undo-success' => 'Cette modification va être défaite. Veuillez vérifier les modifications ci-dessous, puis publier si c’est bien ce que vous voulez faire.',
 'undo-failure' => 'Cette modification ne peut pas être défaite : cela entrerait en conflit avec les modifications intermédiaires.',
 'undo-norev' => 'La modification n’a pas pu être défaite parce qu’elle est inexistante ou qu’elle a été supprimée.',
+'undo-nochange' => 'Il semble que la modification aie déjà été annulée.',
 'undo-summary' => 'Annulation des modifications $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]])',
 'undo-summary-username-hidden' => 'Annuler la révision $1 par un utilisateur masqué',
 
@@ -1436,6 +1438,7 @@ Assurez-vous que cette opération conservera la continuité de l'historique de l
 'mergehistory-comment' => '[[:$1]] fusionnée avec [[:$2]] : $3',
 'mergehistory-same-destination' => "Les pages d'origine et de destination ne peuvent pas être la même",
 'mergehistory-reason' => 'Motif :',
+'mergehistory-revisionrow' => '$1 ($2) $3 — $4 $5 $6',
 
 # Merge log
 'mergelog' => 'Journal des fusions',
@@ -1453,7 +1456,8 @@ Assurez-vous que cette opération conservera la continuité de l'historique de l
 'showhideselectedversions' => 'Afficher/masquer les versions sélectionnées',
 'editundo' => 'annuler',
 'diff-empty' => '(Aucune différence)',
-'diff-multi' => '({{PLURAL:$1|Une révision intermédiaire|$1 révisions intermédiaires}} par {{PLURAL:$2|un utilisateur|$2 utilisateurs}} {{PLURAL:$1|est masquée|sont masquées}})',
+'diff-multi-sameuser' => '({{PLURAL:$1|Une révision intermédiaire par le même utilisateur non affichée|$1 révisions intermédiaires par le même utilisateur non affichées}})',
+'diff-multi-otherusers' => '({{PLURAL:$1|Une révision intermédiaire|$1 révisions intermédiaires}} par {{PLURAL:$2|un autre utilisateur|$2 utilisateurs}} non {{PLURAL:$1|affichée|affichées}})',
 'diff-multi-manyusers' => "({{PLURAL:$1|Une révision intermédiaire|$1 révisions intermédiaires}} par plus {{PLURAL:$2|d'un utilisateur|de $2 utilisateurs}} {{PLURAL:$1|est masquée|sont masquées}})",
 'difference-missing-revision' => "{{PLURAL:$2|Une révision|$2 révisions}} de cette différence ($1) {{PLURAL:$2|n'a pas été trouvée|n'ont pas été trouvées}}.
 
@@ -1474,7 +1478,7 @@ Vous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page
 'shown-title' => 'Afficher $1 résultat{{PLURAL:$1||s}} par page',
 'viewprevnext' => 'Voir ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Il existe une page nommée « [[:$1]] » sur ce wiki.''' {{PLURAL:$2|0=|Voyez également les autres résultats de votre recherche.}}",
-'searchmenu-new' => "'''Créer la page « [[:$1|$1]] » sur ce wiki !''' {{PLURAL:$2|0=|Voyez également la page trouvée avec votre recherche.|Voyez également les résultats de votre recherche.}}",
+'searchmenu-new' => '<strong>Créer la page « [[:$1|$1]] » sur ce wiki !</strong> {{PLURAL:$2|0=|Voyez également la page trouvée avec votre recherche.|Voyez également les résultats de votre recherche.}}',
 'searchprofile-articles' => 'Pages de contenu',
 'searchprofile-project' => "Pages d'aide et de projet",
 'searchprofile-images' => 'Multimédia',
@@ -1500,6 +1504,7 @@ Vous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page
 'searchrelated' => 'reliés',
 'searchall' => 'tout',
 'showingresults' => 'Affichage de <b>$1</b> résultat{{PLURAL:$1||s}} à partir du n°<b>$2</b>.',
+'showingresultsinrange' => 'Afficher ci-dessous jusqu’à {{PLURAL:$1|<strong>1</strong> résultat|<strong>$1</strong> résultats}} dans la série #<strong>$2</strong> à #<strong>$3</strong>.',
 'showingresultsnum' => 'Affichage de <b>$3</b> résultat{{PLURAL:$3||s}} à partir du n°<b>$2</b>.',
 'showingresultsheader' => "{{PLURAL:$5|Résultat '''$1'''|Résultats '''$1–$2'''}} de '''$3''' pour '''$4'''",
 'search-nonefound' => "Il n'y a aucun résultat correspondant à la requête.",
@@ -1756,7 +1761,7 @@ Cette information sera publique.',
 'newuserlogpagetext' => "Cette page affiche l'historique des créations de comptes utilisateur.",
 
 # User rights log
-'rightslog' => "Journal des modifications de droits d'utilisateurs",
+'rightslog' => 'Journal des modifications de droits d’utilisateurs',
 'rightslogtext' => "Voici l'historique des modifications des droits des utilisateurs.",
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1856,7 +1861,7 @@ Cette information sera publique.',
 'uploadbtn' => 'Importer le fichier',
 'reuploaddesc' => "Annuler et retourner au formulaire d'import",
 'upload-tryagain' => 'Envoyer la description du fichier modifiée',
-'uploadnologin' => 'Non connecté{{GENDER:||e|(e)}}',
+'uploadnologin' => 'Pas connecté',
 'uploadnologintext' => 'Vous devez $1 pour importer des fichiers.',
 'upload_directory_missing' => 'Le répertoire d’import de fichier ($1) est introuvable et n’a pas pu être créé par le serveur web.',
 'upload_directory_read_only' => 'Le répertoire d’import de fichier ($1) n’est pas accessible en écriture depuis le serveur web.',
@@ -2325,6 +2330,14 @@ Les entrées <del>barrées</del> ont été résolues.',
 'protectedpages-cascade' => 'Uniquement les protections en cascade',
 'protectedpages-noredirect' => 'Masquer les redirections',
 'protectedpagesempty' => "Aucune page n'est protégée de cette façon.",
+'protectedpages-timestamp' => 'Horodatage',
+'protectedpages-page' => 'Page',
+'protectedpages-expiry' => 'Expire le',
+'protectedpages-performer' => 'Protection de l’utilisateur',
+'protectedpages-params' => 'Paramètres de protection',
+'protectedpages-reason' => 'Motif',
+'protectedpages-unknown-timestamp' => 'Inconnu',
+'protectedpages-unknown-performer' => 'Utilisateur inconnu',
 'protectedtitles' => 'Titres protégés',
 'protectedtitlesempty' => "Aucun titre n'est actuellement protégé avec ces paramètres.",
 'listusers' => 'Liste des utilisateurs',
@@ -2343,7 +2356,7 @@ Veuillez noter que d’autres sites peuvent avoir un lien direct vers un fichier
 'unusedcategoriestext' => 'Les catégories suivantes existent mais aucune page ou catégorie ne les utilise.',
 'notargettitle' => 'Pas de cible',
 'notargettext' => "Vous n'avez pas indiqué une page ou un utilisateur sur lequel vous souhaitez effectuer cette action.",
-'nopagetitle' => 'Aucune telle page cible',
+'nopagetitle' => 'Page cible inexistante',
 'nopagetext' => "La page cible que vous avez indiquée n'existe pas.",
 'pager-newer-n' => '{{PLURAL:$1|plus récente|$1 plus récentes}}',
 'pager-older-n' => '{{PLURAL:$1|plus ancienne|$1 plus anciennes}}',
@@ -2361,7 +2374,7 @@ Veuillez noter que d’autres sites peuvent avoir un lien direct vers un fichier
 # Special:Log
 'specialloguserlabel' => 'Auteur :',
 'speciallogtitlelabel' => 'Cible (titre ou utilisateur):',
-'log' => "Journaux d'opérations",
+'log' => 'Journaux d’opérations',
 'all-logs-page' => 'Tous les journaux publics',
 'alllogstext' => "Affichage combiné de tous les journaux disponibles sur {{SITENAME}}.<br />
 Vous pouvez personnaliser l'affichage en sélectionnant le type de journal, le nom d'utilisateur ou la page concernée (ces deux derniers étant sensibles à la casse).",
@@ -2492,8 +2505,8 @@ L'adresse électronique que vous avez indiquée dans [[Special:Preferences|vos p
 'watchlistfor2' => 'Pour $1 $2',
 'nowatchlist' => 'Votre liste de suivi ne référence aucune page.',
 'watchlistanontext' => 'Veuillez vous $1 pour visualiser ou modifier les éléments de votre liste de suivi.',
-'watchnologin' => 'Non connecté(e)',
-'watchnologintext' => 'Vous devez être [[Special:UserLogin|identifié(e)]] pour modifier votre liste de suivi.',
+'watchnologin' => 'Non connecté',
+'watchnologintext' => 'Vous devez être [[Special:UserLogin|identifié]] pour modifier votre liste de suivi.',
 'addwatch' => 'Ajouter à la liste de suivi',
 'addedwatchtext' => 'La page « [[:$1]] » a été ajoutée à votre [[Special:Watchlist|liste de suivi]].
 Les prochaines modifications de cette page et de la page de discussion associée y seront répertoriées.',
@@ -2647,7 +2660,7 @@ Consultez la [[Special:ProtectedPages|liste des pages protégées]] pour la list
 'protectexpiry' => 'Date d’expiration :',
 'protect_expiry_invalid' => "La date d'expiration est invalide.",
 'protect_expiry_old' => "La date d'expiration est déjà passée.",
-'protect-unchain-permissions' => "Déverrouiller davantage d'options de protection",
+'protect-unchain-permissions' => 'Déverrouiller davantage d’options de protection',
 'protect-text' => "Vous pouvez consulter et modifier le niveau de protection de la page '''$1'''.",
 'protect-locked-blocked' => "Vous ne pouvez pas modifier les niveaux de protection tant que vous êtes bloqué{{GENDER:||e|(e)}}.
 Voici les réglages actuels de la page '''$1''' :",
@@ -2748,6 +2761,7 @@ Il a peut-être déjà été restauré.',
 $1',
 'undelete-show-file-confirm' => 'Êtes-vous sûr de vouloir visionner une version supprimée du fichier « <nowiki>$1</nowiki> » datant du $2 à $3 ?',
 'undelete-show-file-submit' => 'Oui',
+'undelete-revision-row' => '$1 $2 ($3) $4 — $5 $6 $7 $8 $9',
 
 # Namespace form on various pages
 'namespace' => 'Espace de noms :',
@@ -2839,7 +2853,7 @@ Donnez ci-dessous un motif précis (par exemple en citant les pages qui ont ét
 'blockipsuccesssub' => 'Blocage réussi',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] a été bloqué{{GENDER:$1||e|}}.<br />
 Consultez la [[Special:BlockList|liste des blocages]] pour revoir les blocages.',
-'ipb-blockingself' => 'Vous êtes sur le point de bloquer votre propre compte ! Êtes-vous certain{{GENDER:||e|(e)}} de vouloir faire cela ?',
+'ipb-blockingself' => 'Vous êtes sur le point de bloquer votre propre compte ! Êtes-vous certain{{GENDER:||e}} de vouloir faire cela ?',
 'ipb-confirmhideuser' => "Vous êtes sur le point de bloquer un utilisateur avec « cacher l'utilisateur » activé. Cela supprime le nom de l'utilisateur dans toutes les listes et les entrées du journal. Êtes-vous sûr de vouloir le faire ?",
 'ipb-confirmaction' => 'Si vous êtes sûr de vraiment vouloir le faire, veuillez cocher le champ « {{int:ipb-confirm}} » en bas.',
 'ipb-edit-dropdown' => 'Modifier les motifs de blocage par défaut',
@@ -2850,8 +2864,8 @@ Consultez la [[Special:BlockList|liste des blocages]] pour revoir les blocages.'
 'unblockip' => 'Débloquer un utilisateur ou une adresse IP',
 'unblockiptext' => 'Utilisez le formulaire ci-dessous pour redonner les droits d’écriture à une adresse IP ou un nom d’utilisateur.',
 'ipusubmit' => 'Supprimer ce blocage',
-'unblocked' => '[[User:$1|$1]] a été débloqué{{GENDER:$1||e|(e)}}',
-'unblocked-range' => '$1 a été débloqué{{GENDER:$1||e|(e)}}',
+'unblocked' => '[[User:$1|$1]] a été débloqué{{GENDER:$1||e}}',
+'unblocked-range' => 'Le compte $1 a été débloqué',
 'unblocked-id' => 'Le blocage $1 a été enlevé',
 'blocklist' => 'Utilisateurs bloqués',
 'ipblocklist' => 'Utilisateurs bloqués',
@@ -2883,8 +2897,8 @@ Consultez la [[Special:BlockList|liste des blocages]] pour revoir les blocages.'
 'change-blocklink' => 'modifier le blocage',
 'contribslink' => 'contributions',
 'emaillink' => 'Envoyer un courriel',
-'autoblocker' => 'Vous avez été bloqué automatiquement parce que votre adresse IP a été récemment utilisée par « [[User:$1|$1]] ».
-Le motif fourni pour le blocage de $1 est : « $2 ».',
+'autoblocker' => 'Vous avez été bloqué automatiquement parce que votre adresse IP a été récemment utilisée par « [[User:$1|$1]] ».
+Le motif fourni pour le blocage de $1 est « $2 »',
 'blocklogpage' => 'Journal des blocages',
 'blocklog-showlog' => 'Cet utilisateur a été bloqué précédemment. Le journal des blocages est disponible ci-dessous :',
 'blocklog-showsuppresslog' => 'Cet utilisateur a été bloqué et caché précédemment. Le journal des suppressions est disponible ci-dessous :',
@@ -2924,7 +2938,7 @@ Vous ne pouvez pas créer un compte.',
 'xffblockreason' => "Une adresse IP dans l'en-tête X-Forwarded-For, soit la vôtre ou celle d'un serveur proxy que vous utilisez, a été bloquée. La raison du blocage initial est : $1",
 'cant-see-hidden-user' => "L’utilisateur que vous tentez de bloquer a déjà été bloqué et masqué. N’ayant pas le droit ''hideuser'', vous ne pouvez pas voir ou modifier le blocage de cet utilisateur.",
 'ipbblocked' => "Vous ne pouvez pas bloquer ou débloquer d'autres utilisateurs, parce que vous êtes vous-même bloqué",
-'ipbnounblockself' => "Vous n'êtes pas autorisé{{GENDER:||e|(e)}} à vous débloquer vous-même",
+'ipbnounblockself' => "Vous n'êtes pas autorisé{{GENDER:||e}} à vous débloquer vous-même",
 
 # Developer tools
 'lockdb' => 'Verrouiller la base de données',
@@ -3085,6 +3099,7 @@ $2",
 'thumbnail_image-type' => "Type d'image non supporté",
 'thumbnail_gd-library' => 'Configuration incomplète de la bibliothèque GD : fonction $1 introuvable',
 'thumbnail_image-missing' => 'Le fichier suivant est introuvable : $1',
+'thumbnail_image-failure-limit' => 'Il y a eu récemment trop de tentatives échouées ($1 ou plus) pour restituer cette vignette. Veuillez réessayer ultérieurement.',
 
 # Special:Import
 'import' => 'Importer des pages',
@@ -3123,7 +3138,7 @@ Son contenu n'a été transféré que partiellement.",
 Un dossier temporaire est manquant.",
 'import-parse-failure' => "Échec lors de l'analyse du XML à importer",
 'import-noarticle' => 'Aucune page à importer !',
-'import-nonewrevisions' => 'Toutes les versions ont été importées auparavant.',
+'import-nonewrevisions' => 'Aucune révision importée (toutes étaient déjà présentes, ou ignorées du fait d’erreurs).',
 'xml-error-string' => '$1 à la ligne $2, colonne $3 (octet $4) : $5',
 'import-upload' => 'Import de données XML',
 'import-token-mismatch' => 'Perte des données de session. Veuillez réessayez.',
@@ -3134,6 +3149,7 @@ Un dossier temporaire est manquant.",
 '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-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>',
 'import-rootpage-invalid' => 'La page racine fournie est un titre non valide.',
 'import-rootpage-nosubpage' => "L'espace de noms « $1 » de la page racine n'autorise pas les sous-pages.",
@@ -3236,6 +3252,7 @@ Vous pouvez toutefois en visualiser la source.',
 'print.css' => '/* Le CSS placé ici affectera les impressions */',
 'noscript.css' => '/* Le CSS placé ici affectera les utilisateurs ayant désactivé Javascript. */',
 'group-autoconfirmed.css' => '/* Le CSS placé ici affectera les utilisateurs auto-confirmés seulement. */',
+'group-user.css' => '/* Le CSS placé ici n’affectera que les utilisateurs enregistrés. */',
 'group-bot.css' => '/* Le CSS placé ici affectera les robots seulement. */',
 'group-sysop.css' => '/* Le CSS inclus ici n’affectera que les administrateurs */',
 'group-bureaucrat.css' => '/* Le CSS inclus ici n’affectera que les bureaucrates */',
@@ -3247,6 +3264,7 @@ Vous pouvez toutefois en visualiser la source.',
 'modern.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Moderne uniquement */',
 'vector.js' => '/* Tout code JavaScript placé ici sera chargé pour les utilisateurs de l’habillage Vector */',
 'group-autoconfirmed.js' => '/* Le JavaScript inclus ici n’affectera que les utilisateurs auto-confirmés */',
+'group-user.js' => '/* Le JavaScript placé ici ne sera chargé que pour les utilisateurs enregistrés. */',
 'group-bot.js' => '/* Le JavaScript inclus ici n’affectera que les robots */',
 'group-sysop.js' => '/* Le JavaScript inclus ici n’affectera que les administrateurs */',
 'group-bureaucrat.js' => '/* Le JavaScript inclus ici n’affectera que les bureaucrates */',
@@ -3368,6 +3386,7 @@ $1',
 Si vous l'exécutez, votre système peut être compromis.",
 'imagemaxsize' => "Taille maximale des images :<br />''(pour les pages de description de fichier)''",
 'thumbsize' => 'Taille de la miniature :',
+'widthheight' => '$1&nbsp;×&nbsp;$2',
 'widthheightpage' => '$1 × $2, $3 page{{PLURAL:$3||s}}',
 'file-info' => 'Taille du fichier : $1, type MIME : $2',
 'file-info-size' => '$1 × $2 pixels, taille du fichier : $3, type MIME : $4',
@@ -3401,6 +3420,10 @@ Si vous l'exécutez, votre système peut être compromis.",
 'sp-newimages-showfrom' => 'Afficher les nouveaux fichiers à partir du $1 à $2',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'video-dims' => '$1, $2&nbsp;×&nbsp;$3',
+'seconds-abbrev' => '$1&nbsp;s',
+'minutes-abbrev' => '$1&nbsp;min',
+'hours-abbrev' => '$1&nbsp;h',
 'days-abbrev' => '$1 j',
 'seconds' => '{{PLURAL:$1|$1 seconde|$1 secondes}}',
 'minutes' => '{{PLURAL:$1|$1 minute|$1 minutes}}',
@@ -3431,6 +3454,22 @@ Si vous l'exécutez, votre système peut être compromis.",
 Seules les listes d’énumération (commençant par *) sont prises en compte. Le premier lien d’une ligne doit être celui d’une mauvaise image.
 Les autres liens sur la même ligne sont considérés comme des exceptions, par exemple des pages sur lesquelles l’image peut apparaître.',
 
+# Variants for Kurdish language
+'variantname-ku-arab' => 'ku-arab',
+'variantname-ku-latn' => 'ku-latn',
+
+# Variants for Tajiki language
+'variantname-tg-cyrl' => 'tg-cyrl',
+'variantname-tg-latn' => 'tg-latn',
+
+# Variants for Inuktitut language
+'variantname-ike-cans' => 'ike-cans',
+'variantname-ike-latn' => 'ike-latn',
+
+# Variants for Tachelhit language
+'variantname-shi-tfng' => 'shi-tfng',
+'variantname-shi-latn' => 'shi-latn',
+
 # Metadata
 'metadata' => 'Métadonnées',
 'metadata-help' => "Ce fichier contient des informations supplémentaires, probablement ajoutées par l'appareil photo numérique ou le numériseur utilisé pour le créer. Si le fichier a été modifié depuis son état original, certains détails peuvent ne pas refléter entièrement l'image modifiée.",
@@ -3630,6 +3669,19 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 'exif-originalimageheight' => "Hauteur de l'image avant qu'elle ait été recadrée",
 'exif-originalimagewidth' => "Largeur de l'image avant qu'elle ait été recadrée",
 
+# Make & model, can be wikified in order to link to the camera and model name
+'exif-contact-value' => '$1
+
+$2
+<div class="adr">
+$3
+
+$6 $4, $5
+
+$7
+</div>
+$8',
+
 # Exif attributes
 'exif-compression-1' => 'Non compressé',
 'exif-compression-2' => 'CCITT Groupe 3 Longueur du codage Huffman modifié de dimension 1',
@@ -3984,16 +4036,27 @@ Veuillez confirmer que vous désirez réellement recréer cette page.",
 'autosumm-new' => 'Page créée avec « $1 »',
 
 # Size units
-'size-bytes' => '$1 o',
-'size-kilobytes' => '$1 Kio',
-'size-megabytes' => '$1 Mio',
-'size-gigabytes' => '$1 Gio',
-'size-terabytes' => '$1 Tio',
-'size-petabytes' => '$1 Pio',
+'size-bytes' => '$1&nbsp;o',
+'size-kilobytes' => '$1&nbsp;Kio',
+'size-megabytes' => '$1&nbsp;Mio',
+'size-gigabytes' => '$1&nbsp;Gio',
+'size-terabytes' => '$1&nbsp;Tio',
+'size-petabytes' => '$1&nbsp;Pio',
 'size-exabytes' => '$1 Eio',
-'size-zetabytes' => '$1 Zio',
+'size-zetabytes' => '$1&nbsp;Zio',
 'size-yottabytes' => '$1 Yio',
 
+# Bitrate units
+'bitrate-bits' => '$1&nbsp;bps',
+'bitrate-kilobits' => '$1&nbsp;kbps',
+'bitrate-megabits' => '$1&nbsp;Mbps',
+'bitrate-gigabits' => '$1&nbsp;Gbps',
+'bitrate-terabits' => '$1&nbsp;Tbps',
+'bitrate-petabits' => '$1&nbsp;Pbps',
+'bitrate-exabits' => '$1&nbsp;Ebps',
+'bitrate-zetabits' => '$1&nbsp;Zbps',
+'bitrate-yottabits' => '$1&nbsp;Ybps',
+
 # Live preview
 'livepreview-loading' => 'Chargement...',
 'livepreview-ready' => 'Chargement … terminé !',
index 716134b..0b222ce 100644 (file)
@@ -313,7 +313,6 @@ $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Solegnér los lims :',
-'tog-justify' => 'Justifiar los paragrafos',
 'tog-hideminor' => 'Cachiér los petiôts changements dedens los dèrriérs changements',
 'tog-hidepatrolled' => 'Cachiér los changements gouardâs dedens los dèrriérs changements',
 'tog-newpageshidepatrolled' => 'Cachiér les pâges gouardâyes entre-mié la lista de les pâges novèles',
@@ -1360,7 +1359,6 @@ Notâd que l’usâjo des lims de navigacion rebeterat a zérô cela colona.',
 'showhideselectedversions' => 'Montrar / cachiér les vèrsions chouèsies',
 'editundo' => 'dèfâre',
 'diff-empty' => '(Niona difèrence)',
-'diff-multi' => '({{PLURAL:$1|Na vèrsion entèrmèdièra|$1 vèrsions entèrmèdières}} per {{PLURAL:$2|un utilisator|$2 utilisators}} {{PLURAL:$1|est pas montrâye|sont pas montrâyes}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Na vèrsion entèrmèdièra|$1 vèrsions entèrmèdières}} per més de $2 utilisator{{PLURAL:$2||s}} {{PLURAL:$1|est pas montrâye|sont pas montrâyes}})',
 'difference-missing-revision' => '{{PLURAL:$2|Na vèrsion|$2 vèrsions}} de cela difèrence ($1) {{PLURAL:$2|est pas étâye trovâye|sont pas étâyes trovâyes}}.
 
@@ -2388,7 +2386,6 @@ Los changements que vegnont de ceta pâge et de la sina pâge de discussion y se
 'watchmethod-list' => 'contrôlo de les pâges siuvues por y trovar des novéls changements',
 'watchlistcontains' => 'Voutra lista de siuvu contint $1 pâge{{PLURAL:$1||s}}.',
 'iteminvalidname' => 'Problèmo avouéc la piéce « $1 », nom pas justo...',
-'wlnote' => "Vê-que {{PLURAL:$1|lo dèrriér changement fêt|los '''$1''' dèrriérs changements fêts}} pendent {{PLURAL:$2|l’hora passâye|les '''$2''' hores passâyes}}, dês $3 a $4.",
 'wlshowlast' => 'Montrar les $1 hores passâyes, los $2 jorns passâs ou ben $3',
 'watchlist-options' => 'Chouèx de la lista de siuvu',
 
@@ -3039,7 +3036,6 @@ Volyéd tornar èprovar.',
 'tooltip-pt-watchlist' => 'La lista de les pâges que vos siude los changements',
 'tooltip-pt-mycontris' => 'La lista de voutres contribucions',
 'tooltip-pt-login' => 'Vos éte encoragiê a vos branchiér ; portant, o est pas oblegatouèro.',
-'tooltip-pt-anonlogin' => 'Vos éte encoragiê a vos branchiér ; portant, o est pas oblegatouèro.',
 'tooltip-pt-logout' => 'Sè dèbranchiér',
 'tooltip-ca-talk' => 'Discussion sur ceta pâge de contegnu',
 'tooltip-ca-edit' => 'Vos pouede changiér ceta pâge.
index 3f69bdf..6aa99a5 100644 (file)
@@ -22,7 +22,6 @@ $linkTrail = '/^([a-zäöüßåāđē]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Ferwisangen onerstrik:',
-'tog-justify' => 'Tekst üs blook saat',
 'tog-hideminor' => 'Letj anrangen fersteeg',
 'tog-hidepatrolled' => 'Letj anrangen fersteeg',
 'tog-newpageshidepatrolled' => 'Kontroliaret sidjen bi a "Nei sidjen" fersteeg',
@@ -184,7 +183,6 @@ $messages = array(
 'vector-action-protect' => 'Seekre',
 'vector-action-undelete' => 'Weder iinstel',
 'vector-action-unprotect' => 'Sidjenseekerhaid',
-'vector-simplesearch-preference' => 'Ianfacher schüklist iinstel (bluas bi Vector)',
 'vector-view-create' => 'Maage',
 'vector-view-edit' => 'Bewerke',
 'vector-view-history' => 'Ferluup uunluke',
@@ -584,6 +582,8 @@ Am det uunmeldin uftuslütjen, skel dü en nei paaswurd iindu.',
 'retypenew' => 'Skriiw det paaswurd noch ans weder hen:',
 'resetpass_submit' => 'Paaswurd saat an uunmelde',
 'changepassword-success' => 'Din paaswurd as feranert wurden!',
+'changepassword-throttled' => 'Dü heest tufölsis fersoocht, di uuntumeldin.
+Wees so gud an teew $1, iar dü det noch ans ferschükst.',
 'resetpass_forbidden' => 'Det paaswurd koon ei feranert wurd.',
 'resetpass-no-info' => 'Dü skel di uunmelde, am üüb det sidj tutugripen.',
 'resetpass-submit-loggedin' => 'Paaswurd feranre',
@@ -635,6 +635,8 @@ Tidjwiis paaswurd: $2',
 'changeemail-password' => 'Din {{SITENAME}} paaswurd:',
 'changeemail-submit' => 'E-mail adres feranre',
 'changeemail-cancel' => 'Ufbreeg',
+'changeemail-throttled' => 'Dü heest tufölsis fersoocht, di uuntumeldin.
+Wees so gud an teew $1, iar dü det noch ans ferschükst.',
 
 # Special:ResetTokens
 'resettokens' => 'Tokens turagsaat',
@@ -849,7 +851,7 @@ Uun't strik- an fersküüw-logbuk oner stäänt muar diartu.",
 'invalid-content-data' => 'Diar stäänt wat uun, wat diar ei hen hiart',
 'content-not-allowed-here' => '„$1“ mut ei skrewen wurd üüb sidj [[$2]]',
 'editwarning-warning' => 'Wan dü detheer sidj slotst, kön feranrangen ferleesen gung.
-Üs uunmeldet brüker könst dü detheer wäärnang bi din iinstelangen oner „Bewerke“ wechknipse.',
+Üs uunmeldet brüker könst dü detheer wäärnang bi din iinstelangen oner „{{int:prefs-editing}}“ ufstel.',
 'editpage-notsupportedcontentformat-title' => 'Detdiar formoot gongt ei.',
 'editpage-notsupportedcontentformat-text' => 'Det formoot $1 gongt ei mä det model $2.',
 
@@ -884,6 +886,7 @@ Diar mut ei muar üs {{PLURAL:$2|1|$2}} brükt wurd. Nü {{PLURAL:$1|woort diar
 Luke oner, of dü det uk würelk du wel, an do seekre din feranrangen.',
 'undo-failure' => 'Det feranrang küd ei stregen wurd, auer di kirew uuntesken feranert wurden as.',
 'undo-norev' => 'Det feranrang küd ei turagsaat wurd, auer diar niks as of auer det sidj stregen wurden as.',
+'undo-nochange' => 'Detdiar feranrang as wel al ans turagsaat wurden.',
 'undo-summary' => 'Feranrang $1 faan [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskusjuun]]) turagsaat.',
 'undo-summary-username-hidden' => 'Feranrang $1 faan en ferbürgenen brüker turagsaat',
 
@@ -1057,7 +1060,8 @@ A nawigatjuun-links saat ales weder turag üüb di ual stant.',
 'showhideselectedversions' => 'Werjuunen wise of fersteeg',
 'editundo' => 'turagsaat',
 'diff-empty' => '(nään ferskeel)',
-'diff-multi' => '({{PLURAL:$1|Ian werjuun diartesken|$1 werjuunen diartesken}} faan {{PLURAL:$2|ään brüker|$2 brükern}} {{PLURAL:$1|woort|wurd}} ei uunwiset)',
+'diff-multi-sameuser' => '({{PLURAL:$1|Ian werjuun diartesken|$1 werjuunen diartesken}} faan disalew brüker {{PLURAL:$1|woort|wurd}} ei uunwiset)',
+'diff-multi-otherusers' => '({{PLURAL:$1|Ian werjuun diartesken|$1 werjuunen diartesken}} faan {{PLURAL:$2|ään öödern brüker|$2 ööder brükern}} {{PLURAL:$1|woort|wurd}} ei uunwiset)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Ian werjuun diartesken|$1 werjuunen diartesken}} faan muar üs $2 {{PLURAL:$2|brüker|brükern}} wurd ei uunwiset)',
 'difference-missing-revision' => "{{PLURAL:$2|Ian werjuun|$2 werjuunen}} faan di ferskeel ($1) {{PLURAL:$2|as|san}} ei fünjen wurden.
 
@@ -1078,7 +1082,7 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'shown-title' => 'Wise $1 {{PLURAL:$1|resultaat|resultaaten}} per sidj',
 'viewprevnext' => 'Wise ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Deer as en sid nååmd \"[[:\$1]]\" önj jüdeer Wiki'''",
-'searchmenu-new' => "'''Maage det sidj „[[:$1]]“ uun detheer wiki.'''",
+'searchmenu-new' => '<strong>Maage det sidj „[[:$1]]“ uun detheer wiki!</strong> {{PLURAL:$2|0=|Luke uk bi det fünjen sidj.|Luke uk bi a fünjen sidjen.}}',
 'searchprofile-articles' => 'Artiikler',
 'searchprofile-project' => 'Halep- an Projektsidjen',
 'searchprofile-images' => 'Multimedia',
@@ -1094,6 +1098,7 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'search-result-score' => 'Relewans: $1 %',
 'search-redirect' => '(widjerfeerd faan „$1“)',
 'search-section' => '(kirew $1)',
+'search-file-match' => '(fünjen tekst)',
 'search-suggest' => 'Mendst dü „$1“?',
 'search-interwiki-caption' => 'Saster-projekten',
 'search-interwiki-default' => '$1 resultaaten:',
@@ -1103,6 +1108,7 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'searchrelated' => 'ferbünjen',
 'searchall' => 'aaltumaal',
 'showingresults' => "Heer {{PLURAL:$1|as '''1''' resultaat|san '''$1''' resultaaten}}, jo began mä numer '''$2.'''",
+'showingresultsinrange' => 'Oner {{PLURAL:$1|woort <strong>ian</strong> resultaat|wurd bit tu <strong>$1</strong> resultaaten}} tesken <strong>$2</strong> an <strong>$3</strong> uunwiset.',
 'showingresultsnum' => "Heer {{PLURAL:$3|as '''1''' resultaat|san '''$3''' resultaaten}}, jo began mä numer '''$2.'''",
 'showingresultsheader' => "{{PLURAL:$5|resultaat '''$1''' faan '''$3'''|resultaaten '''$1-$2''' faan '''$3'''}}, för '''$4.'''",
 'search-nonefound' => 'För din uunfraag san nian resultaaten fünjen wurden.',
@@ -1901,6 +1907,14 @@ Uun arke rä stun ferwisangen tu't iarst an ööder widjerfeerang an uk tu det s
 'protectedpages-cascade' => 'Bluas sidjen mä kaskaaden-seekerhaid',
 'protectedpages-noredirect' => 'Widjerfeerangen fersteeg',
 'protectedpagesempty' => 'Uun uugenblak san sok sidjen ei seekert.',
+'protectedpages-timestamp' => 'Tidjstempel',
+'protectedpages-page' => 'Sidj',
+'protectedpages-expiry' => 'Lääpt uf di',
+'protectedpages-performer' => 'Seekert faan',
+'protectedpages-params' => 'Seekerangsdooten',
+'protectedpages-reason' => 'Grünj',
+'protectedpages-unknown-timestamp' => 'Ünbekäänd',
+'protectedpages-unknown-performer' => 'Ünbekäänd brüker',
 'protectedtitles' => 'Seekert sidjennöömer',
 'protectedtitlesempty' => 'Uun uugenblak san sok sidjen ei speret.',
 'listusers' => 'Brükerfertiaknis',
@@ -2084,7 +2098,7 @@ Feranrangen faan detdiar sidj wurd üüb detdiar list fäästhäälen.",
 'watchmethod-list' => "Sidjen, diar dü uun't uug heest, am a leetst feranrangen beluke",
 'watchlistcontains' => "Dü häälst $1 {{PLURAL:$1|sidj|sidjen}} uun't uug.",
 'iteminvalidname' => 'Mä di iindrach „$1“ stemet wat ei, di nööm as ferkiard.',
-'wlnote' => "Diar {{PLURAL:$1|stäänt det leetst feranrang|stun a leetst '''$1''' feranrangen}} faan a leetst {{PLURAL:$2|stünj|'''$2''' stünjen}}. Stant: $3, klook $4.",
+'wlnote2' => 'Diar stun a feranrangen faan a leetst {{PLURAL:$1|stünj|<strong>$1</strong> stünjen}}, üüb a stant faan $2, $3.',
 'wlshowlast' => 'Wise a feranrangen faan leetst $1 stünjen, $2 daar of $3.',
 'watchlist-options' => "Iinstelangen för't uunwisin",
 
@@ -2164,7 +2178,7 @@ Halep an muar diartu: {{canonicalurl:{{MediaWiki:Helppage}}}}',
 'delete-edit-reasonlist' => "Grünjer för't striken bewerke",
 'delete-toobig' => 'Detdiar sidj hää muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} . Sok sidjen kön ei so gau stregen wurd, ööders san a servers plaat.',
 'delete-warning-toobig' => "Detdiar sidj hää muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} . Det striken koon komer maage bi't dootenbeenk.",
-'deleting-backlinks-warning' => "'''Paase üüb:''' Diar ferwise noch ööder sidjen üüb det sidj, diar dü strik wel.",
+'deleting-backlinks-warning' => "'''Paase üüb:''' Diar ferwise noch ööder sidjen üüb det sidj, diar dü strik wel. Of det sidj as noch huarööders iinbünjen.",
 
 # Rollback
 'rollback' => 'Feranrangen turagsaat',
@@ -2461,7 +2475,7 @@ Luke bi't [[Special:BlockList|sperlist]] för aal jo aktuel speren.",
 'range_block_disabled' => 'Det mögelkhaid, hialer adresrümer tu sperin, as ei aktiif.',
 'ipb_expiry_invalid' => 'Didiar tidjrüm gongt ei.',
 'ipb_expiry_temp' => 'Ferbürgen brükernööm-speren skel permanent wees.',
-'ipb_hide_invalid' => 'Detdiar brükerkonto koon ei ferbürgen wurd, auer diar tuföl feranrangen uun a ferluup stun.',
+'ipb_hide_invalid' => 'Detdiar brükerkonto koon ei ferbürgen wurd, auer diar muar üs {{PLURAL:$1|ian feranrang|$1 feranrangen}} uun a ferluup stun.',
 'ipb_already_blocked' => '„$1“ as al speret',
 'ipb-needreblock' => '$1 as al speret. Wel dü a speriinstelangen feranre?',
 'ipb-otherblocks-header' => 'Ööder {{PLURAL:$1|sper|speren}}',
@@ -2622,6 +2636,7 @@ Wees so gud an beschük a sidjen [https://www.mediawiki.org/wiki/Localisation Me
 'allmessages-prefix' => 'Filter mä prefix:',
 'allmessages-language' => 'Spriak:',
 'allmessages-filter-submit' => 'Widjer',
+'allmessages-filter-translate' => 'Auersaat',
 
 # Thumbnails
 'thumbnail-more' => 'Fergratre',
@@ -2638,6 +2653,7 @@ $2',
 'thumbnail_image-type' => 'Sok bilen kön ei brükt wurd',
 'thumbnail_gd-library' => 'GD-bibleteek ei gans diar: Det funktjuun $1 waant',
 'thumbnail_image-missing' => 'Det datei as wel ei diar: $1',
+'thumbnail_image-failure-limit' => 'Detdiar föörskaubil as uun a leetst tidj tufölsis ($1 of muarsis) feranert wurden. Ferschük det leeder man noch ans.',
 
 # Special:Import
 'import' => 'Sidjen importiare',
@@ -2671,7 +2687,7 @@ Transwiki-import-aktjuunen wurd uun't [[Special:Log/import|Import-logbuk]] fää
 'importuploaderrortemp' => "Bi't huuchschüüren faan det importdatei as wat skiaf gingen. Diar as nian tidjwiis fertiaknis.",
 'import-parse-failure' => "Bi't importiarin faan det XML-datei as wat skiaf gingen.",
 'import-noarticle' => 'Diar as nian sidj tu importiarin bestemet wurden.',
-'import-nonewrevisions' => 'Aal jodiar werjuunen san al ans importiaret wurden.',
+'import-nonewrevisions' => 'Diar wurd nian werjuunen importiaret, auer jo eder al diar wiar of auersprüngen wurden san.',
 'xml-error-string' => '$1 uun rä $2, türn $3 (byte $4): $5',
 'import-upload' => 'XML-datein importiare',
 'import-token-mismatch' => 'Session dooten san wech. Ferschük det noch ans weder.',
@@ -2682,6 +2698,7 @@ Transwiki-import-aktjuunen wurd uun't [[Special:Log/import|Import-logbuk]] fää
 'import-error-special' => 'Det sidj „$1“ as ei importiaret wurden, auer hat tu en nöömrüm hiart, huar nian sidjen mögelk san.',
 'import-error-invalid' => 'Det sidj „$1“ as ei importiaret wurden, auer di nööm ei stemet.',
 'import-error-unserialize' => 'Det werjuun $2 faan det sidj „$1“ küd ei deserialisiaret wurd. Det werjuun woort mä det münster $3 brükt, an det as mä $4 serialisiaret.',
+'import-error-bad-location' => 'Det feranrang $2 mä model $3 koon ei üs "$1" üüb detheer wiki seekert wurd, auer detdiar model heer ei brükt wurd koon.',
 'import-options-wrong' => 'Ferkiard {{PLURAL:$2|iinstelang|iinstelangen}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Didiar sidjennööm as ferkiard.',
 'import-rootpage-nosubpage' => 'Uun di nöömrüm „$1“ jaft at nian onersidjen.',
@@ -2713,7 +2730,6 @@ Transwiki-import-aktjuunen wurd uun't [[Special:Log/import|Import-logbuk]] fää
 'tooltip-pt-watchlist' => "Sidjen, diar dü uun't uug behual wel",
 'tooltip-pt-mycontris' => 'List mä aanj bidracher',
 'tooltip-pt-login' => 'Wan dü di uunmeldest, heest dü muar mögelkhaiden. Dü säärst det oober ei.',
-'tooltip-pt-anonlogin' => 'Wan dü di uunmeldest, heest dü muar mögelkhaiden. Dü säärst det oober ei.',
 'tooltip-pt-logout' => 'Ufmelde',
 'tooltip-ca-talk' => 'Diskusjuun auer di artiikel',
 'tooltip-ca-edit' => 'Sidj bewerke. Luke di det iarst ans uun, iar dü det seekerst.',
@@ -3318,7 +3334,7 @@ Ferwisangen uun det salew rä wurd üs ütjnoomen uunsen, huar det datei dach uu
 'exif-gpsdirection-t' => 'Rochtwisin kurs',
 'exif-gpsdirection-m' => 'Magneetisk kurs',
 
-'exif-ycbcrpositioning-1' => 'Sentriaret',
+'exif-ycbcrpositioning-1' => 'Uun a maden',
 'exif-ycbcrpositioning-2' => 'Uun naiberskap',
 
 'exif-dc-contributor' => 'Bidracher faan',
@@ -3822,4 +3838,6 @@ Uk parser-funktjuunen liküs <code><nowiki>{{</nowiki>#language:…}}</code> an
 'expand_templates_generate_rawhtml' => 'Rä HTML uunwise',
 'expand_templates_preview' => 'Föörskau',
 
+# Unknown messages
+'uploadinvalidxml' => "Det XML uun det huuchschüürd datei küd ei ''parset'' wurd.",
 );
index 879dcb1..c26557c 100644 (file)
@@ -120,7 +120,6 @@ $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Sotlinee leams',
-'tog-justify' => 'Justifiche paragraf',
 'tog-hideminor' => 'Plate lis piçulis modifichis tai ultins cambiaments',
 'tog-hidepatrolled' => 'Plate lis modifichis controladis intai ultins cambiaments',
 'tog-newpageshidepatrolled' => 'Plate lis pagjinis verificadis de liste des pagjinis gnovis',
@@ -129,9 +128,7 @@ $messages = array(
 'tog-numberheadings' => 'Numerazion automatiche dai titui',
 'tog-showtoolbar' => 'Mostre sbare dai imprescj pe modifiche (JavaScript)',
 'tog-editondblclick' => 'Cambie lis pagjinis fracant dôs voltis',
-'tog-editsection' => 'Inserìs un leam [cambie] pe editazion veloç di une sezion',
 'tog-editsectiononrightclick' => 'Modifiche une sezion fracant cul tast diestri<br /> sui titui des sezions',
-'tog-showtoc' => 'Mostre la tabele dai contignûts pes pagjinis cun plui di 3 sezions',
 'tog-rememberpassword' => 'Visiti di me su chest sgarfadôr (par un massim di $1 {{PLURAL:$1|zornade|zornadis}})',
 'tog-watchcreations' => 'Zonte  lis pagjinis creadis e i file cjariats aes oservadis specials',
 'tog-watchdefault' => 'Zonte in automatic lis pagjinis che o cambii inte liste di chês tignudis di voli',
@@ -736,7 +733,6 @@ Leiende: (cur) = difarencis cun la version atuâl, (prec) = difarencis cun la ve
 'lineno' => 'Rie $1:',
 'compareselectedversions' => 'Confronte versions selezionadis',
 'editundo' => 'anule',
-'diff-multi' => '({{PLURAL:$1|Une revision intermedie|$1 revisions intermediis}} di {{PLURAL:$2|un utent no mostrade|$2 utents no mostradis}})',
 
 # Search results
 'searchresults' => 'Risultâts de ricercje',
@@ -1220,7 +1216,6 @@ e la pagjine e sarà '''gruessute''' te [[Special:RecentChanges|liste dai ultins
 'wlheader-enotif' => 'Notifiche par pueste eletroniche ativade.',
 'wlheader-showupdated' => "Lis pagjinis gambiadis de ultime volte che tu lis âs cjaladis a son mostradis in '''gruessut'''",
 'watchlistcontains' => 'Tu stâs tignint di voli $1 {{PLURAL:$1|pagjine|pagjinis}}.',
-'wlnote' => "Ca sot {{PLURAL:$1|al è il cambiament plui recent|a son i '''$1''' cambiaments plui recents}} {{PLURAL:$2|inte ultime ore|intes '''$2''' oris passadis}}.",
 'wlshowlast' => 'Mostre ultimis $1 oris $2 zornadis $3',
 'watchlist-options' => 'Opzions pe liste dai tignûts di voli',
 
@@ -1462,7 +1457,6 @@ Par plasê va su [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisa
 'tooltip-pt-watchlist' => 'La liste des pagjinis che tu stâs tignint di voli',
 'tooltip-pt-mycontris' => 'Liste dai tiei contribûts',
 'tooltip-pt-login' => 'La regjistrazion e je conseade, ancje se no obligatorie.',
-'tooltip-pt-anonlogin' => 'La regjistrazion e je conseade, ma no si scugne fâle',
 'tooltip-pt-logout' => 'Jes (logout)',
 'tooltip-ca-talk' => 'Discussions su cheste pagjine',
 'tooltip-ca-edit' => 'Tu puedis cambiâ cheste pagjine. Par plasê dopre il boton de anteprime prime di salvâ.',
index b59ae53..7eb33c5 100644 (file)
@@ -145,7 +145,6 @@ $linkTrail = '/^([a-zàáèéìíòóùúâêîôûäëïöü]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Keppelings ûnderstreekje:',
-'tog-justify' => 'Paragrafen útfolje',
 'tog-hideminor' => "Tekstwizigings wei litte út 'Koartlyn feroare'",
 'tog-hidepatrolled' => 'Markearre feroarings ferskûlje yn resinte feroarings',
 'tog-newpageshidepatrolled' => "Markearre siden ferskûlje yn 'e list mei nije siden",
@@ -154,9 +153,7 @@ $messages = array(
 'tog-numberheadings' => 'Koppen fansels nûmerje',
 'tog-showtoolbar' => 'Brûk arkbalke by bewurkjen',
 'tog-editondblclick' => 'Dûbelklik jout bewurkingsside (freget JavaScript)',
-'tog-editsection' => 'Jou [bewurk]-keppelings foar seksjebewurking',
 'tog-editsectiononrightclick' => 'Rjochtsklik op sekjsetitels jout seksjebewurking (freget JavaScript)',
-'tog-showtoc' => 'Ynhâldsopjefte, foar siden mei mear as twa koppen',
 'tog-rememberpassword' => 'Oare kear fansels oanmelde (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'tog-watchcreations' => "Set siden dy't jo begjinne yn jo folchlist",
 'tog-watchdefault' => "Sides dy't jo feroare hawwe folgje",
@@ -937,7 +934,6 @@ Tink derom it brûken fan de navigaasjeferwizings dy kolom op'e nij ynstelt.",
 'compareselectedversions' => 'Ferlykje selektearre ferzjes',
 'showhideselectedversions' => 'Oantikke ferzjes wol/net sjen litte',
 'editundo' => 'werom sette',
-'diff-multi' => '({{PLURAL:$1|Ien tuskenlizzende ferzje wurdt|$1 tuskenlizzende ferzjes wurde}} net sjen litten.)',
 
 # Search results
 'searchresults' => 'Sykresultaat',
@@ -1704,7 +1700,6 @@ At jo letter in side net mear folgje wolle, dan brûke jo op dy side de keppelin
 'watchmethod-list' => 'Folge ...',
 'watchlistcontains' => 'Jo folgje op it stuit $1 {{PLURAL:$1|side|siden}}.',
 'iteminvalidname' => 'Misse namme: "$1" ...',
-'wlnote' => "Dit {{PLURAL:$1|is de lêste feroaring|binne de lêste '''$1''' feroarings}} yn de lêste {{PLURAL:$2|oer|'''$2''' oeren}}.",
 'wlshowlast' => 'Lit feroarings sjen fan de lêste $1 oeren $2 dagen $3',
 
 # Displayed when you click the "watch" button and it is in the process of watching
index 3934280..e581769 100644 (file)
@@ -98,7 +98,6 @@ $namespaceAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Folínte faoi naisc:',
-'tog-justify' => 'Comhfhadaigh na paragraif',
 'tog-hideminor' => 'Ná taispeáin mionathruithe i measc na n-athruithe is déanaí',
 'tog-hidepatrolled' => 'Folaigh giotaí eagartha smachtaithe sna athruithe is déanaí',
 'tog-newpageshidepatrolled' => 'Folaigh leathanaigh smachtaithe ó liosta leathanaigh úire',
@@ -107,9 +106,7 @@ $messages = array(
 'tog-numberheadings' => 'Uimhrigh ceannteidil go huathoibríoch',
 'tog-showtoolbar' => 'Taispeáin an barra uirlisí eagair (JavaScript)',
 'tog-editondblclick' => 'Déghliogáil chun leathanaigh a chur in eagar (JavaScript)',
-'tog-editsection' => 'Cumasaigh mír-eagarthóireacht le naisc mar seo: [athrú]',
 'tog-editsectiononrightclick' => 'Cumasaigh mír-eagarthóireacht le deaschliceáil<br /> ar cheannteidil (JavaScript)',
-'tog-showtoc' => "Taispeáin an clár ábhair (d'ailt le níos mó ná 3 ceannteidil)",
 'tog-rememberpassword' => 'Cuimhnigh orm ar an ríomhaire seo (ar feadh uastréimhse de $1 {{PLURAL:$1|lá|lá}})',
 'tog-watchcreations' => 'Cuir ar mo liosta faire leathanaigh a chruthaím',
 'tog-watchdefault' => 'Déan faire ar leathanaigh a athraím',
@@ -758,7 +755,6 @@ Treoir: (rth) = difríocht ón leagan reatha, (rmh) = difríocht ón leagan roim
 'lineno' => 'Líne $1:',
 'compareselectedversions' => 'Cuir na leagain roghnaithe i gcomparáid',
 'editundo' => 'cealaigh',
-'diff-multi' => '({{PLURAL:$1|Leasú idirmheánach amháin|$1 leasú idirmheánach}} le {{PLURAL:$2|úsáideoir amháin|$2 úsáideoirí}} nach thaispeántar.)',
 
 # Search results
 'searchresults' => 'Torthaí an chuardaigh',
@@ -1258,7 +1254,6 @@ agus beidh '''cló trom''' ar a theideal san [[Special:RecentChanges|liosta de n
 'watchmethod-list' => 'ag seiceáil na leathanaigh faire ar do chuid athruithe deireanacha',
 'watchlistcontains' => 'Tá {{PLURAL:$1|leathanach amháin|$1 leathanaigh}} ar do liosta faire.',
 'iteminvalidname' => "Fadhb leis an mír '$1', ainm neamhbhailí...",
-'wlnote' => "Is {{PLURAL:$1|é seo thíos an t-athrú deireanach|iad seo thíos na '''$1''' athruithe deireanacha}} {{PLURAL:$2|san uair deireanach|sna '''$2''' uaire deireanacha}}.",
 'wlshowlast' => 'Líon na n-uair is déanaí le taispeáint: $1. Líon na laethanta is déanaí le taispeáint: $2. Taispeáin $3.',
 'watchlist-options' => 'Roghanna don liosta faire',
 
@@ -1649,7 +1644,6 @@ ní féidir uaslódála staire díreacha a dhéanamh faoi láthair.",
 'tooltip-pt-watchlist' => 'Liosta de na leathanaigh a bhfuil tú á bhfaire ar athruithe',
 'tooltip-pt-mycontris' => 'Liosta do chuid dréachtaí',
 'tooltip-pt-login' => 'Moltar duit logáil isteach, ach níl sé riachtanach.',
-'tooltip-pt-anonlogin' => 'Moltar duit logáil isteach, ach níl sé riachtanach.',
 'tooltip-pt-logout' => 'Logáil amach',
 'tooltip-ca-talk' => 'Plé maidir leis an leathanach ábhair',
 'tooltip-ca-edit' => 'Is féidir leat an leathanach seo a athrú. Más é do thoil é, bain úsáid as an cnaipe réamhamhairc roimh sábháil a dhéanamh.',
index 0351603..62b8e38 100644 (file)
@@ -35,7 +35,6 @@ $namespaceNames = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => '下划链接',
-'tog-justify' => '对到段落',
 'tog-hideminor' => '该朝子𠮶改动弆到𠮶细修改',
 'tog-hidepatrolled' => '到个昼子𠮶修改里头弆到巡查过𠮶编辑',
 'tog-newpageshidepatrolled' => '到新页清单里头弆到巡查过𠮶页面',
@@ -44,9 +43,7 @@ $messages = array(
 'tog-numberheadings' => '标题自动编号',
 'tog-showtoolbar' => '显示编辑工具栏(JavaScript)',
 'tog-editondblclick' => '按两下改吖(JavaScript)',
-'tog-editsection' => '可以用[编写]链接来编写个别段落',
 'tog-editsectiononrightclick' => '可以按右键来编写只把子段落(JavaScript)',
-'tog-showtoc' => '超过三只标题就显到目录',
 'tog-rememberpassword' => '到个只电脑记到我𠮶密码(至多$1{{PLURAL:$1|日|日}})',
 'tog-watchcreations' => '拿偶开嘞𠮶页面加到偶𠮶监视列表',
 'tog-watchdefault' => '拿偶改嘞𠮶页面加到偶𠮶监视列表',
@@ -697,7 +694,6 @@ $2',
 'lineno' => '第$1行:',
 'compareselectedversions' => '比较拣正𠮶版本',
 'editundo' => '还原',
-'diff-multi' => '{{PLURAL:$2|1只用户|$2只用户}}舞𠮶{{PLURAL:$1|一只中途修改|$1只中途修改}}冇拕显示)',
 
 # Search results
 'searchresults' => '寻到𠮶结果',
@@ -1218,7 +1214,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watchmethod-list' => '望吖监视页里头最晏𠮶改动',
 'watchlistcontains' => '倷𠮶监视列表包含$1只页面。',
 'iteminvalidname' => "页面'$1'出错,无效命名...",
-'wlnote' => "下底系最近'''$2'''钟头内𠮶最晏'''$1'''道修改:",
 'wlshowlast' => '显示近来$1钟头$2日$3𠮶改动',
 'watchlist-options' => '监视清单选项',
 
@@ -1625,7 +1620,6 @@ Please visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation
 'tooltip-pt-watchlist' => '偶𠮶监视列表',
 'tooltip-pt-mycontris' => '偶𠮶贡献列表',
 'tooltip-pt-login' => '登入系伓强制𠮶,但佢会有蛮多好处',
-'tooltip-pt-anonlogin' => '登入系伓强制𠮶,但佢会有蛮多好处',
 'tooltip-pt-logout' => '登出',
 'tooltip-ca-talk' => '内容页𠮶讨论',
 'tooltip-ca-edit' => '倷编得正个页,但劳烦倷望佢一眼起再存到佢。',
index 334c848..cc3c174 100644 (file)
@@ -56,7 +56,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => '下劃連結',
-'tog-justify' => '對到段落',
 'tog-hideminor' => '該晝子嗰改動弆到嗰細修改',
 'tog-hidepatrolled' => '到箇晝子嗰修改裡頭弆到巡查過嗰編輯',
 'tog-newpageshidepatrolled' => '到新頁清單裡頭弆到巡查過嗰頁面',
@@ -65,9 +64,7 @@ $messages = array(
 'tog-numberheadings' => '標題自動編號',
 'tog-showtoolbar' => '顯示編輯工具欄(JavaScript)',
 'tog-editondblclick' => '捺兩下來改下(JavaScript)',
-'tog-editsection' => '可以用[編寫]連結來編寫個別段落',
 'tog-editsectiononrightclick' => '可以按右鍵來編寫隻把子段落(JavaScript)',
-'tog-showtoc' => '超過三隻標題就顯到目錄',
 'tog-rememberpassword' => '到箇隻電腦記到我嗰密碼(至多$1{{PLURAL:$1|日|日}})',
 'tog-watchcreations' => '搦我開嗰頁面加到我嗰監視列表',
 'tog-watchdefault' => '搦我改嗰頁面加到我嗰監視列表',
@@ -718,7 +715,6 @@ $2',
 'lineno' => '第$1行:',
 'compareselectedversions' => '對比揀正嗰版本',
 'editundo' => '還原',
-'diff-multi' => '{{PLURAL:$2|1隻用戶|$2隻用戶}}舞嗰{{PLURAL:$1|一隻中途修改|$1隻中途修改}}冇拕顯示)',
 
 # Search results
 'searchresults' => '尋到嗰結果',
@@ -1239,7 +1235,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watchmethod-list' => '望吖監視頁裡頭頂晏嗰改動',
 'watchlistcontains' => '倷嗰監視列表包含$1隻頁面。',
 'iteminvalidname' => "頁面'$1'出錯,無效命名...",
-'wlnote' => "下底係最近'''$2'''鐘頭內嗰最晏'''$1'''道修改:",
 'wlshowlast' => '顯示箇日子$1鐘頭$2日$3嗰改動',
 'watchlist-options' => '監視清單選項',
 
@@ -1646,7 +1641,6 @@ Please visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation
 'tooltip-pt-watchlist' => '汝嗰監視列表嗰改動',
 'tooltip-pt-mycontris' => '汝嗰貢獻列表',
 'tooltip-pt-login' => '汝登入會得佢蠻多惠,但冇人訛得汝。',
-'tooltip-pt-anonlogin' => '汝登入會得佢蠻多惠,但冇人訛得汝。',
 'tooltip-pt-logout' => '登出',
 'tooltip-ca-talk' => '內容頁嗰討論',
 'tooltip-ca-edit' => '汝編得正箇頁,但勞為汝望多一眼起,再存到佢。',
index b1cba05..85066a6 100644 (file)
@@ -37,7 +37,6 @@ $namespaceNames = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Fo-loidhneadh nan ceanglaichean:',
-'tog-justify' => 'Taobhaich na h-earrannan',
 'tog-hideminor' => 'Falaich mùthaidhean beaga ann an liosta nam mùthaidhean ùra',
 'tog-hidepatrolled' => 'Falaich mùthaidhean fo fhaire ann an liosta nam mùthaidhean ùra',
 'tog-newpageshidepatrolled' => 'Falaich duilleagan fo fhaire ann an liosta nan duilleagan ùra',
@@ -46,9 +45,7 @@ $messages = array(
 'tog-numberheadings' => 'Cuir àireamhan ri ceann-sgrìobhaidhean leis fhèin',
 'tog-showtoolbar' => 'Seall am bàr-inneal deasachaidh',
 'tog-editondblclick' => 'Tòisich air deasachadh duilleige le briogadh dùbailte',
-'tog-editsection' => 'Cuir am comas deasachadh earainn le ceanglaichean [deasaich]',
 'tog-editsectiononrightclick' => "Cuir an comas deasachadh earrainn le briogadh deas air tiotal de dh'earrainn",
-'tog-showtoc' => 'Seall an clàr-innse (air duilleagan air a bheil barrachd air 3 ceann-sgrìobhaidhean)',
 'tog-rememberpassword' => "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|latha|làithean|latha}})",
 'tog-watchcreations' => "Cuir duilleagan a chruthaicheas mi air a' chlàr-fhaire agam",
 'tog-watchdefault' => "Cuir duilleagan a dheasaicheas mi air a' chlàr-fhaire agam",
@@ -1090,7 +1087,6 @@ Thoir an aire gun dèid an colbh seo ath-shuidheachadh ma chleachdas tu ceanglai
 'showhideselectedversions' => 'Seall/Falaich na lèirmheasan a thagh thu',
 'editundo' => 'neo-dhèan',
 'diff-empty' => '(Gun diofar eatarra)',
-'diff-multi' => '({{PLURAL:$1|Aon lèirmheas eadar-mheadhanach||$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|aon chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} gun sealltainn)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Aon lèirmheas eadar-mheadhanach||$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|aon chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} gun sealltainn)',
 
 # Search results
@@ -1491,7 +1487,6 @@ Nochdaidh mùthaidhean a nithear air an duilleag seo \'s air an duilleag deasbai
 'watchmethod-recent' => "A' sgrùdadh deasachaidhean ùra airson duilleagan air d' fhaire",
 'watchmethod-list' => "A' sgrùdadh duilleagan air d' fhaire airson deasachaidhean ùra",
 'watchlistcontains' => 'Tha $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}} air do chlàr-faire.',
-'wlnote' => 'Seo {{PLURAL:$1|an $1 mhùthadh|$1 mhùthadh|na $1 mùthaidhean|$1 mùthadh}} mu dheireadh san {{PLURAL:$2|$2 uair a thìde|$2 uair a thìde|$2 uairean a thìde|$2 uair a thìde}} mu dheireadh, mar a bha e $3, $4.',
 'wlshowlast' => 'Seall na $1 uairean a thìde mu dheireadh $2 làithean mu dheireadh $3',
 'watchlist-options' => 'Roghainnean mo chlàir-faire',
 
index 5692e83..db2e588 100644 (file)
@@ -286,7 +286,6 @@ $separatorTransformTable = array( ',' => '.', '.' => ',' );
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Subliñar as ligazóns:',
-'tog-justify' => 'Xustificar os parágrafos',
 'tog-hideminor' => 'Agochar as edicións pequenas nos cambios recentes',
 'tog-hidepatrolled' => 'Agochar as edicións patrulladas nos cambios recentes',
 'tog-newpageshidepatrolled' => 'Agochar as páxinas revisadas da lista de páxinas novas',
@@ -1137,7 +1136,7 @@ Esta xa existe.',
 'invalid-content-data' => 'Datos de contido inválidos',
 'content-not-allowed-here' => 'O contido "$1" non está permitido na páxina "[[$2]]"',
 'editwarning-warning' => 'Deixar esta páxina pode causar a perda de calquera cambio feito.
-Se accedeu ao sistema, pode desactivar esta mensaxe de advertencia na sección "Edición" das súas preferencias.',
+Se accedeu ao sistema, pode desactivar esta mensaxe de advertencia na sección "{{int:prefs-editing}}" das súas preferencias.',
 'editpage-notsupportedcontentformat-title' => 'Formato de contido non admitido',
 'editpage-notsupportedcontentformat-text' => 'O formato de contido $1 non é compatible co modelo de contido $2.',
 
@@ -1174,6 +1173,7 @@ Estes argumentos foron omitidos.",
 Comprobe a comparación que aparece a continuación para confirmar que isto é o que desexa facer; despois, garde os cambios para desfacer a edición.',
 'undo-failure' => 'Non se pode desfacer a edición debido a un conflito con algunha das edicións intermedias.',
 'undo-norev' => 'A edición non se pode desfacer porque non existe ou foi eliminada.',
+'undo-nochange' => 'Semella que alguén xa desfixo a edición.',
 'undo-summary' => 'Desfíxose a edición $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|conversa]])',
 'undo-summary-username-hidden' => 'Desfíxose a edición $1 dun usuario agochado',
 
@@ -1353,8 +1353,9 @@ Asegúrese de que esta modificación da páxina mantén a continuidade históric
 'compareselectedversions' => 'Comparar as versións seleccionadas',
 'showhideselectedversions' => 'Mostrar/Agochar as versións seleccionadas',
 'editundo' => 'desfacer',
-'diff-empty' => '(Sen diferenzas)',
-'diff-multi' => '(Non se {{PLURAL:$1|mostra unha revisión|mostran $1 revisións}} do historial {{PLURAL:$1|feita|feitas}} por {{PLURAL:$2|un usuario|$2 usuarios}}.)',
+'diff-empty' => '(Sen diferenzas.)',
+'diff-multi-sameuser' => '(Non se {{PLURAL:$1|mostra unha revisión|mostran $1 revisións}} do historial {{PLURAL:$1|feita|feitas}} polo mesmo usuario.)',
+'diff-multi-otherusers' => '(Non se {{PLURAL:$1|mostra unha revisión|mostran $1 revisións}} do historial {{PLURAL:$1|feita|feitas}} por {{PLURAL:$2|outro usuario|$2 usuarios}}.)',
 'diff-multi-manyusers' => '(Non se {{PLURAL:$1|mostra unha revisión|mostran $1 revisións}} do historial {{PLURAL:$1|feita|feitas}} por máis {{PLURAL:$2|dun usuario|de $2 usuarios}}.)',
 'difference-missing-revision' => 'Non se {{PLURAL:$2|atopou revisión ningunha|atoparon $2 revisións}} desta diferenza ($1).
 
@@ -1374,8 +1375,8 @@ O [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistro de borrad
 'nextn-title' => '{{PLURAL:$1|O seguinte resultado|Os seguintes $1 resultados}}',
 'shown-title' => 'Mostrar $1 {{PLURAL:$1|resultado|resultados}} por páxina',
 'viewprevnext' => 'Ver as ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-exists' => "* Páxina \"'''[[\$1]]'''\"",
-'searchmenu-new' => "'''Crear a páxina \"[[:\$1]]\" neste wiki!'''",
+'searchmenu-exists' => '<strong>Xa existe unha páxina chamada "[[:$1]]" neste wiki.</strong> {{PLURAL:$2|0=|Bótelle unha ollada tamén aos outros resultados atopados.}}',
+'searchmenu-new' => '<strong>Crear a páxina "[[:$1]]" neste wiki!</strong> {{PLURAL:$2|0=|Bótelle unha ollada tamén á páxina atopada na súa procura.|Bótelle unha ollada tamén aos resultados atopados.}}',
 'searchprofile-articles' => 'Páxinas de contido',
 'searchprofile-project' => 'Páxinas do proxecto e de axuda',
 'searchprofile-images' => 'Multimedia',
@@ -1401,6 +1402,7 @@ O [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistro de borrad
 'searchrelated' => 'relacionado',
 'searchall' => 'todo',
 'showingresults' => "{{PLURAL:$1|Móstrase '''1''' resultado|Móstranse '''$1''' resultados}}, comezando polo número '''$2'''.",
+'showingresultsinrange' => '{{PLURAL:$1|Móstrase <strong>1</strong> resultado|Móstranse <strong>$1</strong> resultados}}, comezando polo número <strong>$2</strong> e rematando polo número <strong>$3</strong>.',
 'showingresultsnum' => "A continuación {{PLURAL:$3|móstrase '''1''' resultado|móstranse '''$3''' resultados}}, comezando polo número '''$2'''.",
 'showingresultsheader' => "{{PLURAL:\$5|Resultado '''\$1''' de '''\$3'''|Resultados do '''\$1''' ao '''\$2''', dun total de '''\$3''',}} para \"'''\$4'''\"",
 'search-nonefound' => 'Non se atopou ningún resultado que coincidise coa procura.',
@@ -1914,7 +1916,7 @@ Se o problema persiste, póñase en contacto cun [[Special:ListUsers/sysop|admin
 # File backend
 'backend-fail-stream' => 'Non se puido transmitir o ficheiro "$1".',
 'backend-fail-backup' => 'Non se puido facer unha copia de seguridade do ficheiro "$1".',
-'backend-fail-notexists' => 'Non existe o ficheiro "$1".',
+'backend-fail-notexists' => 'O ficheiro "$1" non existe.',
 'backend-fail-hashes' => 'Non se puideron obter os cardinais do ficheiro por comparación.',
 'backend-fail-notsame' => 'Xa existe un ficheiro chamado "$1", con contidos diferentes.',
 'backend-fail-invalidpath' => '"$1" non é unha ruta de almacenamento válida.',
@@ -2793,7 +2795,7 @@ Olle a [[Special:BlockList|lista de bloqueos]] para revisalo.',
 'change-blocklink' => 'cambiar o bloqueo',
 'contribslink' => 'contribucións',
 'emaillink' => 'enviar un correo',
-'autoblocker' => 'Foi autobloqueado porque "[[User:$1|$1]]" usou recentemente o seu  mesmo enderezo IP.
+'autoblocker' => 'Foi bloqueado automaticamente porque "[[User:$1|$1]]" usou recentemente o seu mesmo enderezo IP.
 O motivo do bloqueo de $1 é: "$2"',
 'blocklogpage' => 'Rexistro de bloqueos',
 'blocklog-showlog' => 'Este usuario xa foi bloqueado con anterioridade. Velaquí está o rexistro de bloqueos por se quere consultalo:',
@@ -3035,7 +3037,7 @@ Gárdeo no seu disco duro e cárgueo aquí.',
 'importuploaderrortemp' => 'Fallou o envío do ficheiro de importación. Falta un cartafol temporal.',
 'import-parse-failure' => 'Fallo de análise da importación de XML',
 'import-noarticle' => 'Ningunha páxina para importar!',
-'import-nonewrevisions' => 'Todas as revisións foron importadas previamente.',
+'import-nonewrevisions' => 'Non se importou ningunha revisión (xa estaban todas presentes ou saltáronse por erros).',
 'xml-error-string' => '$1 na liña $2, columna $3 (byte $4): $5',
 'import-upload' => 'Cargar datos XML',
 'import-token-mismatch' => 'Perdéronse os datos da sesión. Por favor, inténteo de novo.',
@@ -3046,6 +3048,7 @@ Gárdeo no seu disco duro e cárgueo aquí.',
 '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-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>',
 'import-rootpage-invalid' => 'A páxina raíz dada é un título non válido.',
 'import-rootpage-nosubpage' => 'O espazo de nomes "$1" da páxina raíz non permite as subpáxinas.',
index 51a0e92..d03998c 100644 (file)
@@ -345,7 +345,6 @@ Vivron: '''({{int:cur}})''' = halinchi uzollnie borobor forok, '''({{int:last}})
 'lineno' => 'Line ank $1:',
 'compareselectedversions' => 'Nivodloleo uzollneo comparar kor',
 'editundo' => "rod'd kor",
-'diff-multi' => "({{PLURAL:$2|Eka vapuddpean|$2 vapuddpeamni}} {{PLURAL:$1|kel'li ek modli uzollnni|kel'leo $1 modleo uzollnneo}} dakhonk nant)",
 
 # Search results
 'searchresults' => 'Sodacho nikal',
index a6e47dd..e5c248c 100644 (file)
@@ -39,7 +39,6 @@ $dateFormats = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Ὑπογραμμίζειν συνδέσμους:',
-'tog-justify' => 'Στοιχίζειν παραγράφους',
 'tog-hideminor' => 'Κρύπτειν ἥττονας μεταγραφὰς ἐν προσφάτοις ἀλλαγαῖς',
 'tog-hidepatrolled' => 'Κρύπτειν τὰς περιπολουμένας μεταγραφὰς ἐν ταῖς προσφάτοις ἀλλαγαῖς',
 'tog-newpageshidepatrolled' => 'Κρύπτειν τὰς περιπολουμένας μεταγραφὰς ὑπὸ τῆς διαλογῆς νέων δέλτων',
@@ -48,9 +47,7 @@ $messages = array(
 'tog-numberheadings' => 'Ἐξαριθμεῖν ἐπικεφαλίδας αὐτομάτως',
 'tog-showtoolbar' => 'Δεικνύναι τὴν τῶν ἐργαλείων μεταγραφῆς μετώπην (ἀπαιτεῖται JavaScript)',
 'tog-editondblclick' => 'Ἐπὶ δέλτων δὶς θλίψας, μετάγραψον αὐτάς (ἀπαιτεῖται JavaScript)',
-'tog-editsection' => 'Τμήματος μεταγραφὴν διὰ τῶν συνδέσμων «[μεταγράφειν]» καθιστάναι δυνατήν',
 'tog-editsectiononrightclick' => 'Καθιστάναι δυνατὸν τὸ μεταγράφειν τμήματα διὰ τοῦ ἐπὶ τῶν ἐπιγραφῶν τῶν τμημάτων θλίβειν δεξιῶς (ἀπαιτεῖται JavaScript)',
-'tog-showtoc' => 'Δεικνύναι πίνακα περιεχομένων (ἐν δέλτοις περιεχούσαις πλείους τῶν 3 ἐπικεφαλίδων)',
 'tog-rememberpassword' => 'Ἐνθυμεῖσθαι τὴν ἐμὴν σύνδεσιν ἐν τῇδε τῇ ὑπολογιστικῇ μηχανῇ (μέγιστον $1 {{PLURAL:$1|ἡμέρα|ἡμέραι}})',
 'tog-watchcreations' => 'Προστιθέναι τὰς δέλτους ἃς ποιῶ τοῖς ἐφορωμένοις μου',
 'tog-watchdefault' => 'Προστιθέναι τὰς δέλτους ἃς μεταγράφω τοῖς ἐφορωμένοις μου',
@@ -747,7 +744,6 @@ $1",
 'compareselectedversions' => 'Συγκρίνειν τὰς ἐπειλεγμένας δέλτους',
 'showhideselectedversions' => 'Δεικνύειν/κρύπτειν τὰς ἐπειλεγμένας ἐκδόσεις',
 'editundo' => 'ἀναίρεσις',
-'diff-multi' => '({{PLURAL:$1|Μία ἐνδιάμεσος ἀναθεώρησις|$1 ἐνδιάμεσοι ἀναθεωρήσεις}} οὐ φαίνονται.)',
 
 # Search results
 'searchresults' => 'Ἀποτελέσματα ἀναζητήσεως',
@@ -1483,7 +1479,6 @@ $1",
 'watchmethod-list' => 'ἐλέγχειν ἐφορωμένας δέλτους περὶ μεταγραφὰς προσφάτους',
 'watchlistcontains' => 'Ἡ ἐφοροδιαλογὴ σου περιέχει $1 {{PLURAL:$1|δέλτον|δέλτους}}.',
 'iteminvalidname' => "Πρόβλημα τεμαχἰου '$1', ἄκυρον ὄνομα...",
-'wlnote' => "Κατωτέρω {{PLURAL:$1|ἐστὶν ἡ ὑστάτη μεταβολὴ|εἰσὶν αἱ ὑστάται  '''$1'''  μεταβολαὶ}} ἐν {{PLURAL:$2|τῇ ὑστάτῃ μίᾳ ὥρᾳ|ταῖς ὑστάταις '''$2''' ὥραις}}.",
 'wlshowlast' => 'Ἐμφάνισις τῶν τελευταίων $1 ὡρῶν $2 ἡμερῶν $3',
 'watchlist-options' => 'Ἐπιλογαὶ ἐφοροδιαλογῆς',
 
@@ -1951,7 +1946,6 @@ $1',
 'tooltip-pt-watchlist' => 'Κατάλογος τῶν ἐφορωμένων μου',
 'tooltip-pt-mycontris' => 'Κατάλογος τῶν ἐράνων σου',
 'tooltip-pt-login' => 'Ἐπιθυμητὸν τὸ συνδεῖσθαι, οὐχ ὑποχρεωτικόν.',
-'tooltip-pt-anonlogin' => 'Ἐπιθυμητὸν τὸ συνδεῖσθαι, οὐχ ὑποχρεωτικόν.',
 'tooltip-pt-logout' => 'Ἐξέρχεσθαι',
 'tooltip-ca-talk' => 'Διάλεξις περὶ τῆς δέλτου',
 'tooltip-ca-edit' => 'Ἔξεστί σοι μεταγράφειν τήνδε τὴν δέλτον. Προθεωρεῖν πρὶν ἂν γράφῃς τὴν δέλτον.',
index 9ef6cd4..d058211 100644 (file)
@@ -135,7 +135,6 @@ $linkTrail = '/^([äöüßa-z]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Links unterstryche',
-'tog-justify' => 'Tekscht als Blocksatz',
 'tog-hideminor' => 'Keini «chlyni Änderige» aazeige',
 'tog-hidepatrolled' => 'Vum Fäldhieter aagluegti Änderige in dr „Letschte Änderige“ usblände',
 'tog-newpageshidepatrolled' => 'Aagluegti Syten uf dr Lischt „Neiji Syte“ verstecke',
@@ -1164,7 +1163,6 @@ Stell sicher, ass d Versionsgschicht vun eme Artikel historisch korrekt isch.',
 'showhideselectedversions' => 'Uusgwehlti Versione zeige/verstecke',
 'editundo' => 'rückgängig',
 'diff-empty' => '(kei Unterschid)',
-'diff-multi' => '({{PLURAL:$1|Ei Version|$1 Versione}} vu {{PLURAL:$2|eim Benutzer|$2 Benutzer}}, {{PLURAL:$1|wu derzwische lyt, wird|wu derzwische lige, wäre}} nit aazeigt)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Ei Version|$1 Versione}} vu meh {{PLURAL:$2|eim Benutzer|$2 Benutzer}}, {{PLURAL:$1|wu derzwische lyt un nit aazeigt wird|wu derzwische lige un nit aazeigt wäre}})',
 'difference-missing-revision' => '{{PLURAL:$2|Ei Version|$2 Versione}} vui däre Unterschidsaazeig ($1) {{PLURAL:$2|isch|sin}} nit gfunde wore.
 
index eb96bb7..706ed71 100644 (file)
@@ -153,7 +153,6 @@ $linkTrail = "/^([\x{0A80}-\x{0AFF}]+)(.*)$/sDu";
 $messages = array(
 # User preference toggles
 'tog-underline' => 'કડીઓની નીચે લીટી (અંડરલાઇન):',
-'tog-justify' => 'ફકરાઓ લાઇનસર કરો',
 'tog-hideminor' => 'હાલમાં થયેલા ફેરફારમાં નાના ફેરફારો છુપાવો',
 'tog-hidepatrolled' => 'હાલના સલામતી માટે કરવામાં આવેલાં થયેલા ફેરફારો છુપાવો.',
 'tog-newpageshidepatrolled' => 'નવાં પાનાંની યાદીમાંથી દેખરેખ હેઠળનાં પાનાં છુપાવો',
@@ -1194,7 +1193,6 @@ $1",
 'showhideselectedversions' => 'પસંદ કરેલા બતાવો / સંતાડો',
 'editundo' => 'રદ કરો',
 'diff-empty' => '(કોઇ ભેદ નહી)',
-'diff-multi' => '{{PLURAL:$2|એક સભ્યએ કરેલું|$2 સભ્યોએ કરેલા}} ({{PLURAL:$1|વચગાળાનું એક પુનરાવર્તન દર્શાવ્યં|વચગાળાનાં $1 પુનરાવર્તનો દર્શાવ્યાં}} નથી.)',
 'diff-multi-manyusers' => '{{PLURAL:$2|એક સભ્યએ કરેલું|$2 સભ્યોએ કરેલા}} ({{PLURAL:$1|વચગાળાનું એક પુનરાવર્તન દર્શાવ્યં|વચગાળાનાં $1 પુનરાવર્તનો દર્શાવ્યાં}} નથી.)',
 
 # Search results
@@ -1996,7 +1994,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'nimagelinks' => '$1 {{PLURAL:$1|પાના|પાનાઓ}} પર વપરાયો',
 'ntransclusions' => '$1 {{PLURAL:$1|પાના|પાનાઓ}} પર વપરાયો',
 'specialpage-empty' => 'આ પાનું ખાલી છે.',
-'lonelypages' => 'અનાથ પાના',
+'lonelypages' => 'અનાથ પાનાંઓ',
 'lonelypagestext' => 'નીચે બતાવેલા પાના {{SITENAME}} પર કે થી કડી દ્વારા જોડાયેલ નથી',
 'uncategorizedpages' => 'અવર્ગીકૃત પાનાં',
 'uncategorizedcategories' => 'અવર્ગીકૃત શ્રેણીઓ',
@@ -2215,7 +2213,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'watchmethod-list' => 'હાલમાં થયેલ ફેરફાર માટે નીરીક્ષીત પાના તપાસાય છે',
 'watchlistcontains' => 'તમારી ધ્યાનસૂચીમાં $1 {{PLURAL:$1|પાનું|પાનાં}} છે.',
 'iteminvalidname' => "વસ્તુ '$1' સાથે સમસ્યા, અવૈધ નામ...",
-'wlnote' => "નીચે $3, $4 વાગ્યા સુધીના છેલ્લા {{PLURAL:$2|એક કલાક|'''$2''' કલાક}}માં થયેલા {{PLURAL:$1|ફેરફાર|'''$1''' ફેરફારો }} દર્શાવ્યા છે.",
 'wlshowlast' => 'છેલ્લા $1 કલાક $2 દિવસ $3 બતાવો',
 'watchlist-options' => 'ધ્યાનસૂચિના વિકલ્પો',
 
@@ -2877,7 +2874,6 @@ $2',
 'tooltip-pt-watchlist' => 'તમે દેખરેખ રાખી રહ્યાં હોવ તેવા પાનાઓની યાદી',
 'tooltip-pt-mycontris' => 'તમારા યોગદાનની યાદી',
 'tooltip-pt-login' => 'આપને લોગ ઇન કરવા ભલામણ કરવામાં આવે છે, જોકે તે આવશ્યક નથી',
-'tooltip-pt-anonlogin' => 'આપને લોગ ઇન કરવા ભલામણ કરવામાં આવે છે, જોકે તે આવશ્યક નથી',
 'tooltip-pt-logout' => 'બહાર નીકળો/લૉગ આઉટ કરો',
 'tooltip-ca-talk' => 'અનુક્રમણિકાનાં પાના વિષે ચર્ચા',
 'tooltip-ca-edit' => "આપ આ પાનામાં ફેરફાર કરી શકો છો, કાર્ય સુરક્ષિત કરતાં પહેલાં 'ઝલક' બટન ઉપર ક્લિક કરીને જોઇ લેશો",
@@ -2889,8 +2885,8 @@ $2',
 'tooltip-ca-delete' => 'આ પાનું હટાવો',
 'tooltip-ca-undelete' => 'આ પાનું હટાવાયું તે પહેલાના ફેરફારો હટાવો.',
 'tooltip-ca-move' => 'આ પાનું ખસેડો',
-'tooltip-ca-watch' => 'આ પાનું તમારી ધ્યાનસૂચીમા ઉમેરો',
-'tooltip-ca-unwatch' => 'આ પાનું તમારી ધ્યાનસૂચીમાથી કાઢી નાખો',
+'tooltip-ca-watch' => 'આ પાનું તમારી ધ્યાનસૂચીમા ઉમેરો',
+'tooltip-ca-unwatch' => 'àª\86 àªªàª¾àª¨à«\81àª\82 àª¤àª®àª¾àª°à«\80 àª§à«\8dયાનસà«\82àª\9aà«\80માàª\82થà«\80 àª\95ાઢà«\80 àª¨àª¾àª\96à«\8b',
 'tooltip-search' => '{{SITENAME}} શોધો',
 'tooltip-search-go' => 'આ ચોક્કસ જોડણી વાળુ પાનુ જો અસ્તિત્વમાં હોય તો તેના પર જાવ',
 'tooltip-search-fulltext' => 'આ લખાણ વાળા પાનાઓ શોધો',
@@ -2972,7 +2968,7 @@ $2',
 'pageinfo-header-properties' => 'પાનાંના ગુણધર્મો',
 'pageinfo-display-title' => 'દેખાવ શિર્ષક',
 'pageinfo-default-sort' => 'મૂળભૂત ગોઠવણી કળ',
-'pageinfo-length' => 'પà«\83ષà«\8dઠની લંબાઇ (બાઇટમાં)',
+'pageinfo-length' => 'પાનાàª\82ની લંબાઇ (બાઇટમાં)',
 'pageinfo-article-id' => 'પાનાં ઓળખ',
 'pageinfo-language' => 'પાનાંની વિગતની ભાષા',
 'pageinfo-robot-policy' => 'રોબોટ્સ દ્વારા અનુક્રમિત',
@@ -2993,7 +2989,7 @@ $2',
 'pageinfo-magic-words' => 'ચમત્કારી {{PLURAL:$1|શબ્દ|શબ્દો}} ($1)',
 'pageinfo-hidden-categories' => 'છુપી {{PLURAL:$1|શ્રેણી|શ્રેણીઓ}} ($1)',
 'pageinfo-templates' => 'પ્રયુક્ત {{PLURAL:$1|ઢાંચો|ઢાંચાઓ}} ($1)',
-'pageinfo-toolboxlink' => 'પà«\83ષà«\8dઠમાહિતી',
+'pageinfo-toolboxlink' => 'પાનાàª\82નà«\80 માહિતી',
 'pageinfo-redirectsto' => 'તરફ દિશાનિર્દેશન',
 'pageinfo-redirectsto-info' => 'માહિતી',
 'pageinfo-contentpage-yes' => 'હા',
@@ -3511,7 +3507,7 @@ $2',
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'બધા',
 'namespacesall' => 'બધા',
-'monthsall' => 'બધા',
+'monthsall' => 'બધા',
 
 # Email address confirmation
 'confirmemail' => 'તમારા ઇ-મેઇલ સરનામાની પુષ્ટિ કરો',
index 9f98051..45112ba 100644 (file)
@@ -35,7 +35,6 @@ $namespaceNames = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Cur linnaghyn fo chianglaghyn:',
-'tog-justify' => 'Cur meeryn ayns un linney',
 'tog-hideminor' => "Follee myn-arraghyn ayns caghlaaghyn s'noa",
 'tog-hidepatrolled' => "Follee arraghyn er nyn scrutaghey ayns caghlaaghyn s'noa",
 'tog-newpageshidepatrolled' => "Follee duillagyn er nyn scrutaghey 'sy rolley duillagyn noa",
@@ -128,6 +127,18 @@ $messages = array(
 'oct' => 'JFou',
 'nov' => 'Soun',
 'dec' => 'Noll',
+'january-date' => '$1 Jerrey Geuree',
+'february-date' => '$1 Toshiaght Arree',
+'march-date' => '$1 Mayrnt',
+'april-date' => '$1 Averil',
+'may-date' => '$1 Boaldyn',
+'june-date' => '1 Mean Souree',
+'july-date' => '$1 Jerrey Souree',
+'august-date' => '$1 Luanistyn',
+'september-date' => '$1 Mean Fouyir',
+'october-date' => '$1 Jerrey Fouyir',
+'november-date' => '$1 Sauin',
+'december-date' => '$1 Mee ny Nollick',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Ronney|Ronnaghyn}}',
@@ -199,10 +210,11 @@ $messages = array(
 'view' => 'Lhaih',
 'edit' => 'Reagh',
 'create' => 'Croo',
-'editthispage' => 'Reagh yn duillag shoh',
+'editthispage' => 'Reagh y duillag shoh',
 'create-this-page' => 'Croo yn duillag shoh',
 'delete' => 'Scryss',
 'deletethispage' => 'Scryss y duillag shoh',
+'undeletethispage' => 'Jee-scryss y duillag shoh',
 'undelete_short' => 'Jee-scryss {{PLURAL:$1|$1 caghlaa|$1 chaghlaa|$1 chaghlaa|$1 caghlaaghyn}}',
 'viewdeleted_short' => 'Jeeagh er {{PLURAL:$1|$1 caghlaa scryssit magh|$1 chaghlaa scryssit magh|$1 chaghlaa scryssit magh|$1 caghlaaghyn scryssit magh}}',
 'protect' => 'Coadee',
@@ -725,14 +737,14 @@ My bailliu eh y chiarail, bee eh ymmydit son cur gys lieh y chur dhyt er son yn
 'nchanges' => '$1 {{PLURAL:$1|caghlaa|chaghlaa|chaghlaa|caghlaaghyn}}',
 'recentchanges' => "Caghlaaghyn s'noa",
 'recentchanges-legend' => "Reihyssyn da ny caghlaaghyn s'noa",
-'recentchanges-summary' => "Shirrey ny caghlaaghyn s'noa da'n wiki er y duillag shoh.",
+'recentchanges-summary' => "Shirr ny caghlaaghyn s'noa da'n wiki er y duillag shoh.",
 'recentchanges-feed-description' => "Shirr ny caghlaaghyn s'noa er y wiki 'sy scoltey shoh.",
 'recentchanges-label-newpage' => 'Ren y reaghey shoh croo duillag noa',
 'recentchanges-label-minor' => 'She myn-reaghey eh shoh',
 'recentchanges-label-bot' => 'Ren bot y reaghey shoh',
 'rcnotefrom' => "Shoh heese ny caghlaaghyn veih '''$2''' (gys '''$1''' taishbynit).",
 'rclistfrom' => "Taishbyn ny caghlaaghyn s'noa veih $1",
-'rcshowhideminor' => '{{PLURAL:$1|$1 myn-arraghey|$1 vyn-arraghey|$1 vyn-arraghey|$1 myn-arraghyn}}',
+'rcshowhideminor' => '$1 myn-arraghyn',
 'rcshowhidebots' => '{{PLURAL:$1|$1 robot|$1 robot|$1 robot|$1 robotyn}}',
 'rcshowhideliu' => '{{PLURAL:$1|$1 ymmydeyr|$1 ymmydeyr|$1 ymmydeyr|$1 ymmydeyryn}} ta loggit stiagh',
 'rcshowhideanons' => '{{PLURAL:$1|$1 ymmydeyr|$1 ymmydeyr|$1 ymmydeyr|$1 ymmydeyryn}} neuenmyssit',
index 01996d9..e328159 100644 (file)
@@ -22,7 +22,6 @@ $fallback = 'zh-hant';
 $messages = array(
 # User preference toggles
 'tog-underline' => '鏈接加底線:',
-'tog-justify' => '段落對齊',
 'tog-hideminor' => '隱藏最近更改肚嘅細微編寫',
 'tog-hidepatrolled' => '隱藏最近更改肚巡查過嘅編寫',
 'tog-newpageshidepatrolled' => '隱藏新頁面清單肚巡查過嘅頁面',
@@ -838,7 +837,6 @@ Liá-chhṳ chhà-fûng he yù $1 só fûng ke. Tông-chûng ke ngièn-yîn he '
 'lineno' => '第$1行:',
 'compareselectedversions' => '比較選定嘅修訂版本',
 'editundo' => '撤銷',
-'diff-multi' => '(吂展示$2隻用戶嘅$1嘅中間版本)',
 
 # Search results
 'searchresults' => '搜尋結果',
index f608e5e..9c41369 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Agbad
  * @author Amire80
+ * @author Crazy Ivan
  * @author Dekel E
  * @author Drorsnir
  * @author Guycn1
@@ -23,7 +24,9 @@
  * @author Rotem Liss (March 2006 on)
  * @author Rotemliss
  * @author YaronSh
+ * @author Yona b
  * @author אור שפירא
+ * @author דולב
  * @author ערן
  * @author פדיחה
  * @author שומבלע
@@ -366,7 +369,6 @@ $bookstoreList = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'סימון קישורים בקו תחתי:',
-'tog-justify' => 'יישור פסקאות',
 'tog-hideminor' => 'הסתרת שינויים משניים ברשימת השינויים האחרונים',
 'tog-hidepatrolled' => 'הסתרת שינויים בדוקים ברשימת השינויים האחרונים',
 'tog-newpageshidepatrolled' => 'הסתרת דפים בדוקים ברשימת הדפים החדשים',
@@ -390,7 +392,7 @@ $messages = array(
 'tog-enotifrevealaddr' => 'חשיפת כתובת הדוא"ל שלך בהודעות דוא"ל',
 'tog-shownumberswatching' => 'הצגת מספר המשתמשים העוקבים',
 'tog-oldsig' => 'החתימה הנוכחית:',
-'tog-fancysig' => 'פ×\99ר×\95ש ×\94חתימה כקוד ויקי (ללא קישור אוטומטי)',
+'tog-fancysig' => '×\94ת×\99×\99×\97ס×\95ת ×\9cחתימה כקוד ויקי (ללא קישור אוטומטי)',
 'tog-uselivepreview' => 'שימוש בתצוגה מקדימה מהירה (ניסיוני)',
 'tog-forceeditsummary' => 'הצגת אזהרה בעת הכנסת תקציר עריכה ריק',
 'tog-watchlisthideown' => 'הסתרת העריכות שלי ברשימת המעקב',
@@ -494,7 +496,7 @@ $messages = array(
 'category-subcat-count-limited' => 'קטגוריה זו כוללת את {{PLURAL:$1|קטגוריית המשנה הבאה|$1 קטגוריות המשנה הבאות}}.',
 'category-article-count' => '{{PLURAL:$2|קטגוריה זו כוללת את הדף הבא בלבד|דף קטגוריה זה כולל את {{PLURAL:$1|הדף הבא|$1 הדפים הבאים}}, מתוך $2 בקטגוריה כולה}}.',
 'category-article-count-limited' => 'קטגוריה זו כוללת את {{PLURAL:$1|הדף הבא|$1 הדפים הבאים}}.',
-'category-file-count' => '{{PLURAL:$2|ק×\98×\92×\95ר×\99×\94 ×\96×\95 ×\9b×\95×\9c×\9cת ×\90ת ×\94ק×\95×\91×¥ ×\94×\91×\90 ×\91×\9c×\91×\93\93×£ ×§×\98×\92×\95ר×\99×\94 ×\96×\94 ×\9b×\95×\9c×\9c את {{PLURAL:$1|הקובץ הבא|$1 הקבצים הבאים}}, מתוך $2 בקטגוריה כולה}}.',
+'category-file-count' => '{{PLURAL:$2|ק×\98×\92×\95ר×\99×\94 ×\96×\95 ×\9b×\95×\9c×\9cת ×\90ת ×\94ק×\95×\91×¥ ×\94×\91×\90 ×\91×\9c×\91×\93§×\98×\92×\95ר×\99×\94 ×\96×\95 ×\9b×\95×\9c×\9cת את {{PLURAL:$1|הקובץ הבא|$1 הקבצים הבאים}}, מתוך $2 בקטגוריה כולה}}.',
 'category-file-count-limited' => 'קטגוריה זו כוללת את {{PLURAL:$1|הקובץ הבא|$1 הקבצים הבאים}}.',
 'listingcontinuesabbrev' => '(המשך)',
 'index-category' => 'דפים המופיעים במנועי חיפוש',
@@ -529,7 +531,6 @@ $messages = array(
 'vector-action-protect' => 'הגנה',
 'vector-action-undelete' => 'ביטול מחיקה',
 'vector-action-unprotect' => 'שינוי הגנה',
-'vector-simplesearch-preference' => 'הפעלת סרגל חיפוש מפושט (בעיצוב וקטור בלבד)',
 'vector-view-create' => 'יצירה',
 'vector-view-edit' => 'עריכה',
 'vector-view-history' => 'הצגת היסטוריה',
@@ -932,6 +933,8 @@ $2',
 'retypenew' => 'חזרה על הסיסמה החדשה:',
 'resetpass_submit' => 'הגדרת הסיסמה וכניסה לחשבון',
 'changepassword-success' => 'סיסמתכם שונתה בהצלחה!',
+'changepassword-throttled' => 'ביצעתם לאחרונה ניסיונות רבים מדי להיכנס לחשבון זה.
+אנא המתינו $1 לפני שתנסו שוב.',
 'resetpass_forbidden' => 'לא ניתן לשנות סיסמאות.',
 'resetpass-no-info' => 'יש להיכנס לחשבון כדי לגשת לדף זה באופן ישיר.',
 'resetpass-submit-loggedin' => 'שינוי סיסמה',
@@ -990,6 +993,8 @@ $2
 'changeemail-password' => 'סיסמה ב{{grammar:תחילית|{{SITENAME}}}}:',
 'changeemail-submit' => 'שינוי כתובת הדוא"ל',
 'changeemail-cancel' => 'ביטול',
+'changeemail-throttled' => 'ביצעתם ניסיונות רבים מדי להיכנס לחשבון זה.
+אנא המתינו $1 לפני שתנסו שוב.',
 
 # Special:ResetTokens
 'resettokens' => 'איפוס אסימונים',
@@ -1208,7 +1213,7 @@ $2
 'invalid-content-data' => 'מידע שגוי על התוכן',
 'content-not-allowed-here' => 'תוכן מסוג "$1" אינו מותר בדף [[$2]]',
 'editwarning-warning' => 'עזיבת דף זה עשויה לגרום לאובדן כל השינויים שביצעתם.
-אם אתם מחוברים לחשבון, תוכלו לבטל אזהרה זו בחלק "עריכה" שבהעדפות שלכם.',
+אם אתם מחוברים לחשבון, תוכלו לבטל אזהרה זו בחלק "{{int:prefs-editing}}" שבהעדפות שלכם.',
 'editpage-notsupportedcontentformat-title' => 'סוג התוכן אינו נתמך',
 'editpage-notsupportedcontentformat-text' => 'תוכן מסוג $1 אינו נתמך על־ידי מודל התוכן $2.',
 
@@ -1244,6 +1249,7 @@ $2
 'undo-success' => 'ניתן לבטל את העריכה. אנא בִדקו את השוואת הגרסאות למטה כדי לוודא שזה מה שאתם רוצים לעשות, ואז שמרו את השינויים למטה כדי לבצע את ביטול העריכה.',
 'undo-failure' => 'לא ניתן היה לבטל את העריכה עקב התנגשות עם עריכות מאוחרות יותר.',
 'undo-norev' => 'לא ניתן היה לבטל את העריכה כי היא אינה קיימת או כי היא נמחקה.',
+'undo-nochange' => 'נראה שהעריכה כבר בוטלה.',
 'undo-summary' => 'ביטול גרסה $1 של [[Special:Contributions/$2|$2]] ([[User talk:$2|שיחה]])',
 'undo-summary-username-hidden' => 'ביטול גרסה $1 של משתמש מוסתר',
 
@@ -1425,7 +1431,8 @@ $1",
 'showhideselectedversions' => 'הצגת/הסתרת הגרסאות שנבחרו',
 'editundo' => 'ביטול',
 'diff-empty' => '(אין הבדלים)',
-'diff-multi' => '({{PLURAL:$1|גרסת ביניים אחת|$1 גרסאות ביניים}} של {{PLURAL:$2|משתמש אחד|$2 משתמשים}} {{PLURAL:$1|אינה מוצגת|אינן מוצגות}})',
+'diff-multi-sameuser' => '({{PLURAL:$1|גרסת ביניים אחת|$1 גרסאות ביניים}} ממשתמש אחד אינן מוצגות)',
+'diff-multi-otherusers' => '({{PLURAL:$1|גרסת ביניים אחת|$1 גרסאות ביניים}}  {{PLURAL:$2|ממשתמש אחד|מ-$2 משתמשים}}  אינן מוצגות)',
 'diff-multi-manyusers' => '({{PLURAL:$1|גרסת ביניים אחת|$1 גרסאות ביניים}} של יותר {{PLURAL:$2|ממשתמש אחד|מ־$2 משתמשים}} {{PLURAL:$1|אינה מוצגת|אינן מוצגות}})',
 'difference-missing-revision' => '{{PLURAL:$2|גרסה אחת|$2 גרסאות}} של ההבדל הזה בין שתי גרסאות ($1) {{PLURAL:$2|לא נמצאה|לא נמצאו}}.
 
@@ -1446,7 +1453,8 @@ $1",
 'shown-title' => 'הצגת {{PLURAL:$1|תוצאה אחת|$1 תוצאות}} בדף',
 'viewprevnext' => 'צפייה ב: ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''קיים דף בשם \"[[:\$1]]\" באתר זה.'''",
-'searchmenu-new' => "'''יצירת הדף \"[[:\$1]]\" באתר זה.'''",
+'searchmenu-new' => "<strong>'''יצירת הדף \"[[:\$1]]\" באתר זה.'''</strong> 
+{{PLURAL:\$2|0=|ראו גם את הדף שנמצא בחיפוש שלכם.|ראו גם את תוצאות החיפוש שלכם.}}",
 'searchprofile-articles' => 'דפי תוכן',
 'searchprofile-project' => 'עזרה ודפי המיזם',
 'searchprofile-images' => 'מולטימדיה',
@@ -1472,6 +1480,7 @@ $1",
 'searchrelated' => 'קשור',
 'searchall' => 'הכול',
 'showingresults' => "{{PLURAL:$1|מוצגת תוצאה '''אחת'''|מוצגות עד '''$1''' תוצאות}} החל ממספר '''$2''':",
+'showingresultsinrange' => 'מוצגים להלן עד {{PLURAL:$1|תוצאה <strong>בודדת</strong>|<strong>$1</strong> תוצאות}} בטווח שבין #<strong>$2</strong> לבין #<strong>$3</strong>.',
 'showingresultsnum' => "{{PLURAL:$3|מוצגת תוצאה '''אחת'''|מוצגות '''$3''' תוצאות}} החל ממספר '''$2''':",
 'showingresultsheader' => "{{PLURAL:$5|תוצאה '''$1''' מתוך '''$3'''|תוצאות '''$1 - $2''' מתוך '''$3'''}} עבור '''$4'''",
 'search-nonefound' => 'לא נמצאו תוצאות המתאימות לחיפוש.',
@@ -2304,6 +2313,13 @@ $1',
 'protectedpages-cascade' => 'הגנות מדורגות בלבד',
 'protectedpages-noredirect' => 'הסתרת הפניות',
 'protectedpagesempty' => 'אין כרגע דפים מוגנים עם הפרמטרים הללו.',
+'protectedpages-page' => 'דף',
+'protectedpages-expiry' => 'זמן פקיעה',
+'protectedpages-performer' => 'הוגן על ידי',
+'protectedpages-params' => 'פרמטרים להגנה',
+'protectedpages-reason' => 'סיבה',
+'protectedpages-unknown-timestamp' => 'לא ידוע',
+'protectedpages-unknown-performer' => 'משתמש לא ידוע',
 'protectedtitles' => 'כותרות מוגנות',
 'protectedtitlesempty' => 'אין כרגע כותרות מוגנות עם הפרמטרים האלה.',
 'listusers' => 'רשימת משתמשים',
@@ -2492,6 +2508,7 @@ $1',
 'watchmethod-list' => 'בודק את העריכות האחרונות בדפים שברשימת המעקב',
 'watchlistcontains' => 'רשימת המעקב כוללת {{PLURAL:$1|דף אחד|$1 דפים}}.',
 'iteminvalidname' => 'בעיה עם $1, שם שגוי…',
+'wlnote2' => 'להלן השינויים האחרונים ב{{PLURAL:$1|שעה האחרונה|-<strong> $1 </strong> שעות האחרונות}}, מ-$2, $3.',
 'wlshowlast' => '(הצגת $1 שעות אחרונות | $2 ימים אחרונים | $3)',
 'watchlist-options' => 'אפשרויות ברשימת המעקב',
 
@@ -3050,6 +3067,7 @@ $1',
 'allmessages-prefix' => 'סינון לפי קידומת:',
 'allmessages-language' => 'שפה:',
 'allmessages-filter-submit' => 'הצגה',
+'allmessages-filter-translate' => 'תרגום',
 
 # Thumbnails
 'thumbnail-more' => 'הגדלה',
index d60b41a..9e8ad31 100644 (file)
@@ -51,6 +51,7 @@
  * @author Subhashkataria21.90
  * @author Sunil Mohan
  * @author Taxman
+ * @author Venky2834
  * @author Vibhijain
  * @author Wikiconference
  * @author לערי ריינהארט
@@ -192,7 +193,6 @@ $digitGroupingPattern = "##,##,###";
 $messages = array(
 # User preference toggles
 'tog-underline' => 'कड़ियाँ अधोरेखन:',
-'tog-justify' => 'परिच्छेद समान करें',
 'tog-hideminor' => 'हाल में हुए बदलावों में छोटे बदलाव छिपाएँ',
 'tog-hidepatrolled' => 'हाल में हुए बदलावों में परीक्षित बदलाव छिपाएँ',
 'tog-newpageshidepatrolled' => 'नए पृष्ठों की सूची में परीक्षित पृष्ठ छिपाएँ',
@@ -354,7 +354,6 @@ $messages = array(
 'vector-action-protect' => 'सुरक्षित करें',
 'vector-action-undelete' => 'हटाना वापस लें',
 'vector-action-unprotect' => 'सुरक्षा बदलें',
-'vector-simplesearch-preference' => 'सरलीकृत खोजपट्टी सुझाव सक्षम करें। (केवल वॅक्टर त्वचा हेतु)',
 'vector-view-create' => 'बनाएँ',
 'vector-view-edit' => 'सम्पादन',
 'vector-view-history' => 'इतिहास देखें',
@@ -1039,7 +1038,7 @@ $2
 'invalid-content-data' => 'अवैध डाटा सामग्री',
 'content-not-allowed-here' => '[[$2]] पृष्ठ पर "$1" सामग्री मना है।',
 'editwarning-warning' => 'इस पृष्ठ को छोड़ने पर आपके द्वारा किये गए कोई भी बदलाव गायब हो जाएँगे।
-यदि आपने लॉग इन किया हुआ है तो आप इस सूचना का दिखना अपनी वरीयताओं के "संपादन" भाग में बंद कर सकते हैं।',
+यदि आपने लॉग इन किया हुआ है तो आप इस सूचना का दिखना अपनी वरीयताओं के "{{int:prefs-editing}}" भाग में बंद कर सकते हैं।',
 'editpage-notsupportedcontentformat-title' => 'सामग्री स्वरूप समर्थित नहीं है',
 'editpage-notsupportedcontentformat-text' => '$1 सामग्री स्वरूप $2 सामग्री मॉडल द्वारा समर्थित नहीं है।',
 
@@ -1076,6 +1075,7 @@ $2
 ऐसा करने के लिये कृपया निम्नलिखित पाठ को ध्यान से देखकर बदलाव संजोयें।',
 'undo-failure' => 'इस बीच अन्य बदलाव होने के कारण यह संपादन पूर्ववत करना संभव नहीं है।',
 'undo-norev' => 'यह बदलाव वापिस नहीं कर पाये हैं क्योंकि या तो इसे पहले से पलटा दिया गया है या फिर पृष्ठ हटा दिया गया है।',
+'undo-nochange' => 'ऐसा लगता है कि इस सम्पादन को पहले ही पूर्ववत कर दिया गया है।',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|वार्ता]]) द्वारा किए बदलाव $1 को पूर्ववत किये',
 'undo-summary-username-hidden' => 'छुपाए गए सदस्य द्वारा किये संशोधन $1 को पूर्ववत किया',
 
@@ -1257,7 +1257,8 @@ $1",
 'showhideselectedversions' => 'चयनित अवतरण दिखाएँ/छिपाएँ',
 'editundo' => 'पूर्ववत करें',
 'diff-empty' => '(कोई अंतर नहीं)',
-'diff-multi' => '({{PLURAL:$2|एक योगदानकर्ता|$2 योगदानकर्ताओं}} द्वारा {{PLURAL:$1|किया बीच का एक|किए बीच के $1}} अवतरण दर्शाए नहीं हैं।)',
+'diff-multi-sameuser' => '(इसी सदस्य द्वारा {{PLURAL:$1|किया गया बीच का एक अवतरण नहीं दर्शाया गया|किये गये बीच के $1 अवतरण नहीं दर्शाए गए}})',
+'diff-multi-otherusers' => '({{PLURAL:$2|एक अन्य सदस्य|$2 सदस्यों}} द्वारा {{PLURAL:$1|किया गया बीच का एक अवतरण नहीं दर्शाया गया|किये गये बीच के $1 अवतरण नहीं दर्शाए गए}})',
 'diff-multi-manyusers' => '({{PLURAL:$2|एक योगदानकर्ता|$2 योगदानकर्ताओं}} द्वारा {{PLURAL:$1|किया बीच का एक|किए बीच के $1}} अवतरण दर्शाए नहीं हैं।)',
 'difference-missing-revision' => 'इस अंतर {{PLURAL:$2|का एक अवतरण|के $2 अवतरण}} ($1) नहीं {{PLURAL:$2|पाया गया|पाए गए}}।
 
@@ -1277,7 +1278,7 @@ $1",
 'shown-title' => 'हर पृष्ठ पर $1 {{PLURAL:$1|परिणाम}} दिखाएँ',
 'viewprevnext' => 'देखें ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''इस विकि पर \"[[:\$1]]\" नाम का एक पृष्ठ है'''",
-'searchmenu-new' => "'''इस विकि पर \"[[:\$1]]\" नाम का पृष्ठ बनाएँ!'''",
+'searchmenu-new' => '<strong>इस विकि पर "[[:$1]]" नाम का पृष्ठ बनाएँ!</strong>{{PLURAL:$2|0=|आपकी खोज से मिला पृष्ठ भी देखें।|खोज परिणाम भी देखें।}}',
 'searchprofile-articles' => 'सामग्री पृष्ठ',
 'searchprofile-project' => 'सहायता और परियोजना पृष्ठ',
 'searchprofile-images' => 'मल्टीमीडिया',
@@ -1622,12 +1623,12 @@ HTML टैग की जाँच करें।',
 'recentchanges-label-unpatrolled' => 'यह संपादन अभी जाँचा नहीं गया है',
 'recentchanges-label-plusminus' => 'पृष्ठ आकार इस बाइट संख्या से बदला',
 'recentchanges-legend-heading' => "'''कुंजी:'''",
-'recentchanges-legend-newpage' => '([[विशेष:NewPages|नए पन्नों की सूची]] को भी देखें)',
+'recentchanges-legend-newpage' => '([[Special:NewPages|नए पन्नों की सूची]] को भी देखें)',
 'rcnotefrom' => "नीचे '''$2''' के बाद से ('''$1''' तक) हुए बदलाव दर्शाए गये हैं।",
 'rclistfrom' => '$1 से नये बदलाव दिखाएँ',
 'rcshowhideminor' => 'छोटे बदलाव $1',
 'rcshowhidebots' => 'बॉट $1',
-'rcshowhideliu' => '$1 पंजीकृत सदस्य',
+'rcshowhideliu' => 'पंजीकृत सदस्य $1',
 'rcshowhideanons' => 'आइ॰पी सदस्यों के बदलाव $1',
 'rcshowhidepatr' => 'परीक्षित सम्पादन $1',
 'rcshowhidemine' => 'मेरे बदलाव $1',
@@ -2134,6 +2135,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'protectedpages' => 'सुरक्षित पृष्ठ',
 'protectedpages-indef' => 'केवल अनिश्चितकालीन सुरक्षाएँ',
 'protectedpages-cascade' => 'केवल सोपानी सुरक्षा',
+'protectedpages-noredirect' => 'पुनर्निर्देश छुपाएँ',
 'protectedpagesempty' => 'इस समय इन नियमों द्वारा कोई पृष्ठ सुरक्षित नहीं हैं।',
 'protectedtitles' => 'सुरक्षित शीर्षक',
 'protectedtitlesempty' => 'इन नियमों द्वारा कोई भी शीर्षक सुरक्षित नहीं हैं।',
@@ -2321,6 +2323,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'watchmethod-list' => 'ध्यानसूची में दिये गये पृष्ठों में हाल में हुए बदलाव देख रहे हैं',
 'watchlistcontains' => 'आपकी ध्यानसूची में $1 {{PLURAL:$1|पृष्ठ}} हैं।',
 'iteminvalidname' => "'$1' के साथ समस्या, अवैध नाम...",
+'wlnote2' => '$2,$3 तक आखरी {{PLURAL:$1|घंटे|<strong>$1</strong>घंटों}} में बदलाव निम्नलिखित हैं।',
 'wlshowlast' => 'पिछले $1 घंटे $2 दिन $3 देखें',
 'watchlist-options' => 'ध्यानसूची विकल्प',
 
@@ -2355,7 +2358,7 @@ $PAGEINTRO $NEWPAGE
 ई-मेल: $PAGEEDITOR_EMAIL
 विकि: $PAGEEDITOR_WIKI
 
-जब तक आप इस पृष्ठ पर फिर से नहीं जाते, तब तक और बदलाव होने पर भी आपको फिर से सूचना नहीं भेजी जाएगी।
+à¤\9cब à¤¤à¤\95 à¤\86प à¤\87स à¤ªà¥\83षà¥\8dठ à¤ªà¤° à¤²à¥\89à¤\97िन à¤\95र à¤\95à¥\87 à¤«à¤¿à¤° à¤¸à¥\87 à¤¨à¤¹à¥\80à¤\82 à¤\9cातà¥\87, à¤¤à¤¬ à¤¤à¤\95 à¤\94र à¤¬à¤¦à¤²à¤¾à¤µ à¤¹à¥\8bनà¥\87 à¤ªà¤° à¤­à¥\80 à¤\86पà¤\95à¥\8b à¤«à¤¿à¤° à¤¸à¥\87 à¤¸à¥\82à¤\9aना à¤¨à¤¹à¥\80à¤\82 à¤­à¥\87à¤\9cà¥\80 à¤\9cाà¤\8fà¤\97à¥\80।
 आप चाहें तो अपनी ध्यानसूची में मौजूद सभी पन्नों के लिए सूचना चिन्ह को भी बदल सकते हैं।
 
 आपकी सहायिका, {{SITENAME}} की सूचक प्रणाली
@@ -2688,8 +2691,8 @@ $1',
 'change-blocklink' => 'विभाग बदलें',
 'contribslink' => 'योगदान',
 'emaillink' => 'ई-मेल भेजें',
-'autoblocker' => 'आपका IP पता स्वत: बाध्य है, जो की हाल ही में "[[User:$1|$1]]" द्वारा प्रयोग किया गया है।
-$1 à¤\95à¥\8b à¤¬à¤¾à¤§à¥\8dय करने का कारण है: "$2"',
+'autoblocker' => 'आपका आइ॰पी पता स्वतः अवरुद्ध है, चूँकि इसे हाल ही में "[[User:$1|$1]]" द्वारा प्रयोग किया गया है।
+$1 à¤\95à¥\8b à¤\85वरà¥\8bधित करने का कारण है: "$2"',
 'blocklogpage' => 'ब्लॉक सूची',
 'blocklog-showlog' => 'इस प्रयोक्ता को पहले भी अवरोधित किया जा चुका है। 
 सन्दर्भ के लिए अवरोधन अभिलेख नीचे दिया गया है:',
@@ -2711,7 +2714,7 @@ $1 को बाध्य करने का कारण है: "$2"',
 'range_block_disabled' => 'प्रबंधकोंको अब रेंज ब्लॉक करने की अनुमति नहीं हैं।',
 'ipb_expiry_invalid' => 'अवैध समाप्ति कालावधी।',
 'ipb_expiry_temp' => 'छुपायें हुए सदस्यनाम ब्लॉक्स हमेशा के लिये होने चाहिये।',
-'ipb_hide_invalid' => 'à¤\87स à¤\96ातà¥\87 à¤\95à¥\8b à¤\9bिपा à¤¨à¤¹à¥\80à¤\82 à¤ªà¤¾à¤\8f; à¤¸à¤\82भव à¤¹à¥\88 à¤\95ि à¤\87समà¥\87à¤\82 à¤¬à¤¹à¥\81त à¤\85धिà¤\95 à¤¸à¤\82पादन à¤¹à¥\81à¤\8f à¤¹à¥\8bà¤\82।',
+'ipb_hide_invalid' => 'à¤\87स à¤\96ातà¥\87 à¤\95à¥\8b à¤\9bिपा à¤¨à¤¹à¥\80à¤\82 à¤ªà¤¾à¤\8f; à¤\87स à¤¸à¥\87 {{PLURAL:$1|à¤\8fà¤\95 à¤¸à¤®à¥\8dपादन à¤\95िया à¤\97या à¤¹à¥\88|$1 à¤¸à¤®à¥\8dपादन à¤\95ियà¥\87 à¤\97यà¥\87 à¤¹à¥\88à¤\82}}।',
 'ipb_already_blocked' => '"$1" को पहलेसे ब्लॉक हैं',
 'ipb-needreblock' => '$1 पहले ही अवरोधित है।
 क्या आप अवरोध के जमाव बदलना चाहेंगे?',
@@ -2884,6 +2887,7 @@ $1 को बाध्य करने का कारण है: "$2"',
 'allmessages-prefix' => 'उपसर्ग के आधार पर छानें:',
 'allmessages-language' => 'भाषा:',
 'allmessages-filter-submit' => 'जाएँ',
+'allmessages-filter-translate' => 'अनुवाद करें',
 
 # Thumbnails
 'thumbnail-more' => 'बड़ा करें',
@@ -2934,7 +2938,7 @@ $1 को बाध्य करने का कारण है: "$2"',
 'importuploaderrortemp' => 'आयात फ़ाईल अपलोड हुई नहीं। एक अस्थायी डाइरेक्टरी नहीं मिल रहीं।',
 'import-parse-failure' => 'XML आयात पार्स पूरा नहीं हुआ',
 'import-noarticle' => 'आयात करने के लिये पृष्ठ नहीं!',
-'import-nonewrevisions' => 'सभà¥\80 à¤\85वतरण à¤ªà¤¹à¤²à¥\87 à¤¹à¥\80 à¤\86यात à¤\95र à¤¦à¤¿à¤¯à¥\87 à¤\97यà¥\87 à¤¹à¥\88à¤\82।',
+'import-nonewrevisions' => 'à¤\95à¥\8bà¤\88 à¤\85वतरण à¤\86यात à¤¨à¤¹à¥\80à¤\82 à¤\95ियà¥\87 à¤\97यà¥\87 (या à¤¤à¥\8b à¤¸à¤­à¥\80 à¤\85वतरण à¤ªà¤¹à¤²à¥\87 à¤¸à¥\87 à¤®à¥\8cà¤\9cà¥\82द à¤¹à¥\88à¤\82, à¤¯à¤¾ à¤¤à¥\8dरà¥\81à¤\9fियà¥\8bà¤\82 à¤\95à¥\87 à¤\95ारण à¤\9bà¥\8bड़à¥\87 à¤\97यà¥\87)।',
 'xml-error-string' => '$1 पंक्ति $2 में, कॉलम $3 (बाईट $4): $5',
 'import-upload' => 'XML डाटा अपलोड करें',
 'import-token-mismatch' => 'सत्र सामग्री खो गई है। 
@@ -3069,8 +3073,8 @@ $1 को बाध्य करने का कारण है: "$2"',
 'spam_reverting' => '$1 को कड़ी ना होने वाले पुराने अवतरण को पुनर्स्थापित कर रहें हैं',
 'spam_blanking' => 'सभी अवतरणोंमें $1 को कड़ियां हैं, पूरा पाठ निकाल रहें हैं',
 'spam_deleting' => 'सभी अवतरणों में $1 की कड़ी थी, हटाया जा रहा है',
-'simpleantispam-label' => "ऍन्टी-स्पैम जाँच.
-इसे भरें '''नहीं'''!",
+'simpleantispam-label' => 'ऐन्टी-स्पैम जाँच।
+इसे <strong>नहीं</strong> भरें!',
 
 # Info page
 'pageinfo-title' => '"$1" के लिये जानकारी',
@@ -3726,6 +3730,9 @@ $5
 'imgmultigo' => 'जायें!',
 'imgmultigoto' => '$1 पृष्ठ पर जायें',
 
+# Language selector for translatable SVGs
+'img-lang-default' => '(डिफ़ॉल्ट भाषा)',
+
 # Table pager
 'ascending_abbrev' => 'asc',
 'descending_abbrev' => 'ज़ानकारी',
@@ -3853,10 +3860,13 @@ $5
 'version-parser-function-hooks' => 'पार्सर कार्य हूक',
 'version-hook-name' => 'हूक नाम',
 'version-hook-subscribedby' => 'ने सदस्यत्व लिया',
-'version-version' => '(अवतरण $1)',
-'version-license' => 'अनुज्ञापत्र',
+'version-version' => '($1)',
+'version-license' => 'मीडियाविकि अनुज्ञापत्र',
+'version-ext-colheader-description' => 'विवरण',
+'version-ext-colheader-credits' => 'लेखक',
 'version-poweredby-credits' => "यह विकि  '''[https://www.mediawiki.org/ MediaWiki]''' द्वारा संचालित है, कॉपीराइट © 2001 - $1  $2 ।",
 'version-poweredby-others' => 'अन्य',
+'version-poweredby-translators' => 'translatewiki.net अनुवादक',
 'version-software' => 'इन्स्टॉल की हुई प्रणाली',
 'version-software-product' => 'प्रोडक्ट',
 'version-software-version' => 'अवतरण',
index ead48ef..860a64f 100644 (file)
@@ -37,7 +37,6 @@ $namespaceNames = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Jorr ke niche line khicho:',
-'tog-justify' => 'Paragraphs ke justify karo',
 'tog-hideminor' => 'Chhota aur nawaa badlao ke lukao',
 'tog-hidepatrolled' => 'Pahraa dewa gais badlao ke nawaa badlao me se lukao',
 'tog-newpageshidepatrolled' => 'Pahraa dewa gais badlao ke nawaa panna me se lukao',
@@ -1079,7 +1078,6 @@ Ii baat ke dhyan me rakhna ki navigation jorr ke kaam me laae se ii column reset
 'showhideselectedversions' => 'Chuna gae versions ke dekhao/lukao',
 'editundo' => 'Pahile jaise kar do',
 'diff-empty' => '(ek rakam)',
-'diff-multi' => '({{PLURAL:$1|Ek biich waala badlao|$1 biich waala badlao}} jiske {{PLURAL:$2|sadasya|$2 sadasya}} karis hae, ke  nai dekhawa jae hai.)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Ek biich waala badlao|$1 biich waala badlao}} jiske {{PLURAL:$2|sadasya|$2 sadasya}} se jaada log karin hae, ke  nai dekhawa jae hai.)',
 'difference-missing-revision' => 'Ii badlao ($1) {{PLURAL:$2|was|were}} pe {{PLURAL:$2|One revision|$2 revisions}} nai pawa gais hae
 Iske kaaran ii hoe sake hae ki ek mitawa gais panna se link karaa jaawe hae.
@@ -2104,7 +2102,6 @@ Ii panna ke aage ke badlao aur usse jurra baat waala panna ki suchi hian pe hae.
 'watchmethod-list' => 'dhyan me rakkha gais panna ke nawaa badlao ke khatir check karaa jaawe hai',
 'watchlistcontains' => 'Aap ke dhyan suchi me  $1 {{PLURAL:$1|panna|panna}} hai.',
 'iteminvalidname' => "'$1' chij se kuchh garrbarr hai, galat naam...",
-'wlnote' => "Niche ke {{PLURAL:$1|pahile waala badlao hai| pahile '''$1''' badlao hai}} pichhle {{PLURAL:$2|ghanta|'''$2''' ghanta}} me as of $3, $4..",
 'wlshowlast' => 'Pichhla $1 ghanta $2 din $3 ke dekhao',
 'watchlist-options' => 'Dhyan suchi ke options',
 
@@ -2775,7 +2772,6 @@ Meharbani kar ke, fir se kosis karo.',
 'tooltip-pt-watchlist' => 'Panna ke suchi jispe aap dhyan rakhaa hae',
 'tooltip-pt-mycontris' => 'Aap ke yogdaan ke suchi',
 'tooltip-pt-login' => 'Aap log in kartaa tab achchha rahataa; lekin jaruri nai hae.',
-'tooltip-pt-anonlogin' => 'Aap ke login kare ke encourage karaa jaawe hai lekin ii jaruri nai hai',
 'tooltip-pt-logout' => 'Log out',
 'tooltip-ca-talk' => 'Content waala panna ke baare me salah',
 'tooltip-ca-edit' => 'Aap ii panna ke badle sakta hai. Meherbaani kar ke bachae se pahile preview button ke kaam me laana.',
index 8ff2bd9..6368b57 100644 (file)
@@ -21,7 +21,6 @@
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Kuritan sa idalom ang mga tabid:',
-'tog-justify' => 'Tadlongon ang mga parapo',
 'tog-hideminor' => 'Tagu-on ang menor nga gin-islan sa bag-o lang gid na-obra',
 'tog-hidepatrolled' => 'Taguon ang mga nabantayan nga na islan na nga bag-o lang gin obra',
 'tog-newpageshidepatrolled' => 'Taguon ang mga nabantayan  nga pahina sa bag-ong lista sang mga pahina',
@@ -1005,7 +1004,6 @@ Tandai nga ang paggamit sang mga link sa pagnabigar magaliwat sining hilera.',
 'compareselectedversions' => 'I-kompara ang pinilian nga mga rebisyon',
 'showhideselectedversions' => 'Ipakita/taguon ang mga ginpili nga pagbag-o',
 'editundo' => 'bawi-on ang pag ilis',
-'diff-multi' => '({{PLURAL:$1|Isa ka tunga-tunga nga pagbag-o|$1 ka tunga-tunga nga mga pagbag-o}} sang {{PLURAL:$2|isa ka manuggamit|$2 ka mga manuggamit}} nga wala ginpakita)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Isa ka tunga-tunga nga pagbag-o|$1 ka tunga-tunga nga mga pagbag-o}} sang masobra $2 ka {{PLURAL:$2|manuggamit|mga manuggamit}} nga wala ginpakita)',
 'difference-missing-revision' => 'May {{PLURAL:$2|isa ka pagbag-o|$2 ka mga pagbag-o}} san sini nga kinalain ($1) ang wala makita.
 
index cafe1f3..3b669ec 100644 (file)
@@ -20,6 +20,7 @@
  * @author Geitost
  * @author Herr Mlinka
  * @author Kaganer
+ * @author Kolega2357
  * @author Luka Krstulovic
  * @author MaGa
  * @author MayaSimFan
@@ -318,7 +319,6 @@ $linkTrail = '/^([čšžćđßa-z]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Podcrtane poveznice',
-'tog-justify' => 'Poravnaj odlomke i zdesna',
 'tog-hideminor' => 'Sakrij manje izmjene u nedavnim promjenama',
 'tog-hidepatrolled' => 'Sakrij pregledane izmjene u nedavnim promjenama',
 'tog-newpageshidepatrolled' => 'Sakrij pregledane stranice iz popisa novih stranica',
@@ -480,7 +480,6 @@ $messages = array(
 'vector-action-protect' => 'Zaštiti',
 'vector-action-undelete' => 'Vrati',
 'vector-action-unprotect' => 'Promijeni zaštitu',
-'vector-simplesearch-preference' => 'Omogući traku za pretraživanje (samo izgled Vector)',
 'vector-view-create' => 'Započni',
 'vector-view-edit' => 'Uredi',
 'vector-view-history' => 'Vidi stare izmjene',
@@ -1322,7 +1321,8 @@ Primijetite da uporaba navigacijskih poveznica resetira Vaše izbore u stupcu.',
 'showhideselectedversions' => 'Otkrij/sakrij odabrane izmjene',
 'editundo' => 'ukloni ovu izmjenu',
 'diff-empty' => 'Nema razlike inačica',
-'diff-multi' => '({{PLURAL:$1|Nije prikazana jedna međuinačica|Nisu prikazane $1 međuinačice|Nije prikazano $1 međuinačica}} {{PLURAL:$2|jednog|$2|$2}} suradnika)',
+'diff-multi-sameuser' => '{{PLURAL:$1|Nije prikazana jedna međuinačica|Nisu prikazane $1 međuinačice|Nije prikazano $1 međuinačica}} istog suradnika',
+'diff-multi-otherusers' => '({{PLURAL:$1|Nije prikazana jedna međuinačica|Nisu prikazane $1 međuinačice|Nije prikazano $1 međuinačica}} {{PLURAL:$2|jednog|$2}} suradnika)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Nije prikazana jedna međuinačica|Nisu prikazane $1 međuinačice|Nije prikazano $1 međuinačica}} više od {{PLURAL:$2|jednog|$2|$2}} suradnika)',
 'difference-missing-revision' => '{{PLURAL:$2|Uređivanje|$2 uređivanja}} sljedeće šifre ($1) ne {{PLURAL:$2|postoji|postoje}}.
 
@@ -1368,6 +1368,7 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'searchrelated' => 'povezano',
 'searchall' => 'sve',
 'showingresults' => "Dolje {{PLURAL:$1|je prikazan '''$1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}}, počevši od '''$2'''.",
+'showingresultsinrange' => "Dolje {{PLURAL:$1|je prikazan '''$1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}}, u rasponu od '''$2''' do '''$3'''.",
 'showingresultsnum' => "Dolje {{PLURAL:$3|je prikazan '''$3''' rezultat|su prikazana '''$3''' rezultata|je prikazano '''$3''' rezultata}}, počevši s brojem '''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Rezultat '''$1''' od '''$3'''|Rezultati '''$1 - $2''' od '''$3'''}} za '''$4'''",
 'search-nonefound' => 'Ne postoje rezultati koji se podudaraju s upitom.',
@@ -2324,7 +2325,6 @@ Promjene na toj stranici i njenoj stranici za razgovor bit će prikazane na popi
 'watchmethod-list' => 'provjera praćanih stranica za nedavne promjene',
 'watchlistcontains' => 'Vaš popis praćenja sadrži $1 {{PLURAL:$1|stranicu|stranice|stranica}}.',
 'iteminvalidname' => "Problem s izborom '$1', ime nije valjano...",
-'wlnote' => "Ovdje {{PLURAL:$1|je posljednja $1 promjena|su posljednje $1 promjene|je posljednjih $1 promjena}} u {{PLURAL:$2|posljednjem '''$2''' satu|posljednja '''$2''' sata|posljednjih '''$2''' sati}}, od $3, $4.",
 'wlshowlast' => 'Prikaži zadnjih $1 sati $2 dana $3',
 'watchlist-options' => 'Izbornik popisa praćenja',
 
@@ -2409,6 +2409,7 @@ Sva vremena su prema poslužiteljevom vremenu.',
 'delete-edit-reasonlist' => 'Uredi razloge brisanja',
 'delete-toobig' => 'Ova stranica ima veliku povijest uređivanja, preko $1 {{PLURAL:$1|promjene|promjena}}. Brisanje takvih stranica je ograničeno da se onemoguće slučajni problemi u radu {{SITENAME}}.',
 'delete-warning-toobig' => 'Ova stranica ima veliku povijest uređivanja, preko $1 {{PLURAL:$1|promjene|promjena}}. Brisanje može poremetiti bazu podataka {{SITENAME}}; postupajte s oprezom.',
+'deleting-backlinks-warning' => "'''Upozorenje:''' brišete stranicu koja je uključena u druge ili druge stranice povezuju na nju.",
 
 # Rollback
 'rollback' => 'Ukloni posljednju promjenu',
@@ -2424,7 +2425,8 @@ Posljednju promjenu napravio je [[User:$3|$3]] ([[User talk:$3|Razgovor]]{{int:p
 'editcomment' => "Sažetak promjene je bio: \"''\$1''\".",
 'revertpage' => 'Uklonjena promjena suradnika $2, vraćeno na zadnju inačicu suradnika $1',
 'revertpage-nouser' => 'Vraćene izmjene suradnika (suradničko ime uklonjeno) na posljednju inačicu suradnika [[User:$1|$1]]',
-'rollback-success' => 'Uklonjeno uređivanje suradnika $1; vraćeno na zadnju inačicu suradnika $2.',
+'rollback-success' => 'Uklonjeno uređivanje {{GENDER:$1|suradnika|suradnice}} $1
+vraćeno na zadnju inačicu {{GENDER:$2|suradnika|suradnice}} $2.',
 
 # Edit tokens
 'sessionfailure-title' => 'Prekid sesije',
@@ -2962,7 +2964,6 @@ Snimite je na svoje računalo i postavite je ovdje.',
 'tooltip-pt-watchlist' => 'Popis stranica koje pratite.',
 'tooltip-pt-mycontris' => 'Popis mojih doprinosa',
 'tooltip-pt-login' => 'Predlažemo Vam da se prijavite, ali nije obvezno.',
-'tooltip-pt-anonlogin' => 'Predlažemo Vam da se prijavite, ali nije obvezno.',
 'tooltip-pt-logout' => 'Odjavi se',
 'tooltip-ca-talk' => 'Razgovor o stranici',
 'tooltip-ca-edit' => 'Možete uređivati ovu stranicu. Koristite Pregled kako će izgledati prije nego što snimite.',
index da572b4..508ddf3 100644 (file)
@@ -156,7 +156,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Wotkazy podšmórnić:',
-'tog-justify' => 'Tekst w blokowej sadźbje',
 'tog-hideminor' => 'Snadne změny w aktualnych změnach schować',
 'tog-hidepatrolled' => 'Dohladawane změny w aktualnych změnach schować',
 'tog-newpageshidepatrolled' => 'Dohladowane strony z lisćiny nowych stronow schować',
@@ -319,7 +318,6 @@ $messages = array(
 'vector-action-protect' => 'škitać',
 'vector-action-undelete' => 'Wobnowić',
 'vector-action-unprotect' => 'Škit wotstronić',
-'vector-simplesearch-preference' => 'Zjednorjenu pytansku lajstu zmóžnić (jenož drasta Vector)',
 'vector-view-create' => 'Wutworić',
 'vector-view-edit' => 'Wobdźěłać',
 'vector-view-history' => 'Stawizny',
@@ -960,7 +958,7 @@ Eksistuje hižo.',
 'content-failed-to-parse' => 'Parsowanje wobsaha $2 za model $1 je so njeporadźiło: $3',
 'invalid-content-data' => 'Njepłaćiwe wobsahowe daty',
 'content-not-allowed-here' => 'Wobsah "$1" njeje na stronje [[$2]] dowoleny',
-'editwarning-warning' => 'Hdyž so strona wopušća, móža so změny zhubić, kotrež sy přewjedł. Jeli sy přizjewjeny, móžeš tute warnowanje we wotrězku "Wobdźěłowanje" swojich nastajenjow znjemóžnić.',
+'editwarning-warning' => 'Hdyž so strona wopušća, móža so změny zhubić, kotrež sy přewjedł. Jeli sy přizjewjeny, móžeš tute warnowanje we wotrězku "{{int:prefs-editing}}" swojich nastajenjow znjemóžnić.',
 'editpage-notsupportedcontentformat-title' => 'Wobsahowy format so njepodpěruje',
 'editpage-notsupportedcontentformat-text' => 'Wobsahowy format $1 so přez wobsahowy model $2 njepodpěruje.',
 
@@ -994,6 +992,7 @@ Dyrbjała mjenje hač $2 {{PLURAL:$2|wołanje|wołanjej|wołanja|wołanjow}} mě
 'undo-success' => 'Wersija je so wuspěšnje wotstroniła. Prošu přepruwuj deleka w přirunanskim napohledźe, hač twoja změna bu přewzata a klikń potom na „Składować”, zo by změnu składował.',
 'undo-failure' => 'Wobdźěłanje njehodźeše so wotstronić, dokelž wotpowědny wotrězk bu mjeztym změnjeny.',
 'undo-norev' => 'Změna njeda so cofnyć, dokelž njeeksistuje abo bu wušmórnjena.',
+'undo-nochange' => 'Zda so, zo změna je so hižo cofnyła.',
 'undo-summary' => 'Změna $1 [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusija]]) bu cofnjena.',
 'undo-summary-username-hidden' => 'Změna $1 schowaneho wužiwarja je so anulowała',
 
@@ -1172,7 +1171,8 @@ Zawěsć, zo tuta změna stawiznisku kontinuitu strony wobchowuje.',
 'showhideselectedversions' => 'Wubrane wersije pokazać/schować',
 'editundo' => 'cofnyć',
 'diff-empty' => '(Žadyn rozdźěl)',
-'diff-multi' => '({{PLURAL:$1|Jedna mjezywersija|$1 mjezywersiji|$1 mjezywersije|$1 mjezywersijow}} wot {{PLURAL:$2|jednoho wužiwarja|$2 wužiwarjow|$2 wužiwarjow|$2 wužiwarjow}} {{PLURAL:$1|njepokazana|njepokazanej|njepokazane|njepokazane}})',
+'diff-multi-sameuser' => '({{PLURAL:$1|Jedna mjezywersija|$1 mjezywersiji|$1 mjezywersije|$1 mjezywersijow}} wot samsneho wužiwarja {{PLURAL:$1|njepokazana|njepokazanej|njepokazane|njepokazanych}})',
+'diff-multi-otherusers' => '({{PLURAL:$1|Jedna mjezywersija|$1 mjezywersiji|$1 mjezywersije|$1 mjezywersijow}} wot {{PLURAL:$2|jednoho dalšeho wužiwarja|$2 wužiwarjow}} {{PLURAL:$1|njepokazana|njepokazanej|njepokazane|njepokazanych}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Jedna mjezywersija|$1 mjezywersiji|$1 mjezywersije|$1 mjezywersijow}} wot wjace hač {{PLURAL:$2|jednoho wužiwarja|$2 wužiwarjow|$2 wužiwarjow|$2 wužiwarjow}} {{PLURAL:$1|njepokazana|njepokazanej|njepokazane|njepokazane}})',
 'difference-missing-revision' => '{{PLURAL:$2|Jedna wersija|$2 wersiji|$2 wersije|$2 wersijow}} tutoho rozdźěla ($1) {{PLURAL:$2|njeje so namakała|njejstej so namakałoj|njejsu namakali|njeje so namakało}}.
 
@@ -1193,7 +1193,7 @@ Podrobnosće móžeš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
 'shown-title' => '$1 {{PLURAL:$1|wuslědk|wuslědkaj|wuslědki|wuslědkow}} na stronu pokazać',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) pokazać',
 'searchmenu-exists' => "'''Je strona z mjenom \"[[\$1]]\" na tutym wikiju'''",
-'searchmenu-new' => "'''Wutwor stronu \"[[:\$1|\$1]]\" na tutym wikiju!'''",
+'searchmenu-new' => '<strong>Wutwor stronu "[[:$1]]" na tutym wikiju!</strong> {{PLURAL:$2|0=|Hlej tež stronu namakanu z twojim pytanjom.|Hlej tež namakane pytanske wuslědki.}}',
 'searchprofile-articles' => 'Wobsahowe strony',
 'searchprofile-project' => 'Pomoc a projektowe strony',
 'searchprofile-images' => 'Multimedia',
@@ -1219,6 +1219,7 @@ Podrobnosće móžeš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
 'searchrelated' => 'přiwuzny',
 'searchall' => 'wšě',
 'showingresults' => "Deleka so hač {{PLURAL:$1|'''1''' wuslědk pokazuje|'''$1''' wuslědkaj pokazujetej|'''$1''' wuslědki pokazuja|'''$1''' wuslědkow pokazuje}}, započinajo z #'''$2'''.",
+'showingresultsinrange' => 'Deleka so do {{PLURAL:$1|<strong>1</strong> wuslědka|<strong>$1</strong> wuslědkow}} we wobłuku <strong>$2</strong> hač do <strong>$3</strong> pokazuje.',
 'showingresultsnum' => "Deleka so {{PLURAL:$3|'''1''' wuslědk pokazuje|'''$3''' wuslědkaj pokazujetej|'''$3''' wuslědki pokazuja|'''$3''' wuslědkow pokazuje}}, započinajo z #'''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Wuslědk '''$1''' z '''$3'''|Wuslědki '''$1 - $2''' z '''$3'''}} za '''$4'''",
 'search-nonefound' => 'Njebuchu wuslědki namakane, kotrež naprašowanju wotpowěduja.',
@@ -2030,9 +2031,18 @@ Kóžda rjadka wobsahuje wotkazy k prěnjemu a druhemu daleposrědkowanju kaž t
 'deadendpagestext' => 'Slědowace strony njejsu z druhimi stronami w tutym wikiju zwjazane.',
 'protectedpages' => 'Škitane strony',
 'protectedpages-indef' => 'Jenož strony z njewobmjezowanym škitom',
+'protectedpages-summary' => 'Tuta specialna strona naliči wšě strony, kotrež su přećiwo přesunjenju abo wobdźěłowanju škitane.',
 'protectedpages-cascade' => 'Jenož strony z kaskadowym škitom',
 'protectedpages-noredirect' => 'Dalesposrědkowanja schować',
 'protectedpagesempty' => 'Tuchwilu žane.',
+'protectedpages-timestamp' => 'Časowy kołk',
+'protectedpages-page' => 'Strona',
+'protectedpages-expiry' => 'Płaćiwy hač do',
+'protectedpages-performer' => 'Škitacy wužiwar',
+'protectedpages-params' => 'Škitowe parametry',
+'protectedpages-reason' => 'Přičina',
+'protectedpages-unknown-timestamp' => 'Njeznaty',
+'protectedpages-unknown-performer' => 'Njeznaty wužiwar',
 'protectedtitles' => 'Škitane titule',
 'protectedtitlesempty' => 'Žane titule njejsu tuchwilu z tutymi parametrami škitane.',
 'listusers' => 'Lisćina wužiwarjow',
@@ -2217,6 +2227,7 @@ Přichodne změny tuteje strony a přisłušneje diskusijneje strony budu so tam
 'watchmethod-list' => 'Wobkedźbowanki za aktualnymi změnami přepruwować',
 'watchlistcontains' => 'Maš $1 {{PLURAL:$1|stronu|stronje|strony|stronow}} w swojich wobkedźbowankach.',
 'iteminvalidname' => 'Problem ze zapiskom „$1“, njepłaćiwe mjeno.',
+'wlnote2' => 'Slěduja změny {{PLURAL:$1|zańdźeneje hodźiny|zańdźeneju <strong>$1</strong> hodźinow|zańdźenych <strong>$1</strong> hodźin}} Staw: $2, $3.',
 'wlshowlast' => 'Poslednje $1 hodź. - $2 dnjow - $3 pokazać',
 'watchlist-options' => 'Opcije wobkedźbowankow',
 
@@ -2747,6 +2758,7 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
 'allmessages-prefix' => 'Po prefiksu filtrować:',
 'allmessages-language' => 'Rěč:',
 'allmessages-filter-submit' => 'Wotesłać',
+'allmessages-filter-translate' => 'Přełožić',
 
 # Thumbnails
 'thumbnail-more' => 'powjetšić',
@@ -2763,6 +2775,7 @@ $2',
 'thumbnail_image-type' => 'Wobrazowy typ so njepodpěruje',
 'thumbnail_gd-library' => 'Njedospołna konfiguracija GD-biblioteki: falowaca funkcija $1',
 'thumbnail_image-missing' => 'Zda so, zo dataja faluje: $1',
+'thumbnail_image-failure-limit' => 'Njedawno je přewjele pospytow było, kotrež je so nimokuliło ($1 abo wjace), zo by tutu miniaturu rysowało. Prošu spytajće pozdźišo hišće raz.',
 
 # Special:Import
 'import' => 'Strony importować',
@@ -2795,7 +2808,7 @@ $2',
 'importuploaderrortemp' => 'Nahraće importoweje dataje je so njeporadźiło. Temporarny zapis faluje.',
 'import-parse-failure' => 'Zmylk za XML-import:',
 'import-noarticle' => 'Žadyn nastawk za import!',
-'import-nonewrevisions' => 'Wšě wersije buchu hižo prjedy importowane.',
+'import-nonewrevisions' => 'Žane wersije zaimportowane (wšě pak su hižo eksistowali pak su so zmylkow dla přeskočili).',
 'xml-error-string' => '$1 linka $2, špalta $3, (bajt $4): $5',
 'import-upload' => 'XML-daty nahrać',
 'import-token-mismatch' => 'Strata posedźenskich datow. Prošu spytaj hišće raz.',
@@ -2806,6 +2819,7 @@ $2',
 'import-error-special' => 'Strona "$1" so njeimportuje, dokelž k wosebitemu mjenowemu rumej słuša, kotryž strony njedowola.',
 'import-error-invalid' => 'Strona "$1" so njeimportuje, dokelž jeje mjeno je njepłaćiwe.',
 'import-error-unserialize' => 'Wersija $2 strony "$1" njeda so wotserializować. Wersija je so zdźěliła za wužiwanje wobsahoweho modela $3, kotryž je jako $4 serializowany.',
+'import-error-bad-location' => 'Wersija $2, kotraž wobsahowy model $3 wužiwa, njeda so pod "$1" w tutym wikiju składować, dokelž so model na tutej stronje njepodpěruje.',
 'import-options-wrong' => '{{PLURAL:$2|Wopačna opcija|Wopačnej opciji|Wopačne opcije|Wopačne opcije}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Podata korjenjowa strona je njepłaćiwa.',
 'import-rootpage-nosubpage' => 'Mjenowy rum "$1" korjenjoweje strony njedowola podstrony.',
@@ -3960,6 +3974,5 @@ Hewak móžeš slědowacy jednory formular wužiwać. Twój komentar přida so s
 'expand_templates_preview' => 'Přehlad',
 
 # Unknown messages
-'createaccount-hook-aborted' => '$1',
 'uploadinvalidxml' => 'XML w nahratej dataji njeda so parsować.',
 );
index c5acdd8..dd11e2f 100644 (file)
@@ -20,6 +20,7 @@
  * @author Dani
  * @author Dj
  * @author Dorgan
+ * @author Einstein2
  * @author Enbéká
  * @author Geitost
  * @author Glanthor Reviol
@@ -316,7 +317,6 @@ $linkTrail = '/^([a-záéíóúöüőűÁÉÍÓÚÖÜŐŰ]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Hivatkozások aláhúzása:',
-'tog-justify' => 'Bekezdések sorkizárása',
 'tog-hideminor' => 'Apró változtatások elrejtése a friss változtatások lapon',
 'tog-hidepatrolled' => 'Az ellenőrzött szerkesztések elrejtése a friss változtatások lapon',
 'tog-newpageshidepatrolled' => 'Ellenőrzött lapok elrejtése az új lapok listájáról',
@@ -478,7 +478,6 @@ $messages = array(
 'vector-action-protect' => 'Lapvédelem',
 'vector-action-undelete' => 'Visszaállítás',
 'vector-action-unprotect' => 'Védelem módosítása',
-'vector-simplesearch-preference' => 'Egyszerűsített keresési sáv engedélyezése (csak Vector felületen)',
 'vector-view-create' => 'Létrehozás',
 'vector-view-edit' => 'Szerkesztés',
 'vector-view-history' => 'Laptörténet',
@@ -1117,7 +1116,7 @@ Már létezik.',
 'invalid-content-data' => 'Érvénytelen tartalom adat',
 'content-not-allowed-here' => '"$1" tartalom nem engedélyezett a [[$2]] oldalon',
 'editwarning-warning' => 'A lap elhagyásával az összes itt végzett változtatás elveszhet.
-Ha be vagy jelentkezve letilthatod ezt a figyelmeztetést a beállításaid „Szerkesztés” szakaszában.',
+Ha be vagy jelentkezve letilthatod ezt a figyelmeztetést a beállításaid „{{int:prefs-editing}}” szakaszában.',
 
 # Content models
 'content-model-wikitext' => 'wikiszöveg',
@@ -1321,7 +1320,6 @@ Győződj meg róla, hogy a laptörténet folytonossága megmarad.',
 'showhideselectedversions' => 'Kiválasztott változatok láthatóságának beállítása',
 'editundo' => 'visszavonás',
 'diff-empty' => '(Nincs különbség)',
-'diff-multi' => '({{PLURAL:$2|egy|$2}} szerkesztő {{PLURAL:$1|egy|$1}} közbeeső változata nincs mutatva)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Egy közbeeső változat|$1 közbeeső változat}} nincs mutatva, amit $2 szerkesztő módosított)',
 'difference-missing-revision' => 'A(z) "{{PAGENAME}}" nevű oldal #$1 $2 változata nem létezik.
 
@@ -1667,7 +1665,7 @@ A műveletet nem lehet visszavonni.',
 'rclistfrom' => '$1 után történt változtatások megtekintése',
 'rcshowhideminor' => 'apró szerkesztések $1',
 'rcshowhidebots' => 'botok szerkesztéseinek $1',
-'rcshowhideliu' => '$1 bejelentkezett felhasználó',
+'rcshowhideliu' => 'bejelentkezett szerkesztők szerkesztéseinek $1',
 'rcshowhideanons' => 'névtelen szerkesztések $1',
 'rcshowhidepatr' => 'ellenőrzött szerkesztések $1',
 'rcshowhidemine' => 'saját szerkesztések $1',
@@ -2329,7 +2327,7 @@ Ezután minden, a lapon vagy annak vitalapján történő változást ott fogsz
 'watchmethod-list' => 'a legfrissebb szerkesztésekben található figyelt lapok',
 'watchlistcontains' => 'A figyelőlistádon {{PLURAL:$1|egy|$1}} lap szerepel.',
 'iteminvalidname' => "Probléma a '$1' elemmel: érvénytelen név...",
-'wlnote' => "Alább az utolsó '''{{PLURAL:$2|egy|$2}}''' óra '''{{PLURAL:$1|egy|$1}}''' változtatása látható. A lap generálásának ideje $3, $4.",
+'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',
 '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',
 
@@ -2974,7 +2972,6 @@ Mentsd el a számítógépedre, majd töltsd fel ide.',
 'tooltip-pt-watchlist' => 'Az általad figyelemmel kísért oldalak utolsó változtatásai',
 'tooltip-pt-mycontris' => 'A közreműködéseid listája',
 'tooltip-pt-login' => 'Bejelentkezni javasolt, de nem kötelező.',
-'tooltip-pt-anonlogin' => 'Bejelentkezni javasolt, de nem kötelező.',
 'tooltip-pt-logout' => 'Kijelentkezés',
 'tooltip-ca-talk' => 'Az oldal tartalmának megvitatása',
 'tooltip-ca-edit' => 'Te is szerkesztheted ezt az oldalt. Mentés előtt használd az előnézet gombot.',
index ea32ddb..45bce2a 100644 (file)
@@ -277,7 +277,6 @@ $linkTrail = '/^([a-zաբգդեզէըթժիլխծկհձղճմյնշոչպջռս
 $messages = array(
 # User preference toggles
 'tog-underline' => 'ընդգծել հղումները՝',
-'tog-justify' => 'Հավասարացնել տեքստը էջի լայնությամբ',
 'tog-hideminor' => 'Թաքցնել չնչին խմբագրումները վերջին փոփոխությունների ցանկից',
 'tog-hidepatrolled' => 'Թաքցնել պարեկված խմբագրումները վերջին փոփոխությունների ցանկից',
 'tog-newpageshidepatrolled' => 'Թաքցնել պարեկված էջերը նոր էջերի ցանկից',
@@ -438,7 +437,6 @@ $messages = array(
 'vector-action-protect' => 'Պաշտպանել',
 'vector-action-undelete' => 'Վերականգնել',
 'vector-action-unprotect' => 'Փոխել պաշտպանումը',
-'vector-simplesearch-preference' => 'Միացնել պարզեցված որոնման դաշտը (միայն Վեկտոր թեմայի դեպքում)',
 'vector-view-create' => 'Ստեղծել',
 'vector-view-edit' => 'Խմբագրել',
 'vector-view-history' => 'Դիտել պատմությունը',
@@ -913,9 +911,9 @@ $2',
 Համակարգ մուտք գործելուն պես կարող եք ''[[Special:ChangePassword|փոխել գաղտնաբառը]]''։",
 'newarticle' => '(Նոր)',
 'newarticletext' => "Դուք հղվել եք դեռևս գոյություն չունեցող էջի։ 
\86Õ¸Ö\80 Õ§Õ» Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬Õ¸Ö\82 Õ°Õ¡Õ´Õ¡Ö\80 Õ¶Õ¥Ö\80Ö\84Ö\87Õ¸Ö\82Õ´ Õ£Õ¿Õ¶Õ¾Õ¸Õ² Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ´Õ¡Õ¶ Õ¤Õ¡Õ·Õ¿Õ¸Ö\82Õ´ Õ¡Õ¾Õ¥Õ¬Õ¡Ö\81Ö\80Õ¥Ö\84 Õ±Õ¥Ö\80 Õ¿Õ¥Ö\84Õ½Õ¿Õ¨, այնուհետև սեղմեք '''Հիշել էջը''' (այցելեք [[{{MediaWiki:Helppage}}|օգնության էջը]]՝ մանրամասն տեղեկությունների համար)։ 
\86Õ¸Ö\80 Õ§Õ» Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬Õ¸Ö\82 Õ°Õ¡Õ´Õ¡Ö\80 Õ½Õ¿Õ¸Ö\80Ö\87 Õ£Õ¿Õ¶Õ¾Õ¸Õ² Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ´Õ¡Õ¶ Õ¤Õ¡Õ·Õ¿Õ¸Ö\82Õ´ Õ¡Õ¾Õ¥Õ¬Õ¡Ö\81Ö\80Õ¥Ö\84 Õ¿Õ¥Ö\84Õ½Õ¿, այնուհետև սեղմեք '''Հիշել էջը''' (այցելեք [[{{MediaWiki:Helppage}}|օգնության էջը]]՝ մանրամասն տեղեկությունների համար)։ 
 
-ÔµÕ©Õ¥ Õ¤Õ¸Ö\82Ö\84 Õ½Õ­Õ¡Õ¬Õ´Õ¡Õ´Õ¢ Õ¥Ö\84 Õ¡ÕµÕ½Õ¿Õ¥Õ² Õ°Õ¡ÕµÕ¿Õ¶Õ¾Õ¥Õ¬, Õ¡ÕºÕ¡ Õ½Õ¥Õ²Õ´Õ¥Ö\84 Õ±Õ¥Ö\80 Õ¦Õ¶Õ¶Õ¡Ö\80Õ¯Õ«չի '''հետ''' (back) կոճակը։",
+ÔµÕ©Õ¥ Õ¤Õ¸Ö\82Ö\84 Õ½Õ­Õ¡Õ¬Õ´Õ¡Õ´Õ¢ Õ¥Ö\84 Õ¡ÕµÕ½Õ¿Õ¥Õ² Õ°Õ¡ÕµÕ¿Õ¶Õ¾Õ¥Õ¬, Õ¡ÕºÕ¡ Õ½Õ¥Õ²Õ´Õ¥Ö\84 Õ±Õ¥Ö\80 Õ¤Õ«Õ¿Õ¡Ö\80Õ¯չի '''հետ''' (back) կոճակը։",
 'anontalkpagetext' => "----
 ''Այս քննարկման էջը պատկանում է անանուն մասնակցին, որը դեռ չի ստեղծել մասնակցային հաշիվ կամ չի մտել համակարգ մասնակցի անունով։''
 Այդ իսկ պատճառով օգտագործվում է թվային IP-հասցեն։
@@ -1155,7 +1153,6 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'compareselectedversions' => 'Համեմատել ընտրած տարբերակները',
 'showhideselectedversions' => 'Ցուցադրել/թաքցնել ընտրված խմբագրումները',
 'editundo' => 'հետ շրջել',
-'diff-multi' => '({{PLURAL:$1|$1 միջանկյալ տարբերակ|$1 միջանկյալ տարբերակ}} ցուցադրված չէ։)',
 
 # Search results
 'searchresults' => 'Որոնման արդյունքներ',
@@ -1548,11 +1545,13 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'linkstoimage' => 'Հետևյալ {{PLURAL:$1|էջը հղվում է|$1 էջերը հղվում են}} այս նիշքին՝',
 'nolinkstoimage' => 'Այս նիշքին հղվող էջեր չկան։',
 'sharedupload' => 'Այս նիշքը $1 զետեղարանից է և կարող է օգտագործվել այլ նախագծերում։',
-'sharedupload-desc-here' => 'Այս նիշքը $1-ից է և թուլատրելի է այլ նախագծերի կողմից օգտագործվել։ [$2 Նիշքի նկարագրման էջի] նկարագրությունը ներկայացված է ներքո։',
+'sharedupload-desc-here' => 'Այս նիշքը տեղադրված է $1ում է և այն կարող է օգտագործվել այլ նախագծերի կողմից։
+$1ում [$2 նիշքի մասին տեղեկությունների] հիմնական մասը ներկայացված է ստորև։',
 'filepage-nofile' => 'Այս անունով նիշք գոյություն չունի։',
 'filepage-nofile-link' => 'Այս անունով նիշք գոյություն չունի, դուք կարող եք [$1 բեռնել այն]:',
 'uploadnewversion-linktext' => 'Բեռնել այս նիշքի նոր տարբերակ',
 'shared-repo-from' => '$1-ից',
+'shared-repo-name-wikimediacommons' => 'Վիքիպահեստ',
 
 # File reversion
 'filerevert' => 'Հետ շրջել $1-ը',
@@ -2471,7 +2470,7 @@ $1',
 'widthheightpage' => '$1 × $2, $3 էջեր',
 'file-info' => 'նիշքի չափ՝ $1, MIME-տեսակ՝ $2',
 'file-info-size' => '$1 × $2 փիքսել, նիշքի չափը՝ $3, MIME-տեսակը՝ $4',
-'file-nohires' => 'Ô²Õ¡Ö\80Õ±Ö\80 Õ©Õ¸Ö\82ÕµÕ¬Õ¡Õ¿Õ¾Õ¸Ö\82Õ©ÕµÕ¡Õ´Õ¢ տարբերակ չկա։',
+'file-nohires' => 'Ô±Õ¾Õ¥Õ¬Õ« Õ¢Õ¡Ö\80Õ±Ö\80 Õ¯Õ¥Õ¿Õ¡Õ¹Õ¡Ö\83Õ¸Õ¾ տարբերակ չկա։',
 'svg-long-desc' => 'SVG-նիշք, անվանապես $1 × $2 փիքսել, նիշքի չափը՝ $3',
 'show-big-image' => 'Լրիվ թույլատվությամբ',
 
index f8af929..7280706 100644 (file)
@@ -147,7 +147,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Sublinear ligamines:',
-'tog-justify' => 'Justificar paragraphos',
 'tog-hideminor' => 'Celar le modificationes minor in le modificationes recente',
 'tog-hidepatrolled' => 'Celar le modificationes patruliate in le modificationes recente',
 'tog-newpageshidepatrolled' => 'Celar le paginas patruliate del lista de nove paginas',
@@ -715,6 +714,8 @@ Pro completar le accesso, tu debe definir un nove contrasigno hic:',
 'retypenew' => 'Repete le nove contrasigno:',
 'resetpass_submit' => 'Definir contrasigno e aperir un session',
 'changepassword-success' => 'Tu contrasigno ha essite cambiate!',
+'changepassword-throttled' => 'Tu ha recentemente facite troppo de tentativas de aperir session.
+Per favor attende $1 ante de probar lo novemente.',
 'resetpass_forbidden' => 'Le contrasignos non pote esser cambiate',
 'resetpass-no-info' => 'Tu debe aperir un session pro poter acceder directemente a iste pagina.',
 'resetpass-submit-loggedin' => 'Cambiar contrasigno',
@@ -775,6 +776,8 @@ Contrasigno temporari: $2',
 'changeemail-password' => 'Contrasigno de {{SITENAME}}:',
 'changeemail-submit' => 'Cambiar e-mail',
 'changeemail-cancel' => 'Cancellar',
+'changeemail-throttled' => 'Tu ha facite troppo de tentativas de aperir session.
+Per favor attende $1 ante de probar lo novemente.',
 
 # Special:ResetTokens
 'resettokens' => 'Reinitialisar indicios',
@@ -1223,7 +1226,6 @@ Nota que le uso del ligamines de navigation causara le perdita de tote cambios i
 'showhideselectedversions' => 'Revelar/celar le versiones seligite',
 'editundo' => 'disfacer',
 'diff-empty' => '(Nulle differentia)',
-'diff-multi' => '({{PLURAL:$1|Un version intermedie|$1 versiones intermedie}} facite per {{PLURAL:$2|un usator|$2 usatores}} non es monstrate)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Un version intermedie|$1 versiones intermedie}} facite per plus de $2 {{PLURAL:$2|usator|usatores}} non es monstrate)',
 'difference-missing-revision' => '{{PLURAL:$2|Un version|$2 versiones}} de iste differentia ($1) non ha essite trovate.
 
@@ -1260,6 +1262,7 @@ Detalios se trova in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
 'search-result-score' => 'Relevantia: $1%',
 'search-redirect' => '(redirection ab $1)',
 'search-section' => '(section $1)',
+'search-file-match' => '(corresponde al contento del file)',
 'search-suggest' => 'Esque tu vole dicer: $1',
 'search-interwiki-caption' => 'Projectos fratres',
 'search-interwiki-default' => 'Resultatos de $1:',
@@ -2293,7 +2296,7 @@ Le modificationes futur in iste pagina e in le pagina de discussion associate es
 'watchmethod-list' => 'cerca modificationes recente in paginas sub observation',
 'watchlistcontains' => 'Tu observatorio contine $1 {{PLURAL:$1|pagina|paginas}}.',
 'iteminvalidname' => "Problema con entrata '$1', nomine invalide...",
-'wlnote' => "Ecce le ultime {{PLURAL:$1|modification|'''$1''' modificationes}} durante le ultime {{PLURAL:$2|hora|'''$2''' horas}}, a partir del $3 a $4.",
+'wlnote2' => 'Ecce le cambiamentos in le ultime {{PLURAL:$1|hora|<strong>$1</strong> horas}}, a partir del $2 a $3.',
 'wlshowlast' => 'Revelar ultime $1 horas $2 dies $3',
 'watchlist-options' => 'Optiones del observatorio',
 
@@ -2383,7 +2386,7 @@ Le deletion de tal paginas ha essite restringite pro impedir le disruption accid
 'delete-warning-toobig' => 'Iste pagina ha un grande historia de modificationes con plus de $1 {{PLURAL:$1|version|versiones}}.
 Le deletion de illo pote disrumper le operationes del base de datos de {{SITENAME}};
 procede con caution.',
-'deleting-backlinks-warning' => "'''Attention:''' Il ha altere paginas con ligamines al pagina que tu es sur le puncto de deler.",
+'deleting-backlinks-warning' => "'''Attention:''' Il ha altere paginas que liga a o transclude le pagina que tu es sur le puncto de deler.",
 
 # Rollback
 'rollback' => 'Revocar modificationes',
@@ -2693,7 +2696,7 @@ Vide le [[Special:BlockList|lista de blocadas]] pro le lista de bannimentos e bl
 'range_block_disabled' => 'Le capacitate del administratores a blocar intervallos de adresses IP es disactivate.',
 'ipb_expiry_invalid' => 'Tempore de expiration invalide.',
 'ipb_expiry_temp' => 'Le blocadas de nomines de usator celate debe esser permanente.',
-'ipb_hide_invalid' => 'Impossibile supprimer iste conto; illo pote haber troppo de modificationes.',
+'ipb_hide_invalid' => 'Impossibile supprimer iste conto; illo ha plus de {{PLURAL:$1|un modification|$1 modificationes}}.',
 'ipb_already_blocked' => '"$1" es ja blocate',
 'ipb-needreblock' => '$1 es ja blocate. Esque tu vole cambiar le configurationes?',
 'ipb-otherblocks-header' => 'Altere {{PLURAL:$1|blocada|blocadas}}',
@@ -2868,6 +2871,7 @@ Per favor visita [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisa
 'allmessages-prefix' => 'Filtrar per prefixo:',
 'allmessages-language' => 'Lingua:',
 'allmessages-filter-submit' => 'Va',
+'allmessages-filter-translate' => 'Traducer',
 
 # Thumbnails
 'thumbnail-more' => 'Aggrandir',
@@ -2919,7 +2923,7 @@ Salveguarda lo in tu computator e incarga lo hic.',
 'importuploaderrortemp' => 'Le incargamento del file de importation ha fallite. Un directorio temporari manca.',
 'import-parse-failure' => 'Error syntactic durante importation XML',
 'import-noarticle' => 'Nulle pagina a importar!',
-'import-nonewrevisions' => 'Tote le versiones habeva ja essite importate anteriormente.',
+'import-nonewrevisions' => 'Nulle version ha essite importate (totes esseva jam presente o ha essite saltate a causa de errores).',
 'xml-error-string' => '$1 al linea $2, col $3 (byte $4): $5',
 'import-upload' => 'Incargar datos XML',
 'import-token-mismatch' => 'Perdita del datos del session. Per favor reprova.',
@@ -2930,6 +2934,7 @@ Salveguarda lo in tu computator e incarga lo hic.',
 '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-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>',
 'import-rootpage-invalid' => 'Le pagina radice specificate es un titulo invalide.',
 'import-rootpage-nosubpage' => 'Le spatio de nomines "$1" del pagina radice non permitte subpaginas.',
@@ -2961,7 +2966,6 @@ Salveguarda lo in tu computator e incarga lo hic.',
 'tooltip-pt-watchlist' => 'Le lista de paginas del quales tu seque le modificationes',
 'tooltip-pt-mycontris' => 'Lista de tu contributiones',
 'tooltip-pt-login' => 'Nos recommenda que tu te authentica, ma non es obligatori.',
-'tooltip-pt-anonlogin' => 'Nos recommenda que tu te authentica, ma non es obligatori.',
 'tooltip-pt-logout' => 'Clauder session',
 'tooltip-ca-talk' => 'Discussiones a proposito del pagina de contento',
 'tooltip-ca-edit' => 'Tu pote modificar iste pagina.
index 99ce286..30c11cd 100644 (file)
@@ -348,7 +348,6 @@ $dateFormats = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Garis bawahi pranala:',
-'tog-justify' => 'Ratakan paragraf',
 'tog-hideminor' => 'Sembunyikan suntingan kecil di perubahan terbaru',
 'tog-hidepatrolled' => 'Sembunyikan suntingan terpatroli di perubahan terbaru',
 'tog-newpageshidepatrolled' => 'Sembunyikan halaman terpatroli dari daftar halaman baru',
@@ -512,7 +511,6 @@ $messages = array(
 'vector-action-protect' => 'Lindungi',
 'vector-action-undelete' => 'Pembatalan penghapusan',
 'vector-action-unprotect' => 'Ubah perlindungan',
-'vector-simplesearch-preference' => 'Aktifkan bilah pencarian sederhana (hanya kulit Vector)',
 'vector-view-create' => 'Buat',
 'vector-view-edit' => 'Sunting',
 'vector-view-history' => 'Versi terdahulu',
@@ -861,7 +859,8 @@ Untuk menghindari penyalahgunaan, hanya satu kata sandi yang akan dikirimkan set
 'acct_creation_throttle_hit' => 'Pengunjung wiki ini dengan alamat IP yang sama dengan Anda telah membuat {{PLURAL:$1|1 akun|$1 akun}} dalam satu hari terakhir, hingga jumlah maksimum yang diijinkan.
 Karenanya, pengunjung dengan alamat IP ini tidak dapat lagi membuat akun lain untuk sementara.',
 'emailauthenticated' => 'Alamat surel Anda telah dikonfirmasi pada $3, $2.',
-'emailnotauthenticated' => 'Alamat surel Anda belum dikonfirmasi. Sebelum dikonfirmasi Anda tidak bisa menggunakan fitur surel.',
+'emailnotauthenticated' => 'Alamat surel Anda belum dikonfirmasi.
+Sebelum dikonfirmasi Anda tidak akan menerima surel dari fitur berikut.',
 'noemailprefs' => 'Anda harus memasukkan alamat surel di preferensi Anda untuk dapat menggunakan fitur-fitur ini.',
 'emailconfirmlink' => 'Konfirmasikan alamat surel Anda',
 'invalidemailaddress' => 'Alamat surel ini tidak dapat diterima karena formatnya tidak sesuai.
@@ -898,6 +897,8 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
 'retypenew' => 'Ketik ulang kata sandi baru:',
 'resetpass_submit' => 'Atur kata sandi dan masuk log',
 'changepassword-success' => 'Kata sandi Anda telah berhasil diubah!',
+'changepassword-throttled' => 'Anda terlalu sering mencoba masuk log.
+Mohon tunggu $1 sebelum mencoba lagi.',
 'resetpass_forbidden' => 'Kata sandi tidak dapat diubah',
 'resetpass-no-info' => 'Anda harus masuk log untuk mengakses halaman ini secara langsung.',
 'resetpass-submit-loggedin' => 'Ganti kata sandi',
@@ -1174,6 +1175,8 @@ karena telah ada.',
 'content-not-allowed-here' => 'Konten "$1" tidak diizinkan di halaman [[$2]]',
 'editwarning-warning' => 'Meninggalkan halaman ini dapat menyebabkan semua perubahan yang belum tersimpan hilang.
 Jika Anda telah masuk log, Anda dapat mematikan peringatan ini lewat bagian "Penyuntingan" pada halaman preferensi Anda.',
+'editpage-notsupportedcontentformat-title' => 'Format konten tidak didukung',
+'editpage-notsupportedcontentformat-text' => 'Format konten $1 tidak didukung oleh model konten $2.',
 
 # Content models
 'content-model-wikitext' => 'teks wiki',
@@ -1206,6 +1209,7 @@ Beberapa templat akan diabaikan.',
 'undo-success' => 'Suntingan ini dapat dibalikkan. Silakan periksa perbandingan di bawah untuk meyakinkan bahwa benar itu yang Anda ingin lakukan, lalu simpan perubahan tersebut untuk menyelesaikan pembalikkan suntingan.',
 'undo-failure' => 'Suntingan ini tidak dapat dibalikkan karena konflik penyuntingan antara.',
 'undo-norev' => 'Suntingan ini tidak dapat dibalikkan karena halaman tidak ditemukan atau telah dihapuskan.',
+'undo-nochange' => 'Suntingan ini nampaknya telah dibatalkan.',
 'undo-summary' => 'Membalikkan revisi $1 oleh [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]])',
 'undo-summary-username-hidden' => 'Batalkan revisi $1 oleh seorang pengguna tersembunyi',
 
@@ -1214,6 +1218,9 @@ Beberapa templat akan diabaikan.',
 'cantcreateaccount-text' => "Pembuatan akun dari alamat IP ini (<strong>$1</strong>) telah diblokir oleh [[User:$3|$3]].
 
 Alasan yang diberikan oleh $3 adalah ''$2''",
+'cantcreateaccount-range-text' => "Pembuatan akun dari alamat IP dalam rentang '''$1''', yang mencakup alamat IP anda ('''$4'''), telah diblokir oleh [[Pengguna:$3|$3]].
+
+Alasan yang diberikan oleh  $3  adalah ''$2''",
 
 # History pages
 'viewpagelogs' => 'Lihat log halaman ini',
@@ -1382,7 +1389,6 @@ Pastikan bahwa perubahan ini tetap mempertahankan kontinuitas versi terdahulu ha
 'showhideselectedversions' => 'Tampilkan/sembunyikan versi terpilih',
 'editundo' => 'balikkan',
 'diff-empty' => '(Tidak ada perbedaan)',
-'diff-multi' => '({{PLURAL:$1|Satu|$1}} revisi antara oleh {{PLURAL:$2|satu|$2}} pengguna tak ditampilkan)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Satu|$1}} revisi antara oleh lebih dari $2 {{PLURAL:$2|satu|$2}} pengguna tak ditampilkan)',
 'difference-missing-revision' => '{{PLURAL:$2|Satu revisi|$2 revisi}} dari perbedaan ini ($1) {{PLURAL:$2|tidak|tidak}} ditemukan.
 
@@ -1419,6 +1425,7 @@ Rinciannya dapat ditemukan di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGE
 'search-result-score' => 'Relevansi: $1%',
 'search-redirect' => '(pengalihan $1)',
 'search-section' => '(bagian $1)',
+'search-file-match' => '(cocok dengan isi berkas)',
 'search-suggest' => 'Mungkin maksud Anda adalah: $1',
 'search-interwiki-caption' => 'Proyek lain',
 'search-interwiki-default' => 'Hasil $1:',
@@ -1749,6 +1756,7 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
 'recentchanges-label-bot' => 'Suntingan ini dilakukan oleh bot',
 'recentchanges-label-unpatrolled' => 'Suntingan ini belum terpatroli',
 'recentchanges-label-plusminus' => 'Perubahan ukuran halaman dalam bita',
+'recentchanges-legend-heading' => "'''Legenda:'''",
 'recentchanges-legend-newpage' => '(lihat pula [[Special:NewPages|daftar halaman baru]])',
 'rcnotefrom' => 'Di bawah ini adalah perubahan sejak <strong>$2</strong> (ditampilkan sampai <strong>$1</strong> perubahan).',
 'rclistfrom' => 'Perlihatkan perubahan terbaru sejak $1',
@@ -1869,6 +1877,8 @@ Jika Anda masih ingin memuat berkas Anda, silakan kembali dan gunakan nama baru.
 Jika Anda tetap ingin memuatkan berkas Anda, harap kembali dan gunakan nama lain. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Berkas ini berduplikasi dengan {{PLURAL:$1|berkas|berkas-berkas}} berikut:',
 'file-deleted-duplicate' => 'Sebuah berkas yang identik dengan berkas ini ([[:$1]]) sudah pernah dihapuskan sebelumnya. Anda harus memeriksa sejarah penghapusan berkas tersebut sebelum melanjutkan memuat ulang berkas ini.',
+'file-deleted-duplicate-notitle' => 'Sebuah berkas yang identik dengan berkas ini sebelumnya telah dihapus, dan judul yang digunakan telah ditahan.
+Anda harus meminta bantuan seseorang dengan kemampuan untuk melihat data berkas yang ditahan untuk meninjau situasi sebelum anda mengunggah kembali.',
 'uploadwarning' => 'Peringatan pemuatan',
 'uploadwarning-text' => 'Mohon perbaiki keterangan berkas di bawah dan coba lagi.',
 'savefile' => 'Simpan berkas',
@@ -2249,7 +2259,16 @@ Nama yang telah <del>dicoret</del> berarti telah dibetulkan.',
 'protectedpages' => 'Halaman yang dilindungi',
 'protectedpages-indef' => 'Hanya untuk pelindungan dengan jangka waktu tak terbatas',
 'protectedpages-cascade' => 'Hanya pelindungan runtun',
+'protectedpages-noredirect' => 'Sembunyikan pengalihan',
 'protectedpagesempty' => 'Saat ini tidak ada halaman yang sedang dilindungi dengan parameter-parameter tersebut.',
+'protectedpages-timestamp' => 'Stempel waktu',
+'protectedpages-page' => 'Halaman',
+'protectedpages-expiry' => 'Kedaluwarsa',
+'protectedpages-performer' => 'Melindungi pengguna',
+'protectedpages-params' => 'Parameter perlindungan',
+'protectedpages-reason' => 'Alasan',
+'protectedpages-unknown-timestamp' => 'Tidak diketahui',
+'protectedpages-unknown-performer' => 'Pengguna yang tidak diketahui',
 'protectedtitles' => 'Judul yang dilindungi',
 'protectedtitlesempty' => 'Tidak ada judul yang dilindungi.',
 'listusers' => 'Daftar pengguna',
@@ -2438,7 +2457,6 @@ Perubahan-perubahan berikutnya pada halaman tersebut dan halaman pembicaraan ter
 'watchmethod-list' => 'periksa halaman yang dipantau terhadap perubahan terbaru',
 'watchlistcontains' => 'Daftar pantauan Anda berisi $1 {{PLURAL:$1|halaman|halaman}}.',
 'iteminvalidname' => "Ada masalah dengan '$1', namanya tidak sah...",
-'wlnote' => "Di bawah ini adalah {{PLURAL:$1|perubahan|'''$1''' perubahan}} terakhir dalam '''$2''' jam terakhir, per $3, $4.",
 'wlshowlast' => 'Tampilkan $1 jam $2 hari terakhir $3',
 'watchlist-options' => 'Opsi daftar pantauan',
 
@@ -2982,6 +3000,7 @@ Silakan kunjungi [https://www.mediawiki.org/wiki/Localisation Pelokalan MediaWik
 'allmessages-prefix' => 'Saring dengan awalan:',
 'allmessages-language' => 'Bahasa:',
 'allmessages-filter-submit' => 'Tuju ke',
+'allmessages-filter-translate' => 'Terjemahkan',
 
 # Thumbnails
 'thumbnail-more' => 'Perbesar',
@@ -3033,7 +3052,7 @@ Simpan ke komputer Anda dan unggah ke sini.',
 'importuploaderrortemp' => 'Pemuatan berkas gagal. Sebuah direktori sementara dibutuhkan.',
 'import-parse-failure' => 'Proses impor XML gagal',
 'import-noarticle' => 'Tak ada halaman yang dapat diimpor!',
-'import-nonewrevisions' => 'Semua revisi telah pernah diimpor sebelumnya.',
+'import-nonewrevisions' => 'Tidak ada revisi yang diimpor (semua revisi telah ada atau dilewatkan karena kesalahan).',
 'xml-error-string' => '$1 pada baris $2, kolom $3 (bita $4): $5',
 'import-upload' => 'Memuat data XML',
 'import-token-mismatch' => 'Kehilangan data sesi. Silakan mencoba kembali.',
@@ -3044,6 +3063,7 @@ Simpan ke komputer Anda dan unggah ke sini.',
 'import-error-special' => 'Halaman " $1 " tidak diimpor karena milik ruang nama khusus yang tidak mengizinkan adanya halaman.',
 'import-error-invalid' => 'Halaman "$1" tidak diimpor karena namanya tidak valid.',
 'import-error-unserialize' => 'Revisi  $2  halaman " $1 " tidak bisa diurutkan. Revisi dilaporkan untuk menggunakan konten model $3 urutan sebagai $4 .',
+'import-error-bad-location' => 'Revisi $2 menggunakan konten model $3 tidak dapat disimpan di "$1" di wiki ini karena model tidak didukung pada halaman tersebut.',
 'import-options-wrong' => '{{PLURAL:$2|Opsi|Opsi}} salah: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Halaman turunan yang diberikan adalah judul yang salah.',
 'import-rootpage-nosubpage' => 'Ruang nama "$1" di halaman turunan tidak mengizinkan subhalaman.',
@@ -3075,7 +3095,6 @@ Simpan ke komputer Anda dan unggah ke sini.',
 'tooltip-pt-watchlist' => 'Daftar halaman yang saya pantau.',
 'tooltip-pt-mycontris' => 'Daftar kontribusi Anda',
 'tooltip-pt-login' => 'Anda disarankan untuk masuk log, meskipun hal itu tidak diwajibkan.',
-'tooltip-pt-anonlogin' => 'Anda disarankan untuk masuk log, meskipun hal itu tidak diwajibkan.',
 'tooltip-pt-logout' => 'Keluar log',
 'tooltip-ca-talk' => 'Pembicaraan halaman isi',
 'tooltip-ca-edit' => 'Anda dapat menyunting halaman ini. Gunakan tombol pratayang sebelum menyimpan',
@@ -3939,6 +3958,7 @@ Silakan konfirmasi jika Anda ingin membuat ulang halaman ini.",
 'imgmultigoto' => 'Pergi ke halaman $1',
 
 # Language selector for translatable SVGs
+'img-lang-default' => '(bahasa default)',
 'img-lang-go' => 'Tuju ke',
 
 # Table pager
@@ -4064,7 +4084,17 @@ Anda juga dapat [[Special:EditWatchlist|menggunakan penyunting standar Anda]].',
 'version-hook-subscribedby' => 'Dilanggani oleh',
 'version-version' => '(Versi $1)',
 'version-svn-revision' => '(r$2)',
-'version-license' => 'Lisensi',
+'version-license' => 'Lisensi MediaWiki',
+'version-ext-license' => 'Lisensi',
+'version-ext-colheader-name' => 'Ekstensi',
+'version-ext-colheader-version' => 'Versi',
+'version-ext-colheader-license' => 'Lisensi',
+'version-ext-colheader-description' => 'Deskripsi',
+'version-ext-colheader-credits' => 'Pembuat',
+'version-license-title' => 'Lisensi untuk $1',
+'version-license-not-found' => 'Tidak ada detail informasi lisensi untuk ekstensi ini.',
+'version-credits-title' => 'Kredit untuk $1',
+'version-credits-not-found' => 'Tidak ada detail informasi kredit untuk ekstensi ini.',
 'version-poweredby-credits' => "Wiki ini didukung oleh '''[https://www.mediawiki.org/ MediaWiki]''', hak cipta © 2001-$1 $2.",
 'version-poweredby-others' => 'lainnya',
 'version-poweredby-translators' => 'penerjemah translatewiki.net',
@@ -4084,13 +4114,14 @@ Anda seharusnya telah menerima [{{SERVER}}{{SCRIPTPATH}}/COPYING salinan Lisensi
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Skrip path]',
 
 # Special:Redirect
-'redirect' => 'Pengalihan oleh berkas, pengguna atau ID revisi',
+'redirect' => 'Pengalihan berdasarkan ID berkas, pengguna, halaman atau revisi',
 'redirect-legend' => 'Pengalihan ke sebuah berkas atau halaman',
 'redirect-summary' => 'Halaman istimewa ini beralih ke berkas (sesuai nama berkasnya), halaman (sesuai ID revisinya), atau halaman pengguna (sesuai ID numerik penggunanya). Penggunaan: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], atau [[{{#Special:Redirect}}/user/101]].',
 'redirect-submit' => 'Lanjut',
 'redirect-lookup' => 'Pencarian:',
 'redirect-value' => 'Nilai:',
 'redirect-user' => 'ID pengguna',
+'redirect-page' => 'ID Halaman',
 'redirect-revision' => 'Revisi halaman',
 'redirect-file' => 'Nama berkas',
 'redirect-not-exists' => 'Nilai tidak ditemukan',
@@ -4283,6 +4314,7 @@ Jika tidak, Anda dapat menggunakan formulir mudah di bawah ini. Komentar Anda ak
 'api-error-overwrite' => 'Tidak diizinkan untuk menimpa berkas yang sudah ada.',
 'api-error-stashfailed' => 'Kesalahan internal: server gagal menyimpan berkas sementara.',
 'api-error-publishfailed' => 'Kesalahan internal: server gagal menyimpan berkas sementara.',
+'api-error-stasherror' => 'Terjadi kesalahan saat mengunggah berkas ke penyimpanan.',
 'api-error-timeout' => 'Peladen tidak merespons dalam waktu yang diharapkan.',
 'api-error-unclassified' => 'Terjadi galat yang tidak diketahui',
 'api-error-unknown-code' => 'Kesalahan tidak dikenal: "$1"',
@@ -4312,7 +4344,9 @@ Jika tidak, Anda dapat menggunakan formulir mudah di bawah ini. Komentar Anda ak
 'limitreport-walltime' => 'Penggunaan waktu riil',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|detik|detik}}',
 'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bita|bita}}',
+'limitreport-templateargumentsize' => 'Ukuran argumen temlat',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bita|bita}}',
+'limitreport-expansiondepth' => 'Kedalaman ekspansi tertinggi',
 'limitreport-expensivefunctioncount' => 'Perhitungan fungsi parser yang mahal',
 
 # Special:ExpandTemplates
@@ -4322,10 +4356,14 @@ Jika tidak, Anda dapat menggunakan formulir mudah di bawah ini. Komentar Anda ak
 'expand_templates_input' => 'Teks masukan:',
 'expand_templates_output' => 'Hasil',
 'expand_templates_xml_output' => 'Hasil XML',
+'expand_templates_html_output' => 'Keliaran HTML mentah',
 'expand_templates_ok' => 'OK',
 'expand_templates_remove_comments' => 'Buang komentar',
 'expand_templates_remove_nowiki' => 'Tidak menampilkan tag <nowiki> pada hasilnya',
 'expand_templates_generate_xml' => 'Tampilkan pohon parser XML',
+'expand_templates_generate_rawhtml' => 'Tampilkan HTML mentah',
 'expand_templates_preview' => 'Pratayang',
 
+# Unknown messages
+'uploadinvalidxml' => 'XML dalam berkas yang diunggah tidak bisa diuraikan.',
 );
index 09e7fb7..e84cf6b 100644 (file)
@@ -135,7 +135,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Ultracatenun:',
-'tog-justify' => 'Justificar paragrafes',
 'tog-hideminor' => 'Ocultar redactiones minori in nov changes',
 'tog-hidepatrolled' => 'Ocultar redactiones vigilat in nov changes',
 'tog-newpageshidepatrolled' => 'Ocultar págines vigilat de liste de nov págines',
@@ -144,9 +143,7 @@ $messages = array(
 'tog-numberheadings' => 'Auto-numerar rublicas',
 'tog-showtoolbar' => 'Monstrar barre de redactional utensiles',
 'tog-editondblclick' => 'Redacter págines per duplic clacca',
-'tog-editsection' => 'Permisser redaction de division usant catenunes [redacter]',
 'tog-editsectiononrightclick' => 'Redacter singul sectiones per dextri clacca',
-'tog-showtoc' => 'Monstrar tabelle de contenetes (por págines che plu de 3 divisiones)',
 'tog-rememberpassword' => 'Memorar mi registre in ti computator (por um max de $1 {{PLURAL:$1|die|dies}})',
 'tog-watchcreations' => 'Automaticmen viligar págines e files, queles yo ha creat.',
 'tog-watchdefault' => 'Automaticmen vigilar págines e files, queles yo ha redactet.',
@@ -669,7 +666,6 @@ Vider li [[Special:IPBlockList|liste de bloc de IP]] por li liste de bloces e ba
 'lineno' => 'Linea $1:',
 'compareselectedversions' => 'Comparar revisiones selectet',
 'editundo' => 'anullar',
-'diff-multi' => '({{PLURAL:$1|Un revision intermediari|$1 revisiones intermediari}} per {{PLURAL:$2|un usator|$2 usatores}} ne monstrat)',
 
 # Search results
 'searchresults' => 'Serch-resultates',
@@ -1047,7 +1043,6 @@ Li descrition in su [$2 págine de descrition] es monstrat in infra.',
 'watchmethod-recent' => 'controlant nov redactiones por págines vigilat',
 'watchmethod-list' => 'controlant págines vigilat por nov redactiones',
 'watchlistcontains' => 'Tui liste de págines vigilat contene $1 {{PLURAL:$1|págine|págines}}.',
-'wlnote' => "Infra {{PLURAL:$1|es li ultim change|es li ultim '''$1''' changes}} in li ultim {{PLURAL:$2|hor|'''$2''' hores}}.",
 'wlshowlast' => 'Monstra ultim $1 hores $2 dies $3',
 'watchlist-options' => 'Optiones de liste de págines vigilat',
 
@@ -1228,7 +1223,6 @@ $1',
 'tooltip-pt-watchlist' => 'Liste de vigilat págines',
 'tooltip-pt-mycontris' => 'Liste de tui contributiones',
 'tooltip-pt-login' => 'Tu es incorrageat crear un conto, ma to ne es un deventie.',
-'tooltip-pt-anonlogin' => 'Vu es incorageat por crear un conto; támen, it ne esser mandatorio',
 'tooltip-pt-logout' => 'Surtir',
 'tooltip-ca-talk' => 'Discussion pri li articul.',
 'tooltip-ca-edit' => 'Redacter ti págine. Ples usar li buton de prevision antequam conservar.',
index 369bb41..4d39d69 100644 (file)
@@ -76,7 +76,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Okpürụ ahiri jikodo:',
-'tog-justify' => 'Tinyé ndelita na ọkwa',
 'tog-hideminor' => 'Zonari orü ntàkírí na nwerue mẹrẹ ogẹ nsó',
 'tog-hidepatrolled' => 'Zonari orü ha hụrụ na nwerue mẹrẹ ogẹ nsó',
 'tog-newpageshidepatrolled' => 'Zonari orü ha hụrụ shí ndetu ihü ohúrù',
@@ -85,9 +84,7 @@ $messages = array(
 'tog-numberheadings' => 'Onuogụgụ-otu anyi mere ya maka ishi edemede',
 'tog-showtoolbar' => 'Zi igbe orü (Í gí nwere JavaScript)',
 'tog-editondblclick' => 'Rüwá na élu ihü mgbe I kpạtạrạ (ö chọrọ JavaScript)',
-'tog-editsection' => 'Gbanyé orürü nkeji shi [rüwá] jikodo',
 'tog-editsectiononrightclick' => 'Kpa na áká nri Í gbanyé orürü nkeji na ishi nkeji (ö chọrọ JavaScript)',
-'tog-showtoc' => 'Zi agada ihe níle (maka ihü nwere ishis ká áto)',
 'tog-rememberpassword' => 'Chetá edemede éjim a banyé na orunótuá (nke ukwu nke rürü {{PLURAL:$1|chi|chi}} $1)',
 'tog-watchcreations' => 'Tinyé ihüm na eké na ndetu ihem ne lé',
 'tog-watchdefault' => 'Tinyé ihü m na rüoru élu na ndetu ihem ne lé',
index 75fd544..47484ac 100644 (file)
@@ -37,7 +37,6 @@ $namespaceNames = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Pinag-ugisan ti silpo:',
-'tog-justify' => 'Limpiaen dagiti parapo',
 '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-newpageshidepatrolled' => 'Ilemmeng dagiti napatruliaan a panid manipud ti baro a listaan ti panid',
@@ -199,7 +198,6 @@ $messages = array(
 'vector-action-protect' => 'Salakniban',
 'vector-action-undelete' => 'Isubli ti inikkat',
 'vector-action-unprotect' => 'Sukatan ti salaknib',
-'vector-simplesearch-preference' => 'Pakabaelan ti napalaka a baras ti panagbiruk (Kudil a Vector laeng)',
 'vector-view-create' => 'Agaramid',
 'vector-view-edit' => 'Urnosen',
 'vector-view-history' => 'Kitaen ti pakasaritaan',
@@ -607,6 +605,8 @@ Tapno malpaska a makastrek, nasken a mangikabilka ti baro a kontrasenias ditoy:'
 'retypenew' => 'Imakinilya manen ti baro a kontrasenias:',
 'resetpass_submit' => 'Ikabil ti kontrasenias ken sumrek',
 'changepassword-success' => 'Balligi a nasukatan ti kontraseniasmo!',
+'changepassword-throttled' => 'Nakaaramidka kadagiti adu unay a nabiit a panangipadas ti panagserrek.
+Pangngaasi nga aguray ti $1 sakbay a padasen manen.',
 'resetpass_forbidden' => 'Saan a masukatan dagiti kontrasenias',
 'resetpass-no-info' => 'Masapul a nakastrekka tapno dagus a makapanka iti daytoy a panid.',
 'resetpass-submit-loggedin' => 'Sukatan ti kontrasenias',
@@ -665,6 +665,8 @@ Temporario a kontrasenias: $2',
 'changeemail-password' => 'Ti bukodmo a kontrasenias ti {{SITENAME}}:',
 'changeemail-submit' => 'Sukatan ti esurat',
 'changeemail-cancel' => 'Ukasen',
+'changeemail-throttled' => 'Adu unay ti panagpadasmo a sumrek.
+Pangngaasi nga aguray ti $1 sakbay a padasen manen.',
 
 # Special:ResetTokens
 'resettokens' => 'Iyasentar manen dagiti tandaan',
@@ -892,8 +894,10 @@ Adda met daytoyen.',
 'content-failed-to-parse' => 'Napaay a nausig ti $2 a linaon para iti $1 a modelo: $3',
 'invalid-content-data' => 'Imbalido a datos ti linaon',
 'content-not-allowed-here' => 'Ti "$1" a linaon ket saan a maipalubos idiay panid ti [[$2]]',
-'editwarning-warning' => 'Ti ipapanaw ti daytoy a panid ket makapataud ti panakapukaw kadagiti aniaman a binalbaliwam.
-No nakastrekka, mabalinmo nga ibaldado daytoy a ballaag idiay "Panagurnos" a paset kadagiti kakaykayatam.',
+'editwarning-warning' => 'Ti ipapanaw iti daytoy a panid ket makapataud ti pannakapukaw kadagiti aniaman a binalbaliwam.
+No nakastrekka, mabalinmo nga ibaldado daytoy a ballaag idiay "{{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 models
 'content-model-wikitext' => 'wikitext',
@@ -928,6 +932,7 @@ Dagitoy a panangipalawag ket naikkaten.",
 Pangngaasi 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.',
 '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',
 
@@ -935,6 +940,9 @@ Pangngaasi a kitaen ti pagipadaan dita baba tapno maamuan no agpaypayso ti kayat
 '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]].
 
+Ti 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]].
+
 Ti inted a rason babaen ni $3 ket ''$2''",
 
 # History pages
@@ -1106,7 +1114,8 @@ Usaren ti radio a buton a tukol ti pinagtipon iti laeng panagbaliw a naaramid id
 'showhideselectedversions' => 'Ipakita/ilemmeng dagiti napili a nabaliwan',
 'editundo' => 'ibabawi',
 'diff-empty' => '(Awan ti paggiddiatan)',
-'diff-multi' => '({{PLURAL:$1|Maysa nga agtengnga a panangbalbaliw|Dagiti $1 nga agtennga a panangbalbaliw}} babaen {{PLURAL:$2|ti agararamat|dagiti $2 nga agararamat}} ti saan a naipakita)',
+'diff-multi-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.
 
@@ -1127,7 +1136,7 @@ Dagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete
 '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.'''",
-'searchmenu-new' => "'''Partuaten ti panid ti \"[[:\$1]]\" iti daytoy a wiki!'''",
+'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-project' => 'Tulong ken Gandat a pampanid',
 'searchprofile-images' => 'Sabsabali a midia',
@@ -1143,6 +1152,7 @@ Dagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete
 'search-result-score' => 'Kaitutopan: $1%',
 'search-redirect' => '(ibaw-ing ti $1)',
 'search-section' => '(paset $1)',
+'search-file-match' => '(maipada ti linaon a papeles)',
 'search-suggest' => 'Daytoy kadi: $1',
 'search-interwiki-caption' => 'Dagiti kakabsat a gandat',
 'search-interwiki-default' => '$1 dagiti nagbanagan:',
@@ -1152,6 +1162,7 @@ Dagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete
 'searchrelated' => 'mainaig',
 'searchall' => 'amin',
 'showingresults' => "Maiparang dita baba agingga {{PLURAL:$1|iti '''1''' a nagbanagan|dagiti '''$1''' a nagbanagan}} a mangrugi iti #'''$2'''.",
+'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>.',
 'showingresultsnum' => "Maipakpakita dita baba  {{PLURAL:$3|iti '''1''' a nagbanagan|dagiti '''$3''' a nagbanagan}} a mangrugi iti #'''$2'''.",
 '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.',
@@ -1471,12 +1482,13 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
 'recentchanges-label-bot' => 'Daytoy a panag-urnos ket inaramid babaen ti maysa a 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' => "'''Sarita:'''",
 'recentchanges-legend-newpage' => '(kitaen pay ti [[Special:NewPages|listaan ti baro a pampanid]])',
 'rcnotefrom' => "Dita baba ket dagiti sinukatan manipud idi '''$2''' (agingga iti '''$1''' a naipakita).",
 'rclistfrom' => 'Ipakita dagiti kabarbaro a sinukatan a mangrugi manipud idi $1',
 'rcshowhideminor' => '$1 dagiti bassit a panag-urnos',
 'rcshowhidebots' => '$1 dagiti bot',
-'rcshowhideliu' => '$1 dagiti nakastrek nga agar-aramat',
+'rcshowhideliu' => '$1 dagiti nakarehistro nga agar-aramat',
 'rcshowhideanons' => '$1 dagiti di am-ammo nga agar-aramat',
 'rcshowhidepatr' => '$1 dagiti napatrulian a panag-urnos',
 'rcshowhidemine' => '$1 dagiti inurnosko',
@@ -1600,6 +1612,8 @@ No kayatmo pay latta nga ipan ti papeles, pangngaasi nga agsublika ken usarem ti
 '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.
 Kitaem 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.
+Nasken 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.',
 'savefile' => 'Idulin ti papeles',
@@ -1972,7 +1986,16 @@ Tattan ket naibaw-ing idiay [[$2]].',
 'protectedpages' => 'Dagiti nasalakniban a panid',
 'protectedpages-indef' => 'Inggat ingana a salakniban laeng',
 'protectedpages-cascade' => 'Dagiti sariap a salaknib laeng',
+'protectedpages-noredirect' => 'Ilemmeng dagiti baw-ing',
 'protectedpagesempty' => 'Awan ti pampanid nga agdama a nasalakniban babaen kadagitoy a parametro.',
+'protectedpages-timestamp' => 'Petsa ken oras',
+'protectedpages-page' => 'Panid',
+'protectedpages-expiry' => 'Agpaso',
+'protectedpages-performer' => 'Salakniban ti agar-aramat',
+'protectedpages-params' => 'Dagiti parametro ti panagsalaknib',
+'protectedpages-reason' => 'Rason',
+'protectedpages-unknown-timestamp' => 'Di ammo',
+'protectedpages-unknown-performer' => 'Di ammo nga agar-aramat',
 'protectedtitles' => 'Dagiti nasalakniban a titulo',
 'protectedtitlesempty' => 'Awan dagiti titulo nga agdama a nasalakniban iti dagitoy a parametro.',
 'listusers' => 'Listaan dagiti agar-aramat',
@@ -2159,7 +2182,7 @@ Dagiti masakbayan a panagsukat iti daytoy a panid ken dagiti mainaig a tungtunga
 'watchmethod-list' => 'kitkitaen dagiti bambantayan a panid kadagiti kinaudi nga inurnos',
 'watchlistcontains' => 'Ti listaan ti bambantayam ket aglaon ti $1 {{PLURAL:$1|a panid|a pampanid}}.',
 'iteminvalidname' => "Parikut iti banag '$1', imbalido a nagan...",
-'wlnote' => "Adda dita baba {{PLURAL:$1|ti kaudian a panagsukat|dagiti kaudian a '''$1''' a panagsukat}} iti napalabas a {{PLURAL:$2|nga oras|'''$2''' nga or-oras}}, manipud idi $3, $4.",
+'wlnote2' => 'Dita baba ket dagiti binalbaliwan {{PLURAL:$1|iti napalabas nga oras|kadagiti napalabas a <strong>$1</strong> nga oras}}, manipud idi $2, $3.',
 'wlshowlast' => 'Ipakita dagiti naudi a $1 nga or-oras $2 nga al-aldaw $3',
 'watchlist-options' => 'Dagiti pagpilian ti listaan a bambantayan',
 
@@ -2248,6 +2271,7 @@ Ti panagikkat ti kastoy a pammpanid ket naparitan tapno mapawilan ti saan nga in
 '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}}.
 Ti panagikkat ket madisturbo ti panagpataray ti database ti {{SITNAME}};
 agal-aluadka a mangrugi.',
+'deleting-backlinks-warning' => "'''Ballaag:''' Dagiti dadduma a panid ket naisilpo wenno nailak-am manipud ti panid a gangani nga ikkatem.",
 
 # Rollback
 'rollback' => 'Isubli dagiti panag-urnos',
@@ -2490,6 +2514,7 @@ Ikkan ti naisangayan a rason dita baba (kas pagarigan, dakamaten ti maysa a pani
 Kitaen ti [[Special:BlockList|listaan ti lapden nga IP ]] 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-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',
@@ -2531,8 +2556,8 @@ Kitaen ti [[Special:BlockList|listaan ti lapden nga IP ]] tapno marepaso dagiti
 'change-blocklink' => 'baliwan  ti serra',
 'contribslink' => 'aramid',
 'emaillink' => 'ipatulod ti esurat',
-'autoblocker' => 'Automatiko a naserraan ngamin ket ti IP a pagtaengan ket damdama nga inusar ni "[[User:$1|$1]]".
-Ti rason nga inted ti $1\'s serra ket: "$2"',
+'autoblocker' => 'Automatiko a naserraan ngamin ket ti IP a pagtaengam ket naudi nga inusar babaen ni "[[User:$1|$1]]".
+Ti inted a rason para iti serra ni $1 ket: "$2"',
 'blocklogpage' => 'Listaan ti naserraan',
 'blocklog-showlog' => 'Daytoy nga agar-aramat ket dati a naserraan.
 Ti listaan ti serra ket naikabil dita baba tapno mausar a reperensia:',
@@ -2554,7 +2579,7 @@ Kitaen ti [[Special:BlockList|Listaan ti lapden nga IP]] para iti listaan kadagi
 'range_block_disabled' => 'Ti abilidad ti administrador nga agaramid ti nasakupan a serra ket naiddep.',
 '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; adda ngata adu unay nga inurnosna.',
+'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-otherblocks-header' => 'Sabali {{PLURAL:$1|a naserraan|kadagiti naserraan}}',
@@ -2727,6 +2752,7 @@ Pangngaasi a bisitaen ti [https://www.mediawiki.org/wiki/Localisation Lokalisasi
 'allmessages-prefix' => 'Sagaten babaen ti pasaruno:',
 'allmessages-language' => 'Pagsasao:',
 'allmessages-filter-submit' => 'Inkan',
+'allmessages-filter-translate' => 'Ipatarus',
 
 # Thumbnails
 'thumbnail-more' => 'Padakkelen',
@@ -2743,6 +2769,7 @@ $2',
 '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_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.',
 
 # Special:Import
 'import' => 'Agala kadagiti panid',
@@ -2780,7 +2807,7 @@ Paset laeng ti papeles ti napag-ipan.',
 Awan ti saan nga agnayon a polder.',
 'import-parse-failure' => 'Napaay ti pinagala ti XML parse',
 'import-noarticle' => 'Awan ti panid a maaala!',
-'import-nonewrevisions' => 'Amin a panagbalbaliw ket dati a naala.',
+'import-nonewrevisions' => 'Awan dagiti naala panagbalbaliw (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.
@@ -2792,6 +2819,7 @@ Pangngaasi a padasem manen.',
 '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-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.',
@@ -2823,7 +2851,6 @@ Pangngaasi a padasem manen.',
 'tooltip-pt-watchlist' => 'Listaan dagiti panid a sipsiputem para iti panakabalbaliw',
 'tooltip-pt-mycontris' => 'Listaan dagiti inaramidmo',
 'tooltip-pt-login' => 'Maisingasing a sumrekka; nupay kasta, daytoy ket saan a maipapilit',
-'tooltip-pt-anonlogin' => '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',
@@ -3572,7 +3599,7 @@ Pangngaasi a pasingkedam nga agpayso a kayatmo a partuten manen daytoy a panid."
 
 # Language selector for translatable SVGs
 'img-lang-default' => '(kasisigud a pagsasao)',
-'img-lang-info' => 'Ipaay daytoy a ladawan iti $1 $2.',
+'img-lang-info' => 'Ipaay daytoy a ladawan iti $1. $2',
 'img-lang-go' => 'Inkan',
 
 # Table pager
@@ -3653,8 +3680,18 @@ Mabalinmo pay nga [[Special:EditWatchlist|usaren ti dati a panagurnos]].',
 'version-parser-function-hooks' => 'Parser a pamay-an dagiti kawit',
 'version-hook-name' => 'Nagan ti kawit',
 'version-hook-subscribedby' => 'Umanamong babaen ti',
-'version-version' => '(Bersion $1)',
-'version-license' => 'Lisensia',
+'version-version' => '($1)',
+'version-license' => 'Lisensia ti MediaWiki',
+'version-ext-license' => 'Lisensia',
+'version-ext-colheader-name' => 'Pagpaatiddog',
+'version-ext-colheader-version' => 'Bersion',
+'version-ext-colheader-license' => 'Lisensia',
+'version-ext-colheader-description' => 'Deskripsion',
+'version-ext-colheader-credits' => 'Dagiti mannurat',
+'version-license-title' => 'Lisensia para iti $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-others' => 'dadduma pay',
 'version-poweredby-translators' => 'agipatpatarus ti translatewiki.net',
@@ -3672,16 +3709,18 @@ Naka-awatka koman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU Sapasap a
 'version-entrypoints-header-url' => 'URL',
 
 # Special:Redirect
-'redirect' => 'Ibaw-ing babaen ti papeles, agar-aramat, wenno ID ti panagbaliw',
+'redirect' => 'Ibaw-ing babaen ti papeles, agar-aramat, panid wenno ID ti panagbaliw',
 'redirect-legend' => 'Ibaw-ing iti papeles wenno panid',
-'redirect-summary' => 'Daytoy nga espesial a panid ket maibaw-ing iti papeles (iti nagan ti papeles), ti panid (iti ID ti panagbaliw), wenno ti panid ti agar-aramat (iti numeriko nga ID ti agar-aramat). Panag-usar:
+'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:
 [[{{#Special:Redirect}}/file/Example.jpg]], 
+[[{{#Special:Redirect}}/page/64308]], 
 [[{{#Special:Redirect}}/revision/328429]], wenno
 [[{{#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-file' => 'Nagan ti papeles',
 'redirect-not-exists' => 'Saan a nabirukan ti pateg',
@@ -3875,6 +3914,7 @@ Nupay kasta, mau-sarmo ti nakabuklan dita baba. Ti komentario nga itedmo ket mai
 '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-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".',
@@ -3924,10 +3964,14 @@ Iti kinapudno, palawaenna amin dagiti adda ti doble a tukol.',
 'expand_templates_input' => 'Maikabil a testo:',
 'expand_templates_output' => 'Nagbanagan',
 'expand_templates_xml_output' => 'XML a maiparang',
+'expand_templates_html_output' => 'Naata a maiparuar a HTML',
 'expand_templates_ok' => 'OK',
 '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_generate_rawhtml' => 'Ipakita ti naata a HTML',
 'expand_templates_preview' => 'Pamadasan',
 
+# Unknown messages
+'uploadinvalidxml' => 'Ti XML iti naikarga a papeles ket saan a maiwaswas.',
 );
index d28d94f..64194fe 100644 (file)
@@ -20,7 +20,6 @@ $fallback = 'ru';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Ӏинкаш белгалде:',
-'tog-justify' => 'Яздам оагӀува шоралца хьанийсде',
 'tog-hideminor' => 'ЗӀамига хувцамаш керда хувцаман дагарленашках къайлаяккха',
 'tog-hidepatrolled' => 'Керда хувцаман дагарленач дӀанийсаяь хувцамаш къайладаккха',
 'tog-newpageshidepatrolled' => 'Керда оагӀувна дагарленач дӀанийсаяь хувцамаш къайладаккха',
@@ -29,9 +28,7 @@ $messages = array(
 'tog-numberheadings' => 'Корталенашт аланза таьрахьал де',
 'tog-showtoolbar' => 'ГӀалатнийcдара юкъе лакхера гӀорсан гартакх хьахьокха (JavaScript)',
 'tog-editondblclick' => 'Шозза цлицакацa oагӀув хувца (JavaScript)',
-'tog-editsection' => 'ХӀара дакъа "хувца" яха Ӏинк хьахьокха',
 'tog-editsectiononrightclick' => 'Декъам хувца кертмугӀа аьтта цлицака я (JavaScript)',
-'tog-showtoc' => 'Кортанче хьокха (кхьаннена дукхагӀа кертмугӀанаш йoлa оагӀувна)',
 'tog-rememberpassword' => '(укх $1 {{PLURAL:$1|1=ден|деношк}}) мара са чувалара/ялара дагалоаца дезаш дац',
 'tog-watchcreations' => 'Аз яь йола оагӀувнаш теркама дагарле йолач чуяьккха',
 'tog-watchdefault' => 'Аз хийца йола оагӀувнаш теркама дагарле йолач чуяьккха',
@@ -495,7 +492,6 @@ $messages = array(
 'lineno' => 'МугI $1:',
 'compareselectedversions' => 'Хьаржа доржамаша тарона тIа хьажа',
 'editundo' => 'юхавала/яла',
-'diff-multi' => '({{PLURAL:$1|1=$1 юкъара доржам хьахьекха дац|$1 юкъара доржамаш хьахьекха дац}} {{PLURAL:$2|1=$2 дакъалаьцархочунна|$2 дакъалаьцархоший}})',
 
 # Search results
 'searchresults' => 'Тохкама гIулакхахилар',
index 72c0a13..377ed96 100644 (file)
@@ -111,7 +111,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Sub-strekizez ligili:',
-'tog-justify' => 'Adjustigez paragrafi',
 'tog-hideminor' => 'Celez mikra redaktaji de recenta chanji',
 'tog-hidepatrolled' => 'Celez patroliita redakti en recenta chanji',
 'tog-newpageshidepatrolled' => 'Celez patroliita pagini en la listo di nova pagino',
@@ -120,9 +119,7 @@ $messages = array(
 'tog-numberheadings' => 'Autonumerez tituli',
 'tog-showtoolbar' => 'Montrez redaktilo (JavaScript bezonesas)',
 'tog-editondblclick' => 'Redaktez pagini kande on klikus dufoye (JavaScript bezonesas)',
-'tog-editsection' => 'Kapabligez redakto di secioni per [redaktar]-ligamini',
 'tog-editsectiononrightclick' => 'Kapabligez redakto di secioni kande on dextra-klikus tituli di secioni (JavaScript bezonesas)',
-'tog-showtoc' => 'Montrez indexo (por pagini havanta plu multa kam 3 tituli)',
 'tog-rememberpassword' => "Memorez mea pasovorto en ca ''browser'' (maxime $1 {{PLURAL:$1|dio|dii}})",
 'tog-watchcreations' => 'Adjuntez pagini kreota da me ad mea surveyaji',
 'tog-watchdefault' => 'Adjuntez pagini redaktota da me ad mea surveyaji',
@@ -1045,7 +1042,6 @@ Volutez kontrolar <strong>[[:$1]]</strong> se vu ne esas certa pri chanjar olu.
 'watchmethod-list' => 'serchante recenta redakti en la listo di surveyaji',
 'watchlistcontains' => 'Vua listo di surveyaji kontenas $1 {{PLURAL:$1|pagino|pagini}}.',
 'iteminvalidname' => "Problemo en la artiklo '$1', nevalida nomo...",
-'wlnote' => "Infre esas la lasta {{PLURAL:$1|chanjo|'''$1''' chanji}} dum la lasta {{PLURAL:$2|horo|'''$2''' hori}}.",
 'wlshowlast' => 'Montrar la lasta $1 hori $2 dii $3',
 'watchlist-options' => 'Surveryo-listo selekti',
 
index 33f8540..04522fa 100644 (file)
@@ -234,7 +234,6 @@ $linkPrefixCharset = 'áÁðÐéÉíÍóÓúÚýÝþÞæÆöÖA-Za-z–-';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Undirstrika tengla:',
-'tog-justify' => 'Jafna málsgreinar',
 'tog-hideminor' => 'Fela minniháttar breytingar í nýlegum breytingum',
 'tog-hidepatrolled' => 'Fela yfirfarnar breytingar í nýlegum breytingum',
 'tog-newpageshidepatrolled' => 'Fela yfirfarnar breytingar í listanum yfir nýjar síður',
@@ -356,12 +355,12 @@ $messages = array(
 'category-empty' => "''Þessi flokkur inniheldur engar síður eða margmiðlunarefni.''",
 'hidden-categories' => '{{PLURAL:$1|Falinn flokkur|Faldir flokkar}}',
 'hidden-category-category' => 'Faldir flokkar',
-'category-subcat-count' => '{{PLURAL:$2|Þessi flokkur hefur einungis eftirfarandi undirflokk.|Þessi flokkur hefur eftirfarandi {{PLURAL:$1|undirflokk|$1 undirflokka}}, af alls $2.}}',
-'category-subcat-count-limited' => 'Þessi flokkur hefur eftirfarandi {{PLURAL:$1|undirflokk|$1 undirflokka}}.',
+'category-subcat-count' => 'Þessi flokkur hefur eftirfarandi $1 {{PLURAL:$1|undirflokk|undirflokka}}, af alls $2.',
+'category-subcat-count-limited' => 'Þessi flokkur hefur eftirfarandi $1 {{PLURAL:$1|undirflokk|undirflokka}}.',
 'category-article-count' => 'Þessi flokkur inniheldur {{PLURAL:$1|$1 síðu|$1 síður}}, af alls {{PLURAL:$2|$2}}.',
-'category-article-count-limited' => 'Eftirfarandi {{PLURAL:$1|síða er|$1 síður eru}} í þessum flokki.',
+'category-article-count-limited' => 'Eftirfarandi $1 {{PLURAL:$1|síða er|síður eru}} í þessum flokki.',
 'category-file-count' => 'Þessi flokkur inniheldur {{PLURAL:$1|$1 skrá|$1 skrár}}, af alls {{PLURAL:$2|$2}}.',
-'category-file-count-limited' => 'Eftirfarandi {{PLURAL:$1|skrá er|$1 skrár eru}} í þessum flokki.',
+'category-file-count-limited' => 'Eftirfarandi $1 {{PLURAL:$1|skrá er|skrár eru}} í þessum flokki.',
 'listingcontinuesabbrev' => 'frh.',
 'index-category' => 'Raðaðar skrár',
 'noindex-category' => 'Óraðaðar skrár',
@@ -395,7 +394,6 @@ $messages = array(
 'vector-action-protect' => 'Vernda',
 'vector-action-undelete' => 'Hætta við eyðingu',
 'vector-action-unprotect' => 'Breyta verndunarstigi',
-'vector-simplesearch-preference' => 'Virkja einfaldaða leitarstiku (Vector-þemað eingöngu)',
 'vector-view-create' => 'Skapa',
 'vector-view-edit' => 'Breyta',
 'vector-view-history' => 'Breytingaskrá',
@@ -429,7 +427,7 @@ $messages = array(
 'deletethispage' => 'Eyða þessari síðu',
 'undeletethispage' => 'Endurvekja þessa síðu',
 'undelete_short' => 'Endurvekja {{PLURAL:$1|$1 breytingu|$1 breytingar}}',
-'viewdeleted_short' => 'Skoða {{PLURAL:$1|eina eydda breytingu|$1 eyddar breytingar}}',
+'viewdeleted_short' => 'Skoða $1 {{PLURAL:$1|eydda breytingu|eyddar breytingar}}',
 'protect' => 'Vernda',
 'protect_change' => 'breyta',
 'protectthispage' => 'Vernda þessa síðu',
@@ -457,7 +455,7 @@ $messages = array(
 'redirectedfrom' => '(Tilvísað frá $1)',
 'redirectpagesub' => 'Tilvísunarsíða',
 'lastmodifiedat' => 'Þessari síðu var síðast breytt $1 klukkan $2.',
-'viewcount' => 'Þessi síða hefur verið skoðuð {{PLURAL:$1|einu sinni|$1 sinnum}}.',
+'viewcount' => 'Þessi síða hefur verið skoðuð $1 {{PLURAL:$1|sinni|sinnum}}.',
 'protectedpage' => 'Vernduð síða',
 'jumpto' => 'Stökkva á:',
 'jumptonavigation' => 'flakk',
@@ -737,8 +735,8 @@ halda áfram að nota gamla lykilorðið.',
 Vinsamlegast skráðu þig inn á ný þegar þú hefur móttekið það.',
 'blocked-mailpassword' => 'Þér er ekki heimilt að gera breytingar frá þessu netfangi og  því getur þú ekki fengið nýtt lykilorð í pósti.  Þetta er gert til þess að koma í veg fyrir skemmdarverk.',
 'eauthentsent' => 'Staðfestingarpóstur hefur verið sendur á uppgefið netfang. Þú verður að fylgja leiðbeiningunum í póstinum til þess að virkja netfangið og staðfesta að það sé örugglega þitt.',
-'throttled-mailpassword' => 'Tölvupóstur til að endursetja lykilorðið hefur þegar verið sent, innan við {{PLURAL:$1|síðasta klukkutímans|$1 síðustu klukkutímanna}}.
-Til að koma í veg fyrir misnotkun, er aðeins einn tölvupóstur sendur {{PLURAL:$1|hvern klukkutíma|hverja $1 klukkutíma}}.',
+'throttled-mailpassword' => 'Tölvupóstur til að endursetja lykilorðið hefur þegar verið sent, innan við $1 {{PLURAL:$1|síðasta klukkutímans|síðustu klukkutímanna}}.
+Til að koma í veg fyrir misnotkun, er aðeins einn tölvupóstur sendur {{PLURAL:$1|hvern $1 klukkutíma|hverja $1 klukkutíma}}.',
 'mailerror' => 'Upp kom villa við sendingu tölvupósts: $1',
 'acct_creation_throttle_hit' => 'Því miður, hafa verið búnir til {{PLURAL:$1|$1 nýr aðgangur|$1 nýjir aðgangar}} í dag sem er hámarksfjöldi nýskráninga á einum degi.
 Þú getur því miður ekki búið til nýjan aðgang frá þessari IP-tölu að svo stöddu.',
@@ -1020,7 +1018,7 @@ Verndunarskrá síðunnar er gefin fyrir neðan til tilvísunar.",
 'templatesusedsection' => 'Snið {{PLURAL:$1|notað|notuð}} í þessum hluta:',
 'template-protected' => '(vernduð)',
 'template-semiprotected' => '(hálfvernduð)',
-'hiddencategories' => 'Þessi síða er meðlimur í {{PLURAL:$1|1 földum flokki|$1 földum flokkum}}:',
+'hiddencategories' => 'Þessi síða er meðlimur í $1 {{PLURAL:$1|földum flokki|földum flokkum}}:',
 'nocreatetext' => '{{SITENAME}} hefur takmarkað eiginleikann að gera nýjar síður.
 Þú getur farið til baka og breytt núverandi síðum, eða [[Special:UserLogin|skráð þið inn eða búið til aðgang]].',
 'nocreate-loggedin' => 'Þú hefur ekki leyfi til að skapa nýjar síður.',
@@ -1263,7 +1261,6 @@ Athugaðu að með því að nota flakktenglana er þessi dálkur endurstilltur.
 'showhideselectedversions' => 'Sýna/fela valdar breytingar',
 'editundo' => 'Taka aftur þessa breytingu',
 'diff-empty' => '(Enginn munur)',
-'diff-multi' => '$1 ({{PLURAL:$1|millibreyting ekki sýnd|millibreytingar ekki sýndar}} frá $2 {{PLURAL:$2|notanda|notendum}}.)',
 'diff-multi-manyusers' => '($1 {{PLURAL:$1|millibreyting ekki sýnd|millibreytingar ekki sýndar}} frá fleiri en $2 {{PLURAL:$2|notanda|notendum}}.)',
 'difference-missing-revision' => '$2 {{PLURAL:$2|útgáfa|útgáfur}} samanburðarins ($1) {{PLURAL:$2|fannst|fundust}} ekki.
 
@@ -1284,7 +1281,8 @@ Frekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'shown-title' => 'Sýna $1 {{PLURAL:$1|niðurstöðu|niðurstöður}} á hverri síðu',
 'viewprevnext' => 'Skoða ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Það er síða að nafni „[[:$1]]“ á þessum wiki'''",
-'searchmenu-new' => "'''Skapaðu síðuna \"[[:\$1]]\" á þessum wiki!'''",
+'searchmenu-new' => '<strong>Skapaðu síðuna "[[:$1]]" á þessum wiki!<strong>
+Sjá einnig {{PLURAL:$2|0=|leitarniðurstöðuna|leitarniðurstöðurnar}}.',
 'searchprofile-articles' => 'Efnissíður',
 'searchprofile-project' => 'Hjálpar- og verkefnasíður',
 'searchprofile-images' => 'Margmiðlanir',
@@ -1624,7 +1622,7 @@ Tölvupóstfang þitt er ekki gefið upp þegar aðrir notendur hafa samband vi
 'rclistfrom' => 'Sýna breytingar frá og með $1',
 'rcshowhideminor' => '$1 minniháttar breytingar',
 'rcshowhidebots' => '$1 vélmenni',
-'rcshowhideliu' => '$1 innskráða notendur',
+'rcshowhideliu' => '$1 skráðir notendur',
 'rcshowhideanons' => '$1 óinnskráða notendur',
 'rcshowhidepatr' => '$1 vaktaðar breytingar',
 'rcshowhidemine' => '$1 mínar breytingar',
@@ -1941,7 +1939,7 @@ Eftirfarandi listi sýnir {{PLURAL:$1|fyrsta myndatengilinn|fyrstu $1 myndatengl
 'nolinkstoimage' => 'Engar síður tengja í þessa skrá.',
 'morelinkstoimage' => 'Skoða [[Special:WhatLinksHere/$1|fleiri myndatengla]] á þessa skrá.',
 'linkstoimage-redirect' => '$1 (tilvísun) $2',
-'duplicatesoffile' => 'Eftirfarandi {{PLURAL:$1|skrá er afrit|$1 skrár eru afrit}} af þessari skrá ([[Special:FileDuplicateSearch/$2|Frekari upplýsingar]]):',
+'duplicatesoffile' => 'Eftirfarandi $2 {{PLURAL:$1|skrá er afrit|skrár eru afrit}} af þessari skrá ([[Special:FileDuplicateSearch/$2|Frekari upplýsingar]]):',
 'sharedupload' => 'Skrá þessi er af $1, og deilt meðal annarra verkefna og nýtist því þar.',
 'sharedupload-desc-there' => 'Skrá þessi er af $1, og deilt meðal annarra verkefna og nýtist því þar.
 Gjörðu svo vel og sjáðu [$2 skráarsíðuna þar] fyrir fleiri upplýsingar.',
@@ -2040,7 +2038,7 @@ Leitarstrengurinn á að vera á þessu formi: efnistag/myndasnið, t.d. <code>i
 'statistics-views-peredit' => 'Uppflettingar á hverja breytingu (meðaltal)',
 'statistics-users' => 'Skráðir  [[Special:ListUsers|notendur]]',
 'statistics-users-active' => 'Virkir notendur',
-'statistics-users-active-desc' => 'Notendur sem hafa framkvæmt aðgerð {{PLURAL:$1|síðastliðin dag|síðastliðna $1 daga}}',
+'statistics-users-active-desc' => 'Notendur sem hafa framkvæmt aðgerð {{PLURAL:$1|síðusta $1 dag|síðustu $1 daga}}',
 'statistics-mostpopular' => 'Mest skoðuðu síður',
 
 'pageswithprop' => 'Síður með eiginleika',
@@ -2135,7 +2133,7 @@ Vinsamlegast athugið að aðrar vefsíður gætu tengt beint í skrár héðan,
 'notargettext' => 'Villa: Engin síða eða notandi tilgreind til að nota þennan möguleika á.',
 'nopagetitle' => 'Síðan er ekki til',
 'nopagetext' => 'Síðan sem á að færa frá er ekki til.',
-'pager-newer-n' => '{{PLURAL:$1|nýrri 1|nýrri $1}}',
+'pager-newer-n' => '{{PLURAL:$1|nýrri}} $1',
 'pager-older-n' => '{{PLURAL:$1|1 eldri|$1 eldri}}',
 'suppress' => 'Yfirsýn',
 'querypage-disabled' => 'Þessi kerfisíða er óvirk til að minnka ekki afköst vefþjónsins.',
@@ -2212,7 +2210,7 @@ Leitin þarf að minnsta kosti að innihalda rótarlén, eins og "*.org"
 # Special:ActiveUsers
 'activeusers' => 'Virkir notendur',
 'activeusers-intro' => 'Þetta er listi yfir notendur sem hafa verið virkir {{PLURAL:$1|síðasta|síðustu}} $1 {{PLURAL:$1|dag|daga}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|aðgerð|aðgerðir}} á {{PLURAL:$3|síðastliðnum degi|síðustu $3 dögum}}',
+'activeusers-count' => '$1 {{PLURAL:$1|aðgerð|aðgerðir}} á {{PLURAL:$3|síðasta $3 degi|síðustu $3 dögum}}',
 'activeusers-from' => 'Sýna notendur sem byrja á:',
 'activeusers-hidebots' => 'Fela vélmenni',
 'activeusers-hidesysops' => 'Fela möppudýr',
@@ -2487,7 +2485,7 @@ Núverandi staða síðunnar er '''$1''':",
 'undeletepage' => 'Skoða og endurvekja eyddar síður',
 'undeletepagetitle' => "'''Eftirfarandi er samansafn af eyddum breytingum á [[:$1|$1]]'''.",
 'viewdeletedpage' => 'Skoða eyddar síður',
-'undeletepagetext' => 'Eftirfarandi {{PLURAL:$1|síðu hefur verið eytt en hún er þó enn í gagnagrunninum og getur verið endurvakin|$1 síðum hefur verið eytt en eru þó enn í gagnagrunninum og geta verið endurvaknar}}.
+'undeletepagetext' => 'Eftirfarandi $1 {{PLURAL:$1|síðu hefur verið eytt en hún er þó enn í gagnagrunninum og getur verið endurvakin|síðum hefur verið eytt en eru þó enn í gagnagrunninum og geta verið endurvaknar}}.
 Gagnagrunnurinn kann að vera tæmdur reglulega.',
 'undelete-fieldset-title' => 'Endurvekja breytingar',
 'undeleteextrahelp' => "Til þess að endurvekja alla breytingarskrá síðunnar, skildu öll box eftir óhökuð og ýttu á '''''{{int:undeletebtn}}'''''.
@@ -2786,7 +2784,7 @@ Vinsamlegast veldu annan titil.',
 'movelogpage' => 'Flutningaskrá',
 'movelogpagetext' => 'Þetta er listi yfir síður sem nýlega hafa verið færðar.',
 'movesubpage' => '{{PLURAL:$1|Undirsíða|Undirsíður}}',
-'movesubpagetext' => 'Þessi síða hefur {{PLURAL:$1|eina undirsíðu|$1 undirsíður}} sem {{PLURAL:$1|er sýnd|eru sýndar}} hér fyrir neðan.',
+'movesubpagetext' => 'Þessi síða hefur $1 {{PLURAL:$1|undirsíðu|undirsíður}} sem {{PLURAL:$1|er sýnd|eru sýndar}} hér fyrir neðan.',
 'movenosubpage' => 'Þessi síða hefur engar undirsíður.',
 'movereason' => 'Ástæða:',
 'revertmove' => 'taka til baka',
@@ -3147,7 +3145,7 @@ Vinsamlegast reyndu aftur.',
 'file-info-gif-looped' => 'síendurtekin hreyfimynd',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|rammi|rammar}}',
 'file-info-png-looped' => 'síendurtekin hreyfimynd',
-'file-info-png-repeat' => 'spilað {{PLURAL:$1|einu sinni|$1 sinnum}}',
+'file-info-png-repeat' => 'spilað $1 {{PLURAL:$1|sinni|sinnum}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|rammi|rammar}}',
 'file-no-thumb-animation' => "'''Athugið: Vegna tæknilegra takmarkanna birtast smámyndir af þessari skrá aðeins sem kyrrmyndir.'''",
 'file-no-thumb-animation-gif' => "'''Athugið:Vegna tæknilegra takmarkanna munu smámyndir af GIF-myndum í hárri upplausn eins og þessari ekki birtast sem hreyfimyndir.'''",
@@ -3165,10 +3163,10 @@ Vinsamlegast reyndu aftur.',
 'sp-newimages-showfrom' => 'Leita af nýjum skráum frá $2, $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'seconds' => '{{PLURAL:$1|einni sekúndu|$1 sekúndum}}',
-'minutes' => '{{PLURAL:$1|einni mínútu|$1 mínútum}}',
-'hours' => '{{PLURAL:$1|einum klukkutíma|$1 klukkutímum}}',
-'days' => '{{PLURAL:$1|einum degi|$1 dögum}}',
+'seconds' => '$1 {{PLURAL:$1|sekúndu|sekúndum}}',
+'minutes' => '$1 {{PLURAL:$1|mínútu|mínútum}}',
+'hours' => '$1 {{PLURAL:$1|klukkutíma|klukkutímum}}',
+'days' => '$1 {{PLURAL:$1|degi|dögum}}',
 'weeks' => '{{PLURAL:$1|$1 vika|$1 vikur}}',
 'months' => '{{PLURAL:$1|$1 mánuði|$1 mánuðum}}',
 'years' => '{{PLURAL:$1|$1 ári|$1 árum}}',
@@ -3916,7 +3914,7 @@ Ef ekki, þá getur þú notað einfalt eyðublað hér fyrir neðan. Athugasemd
 'api-error-badaccess-groups' => 'Þú hefur ekki leyfi til að hlaða inn skrám.',
 'api-error-badtoken' => 'Innri villa: Skemmdur tóki.',
 'api-error-copyuploaddisabled' => 'Ekki er hægt að hlaða upp með vefslóð á þessum vefþjón.',
-'api-error-duplicate' => 'Það {{PLURAL:$1|er [$2 önnur skrá]|eru[$2 aðrar skrár]}} þegar til á vefsvæðinu sem hafa sama innihald.',
+'api-error-duplicate' => 'Það {{PLURAL:$1|er [$2 önnur skrá]|eru [$2 aðrar skrár]}} þegar til á vefsvæðinu sem hafa sama innihald.',
 'api-error-duplicate-archive' => 'Það {{PLURAL:$1|var [$2 önnur skrá]|voru [$2 aðrar skrár]}} þegar á síðunni með sama innihald, en {{PLURAL:$1|henni|þeim}} var eytt.',
 'api-error-duplicate-archive-popup-title' => 'Eins {{PLURAL:$1|skrá|skrár}} sem {{PLURAL:$1|hefur|hafa}} þegar verið eytt.',
 'api-error-duplicate-popup-title' => '{{PLURAL:$1|Afrituð skrá|Afritaðar skrár}}',
index 8f5859f..fd7d8df 100644 (file)
@@ -11,6 +11,7 @@
  * @author Airon90
  * @author Amire80
  * @author Andria
+ * @author Ankabel
  * @author Aushulz
  * @author Beta16
  * @author Blaisorblade
@@ -57,6 +58,7 @@
  * @author Raoli
  * @author Remember the dot
  * @author Rippitippi
+ * @author Rosh
  * @author S.Örvarr.S
  * @author SabineCretella
  * @author Sannita
@@ -294,7 +296,6 @@ $linkTrail = '/^([a-zàéèíîìóòúù]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Sottolinea i collegamenti:',
-'tog-justify' => 'Allineamento giustificato dei paragrafi',
 'tog-hideminor' => 'Nascondi le modifiche minori nelle ultime modifiche',
 'tog-hidepatrolled' => 'Nascondi le modifiche verificate nelle ultime modifiche',
 'tog-newpageshidepatrolled' => "Nascondi le pagine verificate dall'elenco delle pagine più recenti",
@@ -457,7 +458,6 @@ $messages = array(
 'vector-action-protect' => 'Proteggi',
 'vector-action-undelete' => 'Recupera',
 'vector-action-unprotect' => 'Cambia la protezione',
-'vector-simplesearch-preference' => 'Abilita la barra per la ricerca semplificata (solo per la skin Vector)',
 'vector-view-create' => 'Crea',
 'vector-view-edit' => 'Modifica',
 'vector-view-history' => 'Cronologia',
@@ -1110,7 +1110,7 @@ Esiste già.',
 'invalid-content-data' => 'Dati contenuti non validi',
 'content-not-allowed-here' => 'Contenuto in "$1" non consentito nella pagine [[$2]]',
 'editwarning-warning' => 'Lasciare questa pagina potrebbe causare la perdita di tutte le modifiche fatte.
-Se hai effettuato l\'accesso, puoi disattivare questo avviso nella sezione "Casella di modifica" delle tue preferenze.',
+Se hai effettuato l\'accesso, puoi disattivare questo avviso nella sezione "{{int:prefs-editing}}" delle tue preferenze.',
 'editpage-notsupportedcontentformat-title' => 'Formato contenuto non supportato',
 'editpage-notsupportedcontentformat-text' => 'Il formato del contenuto $1 non è supportato dal modello di contenuto $2.',
 
@@ -1146,6 +1146,7 @@ Alcuni template non verranno inclusi.",
 Controlla le differenze mostrate sotto fra le due versioni per essere certo che il contenuto corrisponda a quanto desiderato, e quindi salvare le modifiche per completare la procedura di annullamento.',
 'undo-failure' => 'Impossibile annullare la modifica a causa di un conflitto con modifiche intermedie.',
 'undo-norev' => 'La modifica non può essere annullata perché non esiste o è stata cancellata.',
+'undo-nochange' => 'Sembra che la modifica sia già stata annullata.',
 'undo-summary' => 'Annullata la modifica $1 di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]])',
 'undo-summary-username-hidden' => 'Annullata la modifica $1 di un utente nascosto',
 
@@ -1320,8 +1321,9 @@ Vedi l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi e dei blo
 'showhideselectedversions' => 'Mostra/nascondi versioni selezionate',
 'editundo' => 'annulla',
 'diff-empty' => '(Nessuna differenza)',
-'diff-multi' => '({{PLURAL:$1|Una revisione intermedia|$1 revisioni intermedie}} di {{PLURAL:$2|un utente|$2 utenti}} non {{PLURAL:$1|mostrata|mostrate}})',
-'diff-multi-manyusers' => '({{PLURAL:$1|Una revisione intermedia|$1 revisioni intermedie}} di oltre $2 {{PLURAL:$2|utente|utenti}} non {{PLURAL:$1|mostrata|mostrate}})',
+'diff-multi-sameuser' => '({{PLURAL:$1|Una versione intermedia|$1 versioni intermedie}} di uno stesso utente non 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}}.
 
 Questo si verifica solitamente seguendo un collegamento obsoleto di un diff a una pagina cancellata.
@@ -1341,7 +1343,7 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
 'shown-title' => 'Mostra {{PLURAL:$1|un risultato|$1 risultati}} per pagina',
 'viewprevnext' => 'Vedi ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Sul sito esiste una pagina il cui nome è \"[[:\$1]]\"'''",
-'searchmenu-new' => 'Crea la pagina "[[:$1]]" su questo sito',
+'searchmenu-new' => '<strong>Crea la pagina "[[:$1]]" su questo wiki!</strong> {{PLURAL:$2|0=|Vedi anche la pagina trovata con la tua ricerca|Vedi anche i risultati della ricerca}}',
 'searchprofile-articles' => 'Pagine di contenuti',
 'searchprofile-project' => 'Pagine di aiuto e relative al progetto',
 'searchprofile-images' => 'Multimedia',
@@ -1367,6 +1369,7 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
 'searchrelated' => 'correlati',
 'searchall' => 'tutti',
 'showingresults' => "Di seguito {{PLURAL:$1|viene presentato al massimo '''1''' risultato|vengono presentati al massimo '''$1''' risultati}} a partire dal numero '''$2'''.",
+'showingresultsinrange' => '{{PLURAL:$1|Viene mostrato|Vengono mostrati}} sotto {{PLURAL:$1|<strong>1</strong> risultato|<strong>$1</strong> risultati}} dal <strong>$2</strong> al <strong>$3</strong>.',
 'showingresultsnum' => "Di seguito {{PLURAL:$3|viene presentato '''1''' risultato|vengono presentati '''$3''' risultati}} a partire dal numero '''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Risultato '''$1''' di '''$3'''|Risultati '''$1 - $2''' di '''$3'''}} per '''$4'''",
 'search-nonefound' => 'La ricerca non ha prodotto risultati.',
@@ -2171,10 +2174,19 @@ I redirect <del>cancellati</del> sono stati corretti.',
 'deadendpagestext' => 'Le pagine indicate di seguito sono prive di collegamenti verso altre pagine di {{SITENAME}}.',
 'protectedpages' => 'Pagine protette',
 'protectedpages-indef' => 'Solo protezioni infinite',
+'protectedpages-summary' => "Questa pagina elenca le pagine esistenti che sono attualmente protette. Per un'elenco di titoli protetti dalla creazione, vedi [[{{#special:ProtectedTitles}}]].",
 'protectedpages-cascade' => 'Solo protezioni ricorsive',
 'protectedpages-noredirect' => 'Nascondi redirect',
 'protectedpagesempty' => 'Al momento non vi sono pagine protette',
+'protectedpages-timestamp' => 'Data e ora',
+'protectedpages-page' => 'Pagina',
+'protectedpages-expiry' => 'Scadenza',
+'protectedpages-params' => 'Parametri di protezione',
+'protectedpages-reason' => 'Motivo',
+'protectedpages-unknown-timestamp' => 'Sconosciuto',
+'protectedpages-unknown-performer' => 'Utente sconosciuto',
 'protectedtitles' => 'Titoli protetti',
+'protectedtitles-summary' => "Questa pagina elenca i titoli che sono attualmente protetti dalla creazione. Per un'elenco di pagine esistenti che sono protette, vedi [[{{#special:ProtectedPages}}]].",
 'protectedtitlesempty' => 'Al momento non esistono titoli protetti con i parametri specificati.',
 'listusers' => 'Elenco degli utenti',
 'listusers-editsonly' => 'Mostra solo utenti con dei contributi',
@@ -2912,6 +2924,7 @@ $2',
 'thumbnail_image-type' => 'Tipo di immagine non supportato',
 'thumbnail_gd-library' => 'Configurazione incompleta della libreria GD: funzione $1 mancante',
 'thumbnail_image-missing' => 'Sembra essere mancante il file: $1',
+'thumbnail_image-failure-limit' => 'Ci sono stati recentemente troppi tentativi falliti ($1 o più) di generare questa miniatura. Riprova più tardi.',
 
 # Special:Import
 'import' => 'Importa pagine',
@@ -2946,7 +2959,7 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 'importuploaderrortemp' => "Caricamento del file per l'importazione non riuscito. Manca una cartella temporanea.",
 'import-parse-failure' => "Errore di analisi nell'importazione XML",
 'import-noarticle' => 'Nessuna pagina da importare.',
-'import-nonewrevisions' => 'Tutte le revisioni sono già state importate in precedenza.',
+'import-nonewrevisions' => 'Nessuna versione importata (erano già tutte presenti, o saltate a causa di errori)',
 'xml-error-string' => '$1 a riga $2, colonna $3 (byte $4): $5',
 'import-upload' => 'Carica dati XML',
 'import-token-mismatch' => 'I dati relativi alla sessione sono andati persi. Riprovare.',
@@ -2957,6 +2970,7 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 '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-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>',
 'import-rootpage-invalid' => 'La pagina principale fornita non è un titolo valido.',
 'import-rootpage-nosubpage' => 'Il namespace "$1" della pagina principale non permette di avere sottopagine.',
index 580edbe..16f83ec 100644 (file)
@@ -53,6 +53,7 @@
  * @author Vigorous action
  * @author W.CC
  * @author Web comic
+ * @author What here area team
  * @author Whym
  * @author Yanajin66
  * @author לערי ריינהארט
@@ -370,7 +371,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'リンクの下線:',
-'tog-justify' => '段落に均等割り付けを設定',
 'tog-hideminor' => '最近の更新に細部の編集を表示しない',
 'tog-hidepatrolled' => '最近の更新に巡回済みの編集を表示しない',
 'tog-newpageshidepatrolled' => '新しいページの一覧に巡回済みのページを表示しない',
@@ -533,7 +533,6 @@ $messages = array(
 'vector-action-protect' => '保護',
 'vector-action-undelete' => '復元',
 'vector-action-unprotect' => '保護再設定',
-'vector-simplesearch-preference' => '簡素化した検索バーを有効にする (ベクター外装のみ)',
 'vector-view-create' => '作成',
 'vector-view-edit' => '編集',
 'vector-view-history' => '履歴表示',
@@ -1236,7 +1235,7 @@ $1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのブロッ
 'invalid-content-data' => '本文データが無効です',
 'content-not-allowed-here' => 'ページ [[$2]] では、「$1」コンテンツは許可されていません',
 'editwarning-warning' => 'このページを離れると、あなたが行なった変更がすべて失われてしまうかもしれません。
-ログインしている場合、個人設定の「編集」タブでこの警告を表示しないようにすることができます。',
+ログインしている場合、個人設定の「{{int:prefs-editing}}」タブでこの警告を表示しないようにすることができます。',
 'editpage-notsupportedcontentformat-title' => '対応していないコンテンツ形式',
 'editpage-notsupportedcontentformat-text' => 'コンテンツ モデル $2 は、コンテンツ形式 $1 に対応していません。',
 
@@ -1273,6 +1272,7 @@ $1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのブロッ
 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。',
 'undo-failure' => '中間の版での編集と競合したため、取り消せませんでした。',
 'undo-norev' => '取り消そうとした編集が存在しないか削除済みのため取り消せませんでした。',
+'undo-nochange' => '指定した編集は既に取り消されたようです。',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|トーク]]) による版 $1 を取り消し',
 'undo-summary-username-hidden' => '秘匿された利用者による版 $1 を取り消し',
 
@@ -1454,7 +1454,8 @@ $1',
 'showhideselectedversions' => '選択した版を表示/非表示',
 'editundo' => '取り消し',
 'diff-empty' => '(相違点なし)',
-'diff-multi' => '({{PLURAL:$2|$2人の利用者}}による、{{PLURAL:$1|間の$1版}}が非表示)',
+'diff-multi-sameuser' => '(同じ利用者による、{{PLURAL:$1|間の$1版}}が非表示)',
+'diff-multi-otherusers' => '({{PLURAL:$2|他の1人の利用者|$2人の利用者}}による、{{PLURAL:$1|間の$1版}}が非表示)',
 'diff-multi-manyusers' => '({{PLURAL:$2|$2人を超える利用者}}による、{{PLURAL:$1|間の$1版}}が非表示)',
 'difference-missing-revision' => '指定された{{PLURAL:$2|$2版}}の差分 ($1) が見つかりませんでした。
 
@@ -1501,6 +1502,7 @@ $1',
 'searchrelated' => '関連',
 'searchall' => 'すべて',
 'showingresults' => '<strong>$2</strong> 件目以降の最大 {{PLURAL:$1|<strong>$1</strong> 件の結果}}を表示しています。',
+'showingresultsinrange' => '<strong>$2</strong> 件目以降の最大 {{PLURAL:$1|<strong>$1</strong> 件の結果}}を表示しています。',
 'showingresultsnum' => '<strong>$2</strong> 件目以降の {{PLURAL:$3|<strong>$3</strong> 件の結果}}を表示しています。',
 'showingresultsheader' => '「<strong>$4</strong>」の検索結果 {{PLURAL:$5|<strong>$3</strong> 件中の <strong>$1</strong> 件目|<strong>$3</strong> 件中の <strong>$1</strong> 件目から <strong>$2</strong> 件目}}',
 'search-nonefound' => '問い合わせに合致する検索結果はありませんでした。',
@@ -2349,10 +2351,17 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 'deadendpagestext' => '以下のページは、{{SITENAME}}の他のページにリンクしていません。',
 'protectedpages' => '保護されているページ',
 'protectedpages-indef' => '無期限保護のみ',
+'protectedpages-summary' => 'このページでは、現時点で保護されている既存のページを列挙します。新規作成が禁止されているページ名の一覧は、[[{{#special:ProtectedTitles}}]] を参照してください。',
 'protectedpages-cascade' => 'カスケード保護のみ',
 'protectedpages-noredirect' => 'リダイレクトを隠す',
 'protectedpagesempty' => '指定した条件で保護中のページは現在ありません。',
+'protectedpages-timestamp' => '日時',
+'protectedpages-page' => 'ページ',
+'protectedpages-expiry' => '有効期限',
+'protectedpages-reason' => '理由',
+'protectedpages-unknown-timestamp' => '不明',
 'protectedtitles' => '作成保護されているページ名',
+'protectedtitles-summary' => 'このページでは、現時点で新規作成が禁止されているページ名を列挙します。保護されている既存のページの一覧は、[[{{#special:ProtectedPages}}]] を参照してください。',
 'protectedtitlesempty' => 'これらの引数で現在保護されているページはありません。',
 'listusers' => '利用者一覧',
 'listusers-editsonly' => '投稿記録のある利用者のみを表示',
@@ -2918,7 +2927,7 @@ $1',
 'contribslink' => '投稿記録',
 'emaillink' => 'メールを送信',
 'autoblocker' => 'この IP アドレスを「[[User:$1|$1]]」が最近使用したため、自動ブロックされています。
-$1 のブロックの理由は「<em>$2</em>」です。',
+$1 のブロックの理由は「$2」です。',
 'blocklogpage' => 'ブロック記録',
 'blocklog-showlog' => 'この利用者は以前にブロックされたことがあります。
 参考のため、ブロック記録を以下に示します:',
index 700910a..11983ec 100644 (file)
@@ -54,7 +54,6 @@ $namespaceAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Garisen ngisoré pranala:',
-'tog-justify' => 'Ratakaké paragrap',
 'tog-hideminor' => 'Dhelikaké suntingan cilik ing owah-owahan pungkasan',
 'tog-hidepatrolled' => 'Dhelikaké suntingan kapanto ing owah-owahan pungkasan',
 'tog-newpageshidepatrolled' => 'Dhelikaké kaca kapanto saka daptar kaca anyar',
@@ -1065,7 +1064,6 @@ Gunakna tombol radio kanggo nggabungaké révisi-révisi sing digawé sadurungé
 'showhideselectedversions' => 'Tampilaké/dhelikaké révisi kapilih',
 'editundo' => 'batalna',
 'diff-empty' => '(Ora ana bedane)',
-'diff-multi' => '({{PLURAL:$1Siji rèvisi sedhengan|$1 rèvisi sedhengan}} déning {{PLURAL:$2|sak panganggo|$2 panganggo}} ora dituduhaké)',
 'diff-multi-manyusers' => '({{PLURAL:$1Siji rèvisi sedhengan|$1 rèvisi sedhengan}} déning luwih saka $2 {{PLURAL:$2|panganggo|panganggo}} ora dituduhaké)',
 'difference-missing-revision' => '{{PLURAL:$2|Sak pambenahan|$2 pambenahan}} saka prabédan iki ($1) {{PLURAL:$2|ora ditemokaké|ora ditemokaké}}.
 
@@ -2100,7 +2098,6 @@ Owah-owahan sing dumadi ing tembé ing kaca iku lan kaca dhiskusi sing kagandhè
 'watchmethod-list' => 'priksa kaca sing diawasi kanggo owah-owahan anyar',
 'watchlistcontains' => 'Daftar pangawasan panjenengan isiné ana $1 {{PLURAL:$1|kaca|kaca}}.',
 'iteminvalidname' => "Ana masalah karo '$1', jenengé ora absah...",
-'wlnote' => "Ngisor iki {{PLURAL:$1|owahan pungkasan|'''$1''' owahan pungkasan}} {{PLURAL:$2|jam|'''$2''' jam}} kapungkur, per $3, $4.",
 'wlshowlast' => 'Tuduhna $1 jam $2 dina $3 pungkasan',
 'watchlist-options' => 'Opsi daftar pangawasan',
 
@@ -2468,7 +2465,7 @@ Delok [[Special:BlockList|daptar blokir]] kanggo ninjo blokiran.',
 Log blokiran sumadhiya nèng ngisor kanggo rujukan:',
 'blocklog-showsuppresslog' => 'Panganggo iki wis tau diblokir lan didhelikaké sakdurungé.
 Log brèdèlan sumadhiya nèng ngisor kanggo rujukan:',
-'blocklogentry' => 'mblokir "[[$1]]" dipun watesi wedalipun $2 $3',
+'blocklogentry' => 'mblokir "[[$1]]" dipun watesi wekdalipun $2 $3',
 'reblock-logentry' => 'Ngowahi sèting pamblokiran [[$1]] kanthi wektu daluwarsa $2 $3',
 'blocklogtext' => 'Ing ngisor iki kapacak log pamblokiran lan panjabelan blokir panganggo.
 Alamat IP sing diblokir sacara otomatis ora ana ing daftar iki.
@@ -2740,7 +2737,6 @@ Simpen nèng komputer Sampéyan lan unggaha nèng kéné.',
 'tooltip-pt-watchlist' => 'Daftar kaca sing tak-awasi.',
 'tooltip-pt-mycontris' => 'Daftar kontribusi panjenengan',
 'tooltip-pt-login' => 'Panjenengan diaturi mlebu log, nanging ora dikudokaké.',
-'tooltip-pt-anonlogin' => 'Panjenengan disaranaké mlebu log, nanging ora diwajibaké.',
 'tooltip-pt-logout' => 'Log metu (oncat)',
 'tooltip-ca-talk' => 'Dhiskusi perkara isi',
 'tooltip-ca-edit' => 'Sunting kaca iki. Nganggoa tombol pratayang sadurungé nyimpen.',
index 4d86ae9..37d7ea0 100644 (file)
@@ -169,7 +169,6 @@ $linkTrail = '/^([a-zაბგდევზთიკლმნოპჟრსტ
 $messages = array(
 # User preference toggles
 'tog-underline' => 'ბმულების ხაზგასმა:',
-'tog-justify' => 'გაასწორე პარაგრაფები',
 'tog-hideminor' => 'დამალე მცირე რედაქტირება ბოლო ცვლილებებში',
 'tog-hidepatrolled' => 'დამალეთ შესწორებული რედაქტირებები ბოლო ცვლილებებში',
 'tog-newpageshidepatrolled' => 'დამალეთ შემოწმებული გვერდები ახალი გვერდების სიიდან',
@@ -1203,7 +1202,6 @@ $1",
 'showhideselectedversions' => 'ჩვენება/დამალვა არჩეული ვერსიებისა',
 'editundo' => 'გაუქმება',
 'diff-empty' => '(განსხვავება არ არის)',
-'diff-multi' => '({{PLURAL:$2|ერთი მომხმარებლის|$2 მომხმარებლების}} {{PLURAL:$1|ერთი შუალედური ვერსია|$1 შუალედური ვერსიები}} არ არის ნაჩვენები.)',
 'diff-multi-manyusers' => '({{PLURAL:$2|ერთი მომხმარებლის|$2 მომხმარებლების}} {{PLURAL:$1|ერთი შუალედური ვერსია|$1 შუალედური ვერსიები}}, რომლებიც არ არის ნაჩვენები.)',
 'difference-missing-revision' => '{{PLURAL:$2|$2 ვერსია}} ამ შედარებისათვის ($1) {{PLURAL:$2|ვერ მოიძებნა}}.
 
@@ -2234,7 +2232,6 @@ $1',
 'watchmethod-list' => 'მიმდინარეობს თქვენი კონტროლის ქვეშ მყოფი გვერდების შემოწმება უახლესი შესწორებების მიხედვით.',
 'watchlistcontains' => 'თქვენი კონტროლის სია შეიცავს $1 გვერდს.',
 'iteminvalidname' => '„$1-ს“ პრობლემა აქვს, სახელი არასწორია...',
-'wlnote' => "ქვემოთ {{PLURAL:$1|ნაჩვენებია ბოლო ცვლილება|ნაჩვენებია ბოლო '''$1''' ცვლილება}} უკანასკნელი {{PLURAL:$2|საათის|'''$2''' საათის}} მანძილზე, $3, $4 მდგომარეობით.",
 'wlshowlast' => 'აჩვენე ბოლო $1 საათის $2 დღის $3',
 'watchlist-options' => 'კონტროლის სიის პარამეტრები',
 
@@ -2879,7 +2876,6 @@ $2',
 'tooltip-pt-watchlist' => 'გვერდების სია, რომელთა ცვლილებებს თქვენ უთვალთვალებთ',
 'tooltip-pt-mycontris' => 'თქვენი წვლილის სია',
 'tooltip-pt-login' => 'სასურველია დარეგისტრირდეთ, თუმცა აუცილებელია არაა.',
-'tooltip-pt-anonlogin' => 'აქ შეიძლება რეგისტრაციის გავლა, თუმცა ეს სავალდებულო არ არის',
 'tooltip-pt-logout' => 'გასვლა',
 'tooltip-ca-talk' => 'შიგთავსის გვერდის განხილვა',
 'tooltip-ca-edit' => 'თქვენ შეგიძლიათ ამ გვერდის რედაქტირება. გთხოვთ გამოიყენოთ  წინასწარი ხედვის ღილაკი სანამ გვერდს შეინახავთ.',
@@ -3715,7 +3711,7 @@ $5
 
 # Auto-summaries
 'autosumm-blank' => 'გვერდის შიგთავსი დაცარიელდა',
-'autosumm-replace' => "შინაარსი შეიცვალა '$1'-ით",
+'autosumm-replace' => 'შინაარსი შეიცვალა „$1“-ით',
 'autoredircomment' => 'გადამისამართება [[$1]]-ზე',
 'autosumm-new' => 'ახალი გვერდი: $1',
 
index fdc5b05..2824512 100644 (file)
@@ -155,16 +155,13 @@ $linkPrefixCharset = 'a-zıA-Zİ\\x80-\\xff';
 $messages = array(
 # User preference toggles
 'tog-underline' => "Siltewdin' astın sız:",
-'tog-justify' => "Tekstti bettin' ken'ligi boyınsha tuwrılaw",
 'tog-hideminor' => "Aqırg'ı o'zgerislerden kishilerin jasır",
 'tog-extendwatchlist' => "Baqlaw dizimin barlıq o'zgerislerdi ko'rsetetug'ın qılıp ken'eyt (tek aqırg'ıların emes)",
 'tog-usenewrc' => "Ken'eytilgen jaqındag'ı o'zgerislerdi qollan (JavaScript bolıwın talap etedi)",
 'tog-numberheadings' => 'Atamalardı avtomat nomerle',
 'tog-showtoolbar' => "O'zgertiw a'sbapların ko'rset (JavaScript)",
 'tog-editondblclick' => "Eki ma'rte basıp o'zgertiw (JavaScript)",
-'tog-editsection' => "Bo'limlerdi [o'zgertiw] siltew arqalı o'zgertiwdi qos",
 'tog-editsectiononrightclick' => "Bo'lim atamasın on' jaqqa basıp o'zgertiwdi qos (JavaScript)",
-'tog-showtoc' => "Mazmunın ko'rset (3-ten artıq bo'limi bar betlerge)",
 'tog-rememberpassword' => "Menin' kirgenimdi usı kompyuterde saqlap qal (en' ko'bi menen $1 {{PLURAL:$1|ku'nge|ku'nge}} shekem)",
 'tog-watchcreations' => 'Men jaratqan betlerdi baqlaw dizimime qos',
 'tog-watchdefault' => "Men o'zgeris kiritken betlerdi baqlaw dizimime qos",
@@ -783,7 +780,6 @@ Sha'rtli belgiler: (ha'z.) = ha'zirgi nusqasi menen parqı,
 'lineno' => 'Qatar No $1:',
 'compareselectedversions' => "Saylang'an nusqalardı salıstırıw",
 'editundo' => 'qaytar',
-'diff-multi' => "({{PLURAL:$2|bir paydalanıwshı|$2 paydalanıwshı}} ta'repinen {{PLURAL:$1|aralıq bir nusqa|aralıq $1 nusqa}} ko'rsetilmeydi.)",
 
 # Search results
 'searchresults' => "İzlew na'tiyjeleri",
@@ -1354,7 +1350,6 @@ Eger siz bul betti baqlaw dizimin'izden o'shirmekshi bolsan'ız bettin' joqarg'
 'watchlist-details' => "Baqlaw dizimin'izde (sa'wbet betlerin esapqa almag'anda) {{PLURAL:$1|1 bet|$1 bet}} bar.",
 'wlheader-enotif' => "E-mail arqalı eskertiw qosılg'an.",
 'watchlistcontains' => "Sizin' baqlaw dizimin'izde {{PLURAL:$1|1 bet|$1 bet}} bar.",
-'wlnote' => "To'mende aqırg'ı {{PLURAL:$2|saattag'ı|'''$2''' saattag'ı}} {{PLURAL:$1|aqırg'ı o'zgeris bar|aqırg'ı '''$1''' o'zgeris bar}}.",
 'wlshowlast' => "Aqırg'ı $1 saat, $2 ku'n, $3 ko'rset",
 'watchlist-options' => "Baqlaw diziminin' sazlawları",
 
@@ -1641,7 +1636,6 @@ Please visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation
 'tooltip-pt-watchlist' => "O'zgerislerin baqlap turg'an betler dizimi",
 'tooltip-pt-mycontris' => "Sizin' u'lesler dizimin'iz",
 'tooltip-pt-login' => "Kiriwin'iz usınıladı, biraq ma'jbu'riy bolmag'an xalda.",
-'tooltip-pt-anonlogin' => "Kiriwin'iz usınıladı, biraq ma'jbu'riy bolmag'an xalda.",
 'tooltip-pt-logout' => "Shıg'ıw",
 'tooltip-ca-talk' => "Mag'lıwmat beti haqqında diskussiya",
 'tooltip-ca-edit' => "Siz bul betti o'zgertiwin'izge boladi. Iltimas betti saqlawdan aldın ko'rip shig'ıw knopkasın paydalanın'.",
index 87bfd21..e4ce6a0 100644 (file)
@@ -45,7 +45,6 @@ $namespaceAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Derrer izdayen:',
-'tog-justify' => 'Err tehri ger wawalen kif-kif',
 'tog-hideminor' => 'Ffer ibeddlen ifessasen deg yibeddlen imaynuten',
 'tog-hidepatrolled' => 'Ffer ibeddlen iεessan deg yibeddlen imaynuten',
 'tog-newpageshidepatrolled' => 'Ffer isebtaren iɛessan gar umuɣ n isebtaren imaynuten',
@@ -1057,7 +1056,6 @@ Senked d akken tamhelt agi ad eǧǧ amezruy n usebtar ad ikemmel.',
 'showhideselectedversions' => 'Ssken/Ffer ileqman i xtiṛen',
 'editundo' => 'ssefsu',
 'diff-empty' => '(Ulac amgerrad)',
-'diff-multi' => '({{PLURAL:$1|Yiwet tasiwelt tabusarit|$1 n tisiwal tibusarin}} af {{PLURAL:$2|amseqdac|$2 imseqdacen}} {{PLURAL:$1|ur ttumlal ara|ur ttumlalent ara}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Yiwen lqem agrawan|$1 ileqman igrawanen}} af {{PLURAL:$2|aseqdac|$2 iseqdacen}} {{PLURAL:$1|yeffer|ffren}})',
 'difference-missing-revision' => '{{PLURAL:$1|Yiwet tacaggart|$1 ticaggartin}} n tameẓla agi ($1) {{PLURAL:$2|ur tella ara (ulac)|ur llant ara (ulac)}}.
 
@@ -1463,7 +1461,7 @@ Talɣut agi attili d-tazayezt.',
 'uploadnologin' => 'Ur tekcimeḍ ara',
 'uploadnologintext' => 'Ilaq ad $1 iwakken ad ketreḍ ifuyla.',
 'upload_directory_missing' => 'Akaram n taktert n ufaylu ($1) ulac-it dɣa ur d-yesnulfa ara sɣur aqeddac web.',
-'upload_directory_read_only' => 'Weserver/serveur Web ur yezmir ara ad yaru deg ($1).',
+'upload_directory_read_only' => 'Akaram n taktert n ifuyla ($1) ur yezmer ara ad yetbeddel seg aqeddac web.',
 'uploaderror' => 'Agul deg usekcam',
 'upload-recreate-warning' => "'''Ɣur-wet : Afaylu s isem agi yetwekkes naɣ yetembiwel.'''
 Aɣmis n tukksiwin d win n ittembiwilen n usebter agi beqqeḍen d-agi i tilɣa :",
@@ -2615,8 +2613,17 @@ Xtir isem nniḍen.',
 
 # Export
 'export' => 'Ssufeɣ isebtar',
+'exporttext' => 'Tzemreḍ ad ssifeḍeḍ s XML aḍris d umezruy n yiwen usebtar neɣ tagrumma n isebtar ;
+agemmuḍ yezmer ihi ad yetkter deg wiki nniḍen yetseqdacen aseɣẓan MediaWiki s [[Special:Import|usebtar n taktert]].
+
+Iwakken ad ssifeḍeḍ isebtar, sekcem izwal nsen deg tanaka n uḍris ddaw agi, yiwen azwel s yiwen azagg. Fren, ma tebɣiḍ neɣ ala, lqem amiran s akkw ileqman iqdimen, s izaggen n umezruy n usebtar, neɣ asebtar amiran kan s tilɣa ɣef abeddil aneggaru.
+
+Deg tajṛut agi taneggarut tzemreḍ daɣen ad seqdeceḍ azday, am [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] i usebtar [[{{MediaWiki:Mainpage}}]].',
 'exportall' => 'Ssufeɣ akkw isebtar',
 'exportcuronly' => 'Ssekcem tasiwelt n tura kan, mačči akk amezruy-is',
+'exportnohistory' => "----
+'''Tamawt :''' assifeḍ n umezruy ummid n isebtar s tallalt n tiferkit yetwensa i ṣṣwabat n tamellit.",
+'exportlistauthors' => 'Sseddu umuɣ ummid n ittekkiyen i yal asebtar',
 'export-submit' => 'Ssufeɣ',
 'export-addcattext' => 'Rnu isebtar seg taggayt:',
 'export-addcat' => 'Rnu',
@@ -2624,6 +2631,7 @@ Xtir isem nniḍen.',
 'export-addns' => 'Rnu',
 'export-download' => 'Ḥrez deg ufaylu',
 'export-templates' => 'Sekcem tiɣlatin',
+'export-pagelinks' => 'Sseddu isebtar i qqenen s talqayt n :',
 
 # Namespace 8 related
 'allmessages' => 'Izen n system',
@@ -2662,6 +2670,9 @@ $2',
 # Special:Import
 'import' => 'Ssekcem isebtar',
 'importinterwiki' => 'Assekcem n transwiki',
+'import-interwiki-text' => 'Fren yiwen wiki d yiwen azwel n usebtar ad ketreḍ.
+Izemzen n ileqman d isemawen n ittekkiyen ad qqimen.
+Akkw tigawin n taktert ager-wiki ad illint deg [[Special:Log/import|umezruy n tiketrin]].',
 'import-interwiki-source' => 'Wiki d usebtar n taɣbalut',
 'import-interwiki-history' => 'Xdem alsaru n akk tisiwal umezruy n usebter-agi',
 'import-interwiki-templates' => 'Sekcem akkw talɣiwin',
@@ -2670,6 +2681,7 @@ $2',
 'import-interwiki-rootpage' => 'Asebtar azaṛ n userken (axetṛan) :',
 'import-upload-filename' => 'Isem n ufaylu :',
 'import-comment' => 'Awennit :',
+'importtext' => 'Ilaq ad ssifeḍeḍ afaylu seg wiki aneṣli s useqdac n  [[Special:Export|ufecku ines n ussifeḍ]].',
 'importstart' => 'Asekcem n isebtar...',
 'import-revision-count' => '$1 {{PLURAL:$1|tasiwelt|tisiwal}}',
 'importnopages' => 'Ulac isebtar iwakken ad ttussekcmen.',
@@ -2683,13 +2695,26 @@ $2',
 'importhistoryconflict' => 'Amennuɣ ger tisiwal n umezruy (ahat asebter-agi yettwazen yagi)',
 'importnosources' => 'Asekcam n transwiki ur yexdim ara u amezruy n usekcam yettwakkes.',
 'importnofile' => 'ulaḥedd afaylu usekcam ur yettwazen.',
+'importuploaderrorsize' => 'Taktert n ufaylu texṣer.
+Tiddi ines t-ugar afellay i ssiregen i taktert n ufaylu.',
+'importuploaderrorpartial' => 'Taktert n ufaylu texṣer.
+Agbur ines yetweccegaɛ s-umur kan.',
+'importuploaderrortemp' => 'Taktert n ufaylu texṣer.
+Ulac yiwen akaram akudan.',
+'import-parse-failure' => 'Axṣar deg tasleṭ n XML an kter',
 'import-noarticle' => 'Ulac isebtar ad nekter.',
-'import-nonewrevisions' => 'Akkw ileqman tetwaketren yakan.',
+'import-nonewrevisions' => 'Ulac iceggiṛen yetwaketren (akkw tetwaketren yakan, neɣ tetwassinfen acku llant tuccḍiwin).',
+'xml-error-string' => '$1 ar azagg $2, ajgu $3 (atamḍan $4) : $5',
+'import-upload' => 'Taktert n isefka XML',
+'import-token-mismatch' => 'Azella n isefka n tɣimit. Ɛreḍ tikkelt nniḍen.',
+'import-invalid-interwiki' => 'Ulamek an kter seg wiki i efkeḍ.',
 'import-error-edit' => 'Asebtar « $1 » ur d-yekter ara acku ur tesɛiḍ ara turagt iwakken at beddeleḍ.',
 'import-error-create' => 'Asebtar « $1 » ur d-yekter ara acku ur tesɛiḍ ara turagt iwakken at snulfuḍ.',
 'import-error-interwiki' => 'Asebtar « $1 » ur d-yekter ara acku isem-is yettwaṭṭef i uzday yeffɣen (interwiki).',
 'import-error-special' => 'Asebtar « $1 » ur d-yekter ara acku yeqqen s tallunt n isemawen uslig ur yebɣan ara isebtar.',
 'import-error-invalid' => 'Asebtar « $1 » ur d-yekter ara acku isem-is ur yeɣbel ara.',
+'import-error-unserialize' => 'Aceggeṛ $2 n usebtar « $1 » ur nezmer ara as n-ekkes amazrar ines. Aceggeṛ yetwamel am aken yetseqdac talɣa n ugbur $3 yesɛan amazrar s $4.',
+'import-error-bad-location' => 'Tacaggart $2 yetseqdacen talɣa n ugbur $3 teṣer deg ukalas ɣef « $1 » ɣef wiki agi, acku talɣa agi ur tezmer ara att illi deg usebtar agi.',
 'import-options-wrong' => 'Yir {{PLURAL:$2|afran|ifranen}} : <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Asebtar aẓar id efkeḍ d-azwel ur ɣblen ara.',
 'import-rootpage-nosubpage' => 'Tallunt n isemawen « $1 » n usebtar aẓar ur yeqbel ara adu-isebtar.',
@@ -2846,7 +2871,9 @@ Ur-d t-aru '''ACEMMA''' d-agi !",
 'pageinfo-redirectsto-info' => 'tiɣa',
 'pageinfo-contentpage' => 'Yetweḥseb am asebtar n ugbur',
 'pageinfo-contentpage-yes' => 'Ih',
+'pageinfo-protect-cascading' => 'Imestan tetwakksen seg d-agi',
 'pageinfo-protect-cascading-yes' => 'Ih',
+'pageinfo-protect-cascading-from' => 'Imestan tetwakksen seg',
 'pageinfo-category-info' => 'Tilɣa ɣef taggayt',
 'pageinfo-category-pages' => 'Amḍan n isebtar',
 'pageinfo-category-subcats' => 'Amḍan n adutaggayin',
@@ -2862,9 +2889,13 @@ Ur-d t-aru '''ACEMMA''' d-agi !",
 'markedaspatrollederror' => 'Ur yezmir ara ad yercem "yettwassenqden"',
 'markedaspatrollederrortext' => 'Yessefk ad textareḍ tasiwelt akken a tt-trecmeḍ "yettwassenqden".',
 'markedaspatrollederror-noautopatrol' => 'Ur tezmireḍ ara ad trecmeḍ ibeddilen inek "yettwassenqden".',
+'markedaspatrollednotify' => 'Abeddel agi n $1 yetwacṛeḍ am aken yetwalsɣer.',
+'markedaspatrollederrornotify' => 'Axṣar n ucṛaḍ am aken yetsenqed.',
 
 # Patrol log
 'patrol-log-page' => 'Aɣmis n usenqad',
+'patrol-log-header' => 'Atan amezruy n ileqman yetwalsɣren.',
+'log-show-hide-patrol' => '$1 amezruy n alstiɣuryin',
 
 # Image deletion
 'deletedrevision' => 'Tasiwelt taqdimt $1 tettumḥa.',
@@ -2875,6 +2906,7 @@ $1',
 'filedelete-missing' => 'Afaylu « $1 » ur yezmer ara ad yetwekkes acku ulac-it.',
 'filedelete-old-unregistered' => 'Lqem n ufaylu « $1 » ulac-it deg taffa n isefka.',
 'filedelete-current-unregistered' => 'Afaylu « $1 » ulac-it deg taffa n isefka.',
+'filedelete-archive-read-only' => 'Akaram n aɣbaṛ « $1 » ur yezmer ara ad yetbeddel sɣur aqeddac.',
 
 # Browsing diffs
 'previousdiff' => '← Amgirred ssabeq',
@@ -2888,9 +2920,15 @@ Lukan a t-tesseqdceḍ yezmer ad yexsser aselkim inek/inem.",
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|asebtar|isebtar}}',
 'file-info' => 'tiddi n ufaylu: $1, anaw n MIME: $2',
 'file-info-size' => '$1 × $2 pixel, tiddi n ufaylu: $3, anaw n MIME: $4',
+'file-info-size-pages' => '$1 × $2 iferdisen, tiddi n ufaylu : $3, tawsit MIME : $4, $5 {{PLURAL:$5|asebtar|isebtar}}',
 'file-nohires' => 'Ulac resolution i tameqqrant fell-as.',
 'svg-long-desc' => 'Afaylu SVG, tabadut n $1 × $2 pixel, lqedd : $3',
+'svg-long-desc-animated' => 'Afaylu SVG yettewliwilen , tiddi $1 x $2 iferdisen, tiddi n ufaylu : $3',
+'svg-long-error' => 'Afaylu SVG ur yeɣbel ara : $1',
 'show-big-image' => 'Afaylu aneṣli',
+'show-big-image-preview' => 'Tiddi n azaraskan agi : $1.',
+'show-big-image-other' => '{{PLURAL:$2|Tabadut|Tibuda}} nniḍen : $1.',
+'show-big-image-size' => '$1 × $2 iferdisen',
 'file-info-gif-looped' => 'deg taglult',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|tugna|tugniwin}}',
 'file-info-png-looped' => 'deg taglult',
@@ -2981,6 +3019,7 @@ Izdayen nniḍen ɣef yiwen ajerriḍ llan d tisuraf, am isebtar ɣef anta tugna
 'exif-jpeginterchangeformatlength' => 'Tiddi s itamḍanen n isefka JPEG',
 'exif-whitepoint' => 'Tiniskit n uqqa amellal',
 'exif-primarychromaticities' => 'Tiniskit n tizwaranin',
+'exif-ycbcrcoefficients' => 'Imuskiren YCbCr',
 'exif-referenceblackwhite' => 'Azalen n tamselɣut aberkan d umellal',
 'exif-datetime' => 'Azmez n ubeddel',
 'exif-imagedescription' => 'Aglam n tugna',
@@ -3037,6 +3076,8 @@ Izdayen nniḍen ɣef yiwen ajerriḍ llan d tisuraf, am isebtar ɣef anta tugna
 'exif-scenecapturetype' => 'Tawsit n tuddma n usayes',
 'exif-gaincontrol' => 'Aḥkam n urrbeḥ',
 'exif-contrast' => 'Amyeẓli',
+'exif-saturation' => 'Aserhwu',
+'exif-sharpness' => 'Tezdeg',
 'exif-devicesettingdescription' => 'Aglam n tawila n allal',
 'exif-subjectdistancerange' => 'Ameccaq n tamsalt',
 'exif-imageuniqueid' => 'Asulay asuf n tugna',
@@ -3054,13 +3095,31 @@ Izdayen nniḍen ɣef yiwen ajerriḍ llan d tisuraf, am isebtar ɣef anta tugna
 'exif-gpsdop' => 'Tiseddi n akat',
 'exif-gpsspeedref' => 'Aferdis n tazzla n unermas GPS',
 'exif-gpsspeed' => 'Tazzla n unermas GPS',
+'exif-gpstrackref' => 'Tamesɣult i tanila n uwliwel',
 'exif-gpstrack' => 'Tanila n uwliwel',
+'exif-gpsimgdirectionref' => 'Tamesɣult i tanila n tugna',
 'exif-gpsimgdirection' => 'Tanila n tugna',
+'exif-gpsmapdatum' => 'Anagraw akalɣa yetseqdacen',
+'exif-gpsdestlatituderef' => 'Tamesɣult i turrut n userken',
 'exif-gpsdestlatitude' => 'Turrut n userken',
+'exif-gpsdestlongituderef' => 'Tamesɣult i tazegrart n userken',
 'exif-gpsdestlongitude' => 'Tazegrart n userken',
+'exif-gpsdestbearingref' => 'Tamesɣult i anker n userken',
+'exif-gpsdestbearing' => 'Anker n userken',
+'exif-gpsdestdistanceref' => 'Tamesɣult i umeccaq ar userken',
 'exif-gpsdestdistance' => 'Ameccaq ar userken',
+'exif-gpsprocessingmethod' => 'Isem n tarrayt n usekker n GPS',
 'exif-gpsareainformation' => 'Isem n taɣzut GPS',
 'exif-gpsdatestamp' => 'Azmez GPS',
+'exif-gpsdifferential' => 'Aseɣti aneẓlay GPS',
+'exif-jpegfilecomment' => 'Awennit n ufaylu JPEG',
+'exif-keywords' => 'Awalen yufraren',
+'exif-worldregioncreated' => 'Aẓi n Umaḍal deg anwa tawlaft agi tetwadem',
+'exif-countrycreated' => 'Tamurt deg anta tawlaft agi tetwadem',
+'exif-countrycodecreated' => 'Angal n tamurt deg anta tawlaft agi tetwadem',
+'exif-provinceorstatecreated' => 'Tamnaḍt neɣ Awanak deg anwa tawlaft agi tetwadem',
+'exif-citycreated' => 'Tamdint deg anta tawlaft agi tetwadem',
+'exif-sublocationcreated' => 'Amur n temdint deg anwa tawlaft agi tetwadem',
 'exif-worldregiondest' => 'Timnaḍin n umaḍal yebeqqeḍen',
 'exif-countrydest' => 'Timura yebeqqeḍen',
 'exif-countrycodedest' => 'Tangalt n tamurt yebeqqeḍen',
@@ -3077,6 +3136,7 @@ Izdayen nniḍen ɣef yiwen ajerriḍ llan d tisuraf, am isebtar ɣef anta tugna
 'exif-fixtureidentifier' => 'Isem n uferdis aslagan',
 'exif-locationdest' => 'Amḍiq yebeqqeḍen',
 'exif-locationdestcode' => 'Tangalt n umḍiq yebeqqeḍen',
+'exif-objectcycle' => 'Taswiɛt n wass i amedia agi yessefra-d',
 'exif-contact' => 'Tilɣa n unermis',
 'exif-writer' => 'Ameskar',
 'exif-languagecode' => 'Tutlayt',
@@ -3107,6 +3167,7 @@ Izdayen nniḍen ɣef yiwen ajerriḍ llan d tisuraf, am isebtar ɣef anta tugna
 'exif-pngfilecomment' => 'Awennit n ufaylu PNG',
 'exif-disclaimer' => 'Ur-tamasit',
 'exif-contentwarning' => 'Alɣu ɣef ugbur',
+'exif-giffilecomment' => 'Awennit n ufaylu GIF',
 'exif-intellectualgenre' => 'Tawsit n uferdis',
 'exif-subjectnewscode' => 'Angal n usentel',
 'exif-scenecode' => 'Angal n usayes IPTC',
@@ -3117,6 +3178,7 @@ Izdayen nniḍen ɣef yiwen ajerriḍ llan d tisuraf, am isebtar ɣef anta tugna
 'exif-originalimagewidth' => 'Tehri n tugna uqbel att ili tetwalssurret',
 
 # Exif attributes
+'exif-compression-1' => 'War asekkusem',
 'exif-compression-2' => 'CCITT Agraw 3 Teɣzef n usettengel Huffman yetbeddlen n tasekta 1',
 'exif-compression-3' => 'CCITT Agraw 3 asettengel n fax',
 'exif-compression-4' => 'CCITT Agraw 4 asettengel n fax',
@@ -3368,6 +3430,34 @@ Ma mačči d *kečč/kem*, ilaq ad lkemeḍ aseɣwen agi deg iminig :
 
 $5
 
+Angal n usentem-agi ad yemmut ass $4.',
+'confirmemail_body_changed' => 'Amdan, ahat d kečč/kem, seg tansa IP $1,
+yebeddel tansa email yeqqenen ar umiḍan "$2" n {{SITENAME}}.
+
+Iwakken ad sergegeḍ amiḍan agi d-win-inek/inem dɣa iwakken
+an sermed tiwura n tirawt deg {{SITENAME}},
+ilaq ad lkemeḍ aseɣwen agi deg iminig :
+
+$3
+
+Ma mačči d *kečč/kem*, ilaq ad lkemeḍ aseɣwen agi deg iminig :
+
+$5
+
+Angal n usentem-agi ad yemmut ass $4.',
+'confirmemail_body_set' => 'Amdan, ahat d kečč/kem, seg tansa IP $1,
+yebeddel tansa email n umiḍan "$2" s ttagi ɣef {{SITENAME}}.
+
+Iwakken ad sergegeḍ amiḍan agi d-win-inek/inem dɣa iwakken
+an sermed tiwura n tirawt deg {{SITENAME}},
+ilaq ad lkemeḍ aseɣwen agi deg iminig :
+
+$3
+
+Ma amiḍan agi mačči d * aylak/aylam*, ilaq ad lkemeḍ aseɣwen agi deg iminig :
+
+$5
+
 Angal n usentem-agi ad yemmut ass $4.',
 'confirmemail_invalidated' => 'Aragag n tansa email yettusemmet',
 'invalidateemail' => 'Semmet aragag n tansa email',
@@ -3383,11 +3473,13 @@ Angal n usentem-agi ad yemmut ass $4.',
 'confirmrecreate' => "Amseqdac [[User:$1|$1]] ([[User talk:$1|Meslay]]) yemḥu asebter-agi beɛd ad tebdiḍ abeddel axaṭer:
 : ''$2''
 G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-agi.",
+'confirmrecreate-noreason' => 'Amseqdac [[User:$1|$1]] ([[User talk:$1|Meslay]]) yemḥu asebter-agi wannag tebedduḍ att beddeleḍ. Ilaq ad sergegeḍ tebɣiḍ ad snulfuḍ tikkelt nniḍen asebtar agi.',
 'recreate' => 'Ɛiwed xleq',
 
 # action=purge
 'confirm_purge_button' => 'Seɣbel',
 'confirm-purge-top' => 'Mḥu lkac n usebter-agi?',
+'confirm-purge-bottom' => 'Asenger n usebtar yetwekkes-it seg tazarkatut n ubeqqeḍ dɣa yetḥettem lqem ines aneggaru ad yetbeqqeḍ.',
 
 # action=watch/unwatch
 'confirm-watch-button' => 'Seɣbel',
@@ -3452,6 +3544,9 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'watchlistedit-normal-done' => '{{PLURAL:$1|1 wezwel yettwakkes|$1 yizwal ttwakksen}} seg wumuɣ n uɛessi inek:',
 'watchlistedit-raw-title' => 'Beddel umuɣ n uɛessi (raw)',
 'watchlistedit-raw-legend' => 'Beddel umuɣ n uɛessi (raw)',
+'watchlistedit-raw-explain' => 'Izwal n umuɣ inek/inem n uɛassi llan beqqeḍen ddaw agi dɣa tzemreḍ ad ten beddeleḍ s timerniwt neɣ tukksa seg umuɣ (yiwen azwel s azagg).
+Ma tfukeḍ, senned ɣef taqeffalt « {{int:Watchlistedit-raw-submit}} » ddaw agi.
+Tzemreḍ daɣen [[Special:EditWatchlist|ad seqdeceḍ amaẓrag amagnu]].',
 'watchlistedit-raw-titles' => 'Izwal:',
 'watchlistedit-raw-submit' => 'Amucceḍ n umuɣ n uɛassi',
 'watchlistedit-raw-done' => 'Umuɣ n uɛessi inek yettubeddel.',
@@ -3494,11 +3589,18 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'version-ext-colheader-description' => 'Aglam',
 'version-ext-colheader-credits' => 'Imeskaren',
 'version-license-title' => 'Turagt i $1',
+'version-license-not-found' => 'Ur d-n-uffa ara talɣut tummidt n turagt i usiɣzef agi.',
 'version-credits-title' => 'Isnemmiren i $1',
+'version-credits-not-found' => 'Ur d-n-uffa ara talɣut tummidt n isnemmiren i usiɣzef agi.',
 'version-poweredby-credits' => "Wiki agi yetelḥu s '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'nniḍen',
 'version-poweredby-translators' => 'imsuqqlen n translatewiki.net',
 'version-credits-summary' => 'Nebɣa an snemmer imdanen agi i uttekki nsen ar [[Special:Version|MediaWiki]].',
+'version-license-info' => 'MediaWiki d aseɣẓan ilelli, Tzemreḍ at alsferqeḍ neɣ at beddeleḍ ɣef leḥsab n irmawen n Turagt Tazayezt Tamatut GNU aken i ttid suffeɣ Free Software Foundation ; ihi lqem 2 n turagt, neɣ (aken i tebɣiḍ) akkw lqem taqdimt.
+
+MediaWiki yetwafreq iwakken  ad yenfeɛ, maca ULAC AḌMAN, war aḍman n TANEZZUT neɣ ASSEZGI I ASSEQDEC AMAẒLAY. Zeṛ Turagt Tazayezt Tamatut GNU i tilɣa tummidin.
+
+Ahat teḍḍfeḍ [{{SERVER}}{{SCRIPTPATH}}/COPYING anɣel n Turagt Tazayezt Tamatut GNU] s ahil agi, mulac, aru i Free Software Foundation, Inc., 51, aɣlad Franklin, annag wis 5, Boston, MA 02110-1301, Iwunak Yeddukklen n Temrikt neɣ [//www.gnu.org/licenses/old-licenses/gpl-2.0.html ɣer-itt uqqin].',
 'version-software' => 'Iseɣẓanen i serkeben',
 'version-software-product' => 'Afaris',
 'version-software-version' => 'Lqem',
@@ -3507,6 +3609,9 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'version-entrypoints-header-url' => 'Tansa URL',
 
 # Special:Redirect
+'redirect' => 'Alssniled s ufaylu, amseqdac, asebtar neɣ ID n tacaggart',
+'redirect-legend' => 'Alsnil ɣer asebtar neɣ afaylu',
+'redirect-summary' => 'Asebtar agi uslig yetalssnil ɣeṛ ufaylu (isem n ufaylu yetwefked), asebtar (ID n tacaggart neɣ n usebtar id yetwafken) neɣ asebtar n umseqdac (ID umḍin n umseqdac yetwefked). Asseqdec : [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], neɣ [[{{#Special:Redirect}}/user/101]].',
 'redirect-submit' => 'Ruḥ',
 'redirect-lookup' => 'Anadi :',
 'redirect-value' => 'Azal :',
@@ -3518,6 +3623,7 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Anadi n allusen',
+'fileduplicatesearch-summary' => 'Anadi n ineɣlan n ifuyla kifkif ɣef leḥsab n udsil nsen n udway.',
 'fileduplicatesearch-legend' => 'Nadi allus',
 'fileduplicatesearch-filename' => 'Isem n ufaylu :',
 'fileduplicatesearch-submit' => 'Nadi',
@@ -3529,6 +3635,8 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 # Special:SpecialPages
 'specialpages' => 'isebtar usligen',
 'specialpages-note-top' => 'Aglam',
+'specialpages-note' => '* Isebtar usligen imugna.
+* <span class="mw-specialpagerestricted">Isebtar usligen ukrifen.</span>',
 'specialpages-group-maintenance' => 'Iṛabulen n ibeddi',
 'specialpages-group-other' => 'Isebtar usligen nniḍen',
 'specialpages-group-login' => 'Asulu / assiggez',
@@ -3590,8 +3698,12 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'dberr-again' => 'Ɛreḍ ad arǧuḍ kra n tisdidin dɣa sismeḍ.',
 'dberr-info' => '(Ulamek an qqen ar uqeddac n taffa n isefka : $1)',
 'dberr-info-hidden' => '(Ulamek an qqen ar uqeddac n taffa n isefka)',
+'dberr-usegoogle' => 'Tzemreḍ ad ɛreḍeḍ anadi s Google deg ukud agi.',
+'dberr-outofdate' => 'Ani i imataren nsen n ugbur nneɣ zemren ad yetwagaren',
+'dberr-cachederror' => 'Wagi d anɣel yeffren n usebtar i tebɣiḍ, yezmer ad yetwagar.',
 
 # HTML forms
+'htmlform-invalid-input' => 'Igna nnulfan-d s kra n azalen',
 'htmlform-select-badoption' => 'Azal id efkeḍ mačči d taxtiṛit i ɣeblen.',
 'htmlform-int-invalid' => 'Azal id efkeḍ mačči d amḍan ummid.',
 'htmlform-float-invalid' => 'Azal id efkeḍ mačči d amḍan.',
@@ -3605,6 +3717,10 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'htmlform-yes' => 'Ih',
 'htmlform-chosen-placeholder' => 'Fren taxtiṛit',
 
+# SQLite database support
+'sqlite-has-fts' => '$1 s anadi deg uḍris ummid yezmer',
+'sqlite-no-fts' => '$1 war anadi deg uḍris ummid yezmer',
+
 # New logging system
 'logentry-delete-delete' => '$1 {{GENDER:$2|yemḥa}} asebtar $3',
 'logentry-delete-restore' => '$1 {{GENDER:$2|yerred|terred}} asebtar $3',
@@ -3623,33 +3739,87 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'revdelete-content-unhid' => 'agbur yebeqqeḍen',
 'revdelete-summary-unhid' => 'agzul n ubeddil yebeqqeḍen',
 'revdelete-uname-unhid' => 'isem n umseqdac yebeqqeḍen',
+'revdelete-restricted' => 'ikrafen snesen i inedbalen',
+'revdelete-unrestricted' => 'ikrafen tetwakksen i inedbalen',
 'logentry-move-move' => '$1 {{GENDER:$2|yebeddel isem|tebeddel isem}} n usebtar seg $3 ar $4',
 'logentry-move-move-noredirect' => '$1 {{GENDER:$2|yebeddel isem|tebeddel isem}} n usebtar seg $3 ar $4 war anegzum',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|yesiweḍ|tesiweḍ}} asebtar seg $3 ar $4 nnig anegzum',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|yesiweḍ|tesiweḍ}} asebtar $3 ar $4 nnig anegzum war tuǧǧin n unegzum',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|yecṛeḍ|tecṛeḍ}} tacaggart $4 n usebtar $3 am aken tetwalsɣer',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|yecṛeḍ|tecṛeḍ}} s uwurman tacaggart $4 n usebtar $3 am aken tetwalsɣer',
+'logentry-newusers-newusers' => 'Amiḍan n umseqdac $1 {{GENDER:$2|yetwaxleq}}',
+'logentry-newusers-create' => 'Amiḍan n umseqdac $1 {{GENDER:$2|yetwaxleq}}',
+'logentry-newusers-create2' => 'Amiḍan n umseqdac $3 {{GENDER:$2|yetwaxleq}} sɣur $1',
+'logentry-newusers-byemail' => 'Amiḍan n umseqdac $3 {{GENDER:$2|yetwaxleq}} sɣur $1 dɣa awal n uɛaddi yetwaceggaɛ deg email',
+'logentry-newusers-autocreate' => 'Amiḍan n umseqdac $1 {{GENDER:$2|yetwaxleq}} s uwurman',
+'logentry-rights-rights' => '$1 {{GENDER:$2|yebeddel|tebeddel}} amyili ar ugraw i $3 n $4 ar $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|yebeddel|tebeddel}} amyili ar ugraw i $3',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|yettwasmel|tettwasmel}} s uwurman seg $4 ar $5',
 'rightsnone' => '(ulaḥedd)',
 
 # Feedback
+'feedback-bugornote' => 'Ma teḥgiḍ iman-ik/im ad gelmeḍ agnu atekni i tilɣa tummidtin, [$1 ɛeyyen ɣef anezri].
+Mulac, tzemreḍ ad seqdeceḍ tiferkit ddaw agi. Awennit inek/inem ad yetwernu ar usebtar « [$3 $2] », s isem-ik/im n umseqdac d iminig i tseqdeceḍ.',
 'feedback-subject' => 'Asentel :',
 'feedback-message' => 'Izen :',
 'feedback-cancel' => 'Semmewet',
 'feedback-submit' => 'Ceggaɛ iwenniten',
 'feedback-adding' => 'Rnud iwenniten inek/inem ar usebter...',
 'feedback-error1' => 'Tuccḍa : Agmuḍ n API ur yetwaɛqel ara',
+'feedback-error2' => 'Tuccḍa  : abeddel yexṣer',
 'feedback-error3' => 'Tuccḍa : Ulac tamrarut n API',
+'feedback-thanks' => 'Tanemmirt ! Awennit inek/inem yeffeɣ-d ɣef usebtar "[$2 $1]".',
 'feedback-close' => 'D ayen',
+'feedback-bugcheck' => 'D ayen igerrzen ! Senqed kan ma mačči d yiwen n [$1 inezriyen i n-sen yakan].',
+'feedback-bugnew' => 'Senqedeɣ. Ɛeyyen anezri amaynut',
 
 # Search suggestions
 'searchsuggest-search' => 'Nadi',
+'searchsuggest-containing' => 'yesɛan...',
 
 # API errors
+'api-error-badaccess-groups' => 'Ur tesɛiḍ ara turagt ad smireḍ ifuyla ɣef wiki agi.',
 'api-error-badtoken' => 'Tuccḍa tagensit : yir « tiddest ».',
+'api-error-copyuploaddisabled' => 'Issenɣal seg URL nsan ɣef aqeddac agi.',
+'api-error-duplicate' => '{{PLURAL:$1|[Yella yakan $2 afaylu nniḍen]|[Llan yakan $2 ifuyla nniḍen]}} ɣef asmel agi s ugbur am winna.',
+'api-error-duplicate-archive' => '{{PLURAL:$1|[Yella yakan $2 afaylu nniḍen]|[Llan yakan $2 ifuyla nniḍen]}} ɣef asmel agi s ugbur am winna, maca {{PLURAL:$1|yetwekkes|tetwekksen}}.',
+'api-error-duplicate-archive-popup-title' => 'Sleg {{PLURAL:$1|afaylu|ifuyla}} yetwekksen yakan.',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Afaylu|Ifuyla}} islagen.',
+'api-error-empty-file' => 'Afaylu id ceggɛeḍ d-ilem.',
+'api-error-emptypage' => 'Asnulfu n isebtar ilemawen ur yareg ara.',
 'api-error-fetchfileerror' => 'Tuccḍa tagensit : Yella kra ur yaɛeddan ara s luwqem deg tiririt n ufaylu.',
+'api-error-fileexists-forbidden' => 'Afaylu s isem "$1" yella yakan, dɣa ur nezmer ara at n-mzey.',
+'api-error-fileexists-shared-forbidden' => 'Afaylu s isem "$1" yella yakan deg ukaram n ifuyla yettwacerken, dɣa ur nezmer ara at n-mzey.',
+'api-error-file-too-large' => 'Afaylu id cegɛed d-ameqqṛan aṭas.',
+'api-error-filename-tooshort' => 'Isem n ufaylu d-awezzlan aṭas.',
+'api-error-filetype-banned' => 'Tawsit agi n ufaylu d-tazanbagt.',
+'api-error-filetype-banned-type' => "''' « .$1 » '''mačči d {{PLURAL:$4|tawit n ufaylu yesɛan turagt|tiwsatin n ufaylu yesɛan turagt}}. 
+{{PLURAL:$3|Tawit n ufaylu yesɛan turagt d-wagi :|Tiwsatin n ufaylu yesɛan turagt d-wigi :}} $2.",
+'api-error-filetype-missing' => 'Asiɣzef n ufaylu agi ulac-it.',
+'api-error-hookaborted' => 'Abeddel i ɛerdeḍ ad xedmeḍ yetweḥbes s tamdeyt n usiɣzef.',
 'api-error-http' => 'Tuccḍa tagensit : ur yezmer ara ad yeqqen ar uqeddac.',
+'api-error-illegal-filename' => 'Isem n ufaylu agi ur yeɣbel ara.',
+'api-error-internal-error' => 'Tuccḍa tagensit : Yella kra ur yelḥa ara s luwqem deg usekker n taktert inek/inem ɣef wiki agi.',
+'api-error-invalid-file-key' => 'Tuccḍa tagensit : ulac afaylu deg uḥraz akudan.',
+'api-error-missingparam' => 'Tuccḍa tagensit : Xuṣṣen iɣewwaren deg tuttra inek/inem.',
+'api-error-missingresult' => 'Tuccḍa tagensit : Ur nezmer ara ad n-ini ma anɣel yetwaxeddem.',
+'api-error-mustbeloggedin' => 'Ilaq ad qqeneḍ iwakken ad zdemeḍ ifuyla.',
+'api-error-mustbeposted' => 'Tuccḍa tagensit : Tuttra agi teḥwaǧ tarrayt HTTP POST.',
+'api-error-noimageinfo' => 'Azdam yetwaxdam, maca aqeddac ur d-yefka ara tilɣa ɣef ufaylu.',
+'api-error-nomodule' => 'Tuccḍa tagensit : Ulac azegrir n ussenɣel.',
 'api-error-ok-but-empty' => 'Tuccḍa tagensit : Ulac tamrarut seg uqeddac.',
+'api-error-overwrite' => 'Asefxes n ufaylu yellan ur yeɣbel ara.',
 'api-error-stashfailed' => 'Tuccḍa tagensit : aqeddac ur yezmer ara ad yekles afaylu uɛḍil.',
+'api-error-publishfailed' => 'Tuccḍa tagensit : Aqeddac yexṣer imi yebɣa ad yessuffeɣ afaylu akudan.',
+'api-error-stasherror' => 'Tella tuccḍa imi d-zdemeḍ afaylu iwakken ad yetweffer.',
+'api-error-timeout' => 'Aqeddac ur d-yerra ara awal deg ukud yeḥeṛṛen.',
 'api-error-unclassified' => 'Yefkad anezri warisem.',
 'api-error-unknown-code' => 'Tuccḍa warisem : « $1 »',
+'api-error-unknown-error' => 'Tuccḍa tagensit : Yella kra yexṣren deg ussenɣel n ufaylu inek.',
 'api-error-unknown-warning' => 'Alɣu warisem : "$1".',
 'api-error-unknownerror' => 'Tuccḍa warisem : « $1 »',
+'api-error-uploaddisabled' => 'Azdam yensa ɣef wiki agi.',
+'api-error-verification-error' => 'Ahat afaylu agi yefsed, neɣ asiɣzef ines ur yeɣbel ara.',
 
 # Durations
 'duration-seconds' => '$1 {{PLURAL:$1|tasint|tisinin}}',
@@ -3662,11 +3832,41 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'duration-centuries' => '$1 {{PLURAL:$1|timiḍi|timiḍa}}',
 'duration-millennia' => '$1 {{PLURAL:$1|agimseggwas|agimseggwasen}}',
 
+# Image rotation
+'rotate-comment' => 'Tugna tesseblelli s $1 {{PLURAL:$1|tafesna|tifesniwin}} deg tanila n tisegnatin n tamrint',
+
 # Limit report
+'limitreport-title' => 'Isefka n asekkey n umsisleḍ :',
+'limitreport-cputime' => 'Akud CPU n usseqdac',
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|tasint|tisinin}}',
+'limitreport-walltime' => 'Akud ilaw n usseqdac',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|tasint|tisinin}}',
+'limitreport-ppvisitednodes' => 'Amḍan n tikerwas n azarsekkar i rezzan',
+'limitreport-ppgeneratednodes' => 'Amḍan n tikerwas n azarsekkar yettarewen',
+'limitreport-postexpandincludesize' => 'Tiddi n isekcam sakin aderrec',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|atamḍan|itamḍanen}}',
+'limitreport-templateargumentsize' => 'Tiddi n tiɣiret n talɣa',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|atamḍan|itamḍanen}}',
+'limitreport-expansiondepth' => 'Talqayt n aderrec tameqrant ugaren tiyaḍ',
+'limitreport-expensivefunctioncount' => 'Amḍan n tiwura n tasleṭ ɣlayen',
 
 # Special:ExpandTemplates
+'expandtemplates' => 'Aderrec n talɣiwin',
+'expand_templates_intro' => "Asebtar agi uslig yeqbel aḍris wiki dɣa i tɛemmed ad xeddemeḍ aderrec n talɣiwin yellan deg-es.
+Yetexddem daɣen aderrec n tiseɣnin n parser am
+<code><nowiki>{{</nowiki>#language:...}}</code> dɣa imuttiyen am
+<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.
+Yetexddem aderrec n akkw ayen yella yesegrer s <nowiki>'''{{ }}'''</nowiki>.",
+'expand_templates_title' => 'Azwel n usebtar, ma angal yetseqdac {{FULLPAGENAME}}, etc. :',
+'expand_templates_input' => 'Aḍris wiki source :',
+'expand_templates_output' => 'Aḍris wiki id yefka sakin aderrec',
+'expand_templates_xml_output' => 'Agemmuḍ agrawan n tasleṭ, deg umasal XML',
+'expand_templates_html_output' => 'Asuffeɣ s HTML aneṣli',
+'expand_templates_ok' => 'Seɣbel',
+'expand_templates_remove_comments' => 'Ekkes iwenniten',
+'expand_templates_remove_nowiki' => 'Yetkkes ticraḍ <nowiki> deg ugemmuḍ',
+'expand_templates_generate_xml' => 'Zeṛ talɣa n useklu n tasleṭ XML',
+'expand_templates_generate_rawhtml' => 'Beqqeḍ HTML aneṣli',
 'expand_templates_preview' => 'Azaraskan',
 
 # Unknown messages
index 087c5d6..a1af2c8 100644 (file)
@@ -24,7 +24,6 @@ $namespaceNames = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'ربطو خط کشیدگی',
-'tog-justify' => 'خطان  برابری',
 'tog-hideminor' => 'موجودہ وختہ بیرو تبدیلیان موژار معمولی ترمیماتن کھوشتاؤے',
 'tog-hidepatrolled' => 'موجودہ وختہ بیرو تبدیلیان موژار گشتی ترمیماتن کھوشتاؤے',
 'tog-newpageshidepatrolled' => 'جدید صفحاتی فہرستہ گشتی صفحاتن کھوشاوے',
@@ -33,9 +32,7 @@ $messages = array(
 'tog-numberheadings' => 'سرخیانتے تان لمبار دیت',
 'tog-showtoolbar' => 'تدوینی اوزاردانن پشاؤے ( JavaScript ضرورت بوی)',
 'tog-editondblclick' => 'کلکہ صفحاتن  ترمیم (JavaScript ضرورت بوی)',
-'tog-editsection' => '[ترمیم] روابطان ذریعا سطری ترمیم کاریو فعال کورے',
 'tog-editsectiononrightclick' => 'سطری عنواناتا فروسکی کلکو ذریعا سطری ترمیم کاریو فعال ساؤزاوے',
-'tog-showtoc' => 'فہرستِ مندرجات پشاؤے (3 زیات سرخی والا صفحاتن بچے)',
 'tog-rememberpassword' => 'ھیہ کمپیوٹرا مہ داخل کاردو معلوماتن یاد لاکھے(کم از کم $1 {{PLURAL:$1|بس|بس}})',
 'tog-watchcreations' => 'مہ مرتب کاردو صفحاتن مہ  زیرِنظرفہرستہ شامل کورے',
 'tog-watchdefault' => 'مہ ترمیم کاردو صفحاتن مہ  زیرِنظرفہرستہ شامل کورے',
@@ -605,7 +602,6 @@ $1 (صفحہ موجود نیکی)',
 'lineno' => 'لکیر $1:',
 'compareselectedversions' => 'منتخب متـنو موازنہ',
 'editundo' => 'استرجع',
-'diff-multi' => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one user|$2 users}} not shown)',
 
 # Search results
 'searchresults' => 'تلاشو نتیجہ',
index cbda026..4908dca 100644 (file)
@@ -56,7 +56,6 @@ $namespaceAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Bınê gırey de xete bonce:',
-'tog-justify' => 'Paragrafu eyar ke',
 'tog-hideminor' => 'Vurnayisunê senıku pela vurnayisunê peyênu de wedare',
 'tog-hidepatrolled' => 'Vurnayisunê qontrolkerdu pela vurnayisê peyêni de wedare',
 'tog-newpageshidepatrolled' => 'Pelunê qontrolkerdu lista pelunê newu de wedare',
@@ -203,7 +202,6 @@ $messages = array(
 'vector-action-protect' => 'Bısevekne',
 'vector-action-undelete' => 'Esterıtene peyser bıcê',
 'vector-action-unprotect' => 'Rake',
-'vector-simplesearch-preference' => 'Tewsiyunê cıcêraişiê raverberdu rake (Teyna vector skin de)',
 'vector-view-create' => 'Vıraze',
 'vector-view-edit' => 'Bıvurne',
 'vector-view-history' => 'Tarixi basne',
@@ -469,7 +467,7 @@ Nustena cı qontrol ke.',
 Kerem ke, oncia bıcerrebne.',
 'wrongpasswordempty' => 'Parola thale kota cı.
 Kerem ke, oncia bıcerrebne.',
-'passwordtooshort' => 'Paroley tewr senık ebe {{PLURAL:$1|1 karakter|$1 karakteru}} gunê derg bê.',
+'passwordtooshort' => 'Paroley gunê tewr senık ebe {{PLURAL:$1|1 karakter|$1 karakteru}} derg bê.',
 'password-name-match' => 'Parola sıma namê sımaê karberi ra gunê ferqın bo.',
 'password-login-forbidden' => 'Namê nê karberi u gurenaena parola qedeğen biya.',
 'mailmypassword' => 'E-mail sera parola newiye bırusne',
@@ -691,7 +689,6 @@ Eke şertê ilawekerdey ke niyê ro, idarekerê bini {{SITENAME}} de nêşikinê
 'lineno' => 'Rêza $1i:',
 'compareselectedversions' => 'Varyantunê weçinıtun têver sane',
 'editundo' => 'peyser bia',
-'diff-multi' => '({{PLURAL:$1|Jü çımraviarnaena wertey|$1 çımraviarnaena wertey}} terefê {{PLURAL:$2|zu karberi|$2 karberu}} ra nêasnino)',
 
 # Search results
 'searchresults' => 'Neticê cıfeteliyaene',
@@ -792,11 +789,11 @@ Diqet kerê, beno ke tedeestê {{SITENAME}} uza endi rozane niyê.",
 'yourrealname' => 'Namo rastıkên:',
 'yourlanguage' => 'Zon:',
 'yourvariant' => 'Varyant:',
-'yournick' => 'İmza:',
+'yournick' => 'Leqeme:',
 'badsig' => "İmza kala nêvêrdiye.
 Etiketê ''HTML''i qontrol ke.",
 'badsiglength' => 'İmza to zaf derga.
-Gunê $1 {{PLURAL:$1|herfe|herfun}} ra senık bo.',
+A gunê ebe $1 {{PLURAL:$1|herfe|herfu}} ra jêde mebo.',
 'yourgender' => 'Cınsiyet:',
 'gender-male' => 'Cüamêrd',
 'gender-female' => 'Cüanıke',
@@ -1195,7 +1192,7 @@ Tı şikina sewiya sevekiyaena na pele bıvurnê, hema yê nae sevekiyaena qedem
 'contributions-title' => '$1 de iştırakê karberi',
 'mycontris' => 'İştıraqi',
 'contribsub2' => 'Serba $1 ($2)',
-'uctop' => '(ser)',
+'uctop' => '(rocane)',
 'month' => 'Asme ra (u ravêr):',
 'year' => 'Serre ra (u ravêr):',
 
@@ -1252,7 +1249,7 @@ Tı şikina sewiya sevekiyaena na pele bıvurnê, hema yê nae sevekiyaena qedem
 'contribslink' => 'iştıraqi',
 'emaillink' => 'e-poste bırusne',
 'autoblocker' => 'Sıma otomatikmen kılit biy, çıke adresa sımawa \'\'IP\'\'y terefê "[[User:$1|$1]]" gurenina.
-Sebebê kılit-biyaena $1\'i: "$2"o',
+Sebebê kılitbiyaena $1\'i "$2"o',
 'blocklogpage' => 'Protokolê kilıti',
 'blocklogentry' => '[[$1]] hata peyê $2 $3ine kilıt bi',
 'reblock-logentry' => 'kilıt-kerdena [[$1]]i hata peyê $2 $3ine vurnê',
index 815b471..6bfe265 100644 (file)
@@ -393,16 +393,13 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'سىلتەمەنىڭ استىن سىز:',
-'tog-justify' => 'ەجەلەردى ەنى بويىنشا تۋرالاۋ',
 'tog-hideminor' => 'جۋىقتاعى وزگەرىستەردەن شاعىن وڭدەمەلەردى جاسىر',
 'tog-extendwatchlist' => 'باقىلاۋ ٴتىزىمدى ۇلعايت (بارلىق جارامدى وزگەرىستەردى كورسەت)',
 'tog-usenewrc' => 'كەڭەيتىلگەن جۋىقتاعى وزگەرىستەر (JavaScript)',
 'tog-numberheadings' => 'باس جولداردى وزدىكتىك نومىرلە',
 'tog-showtoolbar' => 'وڭدەۋ قۋرالدار جولاعىن كورسەت (JavaScript)',
 'tog-editondblclick' => 'قوس نۇقىمداپ وڭدەۋ (JavaScript)',
-'tog-editsection' => 'بولىمدەردى [وڭدەۋ] سىلتەمەسىمەن وڭدەۋىن قوس',
 'tog-editsectiononrightclick' => 'ٴبولىم تاقىرىبىن وڭ نۇقۋمەن وڭدەۋىن قوس (JavaScript)',
-'tog-showtoc' => 'مازمۇنىن كورسەت (3-تەن ارتا ٴبولىمى بارىلارعا)',
 'tog-rememberpassword' => 'كىرگەنىمدى وسى كومپيۋتەردە ۇمىتپا (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'tog-watchcreations' => 'مەن باستاعان بەتتەردى باقىلاۋ تىزىمىمە ۇستە',
 'tog-watchdefault' => 'مەن وڭدەگەن بەتتەردى باقىلاۋ تىزىمىمە ۇستە',
@@ -1074,7 +1071,6 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
 'lineno' => 'جول ٴنومىرى $1:',
 'compareselectedversions' => 'بولەكتەنگەن نۇسقالاردى سالىستىرۋ',
 'editundo' => 'جوققا شىعارۋ',
-'diff-multi' => '(اراداعى $1 تۇزەتۋ كورسەتىلمەگەن.)',
 
 # Search results
 'searchresults' => 'ىزدەۋ ناتىيجەلەرى',
@@ -1676,7 +1672,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watchmethod-list' => 'جۋىقتاعى وزگەرىستەر ٴۇشىن باقىلاۋلى بەتتەردى تەكسەرۋ',
 'watchlistcontains' => 'باقىلاۋ تىزىمىڭىزدە $1 بەت بار.',
 'iteminvalidname' => "'$1' دانادا اقاۋ بار — جارامسىز اتاۋ…",
-'wlnote' => "تومەندە سوڭعى {{PLURAL:$2|ساعاتتا|'''$2''' ساعاتتا}} بولعان, {{PLURAL:$1|جۋىقتاعى وزگەرىس|جۋىقتاعى '''$1''' وزگەرىس}} كورسەتىلەدى.",
 'wlshowlast' => 'سوڭعى $1 ساعاتتاعى, $2 كۇندەگى, $3 بولعان وزگەرىستى كورسەتۋ',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -2145,7 +2140,6 @@ MediaWiki جۇيەسىنىڭ [[{{#special:Import}}|سىرتتان الۋ بەت
 'tooltip-pt-watchlist' => 'وزگەرىستەرىن باقىلاپ تۇرعان بەتتەر ٴتىزىمىم.',
 'tooltip-pt-mycontris' => 'ۇلەستەرىمدىڭ ٴتىزىمى',
 'tooltip-pt-login' => 'كىرۋىڭىزدى ۇسىنامىز, ول مىندەتتى ەمەس.',
-'tooltip-pt-anonlogin' => 'كىرۋىڭىزدى ۇسىنامىز, بىراق, ول مىندەتتى ەمەس.',
 'tooltip-pt-logout' => 'شىعۋ',
 'tooltip-ca-talk' => 'ماعلۇمات بەتتى تالقىلاۋ',
 'tooltip-ca-edit' => 'بۇل بەتتى وڭدەي الاسىز. ساقتاۋدىڭ الدىندا «قاراپ شىعۋ» باتىرماسىن نۇقىڭىز.',
index 05e0a99..e3c08bc 100644 (file)
@@ -362,7 +362,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Сілтеменің астын сызу:',
-'tog-justify' => 'Ежелерді ені бойынша туралау',
 'tog-hideminor' => 'Жуықтағы өзгерістерден шағын өңдемелерді жасыру',
 'tog-hidepatrolled' => 'Тексерілген өңдеулерді соңғы өзгерістер тізімінде көрсетпеу',
 'tog-newpageshidepatrolled' => 'Тексерілген беттерді жаңа беттер тізімінде көрсетпеу',
@@ -583,7 +582,7 @@ $messages = array(
 'categorypage' => 'Санат бетін қарау',
 'viewtalkpage' => 'Талқылау бетін қарау',
 'otherlanguages' => 'Басқа тілдерде',
-'redirectedfrom' => '($1 Ð±ÐµÑ\82Ñ\96нен Ð°Ð¹Ð´Ð°Ñ\82Ñ\8bлған)',
+'redirectedfrom' => '($1 Ð±ÐµÑ\82Ñ\96нен Ð±Ð°Ò\93Ñ\8bÑ\82Ñ\82алған)',
 'redirectpagesub' => 'Айдату беті',
 'lastmodifiedat' => 'Бұл беттің соңғы өзгертілген кезі: $2, $1.',
 'viewcount' => 'Бұл бет {{PLURAL:$1|бір рет|$1 уақыт}} қатыналған.',
@@ -1139,7 +1138,7 @@ IP-мекенжайыңыз бұл беттің түзету тарихында
 'edit-gone-missing' => 'Бетті жаңарту мүмкін емес.
 Мүмкін, бұл бет жойылған.',
 'edit-conflict' => 'Өңдемелер қақтығысы.',
-'postedit-confirmation' => 'Сіздің өңдемеңіз сақталды.',
+'postedit-confirmation' => 'Өңдемеңіз сақталды.',
 'edit-already-exists' => 'Жаңа бет жасау мүмкін емес.
 Ол әлдеқашан бар.',
 'defaultmessagetext' => 'Әдепкі мәтіні',
@@ -1304,7 +1303,11 @@ $1",
 'showhideselectedversions' => 'Бөлектенген нұсқаларды көрсет/жасыр',
 'editundo' => 'жоққа шығару',
 'diff-empty' => '(айырмашылығы жоқ)',
-'diff-multi' => '($2 қатысушының арадағы $1 түзетуі көрсетілмеген)',
+'difference-missing-revision' => 'Бұл ($1) {{PLURAL:$2|нұсқа|$2 нұсқалар}} айырмашылығы табылмады.
+
+
+Бұл әлте жойылған беттің нұсқалар айырмашылығының сілтемесі.
+Егжей-тегжейін [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналынан] таба аласыз.',
 
 # Search results
 'searchresults' => 'Іздеу нәтижелері',
@@ -1841,6 +1844,7 @@ URL дұрыс екендігін және торап істеп тұрғаны
 'listfiles_size' => 'Өлшемі',
 'listfiles_description' => 'Сипаттамасы',
 'listfiles_count' => 'Нұсқалары',
+'listfiles-show-all' => 'Суреттердің ескі нұсқаларын да қамту',
 'listfiles-latestversion' => 'Соңғы нұсқасы',
 'listfiles-latestversion-yes' => 'Иә',
 'listfiles-latestversion-no' => 'Жоқ',
index 459af18..0df6226 100644 (file)
@@ -356,16 +356,13 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Siltemeniñ astın sız:',
-'tog-justify' => 'Ejelerdi eni boýınşa twralaw',
 'tog-hideminor' => 'Jwıqtağı özgeristerden şağın öñdemelerdi jasır',
 'tog-extendwatchlist' => 'Baqılaw tizimdi ulğaýt (barlıq jaramdı özgeristerdi körset)',
 'tog-usenewrc' => 'Keñeýtilgen jwıqtağı özgerister (JavaScript)',
 'tog-numberheadings' => 'Bas joldardı özdiktik nomirle',
 'tog-showtoolbar' => 'Öñdew qwraldar jolağın körset (JavaScript)',
 'tog-editondblclick' => 'Qos nuqımdap öñdew (JavaScript)',
-'tog-editsection' => 'Bölimderdi [öñdew] siltemesimen öñdewin qos',
 'tog-editsectiononrightclick' => 'Bölim taqırıbın oñ nuqwmen öñdewin qos (JavaScript)',
-'tog-showtoc' => 'Mazmunın körset (3-ten arta bölimi barılarğa)',
 'tog-rememberpassword' => 'Kirgenimdi osı komp′ywterde umıtpa (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'tog-watchcreations' => 'Men bastağan betterdi baqılaw tizimime üste',
 'tog-watchdefault' => 'Men öñdegen betterdi baqılaw tizimime üste',
@@ -1037,7 +1034,6 @@ Añğartpa: bağıttaw siltemelerin qoldanğanda bul bağan qaýta qoýıladı.'
 'lineno' => 'Jol nömiri $1:',
 'compareselectedversions' => 'Bölektengen nusqalardı salıstırw',
 'editundo' => 'joqqa şığarw',
-'diff-multi' => '(Aradağı $1 tüzetw körsetilmegen.)',
 
 # Search results
 'searchresults' => 'İzdew nätïjeleri',
@@ -1639,7 +1635,6 @@ Bul bettiñ jäne baýlanıstı talqılaw betiniñ keleşektegi özgeristeri mı
 'watchmethod-list' => 'jwıqtağı özgerister üşin baqılawlı betterdi tekserw',
 'watchlistcontains' => 'Baqılaw tizimiñizde $1 bet bar.',
 'iteminvalidname' => "'$1' danada aqaw bar — jaramsız ataw…",
-'wlnote' => "Tömende soñğı {{PLURAL:$2|sağatta|'''$2''' sağatta}} bolğan, {{PLURAL:$1|jwıqtağı özgeris|jwıqtağı '''$1''' özgeris}} körsetiledi.",
 'wlshowlast' => 'Soñğı $1 sağattağı, $2 kündegi, $3 bolğan özgeristi körsetw',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -2109,7 +2104,6 @@ Wïkï-aparw üşin sırttan alw barlıq äreketter [[{{#special:Log}}/import|s
 'tooltip-pt-watchlist' => 'Özgeristerin baqılap turğan better tizimim.',
 'tooltip-pt-mycontris' => 'Ülesterimdiñ tizimi',
 'tooltip-pt-login' => 'Kirwiñizdi usınamız, ol mindetti emes.',
-'tooltip-pt-anonlogin' => 'Kirwiñizdi usınamız, biraq, ol mindetti emes.',
 'tooltip-pt-logout' => 'Şığw',
 'tooltip-ca-talk' => 'Mağlumat betti talqılaw',
 'tooltip-ca-edit' => 'Bul betti öñdeý alasız. Saqtawdıñ aldında «Qarap şığw» batırmasın nuqıñız.',
index 17f4827..e6329fc 100644 (file)
@@ -262,7 +262,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'គូសបន្ទាត់ក្រោម​តំណភ្ជាប់៖',
-'tog-justify' => 'តម្រឹម​កថាខណ្ឌ',
 'tog-hideminor' => 'លាក់​កំណែប្រែតិចតួច​ពីបញ្ជីបន្លាស់ប្ដូរថ្មីៗ',
 'tog-hidepatrolled' => 'លាក់​កំណែប្រែ​ដែល​បាន​ល្បាតពីបញ្ជីបន្លាស់ប្ដូរ​ថ្មីៗ',
 'tog-newpageshidepatrolled' => 'លាក់​ទំព័រ​ដែល​បាន​ល្បាតពី​បញ្ជី​ទំព័រ​ថ្មី',
@@ -425,7 +424,6 @@ $messages = array(
 'vector-action-protect' => 'ការពារ',
 'vector-action-undelete' => 'ឈប់លុបចោល',
 'vector-action-unprotect' => 'ប្ដូរការការពារ',
-'vector-simplesearch-preference' => 'ប្រើរបារស្វែងរកសាមញ្ញ (សំរាប់តែសំបកវ៉ិចទ័រប៉ុណ្ណោះ)',
 'vector-view-create' => 'បង្កើត​',
 'vector-view-edit' => 'កែប្រែ​',
 'vector-view-history' => 'មើល​ប្រវត្តិ​',
@@ -1308,7 +1306,6 @@ $1",
 'showhideselectedversions' => 'បង្ហាញ​/លាក់​កំណែប្រែ​ដែលបាន​ជ្រើសយក',
 'editundo' => 'មិនធ្វើវិញ',
 'diff-empty' => '(គ្មានភាពខុសគ្នា)',
-'diff-multi' => '({{PLURAL:$1|កំណែប្រែកម្រិតបង្គួរមួយ|កំណែប្រែកម្រិតបង្គួរចំនួន $1}}មិនត្រូវបានបង្ហាញ)',
 'diff-multi-manyusers' => '({{PLURAL:$1|កំណែប្រែកម្រិតបង្គួរមួយ|កំណែប្រែកម្រិតបង្គួរចំនួន $1}}មិនត្រូវបានបង្ហាញ)',
 'difference-missing-revision' => ' {{PLURAL:$2|រកមិនឃើញ|រកមិនឃើញ}}{{PLURAL:$2|កំណែមួយ|កំណែចំនួន $2}} របស់ភាពខុសគ្នានេះ ($1) ទេ។
 
@@ -1381,7 +1378,7 @@ $1",
 'prefs-labs' => 'មុខងារពិសេសថ្មីៗដែលស្ថិតក្រោមការពិសោធន៍នៅឡើយ',
 'prefs-user-pages' => 'ទំព័រអ្នកប្រើប្រាស់',
 'prefs-personal' => 'ប្រវត្តិរូប',
-'prefs-rc' => 'á\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aថ្មីៗ',
+'prefs-rc' => 'á\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bâ\80\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bថ្មីៗ',
 'prefs-watchlist' => 'បញ្ជីតាមដាន',
 'prefs-watchlist-days' => 'ចំនួនថ្ងៃត្រូវបង្ហាញក្នុងបញ្ជីតាមដាន៖',
 'prefs-watchlist-days-max' => 'អតិបរមា $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}}',
index 17e2f71..57cca30 100644 (file)
@@ -67,7 +67,6 @@ $digitGroupingPattern = "##,##,###";
 $messages = array(
 # User preference toggles
 'tog-underline' => 'ಲಿಂಕುಗಳ ಕೆಳಗೆ ಗೆರೆ ತೋರಿಸಿ',
-'tog-justify' => 'ಪರಿಚ್ಛೇದಗಳ ಬದಿಗಳನ್ನು ಸಮನಾಗಿಸು',
 'tog-hideminor' => 'ಚಿಕ್ಕಪುಟ್ಟ ಬದಲಾವಣೆಗಳನ್ನು ಅಡಗಿಸಿ',
 'tog-hidepatrolled' => 'ಪಹರೆಯಲ್ಲಿ ಆದ ಸಂಪಾದನೆಗಳನ್ನು ಇತ್ತೀಚೆಗಿನ ಬದಲಾವಣೆಗಳಲ್ಲಿ ಅಡಗಿಸು',
 'tog-newpageshidepatrolled' => 'ಪಹರೆಯಲ್ಲಿ ಆದ ಪುಟಗಳನ್ನು ಹೊಸ ಪುಟಗಳ ಪಟ್ಟಿಯಲ್ಲಿ ಅಡಗಿಸು',
@@ -76,9 +75,7 @@ $messages = array(
 'tog-numberheadings' => 'ತಲೆಬರಹಗಳಿಗೆ ಅಂಕಿಗಳನ್ನು ತೋರಿಸು',
 'tog-showtoolbar' => 'ಸಂಪಾದನೆಯ ಉಪಕರಣಗಳ ಪಟ್ಟಿಯನ್ನು ತೋರು',
 'tog-editondblclick' => 'ಎರಡು ಬಾರಿ ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ ಪುಟವು ಸಂಪಾದಿಸುವಂತಾಗಲಿ',
-'tog-editsection' => 'ಪುಟದ ವಿಭಾಗಗಳನ್ನು [ಬದಲಾಯಿಸು] ಕೊಂಡಿಗಳನ್ನು ಒತ್ತುವುದರಿಂದ ಸಂಪಾದನೆ ಮಾಡುವಂತೆ ಇರಲಿ',
 'tog-editsectiononrightclick' => 'ಪುಟದ ವಿಭಾಗಗಳನ್ನು ಅವುಗಳ ಶೀರ್ಷಿಕೆಯನ್ನು ಎರಡು ಬಾರಿ ಕ್ಲಿಕ್ ಮಾಡಿ ಸಂಪಾದನೆ ಮಾಡುವಂತೆ ಇರಲಿ',
-'tog-showtoc' => 'ಪರಿವಿಡಿಯನ್ನು ತೋರಿಸು (ಮೂರಕ್ಕಿಂತ ಹೆಚ್ಚು ತಲೆಬರಹಗಳನ್ನು ಹೊಂದಿರುವ ಪುಟಗಳಿಗೆ)',
 'tog-rememberpassword' => 'ಈ ಗಣಕಯಂತ್ರದಲ್ಲಿ ನನ್ನ ಲಾಗಿನ್ ನೆನಪಿನಲ್ಲಿಟ್ಟುಕೊ (ಗರಿಷ್ಠ $1 {{PLURAL:$1|ದಿನದ|ದಿನಗಳ}}ವರೆಗೆ)',
 'tog-watchcreations' => 'ನಾನು ಪ್ರಾರಂಭಿಸುವ ಲೇಖನಗಳನ್ನು ನನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರಿಸು',
 'tog-watchdefault' => 'ನಾನು ಸಂಪಾದಿಸುವ ಪುಟಗಳನ್ನು ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರಿಸು',
@@ -472,7 +469,7 @@ $2',
 'welcomecreation-msg' => 'ನಿಮ್ಮ ಖಾತೆ ತೆರೆಯಲಾಗಿದೆ.ನಿಮ್ಮ [[Special:Preferences|{{SITENAME}} preferences]]ಬದಲಾಯಿಸಲು ಮರೆಯಬೇಡಿ.',
 'yourname' => 'ನಿಮ್ಮ ಬಳಕೆಯ ಹೆಸರು',
 'userlogin-yourname' => 'ಬಳಕೆದಾರ ಹೆಸರು',
-'userlogin-yourname-ph' => 'ನಿಮ್ಮ ಸದಸ್ಯನಾಮ ("ಯೋಸರ್ನೇಮ್") ಬರಿರಿ',
+'userlogin-yourname-ph' => 'ನಿಮ್ಮ ಸದಸ್ಯನಾಮ ಬರೆಯಿರಿ',
 'createacct-another-username-ph' => 'ಸದಸ್ಯನಾಮ ("ಯೋಸರ್ನೇಮ್") ಬರಿರಿ',
 'yourpassword' => 'ನಿಮ್ಮ ಪ್ರವೇಶಪದ',
 'userlogin-yourpassword' => 'ಪ್ರವೇಶಪದ',
@@ -482,7 +479,7 @@ $2',
 'createacct-yourpasswordagain' => 'ಪ್ರವೇಶಪದವನ್ನು ಧೃಡೀಕರಿಸಿ',
 'createacct-yourpasswordagain-ph' => 'ಪ್ರವೇಶಪದವನ್ನು ಮತ್ತೊಮ್ಮೆ ನಮೂದಿಸಿ',
 'remembermypassword' => 'ಈ ಗಣಕಯಂತ್ರದಲ್ಲಿ ನನ್ನ ಲಾಗಿನ್ ನೆನಪಿನಲ್ಲಿಟ್ಟುಕೊ (ಗರಿಷ್ಠ $1 {{PLURAL:$1|ದಿನದ|ದಿನಗಳ}}ವರೆಗೆ)',
-'userlogin-remembermypassword' => 'ನನ್ನನ್ನ ಲೋಗ್ಗೆದ್ ಇನ್ ಎ ಇಡಿ.',
+'userlogin-remembermypassword' => 'ನನ್ನನ್ನು ಲಾಗಿನ್ ಆಗಿಯೇ ಇಡಿ',
 'userlogin-signwithsecure' => 'ಸುರಕ್ಷಿತವಾದ ಕನೆಕ್ಷನ್ ಉಪಯೋಗಿಸಿ.',
 'yourdomainname' => 'ನಿಮ್ಮ ಕ್ಷೇತ್ರ:',
 'password-change-forbidden' => 'ನೀವು ಈ ವಿಕಿಯಲ್ಲಿ ಪ್ರವೇಶಪದವನ್ನು ಬದಲಾಯಿಸಲು ಸಾದ್ಯವಿಲ್ಲ.',
@@ -502,7 +499,7 @@ $2',
 'gotaccount' => "ಈಗಾಗಲೇ ಖಾತೆಯಿದೆಯೇ? '''$1'''.",
 'gotaccountlink' => 'ಲಾಗ್ ಇನ್',
 'userlogin-resetlink' => 'ನಿಮ್ಮ ಲಾಗಿನ್ ವಿವರಗಳನ್ನು ಮರೆತಿದ್ದೀರಾ?',
-'userlogin-resetpassword-link' => 'à²\97à³\81ಪà³\8dತಪದವನà³\8dನà³\81 à²®à²°à²¿à²¤à³\81 à²¹à³\8aಯಿತ ?',
+'userlogin-resetpassword-link' => 'ನಿಮà³\8dಮ à²ªà³\8dರವà³\87ಶಪದ à²®à²°à³\86ತಿರà³\87?',
 'createacct-join' => 'ನಿಮ್ಮ ಮಾಹಿತಿಯನ್ನು ಕೆಳಗೆ ನಮೂದಿಸಿ',
 'createacct-emailrequired' => 'ಇ-ಮೇಲ್ ವಿಳಾಸ:',
 'createacct-email-ph' => 'ನಿಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ',
@@ -876,7 +873,6 @@ $2',
 'compareselectedversions' => 'ಆಯ್ಕೆ ಮಾಡಿದ ಆವೃತ್ತಿಗಳನ್ನು ಹೊಂದಾಣಿಕೆ ಮಾಡಿ ನೋಡಿ',
 'showhideselectedversions' => 'ಆಯ್ದ ಆವೃತ್ತಿಗಳನ್ನು ತೋರಿಸು/ಅಡಗಿಸು',
 'editundo' => 'ಹಿಂದಿನಂತೆ',
-'diff-multi' => '(ಮಧ್ಯದಲ್ಲಿ {{PLURAL:$2|ಒಬ್ಬ|$2}} ಸದಸ್ಯರಿಂದ ಆಗಿರುವ {{PLURAL:$1|೧ ಬದಲಾವಣೆಯನ್ನು|$1 ಬದಲಾವಣೆಗಳನ್ನು}} ತೋರಿಸಲಾಗಿಲ್ಲ.)',
 
 # Search results
 'searchresults' => 'ಶೋಧನೆಯ ಫಲಿತಾಂಶಗಳು',
index 1735256..fc44a79 100644 (file)
@@ -364,7 +364,6 @@ $dateFormats = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => '링크에 밑줄:',
-'tog-justify' => '문단 정렬하기',
 'tog-hideminor' => '최근 바뀜에서 사소한 편집을 숨기기',
 'tog-hidepatrolled' => '최근 바뀜에서 검토한 편집을 숨기기',
 'tog-newpageshidepatrolled' => '새 문서 목록에서 검토한 문서를 숨기기',
@@ -527,7 +526,6 @@ $messages = array(
 'vector-action-protect' => '보호',
 'vector-action-undelete' => '되살리기',
 'vector-action-unprotect' => '보호 설정 바꾸기',
-'vector-simplesearch-preference' => '단순한 검색 막대 사용하기 (벡터 스킨 전용)',
 'vector-view-create' => '만들기',
 'vector-view-edit' => '편집',
 'vector-view-history' => '역사',
@@ -732,7 +730,7 @@ URL을 잘못 입력하였거나, 잘못된 링크를 따라갔을 수 있습니
 'badtitletext' => '요청한 문서 제목이 잘못되었거나, 비어있거나, 잘못된 인터위키 제목으로 링크했습니다.
 문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.',
 'perfcached' => '다음 자료는 캐시된 것이므로 새로 바뀐 내용을 반영하지 못할 수도 있습니다. 캐시에 최대 {{PLURAL:$1|$1개의 결과}}가 있습니다.',
-'perfcachedts' => '다음 자료는 캐시된 것으로, $1에 마지막으로 새로 고쳐졌습니다.  캐시에 최대 {{PLURAL:$4|결과 $4개}}가 있습니다.',
+'perfcachedts' => '다음 자료는 캐시된 것으로, $1에 마지막으로 새로 고쳐졌습니다. 캐시에 최대 {{PLURAL:$4|결과 $4개}}가 있습니다.',
 'querypage-no-updates' => '이 문서의 새로 고침이 현재 비활성화되어 있습니다.
 이 문서의 자료를 잠시 동안 새로 고치지 않을 것입니다.',
 'viewsource' => '원본 보기',
@@ -782,9 +780,9 @@ $2',
 'welcomecreation-msg' => '계정이 만들어졌습니다.
 [[Special:Preferences|{{SITENAME}} 사용자 환경 설정]]을 바꿀 수 있습니다.',
 'yourname' => '사용자 이름:',
-'userlogin-yourname' => '사용자 이름',
-'userlogin-yourname-ph' => '사용자 이름을 입력하세요',
-'createacct-another-username-ph' => '사용자 이름을 입력하세요',
+'userlogin-yourname' => '사용자 계정 이름',
+'userlogin-yourname-ph' => '사용자 계정 이름을 입력하세요',
+'createacct-another-username-ph' => '사용자 계정 이름을 입력하세요',
 'yourpassword' => '비밀번호:',
 'userlogin-yourpassword' => '비밀번호',
 'userlogin-yourpassword-ph' => '비밀번호를 입력하세요',
@@ -813,7 +811,7 @@ $2',
 'createaccount' => '계정 만들기',
 'gotaccount' => '계정이 이미 있다면, $1.',
 'gotaccountlink' => '로그인하세요',
-'userlogin-resetlink' => '사용자 이름이나 비밀번호를 잊으셨나요?',
+'userlogin-resetlink' => '로그인 정보를 잊으셨나요?',
 'userlogin-resetpassword-link' => '비밀번호를 잊으셨나요?',
 'helplogin-url' => 'Help:로그인',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|로그인에 관한 도움말]]',
@@ -834,12 +832,12 @@ $2',
 'createacct-imgcaptcha-ph' => '위에 보이는 텍스트를 입력하세요',
 'createacct-submit' => '계정 만들기',
 'createacct-another-submit' => '다른 계정 만들기',
-'createacct-benefit-heading' => '{{SITENAME}}(은)는 여러분과 같은 사람으로 이루어집니다.',
+'createacct-benefit-heading' => '{{SITENAME}} 프로젝트는 여러분과 같은 사람들이 만듭니다.',
 'createacct-benefit-body1' => '{{PLURAL:$1|편집}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|문서}}',
 'createacct-benefit-body3' => '최근 {{PLURAL:$1|기여자}}',
 'badretype' => '입력한 비밀번호가 일치하지 않습니다.',
-'userexists' => 'ì\9e\85ë ¥í\95\98ì\8b  ì\82¬ì\9a©ì\9e\90 ì\9d´ë¦\84ì\9d´ ì\9d´ë¯¸ ë\93±ë¡\9dë\90\98ì\96´ 있습니다.
+'userexists' => 'ì\9e\85ë ¥í\95\9c ì\82¬ì\9a©ì\9e\90 ê³\84ì \95 ì\9d´ë¦\84ì\9d´ ì\9d´ë¯¸ ì\82¬ì\9a©ë\90\98ê³  있습니다.
 다른 이름을 선택하세요.',
 'loginerror' => '로그인 오류',
 'createacct-error' => '계정 만들기 오류',
@@ -853,23 +851,23 @@ $2',
 쿠키 사용을 활성화한 다음 다시 시도하세요.',
 'nocookiesfornew' => '요청의 출처를 확인할 수 없기 때문에 사용자 계정이 만들어지지 않았습니다.
 쿠키를 허용한 것을 확인한 후에 이 문서를 새로 고치고 나서 다시 시도하세요.',
-'noname' => '사용자 이름이 올바르지 않습니다.',
+'noname' => '사용자 계정 이름이 올바르지 않습니다.',
 'loginsuccesstitle' => '로그인 성공',
 'loginsuccess' => "'''{{SITENAME}}에 \"\$1\" 계정으로 로그인했습니다.'''",
 'nosuchuser' => '"$1" 사용자가 존재하지 않습니다.
-사용자 이름은 대소문자를 구별합니다.
+사용자 계정 이름은 대소문자를 구별합니다.
 철자가 맞는지 확인해주세요. [[Special:UserLogin/signup|새 계정을 만들 수도 있습니다]].',
 'nosuchusershort' => '이름이 "$1"인 사용자는 없습니다.
 철자가 맞는지 확인하세요.',
-'nouserspecified' => '사용자 이름을 입력하지 않았습니다.',
+'nouserspecified' => '사용자 계정 이름을 입력하지 않았습니다.',
 'login-userblocked' => '이 사용자는 차단되었습니다. 로그인할 수 없습니다.',
 'wrongpassword' => '입력한 비밀번호가 잘못되었습니다.
 다시 시도하세요.',
 'wrongpasswordempty' => '비밀번호를 입력하지 않았습니다.
 다시 시도하세요.',
 'passwordtooshort' => '비밀번호는 {{PLURAL:$1|$1 글자}} 이상이어야 합니다.',
-'password-name-match' => '비밀번호는 사용자 이름과 반드시 달라야 합니다.',
-'password-login-forbidden' => '이 사용자 이름과 비밀번호는 사용할 수 없습니다.',
+'password-name-match' => '비밀번호는 사용자 계정 이름과 반드시 달라야 합니다.',
+'password-login-forbidden' => '이 사용자 계정 이름과 비밀번호는 사용할 수 없습니다.',
 'mailmypassword' => '비밀번호 재설정',
 'passwordremindertitle' => '{{SITENAME}}의 새 임시 비밀번호',
 'passwordremindertext' => '$1 IP 주소에서 누군가가 아마 자신이 {{SITENAME}} ($4)의 새 비밀번호를 요청했습니다.
@@ -907,7 +905,7 @@ $2',
 지금 로그인하여 비밀번호를 바꾸십시오.
 
 실수로 계정을 잘못 만들었다면 이 메시지는 무시해도 됩니다.',
-'usernamehasherror' => '사용자 이름에는 해시 문자가 들어갈 수 없습니다',
+'usernamehasherror' => '사용자 계정 이름에는 해시 문자가 들어갈 수 없습니다',
 'login-throttled' => '로그인에 연속으로 실패하였습니다.
 $1 기다렸다가 다시 시도하세요.',
 'login-abort-generic' => '로그인에 실패했습니다 - 중지됨',
@@ -932,8 +930,8 @@ $1 기다렸다가 다시 시도하세요.',
 'retypenew' => '새 비밀번호 재입력:',
 'resetpass_submit' => '비밀번호를 설정하고 로그인하기',
 'changepassword-success' => '비밀번호가 성공적으로 바뀌었습니다!',
-'changepassword-throttled' => '로그인에 연속으로 실패하였습니다.
-$1 기다렸다가 다시 시도하세요.',
+'changepassword-throttled' => '최근 너무 많이 로그인을 시도했습니다.
+$1 뒤에 다시 시도하세요.',
 'resetpass_forbidden' => '비밀번호를 바꿀 수 없습니다',
 'resetpass-no-info' => '이 특수 문서에 직접 접근하려면 반드시 로그인해야 합니다.',
 'resetpass-submit-loggedin' => '비밀번호 바꾸기',
@@ -950,7 +948,7 @@ $1 기다렸다가 다시 시도하세요.',
 'passwordreset-legend' => '비밀번호 재설정',
 'passwordreset-disabled' => '이 위키에서는 비밀번호를 재설정할 수 없습니다.',
 'passwordreset-emaildisabled' => '이 위키에서 이메일 기능이 비활성화되어 있습니다.',
-'passwordreset-username' => '사용자 이름:',
+'passwordreset-username' => '사용자 계정 이름:',
 'passwordreset-domain' => '도메인:',
 'passwordreset-capture' => '발송 결과 이메일을 보시겠습니까?',
 'passwordreset-capture-help' => '이 상자에 체크하면 이메일이 발송된 즉시 임시 비밀번호가 담긴 이메일을 볼 수 있습니다.',
@@ -1013,7 +1011,7 @@ $1 기다렸다가 다시 시도하세요.',
 'italic_sample' => '기울인 글씨',
 'italic_tip' => '기울인 글씨',
 'link_sample' => '링크 제목',
-'link_tip' => 'ë\82´ë¶\80 ê³ ë¦¬',
+'link_tip' => 'ì\95\88쪽 ë§\81í\81¬',
 'extlink_sample' => 'http://www.example.com 사이트 이름',
 'extlink_tip' => '바깥 링크 (주소 앞에 http://가 있어야 합니다)',
 'headline_sample' => '제목',
@@ -1193,7 +1191,7 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 'nocreatetext' => '{{SITENAME}}에서 새로운 문서를 만드는 것은 제한되어 있습니다.
 이미 존재하는 다른 문서를 편집하거나, [[Special:UserLogin|로그인하거나 계정을 만들]] 수 있습니다.',
 'nocreate-loggedin' => '새 문서를 만들 권한이 없습니다.',
-'sectioneditnotsupported-title' => '부분 편집 지원 안 됨',
+'sectioneditnotsupported-title' => '부분 편집이 지원되지 않음',
 'sectioneditnotsupported-text' => '이 문서에서는 문단 편집을 지원하지 않습니다.',
 'permissionserrors' => '권한 오류',
 'permissionserrorstext' => '해당 명령을 수행할 권한이 없습니다. 다음 {{PLURAL:$1|이유}}를 확인해보세요:',
@@ -1219,9 +1217,9 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 'invalid-content-data' => '잘못된 내용 데이터입니다',
 'content-not-allowed-here' => '"$1" 내용은 [[$2]] 문서예 허용하지 않습니다',
 'editwarning-warning' => '이 페이지에서 벗어나면 저장하지 않은 바뀜이 모두 사라집니다.
-로그인을 했다면, 환경 설정의 "편집 상자"에서 이 경고를 띄우지 않도록 설정할 수 있습니다.',
-'editpage-notsupportedcontentformat-title' => '지원하지 않는 컨텐츠 형식',
-'editpage-notsupportedcontentformat-text' => '컨텐츠 모델 $2 에서는 컨텐츠형식 $1을 지원하지 않습니다.',
+로그인을 했다면, 환경 설정의 "{{int:편집 상자}}"에서 이 경고를 띄우지 않도록 설정할 수 있습니다.',
+'editpage-notsupportedcontentformat-title' => '지원하지 않는 내용 형식',
+'editpage-notsupportedcontentformat-text' => '내용 형식 $1(은)는 $2 내용 모델에서 지원하지 않습니다.',
 
 # Content models
 'content-model-wikitext' => '위키텍스트',
@@ -1256,6 +1254,7 @@ $2개 보다 적게 {{PLURAL:$2|써야}} 하지만 {{PLURAL:$1|지금은 $1개
 편집 되돌리기를 완료하려면 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 저장해주세요.',
 'undo-failure' => '중간의 다른 편집과 충돌하여 이 편집을 되돌릴 수 없습니다.',
 'undo-norev' => '문서가 없거나 삭제되었기 때문에 편집을 되돌릴 수 없습니다.',
+'undo-nochange' => '편집이 이미 되돌려진 것으로 나타납니다.',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|토론]])의 $1판 편집을 되돌림',
 'undo-summary-username-hidden' => '숨겨진 사용자가 $1 판을 되돌림',
 
@@ -1348,7 +1347,7 @@ $2개 보다 적게 {{PLURAL:$2|써야}} 하지만 {{PLURAL:$1|지금은 $1개
 * 부적절한 개인 정보
 *: 집 주소, 전화번호, 주민등록번호 등",
 'revdelete-legend' => '보이기 제한을 설정',
-'revdelete-hide-text' => 'í\8c\90 ë\82´ì\9a©',
+'revdelete-hide-text' => 'í\8c\90 ë¬¸ì\9e\90ì\97´',
 'revdelete-hide-image' => '파일을 숨기기',
 'revdelete-hide-name' => '명령 내용과 대상을 숨기기',
 'revdelete-hide-comment' => '편집 요약',
@@ -1437,7 +1436,8 @@ $1",
 'showhideselectedversions' => '선택한 판을 보이기/숨기기',
 'editundo' => '편집 취소',
 'diff-empty' => '(차이 없음)',
-'diff-multi' => '({{PLURAL:$2|한 사용자의|사용자 $2명의}} {{PLURAL:$1|중간의 편집 $1개}} 숨겨짐)',
+'diff-multi-sameuser' => '(같은 사용자에 의한 {{PLURAL:$1|하나의 중간 편집|$1개의 중간 편집}}이 숨겨짐)',
+'diff-multi-otherusers' => '({{PLURAL:$2|한 명의 사용자|$2명의 사용자}}에 의한 {{PLURAL:$1|$1개의 중간 편집}}이 숨겨짐)',
 'diff-multi-manyusers' => '({{PLURAL:$2|한 사용자의|사용자 $2명 이상의}} {{PLURAL:$1|중간의 편집 $1개}} 숨겨짐)',
 'difference-missing-revision' => '문서 비교에서 {{PLURAL:$2|하나|$2개}}의 판($1)을 찾을 수 {{PLURAL:$2|없습니다}}.
 
@@ -1458,7 +1458,8 @@ $1",
 'shown-title' => '쪽마다 {{PLURAL:$1|결과}} $1개씩 보기',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) 보기',
 'searchmenu-exists' => "'''이 위키에 \"[[:\$1]]\"의 이름을 가진 문서가 있습니다.'''",
-'searchmenu-new' => "'''이 위키에 \"[[:\$1]]\" 문서를 만드세요!'''",
+'searchmenu-new' => '<strong>이 위키에 "[[:$1]]" 문서를 만드세요!</strong>
+{{PLURAL:$2|0=|검색으로 찾은 문서들을 참조하세요.}}',
 'searchprofile-articles' => '본문',
 'searchprofile-project' => '도움말 및 프로젝트 문서',
 'searchprofile-images' => '멀티미디어',
@@ -1467,7 +1468,7 @@ $1",
 'searchprofile-articles-tooltip' => '$1에서 검색',
 'searchprofile-project-tooltip' => '$1에서 검색',
 'searchprofile-images-tooltip' => '파일 검색',
-'searchprofile-everything-tooltip' => '모ë\93  ë¬¸ì\84\9c ê²\80ì\83\89\86 ë¡  ë¬¸ì\84\9c를 í\8f¬í\95¨)',
+'searchprofile-everything-tooltip' => '모ë\93  ë\82´ì\9a© (í\86 ë¡  ë¬¸ì\84\9c를 í\8f¬í\95¨) ê²\80ì\83\89',
 'searchprofile-advanced-tooltip' => '다음 설정한 이름공간에서 검색',
 'search-result-size' => '$1 ({{PLURAL:$2|1 단어|$2 단어}})',
 'search-result-category-size' => '{{PLURAL:$1|문서 1개|문서 $1개}}, {{PLURAL:$2|하위 분류 1개|하위 분류 $2개}}, {{PLURAL:$3|파일 1개|파일 $3개}}',
@@ -1484,7 +1485,8 @@ $1",
 'searchrelated' => '관련',
 'searchall' => '모두',
 'showingresults' => "'''$2'''번 부터의 {{PLURAL:$1|결과 '''1'''개|결과 '''$1'''개}}입니다.",
-'showingresultsnum' => "'''$2'''번 부터의 {{PLURAL:$3|결과 '''1'''개|결과 '''$3'''개}} 입니다.",
+'showingresultsinrange' => '#<strong>$2</strong>부터 #<strong>$3</strong>까지의 범위에서 <strong>$1</strong>개의 {{PLURAL:$1|결과}}가 아래에 보입니다.',
+'showingresultsnum' => "'''$2'''번 부터의 {{PLURAL:$3|결과 '''1'''개|결과 '''$3'''개}}입니다.",
 'showingresultsheader' => "'''$4''' 검색어에 대한 {{PLURAL:$5|결과 '''$3'''개 중 '''$1'''개|결과 '''$3'''개 중 '''$1 - $2'''번째}}",
 'search-nonefound' => '검색어와 일치하는 결과가 없습니다.',
 'powersearch-legend' => '고급 검색',
@@ -1543,7 +1545,7 @@ $1",
 'savedprefs' => '설정을 저장했습니다.',
 'timezonelegend' => '시간대:',
 'localtime' => '현지 시각:',
-'timezoneuseserverdefault' => '위키 기본 값($1)을 사용',
+'timezoneuseserverdefault' => '위키 기본값 사용 ($1)',
 'timezoneuseoffset' => '기타 (시차를 입력해주세요)',
 'servertime' => '서버 시각:',
 'guesstimezone' => '웹 브라우저 설정에서 가져오기',
@@ -1561,7 +1563,7 @@ $1",
 'prefs-searchoptions' => '검색',
 'prefs-namespaces' => '이름공간',
 'defaultns' => '다음 이름공간에서 검색:',
-'default' => '기본 값',
+'default' => '기본값',
 'prefs-files' => '파일',
 'prefs-custom-css' => '사용자 CSS',
 'prefs-custom-js' => '사용자 자바스크립트',
@@ -1585,7 +1587,7 @@ HTML 태그를 확인하세요.',
 'badsiglength' => '서명이 너무 깁니다.
 서명은 $1 {{PLURAL:$1|글자}}보다 짧아야 합니다.',
 'yourgender' => '어떤 성별로 표시되는 것을 선호합니까?',
-'gender-unknown' => '밝히고 싶지 않습니다.',
+'gender-unknown' => '밝히고 싶지 않습니다',
 'gender-male' => '위키 문서를 편집하는 남자입니다',
 'gender-female' => '위키 문서를 편집하는 여자입니다',
 'prefs-help-gender' => '이 항목은 선택 사항입니다.
@@ -1681,7 +1683,7 @@ HTML 태그를 확인하세요.',
 'right-move-subpages' => '문서와 하위 문서 이동하기',
 'right-move-rootuserpages' => '최상위 사용자 문서 이동',
 'right-movefile' => '파일 옮기기',
-'right-suppressredirect' => '문서 이동할 때 이전 이름으로 된 넘겨주기를 만들지 않기',
+'right-suppressredirect' => '문서을 옮길 때 원래 문서 이름으로 된 넘겨주기를 만들지 않기',
 'right-upload' => '파일 올리기',
 'right-reupload' => '이미 존재하는 파일을 다시 올리기',
 'right-reupload-own' => '자신이 이미 올린 파일 덮어쓰기',
@@ -1756,7 +1758,7 @@ HTML 태그를 확인하세요.',
 'action-createaccount' => '새 계정 만들기',
 'action-minoredit' => '이 편집을 사소한 편집으로 표시하기',
 'action-move' => '이 문서 옮기기',
-'action-move-subpages' => '하위 문서를 함께 옮길',
+'action-move-subpages' => '이 문서와 하위 문서를 함께 옮기기',
 'action-move-rootuserpages' => '최상위 사용자 문서를 이동할',
 'action-movefile' => '이 파일을 옮기기',
 'action-upload' => '이 파일을 올리기',
@@ -1798,7 +1800,7 @@ HTML 태그를 확인하세요.',
 'recentchanges-summary' => '위키의 최근 바뀜이 나와 있습니다.',
 'recentchanges-noresult' => '지정한 조건과 일치하는 주어진 기간 동안 바뀜이 없습니다.',
 'recentchanges-feed-description' => '위키의 최근 바뀜이 나와 있습니다.',
-'recentchanges-label-newpage' => '새 문서',
+'recentchanges-label-newpage' => '새로 만든 문서',
 'recentchanges-label-minor' => '사소한 편집',
 'recentchanges-label-bot' => '봇의 편집',
 'recentchanges-label-unpatrolled' => '아직 순찰하지 않은 편집',
@@ -2253,7 +2255,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'pageswithprop-legend' => '문서 속성이 있는 문서',
 'pageswithprop-text' => '이 문서는 특정 문서 속성을 사용한 문서를 나타냅니다.',
 'pageswithprop-prop' => '속성 이름:',
-'pageswithprop-submit' => '기',
+'pageswithprop-submit' => '기',
 'pageswithprop-prophidden-long' => '숨겨진 긴 텍스트 속성 값 ($1)',
 'pageswithprop-prophidden-binary' => '숨겨진 이진 속성 값 ($1)',
 
@@ -2323,8 +2325,16 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'protectedpages' => '보호된 문서 목록',
 'protectedpages-indef' => '오른쪽 조건에 맞는 보호만 보기',
 'protectedpages-cascade' => '연쇄적 보호만 보기',
-'protectedpages-noredirect' => '넘겨주기 숨김',
+'protectedpages-noredirect' => '넘겨주기를 숨기기',
 'protectedpagesempty' => '보호되어 있는 문서가 없습니다.',
+'protectedpages-timestamp' => '시간 기록',
+'protectedpages-page' => '문서',
+'protectedpages-expiry' => '만료 기한',
+'protectedpages-performer' => '사용자를 보호',
+'protectedpages-params' => '보호 매개변수',
+'protectedpages-reason' => '이유',
+'protectedpages-unknown-timestamp' => '알 수 없음',
+'protectedpages-unknown-performer' => '알 수 없는 사용자',
 'protectedtitles' => '만들기 보호된 표제어 목록',
 'protectedtitlesempty' => '해당 조건에 맞는 만들기 금지 표제어가 없습니다.',
 'listusers' => '사용자 목록',
@@ -2468,7 +2478,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'nowikiemailtitle' => '이메일이 허용되지 않음',
 'nowikiemailtext' => '이 사용자는 다른 사용자로부터의 이메일을 받지 않도록 설정하였습니다.',
 'emailnotarget' => '없는 사용자를 받는 이로 지정하였거나 사용자 이름이 잘못되었습니다.',
-'emailtarget' => '수신자 사용자 이름 입력',
+'emailtarget' => '받는 사용자 이름 입력',
 'emailusername' => '사용자 이름:',
 'emailusernamesubmit' => '확인',
 'email-legend' => '{{SITENAME}}의 다른 사용자에게 이메일을 보내기',
@@ -2514,7 +2524,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'watchmethod-list' => '최근 편집을 확인하고자 주시된 문서 확인',
 'watchlistcontains' => '{{PLURAL:$1|문서 $1개}}를 주시하고 있습니다.',
 'iteminvalidname' => "'$1' 항목에 문제가 발생했습니다. 이름이 잘못되었습니다...",
-'wlnote2' => '아래는 $2, $3 기준으로 지난 {{PLURAL:$1|hour|<strong>$1</strong> 시간}} 동안의 바뀜입니다.',
+'wlnote2' => '아래는 $2, $3 기준으로 지난 {{PLURAL:$1|한 시간|<strong>$1</strong>시간}} 동안의 바뀜입니다.',
 'wlshowlast' => '최근 $1시간 $2일 또는 $3 동안에 바뀐 문서 보기',
 'watchlist-options' => '주시문서 목록 설정',
 
@@ -3100,6 +3110,8 @@ $2',
 'thumbnail_image-type' => '그림 형식이 지원되지 않습니다',
 'thumbnail_gd-library' => 'GD 라이브러리 설정이 잘못되었습니다: $1 함수를 찾을 수 없습니다.',
 'thumbnail_image-missing' => '파일을 찾을 수 없습니다: $1',
+'thumbnail_image-failure-limit' => '여기에 이 섬네일을 렌더하는 데 최근에 너무 많이 실패한 시도($1 이상)가 있습니다.
+나중에 다시 시도하세요.',
 
 # Special:Import
 'import' => '문서 가져오기',
@@ -3138,7 +3150,7 @@ $2',
 임시 폴더가 존재하지 않습니다.',
 'import-parse-failure' => 'XML 문서 분석 실패',
 'import-noarticle' => '가져올 문서가 없습니다!',
-'import-nonewrevisions' => '이전에 이미 모든 판을 가져왔습니다.',
+'import-nonewrevisions' => '가져온 판 없음(모든 판이 이미 존재하거나 오류로 인해 건너뛰었을 수도 있습니다.)',
 'xml-error-string' => '$3단 $2줄 (바이트 $4)에서 $1: $5',
 'import-upload' => 'XML 데이터 올리기',
 'import-token-mismatch' => '세션 데이터가 손실되었습니다.
@@ -3150,6 +3162,7 @@ $2',
 'import-error-special' => '"$1" 문서는 특수 문서에 속해 있기 때문에 가져오지 않습니다.',
 'import-error-invalid' => '"$1" 문서는 제목이 잘못되었기 때문에 가져오지 않습니다.',
 'import-error-unserialize' => '"$1" 문서의 $2 판이 일렬적이지 않습니다. $3 내용 모델을 사용하여 $4 형식으로 일렬화되도록 판을 보고했습니다.',
+'import-error-bad-location' => '$3 내용 모델을 사용하는 $2 판을 이 위키의 "$1"에 저장할 수 없습니다. 모델을 문서에서 지원하지 않습니다.',
 'import-options-wrong' => '잘못된 {{PLURAL:$2|선택 사항}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => '주어진 루트 문서는 잘못된 제목입니다.',
 'import-rootpage-nosubpage' => '루트 문서의 "$1" 이름공간은 하위 문서를 허용하지 않습니다.',
@@ -3423,7 +3436,7 @@ $1',
 'hours' => '$1시간',
 'days' => '$1일',
 'weeks' => '$1주',
-'months' => '$1',
+'months' => '$1개월',
 'years' => '$1년',
 'ago' => '$1 전',
 'just-now' => '방금',
@@ -4011,7 +4024,7 @@ $5
 
 # Friendlier slave lag warnings
 'lag-warn-normal' => '최근 $1{{PLURAL:$1|초}} 안에 바뀐 문서는 이 목록에서 빠졌을 수 있습니다.',
-'lag-warn-high' => 'ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ ì\84\9cë²\84ì\9d\98 ê³¼ë\8f\84í\95\9c ë¶\80í\95\98 ë\95\8c문ì\97\90 ìµ\9cê·¼ $1{{PLURAL:$1|ì´\88}} ì\95\88ì\97\90 ë°\94ë\80\90 ë¬¸ì\84\9c ëª©ë¡\9dì\9d\80 ë³´ì\97¬ì§\80지 않을 수 있습니다.',
+'lag-warn-high' => 'ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ ì\84\9cë²\84ì\9d\98 ê³¼ë\8f\84í\95\9c ë¶\80í\95\98 ë\95\8c문ì\97\90 ìµ\9cê·¼ $1{{PLURAL:$1|ì´\88}} ì\95\88ì\97\90 ë°\94ë\80\90 ë¬¸ì\84\9c ëª©ë¡\9dì\9d\80 ë³´ì\9d´지 않을 수 있습니다.',
 
 # Watchlist editor
 'watchlistedit-numitems' => '토론 문서를 제외하고 {{PLURAL:$1|문서 1개|문서 $1개}}를 주시하고 있습니다.',
@@ -4310,7 +4323,7 @@ $5
 'duration-hours' => '$1{{PLURAL:$1|시간}}',
 'duration-days' => '$1{{PLURAL:$1|일}}',
 'duration-weeks' => '$1{{PLURAL:$1|주}}',
-'duration-years' => '$1{{PLURAL:$1|년}}',
+'duration-years' => '$1',
 'duration-decades' => '$1{{PLURAL:$1|0년}}',
 'duration-centuries' => '$1{{PLURAL:$1|세기}}',
 'duration-millennia' => '$1{{PLURAL:$1|천년}}',
index a0c7407..b6ae1bb 100644 (file)
@@ -112,7 +112,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Джибериулени черт:',
-'tog-justify' => 'Текстни бетни кенглигине кёре тиз',
 'tog-hideminor' => 'Джангы тюрлениулени тизмесинде гитче тюрлениулени кёргюзме',
 'tog-hidepatrolled' => 'Джангы тюрлениулени тизмесинде тинтилген тюрлениулени кёргюзме',
 'tog-newpageshidepatrolled' => 'Джангы бетлени тизмесинде тинтилген бетлени кёргюзме',
@@ -1078,7 +1077,6 @@ $1",
 'compareselectedversions' => 'Сайланнган версияланы тенглешдириу',
 'showhideselectedversions' => 'Сайланнган версияланы кёргюз/джашыр',
 'editundo' => 'ызына алыу',
-'diff-multi' => '({{PLURAL:$2|Бир къошулуучу|$2 къошулуучу}} этген {{PLURAL:$1|Бир аралыкъ тюрлениу|$1 аралыкъ тюрлениу}} кёргюзюлмегенди)',
 'diff-multi-manyusers' => '($2 къошулуучудан кёб {{PLURAL:$2|1=Бир къошулуучу|къошулуучу}} этген {{PLURAL:$1|1=бир аралыкъ тюрлениу|$1 аралыкъ тюрлениу}} кёргюзюлмегенди)',
 'difference-missing-revision' => 'Бу тенглешдириу ($1) ючюн {{PLURAL:$2|1=$2 версия}} {{PLURAL:$2|табылмады}}.
 
@@ -2039,7 +2037,6 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'watchmethod-list' => 'кёзде тургъан бетледе этилген ахыр тюрлениуле кёрюу',
 'watchlistcontains' => 'Кёзюгюзде тургъан тизмегизде $1 {{PLURAL:$1|1=бет|бет}} барды.',
 'iteminvalidname' => "'$1' элемент бла проблемала, джараусуз ат...",
-'wlnote' => "Тюбюндеди кёргюзюлгенди: ахыр '''$2''' сагъатха этилген ахыр '''$1''' тюрлениу, $3 $4 заманнга дери.",
 'wlshowlast' => 'Арт $1 сагъат $2 кюннге $3 кёргюз',
 'watchlist-options' => 'Кёзде тургъан тизмени джарашдырыулары',
 
@@ -2624,7 +2621,6 @@ MediaWiki локализациясына юлюш къошаргъа излей
 'tooltip-pt-watchlist' => 'Сиз кёзюгюзде тутхан бетлени тизмеси',
 'tooltip-pt-mycontris' => 'Сизни тюрлендириулеригизни тизмеси',
 'tooltip-pt-login' => 'Былайда системада регистрация этерге боллукъду, алай а ол ажымсыз керекли тюйюлдю',
-'tooltip-pt-anonlogin' => 'Былайда сисетмагъа регистрация этерге боллукъду, алай а бу зорунлу тюлдю.',
 'tooltip-pt-logout' => 'Чыгъыу',
 'tooltip-ca-talk' => 'Бетни ичиндегин сюзюу',
 'tooltip-ca-edit' => 'Бу бетни тюрлендирирге болады. Сакълагъынчы ал къарауну хайырландырыгъыз.',
index 50d7ee8..bf0e3ae 100644 (file)
@@ -213,7 +213,6 @@ $imageFiles = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Dun de Links ungerstriche:',
-'tog-justify' => 'Dun de Avschnedde em Blocksatz aanzeije',
 'tog-hideminor' => 'Dun de klein Mini-Änderunge (<strong>M</strong>) en de Liss  met „{{int:Recentchanges}}“ <strong>nit</strong> aanzeije',
 'tog-hidepatrolled' => 'Dun de nohjeloorte Änderunge en de „{{int:recentchanges}}“ eez ens <strong>nit</strong> aanzeije',
 'tog-newpageshidepatrolled' => 'Dun de nohjeloorte Änderunge en de Leß „{{int:newpages}}“ eez ens <strong>nit</strong> aanzeije',
@@ -376,7 +375,6 @@ $messages = array(
 'vector-action-protect' => 'Schöze!',
 'vector-action-undelete' => 'Zerökholle!',
 'vector-action-unprotect' => 'Schoz ändere!',
-'vector-simplesearch-preference' => 'Donn et eijfachere Söke aanschallde (bloß mem Ußsinn „Vektor“ zesamme ze hann)',
 'vector-view-create' => 'Neu Schriive!',
 'vector-view-edit' => 'Ändere!',
 'vector-view-history' => 'Versione zeije!',
@@ -572,6 +570,7 @@ un doht em och de URL vun dä Sigg heh sage.',
 'cannotdelete-title' => 'Mer künne di Sigg „$1“ nit fott schmiiße.',
 'delete-hook-aborted' => 'Et Fottschmiiße wood affjebroche övver ene sujenannte „Hoke“ en de ẞoffwäer.
 Ene Jrond weße mer nit.',
+'no-null-revision' => 'Mer kunnte kein onveränderte neue Väsjohn vun dä Sigg „$1“ aanlääje.',
 'badtitle' => 'Verkihrte Üvverschreff',
 'badtitletext' => 'De Üvverschreff es esu nit en Odenung. Et muss jet dren stonn.
 Et künnt sin, dat ein vun de speziell Zeiche dren steiht,
@@ -624,7 +623,7 @@ Dä Wiki_Köbes dovun hät beim Deeschmaache als Jrond aanjejovve: „$3“',
 'invalidtitle-knownnamespace' => '„$3“ es ene onjöltijje Tittel för em Appachtemang „$2“',
 'invalidtitle-unknownnamespace' => '„$2“ es ene onjöltijje Tittel för e Appachtemang met dä verkehte Nommer $1.',
 'exception-nologin' => 'Nit enjelogg',
-'exception-nologin-text' => 'Heh di Sigg udder heh dä Opdraach jeiht blooß, wann De heh em Wiki enjelogg bes.',
+'exception-nologin-text' => 'Heh di Sigg udder heh dä Opdraach jeiht blooß, wann De heh [[Special:Userlogin|em Wiki enjelogg]] bes.',
 'exception-nologin-text-manual' => 'De mööds ald $1, öm heh di Sigg udder di Axjuhn zohjriife ze dörve.',
 
 # Virus scanner
@@ -675,7 +674,7 @@ Wann De wells, künnts De Ding [[Special:Preferences|Enschtällonge aanpaße]].'
 'userlogin-resetpassword-link' => 'Paßwoot verjäße?',
 'helplogin-url' => 'Help:Övver et Enlogge',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hölp bem Enlogge]]',
-'userlogin-loggedin' => 'Do bes ald als {{GENDER:$1|Metmaacher|Metmaacherėn|Metmaacher|Metmaacherėn|Metmaacher}} [[User:$1]] enjelogg. Met heh dämm Fommolaa kanns De jäz onger enem andere Nahme enlogge.',
+'userlogin-loggedin' => 'Do bes ald als {{GENDER:$1|dä Metmaacher|de Metmaacherėn|dä Metmaacher|de Metmaacherėn|däMetmaacher}} [[User:$1]] enjelogg. Met heh dämm Fommolaa kanns De jäz onger enem andere Nahme enlogge.',
 'userlogin-createanother' => 'Donn ene zohsäzlejje Zohjang aanlääje',
 'createacct-join' => 'Jiv Ding Daate en:',
 'createacct-another-join' => 'Maach de nüüdeje Aanjaabe för dä neue Zohjaang.',
@@ -818,6 +817,7 @@ Wann dä aanjejovve es, weet_e jebruch, öm öffentlesch de Schriiver för Beidr
 'retypenew' => 'Noch ens dat neue Passwood:',
 'resetpass_submit' => 'E neu Zweschepasswood övvermeddele un aanmellde',
 'changepassword-success' => 'Et Paßwood es jeändert.',
+'changepassword-throttled' => 'Do häs zoh öff versöhk, enzelogge. Waat $1 Ih dat De es widder probeers.',
 'resetpass_forbidden' => 'E Passwoot kann nit jeändert wääde.',
 'resetpass-no-info' => 'Do mööts ad enjelogg sin, öm tiräk op di Sigg jonn ze dörve',
 'resetpass-submit-loggedin' => 'Passwood tuusche',
@@ -883,9 +883,20 @@ Do moß Ding Paßwoot enjävve, öm Ding Änderong ze bschtäätejje.',
 'changeemail-password' => 'Ding Passwoot {{GRAMMAR:en 3|{{ucfirst:{{SITENAME}}}}}}:',
 'changeemail-submit' => 'Lohß jonn!',
 'changeemail-cancel' => 'Ophüre',
+'changeemail-throttled' => 'Do häs zoh öff versöhk, enzelogge. Waat $1 Ih dat De es widder probeers.',
 
 # Special:ResetTokens
+'resettokens' => 'Neue Schlößel maache',
+'resettokens-text' => 'Do kanns neue Schlößel maache lohße för op beschtemmpte päsöhnlesche Daate uohjriife ze künne, di met Dingem Zohjang heh ze donn han.
+
+Donn dat op jeede Fall, wann se enem Andere bikannt jewoode sin, udder wann Dinge Zohjang jeknack woode es.',
+'resettokens-no-tokens' => 'Et sin kein Schlößele doh, för neu ze maache.',
+'resettokens-legend' => 'Neue Schlößel maache',
+'resettokens-tokens' => 'Schlößele:',
 'resettokens-token-label' => '$1 (Em Momang es et: $2)',
+'resettokens-watchlist-token' => 'ä schlößel för dä <i lang="en" xml:lang="en">Atom</i>- udder <i lang="en" xml:lang="en">RSS</i>-Kanaal met de [[Special:Watchlist|Änderonge aan Sigge en Dinger Oppaßleß]]',
+'resettokens-done' => 'Schlößel neu jemaat.',
+'resettokens-resetbutton' => 'Lohß Jonn!',
 
 # Edit page toolbar
 'bold_sample' => 'Fätte Schreff',
@@ -1138,6 +1149,8 @@ Ene Jrond weße mer nit.',
 'content-not-allowed-here' => 'Ene Enhalld vun dä Zoot „$1“ es op dä Sigg „[[$2]]“ nit zohjelohße.',
 'editwarning-warning' => 'Wann de vun hee dä Sigg fott jeihß, doh künnte all Ding Änderonge aan dä Sigg verschött jonn.
 Do kanns heh di Warnung affschallde, wann de aanjemelldt un enjelogg bes, dann kriß de se nieh mieh wider. Jangk doför en dä Afschnett „{{int:prefs-editing}}“ en Dinge Enschtellonge.',
+'editpage-notsupportedcontentformat-title' => 'Dat Fommat vun enem Enhalld künne mer nit.',
+'editpage-notsupportedcontentformat-text' => 'Dat Fommat $1 vun enem Enhalld künne mer nit mem Modäll $2.',
 
 # Content models
 'content-model-wikitext' => 'Wikitäx',
@@ -1169,6 +1182,7 @@ Do kanns heh di Warnung affschallde, wann de aanjemelldt un enjelogg bes, dann k
 'undo-success' => 'De Änderung könnte mer zeröck nämme. Beloor Der de Ungerscheid un dann donn di Sigg avspeichere, wann De dengks, et es en Oodenung esu.',
 'undo-failure' => 'Dat kunnt mer nit zeröck nämme, dä Afschnedd wood enzwesche ald widder beärbeidt.',
 'undo-norev' => "Do ka'mer nix zeröck nämme. Di Version jidd_et nit, odder se es verstoche odder fottjeschmesse woode.",
+'undo-nochange' => 'Di Änderong schingk ald retuur jemaat woode ze sin.',
 'undo-summary' => 'De Änderung $1 fum [[Special:Contributions/$2|$2]] ([[User talk:$2|Klaaf]]) zeröck jenomme.',
 'undo-summary-username-hidden' => 'Nemm di Väsjohn $1 vun enem verschtoche Metmaacher widder retuur.',
 
@@ -1177,6 +1191,10 @@ Do kanns heh di Warnung affschallde, wann de aanjemelldt un enjelogg bes, dann k
 'cantcreateaccount-text' => "Dä [[User:$3|$3]] hät verbodde, dat mer sich vun dä IP-Adress '''$1''' uß als ene neue Metmaacher aanmelde könne soll.
 
 Als Jrund för et Sperre es enjedraare: ''$2''",
+'cantcreateaccount-range-text' => 'Ne neue Metmacher aanmälde vun <i lang="en" xml:lang="en">IP</i>-Adräße em Berett vun <strong>$1</strong>, woh de Dinge dren es, wood vum {{GENDER:$3|vum|vum|vumm Metmaacher|vun dä|vum}} [[User:$3|$3]] verbodde.
+Der Jrond: <em><$2</em>
+
+Ding <i lang="en" xml:lang="en">IP</i>-Adräß es: <strong>$4</strong>',
 
 # History pages
 'viewpagelogs' => 'De Logböcher för heh di Sigg beloore',
@@ -1265,11 +1283,11 @@ dem Wiki singe Installation dat anders fassjelaht woode es.",
 * unjenehmesch persöhnlesch Daate
 *: ''Aanschreffte, Tellefoon- un ander Nummere, <span lang=\"en\" xml:lang=\"en\">e-mail</span> Adräß, uew.''",
 'revdelete-legend' => 'Dä öffentlije Zojang enschränke',
-'revdelete-hide-text' => 'Dä Tex vun dä Version versteiche',
+'revdelete-hide-text' => 'dä Täx vun dä Väsjohn',
 'revdelete-hide-image' => 'De Enhallt vun däm Beld versteiche',
 'revdelete-hide-name' => 'Der Förjang, un och der Enndraach uss_em Logboch, versteiche',
-'revdelete-hide-comment' => 'Dä Enhald vun „Koot Zosammejefass, Quell“ ußblände',
-'revdelete-hide-user' => 'Däm Bearbeider sing IP Adress oder Metmaacher Name versteiche',
+'revdelete-hide-comment' => 'dä Enhald vun „Koot Zosammejefass, Quell“',
+'revdelete-hide-user' => 'däm Bearbeider sing <i lang="en" xml:lang="en"IP</i>-Adress oder Metmaacher-Name',
 'revdelete-hide-restricted' => 'Dun dat och för de Wiki-Köbesse esu maache wie för jede Andere',
 'revdelete-radio-same' => '(lohß wi_t eß)',
 'revdelete-radio-set' => 'Jo',
@@ -1347,7 +1365,8 @@ Donn de Version makeere bes wohen (inklusive) dat övverdraare wäde sull. Donn
 'showhideselectedversions' => 'De ußjewählte Versione aanzeije udder vershteiche',
 'editundo' => 'De letzte Änderung zeröck nämme',
 'diff-empty' => '(Keine Ongerscheid)',
-'diff-multi' => '(Mer don hee {{PLURAL:$1|eij Version|$1 Versione|keij Version}} dozwesche beim Verjliesche översprenge. Di sin vun jesamp {{PLURAL:$2|einem Metmaacher|$2 Metmaachere|keinem Metmaacher}} jemaat woode)',
+'diff-multi-sameuser' => '(Mer don hee {{PLURAL:$1|eij Väsjohn|$1 Väsjohne|keij Väsjohn}} dozwesche nit zeije.   Se {{PLURAL:$1|es|sin|wöhr}} vum sällve Metmaacher)',
+'diff-multi-otherusers' => '(Mer don hee {{PLURAL:$1|eij Väsjohn|$1 Väsjohne|keij Väsjohn}} dozwesche vun {{PLURAL:$2|einem|$2 ongerscheidlijje|keinem}} Metmaacher nit zeije)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Ein Version|$1 Versione|kei Version}} dozwesche vun mieh wi {{PLURAL:$2|einem Metmaacher|$2 Metmaachere|keinem Metmaacher}} wääde nit jezeish)',
 'difference-missing-revision' => '{{PLURAL:$2|Ein Version|$2 Versione}} vun heh däm Verjlisch zwesche Versione ($1) {{PLURAL:$2|hammer}} nit jefonge.
 
@@ -1368,7 +1387,8 @@ Mieh doh drövver fengk mer em [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAG
 'shown-title' => 'Zeisch {{PLURAL:$1|ein|$1|nix}} pro Sigg',
 'viewprevnext' => 'Bläddere: ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "*Sigg '''[[$1]]'''",
-'searchmenu-new' => "'''Donn de Sigg „[[:$1|$1]]“ hee em Wiki aanlääje'''",
+'searchmenu-new' => '<strong>Donn de Sigg „[[:$1|$1]]“ hee em Wiki aanlääje.</strong>
+{{PLURAL:$2|Beloor Der ävver och die Sigg, di beim Söhke jefonge wood.|Beloor Der ävver och die Sigge, di beim Söhke jefonge woode sin.|}}',
 'searchprofile-articles' => 'Sigge vum Enhalt',
 'searchprofile-project' => 'Hülp- ov Projäk-Sigge',
 'searchprofile-images' => 'Dateie met Medije',
@@ -1384,6 +1404,7 @@ Mieh doh drövver fengk mer em [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAG
 'search-result-score' => 'Jeweesch: $1%',
 'search-redirect' => '(Ömleitung $1)',
 'search-section' => '(Avschnett $1)',
+'search-file-match' => '(en dä Dattei dren)',
 'search-suggest' => 'Häß De „$1“ jemeint?',
 'search-interwiki-caption' => 'Schwesterprojekte',
 'search-interwiki-default' => '$1 hät heh di Träffer jefonge:',
@@ -1393,6 +1414,7 @@ Mieh doh drövver fengk mer em [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAG
 'searchrelated' => 'ähnlesch',
 'searchall' => 'all',
 'showingresults' => 'Onge {{PLURAL:$1|weed <strong>eine</strong>|wääde bes <strong>$1</strong>|weed <strong>keine</strong>}} vun de jefonge Endrähsch jezeisch, vun de Nommer <strong>$2</strong> av.',
+'showingresultsinrange' => '{{PLURAL:$1|<strong>Ein</strong> Saachjropp|<strong>$1</strong> Saachjroppe|Kein Saachjropp}}, vun Nommer <strong>$2</strong> bes Nommer <strong>$3</strong> {{PLURAL:$1|weed|wääde|weed}} heh opjeleß.',
 'showingresultsnum' => 'Onge {{PLURAL:$3|es ein|sin <strong>$3</strong>|sin <strong>kein</strong>}} vun de jefonge Endrähsch opjeleß, vun de Nommer <strong>$2</strong> av.',
 'showingresultsheader' => "Jefonge un aanjezeisch: {{PLURAL:$5|'''$1''' vun '''$3'''|'''$1''' beß '''$2''' vun '''$3'''|nix}} för '''$4'''",
 'search-nonefound' => 'Mer han nix zopaß jefonge för Ding Aanfrohch.',
@@ -1452,6 +1474,9 @@ dat dänne ehr Daate topaktoell sin,
 'recentchangesdays-max' => '(Nit mieh wie {{PLURAL:$1|eine Daach|$1 Dääsh|keine Daach}})',
 'recentchangescount' => 'Aanzahl Änderunge en de Leß, als Shtandad:',
 'prefs-help-recentchangescount' => 'Dat ömfaß de „{{int:recentchanges}}“, de Versione uß de Fojangeheit, un de Logbööcher.',
+'prefs-help-watchlist-token2' => 'Dat heh es dä jeheime Schlößel för dä <i lang="en" xml:lang="en">Atom</i>- udder <i lang="en" xml:lang="en">RSS</i>-Kanaal met de Änderonge aan Sigge en Dinger Oppaßleß
+Wä dä kännt, kann Ding Oppaßleß lässe, alsu halld_en för Desch.
+Do kann Der [[Special:ResetTokens|ene neue Schlößel maache lohße]], wann nüüdesch.',
 'savedprefs' => 'Ding Enstellunge sin jetz jesechert.',
 'timezonelegend' => 'Ziggzohn:',
 'localtime' => 'De Zigg op Dingem Kompjuter:',
@@ -1519,8 +1544,10 @@ dat dänne ehr Daate topaktoell sin,
 'prefs-displayrc' => 'Ußwahle för et Leßte Aanzeje',
 'prefs-displaysearchoptions' => 'Enstellunge för et Aanzeje',
 'prefs-displaywatchlist' => 'Enstellunge för et Aanzeje',
+'prefs-tokenwatchlist' => 'Schlößel',
 'prefs-diffs' => 'Ongerscheide un Verjliische',
 'prefs-help-prefershttps' => 'Di Enschtällong kütt eets zom drahre, wann De nähksde Mohl enloggs.',
+'prefs-tabs-navigation-hint' => 'Opjepaß: Met dä Piel-Knöppe kanns de noh rääds un lenks op de Rigger jonn un se ußsöhke.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'De Addräß fö de <i lang="en">e-mail</i> schingk en Odenung',
@@ -1548,7 +1575,8 @@ dat dänne ehr Daate topaktoell sin,
 'userrights-changeable-col' => '{{PLURAL:$1:Di Jropp|Jroppe|kein Jropp doh}}, di De ändere kanns',
 'userrights-unchangeable-col' => '{{PLURAL:$1:Di Jropp|Jroppe|kein Jropp doh}}, di De nit ändere kanns',
 'userrights-irreversible-marker' => '$1 *',
-'userrights-conflict' => 'Ene Andere hät di Rääschde ald verändert. Loor, wad_eruß kohm un versöhg_et norr-ens, wann nüüdesch.',
+'userrights-conflict' => 'Ene Andere hät di Rääschde ald verändert. Loor, wad_eruß kohm un versöhg_et norr_ens, wann nüüdesch.',
+'userrights-removed-self' => 'Do häs Dng Rääsch dohzoh jraad drannjejovve, dröm kanns De heh di Sigg nit mieh oproofe.',
 
 # Groups
 'group' => 'Jrupp:',
@@ -1846,6 +1874,7 @@ Jangk zeröck un lad Ding Datei unger enem andere Name huh,
 wann De se noch han wells.',
 'file-exists-duplicate' => 'Di Dattei hät dersellve Enhallt wi hee di {{PLURAL:$1|Datei|Dateie|}}:',
 'file-deleted-duplicate' => 'En Datei mem sellve Enhallt wi „[[:$1]]“ es ens fottjeschmeße woode. Donn dä Zosammehang em „{{int:dellogpage}}“ nokike, ih dat De se widder huhläds.',
+'file-deleted-duplicate-notitle' => 'En Datei mem sellve Enhallt wi di heh es ens fottjeschmeße woode, un dä iehre Tettel es verschtoche. Donn en däm Zosammehang eine froore, dä fottjeschmeße un verstoche Datteije beloore kann, ih dat De se widder huhläds.',
 'uploadwarning' => 'Warnung beim Huhlade',
 'uploadwarning-text' => 'Donn onge dä Täx övver di Dattei ändere, un versöhg_et norr_ens.',
 'savefile' => 'Datei avspeichere',
@@ -2205,6 +2234,7 @@ Tipp: Merk Der dä Tittel vun dä Sigg dovör.',
 'ninterwikis' => '{{PLURAL:$1|Eine Engerwikilengk|$1 Engerwikilengks|Keine Engerwikilengk}}',
 'nlinks' => '{{PLURAL:$1|eine Link|$1 Links}}',
 'nmembers' => 'met {{PLURAL:$1|ein Sigg|$1 Sigge}} dren',
+'nmemberschanged' => 'met&nbsp;$1&nbsp;→&nbsp;{{PLURAL:$2|eine Sigg|$2&nbsp;Sigge|keine Sigg}}',
 'nrevisions' => '{{PLURAL:$1|Ein Änderung|$1 Änderunge|Keij Änderung}}',
 'nviews' => '{{PLURAL:$1|Eine Avrof|$1 Avrofe|Keine Avrof}}',
 'nimagelinks' => 'Weed op {{PLURAL:$1|eine Sigg|$1 Sigge|keine Sigg}} jebruch',
@@ -2240,16 +2270,27 @@ Di sin dann <del>dorschjeschtresche</del>.',
 'mostrevisions' => 'Atikkele met de miehste Änderunge',
 'prefixindex' => 'All Sigge, dänne ehr Name met enem bestemmte Wood oder Tex aanfängk',
 'prefixindex-namespace' => 'All Sigge med enem beschtemmpte Aanfang (Appachtemang $1 )',
+'prefixindex-strip' => 'Donn der jemeinsamme Aanfang vun dä Tetelle en dä Leß fottlohße.',
 'shortpages' => 'Atikele zoteet vun koot noh lang',
 'longpages' => 'Atikele zoteet vun lang noh koot',
 'deadendpages' => 'Atikele ohne Links dren',
 'deadendpagestext' => 'De Atikele hee han kein Links op ander Atikele em Wiki.',
 'protectedpages' => 'Jeschötzte Sigge',
 'protectedpages-indef' => 'Nor de Sigge zeije, woh alleins de Wiki-Köbesse draan dörrve',
+'protectedpages-summary' => 'He sin Sigge opjeliss, wo jäje Veränderunge un/odde jäje et Ömnenne jeschötz sin, su dat nit einfach Jede jet draan don kann.',
 'protectedpages-cascade' => 'Nur Sigge en ener Schotz-Kaskad',
 'protectedpages-noredirect' => 'Ömleidonge verschteische',
 'protectedpagesempty' => 'Op di Aat sin jrad kein Sigge jeschötz.',
+'protectedpages-timestamp' => 'Dattum un Zigg',
+'protectedpages-page' => 'Sigg',
+'protectedpages-expiry' => 'Bes',
+'protectedpages-performer' => 'Jeschöz vum Metmaacher',
+'protectedpages-params' => 'De Zoot Schpär',
+'protectedpages-reason' => 'Der Jrond',
+'protectedpages-unknown-timestamp' => 'Onbikannt',
+'protectedpages-unknown-performer' => 'Onbikannte Metmaacher',
 'protectedtitles' => 'Verbodde Titele för Sigge',
+'protectedtitles-summary' => "Hee sin verbodde Sigge-Tittele opjelis, unger dä Name ka'mer kein neu Sigge aanläje.",
 'protectedtitlesempty' => 'Op di Aat sin jrad kein Sigge jäje et neu Aanlääje jeschötz.',
 'listusers' => 'De Metmaacherleß',
 'listusers-editsonly' => 'Donn nor Metmaacher zeije, di och ens jät jeschrevve han.',
@@ -2457,7 +2498,7 @@ Wann di Sigg udder ier Klaafsigg verändert weed, kütt dat af jäz heh en di Op
 'watchmethod-list' => 'Ben de Oppassliss am pröfe, noh de letzte Änderung',
 'watchlistcontains' => 'En dä Oppassliss {{PLURAL:$1|es ein Sigg|sinner <strong>$1</strong> Sigge|sinner <strong>kein</strong> Sigge}}.',
 'iteminvalidname' => 'Dä Endrach „$1“ hät ene kapodde Name.',
-'wlnote' => '{{PLURAL:$1|Hee es de letzte Änderung us|Hee sin de letzte <strong>$1</strong> Änderunge us|Mer han kein Äbderunge en}} de letzte {{PLURAL:$2|Stund|<strong>$2</strong> Stunde|<strong>noll</strong> Stunde}} zigg em $3 öm $4 Uhr.',
+'wlnote2' => 'Heh sin de Änderonge us de läzde {{PLURAL:$1|Schtond|<strong>$1</strong> Schtonde|kein Schtond}} bes zom $2 öm $3 Uhr.',
 'wlshowlast' => 'Zeich de letzte | $1 | Stunde | $2 | Dage | $3 | aan, dun',
 'watchlist-options' => 'Eijeschaffte fun de Oppassless',
 
@@ -2488,27 +2529,30 @@ $PAGEINTRO $NEWPAGE
 
 {{int:summary}} „$PAGESUMMARY“ $PAGEMINOREDIT
 
-Do kanns dä Metmaacher „$PAGEEDITOR“ aanspreche:
+Do kanns dä Metmaacher „$PAGEEDITOR“ aanspräsche:
 * Övver e-mail: $PAGEEDITOR_EMAIL
 * Em Wiki: $PAGEEDITOR_WIKI
 
-Do kriss vun jetz aan kein e-mail mieh, bes dat Do Der di Sigg aanjeluurt häs,
-och wann se norr_ens verändert weed. Do kanns ävver och all die Merker för 
-e-mail för die Sigge en Dinger Oppassliss op eimol ändere.
+Do kreß vun jetz aan kein e-mail mieh, bes dat Do
+Der di Sigg aanjeluurt häs wann De enjelogg bes,
+och wann se norr_ens verändert weed. Do kanns ävver
+och all die Merker för e-mail för die Sigge en Dinger
+Oppaßleß op eimol ändere.
 
-Ene schöne Jroß {{GRAMMAR:vun|{{SITENAME}}}}.
+Ene schöne Jrohß {{GRAMMAR:vun|{{SITENAME}}}}.
 
 -- 
-Öm de Enshtällonge för Nohreeschet aan Desch ze ändere, jangk op:
+Öm de Enschtällonge för Nohreeschte aan Desch ze ändere,
+jangk op:
 {{canonicalurl:{{#special:Preferences}}}}
 
-Do kanns hee Ding Oppassleß ändere:
+Do kanns heh Ding Oppaßleß ändere:
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
-Öm di Sigg vun Dinger Oppassleß ze schmieße:
+Öm di Sigg vun Dinger Oppaßleß ze schmieße:
 $UNWATCHURL
 
-Do kanns hee noh Hölp luure:
+Do kanns heh noh Hölp luure:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 'created' => 'neu aanjelaht',
 'changed' => 'jeändert',
@@ -2544,6 +2588,7 @@ Do kanns hee noh Hölp luure:
 'delete-edit-reasonlist' => 'De Jrönde för et Fottschmieße beärbeide',
 'delete-toobig' => 'Di Sigg hät {{PLURAL:$1|ein Version|$1 Versione|jaa kein Version}}. Dat sinn_er ärsch fill. Domet unsere ẞööver do nit draan en de Kneen jeit, dom_mer esu en Sigg nit fottschmieße.',
 'delete-warning-toobig' => 'Di Sigg hät {{PLURAL:$1|ein Version|$1 Versione|jakein Version}}. Dat sinn_er ärsch fill. Wann De die all fottschmieße wells, dat kann dem Wiki sing Datenbangk schwer ußbremse.',
+'deleting-backlinks-warning' => '<strong>Opjepaß:</strong> Es jitt Sigge met Lenks noh heh doh, udder Sigge, di heh di Sigg enbenge!',
 
 # Rollback
 'rollback' => 'Em Letzte sing Änderunge zeröcknemme',
@@ -2785,6 +2830,7 @@ un och, wann De se ändere wells.',
 'ipb-confirmhideuser' => 'Do bes om bäßte Wääsch ene Metaacher ze sperre met „Vershteishe“ ußjewählt.
 Domet weed dä Name vun däm Metmaacher uß alle Leßte un Logbööscher eruß jelohße.
 Wells De dat?',
+'ipb-confirmaction' => 'Wann De sescher bes, dat De dat donn wells, donn e Krüzje nävve <em>{{int:ipb-confirm}}</em> maache.',
 'ipb-edit-dropdown' => 'De Jründ för et Sperre beärrbejde',
 'ipb-unblock-addr' => '„$1“ widder zohlohße',
 'ipb-unblock' => 'En IP-Addräß ov ene Metmaacher widder zohlohße',
@@ -2826,7 +2872,7 @@ Wells De dat?',
 'change-blocklink' => 'Sperr ändere',
 'contribslink' => 'Beidräch',
 'emaillink' => 'Scheck en <span lang="en">e-mail</span>',
-'autoblocker' => 'Automattisch jesperrt. Ding IP_Adress wood vör kootem vun däm Metmaacher „[[User:$1|$1]]“ jebruch. Dä es jesperrt woode wäje: „$2“',
+'autoblocker' => 'Bes automattisch jesperrt. Ding <i lang="en" xml:lang="en">IP</i>_Adress wood vör kootem noch vun däm Metmaacher „[[User:$1|$1]]“ jebruch. Dä es jesperrt woode wäje: „$2“',
 'blocklogpage' => 'Logboch met Metmaacher-Sperre',
 'blocklog-showlog' => 'Heh dä Metmaacher es ald fröjer jeshperrt woode. Dat Logbooch vum Metmaacher-Sperre onge künnt doh jät mieh zoh saare.',
 'blocklog-showsuppresslog' => 'Heh dä Metmaacher es ald fröjer jeshperrt un vershtoche woode. Dat Logbooch vum Metmaacher-Vershteishe onge künnt doh jät mieh zoh saare.',
@@ -2845,7 +2891,7 @@ Automattesch jesperrte <i lang="en>IP</i>-Addräße sin nit heh, ävver en de [[
 'range_block_disabled' => 'Adresse Jebeede ze sperre, es nit erlaub.',
 'ipb_expiry_invalid' => 'De Duur es Dress. Jevv se richtich aan.',
 'ipb_expiry_temp' => 'Sperre för Metmaacher met verstoche Name mößße för iewish doore.',
-'ipb_hide_invalid' => 'Kann dä Metmaacher nit vershteishe. Müjjelesch, dat dä zoh vill Änderunge jemaat hät.',
+'ipb_hide_invalid' => 'Mer künne dä Metmaacher nit verschteische. Dä hät övver {{PLURAL:$1|ein Änderong|$1 Änderong|kein Änderong}} jemaat.',
 'ipb_already_blocked' => '„$1“ es ald jesperrt',
 'ipb-needreblock' => 'Dä Metmaacher „$1“ es ald jesperrt. Wellß De de Enstellunge för di Spär ändere?',
 'ipb-otherblocks-header' => 'Ander {{PLURAL:$1|Sperr|Sperre|-nix-}}',
@@ -3024,6 +3070,7 @@ Wenn De jenerell aan [https://www.mediawiki.org/wiki/Localisation MediaWiki sing
 'allmessages-prefix' => 'Name fängk aan met:',
 'allmessages-language' => 'Schprooch:',
 'allmessages-filter-submit' => 'Lohß Jonn!',
+'allmessages-filter-translate' => 'Övversäze!',
 
 # Thumbnails
 'thumbnail-more' => 'Jrößer aanzeije',
@@ -3040,6 +3087,7 @@ $2',
 'thumbnail_image-type' => 'Di Zoot Beld künne mer nit met ömjonn',
 'thumbnail_gd-library' => 'Vun dä <i lang="en">GD</i> Projramm_Biplijotheek fäählt en Funkßuhn: „$1“',
 'thumbnail_image-missing' => 'Di Datei schingk nit doh ze sin: <code>$1</code>',
+'thumbnail_image-failure-limit' => 'Mieh wi {{PLURAL:$1|eine Versohch|$1 Versohche|keine Versohch}} dat Minnibelldsche ze zeije. Versöhg_et schpääder widder.',
 
 # Special:Import
 'import' => 'Sigge Emporteere',
@@ -3075,7 +3123,7 @@ Dat ahle Versione Huhlade es avjeschalt, un es nit müjjelich.',
 'importuploaderrortemp' => 'De Import-Datei huhzelade jingk scheif, weil e Zwescheverzeichnis fäählt.',
 'import-parse-failure' => 'Fäähler bem Import per XML:',
 'import-noarticle' => 'Kein Sigge do, för ze Emporteere!',
-'import-nonewrevisions' => 'Et sin kein neue Versione do, för ze Importeere, weil all de Versione vun heh ald fröjer empotteet wodte.',
+'import-nonewrevisions' => 'Et sin kein neue Väsjohne för ze emporteere doh, weil alle Väsjonhe vun heh ald fröjer empotteet wodte.',
 'xml-error-string' => '$1 — en {{PLURAL:$2|eetz|$2-}}te Reih en de {{PLURAL:$3|eetz|$3-}}te Spalde, dat ess_et {{PLURAL:$4|eetz|$4-}}te Byte: $5',
 'import-upload' => 'En XML-Datei impochteere',
 'import-token-mismatch' => 'Schadt. Et senn nit alle Date heh aanjekumme.
@@ -3118,7 +3166,6 @@ Bes esu joot, un versök et noch ens.',
 'tooltip-pt-watchlist' => 'De Liss met de Sigge en Dinge eije Oppassliss',
 'tooltip-pt-mycontris' => 'en Liss met Dinge eije Beidräch',
 'tooltip-pt-login' => 'Do moß Desch nit Enlogge, kannz_E ävver jähn maache!',
-'tooltip-pt-anonlogin' => 'Wöhr nett wann De enlogge dääts, moß ävver nit.',
 'tooltip-pt-logout' => 'Ußlogge',
 'tooltip-ca-talk' => 'Dun die Sigg met däm Klaaf övver heh de Sigg aanzeije',
 'tooltip-ca-edit' => 'De kanns die Sigg heh ändere — für em Avspeichere, donn eetß ens enen Bleck op de Vör-Aansich',
@@ -3179,6 +3226,7 @@ fun dä Sigg op, zom Beärbeide un widder Afspeichere.
 Esu kam_mer noch en Aanmärkong en „{{int:summary}}“ maache.',
 'tooltip-preferences-save' => 'Enstellunge faßhallde',
 'tooltip-summary' => 'Jif en koote Zesammefassung en',
+'interlanguage-link-title' => '$1 ($2)',
 
 # Stylesheets
 'common.css' => '/* CSS heh aan dä Stell hät Uswirkunge op all Ovverflääsche */',
@@ -3241,6 +3289,7 @@ Esu kam_mer noch en Aanmärkong en „{{int:summary}}“ maache.',
 'pageinfo-length' => 'Bytes en dä Sigg',
 'pageinfo-article-id' => 'Dä Sigg ier Nommer en dä Daatebangk',
 'pageinfo-language' => 'De Schprooch vum Sigge-Enhallt',
+'pageinfo-content-model' => 'Et Modäll för der Enhalld vun dä Sigg',
 'pageinfo-robot-policy' => 'Et opnämme es för Söhkmaschiine',
 'pageinfo-robot-index' => 'zohjelohße',
 'pageinfo-robot-noindex' => 'verbodde',
@@ -4072,6 +4121,9 @@ Dä Shtanndat-Zoot-Schlößel „$1“ övverschriif dä älldere Zoot-Schlöße
 'version-ext-colheader-description' => 'Beschrevve',
 'version-ext-colheader-credits' => 'Schriiver',
 'version-license-title' => '‎Lėzänz för $1',
+'version-license-not-found' => 'Mer han kein Lezänzenfommazjuhne för heh dat Zohsazprojramm jefonge.',
+'version-credits-title' => 'Dank för dat Projramm „$1“',
+'version-credits-not-found' => 'Schahd, mer han kein Aanjaabe drövver, wämm mer heh för ze danke hätte.',
 'version-poweredby-credits' => "Dat Wiki heh löp met '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
 'version-poweredby-others' => 'sönß wää',
 'version-poweredby-translators' => 'de Övversäzer em translatewiki.net',
@@ -4093,11 +4145,12 @@ Do sullts en [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun dä <i lang="en">GNU Ge
 # Special:Redirect
 'redirect' => 'Ömleide op en Dattei, ene Metmaacher udder de Väsjohn vun ener Sigg',
 'redirect-legend' => 'Ömleide ob_en Dattei udder Sigg',
-'redirect-summary' => 'Heh di {{int:specialpage}} leidt öm ob_en Dattei — doh mößd_Er ene Nahme aanjävve — udder en Sigg — doh mößd_Er en Kännong för en Väsjoh aanjävve — udder en Metmaachersigg — doh mößd_Er enem Metmaacher sing Kännong aanjävve.',
+'redirect-summary' => 'Heh di {{int:specialpage}} leidt öm ob_en Dattei — doh mößd_Er ene Nahme aanjävve, för e Beischpell:[[{{#Special:Redirect}}/file/Example.jpg]] — udder en Sigg — doh mößd_Er en Kännong för, udder en Väsjuhn aanjävve, för e Beischpell esu: [[{{#Special:Redirect}}/page/64308]] udder [[{{#Special:Redirect}}/revision/328429]] — udder en Metmaachersigg — doh mößd_Er enem Metmaacher sing Kännong aanjävve, för e Beischpell: [[{{#Special:Redirect}}/user/101]].',
 'redirect-submit' => 'Lohß Jonn!',
 'redirect-lookup' => 'Söhk noh:',
 'redirect-value' => 'Kännong udder Nahme:',
 'redirect-user' => 'Enem Metmaacher sing Kännong',
+'redirect-page' => 'Dä Sigg ier Nummer en de Datebank',
 'redirect-revision' => 'Ener Sigg ier Väsjohn ier Kännong',
 'redirect-file' => 'Ener Dattei iehre Nahme',
 'redirect-not-exists' => 'Nit jefonge',
@@ -4116,9 +4169,8 @@ Do sullts en [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun dä <i lang="en">GNU Ge
 # Special:SpecialPages
 'specialpages' => '{{int:nstab-special}}e',
 'specialpages-note-top' => 'Lejänd',
-'specialpages-note' => '* {{int:nstab-special}}e för jede Metmaacher.
-* <span class="mw-specialpagerestricted">{{int:nstab-special}}e för Metmaacher met besönder Räächde.</span>
-* <span class="mw-specialpagecached">Em Zwescheshpeisher jehallde {{int:nstab-special}}e. Di künnte ovverhollt sind.</span>',
+'specialpages-note' => '* Jewöhnlejje {{int:nstab-special}}e för jede Metmaacher.
+* <span class="mw-specialpagerestricted">{{int:nstab-special}}e bloß för Metmaacher met besönder Räächde.</span>',
 'specialpages-group-maintenance' => 'Waadungsleste',
 'specialpages-group-other' => 'Ander {{int:nstab-special}}e',
 'specialpages-group-login' => 'Enlogge udder Aanmälde',
@@ -4335,9 +4387,9 @@ Wat De doh enjiß, kütt met Dingem Metmaachername un Dingem Brauser op die Sigg
 'limitreport-walltime-value' => '{{PLURAL:$1|ein&nbsp;Sekond|$1&nbsp;Sekonde|kein&nbsp;Sekond}}',
 'limitreport-ppvisitednodes-value' => '$1 vun $2',
 'limitreport-ppgeneratednodes-value' => '$1 vun $2',
-'limitreport-postexpandincludesize-value' => '$1 vun $2 {{PLURAL:$2|Byte|Bytes|Bytes}}',
+'limitreport-postexpandincludesize-value' => '{{PLURAL:$1|ein|$1|kein}} vun {{PLURAL:$2|einem Byte|$2 Bytes|keinem Byte}}',
 'limitreport-templateargumentsize' => 'Der Ömvang vun de Parrameeterre vun Schablohne',
-'limitreport-templateargumentsize-value' => '$1 vun $2 {{PLURAL:$2|Byte|Bytes|Bytes}}',
+'limitreport-templateargumentsize-value' => '{{PLURAL:$1|ein|$1|kein}} vun {{PLURAL:$2|einem Byte|$2 Bytes|keinem Byte}}',
 'limitreport-expansiondepth-value' => '$1 vun $2',
 'limitreport-expensivefunctioncount' => 'Oproofe vun „düüre“ Fonxjuhne em Paaser',
 'limitreport-expensivefunctioncount-value' => '$1 vun $2',
@@ -4361,4 +4413,6 @@ Derbei jehüüere enschtalleete Paaserfunxjuhne, alsu esu jät wi
 'expand_templates_generate_rawhtml' => 'Donn de Röh HTML Ußjaav aanzeije',
 'expand_templates_preview' => 'Vör-Aansich',
 
+# Unknown messages
+'uploadinvalidxml' => 'Dat <i lang="en" xml:lang="en">XML</i> en dä huh jelaade Dattei kunnt wohr nit en Oodenong beim Ongersöhke.',
 );
index 42f0b90..93a5fef 100644 (file)
@@ -112,7 +112,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Xetekê di bin girêdanê de çêke:',
-'tog-justify' => 'Gotar bi forma "block"',
 'tog-hideminor' => 'Guherandinên biçûk ji listêya guherandinên dawî veşêre',
 'tog-hidepatrolled' => 'Guherandinên hatine kontrolkirin ji nav guherandinên dawî veşêre',
 'tog-newpageshidepatrolled' => 'Rûpelên hatine kontrolkirin ji lîsteya rûpelên nû veşêre',
@@ -121,9 +120,7 @@ $messages = array(
 'tog-numberheadings' => 'Sernavan otomatîk bihejmêre',
 'tog-showtoolbar' => 'Tiştên guherandinê bibîne (JavaScript bibîne)',
 'tog-editondblclick' => 'Rûpelan bi du klîkan biguherîne (Java Script gireke)',
-'tog-editsection' => 'Girêdanan ji bo guherandina beşan biweşîne',
 'tog-editsectiononrightclick' => 'Beşekê bi rast-klîkekê biguherîne (JavaScript gireke)',
-'tog-showtoc' => 'Tabloya naverokê nîşan bide (ji bo rûpelan zêdetirî sê sernavan)',
 'tog-rememberpassword' => 'Qeyda min di vê komputerê de biparêze (herî zêde ji bo $1 {{PLURAL:$1|rojekê|rojan}})',
 'tog-watchcreations' => 'Rûpelên min çêkirin, têxe nav lîsteya min a şopandinê',
 'tog-watchdefault' => 'Rûpelên min guhertin, têxe nav lîsteya min a şopandinê',
@@ -810,7 +807,6 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'compareselectedversions' => 'Guhertoyan bide ber hev',
 'showhideselectedversions' => 'Revîzyonên bijartî nîşan bide/veşêre',
 'editundo' => 'betal bike',
-'diff-multi' => '({{PLURAL:$1|Guhertoyeke|Guhertoyên {{PLURAL:$2|bikarhêner|bikarhêneran}} di navbera herduyan de}} {{PLURAL:$1|nayê|nayên}} dîtin.)',
 
 # Search results
 'searchresults' => 'Encamên lêgerînê',
@@ -1407,7 +1403,6 @@ Gava tu bixwazî wê rûpelê ji nav lîsteya xwe ya şopandinê derbixî, li se
 'wlheader-enotif' => 'Agahdariya E-nameyê pêk tê.',
 'wlheader-showupdated' => "Ev rûpela hatî guhertin dema te lê meyzand bi '''nivîsa stûr''' tê xuyakirin.",
 'watchlistcontains' => 'Di lîsteya şopandina te de {{PLURAL:$1|rûpelek heye|$1 rûpel hene}}.',
-'wlnote' => "Niha {{PLURAL:$1|xeyrandinê|'''$1''' xeyrandinên}} dawî yê {{PLURAL:$2|seetê|'''$2''' seetên}} dawî {{PLURAL:$1|tê|tên}} dîtin.",
 'wlshowlast' => 'Guhertinên berî $1 saetan, $2 rojan, ya $3 nîşan bide',
 'watchlist-options' => 'Vebijarkên lîsteya şopandinê',
 
index 696ec16..fcd700f 100644 (file)
@@ -216,7 +216,6 @@ $messages = array(
 'tog-numberheadings' => 'Awto-nivera pennlinennow',
 'tog-showtoolbar' => 'Diskwedhes an toulvar chanjya (res yw JavaScript)',
 'tog-editondblclick' => 'Chanjya folennow ow tobyl-glyckya (res yw JavaScript)',
-'tog-editsection' => 'Galosegi chanjya trehow der an kevrennow [chanjya]',
 'tog-editsectiononrightclick' => 'Galosegi chanjya trehow dre dhyhow-glyckya war ditlys an trehow (res yw JavaScript)',
 'tog-rememberpassword' => "Perthi kov a'm omgelmi war an beurel-ma (rag $1 {{PLURAL:$1|dydh}} dhe'n moyha)",
 'tog-watchcreations' => "Keworra folennow gwruthys genev ha restrennow ughkergys genev dhe'm rol golyas",
@@ -1153,7 +1152,6 @@ Diskwedhys a-woles yw an deskrifans war hy [$2 folen dheskrifans] ena.',
 'unwatch' => 'Diswolya',
 'watchlist-details' => 'Yma {{PLURAL:$1|$1 folen}} war agas rol wolya, marnas folennow keskows.',
 'wlheader-showupdated' => "Yn '''tew''' y tiskwedhir folennow re beu chanjyes a-dhia agas vysytyans diwettha.",
-'wlnote' => "A-woles yma an {{PLURAL:$1|chanj diwettha|'''$1''' chanj diwettha}} y'n {{PLURAL:$2|our|'''$2''' our}} diwettha, a-dhia $3, $4.",
 'wlshowlast' => 'Diskwedhes an $1 our diwettha, an $2 dydh diwettha, po $3',
 'watchlist-options' => 'Etholyow an rol wolya',
 
index 630bbbe..6ce7abd 100644 (file)
@@ -37,7 +37,6 @@ $namespaceNames = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Шилтемелердин алдын сызуу:',
-'tog-justify' => 'Текстти барактын эни боюнча түздөө',
 'tog-hideminor' => 'Соңку өзгөрүүлөрдүн тизмесинен майда өзгөрүүлөрдү жашыруу',
 'tog-hidepatrolled' => 'Соңку өзгөрүүлөрдүн тизмесинен күзөттөлгөн оңдоолорду жашыруу',
 'tog-newpageshidepatrolled' => 'Жаңы барактар тизмесинен күзөттөлгөн барактарды жашыруу',
@@ -46,9 +45,7 @@ $messages = array(
 'tog-numberheadings' => 'Башжазууларды автоматтык түрдө номердөө',
 'tog-showtoolbar' => 'Оңдоо учурунда аспаптар тактасын көрсөтүү (JavaScript талап кылынат)',
 'tog-editondblclick' => 'Эки басып баракты оңдоо (JavaScript талап кылынат)',
-'tog-editsection' => 'Ар бир бөлүм үчүн «оңдоо» шилтемесин көрсөтүү',
 'tog-editsectiononrightclick' => 'Бөлүмдүн башжазуусун чычкандын оң баскычы менен басканда оңдоп-түзөө бөлүгүн ачуу (JavaScript талап кылынат)',
-'tog-showtoc' => 'Мазмунду көрсөтүү (3 мазмундан артык барактар үчүн)',
 'tog-rememberpassword' => 'Бул браузердин эсинде эсеп жазуумду ($1 {{PLURAL:$1|күн}}) сактоо',
 'tog-watchcreations' => 'Көзөмөл тизмеме мен жараткан барактарды жана мен жүктөгөн файлдарды кошуу',
 'tog-watchdefault' => 'Мен өзгөрткөн барактарды жана файлдарды көзөмөл тизмеме кошуу',
@@ -719,7 +716,6 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'compareselectedversions' => 'Тандалган версияларды салыштыруу',
 'showhideselectedversions' => 'Тандалган версияларды көрсөтүү/жашыруу',
 'editundo' => 'жокко чыгаруу',
-'diff-multi' => '({{PLURAL:$2|колдонуучу}} тарабынан жасалган {{PLURAL:$1|аралык версия}} көрсөтүлгөн жок)',
 
 # Search results
 'searchresults' => 'Издөө жыйынтыктары',
index ba2c0cc..6d0db12 100644 (file)
@@ -163,7 +163,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Versores linea denotandi:',
-'tog-justify' => 'Iustificare paragrapha',
 'tog-hideminor' => 'Celare recensiones minores in indice nuper mutatorum',
 'tog-hidepatrolled' => 'Redactiones censae inter nuper mutatas celandae',
 'tog-newpageshidepatrolled' => 'Paginae censae inter nouissime creatas celandae',
@@ -172,9 +171,7 @@ $messages = array(
 'tog-numberheadings' => 'Subtituli numeris adornandi',
 'tog-showtoolbar' => 'Affigere trabem redigentem',
 'tog-editondblclick' => 'Percussus duplex redactionem hortetur',
-'tog-editsection' => 'Paginarum segmenta [redigere] hortari',
 'tog-editsectiononrightclick' => 'Paginarum segmenta dextero percussu in titulis redigenda',
-'tog-showtoc' => 'Indicem plurium quam III segmentorum paginis praebere',
 'tog-rememberpassword' => 'Memorare tesserae meae hoc in navigatro inter conventa ({{PLURAL:$1|die|diebus}} $1 tenus)',
 'tog-watchcreations' => 'Paginas quas creo et fasciculos quos impono in paginarum custoditarum indicem addere',
 'tog-watchdefault' => 'Paginas et fasciculos quos recenseo in paginarum custoditarum indicem addere',
@@ -858,7 +855,6 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
 'showhideselectedversions' => 'Monstrare/celare emendationes selectas',
 'editundo' => 'abrogare',
 'diff-empty' => '(Nulla dissimilitudo)',
-'diff-multi' => '(Inter has {{PLURAL:$1|una emendatio|$1 emendationes}} ab {{PLURAL:$2|uno usore|$2 usoribus}} {{PLURAL:$1|facta|factae}} non {{PLURAL:$1|videtur|videntur}})',
 
 # Search results
 'searchresults' => 'Eventum investigationis',
@@ -1521,7 +1517,6 @@ Mutationes posthac huic paginae et paginae disputationis ibi notabuntur.',
 'watchmethod-list' => 'paginas custoditas quaerens pro recensitis recentibus',
 'watchlistcontains' => 'Index paginarum custoditarum tuus $1 {{PLURAL:$1|paginam|paginas}} habet.',
 'iteminvalidname' => "Aerumna cum pagina '$1', nomen non est rectum...",
-'wlnote' => "Subter {{PLURAL:$1|est mutatio proxima|sunt '''$1''' mutationes proximae}} in {{PLURAL:$2|proxima hora|proximis '''$2''' horis}} ex $4, $3.",
 'wlshowlast' => 'Monstrare proximas $1 horas $2 dies $3',
 'watchlist-options' => 'Indicis paginarum custoditarum praeferentiae',
 
@@ -1939,7 +1934,6 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
 'tooltip-pt-watchlist' => 'Paginae quae custodis ut eorum mutationes facilius vides',
 'tooltip-pt-mycontris' => 'Index conlationum tuarum',
 'tooltip-pt-login' => 'Te conventum aperire hortamur, non autem requisitum',
-'tooltip-pt-anonlogin' => 'Te conventum aperire hortamur, non autem requisitum',
 'tooltip-pt-logout' => 'Conventum concludere',
 'tooltip-ca-talk' => 'Disputatio de hac pagina',
 'tooltip-ca-edit' => 'Hanc paginam recensere potes. Quaesumus praevisum inspice antequam servas.',
index 412e815..3305cc7 100644 (file)
@@ -183,7 +183,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Suliñar los atamientos:',
-'tog-justify' => 'Arrimar los paraggrafos de dos vandas',
 'tog-hideminor' => 'Esconder los trocamientos chikos en la hoja de los "trocamientos freskos"',
 'tog-hidepatrolled' => 'Esconder los trocamientos surveyados en la hoja de los "trocamientos freskos"',
 'tog-newpageshidepatrolled' => 'Esconder las hojas surveyadas de la lista de las hojas muevas',
@@ -242,7 +241,7 @@ $messages = array(
 'thursday' => 'Juğeves',
 'friday' => 'Viernes',
 'saturday' => 'Shabbath',
-'sun' => 'Alkh',
+'sun' => 'Al',
 'mon' => 'Lun',
 'tue' => 'Mar',
 'wed' => 'Mie',
@@ -262,29 +261,29 @@ $messages = array(
 'november' => 'Noviembre',
 'december' => 'Diziembre',
 'january-gen' => 'Jenero',
-'february-gen' => 'Hevrero',
+'february-gen' => 'Febrero',
 'march-gen' => 'Março',
-'april-gen' => 'Avril',
+'april-gen' => 'Abril',
 'may-gen' => 'Mayo',
 'june-gen' => 'Juño',
-'july-gen' => 'Jullo',
+'july-gen' => 'Julio',
 'august-gen' => 'Agosto',
 'september-gen' => 'Setiembre',
-'october-gen' => 'Ochòvre',
+'october-gen' => 'Ochobre',
 'november-gen' => 'Noviembre',
-'december-gen' => 'Deziembre',
+'december-gen' => 'Diziembre',
 'jan' => 'Jen',
-'feb' => 'Hev',
+'feb' => 'Feb',
 'mar' => 'Mar',
-'apr' => 'Avr',
+'apr' => 'Abr',
 'may' => 'May',
 'jun' => 'Juñ',
-'jul' => 'Jull',
+'jul' => 'Jul',
 'aug' => 'Ago',
 'sep' => 'Set',
-'oct' => 'Och',
+'oct' => 'Ocho',
 'nov' => 'Nov',
-'dec' => 'Dez',
+'dec' => 'Diz',
 'january-date' => 'Jenero $1',
 'february-date' => 'Fevrero $1',
 'march-date' => 'Marso $1',
@@ -319,12 +318,12 @@ $messages = array(
 
 'about' => 'Encima de',
 'article' => 'Artícůlo de contenido',
-'newwindow' => '(Se avre en una mueva ventana)',
+'newwindow' => '(se avre en una mueva ventana)',
 'cancel' => 'Anular',
 'moredotdotdot' => 'Mas...',
 'morenotlisted' => 'Esta lista no esta kompleta',
 'mypage' => 'Hoja',
-'mytalk' => 'Mi diskusyon',
+'mytalk' => 'Diskusyón',
 'anontalk' => 'Diskusyón para este adresso de IP',
 'navigation' => 'Navigación',
 'and' => '&#32;i',
@@ -335,7 +334,7 @@ $messages = array(
 'qbedit' => 'Trocar',
 'qbpageoptions' => 'Esta hoja',
 'qbmyoptions' => 'Mis hojas',
-'faq' => 'DAD',
+'faq' => 'DDS',
 'faqpage' => 'Project:DDS',
 
 # Vector skin
@@ -353,7 +352,7 @@ $messages = array(
 'vector-view-viewsource' => 'Ver su manadero',
 'actions' => 'Aksiones',
 'namespaces' => 'Espacios de nombres',
-'variants' => 'Formas diferentes',
+'variants' => 'Variantes',
 
 'navigation-heading' => 'Menu de navigasyon',
 'errorpagetitle' => 'Yerro',
@@ -381,7 +380,7 @@ $messages = array(
 'undelete_short' => 'Traer atrás $1 {{PLURAL:$1|trocamientos|trocamientos}}',
 'viewdeleted_short' => 'Ver {{PLURAL:$1|un trocamiento efassado|$1 trocamientos efassados}}',
 'protect' => 'Guadrar',
-'protect_change' => 'trocar el guardadijo',
+'protect_change' => 'trocar',
 'protectthispage' => 'Guardar esta hoja',
 'unprotect' => 'Trocar guardadijo',
 'unprotectthispage' => 'Trocar el guardadijo desta hoja',
@@ -404,9 +403,9 @@ $messages = array(
 'categorypage' => 'Ver la hoja de la katēggoría',
 'viewtalkpage' => 'Ver la diskusyón',
 'otherlanguages' => 'En otras linguas',
-'redirectedfrom' => '(Redirigido desde $1)',
+'redirectedfrom' => '(Redirijado de $1)',
 'redirectpagesub' => 'Hoja redirigida',
-'lastmodifiedat' => 'Esta hoja fue trocada por la vez dalcavo en el $1, a las $2.',
+'lastmodifiedat' => 'Esta hoja fue trocada por la vez dalcavo en el $1, a las $2 la ora.',
 'viewcount' => 'Este pajina fue vijitado {{PLURAL:$1|una vez|$1 vezes}}.',
 'protectedpage' => 'Hoja guardada',
 'jumpto' => 'Saltar a:',
@@ -425,7 +424,7 @@ $1',
 'aboutsite' => 'Encima de {{SITENAME}}',
 'aboutpage' => 'Project:Encima de',
 'copyright' => 'El kontenido se puede topar debasho de la $1 salvo ke indika al kontrario.',
-'copyrightpage' => '{{ns:project}}:Derechos de autor',
+'copyrightpage' => '{{ns:project}}:Derechos del otor',
 'currentevents' => 'Novedades',
 'currentevents-url' => 'Project:Novedades',
 'disclaimers' => 'Refuzo de responsabilitá',
@@ -448,7 +447,7 @@ $1',
 'versionrequiredtext' => 'Se nesesita versyon $1 de MediaWiki para uzar este pajina. Ver [[Special:Version|La pajina de versyon]].',
 
 'ok' => 'DE ACORDDO',
-'retrievedfrom' => 'Acòjido del adresso "$1"',
+'retrievedfrom' => 'Acojido del adresso "$1"',
 'youhavenewmessages' => '{{PLURAL:$3|Tienes}} $1 ($2).',
 'youhavenewmessagesfromusers' => '{{PLURAL:$4|Tiene}} $1 de {{PLURAL:$3|otro usuario|$3 usuarios}}($2).',
 'youhavenewmessagesmanyusers' => 'Tiene $1 de munchos usuarios ($2).',
@@ -475,17 +474,17 @@ $1',
 'site-rss-feed' => 'Fuente de RSS de $1',
 'site-atom-feed' => 'Canal Atomo de $1',
 'page-rss-feed' => '"$1" Fuente RSS',
-'page-atom-feed' => '"$1" Subscripción Atom',
+'page-atom-feed' => 'Canal Atomo de $1',
 'red-link-title' => '$1 (la hoja no egziste)',
 'sort-descending' => 'Atakanar en orden desendente',
 'sort-ascending' => 'Atakanar en orden asendente',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Hoja',
-'nstab-user' => 'Hoja de kullaneador',
+'nstab-user' => 'Hoja de usador',
 'nstab-media' => 'Hoja de Meddia',
 'nstab-special' => 'Hoja especial',
-'nstab-project' => 'Hoja del proyecto',
+'nstab-project' => 'Hoja del projeto',
 'nstab-image' => 'Dosya',
 'nstab-mediawiki' => 'Messaj',
 'nstab-template' => 'Şablón',
@@ -522,7 +521,7 @@ El administrador ke blokeo dio esta esplikasyon: $1',
 En lo mas muncho esto passa por cavsa de un atamiento (link) istoriko a una hoja efaçada.
 
 Si esto no es el cavso, puede ser que topates una chincha (un yerro) en el lojikal (la proǵrama).
-Alora, házemos el plazer de avisar un [[Special:ListUsers/sysop|administrador]] y también escrivirlo la URL (el adresso). Mercí muncho.',
+Alora, házemos el plazer de avisar un [[Special:ListUsers/sysop|administrador]] y también de escrivirlo la URL (el adresso). Mercí muncho.',
 'missingarticle-rev' => '(nº. de revisión: $1)',
 'missingarticle-diff' => '(Dif.: $1, $2)',
 'readonly_lag' => 'La base de datos se a blokeado mientres los servidores se sinkronizan',
@@ -664,26 +663,26 @@ Kontrasenya temporal: $2',
 'italic_sample' => 'Teksto aladado',
 'italic_tip' => 'Teksto aladado',
 'link_sample' => 'Títolo del atamiento',
-'link_tip' => 'Link interno',
+'link_tip' => 'Atamiento (link) interno',
 'extlink_sample' => 'http://www.example.com Títolo del atamiento',
-'extlink_tip' => 'Link eksterno (acόrdate de ajustar el prefiks http://)',
-'headline_sample' => 'Escritura de títolo',
-'headline_tip' => 'Titular de nivel 2',
-'nowiki_sample' => 'Escribid aquí texto sin formato',
-'nowiki_tip' => 'Iñorar el formato wiki',
-'image_tip' => 'Imagen incorporada',
+'extlink_tip' => 'Atamiento esterno (link de afuera: acόdrate de ajustar el prefikso http://)',
+'headline_sample' => 'Teksto del títolo',
+'headline_tip' => 'Títolo de nivel 2',
+'nowiki_sample' => 'El teksto sin formato, escrívelo aquí',
+'nowiki_tip' => 'Iñora el formato viki',
+'image_tip' => 'Dosya encaxada',
 'media_tip' => 'Atamiento de la dosya',
-'sig_tip' => 'Firma, data i ora',
-'hr_tip' => 'Liña orizontala (úsala de vez en cuando)',
+'sig_tip' => 'Tu firma con la data y la ora',
+'hr_tip' => 'Liña orizontal (kulanea poco)',
 
 # Edit pages
-'summary' => 'Resumido:',
+'summary' => 'Rezümé:',
 'subject' => 'Tema/título:',
-'minoredit' => 'Esta es una edición chiquitica',
+'minoredit' => 'Esto es un trocamiento chiquitico',
 'watchthis' => 'Cudia esta hoja',
 'savearticle' => 'Enrejistra la hoja',
 'preview' => 'Echar una ojada',
-'showpreview' => 'Mostrar la previsualización',
+'showpreview' => 'Echar una ojada',
 'showlivepreview' => 'Previsteo bivo',
 'showdiff' => 'Amostrar los trocamientos',
 'anoneditwarning' => "'''Noticia:''' La sesyón no empeçó con un cuento de usuario.
@@ -703,12 +702,12 @@ Tu adresso de IP va ser enrejjistrado en la istoria de la hoja.",
 Para crear esta hoja, empeça a escribir en la caxa de abaxo. Mira [[{{MediaWiki:Helppage}}|la hoja de ayudo]] para saber más.
 Si venites aquí por yerro, torna a la hoja de antes.',
 'noarticletext' => 'En este momento no ay teksto en esta hoja.
-Puedes [[Special:Search/{{PAGENAME}}|buscar el títolo de esta hoja]] en otras hojas,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los rejistros relatados],
-ou [{{fullurl:{{FULLPAGENAME}}|action=edit}} trocar esta hoja]</span>.',
-'noarticletext-nopermission' => 'No ay teksto en esta oja.
-Puedes [[Special:Search/{{PAGENAME}}|bushkar este titolo de oja]] en otras pajinas,
-o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} bushkar en los rejistros relasyonados]</span>.',
+Puedes [[Special:Search/{{PAGENAME}}|buxcar el títolo desta hoja]] en otras hojas,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buxcar en los rejistros],
+u [{{fullurl:{{FULLPAGENAME}}|action=edit}} trocar esta hoja]</span>.',
+'noarticletext-nopermission' => 'En este momento no ay teksto en esta hoja.
+Puedes [[Special:Search/{{PAGENAME}}|buxcar el títolo desta hoja]] en otras hojas,
+u <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buxcar en los rejistros]</span>, ma no tienes la permissión de criar esta hoja.',
 'userpage-userdoesnotexist-view' => 'El cuento del usador $1 no está enrejistrado.',
 'updated' => '(Aktualizado)',
 'note' => "'''Nota:'''",
@@ -743,9 +742,9 @@ Ya egziste.',
 'content-model-css' => 'CSS',
 
 # Parser/template warnings
-'post-expand-template-inclusion-warning' => "'''Avizo:''' La contenencia de xablon está muy grande.
-Algunos xablones no van á ser comprendidos.",
-'post-expand-template-inclusion-category' => 'Hojas ande la contenencia de xablones está sovrepassada',
+'post-expand-template-inclusion-warning' => "'''Aviso:''' Ay munchos şablones y kaji no quedó lugar.
+Algunos şablones no van a caver.",
+'post-expand-template-inclusion-category' => 'Hojas con sovrecarga de şablones',
 'post-expand-template-argument-warning' => "'''Aviso:''' Esta oja tiene kuanto menos un kampo enel xablon muy lungo.
 Este o estos kampos no van ser amostrados",
 'post-expand-template-argument-category' => 'Ojas ke tienen xablones kon parametros no uzados',
@@ -756,15 +755,15 @@ Este o estos kampos no van ser amostrados",
 # History pages
 'viewpagelogs' => 'Ver los registros de esta hoja',
 'currentrev' => "Enderechamiento d'al cavo",
-'currentrev-asof' => 'Enderechamiento de alcavo á las $1',
-'revisionasof' => 'Enderechamiento a las $1',
+'currentrev-asof' => 'Enderechamiento dalcavo de $2 a las $3 la ora',
+'revisionasof' => 'Enderechamiento de $2 a las $3 la ora',
 'revision-info' => 'Revision en data $1 por $2',
 'previousrevision' => '← Enderechamiento de antes',
 'nextrevision' => 'Revizión venidera →',
 'currentrevisionlink' => 'Revisión actual',
-'cur' => 'act',
+'cur' => 'cor',
 'next' => 'venidero',
-'last' => 'de alcavo',
+'last' => 'ant',
 'page_first' => 'primeras',
 'page_last' => 'de alcabo',
 'histlegend' => "Selección de diferencias: marca los selectores de las versiones a comparar y pulsa ''enter'' o el botón de abajo.<br />
@@ -792,7 +791,7 @@ Leyenda: (act) = diferencias con la versión actual,
 'revdelete-radio-set' => 'Eskondido',
 'revdelete-radio-unset' => 'Visible',
 'revdelete-log' => 'Razon:',
-'revdel-restore' => 'troca la vizibilitá',
+'revdel-restore' => 'trocar la vizibilitá',
 'pagehist' => 'La storia de la hoja',
 'revdelete-otherreason' => 'Otro razon/razon adisiyonal',
 'revdelete-reasonotherlist' => 'Otra razón',
@@ -809,7 +808,6 @@ Leyenda: (act) = diferencias con la versión actual,
 'lineno' => 'Liña $1:',
 'compareselectedversions' => 'Comparar versiones escojidas',
 'editundo' => 'des-hazer',
-'diff-multi' => '(No {{PLURAL:$1|es amostrado un trokamiento intermedio echo|son amostrados $1 trokamientos intermedios echos}} por {{PLURAL:$2|un usador|$2 usadores}})',
 
 # Search results
 'searchresults' => 'Resultados de la búxquida',
@@ -822,7 +820,7 @@ Leyenda: (act) = diferencias con la versión actual,
 'shown-title' => 'Amostrar $1 {{PLURAL:$1|resultado|resultados}} por hoja',
 'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => 'Egziste una oja yamada "[[:$1]]" en esta viki',
-'searchmenu-new' => "'''Criar la hoja «[[:$1]]» en esta viki!'''{{PLURAL:$2|0=|También ver la hoja topado kon tu búxquida.|Tambier ver la resulta de tu búxquida.}}",
+'searchmenu-new' => '<strong>Criar la hoja «[[:$1]]» en este viki!</strong>{{PLURAL:$2|0=|También ver la hoja topada con tu búxquida.|También ver las resultas de tu búxquida.}}',
 'searchprofile-articles' => 'Hojas de contènido',
 'searchprofile-project' => 'Hojas de ayudo y hojas de projeto',
 'searchprofile-images' => 'Multimedya',
@@ -832,10 +830,10 @@ Leyenda: (act) = diferencias con la versión actual,
 'searchprofile-project-tooltip' => 'Buxcar en $1',
 'searchprofile-images-tooltip' => 'Buxcar dosyas',
 'searchprofile-everything-tooltip' => 'Buxca en todo el contènido (y mismo en las hojas de diskusyón)',
-'searchprofile-advanced-tooltip' => 'Buxcar en espacios de nombres partilares',
+'searchprofile-advanced-tooltip' => 'Buxcar en espacios de nombres partikolares',
 'search-result-size' => '$1 ({{PLURAL:$2|1 biervo|$2 biervos}})',
 'search-result-category-size' => '{{PLURAL:$1|1 miembro|$1 miembros}} ({{PLURAL:$2|1 basho-kateggoria|$2 basho-kateggoria}}, {{PLURAL:$3|1 dossia|$3 dossias}})',
-'search-redirect' => '(direksión desde $1)',
+'search-redirect' => '(redireksión de $1)',
 'search-section' => '(kapítolo $1)',
 'search-suggest' => 'Quijites dezir: $1',
 'search-interwiki-caption' => 'Proyectos hermanos',
@@ -843,8 +841,8 @@ Leyenda: (act) = diferencias con la versión actual,
 'search-interwiki-more' => '(mas)',
 'searchrelated' => 'lisionado',
 'searchall' => 'todos',
-'showingresultsheader' => "{{PLURAL:$5|Resultado '''$1''' de '''$3'''|Resultados '''$1-$2''' de '''$3'''}} para '''$4'''",
-'search-nonefound' => 'No ay resultados que acumplan los criterios de la búxquida.',
+'showingresultsheader' => "{{PLURAL:$5|Resultado '''$1''' de '''$3'''|Resultados '''$1-$2''' de '''$3'''}} parâ '''$4'''",
+'search-nonefound' => 'No ay resultados por esta búxquida.',
 'powersearch-legend' => 'Búsqueda adelantada',
 'powersearch-ns' => 'Busca en los espacios de nombres:',
 'powersearch-redir' => 'Mostra las redirecciones',
@@ -963,11 +961,11 @@ Leyenda: (act) = diferencias con la versión actual,
 'rcnotefrom' => "Debasho se amostran los trokamientos desde '''$2''' (amostrados fina <b>$1</b>)",
 'rclistfrom' => 'Mostra los trocamientos nuevos empeçando desde $1',
 'rcshowhideminor' => '$1 trocamientos chiquiticos',
-'rcshowhidebots' => '$1 bots',
-'rcshowhideliu' => '$1 kullaneadores enrezhistrados',
-'rcshowhideanons' => '$1 kullaneadores anonimes',
+'rcshowhidebots' => '$1 botes',
+'rcshowhideliu' => '$1 usadores enrejistrados',
+'rcshowhideanons' => '$1 usadores anónimos',
 'rcshowhidepatr' => '$1 trocamientos akavidados',
-'rcshowhidemine' => '$1 mis ediciones',
+'rcshowhidemine' => '$1 mis trocamientos',
 'rclinks' => 'Ver los dal cavo $1 trocamientos en los dal cavo $2 días.<br />$3',
 'diff' => 'dif',
 'hist' => 'ist',
@@ -985,8 +983,8 @@ Leyenda: (act) = diferencias con la versión actual,
 'recentchangeslinked-feed' => 'Trocamientos conectados',
 'recentchangeslinked-toolbox' => 'Trocamientos atados',
 'recentchangeslinked-title' => 'Los trocamientos relacionados con "$1"',
-'recentchangeslinked-summary' => "Esto es la lista de los trocamientos dalcavo de las hojas que relatan a una hoja particòlar (o de los miembros de la kategoría particòlar).
-Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son '''reforçadas'''.",
+'recentchangeslinked-summary' => "Esto es una lista de trocamientos dalcavo en las hojas atadas de una hoja partikolara (u en los miembros de una kategoría partikolara).
+Las hojas en tu [[Special:Watchlist|lista de acavidamiento]] son '''reforçadas'''.",
 'recentchangeslinked-page' => 'Nombre de la hoja',
 'recentchangeslinked-to' => 'Amostra los trocamientos freskos en lugar de la hoja indicada',
 
@@ -994,7 +992,7 @@ Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son '''reforçadas'
 'upload' => 'Suvir una dosya',
 'uploadlogpage' => 'Subidas de arxivos',
 'filename' => 'Nombre de archivo',
-'filedesc' => 'Somario',
+'filedesc' => 'Rezümé',
 'filereuploadsummary' => 'Kambios de archivo:',
 'filesource' => 'Fuente:',
 'filename-tooshort' => 'El nombre del archivo es muy kurto.',
@@ -1025,24 +1023,24 @@ Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son '''reforçadas'
 # File description page
 'file-anchor-link' => 'Dosya',
 'filehist' => 'La istoria de la dosya',
-'filehist-help' => 'Klika encima de una data/ora para vel la dosya desta data.',
+'filehist-help' => 'Taquea (pisa con el ratón) encima de una data/ora parâ ver como era la dosya en esta data.',
 'filehist-revert' => 'aboltar',
-'filehist-current' => 'actual',
+'filehist-current' => 'corriente',
 'filehist-datetime' => 'Data/Ora',
-'filehist-thumb' => 'Minyatura',
-'filehist-thumbtext' => 'Minyatura de la versión á las $1',
+'filehist-thumb' => 'Miniatura',
+'filehist-thumbtext' => 'Miniatura de la versión de $1',
 'filehist-nothumb' => 'Sin minyatura',
-'filehist-user' => 'Kullaneador',
-'filehist-dimensions' => 'Dimensiones',
+'filehist-user' => 'Usador',
+'filehist-dimensions' => 'Boy',
 'filehist-filesize' => 'El boy de la dosya',
-'filehist-comment' => 'Comentario',
+'filehist-comment' => 'Esplicación',
 'filehist-missing' => 'No se topa el archivo',
-'imagelinks' => 'El uso del dosya',
-'linkstoimage' => '{{PLURAL:$1|La hoja venidera da link|Las hojas venideras dan link}} a esta dosya:',
+'imagelinks' => 'Usos de la dosya',
+'linkstoimage' => '{{PLURAL:$1|La hoja venidera se ata|Las hojas venideras se atan}} a esta dosya:',
 'nolinkstoimage' => 'No ay hojas con atamientos a esta dosya.',
 'sharedupload' => 'Este arxivo es de $1 i puede ser usado por otros proyectos.',
-'sharedupload-desc-here' => 'Esta hoja es de $1 y puede ser usado por otros projetos.
-La descripción en su [$2 hoja de descripción del arxivo] está amostrada debaxo.',
+'sharedupload-desc-here' => 'Esta hoja es de $1 y se puede kulanear en otros projetos.
+La esplicación en su [$2 hoja de esplicacíon de la dosya] se ve abaxo.',
 'filepage-nofile' => 'No egziste dingun archivo de este nombre.',
 'uploadnewversion-linktext' => 'Subir una nueva versión de este arxivo',
 'shared-repo-from' => 'de $1',
@@ -1101,7 +1099,7 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
 'newpages' => 'Hojas muevas',
 'newpages-username' => 'Nombre de usuario:',
 'ancientpages' => 'Artikolos mas viejos',
-'move' => 'taşirear',
+'move' => 'Taşirear',
 'movethispage' => 'Tashirea esta hoja',
 'pager-newer-n' => '{{PLURAL:$1|1 venidero|$1 venideros}}',
 'pager-older-n' => '{{PLURAL:$1|1 de antes|$1 de antes}}',
@@ -1116,14 +1114,14 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
 
 # Special:AllPages
 'allpages' => 'Todas las hojas',
-'alphaindexline' => '$1 a $2',
+'alphaindexline' => 'De $1 fina $2',
 'nextpage' => 'La sigiente pajina ($1)',
 'prevpage' => 'Hoja de antés ($1)',
 'allpagesfrom' => 'Mostrar hojas que empecen por:',
 'allpagesto' => 'Mostrar hojas escapadas con:',
 'allarticles' => 'Todas las hojas',
 'allinnamespace' => 'Todas las pajinas (espasio $1)',
-'allpagessubmit' => 'Amostrar la lista',
+'allpagessubmit' => 'Ir',
 
 # Special:Categories
 'categories' => 'Kategorías',
@@ -1170,7 +1168,7 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
 
 # Watchlist
 'watchlist' => 'Lista de akavidamiento',
-'mywatchlist' => 'Mi lista de akavidamientos',
+'mywatchlist' => 'Lista de acavidamientos',
 'watchlistfor2' => 'Para $1 $2',
 'addedwatchtext' => 'La pajina "[[:$1]]" fue anyadido a tu [[Special:Watchlist|lista de escogidas]]. Los trocamientos venideros en esta pajina i en tu pajina de diskusyon assosiada va apareser ayi.',
 'removedwatchtext' => 'La hoja «[[:$1]]» fue eliminada de tu [[Special:Watchlist|lista de escogidas]].',
@@ -1256,7 +1254,7 @@ A continuación se mostran las opciones actuales de la hoja '''$1''':",
 # Contributions
 'contributions' => 'Ajustamientos {{GENDER:$1|del kullaneador|de la kullaneadera}}',
 'contributions-title' => 'Ajustamientos {{GENDER:$1|del usuario|de la usuaria}} $1',
-'mycontris' => 'Mis donos',
+'mycontris' => 'Kontribüsyones',
 'contribsub2' => 'Para {{GENDER:$3|$1}}($2)',
 'uctop' => '(korriente)',
 'month' => 'Desde el mes (i antes):',
@@ -1294,7 +1292,7 @@ A continuación se mostran las opciones actuales de la hoja '''$1''':",
 'blockip' => 'Bloquear usuario',
 'ipadressorusername' => 'Adreso de IP o nombre de usuario:',
 'ipbreason' => 'Razon:',
-'ipboptions' => '2 oras:2 hours,1 día:1 day,3 días:3 days,1 semana:1 week,2 semanas:2 weeks,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 año:1 year,para siempre:infinite',
+'ipboptions' => '2 oras:2 hours,1 día:1 day,3 días:3 days,1 semana:1 week,2 semanas:2 weeks,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 año:1 year,parâ siempre:infinite',
 'badipaddress' => 'Adreso de IP invalido',
 'ipblocklist' => 'Usuarios blokeados',
 'blocklist-reason' => 'Razon',
@@ -1371,26 +1369,26 @@ Si puede ser, escoge otro nombre.',
 'importnopages' => 'No ay pajinas para importar.',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Tu hoja de kullaneador',
+'tooltip-pt-userpage' => 'Tu hoja de usador',
 'tooltip-pt-mytalk' => 'Tu hoja de diskusyón',
 'tooltip-pt-preferences' => 'Mis preferencias',
-'tooltip-pt-watchlist' => 'La lista de los trocamientos acontècidos en las hojas akavidadas.',
-'tooltip-pt-mycontris' => 'La lista de tus donos',
+'tooltip-pt-watchlist' => 'Una lista de trocamientos en las hojas que escojites parâ cudiar u süivar (seguir)',
+'tooltip-pt-mycontris' => 'La lista de tus kontribüsyones',
 'tooltip-pt-login' => 'Te encorajamos de entrar ma no estás obligado',
 'tooltip-pt-logout' => 'Sal de tu cuento',
 'tooltip-ca-talk' => 'Diskusyón encima del artíkolo',
 'tooltip-ca-edit' => 'Puedes trocar esta hoja. Ma te rogamos para que eches una ojada (previsteo) antes de enrejistrarla.',
-'tooltip-ca-addsection' => 'Empeça a un muevo kapítolo',
+'tooltip-ca-addsection' => 'Ajusta un kapítolo muevo',
 'tooltip-ca-viewsource' => 'Esta hoja está guadrada.
 Puedes ver su manadero',
 'tooltip-ca-history' => 'Enderechamientos passados desta hoja',
 'tooltip-ca-protect' => 'Guardar esta hoja',
 'tooltip-ca-delete' => 'Efassar esta hoja',
-'tooltip-ca-move' => 'Taxirea (renombra) esta hoja',
-'tooltip-ca-watch' => 'Ajustar esta hoja a tu lista de akavidamientos',
+'tooltip-ca-move' => 'Taşirea esta hoja (troca el nombre desta hoja)',
+'tooltip-ca-watch' => 'Ajusta esta hoja a tu lista de acavidamientos',
 'tooltip-ca-unwatch' => 'Quita esta hoja de tu lista de escojidos',
 'tooltip-search' => 'Buxca en {{SITENAME}}',
-'tooltip-search-go' => 'Ir a la hoja con este nombre egzakto, si egziste.',
+'tooltip-search-go' => 'Vate a la hoja con este nombre egzakto, si egziste.',
 'tooltip-search-fulltext' => 'Buxca este teksto en las hojas',
 'tooltip-p-logo' => 'Vijita la primera hoja',
 'tooltip-n-mainpage' => 'Vijita la primera hoja',
@@ -1401,9 +1399,9 @@ Puedes ver su manadero',
 'tooltip-n-randompage' => 'Carga una hoja por azardo',
 'tooltip-n-help' => 'Ambézate y topa ayudo',
 'tooltip-t-whatlinkshere' => 'Una lista de todas las hojas del viki que tienen atamientos a esta hoja',
-'tooltip-t-recentchangeslinked' => 'Los trocamientos dalcavo de las hojas atadas a la ésta',
+'tooltip-t-recentchangeslinked' => 'Los trocamientos dalcavo en las hojas atadas a la ésta',
 'tooltip-feed-rss' => 'Sindicación RSS de esta hoja',
-'tooltip-feed-atom' => "Fuente de Atom d'esta hoja",
+'tooltip-feed-atom' => 'Canal Atomo parâ esta hoja',
 'tooltip-t-contributions' => 'Ver la lista de ajustamientos de este usuario',
 'tooltip-t-emailuser' => 'A este usuario, mándale una letra electrόnica (ímey)',
 'tooltip-t-upload' => 'Suve dosyas',
@@ -1416,16 +1414,16 @@ Puedes ver su manadero',
 'tooltip-ca-nstab-project' => 'Ver la hoja del prodjekto',
 'tooltip-ca-nstab-image' => 'Ver la hoja de la dosya',
 'tooltip-ca-nstab-template' => 'Ve el şablón',
-'tooltip-ca-nstab-category' => 'Ve la hoja de categoría',
+'tooltip-ca-nstab-category' => 'Ve la hoja de kategoría',
 'tooltip-minoredit' => 'Márcalo como un trocamiento chiquitico',
-'tooltip-save' => 'Guadrar los trocamientos',
-'tooltip-preview' => 'Que previzualize sus trocamientos, ¡si puede ser, que use esto antes de enregistrar!',
-'tooltip-diff' => 'Mostra los trocamientos que él/ella hizo en el texhto.',
+'tooltip-save' => 'Enrejistra los trocamientos que hizites',
+'tooltip-preview' => 'Echa una ojada a tus trocamientos y assibivas házelo antes de enrejistrar!',
+'tooltip-diff' => 'Te amostra los trocamientos que hizites en el teksto',
 'tooltip-compareselectedversions' => 'Ve las diferencias entre las dos versiones escogidas de esta hoja.',
 'tooltip-watch' => 'Ajusta esta hoja a tu lista de escojidas',
 'tooltip-rollback' => '«Hazer aboltar» haze aboltar todos los trocamientos del usador dalcavo, sólo en klikando una vez.',
-'tooltip-undo' => '«Des-hazer» abolta este trocamiento y lo avre en el modo de previsteo. Permete ajustar una razón en el somario.',
-'tooltip-summary' => 'Entrar un somaryo kurto',
+'tooltip-undo' => '«Des-hazer» abolta este trocamiento y lo avre en el modo de previsteo. Permete escrivir una razón en el rezümé.',
+'tooltip-summary' => 'Esplica en pocos biervos',
 
 # Attribution
 'anonymous' => '{{PLURAL:$1|Uzuario anonimo|Uzuarios anonimos}} de {{SITENAME}}',
@@ -1478,10 +1476,10 @@ Puedes ver su manadero',
 
 Sólo elementos de lista (liñas empeçando con *) se toman en konsidherasyón.
 El primer atamiento de cada liña se deve de atar a una dosya negra (la dosya que se quere blokar).
-Los atamientos venideros que están en la misma liña se konsidheran como eksepsiones (hojas, ande la dosya puede aparecer en la liña, ande se puede kulnear la dosya).',
+Los atamientos venideros que están en la misma liña se konsidheran como eksepsiones (hojas, ande la dosya puede aparecer en la liña, ande se puede kulanear la dosya).',
 
 # Metadata
-'metadata' => 'Metadatos',
+'metadata' => 'Metadados',
 'metadata-help' => 'Esta dosya contiene mas información (metadatos), probablemente ajustada por la kamera dizhital, el eskáner o la proǵrama kullaneado para criarlo o dizhitalizarlo. Si la dosya fue trocada de su estado orizhinal, puede aver pèryido algunos detalyos.',
 'metadata-expand' => 'Mostra los detalyos ekstendidos',
 'metadata-collapse' => 'Esconder los detalyos ekstendidos',
index c7546ca..d01d31a 100644 (file)
@@ -187,7 +187,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Linken ënnersträichen:',
-'tog-justify' => "Ränner vum Text riichten (''justify'')",
 'tog-hideminor' => 'Kleng Ännerungen an de rezenten Ännerunge verstoppen',
 'tog-hidepatrolled' => 'Iwwerkuckten Ännerungen an de "Rezenten Ännerungen" verstoppen',
 'tog-newpageshidepatrolled' => 'Iwwerkuckte Säiten op der Lëscht vun den "Neie Säite" verstoppen',
@@ -350,7 +349,6 @@ $messages = array(
 'vector-action-protect' => 'Spären',
 'vector-action-undelete' => 'Restauréieren',
 'vector-action-unprotect' => 'Spär änneren',
-'vector-simplesearch-preference' => 'Vereinfacht Sichleescht aktivéieren (nëmme beim Ausgesinn Vector)',
 'vector-view-create' => 'Uleeën',
 'vector-view-edit' => 'Änneren',
 'vector-view-history' => 'Versioune weisen',
@@ -813,6 +811,7 @@ Waart w.e.g. $1 ier Dir et nach eng Kéier probéiert.',
 'resettokens-legend' => 'Token zrécksetzen',
 'resettokens-tokens' => 'Token:',
 'resettokens-token-label' => '$1 (aktuelle Wäert: $2)',
+'resettokens-watchlist-token' => 'Token fir de Webfeed (Atom/RSS) vun den [[Special:Watchlist|Ännerungen op Säite vun Ärer Iwwerwaachungslëscht]]',
 'resettokens-done' => 'Token zréckgesat.',
 'resettokens-resetbutton' => 'Selectionéiert Tokens zrécksetzen',
 
@@ -1021,7 +1020,7 @@ Si gouf anscheinend geläscht.",
 'invalid-content-data' => 'Donnéeë vum Inhalt sinn net valabel',
 'content-not-allowed-here' => '"$1"-Inhalt ass op der Säit [[$2]] net erlaabt',
 'editwarning-warning' => 'Wann Dir dës Säit verloosst kann dat dozou féieren datt Dir all Ännerungen, déi Dir gemaach hutt, verléiert.
-Wann Dir ageloggt sidd, kënnt Dir dës Warnung an der Sektioun "Änneren" vun Ären Astellungen ausschalten.',
+Wann Dir ageloggt sidd, kënnt Dir dës Warnung an der Sektioun "{{int:prefs-editing}}" vun Ären Astellungen ausschalten.',
 'editpage-notsupportedcontentformat-title' => 'Format vum Inhalt gëtt net ënnerstëtzt',
 'editpage-notsupportedcontentformat-text' => 'De Format vum Inhalt $1 gëtt net vum Modell vum Inhalt $2 ënnerstëtzt.',
 
@@ -1050,6 +1049,7 @@ Et däerfen net méi wéi $2 {{PLURAL:$2|Ufro|Ufroe}} sinn, aktuell {{PLURAL:$2|
 'undo-success' => "D'Ännerung gëtt réckgängeg gemaach. Iwwerpréift w.e.g. de Verglach ënnendrënner fir nozekuckeen ob et sou richteg ass, duerno späichert w.e.g d'Ännerungen of, fir dës Aktioun ofzeschléissen.",
 'undo-failure' => "D'Ännerung konnt net réckgängeg gemaach ginn, wëll de betraffenen Abschnitt an der Tëschenzäit geännert gouf.",
 'undo-norev' => "D'Ännerung kann net zréckgesat ginn, well et se net gëtt oder well se scho geläscht ass.",
+'undo-nochange' => "D'Ännerung gouf anscheinend schonn zeréckgesat.",
 'undo-summary' => 'Ännerung $1 vu(n) [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussioun]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]]) annulléieren.',
 'undo-summary-username-hidden' => 'Versioun $1 vun engem verstoppte Benotzer zrécksetzen',
 
@@ -1235,7 +1235,8 @@ Denkt w.e.g drunn datt d'Navigatiounslinken d'Wiel vun de Versiounen nees zréck
 'showhideselectedversions' => 'Erausgesicht Versioune weisen/verstoppen',
 'editundo' => 'zréck',
 'diff-empty' => '(Keen Ënnerscheed)',
-'diff-multi' => '({{PLURAL:$1|Eng Tëscheversioun|$1 Tëscheversioune}} vun {{PLURAL:$2|engem|$2}} Benotzer {{PLURAL:$1|gëtt|ginn}} net gewisen)',
+'diff-multi-sameuser' => '({{PLURAL:$1|Eng Tëscheversioun|$1 Tëscheversioune}} vun deemselwechte Benotzer net gewisen)',
+'diff-multi-otherusers' => '({{PLURAL:$1|Eng Tëscheversioun|$1 Tëscheversioune}} vun {{PLURAL:$2|engem anere|$2}} Benotzer {{PLURAL:$1|gëtt|ginn}} net gewisen)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Eng Tëscheversioun|$1 Tëscheversioune}} vu méi wéi $2 {{PLURAL:$2|Benotzer|Benotzer}} ginn net gewisen)',
 'difference-missing-revision' => '{{PLURAL:$2|Eng Versioun|$2 Versioune}} vun dëser Differenz ($1) {{PLURAL:$2|gouf|goufen}} net fonnt.
 
@@ -1256,7 +1257,7 @@ Detailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'shown-title' => '$1 {{PLURAL:$1|Resultat|Resultater}} pro Säit weisen',
 'viewprevnext' => 'Weis ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "* Säit '''[[$1]]'''",
-'searchmenu-new' => "'''Opmaache vun der Säit ''[[:$1|$1]]'' op dëser Wiki!'''",
+'searchmenu-new' => "<strong>Opmaache vun der Säit ''[[:$1]]'' op dëser Wiki!</strong> {{PLURAL:$2|0=|Kuckt och d'Säit déi Dir beim siche fonnt hutt.|Kuckt och d'Resultater déi Dir beim siche fonnt hutt.}}",
 'searchprofile-articles' => 'Säite mat Inhalt',
 'searchprofile-project' => 'Hëllef a Projetssäiten',
 'searchprofile-images' => 'Multimedia',
@@ -1272,6 +1273,7 @@ Detailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'search-result-score' => 'Relevanz: $1 %',
 'search-redirect' => '(Viruleedung $1)',
 'search-section' => '(Abschnitt $1)',
+'search-file-match' => '(Inhalt vum Fichier passt)',
 'search-suggest' => 'Mengt Dir: $1',
 'search-interwiki-caption' => 'Schwësterprojeten',
 'search-interwiki-default' => '$1 Resultater:',
@@ -2080,10 +2082,19 @@ An all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d\'Zil vun d
 'deadendpagestext' => 'Dës Säite si mat kenger anerer Säit op {{SITENAME}} verlinkt.',
 'protectedpages' => 'Gespaart Säiten',
 'protectedpages-indef' => 'Nëmme onbegrenzt-gespaarte Säite weisen',
+'protectedpages-summary' => 'Op dëser Spezialsäit stinn all déi Säiten déi esou protegéiert sinn, datt se net vun alle Benotzer geréckelt oder geännert kënne ginn.',
 'protectedpages-cascade' => 'Nëmme Säiten déi duerch Kaskade gespaart sinn',
 'protectedpages-noredirect' => 'Viruleedunge verstoppen',
 'protectedpagesempty' => 'Elo si keng Säite mat dëse Parameteren gespaart.',
+'protectedpages-timestamp' => 'Zäitstempel',
+'protectedpages-page' => 'Säit',
+'protectedpages-expiry' => 'Spär bis',
+'protectedpages-params' => 'Parameter vun der Spär',
+'protectedpages-reason' => 'Grond',
+'protectedpages-unknown-timestamp' => 'Onbekannt',
+'protectedpages-unknown-performer' => 'Onbekannte Benotzer',
 'protectedtitles' => 'Gespaarten Titel',
+'protectedtitles-summary' => 'Dës Titele goufe gespaart an et ka keng Säit mat esou engem Titel gemaach ginn.',
 'protectedtitlesempty' => 'Zur Zäit si mat de Parameteren déi Dir uginn hutt keng Säite fir neit Uleeë gespaart.',
 'listusers' => 'Benotzerlëscht',
 'listusers-editsonly' => 'Nëmme Benotzer mat Ännerunge weisen',
@@ -2268,6 +2279,7 @@ All weider Ännerungen op dëser Säit an der associéierter Diskussiounssäit g
 'watchmethod-list' => 'Iwwerwaachte Säite ginn op rezent Ännerungen iwwerpréift',
 'watchlistcontains' => 'Op ärer Iwwerwaachungslëscht $1 {{PLURAL:$1|steet $1 Säit|stinn $1 Säiten}}.',
 'iteminvalidname' => "Problem mam Element '$1', ongëltegen Numm ...",
+'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.“',
 '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',
 
@@ -2636,7 +2648,7 @@ Kuckt d'[[Special:BlockList|Spär-Lëscht]] fir all Spären nozekucken.",
 'change-blocklink' => 'Spär änneren',
 'contribslink' => 'Kontributiounen',
 'emaillink' => 'Mail schécken',
-'autoblocker' => 'Dir sidd automatesch gespaart well dir eng IP Adress mam "[[User:$1|$1]]" deelt.
+'autoblocker' => 'Dir sidd automatesch gespaart well Är IP-Adress rezent vum "[[User:$1|$1]]" benotzt gouf.
 De Grond dee fir d\'Spär vum $1 ugi gouf ass: "$2".',
 'blocklogpage' => 'Spärlëscht',
 'blocklog-showlog' => "Dëse Benotzer war virdru gespaart. D'Lëscht vun de Späre ass als Referenz hei ënnendrënner:",
@@ -2878,7 +2890,7 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
 'importuploaderrortemp' => "D'Eropluede vum Fichier huet net funktionéiert. En temporäre Repertoire feelt.",
 'import-parse-failure' => 'Feeler bei engem XML-Import',
 'import-noarticle' => "Keng Säit fir z'importéieren!",
-'import-nonewrevisions' => "All d'Versioune goufe scho virdrunn importéiert.",
+'import-nonewrevisions' => 'Et goufe keng Versiounen importéiert (se waren al entweder scho virdrun importéiert ginn oder se goufen iwwersprong well Feeler dra waren).',
 'xml-error-string' => '$1 an der Zeil $2, Spalt $3, (Byte $4): $5',
 'import-upload' => 'XML-Daten importéieren',
 'import-token-mismatch' => "D'Date vun ärer Sessioun si verluer gaang. Versicht et w.e.g. nach eemol.",
@@ -4024,4 +4036,6 @@ Faktesch alles wat tëscht duebelen Accolade steet gëtt ausgewäert.',
 'expand_templates_generate_rawhtml' => 'HTML-Format weisen',
 'expand_templates_preview' => 'Kucken ouni ofzespäicheren',
 
+# Unknown messages
+'uploadinvalidxml' => 'Den XML am eropgelueden Fichier konnt net verschafft ginn.',
 );
index 6198405..abf4cfc 100644 (file)
@@ -60,7 +60,6 @@ $namespaceGenderAliases = array();
 $messages = array(
 # User preference toggles
 'tog-underline' => 'ЭлячӀунрин кӀаникай цӀар чӀугун',
-'tog-justify' => 'Ччинин гьяркьуьвилихъ текст дуьзрун',
 'tog-hideminor' => 'Мукьвара хьайи дегишвилера авай гъвечӀи дуьзар хъувунар чуьнуьхун',
 'tog-hidepatrolled' => 'Мукьвара хьайи дегишвилера авай къаравулвал авунвай дуьзар хъувунар чуьнуьхун',
 'tog-newpageshidepatrolled' => 'ЦӀийи ччинрин сиягьда къаравулвал авунвай ччинар чуьнуьхун',
@@ -69,9 +68,7 @@ $messages = array(
 'tog-numberheadings' => 'Кьилин цӀарариз автоматдаказ номерар эцигун',
 'tog-showtoolbar' => 'Дуьзар хъувунин алатрин кьвати къалура (JavaScript)',
 'tog-editondblclick' => 'Ччинар кьве тӀампӀуналди дуьзар хъувун (JavaScript герекзава)',
-'tog-editsection' => 'Пай [дуьзар хъувун] патал элячӀун къалура',
 'tog-editsectiononrightclick' => 'Пайдин кьилинцӀардиз эрчӀи патан тӀампӀ авуна пайдин дуьзар хъувуниз мумкинвал гун (JavaScript герекзава)',
-'tog-showtoc' => 'Къенеавайбурун сиягь къалурун (3-й гзаф кьилинцӀарар авай ччинар патал)',
 'tog-rememberpassword' => 'И браузерда зи логин рикӀел хуьхь (лап гзаф $1 {{PLURAL:$1|1=югъ|йикъар}})',
 'tog-watchcreations' => 'За туькӀуьрнавай ччинар зи гуьзетунин сиягьдиз алава авун',
 'tog-watchdefault' => 'За дуьзар хъувунвай ччинар зи гуьзетунин сиягьдиз алава авун',
@@ -557,7 +554,6 @@ $messages = array(
 'lineno' => 'ЦIар $1:',
 'compareselectedversions' => 'Хкягъай жуьреяр гекъигун',
 'editundo' => 'гьич авун',
-'diff-multi' => '({{PLURAL:$2|1=Са уртах|$2 уртахар}} патал авунвай {{PLURAL:$1|1=са арадин жуьре|$1 арадин жуьреяр}} къалурнавач)',
 
 # Search results
 'searchresults' => 'Къекъуьнрин нетижаяр',
index af265bf..2e17eb7 100644 (file)
@@ -13,7 +13,6 @@
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Enyunzi ebengako olukoloboze?',
-'tog-justify' => "Ennyiriri z'enkanankanye",
 'tog-hideminor' => 'Kisa nkyukakyuka entono ezakakolebwa',
 'tog-hidepatrolled' => "Kisa nkyukakyuka ezakakolebwa ezimaz'okulawunibwa",
 'tog-newpageshidepatrolled' => "Mu lukalala olw'empapula mpya tolaga ezimaz'okulawunibwa",
@@ -22,9 +21,7 @@ $messages = array(
 'tog-numberheadings' => "Emitwe gy'emiko ku mpapula gibengako ennamba",
 'tog-showtoolbar' => "Amapeesa g'ebiyamba mu kuwandika galabikenga (kino kyetaagisa JavaScript)",
 'tog-editondblclick' => "Okunyiga eppeesa emirundi ebiri kubikkulenga w'okyusiza olupapula  (kyetaagisa 'JavaScript')",
-'tog-editsection' => "Emiko ku mpapula gibengako enyunzi eza '[kyusa]' ezikuggusa w'osobolera okugikyusiza.",
 'tog-editsectiononrightclick' => "Okunyiga ku omutwe gw'omuko ku lupapula n'eppeesa erya ddyo kubikkulenga w'ogukyusiza (kyetaagisa 'JavaScript')",
-'tog-showtoc' => 'Teekawo endagiriro (singa ku lupapula kubaako emitwe gisukka mu esatu)',
 'tog-rememberpassword' => 'Tereka ekigambo kyange ekikuumi ku kompyuta eno (okumala {{PLURAL:$1|olunaku|ennaku ezitasukka mu}} $1)',
 'tog-watchcreations' => "Empapula zenkolawo ziteekebwenga ku lukalala lw'ezo zengoberera",
 'tog-watchdefault' => "Empapula zenkyusamu ziteekebwenga ku lukalala lw'ezo zengoberera",
index a7c995a..7cfb993 100644 (file)
@@ -157,7 +157,6 @@ $dateFormats = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Links óngersjtriepe',
-'tog-justify' => 'Paragrafe oetvölle',
 'tog-hideminor' => 'Versjtaek klein bewirkinge bie recènte verangeringe',
 'tog-hidepatrolled' => 'Gemarkeerde wieziginge verberge in recente wieziginge',
 'tog-newpageshidepatrolled' => "Gemarkeerde pagina's verberge in de lies mit nuuj pagina's",
@@ -1065,7 +1064,6 @@ Wees zeker det deze wieziging de gesjiedenisdoorloupendheid van de pagina zal be
 'compareselectedversions' => 'Vergeliek geselecteerde versies',
 'showhideselectedversions' => 'Tuin/versjtaek geselecteerde versies',
 'editundo' => 'maak óngedaon',
-'diff-multi' => '({{PLURAL:$1|Ein tusseligkende versie|$1 Tusseligkende versies}} dórch {{PLURAL:$2|eine gebroeker|$2 gebroekers}} {{PLURAL:$1|weurt|waere}} neet getuund)',
 'diff-multi-manyusers' => '($1 tösseligkende versies door mier es $2 gebroekers waere neet waergaeve)',
 
 # Search results
@@ -2038,7 +2036,6 @@ Toekomstige verangeringe aan dees pagina en de biebehurende euverlèkpagina weur
 'watchmethod-list' => "controlere van gevolgde pazjena's veur recènte verangeringe",
 'watchlistcontains' => "Dien volglies bevat $1 {{PLURAL:$1|pazjena|pazjena's}}.",
 'iteminvalidname' => "Probleem mit object '$1', ongeljige naam...",
-'wlnote' => "Hieónger {{PLURAL:$1|steit de lètste verangering|staon de lètste $1 verangeringe}} van {{PLURAL:$2|'t lètste oer|de lètste <b>$2</b> oer}} óp $3 óm $4.",
 'wlshowlast' => 'Tuin lètste $1 ore $2 daag $3',
 'watchlist-options' => 'Opties veur volglies',
 
@@ -2643,7 +2640,6 @@ Slaon de oetveur op dien eige systeem op, en voeg dae dao nao hiej toe.',
 'tooltip-pt-watchlist' => "De lies van gevolgde pagina's.",
 'tooltip-pt-mycontris' => 'Lies van dien biedrage',
 'tooltip-pt-login' => "De weurs aangemeudig om d'ch aan te melje, meh 't is neet verplich.",
-'tooltip-pt-anonlogin' => 'De weurs aangemodigd om in te logge, meh t is neet verplich.',
 'tooltip-pt-logout' => 'Aafmelde',
 'tooltip-ca-talk' => 'Euverlèk euver dit artikel',
 'tooltip-ca-edit' => 'De kins dees pagina verangere.',
index 913d56f..2b3732b 100644 (file)
@@ -126,7 +126,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Sottolineâ i collegamenti',
-'tog-justify' => 'Alliniamento di paragrafi giustificòu',
 'tog-hideminor' => 'asconde e modifiche minori inte ùrtime modifiche',
 'tog-hidepatrolled' => 'Ascondi e modifiche verificæ inte ùrtime modifiche',
 'tog-newpageshidepatrolled' => "Ascondi e paggine verificæ da  l'elenco de paggine ciù reçenti",
@@ -135,9 +134,7 @@ $messages = array(
 'tog-numberheadings' => 'Nùmeraçion aotomàtica di tìtoli de seçión',
 'tog-showtoolbar' => 'Fanni vedde a barra di strumenti de modìffica (serve JavaScript)',
 'tog-editondblclick' => 'Modifica e paggine co-o doggio clic (serve Javascrpt)',
-'tog-editsection' => 'Modifica e seçión co-o colegamento [modifica]',
 'tog-editsectiononrightclick' => 'Modifica e seçión co-o clic drito in sciô tìtolo (serve Javascipt)',
-'tog-showtoc' => "Fanni védde l'indiçe pe-e pàgine con ciù de 3 seçioìn",
 'tog-rememberpassword' => "Arregorda a mæ paròlla d'ordine (a-o màscimo pe $1 {{PLURAL:$1|day|days}})",
 'tog-watchcreations' => 'Azonzi e paggine che creo e i file che carrego a-i oservæ speciâli',
 'tog-watchdefault' => 'Azonzi e paggine e i files che modiffico a-i mæ sotta oservaçion',
@@ -734,7 +731,6 @@ Legenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a ve
 'lineno' => 'Linia $1:',
 'compareselectedversions' => 'Confronta e verscioîn selessionæ',
 'editundo' => 'Anùlla',
-'diff-multi' => '({{PLURAL:$1|Inna revixón intermedia|$1 de revixoìn intermedie}} de {{PLURAL:$2|un utente|$2 utenti}} no son mostræ)',
 
 # Search results
 'searchresults' => 'Resultati da reçerca',
index a41a52b..87f8b1c 100644 (file)
@@ -105,7 +105,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Sutulinia i ligam',
-'tog-justify' => 'Paràgraf: giüstifigaa',
 'tog-hideminor' => 'Scund i mudifegh men impurtant in di "cambiament recent"',
 'tog-hidepatrolled' => 'Scund i mudifegh verifegaa intra i ültem mudifegh',
 'tog-newpageshidepatrolled' => 'Scund i paginn verifegaa de la lista di paginn növ',
@@ -114,10 +113,8 @@ $messages = array(
 'tog-numberheadings' => 'Utu-nümerazión di paragraf',
 'tog-showtoolbar' => 'Fá vidé ai butún da redataziún (JavaScript)',
 'tog-editondblclick' => 'Redatá i pagin cun al dópi clich (JavaScript)',
-'tog-editsection' => 'Abilità edizion di seczion par ligam',
 'tog-editsectiononrightclick' => 'Abilitá redatazziún dai sezziún cun al clic<br />
 süi titul dai sezziún (JavaScript)',
-'tog-showtoc' => "Fà vidè l'indes per i paginn cun püssee de 3 sezión",
 'tog-rememberpassword' => "Regòrdass la mè paròla d'urdin (for a maximum of $1 {{PLURAL:$1|day|days}})",
 'tog-watchcreations' => "Giunta i paginn ch'hoo creaa mì a la lista di paginn che tegni sot ögg",
 'tog-watchdefault' => "Gjüntá i pagin redataa in dala lista dii pagin tegnüü d'öcc",
@@ -637,7 +634,6 @@ Per infurmazion, varda ind el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGE
 'rows' => 'Riich:',
 'columns' => 'Culònn:',
 'searchresultshead' => 'Cerca',
-'resultsperpage' => 'Resültaa pər pagina:',
 'recentchangescount' => "Nümer de mudifegh da mustrà per ''default'':",
 'savedprefs' => 'I preferenz hinn stai salvaa.',
 'timezonelegend' => 'Lucalitaa',
index 1e5de0f..2298a61 100644 (file)
@@ -104,9 +104,7 @@ $messages = array(
 'tog-numberheadings' => 'ໜາຍເລກຫົວຂໍ້ແບບອັດຕະໂນມັດ',
 'tog-showtoolbar' => 'ສະແດງ ທູລບາດັດແກ້ (JavaScript)',
 'tog-editondblclick' => 'ໃຫ້ສາມາດດັດແກ້ ໂດຍ ດັບເບິລ໌ ຄລິກ (JavaScript)',
-'tog-editsection' => 'ໃຫ້ສາມາດ ດັດແກ້ເປັນພາກ ໂດຍ ກົດລິ້ງຄ໌ [ດັດແກ້]',
 'tog-editsectiononrightclick' => 'ໃຫ້ສາມາດ ດັດແກ້ ໂດຍກົດປຸ່ມຂວາ ຂອງເມົາສ໌ ຢູ່ <br /> ຫົວຂໍ້ຂອງພາກ (JavaScript)',
-'tog-showtoc' => 'ສະແດງເນື້ອໃນ (ຂອງ ໝ້າທີ່ມີຫຼາຍກວ່າ 3 ໜາຍເລກຫົວຂໍ້)',
 'tog-rememberpassword' => 'ຈົດຈໍາການເຊັນເຂົ້າຂອງຂ້ອຍ ຢູ່ ຄອມພິວເຕີໜ່ວຍນີ້ (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'tog-watchcreations' => 'ເພີ່ມ ໜ້າທີ່ຂ້ອຍສ້າງ ເຂົ້າໃນ ລາຍການຕິດຕາມ ຂອງ ຂ້ອຍ',
 'tog-watchdefault' => 'ເພີ່ມໜ້າ ທີ່ ຂ້ອຍດັດແກ້ ໃສ່ ລາຍຕິດຕາມ ຂອງ ຂ້ອຍ',
@@ -495,7 +493,6 @@ $messages = array(
 'rows' => 'ແຖວ:',
 'columns' => 'ຖັນ:',
 'searchresultshead' => 'ຊອກຫາ',
-'resultsperpage' => 'ຈຳນວນຜົນການຊອກເຫັນ ຕໍ່ ໜ້າ:',
 'recentchangesdays' => 'ຈຳນວນມື້ສະແດງໃນການປ່ຽນແປງຫຼ້າສຸດ:',
 'recentchangescount' => 'ຈຳນວນການດັດແກ້ສະແດງໃນການປ່ຽນແປງຫຼ້າສຸດ:',
 'savedprefs' => 'ການຕັ້ງຄ່າຂອງທ່ານໄດ້ຖືກບັນທຶກແລ້ວ.',
index 02f926f..e4f4db4 100644 (file)
@@ -16,7 +16,6 @@ $rtl = true;
 $messages = array(
 # User preference toggles
 'tog-underline' => 'هوم پیوند زیرخط دار:',
-'tog-justify' => 'فاصله نيائن سی پاراگرافيا',
 'tog-hideminor' => 'قام كردن ويرايشتيا كؤچك مئن آلشتيا تازه',
 'tog-hidepatrolled' => 'قام كردن ويرايشتيا تیه دیار کرده مئن آلشتيا تازه',
 'tog-newpageshidepatrolled' => 'بلگیا تیه دیار کرده نه مئن نوم گه بلگیا تازه قام کو',
@@ -230,7 +229,7 @@ $messages = array(
 'toolbox' => 'اوزاريا',
 'userpage' => 'ديئن بلگه كارور',
 'projectpage' => 'ديئن بلگه پروجه',
-'imagepage' => 'ديئن بلگه فايل',
+'imagepage' => 'ديئن بلگه جانیا',
 'mediawikipage' => 'ديئن بلگه پيغوم',
 'templatepage' => 'ديئن بلگه قالو',
 'viewhelppage' => 'ديئن بلگه هومياری',
@@ -259,7 +258,7 @@ $messages = array(
 'disclaimers' => 'منكرون',
 'disclaimerpage' => 'پروجه:منكر بيئن كاروريا',
 'edithelp' => 'هومياری سی ويرايشت',
-'helppage' => 'هومياری:محتوا',
+'helppage' => 'هومياری:مینونه',
 'mainpage' => 'سرآسونه',
 'mainpage-description' => 'سرآسونه',
 'policy-url' => 'پروجه:خط و مش',
@@ -316,7 +315,7 @@ $1',
 'nstab-media' => 'بلگه رسانه',
 'nstab-special' => 'بلگيا ويجه',
 'nstab-project' => 'بلگه پروجه',
-'nstab-image' => 'فاين',
+'nstab-image' => 'جانیا',
 'nstab-mediawiki' => 'پيغوم',
 'nstab-template' => 'قالو',
 'nstab-help' => 'بلگه هومياری',
@@ -557,7 +556,7 @@ $1 لطفن سی تلاش هنی صبر بکید',
 'headline_tip' => 'قدم 2 خط سر ون',
 'nowiki_sample' => 'د ایچه یه گل متن بی شلک وارد بکید',
 'nowiki_tip' => 'شلک ویکی نه ندید بگر',
-'image_tip' => 'فایل محاط بيه',
+'image_tip' => 'جانیا محاط بيه',
 'media_tip' => 'فایل هوم پیوند',
 'sig_tip' => 'امضا شما و برچسو وخت',
 'hr_tip' => 'خط افق ونه(سوا سوا دش استفاده کو)',
@@ -765,7 +764,6 @@ $2',
 'showhideselectedversions' => 'شلک دیئن وانیریا انتخاو بیه نه آلشت بکید',
 'editundo' => 'رد كردن',
 'diff-empty' => '(بی فرق)',
-'diff-multi' => '({{جمی:$1|یه گل دوواره دیئن مینجایی|$1مینجا دوواره دیئنیا}} وا {{جمی:$2|یه کارور|$2 کاروریا}} نشو دئه نی)',
 'diff-multi-manyusers' => '({{جمی:$1|یه گل وانیری مینجاگرته|$1وانیریا مینجا گرته}} بیشتر د $2 {{جمی:$2|کارور|کاروریا}} نشو دئه نبیه)',
 
 # Search results
@@ -955,6 +953,7 @@ $2',
 'right-viewmyprivateinfo' => 'دونسمنیا شصقی خوتونه بوینیت(چی نشونی ایمیل،نوم راستکی)',
 'right-editmyprivateinfo' => 'دونسمنیا شصقی خوتونه ویرایشت بکید(چی نشونی ایمیل،نوم راستکی)',
 'right-importupload' => 'دئن بلگه یا د یه گل جانیا سوار بیه',
+'right-unwatchedpages' => 'دیئن نوم گه بلگه یا دیئه نبیه',
 'right-siteadmin' => 'پاگا دونسمنی نه قلف بکید یا نکید',
 'right-sendemail' => 'سی کاروریا هنی ایمیل کل بکید',
 'right-passwordreset' => 'پاسورد ایمیلیا د نو دئه بیه نه بوینیت',
@@ -990,6 +989,7 @@ $2',
 'action-protect' => 'ریترازیا حفاظت د ای بلگه نه آلشت بکید',
 'action-import' => 'بلگه یا نه د ویکی هنی وارد بکید',
 'action-importupload' => 'بلگه یا نه د فایل سوار بیه وارد بکید',
+'action-unwatchedpages' => 'دیئن نوم گه بلگه یا دیئه نبیه',
 'action-siteadmin' => 'پاگا دونسمنی نه قلف بکید یا نکید',
 'action-sendemail' => 'ایمیلیانه کل کو',
 'action-editmywatchlist' => 'سیل برگ خوتونه ویرایشت بکید',
@@ -1213,6 +1213,7 @@ $2',
 'statistics-files' => 'جانیا یا سوار بیه',
 'statistics-views-total' => 'همه نه بوینیت',
 'statistics-views-peredit' => 'هر ویرایشت نه بوینیت',
+'statistics-users' => 'ثوت نام بیه [[ویجه:نوم گه کاروریا|کاروریا]]',
 'statistics-users-active' => 'کاروریا کارکو',
 'statistics-mostpopular' => 'بلگه یایی که بیشتر دیئه بینه',
 
@@ -1256,8 +1257,11 @@ $2',
 'shortpages' => 'بلگه یا کؤچک',
 'longpages' => 'بلگه یا گپ',
 'protectedpages' => 'بلگه یا حفاظت بيه',
+'listusers' => 'نوم گه کارور',
+'listusers-editsonly' => 'فقط کاروریایی که ویرایشت می کن نشو بیه',
 'usercreated' => '{{جنسیت:$3|راس بیه}}د $1 at $2',
 'newpages' => 'بلگيا نو',
+'newpages-username' => 'نوم كاروری:',
 'move' => 'جاوه جا بوئيت',
 'movethispage' => 'ای بگله نه جا وه جا كو',
 'pager-newer-n' => '{{جمی:$1|وانها تر 1وانها تر $1}}',
@@ -1284,15 +1288,30 @@ $2',
 # Special:Categories
 'categories' => 'دسه يا',
 
+# Special:DeletedContributions
+'deletedcontributions' => 'هومیاریا پاک بیه کارور',
+
 # Special:LinkSearch
 'linksearch-ns' => 'نوم جا:',
+'linksearch-ok' => 'پی جوری',
 'linksearch-line' => '$1 داره د $2 هوم پیوند بوئه',
 
+# Special:ListUsers
+'listusers-noresult' => 'هیچ کاروری پیدا نبی',
+
+# Special:ActiveUsers
+'activeusers' => 'نوم گه کاروریا کارکو',
+'activeusers-noresult' => 'هیچ کاروری پیدا نبی',
+
 # Special:ListGroupRights
 'listgrouprights-members' => '(نوم گه اندومیا)',
 
 # Email user
 'emailuser' => 'ای كارور نه ايميل كو',
+'emailuser-title-target' => 'ایمیل سی ای {{جنس:$1|کارور}}',
+'emailpage' => 'ایمیل کارور',
+'defemailsubject' => '{{نوم سیل جا}} ایمیل د کارور "$1"',
+'emailusername' => 'نوم كاروری:',
 
 # Watchlist
 'watchlist' => 'سیل برگ',
@@ -1302,11 +1321,21 @@ $2',
 'watchnologintext' => 'شما سی آلشت دئن سیل برگتو با [[ویجه:وامین اومائن کارور|وامین اومائه]]',
 'watch' => 'سيل كردن',
 'unwatch' => 'ديه نبيه',
+'notanarticle' => 'مینونه هیچ بلگه ای نئ',
 'watchlist-details' => '{{جمی:$1|$1 بلگه|$1 بلگیا}} د سیل برگتو هیش بلگه قسه کردن نی .',
+'wlheader-enotif' => 'وارسیاری ایمیل فعال بیه.',
+'wlheader-showupdated' => 'بلگه یایی که د آخرین کرتی که شما دشو دیئن کردیته آلشت بینه د <strong>توپر</strong>نشون دئه بینه',
 'wlshowlast' => 'آخرین$1 ساعتیا $2و روزیا $3 نشو بیئه',
 'watchlist-options' => 'گزینیا سیل برگ',
 
+'enotif_mailer' => '{{نوم سیلجا}} وارسیاری ایمیل زننه',
+'enotif_reset' => 'همه بلگه یا دیئه بینه نشودار بکید',
+'enotif_impersonal_salutation' => '{{نوم سیلجا}} کارور',
+'enotif_lastvisited' => 'همه آلشتیا$1 د اوسه که شما د آخرین بار دیئته بوینیت.',
+
 # Delete
+'excontent' => 'مینونه :"$1" بی',
+'exbeforeblank' => 'مینونه حالی دمایی:"$1" بی',
 'actioncomplete' => 'عملكرد كامل بيه',
 'actionfailed' => 'عملكرد شكست حرده',
 'dellogpage' => 'لاگ پاك كردن',
@@ -1324,6 +1353,9 @@ $2',
 'modifiedarticleprotection' => 'ریتراز حفاظت د "[[$1]]" آلشت بیه',
 'protect-title' => 'ریتراز حفاظت د "$1" آلشت بیه',
 'prot_1movedto2' => '[[$1]] د [[$2]] جا وه جا بی',
+'protect-default' => 'همه کاروریا اجازه دارن',
+'protect-othertime' => 'وخت هنی:',
+'protect-expiry-options' => '1 ساعت:1 ساعت,1 روز:1 روز,1 هفته:1 هفته,2 هفته:2 هفته,1 ما:1 ما,3 ما:3 ما,6 ما:6 ما,1 سال:1 سال,بی حساو:بی حساو',
 'restriction-type' => 'دسرسی:',
 
 # Restrictions (nouns)
@@ -1337,6 +1369,8 @@ $2',
 'undeletelink' => 'بوين/دوواره آماده با',
 'undeleteviewlink' => 'ديئن',
 'cannotundelete' => 'زنه کردن انجوم نبی:$1',
+'undelete-search-title' => 'بلگه یا پاک بیه نه پی جوری کو',
+'undelete-search-submit' => 'پی جوری',
 'undelete-error-short' => 'خطا پاک نبیئن جانیا:$1',
 
 # Namespace form on various pages
@@ -1382,9 +1416,19 @@ $2',
 'whatlinkshere-filters' => 'فيلتريا',
 
 # Block/unblock
-'ipboptions' => '2 ساعتیا:2 ساعت,1 رو:1 رو,3 روزا:3 رو,1 هفته:1 هفته,2 هفته یا:2 هفته,1 ما:1 ما,3 ما:3 میا,6 ما:6 مایا,1 سال:1سال,حد ناره:حد ناره',
+'block' => 'منع کارور',
+'blockip' => 'منع کارور',
+'ipbother' => 'وخت هنی:',
+'ipboptions' => '2 ساعتیا:2 ساعت,1 رو:1 رو,3 روزا:3 رو,1 هفته:1 هفته,2 هفته یا:2 هفته,1 ما:1 ما,3 ما:3 میا,6 ما:6 مایا,1 سال:1سال,بی حساو:بی حساو',
+'ipbhidename' => 'نوم کاروری نه سی ویرایشت یا و نوم گه یا قام کو',
+'unblockip' => 'کارور منع نبیه',
+'blocklist' => 'كاروريا منع بيه',
 'ipblocklist' => 'كاروريا منع بيه',
+'ipblocklist-legend' => 'یه گل کارور منع بیه بجوریت',
+'blocklist-timestamp' => 'چسب ون وخت',
+'ipblocklist-submit' => 'پی جوری',
 'blocklist-nousertalk' => 'نبوئه بلگه چک چنه خوتونه ویرایشت بکید',
+'ipblocklist-empty' => 'جاگه نوم گه حالیه',
 'blocklink' => 'بسته بوئه',
 'unblocklink' => 'بی قطی',
 'change-blocklink' => 'اجازه نديئن سی  آلشت',
@@ -1400,6 +1444,7 @@ $2',
 'movenotallowedfile' => 'شما وه جا وه جا کردن جانیایا دسرسی ناریت',
 'movepagebtn' => 'بلگه جا وه جا کو',
 'movelogpage' => 'جاوه جا کردن',
+'movelogpagetext' => 'د هار یه گل نوم گه د جا وه جایی یا بلگه هئ',
 'revertmove' => 'لرستن',
 'delete_and_move' => 'پاک و جا وه جا بوئه',
 
@@ -1488,8 +1533,14 @@ $2',
 'tooltip-summary' => 'يه چكسته كؤچك وارد بكيد',
 'interlanguage-link-title' => '$1-$2',
 
+# Attribution
+'anonymous' => 'ناشناس {{جمی:$1|کارور|کاروریا}}  {{سیل جا}}',
+'anonuser' => '{{سیل جا}}  کارور ناشناس $1',
+'siteusers' => '{{نوم سیل جا}} {{جمی:$2|کارور|کاروریا}} $1',
+
 # Info page
 'pageinfo-language' => 'بلگه مینونه زون',
+'pageinfo-content-model' => 'شلگ مینونه بلگه',
 'pageinfo-category-files' => 'شماره جانیایا',
 
 # Patrol log
@@ -1507,13 +1558,22 @@ $2',
 'file-nohires' => 'عسك ون بالاتري دش ني',
 'svg-long-desc' => 'اس وی جی فايل.نومنا $1 $2 پيكسل',
 'show-big-image' => 'فایل اصلی',
+'file-info-png-repeat' => '$1 بازی کرده{{جمی:$1|وخت|وختیا}}',
 
 # Special:NewFiles
 'newimages' => 'عسگدونی جانیایا تازه',
 'newimages-summary' => 'ای بلگه یا ویجه همه جانیایا سوار بیه نه نشو می ئین.',
 'newimages-label' => 'نوم جانیا(یا بشقی د وه):',
+'ilsubmit' => 'پی جوری',
 'sp-newimages-showfrom' => 'جانیایا تازه نه که $2 ، $2 شرو بینه نشو بیه',
 
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'days' => '{{جمی:$1|1$ روز|$1 روز}}',
+'years' => '{{جمی:$1|$1 سال|$1 سال}}',
+
+# Human-readable timestamps
+'monday-at' => 'دوشمه د $1',
+
 # Bad image list
 'bad_image_list' => 'دونسمنديانه وه ای شلگ وارد بكيت:
 
@@ -1540,20 +1600,37 @@ $2',
 
 # Exif tags
 'exif-datetime' => 'آلشت دئن وخت و دمون جانیا',
+'exif-make' => 'سازنه دیربین',
 'exif-usercomment' => 'ویر و باوریا کارور',
 'exif-relatedsoundfile' => 'جانیا دنگ دار مرتوط',
+'exif-datetimeoriginal' => 'دمون و وخت راس بیئن دونسمنیا',
 'exif-filesource' => 'سرچشمه جانیا',
+'exif-gpstimestamp' => 'وخت جی پی اس (ساعت اتمی)',
 'exif-jpegfilecomment' => 'ویر و باور فایل پی ان جی',
+'exif-citycreated' => 'شهری که عسگ دش گرته بیه',
+'exif-citydest' => 'شهر دیار بیه',
+'exif-fixtureidentifier' => 'نوم ثاوت',
 'exif-languagecode' => 'زون',
+'exif-datetimeexpires' => 'وا نها دش استفاده نبوئه',
 'exif-pngfilecomment' => 'ویر و باور فایل جی پی ان جی',
 'exif-giffilecomment' => 'ویر و باور فایل جی آی اف',
 
+'exif-componentsconfiguration-0' => 'نی یش',
+
+'exif-exposureprogram-1' => 'دسی',
+
+'exif-lightsource-1' => 'روشنایی روز',
+
+'exif-scenecapturetype-3' => 'چی شو',
+
 # Pseudotags used for GPSAltitudeRef
 'exif-gpsaltitude-above-sealevel' => '$1 {{جمی:$1|متر|متریا}} وارؤ د ریتراز دریا',
 'exif-gpsaltitude-below-sealevel' => '$1 {{جمی:$1|متر|متریا}} وارؤ د ریتراز دریا',
 
 'exif-gpsdop-good' => 'خو ($1)',
 
+'exif-iimcategory-ace' => 'هنریا، رهزیشت و زیستگه',
+
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'همه شو',
 'namespacesall' => 'همه شو',
@@ -1563,11 +1640,15 @@ $2',
 'imgmultigo' => 'رؤ!',
 
 # Language selector for translatable SVGs
+'img-lang-default' => '(زون پیش زمینه)',
 'img-lang-go' => 'رو',
 
 # Table pager
 'table_pager_limit_submit' => 'رو',
 
+# Auto-summaries
+'autosumm-replace' => 'مینونه وا "َ$1" جاگزین بی',
+
 # Watchlist editing tools
 'watchlisttools-view' => 'آلشتیا مرتوط نه بوینیت',
 'watchlisttools-edit' => 'سیل برگ بوینیتو و ویرایشت بکید',
@@ -1593,12 +1674,31 @@ $2',
 'specialpages' => 'بلگيا ويجه',
 'specialpages-group-changes' => 'آلشتیا تازه و پهرستنومه یا',
 'specialpages-group-media' => 'گزارشتیا رسانه و سوارکردیا',
+'specialpages-group-users' => 'کاروریا و حقوق',
+'specialpages-group-pages' => 'نوم گه بلگه یا',
 
 # External image whitelist
 'external_image_whitelist' => 'یه خط نه ول بکید چی وه<pre>',
 
 # Special:Tags
 'tag-filter' => 'فيلتر [[Special:Tags|Tag]]:',
+'tags-display-header' => 'دیاری کردن د نوم گه آلشتیا',
+
+# Special:ComparePages
+'compare-title-not-exists' => 'سرون مشقص بیه وجود ناره.',
+'compare-revision-not-exists' => 'وانئری که شما تی دیار کردیته وجود ناره.',
+
+# New logging system
+'revdelete-content-hid' => 'مینونه قام بیه',
+'revdelete-uname-hid' => 'نوم کاروری قام بیه',
+'revdelete-content-unhid' => 'مینونه قام نبیه',
+'revdelete-uname-unhid' => 'نوم کاروری قام نبیه',
+
+# Feedback
+'feedback-close' => 'انجوم بی',
+
+# Search suggestions
+'searchsuggest-search' => 'پی جوری',
 
 # API errors
 'api-error-badaccess-groups' => 'شما سی سوار کرد جانیایا د ای ویکی اجازه ناریت.',
@@ -1607,6 +1707,10 @@ $2',
 'api-error-illegal-filename' => 'نوم جانیا اجازه دئه نئ.',
 'api-error-mustbeloggedin' => 'شما سی سوارکردن فایلیا با بیایت وامین',
 
+# Durations
+'duration-days' => '$1{{جمی:$1|روز|روزیا}}',
+'duration-years' => '$1{{جمی:$1| سال|سالیا}}',
+
 # Special:ExpandTemplates
 'expand_templates_remove_comments' => 'جا وه جا بیئن ویر و باوریا',
 
index 203c9d2..ea39edf 100644 (file)
@@ -187,7 +187,6 @@ $dateFormats = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Pabraukti nuorodas:',
-'tog-justify' => 'Lygiuoti pastraipas pagal abi puses',
 'tog-hideminor' => 'Slėpti smulkius pakeitimus naujausių keitimų sąraše',
 'tog-hidepatrolled' => 'Slėpti patikrintus keitimus paskutinių keitimų sąraše',
 'tog-newpageshidepatrolled' => 'Slėpti patikrintus puslapius iš naujausių straipsnių sąrašo',
@@ -1181,7 +1180,6 @@ Prašome patikrinti sąrašus.',
 'compareselectedversions' => 'Palyginti pasirinktas versijas',
 'showhideselectedversions' => 'Rodyti/slėpti pasirinktas versijas',
 'editundo' => 'atšaukti',
-'diff-multi' => '($2 {{PLURAL:$2|naudotojo|naudotojų|naudotojų}} $1 {{PLURAL:$1|tarpinis keitimas nėra rodomas|tarpiniai keitimai nėra rodomi|tarpinių keitimų nėra rodoma}})',
 'diff-multi-manyusers' => '(daugiau nei $2 {{PLURAL:$2|naudotojo|naudotojų|naudotojų}} $1 {{PLURAL:$1|tarpinis keitimas nėra rodomas|tarpiniai keitimai nėra rodomi|tarpinių keitimų nėra rodoma}})',
 
 # Search results
@@ -2165,7 +2163,6 @@ taip pat bus '''paryškinti''' [[Special:RecentChanges|naujausių keitimų sąra
 'watchmethod-list' => 'ieškoma naujausių keitimų stebimuose puslapiuose',
 'watchlistcontains' => 'Jūsų stebimųjų sąraše yra $1 {{PLURAL:$1|puslapis|puslapiai|puslapių}}.',
 'iteminvalidname' => 'Problema su elementu „$1“, neteisingas vardas...',
-'wlnote' => "{{PLURAL:$1|Rodomas '''$1''' paskutinis pakeitimas, atliktas|Rodomi '''$1''' paskutiniai pakeitimai, atlikti|Rodoma '''$1''' paskutinių pakeitimų, atliktų}} per '''$2''' {{PLURAL:$2|paskutinę valandą|paskutines valandas|paskutinių valandų}}, nuo $3 $4.",
 'wlshowlast' => 'Rodyti paskutinių $1 valandų, $2 dienų ar $3 pakeitimus',
 'watchlist-options' => 'Stebimųjų sąrašo parinktys',
 
@@ -2819,7 +2816,6 @@ Išsaugokite jį savo kompiuteryje ir įkelkite jį čia.',
 'tooltip-pt-watchlist' => 'Puslapių sąrašas, kuriuos jūs pasirinkote stebėti.',
 'tooltip-pt-mycontris' => 'Jūsų darytų keitimų sąrašas',
 'tooltip-pt-login' => 'Rekomenduojame prisijungti, nors tai nėra privaloma.',
-'tooltip-pt-anonlogin' => 'Rekomenduojame prisijungti, nors tai nėra privaloma.',
 'tooltip-pt-logout' => 'Atsijungti',
 'tooltip-ca-talk' => 'Puslapio turinio aptarimas',
 'tooltip-ca-edit' => 'Jūs galite redaguoti šį puslapį. Nepamirškite paspausti peržiūros mygtuką prieš išsaugodami.',
index 6f7cf4f..835d153 100644 (file)
@@ -14,7 +14,6 @@
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Zawmna hnuairinna',
-'tog-justify' => 'Hlawm tinte tlang tirual rawh',
 'tog-hideminor' => 'Siamţhatna tenau tihdanglam thar zingah tilang suh',
 'tog-hidepatrolled' => 'Siamţhat venhim tihdanglam thar zingah tilang suh',
 'tog-newpageshidepatrolled' => 'Phêk venhim phêk thar tlarah tilang suh',
@@ -23,9 +22,7 @@ $messages = array(
 'tog-numberheadings' => 'A thupuite amahin nambar inpêktir rawh',
 'tog-showtoolbar' => 'Siamṭhatna hmanraw-liang tilang rawh (JavaScript a ngai)',
 'tog-editondblclick' => 'Hmehphìrin phêk siamṭha rawh (JavaScript a ngai)',
-'tog-editsection' => 'Hlawm hrang siamṭhatna [siamṭhatna] zawmna hmangin awmtir rawh',
 'tog-editsectiononrightclick' => 'Hlawm thupui ding-hmeh hmangin hlawm siamţhat theihna awmtir rawh (JavaScript a ngai)',
-'tog-showtoc' => 'A chhunga thu awm te tilang rawh (thupui 3 aia tam phêk tan)',
 'tog-rememberpassword' => 'He ka rangpuifannaah hian min hre reng rawh (a rei berah ni $1  {{PLURAL:$1}})',
 'tog-watchcreations' => 'Ka phêk siamte leh ka taksa hlankaite ka ralvèn zing-ah telh rawh',
 'tog-watchdefault' => 'Ka phêk siamţhatte ka ralvèn zing-ah telh rawh',
@@ -703,7 +700,6 @@ Lamtawi hmante: '''({{int:cur}})'''= ennawnna thar ber nena danglamna, '''({{int
 'lineno' => 'Tlar $1:',
 'compareselectedversions' => 'Ennawnna i thlan tâkte khaikhin rawh le',
 'editundo' => 'tihletna',
-'diff-multi' => '(Hmangtu {{PLURAL:$2|1-in|$2-ten}} a karlaka {{PLURAL:$2|a|an}} ennawnna {{PLURAL:$1|1|$1-te}} tihlan a ni lo)',
 
 # Search results
 'searchresults' => 'Zawn hmuhte',
@@ -1640,7 +1636,6 @@ Khawngaihin tum nawn leh rawh.',
 'tooltip-pt-watchlist' => 'Tihdanglam tùra i ruahman phêkte',
 'tooltip-pt-mycontris' => 'I kutthawhna-ho ziahchhuahna',
 'tooltip-pt-login' => 'Inziak lut tura duh i ni; amaherawhchu a ţül kher lo.',
-'tooltip-pt-anonlogin' => 'Inziak lut tura duh i ni; amaherawhchu, a ţül kher lo',
 'tooltip-pt-logout' => 'Chhuahna',
 'tooltip-ca-talk' => 'He phêk chungchang sawihona',
 'tooltip-ca-edit' => 'Hemi phek hi i siamţha thei.
index bae6973..4bdcf8c 100644 (file)
@@ -55,7 +55,6 @@ $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Pasvītrot saites:',
-'tog-justify' => 'Izlīdzināt rindkopām abas malas',
 'tog-hideminor' => 'Paslēpt maznozīmīgus labojumus pēdējo izmaiņu lapā',
 'tog-hidepatrolled' => 'Slēpt apstiprinātās izmaņas pēdējo izmaiņu sarakstā',
 'tog-newpageshidepatrolled' => 'Paslēpt pārbaudītās lapas jauno lapu sarakstā',
@@ -959,7 +958,6 @@ $1",
 'showhideselectedversions' => 'Rādīt/slēpt izvēlētās versijas',
 'editundo' => 'atcelt',
 'diff-empty' => '(Nav atšķirību)',
-'diff-multi' => '({{PLURAL:$1|Viena starpversija|$1 starpversijas}} no {{PLURAL:$2|viena lietotāja|$2 lietotājiem}} nav parādīta)',
 
 # Search results
 'searchresults' => 'Meklēšanas rezultāti',
@@ -1289,7 +1287,7 @@ Ja tu izvēlies to norādīt, tas tiks izmantots, lai identificētu tavu darbu (
 'rclistfrom' => 'Parādīt jaunas izmaiņas kopš $1',
 'rcshowhideminor' => '$1 maznozīmīgos',
 'rcshowhidebots' => '$1 botus',
-'rcshowhideliu' => '$1 reģistrēti lietotāji',
+'rcshowhideliu' => '$1 reģistrētos lietotājus',
 'rcshowhideanons' => '$1 anonīmos',
 'rcshowhidepatr' => '$1 pārbaudītie labojumi',
 'rcshowhidemine' => '$1 manus',
index 0ec2012..dca9f2c 100644 (file)
@@ -152,7 +152,6 @@ $digitTransformTable = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => '鏈墊線:',
-'tog-justify' => '齊段落',
 'tog-hideminor' => '隱近校',
 'tog-hidepatrolled' => '隱近巡',
 'tog-newpageshidepatrolled' => '隱新巡',
@@ -1011,7 +1010,6 @@ $1",
 'compareselectedversions' => '辨二擇',
 'showhideselectedversions' => '示/藏之擇',
 'editundo' => '悔',
-'diff-multi' => '($2作未示之審有$1)',
 'diff-multi-manyusers' => '($2多作未示之審有$1)',
 
 # Search results
@@ -1858,7 +1856,6 @@ $1',
 'watchmethod-list' => '報近易…',
 'watchlistcontains' => '共$1哨。',
 'iteminvalidname' => "'$1'謬名。",
-'wlnote' => '近<b>$2</b>時有$1者易。',
 'wlshowlast' => '見近$1時、$2天、$3時易',
 'watchlist-options' => '哨項',
 
@@ -2358,7 +2355,6 @@ $1',
 'tooltip-pt-watchlist' => '收矚目、治眼線、賞萌茂',
 'tooltip-pt-mycontris' => '刻勛功、追作續、慰苦勞',
 'tooltip-pt-login' => '設書齋、錄功績、廣放哨',
-'tooltip-pt-anonlogin' => '設書齋、錄功績、廣放哨',
 'tooltip-pt-logout' => '凡事盡,乘雲飄',
 'tooltip-ca-talk' => '求異見、辯是非、妥紛擾',
 'tooltip-ca-edit' => '拓文意、校誤謬、潤辭藻',
index 0b6785c..3905585 100644 (file)
@@ -30,7 +30,6 @@ $fallback = 'hi';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'लिंककेँ रेखांकित करू:',
-'tog-justify' => 'सुगढ़ बनाऊ',
 'tog-hideminor' => 'सन्निकट परिवर्त्तनमे छोट परिवर्त्तन नुकाऊ',
 'tog-hidepatrolled' => 'सन्निकट परिवर्त्तनमे छोट परिवर्त्तन नुकाऊ',
 'tog-newpageshidepatrolled' => 'नियंत्रित सम्पादनकेँ नव पन्ना सूचीसँ नुकाऊ',
@@ -936,7 +935,6 @@ $3 द्वारा देल कारण अछि ''$2''",
 'compareselectedversions' => 'चयन कएल संशोधन सभक तुलना करू',
 'showhideselectedversions' => 'देखाउ/ नुकाउ चयनित संशोधन सभ',
 'editundo' => 'असंपादन',
-'diff-multi' => '({{PLURAL:$1|मध्यबला संशोधन|$1 मध्यबला संशोधन सभ}} द्वारा {{PLURAL:$2|एकटा प्रयोक्ता|$2 प्रयोक्ता सभ}} नै देखाएल)',
 'diff-multi-manyusers' => '({{PLURAL:$1|एकटा मध्यस्थ संशोधन|$1 मध्यस्थ संशोधन सभ}} $2 सँ बेसी {{PLURAL:$2|प्रयोक्ता|प्रयोक्ता सभ}} नै देखाएल)',
 
 # Search results
@@ -1870,7 +1868,6 @@ $1',
 'watchmethod-list' => 'साकांक्ष-सूचीक हालक सम्पादनकेँ देखि रहल छी',
 'watchlistcontains' => 'अहाँक साकांक्ष-सूचीमे अछि $1 {{PLURAL:$1|पन्ना|पन्ना}}।',
 'iteminvalidname' => "'$1' क संग समस्या, अमान्य नाम ...",
-'wlnote' => "नीचाँ {{PLURAL:$1|is the last change|are the last '''$1''' changes}} अन्तिम {{PLURAL:$2|hour|'''$2''' hours}} $3, $4 जेना।",
 'wlshowlast' => 'देखाउ अन्तिम $1 घण्टा $2 दिन $3',
 'watchlist-options' => 'साकांक्षसूचीक विकल्प सभ',
 
@@ -2493,7 +2490,6 @@ $1 एकर प्रतिबन्धक कारण अछि : "$2"',
 'tooltip-pt-watchlist' => 'पन्ना सभ जकर परिवर्त्तन पर अहाँक नजरि अछि',
 'tooltip-pt-mycontris' => 'अहाँक योगदानक सूची',
 'tooltip-pt-login' => 'लॉग इन करब नीक, परञ्च आवश्यक नहि.',
-'tooltip-pt-anonlogin' => 'सम्प्रवेश करब नीक, परञ्च, आवश्यक नै।',
 'tooltip-pt-logout' => 'फेर आयब',
 'tooltip-ca-talk' => 'विषयसूचीक पन्नाक संबंधमे वर्त्तालाप',
 'tooltip-ca-edit' => 'अहाँ एहि पन्नाकेँ संपादित कए सकैत छी। कृपया सुरक्षित करबासँ पहिने पूर्वप्रदर्शन बटम उपयोग करू।',
index 108ac26..97cb4ec 100644 (file)
@@ -18,7 +18,6 @@ $fallback = 'jv, id';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Garisen ngisoré pranala:',
-'tog-justify' => 'Ratakna paragraf',
 'tog-hideminor' => 'Umpetna suntingan cilik nang owahan anyar',
 'tog-hidepatrolled' => 'Umpetna suntingan sing wis dipatroli nang owahan anyar',
 'tog-newpageshidepatrolled' => 'Umpetna kaca sing wis dipatroli sekang daftar kaca anyar',
@@ -27,9 +26,7 @@ $messages = array(
 'tog-numberheadings' => 'Aweh nomer judul secara otomatis',
 'tog-showtoolbar' => 'Tidhokna bilah alat penyuntingan',
 'tog-editondblclick' => 'Nyunting kaca nganggo dobel klik (mbutuhna JavaScript)',
-'tog-editsection' => 'Aktifna penyuntingan subbagian ngliwati pranala [sunting]',
 'tog-editsectiononrightclick' => 'Aktifna penyuntingan subbagian nganggo klik-tengen nang judul bagian (mbutuhna JavaScript)',
-'tog-showtoc' => 'Tidhokna daftar isine (kanggo kaca sing duwe lewih sekang 3 subbagian)',
 'tog-rememberpassword' => 'Emutna data login-ne inyong nang peramban kiye (kanggo paling suwe $1 {{PLURAL:$1|dina|dina}})',
 'tog-watchcreations' => 'Tambahna kaca gaweanne inyong lan berkas sing tek unggah nang daptar pangawasanne inyong',
 'tog-watchdefault' => 'Tambahna kaca lan berkas sing tek-sunting maring daptar pangawasanne inyong',
@@ -894,7 +891,6 @@ Gatèkna, angger nganggo pranala navigasi kuwe bakalan nge-reset kolom kiye.',
 'compareselectedversions' => 'Bandingna revisi kapilih',
 'showhideselectedversions' => 'Tidokna/umpetna revisi kapilih',
 'editundo' => 'batalna',
-'diff-multi' => 'Ana ({{PLURAL:$1|Siji|$1}} revisi antara sekang {{PLURAL:$2|siji|$2}} panganggo sing ora ditidokna)',
 'diff-multi-manyusers' => 'Ana ({{PLURAL:$1|Siji|$1}} revisi antara gaweane lewih sekang {{PLURAL:$2|siji|$2}} panganggo sing ora ditidokna)',
 
 # Search results
index 83bf6f4..7ecbf46 100644 (file)
@@ -143,7 +143,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Сюлмафкснень алга китькстамс:',
-'tog-justify' => 'Тиемс сёрматфть фкакс ушедоматнень лопать кувалмова',
 'tog-hideminor' => 'Од полафтоматнень эса кяшемс ёмланя видептематне',
 'tog-hidepatrolled' => 'Кяшемс лувонь кирдихнень видептемаснон мекольце полафнематнень эса',
 'tog-newpageshidepatrolled' => 'Кяшемс лувонь кирдихнень эса видептьф лопат од лопань лувса',
@@ -152,9 +151,7 @@ $messages = array(
 'tog-numberheadings' => 'Сёрмадома коняксс лувомтяшксне эслек путовихть',
 'tog-showtoolbar' => 'Кядьёнкс седяфксть няфтемс сёрмадомбачк (JavaScript)',
 'tog-editondblclick' => 'Кафксть люпштазь сувамс сёрматфть петнема (JavaScript)',
-'tog-editsection' => 'Няфтемс сюлмафксть [петемс] эрь пяльксонди',
 'tog-editsectiononrightclick' => 'Петнемс пялькстне: люпштамс сёрмадомбяльксть лемонц лангс видешире пуняса (JavaScript)',
-'tog-showtoc' => 'Няфтемс сёрматфть потмакс (лопатнень, конатнень эса 3 сёрмадома конякста лама)',
 'tog-rememberpassword' => 'Ванфтомс монь сувама лемозе тя содаммашинаса (сяда кувать $1 {{PLURAL:$1|ши|шит}})',
 'tog-watchcreations' => 'Сувафтомс лопатнень, конатнень тиине ди файлат, конатнень тонгине мельгеваномазон',
 'tog-watchdefault' => 'Сувафтомс лопатнень ди файлатнень, конатнень петнесайне мельгеваномазон',
@@ -949,7 +946,6 @@ $3 макссь туфталсь - ''$2''",
 'lineno' => 'Кикссь $1:',
 'compareselectedversions' => 'Путомс кочкаф верзиетнень ваксс',
 'editundo' => 'валхтомс',
-'diff-multi' => '({{PLURAL:$1|ёткопингонь верзие, конась|$1 ёткопингонь верзиет, конатне}} {{PLURAL:$2|тии тизе|$2 тиихть тизь}} апак няфтек)',
 
 # Search results
 'searchresults' => 'Мезе мувсь',
@@ -1670,7 +1666,6 @@ $3 макссь туфталсь - ''$2''",
 'watchmethod-list' => 'мекольце петнематнень коряс мельге ванома ала лопат ванондома',
 'watchlistcontains' => 'Тонь мельгеваномасот $1 {{PLURAL:$1|лопа|лопат}}.',
 'iteminvalidname' => "Прябала '$1'-ть мархть, лемоц аф кондясти...",
-'wlnote' => "Ала {{PLURAL:$1|мекольце полафнема|'''$1''' мекольце полафнемат}} ётай {{PLURAL:$2| ойста (часста)|'''$2''' ойста (часста)}}.",
 'wlshowlast' => 'Няфтемс мекольце $1 ойхть (част) $2 шит $3',
 'watchlist-options' => 'Мельгеваномать латцемасна',
 
@@ -2186,7 +2181,6 @@ $1',
 'tooltip-pt-watchlist' => 'Лопатне конатнень мельге тон ванат полафнематнень коряс',
 'tooltip-pt-mycontris' => 'Тонь путкстнень лувомасна',
 'tooltip-pt-login' => 'Тяса ули кода сёрматфтомс аньцек тя аф эрявикс.',
-'tooltip-pt-anonlogin' => 'Тонь анайхть сувамс лопас, интай тя аф кошардомась.',
 'tooltip-pt-logout' => 'Лисемс',
 'tooltip-ca-talk' => 'Лопапотмонь колга корхнема',
 'tooltip-ca-edit' => 'Тя лопать петневи. Эняльттяма, нолдак тевс васень няфтема пуня лопать ванфтомада инголе.',
index 6e0f7df..ba0244e 100644 (file)
@@ -220,7 +220,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Hanipika ny rohy:',
-'tog-justify' => 'Hanitsy ny andiany',
 'tog-hideminor' => "Hanitsika ny fiovana madinika ao amin'ny fiovana farany",
 'tog-hidepatrolled' => "Hanitrika ny fiovana voaara-maso ao amin'ny fiovana farany",
 'tog-newpageshidepatrolled' => "Hanitsika ny pejy voaara-maso ao amin'ny pejy vaovao",
@@ -671,6 +670,7 @@ Mila manaiky cookies ianao raha te hiditra amin'ny {{SITENAME}}.",
 'userlogin-resetpassword-link' => 'Hadino ny tenimiafina?',
 'helplogin-url' => 'Help:Fidirana',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Fanoroana mikasika ny fidirana]]',
+'userlogin-loggedin' => "Efa tafiditra amin'ny anaran'i {{GENDER:$1|$1}} ianao. Ampiasao ny fôrmiolera eo ambany raha hiditra amin'ny anaran'ny mpikambana hafa.",
 'userlogin-createanother' => 'Hamorona kaonty hafa',
 'createacct-join' => 'Atsofohy eo ambany ny fampahalalana momba anao.',
 'createacct-another-join' => "Atsofohy eo ambany ny fampahalalana vaovaon'ny kaonty",
@@ -734,16 +734,15 @@ tenimiafina taloha ihany no ampiasao.{{PLURAL:}}',
 'passwordsent' => 'Nandefasana tenimiafina vaovao any amin\'ny adiresy imailak\'i "$1".
 Azafady midira rehefa voarainao io imailaka io.',
 'blocked-mailpassword' => "Voasakana ny adiresy IP-nao, nesorina aminao ny asa ''password recovery'' mba tsy hanararaotra.",
-'eauthentsent' => "
-Efa nandefasana imailaka fanamarinana ilay adiresy nomenao.
-Alohan'ny handraisanao imailaka hafa, dia araho ny torolalana ao anatin'io imailaka io,
-mba hanaporofoana fa anao io kaonty io.",
+'eauthentsent' => "Efa nandefasana imailaka fanamarinana ilay adiresy nomenao.
+Alohan'ny handefasana mailaka hafa any amin'ity kaonty ity dia mila manaraka ny torolalana ianao hahafahana manamarina anao ho tompon'ilay kaonty.",
 'throttled-mailpassword' => "Efa nandefasana mailaka famerenana tenimiafiana ianao tanatin'ny {{PLURAL:$1|ora|$1 ora}}.
 Mba tsy hisian'ny fanararaotana dia mailaka famerenana tenimiafiana iray ihany no azo ampiasaina isaky ny adin'ny $1{{PLURAL:}}.",
 'mailerror' => "Nisy olana tamin'ny fandefasana imailaka: $1",
 'acct_creation_throttle_hit' => 'Miala tsiny, efa nanokatra kaonty miisa $1 ianao, ka tsy afaka mamorona hafa intsony.{{PLURAL:}}',
-'emailauthenticated' => "Voamarina tamin'ny $2 $3 ny adiresy imailakao.",
-'emailnotauthenticated' => "Tsy mbola voamarina ny adiresinao. Tsy mbola afaka mandefa hafatra ianao amin'ireto zavatra azo atao manaraka ireto.",
+'emailauthenticated' => "Voamarina tamin'ny $2 tamin'ny $3 ny adiresy mailakao.",
+'emailnotauthenticated' => "Tsy mbola nomarinina ny adiresy mailakao.
+Tsy handefa mailaka izy ho an'ireo asa ireo.",
 'noemailprefs' => 'Manomeza adiresy imailaka raha hampiasa ireo fitaovana ireo ianao.',
 'emailconfirmlink' => 'Hamarino ny adiresy imailakao',
 'invalidemailaddress' => 'Tsy mety io imailaka nalefanao io satria tsy manaraka ny firafitra tokony ho izy.
@@ -793,7 +792,7 @@ Mety efa nanova tenimiafina na nanontany tenimiafina miserana angamba ianao.',
 # Special:PasswordReset
 'passwordreset' => 'Famafana ary famerenana ny tenimiafina',
 'passwordreset-text-one' => 'Fenoy ity fôrmiolera ity mba hamerenana ny tenimiafinao',
-'passwordreset-text-many' => "Fenoy ny iray amin'ireo saha ireo mba hamerenana ny tenimiafinao{{PLURAL:$1}}",
+'passwordreset-text-many' => '{{PLURAL:$1|Fenoy ny saha mba hahazoanao tenimiafina vonjimaika.}}',
 'passwordreset-legend' => 'Famafana ary famerenana ny tenimiafina',
 'passwordreset-disabled' => "Tsy nalefa ny fanovana tenimiafina adino eto amin'ity wiki ity.",
 'passwordreset-emaildisabled' => "Tsy avela ny fampiasana mailaka eto amin'ity wiki ity.",
@@ -1045,7 +1044,7 @@ Efa misy izy.',
 'invalid-content-data' => "Data anaty votoatiny tsy miady amin'ny fepetra",
 'content-not-allowed-here' => "Votoatiny ''$1'' voarara eo amin'ny pejy [[$2]]",
 'editwarning-warning' => "Mety hahavery ny fanovana nataonao ny fialanao amin'ity pejy ity.
-Raha tafiditra ianao dia azonao esorina ity fampitandremana ity ao amin'ny fizarana \"Fanovàna\" ao amin'ny safidinao",
+Raha tafiditra ianao dia azonao esorina ity fampitandremana ity ao amin'ny fizarana \"{{int:prefs-editing}}\" ao amin'ny safidinao.",
 
 # Content models
 'content-model-wikitext' => 'wiki-soratra',
@@ -1078,6 +1077,7 @@ Ao aorian'ny fivelarana, mety namoaka valy lava loatra angamba izy, ary tsy namp
 'undo-success' => 'Ho voafafa io fanovana io. Marino tsara ny fanovana eo ambany, ary tehirizo rehefa vita.',
 'undo-failure' => "Tsy afaka esorina io fanovàna io : mety tsy miraikitra amin'ny fanovàna misy eo ampivoaniny ra esorina",
 'undo-norev' => 'Tsy afaka nesorina ilay fanovàna satria tsy misy na efa voafafa izy.',
+'undo-nochange' => 'Hoatry ny efa nofoanana ilay fanovana.',
 'undo-summary' => "Niala ny fanovàna $1 nataon'i [[Special:Contributions/$2|$2]] ([[User talk:$2|resaho]])",
 'undo-summary-username-hidden' => 'Namafa ny famerenana $1 nataom-pikambana afenina',
 
@@ -1166,18 +1166,19 @@ tsy misy ilay izy, na ny santiôna ankehitriny no andramana asitrika.',
 Mbola afaka jeren'ireo mpandrindran'i {{SITENAME}} foana ny votoatiny voafina  ary azony atao ho hitan'ny vahoaka indray ilay izy amin'ny alalan'ity pejy fanaovan-tsafidy ity, raha tsy misy fepetra apetraka.",
 'revdelete-confirm' => 'Amafiso eto ny hevitrao raha hanao io ianao, raha azonao sary an-tsaina ny mety ho vokany, ary raha araka ny [[{{MediaWiki:Policy-url}}|fepetra mihatra]] ny zavatra ataonao.',
 'revdelete-suppress-text' => "Ny famafàna pejy dia ampiasaina rehefa :
-* Misy information tsy sarababem-bahoaka tsy metimety
-*: ''Misy adiresy nomeraona antso an-tariby, nomeraona sécurité sociale, sns.''",
+* Fampahalalana mampiely lainga
+* Misy fampahalalana tsy sarababem-bahoaka tsy metimety
+*: ''Adiresy onenana, laharana antso an-tariby, sns.''",
 'revdelete-legend' => "Ampetraho ny fepetra momban'ny fahitana :",
-'revdelete-hide-text' => "Asitriho ny lahatsoratr'ity version ity",
+'revdelete-hide-text' => 'Tahirintsoratry ny versiona',
 'revdelete-hide-image' => "asitriho ny votoatin'ilay rakitra",
 'revdelete-hide-name' => 'Asitriho ny asa sy ny tanjona',
-'revdelete-hide-comment' => 'asitriho ny ambangovangony',
-'revdelete-hide-user' => "Asitriho ny solonanaran'ny mpikambana/adiresy IP",
+'revdelete-hide-comment' => "Ambangovangon'ilay fiovàna",
+'revdelete-hide-user' => "Adiresy IPn'ny Mpanova",
 'revdelete-hide-restricted' => "Fafao ireo votoatiny ireo amin'ny mpiandrindra sy amin'ny mpikambana hafa",
 'revdelete-radio-same' => '(aza ovaina)',
-'revdelete-radio-set' => 'Eny',
-'revdelete-radio-unset' => 'Tsia',
+'revdelete-radio-set' => 'Afenina',
+'revdelete-radio-unset' => 'Hita maso',
 'revdelete-suppress' => "Manitrika ny votoatiny ho an'ny mpandrindra",
 'revdelete-unsuppress' => "Hanala ny fepetra eo amin'ny versiona naverina",
 'revdelete-log' => 'Antony :',
@@ -1253,7 +1254,6 @@ Marino raha manohy ny tantaram-pejy ity asa ity.",
 'showhideselectedversions' => 'Aseho/asitrika ireo ny versiona voasafidy',
 'editundo' => 'esory',
 'diff-empty' => '(Tsy misy mahasamihafa)',
-'diff-multi' => "({{PLURAL:$1|Famerenana tokana|Famerenana $1}} nataon'ny {{PLURAL:$2|mpikambana iray|mpikambana $2}} tsy miseho)",
 'diff-multi-manyusers' => "Tsy naseho ny antiôna $1{{PLURAL:}} nataon'ny mpikambana $2.",
 
 # Search results
@@ -1270,7 +1270,7 @@ Marino raha manohy ny tantaram-pejy ity asa ity.",
 'shown-title' => 'Aseho valiny $1 isaky ny pejy iray{{PLURAL:}}',
 'viewprevnext' => 'Hijery ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Misy pejy mitondra anarana « [[:$1]] » eto amin'ity wiki ity'''",
-'searchmenu-new' => "'''Hanamboatra ny pejy « [[:$1|$1]] » eto amin'ity wiki ity !'''",
+'searchmenu-new' => "'''Hamorona ny pejy \"[[:\$1]]\" eto amin'ity wiki ity!'''",
 'searchprofile-articles' => 'Pejy misy votoatiny',
 'searchprofile-project' => 'Pejy fanampiana sy pejy tetikasa',
 'searchprofile-images' => 'Multimedia',
index e5b3886..98afe8d 100644 (file)
@@ -96,7 +96,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Кузе кылвер-влакым ӱлычын удыралаш?',
-'tog-justify' => 'Абзацым лопкыт дене тӧрлаш',
 'tog-hideminor' => 'Пытартыш тӧрлатымаш-влак радам гыч изи тӧрлатымаш-влакым кораҥдаш',
 'tog-hidepatrolled' => 'Тергыме тӧрлатымаш-влакым пытартыш тӧрлатымаш лӱмерыште шылташ',
 'tog-newpageshidepatrolled' => 'Тергыме лаштык-влакым у лаштык лӱмерыште шылташ',
@@ -104,7 +103,6 @@ $messages = array(
 'tog-usenewrc' => 'У тӧрлатымаш саемдыме лӱмерым кучылташ (JavaScript кӱлеш)',
 'tog-numberheadings' => 'Вуймутым автоматик йӧн дене радамлаш',
 'tog-showtoolbar' => 'Тӧрлатымаш ӱзгараҥам ончыкташ',
-'tog-showtoc' => 'Вуймут радамым ончыкташ (3 деч шуко вуймутан лаштык-влаклан)',
 'tog-rememberpassword' => 'Тиде компьютерышто мыйын шолыпмутым шарнаш (эн шуко $1 {{PLURAL:$1|1=кечылын|кечылан}})',
 'tog-watchcreations' => 'Мыйын ыштыме лаштык-влакым эскерыме лӱмерыш ешараш',
 'tog-watchdefault' => 'Мыйын тӧрлатыме лаштык-влакым эскерыме лӱмерыш ешараш',
@@ -453,7 +451,7 @@ $messages = array(
 'previewnote' => "'''Тиде ончылгоч ончымаш гына;
 вашталтыш-влакым эше аралыме огыл!'''",
 'editing' => 'Тӧрлаталтеш $1',
-'creating' => '$1 лаштыкым ыштемаш',
+'creating' => '$1 лаштыкым ыштымаш',
 'editingsection' => 'Тӧрлаталтеш $1 (ужаш)',
 'yourtext' => 'Тендан текст',
 'yourdiff' => 'Ойыртем',
@@ -519,7 +517,6 @@ $messages = array(
 'lineno' => '$1 корно:',
 'compareselectedversions' => 'Ойырымо версий-влакым таҥастараш',
 'editundo' => 'чараш',
-'diff-multi' => '({{PLURAL:$1|не показана $1 промежуточная версия|не показаны $1 промежуточных версий|не показаны $1 промежуточные версии}} {{PLURAL:$2|1=$2 участника|$2 участников}})',
 
 # Search results
 'searchresults' => 'Кычалын мумо',
index 1e97034..7335319 100644 (file)
@@ -165,7 +165,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Garih bawahi tautan:',
-'tog-justify' => 'Ratokan paragraf',
 'tog-hideminor' => 'Suruakan suntiangan ketek di parubahan baru',
 'tog-hidepatrolled' => 'Suruakan suntiangan nan lah dipatroli di parubahan tabaru',
 'tog-newpageshidepatrolled' => 'Suruakan laman nan lah dipatroli dari daftar laman baru',
@@ -174,9 +173,7 @@ $messages = array(
 'tog-numberheadings' => 'Agiah nomor judul sacaro otomatis',
 'tog-showtoolbar' => 'Tunjuakan bilah panyuntiangan (paralu JavaScript)',
 'tog-editondblclick' => 'Suntiang laman jo klik duo kali (paralu JavaScript)',
-'tog-editsection' => 'Aktipan panyuntiangan subbagian malalui pautan [suntiang]',
 'tog-editsectiononrightclick' => 'Aktipan bagian panyuntiangan jo mangklik kanan pado judul bagian (paralu JavaScript)',
-'tog-showtoc' => 'Tunjuakan daftar isi (untuak laman nan labiah dari 3 subbagian)',
 'tog-rememberpassword' => 'Ingek log masuak denai di paramban ko (salamo $1 {{PLURAL:$1|hari}})',
 'tog-watchcreations' => 'Tambahan laman nan den buek jo gambar nan den unggah ka daftar pantau',
 'tog-watchdefault' => 'Tambahan laman jo gambar nan den suntiang ka daftar pantau',
@@ -1128,7 +1125,6 @@ $1",
 'compareselectedversions' => 'Bandiangan versi tapiliah',
 'showhideselectedversions' => 'Tunjuakan/suruakan versi tapiliah',
 'editundo' => 'batal',
-'diff-multi' => '({{PLURAL:$1|$1 revisi antaro}} dek {{PLURAL:$2|$2 pangguno}} indak ditampilan)',
 
 # Search results
 'searchresults' => 'Hasil pancarian',
@@ -1806,7 +1802,6 @@ Parubahan laman ko tamasuak laman rundiangnyo akan ditampilan disinan.',
 'unwatchthispage' => 'Batal pantau laman ko',
 'watchlist-details' => '{{PLURAL:$1|$1 laman}} dalam daftar pantau Sanak, indak tamasuak laman rundiangnyo.',
 'wlheader-showupdated' => "Laman nan alah barubah sajak kunjuangan tarakhia Sanak ditunjuakan jo '''hurup taba'''",
-'wlnote' => "Di bawah ko ado $1 {{PLURAL:$1|parubahan}} dalam {{PLURAL:$2|'''$2''' jam}} iko, sampai tanggal $3, pukua $4.",
 'wlshowlast' => 'Tunjuakan $1 jam parubahan dalam $2 hari tarakhia $3',
 'watchlist-options' => 'Piliahan daftar pantau',
 
@@ -2189,7 +2184,6 @@ Jikok Sanak hanyo nio mangimpor versi tabaru, Sanak dapek malakuannyo labiah cap
 'tooltip-pt-watchlist' => 'Daftar laman nan dipantau.',
 'tooltip-pt-mycontris' => 'Daftar jariah Sanak',
 'tooltip-pt-login' => 'Sanak disaranan untuak masuak log; walaupun indak wajib',
-'tooltip-pt-anonlogin' => 'Sanak disaranan untuak masuak log; walaupun indak wajib',
 'tooltip-pt-logout' => 'Kalua log',
 'tooltip-ca-talk' => 'Parudiangan tantang isi laman',
 'tooltip-ca-edit' => 'Angku dapek manyuntiang laman ko. Silakan gunoan tombol pratonton sabalun manyimpan',
index 7a01cb6..efdd7fc 100644 (file)
@@ -355,7 +355,6 @@ $separatorTransformTable = array( ',' => '.', '.' => ',' );
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Потцртување на врски:',
-'tog-justify' => 'Порамнување на пасусите по ширината на страницата',
 'tog-hideminor' => 'Скривај ги ситните уредувања во скорешните промени',
 'tog-hidepatrolled' => 'Скриј испатролирани уредувања во скорешните промени',
 'tog-newpageshidepatrolled' => 'Скриј испатролирани страници од списокот на нови страници',
@@ -518,7 +517,6 @@ $messages = array(
 'vector-action-protect' => 'Заштити',
 'vector-action-undelete' => 'Врати',
 'vector-action-unprotect' => 'Измени заштита',
-'vector-simplesearch-preference' => 'Овозможи упростено поле за пребарување (само за рувото „Векторско“)',
 'vector-view-create' => 'Создај',
 'vector-view-edit' => 'Уреди',
 'vector-view-history' => 'Историја',
@@ -578,7 +576,7 @@ $messages = array(
 'viewtalkpage' => 'Видете го разговорот',
 'otherlanguages' => 'На други јазици',
 'redirectedfrom' => '(Пренасочено од $1)',
-'redirectpagesub' => 'СÑ\82Ñ\80аниÑ\86а Ð·Ð° Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе',
+'redirectpagesub' => 'Ð\9fÑ\80енаÑ\81оÑ\87Ñ\83ваÑ\87ка Ñ\81Ñ\82Ñ\80аниÑ\86а',
 'lastmodifiedat' => 'Последната промена на страницава е извршена на $1 г. во $2 ч.',
 'viewcount' => 'Оваа страница била посетена {{PLURAL:$1|еднаш|$1 пати}}.',
 'protectedpage' => 'Заштитена страница',
@@ -724,8 +722,8 @@ $1',
 'badtitle' => 'Неисправен наслов',
 'badtitletext' => 'Бараниот наслов е грешен, празен или неисправно поврзан меѓујазичен или меѓувики наслов. 
 Може да содржи недопуштени знаци.',
-'perfcached' => 'СледниÑ\82е Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и Ñ\81е ÐºÐµÑ\88иÑ\80ани Ð¸ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð½Ðµ Ñ\81е Ñ\82ековни. Ð\92о ÐºÐµÑ\88от {{PLURAL:$1|е достапен највеќе еден резултат|се достапни највеќе $1 резултати}}.',
-'perfcachedts' => 'СледниÑ\82е Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и Ñ\81е ÐºÐµÑ\88иÑ\80ани, Ð¿Ð¾Ñ\81леден Ð¿Ð°Ñ\82 Ð¿Ð¾Ð´Ð½Ð¾Ð²ÐµÐ½Ð¸ Ð½Ð° $1. Ð\92о ÐºÐµÑ\88от {{PLURAL:$4|е достапен највеќе еден резултат|се достапни највеќе $4 резултати}}.',
+'perfcached' => 'СледниÑ\82е Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и Ñ\81е Ð¼ÐµÑ\93Ñ\83Ñ\81кладиÑ\80ани Ð¸ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð½Ðµ Ñ\81е Ñ\82ековни. Ð\92о Ð¼ÐµÑ\93Ñ\83Ñ\81кладот {{PLURAL:$1|е достапен највеќе еден резултат|се достапни највеќе $1 резултати}}.',
+'perfcachedts' => 'СледниÑ\82е Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и Ñ\81е Ð¼ÐµÑ\93Ñ\83Ñ\81кладиÑ\80ани, Ð¿Ð¾Ñ\81леден Ð¿Ð°Ñ\82 Ð¿Ð¾Ð´Ð½Ð¾Ð²ÐµÐ½Ð¸ Ð½Ð° $1. Ð\92о Ð¼ÐµÑ\93Ñ\83Ñ\81кладот {{PLURAL:$4|е достапен највеќе еден резултат|се достапни највеќе $4 резултати}}.',
 'querypage-no-updates' => 'Подновите на оваа страница моментално се оневозможени.
 Податоците овде во моментов нема да се подновуваат.',
 'viewsource' => 'Преглед',
@@ -768,9 +766,9 @@ $2',
 'virus-unknownscanner' => 'непознат антивирус:',
 
 # Login and logout pages
-'logouttext' => "'''Сега сте одјавени.'''
+'logouttext' => '<strong>Сега сте одјавени.</strong>
 
-Да напоменеме дека некои страници може да продолжат да се прикажуваат како да сте најавени, се додека не го исчистите кешот на вашиот прелистувач.",
+Да напоменеме дека некои страници може да продолжат да се прикажуваат како да сте најавени, сè додека не го исчистите меѓускладот на вашиот прелистувач.',
 'welcomeuser' => 'Добр едојдовте, $1!',
 'welcomecreation-msg' => 'Вашата корисничка сметка е создадена.
 Не заборавајте да ги измените вашите [[Special:Preferences|{{SITENAME}} нагодувања]].',
@@ -1012,7 +1010,7 @@ $2
 'headline_sample' => 'Наслов',
 'headline_tip' => 'Поднаслов',
 'nowiki_sample' => 'Овде внесете неформатиран текст',
-'nowiki_tip' => 'Занемари вики-форматирање',
+'nowiki_tip' => 'Занемари викиформатирање',
 'image_sample' => 'Пример.jpg',
 'image_tip' => 'Вметната слика',
 'media_sample' => 'Пример.ogg',
@@ -1102,12 +1100,11 @@ $2
 'userpage-userdoesnotexist-view' => 'Корисничката сметка „$1“ не е регистрирана.',
 'blocked-notice-logextract' => 'Овој корисник е моментално блокиран.
 Подолу е прикажан последниот дневнички запис:',
-'clearyourcache' => "'''Напомена: По зачувувањето морате да го исчистите кешот на прелистувачот за да можете ги видите промените.'''
-* '''Firefox / Safari:''' Држете ''Shift'' и стиснете на ''Reload'' или притиснете ''Ctrl-F5'' или ''Ctrl-R'' (''⌘-R'' на Mac);
-* '''Google Chrome:''' Притиснете ''Ctrl-Shift-R'' (''⌘-R'' на Mac)
-* '''Internet Explorer:''' Држете ''Ctrl'' додека притискате на ''Refresh'' или притиснете ''Ctrl-F5''.
-* '''Konqueror:''' Стиснете на „Превчитај“ или на ''F5'';
-* '''Opera:''' Исчистете го кешот во ''Tools → Preferences'';",
+'clearyourcache' => "<strong>Напомена:</strong>  По зачувувањето морате да го исчистите меѓускладот (кеш) на прелистувачот за да можете ги видите промените.
+* <strong>Firefox / Safari:</strong> Држете <em>Shift</em> и стиснете на <em>Превчитај</em> (<em>Reload</em>) или притиснете <em>Ctrl-F5</em> или <em>Ctrl-R</em> (''⌘-R'' на Mac);
+* <strong>Google Chrome:</strong> Притиснете <em>Ctrl-Shift-R</em> (<em>⌘-R</em> на Mac)
+* <strong>Internet Explorer:</strong> Држете <em>Ctrl</em> додека притискате на <em>Refresh</em> или притиснете <em>Ctrl-F5</em>.
+* <strong>Opera:</strong> Исчистете го меѓускладот во <em>Tools → Preferences</em>",
 'usercssyoucanpreview' => "'''Совет:''' Употребете го копчето „{{int:showpreview}}“ за да го испробате вашиот нов CSS пред да зачувате.",
 'userjsyoucanpreview' => "'''Совет:''' Употребете го копчето „{{int:showpreview}}“ за да ја испробате вашата нова JavaScript  пред да зачувате.",
 'usercsspreview' => "'''Запомнете дека ова е само преглед на вашиот кориснички CSS код, страницата сè уште не е зачувана!'''",
@@ -1212,7 +1209,7 @@ $2
 'invalid-content-data' => 'Неважечки податоци од содржината',
 'content-not-allowed-here' => 'Содржините од моделот „$1“ не се допуштени на страницата [[$2]]',
 'editwarning-warning' => 'Ако ја напуштите страницата ќе ги изгубите сите промени кои сте ги направиле.
-Ако сте најавени, можете да го исклучите ова предупредување во одделот „Уредување“ во вашите нагодувања.',
+Ако сте најавени, можете да го исклучите ова предупредување во одделот „{{int:prefs-editing}}“ во вашите нагодувања.',
 'editpage-notsupportedcontentformat-title' => 'Форматот на содржината не е поддржан',
 'editpage-notsupportedcontentformat-text' => 'Форматот $1 is не е поддржан од содржинскиот модел $2.',
 
@@ -1249,6 +1246,7 @@ $2
 Ве молиме споредете ги промените со претходната верзија за да проверите дали тоа е сигурно она што сакате да го направите, а потоа зачувајте ги промените за да го завршите откажувањето на претходното уредување.',
 'undo-failure' => 'Уредувањето не можеше да се откаже заради меѓувремени спротиставени уредувања.',
 'undo-norev' => 'Измената не можеше да биде вратена бидејќи не постои или била избришана.',
+'undo-nochange' => 'Се чини дека измената (уредувањето) е веќе вратена.',
 'undo-summary' => 'Откажано уредувањето $1 на уредникот [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])',
 'undo-summary-username-hidden' => 'Поништи ја ревизијата $1 на скриен корисник',
 
@@ -1426,7 +1424,8 @@ $1",
 'showhideselectedversions' => 'Прикажи/скриј избрани ревизии',
 'editundo' => 'откажи',
 'diff-empty' => '(нема разлика)',
-'diff-multi' => '({{PLURAL:$1|Не е прикажана една меѓувремена ревизија|Не се прикажани $1 меѓувремени ревизии}} од {{PLURAL:$2|еден корисник|$2 корисници}})',
+'diff-multi-sameuser' => '({{PLURAL:$1|Не е прикажана една меѓувремена ревизија|Не се прикажани $1 меѓувремени ревизии}} од истиот корисник)',
+'diff-multi-otherusers' => '({{PLURAL:$1|Не е прикажана една меѓувремена ревизија|Не се прикажани $1 меѓувремени ревизии}} од {{PLURAL:$2|еден друг корисник|$2 корисници}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Не е прикажана една меѓувремена ревизија направена|Не се прикажани $1 меѓувремени ревизии направени}} од повеќе од $2 {{PLURAL:$2|корисник|корисници}})',
 'difference-missing-revision' => 'Не пронајдов {{PLURAL:$2|една ревизија|$2 ревизии}} од оваа разлика ($1).
 
@@ -1447,7 +1446,7 @@ $1",
 'shown-title' => 'Прикажи $1 {{PLURAL:$1|резултат|резултати}} на страница',
 'viewprevnext' => 'Погледајте ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''На ова вики има страница со наслов „[[:$1]]“'''",
-'searchmenu-new' => "Создајте ја страницата „[[:$1]]“ на ова вики!'''",
+'searchmenu-new' => '<strong>Создајте ја страницата „[[:$1]]“ на ова вики!</strong> {{PLURAL:$2|0=|Погледајте ја и страницата најдена со пребарувањето.|Погледајте ги и најдените резултати од пребарувањето.}}',
 'searchprofile-articles' => 'Статии',
 'searchprofile-project' => 'Помош и проектни страници',
 'searchprofile-images' => 'Податотеки',
@@ -1473,6 +1472,7 @@ $1",
 'searchrelated' => 'поврзано',
 'searchall' => 'сè',
 'showingresults' => "Подолу {{PLURAL:$1|е прикажан '''1''' резултат|се прикажани '''$1''' резултати}} почнувајќи од бр. '''$2'''.",
+'showingresultsinrange' => 'Долу {{PLURAL:$1|е прикажан до <strong>еден</strong> резултат|се прикажани до <strong>$1</strong> резултати}} во опсег од <strong>$2</strong> до <strong>$3</strong>.',
 'showingresultsnum' => "Подолу {{PLURAL:$3|е прикажан '''1''' резултат|се прикажани '''$3''' резултати}} почнувајќи од '''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Резултат '''$1''' од '''$3'''|Резултати '''$1 - $2''' од '''$3'''}} за '''$4'''",
 'search-nonefound' => 'Нема резултати што одговараат на бараното.',
@@ -1523,7 +1523,7 @@ $1",
 'stub-threshold' => 'Праг за <a href="#" class="stub">никулци</a> (бајти):',
 'stub-threshold-disabled' => 'Оневозможено',
 'recentchangesdays' => 'Денови за приказ во скорешните промени:',
-'recentchangesdays-max' => '(највеќе $1 {{PLURAL:$1|ден|дена}})',
+'recentchangesdays-max' => '(највеќе {{PLURAL:$1|еден ден|$1 дена}})',
 'recentchangescount' => 'Број на уредувања кои ќе се прикажуваат по основно:',
 'prefs-help-recentchangescount' => 'Подразбира скорешни промени, истории на страници и дневници.',
 'prefs-help-watchlist-token2' => 'Ова е тајна шифра за вашиот канализиран список на набљудувања.
@@ -1673,9 +1673,9 @@ $1",
 'right-upload' => 'Подигни податотеки',
 'right-reupload' => 'Заменување на постоечки податотеки',
 'right-reupload-own' => 'Преснимување на постоечка податотека подигната од вас',
-'right-reupload-shared' => 'Ð\9dаложÑ\83ваÑ\9aе Ð½Ð° ÐµÐ´Ð½Ð¸ Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еки Ð²Ñ\80з Ð´Ñ\80Ñ\83ги Ð½Ð° Ð·Ð°ÐµÐ´Ð½Ð¸Ñ\87каÑ\82а Ð¼Ñ\83лÑ\82имедиÑ\98ална Ñ\80изниÑ\86а локално',
+'right-reupload-shared' => 'Ð\9fÑ\80езапиÑ\81 Ð½Ð° ÐµÐ´Ð½Ð¸ Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еки Ð²Ñ\80з Ð´Ñ\80Ñ\83ги Ð½Ð° Ð·Ð°ÐµÐ´Ð½Ð¸Ñ\87коÑ\82о Ð¼Ñ\83лÑ\82имедиÑ\98ално Ñ\81кладиÑ\88Ñ\82е локално',
 'right-upload_by_url' => 'Подигање на податотека од URL-адреса',
-'right-purge' => 'Ð\91Ñ\80иÑ\88еÑ\9aе Ð¾Ð´ Ð¾Ð¿Ñ\81лÑ\83жÑ\83ваÑ\87ки ÐºÐµÑ\88 на страницата без барање потврда за тоа',
+'right-purge' => 'Ð\91Ñ\80иÑ\88еÑ\9aе Ð¾Ð´ Ð¾Ð¿Ñ\81лÑ\83жÑ\83ваÑ\87ки Ð¼ÐµÑ\93Ñ\83Ñ\81клад на страницата без барање потврда за тоа',
 'right-autoconfirmed' => 'Без ограничувања на стапки за IP-адреса',
 'right-bot' => 'Третиран како автоматски процес',
 'right-nominornewtalk' => 'Ситните уредувања да не поттикнуваат потсетник за нова порака',
@@ -1914,8 +1914,9 @@ $1",
 Ако ја имате оваа слика во изворна големина, подигнете ја неја. Во спротивно сменете го името на податотеката.",
 'fileexists-forbidden' => 'Податотека со тоа име веќе постои и не може да биде заменета.
 Ако и понатаму сакате да ја подигнете вашата податотеката, ве молиме вратете се назад и подигнете ја под друго име. [[File:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => 'Податотека со ова име веќе постои во заедничката ризница.
-Ако и понатаму сакате да ја подигнете податотеката, ве молиме вратете се и повторно подигнете ја податотеката со ново име. [[File:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => 'Во заедничкото складиште веќе постои податотека со ова име.
+Ако и понатаму сакате да ја подигнете, вратете се и подигнете ја под друго име. 
+[[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Оваа податотека е дупликат со {{PLURAL:$1|следнава податотека|следниве податотеки}}:',
 'file-deleted-duplicate' => 'Податотека индентична со податотеката ([[:$1]]) претходно била избришана. Треба да проверите во дневникот на бришења за оваа податотека пред повторно да ја подигнете.',
 'file-deleted-duplicate-notitle' => 'Податотека сосем иста како оваа била претходно избришана, а насловот бил притаен.
@@ -2146,7 +2147,7 @@ $1',
 'uploadnewversion-linktext' => 'Подигни нова верзија на податотекава',
 'shared-repo-from' => 'од $1',
 'shared-repo' => 'заедничко складиште',
-'shared-repo-name-wikimediacommons' => 'Ð\97аедниÑ\87каÑ\82а Ð Ð¸Ð·Ð½Ð¸Ñ\86а',
+'shared-repo-name-wikimediacommons' => 'РизниÑ\86аÑ\82а',
 'filepage.css' => '/* Тука поставените каскадни стилски страници (CSS) се вклучени во страницата за опис на податотеката, како и на клиентските викија */',
 'upload-disallowed-here' => 'Нажалост, не можете да презапишете врз сликава.',
 
@@ -2308,10 +2309,20 @@ $1',
 'deadendpagestext' => 'Следните страници немаат врски кон ниту една друга страница на ова вики.',
 'protectedpages' => 'Заштитени страници',
 'protectedpages-indef' => 'Само бесконечни заштити',
+'protectedpages-summary' => 'На страницата се наведени постоечки страници што се моментално под заштита. За список на наслови што се заштитени од создавање, погледајте [[{{#special:ProtectedTitles}}]].',
 'protectedpages-cascade' => 'Само каскадни заштити',
 'protectedpages-noredirect' => 'Скриј пренасочувања',
 'protectedpagesempty' => 'Во моментов нема заштитени страници со параметрите кои ги зададовте.',
+'protectedpages-timestamp' => 'Време и датум',
+'protectedpages-page' => 'Страница',
+'protectedpages-expiry' => 'Истекува',
+'protectedpages-performer' => 'Заштитувач',
+'protectedpages-params' => 'Параметри на заштитата',
+'protectedpages-reason' => 'Причина',
+'protectedpages-unknown-timestamp' => 'Непознато',
+'protectedpages-unknown-performer' => 'Непознат корисник',
 'protectedtitles' => 'Заштитени наслови',
+'protectedtitles-summary' => 'На страницата се наведени наслови што се моментално заштитени од создавање. За список на постоечки страници што се заштитени, погледајте [[{{#special:ProtectedPages}}]].',
 'protectedtitlesempty' => 'Во овој момент нема заштитени наслови кои ги задоволуваат наведените критериуми.',
 'listusers' => 'Список на корисници',
 'listusers-editsonly' => 'Прикажи само корисници кои уредувале',
@@ -2409,7 +2420,7 @@ $1',
 
 # Special:ActiveUsers
 'activeusers' => 'Список на активни корисници',
-'activeusers-intro' => 'Ова е список на корисници кои биле на некој начин активни во последните $1 {{PLURAL:$1|ден|дена}}.',
+'activeusers-intro' => 'Ова е список на корисници кои биле на некој начин активни во последните {{PLURAL:$1|еден ден|$1 дена}}.',
 'activeusers-count' => '$1 {{PLURAL:$1|дејство|дејства}} {{PLURAL:$3|денес|во последните $3 дена}}',
 'activeusers-from' => 'Прикажи корисници почнувајќи од:',
 'activeusers-hidebots' => 'Скриј ботови',
@@ -2666,6 +2677,7 @@ $UNWATCHURL
 ** Зачестен спам
 ** Непродуктивна уредувачка војна
 ** Страница со зачестена посета
+** Сеприсутност на шаблонот/превметнувањето
 ** Административна постапка',
 'protect-edit-reasonlist' => 'Уреди причини за заштита',
 'protect-expiry-options' => '1 час: 1 hour,1 ден:1 day,1 недела:1 week,2 недели:2 weeks,1 месец:1 month,3 месеци:3 months,6 месеци:6 months,1 година:1 year,бесконечно:infinite',
@@ -2875,7 +2887,7 @@ $1',
 'contribslink' => 'придонеси',
 'emaillink' => 'испрати е-пошта',
 'autoblocker' => 'Автоматски сте блокирани бидејќи вашата IP-адреса била скоро користена од „[[User:$1|$1]]“.
\9fÑ\80иÑ\87инаÑ\82а Ð·Ð° Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aе Ð½Ð° $1 Ð±Ð¸Ð»Ð°: „$2“',
\9dаведенаÑ\82а Ð¿Ñ\80иÑ\87ина Ð·Ð° Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aе Ð½Ð° $1 Ð³Ð»Ð°Ñ\81и: „$2“',
 'blocklogpage' => 'Дневник на блокирања',
 'blocklog-showlog' => 'Овој корисник бил претходно блокиран.
 Дневникот на блокирања, за ваша информација е прикажан подолу:',
@@ -2946,7 +2958,7 @@ $1',
 'move-page' => 'Премести $1',
 'move-page-legend' => 'Премести страница',
 'movepagetext' => "Со користењето на овој образец можете да преименувате страница, преместувајќи ја целата нејзина историја под ново име.
-Стариот наслов ќе стане страница за пренасочување кон новиот наслов.
+Стариот наслов ќе стане пренасочувачка страница кон новиот наслов.
 Автоматски можете да ги подновите пренасочувањата кои покажуваат кон првобитниот наслов.
 Ако не изберете автоматско подновување, проверете на [[Special:DoubleRedirects|двојни]] или [[Special:BrokenRedirects|прекинати пренасочувања]].
 На вас е одговорноста да се осигурате дека врските ќе продолжат да насочуваат таму за каде се предвидени.
@@ -2957,7 +2969,7 @@ $1',
 Ова може да биде драстична и неочекувана промена за популарна страница;
 осигурајте се дека сте ги разбрале последиците од ова пред да продолжите.",
 'movepagetext-noredirectfixer' => "Со користењето на овој образец можете да преименувате страница, преместувајќи ја целата нејзина историја под ново име.
-Стариот наслов ќе стане страница за пренасочување кон новиот наслов.
+Стариот наслов ќе стане пренасочувачка страница кон новиот наслов.
 Автоматски можете да ги подновите пренасочувањата кои покажуваат кон првобитниот наслов.
 Не заборавајте да проверите [[Special:DoubleRedirects|двојни]] и [[Special:BrokenRedirects|прекинати пренасочувања]].
 На вас е одговорноста да се осигурате дека врските ќе продолжат да насочуваат таму за каде се предвидени.
@@ -3087,6 +3099,7 @@ $2',
 'thumbnail_image-type' => 'Неподдржан тип на слика',
 'thumbnail_gd-library' => 'Нецелосни поставки на графичката библиотека: недостасува функцијата $1',
 'thumbnail_image-missing' => 'Изгледа дека податотеката недостасува: $1',
+'thumbnail_image-failure-limit' => 'Направив премногу обиди ($1 или повеќе) за да ја прикажам минијатурава. Обидете се подоцна.',
 
 # Special:Import
 'import' => 'Увезување на страници',
@@ -3125,7 +3138,7 @@ $2',
 Проблеми со привремена папка за податотеки.',
 'import-parse-failure' => 'Погрешно XML парсирање',
 'import-noarticle' => 'Нема страница за увоз!',
-'import-nonewrevisions' => 'СиÑ\82е Ñ\80евизии Ñ\81е Ð¿Ñ\80еÑ\82Ñ\85одно Ñ\83везени.',
+'import-nonewrevisions' => 'Ð\9dе Ñ\83везов Ð½Ð¸ÐµÐ´Ð½Ð° Ñ\80евизиÑ\98а (Ñ\81иÑ\82е Ñ\81е Ð²ÐµÑ\9cе Ð¿Ñ\80иÑ\81Ñ\83Ñ\82ни Ð¸Ð»Ð¸ Ð¸Ð·Ð¾Ñ\81Ñ\82авени Ð¿Ð¾Ñ\80ади Ð³Ñ\80еÑ\88ки)',
 'xml-error-string' => '$1 во ред $2, колона $3 (бајт $4): $5',
 'import-upload' => 'Подигни XML податоци',
 'import-token-mismatch' => 'Губење на сесиските податоци. Обидете се повторно.',
@@ -3136,6 +3149,7 @@ $2',
 '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|Погрешна можност|Погрешни можности}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Укажаната основна страница е неважечки наслов.',
 'import-rootpage-nosubpage' => 'Именскиот простор „$1“ на основната страница не допушта потстраници.',
@@ -3411,10 +3425,10 @@ $1',
 'minutes-abbrev' => '$1 м',
 'hours-abbrev' => '$1 ч',
 'days-abbrev' => '$1 д',
-'seconds' => '{{PLURAL:$1|$1 секунда|$1 секунди}}',
-'minutes' => '{{PLURAL:$1|$1 минута|$1 минути}}',
-'hours' => '{{PLURAL:$1|$1 час|$1 часа}}',
-'days' => '{{PLURAL:$1|$1 ден|$1 дена}}',
+'seconds' => '{{PLURAL:$1|една секунда|$1 секунди}}',
+'minutes' => '{{PLURAL:$1|една минута|$1 минути}}',
+'hours' => '{{PLURAL:$1|еден час|$1 часа}}',
+'days' => '{{PLURAL:$1|еден ден|$1 дена}}',
 'weeks' => '{{PLURAL:$1|$1 недела|$1 недели}}',
 'months' => '{{PLURAL:$1|$1 месец|$1 месеци}}',
 'years' => '{{PLURAL:$1|$1 година|$1 години}}',
@@ -3422,9 +3436,9 @@ $1',
 'just-now' => 'Штотуку',
 
 # Human-readable timestamps
-'hours-ago' => 'пред $1 {{PLURAL:$1|час|часа}}',
-'minutes-ago' => 'пред $1 {{PLURAL:$1|минута|минути}}',
-'seconds-ago' => 'пред $1 {{PLURAL:$1|секунда|секунди}}',
+'hours-ago' => 'пред {{PLURAL:$1|еден час|$1 часа}}',
+'minutes-ago' => 'пред {{PLURAL:$1|една минута|$1 минути}}',
+'seconds-ago' => 'пред {{PLURAL:$1|една секунда|$1 секунди}}',
 'monday-at' => 'понеделникот во $1',
 'tuesday-at' => 'вторникот во $1',
 'wednesday-at' => 'средата во $1',
@@ -4002,8 +4016,8 @@ $5
 
 # action=purge
 'confirm_purge_button' => 'OK',
-'confirm-purge-top' => 'Ð\98Ñ\81Ñ\87иÑ\81Ñ\82и Ð³Ð¾ ÐºÐµÑ\88оÑ\82 Ð½Ð° Ð¾Ð²Ð°Ð° Ñ\81Ñ\82Ñ\80аниÑ\86а?',
-'confirm-purge-bottom' => 'Со Ð¾Ð²Ð°Ð° Ð¾Ð¿ÐµÑ\80аÑ\86иÑ\98а Ñ\81е Ñ\87иÑ\81Ñ\82и Ð¾Ð¿Ñ\81лÑ\83жÑ\83ваÑ\87иоÑ\82 ÐºÐµÑ\88 и се прикажува најновата верзија.',
+'confirm-purge-top' => 'Ð\94а Ð³Ð¾ Ð¸Ñ\81Ñ\87иÑ\81Ñ\82ам Ð¼ÐµÑ\93Ñ\83Ñ\81кладоÑ\82 Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86ава?',
+'confirm-purge-bottom' => 'Со Ð¾Ð²Ð°Ð° Ð¾Ð¿ÐµÑ\80аÑ\86иÑ\98а Ñ\81е Ñ\87иÑ\81Ñ\82и Ð¾Ð¿Ñ\81лÑ\83жÑ\83ваÑ\87киоÑ\82 Ð¼ÐµÑ\93Ñ\83Ñ\81клад и се прикажува најновата верзија.',
 
 # action=watch/unwatch
 'confirm-watch-button' => 'ОК',
@@ -4076,7 +4090,7 @@ $5
 
 # Friendlier slave lag warnings
 'lag-warn-normal' => 'Промените во {{PLURAL:$1|последната секунда|последните $1 секунди}} може да не бидат прикажани во списокот.',
-'lag-warn-high' => 'Поради преоптовареност на податочниот опслужувач, промените понови од $1 {{PLURAL:$1|секунда|секунди}}
+'lag-warn-high' => 'Поради преоптовареност на податочниот опслужувач, промените понови од {{PLURAL:$1|една секунда|$1 секунди}}
 може да не бидат прикажани во списокот.',
 
 # Watchlist editor
@@ -4430,10 +4444,10 @@ $5
 'api-error-verification-error' => 'Податотеката е оштетена или има погрешна наставка.',
 
 # Durations
-'duration-seconds' => '$1 {{PLURAL:$1|секунда|секунди}}',
-'duration-minutes' => '$1 {{PLURAL:$1|минута|минути}}',
-'duration-hours' => '$1 {{PLURAL:$1|час|часа}}',
-'duration-days' => '$1 {{PLURAL:$1|ден|дена}}',
+'duration-seconds' => '{{PLURAL:$1|една секунда|$1 секунди}}',
+'duration-minutes' => '{{PLURAL:$1|една минута|$1 минути}}',
+'duration-hours' => '{{PLURAL:$1|еден час|$1 часа}}',
+'duration-days' => '{{PLURAL:$1|еден ден|$1 дена}}',
 'duration-weeks' => '$1 {{PLURAL:$1|недела|недели}}',
 'duration-years' => '{{PLURAL:$1|година|години}}',
 'duration-decades' => '$1 {{PLURAL:$1|деценија|децении}}',
@@ -4446,9 +4460,9 @@ $5
 # Limit report
 'limitreport-title' => 'Профилни парсерски податоци:',
 'limitreport-cputime' => 'Употреба на обработувачко време',
-'limitreport-cputime-value' => '$1 {{PLURAL:$1|секунда|секунди}}',
+'limitreport-cputime-value' => '{{PLURAL:$1|една секунда|$1 секунди}}',
 'limitreport-walltime' => 'Употреба на вистинско време',
-'limitreport-walltime-value' => '$1 {{PLURAL:$1|секунда|секунди}}',
+'limitreport-walltime-value' => '{{PLURAL:$1|една секунда|$1 секунди}}',
 'limitreport-ppvisitednodes' => 'Бр. на пројдени јазли од предобработувачот',
 'limitreport-ppgeneratednodes' => 'Бр. на создадени јазли од предобработувачот',
 'limitreport-postexpandincludesize' => 'Големина на вклученото по проширувањето',
index a334b01..7ce622f 100644 (file)
@@ -356,7 +356,6 @@ $digitGroupingPattern = "##,##,###";
 $messages = array(
 # User preference toggles
 'tog-underline' => 'കണ്ണികൾക്ക് അടിവരയിടുക:',
-'tog-justify' => 'ഖണ്ഡികകളുടെ അരികുകൾ നേരെയാക്കുക',
 'tog-hideminor' => 'പുതിയ മാറ്റങ്ങളുടെ പട്ടികയിൽ ചെറിയ തിരുത്തുകൾ പ്രദർശിപ്പിക്കാതിരിക്കുക',
 'tog-hidepatrolled' => 'റോന്തുചുറ്റിയ തിരുത്തുകൾ പുതിയമാറ്റങ്ങളിൽ പ്രദർശിപ്പിക്കാതിരിക്കുക',
 'tog-newpageshidepatrolled' => 'റോന്തുചുറ്റപ്പെട്ട താളുകൾ പുതിയതാളുകളുടെ പട്ടികയിൽ പ്രദർശിപ്പിക്കാതിരിക്കുക',
@@ -518,7 +517,6 @@ $messages = array(
 'vector-action-protect' => 'സം‌രക്ഷിക്കുക',
 'vector-action-undelete' => 'മായ്ക്കപ്പെട്ടത് പുനഃസ്ഥാപിക്കുക',
 'vector-action-unprotect' => 'സംരക്ഷണത്തിൽ മാറ്റംവരുത്തുക',
-'vector-simplesearch-preference' => 'ലളിതമായ തിരച്ചിൽ സൗകര്യം സജ്ജമാക്കുക (വെക്റ്റർ ദൃശ്യരൂപത്തിൽ മാത്രം)',
 'vector-view-create' => 'സൃഷ്ടിക്കുക',
 'vector-view-edit' => 'തിരുത്തുക',
 'vector-view-history' => 'നാൾവഴി കാണുക',
@@ -1164,7 +1162,7 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 'invalid-content-data' => 'അസാധുവായ ഉള്ളടക്ക ഡേറ്റ',
 'content-not-allowed-here' => '"$1" ഉള്ളടക്കം [[$2]] താളിൽ അനുവദിക്കുന്നില്ല',
 'editwarning-warning' => 'ഈ താളിൽ നിന്നും പോകുന്നത് താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ നഷ്ടപ്പെടാൻ ഇടയാക്കും.
-താങ്കൾ ലോഗിൻ ചെയ്തിട്ടുണ്ടെങ്കിൽ, താങ്കളുടെ ക്രമീകരണങ്ങളിൽ "തിരുത്തൽ" എന്ന ഭാഗത്ത് ചെന്ന് ഈ അറിയിപ്പ് പ്രദർശിപ്പിക്കുന്നത് ഒഴിവാക്കാവുന്നതാണ്.',
+താങ്കൾ ലോഗിൻ ചെയ്തിട്ടുണ്ടെങ്കിൽ, താങ്കളുടെ ക്രമീകരണങ്ങളിൽ "{{int:prefs-editing}}"  എന്ന ഭാഗത്ത് ചെന്ന് ഈ അറിയിപ്പ് പ്രദർശിപ്പിക്കുന്നത് ഒഴിവാക്കാവുന്നതാണ്.',
 'editpage-notsupportedcontentformat-title' => 'ഉള്ളടക്ക ഫോർമാറ്റ് പിന്തുണയ്ക്കുന്നില്ല',
 'editpage-notsupportedcontentformat-text' => 'ഉള്ളടക്കത്തിന്റെ ഫോർമാറ്റ് ആയ $1 ഉള്ളടക്ക രീതിയായ $2 പിന്തുണയ്ക്കുന്നില്ല.',
 
@@ -1200,6 +1198,7 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 'undo-success' => 'ഈ തിരുത്ത് താങ്കൾക്ക് തിരസ്ക്കരിക്കാവുന്നതാണ്‌. താഴെ കൊടുത്തിരിക്കുന്ന പതിപ്പുകൾ തമ്മിലുള്ള താരതമ്യം ഒന്നുകൂടി പരിശോധിച്ച് ഈ പ്രവൃത്തി ചെയ്യണോ എന്ന് ഒന്നുകൂടി ഉറപ്പാക്കുക. ഉറപ്പാണെങ്കിൽ തിരുത്ത് തിരസ്ക്കരിക്കുവാൻ താൾ സേവ് ചെയ്യുക.',
 'undo-failure' => 'ഇടയ്ക്കുള്ള തിരുത്തുകൾ തമ്മിൽ സമരസപ്പെടാത്തതു കാരണം ഈ തിരുത്ത് തിരസ്ക്കരിക്കുവാനാവില്ല.',
 'undo-norev' => 'ഈ തിരുത്തൽ നിലവിലില്ലാത്തതിനാലോ മായ്ക്കപ്പെട്ടതിനാലോ പൂർവസ്ഥിതിയിലാക്കുവാൻ സാധിക്കുകയില്ല.',
+'undo-nochange' => 'തിരുത്ത് മുമ്പേ തന്നെ ഒഴിവാക്കിയതായി കാണുന്നു.',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|സംവാദം]]) ചെയ്ത നാൾപ്പതിപ്പ് $1 നീക്കം ചെയ്യുന്നു',
 'undo-summary-username-hidden' => 'മറയ്ക്കപ്പെട്ട ഉപയോക്താവ് ചെയ്ത നാൾപ്പതിപ്പ് $1 തിരസ്കരിക്കുക',
 
@@ -1382,7 +1381,8 @@ $1",
 'showhideselectedversions' => 'തിരഞ്ഞെടുത്ത മാറ്റങ്ങൾ പ്രദർശിപ്പിക്കുക/മറയ്ക്കുക',
 'editundo' => 'മാറ്റം തിരസ്ക്കരിക്കുക',
 'diff-empty' => '(വ്യത്യാസം ഇല്ല)',
-'diff-multi' => '(ഇടയ്ക്ക് {{PLURAL:$2|ഒരു ഉപയോക്താവ്|$2 ഉപയോക്താക്കൾ}} ചെയ്ത {{PLURAL:$1|ഒരു പതിപ്പ്|$1 പതിപ്പുകൾ}} പ്രദർശിപ്പിക്കുന്നില്ല.)',
+'diff-multi-sameuser' => '(ഒരേ ഉപയോക്താവ് ചെയ്ത {{PLURAL:$1|ഇടയ്ക്കുള്ള ഒരു നാൾപ്പതിപ്പ്|ഇടയ്ക്കുള്ള $1 നാൾപ്പതിപ്പുകൾ}} പ്രദർശിപ്പിക്കുന്നില്ല)',
+'diff-multi-otherusers' => '({{PLURAL:$2|മറ്റൊരു ഉപയോക്താവ്|$2 ഉപയോക്താക്കൾ}} ചെയ്ത {{PLURAL:$1|ഇടയ്ക്കുള്ള ഒരു നാൾപ്പതിപ്പ്|ഇടയ്ക്കുള്ള $1 നാൾപ്പതിപ്പുകൾ}} പ്രദർശിപ്പിക്കുന്നില്ല)',
 'diff-multi-manyusers' => '(ഇടയ്ക്ക് {{PLURAL:$2|ഒന്നിലധികം|$2 എണ്ണത്തിലധികം}} ഉപയോക്താക്കൾ ചെയ്തിട്ടുള്ള {{PLURAL:$1|ഒരു പതിപ്പ്|$1 പതിപ്പുകൾ}} പ്രദർശിപ്പിക്കുന്നില്ല.)',
 'difference-missing-revision' => 'ഈ വ്യത്യാസത്തിൽ ($1) {{PLURAL:$2|ഒരു നാൾപ്പതിപ്പ്|$2 നാൾപ്പതിപ്പുകൾ}} കാണാനായില്ല.
 
@@ -1403,7 +1403,7 @@ $1",
 'shown-title' => '{{PLURAL:$1|ഒരു ഫലം|$1 ഫലങ്ങൾ}} വീതം താളിൽ കാണിക്കുക',
 'viewprevnext' => '$1 {{int:pipe-separator}} $2 എണ്ണം കാണുക ($3)',
 'searchmenu-exists' => "'''\"[[:\$1]]\" എന്ന തലക്കെട്ടിൽ ഒരു താൾ ഈ വിക്കിയിൽ നിലവിലുണ്ട്'''",
-'searchmenu-new' => "'''ഈ വിക്കിയിൽ \"[[:\$1]]\" താൾ നിർമ്മിക്കുക!'''",
+'searchmenu-new' => '<strong>ഈ വിക്കിയിൽ "[[:$1]]" എന്ന താൾ സൃഷ്ടിക്കുക!</strong> {{PLURAL:$2|0=|ഒപ്പം താങ്കളുടെ തിരയലിനു ലഭിച്ച ഫലമായ ഈ താൾ കാണുക.|ഒപ്പം താങ്കളുടെ തിരയലിനു ലഭിച്ച ഫലങ്ങൾ കാണുക.}}',
 'searchprofile-articles' => 'ലേഖനങ്ങളിൽ',
 'searchprofile-project' => 'സഹായം, പദ്ധതി താളുകളിൽ',
 'searchprofile-images' => 'പ്രമാണങ്ങളിൽ',
@@ -1429,6 +1429,7 @@ $1",
 'searchrelated' => 'ബന്ധപ്പെട്ടവ',
 'searchall' => 'എല്ലാം',
 'showingresults' => "'''$2''' മുതലുള്ള {{PLURAL:$1|'''ഒരു''' ഫലം|'''$1''' ഫലങ്ങൾ}} താഴെ പ്രദർശിപ്പിക്കുന്നു.",
+'showingresultsinrange' => '#<strong>$2</strong> മുതൽ #<strong>$3</strong> വരെയുള്ള പരിധിയിലെ {{PLURAL:$1|<strong>ഒരു</strong> ഫലം|<strong>$1</strong> ഫലങ്ങൾ}} താഴെ പ്രദർശിപിക്കുന്നു.',
 'showingresultsnum' => "'''$2''' മുതലുള്ള {{PLURAL:$3|'''ഒരു''' ഫലം|'''$3''' ഫലങ്ങൾ}} താഴെ പ്രദർശിപ്പിക്കുന്നു.",
 'showingresultsheader' => "'''$4''' എന്ന പദത്തിനു ആകെ ലഭിച്ച {{PLURAL:$5| '''$3''' ഫലത്തിൽ '''$1''' എണ്ണം|'''$3''' ഫലത്തിൽ '''$1 മുതൽ $2''' വരെയുള്ളവ}}",
 'search-nonefound' => 'താങ്കൾ തിരഞ്ഞ പദത്തിനു യോജിച്ച ഫലങ്ങളൊന്നും ലഭിച്ചില്ല.',
@@ -2239,6 +2240,14 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'protectedpages-cascade' => 'നിർഝരിത സംരക്ഷണങ്ങൾ മാത്രം',
 'protectedpages-noredirect' => 'തിരിച്ചുവിടലുകൾ മറയ്ക്കുക',
 'protectedpagesempty' => 'ഈ ചരങ്ങൾ ഉപയോഗിച്ചു താളുകൾ ഒന്നും തന്നെ സം‌രക്ഷിക്കപ്പെട്ടിട്ടില്ല.',
+'protectedpages-timestamp' => 'സമയമുദ്ര',
+'protectedpages-page' => 'താൾ',
+'protectedpages-expiry' => 'കാലാവധി',
+'protectedpages-performer' => 'ഉപയോക്താവിനെ സംരക്ഷിക്കുന്നു',
+'protectedpages-params' => 'സംരക്ഷണ ചരങ്ങൾ',
+'protectedpages-reason' => 'കാരണം',
+'protectedpages-unknown-timestamp' => 'അജ്ഞാതം',
+'protectedpages-unknown-performer' => 'അജ്ഞാത ഉപയോക്താവ്',
 'protectedtitles' => 'സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്ന തലക്കെട്ടുകൾ',
 'protectedtitlesempty' => 'ഈ ചരങ്ങൾ ഉപയോഗിച്ചു തലക്കെട്ടുകൾ ഒന്നും തന്നെ സം‌രക്ഷിക്കപ്പെട്ടിട്ടില്ല.',
 'listusers' => 'ഉപയോക്താക്കളുടെ പട്ടിക',
@@ -2513,7 +2522,7 @@ $UNWATCHURL
 'delete-edit-reasonlist' => 'മായ്ക്കലിന്റെ കാരണം തിരുത്തുക',
 'delete-toobig' => 'ഈ താളിനു വളരെ വിപുലമായ തിരുത്തൽ ചരിത്രമുണ്ട്. $1 മേൽ {{PLURAL:$1|പതിപ്പുണ്ട്|പതിപ്പുകളുണ്ട്}}. ഇത്തരം താളുകൾ മായ്ക്കുന്നതു {{SITENAME}} സം‌രംഭത്തിന്റെ നിലനില്പ്പിനെ തന്നെ ബാധിക്കുമെന്നതിനാൽ ഈ താൾ മായ്ക്കുന്നതിനുള്ള അവകാശം പരിമിതപ്പെടുത്തിയിരിക്കുന്നു.',
 'delete-warning-toobig' => 'ഈ താളിനു വളരെ വിപുലമായ തിരുത്തൽ ചരിത്രമുണ്ട്. അതായത്, ഇതിനു് $1 മേൽ {{PLURAL:$1|പതിപ്പുണ്ട്|പതിപ്പുകളുണ്ട്}}. ഇത്തരം താളുകൾ മായ്ക്കുന്നതു {{SITENAME}} സം‌രംഭത്തിന്റെ ഡാറ്റാബേസ് ഓപ്പറേഷനെ ബാധിച്ചേക്കാം. അതിനാൽ വളരെ ശ്രദ്ധാപൂർവ്വം തുടർനടപടികളിലേക്കു നീങ്ങുക.',
-'deleting-backlinks-warning' => "'''മുന്നറിയിപ്പ്:''' മറ്റു താളുകളിൽ നിന്നും താളിലേയ്ക്കുള്ള കണ്ണികൾ താങ്കൾ മായ്ക്കാൻ പോവുകയാണ്.",
+'deleting-backlinks-warning' => "'''à´®àµ\81à´¨àµ\8dനറിയിപàµ\8dà´ªàµ\8d:''' à´®à´±àµ\8dà´±àµ\81 à´¤à´¾à´³àµ\81à´\95ളിൽ à´¨à´¿à´¨àµ\8dà´¨àµ\81à´\82 à´¤à´¾à´³à´¿à´²àµ\87à´¯àµ\8dà´\95àµ\8dà´\95àµ\81à´³àµ\8dà´³ à´\95à´£àµ\8dണിà´\95ൾ à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´\89ൾപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dതിയിà´\9fàµ\8dà´\9fàµ\81à´³àµ\8dà´³ à´¤à´¾à´³àµ\81à´\95ൾ à´¤à´¾à´\99àµ\8dà´\95ൾ à´®à´¾à´¯àµ\8dà´\95àµ\8dà´\95ാൻ à´ªàµ\8bà´µàµ\81à´\95യാണàµ\8d.",
 
 # Rollback
 'rollback' => 'തിരുത്തലുകൾ റോൾബാക്ക് ചെയ്യുക',
@@ -2791,7 +2800,7 @@ $1',
 'change-blocklink' => 'തടയലിൽ മാറ്റം വരുത്തുക',
 'contribslink' => 'സംഭാവനകൾ',
 'emaillink' => 'ഇമെയിൽ അയയ്ക്കുക',
-'autoblocker' => 'താങ്കളുടെ ഐ.പി. വിലാസം "[[User:$1|$1]]" എന്ന ഉപയോക്താവ് ഈ അടുത്ത് ഉപയോഗിക്കുകയും പ്രസ്തുത ഉപയോക്താവിനെ വിക്കിയിൽ നിന്നു തടയുകയും ചെയ്തിട്ടുള്ളതാണ്‌. അതിനാൽ താങ്കളും യാന്ത്രികമായി തടയപ്പെട്ടിരിക്കുന്നു. $1 എന്ന ഉപയോക്താവിന്റെ തടയലിനു സൂചിപ്പിക്കപ്പെട്ട കാരണം "$2" എന്നാണ്‌.',
+'autoblocker' => 'താങ്കളുടെ ഐ.പി. വിലാസം "[[User:$1|$1]]" എന്ന ഉപയോക്താവ് ഈ അടുത്ത് ഉപയോഗിക്കുകയും പ്രസ്തുത ഉപയോക്താവിനെ വിക്കിയിൽ നിന്നു തടയുകയും ചെയ്തിട്ടുള്ളതാണ്‌. അതിനാൽ താങ്കളും യാന്ത്രികമായി തടയപ്പെട്ടിരിക്കുന്നു. $1 എന്ന ഉപയോക്താവിന്റെ തടയലിനു സൂചിപ്പിക്കപ്പെട്ട കാരണം "$2" എന്നാണ്‌',
 'blocklogpage' => 'തടയൽ രേഖ',
 'blocklog-showlog' => 'ഈ ഉപയോക്താവ് മുമ്പേ തടയപ്പെട്ടതാണ്.
 തടയൽ രേഖ അവലംബമായി താഴെ കൊടുത്തിരിക്കുന്നു:',
@@ -2999,6 +3008,7 @@ $1',
 'thumbnail_image-type' => 'ചിത്രത്തിന്റെ തരം പിന്തുണക്കപ്പെട്ടതല്ല',
 'thumbnail_gd-library' => 'അപൂർണ്ണമായ ജി.ഡി. ലൈബ്രറി ക്രമീകരണം: ഫങ്ഷൻ $1 ലഭ്യമല്ല',
 'thumbnail_image-missing' => 'പ്രമാണം ലഭ്യമല്ലെന്നു കാണുന്നു: $1',
+'thumbnail_image-failure-limit' => 'ഈ ലഘുചിത്രം സൃഷ്ടിക്കാൻ നിരവധി പരാജയപ്പെട്ട ശ്രമങ്ങൾ ($1 അല്ലെങ്കിൽ കൂടുതൽ) നടന്നിട്ടുണ്ട്. ദയവായി പിന്നീട് ശ്രമിക്കുക.',
 
 # Special:Import
 'import' => 'താളുകൾ ഇറക്കുമതി ചെയ്യുക',
@@ -3037,7 +3047,7 @@ $1',
 തത്കാലത്തേയ്ക്കു വേണ്ടിയിരുന്ന ഒരു ഫോൾഡർ ലഭ്യമല്ല.',
 'import-parse-failure' => 'എക്സ്.എം.എൽ. ഇറക്കുമതി പാഴ്സ് പരാജയം',
 'import-noarticle' => 'ഇറക്കുമതി ചെയ്യാൻ താൾ ഇല്ല!',
-'import-nonewrevisions' => 'à´\8eà´²àµ\8dലാ à´ªà´¤à´¿à´ªàµ\8dà´ªàµ\81à´\95à´³àµ\81à´\82 à´®àµ\81à´®àµ\8dà´ªàµ\87 à´\87à´±à´\95àµ\8dà´\95àµ\81മതി à´\9aàµ\86à´¯àµ\8dതിà´\9fàµ\8dà´\9fàµ\81à´³àµ\8dളതാണàµ\8dâ\80\8c.',
+'import-nonewrevisions' => 'à´\92à´°àµ\81 à´¨à´¾àµ¾à´ªàµ\8dപതിപàµ\8dà´ªàµ\81à´\82 à´\87à´±à´\95àµ\8dà´\95àµ\81മതി à´\9aàµ\86à´¯àµ\8dതിà´\9fàµ\8dà´\9fà´¿à´²àµ\8dà´² (à´\8eà´²àµ\8dലാà´\82 à´¨à´¿à´²à´µà´¿àµ½ à´\89à´£àµ\8dà´\9fàµ\8d, à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´ªà´¿à´´à´µàµ\81à´\95à´³àµ\81à´³àµ\8dളതിനാൽ à´\92ഴിവാà´\95àµ\8dà´\95à´¿).',
 'xml-error-string' => '$2 വരിയിൽ $1, നിര $3 (ബൈറ്റ് $4): $5',
 'import-upload' => 'എക്സ്.എം.എൽ. ഡേറ്റ അപ്‌‌ലോഡ് ചെയ്യുക',
 'import-token-mismatch' => 'സെഷൻ ഡാറ്റ നഷ്ടപ്പെട്ടതിനാൽ ദയവായി വീണ്ടും ശ്രമിക്കൂക',
@@ -4222,4 +4232,6 @@ $5
 'expand_templates_generate_rawhtml' => 'അസംസ്കൃത എച്ച്.റ്റി.എം.എൽ. പ്രദർശിപ്പിക്കുക',
 'expand_templates_preview' => 'എങ്ങനെയുണ്ടെന്നു കാണുക',
 
+# Unknown messages
+'uploadinvalidxml' => 'അപ്‌ലോഡ് ചെയ്ത പ്രമാണത്തിലെ എക്സ്.എം.എൽ. പാഴ്സ് ചെയ്യാൻ കഴിയില്ല.',
 );
index 5a6e44c..78288b5 100644 (file)
@@ -46,7 +46,6 @@ $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъы
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Линкүүдийн доогуур зураас зур:',
-'tog-justify' => 'Мөрүүдийг тэгшлэх',
 'tog-hideminor' => 'Сүүлийн өөрчлөлтүүд дахь бага зэргийн засваруудыг нуух',
 'tog-hidepatrolled' => 'Сүүлийн өөрчлөлтүүдэд манагдсан засваруудыг нуух',
 'tog-newpageshidepatrolled' => 'Шинэ хуудсуудын жагсаалтаас манагдаж буй хуудсуудыг нуух',
@@ -167,7 +166,7 @@ $messages = array(
 'category-empty' => "''Одоогийн байдлаар энэ ангилалд хуудас, медиа файл байхгүй байна.''",
 'hidden-categories' => '{{PLURAL:$1|Нуугдсан ангилал|Нуугдсан ангиллууд}}',
 'hidden-category-category' => 'Нуугдсан ангиллууд',
-'category-subcat-count' => '{{PLURAL:$2|ЭнÑ\8d Ð°Ð½Ð³Ð¸Ð»Ð°Ð»Ð´ Ð´Ð°Ñ\80ааÑ\85 Ð´Ñ\8dд Ð°Ð½Ð³Ð¸Ð»Ð°Ð» Ð» Ð±Ð°Ð¹Ð½Ð°.|ЭнÑ\8d Ð°Ð½Ð³Ð¸ Ð´Ð¾Ñ\82Ñ\80оо $2 Ð°Ð½Ð³Ð¸, Ð±Ò¯Ð»Ñ\8dгÑ\82Ñ\8dй. Ò®Ò¯Ð½Ñ\8dÑ\8dÑ\81 $1 Ð´Ð¾Ð¾Ñ\80 Ñ\85аÑ\80агдаж Ð±Ð°Ð¹Ð½Ð°.}}',
+'category-subcat-count' => '{{PLURAL:$2|ЭнÑ\8d Ð±Ò¯Ð»Ñ\8dг Ð·Ó©Ð²Ñ\85өн Ð´Ð°Ñ\80ааÑ\85 Ð´Ñ\8dд Ð±Ò¯Ð»Ñ\8dгÑ\82Ñ\8dй.|ЭнÑ\8d Ð±Ò¯Ð»Ñ\8dг Ð½Ð¸Ð¹Ñ\82 $2 -ооÑ\81 {{PLURAL:$1| Ð±Ò¯Ð»Ñ\8dгÑ\82Ñ\8dй.|$1 Ð±Ò¯Ð»Ð³Ò¯Ò¯Ð´Ñ\82Ñ\8dй.}}}}',
 'category-subcat-count-limited' => 'Энэ ангилалд {{PLURAL:$1| дэд ангилал|$1-н дэд ангилалууд}} байна.',
 'category-article-count' => '{{PLURAL:$2|Энд нэг хуудас байна.|Энд $2 хуудас байна. Үүнээс $1 доор харагдаж байна.}}',
 'category-article-count-limited' => 'Энэ ангилалд дараах {{PLURAL:$1|хуудас|$1 хуудаснууд}} байна.',
@@ -206,7 +205,6 @@ $messages = array(
 'vector-action-protect' => 'Хамгаалах',
 'vector-action-undelete' => 'Үл устгах',
 'vector-action-unprotect' => 'Хамгаалалтаа солих',
-'vector-simplesearch-preference' => 'Хялбарчилсан хайлтын талбарыг идэвхижүүлэх (зөвхөн Вектор скин)',
 'vector-view-create' => 'Үүсгэх',
 'vector-view-edit' => 'Засварлах',
 'vector-view-history' => 'Түүхийг үзэх',
@@ -254,7 +252,7 @@ $messages = array(
 'articlepage' => 'Өгүүллийг үзэх',
 'talk' => 'Хэлэлцүүлэг',
 'views' => 'Харагдацууд',
-'toolbox' => 'Ð\91агаж Ñ\85Ñ\8dÑ\80Ñ\8dгÑ\81лүүд',
+'toolbox' => 'Ð¥Ñ\8dÑ\80Ñ\8dглүүÑ\80',
 'userpage' => 'Хэрэглэгчийн хуудсыг үзэх',
 'projectpage' => 'Төслийн хуудсыг үзэх',
 'imagepage' => 'Файлын хуудсыг үзэх',
@@ -1033,7 +1031,6 @@ $1",
 'compareselectedversions' => 'Сонгосон хувилбаруудыг харьцуулах',
 'showhideselectedversions' => 'Сонгосон хувилбаруудыг үзүүлэх/нуух',
 'editundo' => 'цуцлах',
-'diff-multi' => '({{PLURAL:$2|Нэг хэрэглэгчийн|$2 хэрэглэгчийн}} завсрын {{PLURAL:$1|нэг засварыг|$1 засварыг}} үзүүлээгүй)',
 'diff-multi-manyusers' => '($2 гаруй {{PLURAL:$2|хэрэглэгчийн}} {{PLURAL:$1|дундын нэг засварыг|дундын $1 засварыг}} үзүүлсэнгүй)',
 
 # Search results
@@ -1050,7 +1047,7 @@ $1",
 'shown-title' => 'Хуудас бүрд $1 {{PLURAL:$1|үр дүн}} гаргах',
 'viewprevnext' => 'Үзэх: ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Энэ викид \"[[:\$1]]\" гэсэн хуудас байна'''",
-'searchmenu-new' => "'''Энэ викид \"[[:\$1]]\" гэсэн хуудсыг үүсгэх!'''",
+'searchmenu-new' => '<strong> Энэ викид "[[:$1]]" хуудсыг үүсгэх!</strong> {{PLURAL:$2|0=|Мөн хайлтаар олдсон хуудсаа харна.|Мөн хайлтаар олдсон хуудсаа харна.}}',
 'searchprofile-articles' => 'Агуулгын хуудсууд',
 'searchprofile-project' => 'Тусламжийн болон төслийн хуудсууд',
 'searchprofile-images' => 'Мультмедиа',
@@ -1367,7 +1364,7 @@ $1 тэмдэгтээс богино байх ёстой.',
 'rclistfrom' => '$1-с хойших шинэ засваруудыг үзүүлэх',
 'rcshowhideminor' => 'Бага зэргийн засваруудыг $1',
 'rcshowhidebots' => 'Роботуудыг $1',
-'rcshowhideliu' => 'Ð\91Ò¯Ñ\80Ñ\82гÑ\8dлÑ\82Ñ\8dй Ñ\85Ñ\8dÑ\80Ñ\8dглÑ\8dгÑ\87дийг $1',
+'rcshowhideliu' => 'Ð\9dийÑ\82 $1 Ð±Ò¯Ñ\80Ñ\82гÑ\8dгдÑ\81Ñ\8dн Ñ\85Ñ\8dÑ\80Ñ\8dглÑ\8dгÑ\87ид',
 'rcshowhideanons' => 'Бүртгэлгүй хэрэглэгчдийг $1',
 'rcshowhidepatr' => 'Хянагдаж буй засваруудыг $1',
 'rcshowhidemine' => 'Миний засваруудыг $1',
@@ -2012,7 +2009,6 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 'watchmethod-list' => 'хяналтад буй хуудсуудад саяхан өөрчлөлт орсон эсэхийг шалгаж байна',
 'watchlistcontains' => 'Таны хянах жагсаалтанд $1 хуудас байна.',
 'iteminvalidname' => "'$1' зүйлд асуудал гарлаа, хүчингүй нэр...",
-'wlnote' => "Энд нь {{PLURAL:$2|цагийн|'''$2''' цагийн}} өмнө хамгийн сүүлд хийсэн {{PLURAL:$1|өөрчлөлт| '''$1''' өөрчлөлтүүд}} байна.",
 'wlshowlast' => 'Сүүлийн $1 цагийн $2 өдрийн $3-г харуул',
 'watchlist-options' => 'Хянаж буй хуудсуудын жагсаалтны сонголтууд',
 
@@ -2242,7 +2238,7 @@ $1',
 'contributions' => '{{GENDER:$1|Хэрэглэгчийн }} оруулсан хувь нэмэр',
 'contributions-title' => '$1 хэрэглэгчийн хувь нэмэр',
 'mycontris' => 'Оруулсан хувь нэмэр',
-'contribsub2' => 'Хэрэглэгч: $1 ($2)',
+'contribsub2' => 'Хэрэглэгч: {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Энэ шалгуурт тохирох өөрчилсөн зүйлүүд олдсонгүй.',
 'uctop' => '(одоох)',
 'month' => 'Дараах сараас (өмнөх засварууд нь ч орно):',
@@ -2615,7 +2611,6 @@ $1',
 'tooltip-pt-watchlist' => 'Засварууд нь хянагдаж буй хуудсуудын жагсаалт',
 'tooltip-pt-mycontris' => 'Таны оруулсан хувь нэмрийн жагсаалт',
 'tooltip-pt-login' => 'Заавал хийх ёстой зүйл биш боловч таныг нэвтрэхийг зөвлөж байна.',
-'tooltip-pt-anonlogin' => 'Таныг нэвтрэхийг зөвлөж байна, гэхдээ энэ бол заавал хийх ёстой зүйл биш.',
 'tooltip-pt-logout' => 'Гарах',
 'tooltip-ca-talk' => 'Хуудасны талаарх хэлэлцүүлэг',
 'tooltip-ca-edit' => 'Та энэ хуудсыг засварлах боломжтой. Хадгалахынхаа өмнө "Урьдчилан харах" товчлуурыг хэрэглэнэ үү.',
@@ -3428,6 +3423,23 @@ $5
 # API errors
 'api-error-filename-tooshort' => 'Файлын нэр хэтэрхий урт байна.',
 'api-error-filetype-banned' => 'Ийм төрлийн файлыг хорьсон байна.',
+'api-error-illegal-filename' => 'Ийм хэрэглэгчийн нэр өгөх боломжгүй.',
+'api-error-internal-error' => 'Өөрийн алдаа: файлыг чинь upload хийх явцад алдаа гарлаа.',
+'api-error-mustbeloggedin' => 'файлаа upload хийхийн тулд эхлээд хэрэглэгчээр нэвтэр.',
+'api-error-mustbeposted' => 'Өөрийн алдаа: HTTP POST төрлийн хандалт шаардлагатай.',
+'api-error-noimageinfo' => 'upload хийгдсэн боловч файлын талаар ямарч мэдээлэл сервер өгсөнгүй.',
+'api-error-nomodule' => 'Өөрийн алдаа: upload хийх модулийг зааж өгөөгүй байна.',
+'api-error-ok-but-empty' => 'Өөрийн алдаа: Серверээс хариу ирсэнгүй.',
+'api-error-overwrite' => 'Ижил нэртэй файл оруулах хориотой.',
+'api-error-stashfailed' => 'Өөрийн алдаа: Серверт түр файл хадгалахад алдаа гарлаа.',
+'api-error-timeout' => 'Сервер хариу өгөлгүй удлаа.',
+'api-error-unclassified' => 'Тодорхойгүй алдаа гарлаа.',
+'api-error-unknown-code' => 'Тодорхойгүй алдаа: "$1".',
+'api-error-unknown-error' => 'Өөрийн алдаа: upload хийх үед алдаа гарлаа.',
+'api-error-unknown-warning' => 'Тодорхойгүй сануулга: $1',
+'api-error-unknownerror' => 'Тодорхойгүй алдаа: $1',
+'api-error-uploaddisabled' => 'Энэ викид upload хийхийг хориглосон.',
+'api-error-verification-error' => 'Файлын төрөл буруу, эсвэл дутуу татагдсан.',
 
 # Durations
 'duration-seconds' => '$1 {{PLURAL:$1|секунд|секунд}}',
index 3c760f0..59fcdbe 100644 (file)
@@ -331,7 +331,6 @@ $digitGroupingPattern = "##,##,###";
 $messages = array(
 # User preference toggles
 'tog-underline' => 'दुव्यांचे अधोरेखन:',
-'tog-justify' => 'परिच्छेद समान करा',
 'tog-hideminor' => 'अलीकडील बदलांत छोटी संपादने लपवा',
 'tog-hidepatrolled' => 'पहारा दिलेली संपादने (नित्य पहाण्यात असलेली संपादने) अलीकडील बदलांमधून लपवा',
 'tog-newpageshidepatrolled' => 'नवीन पृष्ठ यादीतून पहारा दिलेली पाने (नित्य पहाण्यात असलेली संपादने)  लपवा',
@@ -493,7 +492,6 @@ $messages = array(
 'vector-action-protect' => 'सुरक्षित करा',
 'vector-action-undelete' => 'वगळलेले पुनर्स्थापित करा',
 'vector-action-unprotect' => 'सुरक्षितता बदला',
-'vector-simplesearch-preference' => 'सोपा शोधपट्टी विकल्प सक्रिय करा (फक्त व्हेक्टर त्वचेसाठी)',
 'vector-view-create' => 'तयार करा',
 'vector-view-edit' => 'संपादन',
 'vector-view-history' => 'इतिहास पहा',
@@ -726,6 +724,7 @@ $2',
 'invalidtitle-unknownnamespace' => 'अनोळखी नामविश्वाच्या आकड्यासह अवैध मथळा $1 व मजकूर "$2"',
 'exception-nologin' => 'सनोंद-प्रवेशित नाही',
 'exception-nologin-text' => 'हे पान किंवा क्रिया करण्यासाठी आपल्याला या विकिवर [[Special:Userlogin|सनोंद- प्रवेशित]] असावयास हवे.',
+'exception-nologin-text-manual' => 'हे पान किंवा क्रियेस पोचण्यास कृपया $1 करा.',
 
 # Virus scanner
 'virus-badscanner' => "खराब विन्यास (कॉन्फिगरेशन): अनोळखी व्हायरस स्कॅनर: ''$1''",
@@ -874,6 +873,8 @@ $2',
 'retypenew' => 'पुन्हा एकदा परवलीचा शब्द टंका:',
 'resetpass_submit' => 'परवलीचा शब्द टाका आणि सनोंद-प्रवेश करा',
 'changepassword-success' => 'तुमचा परवलीचा शब्द यशस्वीरित्या बदललेला आहे!',
+'changepassword-throttled' => 'तुम्ही नुकतेच सनोंद- प्रवेशासाठी अनेकानेक प्रयत्न केले आहेत.
+कृपया, पुन्हा प्रयत्न करण्याआधी $1 थोडी उसंत घ्या.',
 'resetpass_forbidden' => 'परवलीचे शब्द बदलता येत नाहीत.',
 'resetpass-no-info' => 'या पानामध्ये थेट जाण्यासाठी तुम्हास  सनोंद-प्रवेशित असावयास हवे.',
 'resetpass-submit-loggedin' => 'परवलीचा शब्द बदला',
@@ -923,6 +924,8 @@ $2',
 'changeemail-password' => 'तुमचा {{SITENAME}} संकेतांक:',
 'changeemail-submit' => 'ईमेल बदला',
 'changeemail-cancel' => 'रद्द करा',
+'changeemail-throttled' => 'तुम्ही नुकतेच सनोंद- प्रवेशासाठी अनेक प्रयत्न केले आहेत.
+कृपया, पुन्हा प्रयत्न करण्याआधी $1 थोडी उसंत घ्या.',
 
 # Special:ResetTokens
 'resettokens' => 'ओळखचिन्ह(टोकन) पुनर्स्थापित करा',
@@ -1121,7 +1124,7 @@ $2',
 'invalid-content-data' => 'अवैध माहिती',
 'content-not-allowed-here' => '"$1" हा आशय [[$2]] लेखावर टाकण्याची अनुमती नाही.',
 'editwarning-warning' => "या पानावरुन दुसर्‍या पानावर गेल्यास, तुम्ही येथे केलेले बदल जतन होणार नाहीत.
-जर आपण सनोंद-प्रवेशित असाल तर, ही सूचना घालवण्यासाठी ''माझ्या पसंती'' मधील संपादनपसंतीत बदल करा.",
+जर आपण सनोंद-प्रवेशित असाल तर, ही सूचना घालवण्यासाठी ''{{int:prefs-editing}}'' मधील संपादनपसंतीत बदल करा.",
 
 # Content models
 'content-model-wikitext' => 'विकिमजकूर',
@@ -1134,10 +1137,10 @@ $2',
 
 ते $2{{PLURAL:$2|कॉल|कॉल्स}} पेक्षा कमी असायला हवेत, सध्या $1{{PLURAL:$1| $1 कॉल| $1 कॉल्स}} एवढे आहेत.',
 'expensive-parserfunction-category' => 'खूप सारे खर्चीक पार्सर क्रिया कॉल्स असणारी पाने',
-'post-expand-template-inclusion-warning' => 'सूचना: साचे वाढविण्याची मर्यादा संपलेली आहे.
+'post-expand-template-inclusion-warning' => '<strong>ईशारा:</strong> साचे वाढविण्याची मर्यादा संपलेली आहे.
 काही साचे वगळले जातील.',
 'post-expand-template-inclusion-category' => 'अशी पाने ज्यांच्यावर साचे चढविण्याची मर्यादा संपलेली आहे',
-'post-expand-template-argument-warning' => 'सूचना: या पानावर असा एकतरी साचा आहे जो वाढविल्यास खूप मोठा होईल.
+'post-expand-template-argument-warning' => '<strong>ईशारा:</strong> या पानावर असा एकतरी साचा आहे जो वाढविल्यास खूप मोठा होईल.
 असे साचे वगळण्यात आलेले आहेत.',
 'post-expand-template-argument-category' => 'अशी पाने ज्यांच्यामध्ये साचे वगळलेले आहेत',
 'parser-template-loop-warning' => 'साचा चक्र मिळाले: [[$1]]',
@@ -1155,6 +1158,7 @@ $2',
 'undo-success' => 'संपादन परतवले जाऊ शकते.कृपया, आपण नेमके हेच करू इच्छिता तर ते खाली दिलेली तुलना पाहू निश्चित करा,आणि नंतर संपादन परतवण्याचे काम पूर्ण करण्याकरिता इच्छित बदल जतन करा.',
 'undo-failure' => 'विसंवादी आंतरवर्ती संपादने झाल्यामुळे आपण हे संपादन परतवू शकत नाही.',
 'undo-norev' => 'हे संपादन परतविता आलेले नाही कारण ते अगोदरच उलटविलेले किंवा वगळलेले आहे.',
+'undo-nochange' => 'असे दिसते कि हे संपादन पूर्ववत केल्या गेले आहे.',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|चर्चा]])यांची आवृत्ती $1 परतवली.',
 'undo-summary-username-hidden' => 'अज्ञात सदस्याची $1 आवृत्ती परतवा',
 
@@ -1331,7 +1335,6 @@ $1",
 'showhideselectedversions' => 'निवडलेल्या आवृत्त्या दाखवा / लपवा',
 'editundo' => 'उलटवा',
 'diff-empty' => '(काही फरक नाही)',
-'diff-multi' => '{{PLURAL:$2|सदस्याची|$2 सदस्यांच्या}} ({{PLURAL:$1|आंतरवर्ती आवृत्ती|$1  आंतरवर्ती आवृत्त्या}} दाखवल्या नाहीत)',
 'diff-multi-manyusers' => '{{PLURAL:$2|सदस्याची|$2 सदस्यांच्या}} ({{PLURAL:$1|आवृत्ती|$1 आवृत्त्या}} दाखवल्या नाहीत)',
 'difference-missing-revision' => 'या लेखाचे/ची  ($1) हे {{PLURAL:$2|संस्करण|$2 संस्करणे}} {{PLURAL:$2|सापडले नाही|सापडली नाहीत}}.वगळल्या गेलेल्या लेखपानाच्या जुन्या इतिहास-दुव्याचे अनुसरण केल्यामुळे, शक्यतोवर,असे घडु शकते.याबाबत अधिक तपशील  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी] येथे बघता येईल.',
 
@@ -1349,7 +1352,7 @@ $1",
 'shown-title' => '$1 {{PLURAL:$1|निकाल}} प्रतिपान पहा',
 'viewprevnext' => 'पहा ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''या विकिवर \"[[:\$1]]\" या नावाचे पान आहे.'''",
-'searchmenu-new' => "'''या विकिवर \"[[:\$1]]\" हे पान तयार करा!'''",
+'searchmenu-new' => '<strong>या विकिवर "[[:$1]]" हे पान तयार करा!</strong> {{PLURAL:$2|0=|See also the page found with your search.|सापडलेले शोध निकालही पहा.}}',
 'searchprofile-articles' => 'आशय-पाने',
 'searchprofile-project' => 'साहाय्य व प्रकल्प पाने',
 'searchprofile-images' => 'बहुमाध्यमे',
@@ -1374,6 +1377,7 @@ $1",
 'searchrelated' => 'संबंधित',
 'searchall' => 'सर्व',
 'showingresults' => "#'''$2'''पासून {{PLURAL:$1|'''1'''पर्यंतचा निकाल|'''$1'''पर्यंतचे निकाल}} खाली दाखवले आहे.",
+'showingresultsinrange' => 'खाली #<strong>$2</strong> ते #<strong>$3</strong> पर्यंतच्या कक्षेतील {{PLURAL:$1|<strong>१</strong> निकाल दाखविला आहे|<strong>$1</strong> निकाल दाखविले आहेत}}.',
 'showingresultsnum' => "खाली दिलेले #'''$2'''पासून सुरू होणारे  {{PLURAL:$3|'''1''' निकाल|'''$3''' निकाल}}.",
 'showingresultsheader' => "'''$4''' साठी {{PLURAL:$5|'''$3'''पैकी '''$1''' निकाल|'''$3''' पैकी '''$1 - $2''' निकाल}}",
 'search-nonefound' => 'दिलेल्या पृच्छेशी जुळणारे निकाल नाहीत.',
@@ -1861,7 +1865,7 @@ $1',
 'backend-fail-read' => '$1 ही संचिका वाचता आली नाही.',
 'backend-fail-create' => '$1 ही संचिका लिहिता आली नाही.',
 'backend-fail-maxsize' => '$1 ही संचिका लिहिता आली नाही कारण ती {{PLURAL:$2|एक बाइट|$2 बाइट्स}} पेक्षा मोठी आहे.',
-'backend-fail-readonly' => 'पारà¥\8dशà¥\8dवभà¥\8cमà¥\80à¤\95 à¤¸à¤¾à¤ à¤µà¤£ "$1" â\80\9cफà¤\95à¥\8dत à¤µà¤¾à¤\9aाâ\80\9d à¤\85सà¥\87 à¤\86हà¥\87. à¤¦à¤¿à¤²à¥\87लà¥\87 à¤\95ारण "$2" à¤\86हà¥\87.',
+'backend-fail-readonly' => 'पारà¥\8dशà¥\8dवभà¥\8cमà¥\80à¤\95 à¤¸à¤¾à¤ à¤µà¤£ "$1" â\80\9cफà¤\95à¥\8dत à¤µà¤¾à¤\9aाâ\80\9d à¤\85शà¥\80 à¤\86हà¥\87. à¤¦à¤¿à¤²à¥\87लà¥\87 à¤\95ारण à¤\86हà¥\87: "<em>$2</em>"',
 'backend-fail-synced' => 'अंतर्गत पार्श्वभौमीक साठवणीतील फाईल "$1" विसंगत आहे.',
 'backend-fail-connect' => 'पार्श्वभौमीक साठा "$1"शी संबंध जोडू शकत नाही.',
 'backend-fail-internal' => 'पार्श्वभौमीक साठा "$1" यात अज्ञात चूक झाली आहे.',
@@ -2004,24 +2008,24 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 # File reversion
 'filerevert' => '$1 पूर्वपद',
 'filerevert-legend' => 'संचिका पूर्वपदास',
-'filerevert-intro' => 'तुम्ही [$3, $2 प्रमाणे आवर्तन$4 कडे] [[Media:$1|$1]]  उलटवत आहात.',
+'filerevert-intro' => 'तुम्ही [$3, $2 प्रमाणे आवर्तन$4 कडे]<strong>[[Media:$1|$1]]</strong>  उलटवत आहात.',
 'filerevert-comment' => 'कारण:',
 'filerevert-defaultcomment' => '$2, $1 च्या आवृत्तीत पूर्वपदास',
 'filerevert-submit' => 'पूर्वपद',
-'filerevert-success' => "[$3, $2 प्रमाणे आवर्तन $4]कडे '''[[Media:$1|$1]]''' उलटवण्यात आली.",
+'filerevert-success' => '[$3, $2 प्रमाणे आवर्तन $4]कडे<strong>[[Media:$1|$1]]</strong>उलटवण्यात आली.',
 'filerevert-badversion' => 'दिलेलेल्या वेळ मापनानुसार,या संचिकेकरिता कोणतीही पूर्वीची स्थानिक आवृत्ती नाही.',
 
 # File deletion
 'filedelete' => '$1 वगळा',
 'filedelete-legend' => 'संचिका वगळा',
-'filedelete-intro' => "तुम्ही '''[[Media:$1|$1]]''' वगळत आहात.",
-'filedelete-intro-old' => "[$4 $3, $2]च्या वेळेचे '''[[Media:$1|$1]]'''चे आवर्तन तुम्ही वगळत आहात.",
+'filedelete-intro' => 'तुम्ही<strong>[[Media:$1|$1]]</strong>त्याच्या सर्व इतिहासासह,वगळण्याच्या तयारीत आहात.',
+'filedelete-intro-old' => '[$4 $3, $2]च्या वेळेचे<strong>[[Media:$1|$1]]</strong>चे आवर्तन तुम्ही वगळत आहात.',
 'filedelete-comment' => 'कारण:',
 'filedelete-submit' => 'वगळा',
-'filedelete-success' => "'''$1'''वगळण्यात आले.",
-'filedelete-success-old' => '<span class="plainlinks">$3, $2 वेळी \'\'\'[[Media:$1|$1]]\'\'\' चे आवर्तन वगळण्यात आले आहे .</span>',
-'filedelete-nofile' => "'''$1''' अस्तित्वात नाही.",
-'filedelete-nofile-old' => "सांगितलेल्या गुणधर्मानुसार  '''$1'''चे कोणतेही विदा आवर्तन संचित नाही.",
+'filedelete-success' => '<strong>$1</strong>वगळण्यात आले.',
+'filedelete-success-old' => '$3चे<strong>[[Media:$1|$1]]</strong> आवर्तन, $2वगळण्यात आले आहे .',
+'filedelete-nofile' => '<strong>$1</strong>अस्तित्वात नाही.',
+'filedelete-nofile-old' => 'सांगितलेल्या गुणधर्मानुसार<strong>$1</strong>चे कोणतेही विदा आवर्तन संचित नाही.',
 'filedelete-otherreason' => 'दुसरे/अतिरिक्त कारण:',
 'filedelete-reason-otherlist' => 'इतर कारण',
 'filedelete-reason-dropdown' => '*वगळण्याची सामान्य कारणे
@@ -2159,10 +2163,20 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'deadendpagestext' => 'या पानांवर या विकिवरील इतर कुठल्याही पानाला जोडणारा दुवा नाही.',
 'protectedpages' => 'सुरक्षित पाने',
 'protectedpages-indef' => 'फक्त अनंत काळासाठी सुरक्षित केलेले',
+'protectedpages-summary' => 'या पानात,अस्तित्वात असणाऱ्या संरक्षित अशा पानाची यादी आहे.नवनिर्माणापासून संरक्षित शीर्षकांच्या यादीसाठी [[{{#special:ProtectedTitles}}]] बघा.',
 'protectedpages-cascade' => 'केवळ एकामेकांवर अवलंबून कास्केडींग सुरक्षा (सुरक्षा शिडी)',
 'protectedpages-noredirect' => 'पुनर्निर्देशने लपवा',
 'protectedpagesempty' => 'सध्या या नियमावलीने कोणतीही पाने सुरक्षित केलेली नाहीत.',
+'protectedpages-timestamp' => 'वेळशिक्का',
+'protectedpages-page' => 'पान',
+'protectedpages-expiry' => 'संपण्याचा कालावधी',
+'protectedpages-performer' => 'सदस्याचे रक्षण करीत आहे',
+'protectedpages-params' => 'रक्षणाची प्राचले',
+'protectedpages-reason' => 'कारण',
+'protectedpages-unknown-timestamp' => 'अज्ञात',
+'protectedpages-unknown-performer' => 'अनामिक सदस्य',
 'protectedtitles' => 'सुरक्षीत शीर्षके',
+'protectedtitles-summary' => 'या पानात अशा शीर्षकांची यादी आहे, जी नविन तयार करता येउ  शकणार नाहीत.अस्तित्वात असणाऱ्या संरक्षित पानांच्या यादीसाठी [[{{#special:ProtectedPages}}]] बघा.',
 'protectedtitlesempty' => 'या नियमावलीने सध्या कोणतीही शीर्षके सुरक्षित केलेली नाहीत.',
 'listusers' => 'सदस्यांची यादी',
 'listusers-editsonly' => 'फक्त संपादनांसहित सदस्य दाखवा',
@@ -2408,7 +2422,7 @@ $UNWATCHURL
 'exblank' => 'पान रिकामे होते',
 'delete-confirm' => '"$1" वगळा',
 'delete-legend' => 'वगळा',
-'historywarning' => 'सूचना: तुम्ही वगळत असलेल्या पानाला $1 {{PLURAL:$1|आवर्तनाचा|आवर्तनांचा}} इतिहास आहे:',
+'historywarning' => '<strong>ईशारा:</strong> तुम्ही वगळत असलेल्या पानाला $1 {{PLURAL:$1|आवर्तनाचा|आवर्तनांचा}} इतिहास आहे:',
 'confirmdeletetext' => 'तुम्ही एक लेखपान त्याच्या सर्व इतिहासासोबत वगळण्याच्या तयारीत आहात.
 कृपया, तुम्ही करीत असलेली कृती ही मीडियाविकीच्या [[{{MediaWiki:Policy-url}}|नीतीनुसार]] आहे ह्याची खात्री करा. तसेच, तुम्ही करीत असलेल्या कृतीचे परिणाम, कृती करण्यापूर्वी जाणून घ्या.',
 'actioncomplete' => 'काम पूर्ण',
@@ -2473,11 +2487,11 @@ $UNWATCHURL
 'protect_expiry_invalid' => 'संपण्याचा कालावधी चुकीचा आहे.',
 'protect_expiry_old' => 'संपण्याचा कालावधी उलटून गेलेला आहे.',
 'protect-unchain-permissions' => 'पुढील संरक्षित विकल्प उघडा.',
-'protect-text' => "'''$1''' या पानाची सुरक्षापातळी तुम्ही इथे पाहू शकता अथवा बदलू शकता.",
-'protect-locked-blocked' => "तुम्ही प्रतिबंधित असताना सुरक्षा पातळी बदलू शकत नाही.येथे '''$1''' पानाकरिता सध्याची मांडणावळ आहे:",
-'protect-locked-dblock' => "विदागारास ताळे लागलेले असताना सुरक्षा पातळी बदलता येत नाही.येथे '''$1''' पानाकरिता सध्याची मांडणावळ आहे:",
-'protect-locked-access' => "तुम्हाला या पानाची सुरक्षा पातळी बदलण्याचे अधिकार नाहीत.
-'''$1''' या पानाची सुरक्षा पातळी पुढीलप्रमाणे:",
+'protect-text' => '<strong>$1</strong> या पानाची सुरक्षापातळी तुम्ही इथे पाहू शकता अथवा बदलू शकता.',
+'protect-locked-blocked' => 'तुम्ही प्रतिबंधित असताना सुरक्षा पातळी बदलू शकत नाही.येथे <strong>$1</strong> पानाकरिता सध्याची मांडणावळ आहे:',
+'protect-locked-dblock' => 'विदागारास ताळे लागलेले असताना सुरक्षा पातळी बदलता येत नाही.येथे <strong>$1</strong> पानाकरिता सध्याची मांडणावळ आहे:',
+'protect-locked-access' => 'तुम्हाला या पानाची सुरक्षा पातळी बदलण्याचे अधिकार नाहीत.
+<strong>$1</strong> या पानाची सुरक्षा पातळी पुढीलप्रमाणे:',
 'protect-cascadeon' => 'हे पान सध्या सुरक्षित आहे कारण ते {{PLURAL:$1|या पानाच्या|या पानांच्या}} सुरक्षा शिडीवर आहे. तुम्ही या पानाची सुरक्षा पातळी बदलू शकता, पण त्याने सुरक्षाशिडी मध्ये बदल होणार नाहीत.',
 'protect-default' => 'सर्व सदस्यांना परवानगी द्या',
 'protect-fallback' => 'फक्त "$1" परवानगी असणाऱ्यांनाच परवानगी द्या',
@@ -2521,7 +2535,7 @@ $UNWATCHURL
 # Undelete
 'undelete' => 'वगळलेली पाने पहा',
 'undeletepage' => 'वगळलेली पाने पहा आणि पुनर्स्थापित करा',
-'undeletepagetitle' => "'''खाली [[:$1]] च्या वगळलेल्या आवृत्त्या समाविष्ट केलेल्या आहेत'''.",
+'undeletepagetitle' => '<strong>खाली [[:$1]] च्या वगळलेल्या आवृत्त्या समाविष्ट केलेल्या आहेत</strong>.',
 'viewdeletedpage' => 'काढून टाकलेले लेख पहा',
 'undeletepagetext' => 'खालील {{PLURAL:$1|पान वगळले आहे तरीसुद्धा विदागारात जतन आहे आणि पुनर्स्थापित करणे शक्य आहे|$1 पाने वगळली आहेत तरी सुद्धा विदागारात जतन आहेत आणि पुनर्स्थापित करणे शक्य आहेत}}. विदागारातील साठवण ठरावीक कालावधीने स्वच्छ करता येते.',
 'undelete-fieldset-title' => 'आवर्तने पुनर्स्थापित करा',
@@ -2545,9 +2559,9 @@ $UNWATCHURL
 'undeletedrevisions-files' => '{{PLURAL:$1|1 आवर्तन|$1 आवर्तने}}आणि {{PLURAL:$2|1 संचिका|$2 संचिका}} पुनर्स्थापित',
 'undeletedfiles' => '{{PLURAL:$1|1 संचिका|$1 संचिका}} पुनर्स्थापित',
 'cannotundelete' => 'उलटवणे फसले:$1',
-'undeletedpage' => "'''$1ला पुनर्स्थापित केले'''
+'undeletedpage' => '<strong>$1ला पुनर्स्थापित केले</strong>
 
-अलिकडिल वगळलेल्या आणि पुनर्स्थापितांच्या नोंदीकरिता [[Special:Log/delete|वगळल्याच्या नोंदी]] पहा .",
+अलिकडिल वगळलेल्या आणि पुनर्स्थापितांच्या नोंदीकरिता [[Special:Log/delete|वगळल्याच्या नोंदी]] पहा .',
 'undelete-header' => 'अलीकडील वगळलेल्या पानांकरिता [[Special:Log/delete|वगळलेल्या नोंदी]] पहा.',
 'undelete-search-title' => 'वगळलेली पाने शोधा',
 'undelete-search-box' => 'वगळलेली पाने शोधा',
@@ -2608,7 +2622,7 @@ $1',
 'whatlinkshere-page' => 'पान:',
 'linkshere' => "खालील लेख '''[[:$1]]''' या पानाशी जोडले आहेत:",
 'nolinkshere' => "'''[[:$1]]''' येथे कोणत्याही पानांचे दुवे नाहीत.",
-'nolinkshere-ns' => "निवडलेल्या नामविश्वातील कोणतीही पाने '''[[:$1]]'''ला दुवा देत नाहीत .",
+'nolinkshere-ns' => 'निवडलेल्या नामविश्वातील कोणतीही पाने <strong>[[:$1]]</strong>ला दुवा देत नाहीत .',
 'isredirect' => 'पुनर्निर्देशित पान',
 'istemplate' => 'मिळवा',
 'isimage' => 'संचिका दुवा',
@@ -2700,7 +2714,7 @@ $1',
 'change-blocklink' => 'रोध बदला',
 'contribslink' => 'योगदान',
 'emaillink' => 'ई-मेल पाठवा.',
-'autoblocker' => 'स्वयंचलित प्रतिबंधन केले गेले कारण तुमचा अंकपत्ता अलीकडे "[[User:$1|$1]]"ने वापरला होता. $1 च्या प्रतिबंधनाकरिता दिलेले कारण: "$2" आहे.',
+'autoblocker' => 'स्वयंचलित प्रतिबंधन केले गेले कारण तुमचा अंकपत्ता अलीकडे "[[User:$1|$1]]"ने वापरला होता. $1च्या प्रतिबंधनाकरिता दिलेले कारण "$2" आहे',
 'blocklogpage' => 'रोध नोंदी',
 'blocklog-showlog' => 'हा सदस्य पूर्वी प्रतिबंधित अथवा लपविल्या गेला होता.
 लपविलेल्या नोंदी  संदर्भाकरिता खाली उपलब्ध आहेत.',
@@ -2786,7 +2800,7 @@ $1',
 
 जर नवीन शीर्षकाचा लेख अस्तित्वात असेल तर स्थानांतरण होणार '''नाही'''.
 पण जर नवीन शीर्षकाचा लेख हा रिकामा असेल अथवा पुनर्निर्देशन असेल (म्हणजेच त्या लेखाला जर संपादन इतिहास नसेल) तर स्थानांतरण होईल. याचा अर्थ असा की जर काही चूक झाली तर तुम्ही पुन्हा जुन्या शीर्षकाकडे स्थानांतरण करू शकता.
-'''सूचना!'''
+<strong>ईशारा!</strong>
 असे केल्याने एखाद्या महत्वाच्या/लोकप्रीय लेखामध्ये अनपेक्षित आणि महत्वाचे बदल होऊ शकतात. तुम्हाला विनंती आहे की तुम्ही पूर्ण काळजी घ्या व होणारे परिणाम समजावून घ्या.
 जर तुम्हाला शंका असेल तर प्रचालक/प्रबंधकांशी संपर्क करा.",
 'movepagetalktext' => "संबंधित चर्चा पृष्ठ याबरोबर स्थानांतरीत होणार नाही '''जर:'''
@@ -2806,7 +2820,7 @@ $1',
 'move-watch' => 'स्रोत पान व लक्ष  पानांवर निगराणी ठेवा',
 'movepagebtn' => 'स्थानांतरण करा',
 'pagemovedsub' => 'स्थानांतरण यशस्वी',
-'movepage-moved' => '\'\'\'"$1" ला "$2" मथळ्याखाली स्थानांतरीत केले\'\'\'',
+'movepage-moved' => '<strong>"$1" ला "$2" मथळ्याखाली स्थानांतरीत केले</strong>',
 'movepage-moved-redirect' => 'एक पुनर्निर्देशन तयार केले आहे.',
 'movepage-moved-noredirect' => 'पुनर्निर्देशन तयार करणे दडपण्यात आले आहे.',
 'articleexists' => 'त्या नावाचे पृष्ठ अगोदरच अस्तित्वात आहे, किंवा तुम्ही निवडलेले नाव योग्य नाही.
@@ -2846,9 +2860,9 @@ $1',
 'imageinvalidfilename' => 'लक्ष्यसंचिका अवैध आहे',
 'fix-double-redirects' => 'मुळ शीर्षक दर्शविणारे फेरे अद्ययावत करा',
 'move-leave-redirect' => 'मागे एक पुनर्निर्देशन ठेवा',
-'protectedpagemovewarning' => "'''सूचना:''' हे पान सुरक्षित आहे. फक्त प्रशासकीय अधिकार असलेले सदस्य याच्यात बदल करू शकतात.",
-'semiprotectedpagemovewarning' => "'''सूचना:''' हे पान सुरक्षित आहे. फक्त नोंदणीकृत सदस्य याच्यात बदल करू शकतात.
-सरà¥\8dवाà¤\82त à¤¤à¤¾à¤\9cà¥\80 à¤¯à¤¾à¤¦à¥\80 à¤\96ालà¥\80 à¤¸à¤\82दरà¥\8dभासाठà¥\80 à¤¦à¤¿à¤²à¥\80 à¤\86हà¥\87:",
+'protectedpagemovewarning' => '<strong>ईशारा:</strong> हे पान सुरक्षित आहे. फक्त प्रशासकीय अधिकार असलेले सदस्य याच्यात बदल करू शकतात.',
+'semiprotectedpagemovewarning' => '<strong>नोंद:</strong> हे पान सुरक्षित आहे. फक्त नोंदणीकृत सदस्य याचे स्थानांतरण करू शकतात.
+सरà¥\8dवाà¤\82त à¤¤à¤¾à¤\9cà¥\80 à¤¨à¥\8bà¤\82द à¤\96ालà¥\80 à¤¸à¤\82दरà¥\8dभासाठà¥\80 à¤¦à¤¿à¤²à¥\80 à¤\86हà¥\87:',
 'move-over-sharedrepo' => '== संचिका अस्तित्वात आहे ==
 सामायिक भांडारात [[:$1]] नाव आधी पासून अस्तित्वात आहे. संचिका या नावावर स्थानांतरीत केल्यास सामायिक संचिकेवर चढेल.',
 'file-exists-sharedrepo' => 'धीरिकेसाठी तुम्ही निवडलेले नाव हे सामूहिक संग्राहलयात आधीपासून वापरात असल्याने कृपया दुसरे नाव निवडा.',
@@ -2862,8 +2876,8 @@ $1',
 तुम्ही नंतरच्या बाबतीत एखादा दुवा सुद्धा वापरू शकता, उदाहरणार्थ "[[{{MediaWiki:Mainpage}}]]" पाना करिता [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] .',
 'exportall' => 'सर्व पान एक्सपोर्ट करा',
 'exportcuronly' => 'संपूर्ण इतिहास नको,केवळ आताचे आवर्तन आंर्तभूत करा',
-'exportnohistory' => "----
-'''सूचना:''' या फॉर्मचा वापर करून पानाचा पूर्ण इतिहास निर्यात करण्याची सुविधा कार्यकुशलतेच्या कारणंनी अनुपल्ब्ढ ठेवली आहे.",
+'exportnohistory' => '----
+<strong>नोंद:</strong> या फॉर्मचा वापर करून पानाचा पूर्ण इतिहास निर्यात करण्याची सुविधा कार्यकुशलतेच्या कारणांनी अनुपलब्ध ठेवली आहे.',
 'exportlistauthors' => 'प्रत्येक पानासाठी योगदात्यांच्या  पूर्ण सूचीचा(यादीचा) समावेश करावा',
 'export-submit' => 'निर्यात करा',
 'export-addcattext' => 'वर्गीकरणातून पाने भरा:',
@@ -2880,7 +2894,7 @@ $1',
 'allmessagesdefault' => 'अविचल संदेश मजकूर',
 'allmessagescurrent' => 'सध्याचा मजकूर',
 'allmessagestext' => 'मीडियाविकी नामविश्वातील सर्व प्रणाली संदेशांची यादी',
-'allmessagesnotsupportedDB' => "हे पान संपादित करता येत नाही कारण'''\$wgUseDatabaseMessages''' मालवला आहे.",
+'allmessagesnotsupportedDB' => 'हे पान संपादित करता येत नाही कारण<strong>$wgUseDatabaseMessages</strong>अक्षम  आहे.',
 'allmessages-filter-legend' => 'गाळक',
 'allmessages-filter' => 'कस्टमायझेशन स्टेटनुसार गाळणी लावा :',
 'allmessages-filter-unmodified' => 'असंपादित',
@@ -2905,6 +2919,7 @@ $1',
 'thumbnail_image-type' => 'चित्रप्रकार समर्थित नाही',
 'thumbnail_gd-library' => '$1 जी.डी. ग्रंथालयाची बांधणी अपूर्ण आहे.',
 'thumbnail_image-missing' => 'संचिका सापडत नाही: $1',
+'thumbnail_image-failure-limit' => 'हे नखुले देण्यासाठी नुकतेच अनेक अयशस्वी प्रयत्न($1 किंवा अधिक) केल्या गेले आहेत.कृपया नंतर पुन्हा प्रयत्न करा.',
 
 # Special:Import
 'import' => 'पाने आयात करा',
@@ -2939,7 +2954,7 @@ $1',
 'importuploaderrortemp' => 'आयात संचिकेचे चढवणे फसले.एक तात्पुरती धारिका मिळत नाही.',
 'import-parse-failure' => 'XML आयात पृथक्करण अयशस्वी',
 'import-noarticle' => 'आयात करण्याकरिता पान नाही!',
-'import-nonewrevisions' => 'सारà¥\80 à¤\86वरà¥\8dतनà¥\87 à¤ªà¥\82रà¥\8dवà¥\80 à¤\86यात à¤\95à¥\87लà¥\80 à¤¹à¥\8bतà¥\80.',
+'import-nonewrevisions' => 'à¤\86वरà¥\8dतनà¥\87 à¤\86यात à¤\95à¥\87लà¥\80 à¤¨à¤¾à¤¹à¥\80त(सरà¥\8dव à¤\8fà¤\95तर à¤ªà¥\82रà¥\8dवà¥\80à¤\9a à¤\89पलबà¥\8dध à¤¹à¥\8bतà¥\80,à¤\95िà¤\82वा à¤\9aà¥\82à¤\95à¥\80मà¥\81ळà¥\87 à¤¨à¤¿à¤¸à¤\9fलà¥\80 à¤¹à¥\8bतà¥\80).',
 'xml-error-string' => '$1 ओळ $2मध्ये , स्तंभ $3 (बाईट $4): $5',
 'import-upload' => 'XML डाटा चढवा',
 'import-token-mismatch' => 'अधिवेशन माहितीची हानी.
@@ -3156,8 +3171,8 @@ $1',
 'nextdiff' => 'पुढील संपादन →',
 
 # Media information
-'mediawarning' => "'''सावधान''': या संचिकेत डंखी संकेत असू शकतो, जो वापरल्याने तुमच्या संचालन प्रणालीस नाजूक परिस्थितीस सामोरे जावे लागू शकते.",
-'imagemaxsize' => 'सà¤\82à¤\9aिà¤\95ा à¤µà¤°à¥\8dणन à¤ªà¤¾à¤¨à¤¾à¤\82वरà¥\80ल à¤\9aितà¥\8dराà¤\82ना à¤®à¤°à¥\8dयादा à¤\98ाला:',
+'mediawarning' => '<strong>सावधान</strong>: या संचिकेत डंखी संकेत असू शकतो, जो वापरल्याने तुमच्या संचालन प्रणालीस नाजूक परिस्थितीस सामोरे जावे लागू शकते.',
+'imagemaxsize' => 'सà¤\82à¤\9aिà¤\95ा à¤\86à¤\95ार à¤®à¤°à¥\8dयादा:<br /><em>(सà¤\82à¤\9aिà¤\95ा à¤µà¤°à¥\8dणन à¤ªà¤¾à¤¨à¤¾à¤\82साठà¥\80)</em>',
 'thumbsize' => 'इवलासा आकार:',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|पान|पाने}}',
 'file-info' => 'संचिकेचा आकार:$1,विविधामापमाईमप्रकार: $2',
@@ -3181,7 +3196,7 @@ $1',
 
 # Special:NewFiles
 'newimages' => 'नवीन संचिकांची यादी',
-'imagelisttext' => "खाली '''$1''' संचिका {{PLURAL:$1|दिली आहे.|$2 क्रमाने दिल्या आहेत.}}",
+'imagelisttext' => 'खाली <strong>$1</strong> संचिका {{PLURAL:$1|दिली आहे.|$2 क्रमाने दिल्या आहेत.}}',
 'newimages-summary' => 'हे विशेष पान शेवटी चढविलेल्या संचिका दर्शविते.',
 'newimages-legend' => 'गाळक',
 'newimages-label' => 'संचिकानाम (किंवा त्याचा भाग):',
@@ -3701,10 +3716,10 @@ $5
 'scarytranscludetoolong' => '[आंतरजालपत्ता खूप लांब आहे]',
 
 # Delete conflict
-'deletedwhileediting' => '”’सूचना:”’ तुम्ही संपादन सुरू केल्यानंतर हे पान वगळले गेले आहे.',
-'confirmrecreate' => "तुम्ही संपादन सुरू केल्यानंतर सदस्य [[User:$1|$1]] ([[User talk:$1|चर्चा]])ने हे पान पुढील कारणाने वगळले:
-: ''$2''
-कृपया हे पान खरेच पुन्हा निर्मित करून हवे आहे का हे निश्चित करा.",
+'deletedwhileediting' => '<strong>सूचना:</strong> तुम्ही संपादन सुरू केल्यानंतर हे पान वगळले गेले आहे.',
+'confirmrecreate' => 'तुम्ही संपादन सुरू केल्यानंतर सदस्य [[User:$1|$1]] ([[User talk:$1|चर्चा]])ने हे पान पुढील कारणाने वगळले:
+: <em>$2</em>
+कृपया हे पान खरेच पुन्हा निर्मित करून हवे आहे का हे निश्चित करा.',
 'confirmrecreate-noreason' => 'तुम्ही संपादन सुरू केल्यानंतर सदस्य [[User:$1|$1]] ([[User talk:$1|चर्चा]])ने हे पान  वगळले. तुम्हाला हे पान खरेच पुन्हा निर्मित करून हवे आहे का हे निश्चित करा.',
 'recreate' => 'पुनर्निर्माण',
 
index 126da5c..93fb0f4 100644 (file)
@@ -200,7 +200,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Garis bawah pautan:',
-'tog-justify' => 'Laraskan perenggan',
 'tog-hideminor' => 'Sembunyikan suntingan kecil dalam laman perubahan terkini',
 'tog-hidepatrolled' => 'Sorokkan suntingan yang telah dironda daripada senarai perubahan terkini',
 'tog-newpageshidepatrolled' => 'Sorokkan laman yang telah dironda daripada senarai laman baru',
@@ -1014,7 +1013,7 @@ Log penghapusan bagi laman ini dilampirkan di bawah untuk rujukan.',
 'invalid-content-data' => 'Data kandungan tidak sah',
 'content-not-allowed-here' => 'Kandungan "$1" tidak dibenarkan di halaman [[$2]]',
 'editwarning-warning' => 'Meninggalkan laman ini mungkin akan menyebabkan sebarang perubahan yang telah anda lakukan hilang.
-Jika anda sudah log masuk, anda boleh melumpuhkan amaran ini di bahagian "Menyunting" dalam keutamaan anda.',
+Jika anda sudah log masuk, anda boleh melumpuhkan amaran ini di bahagian "{{int:prefs-editing}}" dalam keutamaan anda.',
 'editpage-notsupportedcontentformat-title' => 'Format kandungan tidak disokong',
 'editpage-notsupportedcontentformat-text' => 'Format kandungan $1 tidak disokong oleh model kandungan $2.',
 
@@ -1050,6 +1049,7 @@ Argumen-argumen ini telah ditinggalkan.',
 'undo-success' => 'Suntingan ini boleh dibatalkan. Sila semak perbandingan di bawah untuk mengesahkan bahawa anda betul-betul mahu melakukan tindakan ini, kemudian simpan perubahan tersebut.',
 'undo-failure' => 'Suntingan tersebut tidak boleh dibatalkan kerana terdapat suntingan pertengahan yang bercanggah.',
 'undo-norev' => 'Suntingan tersebut tidak boleh dibatalkan kerana tidak wujud atau telah dihapuskan.',
+'undo-nochange' => 'Suntingan itu nampaknya sudah dibatalkan.',
 'undo-summary' => 'Membatalkan semakan $1 oleh [[Special:Contributions/$2|$2]] ([[User talk:$2|Perbincangan]])',
 'undo-summary-username-hidden' => 'Buat asal semakan $1 oleh pengguna tersembunyi',
 
@@ -1232,7 +1232,8 @@ Sila pastikan bahawa perubahan ini akan mengekalkan kesinambungan sejarah laman.
 'showhideselectedversions' => 'Tunjukkan/sorokkan versi yang dipilih',
 'editundo' => 'batal',
 'diff-empty' => '(Tiada perbezaan)',
-'diff-multi' => '($1 {{PLURAL:$1|semakan pertengahan|semakan pertengahan}} oleh $2 {{PLURAL:$2|pengguna|pengguna}} tidak dipaparkan)',
+'diff-multi-sameuser' => '({{PLURAL:$1|Satu semakan pertengahan|$1 semakan pertengahan}} oleh pengguna yang sama tidak dipaparkan)',
+'diff-multi-otherusers' => '({{PLURAL:$1|Satu semakan pertengahan|$1 semakan pertengahan}} oleh {{PLURAL:$2|seorang pengguna lain|$2 orang pengguna}} tidak dipaparkan)',
 'diff-multi-manyusers' => '($1 {{PLURAL:$1|semakan pertengahan|semakan pertengahan}} oleh lebih daripada $2 {{PLURAL:$2|pengguna|pengguna}} tidak dipaparkan)',
 'difference-missing-revision' => '{{PLURAL:$2|Satu semakan|$2 semakan}} bagi perbezaan ini ($1) tidak ditemui.
 
@@ -1253,7 +1254,8 @@ Butirannya boleh didapati di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGEN
 'shown-title' => 'Papar $1 hasil setiap laman',
 'viewprevnext' => 'Lihat ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "* Laman '''[[$1]]'''",
-'searchmenu-new' => "'''Cipta laman \"[[:\$1]]\" di wiki ini!'''",
+'searchmenu-new' => '<strong>Cipta laman "[[:$1]]" di wiki ini!</strong>
+{{PLURAL:$2|0=|Lihat juga halaman yang ditemui dalam pencarian anda.|Lihat juga hasil pencarian yang ditemui.}}',
 'searchprofile-articles' => 'Laman kandungan',
 'searchprofile-project' => 'Laman bantuan dan projek',
 'searchprofile-images' => 'Multimedia',
@@ -1279,6 +1281,7 @@ Butirannya boleh didapati di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGEN
 'searchrelated' => 'berkaitan',
 'searchall' => 'semua',
 'showingresults' => "Yang berikut ialah '''$1''' hasil bermula daripada yang {{PLURAL:$2|pertama|ke-'''$2'''}}.",
+'showingresultsinrange' => 'Yang berikut adalah {{PLURAL:$1|<strong>satu</strong> hasil|sebanyak <strong>$1</strong> hasil}} dalam julat #<strong>$2</strong> hingga #<strong>$3</strong>.',
 'showingresultsnum' => "Yang berikut ialah '''$3''' hasil bermula daripada yang {{PLURAL:$2|pertama|ke-'''$2'''}}.",
 'showingresultsheader' => "{{PLURAL:$5|Keputusan '''$1''' daripada '''$3'''|Keputusan '''$1 - $2''' daripada '''$3'''}} untuk '''$4'''",
 'search-nonefound' => 'Tiada hasil yang sepadan dengan pertanyaan.',
@@ -2279,6 +2282,7 @@ Perubahan-perubahan pada halaman ini dan halaman perbualannya pada masa akan dat
 'watchmethod-list' => 'menyemak suntingan terkini pada laman-laman yang dipantau',
 'watchlistcontains' => 'Terdapat $1 laman dalam senarai pantau anda.',
 'iteminvalidname' => "Terdapat masalah dengan item '$1', nama tidak sah...",
+'wlnote2' => 'Yang berikut adalah perubahan dalam {{PLURAL:$1|sejam|<strong>$1</strong> jam}} yang lepas, setakat $2, $3.',
 'wlshowlast' => 'Tunjukkan $1 jam / $2 hari yang lalu / $3.',
 'watchlist-options' => 'Pilihan senarai pantau',
 
@@ -2643,7 +2647,7 @@ dirosakkan).',
 'change-blocklink' => 'ubah sekatan',
 'contribslink' => 'sumb.',
 'emaillink' => 'hantar e-mel',
-'autoblocker' => 'Disekat secara automatik kerana baru-baru ini alamat IP anda digunakan oleh "[[User:$1|$1]]". Sebab sekatan $1 ialah: "$2"',
+'autoblocker' => 'Disekat secara automatik kerana alamat IP anda baru digunakan oleh "[[User:$1|$1]]". Sebab yang diberi adalah: "$2"',
 'blocklogpage' => 'Log sekatan',
 'blocklog-showlog' => 'Pengguna ini pernah disekat sebelum ini. Log sekatan disediakan di bawah sebagai rujukan:',
 'blocklog-showsuppresslog' => 'Pengguna ini pernah disekat dan tersembunyi sebelum ini.
@@ -2838,6 +2842,7 @@ Sila lawat [https://www.mediawiki.org/wiki/Localisation Penyetempatan MediaWiki]
 'allmessages-prefix' => 'Tapis berdasarkan awalan:',
 'allmessages-language' => 'Bahasa:',
 'allmessages-filter-submit' => 'Pergi',
+'allmessages-filter-translate' => 'Terjemah',
 
 # Thumbnails
 'thumbnail-more' => 'Besarkan',
@@ -2888,7 +2893,7 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
 'importuploaderrortemp' => 'Fail import tidak dapat dimuat naik kerana tiada direktori sementara.',
 'import-parse-failure' => 'Gagal menghurai fail XML yang diimport',
 'import-noarticle' => 'Tiada laman untuk diimport!',
-'import-nonewrevisions' => 'Semua semakan telah pun diimport sebelum ini.',
+'import-nonewrevisions' => 'Tiada semakan yang diimport (semuanya sama ada sudah sedia ada atau dilangkau disebabkan ralat).',
 'xml-error-string' => '$1 pada baris $2, lajur $3 (bait $4): $5',
 'import-upload' => 'Muat naik data XML',
 'import-token-mismatch' => 'Data sesi telah hilang. Sila cuba lagi.',
@@ -2899,6 +2904,7 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
 'import-error-special' => 'Laman "$1" tidak diimport kerana ia tergolong dalam ruang nama khas yang tidak membenarkan laman.',
 'import-error-invalid' => 'Laman "$1" tidak diimport kerana namanya tidak sah.',
 'import-error-unserialize' => 'Semakan $2 dari halaman "$1" tidak dapat dinyahsirikan. Semakan ini dilaporkan telah menggunakan model kandungan $3 yang disirikan sebagai $4.',
+'import-error-bad-location' => 'Semakan $2 yang menggunakan model kandungan $3 tidak boleh disimpan pada "$1" di wiki ini kerana model itu tidak disokong pada halaman tersebut.',
 'import-options-wrong' => '{{PLURAL:$2|Pilihan|Pilihan-pilihan}} salah: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Halaman akar yang dinyatakan adalah tidak sah.',
 'import-rootpage-nosubpage' => 'Ruang nama "$1" halaman akar tidak membenarkan subhalaman.',
index d0d0ca9..a312ca6 100644 (file)
@@ -275,7 +275,6 @@ $linkPrefixCharset = 'A-\\x{10ffff}';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Ħoloq sottolinjati:',
-'tog-justify' => 'Iġġustifika l-paragrafi',
 'tog-hideminor' => 'Aħbi l-modifiki minuri fit-tibdil riċenti',
 'tog-hidepatrolled' => 'Aħbi l-modifiki verifikati fit-tibdil riċenti',
 'tog-newpageshidepatrolled' => 'Aħbi l-paġni verifikati mil-lista tal-paġni l-ġodda',
@@ -1231,7 +1230,6 @@ Nota li l-użu tal-links tan-navigazzjoni jagħmel reset tal-kolonna.",
 'compareselectedversions' => 'Qabbel il-verżjonijiet magħżula',
 'showhideselectedversions' => 'Uri/aħbi reviżjonijiet magħżula',
 'editundo' => 'ħassar',
-'diff-multi' => '(Mhux qed {{PLURAL:$1|tintwera reviżjoni intermedja|jintwerew $1 reviżjonijit intermedji}} minn {{PLURAL:$2|utent|$2 utenti}})',
 'diff-multi-manyusers' => '(Mhux qed {{PLURAL:$1|tintwera reviżjoni intermedja|jintwerew $1 reviżjonijit intermedji}} mingħand iktar minn $2 {{PLURAL:$2|utent|$2 utenti}})',
 
 # Search results
@@ -1553,12 +1551,14 @@ Innota però li l-werreja tal-kontenut ta' {{SITENAME}} f'dawn is-siti, jistgħu
 'recentchanges' => 'Tibdil riċenti',
 'recentchanges-legend' => 'Opzjonijiet tat-tibdil riċenti',
 'recentchanges-summary' => 'Din il-paġna turi l-modifiki l-aktar riċenti għal kontenut tas-sit.',
+'recentchanges-noresult' => 'L-ebda bidla ma saret matul il-perjodu mogħti li tissodisfa dawn il-kriterji.',
 'recentchanges-feed-description' => "Dan il-feed jirraporta l-modifiki l-aktar riċenti fil-kontenut ta' dan is-sit.",
 'recentchanges-label-newpage' => 'Din il-modifika ħolqot paġna ġdida',
 'recentchanges-label-minor' => 'Din hi modifika minuri',
 'recentchanges-label-bot' => 'Din il-modifika ġiet effettwata minn bot',
 'recentchanges-label-unpatrolled' => 'Din il-modifika għadha ma ġietx verifikata',
-'recentchanges-legend-newpage' => '$1 - paġna ġdida',
+'recentchanges-label-plusminus' => "Id-daqs tal-paġna nbidel b'dan in-numru ta' bytes",
+'recentchanges-legend-newpage' => '(ara wkoll il-[[Special:NewPages|lista tal-paġni l-ġodda]])',
 'rcnotefrom' => "Ħawn taħt jinsabu l-modifiki minn '''$2''' (sa '''$1''').",
 'rclistfrom' => 'Uri l-modifiki ġodda jibdew minn $1',
 'rcshowhideminor' => '$1 modifiki żgħar',
@@ -2186,7 +2186,6 @@ Kwalunkwe modifika li ssir fil-futur, kemm fuq din il-paġna u fil-paġna ta\' d
 'watchmethod-list' => 'Kontroll tal-osservati speċjali għal modifiki riċenti',
 'watchlistcontains' => "Il-lista ta' osservazzjoni fiha {{PLURAL:$1|paġna|$1 paġni}}.",
 'iteminvalidname' => "Problema bil-paġna'$1', l-isem mhux validu...",
-'wlnote' => "Hawn taħt hawn {{PLURAL:$1|l-aħħar modifika|l-aħħar '''$1''' modifiki}} fl-aħħar {{PLURAL:$2|siegħa|'''$2''' siegħat}}, sal-$3, fil-$4.",
 'wlshowlast' => 'Uri l-aħħar $1 siegħat $2 ġranet $3',
 'watchlist-options' => "Opzjonijiet tal-lista ta' osservazzjoni",
 
@@ -2794,7 +2793,6 @@ Kull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special
 'tooltip-pt-watchlist' => "Il-lista ta' paġni li qiegħed tosserva",
 'tooltip-pt-mycontris' => 'Lista tal-kontribuzzjonijiet tiegħek',
 'tooltip-pt-login' => 'Tirreġistra ruħek huwa avviżat però mhux obbligatorju.',
-'tooltip-pt-anonlogin' => 'Tirreġistra ruħek huwa avviżat, anki jekk mhux obbligatorju.',
 'tooltip-pt-logout' => "Oħroġ (illogja 'l barra)",
 'tooltip-ca-talk' => 'Diskussjoni dwar il-kontenut tal-paġna',
 'tooltip-ca-edit' => "Tista' timmodifika din il-paġna. Jekk jogħġbok uża l-buttuna tad-dehra proviżorja qabel ma ssalva l-modifiki.",
@@ -3748,10 +3746,12 @@ Flimkien ma' dan il-programm suppost kellek tirċievi [{{SERVER}}{{SCRIPTPATH}}/
 'rightsnone' => '(xejn)',
 
 # Feedback
+'feedback-bugornote' => 'Jekk int lest biex tiddeskrivi problema teknika fid-dettall, jekk jogħbok [$1 irraporta l-bug].
+Inkella, tista\' tuża l-formola sempliċi t\'hawn taħt. Il-kumment tiegħek se jiżdied mal-paġna "[$3 $2]", flimkien ma\' isem l-utent tiegħek.',
 'feedback-subject' => 'Suġġett:',
 'feedback-message' => 'Messaġġ:',
 'feedback-cancel' => 'Annulla',
-'feedback-submit' => 'Ibgħat r-rispons',
+'feedback-submit' => 'Ibgħat il-messaġġ',
 'feedback-error1' => 'Żball: Riżultat mhux rikonoxxut mill-API',
 'feedback-error2' => 'Żball: Modifika mhux esegwita',
 'feedback-error3' => 'Żball: L-ebda risposta mill-API',
index e5afd9c..3e3c459 100644 (file)
@@ -62,7 +62,6 @@ $dateFormats = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'လင့်ကို မျဉ်းသားသည့် ပုံစံ -',
-'tog-justify' => 'အတိုအရှည်ညှိထားသော စာပိုဒ်များ',
 'tog-hideminor' => 'လတ်တလော အပြောင်းအလဲများတွင် အရေးမကြီးသည်များကို ဝှက်ရန်',
 'tog-hidepatrolled' => 'လတ်တလော အပြောင်းအလဲများတွင် အရေးမကြီးသည်များကို ဝှက်ရန်',
 'tog-newpageshidepatrolled' => 'လက်တလော အပြောင်းလဲများတွင် စာမျက်နှာသစ်များကို ဝှက်ရန်',
@@ -71,9 +70,7 @@ $messages = array(
 'tog-numberheadings' => 'ခေါင်းစဉ်များ အား စေ့ဆော်ချက်အတိုင်း လုပ်ဆောင်ရန်',
 'tog-showtoolbar' => 'ပြုပြင်ရန် ကိရိယာများ (JavaScript လိုအပ်သည်)',
 'tog-editondblclick' => 'ကလစ်နှစ်ခါနှိပ်လျှင် စာမျက်နှာအားပြုပြင်ပါ (JavaScript လိုအပ်သည်)',
-'tog-editsection' => '[edit] လင့်များဖြင့် အပိုင်းလိုက်တည်းဖြတ်ခြင်းကို အသုံးပြုရန်',
 'tog-editsectiononrightclick' => 'အပိုင်းလိုက်ခေါင်းစဉ်များကို ညာကလစ်နှိပ်ခြင်းဖြင့် အပိုင်းလိုက် တည်းဖြတ်ခြင်းကို အသုံးပြုရန်',
-'tog-showtoc' => 'မာတိကာပြရန် (ခေါင်းစဉ် ၃ ခုအထက်ရှိသော စာမျက်နှာများအတွက်)',
 'tog-rememberpassword' => 'ဤကွန်ပျူတာတွင် ကျွန်ုပ်ကိုမှတ်ထားရန် (အများဆုံး $1 {{PLURAL:$1|ရက်|ရက်}}ကြာ)',
 'tog-watchcreations' => 'ကျွန်ုပ်စတင်ရေးသားခဲ့သည့်စာမျက်နှာများနှင့် အပ်လုပ်တင်ခဲ့သည့် ဖိုင်များကို စောင့်​ကြည့်​စာ​ရင်း​ထဲ ပေါင်းထည့်ရန်',
 'tog-watchdefault' => 'ကျွန်ုပ် တည်းဖြတ်ခဲ့သည့် စာမျက်နှာများနှင့် ဖိုင်များကို စောင့်ကြည့်စာရင်းသို့  ပေါင်းထည့်ပါ။',
@@ -659,7 +656,6 @@ Legend: '''({{int:cur}})''' = နောက်ဆုံးမူနှင့် 
 'compareselectedversions' => 'ရွေးချယ်ထားသော မူများကို နှိုင်းယှဉ်ရန်',
 'showhideselectedversions' => 'ရွေးချယ်ထားသော မူများကို ပြရန်/ဝှက်ရန်',
 'editundo' => 'နောက်ပြန် ပြန်ပြင်ရန်',
-'diff-multi' => '({{PLURAL:$2|အသုံးပြုသူတစ်ဦး|အသုံးပြုသူ $2 ဦး}}၏{{PLURAL:$1|အလယ်အလတ်တည်းဖြတ်မူတစ်ခု|အလယ်အလတ်တည်းဖြတ်မူ $1 ခု}}ကို မပြပါ)',
 
 # Search results
 'searchresults' => 'ရှာဖွေမှု ရလဒ်များ',
@@ -1562,7 +1558,6 @@ Your e-mail address is not revealed when other users contact you.
 'tooltip-pt-watchlist' => 'အပြောင်းအလဲများအတွက် စောင့်ကြည့်နေသော စာမျက်နှာများ၏ စာရင်း',
 'tooltip-pt-mycontris' => 'သင့်ပံ့ပိုးမှုများ၏ စာရင်း',
 'tooltip-pt-login' => 'မှတ်ပုံတင်ဖြင့် log in ဝင်ရန် အားပေးပါသည်။ သို့သော် မှတ်ပုံမတင်မနေရ မဟုတ်ပါ။',
-'tooltip-pt-anonlogin' => 'မှတ်ပုံတင်ဖြင့် log in ဝင်ရန် အားပေးပါသည်။ သို့သော် မှတ်ပုံမတင်မနေရ မဟုတ်ပါ။',
 'tooltip-pt-logout' => 'ထွက်​ပါ​',
 'tooltip-ca-talk' => 'မာတိကာ စာမျက်နှာအတွက် ဆွေးနွေးချက်များ',
 'tooltip-ca-edit' => 'ဤစာမျက်နှာကို တည်းဖြတ်နိုင်သည်။ ကျေးဇူးပြု၍ မသိမ်းခင် နမူနာ ခလုတ်ကိုနှိပ်ပြီး ကြည့်ပေးပါ။',
index 95d8581..2327fe7 100644 (file)
@@ -188,7 +188,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Сюлмавома петнень алга черькстамс:',
-'tog-justify' => 'Вейкетстявтомс сёрмадовкс ушодоманть лопанть кувалмга',
 'tog-hideminor' => 'Од полавтоматнесэ кекшемс вишинькине витевкстнэнь',
 'tog-hidepatrolled' => 'Кекшемс лувонь кирдиень витнеметнень-петнематнень чыяконь полавтнематнестэ',
 'tog-newpageshidepatrolled' => 'Кекшемс лувонь кирдиень ванстома лопатнень од лопань керьксэнть эйстэ',
@@ -197,9 +196,7 @@ $messages = array(
 'tog-numberheadings' => 'Сёрмадовксконяксос кадык сынсь ловома валтнэ путовить',
 'tog-showtoolbar' => 'Невтемс кедьёнкслазнэнть сёрмадома шкасто',
 'tog-editondblclick' => 'Кавксть лепштязь совамс сёрмадовксонь витнеме-петнеме',
-'tog-editsection' => 'Невтемс сюлмавома пенть «витемс» эрьва секциянтень-пельксэнтень',
 'tog-editsectiononrightclick' => 'Витнемс секциятнень-пелькстнэнь, лепштямс сёрмадовксонть лемензэ лангс чеерень витьёнсе повнесэ',
-'tog-showtoc' => 'Невтемс сёрмадовкспотмокс (лопатненень, конатнесэ 3-до ламо сёрмадовкст)',
 'tog-rememberpassword' => 'Ледстемс совамо валом те бравзерсэнть (сех кувать $1 {{PLURAL:$1|1=чи|чить}})',
 'tog-watchcreations' => 'Совавтомс ванома лемрисьмезэнь монь теевть лопатнень ды сень, мезе йовкстан',
 'tog-watchdefault' => 'Совавтомс монь витевть лопатнень ванома лемрисьмезэнь',
@@ -861,7 +858,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'lineno' => 'Киксэсь $1:',
 'compareselectedversions' => 'Кочказь версиятнень аравтомс карадо-каршо',
 'editundo' => 'Велявтомс мекев мезе витнинь-петнинь',
-'diff-multi' => '↓({{PLURAL:$2|Вейке совицясь тейсь {{PLURAL:$1|1=юткине версия, конась|$1 юткине версият, конатне}}|$2 совицят тейсть {{PLURAL:$1|1= юткине версия, конась|$1 юткине версият, конатне}}}} апак невте.)',
 
 # Search results
 'searchresults' => 'Мезе муевсь',
index 93bcbf6..83fafcb 100644 (file)
@@ -128,7 +128,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'پیوندون زیر خط دکشی بواشه',
-'tog-justify' => 'بندون تموم چین هاکرد‌ن',
 'tog-hideminor' => 'نشون‌ندائن کچیک تغییرات تازه دگاردسته‌ئون دله',
 'tog-hidepatrolled' => 'جا بدائن دچی‌یه‌ئون پس بخارد تازه دگاردسته‌ئون ِدله',
 'tog-newpageshidepatrolled' => 'قایم هکردن گشت بخرد ولگون نو ولگون فهرست جا',
@@ -137,9 +136,7 @@ $messages = array(
 'tog-numberheadings' => 'شماره بشتن خدکار عناوین',
 'tog-showtoolbar' => 'دچی‌ین جعبه نوار ابزار ره سِراق هدائن',
 'tog-editondblclick' => 'دچی ین ولگون با دتا کلیک (نیازمند جاوااسکریپت)',
-'tog-editsection' => 'به کار دمبدائن تیکه‌ئون دچی‌ین از طریق پیوندون [دچی‌ین]',
 'tog-editsectiononrightclick' => 'به کار دمبدائن دچی‌ین قسمت‌ئون با راست کیلیک<br />عناوین قسمت‌ئون ِرو (جاوااسکریپت)',
-'tog-showtoc' => 'نیمایش محتوا<br />(برای مقاله‌ئون با بیشته از ۳ سرفصل)',
 'tog-rememberpassword' => 'مه رمز ره (تا حداکثر $1 {{PLURAL:$1|روز|روز}}) این مرورگر دله یاد دار',
 'tog-watchcreations' => 'ایضافه بین صفحه‌ئونی که من دِرِس هاکردمه به پیگیری‌ئون ِرج.',
 'tog-watchdefault' => 'اضافه هاکردن صفحه‌هایی که چیمبه به منه پیگری ِرج',
@@ -819,7 +816,6 @@ $2، $1',
 'watchlist-details' => 'بدون حیساب گپ ولگ‌ئون، {{PLURAL:$1|$1 صفحه|$1 صفحه}} شمه دمبال‌هاکردنی‌ئون میون قرار {{PLURAL:$1|دارنه|دانه}}.',
 'wlheader-enotif' => '*تونی ایمیل جه مطلع بواشین.',
 'wlheader-showupdated' => "*صفحه‌ئونی که بعد از آخرین سربزوئنتون عوض بینه '''پر رنگ''' نشون هدائه بیّه.",
-'wlnote' => "ایجه {{PLURAL:$1|پایانی دأچیه‌ن|پایانی '''$1''' دأچیه‌ن‌ئونی}} هأسه که ای $2 ساعت ده‌له دأکه‌ته.",
 'watchlist-options' => 'دمبال هاکردن گوزینه‌ها',
 
 # Displayed when you click the "watch" button and it is in the process of watching
index 7ac970f..623f20c 100644 (file)
@@ -80,7 +80,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Mokìnxòîkuilòtzàswis tzòwilistìn:',
-'tog-justify' => 'Mokintêtènyèktlàlis in tlâkuilispaltìn',
 'tog-hideminor' => 'Motlàtìs tepỉtzìn tlayèktlàlilistli ìpan welok tlapảtlalistli',
 'tog-hidepatrolled' => 'Motlàtìs tlapîpialli tlayèktlàlilistli ìpan welok tlapảtlalistli',
 'tog-newpageshidepatrolled' => 'Mokintlàtis tlapîpialtlaìxtlapaltìn ìwikpa ìtlapòpòwaltekpànal in yâyankuik tlaìxtlapaltìn',
@@ -88,7 +87,6 @@ $messages = array(
 'tog-usenewrc' => 'Molōloāzqueh in tlapatlaliztli in yancuīc tlapatlaliztli āmapan īhuān in tlachiyaliztli tlapōhualāmapan (monequi JavaScript)',
 'tog-showtoolbar' => 'Motlaīxtlatīz in tlachihchīhualōni pāntli',
 'tog-editondblclick' => 'Tiquimpatlāz in zāzanilli intlā ōme tiquimpachoa',
-'tog-showtoc' => 'Tiquittāz in tlein cah zāzotlahcuilōlco',
 'tog-rememberpassword' => 'Ticpiyāz moMotlatequitiltilīltōca īhuān motlahtōlichtacāyo inīn chīuhpōhualhuazco (īxquich {{PLURAL:$1|tōnalli}})',
 'tog-watchcreations' => 'Moaquiāz in āmatl mā niquinyōcoya īhuān in tlahcuilōlli mā niquinquetza īpan notlachiyaliz',
 'tog-watchdefault' => 'Moaquiāz āmatl īhuān tlahcuilōlli mā niquinpatla in notlachiyaliz',
@@ -579,7 +577,6 @@ Hueliz ōmopolo huiqui nozo ōmozacac.
 'history-title' => '«$1» tlahcuilōlloh ītlaihittaliz',
 'lineno' => 'Pāntli $1:',
 'editundo' => 'Tichuelōz',
-'diff-multi' => '({{PLURAL:$1|Cē tlapatlaliztli nepantlah ahmo motta in ōquichīuh|$1 Tlapatlaliztli nepantlah ahmo mottah in ōquinchīuh}}  {{PLURAL:$2|cē tlatequitiltilīlli|$2 tlatequitiltilīltin}})',
 
 # Search results
 'searchresults' => 'Tlatēmoliztli',
@@ -1226,7 +1223,6 @@ Hueliz cah inīn huēyi tlapatlaliztli. Timitztlātlauhtia ticmatīz cuallōtl a
 'tooltip-pt-watchlist' => 'Zāzaniltin tiquintlachiya ic tlapatlaliztli',
 'tooltip-pt-mycontris' => 'Notlahcuilōl',
 'tooltip-pt-login' => 'Tihuelīti timocalaqui, tēl ahmo tihuīquilia.',
-'tooltip-pt-anonlogin' => 'Tihuelīti timocalaqui, tēl ahmo tihuīquilia.',
 'tooltip-pt-logout' => 'Tiquīzāz',
 'tooltip-ca-talk' => 'Inīn tlahcuilōlli ītēixnāmiquiliz',
 'tooltip-ca-edit' => 'Tihuelīti ticpatla inīn zāzanilli. Timitztlātlauhtiah, tiquiclica achtochīhualizpan achtopa ticpiya.',
index 081ec4d..80c990f 100644 (file)
@@ -28,7 +28,6 @@ $dateFormats = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Liân-kiat oē té-sûn:',
-'tog-justify' => 'pâi-chê  tōaⁿ-lo̍h',
 'tog-hideminor' => 'Am chòe-kīn ê sió kái-piàn',
 'tog-hidepatrolled' => 'Am chòe-kīn sûn koè--ê  kái-piàn',
 'tog-newpageshidepatrolled' => 'Sin-ia̍h ê chheng-toaⁿ am sûn koè--ê',
@@ -37,9 +36,7 @@ $messages = array(
 'tog-numberheadings' => 'Phiau-tê chū-tōng pian-hō',
 'tog-showtoolbar' => 'Hián-sī pian-chi̍p ke-si-tiâu (su-iàu JavaScript)',
 'tog-editondblclick' => 'Siang-ji̍h ia̍h-bīn to̍h ē-tàng pian-chi̍p (su-iàu JavaScript)',
-'tog-editsection' => 'Ji̍h [siu-kái] chit-ê liân-kiat to̍h ē-tàng pian-chi̍p toāⁿ-lo̍h',
 'tog-editsectiononrightclick' => 'Chiàⁿ-ji̍h (right click) toāⁿ-lo̍h (section) phiau-tê to̍h ē-tàng pian-chi̍p toāⁿ-lo̍h (su-iàu JavaScript)',
-'tog-showtoc' => 'Hián-sī bo̍k-chhù (3-ê phiau-tê í-siōng ê ia̍h)',
 'tog-rememberpassword' => 'Kì tiâu bi̍t-bé, āu-chōa iōng (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'tog-watchcreations' => 'Kā goá khui ê ia̍h ka-ji̍p kàm-sī-toaⁿ lāi-té',
 'tog-watchdefault' => 'Kā goá pian-chi̍p kòe ê ia̍h ka-ji̍p kàm-sī-toaⁿ lāi-té',
@@ -851,7 +848,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watchmethod-recent' => 'tng teh kíam-cha choè-kīn ê siu-kái, khoàⁿ ū kàm-sī ê ia̍h bô',
 'watchmethod-list' => 'tng teh kiám-cha kàm-sī ê ia̍h khoàⁿ chòe-kīn ū siu-kái bô',
 'watchlistcontains' => 'Lí ê kàm-sī-toaⁿ siu $1 ia̍h.',
-'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',
 
 # Delete
@@ -1000,7 +996,6 @@ Liâu--lo̍h-khì chìn-chêng, chhiáⁿ seng khak-tēng lí ū liáu-kái chia
 'tooltip-pt-preferences' => 'Lí ê siat-tēng',
 'tooltip-pt-mycontris' => 'Lí ê kòng-hiàn lia̍t-toaⁿ',
 'tooltip-pt-login' => 'Hi-bāng lí teng-ji̍p; m̄-ko bô kiông-chè',
-'tooltip-pt-anonlogin' => 'Hi-bāng lí teng-ji̍p; m̄-ko bô kiông-chè',
 'tooltip-pt-logout' => 'Teng-chhut',
 'tooltip-ca-talk' => 'Loē-iông ê thó-lūn',
 'tooltip-ca-edit' => 'Lí ē-sái kái chit ia̍h. Beh chhûn chìn-chiân, chhiáⁿ chhi̍h  sing-khoàⁿ-māi ê liú-á',
index ae3abe8..3f5268e 100644 (file)
@@ -57,7 +57,6 @@ $namespaceAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => "Sottolinia 'e jonte:",
-'tog-justify' => "Alliniamento d''e paracrafe mpare",
 'tog-hideminor' => "Annascunne 'e cagne piccirille  'int'a ll'úrdeme cagne",
 'tog-hidepatrolled' => "Annascunne 'e cagne 'verificate' 'int'a ll'úrdeme cagne",
 'tog-extendwatchlist' => "Spanne ll'asservate speciale pe fà vedé tutte 'e cagnàmiente, nun solo l'ultimo",
@@ -65,9 +64,7 @@ $messages = array(
 'tog-numberheadings' => "Annúmmera automatecamente 'e títule",
 'tog-showtoolbar' => "Aspone 'a barra d''e stromiente 'e cagno",
 'tog-editondblclick' => "Cagna 'e pàggene cliccanno ddoje vote",
-'tog-editsection' => "Permette 'e cagnà 'e sezzione cu a jonta [cagna]",
 'tog-editsectiononrightclick' => "Permette 'e cangne 'e sezzione cliccanno p''o tasto destro ncopp 'e titule 'e sezzione",
-'tog-showtoc' => "Mosta ll'innece pe 'e paggene cu cchiù 'e 3 sezzione",
 'tog-rememberpassword' => "Ricurda 'a registrazzione pe' cchiu sessione (ppe 'numassimo 'e $1 {{PLURAL:$1|juorno|juorne}})",
 
 'underline-always' => 'Sèmpe',
index 1ceb4b7..52c50ac 100644 (file)
@@ -320,7 +320,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Strek under lenker:',
-'tog-justify' => 'Blokkjusterte avsnitt',
 'tog-hideminor' => 'Skjul mindre redigeringer i siste endringer',
 'tog-hidepatrolled' => 'Skjul patruljerte redigeringer i siste endringer',
 'tog-newpageshidepatrolled' => 'Skjul patruljerte sider fra listen over nye sider',
@@ -482,7 +481,6 @@ $messages = array(
 'vector-action-protect' => 'Beskytt',
 'vector-action-undelete' => 'Gjenopprett',
 'vector-action-unprotect' => 'Endre beskyttelse',
-'vector-simplesearch-preference' => 'Aktiver forenklet søkefelt (kun for drakten Vector)',
 'vector-view-create' => 'Opprett',
 'vector-view-edit' => 'Rediger',
 'vector-view-history' => 'Vis historikk',
@@ -1152,7 +1150,8 @@ Slette- og flytteloggen vises nedenfor.',
 'content-failed-to-parse' => 'Klarte ikke å tolke innholdet $2 for innholdsmodellen $1: $3',
 'invalid-content-data' => 'Ugyldig innhold',
 'content-not-allowed-here' => 'Innholdsmodellen «$1» er ikke tillatt på siden [[$2]]',
-'editwarning-warning' => 'Ved å forlate siden kan du miste alle endringer du har utført. Om du er logget inn kan du slå av denne advarselen under «Redigering»-seksjonen i innstillingene.',
+'editwarning-warning' => 'Ved å forlate siden kan du miste alle endringer du har gjort.
+Hvis du er innlogget, kan du slå av denne advarselen under "{{int:prefs-editing}}"-avsnittet i dine innstillinger.',
 'editpage-notsupportedcontentformat-title' => 'Innholdsformatet er ikke støttet',
 'editpage-notsupportedcontentformat-text' => 'Innholdsformatet $1 er ikke støttet av innholdsmodellen $2.',
 
@@ -1188,6 +1187,7 @@ Disse parameterne har blitt utelatt.',
 'undo-success' => 'Redigeringen kan omgjøres. Sjekk sammenligningen under for å bekrefte at du vil gjøre dette, og lagre endringene for å fullføre omgjøringen.',
 'undo-failure' => 'Redigeringen kunne ikke omgjøres på grunn av konflikterende etterfølgende redigeringer.',
 'undo-norev' => 'Redigeringen kunne ikke fjernes fordi den ikke eksisterer eller ble slettet',
+'undo-nochange' => 'Det ser ut til at redigeringen allerede er tilbakestilt.',
 'undo-summary' => 'Fjerner revisjon $1 av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusjon]])',
 'undo-summary-username-hidden' => 'Fjern revisjon $1 av en skjult bruker',
 
@@ -1366,7 +1366,8 @@ Forsikre deg om at denne endringen vil opprettholde historisk sidekontinuitet.',
 'showhideselectedversions' => 'Vis/skjul valgte versjoner',
 'editundo' => 'fjern',
 'diff-empty' => '(Ingen forskjell)',
-'diff-multi' => '({{PLURAL:$1|Én mellomrevisjon|$1 mellomrevisjoner}} av {{PLURAL:$2|én bruker|$2 brukere}} vises ikke)',
+'diff-multi-sameuser' => '({{PLURAL:$1|En midlertidig revisjon|$1 midlertidige revisjoner}} av samme bruker vises ikke)',
+'diff-multi-otherusers' => '({{PLURAL:$1|En midlertidig revisjon|$1 midlertidige revisjoner}} av {{PLURAL:$2|en annen bruker|$2 brukere}} er ikke vist)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Én mellomrevisjon|$1 mellomrevisjoner}} av mer enn $2 {{PLURAL:$2|bruker|brukere}} vises ikke)',
 'difference-missing-revision' => '{{PLURAL:$2|En revisjon|$2 revisjoner}} av denne forskjellen ($1) {{PLURAL:$2|ble|ble}} ikke funnet.
 
@@ -1387,7 +1388,8 @@ Detaljer kan finnes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'shown-title' => 'Vis $1 {{PLURAL:$1|resultat|resultater}} per side',
 'viewprevnext' => 'Vis ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "* Siden '''[[$1]]'''",
-'searchmenu-new' => "'''Opprett siden ''[[:$1]]'' på denne wikien.'''",
+'searchmenu-new' => "'''Opprett siden ''[[:\$1]]'' på denne wikien.'''
+<strong>Opprett siden \"[[:\$1]]\" på denne wikien!</strong> {{PLURAL:\$2|0=|Se også siden oppnådd gjennom søket ditt.|Se også de oppnådde søkeresultatene.}}",
 'searchprofile-articles' => 'Innholdssider',
 'searchprofile-project' => 'Hjelp- og prosjektsider',
 'searchprofile-images' => 'Multimedia',
@@ -1413,6 +1415,7 @@ Detaljer kan finnes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'searchrelated' => 'relatert',
 'searchall' => 'alle',
 'showingresults' => "Nedenfor vises opptil {{PLURAL:$1|'''ett''' resultat|'''$1''' resultater}} fra og med nummer <b>$2</b>.",
+'showingresultsinrange' => 'Nedenfor vises opptil {{PLURAL:$1|<strong>1</strong> resultat|<strong>$1</strong> resulter}} i området #<strong>$2</strong> til #<strong>$3</strong>.',
 'showingresultsnum' => "Nedenfor vises {{PLURAL:$3|'''ett''' resultat|'''$3''' resultater}} fra og med nummer '''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Resultat '''$1''' av '''$3'''|Resultat '''$1 - $2''' av '''$3'''}} for '''$4'''",
 'search-nonefound' => 'Ingen resultater passet til søket.',
@@ -2230,6 +2233,14 @@ Hver rad inneholder lenker til første og andre omdirigering, samt målet for de
 'protectedpages-cascade' => 'Kun dypbeskyttelse',
 'protectedpages-noredirect' => 'Skjul omdirigeringer',
 'protectedpagesempty' => 'Ingen sider er for øyeblikket låst med disse paramterne.',
+'protectedpages-timestamp' => 'Tidsstempel',
+'protectedpages-page' => 'Side',
+'protectedpages-expiry' => 'Utløper',
+'protectedpages-performer' => 'Beskytter bruker',
+'protectedpages-params' => 'Beskyttelsesparametre',
+'protectedpages-reason' => 'Årsak',
+'protectedpages-unknown-timestamp' => 'Ukjent',
+'protectedpages-unknown-performer' => 'Ukjent bruker',
 'protectedtitles' => 'Beskyttede titler',
 'protectedtitlesempty' => 'Ingen titler beskyttes med disse parameterne for øyeblikket.',
 'listusers' => 'Brukerliste',
@@ -2773,7 +2784,7 @@ Se [[Special:BlockList|blokkeringslisten]] for alle blokkeringer.',
 'change-blocklink' => 'endre blokkering',
 'contribslink' => 'bidrag',
 'emaillink' => 'send e-post',
-'autoblocker' => 'Du ble automatisk blokkert fordi du deler IP-adresse med «[[User:$1|$1]]». Grunnen som ble gitt til at «$1» ble blokkert var: «$2».',
+'autoblocker' => 'Du ble automatisk blokkert fordi din IP-adresse nylig ble brukt av «[[User:$1|$1]]». Grunnen som ble gitt til at «$1» ble blokkert var: «$2».',
 'blocklogpage' => 'Blokkeringslogg',
 'blocklog-showlog' => 'Denne brukeren har blitt blokkert før.
 Blokkeringsloggen vises nedenfor.',
@@ -2980,6 +2991,7 @@ $2',
 'thumbnail_image-type' => 'Bildetypen støttes ikke',
 'thumbnail_gd-library' => 'Ufullstendig konfigurering av GD library: mangler funksjonen $1',
 'thumbnail_image-missing' => 'Filen ser ut til å mangle: $1',
+'thumbnail_image-failure-limit' => 'Det har vært for mange nylige forsøk ($1 eller flere) på å gjengi dette miniatyrbildet. Vennligst prøv igjen senere.',
 
 # Special:Import
 'import' => 'Importer sider',
@@ -3013,7 +3025,7 @@ Lagre den på din egen datamaskin og last den opp her.',
 'importuploaderrortemp' => 'Importfilopplasting mislyktes. En midlertidig mappe mangler.',
 'import-parse-failure' => 'Tolkningsfeil ved XML-import',
 'import-noarticle' => 'Ingen side å importere!',
-'import-nonewrevisions' => 'Alle revisjoner var importert fra før.',
+'import-nonewrevisions' => 'Ingen revisjoner ble importert: De var enten allerede på plass, eller hoppet over pga. feil.',
 'xml-error-string' => '$1 på linje $2, kolonne $3 (byte: $4): $5',
 'import-upload' => 'Last opp XML-data',
 'import-token-mismatch' => 'Sesjonsdata mistet. Venligst prøv igjen.',
@@ -3024,6 +3036,7 @@ Lagre den på din egen datamaskin og last den opp her.',
 '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-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>',
 'import-rootpage-invalid' => 'Den angitte grunnsiden har en ugyldig tittel.',
 'import-rootpage-nosubpage' => 'Navnerommet "$1" til grunnsiden tillater ikke undersider.',
@@ -3114,6 +3127,7 @@ Du kan se på kildeteksten',
 'tooltip-undo' => '«Angre» tilbakestiller denne endringen og åpner redigeringsskjemaet i forhåndsvisningsmodus. Det tillater en å legge til en begrunnelse i redigeringsforklaringen.',
 'tooltip-preferences-save' => 'Lagre innstillinger',
 'tooltip-summary' => 'Skriv et kort sammendrag',
+'interlanguage-link-title' => '$1 &ndash; $2',
 
 # Stylesheets
 'common.css' => '/* CSS plassert i denne fila vil gjelde for alle utseender. */',
index b380a0f..d35d71a 100644 (file)
@@ -216,7 +216,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Verwies ünnerstrieken',
-'tog-justify' => 'Text as Blocksatz',
 'tog-hideminor' => 'Kene lütten Ännern in letzte Ännern wiesen',
 'tog-hidepatrolled' => 'Nakeken Ännern bi „Toletzt ännert“ nich wiesen',
 'tog-newpageshidepatrolled' => 'Nakeken Ännern bi „Ne’e Sieden“ nich wiesen',
@@ -1031,7 +1030,6 @@ Seh to, dat de Versionsgeschicht vun’n Artikel vun de Historie her bi de Reeg
 'compareselectedversions' => 'Ünnerscheed twischen den utwählten Versionen wiesen',
 'showhideselectedversions' => 'Utwählt Versionen wiesen/versteken',
 'editundo' => 'rutnehmen',
-'diff-multi' => '({{PLURAL:$1|Een Twischenversion|$1 Twischenversionen}} von {{PLURAL:$2|een Bruker|$2 Brukers}} warrt nich wiest.)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Een Twischenversion|$1 Twischenversionen}} von mehr as $2 {{PLURAL:$2|Bruker|Brukers}} warrt nich wiest)',
 
 # Search results
@@ -1825,7 +1823,6 @@ Mehr Informatschonen över enkelte Rechten staht ünner [[{{MediaWiki:Listgroupr
 'watchmethod-list' => 'Oppasslist na letzte Ännern nakieken',
 'watchlistcontains' => 'Diene Oppasslist bargt {{PLURAL:$1|ene Siet|$1 Sieden}}.',
 'iteminvalidname' => "Problem mit den Indrag '$1', ungülligen Naam...",
-'wlnote' => "Ünnen {{PLURAL:$1|steiht de letzte Ännern|staht de letzten $1 Ännern}} vun de {{PLURAL:$2|letzte Stünn|letzten '''$2''' Stünnen}}.",
 'wlshowlast' => 'Wies de letzten $1 Stünnen $2 Daag $3',
 'watchlist-options' => 'Optionen för de Oppasslist',
 
@@ -2343,7 +2340,6 @@ All Transwiki-Import-Akschonen staht later ok in dat [[Special:Log/import|Import
 'tooltip-pt-watchlist' => 'Mien Oppasslist',
 'tooltip-pt-mycontris' => 'List vun dien Bidrääg',
 'tooltip-pt-login' => 'Du kannst di geern anmellen, dat is aver nich nödig, dat du Sieden ännern kannst.',
-'tooltip-pt-anonlogin' => 'Du kannst di geern anmellen, dat is aver nich nödig, dat du Sieden ännern kannst.',
 'tooltip-pt-logout' => 'Afmellen',
 'tooltip-ca-talk' => 'Diskuschoon över disse Siet',
 'tooltip-ca-edit' => 'Du kannst disse Siet ännern. Bruuk dat vör dat Spiekern.',
index 40e8780..d895307 100644 (file)
@@ -325,7 +325,6 @@ $linkTrail = '/^([a-zäöüïëéèà]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Verwiezingen onderstrepen',
-'tog-justify' => "Alinea's uutvullen",
 'tog-hideminor' => 'Kleine wiezigingen verbargen in "Leste wiezigingen"',
 'tog-hidepatrolled' => 'Wiezigingen die emarkeerd bin verbargen in "Leste wiezigingen"',
 'tog-newpageshidepatrolled' => 'Ziejen die emarkeerd bin, verbargen in de lieste mit nieje artikels',
@@ -1351,7 +1350,6 @@ In de [[Special:BlockList|blokkeerlieste]] bin de blokkeringen, die noen van toe
 'showhideselectedversions' => 'Ekeuzen versies bekieken/verbargen',
 'editundo' => 'weerummedreien',
 'diff-empty' => '(Gien verschil)',
-'diff-multi' => '(Hier {{PLURAL:$1|zit nog 1 versie|zitten nog $1 versies}} van {{PLURAL:$2|1 gebruker|$2 gebrukers}} tussen die der niet bie staon.)',
 'diff-multi-manyusers' => '($1 tussenliggende {{PLURAL:$1|versie|versies}} deur meer as $2 {{PLURAL:$2|gebruker|gebrukers}} niet weeregeven)',
 'difference-missing-revision' => "{{PLURAL:$2|Eén versie|$2 versies}} van disse verschillen ($1) {{PLURAL:$2|is|bin}} niet evunnen.
 
@@ -2387,7 +2385,6 @@ Toekomstige wiezigingen op disse zied en de overlegzied zullen hier vermeld wör
 'watchmethod-list' => 'Kik joew nao volglieste veur de leste wiezigingen',
 'watchlistcontains' => 'Der {{PLURAL:$1|steet 1 zied|staon $1 ziejen}} op joew volglieste.',
 'iteminvalidname' => "Verkeerde naam '$1'",
-'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',
 
@@ -3031,7 +3028,6 @@ De tiedelike map is niet anwezig.',
 'tooltip-pt-watchlist' => 'Lieste van bladzieden die op miene volglieste stoan',
 'tooltip-pt-mycontris' => 'Liest van oew biejdraegen',
 'tooltip-pt-login' => 'Iej wördt van harte oetneugd um oe an te melden as gebroeker, mer t is nich verplicht',
-'tooltip-pt-anonlogin' => 'Iej wördt van harte oetneugd um oe an te maelden as gebroeker, mer t is nich verplicht',
 'tooltip-pt-logout' => 'Ofmaelden',
 'tooltip-ca-talk' => 'Loat n oaverlegtekst oaver disse bladziede zeen',
 'tooltip-ca-edit' => 'Bewaerk disse bladziede',
index e216dea..3f7b6cc 100644 (file)
@@ -57,7 +57,6 @@ $digitTransformTable = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'सम्बन्ध निम्न रेखाङ्कन:',
-'tog-justify' => 'अनुच्छेद जस्टिफाइ(justify) गर्ने',
 'tog-hideminor' => 'भर्खरका मामूली सम्पादनहरुलाई लुकाउने',
 'tog-hidepatrolled' => 'गस्ती(patrolled)सम्पादनहरु हालका परिवर्तनहरुमा लुकाउने',
 'tog-newpageshidepatrolled' => 'गस्ती गरिएका पृष्ठहरू नयाँ पृष्ठ सूचीबाट लुकाउने',
@@ -1041,7 +1040,6 @@ $1",
 'compareselectedversions' => 'छानिएका संस्करणहरू दाँज्नुहोस्',
 'showhideselectedversions' => 'छानिएका पुनरावलोकनहरु देखाउने/लुकाउने',
 'editundo' => 'रद्द गर्ने',
-'diff-multi' => '({{PLURAL:$2|एक प्रयोगकर्ता|$2 प्रयोगकर्ताहरु}}द्वारा {{PLURAL:$1|एउटा मध्यवर्ती संशोधन|$1 मध्यवर्ती संशोधनहरू}} नदेखाइएको)',
 'diff-multi-manyusers' => '($2 {{PLURAL:$2|भन्दा अधिक प्रयोगकर्ता|भन्दा अधिक प्रयोगकर्ताहरु}}द्वारा {{PLURAL:$1|एउटा मध्यवर्ती संशोधन|$1 मध्यवर्ती संशोधनहरु}} नदेखाइएको)',
 
 # Search results
index 5b1176f..b02d2b9 100644 (file)
@@ -55,6 +55,7 @@
  * @author Troefkaart
  * @author Tvdm
  * @author User555
+ * @author Vogone
  * @author WTM
  * @author Wiki13
  * @author Wikiklaas
@@ -380,7 +381,6 @@ $linkTrail = '/^([a-zäöüïëéèà]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Koppelingen onderstrepen:',
-'tog-justify' => "Alinea's uitvullen",
 'tog-hideminor' => 'Kleine wijzigingen verbergen in recente wijzigingen',
 'tog-hidepatrolled' => 'Gemarkeerde wijzigingen verbergen in recente wijzigingen',
 'tog-newpageshidepatrolled' => "Gemarkeerde pagina's verbergen in de lijst met nieuwe pagina's",
@@ -543,7 +543,6 @@ $messages = array(
 'vector-action-protect' => 'Beveiligen',
 'vector-action-undelete' => 'Terugplaatsen',
 'vector-action-unprotect' => 'Beveiliging wijzigen',
-'vector-simplesearch-preference' => 'Vereenvoudigd zoeken inschakelen (alleen voor het uiterlijk Vector)',
 'vector-view-create' => 'Aanmaken',
 'vector-view-edit' => 'Bewerken',
 'vector-view-history' => 'Geschiedenis weergeven',
@@ -1277,6 +1276,7 @@ Hieronder staat de tekst waarin de wijziging ongedaan is gemaakt.
 Controleer voor het opslaan of het resultaat gewenst is.',
 'undo-failure' => 'De wijziging kan niet ongedaan gemaakt worden vanwege andere strijdige wijzigingen.',
 'undo-norev' => 'De bewerking kon niet ongedaan gemaakt worden, omdat die niet bestaat of is verwijderd.',
+'undo-nochange' => 'De bewerking lijkt al ongedaan te zijn gemaakt.',
 'undo-summary' => 'Versie $1 van [[Special:Contributions/$2|$2]] ([[User talk:$2|overleg]]) ongedaan gemaakt',
 'undo-summary-username-hidden' => 'Versie $1 door een verborgen gebruiker ongedaan gemaakt',
 
@@ -1458,7 +1458,8 @@ Let op dat het gebruiken van de navigatiekoppelingen deze kolom opnieuw instelt.
 'showhideselectedversions' => 'Geselecteerde versies weergeven/verbergen',
 'editundo' => 'ongedaan maken',
 'diff-empty' => '(geen verschil)',
-'diff-multi' => '({{PLURAL:$1|Eén tussenliggende versie|$1 tussenliggende versies}} door {{PLURAL:$2|één gebruiker|$2 gebruikers}} {{PLURAL:$1|wordt|worden}} niet weergegeven)',
+'diff-multi-sameuser' => '({{PLURAL:$1|Een tussenliggende revisie|$1 tussenliggende revisies}} door dezelfde gebruiker niet weergegeven)',
+'diff-multi-otherusers' => '({{PLURAL:$1|Een tussenliggende revisie|$1 tussenliggende revisies}} door {{PLURAL:$2|een andere gebruiker|$2 gebruikers}} niet weergegeven)',
 'diff-multi-manyusers' => '($1 tussenliggende {{PLURAL:$1|versie|versies}} door meer dan $2 {{PLURAL:$2|gebruiker|gebruikers}}  worden niet weergegeven)',
 'difference-missing-revision' => '{{PLURAL:$2|Eén versie|$2 versies}} van deze verschillen ($1) {{PLURAL:$2|is|zijn}} niet aangetroffen.
 
@@ -1480,7 +1481,7 @@ Probeer een andere zoekopdracht.',
 'shown-title' => '$1 {{PLURAL:$1|resultaat|resultaten}} per pagina weergeven',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) bekijken.',
 'searchmenu-exists' => "* Pagina '''[[$1]]'''",
-'searchmenu-new' => "'''De pagina \"[[:\$1]]\" aanmaken op deze wiki.'''",
+'searchmenu-new' => '<strong>Maak de pagina "[[:$1]]" op deze wiki!</strong> {{PLURAL:$2|0=|Zie ook de pagina met uw zoekresultaat. |Zie ook de lijst met gevonden zoekresultaten}}',
 'searchprofile-articles' => "Inhoudelijke pagina's",
 'searchprofile-project' => "Hulp- en projectpagina's",
 'searchprofile-images' => 'Multimedia',
@@ -2354,6 +2355,12 @@ De pagina's zijn ook niet als sjabloon opgenomen.",
 'protectedpages-cascade' => 'Alleen beveiligingen met de cascade-optie',
 'protectedpages-noredirect' => 'Doorverwijzingen verbergen',
 'protectedpagesempty' => "Er zijn momenteel geen pagina's beveiligd die aan deze voorwaarden voldoen.",
+'protectedpages-page' => 'Pagina',
+'protectedpages-expiry' => 'Verloopt',
+'protectedpages-params' => 'Beveiligingsopties',
+'protectedpages-reason' => 'Reden',
+'protectedpages-unknown-timestamp' => 'Onbekend',
+'protectedpages-unknown-performer' => 'Onbekende gebruiker',
 'protectedtitles' => 'Beveiligde paginanamen',
 'protectedtitlesempty' => 'Er zijn geen paginanamen beveiligd die aan deze voorwaarden voldoen.',
 'listusers' => 'Gebruikerslijst',
@@ -2544,6 +2551,7 @@ Toekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden
 'watchmethod-list' => "controleer pagina's op volglijst op wijzigingen",
 'watchlistcontains' => "Er {{PLURAL:$1|staat één pagina|staan $1 pagina's}} op uw volglijst.",
 'iteminvalidname' => "Probleem met object '$1', ongeldige naam…",
+'wlnote2' => 'Hieronder staan de veranderingen in {{PLURAL:$1|het|de}} laatste {{PLURAL:$1|uur|<strong> $1 </strong>uren}}, sinds $2, $3.',
 'wlshowlast' => 'Laatste $1 uur, $2 dagen bekijken ($3)',
 'watchlist-options' => 'Opties voor volglijst',
 
@@ -2915,7 +2923,8 @@ Zie de [[Special:BlockList|blokkadelijst]] voor recente blokkades.',
 'change-blocklink' => 'blokkade wijzigen',
 'contribslink' => 'bijdragen',
 'emaillink' => 'e-mail verzenden',
-'autoblocker' => "Automatisch geblokkeerd omdat het IP-adres overeenkomt met dat van [[User:\$1|\$1]], die geblokkeerd is om de volgende reden: \"'''\$2'''\"",
+'autoblocker' => 'Automatisch geblokkeerd omdat uw IP-adres onlangs gebruikt is door "[[User:$1|$1]]".
+De reden voor blokkade van $1 is: \'\'$2\'\'',
 'blocklogpage' => 'Blokkeerlogboek',
 'blocklog-showlog' => 'Deze gebruiker is voorheen geblokkeerd geweest.
 Het blokkeerlogboek wordt hieronder ter referentie weergegeven:',
@@ -3167,7 +3176,7 @@ Het bestand is slechts gedeeltelijk aangekomen.',
 Een tijdelijke map is niet aanwezig.',
 'import-parse-failure' => 'Fout bij het verwerken van de XML-import',
 'import-noarticle' => "Er zijn geen te importeren pagina's!",
-'import-nonewrevisions' => 'Alle versies zijn al eerder geïmporteerd.',
+'import-nonewrevisions' => 'Geen revisies geïmporteerd (alle waren al aanwezig, of overgeslagen vanwege fouten).',
 'xml-error-string' => '$1 op regel $2, kolom $3 (byte $4): $5',
 'import-upload' => 'XML-gegevens uploaden',
 'import-token-mismatch' => 'De sessiegegevens zijn verloren gegaan. Probeer het opnieuw.',
@@ -3178,6 +3187,7 @@ Een tijdelijke map is niet aanwezig.',
 'import-error-special' => 'Pagina "$1" is niet geïmporteerd omdat deze is geplaatst in een speciale naamruimte waar geen pagina\'s in geplaatst kunnen worden.',
 'import-error-invalid' => 'De pagina" "$1" is niet geïmporteerd omdat de naam ongeldig is.',
 'import-error-unserialize' => 'Versie $2 van de pagina "$1" kon niet verwerkt worden. De versie hoort contentmodel $3 te gebruiken met een serialisatie als $4.',
+'import-error-bad-location' => 'Revisie $2 met behulp van model $3 kan niet worden opgeslagen als "$1" op deze wiki, aangezien dat model niet ondersteund wordt op die pagina.',
 'import-options-wrong' => 'Verkeerde {{PLURAL:$2|optie|opties}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'De opgegeven basispagina is ongeldig.',
 'import-rootpage-nosubpage' => 'In de naamruimte "$1" van de basispagina is het aanmaken van subpagina\'s niet mogelijk.',
index 7ace8ef..eb90f96 100644 (file)
@@ -321,7 +321,6 @@ $linkTrail = '/^([æøåa-z]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Strek under lenkjer:',
-'tog-justify' => 'Blokkjusterte avsnitt',
 'tog-hideminor' => 'Gøym småplukk i lista over siste endringar',
 'tog-hidepatrolled' => 'Gøym patruljerte endringar i lista over siste endringar',
 'tog-newpageshidepatrolled' => 'Gøym patruljerte sider frå lista over nye sider',
@@ -1306,7 +1305,6 @@ Pass på at den nye sida også har innhald frå den innfletta sida.',
 'showhideselectedversions' => 'Vis/løyn valde versjonar',
 'editundo' => 'angre',
 'diff-empty' => '(Ingen skilnad)',
-'diff-multi' => '({{PLURAL:$1|Éin mellomversjon|$1 mellomversjonar}} frå {{PLURAL:$2|éin brukar|$2 brukarar}} er ikkje {{PLURAL:$1|vist|viste}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Ein mellomversjon|$1 mellomversjonar}} av meir enn $2 {{PLURAL:$2|brukar|brukarar}}  er ikkje {{PLURAL:$1|vist|viste}})',
 'difference-missing-revision' => '{{PLURAL:$2|Éin versjon|$2 versjonar}} av skilnaden ($1) vart ikkje {{PLURAL:$2|funnen|funne}}.
 
@@ -2309,7 +2307,6 @@ E-postadressa du har sett i [[Special:Preferences|innstillingane dine]] vil dukk
 'watchmethod-list' => 'sjekkar om dei overvaka sidene har blitt endra i det siste',
 'watchlistcontains' => 'Overvakingslista di inneheld {{PLURAL:$1|éi side|$1 sider}}.',
 'iteminvalidname' => 'Problem med «$1», ugyldig namn...',
-'wlnote' => "Nedanfor er {{PLURAL:$1|den siste endringa|dei siste '''$1''' endringane}} {{PLURAL:$2|den siste timen|dei siste '''$2''' timane}}, for $3, kl. $4.",
 'wlshowlast' => 'Vis siste $1 timane $2 dagane $3',
 'watchlist-options' => 'Alternativ for overvakingslista',
 
@@ -2925,7 +2922,6 @@ Vitja [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [/
 'tooltip-pt-watchlist' => 'Liste over sidene du overvakar.',
 'tooltip-pt-mycontris' => 'Liste over bidraga dine',
 'tooltip-pt-login' => 'Det er ikkje obligatorisk å logga inn, men medfører mange fordelar.',
-'tooltip-pt-anonlogin' => 'Det er ikkje obligatorisk å logga inn, men medfører mange fordelar.',
 'tooltip-pt-logout' => 'Logg ut',
 'tooltip-ca-talk' => 'Diskusjon om innhaldssida',
 'tooltip-ca-edit' => 'Du kan endre denne sida. Bruk førehandsvisings-knappen før du lagrar.',
index 52307fe..fb5c7be 100644 (file)
@@ -48,9 +48,7 @@ $messages = array(
 'tog-hideminor' => 'Fihla diphetogo tše nnyenyane',
 'tog-showtoolbar' => "Bontšha ''toolbar'' yago fetola (JavaScript)",
 'tog-editondblclick' => 'Fetola matlakala ka go thathapa gabedi (JavaScript)',
-'tog-editsection' => 'Dumella go fetola sekgao ka [fetola] hlomaganyo',
 'tog-editsectiononrightclick' => 'Dumella go fetola sekgao ka thathapa ka lagoja thaetlele ya sekgao (JavaScript)',
-'tog-showtoc' => 'Bontšha Tatelano ya dikagare (go matlakala a goba le dihlogo tša go feta 3)',
 'tog-rememberpassword' => 'Gopola sedi yaka ya go tsena khomphutha ye (bogolo bja  $1 bja {{PLURAL:$1| ya letšatši le|ya matšatši}})',
 'tog-watchcreations' => 'Tsenya matlaka a mafsa ao ke a ngwalago go lenano laka la ditlhapetšo',
 'tog-watchdefault' => 'Tsenya matlaka ao ke a fetolago go lenano laka la ditlhapetšo',
@@ -538,7 +536,6 @@ fetola tshenolo',
 'lineno' => 'Mothalo $1:',
 'compareselectedversions' => 'Bapetša diphapang tšeo di kgethilwego',
 'editundo' => 'dirolla',
-'diff-multi' => '({{PLURAL:$1|Phetogo ya bjale ye tee|$1 tša diphetogo tša bjale}} tša {{PLURAL:$2|mošumiši o tee|$2 tša bašumiši}} gadi laetšwe)',
 
 # Search results
 'searchresults' => 'Sephetho sa go fetleka',
index 4fb1a23..c7c8a09 100644 (file)
@@ -292,7 +292,6 @@ $linkTrail = "/^([a-zàâçéèêîôû]+)(.*)$/sDu";
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Soslinhar los ligams :',
-'tog-justify' => 'Justificar los paragrafs',
 'tog-hideminor' => 'Amagar los darrièrs cambiaments menors',
 'tog-hidepatrolled' => 'Amagar las modificacions susvelhadas dels darrièrs cambiaments',
 'tog-newpageshidepatrolled' => 'Amagar las paginas susvelhadas de la lista de las paginas novèlas',
@@ -1309,7 +1308,6 @@ Asseguratz-vos qu'aqueste cambiament pòsca conservar la continuitat de l'istori
 'showhideselectedversions' => 'Afichar/amagar las versions seleccionadas',
 'editundo' => 'desfar',
 'diff-empty' => '(Pas cap de diferéncia)',
-'diff-multi' => '({{PLURAL:$1|Una revision intermediària amagada|$1 revisions intermediàrias amagadas}}) per ({{PLURAL:$2|un utilizaire pas afichada|$2 utilizaires pas afichadas}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Una revision intermediària amagada|$1 revisions intermediàrias amagadas}}) per ({{PLURAL:$2|un utilizaire pas afichada|$2 utilizaires pas afichadas}})',
 'difference-missing-revision' => "{{PLURAL:$2|Una revision|$2 revisions}} d'aquesta diferéncia ($1) {{PLURAL:$2|es pas estada trobada|son pas estadas trobadas}}.
 
@@ -2342,7 +2340,6 @@ per modificar vòstra lista de seguiment.',
 'watchmethod-list' => 'verificacion de las paginas seguidas per de modificacions recentas',
 'watchlistcontains' => 'Vòstra lista de seguiment conten $1 {{PLURAL:$1|pagina|paginas}}.',
 'iteminvalidname' => "Problèma amb l'article « $1 » : lo nom es invalid...",
-'wlnote' => "Çaijós {{PLURAL:$1|se tròba la darrièra modificacion efectuada|se tròban las $1 darrièras modificacions efectuadas}} pendent {{PLURAL:$2|la darrièra ora|las '''$2''' darrièras oras}} dempuèi $3, $4.",
 'wlshowlast' => 'Far veire las darrièras $1 oras, los darrièrs $2 jorns, o $3.',
 'watchlist-options' => 'Opcions de la lista de seguiment',
 
@@ -2959,7 +2956,6 @@ Salvatz-lo sus vòstre disc dur puèi importatz-lo aicí.",
 'tooltip-pt-watchlist' => 'La lista de las paginas que seguissètz',
 'tooltip-pt-mycontris' => 'Lista de vòstras contribucions',
 'tooltip-pt-login' => 'Sètz convidat(ada) a vos identificar, mas es pas obligatòri.',
-'tooltip-pt-anonlogin' => 'Sètz convidat(ada) a vos identificar, mas es pas obligatòri.',
 'tooltip-pt-logout' => 'Se desconnectar',
 'tooltip-ca-talk' => "Discussion a prepaus d'aquesta pagina",
 'tooltip-ca-edit' => 'Podètz modificar aquesta pagina. Mercé de previsualizar abans d’enregistrar.',
index 4a69d4d..2810045 100644 (file)
@@ -259,7 +259,6 @@ $digitGroupingPattern = "##,##,###";
 $messages = array(
 # User preference toggles
 'tog-underline' => 'ତଳେ ଥିବା ଲିଙ୍କ:',
-'tog-justify' => 'ପାରାଗ୍ରାଫଗୁଡ଼ିକର ବାମ ଡାହାଣ ସମଭାବେ ସଜାଡ଼ିବେ',
 'tog-hideminor' => 'ଛୋଟ ଛୋଟ ନଗଦ ବଦଳ ସବୁକୁ ଲୁଚାଇବେ',
 'tog-hidepatrolled' => 'ନଗଦ ବଦଳରେ ଥିବା ଜଗାହୋଇଥିବା ବଦଳ ସବୁକୁ ଲୁଚାଇବେ',
 'tog-newpageshidepatrolled' => 'ନୂଆ ପୃଷ୍ଠାତାଲିକାରୁ ଜଗାହୋଇଥିବା ବଦଳସବୁକୁ ଲୁଚାଇବେ',
@@ -499,7 +498,7 @@ $1',
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} ବାବଦରେ',
 'aboutpage' => 'Project:ବାବଦରେ',
-'copyright' => '$1 ରେ ସର୍ବସ୍ଵତ୍ଵ ସଂରକ୍ଷିତ',
+'copyright' => 'ଅଲଗା ଭାବେ ଉଲ୍ଲେଖ ନ କରାଯିବ ଯାଏଁ ଏହା $1 ରେ ସର୍ବସ୍ଵତ୍ଵ ସଂରକ୍ଷିତ',
 'copyrightpage' => '{{ns:project}}:କପିରାଇଟ',
 'currentevents' => 'ଏବେକାର ଘଟଣା',
 'currentevents-url' => 'Project:ଏବେକାର ଘଟଣା',
@@ -528,8 +527,8 @@ $1',
 'youhavenewmessages' => 'ଆପଣଙ୍କ ପାଇଁ $1 ($2)।',
 'youhavenewmessagesfromusers' => 'ଆପଣଙ୍କର {{PLURAL:$3|another user|$3 users}} ($2)ରୁ $1 ଅଛି ।',
 'youhavenewmessagesmanyusers' => 'ଆପଣଙ୍କର ବହୁତ ବ୍ୟବହାରକାରୀ($2)ମାନଙ୍କଠାରୁ $1 ଅଛି ।',
-'newmessageslinkplural' => '{{PLURAL:$1|ଏକ ନୂଆ ସନ୍ଦେଶ|ନୂଆ ସନ୍ଦେଶ}}',
-'newmessagesdifflinkplural' => 'ଶେଷ{{PLURAL:$1|change|changes}}',
+'newmessageslinkplural' => '{{PLURAL:$1|ଏକ ନୂଆ ସନ୍ଦେଶ|ନୂଆ ସନ୍ଦେଶଗୁଡିକ}}',
+'newmessagesdifflinkplural' => 'ଶେଷ{{PLURAL:$1|ବଦଳ|ବଦଳଗୁଡିକ}}',
 'youhavenewmessagesmulti' => '$1 ତାରିଖରେ ନୂଆ ଚିଠିଟିଏ ଆସିଛି',
 'editsection' => 'ସମ୍ପାଦନା',
 'editold' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
@@ -581,6 +580,12 @@ $1',
 # General errors
 'error' => 'ଭୁଲ',
 'databaseerror' => 'ଡାଟାବେସରେ ଭୁଲ',
+'databaseerror-text' => 'ଡାଟାବେସରେ ତ୍ରୁଟି ଦେଖାଦେଲା ।
+ଏହା ସଫ୍ଟୱେରରେ ଜନିତ ତ୍ରୁଟି ହେଇପାରେ ।',
+'databaseerror-textcl' => 'ଡାଟାବେସରେ ତ୍ରୁଟି ଦେଖାଦେଲା ।',
+'databaseerror-query' => 'ଅନୁରୋଧ :$1',
+'databaseerror-function' => 'ଫଙ୍କସନ : $1',
+'databaseerror-error' => 'ତ୍ରୁଟି: $1',
 'laggedslavemode' => "'''ଜାଣିରଖନ୍ତୁ:''' ପୃଷ୍ଠାଟିରେ ବୋଧ ହୁଏ ନଗଦ ବଦଳ ନ ଥାଇପାରେ ।",
 'readonly' => 'ଡାଟାବେସଟିରେ ତାଲା ପଡ଼ିଅଛି',
 'enterlockreason' => 'କେତେ ଦିନ ଭିତରେ ଏହା ଖୋଲାଯିବ ତାହାର ଅଟକଳ ସହିତ କଞ୍ଚି ପଡ଼ିବାର କାରଣ ଦିଅନ୍ତୁ',
@@ -1282,7 +1287,6 @@ $1",
 'compareselectedversions' => 'ବଛାହୋଇଥିବା ସଙ୍କଳନ ଗୁଡ଼ିକୁ ତଉଲିବେ',
 'showhideselectedversions' => 'ବଛା ହୋଇଥିବା ସଙ୍କଳନ ଗୁଡ଼ିକୁ ଦେଖାଇବେ/ଲୁଚାଇବେ',
 'editundo' => 'ପଛକୁ ଫେରିବା',
-'diff-multi' => '({{PLURAL:$2|ଜଣେ ବ୍ୟବହାରକାରୀ|$2 ଜଣ ବ୍ୟବହାରକାରୀ}}ଙ୍କ ଦେଇ ହୋଇଥିବା {{PLURAL:$1|ଗୋଟିଏ ମଝି ସଙ୍କଳନ|$1ଟି ମଝି ସଙ୍କଳନ}} ଦେଖାଯାଉନାହିଁ)',
 'diff-multi-manyusers' => '($2 {{PLURAL:$2|ଜଣ|ଜଣ}} ସଭ୍ୟଙ୍କ ଦେଇ କରାଯାଇଥିବା {{PLURAL:$1|ଗୋଟିଏ ମଝି ସଂସ୍କରଣ|$1 ଗୋଟି ମଝି ସଂସ୍କରଣମାନ}} ଦେଖାଯାଉ ନାହିଁ)',
 'difference-missing-revision' => '($1) {{PLURAL:$2|was|were}}ର ଭିନ୍ନତା {{PLURAL:$2|One revision|$2 revisions}} ମିଳିଲା ନାହିଁ ।
 
index cd8138c..5640200 100644 (file)
@@ -186,7 +186,6 @@ $fallback8bitEncoding =  'windows-1251';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Æрвитæнты бын хахх:',
-'tog-justify' => 'Æмвæз абзацтæ',
 'tog-hideminor' => 'Чысыл ивддзинæдтæ фæстаг ивддзинæдты номхыгъды мауал æвдис',
 'tog-hidepatrolled' => 'Айсын бæрæггонд ивдтытæ фæстаг ивдтытæй',
 'tog-newpageshidepatrolled' => 'Басгæрст фæрстæ ног фæрсты номхыгъдæй æмбæхс',
@@ -195,9 +194,7 @@ $messages = array(
 'tog-numberheadings' => 'Сæртæн хæдæвзæргæ номыр æвæрын',
 'tog-showtoolbar' => 'Æвдисын ивыны панел (домы JavaScript)',
 'tog-editondblclick' => 'Фæрстæ дыкъæппæй ив (домы JavaScript)',
-'tog-editsection' => 'Равдис «баив æй» æрвитæн тексты алы хайы дæр',
 'tog-editsectiononrightclick' => 'Хайы сæрыл рахис æркъæппæй ивыны фадат баиу кæнын (домы JavaScript)',
-'tog-showtoc' => 'Сæрты номхыгъд æвдисын (æртæйæ фылдæрсæр цы фарсы ис, уым)',
 'tog-rememberpassword' => 'Бахъуыды мæ кæнæд ацы браузер ($1 {{PLURAL:$1|бонмæ|бонмæ}})',
 'tog-watchcreations' => 'Æз цы фæрстæ аразын æмæ цы файлтæ бавгæнын, уыдон мæ цæстдард уæт.',
 'tog-watchdefault' => 'Æз цы фæрстæ æмæ цы файлтæ ивын, уыдон мæ цæстдард уæт',
@@ -1013,7 +1010,6 @@ ASCII нысæнттæм чи нæ хауы, уыдон ивыны бынаты
 'lineno' => 'Рæнхъ $1:',
 'compareselectedversions' => 'Абарын æвзæрст фæлтæртæ',
 'editundo' => 'раивын',
-'diff-multi' => '{{PLURAL:$2|1 архайæджы|$2 архайæджы}} {{PLURAL:$1|1 æхсæйнаг фæлтæр æвдыст нæу|$1 æхсæйнаг фæлтæры æвдыст не сты}}',
 
 # Search results
 'searchresults' => 'Агуырды фæстиуджытæ',
@@ -1410,7 +1406,6 @@ $3',
 'unwatch' => 'Нал дарын цæст',
 'watchlist-details' => '{{PLURAL:$1|$1 фарсмæ|$1 фарсмæ}} дæ цæст дарыс, тæрхоны фæрстæ нæ нымайгæйæ.',
 'watchlistcontains' => 'Дæ цæст $1 {{PLURAL:$1|фарсмæ|фарсмæ}} дарыс.',
-'wlnote' => "Дæлæ афæстаг '''$2 сахаты дæргъы''' цы $1 {{PLURAL:$1|ивддзинад|ивддзинады}} æрцыди.",
 'wlshowlast' => 'Фæстæг $1 сахаты, $2 боны дæргъы; $3.',
 'watchlist-options' => 'Цæстдард рæгъы фадæттæ',
 
index 16ffe68..61bdb83 100644 (file)
@@ -192,7 +192,6 @@ $digitGroupingPattern = "##,##,###";
 $messages = array(
 # User preference toggles
 'tog-underline' => 'ਲਿੰਕ ਹੇਠ-ਲਾਈਨ:',
-'tog-justify' => 'ਪੈਰਾਗਰਾਫ਼ ਇਕਸਾਰ',
 'tog-hideminor' => 'ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਵਿੱਚੋਂ ਛੋਟੀਆਂ ਸੋਧਾਂ ਲੁਕਾਓ',
 'tog-hidepatrolled' => 'ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਵਿੱਚੋਂ ਜਾਂਚੀਆਂ ਸੋਧਾਂ ਲੁਕਾਓ',
 'tog-newpageshidepatrolled' => 'ਨਵੀਂ ਸਫ਼ਾ ਸੂਚੀ ਵਿੱਚੋਂ ਜਾਂਚੇ ਸਫ਼ੇ ਲੁਕਾਓ',
@@ -201,9 +200,7 @@ $messages = array(
 'tog-numberheadings' => 'ਆਟੋ-ਨੰਬਰ ਸਿਰਨਾਵੇਂ',
 'tog-showtoolbar' => 'ਸੋਧ ਸੰਦਬਕਸਾ ਵੇਖੋ',
 'tog-editondblclick' => "ਦੋ ਵਾਰ ਕਲਿੱਕ ਕਰਨ 'ਤੇ ਸਫ਼ੇ ਸੋਧੋ",
-'tog-editsection' => '[ਸੋਧੋ] ਲਿੰਕਾਂ ਰਾਹੀਂ ਭਾਗ ਸੋਧਣਾ ਚਾਲੂ ਕਰੋ',
 'tog-editsectiononrightclick' => 'ਸੈਕਸ਼ਨ ਸਿਰਲੇਖਾਂ ’ਤੇ ਸੱਜੀ ਕਲਿੱਕ ਨਾਲ਼ ਸੋਧ ਚਾਲੂ ਕਰੋ (ਜਾਵਾਸਕਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)',
-'tog-showtoc' => 'ਤਤਕਰਾ ਵਿਖਾਓ (੩ ਤੋਂ ਵੱਧ ਸਿਰਲੇਖਾਂ ਵਾਲੇ ਸਫ਼ਿਆਂ ਲਈ)',
 'tog-rememberpassword' => 'ਇਸ ਬਰਾਊਜ਼ਰ ਉੱਤੇ ਮੇਰਾ ਦਾਖ਼ਲਾ ਯਾਦ ਰੱਖੋ (ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਲਈ)',
 'tog-watchcreations' => 'ਮੇਰੇ ਵਲੋਂ ਬਣਾਏ ਗਏ ਸਫ਼ੇ ਅਤੇ ਅੱਪਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
 'tog-watchdefault' => 'ਮੇਰੇ ਵੱਲੋਂ ਸੋਧੇ ਗਏ ਸਫ਼ੇ ਅਤੇ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
@@ -1092,7 +1089,6 @@ $1",
 'showhideselectedversions' => 'ਚੁਣੇ ਰੀਵਿਜ਼ਨ ਵਖਾਓ/ਲੁਕਾਓ',
 'editundo' => 'ਰੱਦ ਕਰੋ',
 'diff-empty' => '(ਕੋਈ ਫ਼ਰਕ ਨਹੀਂ)',
-'diff-multi' => '({{PLURAL:$2|ਵਰਤੋਂਕਾਰ ਦੀ|$2 ਵਰਤੋਂਕਾਰਾਂ ਦੀਆਂ}} {{PLURAL:$1|ਵਿਚਕਾਰਲੀ ਰੀਵਿਜਨ ਨਹੀਂ ਦਿਖਾਈ ਜਾ ਰਹੀ|ਵਿਚਕਾਰਲੀਆਂ $1 ਰੀਵਿਜਨਾਂ ਨਹੀਂ ਦਿਖਾਈਆਂ ਜਾ ਰਹੀਆਂ}})',
 
 # Search results
 'searchresults' => 'ਖੋਜ ਨਤੀਜੇ',
@@ -1834,8 +1830,6 @@ HTML ਟੈਗ ਚੈੱਕ ਕਰੋ।',
 'notvisiblerev' => 'ਇੱਕ ਵੱਖਰੇ ਮੈਂਬਰ ਦੀ ਬਣਾਈ ਆਖ਼ਰੀ ਰੀਵਿਜ਼ਨ ਮਿਟਾਈ ਜਾ ਚੁੱਕੀ ਹੈ',
 'watchlist-details' => 'ਗੱਲ-ਬਾਤ ਸਫ਼ੇ ਨਾ ਗਿਣਦੇ ਹੋਏ, ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਸੂਚੀ ਵਿਚ{{PLURAL:$1|$1 ਸਫ਼ਾ ਹੈ|$1 ਸਫ਼ੇ ਹਨ}}।',
 'watchlistcontains' => 'ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ $1 {{PLURAL:$1|ਸਫ਼ਾ ਹੈ|ਸਫ਼ੇ ਹਨ}}।',
-'wlnote' => "$3, $4 ਮੁਤਾਬਕ ਆਖ਼ਰੀ {{PLURAL:$2|ਘੰਟੇ|'''$2''' ਘੰਟਿਆਂ}} ਵਿਚ {{PLURAL:
-$1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆਂ}}, ਹੇਠਾਂ ਵੇਖੋ।",
 'wlshowlast' => 'ਪਿਛਲੇ $1 ਘੰਟੇ $2 ਦਿਨ $3 ਵਖਾਓ',
 'watchlist-options' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਦੀਆਂ ਚੋਣਾਂ',
 
@@ -2174,7 +2168,6 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'tooltip-pt-watchlist' => "ਉਹਨਾਂ ਸਫ਼ਿਆਂ ਦੀ ਸੂਚੀ ਜਿਹਨਾਂ ਦੀਆਂ ਤਬਦੀਲੀਆਂ 'ਤੇ ਤੁਸੀਂ ਅੱਖ ਰੱਖ ਰਹੇ ਹੋ",
 'tooltip-pt-mycontris' => 'ਤੁਹਾਡੇ ਯੋਗਦਾਨਾਂ ਦੀ ਸੂਚੀ',
 'tooltip-pt-login' => 'ਤੁਹਾਨੂੰ ਦਾਖ਼ਲ ਹੋਣ ਲਈ ਪ੍ਰੇਰਿਆ ਜਾਂਦਾ ਹੈ; ਪਰ ਇਹ ਕੋਈ ਲਾਜ਼ਮੀ ਨਹੀਂ',
-'tooltip-pt-anonlogin' => 'ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਕਰਨ ਲਈ ਉਤਸ਼ਾਹਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ; ਪਰ ਇਹ ਕੋਈ ਲਾਜ਼ਮੀ ਨਹੀਂ ਹੈ',
 'tooltip-pt-logout' => 'ਸਾਈਟ ਤੋਂ ਵਿਦਾਈ ਲਓ',
 'tooltip-ca-talk' => 'ਸਮਗੱਰੀ ਸਫ਼ੇ ਬਾਰੇ ਚਰਚਾ',
 'tooltip-ca-edit' => 'ਤੁਸੀਂ ਇਹ ਸਫ਼ਾ ਸੋਧ ਸਕਦੇ ਹੋ। ਕਿਰਪਾ ਕਰਕੇ ਤਬਦੀਲੀ ਸਾਂਭਣ ਤੋਂ ਪਹਿਲਾਂ ਝਲਕ ਵੇਖੋ।',
index 969deff..5056109 100644 (file)
@@ -17,7 +17,6 @@
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Gulisan lang panglalam deng suglung:',
-'tog-justify' => 'Pipanten-panten la reng parapu (paragraph)',
 'tog-hideminor' => 'Isalikut la reng mangalating edit kareng bayung mengayalili',
 'tog-hidepatrolled' => "Isalikut la reng edit a babanten (''controlled edits'') kareng bayung mengayalili",
 'tog-newpageshidepatrolled' => "Isalikut la reng bulung a babanten (''patrolled pages'') king listaan king bayung bulung (''new page list'')",
@@ -26,10 +25,7 @@ $messages = array(
 'tog-numberheadings' => 'Tambing lang dinan nomiru deng pamagat',
 'tog-showtoolbar' => 'Ipakit ya panaliling toolbar (JavaScript)',
 'tog-editondblclick' => 'Alilan la reng bulung kapamilatan ning makataduang pamagpindut (JavaScript)',
-'tog-editsection' => 'Paganan ya ing pamag-edit king dake (section editing) kapamilatan da reng suglung a [edit]
-Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
 'tog-editsectiononrightclick' => "Paganan ya ing pamag-edit seksiyon (section editing) kapamilata'ning pamag right click kareng pamagat da reng seksiyon (JavaScript)",
-'tog-showtoc' => 'Pakit ya ing kalamnan [table of contents] (kareng bulung a maki 3 o mas dakal a pamagat)',
 'tog-rememberpassword' => '↓Tandanan ya ing kanakung login keng computer a ini (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'tog-watchcreations' => 'Idagdag la deng bulung a lelengan ku kareng babanten',
 'tog-watchdefault' => 'Idagdag la reng bulung a inalilan ku kareng babanten',
@@ -718,7 +714,6 @@ Gamitan me ing radio button column bang bukud mung detang miyalilan aniang o bay
 'lineno' => 'Gulis $1:',
 'compareselectedversions' => 'Pikumpara/piyanti la reng mepiling bersion',
 'editundo' => 'iurung',
-'diff-multi' => '({{PLURAL:$1|1 a pamagbayung miyalilan na |$1 pamagbayung miyalilan na}} a e makalto.)',
 
 # Search results
 'searchresults' => 'Ding linual (resulta) king pamanintun',
@@ -1319,7 +1314,6 @@ click me ing \"Tuknangan ing pamagbante\" (Unwatch) king gilid na ning bulung.",
 'watchmethod-list' => 'susurian la reng bulung a babanten para kareng bayung mengayalili',
 'watchlistcontains' => 'Atin yang $1 {{PLURAL:$1|a bulung|bulung}} ing kekang tala ring babanten (watchlist).',
 'iteminvalidname' => "Maki prublema king '$1', e maliari ing lagyu...",
-'wlnote' => "{{PLURAL:$1|Ing makatuki ing tauling|Ding makatuki ring tauling '''$1''' miyalilan}} kilub {{PLURAL:$2|ning tauling metung a oras|ding tauling '''$2''' oras}}.",
 'wlshowlast' => 'Pakit la reng tauling $1 oras $2 aldo $3',
 'watchlist-options' => "Deng maliaring gawan kareng listaan da reng babanten (''watchlist'')",
 
@@ -1778,7 +1772,6 @@ Maka-login la reng eganaganang pamaglub a transwiki (transwiki import actions) k
 'tooltip-pt-watchlist' => 'Ing tala da reng bulung nung nu mu babanten ing mengayalilan',
 'tooltip-pt-mycontris' => 'Tala/listaan da reng kekang ambag',
 'tooltip-pt-login' => 'Agkat da kang mag login, oneng e sapilitan iti.',
-'tooltip-pt-anonlogin' => 'Pakisabi ming mag-login ka, oneng e sapilitan iti.',
 'tooltip-pt-logout' => 'Mag log out',
 'tooltip-ca-talk' => 'Pamisabi-sabi tungkul king bulung kalamnan (content page)',
 'tooltip-ca-edit' => 'Malyari meng samasan ing bulung a ini. Pakigamit me pamu ing "pasinag a pipindutan" bayu me isikap.',
index c8bcebf..b7303ae 100644 (file)
@@ -19,7 +19,6 @@ $namespaceGenderAliases = array();
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Loïens soulinés:',
-'tog-justify' => 'Aligner ches paragrafes',
 'tog-hideminor' => 'Muche ches tiots edits din ches nouvieus cangemints',
 'tog-hidepatrolled' => 'Mucher chés wardés édichons din chés nouvieus canjemints',
 'tog-newpageshidepatrolled' => 'Muche ches paches pormenées del lisse ed ches nouvèles paches',
@@ -27,9 +26,7 @@ $messages = array(
 'tog-numberheadings' => 'liméro automatique ed ches intétes',
 'tog-showtoolbar' => "Afiquer chés otis pou l'édichon (i feut JavaScript)",
 'tog-editondblclick' => 'Éditer ches paches aveuc un doube buke (i feut JavaScript)',
-'tog-editsection' => "Pérmet l'édichion del sekchion via [edit] loïens",
 'tog-editsectiononrightclick' => "Pérmet l'édichion del sekchion par un droé buke su ch'tite del sekchion (i feut JavaScript)",
-'tog-showtoc' => "Aficher l'tabe ed ches étnus (pou ches paches aveuc plu ed 3 intétes)",
 'tog-rememberpassword' => "Warder min lodjine su chl'ordinateu-lo (pour un maximum éd $1 {{PLURAL:$1|jour|jours}})",
 'tog-watchcreations' => "Ajouter chés paches qu'éj crée et pi chés fichiés qu'éj téléquertche édseur em lisse à suire",
 'tog-watchdefault' => "Ajouter chés paches pi chés fichiés qu'éj cange édseur em lisse à suire.",
@@ -464,7 +461,6 @@ Léginde : ({{MediaWiki:Cur}}) = différinches aveuc el vérchon à ch'momint-ch
 'lineno' => 'Line $1:',
 'compareselectedversions' => 'Compérer chés couésies contérbuchons',
 'editundo' => "n'poin foaire",
-'diff-multi' => '({{PLURAL:$1|Un canjemint intarmédiaire|$1 canjemints intarmédiaires}} par {{PLURAL:$2|un uzeu|$2 uzeus}} {{PLURAL:$1|est muché|sont muchées}})',
 
 # Search results
 'searchresults' => 'Tracher chés résultats',
index 36de77f..95b2983 100644 (file)
@@ -542,7 +542,6 @@ Ealaidarung: '''({{int:cur}})''' = Unnaschied zu jezd,
 'compareselectedversions' => 'Ausgawe midnonna vaglaische',
 'showhideselectedversions' => 'Zaisch/Vaschdeggl gwehldi Ausgawe',
 'editundo' => 'zriggnemme',
-'diff-multi' => '({{PLURAL:$1|Ä dzwische lischndi Ännarung|$1 dzwische lischende Ännarunge}} by {{PLURAL:$2|än Middawaida|$2 Middawaida}} nedd gzaischd)',
 
 # Search results
 'searchresults' => 'Eagewnis nochgugge',
index ff5b8ec..2ec50a0 100644 (file)
@@ -317,7 +317,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Podkreślenie linków',
-'tog-justify' => 'Wyrównuj tekst w akapitach do obu marginesów',
 'tog-hideminor' => 'Ukryj drobne edycje w ostatnich zmianach',
 'tog-hidepatrolled' => 'Ukryj sprawdzone edycje w ostatnich zmianach',
 'tog-newpageshidepatrolled' => 'Ukryj sprawdzone strony na liście nowych stron',
@@ -480,7 +479,6 @@ $messages = array(
 'vector-action-protect' => 'Zabezpiecz',
 'vector-action-undelete' => 'Odtwórz',
 'vector-action-unprotect' => 'Zmień zabezpieczenie',
-'vector-simplesearch-preference' => 'Włącz uproszczony pasek wyszukiwania (tylko dla skórki Wektor)',
 'vector-view-create' => 'Utwórz',
 'vector-view-edit' => 'Edytuj',
 'vector-view-history' => 'Wyświetl historię',
@@ -1160,7 +1158,7 @@ Strona już istnieje.',
 'invalid-content-data' => 'Zawartość strony zawiera nieprawidłowe dane',
 'content-not-allowed-here' => 'Zawartość tego typu ($1) nie jest dozwolona na stronie [[$2]]',
 'editwarning-warning' => 'Opuszczenie tej strony może spowodować utratę wprowadzonych przez Ciebie zmian.
-Jeśli jesteś zalogowany możesz wyłączyć wyświetlanie tego ostrzeżenia w zakładce Edycja w swoich preferencjach.',
+Jeśli jesteś zalogowany, możesz wyłączyć wyświetlanie tego ostrzeżenia w zakładce „{{int:prefs-editing}}” w swoich preferencjach.',
 'editpage-notsupportedcontentformat-title' => 'Nieobsługiwany format zawartości',
 
 # Content models
@@ -1195,6 +1193,7 @@ Argument ten będzie pominięty.',
 'undo-success' => 'Edycja może zostać wycofana. Porównaj ukazane poniżej różnice między wersjami, a następnie zapisz zmiany.',
 'undo-failure' => 'Edycja nie może zostać wycofana z powodu konfliktu z wersjami pośrednimi.',
 'undo-norev' => 'Edycja nie może być cofnięta, ponieważ nie istnieje lub została usunięta.',
+'undo-nochange' => 'Wygląda na to, że edycja została już anulowana.',
 'undo-summary' => 'Anulowanie wersji $1 autora [[Special:Contributions/$2|$2]] ([[User talk:$2|dyskusja]])',
 'undo-summary-username-hidden' => 'Anulowanie wersji $1 autorstwa ukrytego użytkownika',
 
@@ -1375,7 +1374,8 @@ Użycie linków nawigacyjnych kasuje wybór w kolumnie.',
 'showhideselectedversions' => 'Pokaż lub ukryj zaznaczone wersje',
 'editundo' => 'anuluj edycję',
 'diff-empty' => '(Brak różnic)',
-'diff-multi' => '(Nie pokazano $1 wersji {{PLURAL:$1|utworzonej|utworzonych}} przez {{PLURAL:$2|jednego użytkownika|$2 użytkowników}})',
+'diff-multi-sameuser' => '(Nie pokazano $1 {{PLURAL:$1|pośredniej wersji utworzonej|pośrednich wersji utworzonych}} przez tego samego użytkownika)',
+'diff-multi-otherusers' => '(Nie pokazano $1 wersji {{PLURAL:$1|utworzonej|utworzonych}} przez {{PLURAL:$2|jednego użytkownika|$2 użytkowników}})',
 'diff-multi-manyusers' => '(Nie pokazano $1 {{PLURAL:$1|pośredniej wersji utworzonej|pośrednich wersji utworzonych}} przez {{PLURAL:$2|jednego użytkownika|$2 użytkowników}})',
 'difference-missing-revision' => '{{PLURAL:$2|Wersja|$2 wersje|$2 wersji}} #$1 strony "{{PAGENAME}}" nie {{PLURAL:$2|została znaleziona|zostały znalezione|zostało znalezionych}}.
 
@@ -1395,7 +1395,7 @@ Zazwyczaj jest to spowodowane przestarzałym linkiem do usuniętej strony. Powó
 'shown-title' => 'Pokaż po $1 {{PLURAL:$1|wyniku|wyniki|wyników}} na stronę',
 'viewprevnext' => 'Zobacz ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "* Strona '''[[$1]]'''",
-'searchmenu-new' => "'''Utwórz stronę „[[:$1|$1]]” na tej wiki.'''",
+'searchmenu-new' => '<strong>Utwórz stronę „[[:$1]]” na tej wiki!<strong> {{PLURAL:$2|0=|Zobacz też stronę z wynikami wyszukiwania.|Zobacz też wyniki wyszukiwania.}}',
 'searchprofile-articles' => 'Strony',
 'searchprofile-project' => 'Strony pomocy i projektu',
 'searchprofile-images' => 'Multimedia',
@@ -1420,6 +1420,7 @@ Zazwyczaj jest to spowodowane przestarzałym linkiem do usuniętej strony. Powó
 'searchrelated' => 'pokrewne',
 'searchall' => 'wszystkie',
 'showingresults' => "Poniżej znajduje się lista {{PLURAL:$1|z '''1''' wynikiem|'''$1''' wyników}}, rozpoczynając od wyniku numer '''$2'''.",
+'showingresultsinrange' => 'Poniżej wyświetlono co najwyżej {{PLURAL:$1|<strong>1</strong> wynik|<strong>$1</strong> wyniki|<strong>$1</strong> wyników}} w zakresie od <strong>$2</strong> do <strong>$3</strong>.',
 'showingresultsnum' => "Poniżej znajduje się lista {{PLURAL:$3|z '''1''' wynikiem|'''$3''' wyników}}, rozpoczynając od wyniku numer '''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Wynik '''$1''' z '''$3'''|Wyniki '''$1 – $2''' z '''$3'''}} dla '''$4'''",
 'search-nonefound' => 'Brak wyników spełniających kryteria podane w zapytaniu.',
@@ -1462,7 +1463,7 @@ Jednak informacje o treści {{GRAMMAR:D.lp|{{SITENAME}}}} mogą być w Google ni
 'prefs-email' => 'E‐mail',
 'prefs-rendering' => 'Wygląd',
 'saveprefs' => 'Zapisz',
-'restoreprefs' => 'Przywróć wszystkie domyślne preferencje (we wszystkich sekcjach)',
+'restoreprefs' => 'Przywróć wszystkie domyślne preferencje (we wszystkich zakładkach)',
 'prefs-editing' => 'Edycja',
 'rows' => 'Wiersze',
 'columns' => 'Kolumny',
@@ -1605,7 +1606,7 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 # Rights
 'right-read' => 'Czytanie treści stron',
 'right-edit' => 'Edycja stron',
-'right-createpage' => 'Tworzenie stron (nie będących stronami dyskusji)',
+'right-createpage' => 'Tworzenie stron (niebędących stronami dyskusji)',
 'right-createtalk' => 'Tworzenie stron dyskusji',
 'right-createaccount' => 'Tworzenie kont użytkowników',
 'right-minoredit' => 'Oznaczanie edycji jako drobnych',
@@ -1641,7 +1642,7 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'right-ipblock-exempt' => 'Obejście blokad, automatycznych blokad i blokad zakresów adresów IP',
 'right-proxyunbannable' => 'Obejście automatycznych blokad proxy',
 'right-unblockself' => 'Odblokowanie samego siebie',
-'right-protect' => 'Zmiana stopnia zabezpieczenia i dostęp do edycji stron zabezpieczonych kaskadowo',
+'right-protect' => 'Zmiana poziomu zabezpieczenia i edycja stron zabezpieczonych kaskadowo',
 'right-editprotected' => 'Edycja stron zabezpieczonych na poziomie „{{int:protect-level-sysop}}”',
 'right-editsemiprotected' => 'Edycja stron zabezpieczonych na poziomie „{{int:protect-level-autoconfirmed}}”',
 'right-editinterface' => 'Edycja interfejsu użytkownika',
@@ -1655,7 +1656,7 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'right-viewmyprivateinfo' => 'Podgląd swoich prywatnych danych (np. adres e-mail, prawdziwe imię i nazwisko)',
 'right-editmyprivateinfo' => 'Edycja swoich prywatnych danych (np. adres e-mail, prawdziwe imię i nazwisko)',
 'right-editmyoptions' => 'Edycja swoich preferencji',
-'right-rollback' => 'Szybkie wycofanie zmian wprowadzonych przez użytkownika, który jako ostatni edytował jakąś stronę',
+'right-rollback' => 'Szybkie wycofanie zmian wprowadzonych przez użytkownika, który jako ostatni edytował stronę',
 'right-markbotedits' => 'Oznaczanie rewertu jako edycji bota',
 'right-noratelimit' => 'Brak ograniczeń przepustowości',
 'right-import' => 'Importowanie stron z innych wiki',
@@ -2249,6 +2250,14 @@ Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, d
 'protectedpages-cascade' => 'Tylko strony zabezpieczone rekursywnie',
 'protectedpages-noredirect' => 'Ukryj przekierowania',
 'protectedpagesempty' => 'Żadna strona nie jest obecnie zabezpieczona z podanymi parametrami.',
+'protectedpages-timestamp' => 'Sygnatura czasowa',
+'protectedpages-page' => 'Strona',
+'protectedpages-expiry' => 'Wygasa',
+'protectedpages-performer' => 'Użytkownik zabezpieczający',
+'protectedpages-params' => 'Parametry zabezpieczenia',
+'protectedpages-reason' => 'Powód',
+'protectedpages-unknown-timestamp' => 'Nieznane',
+'protectedpages-unknown-performer' => 'Użytkownik nieznany',
 'protectedtitles' => 'Zabezpieczone nazwy stron',
 'protectedtitlesempty' => 'Dla tych ustawień dopuszczalne jest utworzenie stron o dowolnej nazwie.',
 'listusers' => 'Lista użytkowników',
@@ -2435,6 +2444,7 @@ Każda zmiana treści tej strony lub związanej z nią strony dyskusji zostanie
 'watchmethod-list' => 'poszukiwanie obserwowanych stron wśród ostatnich zmian',
 'watchlistcontains' => 'Na liście obserwowanych przez Ciebie stron {{PLURAL:$1|znajduje się 1 pozycja|znajdują się $1 pozycje|znajduje się $1 pozycji}}.',
 'iteminvalidname' => 'Problem z pozycją „$1” – niepoprawna nazwa...',
+'wlnote2' => 'Poniżej pokazano zmiany wykonane w ciągu {{PLURAL:$1|ostatniej godziny|ostatnich <strong>$1</strong> godzin}}, licząc od $2, $3.',
 'wlshowlast' => 'Pokaż ostatnie $1 godzin, $2 dni ($3)',
 'watchlist-options' => 'Opcje obserwowanych',
 
@@ -2759,6 +2769,7 @@ Podaj powód (np. umieszczając nazwy stron, na których dopuszczono się wandal
 Przejdź do [[Special:BlockList|listy blokad]], by przejrzeć blokady.',
 'ipb-blockingself' => 'Usiłujesz zablokować siebie samego! Czy na pewno chcesz to zrobić?',
 'ipb-confirmhideuser' => 'Zamierzasz zablokować użytkownika z włączoną opcją „ukryj użytkownika”. Spowoduje to pominięcie nazwy użytkownika we wszystkich listach i rejestrach. Czy na pewno chcesz to zrobić?',
+'ipb-confirmaction' => 'Jeśli naprawdę chcesz to zrobić, zaznacz pole „{{int:ipb-confirm}}” poniżej.',
 'ipb-edit-dropdown' => 'Edytuj listę przyczyn blokady',
 'ipb-unblock-addr' => 'Odblokuj $1',
 'ipb-unblock' => 'Odblokuj użytkownika lub adres IP',
@@ -2800,7 +2811,7 @@ Przejdź do [[Special:BlockList|listy blokad]], by przejrzeć blokady.',
 'change-blocklink' => 'zmień blokadę',
 'contribslink' => 'edycje',
 'emaillink' => 'wyślij e‐mail',
-'autoblocker' => 'Zablokowano Cię automatycznie, ponieważ używasz tego samego adresu IP, co użytkownik „[[User:$1|$1]]”.
+'autoblocker' => 'Zablokowano Cię automatycznie, ponieważ twój adres IP był ostatnio używany przez „[[User:$1|$1]]”.
 Przyczyna blokady $1 to: „$2”',
 'blocklogpage' => 'Historia blokad',
 'blocklog-showlog' => '{{GENDER:$1|Ten użytkownik był|Ta użytkowniczka była}} już wcześniej {{GENDER:$1|blokowany|blokowana}}. Poniżej znajduje się rejestr blokad:',
@@ -3009,6 +3020,7 @@ $2',
 'thumbnail_image-type' => 'Grafika tego typu nie jest obsługiwana',
 'thumbnail_gd-library' => 'Niekompletna konfiguracja biblioteki GD – brak funkcji $1',
 'thumbnail_image-missing' => 'Chyba brakuje pliku $1',
+'thumbnail_image-failure-limit' => 'Ostatnio było zbyt wielu nieudanych prób ($1 lub więcej) utworzenia miniaturki. Spróbuj ponownie później.',
 
 # Special:Import
 'import' => 'Import stron',
@@ -3045,7 +3057,7 @@ Zapisz go na swoim dysku, a następnie prześlij go tutaj.',
 Brak katalogu dla plików tymczasowych.',
 'import-parse-failure' => 'nieudana analiza składni importowanego XML',
 'import-noarticle' => 'Brak stron do zaimportowania!',
-'import-nonewrevisions' => 'Wszystkie wersje zostały już wcześniej zaimportowane.',
+'import-nonewrevisions' => 'Nie zaimportowano żadnych wersji (wszystkie były już obecne albo pominięte z powodu błędów).',
 'xml-error-string' => '$1 linia $2, kolumna $3 (bajt $4): $5',
 'import-upload' => 'Prześlij dane w formacie XML',
 'import-token-mismatch' => 'Utracono dane sesji. Proszę spróbować ponownie.',
@@ -4290,6 +4302,4 @@ W zasadzie rozwijane jest prawie wszystko w podwójnych nawiasach klamrowych.',
 'expand_templates_generate_rawhtml' => 'Pokaż surowy HTML',
 'expand_templates_preview' => 'Podgląd',
 
-# Unknown messages
-'createaccount-hook-aborted' => '$1',
 );
index 2a05d90..96996b4 100644 (file)
@@ -44,7 +44,6 @@ $namespaceNames = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Anliure con la sotliniadura',
-'tog-justify' => 'Paràgraf: giustificà',
 'tog-hideminor' => "Stërmé le modìfiche cite ant sla pàgina dj'ùltime modìfiche",
 'tog-hidepatrolled' => "Stërmé le modìfiche dzorvejà ant j'ùltime modìfiche",
 'tog-newpageshidepatrolled' => 'Stërmé le pàgine dzorvejà da la lista dle pàgine neuve',
@@ -207,7 +206,6 @@ $messages = array(
 'vector-action-protect' => 'Protege',
 'vector-action-undelete' => 'Arcuperé',
 'vector-action-unprotect' => 'Cangé la protession',
-'vector-simplesearch-preference' => "Abilité la bara d'arserca semplificà (mach për la pel Vector)",
 'vector-view-create' => 'Creé',
 'vector-view-edit' => 'Modifiché',
 'vector-view-history' => 'Smon-e la stòria',
@@ -872,7 +870,7 @@ A esist già.",
 'invalid-content-data' => 'Dat dël contnù pa bon',
 'content-not-allowed-here' => "Ël contnù «$1» a l'é nen autorisà an sla pàgina [[$2]]",
 'editwarning-warning' => "Chité sta pàgina-sì a peul feje perde tute le modìfiche ch'a l'ha fàit.
-S'a l'é rintrà ant ël sistema, a peul disabilité st'avis ant la session «Modìfica» dij sò gust.",
+S'a l'é rintrà ant ël sistema, a peul disabilité st'avis ant la session «{{int:prefs-editing}}» dij sò gust.",
 'editpage-notsupportedcontentformat-title' => 'Formà ëd contnù nen mantnù',
 'editpage-notsupportedcontentformat-text' => "Ël formà ëd contnù $1 a l'é nen mantnù dal model Ëd contnù $2.",
 
@@ -908,6 +906,7 @@ Costi paràmeter a son stàit ignorà.",
 'undo-success' => "Sta modìfica-sì as peul scancelesse. Për piasì, ch'a contròla ambelessì sota për esse sigur che a l'é pro lòn che a veul fé, e peuj ch'as salva lòn ch'a l'ha butà chiel/chila për finì dë scancelé la modìfica ch'a-i era.",
 'undo-failure' => "Sta modìfica a l'é nen podusse scancelé për via che a-i son dle contradission antra version antrames.",
 'undo-norev' => "La modìfica a peul nen esse anulà përchè a esist pa o a l'é stàita anulà.",
+'undo-nochange' => 'A smija che la modìfica a sia già stàita anulà.',
 'undo-summary' => 'Gavà la revision $1 fàita da [[Special:Contributions/$2|$2]] ([[User talk:$2|Ciaciarade]])',
 'undo-summary-username-hidden' => "Anulé la revision $1 ëd n'utent ëstërmà",
 
@@ -1087,7 +1086,8 @@ Ch'a varda mach che a-i ven-a nen fòra un rabel ant la continuità stòrica.",
 'showhideselectedversions' => 'Smon-e/stërmé le version selessionà',
 'editundo' => "buta 'me ch'a l'era",
 'diff-empty' => '(Gnun-a diferensa)',
-'diff-multi' => "({{PLURAL:$1|Na revision antërmedia|$1 revision antërmedie}} ëd {{PLURAL:$2|n'utent|$2 utent}} pa mostrà)",
+'diff-multi-sameuser' => '({{PLURAL:$1|Na revision antërmedia|$1 revision antërmedie}} nen mostrà)',
+'diff-multi-otherusers' => "({{PLURAL:$1|Na revision antërmedia|$1 revision antërmedie}} ëd {{PLURAL:$2|n'àutr utent|$2 utent}} nen mostrà)",
 'diff-multi-manyusers' => "({{PLURAL:$1|Na revision antërmedia|$1 revision antërmedie}} da pi che $2 {{PLURAL:$2|n'utent|utent}} pa mostrà)",
 'difference-missing-revision' => "{{PLURAL:$2|Na revision|$2 revision}} dë sta diferensa ($1) a {{PLURAL:$2|l'é pa stàita|son pa stàite}} trovà.
 
@@ -1109,7 +1109,7 @@ Sòn a l'é normalment causà da l'andèje dapress a na veja liura stòrica a na
 'shown-title' => 'Smon-e $1 {{PLURAL:$1|arzultà|arzultà}} për pàgina',
 'viewprevnext' => 'Che a varda ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''A-i é na pàgina ciamà \"[[:\$1]]\" dzora a costa wiki'''",
-'searchmenu-new' => "'''Creé la pàgina «[[:$1]]» ansima a sta wiki-sì!'''",
+'searchmenu-new' => "<strong>Creé la pàgina «[[:$1]]» ansima a costa wiki!</strong> {{PLURAL:$2|0=|Vëdde ëdcò la pàgina trovà con larserca.|Vëdde ëdcò j'arzultà d'arserca trovà.}}",
 'searchprofile-articles' => 'Pàgine ëd contnù',
 'searchprofile-project' => "Pàgine d'agiut e ëd proget",
 'searchprofile-images' => 'Multimedia',
@@ -1135,6 +1135,7 @@ Sòn a l'é normalment causà da l'andèje dapress a na veja liura stòrica a na
 'searchrelated' => 'corelà',
 'searchall' => 'tuti',
 'showingresults' => "Ambelessì-sota a treuva fin a {{PLURAL:$1|'''1'''|'''$1'''}} arzultà, a parte dal nùmer #'''$2'''.",
+'showingresultsinrange' => 'Smon-e sì-sota fin-a a {{PLURAL:$1|<strong>1</strong>|<strong>$1</strong>}} arzultà ant la serie da #<strong>$2</strong> a #<strong>$3</strong>.',
 'showingresultsnum' => "Ambelessì-sota a treuva {{PLURAL:$3|'''1'''|'''$3'''}} arzultà a parte da #'''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Arzultà '''$1''' ëd '''$3'''|Arzultà '''$1 - $2''' ëd '''$3'''}} për '''$4'''",
 'search-nonefound' => "A-i é gnun arzultà për l'arserca.",
@@ -1961,10 +1962,20 @@ Adess a l'é na ridiression a [[$2]].",
 'deadendpagestext' => "Le pàgine ambelessì-sota a l'han pa d'anliure anvers a j'àutre pàgine ëd {{SITENAME}}.",
 'protectedpages' => 'Pàgine sota protession',
 'protectedpages-indef' => 'Mach protession anfinìe',
+'protectedpages-summary' => "Costa pàgina a lista dle pàgine esistente che a son al moment protegiùe. Për na lista dij tìtoj ch'a son protet da la creassion, vëdde [[{{#special:ProtectedTitles}}]].",
 'protectedpages-cascade' => 'Mach protession a cascà',
 'protectedpages-noredirect' => 'Stërmé le ridiression',
 'protectedpagesempty' => 'Për adess a-i é pa gnun-a pàgina protegiùa',
+'protectedpages-timestamp' => 'Stampin data e ora',
+'protectedpages-page' => 'Pàgina',
+'protectedpages-expiry' => 'A scad ai',
+'protectedpages-performer' => "Protession ëd l'utent",
+'protectedpages-params' => 'Paràmeter ëd protession',
+'protectedpages-reason' => 'Rason',
+'protectedpages-unknown-timestamp' => 'Sconossùa',
+'protectedpages-unknown-performer' => 'Utent ësconossù',
 'protectedtitles' => 'Tìtoj protegiù',
+'protectedtitles-summary' => 'Costa pàgina a lista dij tìtoj che a son al moment protegiù da la creassion. Për na lista dle pàgine esistente che a son protegiùe, vëdde [[{{#special:ProtectedPages}}]].',
 'protectedtitlesempty' => "A-i é pa gnun tìtol protegiù ch'a-i intra coi criteri ch'a l'ha butà.",
 'listusers' => "Lista dj'utent",
 'listusers-editsonly' => "Mostré mach j'utent ch'a l'han fàit dle modìfiche",
@@ -2519,7 +2530,7 @@ Ch'a consulta la [[Special:BlockList|lista dij blocagi]] për rivëdde ij blocag
 'change-blocklink' => 'modifiché ël blocagi',
 'contribslink' => 'contribussion',
 'emaillink' => 'mandé un mëssagi eletrònich',
-'autoblocker' => "A l'é scataje un blocagi përchè soa adrëssa IP a l'é staita dovrà ant j'ùltim temp da l'Utent «[[User:$1|$1]]». Ël motiv për bloché $1 a l'é stait: «'''$2'''»",
+'autoblocker' => "A l'é scataje un blocagi përchè soa adrëssa IP a l'é staita dovrà ant j'ùltim temp da l'Utent «[[User:$1|$1]]». Ël motiv për bloché $1 a l'é stait «'''$2'''»",
 'blocklogpage' => 'Registr dij blocagi',
 'blocklog-showlog' => "St'utent-sì a l'é già stàit blocà ant ël passà. Ël registr dij blocagi a l'é disponìbil sì-sota 'me arferiment:",
 'blocklog-showsuppresslog' => "St'utent-sì a l'é già stàit blocà e stërmà. Ël registr ëd j'eliminassion a l'é smonù sì-sota për arferiment:",
@@ -2730,6 +2741,7 @@ $2",
 'thumbnail_image-type' => 'Sòrt ëd figura nen gestì',
 'thumbnail_gd-library' => 'Configurassion incompleta dla biblioteca GD: Fonsion $1 mancanta',
 'thumbnail_image-missing' => "L'archivi a smija ch'a manca: $1",
+'thumbnail_image-failure-limit' => "A-i son ëstaje ëd recent tròpi tentativ falì ($1 o pi) ëd rende costa plancia. Për piasì, ch'a preuva torna pi tard.",
 
 # Special:Import
 'import' => 'Amportassion ëd pàgine',
@@ -2765,7 +2777,7 @@ Che as lo salva ansima a sò ordinator e peui che a lo caria ambelessì.",
 'importuploaderrortemp' => "A l'é falìe la caria dl'archivi d'amporté. A-i manca un dossié provisòri.",
 'import-parse-failure' => "Eror dë scomposission XML ant l'amportassion",
 'import-noarticle' => "Pa gnun-a pàgina d'amporté.",
-'import-nonewrevisions' => "Tute le revision a j'ero già stàite amportà.",
+'import-nonewrevisions' => "Gnun-a revision amportà (tute a j'ero già presente opura a son ëstàite sautà për via d'eror).",
 'xml-error-string' => '$1 ant la riga $2, colòna $3 (byte $4): $5',
 'import-upload' => 'Cariament ëd dat XML',
 'import-token-mismatch' => "Pèrdita dij dat ëd session.
@@ -2777,6 +2789,7 @@ Për piasì, ch'a preuva torna.",
 'import-error-special' => "La pàgina «$1» a l'é pa amportà përchè a ponta a në spassi nominal ch'a përmët pa dle pàgine.",
 'import-error-invalid' => "La pàgina «$1» a l'é pa amportà përchè sò nòm a l'é pa bon.",
 'import-error-unserialize' => "La revision $2 dla pagina «$1» a peul pa esse desserialisà. La revision a l'era arportà përchè a deuvra ël model ëd contnù $3 serialisà com $4.",
+'import-error-bad-location' => "La revision $2, ch'a deuvra ël model ëd contnù $3 a peul nen esse guernà su «$1» su costa wiki, dagià che col model a l'é nen mantnù su cola pàgina.",
 'import-options-wrong' => '{{PLURAL:$2|Opsion|Opsion}} sbalià: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => "La pàgina prinsipal dàita a l'é un tìtol pa bon.",
 'import-rootpage-nosubpage' => 'Lë spassi nominal «$1» ëd la pàgina prinsipal a përmët pa dle sot-pagine.',
@@ -3966,6 +3979,5 @@ An efet, a espand praticament tut lòn ch'a-i é antrames dle grafe dobie.",
 'expand_templates_preview' => 'Preuva',
 
 # Unknown messages
-'createaccount-hook-aborted' => '$1',
 'uploadinvalidxml' => "L'XML ant l'archivi carià a l'ha nen podù esse analisà.",
 );
index eac64a9..47a6968 100644 (file)
@@ -23,7 +23,6 @@ $rtl = true;
 $messages = array(
 # User preference toggles
 'tog-underline' => 'حوڑ تھلے لین:',
-'tog-justify' => 'پیراگراف ثابت کرو',
 'tog-hideminor' => 'چھوٹیاں تبدیلیاں چھپاؤ',
 'tog-hidepatrolled' => 'ویکھیاں تبدیلیاں لکاؤ',
 'tog-newpageshidepatrolled' => 'نویاں صفیاں توں ویکھیاں تبدیلیاں لکاؤ',
@@ -921,7 +920,6 @@ $1",
 'compareselectedversions' => 'چنے صفحے آپنے سامنے کرو',
 'showhideselectedversions' => 'وکھاؤ/لکاؤ چنیاں دہرائیاں',
 'editundo' => 'واپس',
-'diff-multi' => '({{PLURAL:$1|اک درمیانی تبدیلی|$1 درمیانی تبدیلی}} {{PLURAL:$2|اک ورتن والا|$2 ورتن والے}} کولوں نئیں وکھائی گئی۔)',
 'diff-multi-manyusers' => '({{انیک:$1|اک وشکارلی ریوین|$1 وشکارلیاں ریویناں}} توں ود $2 {{انیک:$2|ورتن والا|ورتن والا}} نئیں دسی گئی)',
 
 # Search results
@@ -1894,7 +1892,6 @@ $1",
 'watchmethod-list' => 'ویکھے کے صفے نیڑے ہون والیاں تبدیلیاں دی پڑتال',
 'watchlistcontains' => 'تھواڈی اکھ تھلے رکھی لسٹ چ $1 {{PLURAL:$1|صفہ|صفے}}  نیں۔',
 'iteminvalidname' => "'$1' نال رپھڑ، ناں غلط",
-'wlnote' => "تھلے {{PLURAL:\$1|آخری تبدیلی|آخری تبدیلیاں '''1\$''' }} آخر تے {{PLURAL:\$2|کینٹہ|'''2\$''' کینٹے}} 3\$، 4\$.",
 'wlshowlast' => 'آخری $1 گھنٹے $2 دن $3 وکھاؤ',
 'watchlist-options' => 'نظر تھلے رکھن دیاں راہواں',
 
@@ -2531,7 +2528,6 @@ $1',
 'tooltip-pt-watchlist' => 'او صفحے جنہاں وچ تبدیلیاں تسی ویکھ رہے او',
 'tooltip-pt-mycontris' => 'میرے کم',
 'tooltip-pt-login' => 'اے بہتر اے کہ لاگ ان ہو جاؤ، لیکن فیر وی اے لازمی نئیں۔',
-'tooltip-pt-anonlogin' => 'اے بہتر اے کہ لاگ ان ہو جاؤ، لیکن فیر وی اے لازمی نئیں۔',
 'tooltip-pt-logout' => 'باہر آؤ',
 'tooltip-ca-talk' => 'اس صفحے دے بار وچ گل بات',
 'tooltip-ca-edit' => 'تسیں اس صفے تے لکھ سکدے او۔
index a170a38..4a210e5 100644 (file)
@@ -15,7 +15,6 @@
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Autengīnsenin paglaubasnā',
-'tog-justify' => 'Izlīginais tekstan prei abbans pāusans',
 'tog-hideminor' => 'Kliptinais malkans tikrisnans en panzdaumamans kitawīdinsnans',
 'tog-hidepatrolled' => 'Kliptinais izbandātans redigīsenins en panzdaumamans kitawīdinsnans',
 'tog-newpageshidepatrolled' => 'Kliptinais izbandātans pāusans iz listin stēisan nāunan pāusan',
@@ -750,7 +749,6 @@ Nawigaciōnis autengīsenin terpausnā naikinna etrīnksenin en kōlunei.',
 'lineno' => 'Rindā $1:',
 'compareselectedversions' => 'Paligīnais etrīnktans wersiōnins',
 'editundo' => 'Naikinnais redigīsenin',
-'diff-multi' => '(Ni pawaidinnā di $1{{PLURAL:$1|wersiōnin|wersiōnins}}  sirzdau šans)',
 
 # Search results
 'searchresults' => 'Laukīsnas rezultātai',
@@ -1524,7 +1522,6 @@ Eraīna šisse pāusas ēnturas kitawīdinsna anga diskusiōnis pāusas sēitan
 'watchmethod-list' => 'Izbandasnā stēisan nadirītan pāusan laukīntei panzdaumans kitawīdisnans',
 'watchlistcontains' => 'En twajjai listin stēisan nadirītan ast $1 {{PLURAL:$1|pāusan|pāusai}}.',
 'iteminvalidname' => 'Prōblamans sen elamēntan "$1", nitikrōmiska pabilisnā...',
-'wlnote' => "Zemmais pawaidinnā di {{PLURAL:$1|panzdauman kitawīdinsnan|panzdaumans '''$1''' kitawīdinsnans}} en {{PLURAL:$2|panzdauman stundin|'''$2''' panzdaumans stundins}}.",
 'wlshowlast' => 'Waidinnais panzdaumans $1 stūndins, $2 dēinans ($3)',
 'watchlist-options' => 'Nadirītan listis mazīngiskwas',
 
@@ -2005,7 +2002,6 @@ Madli bandais etkūmps.',
 'tooltip-pt-watchlist' => 'Listi stēisan pāusan nadirītan prō tin',
 'tooltip-pt-mycontris' => 'Listi twajāsan ēndijan',
 'tooltip-pt-login' => 'Rēidimai, kai tū enēilai, šlāit sta ni ast izkīnintan',
-'tooltip-pt-anonlogin' => 'Rēidimai kāi enēilai, adder sta ni ast izkīnintan',
 'tooltip-pt-logout' => 'Izjaīs',
 'tooltip-ca-talk' => 'Diskusiōni ezze šisse pāusas ēnturan',
 'tooltip-ca-edit' => 'Tū mazzi redigītun šin pāusan.
index a181dac..46ba229 100644 (file)
@@ -160,7 +160,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'کرښنې تړنې:',
-'tog-justify' => 'پاراگرافونه همجوليزول',
 'tog-hideminor' => 'په وروستيو بدلونو کې واړه سمونونه پټول',
 'tog-hidepatrolled' => 'په وروستيو بدلونونو کې څارل شوې سمونونه پټول',
 'tog-newpageshidepatrolled' => 'د نوؤ مخونو په لړليک کې کتل شوي مخونه پټول',
@@ -169,9 +168,7 @@ $messages = array(
 'tog-numberheadings' => 'د سرليکونو خپلکاره شمېرايښودنه',
 'tog-showtoolbar' => 'د سمون اوزارپټه ښکاره کول',
 'tog-editondblclick' => 'په دوه کلېک سره د مخونو سمون',
-'tog-editsection' => 'د [سمول] تړنې له لوري د يوې ليکنې يوه برخه د سمون وړ گرځول',
 'tog-editsectiononrightclick' => 'د ليکنې د يوې برخې په سرليک ښي کلېک کول د هغې برخې سمون چارنوي',
-'tog-showtoc' => 'نيوليک ښکاره کول (د هغو مخونو لپاره چې له ۳ نه ډېر سرليکونه لري)',
 'tog-rememberpassword' => 'زما کارن-نوم په دې کتنمل (تر $1 {{PLURAL:$1|ورځې|ورځو}}) په ياد وساته!',
 'tog-watchcreations' => 'زما کتنلړ کې دې هغه مخونه چې زه يې جوړوم او هغه دوتنې چې زه يې پورته کوم ورگډې شي',
 'tog-watchdefault' => 'زما کتنلړ کې دې هغه مخونه او دوتنې ورگډې شي چې زه يې سموم',
@@ -974,7 +971,6 @@ $1',
 'showhideselectedversions' => 'ټاکلې بڼې ښکاره کول/پټول',
 'editundo' => 'ناکړ',
 'diff-empty' => '(بې توپيره)',
-'diff-multi' => ' د ({{PLURAL:$2| يو کارن|$2 کارنانو}} لخوا {{PLURAL:$1|يوه منځګړې بڼه|$1 منځګړې بڼې}}د  نه ده ښکاره شوې)',
 
 # Search results
 'searchresults' => 'د پلټنې پايلې',
@@ -1717,7 +1713,6 @@ $1',
 'wlheader-showupdated' => "هغه مخونه چې ستاسې د کتلو نه وروسته بدلون موندلی په '''روڼ''' ليک په نښه شوي.",
 'watchlistcontains' => 'ستاسې کتنلړ $1 {{PLURAL:$1|مخ|مخونه}} لري.',
 'iteminvalidname' => "د '$1' توکي سره ستونزه، ناسم نوم ...",
-'wlnote' => "دلته لاندې {{PLURAL:$1|وروستی بدلون دی|وروستي '''$1''' بدلونونه دي}} چې په {{PLURAL:$2|تېر ساعت|تېرو '''$2''' ساعتونو}} کې تر $3 نېټې او $4 بجو پېښ شوي.",
 'wlshowlast' => 'وروستي $1 ساعتونه $2 ورځې $3 ښکاره کړه',
 'watchlist-options' => 'د کتنلړ خوښنې',
 
@@ -2129,7 +2124,6 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'tooltip-pt-watchlist' => 'د هغه مخونو لړليک چې تاسې يې د بدلون لپاره څاری',
 'tooltip-pt-mycontris' => 'ستاسې د ونډو لړليک',
 'tooltip-pt-login' => 'تاسې ته په غونډال کې د ننوتلو سپارښتنه کوو، که څه هم چې دا يو اړين کار نه دی.',
-'tooltip-pt-anonlogin' => 'تاسو ته په غونډال کې د ننوتلو سپارښتنه کوو، که څه هم چې دا يو اړين کار نه دی.',
 'tooltip-pt-logout' => 'وتل',
 'tooltip-ca-talk' => 'د مخ د مېنځپانگې په اړه خبرې اترې',
 'tooltip-ca-edit' => 'تاسې همدا مخ سمولای شی. لطفاً د ليکنې د خوندي کولو دمخه، د همدې ليکنې مخليدنه وگورۍ.',
index ddeb146..1b69c79 100644 (file)
@@ -22,6 +22,7 @@
  * @author GoEThe
  * @author Hamilton Abreu
  * @author Helder.wiki
+ * @author Imperadeiro98
  * @author Indech
  * @author Jens Liebenau
  * @author Jorge Morais
@@ -37,6 +38,7 @@
  * @author Malafaya
  * @author Manuel Menezes de Sequeira
  * @author Masked Rogue
+ * @author Matma Rex
  * @author McDutchie
  * @author MetalBrasil
  * @author Minh Nguyen
@@ -46,6 +48,7 @@
  * @author Opraco
  * @author Paulo Juntas
  * @author Pedroca cerebral
+ * @author Polyethylen
  * @author Rafael Vargas
  * @author Rei-artur
  * @author Remember the dot
@@ -322,7 +325,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Sublinhar ligação:',
-'tog-justify' => 'Justificar parágrafos',
 'tog-hideminor' => 'Esconder edições menores nas mudanças recentes',
 'tog-hidepatrolled' => 'Esconder edições patrulhadas nas mudanças recentes',
 'tog-newpageshidepatrolled' => 'Esconder páginas patrulhadas na lista de páginas novas',
@@ -485,7 +487,6 @@ $messages = array(
 'vector-action-protect' => 'Proteger',
 'vector-action-undelete' => 'Restaurar',
 'vector-action-unprotect' => 'Alterar proteção',
-'vector-simplesearch-preference' => 'Ativar barra de pesquisa simplificada (apenas no tema Vector)',
 'vector-view-create' => 'Criar',
 'vector-view-edit' => 'Editar',
 'vector-view-history' => 'Ver histórico',
@@ -883,6 +884,8 @@ Para prosseguir, será necessário definir uma nova palavra-chave.',
 'retypenew' => 'Repita a palavra-chave nova:',
 'resetpass_submit' => 'Definir palavra-chave e entrar',
 'changepassword-success' => 'A sua palavra-chave foi alterada com êxito!',
+'changepassword-throttled' => 'Você realizou demasiadas tentativas de autenticação com esta conta.
+Por favor, aguarde $1 antes de tentar novamente.',
 'resetpass_forbidden' => 'Não é possível alterar palavras-chave',
 'resetpass-no-info' => 'Precisa estar autenticado para aceder diretamente a esta página.',
 'resetpass-submit-loggedin' => 'Alterar palavra-chave',
@@ -934,6 +937,8 @@ Palavra-chave temporária: $2',
 'changeemail-password' => 'A sua senha na wiki {{SITENAME}}:',
 'changeemail-submit' => 'Alterar correio electrónico',
 'changeemail-cancel' => 'Cancelar',
+'changeemail-throttled' => 'Você realizou demasiadas tentativas de autenticação com esta conta.
+Por favor, aguarde $1 antes de tentar novamente.',
 
 # Special:ResetTokens
 'resettokens' => 'Redefinir chaves',
@@ -1163,9 +1168,10 @@ Ela já existia.',
 'content-failed-to-parse' => 'Falha ao analisar conteúdo $2 para modelo $1:$3',
 'invalid-content-data' => 'Dados de conteúdo inválidos',
 'content-not-allowed-here' => 'Conteúdo do tipo "$1" não é permitido na página [[$2]]',
-'editwarning-warning' => 'Sair desta página fará com que você perca quaisquer alterações feitas por você.
-Se você se autenticou, pode desabilitar este aviso na seção "Edição" das suas preferências.',
+'editwarning-warning' => 'Sair desta página fará com que você perca quaisquer alterações feitas por si.
+Se você se autenticou, pode desativar este aviso na secção "{{int:prefs-editing}}" das suas preferências.',
 'editpage-notsupportedcontentformat-title' => 'Formato de conteúdo não suportado',
+'editpage-notsupportedcontentformat-text' => 'O formato de conteúdo $1 não é suportado pelo modelo de conteúdo $2.',
 
 # Content models
 'content-model-wikitext' => 'wikitexto',
@@ -1200,6 +1206,7 @@ Verifique a comparação abaixo, para se certificar que corresponde ao que prete
 Depois grave as alterações, para finalizar e desfazer a edição.',
 'undo-failure' => 'Não foi possível desfazer a edição por conflito com alterações intermédias.',
 'undo-norev' => 'Não foi possível desfazer a edição porque ela não existe ou foi apagada.',
+'undo-nochange' => 'A edição parece já ter sido desfeita.',
 'undo-summary' => 'Desfeita a edição $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussão]])',
 'undo-summary-username-hidden' => 'Desfazer a revisão  $1  por um usuário oculto',
 
@@ -1208,6 +1215,9 @@ Depois grave as alterações, para finalizar e desfazer a edição.',
 'cantcreateaccount-text' => "A criação de contas a partir deste endereço IP ('''$1''') foi bloqueada por [[User:$3|$3]].
 
 O motivo apresentado por $3 foi ''$2''",
+'cantcreateaccount-range-text' => "A criação de conta a partir dos endereços IP no intervalo '''$1''', que inclui o seu endereço IP ('''$4'''), foi bloqueada por [[User:$3|$3]].
+
+A razão dada por $3 é ''$2''",
 
 # History pages
 'viewpagelogs' => 'Ver registos para esta página',
@@ -1381,7 +1391,8 @@ Note que, se usar os links de navegação, os botões de opção voltarão aos v
 'showhideselectedversions' => 'Mostrar/ocultar versões selecionadas',
 'editundo' => 'desfazer',
 'diff-empty' => '(Sem diferenças)',
-'diff-multi' => '({{PLURAL:$1|Uma edição intermédia|$1 edições intermédias}} de {{PLURAL:$2|um utilizador|$2 utilizadores}} {{PLURAL:$1|não apresentada|não apresentadas}})',
+'diff-multi-sameuser' => '(Há {{PLURAL:$1|uma edição intermédia|$1 edições intermédias}} do mesmo utilizador que não estão a ser apresentadas)',
+'diff-multi-otherusers' => '(Há {{PLURAL:$1|uma revisão intermédia|$1 revisões intermédias}} de {{PLURAL:$2|outro utilizador|$2 utilizadores}} que não {{PLURAL:$1|está a ser apresentada|estão a ser apresentadas}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Uma edição intermédia|$1 edições intermédias}} de mais de {{PLURAL:$2|um utilizador|$2 utilizadores}} não {{PLURAL:$1|apresentada|apresentadas}})',
 'difference-missing-revision' => '{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.
 
@@ -1402,7 +1413,7 @@ Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{F
 'shown-title' => 'Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página',
 'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Há uma página com o nome \"[[:\$1]]\" nesta wiki'''",
-'searchmenu-new' => "'''Crie a página \"[[:\$1]]\" nesta wiki!'''",
+'searchmenu-new' => '<strong>Crie a página "[[:$1]]" nesta wiki!</strong> {{PLURAL:$2|0=|Veja também a página encontrada na pesquisa.|Veja também os resultados da pesquisa.}}',
 'searchprofile-articles' => 'Páginas de conteúdo',
 'searchprofile-project' => 'Páginas de ajuda e de projeto',
 'searchprofile-images' => 'Multimédia',
@@ -1427,6 +1438,7 @@ Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{F
 'searchrelated' => 'relacionados',
 'searchall' => 'todos',
 'showingresults' => "{{PLURAL:$1|É apresentado '''um''' resultado|São apresentados até '''$1''' resultados}} abaixo{{PLURAL:$1||, começando pelo '''$2'''º}}.",
+'showingresultsinrange' => 'Mostrando abaixo até {{PLURAL:$1|strong>1</strong>resultado|strong>$1</strong> resultados}} entre #<strong>$2</strong> e #<strong>$3</strong>.',
 'showingresultsnum' => "{{PLURAL:$3|É apresentado '''um''' resultado|São apresentados '''$3''' resultados}} abaixo{{PLURAL:$3||, começando pelo '''$2'''º}}.",
 'showingresultsheader' => "{{PLURAL:$5|Resultado '''$1''' de '''$3'''|Resultados '''$1–$2''' de '''$3'''}} para '''$4'''",
 'search-nonefound' => 'A pesquisa não produziu resultados.',
@@ -2532,7 +2544,7 @@ A eliminação de páginas como esta foi restringida na {{SITENAME}}, para evita
 'delete-warning-toobig' => 'Esta página tem um histórico de edições longo, com mais de $1 {{PLURAL:$1|edição|edições}}.
 Eliminá-la poderá causar problemas na base de dados da {{SITENAME}};
 prossiga com precaução.',
-'deleting-backlinks-warning' => "'''Aviso:''' Outras páginas têm ligação à página que está prestes a eliminar.",
+'deleting-backlinks-warning' => "'''Aviso:''' Outras páginas possuem ligação à ou são transcluídas da página que está prestes a eliminar.",
 
 # Rollback
 'rollback' => 'Reverter edições',
@@ -2809,7 +2821,8 @@ Consulte a [[Special:BlockList|lista de bloqueios]] para rever os bloqueios.',
 'change-blocklink' => 'alterar bloqueio',
 'contribslink' => 'contribs',
 'emaillink' => 'enviar correio electrónico',
-'autoblocker' => 'Foi automaticamente bloqueado, pois o seu endereço IP foi recentemente usado por "[[User:$1|$1]]". O motivo apresentado para o bloqueio de $1 foi: "$2".',
+'autoblocker' => 'Você foi automaticamente bloqueado, pois o seu Endereço IP foi recentemente usado por "[[User:$1|$1]]". 
+O motivo apresentado para o bloqueio de $1 é: "$2".',
 'blocklogpage' => 'Registo de bloqueio',
 'blocklog-showlog' => 'Este utilizador foi já bloqueado anteriormente.
 O registo de bloqueios é fornecido abaixo para referência:',
@@ -2914,7 +2927,7 @@ Nestes casos, terá de mover a página de discussão manualmente, ou fundi-la co
 'move-watch' => 'Vigiar esta página',
 'movepagebtn' => 'Mover página',
 'pagemovedsub' => 'Página movida com sucesso',
-'movepage-moved' => '\'\'\'"$1" foi movida para "$2"\'\'\'',
+'movepage-moved' => '<strong>"$1" foi movida para "$2"</strong>',
 'movepage-moved-redirect' => 'Foi criado um redirecionamento.',
 'movepage-moved-noredirect' => 'A criação de um redirecionamento foi suprimida.',
 'articleexists' => 'Uma página com este nome já existe, ou o nome que escolheu é inválido.
@@ -2953,10 +2966,10 @@ não é possível mover uma página para ela mesma.',
 'imageinvalidfilename' => 'O nome do ficheiro alvo é inválido',
 'fix-double-redirects' => 'Atualizar todos os redirecionamentos que apontem para o título original',
 'move-leave-redirect' => 'Criar um redirecionamento',
-'protectedpagemovewarning' => "'''Aviso:''' Esta página foi protegida de maneira a que apenas utilizadores com privilégio de administrador possam movê-la.
-O último registo é apresentado abaixo para referência:",
-'semiprotectedpagemovewarning' => "'''Nota:''' Esta página protegida de maneira a que apenas utilizadores registados possam movê-la.
-O último registo é apresentado abaixo para referência:",
+'protectedpagemovewarning' => '<strong>Aviso:</strong> Esta página foi protegida de modo que apenas os utilizadores com privilégios de administrador possam movê-la.
+A última entrada é fornecido abaixo como referência:',
+'semiprotectedpagemovewarning' => '<strong>Note:</strong> Esta página foi protegida de modo que apenas utilizadores registados a possam mover.
+A última entrada é fornecida abaixo como referência:',
 'move-over-sharedrepo' => '== O ficheiro existe ==
 [[:$1]] já existe num repositório partilhado. Mover um ficheiro para o título [[:$1]] irá sobrepô-lo ao ficheiro partilhado.',
 'file-exists-sharedrepo' => 'O nome de ficheiro que escolheu já é utilizado num repositório partilhado.
@@ -2971,8 +2984,8 @@ Para exportar páginas, introduza os títulos na caixa de texto abaixo (um títu
 Se desejar, pode utilizar um link (por exemplo, [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para a [[{{MediaWiki:Mainpage}}]]).',
 'exportall' => 'Exportar todas as páginas',
 'exportcuronly' => 'Incluir apenas a edição atual, não o histórico completo',
-'exportnohistory' => "----
-'''Nota:''' a exportação do histórico completo de páginas através deste formulário foi desativada por afetar o desempenho do sistema.",
+'exportnohistory' => '----
+<strong>Nota:</strong> A exportação do histórico completo de páginas através deste formulário foi desativada devido a motivos de desempenho.',
 'exportlistauthors' => 'Incluir uma lista completa de colaboradores para cada página',
 'export-submit' => 'Exportar',
 'export-addcattext' => 'Adicionar à lista páginas da categoria:',
@@ -2990,7 +3003,7 @@ Se desejar, pode utilizar um link (por exemplo, [[{{#Special:Export}}/{{MediaWik
 'allmessagescurrent' => 'Texto atual',
 'allmessagestext' => 'Esta é a lista das mensagens de sistema disponíveis no espaço nominal MediaWiki.
 Se deseja colaborar na localização genérica do MediaWiki, visite [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e a [//translatewiki.net translatewiki.net].',
-'allmessagesnotsupportedDB' => "Esta página não pode ser utilizada, uma vez que '''\$wgUseDatabaseMessages''' foi desativado.",
+'allmessagesnotsupportedDB' => 'Esta página não pode ser usada porque a <strong>$wgUseDatabaseMessages</strong> foi desativada.',
 'allmessages-filter-legend' => 'Filtro',
 'allmessages-filter' => 'Filtrar pelo estado de personalização:',
 'allmessages-filter-unmodified' => 'Não modificadas',
@@ -3053,7 +3066,7 @@ O ficheiro foi recebido parcialmente.',
 Não há um diretório temporário.',
 'import-parse-failure' => 'Falha ao importar dados XML',
 'import-noarticle' => 'Sem páginas para importar!',
-'import-nonewrevisions' => 'Todas as revisões já tinham sido importadas anteriormente.',
+'import-nonewrevisions' => 'Nenhuma revisão foi importada (já estavam todas presentes ou foram ignoradas devido a erros).',
 'xml-error-string' => '$1 na linha $2, coluna $3 (byte $4): $5',
 'import-upload' => 'Enviar dados em XML',
 'import-token-mismatch' => 'Perda dos dados da sessão. Tente novamente, por favor.',
@@ -3197,8 +3210,8 @@ Este bloqueio foi provavelmente causado por um link para um site externo que con
 'spam_reverting' => 'A reverter para a última revisão que não contém links para $1',
 'spam_blanking' => 'Todas as revisões continham links para $1; a esvaziar',
 'spam_deleting' => 'Todas as revisões continham links para $1; a eliminar',
-'simpleantispam-label' => "Verificação contra spam
-'''NÃO''' preencha isto!",
+'simpleantispam-label' => 'Verificação contra spam.
+<strong>NÃO</strong> preencha isto!',
 
 # Info page
 'pageinfo-title' => 'Informações sobre "$1"',
@@ -3287,9 +3300,9 @@ $1',
 'nextdiff' => 'Edição posterior →',
 
 # Media information
-'mediawarning' => "'''Aviso''': Este tipo de ficheiro pode conter código malicioso.
-Executá-lo poderá comprometer a segurança do seu sistema.",
-'imagemaxsize' => "Limite de tamanho de imagens:<br />''(para páginas de descrição)''",
+'mediawarning' => '<strong>AVISO:</strong> Este tipo de arquivo pode conter código malicioso.
+Se o executar, o seu sistema pode ficar comprometido.',
+'imagemaxsize' => 'Tamanho limite da imagem:<br /><em>(para páginas com descrições de arquivos)</em>',
 'thumbsize' => 'Tamanho de miniaturas:',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|página|páginas}}',
 'file-info' => 'tamanho: $1, tipo MIME: $2',
@@ -3308,12 +3321,12 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
 'file-info-png-looped' => 'ciclo infinito',
 'file-info-png-repeat' => 'reproduzido $1 {{PLURAL:$1|vez|vezes}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|fotograma|fotogramas}}',
-'file-no-thumb-animation' => "'''Nota: Devido a limitações técnicas, miniaturas deste ficheiro não serão animadas.'''",
-'file-no-thumb-animation-gif' => "'''Nota: Devido a limitações técnicas, miniaturas de imagens GIF de alta resolução tais como esta não serão animadas.'''",
+'file-no-thumb-animation' => '<strong>Nota: Devido a limitações técnicas, miniaturas deste ficheiro não serão animadas.</strong>',
+'file-no-thumb-animation-gif' => '<strong>Nota: Devido a limitações técnicas, miniaturas de GIFs com imagens de alta resolução como este não serão animadas.</strong>',
 
 # Special:NewFiles
 'newimages' => 'Galeria de novos ficheiros',
-'imagelisttext' => "Abaixo é apresentada uma lista {{PLURAL:$1|de '''um''' ficheiro, organizado|de '''$1''' ficheiros, organizados}} $2.",
+'imagelisttext' => 'Abaixo está uma lista de <strong>$1</strong> {{PLURAL:$1|ficheiro|ficheiros}} ordenados $2.',
 'newimages-summary' => 'Esta página especial mostra os ficheiros mais recentemente enviados.',
 'newimages-legend' => 'Filtrar',
 'newimages-label' => 'Nome de ficheiro (ou parte dele):',
@@ -3847,10 +3860,10 @@ Este código de confirmação expira a $4.',
 'scarytranscludetoolong' => '[URL longa demais]',
 
 # Delete conflict
-'deletedwhileediting' => "'''Aviso''': Esta página foi eliminada após ter começado a editá-la!",
-'confirmrecreate' => "Enquanto você editava esta página, o utilizador [[User:$1|$1]] ([[User talk:$1|Discussão]]) eliminou-a pelo seguinte motivo:
-: ''$2''
-Confirme que deseja realmente recriar esta página, por favor.",
+'deletedwhileediting' => '<strong>AVISO:</strong> Esta página foi eliminada depois de você ter começado a editá-la!',
+'confirmrecreate' => 'Depois de você ter começado a editar esta página, o utilizador [[User:$1|$1]] ([[User talk:$1|conversar]]) eliminou-a pelo seguinte motivo:
+: <em>$2</em>
+Por favor, confirme que você quer realmente recriar esta página.',
 'confirmrecreate-noreason' => 'O utilizador [[User:$1|$1]] ([[User talk:$1|discussão]]) eliminou esta página depois de você ter começado a editá-la. Confirme que deseja recriar a página, por favor.',
 'recreate' => 'Recriar',
 
@@ -3939,7 +3952,7 @@ Também pode [[Special:EditWatchlist|editar a lista da maneira convencional]].',
 
 # Core parser functions
 'unknown_extension_tag' => '"$1" é uma tag de extensão desconhecida',
-'duplicate-defaultsort' => 'Aviso: A chave de ordenação padrão "$2" sobrepõe-se à anterior chave de ordenação padrão "$1".',
+'duplicate-defaultsort' => '<strong>Aviso:</strong> A chave de ordenação padrão "$2" sobrepõe-se à anterior "$1".',
 
 # Special:Version
 'version' => 'Versão',
@@ -3959,7 +3972,7 @@ Também pode [[Special:EditWatchlist|editar a lista da maneira convencional]].',
 'version-version' => '(Versão $1)',
 'version-license' => 'Licença do MediaWiki',
 'version-credits-not-found' => 'Nenhuma informação detalhada acerca dos créditos foi encontrada para esta extensão.',
-'version-poweredby-credits' => "Esta é uma wiki '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-credits' => 'Esta wiki é potenciada por <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.',
 'version-poweredby-others' => 'outros',
 'version-credits-summary' => 'Gostaríamos de reconhecer as seguintes pessoas pela sua contribuição para o [[Special:Version|MediaWiki]].',
 'version-license-info' => 'O MediaWiki é software livre; pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License, tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.
@@ -4133,7 +4146,7 @@ Caso contrário, pode facilmente usar o formulário abaixo. O seu comentário se
 'feedback-error1' => 'Erro: O resultado da API não foi reconhecido',
 'feedback-error2' => 'Erro: A edição falhou',
 'feedback-error3' => 'Erro: A API não responde',
-'feedback-thanks' => 'Obrigado! O seu comentário foi adicionado à página "[ $2  $1 ]".',
+'feedback-thanks' => 'Obrigado! O seu comentário foi adicionado à página "[$2 $1]".',
 'feedback-close' => 'Feito',
 'feedback-bugcheck' => 'Perfeito! Verifique apenas que não é já um dos [$1 defeitos conhecidos].',
 'feedback-bugnew' => 'Eu verifiquei. Comunicar um novo defeito.',
index 4d28ef7..592a920 100644 (file)
@@ -24,6 +24,7 @@
  * @author Dicionarista
  * @author Diego Queiroz
  * @author Eduardo.mps
+ * @author Elival
  * @author Emufarmers
  * @author Everton137
  * @author Francisco Leandro
@@ -36,6 +37,7 @@
  * @author Helder.wiki
  * @author Jaideraf
  * @author Jesielt
+ * @author Jgpacker
  * @author Jorge Morais
  * @author Kaganer
  * @author Leonardo.stabile
@@ -46,6 +48,7 @@
  * @author Malafaya
  * @author ManoDbo
  * @author Matheus Sousa L.T
+ * @author Matma Rex
  * @author McDutchie
  * @author MetalBrasil
  * @author MisterSanderson
@@ -329,7 +332,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Sublinhar links:',
-'tog-justify' => 'Justificar parágrafos',
 'tog-hideminor' => 'Ocultar edições menores nas mudanças recentes',
 'tog-hidepatrolled' => 'Ocultar edições patrulhadas nas mudanças recentes',
 'tog-newpageshidepatrolled' => 'Ocultar páginas patrulhadas da lista de páginas novas',
@@ -492,7 +494,6 @@ $messages = array(
 'vector-action-protect' => 'Proteger',
 'vector-action-undelete' => 'Restaurar',
 'vector-action-unprotect' => 'Alterar a proteção',
-'vector-simplesearch-preference' => 'Ativar barra simplificada de buscas (apenas no skin Vector)',
 'vector-view-create' => 'Criar',
 'vector-view-edit' => 'Editar',
 'vector-view-history' => 'Ver histórico',
@@ -888,6 +889,8 @@ Se você optar por fornecê-lo, este nome será utilizado para dar ao usuário a
 'retypenew' => 'Reintroduza a nova senha',
 'resetpass_submit' => 'Definir senha e entrar',
 'changepassword-success' => 'Sua senha foi alterada com sucesso!',
+'changepassword-throttled' => 'Você realizou demasiadas tentativas de se registrar.
+Por favor, aguarde $1 antes de tentar novamente.',
 'resetpass_forbidden' => 'As senhas não podem ser alteradas',
 'resetpass-no-info' => 'Você precisa estar autenticado para acessar esta página diretamente.',
 'resetpass-submit-loggedin' => 'Alterar senha',
@@ -943,6 +946,8 @@ Senha temporária: $2',
 'changeemail-password' => 'Sua senha para o wiki {{SITENAME}}:',
 'changeemail-submit' => 'Alterar e-mail',
 'changeemail-cancel' => 'Cancelar',
+'changeemail-throttled' => 'Você realizou demasiadas tentativas de se registrar.
+Por favor, aguarde $1 antes de tentar novamente.',
 
 # Special:ResetTokens
 'resettokens' => 'Reiniciar os tokens',
@@ -1165,7 +1170,7 @@ Ela já existia.',
 'invalid-content-data' => 'Dados de conteúdo inválidos',
 'content-not-allowed-here' => 'Conteúdo do tipo "$1" não é permitido na página [[$2]]',
 'editwarning-warning' => 'Abandonar esta página pode fazer com que você perca todas as alterações que fez.
-Se você estiver autenticado, você pode desabilitar este aviso na seção "Edição" de suas preferências.',
+Se você estiver autenticado, você pode desabilitar este aviso na seção {{int:prefs-editing}}"  de suas preferências.',
 'editpage-notsupportedcontentformat-title' => 'Formato do conteúdo não suportado',
 'editpage-notsupportedcontentformat-text' => 'O formato de conteúdo $1 não é suportando pelo modelo de conteúdo $2.',
 
@@ -1201,6 +1206,7 @@ Estes argumentos foram omitidos.',
 'undo-success' => 'A edição pôde ser desfeita. Por gentileza, verifique o comparativo a seguir para se certificar de que é isto que deseja fazer, salvando as alterações após ter terminado de revisá-las.',
 'undo-failure' => 'A edição não pôde ser desfeita devido a alterações intermediárias conflitantes.',
 'undo-norev' => 'A edição não pôde ser desfeita porque não existe ou foi apagada.',
+'undo-nochange' => 'Parece que a edição já foi desfeita.',
 'undo-summary' => 'Desfeita a edição $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussão]])',
 'undo-summary-username-hidden' => 'Desfazer a revisão $1 de um usuário oculto',
 
@@ -1209,6 +1215,9 @@ Estes argumentos foram omitidos.',
 'cantcreateaccount-text' => "Este IP ('''$1''') foi bloqueado de criar novas contas por [[User:$3|$3]].
 
 A justificativa apresentada por $3 foi ''$2''",
+'cantcreateaccount-range-text' => "A criação de conta a partir dos endereços IP no intervalo '''$1''', que inclui o seu endereço IP ('''$4'''), foi bloqueada por [[User:$3|$3]].
+
+A razão dada por $3 é ''$2''",
 
 # History pages
 'viewpagelogs' => 'Ver registros para esta página',
@@ -1377,7 +1386,8 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
 'showhideselectedversions' => 'Exibir/ocultar edições selecionadas',
 'editundo' => 'desfazer',
 'diff-empty' => '(Sem diferença)',
-'diff-multi' => '({{PLURAL:$1|Uma edição intermediária|$1 edições intermediárias}} de {{PLURAL:$2|um usuário|$2 usuários}} {{PLURAL:$1|não apresentada|não apresentadas}})',
+'diff-multi-sameuser' => '({{PLURAL:$1|Uma revisão intermediária|$1 revisões intermediárias}} pelo mesmo usuário não estão sendo mostradas)',
+'diff-multi-otherusers' => '({{PLURAL:$1|Uma revisão intermediária por {{PLURAL:$2|um outro usuário|$2 usuários}} não está sendo mostrada|$1 revisões intermediárias por {{PLURAL:$2|um outro usuário|$2 usuários}} não estão sendo mostradas}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Uma edição intermediária|$1 edições intermediárias}} de mais de {{PLURAL:$2|um usuário|$2 usuário}} não {{PLURAL:$1|apresentada|apresentadas}})',
 'difference-missing-revision' => '{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.
 
@@ -1398,7 +1408,7 @@ Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{F
 'shown-title' => 'Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página',
 'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Há uma página com o nome \"[[:\$1]]\" nesta wiki'''",
-'searchmenu-new' => "'''Criar a página \"[[:\$1|\$1]]\" nesta wiki!'''",
+'searchmenu-new' => '<strong>Criar a página "[[:$1]]" nesta wiki!</strong>{{PLURAL:$2|0=| Veja também a página encontrada com sua pesquisa.|Veja também os resultados das pesquisas encontradas.}}',
 'searchprofile-articles' => 'Páginas de conteúdo',
 'searchprofile-project' => 'Ajuda e páginas de projeto',
 'searchprofile-images' => 'Multimídia',
@@ -1414,6 +1424,7 @@ Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{F
 'search-result-score' => 'Relevância: $1%',
 'search-redirect' => '(redirecionamento de $1)',
 'search-section' => '(seção $1)',
+'search-file-match' => '(coincide com o conteúdo do arquivo)',
 'search-suggest' => 'Você quis dizer: $1',
 'search-interwiki-caption' => 'Projetos irmãos',
 'search-interwiki-default' => 'Resultados de $1:',
@@ -2256,6 +2267,12 @@ Entradas <del>riscadas</del> foram resolvidas.',
 'protectedpages-cascade' => 'Apenas proteções progressivas',
 'protectedpages-noredirect' => 'Ocultar redirecionamentos',
 'protectedpagesempty' => 'Neste momento, nenhuma das páginas está protegida com estes parâmetros.',
+'protectedpages-timestamp' => 'Data e hora',
+'protectedpages-page' => 'Página',
+'protectedpages-expiry' => 'Expira',
+'protectedpages-reason' => 'Motivo',
+'protectedpages-unknown-timestamp' => 'Desconhecido',
+'protectedpages-unknown-performer' => 'Usuário desconhecido',
 'protectedtitles' => 'Títulos protegidos',
 'protectedtitlesempty' => 'Neste momento, nenhum dos títulos está protegido com estes parâmetros.',
 'listusers' => 'Lista de usuários',
@@ -2531,7 +2548,7 @@ A eliminação de tais páginas foi restrita, a fim de se evitarem problemas aci
 'delete-warning-toobig' => 'Esta página possui um longo histórico de edições, com mais de $1 {{PLURAL:$1|edição|edições}}.
 Eliminá-la poderá causar problemas na base de dados de {{SITENAME}};
 prossiga com cuidado.',
-'deleting-backlinks-warning' => "'''Cuidado:''' Outras páginas redirecionam para a página que você está prestes a deletar.",
+'deleting-backlinks-warning' => "'''Cuidado:''' Outras páginas se ligam ou redirecionam para a página que você está prestes a deletar.",
 
 # Rollback
 'rollback' => 'Reverter edições',
@@ -2806,7 +2823,8 @@ Consulte a [[Special:BlockList|lista de bloqueios]].',
 'change-blocklink' => 'alterar bloqueio',
 'contribslink' => 'contribs',
 'emaillink' => 'enviar um e-mail',
-'autoblocker' => 'Você foi automaticamente bloqueado, pois partilha um endereço de IP com "[[User:$1|$1]]". O motivo apresentado foi: "$2".',
+'autoblocker' => 'Você foi automaticamente bloqueado, pois o seu Endereço IP foi recentemente usado por "[[User:$1|$1]]". 
+O motivo apresentado para o bloqueio de $1 é: "$2".',
 'blocklogpage' => 'Registro de bloqueio',
 'blocklog-showlog' => 'Este usuário já foi bloqueado anteriormente.
 O registro de bloqueio é fornecido abaixo, para referência:',
@@ -2828,7 +2846,7 @@ Consulte a [[Special:BlockList|lista de bloqueios]] para obter a lista de bloque
 'range_block_disabled' => 'A funcionalidade de bloquear gamas de IPs encontra-se desativada.',
 'ipb_expiry_invalid' => 'Tempo de expiração inválido.',
 'ipb_expiry_temp' => 'Bloqueios com nome de usuário ocultado devem ser permanentes.',
-'ipb_hide_invalid' => 'Não foi possível suprimir esta conta; ela poderá ter demasiadas edições.',
+'ipb_hide_invalid' => 'Não foi possível suprimir esta conta; ela tem mais de {{PLURAL:$1|uma}}edições.',
 'ipb_already_blocked' => '"$1" já se encontra bloqueado',
 'ipb-needreblock' => '$1 já se encontra bloqueado. Deseja alterar as configurações?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Outro bloqueio|Outros bloqueios}}',
@@ -2994,6 +3012,7 @@ Acesse [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [/
 'allmessages-prefix' => 'Filtrar por prefixo:',
 'allmessages-language' => 'Língua:',
 'allmessages-filter-submit' => 'Ir',
+'allmessages-filter-translate' => 'Traduzir',
 
 # Thumbnails
 'thumbnail-more' => 'Ampliar',
@@ -3044,7 +3063,7 @@ Salve o arquivo no seu computador e importe-o aqui.',
 'importuploaderrortemp' => 'O envio do arquivo a ser importado falhou. Não há um diretório temporário.',
 'import-parse-failure' => 'Falha ao importar dados XML',
 'import-noarticle' => 'Sem páginas para importar!',
-'import-nonewrevisions' => 'Todas as edições já haviam sido importadas.',
+'import-nonewrevisions' => 'Nenhuma revisão foi importada (já estavam todas presentes ou foram ignoradas devido a erros).',
 'xml-error-string' => '$1 na linha $2, coluna $3 (byte $4): $5',
 'import-upload' => 'Enviar dados em XML',
 'import-token-mismatch' => 'Perda dos dados da sessão. Por favor tente novamente.',
@@ -3934,7 +3953,7 @@ Você também pode [[Special:EditWatchlist|editar a lista da maneira convenciona
 'version-antispam' => 'Prevenção contra spam',
 'version-skins' => 'Temas',
 'version-other' => 'Diversos',
-'version-mediahandlers' => 'Executores de média',
+'version-mediahandlers' => 'Executores de mídia',
 'version-hooks' => 'Hooks',
 'version-parser-extensiontags' => 'Etiquetas de extensões de tipo "parser"',
 'version-parser-function-hooks' => 'Funções "hooks" de "parser"',
@@ -4128,7 +4147,7 @@ Caso contrário, você poderá usar o formulário simplificado a seguir. Seu com
 'feedback-error1' => 'Erro: O resultado da API não foi reconhecido',
 'feedback-error2' => 'Erro: A edição falhou',
 'feedback-error3' => 'Erro: A API não responde',
-'feedback-thanks' => 'Obrigado! O seu comentário foi adicionado à página "[ $2  $1 ]".',
+'feedback-thanks' => 'Obrigado! O seu comentário foi adicionado à página "[$2 $1]".',
 'feedback-close' => 'Feito',
 'feedback-bugcheck' => 'Perfeito! Apenas verifique se não é um dos [$1 bugs já conhecidos].',
 'feedback-bugnew' => 'Eu verifiquei. Relatar um bug novo',
@@ -4207,7 +4226,7 @@ Caso contrário, você poderá usar o formulário simplificado a seguir. Seu com
 'limitreport-templateargumentsize' => 'Argumento do tamanho da predefinição',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
 'limitreport-expansiondepth' => 'Máxima profundidade de expansão',
-'limitreport-expensivefunctioncount' => 'Número de funções do analisador custosas',
+'limitreport-expensivefunctioncount' => 'Contagem de funções do analisador custosas',
 
 # Special:ExpandTemplates
 'expandtemplates' => 'Expandir predefinições',
index 341bcfc..f47dec1 100644 (file)
  * @author Huji
  * @author IAlex
  * @author INkubusse
+ * @author Incnis Mrsi
  * @author Iniquity
  * @author Iwan Novirion
  * @author Jon Harald Søby
  * @author Joseph
+ * @author Kaganer
  * @author Karduelis
  * @author Kazu89
  * @author Kghbln
@@ -89,6 +91,7 @@
  * @author Mihai
  * @author Minh Nguyen
  * @author Moha
+ * @author MongolWiki
  * @author Mormegil
  * @author Mpradeep
  * @author Murma174
 $messages = array(
 # User preference toggles
 'tog-underline' => "[[Special:Preferences]], tab 'Misc'. Offers user a choice how to underline links. {{Gender}}",
-'tog-justify' => "[[Special:Preferences]], tab 'Appearance'. Offers user a choice to justify paragraphs or not. {{Gender}}",
 'tog-hideminor' => "[[Special:Preferences]], tab 'Recent changes'. Offers user to hide minor edits in recent changes or not. {{Gender}}",
 'tog-hidepatrolled' => 'Option in Recent changes tab of [[Special:Preferences]] (if [[mw:Manual:$wgUseRCPatrol|$wgUseRCPatrol]] is enabled). {{Gender}}',
 'tog-newpageshidepatrolled' => 'Toggle in [[Special:Preferences]], section "Recent changes" (if [[mw:Manual:$wgUseRCPatrol|$wgUseRCPatrol]] is enabled). {{Gender}}',
@@ -397,15 +399,14 @@ Parameters:
 'category-subcat-count' => 'This message is displayed at the top of a category page showing the number of pages in the category.
 
 Parameters:
-* $1 - number of subcategories shown
 * $2 - total number of subcategories in category',
 'category-subcat-count-limited' => 'This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted.
 
 Parameters:
 * $1 - number of subcategories shown',
 'category-article-count' => 'This message is used on category pages. Parameters:
-* $1 - number of pages shown
-* $2 - total number of pages in category',
+* $1  number of pages shown
+* $2  total number of pages in category',
 'category-article-count-limited' => 'This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted.
 
 Parameters:
@@ -413,8 +414,8 @@ Parameters:
 'category-file-count' => 'This message is displayed at the top of a category page showing the number of pages in the category.
 
 Parameters:
-* $1 - number of files shown
-* $2 - total number of files in category',
+* $1  number of files shown
+* $2  total number of files in category',
 'category-file-count-limited' => 'This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted.
 
 Parameters:
@@ -507,7 +508,6 @@ This page is only linked in CologneBlue (an old skin), not in Monobook or Vector
 {{Identical|Undelete}}',
 'vector-action-unprotect' => 'Tab at top of page, in vector skin.
 {{Identical|Change protection}}',
-'vector-simplesearch-preference' => 'Preference for enhanced search suggestion in the Vector skin.',
 'vector-view-create' => 'Tab label in the Vector skin. See for example {{canonicalurl:Foo|useskin=vector}}
 {{Identical|Create}}',
 'vector-view-edit' => 'Tab label in the Vector skin. See for example {{canonicalurl:Main_Page|useskin=vector}}
@@ -2181,9 +2181,7 @@ Parameters:
 'content-not-allowed-here' => 'Error message indicating that the desired content model is not supported in given localtion.
 * $1 - the human readable name of the content model: {{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}
 * $2 - the title of the page in question',
-'editwarning-warning' => "{{doc-important|Do ''not'' use <nowiki>{{int:prefs-editing}}</nowiki> for \"Editing\". It is forbidden in this message, see [[mwr:68405]].}}
-
-but you can see the text of that button here: {{msg-mw|Prefs-editing}}",
+'editwarning-warning' => 'Uses {{msg-mw|Prefs-editing}}',
 'editpage-notsupportedcontentformat-title' => 'Title of error page shown when using an incompatible format on EditPage',
 'editpage-notsupportedcontentformat-text' => 'Error message shown when using an incompatible format on EditPage. Parameters:
 * $1 - the format id
@@ -2300,10 +2298,21 @@ See also:
 {{Identical|Undo}}',
 'undo-failure' => 'Message appears if an attempt to revert an edit by clicking the "undo" link on the page history fails.
 
+See also:
+* {{msg-mw|Undo-norev}}
+* {{msg-mw|Undo-nochange}}
 {{Identical|Undo}}',
 'undo-norev' => 'Message appears if an attempt to revert an edit by clicking the "undo" link on the page history fails.
 
+See also:
+* {{msg-mw|Undo-failure}}
+* {{msg-mw|Undo-nochange}}
 {{Identical|Undo}}',
+'undo-nochange' => 'Message appears if an attempt to revert an edit by clicking the "undo" link results in an edit making no change to the current version of the page.
+
+See also:
+* {{msg-mw|Undo-failure}}
+* {{msg-mw|Undo-norev}}',
 'undo-summary' => 'Edit summary for an undo action. Parameters:
 * $1 - revision ID
 * $2 - username
@@ -2809,20 +2818,23 @@ See also:
 This message has sometimes a tooltip {{msg-mw|tooltip-undo}}
 {{Identical|Undo}}',
 'diff-empty' => 'This message appears instead of a "diff" when comparing two revisions that are identical.',
-'diff-multi' => "This message appears in the revision history of a page when comparing two versions which aren't consecutive.
+'diff-multi-sameuser' => "This message appears in the revision history of a page when comparing two versions which aren't consecutive, and the intermediate revisions were all created by the same user as the new revision.
 
 Parameters:
 * $1 - the number of revisions
-* $2 - the number of distinct users who made those revisions
-See also:
-* {{msg-mw|Diff-multi-manyusers}}",
+{{Related|Diff-multi}}",
+'diff-multi-otherusers' => "This message appears in the revision history of a page when comparing two versions which aren't consecutive, and at least one of the intermediate revisions was created by a user other than the user who created the new revision.
+
+Parameters:
+* $1 - the number of revisions
+* $2 - the number of distinct other users who made those revisions
+{{Related|Diff-multi}}",
 'diff-multi-manyusers' => "This message appears in the revision history of a page when comparing two versions which aren't consecutive, and the intermediate revisions have been edited by more than 100 users.
 
 Parameters:
 * $1 - the number of revisions, will always be 101 or more
 * $2 - the number of users that were found, which was limited at 100
-See also:
-* {{msg-mw|Diff-multi}}",
+{{Related|Diff-multi}}",
 'difference-missing-revision' => 'Text displayed when the requested revision does not exist using a diff link.
 
 Example: [{{canonicalurl:Project:News|diff=426850&oldid=99999999}} Diff with invalid revision#]
@@ -2978,6 +2990,12 @@ Parameters:
 * $2 - the number of the first item listed
 See also:
 * {{msg-mw|Showingresultsnum}}',
+'showingresultsinrange' => 'Used in pagination of [[Special:MostLinkedCategories]]. Parameters:
+* $1 - the total number of results in the batch shown
+* $2 - the number of the first item listed
+* $3 - the number of last item in the batch shown
+
+See also {{msg-mw|Showingresults}}',
 'showingresultsnum' => 'Parameters:
 * $1 - (Unused) the total number of results in the batch shown
 * $2 - the first number in the batch of results
@@ -4661,7 +4679,7 @@ Parameters:
 'shared-repo-name-wikimediacommons' => '{{optional}}
 {{Identical|Wikimedia Commons}}',
 'filepage.css' => '{{Optional}}',
-'upload-disallowed-here' => 'This message appears on an image page in place of the normal reupload link if they cannot upload - e.g. if the image page is upload protected and they do not have the right priviledge.',
+'upload-disallowed-here' => 'This message appears on an image page in place of the normal reupload link if they cannot upload - e.g. if the image page is upload protected and they do not have the right privilege.',
 
 # File reversion
 'filerevert' => 'Used as page title. Parameters:
@@ -5000,11 +5018,34 @@ See the following search results:
 'deadendpagestext' => 'Introductory text for [[Special:DeadendPages]]',
 'protectedpages' => '{{doc-special|ProtectedPages}}',
 'protectedpages-indef' => 'Option in [[Special:ProtectedPages]]',
+'protectedpages-summary' => 'Summary of [[Special:ProtectedPages]].
+
+See also:
+* {{msg-mw|Protectedtitles-summary}}',
 'protectedpages-cascade' => 'Option in [[Special:ProtectedPages]]',
 'protectedpages-noredirect' => 'Option in [[Special:ProtectedPages]].
 {{Identical|Hide redirect}}',
 'protectedpagesempty' => 'Used in [[Special:ProtectedPages]], when there are no protected pages with the specified parameters.',
+'protectedpages-timestamp' => 'This is a column header for dates and times in the table on the page [[Special:ProtectedPages]].
+{{Identical|Timestamp}}',
+'protectedpages-page' => 'This is a column header in the table on the page [[Special:ProtectedPages]].
+{{Identical|Page}}',
+'protectedpages-expiry' => 'This is a column header in the table on the page [[Special:ProtectedPages]].
+
+This refers to expiry timestamp.
+{{Identical|Expire}}',
+'protectedpages-performer' => 'This is a column header in the table on the page [[Special:ProtectedPages]].',
+'protectedpages-params' => 'This is a column header in the table on the page [[Special:ProtectedPages]].',
+'protectedpages-reason' => 'This is a column header in the table on the page [[Special:ProtectedPages]].
+{{Identical|Reason}}',
+'protectedpages-unknown-timestamp' => 'This is shown, when the date and time is unknown for a protection on the page [[Special:ProtectedPages]].
+{{Identical|Unknown}}',
+'protectedpages-unknown-performer' => 'This is shown, when the protecting user is unknown for a protection on the page [[Special:ProtectedPages]].',
 'protectedtitles' => '{{doc-special|ProtectedTitles}}',
+'protectedtitles-summary' => 'Summary of [[Special:ProtectedTitles]].
+
+See also:
+* {{msg-mw|Protectedpages-summary}}',
 'protectedtitlesempty' => 'Used on [[Special:ProtectedTitles]]. This text appears if the list of protected titles is empty. See the [[mw:Project:Protected_titles|help page on MediaWiki]] for more information.',
 'listusers' => '{{doc-special|ListUsers}}',
 'listusers-editsonly' => 'Option in [[Special:ListUsers]].',
@@ -7260,6 +7301,10 @@ See also:
 *$1 is a function name of the GD library',
 'thumbnail_image-missing' => 'This is the parameter 1 of the message {{msg-mw|thumbnail error}}.
 *$1 is the path incl. filename of the missing image',
+'thumbnail_image-failure-limit' => 'Used as <code>$1</code> in {{msg-mw|Thumbnail error}}.
+
+Parameters:
+* $1 - the maximum allowed number of failed attempts',
 
 # Special:Import
 'import' => 'The title of the special page [[Special:Import]];',
@@ -7437,6 +7482,12 @@ Parameters:
 * $3 - the content model reported for the offending revision in the dump that is being imported
 * $4 - the serialization format reported for the offending revision in the dump that is being imported
 {{Related|Import-error}}',
+'import-error-bad-location' => 'Parameters:
+* $1 - page title
+* $2 - revision ID
+* $3 - content model
+* $4 - (Unused) format
+{{Related|Import-error}}',
 'import-options-wrong' => 'Used as error message on [[Special:Import]], when one of the options has an error.
 
 Parameters:
@@ -8522,9 +8573,23 @@ Variant option for wikis with variants conversion enabled.',
 
 # Variants for Serbian language
 'variantname-sr-ec' => '{{optional}}
-Varient Option for wikis with variants conversion enabled.',
+Variant Option for wikis with variants conversion enabled.
+
+Note that <code>sr-ec</code> is not a conforming BCP47 language tag. Wikis should be migrated by:
+* allowing it only as a legacy alias of the preferred tag <code>sr-cyrl</code> (possibly insert a tracking category in templates as long as they must support the legacy tag),
+* making the new tag the default to look first, before looking for the old tag,
+* moving the translations to the new code by renaming them,
+* checking links in source pages still using the legacy tag to change it to the new tag,
+* possibly cleanup the redirect pages.',
 'variantname-sr-el' => '{{optional}}
-Varient Option for wikis with variants conversion enabled.',
+Variant Option for wikis with variants conversion enabled.
+
+Note that <code>sr-el</code> is not a conforming BCP47 language tag. Wikis should be migrated by:
+* allowing it only as a legacy alias of the preferred tag <code>sr-latn</code> (possibly insert a tracking category in templates as long as they must support the legacy tag),
+* making the new tag the default to look first, before looking for the old tag,
+* moving the translations to the new code by renaming them,
+* checking links in source pages still using the legacy tag to change it to the new tag,
+* possibly cleanup the redirect pages.',
 'variantname-sr' => '{{optional}}
 Varient Option for wikis with variants conversion enabled.',
 
@@ -9598,7 +9663,11 @@ px is the abbreviation for "pixel".',
 
 # Separators for various lists, etc.
 'semicolon-separator' => '{{optional}}',
-'comma-separator' => '{{optional}}',
+'comma-separator' => '{{optional}}
+
+Warning: languages have different usages of punctuation, and sometimes they are swapped (e.g. openining and closing quotation marks, or full stop and colon in Armenian), or change their form (the full stop in Chinese and Japanese, the prefered "colon" in Armenian used in fact as the regular full stop, the comma in Arabic, Armenian, and Chinese...)
+
+Their spacing (before or after) may also vary across languages (for example French requires a non-breaking space, preferably narrow if the browser supports NNBSP, on the inner side of some punctuations like quotation/question/exclamation marks, colon, and semicolons).',
 'colon-separator' => "{{optional}}
 Change it only if your language uses another character for ':' or it needs an extra space before the colon.",
 'pipe-separator' => '{{optional}}',
@@ -9616,7 +9685,7 @@ Quotation marks, for quoting, sometimes titles etc., depending on the language.
 
 See: [[w:Non-English usage of quotation marks|Non-English usage of quotation marks on Wikipedia]].
 
-Parameters: 
+Parameters:
 * $1 - text to be wrapped in quotation marks',
 
 # Multipage image navigation
@@ -9720,7 +9789,7 @@ Bitrate (of a file, typically) in kilobits (1 kilobit = 1000 bits).',
 'bitrate-megabits' => '{{optional}}
 Bitrate (of a file, typically) in megabits (1 megabits = 1000×1000 bits).',
 'bitrate-gigabits' => '{{optional}}
-Bitrate (of a file, typically) in gibibits (1 gigabits = 1000×1000×1000 bits).',
+Bitrate (of a file, typically) in gigabits (1 gigabits = 1000×1000×1000 bits).',
 'bitrate-terabits' => '{{optional}}
 Bitrate (of a file, typically) in terabits (1 terabits = 1000×1000×1000×1000 bits).',
 'bitrate-petabits' => '{{optional}}
@@ -9995,7 +10064,9 @@ There are no such extensions here, so look at [[wikipedia:Special:Version]] for
 'version-parser-extensiontags' => 'Part of [[Special:Version]].
 This message is followed by the list of parser extension tags like <code><nowiki><charinsert></nowiki></code>, <code><nowiki><coordinates></nowiki></code>, etc.',
 'version-parser-function-hooks' => 'Shown in [[Special:Version]]',
-'version-hook-name' => 'Shown in [[Special:Version]]',
+'version-hook-name' => 'Shown in [[Special:Version]].
+
+For meaning of hook see [[mw:Special:MyLanguage/Manual:Hooks|mw:Manual:Hooks]] and [[w:Hooking]].',
 'version-hook-subscribedby' => 'Shown in [[Special:Version]]',
 'version-version' => '{{Optional}}
 Used in [[Special:Version]]. Preceded by the MediaWiki extension name.
@@ -10674,6 +10745,5 @@ test
 'expand_templates_preview' => '{{Identical|Preview}}',
 
 # Unknown messages
-'createaccount-hook-aborted' => 'Placeholder message to return with API errors on account create; passes through the message from a hook {{notranslate}}',
 'uploadinvalidxml' => 'Error message displayed when the uploaded file contains XML that cannot be properly parsed and checked.',
 );
index 3c6dee6..6c04416 100644 (file)
@@ -265,7 +265,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => "T'inkikunata uranpi sikwiy",
-'tog-justify' => 'Rakirikunata paqtachiy',
 'tog-hideminor' => '«Ñaqha hukchasqa» nisqapi aslla hukchasqakunata pakay',
 'tog-hidepatrolled' => "Patrullasqa llamk'apusqakunata ñaqha hukchasqapi pakay",
 'tog-newpageshidepatrolled' => "Patrullasqa llamk'apusqakunata musuq p'anqakunapi pakay",
@@ -428,7 +427,6 @@ $messages = array(
 'vector-action-protect' => 'Amachay',
 'vector-action-undelete' => 'Qullusqata paqarichiy',
 'vector-action-unprotect' => 'Amachayta wakinchay',
-'vector-simplesearch-preference' => 'Maskanapaq sikllallachasqa sinruta atichiy (Vector qarallapi)',
 'vector-view-create' => 'Kamariy',
 'vector-view-edit' => "Llamk'apuy",
 'vector-view-history' => 'Wiñay kawsayta qhaway',
@@ -536,7 +534,7 @@ $1",
 'youhavenewmessagesfromusers' => '$1 {{PLURAL:$3|huk ruraqmanta|$3 ruraqkunamanta}} qhawanayki kachkan ($2).',
 'youhavenewmessagesmanyusers' => '$1 achka ruraqkunamanta qhawanayki kachkan ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|Musuq willaymi|Musuq willaykunam}}',
-'newmessagesdifflinkplural' => 'qayna {{PLURAL:$1|hukchasqapi|hukchasqakunapi}} wakin kaynin',
+'newmessagesdifflinkplural' => 'ñaqha {{PLURAL:$1|hukchasqa|hukchasqakuna}}',
 'youhavenewmessagesmulti' => 'Musuq willaykunam qhawanayki kachkan $1-pi',
 'editsection' => "llamk'apuy",
 'editold' => "llamk'apuy",
@@ -661,7 +659,7 @@ Amachaq kamachiqqa kayrayku amachani nispa nirqanmi: "$3".',
 'invalidtitle-knownnamespace' => '"$2" sutisuyu, "$3" qillqasqayuq mana allin kaq qillqa suti',
 'invalidtitle-unknownnamespace' => 'Mana riqsisqa $1 kaq sutisuyu yupay, "$2" qillqasqayuq mana allin kaq qillqa suti',
 'exception-nologin' => 'Manam yaykurqankichu',
-'exception-nologin-text' => 'Kay wikipiqa icha kay ruranataqa rakiqunaykiwan yaykuspalla ruraytam atinki.',
+'exception-nologin-text' => "Ama hina kaspa [[Special:Userlogin|yaykuy]] kay p'anqaman rinata icha kayta ruranata atinaykipaq.",
 
 # Virus scanner
 'virus-badscanner' => "Manam allintachu churapusqa: mana riqsisqa añaw maskaq: ''$1''",
@@ -708,7 +706,7 @@ Ama qunqaychu [[Special:Preferences|{{SITENAME}} allinkachinaykikunata]] hukchay
 'gotaccount' => "Rakiqunaykiñachu kachkan? '''$1'''.",
 'gotaccountlink' => 'Rakiqunaykita willaway',
 'userlogin-resetlink' => 'Yaykuna willayniykikunatari qunqarqankichu?',
-'userlogin-resetpassword-link' => 'Yaykuna rimaykita kutichiy',
+'userlogin-resetpassword-link' => 'Yaykuna rimaykita qunqarqankichu?',
 'helplogin-url' => 'Help:Yaykuy',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Yaykunapaq yanapa]]',
 'userlogin-createanother' => 'Huk rakiqunata kamariy',
@@ -755,7 +753,7 @@ Allin qillqasqaykita llanchiriy.',
 'passwordtooshort' => 'Yaykuna rimayqa {{PLURAL:$1|1 icha aswan sanampayuq|$1 icha aswan sanampayuq}} kananmi.',
 'password-name-match' => 'Yaykuna rimaykiqa ruraqpa sutiykiman mana kaqlla kananmi.',
 'password-login-forbidden' => 'Kay ruraqpa sutinmanqa yaykuna rimanmanpas ama nisqam.',
-'mailmypassword' => 'Musuq yaykuna rimata e-chaskiwan kachamuway',
+'mailmypassword' => 'Yaykuna rimata kutichiy',
 'passwordremindertitle' => "{{SITENAME}}paq musuq mit'alla yaykuna rima",
 'passwordremindertext' => 'Pipas (qamchiki, $1 IP huchhayuq tiyaymanta) mañakuwarqan {{SITENAME}}paq musuq yaykuna rimatam e-chaski imamaytaykiman kachayta ($4).
 "$2" sutiyuq ruraqpa mit\'alla yaykuna rimanqa kamarisqañam, "$3" sutichasqam kachkan. Munarqaspaykiqa, kunan yaykuspa musuq yaykuna rimaykitam akllay.
@@ -771,8 +769,8 @@ Ama hina kaspa, chaskispaykiqa ruraqpa sutiykita nispa musuqmanta yaykuy.',
 'throttled-mailpassword' => "Huk yaykuna rima kutichinapaq yuyachina qayna {{PLURAL:$1|huk ura|$1 ura}} mit'api kachamusqañam. {{PLURAL:$1|Huk ura|$1 ura}} mit'apiqa hukllam yaykuna rima yuyachina kachasqa kachun millay rurayta hark'anapaq.",
 'mailerror' => 'E-chaskita kachaspa pantasqa: $1',
 'acct_creation_throttle_hit' => "Qampa IP huchhaykiyuq kachkaq ruraqkunaqa kay wikita watukuspa ñaqha 24 urapi {{PLURAL:$1|rakiqunaykim|$1 rakiqunaykim}} kamarirqanña. Manam atinkichikchu astawan kichayta huklla p'unchawpi chay IP huchhallayuq kaspa.",
-'emailauthenticated' => "E-chaski imamaytaykiqa $2 p'unchawpi, $3 pachapi chiqapchasqañam.",
-'emailnotauthenticated' => 'E-chaski imamaytaykitaqa manaraqmi takyachirqunkichu. Mana takyachirquptiykiqa, kay qatiq rurachinakunataqa manam atinkichu.',
+'emailauthenticated' => "E-chaski imamaytaykiqa $2 p'unchawpi, $3 pachapi takyachisqañam.",
+'emailnotauthenticated' => 'E-chaski imamaytaykitaqa manaraqmi takyachirqunkichu. Manaraq takyachirquptiykiqa, kay ruranakunapaq manam ima e-chaskipas kachasqa kanchu.',
 'noemailprefs' => "E-chaski imamaytaykita willaway kay rurachinakunata llamk'achinapaq.",
 'emailconfirmlink' => 'E-chaski imamaytaykita takyachiy',
 'invalidemailaddress' => "E-chaski imamaytaykiqa manam allinchu, manachá allinta qillqasqa. Ama hina kaspa, musuq allin sananchayuq imamaytaykita qillqamuy icha k'itichata ch'usaqchay.",
@@ -1059,7 +1057,7 @@ Qullusqachá.",
 'edit-already-exists' => "Manam atinichu musuq p'anqata kamariyta.
 Kachkañam.",
 'defaultmessagetext' => 'Ñawpaq qillqa',
-'content-failed-to-parse' => "Manam atinichu $2 samiqta $1 kikinchapaq t'ikrayta: $3",
+'content-failed-to-parse' => 'Manam atinichu $2 samiqta $1 kikinchapaq kuskiyta: $3',
 'invalid-content-data' => 'Samiqmanta willaykunaqa manam allinchu',
 'content-not-allowed-here' => '"$1" nisqa samiqqa [[$2]] sutiyuq p\'anqapi manam saqillasqachu',
 'editwarning-warning' => "Kay p'anqata saqispaykiqa lliw rurarqusqayki hukchasqakunatachá chinkachiykiman.
@@ -1182,18 +1180,19 @@ Kay wakin kayta qhawayta atinkim; astawanchá rikunkiman [{{fullurl:{{#Special:L
 {{SITENAME}}pi huk kamachiqkunaqa p'anqap pakasqa samiqninta qhawaspa qullusqa kaymanta kutichiyta atinkuraqmi kay kaqlla uyapuratam llamk'achispa, kay wikip kamariqninkuna mana huk saywachanakunata tiyachiptinqa.",
 'revdelete-confirm' => 'Ama hina kaspa, takyachiy munayniykita, qatiqninkunata riqsiyniykita, [[{{MediaWiki:Policy-url}}|kawpaykama]] rurayniykitapas.',
 'revdelete-suppress-text' => "Pakay ruranata '''kaylla kaptin''' llamk'achiy:
+* K'amiqchá willakuna
 * Runamanta mana allin willakuna
-*: ''wasi tiyay imamaytakuna, karu rimay huchhakuna, allin kawsay tarikuq wasimanta huchhakuna, chay hinakunapas.''",
+*: ''wasi tiyay imamaytakuna, karu rimay huchhakuna, mamallaqta sut'inchay huchhakuna, chay hinakunapas.''",
 'revdelete-legend' => 'Rikunapaq saywachanakunata tiyachiy',
-'revdelete-hide-text' => 'Qhawana qillqata pakay',
+'revdelete-hide-text' => 'Musuqmanta qhawana qillqa',
 'revdelete-hide-image' => 'Willañiqip samiqninta pakay',
 'revdelete-hide-name' => 'Rurayta paqtaytapas pakay',
-'revdelete-hide-comment' => "Llamk'apuymanta willapuyta pakay",
-'revdelete-hide-user' => 'Ruraqpa sutinta/IP huchhanta pakay',
+'revdelete-hide-comment' => "Llamk'apuymanta willapuy",
+'revdelete-hide-user' => 'Ruraqpa sutin/IP huchhan',
 'revdelete-hide-restricted' => "Kamachiqkunamanta willakunata huk ruraqkunamanta hina hark'ay",
 'revdelete-radio-same' => '(ama hukchaychu)',
-'revdelete-radio-set' => 'Arí',
-'revdelete-radio-unset' => 'Ama kachunchu',
+'revdelete-radio-set' => 'Pakasqa',
+'revdelete-radio-unset' => 'Rikunalla',
 'revdelete-suppress' => 'Kamachiqkunamantapas willakunata huk ruraqkunamanta hina raqpay',
 'revdelete-unsuppress' => "Qullusqamanta paqarisqa llamk'apusqakunapaq saywachanakunata raqpay",
 'revdelete-log' => 'Kayrayku:',
@@ -1271,7 +1270,6 @@ Takyachikuy kay hukchayqa allin wiñay kawsay ñiqita ama waqllichunchu chaylla.
 'showhideselectedversions' => 'Akllasqa musuqchasqakunata rikuchiy/pakay',
 'editundo' => 'kutichiy',
 'diff-empty' => '(Manam wak hina kanchu)',
-'diff-multi' => "({{PLURAL:$2|Huk ruraqpa|$2 ruraqpa}} {{PLURAL:$1|chawpipi huk llamk'apusqanqa manam rikuchisqachu|chawpipi $1 llamk'apusqankunaqa manam rikuchisqachu}})",
 'diff-multi-manyusers' => "({{PLURAL:$2|Hukmanta|$2-manta}} aswan ruraqkunap {{PLURAL:$1|chawpipi huk llamk'apusqanqa manam rikuchisqachu|chawpipi $1 llamk'apusqankunaqa manam rikuchisqachu}})",
 'difference-missing-revision' => "Kay wakin kaymanta ($1) {{PLURAL:$2|huk musuqchasqa|$2 musuqchasqakuna}} manam tarisqachu.
 
@@ -1292,7 +1290,7 @@ Imaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy ha
 'shown-title' => "Huk p'anqapi $1 {{PLURAL:$1|taripasqata|taripasqakunata}} rikuchiy",
 'viewprevnext' => 'Qhaway ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Kay wikipiqa «[[$1]]» sutiyuq p'anqam kachkan'''",
-'searchmenu-new' => "'''Kay wikipi \"[[:\$1]]\" sutiyuq p'anqata kamariy!'''",
+'searchmenu-new' => '<strong>Kay wikipi "[[:$1]]" sutiyuq p\'anqata kamariy!</strong> {{PLURAL:$2|0=|Maskayniykiwan tarisqa p\'anqatapas qhaway.|Maskaywan taripasqakunatapas qhaway.}}\'',
 'searchprofile-articles' => "Samiq p'anqakuna",
 'searchprofile-project' => "Yanapanapaq ruraykamaypaqpas p'anqakuna",
 'searchprofile-images' => 'Multimidya',
@@ -1621,7 +1619,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'recentchanges-label-minor' => "Kayqa aslla llamk'apuymi",
 'recentchanges-label-bot' => "Kayqa rurana antachap llamk'apusqanmi",
 'recentchanges-label-unpatrolled' => "Kay llamk'apusqaqa manaraqmi patrullasqachu",
-'recentchanges-legend-newpage' => "$1 - musuq p'anqa",
+'recentchanges-legend-newpage' => "([[Special:NewPages|musuq p'anqakunatapas]] qhaway)",
 'rcnotefrom' => "Kay qatiqpiqa '''$2'''-mantapacha ('''$1'''-kama) hukchasqakunatam rikunki.",
 'rclistfrom' => '$1-manta musuq hukchasqakunata rikuchiy',
 'rcshowhideminor' => "$1 uchuylla llamk'apusqakunata",
@@ -2275,7 +2273,6 @@ Qampa [[Special:Preferences|allinkachinaykikunapi]] qillqakamachisqayki imamayta
 'watchmethod-list' => "watiqasqayki p'anqakunata ñaqha hukchasqakunapaq llanchispa",
 'watchlistcontains' => "Watiqana sutisuyuykipiqa $1 {{PLURAL:$1|p'anqam|p'anqakunam}} kachkan.",
 'iteminvalidname' => "'$1' nisqa qillqaqa sasachakunmi, sutinqa manam allinchu...",
-'wlnote' => "Kay qatiqpiqa {{PLURAL:$1|qhipaq hukchasqam|'''$1''' qhipaq hukchasqakunam}} qhipaq {{PLURAL:$2|urapim|'''$2''' urakunapim}}, musuqchasqa $3, $4.",
 'wlshowlast' => "$1 ura, $2 p'unchaw $3-mantapacha hukchasqakunata rikuchiy",
 'watchlist-options' => 'Watiqana sutisuyupaq allinkachinakuna',
 
@@ -2312,7 +2309,7 @@ wiki: $PAGEEDITOR_WIKI
 
 Kay p\'anqata mana musuqmanta watukamuptiykiqa, manam huk ruraykunamanta willasqaykichu. Tukuy watiqasqayki p\'anqakunapaq musyachina sananchakunatapas kutichiytam atinkiman.
 
-             Tukuy sunquwan, {{SITENAME}}pa e-chaski musyachina llikan
+Tukuy sunquwan, {{SITENAME}}pa e-chaski musyachina llikan
 
 --
 E-chaski willaykuy allinkachinakunata hukchanaykipaqqa kay p\'anqatam qhaway:
@@ -2348,7 +2345,7 @@ $2 nisqa p\'anqata qhaway ñaqha qullusqakunata rikunaykipaq.',
 'dellogpage' => 'Qullusqakuna',
 'dellogpagetext' => 'Kay qatiqpiqa lliwmanta aswan ñaqha qullusqakunatam rikunki. Rikuchisqa pachankunaqa sirwiqpa pachanpim.',
 'deletionlog' => 'qullusqakuna',
-'reverted' => 'Ñawpaq hukchasqata kutichiy',
+'reverted' => 'Ñawpaq hukchasqaman kutichisqa',
 'deletecomment' => 'Kayrayku:',
 'deleteotherreason' => 'Huk rayku:',
 'deletereasonotherlist' => 'Huk rayku',
@@ -2628,7 +2625,8 @@ Willariy imaraykum hark'anki (ahinataq: sapaq wandaluchasqa p'anqakunamanta will
 'change-blocklink' => "hark'ayta hukniraqchay",
 'contribslink' => "llamk'apusqakuna",
 'emaillink' => 'e-chaskita kachay',
-'autoblocker' => 'Kikinmanta hark\'asqam kanki, "[[User:$1|$1]]" sutiyuq ruraq IP huchhaykita ñaqha llamk\'arquptinmi. Hark\'aqqa "[[User:$1|$1]]"-ta hark\'aspa kaytam nirqan, kayrayku: "$2".',
+'autoblocker' => 'Kikinmanta hark\'asqam kanki, "[[User:$1|$1]]" sutiyuq ruraq IP huchhaykita ñaqha llamk\'arquptinmi.
+Hark\'aqqa $1-ta hark\'aspa kaytam nirqan, kayrayku: "\'\'$2"\'\'.',
 'blocklogpage' => "Ruraq hark'asqakuna",
 'blocklog-showlog' => "Kay ruraqqa ñawpaqta hark'asqam. Hark'ay hallch'ataqa kaypim rikunki willasunaykipaq:",
 'blocklog-showsuppresslog' => "Kay ruraqqa ñawpaqta hark'asqam pakasqapas. Ñit'ipay hallch'ataqa kaypim rikunki willasunaykipaq:",
@@ -2646,7 +2644,7 @@ Willariy imaraykum hark'anki (ahinataq: sapaq wandaluchasqa p'anqakunamanta will
 'range_block_disabled' => "Kamachiqpa patayayku hark'ay hayñinman ama nisqam.",
 'ipb_expiry_invalid' => 'Puchukana pachaqa manam allinchu.',
 'ipb_expiry_temp' => "Pakasqa ruraqpa sutin hark'aykunaqa tiyaqllam kachun.",
-'ipb_hide_invalid' => "Manam atinichu kay rakiqunata ñit'ipayta; nisyu llamk'apusqayuqñachá.",
+'ipb_hide_invalid' => "Manam atinichu kay rakiqunata ñit'ipayta; nisyu {{PLURAL:$1|llamk'apusqayuqñachá}}.",
 'ipb_already_blocked' => '"$1" sutiyuqqa hark\'asqañam kachkan.',
 'ipb-needreblock' => "$1 sutiyuqqa hark'asqañam. Allinchanakunata hukchayta munankichu?",
 'ipb-otherblocks-header' => "Huk {{PLURAL:$1|hark'ay|hark'aykuna}}",
@@ -2851,7 +2849,7 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
 'importuploaderrorsize' => 'Manam atinichu hawamanta chaskina willañiqita churkuyta, saqillasqamanta aswan hatun kaptinmi.',
 'importuploaderrorpartial' => 'Manam atinichu hawamanta chaskina willañiqita churkuyta, rakillam churkusqa.',
 'importuploaderrortemp' => "Manam atinichu hawamanta chaskina willañiqita churkuyta, mit'alla willañiqi churana mana kaptinmi.",
-'import-parse-failure' => "Manam atinichu XML qillqata t'ikraspa hawamanta chaskiyta",
+'import-parse-failure' => 'Manam atinichu XML qillqata kuskispa hawamanta chaskiyta',
 'import-noarticle' => "Manam hawamanta chaskina p'anqachu!",
 'import-nonewrevisions' => 'Tukuy musuqchasqakunaqa ñawpaqtañam hawamanta chaskisqa.',
 'xml-error-string' => "$1, $2 siq'ipi, $3 tunupi (byte $4): $5",
@@ -2895,7 +2893,6 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
 'tooltip-pt-watchlist' => "Ruraqpa hukchasqakunakama watiqasqan p'anqakuna",
 'tooltip-pt-mycontris' => "Llamk'apusqaykikuna",
 'tooltip-pt-login' => 'Kallpachaykiku yaykunaykiqa allinmi nispa, mana manu kanayki kaptinpas',
-'tooltip-pt-anonlogin' => 'Kallpachaykiku yaykunaykiqa allinmi nispa, mana manu kanayki kaptinpas',
 'tooltip-pt-logout' => "Llamk'apuy tiyaymanta lluqsiy",
 'tooltip-ca-talk' => "Qillqasqap samiqninmanta rimanakuna p'anqa",
 'tooltip-ca-edit' => "Kay p'anqata llamk'apuytam atinki. Ama hina kaspa, manaraq waqaychaspa ñawpaqta qhawarillay.",
@@ -3084,7 +3081,7 @@ Payta rurachiyqa antañiqiqniykita llikaykitapas waqllinqachá.",
 'svg-long-desc' => 'SVG willañiqi, rimasqakama $1 × $2 iñuyuq, willañiqip chhikan kaynin: $3',
 'svg-long-desc-animated' => 'Kuyuchisqa SVG willañiqi, rimasqakama $1 × $2 iñuyuq, willañiqip chhikan kaynin: $3',
 'svg-long-error' => 'Mana allin SVG willañiqi: $1',
-'show-big-image' => 'Qallariy huyaku',
+'show-big-image' => 'Qallariy willañiqi',
 'show-big-image-preview' => 'Kay ñawpaq qhawariypa chhikan kaynin: $1.',
 'show-big-image-other' => 'Huk {{PLURAL:$2|huyaku|huyakukuna}}: $1.',
 'show-big-image-size' => '$1 × $2 iñu',
@@ -3962,4 +3959,6 @@ Mana chayqa, kay qatiqpi kaq hunt'ana p'anqatam llamk'achiyta atinki. Willapuyni
 'expand_templates_remove_comments' => 'Willapusqakunata qichuy',
 'expand_templates_preview' => 'Ñawpaqta qhawallay',
 
+# Unknown messages
+'uploadinvalidxml' => 'Manam atinichu churkusqa willañiqipi XML-ta kuskiyta.',
 );
index f53a3c3..cc2ce29 100644 (file)
@@ -39,7 +39,6 @@ $namespaceGenderAliases = array();
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Tinkikunana uraypi aspishpa rikuchina',
-'tog-justify' => 'Aspinakunata alli paktachina',
 'tog-hideminor' => 'mushuk killkaykunapak kamupi, uchilla killkaykunata pakana',
 'tog-hidepatrolled' => 'mushuk killkaykunapak kamupi, ña rikushka killkaykunata pakana',
 'tog-newpageshidepatrolled' => 'Mushuk pankakunapak kamupi, ña rikushka pankakunata pakana',
@@ -48,7 +47,6 @@ $messages = array(
 'tog-numberheadings' => 'Uma killkaykunata yupayta churak antawata llankachina',
 'tog-showtoolbar' => 'Llamkana antakunata rikuchina (Javascriptwanlla)',
 'tog-editondblclick' => 'Ishkayta klik rurashpa pankapi killkanata kallarina (JavaScriptwanlla)',
-'tog-editsection' => 'Rakikunata [Killkana] tinkiwan killkankapak arinina',
 'tog-rememberpassword' => 'Ñukapak shuti, yaykuna yupaytapash kay wampunapi kipaka churankapak yuyana ({{PLURAL:$1|puncha|punchakuna}}kamanlla)',
 'tog-watchcreations' => 'Ñukapak wacharishka pankakunata rikuna',
 'tog-watchdefault' => 'Ñukapak shukchishka pankakunata rikuna',
@@ -456,7 +454,6 @@ Kay (kaykunachu) kachashkakunaka cunkashkami kashka.",
 'lineno' => '$1 aspi',
 'compareselectedversions' => 'Kay akllashka pankakunaka imashpa mana shinami kapan willana',
 'editundo' => 'Kutichina',
-'diff-multi' => '({{PLURAL:$2|Shuk rurakpa|$2 rurakkunapa}} {{PLURAL:$1|chawpipi shuk mushuk killkayta mana rikuchishkachu|chawpipi $1 mushuk killkaykunata mana rikuchishkachu}})',
 
 # Search results
 'searchresults' => 'Maskaymanta pankakuna',
index 6e580a8..e9b222b 100644 (file)
@@ -45,7 +45,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Suttastritgar colliaziuns:',
-'tog-justify' => "Text en furma da 'bloc'",
 'tog-hideminor' => 'Zuppentar pitschnas midadas en las ultimas midadas',
 'tog-hidepatrolled' => 'Zuppentar midadas controlladas en las «ultimas midadas»',
 'tog-newpageshidepatrolled' => 'Zuppentar paginas controlladas en las «paginas novas»',
@@ -1005,7 +1004,6 @@ Fa stim che navigar cun agid da las coalliziuns reinizialisescha tia tscherna.',
 'compareselectedversions' => 'cumparegliar las versiuns selecziunadas',
 'showhideselectedversions' => 'Mussar/zuppentar las versiuns tschernidas',
 'editundo' => 'revocar',
-'diff-multi' => '({{PLURAL:$1|Ina versiun|$1 versiuns}} {{PLURAL:$2|dad in utilisader|da $2 utilisaders}} tranter en na {{PLURAL:$1|vegn betg mussada|na vegnan betg mussadas}}.)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Ina versiun|$1 versiuns}} tranteren da dapli che $2 {{PLURAL:$2|utilisader|utilisaders}} na vegn betg mussada)',
 'difference-missing-revision' => "{{PLURAL:$2|Ina versiun|$2 versiuns}} da questa differenza ($1) {{PLURAL:$2|n'è betg vegnida chattada|n'èn betg vegnidas chattadas}}.
 
@@ -2005,7 +2003,6 @@ Midadas futuras vid questa pagina e la pagina da discussiun appertegnenta vegnan
 'watchmethod-list' => 'intercurir las paginas observadas davart novas midadas',
 'watchlistcontains' => "Tia glista d'observaziun cuntegna $1 {{PLURAL:$1|pagina|paginas}}.",
 'iteminvalidname' => "Problem cun endataziun '$1', num nunvalid...",
-'wlnote' => "Sutvart {{PLURAL:$1|è l'ultima midada|èn las ultimas '''$1''' midadas}} entaifer {{PLURAL:$2|l'ultima ura|las ultimas '''$2''' uras}}. Actualisà ils $3 las $4.",
 'wlshowlast' => 'Mussar: las ultimas $1 uras, ils ultims $2 dis u $3.',
 'watchlist-options' => "Opziuns per la glista d'observaziun",
 
@@ -2666,7 +2663,6 @@ Emprova danovamain.',
 'tooltip-pt-watchlist' => 'La glista da las paginas da las qualas jau observ las midadas',
 'tooltip-pt-mycontris' => 'Mussar la glista da tut tias contribuziuns',
 'tooltip-pt-login' => "I fiss bun sche ti s'annunziassas, ti na stos dentant betg.",
-'tooltip-pt-anonlogin' => "I fiss bun sche ti t'annunziassas; quai n'è dentant betg obligatoric.",
 'tooltip-pt-logout' => 'Sortir',
 'tooltip-ca-talk' => "Discussiuns davart il cuntegn da l'artitgel",
 'tooltip-ca-edit' => "Ti pos modifitgar questa pagina.
index 5a372ba..ce016a1 100644 (file)
@@ -299,7 +299,6 @@ $linkTrail = '/^([a-zăâîşţșțĂÂÎŞŢȘȚ]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Sublinierea legăturilor:',
-'tog-justify' => 'Aranjează justificat paragrafele',
 'tog-hideminor' => 'Ascunde modificările minore în schimbări recente',
 'tog-hidepatrolled' => 'Ascunde modificările patrulate în schimbări recente',
 'tog-newpageshidepatrolled' => 'Ascunde paginile patrulate din lista de pagini noi',
@@ -462,7 +461,6 @@ $messages = array(
 'vector-action-protect' => 'Protejare',
 'vector-action-undelete' => 'Recuperare',
 'vector-action-unprotect' => 'Modificare protecție',
-'vector-simplesearch-preference' => 'Activează bara de căutare simplificată (exclusiv pentru interfața Vector)',
 'vector-view-create' => 'Creare',
 'vector-view-edit' => 'Modificare',
 'vector-view-history' => 'Istoric',
@@ -952,7 +950,7 @@ Ar trebui să faceți acest lucru numai dacă le-ați partajat accidental cu alt
 'summary' => 'Rezumat:',
 'subject' => 'Subiect / titlu:',
 'minoredit' => 'Aceasta este o modificare minoră',
-'watchthis' => 'Monitorizează această pagină',
+'watchthis' => 'Urmărește această pagină',
 'savearticle' => 'Salvare pagină',
 'preview' => 'Previzualizare',
 'showpreview' => 'Previzualizare',
@@ -1135,7 +1133,7 @@ Ea există deja.',
 'invalid-content-data' => 'Date de conținut invalide',
 'content-not-allowed-here' => 'Conținutul de tip „$1” nu este permis pe pagina [[$2]]',
 'editwarning-warning' => 'Părăsind această pagină, există riscul pierderii modificărilor efectuate.
-Dacă sunteți autentificat, puteți dezactiva această avertizare în secțiunea „Modificare” a preferințelor dumneavoastră.',
+Dacă sunteți autentificat, puteți dezactiva această avertizare în secțiunea „{{int:prefs-editing}}” a preferințelor dumneavoastră.',
 'editpage-notsupportedcontentformat-title' => 'Formatul conținutului nu este acceptat',
 'editpage-notsupportedcontentformat-text' => 'Formatul de conținut $1 nu este acceptat de modelul de conținut $2.',
 
@@ -1171,6 +1169,7 @@ Acsete argumente au fost omise.',
 'undo-success' => 'Modificarea poate fi anulată. Verificați diferența de dedesupt și apoi salvați pentru a termina anularea modificării.',
 'undo-failure' => 'Modificarea nu poate fi reversibilă datorită conflictului de modificări intermediare.',
 'undo-norev' => 'Modificarea nu poate fi reversibilă pentru că nu există sau pentru că a fost ștearsă.',
+'undo-nochange' => 'Se pare că această modificare a fost deja anulată.',
 'undo-summary' => 'Anularea modificării $1 făcute de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discuție]])',
 'undo-summary-username-hidden' => 'Anularea versiunii $1 a unui utilizator ascuns',
 
@@ -1350,7 +1349,8 @@ Folosirea linkurilor de navigare va reseta această coloană.',
 'showhideselectedversions' => 'Șterge/recuperează versiunile marcate',
 'editundo' => 'anulare',
 'diff-empty' => '(Nicio diferență)',
-'diff-multi' => '(Nu {{PLURAL:$1|s-a afișat o versiune intermediară efectuată|s-au afișat $1 versiuni intermediare efectuate|s-au afișat $1 de versiuni intermediare efectuate}} de {{PLURAL:$2|un utilizator|$2 utilizatori|$2 de utilizatori}})',
+'diff-multi-sameuser' => '(Nu {{PLURAL:$1|s-a afișat o versiune intermediară efectuată|s-au afișat $1 versiuni intermediare efectuate|s-au afișat $1 de versiuni intermediare efectuate}} de același utilizator)',
+'diff-multi-otherusers' => '(Nu {{PLURAL:$1|s-a afișat o versiune intermediară efectuată|s-au afișat $1 versiuni intermediare efectuate|s-au afișat $1 de versiuni intermediare efectuate}} de {{PLURAL:$2|un alt utilizator|alți $2 utilizatori|alți $2 de utilizatori}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|O versiune intermediară efectuată de|$1 (de) versiuni intermediare efectuate de peste}} $2 {{PLURAL:$2|utilizator|utilizatori}} {{PLURAL:$1|neafișată|neafișate}})',
 'difference-missing-revision' => '{{PLURAL:$2|O versiune a|$2 versiuni ale|$2 de versiuni ale}} acestei diferențe ($1) nu {{PLURAL:$2|a fost găsită|au fost găsite}}.
 
@@ -1371,7 +1371,7 @@ Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
 'shown-title' => 'Arată $1 {{PLURAL:$1|rezultat|rezultate}} pe pagină',
 'viewprevnext' => 'Vezi ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Există o pagină cu titlul „[[:$1]]'” pe acest site.'''",
-'searchmenu-new' => "'''Creați pagina „[[:$1]]” pe acest wiki!'''",
+'searchmenu-new' => "<strong>'''Creați pagina „[[:$1]]” pe acest wiki!'''</strong> {{PLURAL:$2|0=|Vedeți, de asemenea, pagina găsită în urma căutării dumneavoastră.|Vedeți, de asemenea, rezultatele căutării.}}",
 'searchprofile-articles' => 'Pagini cu conținut',
 'searchprofile-project' => 'Pagini din spațiile Proiect și Ajutor',
 'searchprofile-images' => 'Multimedia',
@@ -1397,6 +1397,7 @@ Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
 'searchrelated' => 'relaționat',
 'searchall' => 'toate',
 'showingresults' => "Mai jos {{PLURAL:$1|apare '''1''' rezultat|apar '''$1''' rezultate|apar '''$1''' de rezultate}} începând cu nr. <b>$2</b>.",
+'showingresultsinrange' => 'Mai jos se afișează un număr de până la {{PLURAL:$1|<strong>1</strong> rezultat|<strong>$1</strong> rezultate|<strong>$1</strong> de rezultate}} din intervalul #<strong>$2</strong> la #<strong>$3</strong>.',
 'showingresultsnum' => "Mai jos {{PLURAL:$3|apare '''1''' rezultat|apar '''$3''' rezultate|apar '''$3''' de rezultate}} cu nr. <b>$2</b>.",
 'showingresultsheader' => "{{PLURAL:$5|Rezultatul '''$1''' din '''$3'''|Rezultatele '''$1 - $2''' din '''$3'''}} pentru '''$4'''",
 'search-nonefound' => 'Nu sunt rezultate conforme interogării.',
@@ -2217,10 +2218,20 @@ Intrările <del>tăiate</del> au fost rezolvate.',
 'deadendpagestext' => 'Următoarele pagini nu se leagă de alte pagini din acestă wiki.',
 'protectedpages' => 'Pagini protejate',
 'protectedpages-indef' => 'Doar protejări pe termen nelimitat',
+'protectedpages-summary' => 'Această pagină enumeră paginile protejate în acest moment. Pentru o listă a titlurilor protejate la creare, vedeți [[{{#special:ProtectedTitles}}]].',
 'protectedpages-cascade' => 'Doar protejări în cascadă',
 'protectedpages-noredirect' => 'Ascunde redirecționările',
 'protectedpagesempty' => 'Nu există pagini protejate',
+'protectedpages-timestamp' => 'Data și ora',
+'protectedpages-page' => 'Pagină',
+'protectedpages-expiry' => 'Expiră la',
+'protectedpages-performer' => 'Utilizator care a protejat',
+'protectedpages-params' => 'Parametri de protejare',
+'protectedpages-reason' => 'Motiv',
+'protectedpages-unknown-timestamp' => 'Necunoscut',
+'protectedpages-unknown-performer' => 'Utilizator necunoscut',
 'protectedtitles' => 'Titluri protejate',
+'protectedtitles-summary' => 'Această pagină enumeră titlurile protejate la creare în acest moment. Pentru o listă a paginilor deja existente care sunt protejate, vedeți [[{{#special:ProtectedPages}}]].',
 'protectedtitlesempty' => 'Nu există titluri protejate cu acești parametri.',
 'listusers' => 'Listă utilizatori',
 'listusers-editsonly' => 'Arată doar utilizatorii cu modificări',
@@ -2770,7 +2781,7 @@ Vedeți [[Special:BlockList|lista blocărilor]] pentru a revizui adresele blocat
 'change-blocklink' => 'modifică blocarea',
 'contribslink' => 'contribuții',
 'emaillink' => 'trimite e-mail',
-'autoblocker' => 'Autoblocat fiindcă folosiți aceeași adresă IP ca și „[[User:$1|$1]]”.
+'autoblocker' => 'Blocat automat, deoarece adresa dumneavoastră IP a fost utilizată recent de „[[User:$1|$1]]”.
 Motivul blocării utilizatorului $1 este: „$2”',
 'blocklogpage' => 'Jurnal blocări',
 'blocklog-showlog' => 'Acest utilizator a fost blocat în trecut.
@@ -2983,6 +2994,7 @@ $2',
 'thumbnail_image-type' => 'Acest tip de imagine nu este suportat',
 'thumbnail_gd-library' => 'Configurație incompletă a bibliotecii GD: lipsește funcția $1',
 'thumbnail_image-missing' => 'Fișierul următor nu poate fi găsit: $1',
+'thumbnail_image-failure-limit' => 'Recent au existat prea multe încercări nereușite ($1 sau mai multe) pentru a randa această miniatură. Încercați din nou mai târziu.',
 
 # Special:Import
 'import' => 'Importare pagini',
@@ -3019,7 +3031,7 @@ Fișierul a fost incărcat parțial.',
 Un dosar temporar lipsește.',
 'import-parse-failure' => 'Eroare la analiza importului XML',
 'import-noarticle' => 'Nicio pagină de importat!',
-'import-nonewrevisions' => 'Toate versiunile au fost importate anterior.',
+'import-nonewrevisions' => 'Nicio versiune importată (toate erau fie deja prezente, fie au fost ignorate din cauza unor erori).',
 'xml-error-string' => '$1 la linia $2, col $3 (octet $4): $5',
 'import-upload' => 'Încărcare date XML',
 'import-token-mismatch' => 'S-au pierdut datele sesiunii. Vă rugăm să încercați din nou.',
@@ -3030,6 +3042,7 @@ Un dosar temporar lipsește.',
 '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-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>',
 'import-rootpage-invalid' => 'Pagina rădăcină furnizată este un titlu nevalid.',
 'import-rootpage-nosubpage' => 'Spațiul de nume „$1” al paginii rădăcină nu permite subpagini.',
index b07e4be..418624e 100644 (file)
@@ -26,7 +26,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Collegaminde sottolinèate:',
-'tog-justify' => 'Giustifeche le paragrafe',
 'tog-hideminor' => "Scunne le cangiaminde stuédeche jndr'à le cangiaminde recende",
 'tog-hidepatrolled' => "Scunne le cangiaminde condrollate jndr'à le cangiaminde recende",
 'tog-newpageshidepatrolled' => "Scunne le pàggene tenute sotte condrolle da l'elenghe de le pàggene nuève",
@@ -884,7 +883,7 @@ Pare proprie ca l'onne scangellete.",
 'invalid-content-data' => "Condenute d'u date invalide",
 'content-not-allowed-here' => '"$1" condenute non g\'è permesse sus \'a pàgene [[$2]]',
 'editwarning-warning' => 'Assenne da sta pàgene tu puè perdè tutte le date ca è cangiate.
-Ce tu è trasute, tu puè disabbilità st\'avvertimende jndr\'à sezione "Cangiaminde..." de le preferenze tune.',
+Ce tu è trasute, tu puè disabbilità st\'avvertimende jndr\'à sezione "{{int:prefs-editing}}" de le preferenze tune.',
 
 # Content models
 'content-model-wikitext' => 'Uicchiteste',
@@ -1100,7 +1099,6 @@ Vide Bbuene ca ausanne le collegaminde de navigazzione sta culonne avène azzera
 'showhideselectedversions' => 'Fà vedè/scunne le revisiune selezionate',
 'editundo' => 'annulle',
 'diff-empty' => '(Nisciuna differenze)',
-'diff-multi' => "({{PLURAL:$1|'na versione de mmienze|$1 cchiù versiune de mmienze}} de {{PLURAL:$2|'n'utende|$2 utinde}} non ge se vèdene)",
 'diff-multi-manyusers' => "({{PLURAL:$1|'Na revisione de 'mmienze|$1 revisiune de 'mmienze}} non g'è viste da cchiù de $2 {{PLURAL:$2|utende|utinde}})",
 'difference-missing-revision' => "{{PLURAL:$2|'Na revisione|$2 revisiune}} de sta differenze ($1) {{PLURAL:$2|non g'onne|non g'onne}} state acchiate.
 
@@ -1121,7 +1119,7 @@ Le dettaglie le puè acchià jndr'à l'[{{fullurl:{{#Special:Log}}/delete|page={
 'shown-title' => 'Fà vedè le $1 {{PLURAL:$1|resultete|resultete}} pe pàgene',
 'viewprevnext' => 'Vide ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Stè 'na pàgene nnumenete \"[[\$1]]\" sus 'a sta Uicchipèdie'''",
-'searchmenu-new' => "'''[[:\$1|Ccreje]] 'a pàgene \"[[:\$1|\$1]]\" sus 'a sta Uicchipèdie!'''",
+'searchmenu-new' => '<strong>[[:$1|Ccreje]] \'a pàgene "[[:$1|$1]]" sus \'a sta Uicchipèdie!</strong> \'Ndruche pure {{PLURAL:$2|0=|\'a pàgene acchiate cu \'a ricerca toje.|le resultate acchiate da \'a ricerche.}}',
 'searchprofile-articles' => 'Vôsce',
 'searchprofile-project' => 'Pàggene de ajiute e de pruggette',
 'searchprofile-images' => 'Multimedia',
@@ -1462,6 +1460,7 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
 'recentchanges-label-minor' => "Quiste ète 'nu cangiamende stuèdeche",
 'recentchanges-label-bot' => "Stu cangiamende ha state fatte da 'nu bot",
 'recentchanges-label-unpatrolled' => "Stu cangiamende non g'à state angore condrollate",
+'recentchanges-legend-heading' => "'''Leggende:'''",
 'recentchanges-legend-newpage' => "('ndruche pure [[Special:NewPages|elenghe de le pàggene nuève]])",
 'rcnotefrom' => "Sotte stonne le cangiaminde da '''$2''' (fine a '''$1''' mustrete).",
 'rclistfrom' => 'Fà vedè le urteme cangiaminde partenne da $1',
@@ -2542,8 +2541,8 @@ Vide [[Special:BlockList|'a liste de le IP bloccate]] pe revedè le blocche.",
 'change-blocklink' => "cange 'u blocche",
 'contribslink' => 'condrebbute',
 'emaillink' => "manne 'n'e-mail",
-'autoblocker' => 'Autobloccate purcè l\'indirizze IP tue ha state recendemente ausate da "[[User:$1|$1]]".
-\'U mutive date pu blocche de $1 ète: "$2"',
+'autoblocker' => 'Autobloccate purcè l\'indirizze IP tune ha state ausate urtemamende da "[[User:$1|$1]]".
+\'U mutive date pu blocche de $1 ète "$2"',
 'blocklogpage' => 'Archivije de le Bloccaminde',
 'blocklog-showlog' => "Stu utende ha state bloccate precedendemende.
 L'archivije de le bloccaminde 'u puè acchià aqquà sotte pe riferimende:",
index 75821f4..066436e 100644 (file)
@@ -444,7 +444,6 @@ $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъы
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Подчёркивание ссылок:',
-'tog-justify' => 'Выравнивать текст по ширине страницы',
 'tog-hideminor' => 'Скрывать малые правки в списке свежих правок',
 'tog-hidepatrolled' => 'Скрывать патрулированные правки в списке свежих правок',
 'tog-newpageshidepatrolled' => 'Скрывать отпатрулированные страницы в списке новых страниц',
@@ -570,9 +569,9 @@ $messages = array(
 'hidden-category-category' => 'Скрытые категории',
 'category-subcat-count' => '{{PLURAL:$2|Эта категория содержит только следующую подкатегорию.|Эта категория содержит $1 {{PLURAL:$1|1=подкатегорию|подкатегории}} из $2 всего.}}',
 'category-subcat-count-limited' => 'В этой категории {{PLURAL:$1|$1 подкатегория|$1 подкатегорий|$1 подкатегории}}.',
-'category-article-count' => '{{PLURAL:$2|Эта категория содержит единственную страницу.|{{PLURAL:$1|Показана $1 страница|Показано $1 страниц|Показаны $1 страницы}} из $2, {{PLURAL:$2|находящейся|находящихся|находящихся}} в данной категории.}}',
+'category-article-count' => '{{PLURAL:$2|1=Эта категория содержит единственную страницу.|{{PLURAL:$1|Показана $1 страница|Показано $1 страниц|Показаны $1 страницы}} из $2, {{PLURAL:$2|находящейся|находящихся}} в данной категории.}}',
 'category-article-count-limited' => 'В этой категории {{PLURAL:$1|$1 страница|$1 страниц|$1 страницы|1=только одна страница}}.',
-'category-file-count' => '{{PLURAL:$2|Эта категория содержит единственный файл.|{{PLURAL:$1|Показан $1 файл|Показано $1 файлов|Показаны $1 файла}} из $2, {{PLURAL:$2|находящегося|находящихся|находящихся}} в данной категории.}}',
+'category-file-count' => '{{PLURAL:$2|1=Эта категория содержит единственный файл.|{{PLURAL:$1|Показан $1 файл|Показано $1 файлов|Показаны $1 файла}} из $2, {{PLURAL:$2|находящегося|находящихся}} в данной категории.}}',
 'category-file-count-limited' => 'В этой категории {{PLURAL:$1|$1 файл|$1 файлов|$1 файла|1=только один файл}}.',
 'listingcontinuesabbrev' => '(продолжение)',
 'index-category' => 'Индексируемые страницы',
@@ -607,7 +606,6 @@ $messages = array(
 'vector-action-protect' => 'Защитить',
 'vector-action-undelete' => 'Восстановить',
 'vector-action-unprotect' => 'Изменить защиту',
-'vector-simplesearch-preference' => 'Включить упрощённую строку поиска (только для оформления «Векторное»)',
 'vector-view-create' => 'Создание',
 'vector-view-edit' => 'Править',
 'vector-view-history' => 'История',
@@ -911,7 +909,7 @@ $2',
 'createacct-captcha' => 'Проверка безопасности',
 'createacct-imgcaptcha-ph' => 'Введите текст, который вы видите выше',
 'createacct-submit' => 'Создать учётную запись',
-'createacct-another-submit' => 'Создать ещё одну учётную запись',
+'createacct-another-submit' => 'Создать ещё одну запись',
 'createacct-benefit-heading' => '{{SITENAME}} — совместный труд таких же людей, как вы.',
 'createacct-benefit-body1' => '{{PLURAL:$1|правка|правок|правки}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|статья|статей|статьи}}',
@@ -1288,8 +1286,8 @@ $2
 'content-failed-to-parse' => 'Содержимое $2 не соответствует типу $1: $3.',
 'invalid-content-data' => 'Недопустимые данные',
 'content-not-allowed-here' => 'Содержимое "$1" недопустимо на странице [[$2]]',
-'editwarning-warning' => 'Переход на другую страницу может привести к потере сделанных вами изменений.
-Если вы зарегистрированы в системе, то вы можете отключить это предупреждение в разделе «Редактирование» ваших настроек.',
+'editwarning-warning' => 'Переход на другую страницу может привести к потере внесённых вами изменений.
+Если вы зарегистрированы в системе, то вы можете отключить это предупреждение в разделе «{{int:prefs-editing}}» ваших настроек.',
 'editpage-notsupportedcontentformat-title' => 'Формат содержимого не поддерживается',
 'editpage-notsupportedcontentformat-text' => 'Формат содержимого $1 не поддерживается моделью содержимого $2.',
 
@@ -1325,6 +1323,7 @@ $2
 'undo-success' => 'Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.',
 'undo-failure' => 'Правка не может быть отменена из-за несовместимости промежуточных изменений.',
 'undo-norev' => 'Правка не может быть отменена, так как её не существует или она была удалена.',
+'undo-nochange' => 'Правка, похоже, уже была отменена.',
 'undo-summary' => 'Отмена правки $1, сделанной {{GENDER:$2|участником|участницей}} [[Special:Contributions/$2|$2]] ([[User talk:$2|обс.]])',
 'undo-summary-username-hidden' => 'Отмена правки $1, сделанной участником, чьё имя скрыто',
 
@@ -1504,7 +1503,8 @@ $1",
 'showhideselectedversions' => 'Показать/скрыть выбранные версии',
 'editundo' => 'отменить',
 'diff-empty' => '(нет различий)',
-'diff-multi' => '({{PLURAL:$1|не показана $1 промежуточная версия, сделанная|не показаны $1 промежуточных версий, сделанных|не показаны $1 промежуточные версии, сделанные|1=не показана промежуточная версия, сделанная}} {{PLURAL:$2|$2 участником|$2 участниками|1=одним участником}})',
+'diff-multi-sameuser' => '(не {{PLURAL:$1|показана одна промежуточная версия|показано $1 промежуточных версии|показаны $1 промежуточные версии}} этого же участника)',
+'diff-multi-otherusers' => '(не {{PLURAL:$1|показана одна промежуточная версия|показано $1 промежуточных версии|показаны $1 промежуточные версии}} {{PLURAL:$2|ещё одного участника|$2 участников}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|не показана $1 промежуточная версия, сделанная|не показаны $1 промежуточных версий, сделанных|не показаны $1 промежуточные версии, сделанные}} более чем {{PLURAL:$2|$2 участником|$2 участниками}})',
 'difference-missing-revision' => 'Не {{PLURAL:$2|1=найдена|найдены}} {{PLURAL:$2|$2 версия|$2 версий|$2 версии|1=одна из версий}} для этого сравнения ($1).
 
@@ -1525,7 +1525,8 @@ $1",
 'shown-title' => 'Показывать $1 {{PLURAL:$1|запись|записи|записей}} на странице',
 'viewprevnext' => 'Просмотреть ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''В этой вики есть страница «[[:$1]]»'''",
-'searchmenu-new' => "'''Создать страницу «[[:$1]]» в этом вики-проекте!'''",
+'searchmenu-new' => '<strong>Создать страницу «[[:$1]]» в этом вики-проекте!</strong>
+{{PLURAL:$2|0=|См. также страницу, найденную по результатами вашего поиска.|См. также найденные результаты поиска.}}',
 'searchprofile-articles' => 'Основные страницы',
 'searchprofile-project' => 'Страницы справки и проекта',
 'searchprofile-images' => 'Мультимедиа',
@@ -1551,6 +1552,7 @@ $1",
 'searchrelated' => 'связанный',
 'searchall' => 'все',
 'showingresults' => "Ниже {{PLURAL:$1|1=показан результат|показаны  результаты}} с № '''$2''' и вплоть до № '''$1'''.",
+'showingresultsinrange' => 'Ниже показано до {{PLURAL:$1|<strong>1</strong> результата|<strong>$1</strong> результатов|<strong>$1</strong> результата}} в диапазоне от <strong>$2</strong> до <strong>$3</strong>.',
 'showingresultsnum' => "Ниже {{PLURAL:$3|1=показан|показаны}} '''$3''' {{PLURAL:$3|результат|результатов|результата}}, начиная с № '''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|1=Результат '''$1''' из '''$3'''|Результаты '''$1—$2''' из '''$3'''}} для «'''$4'''»",
 'search-nonefound' => 'Соответствий запросу не найдено.',
@@ -2368,10 +2370,20 @@ $1',
 'deadendpagestext' => 'Следующие страницы не содержат ссылок на другие страницы в этой вики.',
 'protectedpages' => 'Защищённые страницы',
 'protectedpages-indef' => 'Только бессрочные защиты',
+'protectedpages-summary' => 'На этой странице перечислены существующие страницы, которые в настоящее время защищены. Для списка названий, которые защищены от создания см. [[{{#special:ProtectedTitles}}]].',
 'protectedpages-cascade' => 'Только каскадная защита',
 'protectedpages-noredirect' => 'Скрыть перенаправления',
 'protectedpagesempty' => 'В настоящий момент нет защищённых страниц с указанными параметрами',
+'protectedpages-timestamp' => 'Дата/время',
+'protectedpages-page' => 'Страница',
+'protectedpages-expiry' => 'Истекает',
+'protectedpages-performer' => 'Защита участника',
+'protectedpages-params' => 'Параметры защиты',
+'protectedpages-reason' => 'Причина',
+'protectedpages-unknown-timestamp' => 'Неизвестно',
+'protectedpages-unknown-performer' => 'Неизвестный участник',
 'protectedtitles' => 'Защищённые названия',
+'protectedtitles-summary' => 'На этой странице перечислены названия, которые защищены от создания. Для списка существующих страниц, которые в настоящее время защищены, см. [[{{#special:ProtectedPages}}]].',
 'protectedtitlesempty' => 'В настоящий момент нет запрещённых названий с указанными параметрами.',
 'listusers' => 'Список участников',
 'listusers-editsonly' => 'Показать только тех участников, кто сделал хотя бы одну правку',
@@ -2924,8 +2936,8 @@ $1',
 'change-blocklink' => 'изменить блокировку',
 'contribslink' => 'вклад',
 'emaillink' => 'отправить письмо',
-'autoblocker' => 'Ð\90вÑ\82облокиÑ\80овка Ð¸Ð·-за Ñ\81овпадениÑ\8f Ð²Ð°Ñ\88его IP-адÑ\80еÑ\81а Ñ\81 Ð°Ð´Ñ\80еÑ\81ом, ÐºÐ¾Ñ\82оÑ\80Ñ\8bй Ð½ÐµÐ´Ð°Ð²Ð½Ð¾ Ð¸Ñ\81полÑ\8cзовал [[User:$1|$1]].
-Причина блокировки $1 — «$2».',
+'autoblocker' => 'Ð\90вÑ\82облокиÑ\80овка Ð¸Ð·-за Ñ\82ого, Ñ\87Ñ\82о Ð²Ð°Ñ\88 IP-адÑ\80еÑ\81 Ð½ÐµÐ´Ð°Ð²Ð½Ð¾ Ð¸Ñ\81полÑ\8cзовал Â«[[User:$1|$1]]».
+Причина блокировки $1ː «$2»',
 'blocklogpage' => 'Журнал блокировок',
 'blocklog-showlog' => '{{GENDER:$1|Этот участник уже блокировался|Эта участница уже блокировалась}} ранее.
 Ниже приведён журнал блокировок:',
@@ -3133,6 +3145,7 @@ $2',
 'thumbnail_image-type' => 'Данный тип изображения не поддерживается',
 'thumbnail_gd-library' => 'Неполная конфигурация библиотеки GD, отсутствует функция $1',
 'thumbnail_image-missing' => 'По-видимому, отсутствует файл $1',
+'thumbnail_image-failure-limit' => 'Было сделано слишком много неудачных попыток ($1 или больше) формирования этого эскиза. Пожалуйста, повторите попытку позже.',
 
 # Special:Import
 'import' => 'Импортирование страниц',
@@ -3167,7 +3180,7 @@ $2',
 'importuploaderrortemp' => 'Не удалось загрузить или импортировать файл. Временная папка отсутствует.',
 'import-parse-failure' => 'Ошибка разбора XML при импорте',
 'import-noarticle' => 'Нет страницы для импортирования!',
-'import-nonewrevisions' => 'Ð\92Ñ\81е Ð²ÐµÑ\80Ñ\81ии Ð±Ñ\8bли Ñ\80анее Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82иÑ\80ованÑ\8b.',
+'import-nonewrevisions' => 'Ð\9dикакие Ð¿Ñ\80авки Ð½Ðµ Ð±Ñ\8bли Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82иÑ\80ованÑ\8b (вÑ\81е Ñ\83же Ð»Ð¸Ð±Ð¾ Ð±Ñ\8bли Ð¾Ð±Ñ\80абоÑ\82анÑ\8b, Ð»Ð¸Ð±Ð¾ Ð¿Ñ\80опÑ\83Ñ\89енÑ\8b Ð¸Ð·-за Ð¾Ñ\88ибок).',
 'xml-error-string' => '$1 в строке $2, позиции $3 (байт $4): $5',
 'import-upload' => 'Загрузить XML-данные',
 'import-token-mismatch' => 'Потеряны данные сеанса. Пожалуйста, попробуйте ещё раз.',
@@ -3178,6 +3191,7 @@ $2',
 '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>',
 'import-rootpage-invalid' => 'Указанное название корневой страницы некорректно.',
 'import-rootpage-nosubpage' => 'В пространстве имён указанной корневой страницы «$1» подстраницы запрещены.',
@@ -4146,7 +4160,7 @@ $5
 'duplicate-defaultsort' => 'Внимание. Ключ сортировки по умолчанию «$2» переопределяет прежний ключ сортировки по умолчанию «$1».',
 
 # Special:Version
-'version' => 'Версия MediaWiki',
+'version' => 'Версия',
 'version-extensions' => 'Установленные расширения',
 'version-specialpages' => 'Служебные страницы',
 'version-parserhooks' => 'Перехватчики синтаксического анализатора',
index 441b4e0..a05af97 100644 (file)
@@ -118,7 +118,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Підкреслёвати одказы:',
-'tog-justify' => 'Зарівнати текст до блоку',
 'tog-hideminor' => 'Сховати малы едітованя в списку послїднїх змін',
 'tog-hidepatrolled' => 'Сховати патролёваны едітованя в списку послїднїх змін',
 'tog-newpageshidepatrolled' => 'Сховати патролёваны сторінкы зо списку новых сторінок',
@@ -359,7 +358,7 @@ $1',
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'О&nbsp;{{grammar:genitive|{{SITENAME}}}}',
 'aboutpage' => 'Project:{{SITENAME}}',
-'copyright' => 'Ð\9eбÑ\81Ñ\8fг Ñ\94 Ð´Ð¾Ñ\81Ñ\82Ñ\83пнÑ\8bй Ð· $1.',
+'copyright' => 'Ð\9eбÑ\81Ñ\8fг Ñ\94 Ð´Ð¾Ñ\81Ñ\82Ñ\83пнÑ\8bй Ð¿Ñ\96д $1, ÐºÑ\96дÑ\8c Ð½Ðµ Ñ\94 Ð²ÐºÐ°Ð·Ð°Ð½Ðµ Ñ\96нÑ\88е.',
 'copyrightpage' => '{{ns:project}}:Авторьске право',
 'currentevents' => 'Актуалны подїї',
 'currentevents-url' => 'Project:Актуалны подїї',
@@ -387,8 +386,8 @@ $1',
 'youhavenewmessages' => 'Маєте $1 ($2).',
 'youhavenewmessagesfromusers' => 'Мате $1 од {{PLURAL:$3|іншого хоснователя|$3 іншых хоснователїв}} ($2).',
 'youhavenewmessagesmanyusers' => 'Мате $1 од много далшых хоснователїв ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|нове повідомлїня|новы повідомлїня}}',
-'newmessagesdifflinkplural' => 'остатня {{PLURAL:$1|зміна|зміны|змін}}',
+'newmessageslinkplural' => '{{PLURAL:$1|нове повідомлїня|999=новы повідомлїня}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|остатня зміна|999=остатнї зміны}}',
 'youhavenewmessagesmulti' => 'Маєте новы повідомлїня на $1',
 'editsection' => 'едіт.',
 'editold' => 'едіт.',
@@ -561,9 +560,10 @@ $2',
 'gotaccount' => "Уж сьте реґістрованы? '''$1'''.",
 'gotaccountlink' => 'Приголошіня',
 'userlogin-resetlink' => 'Забыли сьте вашы даны на приголошіня?',
-'userlogin-resetpassword-link' => 'РеÑ\81еÑ\82оваÑ\82и Ð²Ð°Ñ\88е Ð³ÐµÑ\81ло',
+'userlogin-resetpassword-link' => 'Ð\97абÑ\8bли Ñ\81Ñ\8cÑ\82е Ð³ÐµÑ\81ло?',
 'helplogin-url' => 'Help:Приголошіня',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Поміч з приголошованём]]',
+'userlogin-createanother' => 'Створити інше конто',
 'createacct-join' => 'Ниже уведьте вашы інформації',
 'createacct-another-join' => 'Ниже уведьте інформації нового конта',
 'createacct-emailrequired' => 'Адреса електронічной пошты',
@@ -608,7 +608,7 @@ $2',
 'passwordtooshort' => 'Гесло мусить быти довге холем  $1 {{PLURAL:$1|знак|знакы|знаків}}.',
 'password-name-match' => 'Ваше гесло не може быти таке саме як і ваше хосновательске мено.',
 'password-login-forbidden' => 'Хоснованя того мена хоснователя і гесла было заказане.',
-'mailmypassword' => 'Ð\9fоÑ\81лаÑ\82и Ð½Ð¾Ð²Ðµ Ð³ÐµÑ\81ло',
+'mailmypassword' => 'РеÑ\81еÑ\82 Ð³ÐµÑ\81ла',
 'passwordremindertitle' => 'Нове дочасне гесло на {{grammar:4sg|{{SITENAME}}}}',
 'passwordremindertext' => 'Хтось (може Вы, з IP адресы $1) пожадав, жебы сьме Вам послали нове гесло
 про приголошіня до {{grammar:2sg|{{SITENAME}}}} ($4). Хоснователёви „$2“ было
@@ -927,6 +927,7 @@ $2
 'content-not-allowed-here' => 'Обсяг «$1» недозволеный на сторінцї [[$2]]',
 'editwarning-warning' => 'Зохаблїнём той стрінкы ся можуть вшыткы учінены зміны стратити.
 Кідь сьте приголошеный, можете тото варованя выпнути на картї „Едітованя“ в хосновательскім інтерфейсї.',
+'editpage-notsupportedcontentformat-title' => 'Непідпорованый формат обсягу',
 
 # Content models
 'content-model-wikitext' => 'вікітекст',
@@ -1045,19 +1046,19 @@ $3 зазначів тоту причіну: ''$2''",
 кідь не были наставлены далшы обмеджіня.",
 'revdelete-confirm' => 'Просиме Вас, потвердьте, же то хочете справды зробити, же собі усвідомлюєте резултат і же є то в згодї з  [[{{MediaWiki:Policy-url}}|правилами]].',
 'revdelete-suppress-text' => "Затаёваня бы ся мало хосновати  ''лем''' в такых припадах:
-* Потенціално огварячі інформації
+* Ð\9fоÑ\82енÑ\86Ñ\96ално Ð¾Ð³Ð²Ð°Ñ\80Ñ\8fÑ\8eÑ\87Ñ\96 Ñ\96нÑ\84оÑ\80маÑ\86Ñ\96Ñ\97
 * Непотрібны особны дата
-*: ''адресы і телефонны чісла, родны чісла ітд.''",
+*: <em>адресы і телефонны чісла, родны чісла ітд.</em>",
 'revdelete-legend' => 'Наставити обмеджіня ревізії',
 'revdelete-hide-text' => 'Сховати текст ревізії',
 'revdelete-hide-image' => 'Сховати обсяг файлу',
 'revdelete-hide-name' => 'Сховати дїю а ціль',
 'revdelete-hide-comment' => 'Сховати коментарь',
-'revdelete-hide-user' => 'СÑ\85оваÑ\82Ñ\83 Ð¼ÐµÐ½Ð¾ Ð°Ð²Ñ\82оÑ\80а/IP-адÑ\80еÑ\81Ñ\83',
+'revdelete-hide-user' => 'Ð\86мÑ\8f Ð°Ð²Ñ\82оÑ\80а/IP Ð°Ð´Ñ\80еÑ\81а',
 'revdelete-hide-restricted' => 'Затаїти дата перед адміністраторами',
 'revdelete-radio-same' => '(не мінити)',
-'revdelete-radio-set' => 'Ð\93ей',
-'revdelete-radio-unset' => 'Ð\9dÑ\97Ñ\82',
+'revdelete-radio-set' => 'СÑ\85ованÑ\8bй',
+'revdelete-radio-unset' => 'Ð\92идимÑ\8bй',
 'revdelete-suppress' => 'Затаїти дата перед адміністраторами',
 'revdelete-unsuppress' => 'Одстранити обмеджіня на вернутій верзії',
 'revdelete-log' => 'Причіна:',
@@ -1135,7 +1136,6 @@ $1",
 'showhideselectedversions' => 'Вказати/скрыти выбраны ревізії',
 'editundo' => 'вернути назад',
 'diff-empty' => '(Не є роздїлне)',
-'diff-multi' => '({{PLURAL:$1|Не є зображена єдна міджілегла верзія|Не суть зображены $1 міджілеглы верзії|Не є зображено $1 міджілеглых верзій}} од {{PLURAL:$2|1 хоснователя|$2 хоснователїв}} .)',
 'diff-multi-manyusers' => '(Не є зображено $1 міджілеглых верзій од веце як $2 {{PLURAL:$2|хоснователя|хоснователїв}}.)',
 'difference-missing-revision' => '{{PLURAL:$2|Єдна з ревізій|$2 ревізії|$2 ревізій}} к пожадованому порівнаню ($1) {{PLURAL:$2|не є|не суть|не є}}.
 
@@ -2156,7 +2156,6 @@ $1',
 'watchmethod-list' => 'глядають ся найновшы едітованя слїдованых сторінок',
 'watchlistcontains' => 'На своїм списку слїдованых сторінок маєте $1 {{PLURAL:$1|положку|положкы|положок}}.',
 'iteminvalidname' => 'Проблем з положков „$1“, неплатна назва…',
-'wlnote' => 'Ниже є {{PLURAL:$1|остатня зміна|остатнї $1 зміны|остатнїх $1 змін}} за {{PLURAL:$2|остатнїй|остатнї|остатнїх}} <b>$2</b> {{PLURAL:$2|годину|годины|годин}} до do $4, $3.',
 'wlshowlast' => 'Вказати зміны за послїднїх $1 годин $2 днїв $3',
 'watchlist-options' => 'Наставлїна списку слїдованых',
 
@@ -2790,7 +2789,6 @@ $2',
 'tooltip-pt-watchlist' => 'Список сторінок, на котрых слїдуєте зміны',
 'tooltip-pt-mycontris' => 'Список вашых приспівків',
 'tooltip-pt-login' => 'Рекомендуєме ся приголосити, але не є то повинне.',
-'tooltip-pt-anonlogin' => 'Рекомендуєме ся приголосити, але не є то повинне.',
 'tooltip-pt-logout' => 'Одголошіня',
 'tooltip-ca-talk' => 'Діскузія о обсягу сторінкы',
 'tooltip-ca-edit' => 'Тоту сторінку можете едітовати. Просиме, хоснуйте перегляд перед уложінём.',
@@ -3610,6 +3608,12 @@ $5
 'version-hook-subscribedby' => 'Підписаный на',
 'version-version' => '(Верзія $1)',
 'version-license' => 'Ліценція',
+'version-ext-license' => 'Ліценція',
+'version-ext-colheader-name' => 'Росшырїня',
+'version-ext-colheader-version' => 'Верзія',
+'version-ext-colheader-license' => 'Ліценція',
+'version-ext-colheader-description' => 'Попис',
+'version-ext-colheader-credits' => 'Авторы',
 'version-poweredby-credits' => "Тота вікі біжыть на '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
 'version-poweredby-others' => 'іншы',
 'version-poweredby-translators' => 'перекладателї на translatewiki.net',
@@ -3634,6 +3638,7 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 'redirect-lookup' => 'Найти:',
 'redirect-value' => 'Значіня',
 'redirect-user' => 'ID хоснователя',
+'redirect-page' => 'ID сторінкы',
 'redirect-revision' => 'Ревізія сторінкы',
 'redirect-file' => 'Назва файлу',
 'redirect-not-exists' => 'Значіня ся не нашло',
@@ -3651,6 +3656,7 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 
 # Special:SpecialPages
 'specialpages' => 'Шпеціалны сторінкы',
+'specialpages-note-top' => 'Леґенда',
 'specialpages-note' => '* Звычайны шпеціалны сторінкы.
 * <span class="mw-specialpagerestricted">Шпеціалны сторінкы з&nbsp;обмедженым приступом</span>
 * <span class="mw-specialpagecached">Кешованы шпеціалны сторінкы</span>',
@@ -3691,7 +3697,10 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 'tags-tag' => 'Назва значкы',
 'tags-display-header' => 'Зображіня на списках змін',
 'tags-description-header' => 'Повный попис значіня',
+'tags-active-header' => 'Актівный?',
 'tags-hitcount-header' => 'Означены зміны',
+'tags-active-yes' => 'Гей',
+'tags-active-no' => 'Нїт',
 'tags-edit' => 'едітовати',
 'tags-hitcount' => '$1 {{PLURAL:$1|зміна|зміны|змін}}',
 
index fc78409..3012b92 100644 (file)
@@ -279,7 +279,6 @@ $digitGroupingPattern = "##,##,###";
 $messages = array(
 # User preference toggles
 'tog-underline' => 'सम्पर्कतन्तोः अधोरेखाङ्कनम्:',
-'tog-justify' => 'परिच्छेदाः समानाः क्रियन्ताम्',
 'tog-hideminor' => 'सद्योजातानां परिवर्तनानां लघूनि सम्पादनानि गोप्यन्ताम्',
 'tog-hidepatrolled' => 'सद्योजातानां परिवर्तनानां परिशीलितानि सम्पादनानि गोप्यन्ताम्',
 'tog-newpageshidepatrolled' => 'नूतनपृष्ठानाम् आवलीतः परिशीलितानि पृष्ठानि गोप्यन्त्ताम्',
@@ -1215,7 +1214,6 @@ You can still [$1 view this revision]",
 'compareselectedversions' => 'चितानाम् आवृत्तीनां तोलनं क्रियताम्',
 'showhideselectedversions' => 'चितावतरणानि दर्शयतु/गोपयतु ।',
 'editundo' => 'निष्क्रियताम्',
-'diff-multi' => '({{PLURAL:$2|योजकेन|$2 योजकैः}} कृता {{PLURAL:$1|मध्यमा आवृत्तिः|$1 मध्यमा आवृत्तयः}} न दर्शिताः ।)',
 'diff-multi-manyusers' => '({{PLURAL:$2|योजकेन|$2 योजकैः}} कृता {{PLURAL:$1|मध्यमा आवृत्तिः|$1 मध्यमा आवृत्तयः}} न दर्शिताः ।)',
 'difference-missing-revision' => '{{PLURAL:$2|One revision|$2 पुनरावृत्तेः }} व्यत्यासः ($1) {{PLURAL:$2|was|were}} न दृष्टः ।
 कारणम् अत्र दृश्यते । [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
@@ -2206,7 +2204,6 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'watchmethod-list' => 'सद्यः सम्पादनार्थम् अवलोकितपुटानां परीक्षणम् ।',
 'watchlistcontains' => 'भवतः अवलोकनावली $1 युक्तास्ति ।{{PLURAL:$1|page|pages}}.',
 'iteminvalidname' => "समस्या  '$1' इत्यनेन अस्ति । अमान्यं नाम ।",
-'wlnote' => "अधस्तात् {{PLURAL:$1|'''1''' परिवर्तनमस्ति|अन्तिमानि '''$1''' परिवर्तनानि सन्ति}},{{PLURAL:$2|गते दिवसे|'''$2''' गतेषु दिवसेषु}}, , $3, $4. इति",
 'wlshowlast' => 'अन्तिमानि ($1 होराः $2 दिनानि) $3 इति दर्श्यन्ताम्',
 'watchlist-options' => 'अवेक्षणसूच्याः विकल्पाः',
 
@@ -2840,7 +2837,6 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 'tooltip-pt-watchlist' => 'भवद्भिः परिवर्तनानि निरीक्ष्यमाणानां पृष्ठानां सूची',
 'tooltip-pt-mycontris' => 'भवतः योगदानानाम् आवली',
 'tooltip-pt-login' => 'भवान् न प्रविष्टः। प्रवेशः अनिवार्यः न।',
-'tooltip-pt-anonlogin' => 'भवतः नामाभिलेखः उत्साहयते । किन्तु नामाभिलेखः ऐच्छिकः ।',
 'tooltip-pt-logout' => 'निर्गमनम्',
 'tooltip-ca-talk' => 'पृष्ठान्तर्गतविषये चर्चा',
 'tooltip-ca-edit' => 'भवान् इदं पृष्ठं सम्पादयितुम् अर्हति। रक्षणात्पूर्वं कृपया प्राग्दृश्यं पश्यतु।',
index 012581e..68b6e96 100644 (file)
@@ -46,7 +46,6 @@ $namespaceGenderAliases = array();
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Ыйынньыктары аннынан тардыы:',
-'tog-justify' => 'Сирэй кэтитинэн тарҕат',
 'tog-hideminor' => 'Кыра көннөрүүлэри көрдөрбөккө',
 'tog-hidepatrolled' => 'Ботурууллааччы көрбүт көннөрүүтүн саҥа көннөрүүлэр тиһиктэригэр көрдөрүмэ',
 'tog-newpageshidepatrolled' => 'Ботуруулламмыт сирэйдэри саҥа сирэйдэр тиһиктэригэр көрдөрүмэ',
@@ -1078,7 +1077,6 @@ $1",
 'showhideselectedversions' => 'Талыллыбыт барыллары көрдөр/кистээ',
 'editundo' => 'төнүн',
 'diff-empty' => '(уратыта суох)',
-'diff-multi' => '({{PLURAL:$2|$2 кыттааччы|$2 ахсааннаах кыттааччы}} {{PLURAL:$1|$1 ыккардынааҕы барыла көрдөрүллүбэтэ|$1 ахсааннаах ыккардынааҕы барыла көрдөрүллүбэтэ|$1.}})',
 'diff-multi-manyusers' => '(Кырата {{PLURAL:$2|$1 кыттааччы|$2 ахсааннаах кыттааччы}} оҥорбут {{PLURAL:$1|ыккардынааҕы $1 барыла|ыккардынааҕы $1 барыллара}} көрдөрүллүбэтэ)',
 'difference-missing-revision' => '$2 барыл бу тэҥнээһиҥҥэ ($1) көстүбэтэ.
 
@@ -2113,7 +2111,6 @@ $1',
 'watchmethod-list' => 'кэтээһин бүтэһик уларыйыылара',
 'watchlistcontains' => '$1 сирэйи кэтээн көрөҕүн.',
 'iteminvalidname' => "'$1' моһуогурда, аата сатаммата...",
-'wlnote' => "Манна кэлиҥҥи {{PLURAL:$2|чаас|'''$2''' чаас}} иһигэр оҥоһуллубут бүтэһик $1 уларытыы көрдөрүлүннэ, бу кэмҥэ туругунан $3 $4.",
 'wlshowlast' => 'бүтэһик $1 чааска $2 күҥҥэ $3 көрдөр',
 'watchlist-options' => 'Кэтээн көрүү туруоруутун уларытыы',
 
@@ -2762,7 +2759,6 @@ $2',
 'tooltip-pt-watchlist' => 'Кэтээн көрөр сирэйдэрим тиһигэ',
 'tooltip-pt-mycontris' => 'Суруйбут/уларыппыт сирэйдэриҥ тиһиктэрэ',
 'tooltip-pt-login' => 'Манна бэйэҕин билиһиннэриэххин сөп (булгуччута суох).',
-'tooltip-pt-anonlogin' => 'Бэйэҕин билиһиннэриэххин сөп (булгуччута суох).',
 'tooltip-pt-logout' => 'Тахсыы',
 'tooltip-ca-talk' => 'Ыстатыйаны ырытыы',
 'tooltip-ca-edit' => 'Бу сирэйи уларытыахха сөп. Бука диэн бастаан хайдах буоларын көрөн баран уларыт.',
index 4741e2e..16d8241 100644 (file)
@@ -22,7 +22,6 @@
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Joṛaoko latarre dag udugoḱma:',
-'tog-justify' => 'Olaḱ kạli mońjte sajao:',
 'tog-hideminor' => 'Nitaḱ bodolaḱre huḍiṅ kạmi danaṅme',
 'tog-hidepatrolled' => 'Joṛaoakanaḱko nãwã bodolaḱte danaṅkam',
 'tog-newpageshidepatrolled' => 'Biḍạakanaḱ sakamko nãwã sakamreaḱ talikare danȧkam',
@@ -31,9 +30,7 @@ $messages = array(
 'tog-numberheadings' => 'Mukhiạ kathako do actege piṛhipiṛhite sajaḱma',
 'tog-showtoolbar' => 'Joṛaoakanaḱ ṭulbar udugoḱma',
 'tog-editondblclick' => 'Bar dhao lin kate sakam torjomão reaḱ ạidari emogoḱma',
-'tog-editsection' => '[Joṛao] Pahaṭako do joṛao hotete aćtege hoyoḱ lạgit aidạri em ocoḱma',
 'tog-editsectiononrightclick' => 'Pahaṭa reaḱ pahaṭa guṭkathare jojom seć lin hotete <br /> pahaṭa sompadon lạgitte ektiạr em hoyoḱma (JavaScript)',
-'tog-showtoc' => 'Ṭibilre menaḱako ńel ( sakamkore 3 khon jạti hedlayenko)',
 'tog-rememberpassword' => 'Noa sendrare amaḱ boloḱ reaḱ katha (katha cạbi) disạimẽ (jạstite $1 {{PLURAL:$1din reaḱ din reaḱ}} lạgit)',
 'tog-watchcreations' => 'Ińaḱ tear sakam ar rakaṕ páelko ińaḱ ńelogoḱ tạlikare ńeloḱ ma',
 'tog-watchdefault' => 'Ińaḱ purạoakanaḱ sakam ar phayelko do ińaḱ ńeloḱ tạlikare joṛaoḱma',
@@ -671,7 +668,6 @@ Unuduḱ: '''({{int:cur}})''' = nahaḱ nãwã aroeko saõte tulạo, '''({{int:
 'lineno' => 'Sạr $1:',
 'compareselectedversions' => 'Noa barea nãwã bachawanaḱ talare tolonayme',
 'editundo' => 'ruạṛ',
-'diff-multi' => '({{PLURAL:$2 mit́ṭen beoharic $2 hoṛ beoharkin}} Sompadon hoena {{PLURAL:$1 mit́ṭen do mitghạṛi lạgit sudhrạo mit́ṭen do mitghạṛi lạgit sudhrạo}} baṅ uduḱlena.)',
 
 # Search results
 'searchresults' => 'Se̠ndra fo̠l',
index 369dba5..cc365ee 100644 (file)
@@ -154,7 +154,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Suttalìnia li culligamenti:',
-'tog-justify' => 'Alliniamentu dû paràgrafu: giustificatu',
 'tog-hideminor' => "Ammuccia li canciamenti nichi nta l'ùrtimi canciamenti",
 'tog-hidepatrolled' => "Ammuccia li mudìfichi fatti ntâ l'ùrtimi canciamenti",
 'tog-newpageshidepatrolled' => "Ammuccia li pàggini virificati di l'alencu dî pàgging cchiù novi",
@@ -1000,7 +999,6 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
 'compareselectedversions' => 'Fari lu paraguni',
 'showhideselectedversions' => 'Ammustra/ammuccia virsioni silizziunati',
 'editundo' => 'annulla',
-'diff-multi' => '({{PLURAL:$1|Na rivisioni ntirmèdia|$1 rivisioni ntirmedi}} di {{PLURAL:$2|nu utenti|$2 utenti}} nun {{PLURAL:$1|ammusciata|ammusciati}}.)',
 
 # Search results
 'searchresults' => 'Risurtati dâ circata',
@@ -1793,7 +1791,6 @@ Protucolli suppurtati: <code>$1</code>',
 'watchmethod-list' => "cuntrollu di l'ossirvati spiciali pi canciamenti ricenti",
 'watchlistcontains' => 'La tò lista di ossirvati spiciali cunteni {{PLURAL:$1|na pàggina|$1 pàggini}}.',
 'iteminvalidname' => "Prubbremi cu la pàggina '$1', nomu nun vàlidu...",
-'wlnote' => "Sutta attrovi l'ùrtim{{PLURAL:$1|u canciamentu|i $1 canciamenti}}, nta l'ùrtim{{PLURAL:$1|a ura|i '''$2''' uri}}.",
 'wlshowlast' => "Ammustra l'ùrtimi $1 uri $2 jorna $3",
 'watchlist-options' => 'Opzioni ussirvati spiciali',
 
@@ -2302,7 +2299,6 @@ Visita [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [/
 'tooltip-pt-watchlist' => 'La lista dî pàggini ca stai tinennu sutta ossirvazzioni',
 'tooltip-pt-mycontris' => "L'alencu dî tò cuntribbuti",
 'tooltip-pt-login' => 'La riggistrazzioni è cunzigghiata, puru siddu nun obbrigatoria.',
-'tooltip-pt-anonlogin' => 'La riggistrazzioni è cunzigghiata, puru siddu nun obbrigatoria.',
 'tooltip-pt-logout' => 'Nisciuta (logout)',
 'tooltip-ca-talk' => 'Vidi li discussioni rilativi a sta pàggina',
 'tooltip-ca-edit' => "Poi canciari sta pàggina. Pi favuri usa lu pulsanti d'antiprima prima di sarvari.",
index 428cc69..f9a58f9 100644 (file)
@@ -10,6 +10,7 @@
  * @author (vinny)
  * @author Avicennasis
  * @author Derek Ross
+ * @author John Reid
  * @author Malafaya
  * @author OchAyeTheNoo
  * @author Omnipaedista
@@ -25,7 +26,6 @@
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Unnerline airtins:',
-'tog-justify' => 'Justifee paragraphs',
 'tog-hideminor' => 'Hide smaa edits in recent chynges',
 'tog-hidepatrolled' => 'Hide patrolled edits in recent chynges',
 'tog-newpageshidepatrolled' => 'Hide patrolled pages frae the new page list',
@@ -34,9 +34,7 @@ $messages = array(
 'tog-numberheadings' => 'Auto-nummer heidins',
 'tog-showtoolbar' => 'Shaw edit toolbar',
 'tog-editondblclick' => 'Edit pages on dooble-dab (JavaScript)',
-'tog-editsection' => 'Enable section editin via [edit] airtins',
 'tog-editsectiononrightclick' => 'Enable section editin bi richt-dabbin on section teitles (JavaScript)',
-'tog-showtoc' => 'Shaw table o contents (for pages wi mair nor 3 heidins)',
 'tog-rememberpassword' => 'Mynd password ower sessions (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'tog-watchcreations' => 'Add pages ye mak tar yer watchleet',
 'tog-watchdefault' => 'Add pages ye edit tae yer watchleet',
@@ -267,6 +265,7 @@ $messages = array(
 'toc' => 'Table o contents',
 'showtoc' => 'shaw',
 'hidetoc' => 'scouk',
+'collapsible-collapse' => 'Collapse.',
 'thisisdeleted' => 'View or cower $1?',
 'viewdeleted' => 'View $1?',
 'restorelink' => '{{PLURAL:$1|one delete edit|$1 delete edits}}',
@@ -594,6 +593,8 @@ Ye shuld check that it is guid tae keep editin this page.
 The deletion and flit log for this page is providit here:",
 'moveddeleted-notice' => 'This page haes bin deletit. 
 The deletion and flit log fur the page are provided below fur reference.',
+'editwarning-warning' => 'Leain this page micht cause ye tae lose oni chynges ye\'v made.
+Gif ye\'r loggit in, ye can disable this warning in the "{{int:prefs-editing}}" section o yer preferences.',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''Wairnin:''' Template include size is tae lairge. 
@@ -606,6 +607,7 @@ Thae arguments hae been left oot.',
 # "Undo" feature
 'undo-success' => 'The edit can be undone. Please check the chynges albo tae check that this is whit ye wint tae dae, an then hain the chynges albo tae be duin undooin the edit.',
 'undo-failure' => 'The edit culdnae be undone acause o conflictin edits inatween.',
+'undo-nochange' => 'The edit appears tae hae awready been ondone.',
 'undo-summary' => 'Undo reveision $1 by [[Special:Contributions/$2|$2]] ([[User talk:$2|Collogue]])',
 
 # Account creation failure
@@ -674,7 +676,8 @@ there micht be parteeculars in the [{{fullurl:{{#Special:Log}}/suppress|page={{F
 'lineno' => 'Line $1:',
 'compareselectedversions' => 'Compare selectit versions',
 'editundo' => 'undo',
-'diff-multi' => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one user|$2 users}} nae shown)',
+'diff-multi-sameuser' => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} bi the same uiser no shown)',
+'diff-multi-otherusers' => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} bi {{PLURAL:$2|one other user|$2 users}} not shown)',
 
 # Search results
 'searchresults' => 'Rake results',
@@ -708,6 +711,7 @@ there micht be parteeculars in the [{{fullurl:{{#Special:Log}}/suppress|page={{F
 'searchrelated' => 'related',
 'searchall' => 'aw',
 'showingresults' => "Shawin ablo up tae {{PLURAL:$1|'''1''' result|'''$1''' results}} stertin wi #'''$2'''.",
+'showingresultsinrange' => 'Showin ablow up til {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} in range #<strong>$2</strong> to #<strong>$3</strong>.',
 'showingresultsnum' => "Shawin ablo {{PLURAL:$3|'''1''' result|'''$3''' results}} stertin wi #'''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Ootcome '''$1''' of '''$3'''|Ootcomes '''$1 - $2''' of '''$3'''}} for '''$4'''",
 'search-nonefound' => "Thare wur na ootcomes matching th' query.",
@@ -729,9 +733,9 @@ there micht be parteeculars in the [{{fullurl:{{#Special:Log}}/suppress|page={{F
 'saveprefs' => 'Hain preferences',
 'prefs-editing' => 'Editin',
 'searchresultshead' => 'Rake result settins',
-'resultsperpage' => 'Hits tae shaw per page',
 'stub-threshold-disabled' => 'Tuckie',
 'recentchangescount' => 'Nummer o teitles in recent chynges',
+'prefs-help-watchlist-token2' => 'This is the hidlins key til the wab feed o yer watchleet. Onibodie wha kens this can read yer watchleel, sae dinna share it. Gif ye need to, [[Special:ResetTokens|You ca reset it]].',
 'savedprefs' => 'Yer preferences haes been hained.',
 'servertime' => 'Server time is nou',
 'guesstimezone' => 'Fill in frae brouser',
@@ -959,6 +963,16 @@ Th' description oan tis [$2 file description page] thare is shown below.",
 'prefixindex' => 'All pages with prefix',
 'longpages' => 'Lang pages',
 'deadendpages' => 'Deid-end pages',
+'protectedpages-summary' => 'This page leets existing pages that are nou protectit. Fer a leet o titles that are protectit fae creation, see [[{{#special:ProtectedTitles}}]].',
+'protectedpages-timestamp' => 'Timestamp.',
+'protectedpages-page' => 'Page.',
+'protectedpages-expiry' => 'Dies',
+'protectedpages-performer' => 'Protecting uisser',
+'protectedpages-params' => 'Protection guidins',
+'protectedpages-reason' => 'Raison',
+'protectedpages-unknown-timestamp' => "Onken't",
+'protectedpages-unknown-performer' => "Onken't user",
+'protectedtitles-summary' => 'This page leets titles that are nou protectit fae creation. Fer a leet of exeesting pages that are protectit, see [[{{#special:ProtectedPages}}]].',
 'listusers' => 'Uiser leet',
 'usercreated' => 'Created on $1 at $2',
 'newpages' => 'New pages',
@@ -1046,7 +1060,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watchlist-details' => "{{PLURAL:$1|$1 page|$1 pages}} on yer watchleet, nae countin' collogue pages.",
 'watchlistcontains' => 'Yer watchleet contains $1 {{PLURAL:$1|page|pages}}.',
 'iteminvalidname' => "Trouble wi eitem '$1', invalid name...",
-'wlnote' => "Ablo is the lest $1 {{PLURAL:$1|chynge|chynges}} in the lest {{PLURAL:$2|hour|'''$2''' hours}}.",
+'wlnote2' => 'Ablow ar the chynges in the hainmaist {{PLURAL:$1|hour|<strong>$1</strong> hours}}, as of $3, $2.',
 'wlshowlast' => 'Shaw lest $1 hours $2 days $3',
 'watchlist-options' => 'Watchleet options',
 
@@ -1120,6 +1134,8 @@ an that ye'r daein this in accord wi [[{{MediaWiki:Policy-url}}]].",
 'viewdeletedpage' => 'View delete pages',
 'undeletepagetext' => 'The follaein pages haev bin deleted but are aye in the archive an
 can be restored. The archive micht be redd oot noo an then.',
+'undeleteextrahelp' => "In order tae restore the page's entire histerie, lea aw checkboxes onselected an clap on <strong><em>{{int:undeletebtn}}</em></strong>.
+Tae perform ae selective restoration, check the boxes corresponding til the revisions tae be restored, an clap on <strong><em>{{int:undeletebtn}}</em></strong>.",
 'undeletehistory' => 'Gin ye restore the page, aa reveisions will be restored til the history.
 Gin a neow page wi the same name haes bin created syne the deletion, the restored
 reveisions will appear in the aulder history, an the current reveision o the live page winna be autaematically replaced.',
@@ -1130,6 +1146,9 @@ afore it wis delete. The actual text o thir deletit reveisions is available tae
 'undeleteviewlink' => 'view',
 'undeletedrevisions' => '{{PLURAL:$1|1 reveision|$1 reveisions}} restored',
 'cannotundelete' => 'Undelete didna wirk; some ither bodie micht hae aareadies undeletit the page.',
+'undeletedpage' => '<strong>$1 has been restored</strong>
+
+Consult the [[Special:Log/delete|deletion log]] fer ae record o recent deletions an restorations.',
 
 # Namespace form on various pages
 'namespace' => 'Namespace:',
@@ -1162,6 +1181,7 @@ afore it wis delete. The actual text o thir deletit reveisions is available tae
 'whatlinkshere-page' => 'Page:',
 'linkshere' => "The follaein pages airts tae '''[[:$1]]''':",
 'nolinkshere' => "Nae pages airt tae '''[[:$1]]'''.",
+'nolinkshere-ns' => 'No pages aiet til <strong>[[:$1]]</strong> in the choosen namespace.',
 'isredirect' => 'reguidal page',
 'istemplate' => 'transclusion',
 'isimage' => 'file link',
@@ -1197,7 +1217,7 @@ tae an afore-blockit IP address or uisername.',
 'unblocklink' => 'unblock',
 'change-blocklink' => 'chynge block',
 'contribslink' => 'contreibs',
-'autoblocker' => 'Autaematically blockit syne yer IP address haes been uised recently bi "[[User:$1|$1]]". The raeson gien for $1\'s block is "\'\'$2\'\'"',
+'autoblocker' => 'Autaematically blockit syne yer IP address haes been uised recently bi "[[User:$1|$1]]". The raeson gien fer $1\'s block is "$2"',
 'blocklogpage' => 'Block log',
 'blocklogentry' => 'blockit [[$1]] wi an expiry time o $2 $3',
 'blocklogtext' => 'This is a log o uiser blockin an unblockin actions. Autaematically blockit IP addresses isna leetit. See the [[Special:BlockList|IP block leet]] for the leet o bans and blocks on the gae the nou.',
@@ -1223,24 +1243,37 @@ tae an afore-blockit IP address or uisername.',
 
 # Move page
 'move-page-legend' => 'Flit page',
-'movepagetext' => "Uisin the form ablo will rename a page, flittin aa its history tae the new name.
-The auld teitle will become a reguidal page tae the new teitle.
-Airtins tae the auld page teitle willna be chynged;
-be siccar tae check for dooble or brucken reguidals.
-You ar responsible for makkin siccar that airtins continues tae pynt whaur thay ar supposed tae gang.
-
-Mynd that the page '''willna''' be flittit gin the'r aareadies a page at the new teitle, unless it is tuim or a reguidal and haes nae past edit history.
-This means that ye can rename a page back tae whaur it wis juist renamed frae gin ye mak a mistak, an ye canna owerwrite an existin page
-
-'''WARNIN!'''
-This can be a drastic and unexpectit chynge for a popular page;
-please be siccar ye unnerstaun the consequences o this afore proceedin.",
+'movepagetext' => "Uisin the form ablow will rename ae page, muiving aw o its histerie til the new name.
+The auld title will become ae redirect page til the new title.
+Ye can update redirects that point til the original title autaematicly.
+Gif ye chuis no tae, be sair tae check fer [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].
+Ye'r responsible fer making sair that airtins continue tae pynt til whaur they'r supposed to gae.
+
+Note that the page will <strong>no</strong> be muived gif there is awready ae page at the new title, onless the latter is ae redirect an has nae past edit history.
+This means that ye can rename ae page back til whaur it wis renamed fae gif ye mak ae mistak, an ye canna o'erwrite aen existing page.
+
+<strong>Warning!</strong>
+This can be ae drastic an onexpected chynge fer ae popular page;
+please be sair ye unnerstaun the consequences o this afore proceeding.",
+'movepagetext-noredirectfixer' => "Uising the form ablow will rename ae page, muiving aw o its histerie til the new name.
+The auld title will become ae redirect page til the new title.
+Be sair tae check fer [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].
+Ye'r responsible fer making sair that airtins continue tae pynt whaur thay'r supposed to gae.
+
+Note that the page will <strong>no</strong> be muived gif there's awready ae page at the new title, onless it is tuim an has naw past edit history.
+This means that you can rename a page back to whaur it wis renamed fae gif ye mak ae mistak, an ye canna o'erwrite an existin page.
+
+<strong>Warnin!</strong>
+This can be ae drastic an onexpectit chynge fer ae popular page;
+please be sair ye unnerstaun the consequences of this afore proceedin.",
 'movepagetalktext' => "The associate Collogue page, gin onie, will be autaematically flittit alang wi it '''unless:''' *Ye'r flittin the page across namespaces, *A collogue page that isna tuim aareadies exists unner the new name, or *Ye tak the tick oot o the box ablo. In thae cases, ye maun flit or merge the page manually later gin ye hae saicont thochts.",
 'movearticle' => 'Flit page:',
+'moveuserpage-warning' => "<strong>Warning:</strong> Ye'r aboot tae muiv ae uiser page. Please note that yinly the page will be muivd and the uiser will <em>no</em> be renamed.",
 'movenologintext' => 'Ye maun be a registert uiser an [[Special:UserLogin|loggit in]] tae flit a page.',
 'newtitle' => 'Tae new teitle',
 'movepagebtn' => 'Flit page',
 'pagemovedsub' => 'Flittin succeedit',
+'movepage-moved' => '<strong>"$1" has been muived til "$2"</strong>',
 'articleexists' => "A page o that name aareadies exists, or the name ye'v waled isna guid. Please wale anither name.",
 'movetalk' => 'Flit "collogue" page an aa, gin it\'s applicable.',
 'movelogpage' => 'Flit log',
@@ -1254,6 +1287,10 @@ The destination airticle "[[:$1]]" aareadies exists. Div ye want tae delete it f
 'delete_and_move_confirm' => 'Aye, delete the page',
 'delete_and_move_reason' => 'Delete for tae mak wey for flittin',
 'selfmove' => 'Ootgaun an incomin teitles is the same; canna flit a page ower itsel.',
+'protectedpagemovewarning' => '<strong>Warning:</strong> This page has been protected sae that yinly uisers wi administrater preevileges can muiv it.
+The hainmaist log entry is provided ablow fer reference:',
+'semiprotectedpagemovewarning' => '<strong>Note:</strong> This page has been protected sae that yinly registered uisers can muiv it.
+The hainmaist log entry is provided ablow fer reference:',
 
 # Export
 'export' => 'Export pages',
@@ -1263,6 +1300,8 @@ Tae export airticle pages, enter the teitles in the text box ablo, ae teitle tae
 
 In the saicont case ye can uise an airtin forbye, for exemplar [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] for the airticle "[[{{MediaWiki:Mainpage}}]]".',
 'exportcuronly' => 'Include juist the current revision, no the fou history',
+'exportnohistory' => '----
+<strong>Note:</strong> Exporting the ful histerie o pages through this form has been disabled caus o performance raisons.',
 
 # Namespace 8 related
 'allmessages' => 'Aa seestem messages',
@@ -1271,11 +1310,13 @@ In the saicont case ye can uise an airtin forbye, for exemplar [[{{#Special:Expo
 'allmessagescurrent' => 'Text the nou',
 'allmessagestext' => 'This is a leet o aa seestem messages available in the MediaWiki: namespace.',
 'allmessagesnotsupportedDB' => "'''{{ns:special}}:AllMessages''' nae supportit acause '''\$wgUseDatabaseMessages''' is aff.",
+'allmessages-filter-translate' => "O'erset",
 
 # Thumbnails
 'thumbnail-more' => 'Eik',
 'filemissing' => 'File missin',
 'thumbnail_error' => 'Error creating thumbnail: $1',
+'thumbnail_image-failure-limit' => "There hae been o'er mony recent failed attempts ($1 or more) tae render this thumbnail. Please try again later.",
 
 # Special:Import
 'importtext' => 'Please export the file frae the soorce wiki uisin the Special:Export utility, hain it in yer disc an uplaid it here.',
@@ -1283,6 +1324,8 @@ In the saicont case ye can uise an airtin forbye, for exemplar [[{{#Special:Expo
 'importsuccess' => 'Importit fine!',
 'importhistoryconflict' => 'Conflictin history revision exists (micht hae importit this page afore)',
 'importnosources' => 'Nae transwiki import soorces haes been defined an direct history uplaids is disabled.',
+'import-nonewrevisions' => 'Nae revisions imported (aw were either awready present, or skipped cause o errors).',
+'import-error-bad-location' => 'Revision $2 uising content model $3 canna be stored on "$1" on this wiki, syn that model isna supported on that page.',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Yer uiser page',
@@ -1354,6 +1397,8 @@ You ken view its source',
 # Spam protection
 'spamprotectiontext' => 'The page ye wanted tae save wis blockit bi the spam filter. This is maist likely caused bi an airtin til an outby site.',
 'spamprotectionmatch' => 'The follaein text is whit triggered wir spam filter: $1',
+'simpleantispam-label' => 'Anti-spam check.
+Dae <strong>NO</strong> ful this in!',
 
 # Patrolling
 'markaspatrolleddiff' => 'Merk as patrolled',
@@ -1370,12 +1415,15 @@ You ken view its source',
 'nextdiff' => 'Newer edit →',
 
 # Media information
-'mediawarning' => "'''Warnin''': This file micht haud mislushious code; bi executin it yer seestem micht be compromised.",
-'imagemaxsize' => 'Limit eimages on eimage description pages tae:',
+'mediawarning' => '<strong>Warning:</strong> This file type micht contain maleecious code.
+Bi executing it, yer system micht be compromised.',
+'imagemaxsize' => 'Eimage size limit:<br /><em>(fer file description pages)</em>',
 'file-info-size' => '$1 × $2 pixels, file size: $3, MIME type: $4',
 'file-nohires' => 'Na higher resolution available.',
 'svg-long-desc' => 'SVG file, nominally $1 × $2 pixels, file size: $3',
 'show-big-image' => 'Full resolution',
+'file-no-thumb-animation' => '<strong>Note: Due til technical limitations, thumbnails o this file will no be animated.</strong>',
+'file-no-thumb-animation-gif' => '<strong>Note: Due til technical limitations, thumbnails o hich resolution GIF eimages sic as this will no be animated.</strong>',
 
 # Special:NewFiles
 'newimages' => 'Gallery o new files',
@@ -1454,7 +1502,7 @@ $5
 This confirmation code will end at $4.',
 
 # Delete conflict
-'deletedwhileediting' => 'Warnin: This page haes been delete syne ye stertit editin!',
+'deletedwhileediting' => '<strong>Warning:</strong> This page wis deletit efter ye sterted editing!',
 'confirmrecreate' => "Uiser [[User:$1|$1]] ([[User talk:$1|collogue]]) deletit this airticle efter ye stertit editin, giein the raeson:
 : ''$2''
 Please confirm that ye really want tae recreate this airticle.",
@@ -1485,6 +1533,9 @@ Please confirm that ye really want tae recreate this airticle.",
 # Core parser functions
 'duplicate-defaultsort' => '\'\'\'Wairnin:\'\'\' Default sort key "$2" overrides earlier default sort key "$1".',
 
+# Special:Version
+'version-poweredby-credits' => 'This wiki is pwred bi <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copiericht © 2001-$1 $2.',
+
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Filename:',
 'fileduplicatesearch-submit' => 'Rake',
index 1d54759..26ef7d2 100644 (file)
@@ -107,16 +107,13 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Sotturìnia li cullegamenti:',
-'tog-justify' => 'Alliniamentu di li paràgrafi giusthifiggaddu',
 'tog-hideminor' => "Cua li mudìfigghi minori i' l'ulthimi mudìfigghi",
 'tog-extendwatchlist' => "Musthra tutti li mudìfigghi a li abbaidaddi ippiziari, nò soru l'ulthimi.",
 'tog-usenewrc' => "Utirizza l'ulthimi mudìfigghi abanzaddi (dumanda JavaScript)",
 'tog-numberheadings' => 'Numarazioni otomàtigga di li tìturi di sezzioni',
 'tog-showtoolbar' => "Musthra barra di l'isthrumenti di mudìfigga (dumanda JavaScript)",
 'tog-editondblclick' => 'Mudìfigga di li pàgini attrabessu dóppiu clic (dumanda JavaScript)',
-'tog-editsection' => 'Mudìfigga di li sezzioni attrabessu lu cullegamentu [mudifigga]',
 'tog-editsectiononrightclick' => "Mudìfigga di li sezzioni attrabessu lu clic dresthu i' lu tìturu (nezzessàriu JavaScript)",
-'tog-showtoc' => "Musthra l'indizi pa li pàgini cun più di 3 sezzioni",
 'tog-rememberpassword' => "Ammenta la paràura d'órdhini (nezzessàriu azzittà li cookie) (for a maximum of $1 {{PLURAL:$1|dì|dì}})",
 'tog-watchcreations' => "Aggiungi li pàgini criaddi a l'abbaidaddi ippiziari",
 'tog-watchdefault' => "Aggiungi li pàgini mudìfiggaddi a l'abbaidaddi ippiziari",
@@ -760,7 +757,6 @@ Cunsulthà lu [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rigi
 'lineno' => 'Riga $1:',
 'compareselectedversions' => 'Cunfronta li versioni sciubaraddi',
 'editundo' => 'annulla',
-'diff-multi' => '({{PLURAL:$1|Una ribisioni di mezu nò musthradda|$1 ribisioni di mezu nò musthraddi}}.)',
 
 # Search results
 'searchresults' => 'Risulthaddi di la zercha',
@@ -1283,7 +1279,6 @@ Si daboi s'à gana d'eliminà la pàgina da la listha di l'abbaidaddi ippiziarii
 'watchmethod-list' => "cuntrollu di l'abbaidaddi ippiziari pa mudìfigghi rizzenti",
 'watchlistcontains' => "La listha di l'abbaidaddi ippiziari cunteni {{PLURAL:$1|una pàgina|$1 pàgini}}.",
 'iteminvalidname' => "Probremi cu' la pàgina '$1', innòmmu nò vàriddu...",
-'wlnote' => "Inogghi {{PLURAL:$1|è erencadda la mudìfigga più rizzenti arriggadda|so erencaddi li '''$1''' mudìfigghi più rizzenti arriggaddi}} {{PLURAL:$2|i' la ulthima ora|i' li ulthimi '''$2''' ori}}.",
 'wlshowlast' => 'Musthra li ulthimi $1 ori $2 dì $3',
 'watchlist-options' => 'Opzioni abbaidaddi ippiziari',
 
@@ -1680,7 +1675,6 @@ Tutti l'operazioni d'impurthazioni trans-wiki so rigisthraddi i' lu [[Special:Lo
 'tooltip-pt-watchlist' => "La listha di li pàgini ch'isthai tinendi sottu osseivvazioni",
 'tooltip-pt-mycontris' => 'Listha di li tó cuntributi',
 'tooltip-pt-login' => 'La registhrazioni è cunsigliadda, puru si nò è ubbrigatória',
-'tooltip-pt-anonlogin' => 'La registhrazioni è cunsigliadda, puru si nò è ubbrigatória.',
 'tooltip-pt-logout' => 'Iscidda',
 'tooltip-ca-talk' => 'Vèdi li dischussioni reratibi a chistha pàgina',
 'tooltip-ca-edit' => "Pói mudìfiggà chistha pàgina. Pa piazeri usa lu buttoni d'antiprimma primma di saivvà",
index 43d81a0..2dff34c 100644 (file)
@@ -149,9 +149,7 @@ $messages = array(
 'tog-numberheadings' => 'Nummaraste bajilčállagiid',
 'tog-showtoolbar' => 'Čájet rievdadangaskaomiid',
 'tog-editondblclick' => 'Rievdat siidduid duppaldeaddilemiin (JavaScript)',
-'tog-editsection' => 'Čájet rievdadanliŋkkaid juohke oasáža bajábealde',
 'tog-editsectiononrightclick' => 'Rievdat osiid nu ahte deaddilat bajilčállaga sáhpána olgeš boaluin (JavaScript)',
-'tog-showtoc' => 'Čájet sisdoallologahallama siidduin, main lea eanet go golbma bajilčállaga',
 'tog-rememberpassword' => 'Muite mu dieđuid dán dihtoris (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'tog-watchcreations' => 'Lasit siidduid maid lean álggahan mu čuovvunlistui',
 'tog-watchdefault' => 'Lasit čuovvunlistui siidduid maid lean ođasmahttán',
@@ -597,7 +595,6 @@ Eará bajasdoallit sáhtet lohkat čihkojuvvon sisdoalu ja máhcahit dan.",
 'compareselectedversions' => 'Veardde válljejuvvon veršuvnnaid',
 'showhideselectedversions' => 'Čájet/čiega válljejuvvon veršuvnnaid',
 'editundo' => 'šluhtte',
-'diff-multi' => '(Veršuvnnaid gaskas {{PLURAL:$1|okta rievdadus|$1 eará rievdadusa}}.)',
 
 # Search results
 'searchresults' => 'Ohcanbohtosat',
@@ -638,7 +635,6 @@ $1 {{int:pipe-separator}} $2',
 'rows' => 'Gurgadasa:',
 'columns' => 'Kolumnat',
 'searchresultshead' => 'Ohcan',
-'resultsperpage' => 'Bohtosa juohke siiddus',
 'recentchangescount' => 'Siiddui mearri varas rievdadusain',
 'savedprefs' => 'Du ásahusid vurken lihkosmuvai.',
 'timezonelegend' => 'Áigeavádat',
@@ -1021,7 +1017,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watchmethod-list' => 'dárkistuvvo čuovvunlisttu siidduid varas rievdadusat',
 'watchlistcontains' => 'Du čuovvunlisttus {{PLURAL:$1|lea okta siidu|leat $1 siiddu}}.',
 'iteminvalidname' => 'Siidduin $1 ledje váttisvuođat! Siiddu namas lea feaila.',
-'wlnote' => "Vuolábealde lea '''$1''' {{PLURAL:$1|rievdadus|rievdadusa}} maŋimus {{PLURAL:$2||'''$2'''}} diimma siste.",
 'wlshowlast' => 'Čájet maŋimus $1 diimmu dahje $2 beaivvi $3',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -1245,7 +1240,6 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'tooltip-pt-watchlist' => 'Listu siidduin, maid rievdadusaid don čuovut',
 'tooltip-pt-mycontris' => 'Listu iežas rievdadusain',
 'tooltip-pt-login' => 'Čálligoađe sisa dahje ráhkat geavaheaddjidovddaldaga',
-'tooltip-pt-anonlogin' => 'Čálligoađe sisa dahje ráhkat geavaheaddjidovddaldaga',
 'tooltip-pt-logout' => 'Logge olggos',
 'tooltip-ca-talk' => 'Ságastala sisdoalus',
 'tooltip-ca-edit' => 'Rievdat dán siiddu',
index 5066568..ee3fd90 100644 (file)
@@ -61,16 +61,13 @@ $namespaceGenderAliases = array();
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Pabrauktė nūruodas:',
-'tog-justify' => 'Līgintė pastraipas palē abi poses',
 'tog-hideminor' => 'Pakavuotė mažus pataisėmus vielībūju taisīmu sārašė',
 'tog-extendwatchlist' => 'Ėšpliestė keravuojamu sāraša, kū ruodītu vėsus tėnkamus pakeitėmus',
 'tog-usenewrc' => 'Grupoutė keitėmus vielībūsiūs pakeitėmūs ė keravuojamu poslapiu sārašė',
 'tog-numberheadings' => 'Autuomatėškā numeroutė skėrsnelios',
 'tog-showtoolbar' => 'Ruodītė redagavėma rakondinė (JavaScript)',
 'tog-editondblclick' => 'Poslapiu redagavėms dvėgobu paspaudėmu (JavaScript)',
-'tog-editsection' => 'Ijongtė skėrsneliu redagavėma nauduojant nūruodas [taisītė]',
 'tog-editsectiononrightclick' => 'Ijongtė skėrsneliu redagavėma paspaudos skėrsnelė pavadėnėma<br />dešėniouju pelies klavėšu (JavaScript)',
-'tog-showtoc' => 'Ruodītė torėni, jē poslapī daugiau kāp 3 skėrsnelē',
 'tog-rememberpassword' => 'Atmintė prėsėjongėma infuormacėjė šėtom kuompioterī (daugiausē $1 {{PLURAL:$1|dėina|dėinuom}})',
 'tog-watchcreations' => 'Pridietė poslapius, katrūs sokorio, i keravuojamu sāraša',
 'tog-watchdefault' => 'Pridietė poslapius, katrūs taisau, i keravuojamu sāraša',
@@ -693,7 +690,6 @@ Kėtė admėnėstratuorē šėtom pruojekte vėsdar galės pasėiktė pasliepta
 'lineno' => 'Eilotė $1:',
 'compareselectedversions' => 'Palīgintė pasėrinktas versėjės',
 'editundo' => 'atšauktė',
-'diff-multi' => '($2 {{PLURAL:$2|nauduotoja|nauduotoju|naudotoju}} $1 {{PLURAL:$1|tarpėnis keitėms nier ruodomos|tarpėnē keitėmā nier ruodomė|tarpėniu keitėmu nier ruodoma}})',
 
 # Search results
 'searchresults' => 'Paėiškuos rezoltatā',
@@ -1252,7 +1248,6 @@ Jēgo bikumet ožsėnuorietomiet liautėis keravuotė straipsnė, spauskat \"neb
 'watchmethod-recent' => 'tėkrėnamė vielībė̅jė pakeitėmā keravuojamiems poslapiams',
 'watchmethod-list' => 'Ėiškuoma vielībūju pakeitėmu keravuojamūs poslapiūs',
 'watchlistcontains' => 'Tamstas kervuojamu sārašė īr $1 {{PLURAL:$1|poslapis|poslapē|poslapiu}}.',
-'wlnote' => "Ruoduoma '''$1''' paskotėniu pakeitėmu, atlėktū par '''$2''' paskotėniu adīnu.",
 'wlshowlast' => 'Ruodītė paskotėniu $1 adīnu, $2 dėinū a $3 pakeitėmus',
 'watchlist-options' => 'Keravuojamu sāroša pasėrinkėmā',
 
index 09bb600..4a58588 100644 (file)
@@ -209,7 +209,6 @@ $linkTrail = '/^([a-zčćđžš]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Podvuci linkove:',
-'tog-justify' => 'Uravnaj pasuse',
 'tog-hideminor' => 'Sakrij manje izmjene u spisku nedavnih izmjena',
 'tog-hidepatrolled' => 'Sakrij patrolirane izmjene u nedavnim promjenama',
 'tog-newpageshidepatrolled' => 'Sakrij patrolirane stranice sa spiska novih stranica',
@@ -370,7 +369,6 @@ $messages = array(
 'vector-action-protect' => 'Zaštiti',
 'vector-action-undelete' => 'Vrati obrisano',
 'vector-action-unprotect' => 'Promijeni zaštitu',
-'vector-simplesearch-preference' => 'Omogući traku za pojednostavljenu pretragu (samo Vector skin)',
 'vector-view-create' => 'Napravi',
 'vector-view-edit' => 'Uredi',
 'vector-view-history' => 'Pregled historije',
@@ -420,7 +418,7 @@ $messages = array(
 'talk' => 'Razgovor / Разговор',
 'views' => 'Pregledi',
 'toolbox' => 'Alatke / Алатке',
-'userpage' => 'Pogledajte korisničku stranicu',
+'userpage' => 'Pogledaj korisničku stranicu - Погледај корисничку страницу',
 'projectpage' => 'Pogledajte stranicu projekta',
 'imagepage' => 'Vidi stranicu datoteke/fajla',
 'mediawikipage' => 'Pogledaj stranicu s porukom',
@@ -462,7 +460,7 @@ $1',
 'policy-url' => 'Project:Pravila',
 'portal' => 'Portal zajednice',
 'portal-url' => 'Project:Portal_zajednice',
-'privacy' => 'Politika privatnosti',
+'privacy' => 'Politika privatnosti - Политика приватности',
 'privacypage' => 'Project:Pravila o anonimnosti',
 
 'badaccess' => 'Greška pri odobrenju',
@@ -634,7 +632,7 @@ Ne zaboravite izmijeniti vlastite [[Special:Preferences|{{SITENAME}} postavke]].
 'login' => 'Prijavi me - Пријави ме',
 'nav-login-createaccount' => 'Prijavi se / Registruj se',
 'loginprompt' => "Morate imati kolačiće ('''cookies''') omogućene da biste se prijavili na {{SITENAME}}.",
-'userlogin' => 'Prijavi se / stvori korisnički račun',
+'userlogin' => 'Prijavi se / Пријави се',
 'userloginnocreate' => 'Prijavi se',
 'logout' => 'Odjavi se - Одјави се',
 'userlogout' => 'Odjavi se / Одјави се',
@@ -1069,7 +1067,7 @@ Ovakvi argumenti se trebaju izbjegavati.",
 Molimo da provjerite usporedbu ispod da budete sigurni da to želite učiniti, a zatim spremite promjene da bi ste završili vraćanje izmjene.',
 'undo-failure' => 'Izmjene se ne mogu vratiti zbog konflikta sa izmjenama u međuvremenu.',
 'undo-norev' => 'Izmjena se ne može vratiti jer ne postoji ranija ili je obrisana.',
-'undo-summary' => 'Vraćena izmjena $1 [[Special:Contributions/$2|korisnika $2]] ([[User talk:$2|razgovor]])',
+'undo-summary' => 'Poništena izmjena $1 [[Special:Contributions/$2|korisnika $2]] ([[User talk:$2|razgovor]])',
 'undo-summary-username-hidden' => 'Poništi izmjenu $1 od skrivenog korisnika',
 
 # Account creation failure
@@ -1247,7 +1245,6 @@ Korištenje navigacionih linkova će resetovati ovaj stupac.',
 'showhideselectedversions' => 'Pokaži/sakrij odabrane verzije',
 'editundo' => 'ukloni ovu izmjenu - уклони ову измену',
 'diff-empty' => '(nema razlike)',
-'diff-multi' => '({{PLURAL:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}}) od strane {{PLURAL:$2|korisnika|korisnika}}',
 'diff-multi-manyusers' => '({{PLURAL:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}}) od strane {{PLURAL:$2|korisnika|korisnika}}',
 'difference-missing-revision' => 'Ne mogu da pronađem {{PLURAL:$2|jednu izmenu|$2 izmene|$2 izmena}} od ove razlike ($1).
 
@@ -1617,8 +1614,8 @@ u zadnjih / у последњних $2 dana / дана<br />
 <br>
 $3
 <br>',
-'diff' => 'razl',
-'hist' => 'hist',
+'diff' => 'razl-разл',
+'hist' => 'his-пов',
 'hide' => 'Sakrij',
 'show' => 'prikaži / прикажи',
 'minoreditletter' => 'm/м',
@@ -1648,7 +1645,7 @@ Stranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podeblja
 'uploadbtn' => 'Postavi datoteku',
 'reuploaddesc' => 'Vratite se na upitnik za slanje',
 'upload-tryagain' => 'Pošaljite izmijenjeni opis datoteke',
-'uploadnologin' => 'Niste prijavljeni',
+'uploadnologin' => 'Niste prijavljeni / Нисте пријављени',
 'uploadnologintext' => 'Morate biti $1 da bi ste slali datoteke.',
 'upload_directory_missing' => 'Folder za postavljanje ($1) nedostaje i webserver ga ne može napraviti.',
 'upload_directory_read_only' => 'Folder za postavljanje ($1) na webserveru je postavljen samo za čitanje.',
@@ -2913,7 +2910,7 @@ Molimo pokušajte ponovno.',
 'import-rootpage-nosubpage' => 'Imenski prostor „$1“ osnovne stranice ne dozvoljava podstranice.',
 
 # Import log
-'importlogpage' => 'Registar uvoza',
+'importlogpage' => 'Evidencija uvoza stranica',
 'importlogpagetext' => 'Administrativni uvozi stranica s historijom izmjena sa drugih wikija.',
 'import-logentry-upload' => 'uvezen/a [[$1]] postavljanjem datoteke',
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|revizija|revizije|revizija}}',
index c916647..8a355f2 100644 (file)
@@ -15,7 +15,6 @@
 $messages = array(
 # User preference toggles
 'tog-underline' => 'krrj du izdayn:',
-'tog-justify' => 'skr lɛrd n-stor ɣ togzimin aygiddi',
 'tog-hideminor' => 'Ḥbu imbddl imaynutn lli fssusnin.',
 'tog-hidepatrolled' => 'Hide patrolled edits in recent changes',
 'tog-newpageshidepatrolled' => 'Ḥbu tisniwin lli n tsagga gr tisniwin timaynutin',
@@ -24,9 +23,7 @@ $messages = array(
 'tog-numberheadings' => 'nmra n nsmiat wahdot',
 'tog-showtoolbar' => 'sbaynd tizikrt n tbddil(JavaScript)',
 'tog-editondblclick' => 'Ẓrig tisniwin ad s uklik snat wal ( ira mayad JavaScript)',
-'tog-editsection' => 'Mmurzm i imbddln n w-ayyawn izdayn n « [Bddel] »',
 'tog-editsectiononrightclick' => 'Yan uklik s tsga tafasi f uzwl n w-ayyaw bac ad tsbadlt ɣtad (ira JavaScript)',
-'tog-showtoc' => 'Mel Taflwit n tngawin (i tisniwin lli dar 3 w-ayyawn)',
 'tog-rememberpassword' => 'Askti nu ukcum ɣ Urdinaturad (Iɣ kullu tggut $1 {{PLURAL:$1|Ass|Ass}})',
 'tog-watchcreations' => 'Zaydn tasniwin lli skrɣ i umuɣ n tilli ssuġiɣ.',
 'tog-watchdefault' => 'Zaydn tasniwin lli tżrigɣ i umuɣ n tilli tsaggaɣ',
@@ -574,7 +571,6 @@ Tigira n ujbbad ns, ar takka yat tayafut bahra imqqurn,  ɣayan afan ur ttili.',
 'compareselectedversions' => 'Snahya gr ilqmn lli tuystaynin',
 'showhideselectedversions' => 'Ml/Ḥbu ilqmn lli ittuystayn',
 'editundo' => 'Urri',
-'diff-multi' => '({{PLURAL:$1|yan ulqm gratsn|$1 ilqmn gratsn}} z {{PLURAL:$2|umqdac|$2 imqdacn}} {{PLURAL:$1|iḥba|ḥban}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|yan ulqm n gratsn|$1 ilqmn ngratsn}} zdar mnnaw {{PLURAL:$2|amcgr |n $2 imcgrn}} {{PLURAL:$1|iḥba|lli iḥban}})',
 
 # Search results
@@ -654,7 +650,6 @@ Izdar ad urtili ɣ isbidn n mayllan ɣ {{SITENAME}} .',
 'rows' => 'sfof:',
 'columns' => 'aamida:',
 'searchresultshead' => 'Cabba',
-'resultsperpage' => 'adad nataij gh sfha:',
 'stub-threshold' => 'wasla n  <a href="#" class="stub">do amzdoy</a> itforma (bytes):',
 'stub-threshold-disabled' => 'moattal',
 'recentchangesdays' => 'adad liyam lmroda gh ahdat tghyirat',
@@ -1041,7 +1036,6 @@ Maya Iẓḍar ad iglb zzu uzddar ar aflla tasna yad lli bdda n nttagga. Illa fl
 'tooltip-pt-watchlist' => 'Tifilit n tisnatin li itsaggan imdddeln li gisnt ittyskarn..',
 'tooltip-pt-mycontris' => 'Tabdart n ismmadn inu',
 'tooltip-pt-login' => 'Yufak at qiyt akcum nek, mach ur fllak ibziz .',
-'tooltip-pt-anonlogin' => 'Ifulki at tqiyt akcum nek, mac ur fllak iga bziz',
 'tooltip-pt-logout' => 'Affuɣ',
 'tooltip-ca-talk' => 'Assays f mayllan ɣ tasnat ad',
 'tooltip-ca-edit' => 'Tzḍaṛt  at tsbadelt tasna yad. Ifulki iɣt zwar turmt ɣ tasna w-arm',
index d1f65c0..57b9345 100644 (file)
@@ -193,7 +193,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'සබැඳි යටීර කිරීම:',
-'tog-justify' => 'ඡේදයන් පෙළගස්වන්න',
 'tog-hideminor' => 'මෑත වෙනස් කිරීම්වල සුළු සංස්කරණ සඟවන්න',
 'tog-hidepatrolled' => 'මෑත වෙනස් කිරීම්වල මුර සංචාරය කරන ලද සංස්කරණ සඟවන්න',
 'tog-newpageshidepatrolled' => 'විමසුමට ලක්කෙරුණු පිටු, අළුත් පිටු ලැයිස්තුවෙහි නොපෙන්වන්න',
@@ -1190,7 +1189,6 @@ $1",
 'compareselectedversions' => 'තෝරාගත් සංශෝධන සසඳන්න',
 'showhideselectedversions' => 'තෝරාගත් සංශෝධන පෙන්වන්න/සඟවන්න',
 'editundo' => 'අහෝසිය',
-'diff-multi' => '({{PLURAL:$2|එක් පරිශීලකයෙක්|පරිශීලකයන් $2 ක්}} විසින් සිදුකල {{PLURAL:$1|එක් අතරමැදි සංශෝධනයක්|අතරමැදි සංශෝධන $1 ක්}} පෙන්නුම් කර නොමැත.)',
 'diff-multi-manyusers' => '(පරිශීලකයන් $2 කට වඩා වැඩි ගණනකගේ ආසන්න පුනරීක්‍ෂණ $1ක් පෙන්වා නොමැත)',
 
 # Search results
@@ -2171,7 +2169,6 @@ When filtered by user, only files where that user uploaded the most recent versi
 'watchmethod-list' => 'මෑත සංස්කරණයන් සඳහා මුර-කෙරෙන පිටු පරික්‍ෂා කරමින්',
 'watchlistcontains' => 'ඔබගේ මුර-ලැයිස්තුවෙහි  {{PLURAL:$1|එක් පිටුවක්|පිටු $1 ක්}} අඩංගුය.',
 'iteminvalidname' => "'$1' අයිතමය පිළිබඳ ගැටළුවක් ඇත, අනීතික නමකි...",
-'wlnote' => "පහත දැක්වෙන්නේ $3, $4 මෙන්, අවසන් {{PLURAL:$2|පැය|පැය '''$2''' }} තුලදී සිදු කෙරී ඇති {{PLURAL:$1|අවසන් වෙනස්වීම්යි |අවසන් වෙනස්වීම්  '''$1''' යි}}.",
 'wlshowlast' => 'පසුගිය පැය $1 දින $2 $3 පෙන්වන්න',
 'watchlist-options' => 'තෝරාගතහැකි මුර ලැයිස්තු සැකසුම්',
 
@@ -2810,7 +2807,6 @@ $1 ගේ වාරණයට හේතුව මෙය වේ: "$2"',
 'tooltip-pt-watchlist' => 'වෙනස්වීම් සිදුවී තිබේදැයි යන්න පිලිබඳව ඔබගේ විමසුමට ලක්ව ඇති පිටු ලැයිස්තුව',
 'tooltip-pt-mycontris' => 'ඔබගේ දායකත්වයන් ලැයිස්තුව‍',
 'tooltip-pt-login' => 'පිවිසීම කෙරෙහි ඔබ උද්‍යෝගිමත් කෙරෙයි. එහෙත්, එය අනිවාර්ය නැත',
-'tooltip-pt-anonlogin' => 'එය අවශ්‍ය‍යෙන් කල යුත්තක් ‍නොවුනද, ප්‍රවිෂ්ට වීම සඳහා ඔබ ධෛර්යමත් කරනු ලැබේ.',
 'tooltip-pt-logout' => 'නික්මීම',
 'tooltip-ca-talk' => 'අන්තර්ගත පිටුව පිළිබඳ සාකච්ඡාව',
 'tooltip-ca-edit' => 'ඔබ‍ට මෙම පිටුව සංස්කරණය කල හැක. සුරැකීමට පෙර කරුණාකර පෙරදසුන බොත්තම භාවිතා කරන්න',
index a9f0aa4..8180932 100644 (file)
@@ -285,7 +285,6 @@ $linkTrail = '/^([a-záäčďéíľĺňóôŕšťúýž]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Podčiarkovať odkazy:',
-'tog-justify' => 'Zarovnávať okraje odstavcov',
 'tog-hideminor' => 'V posledných úpravách nezobrazovať drobné úpravy',
 'tog-hidepatrolled' => 'Skryť strážené úpravy v Posledných úpravách',
 'tog-newpageshidepatrolled' => 'Skryť strážené stránky zo zoznamu nových stránok',
@@ -555,8 +554,8 @@ $1',
 'youhavenewmessages' => 'Máte $1 ($2).',
 'youhavenewmessagesfromusers' => 'Máte $1 od {{PLURAL:$3|iného používateľa|$3 iných používateľov}} ($2).',
 'youhavenewmessagesmanyusers' => 'Máte $1 od viacerých ďalších používateľov ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|novú správu|nové správy}}',
-'newmessagesdifflinkplural' => '{{PLURAL:$1|posledná zmena|posledné zmeny}}',
+'newmessageslinkplural' => '{{PLURAL:$1|nová správa|999=nové správy}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|zmena|999=zmeny}}',
 'youhavenewmessagesmulti' => 'Máte nové správy na $1',
 'editsection' => 'upraviť',
 'editold' => 'upraviť',
@@ -683,7 +682,7 @@ Správca, ktorý ho zamkol ponúkol toto vysvetlenie: „$3“.',
 'invalidtitle-knownnamespace' => 'Neplatný názov s menným priestorom „$2“ a textom „$3“',
 'invalidtitle-unknownnamespace' => 'Neplatný názov s neznámym číslom menného priestoru „$1“ a textom „$2“',
 'exception-nologin' => 'Nie ste prihlásený',
-'exception-nologin-text' => 'Táto stránka alebo operácia vyžaduje, aby ste boli na tejto wiki prihlásení.',
+'exception-nologin-text' => 'Táto stránka alebo operácia vyžaduje, aby ste [[Special:Userlogin|boli prihlásený]].',
 
 # Virus scanner
 'virus-badscanner' => "Chybná konfigurácia: neznámy antivírus: ''$1''",
@@ -779,7 +778,7 @@ Skontrolujte preklepy alebo sa [[Special:UserLogin/signup|zaregistrujte ako nov
 'passwordtooshort' => 'Heslo musí mať dĺžku aspoň $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 'password-name-match' => 'Vaše heslo musí byť iné ako vaše používateľské meno.',
 'password-login-forbidden' => 'Použitie tohto používateľského mena a hesla bolo zakázané.',
-'mailmypassword' => 'Pošlite mi e-mailom dočasné heslo',
+'mailmypassword' => 'Obnoviť heslo',
 'passwordremindertitle' => 'Nové dočasné heslo pre {{GRAMMAR:akuzatív|{{SITENAME}}}}',
 'passwordremindertext' => 'Niekto (pravdepodobne vy, z IP adresy $1)
 požiadal, aby sme vám zaslali nové prihlasovacie heslo do {{GRAMMAR:genitív|{{SITENAME}}}} ($4).
@@ -841,6 +840,7 @@ Ak sa rozhodnete ho poskytnúť, použije sa na označenie vašej práce.',
 'retypenew' => 'Nové heslo (ešte raz):',
 'resetpass_submit' => 'Nastaviť heslo a prihlásiť sa',
 'changepassword-success' => 'Vaše heslo bolo úspešne zmenené!',
+'changepassword-throttled' => 'Uskutočnili ste príliš mnoho neúspešných pokusov o prihlásenie. Prosím, počkajte $1 predtým, než to skúsite znova.',
 'resetpass_forbidden' => 'Heslá nie je možné zmeniť',
 'resetpass-no-info' => 'Aby ste mohli priamo pristupovať k tejto stránke, musíte sa prihlásiť.',
 'resetpass-submit-loggedin' => 'Zmeniť heslo',
@@ -898,6 +898,7 @@ Dočasné heslo:$2',
 'changeemail-password' => 'Vaše heslo k {{GRAMMAR:lokál|{{SITENAME}}}}:',
 'changeemail-submit' => 'Zmeniť e-mail',
 'changeemail-cancel' => 'Zrušiť',
+'changeemail-throttled' => 'Uskutočnili ste príliš mnoho neúspešných pokusov o prihlásenie. Prosím, počkajte $1 predtým, než to skúsite znova.',
 
 # Special:ResetTokens
 'resettokens' => 'Obnoviť tokeny',
@@ -1327,7 +1328,6 @@ Uistite sa, že táto zmena zachová historickú kontinuitu zmien stránky.',
 'showhideselectedversions' => 'Zobraziť/skryť vybrané revízie',
 'editundo' => 'vrátiť',
 'diff-empty' => '(Žiaden rozdiel)',
-'diff-multi' => '{{PLURAL:$1|Jedna medziľahlá revízia|$1 medziľahlé revízie|$1 medziľahlých revízií}} od {{PLURAL:$2|jedného používateľa|$2 používateľov}} {{PLURAL:$1|nie je zobrazená|nie sú zobrazené|nie je zobrazených}}.',
 'diff-multi-manyusers' => '({{PLURAL:$1|$1 medziľahlá revízia|$1 medziľahlé revízie|$1 medziľahlých revízií}} od viac ako {{PLURAL:$2|$2 používateľa|$2 používateľov}} {{PLURAL:$1|nie je zobrazená|nie sú zobrazené|nie je zobrazených}})',
 'difference-missing-revision' => '{{PLURAL:$2|$2 revízia|$2 revízie|$2 revízií}} pre požadovaný rozdiel ($1) {{PLURAL:$2|neexistuje|neexistujú|neexistuje}}.
 
@@ -1348,7 +1348,7 @@ Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'shown-title' => 'Zobraziť $1 {{PLURAL:$1|výsledok|výsledky|výsledkov}} na stránku',
 'viewprevnext' => 'Zobraziť ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "*Stránka '''[[$1]]'''",
-'searchmenu-new' => "'''Vytvoriť stránku „[[:$1|$1]]“ na tejto wiki'''",
+'searchmenu-new' => '<strong>Vytvoriť na tejto wiki stránku „[[:$1|$1]]“!</strong> {{PLURAL:$2|0=|Pozrite si tiež stránku nájdenú vašim vyhľadávaním.|Pozrite si tiež stránky nájdené vašim vyhľadávaním.}}',
 'searchprofile-articles' => 'Stránky s obsahom',
 'searchprofile-project' => 'Stránky pomocníka a projektu',
 'searchprofile-images' => 'Multimédiá',
@@ -1689,7 +1689,7 @@ Softvér používa toto nastavenie na správne oslovenie a označenie vás ostat
 'rclistfrom' => 'Zobraziť nové úpravy počnúc od $1',
 'rcshowhideminor' => '$1 drobné úpravy',
 'rcshowhidebots' => '$1 botov',
-'rcshowhideliu' => '$1 prihlásených používateľov',
+'rcshowhideliu' => '$1 registrovaní užívatelia',
 'rcshowhideanons' => '$1 anonymných používateľov',
 'rcshowhidepatr' => '$1 úpravy strážených stránok',
 'rcshowhidemine' => '$1 moje úpravy',
@@ -2367,7 +2367,6 @@ Budú tam uvedené aj budúce úpravy tejto stránky a jej diskusie.',
 'watchmethod-list' => 'kontrolujú posledné úpravy v sledovaných stránkach',
 'watchlistcontains' => 'Váš zoznam sledovaných obsahuje {{PLURAL:$1|jednu stránku|$1 stránky|$1 stránok}}.',
 'iteminvalidname' => 'Problém s položkou „$1“, neplatné meno...',
-'wlnote' => "Nižšie {{PLURAL:$1|je posledná jedna zmena|sú posledné '''$1''' zmeny|je posledných '''$1''' zmien}} za {{PLURAL:$2|poslednú hodinu|posledné '''$2''' hodiny|posledných '''$2''' hodín}} do $4, $3.",
 'wlshowlast' => 'Zobraziť posledných $1 hodín $2 dní $3',
 'watchlist-options' => 'Nastavenia zoznamu sledovaných',
 
@@ -2922,6 +2921,7 @@ Prosím, navštívte [https://www.mediawiki.org/wiki/Localisation MediaWiki Loca
 'allmessages-prefix' => 'Filter podľa predpony:',
 'allmessages-language' => 'Jazyk:',
 'allmessages-filter-submit' => 'Vykonať',
+'allmessages-filter-translate' => 'Preložiť',
 
 # Thumbnails
 'thumbnail-more' => 'Zväčšiť',
@@ -3015,7 +3015,6 @@ Uložte ho na svoj disk a nahrajte sem.',
 'tooltip-pt-watchlist' => 'Zoznam stránok, na ktorých sledujete zmeny.',
 'tooltip-pt-mycontris' => 'Zoznam vašich príspevkov',
 'tooltip-pt-login' => 'Odporúčame vám prihlásiť sa, nie je to však povinné.',
-'tooltip-pt-anonlogin' => 'Odporúčame vám prihlásiť sa, nie je to však povinné.',
 'tooltip-pt-logout' => 'Odhlásiť',
 'tooltip-ca-talk' => 'Diskusia o obsahu stránky',
 'tooltip-ca-edit' => 'Môžete upravovať túto stránku. Prosím, pred uložením použite tlačidlo Zobraziť náhľad.',
@@ -3882,6 +3881,7 @@ Tiež môžete [[Special:EditWatchlist|použiť štandardný editor]].',
 'version-hook-subscribedby' => 'Pripojené',
 'version-version' => '(Verzia $1)',
 'version-license' => 'Licencia',
+'version-ext-colheader-version' => 'Verzia',
 'version-poweredby-credits' => "Táto wiki beží na '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'ďalší',
 'version-poweredby-translators' => 'prekladatelia na translatewiki.net',
@@ -3906,6 +3906,7 @@ Spolu s týmto programom by ste obdržať [{{SERVER}}{{SCRIPTPATH}}/COPYING kóp
 'redirect-lookup' => 'Vyhľadať:',
 'redirect-value' => 'Hodnota:',
 'redirect-user' => 'ID používateľa',
+'redirect-page' => 'ID stránky',
 'redirect-revision' => 'Revíziu stránky',
 'redirect-file' => 'Názov súboru',
 'redirect-not-exists' => 'Hodnota nebola nájdená',
index 9682e61..ba38fa5 100644 (file)
@@ -188,7 +188,6 @@ $separatorTransformTable = array( ',' => '.', '.' => ',' );
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Podčrtavanje povezav:',
-'tog-justify' => 'Poravnavaj odstavke',
 'tog-hideminor' => 'Skrij manjše popravke v zadnjih spremembah',
 'tog-hidepatrolled' => 'Skrij pregledana urejanja v zadnjih spremembah',
 'tog-newpageshidepatrolled' => 'Skrij pregledane strani iz seznama novih strani',
@@ -350,7 +349,6 @@ $messages = array(
 'vector-action-protect' => 'Zaščiti',
 'vector-action-undelete' => 'Vrni',
 'vector-action-unprotect' => 'Spremeni zaščito',
-'vector-simplesearch-preference' => 'Omogoči poenostavljeno vrstico za iskanje (samo koža Vector)',
 'vector-view-create' => 'Ustvari',
 'vector-view-edit' => 'Uredi',
 'vector-view-history' => 'Zgodovina',
@@ -756,6 +754,8 @@ Za zaključitev prijave, morate tukaj nastaviti novo geslo:',
 'retypenew' => 'Ponovno vpišite geslo:',
 'resetpass_submit' => 'Nastavi geslo in se prijavi',
 'changepassword-success' => 'Vaše geslo je bilo uspešno spremenjeno!',
+'changepassword-throttled' => 'Nedavno ste izvedli preveč poskusov prijave.
+Prosimo, počakajte $1, preden poskusite znova.',
 'resetpass_forbidden' => 'Gesla ne morete spremeniti',
 'resetpass-no-info' => 'Za neposreden dostop do te strani morate biti prijavljeni.',
 'resetpass-submit-loggedin' => 'Spremenite geslo',
@@ -816,6 +816,8 @@ Začasno geslo: $2',
 'changeemail-password' => 'Vaše geslo za {{GRAMMAR:tožilnik|{{SITENAME}}}}:',
 'changeemail-submit' => 'Spremeni e-naslov',
 'changeemail-cancel' => 'Prekliči',
+'changeemail-throttled' => 'Izvedli ste preveč poskusov prijave.
+Prosimo, počakajte $1, preden poskusite znova.',
 
 # Special:ResetTokens
 'resettokens' => 'Ponastavitev žetonov',
@@ -1031,8 +1033,9 @@ Izgleda, da je bila izbrisana.',
 'invalid-content-data' => 'Neveljavni podatki vsebine',
 'content-not-allowed-here' => 'Vsebina »$1« ni dovoljena na strani [[$2]]',
 'editwarning-warning' => 'Če zapustite stran, boste morda izgubili vse spremembe, ki ste jih naredili.
-Če ste prijavljeni, lahko to opozorilo onemogočite v razdelku »Urejanje« v svojih nastavitvah.',
+Če ste prijavljeni, lahko to opozorilo onemogočite v razdelku »{{int:prefs-editing}}« v svojih nastavitvah.',
 'editpage-notsupportedcontentformat-title' => 'Oblika vsebine ni podprta',
+'editpage-notsupportedcontentformat-text' => 'Model vsebine $2 ne podpira oblike vsebine $1.',
 
 # Content models
 'content-model-wikitext' => 'wikibesedilo',
@@ -1066,6 +1069,7 @@ Naslednji argumenti so bili izpuščeni.",
 'undo-success' => 'Urejanje ste razveljavili. Prosimo, preverite prikazano primerjavo redakcij in, če ustrezajo, shranite spremembe.',
 'undo-failure' => 'Zaradi navzkrižij urejanj, ki so se vmes pojavila, tega urejanja ni moč razveljaviti.',
 'undo-norev' => 'Urejanja ni mogoče razveljaviti, ker ne obstaja ali je bilo izbrisano.',
+'undo-nochange' => 'Zdi se, da je urejanje nekdo že razveljavil.',
 'undo-summary' => 'Redakcija $1 uporabnika [[Special:Contributions/$2|$2]] ([[User talk:$2|pogovor]]) razveljavljena',
 'undo-summary-username-hidden' => 'Razveljavi redakcijo $1 skritega uporabnika',
 
@@ -1247,7 +1251,8 @@ Upoštevajte, da bo uporaba navigacijskih gumbov ponastavila ta stolpec.',
 'showhideselectedversions' => 'Prikaži/skrij izbrane redakcije',
 'editundo' => 'razveljavi',
 'diff-empty' => '(Ni razlike)',
-'diff-multi' => '({{PLURAL:$1|$1 vmesna redakcija|$1 vmesni redakciji|$1 vmesne redakcije|$1 vmesnih redakcij}} {{PLURAL:$2|$2 uporabnika|$2 uporabnikov}} {{PLURAL:$1|ni prikazana|nista prikazani|niso prikazane|ni prikazanih}})',
+'diff-multi-sameuser' => '({{PLURAL:$1|1=Vmesna redakcija|$1 vmesna redakcija|$1 vmesni redakciji|$1 vmesne redakcije|$1 vmesnih redakcij}} istega uporabnika ni prikazana)',
+'diff-multi-otherusers' => '({{PLURAL:$1|1=Vmesna redakcija|$1 vmesna redakcija|$1 vmesni redakciji|$1 vmesne redakcije|$1 vmesnih redakcij}} {{PLURAL:$2|1=drugega uporabnika|$2 uporabnikov}} ni prikazana)',
 'diff-multi-manyusers' => '({{PLURAL:$1|$1 vmesna redakcija|$1 vmesni redakciji|$1 vmesne redakcije|$1 vmesnih redakcij}} več kot $2 {{PLURAL:$2|uporabnika|uporabnikov}} {{PLURAL:$1|ni prikazana|nista prikazani|niso prikazane|ni prikazanih}})',
 'difference-missing-revision' => '{{PLURAL:$2|Ene redakcije|$2 redakcij}} razlike ($1) {{PLURAL:$2|nisem}} našel.
 
@@ -1268,7 +1273,7 @@ Podrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'shown-title' => 'Prikaži $1 {{PLURAL:$1|rezultat|rezultata|rezultate|rezultatov}} na stran',
 'viewprevnext' => 'Prikazujem ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Na tem wikiju obstaja stran »[[:$1]]«'''",
-'searchmenu-new' => "'''Ustvari stran »[[:$1]]« na tem wikiju!'''",
+'searchmenu-new' => '<strong>Ustvari stran »[[:$1]]« na tem wikiju!</strong> {{PLURAL:$2|0=|Oglejte si tudi rezultate iskanja.}}',
 'searchprofile-articles' => 'Članki',
 'searchprofile-project' => 'Pomoč in projektne strani',
 'searchprofile-images' => 'Večpredstavnost',
@@ -1284,6 +1289,7 @@ Podrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'search-result-score' => 'Ustreznost: $1%',
 'search-redirect' => '(preusmeritev $1)',
 'search-section' => '(razdelek $1)',
+'search-file-match' => '(ujema se z vsebino datoteke)',
 'search-suggest' => 'Iščete morda: $1',
 'search-interwiki-caption' => 'Sorodni projekti',
 'search-interwiki-default' => '$1 zadetkov:',
@@ -1293,6 +1299,7 @@ Podrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'searchrelated' => 'povezano',
 'searchall' => 'vse',
 'showingresults' => "Prikazujem do '''$1''' {{PLURAL:$1|zadetek|zadetka|zadetke|zadetkov}}, začenši s št. '''$2'''.",
+'showingresultsinrange' => 'Spodaj prikazujem {{PLURAL:$1|1=<strong>1</strong> rezultat|<strong>$1</strong> rezultata|<strong>$1</strong> rezultate|<strong>$1</strong> rezultatov}} v razponu od št. <strong>$2</strong> do št. <strong>$3</strong>.',
 'showingresultsnum' => "Prikazujem '''$3''' {{PLURAL:$3|zadetek|zadetka|zadetke|zadetkov|zadetkov}}, začenši s št. '''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Zadetek '''$1''' od '''$3'''|Zadetki '''$1 - $2''' od skupno '''$3'''}} za povpraševanje '''$4'''",
 'search-nonefound' => 'Ni bilo zadetkov, ki ustrezajo poizvedbi.',
@@ -2126,10 +2133,20 @@ Sedaj je preusmeritev na [[$2]].',
 'deadendpagestext' => 'Spodaj navedene strani se ne povezujejo na druge članke v {{GRAMMAR:dajalnik|{{SITENAME}}}}.',
 'protectedpages' => 'Zaščitene strani',
 'protectedpages-indef' => 'Samo neomejene zaščite',
+'protectedpages-summary' => 'Stran navaja obstoječe strani, ki so trenutno zaščitene. Za seznam strani, ki so zaščitene pred ustvarjanjem, glej [[{{#special:ProtectedTitles}}]].',
 'protectedpages-cascade' => 'Le kaskadne zaščite',
 'protectedpages-noredirect' => 'Skrij preusmeritve',
 'protectedpagesempty' => 'Nobena stran ni trenutno zaščitena s temi parametri.',
+'protectedpages-timestamp' => 'Časovni žig',
+'protectedpages-page' => 'Stran',
+'protectedpages-expiry' => 'Poteče',
+'protectedpages-performer' => 'Zaščitni uporabnik',
+'protectedpages-params' => 'Parametri zaščite',
+'protectedpages-reason' => 'Razlog',
+'protectedpages-unknown-timestamp' => 'Neznano',
+'protectedpages-unknown-performer' => 'Neznani uporabnik',
 'protectedtitles' => 'Zaščiteni naslovi',
+'protectedtitles-summary' => 'Stran navaja obstoječe strani, ki so trenutno zaščitene pred ustvarjanjem. Za seznam obstoječih strani, ki so zaščitene, glej [[{{#special:ProtectedPages}}]].',
 'protectedtitlesempty' => 'Noben naslov ni trenutno zaščiten s temi parametri.',
 'listusers' => 'Seznam uporabnikov',
 'listusers-editsonly' => 'Pokaži samo uporabnike z urejanji',
@@ -2315,7 +2332,7 @@ Tam bodo navedene prihodnje spremembe te strani in pripadajoče pogovorne strani
 'watchmethod-list' => 'med spremljanimi stranmi iščem nedavna urejanja',
 'watchlistcontains' => 'Spremljate $1 {{PLURAL:$1|stran|strani}}.',
 'iteminvalidname' => 'Težava z izbiro »$1«, neveljavno ime ...',
-'wlnote' => "{{PLURAL:$1|Navedena je zadnja|Navedeni sta zadnji|Navedene so zadnje|Navedenih je zadnjih}} '''$1''' {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb}} v {{PLURAL:$2|zadnji '''$2''' uri|zadnjih '''$2''' urah}}, od $3, $4.",
+'wlnote2' => 'Spodaj so navedene spremembe v {{PLURAL:$1|zadnji uri|zadnjih <strong>$1</strong> urah}}, od $2, $3.',
 'wlshowlast' => 'Prikaži zadnjih $1 ur; $2 dni; $3;',
 'watchlist-options' => 'Možnosti spiska nadzorov',
 
@@ -2404,7 +2421,7 @@ Izbris takšnih strani je bil omejen v izogib neželenim motnjam {{GRAMMAR:dativ
 'delete-warning-toobig' => 'Ta stran ima obsežno zgodovino urejanja, tj. čez $1 {{PLURAL:$1|redakcijo|redakciji|redakcije|redakcij}}.
 Njeno brisanje lahko zmoti obratovanje zbirke podatkov {{GRAMMAR:dative|{{SITENAME}}}};
 nadaljujte s previdnostjo.',
-'deleting-backlinks-warning' => "'''Opozorilo:''' Druge strani se povezujejo na stran, ki jo nameravate izbrisati.",
+'deleting-backlinks-warning' => "'''Opozorilo:''' Druge strani se povezujejo na ali vključujejo stran, ki jo nameravate izbrisati.",
 
 # Rollback
 'rollback' => 'Vrni spremembe',
@@ -2644,6 +2661,7 @@ Vnesite tudi razlog (''na primer'' seznam strani, ki jih je uporabnik po nepotre
 Oglejte si [[Special:BlockList|seznam blokad]] za pregled blokad.',
 'ipb-blockingself' => 'Nameravate se blokirati! Ste prepričani, da želite to storiti?',
 'ipb-confirmhideuser' => 'Nameravate blokirati uporabnika z omogočeno možnostjo »skrij uporabnika«. To bo skrilo uporabnikovo ime na vseh seznamih in dnevniških vnosih. Ste prepričani, da želite to storiti?',
+'ipb-confirmaction' => 'Če ste prepričani, da to res želite storiti, označite polje »{{int:ipb-confirm}}« na dnu.',
 'ipb-edit-dropdown' => 'Uredi razloge blokade',
 'ipb-unblock-addr' => 'Deblokiraj $1',
 'ipb-unblock' => 'Odblokirajte uporabniško ime ali IP-naslov',
@@ -2706,7 +2724,7 @@ Dnevnik skrivanja je na voljo spodaj:',
 'range_block_disabled' => 'Možnost administratorjev za blokiranje urejanja IP-razponom je onemogočena.',
 'ipb_expiry_invalid' => 'Neveljaven čas preteka',
 'ipb_expiry_temp' => 'Blokade skritih uporabniških imen morajo biti trajne.',
-'ipb_hide_invalid' => 'Ne morem skriti tega računa; morda ima preveč urejanj.',
+'ipb_hide_invalid' => 'Ne morem skriti tega računa; ima več kot $1 {{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}.',
 'ipb_already_blocked' => '"$1" je že blokiran',
 'ipb-needreblock' => '$1 je že blokiran.
 Ali želite spremeniti nastavitve blokade?',
@@ -2880,6 +2898,7 @@ Za lokalizacijo in prevajanje obiščite [https://www.mediawiki.org/wiki/Localis
 'allmessages-prefix' => 'Filtriraj po predponi:',
 'allmessages-language' => 'Jezik:',
 'allmessages-filter-submit' => 'Pojdi',
+'allmessages-filter-translate' => 'Prevedi',
 
 # Thumbnails
 'thumbnail-more' => 'Povečaj',
@@ -2896,6 +2915,7 @@ $2',
 'thumbnail_image-type' => 'Vrsta slike ni podprta',
 'thumbnail_gd-library' => 'Nepopolna konfiguracija knjižice GD: manjka funkcija $1',
 'thumbnail_image-missing' => 'Kaže, da datoteka manjka: $1',
+'thumbnail_image-failure-limit' => 'Nedavno je bilo preveč spodletelih poskusov ($1 ali več) izdelave sličice. Prosimo, poskusite znova pozneje.',
 
 # Special:Import
 'import' => 'Uvoz strani',
@@ -2934,7 +2954,7 @@ Datoteka je bila prenesena samo delno.',
 Manjka začasna mapa.',
 'import-parse-failure' => 'Neuspeh razčlenitve uvoza XML',
 'import-noarticle' => 'Ni strani za uvoz!',
-'import-nonewrevisions' => 'Vse redakcije so bile že prej uvožene.',
+'import-nonewrevisions' => 'Uvozil nisem nobene redakcije (vse so bile že prisotne ali pa sem jih preskočil zaradi napak).',
 'xml-error-string' => '$1 v vrstici $2, znak $3 (zlog $4): $5',
 'import-upload' => 'Naložite podatke XML',
 'import-token-mismatch' => 'Izguba podatkov o seji.
@@ -2946,6 +2966,7 @@ Prosimo, poskusite znova.',
 '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-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>',
 'import-rootpage-invalid' => 'Podana korenska stran ni veljaven naslov.',
 'import-rootpage-nosubpage' => 'Imenski prostor »$1« korenske strani ne dovoli podstrani.',
@@ -2977,7 +2998,6 @@ Prosimo, poskusite znova.',
 'tooltip-pt-watchlist' => 'Seznam strani, katerih spremembe spremljate',
 'tooltip-pt-mycontris' => 'Seznam vaših prispevkov',
 'tooltip-pt-login' => 'Prijava ni obvezna, vendar je zaželena',
-'tooltip-pt-anonlogin' => 'Prijava ni obvezna, vendar je zaželena',
 'tooltip-pt-logout' => 'Odjavite se',
 'tooltip-ca-talk' => 'Pogovor o strani',
 'tooltip-ca-edit' => 'Stran lahko uredite. Preden jo shranite, uporabite gumb za predogled.',
index 3df405e..05af20c 100644 (file)
@@ -27,7 +27,6 @@ $fallback = 'de';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Verknipfonga unterstreeicha:',
-'tog-justify' => 'Obschniete eim Block setza',
 'tog-hideminor' => 'Klänne Änneronga ausblenda',
 'tog-hidepatrolled' => 'Gepriefte Änneronga ausblenda',
 'tog-newpageshidepatrolled' => 'Kontrollierte Seeta ei dar Liste "neue Seeta" verberga',
@@ -36,9 +35,7 @@ $messages = array(
 'tog-numberheadings' => 'Ieberschrifta automatisch nummeriern',
 'tog-showtoolbar' => 'Bearbta Werkzichleiste aozäan (beneeticht JavaScript)',
 'tog-editondblclick' => 'Seita mit Doppelklick bearbta (JavaScript)',
-'tog-editsection' => 'Links zum Bearbta vu eenzelner Obschnitte oazeiga',
 'tog-editsectiononrightclick' => 'Eenzelne Obschniete per Rechtsklick bearbta (JavaScript)',
-'tog-showtoc' => 'Inhaltsverzeichnis aozäan bei meh wie drei Ieberschrifta',
 'tog-rememberpassword' => 'Notzer sull uff de Lengde oagemeldt blein (login uff diesem Rechner speichern) (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'tog-watchcreations' => 'Salber derstallte Seyta automatisch beobachta',
 'tog-watchdefault' => 'Salber geänderte on neu erstellte Seyta automatisch beobachta (zu menner Beobachtungsliste hinzufügen)',
@@ -729,7 +726,6 @@ Stelle sicher, doaß de Versionsgeschichte anner Seite historisch korrekt ies.',
 'lineno' => 'Zeile $1:',
 'compareselectedversions' => 'Gewählte Versiona vergleichen',
 'editundo' => 'rieckgängig',
-'diff-multi' => '({{PLURAL:$1|Eine dazwischenliegende Version|$1 dazwischenliegende Versionen}} von {{PLURAL:$2|einem Benutzer|$2 Benutzern}} {{PLURAL:$1|wird|werden}} nicht angezeigt)',
 
 # Search results
 'searchresults' => 'Sichergebnisse',
@@ -790,7 +786,6 @@ Stelle sicher, doaß de Versionsgeschichte anner Seite historisch korrekt ies.',
 'prefs-editing' => 'Bearbta',
 'rows' => 'Zeila:',
 'columns' => 'Spalta:',
-'resultsperpage' => 'Treffer pro Seite:',
 'stub-threshold' => 'Linkformatierung <a href="#" class="stub">klenner Seyta</a> (ei Byte):',
 'recentchangesdays' => 'Oazoahl dar Tage, de de Liste dar „Letzta Änderunga“ standardmäßig imfassa sull:',
 'recentchangescount' => 'Oazoahl dar standardmäßig oagezeigta Beoarbeetunga:',
@@ -1369,7 +1364,6 @@ Wenn du de Seite wieder vu denner Beobachtungsliste entferna mechtest, klicke uf
 'watchmethod-list' => 'Ieberpriefa dar Beobachtungsliste noach letzta Beoarbeetunga',
 'watchlistcontains' => 'Denne Beobachtungsliste enthält $1 {{PLURAL:$1|Seite|Seita}}.',
 'iteminvalidname' => "Problem mi'm Eintrag „$1“, ungiltiger Noame.",
-'wlnote' => "Is {{PLURAL:$1|folgt de letzte Änderung|folga de letzta '''$1''' Änderunga}} dar letzta {{PLURAL:$2|Stunde|'''$2''' Stunda}}.",
 'wlshowlast' => 'Zeige de Änneronga dar letzta $1 Stonda, $2 Taage oder $3.',
 'watchlist-options' => 'Oazeegeoptiona',
 
@@ -1829,7 +1823,6 @@ Olle Transwiki-Import-Aksjonna waan eim [[Special:Log/import|Import-Logbuch]] pr
 'tooltip-pt-watchlist' => 'Liste dar beobachteta Seyta',
 'tooltip-pt-mycontris' => 'Liste denner Beiträge',
 'tooltip-pt-login' => 'Siech oazumelda werd zwoar gerne gesahn, ies oaber kenne Pflicht.',
-'tooltip-pt-anonlogin' => 'Siech oazumelda werd zwar gerne gesahn, ies oaber kenne Pflicht.',
 'tooltip-pt-logout' => 'Oabmelda',
 'tooltip-ca-talk' => 'Dischkur iebern Inhalt dar Seite',
 'tooltip-ca-edit' => "Seite bearbta. Bitte vur 'm Speichern de Vurschaufunktion benutza.",
index 967b8d2..ecf7706 100644 (file)
@@ -16,7 +16,6 @@
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Linkiga hoos ka calaamadeysan:',
-'tog-justify' => 'Geesdhig baaragaraafyada',
 'tog-hideminor' => 'Qari bedelada yar ee isbedelada dhow',
 'tog-hidepatrolled' => 'Qari wax bedelkii ugu danbeeyay oo la waardiyeeyay',
 'tog-newpageshidepatrolled' => 'Ka qari maqaalada la waardiyeeyay maqaalada kale ee cusub',
@@ -25,9 +24,7 @@ $messages = array(
 'tog-numberheadings' => 'Lambarada automaatik ahaan u tirinaayo Cinwaanada',
 'tog-showtoolbar' => 'Itus bedelka qalabka shaqada (waxaa loo baahanyahay JavaScript)',
 'tog-editondblclick' => 'wax ka bedel maqaalada labo jeer la riixay (waxaa loo baahanyahay JavaScript)',
-'tog-editsection' => 'Fasax wax ka bedelida cutubyada dhinaca linkiyada [wax ka bedel]',
 'tog-editsectiononrightclick' => 'Fasax cutub wax ka bedelida hadii batoonka midig ee dooliga <br /> dhag lagu siiyo cinwaanka korkiisa (JavaScript)',
-'tog-showtoc' => "I'tus jadwalka (boggaga leh in kabadan 3 qoraalada sare)",
 'tog-rememberpassword' => 'Kumbuyuutarkaan ku xasuusnaaw gudagalkeyga (ilaa  $1 {{PLURAL:$1|maalin|maalmood}})',
 'tog-watchcreations' => 'Ku dar boggaga aan aniga sameeyay liiskayga waardiyaha',
 'tog-watchdefault' => 'Ku dar boggaga aan wax ka bedelo liiskayga waardiyaha',
@@ -55,6 +52,7 @@ $messages = array(
 'tog-diffonly' => 'Kaladuwanaanshaha hoostooda qari qoraalka bogga',
 'tog-showhiddencats' => 'Itusi ereykoobyada qarsoon',
 'tog-norollbackdiff' => 'ha isticmaalin kala duwanaanshaha markii aad dib u soo celisay kadib',
+'tog-prefershttps' => 'Adeegso mar kasta qad aamin ah markaad soo galeeyso',
 
 'underline-always' => 'Marwalba',
 'underline-never' => 'Marnaba',
@@ -282,7 +280,7 @@ fiiri [[Special:Version|nooca bogga]].',
 'toc' => 'Qoraalka gudaha oo kooban',
 'showtoc' => "I'tus",
 'hidetoc' => 'qari',
-'collapsible-collapse' => 'woo halaabay',
+'collapsible-collapse' => 'Qari',
 'collapsible-expand' => 'Sii balaari',
 'thisisdeleted' => 'Fiiri ama soo celi $1?',
 'viewdeleted' => 'Fiiri $1?',
@@ -492,6 +490,7 @@ Fadlan waxyar sug intii aadan soo gelin.',
 'user-mail-no-addy' => "Isku dayday in aa dirto e-mail ayada oo ciwaan e-mail la'aan ah.",
 
 # Change password dialog
+'changepassword' => 'Bedel ereysirta',
 'resetpass_announce' => 'waxaa ku soo geshay eraysir ku meelgaar ah  oo e-mail laguugu soo diray.
 Hadii aad rabtid in aad dhameestirtid gudagelkaaga, waa in aad meeshaan ku qortaa eraysir oo cusub:',
 'resetpass_header' => 'bedel  ereyga sirta ee akoon-ka',
@@ -640,7 +639,7 @@ Fadlan markale isku day. Hadii aysan weli shaqaynin, ka bax ee markale soo gudag
 ''Sababtoo ah {{SITENAME}}han wuxuu leeyahay HTML ceyriin ah, horfiirintiisa waxaa loo qariyey si looga hortago weerar ka yimaada JavaScriptga.''
 
 '''Hadii wax ka bedlkaan uu yahay mid xaq ah, fadlan markale isku day. Hadii aysan weli shaqaynin, is kuday inaad  ka baxdo ee markale soo gudagal.'''",
-'editing' => 'Waxaad badalaysaa $1',
+'editing' => 'Waxaad bedel ku samaynaysaa $1',
 'creating' => 'Sameyta $1',
 'editingsection' => 'Waxaad wax ka bedelaysaa $1 (qeyb yar)',
 'editingcomment' => 'Waxaad wax ka bedelaysaa $1 (qeyb yar)',
@@ -810,6 +809,7 @@ sababteeda neh waxaa laga heli kartaa  [{{fullurl:{{#Special:Log}}/delete|page={
 'timezoneregion-atlantic' => 'Badweynta Atlaantik',
 'allowemail' => 'Ogolow in e-mail ay kaagatimaado isticmaalayaasha kale',
 'prefs-searchoptions' => 'Dooqyada raadinta',
+'prefs-emailconfirm-label' => 'Hubinta Email-ka:',
 'youremail' => 'E-mail:',
 'username' => 'Gudagal:',
 'uid' => 'Lambarka isticmaalaha:',
@@ -884,6 +884,9 @@ E-mailkaada mala sheegaayo markii ee dadka kale kula soo xiriirayaan.',
 'recentchanges-label-minor' => 'Kan waa bedel yar',
 'recentchanges-label-bot' => 'Badalkaan waxaa sameeyay bot',
 'recentchanges-label-unpatrolled' => 'bedelkaan hadda wali lama waardiyeen',
+'recentchanges-label-plusminus' => 'Qaadka bogga wuxuu ku bedelmay tirada halbeega baytka',
+'recentchanges-legend-heading' => "'''Sharaxaad:'''",
+'recentchanges-legend-newpage' => '(sidoo kale eeg [[Special:NewPages|liiska bogagga cusub]])',
 'rcnotefrom' => "Hoostaan waa isbedaladii dhacay  '''$2''' (waxaad arkoosaa ilaa '''$1''' ).",
 'rclistfrom' => 'Itusi isbedelada cusub oo ka bilaabaneyso $1',
 'rcshowhideminor' => '$1 bedelada yar',
index 30ad38d..39677d6 100644 (file)
@@ -217,7 +217,6 @@ $separatorTransformTable = array( ',' => '.', '.' => ',' );
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Nënvizo lidhjet:',
-'tog-justify' => 'Rregullo paragrafët',
 'tog-hideminor' => 'Fshih redaktimet e vogla në ndryshimet e fundit',
 'tog-hidepatrolled' => 'Fshih redaktimet e vrojtuara në ndryshimet e fundit',
 'tog-newpageshidepatrolled' => 'Fshih faqet e vrojtuara nga lista e faqeve të reja',
@@ -1180,7 +1179,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
 'compareselectedversions' => 'Krahasoni versionet e zgjedhura',
 'showhideselectedversions' => 'Shfaq/fshih versionet e zgjedhura',
 'editundo' => 'zhbëje',
-'diff-multi' => '({{PLURAL:$1|Një version i ndërmjetshëm|$1 versione të ndërmjetshme}} nga {{PLURAL:$2|një përdorues|$2 përdorues}} i/të pashfaqur)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Një versioni i ndërmjetshëm|$1 versione të ndërmjetshme}} nga më shumë se $2 {{PLURAL:$2|përdorues|përdorues}} i/të pashfaqur)',
 
 # Search results
@@ -2152,7 +2150,6 @@ Në qoftë se dëshironi të hiqni një faqe nga lista mbikqyrëse më vonë, sh
 'watchmethod-list' => 'duke parë faqet nën mbikqyrje për ndryshimet e fundit',
 'watchlistcontains' => 'Lista mbikqyrëse e juaj ka $1 {{PLURAL:$1|faqe|faqe}}.',
 'iteminvalidname' => "Problem me artikullin '$1', titull jo i saktë...",
-'wlnote' => "Më poshtë {{PLURAL:$1|është ndryshimi i fundit|janë '''$1''' ndryshimet e fundit}} në {{PLUARAL:$2:orën e fundit|'''$2''' orët e fundit}}, që nga $3, $4.",
 'wlshowlast' => 'Trego $1 orët $2 ditët $3',
 'watchlist-options' => 'Mundësitë e listës mbikqyrëse',
 
@@ -2801,7 +2798,6 @@ Ju lutemi provoni përsëri.',
 'tooltip-pt-watchlist' => 'Lista e faqeve nën mbikqyrjen tuaj.',
 'tooltip-pt-mycontris' => 'Lista e kontributeve tuaja',
 'tooltip-pt-login' => 'Identifikimi nuk është i detyrueshëm, megjithatë ne jua rekomandojmë.',
-'tooltip-pt-anonlogin' => 'Të hysh brenda nuk është e detyrueshme, por ka shumë përparësi.',
 'tooltip-pt-logout' => 'Dalje',
 'tooltip-ca-talk' => 'Diskutim për faqen përmbajtje',
 'tooltip-ca-edit' => 'Ju mund ta redaktoni këtë faqe. Përdorni butonin Trego parapamjen para se të ruani ndryshimet.',
index 481374e..1b7fb33 100644 (file)
@@ -396,7 +396,6 @@ $separatorTransformTable = array( ',' => '.', '.' => ',' );
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Подвлачење веза:',
-'tog-justify' => 'Поравнај пасусе',
 'tog-hideminor' => 'Сакриј мање измене у списку скорашњих измена',
 'tog-hidepatrolled' => 'Сакриј прегледане измене у списку скорашњих измена',
 'tog-newpageshidepatrolled' => 'Сакриј прегледане странице са списка нових страница',
@@ -559,7 +558,6 @@ $messages = array(
 'vector-action-protect' => 'Заштити',
 'vector-action-undelete' => 'Врати',
 'vector-action-unprotect' => 'Промени заштиту',
-'vector-simplesearch-preference' => 'Упрошћено поље за претрагу (само за тему „Векторско“)',
 'vector-view-create' => 'Направи',
 'vector-view-edit' => 'Уреди',
 'vector-view-history' => 'Историја',
@@ -581,7 +579,7 @@ $messages = array(
 'history' => 'Историја странице',
 'history_short' => 'Историја',
 'updatedmarker' => 'ажурирано од моје последње посете',
-'printableversion' => 'Ð\92еÑ\80зиÑ\98а Ð·Ð° Ñ\88Ñ\82ампÑ\83',
+'printableversion' => 'Ð\97а Ñ\88Ñ\82ампаÑ\9aе',
 'permalink' => 'Трајна веза',
 'print' => 'Штампај',
 'view' => 'Погледај',
@@ -1257,7 +1255,7 @@ $2
 # "Undo" feature
 'undo-success' => 'Измена се може вратити.
 Проверите разлике испод, па сачувајте измене.',
-'undo-failure' => 'Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð²Ñ\80аÑ\82им Ð¸Ð·Ð¼ÐµÐ½Ñ\83 Ð·Ð±Ð¾Ð³ Ð¿Ð¾Ñ\81Ñ\82оÑ\98аÑ\9aа Ñ\81Ñ\83кобÑ\99ениÑ\85 Ð¼ÐµÑ\92Ñ\83измена.',
+'undo-failure' => 'Ð\9eва Ð¸Ð·Ð¼ÐµÐ½Ð° Ñ\81е Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð¿Ð¾Ð½Ð¸Ñ\88Ñ\82иÑ\82и Ð·Ð±Ð¾Ð³ ÐºÐ¾Ð½Ñ\84ликÑ\82а измена.',
 'undo-norev' => 'Не могу да вратим измену јер не постоји или је обрисана.',
 'undo-summary' => 'Поништена измена $1 {{GENDER:$2|корисника|кориснице}} [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])',
 'undo-summary-username-hidden' => 'Поништи измену $1 скривеног корисника',
@@ -1437,7 +1435,6 @@ $1",
 'showhideselectedversions' => 'Прикажи/сакриј изабране измене',
 'editundo' => 'поништи',
 'diff-empty' => '(Нема разлике)',
-'diff-multi' => '({{PLURAL:$1|није приказана међуизмена|нису приказане $1 међуизмене|није приказано $1 међуизмена}} {{PLURAL:$2|једног|$2|$2}} корисника)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Није приказана међуизмена|Нису приказане $1 међуизмене|Није приказано $1 међуизмена}} од више од $2 корисника)',
 'difference-missing-revision' => 'Не могу да пронађем {{PLURAL:$2|једну измену|$2 измене|$2 измена}} од ове разлике ($1).
 
@@ -1649,7 +1646,7 @@ $1",
 'group-all' => '(сви)',
 
 'group-user-member' => '{{GENDER:$1|корисник|корисница|корисник}}',
-'group-autoconfirmed-member' => '{{GENDER:$1|аутоматски потврђен корисник|аутоматски потврђена корисница|аутоматски потврђен корисник}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|аутоматски потврђен корисник|аутоматски потврђена корисница}}',
 'group-bot-member' => '{{GENDER:$1|бот}}',
 'group-sysop-member' => '{{GENDER:$1|администратор|администраторка|администратор}}',
 'group-bureaucrat-member' => '{{GENDER:$1|бирократа|бирократкиња|бирократа}}',
@@ -1744,7 +1741,7 @@ $1",
 'action-createaccount' => 'отварање овог корисничког налога',
 'action-minoredit' => 'означавање ове измене као мање',
 'action-move' => 'премести ову страницу',
-'action-move-subpages' => 'пÑ\80емеÑ\81Ñ\82и Ð¾Ð²Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83, ÐºÐ°Ð¾ Ð¸ Ñ\9aене Ð¿Ð¾Ð´Ñ\81Ñ\82Ñ\80аниÑ\86е',
+'action-move-subpages' => 'пÑ\80емеÑ\88Ñ\82аÑ\9aе Ð¾Ð²Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86е Ð¸ Ñ\9aениÑ\85 Ð¿Ð¾Ð´Ñ\81Ñ\82Ñ\80аниÑ\86а',
 'action-move-rootuserpages' => 'премештање основних корисничких страница',
 'action-movefile' => 'премести ову датотеку',
 'action-upload' => 'слање ове датотеке',
@@ -1874,7 +1871,7 @@ $1",
 {{PLURAL:$3|Пожељна врста датотеке је|Пожељне врсте датотека су}} $2.',
 'filetype-banned-type' => "'''„.$1“''' {{PLURAL:$4|је забрањена врста датотеке|су забрањене врсте датотека}}.
 {{PLURAL:$3|Дозвољена врста датотеке је|Дозвољене врсте датотека су}} $2.",
-'filetype-missing' => 'Ова датотека нема екстензију.',
+'filetype-missing' => 'Ова датотека нема екстензију (нпр. „.jpg“).',
 'empty-file' => 'Послата датотека је празна.',
 'file-too-large' => 'Послата датотека је превелика.',
 'filename-tooshort' => 'Назив датотеке је прекратак.',
@@ -1921,8 +1918,8 @@ $1",
 'uploadwarning' => 'Упозорење при отпремању',
 'uploadwarning-text' => 'Измените опис датотеке и покушајте поново.',
 'savefile' => 'Сачувај датотеку',
-'uploadedimage' => '{{GENDER:|је послао|је послала|је послао}} „[[$1]]“',
-'overwroteimage' => '{{GENDER:|је послао|је послала}} нову верзију датотеке „[[$1]]“',
+'uploadedimage' => 'је послао „[[$1]]“',
+'overwroteimage' => 'је послао нову верзију датотеке „[[$1]]“',
 'uploaddisabled' => 'Отпремање је онемогућено.',
 'copyuploaddisabled' => 'Слање путем URL адресе је онемогућено.',
 'uploadfromurl-queued' => 'Слање је стављено на списак чекања.',
@@ -2181,7 +2178,7 @@ $1',
 
 # MIME search
 'mimesearch' => 'MIME претрага',
-'mimesearch-summary' => 'Ова страница омогућава филтрирање датотека према њиховим врстама MIME.
+'mimesearch-summary' => 'Ова страница омогућава филтрирање датотека према њиховим MIME типовима.
 Улазни подаци: contenttype/subtype, нпр. <code>image/jpeg</code>.',
 'mimetype' => 'MIME врста:',
 'download' => 'преузми',
@@ -2609,10 +2606,10 @@ $UNWATCHURL
 
 # Protect
 'protectlogpage' => 'Дневник закључавања',
-'protectlogtext' => 'Ð\98Ñ\81под Ñ\98е Ñ\81пиÑ\81ак Ð¸Ð·Ð¼ÐµÐ½Ð° Ñ\83 Ð²Ð¸Ð´Ñ\83 Ð·Ð°Ñ\88Ñ\82иÑ\82е страница.
+'protectlogtext' => 'Ð\98Ñ\81под Ñ\98е Ñ\81пиÑ\81ак Ð·Ð°Ñ\88Ñ\82иÑ\9bениÑ\85 страница.
 Погледајте [[Special:ProtectedPages|списак заштићених страница]] за више детаља.',
 'protectedarticle' => '{{GENDER:|је заштитио|је заштитила}} „[[$1]]“',
-'modifiedarticleprotection' => '{{GENDER:|је променио|је променила|је променио}} степен заштите за „[[$1]]“',
+'modifiedarticleprotection' => 'је променио степен заштите за „[[$1]]“',
 'unprotectedarticle' => 'је скинуо заштиту са странице „[[$1]]“',
 'movedarticleprotection' => '{{GENDER:|је преместио|је преместила|је преместио}} поставке заштите са „[[$2]]“ на „[[$1]]“',
 'protect-title' => 'Степен заштите за „$1“',
@@ -2659,7 +2656,7 @@ $UNWATCHURL
 'protect-edit-reasonlist' => 'Уреди разлоге заштићивања',
 'protect-expiry-options' => '1 сат:1 hour,1 дан:1 day,1 недеља:1 week,2 недеље:2 weeks,1 месец:1 month,3 месеца:3 months,6 месеци:6 months,1 година:1 year,трајно:infinite',
 'restriction-type' => 'Дозвола:',
-'restriction-level' => 'СÑ\82епен Ð¾Ð³Ñ\80аниÑ\87еÑ\9aа:',
+'restriction-level' => 'Ð\9dиво Ð·Ð°Ñ\88Ñ\82иÑ\82е:',
 'minimum-size' => 'Најмања величина',
 'maximum-size' => 'Највећа величина:',
 'pagesize' => '(бајтови)',
@@ -2673,7 +2670,7 @@ $UNWATCHURL
 # Restriction levels
 'restriction-level-sysop' => 'потпуно заштићено',
 'restriction-level-autoconfirmed' => 'полузаштићено',
-'restriction-level-all' => 'било који степен',
+'restriction-level-all' => 'сви нивои',
 
 # Undelete
 'undelete' => 'Приказ обрисаних страница',
@@ -2981,7 +2978,7 @@ $1',
 'move-subpages' => 'Премести и подстранице (до $1)',
 'move-talk-subpages' => 'Премести подстранице странице за разговор (до $1)',
 'movepage-page-exists' => 'Страница $1 већ постоји и не може се заменити.',
-'movepage-page-moved' => 'Страница $1 је премештена у $2.',
+'movepage-page-moved' => 'Страница $1 је премештена на $2.',
 'movepage-page-unmoved' => 'Страница $1 не може да се премести на $2.',
 'movepage-max-pages' => 'Највише $1 {{PLURAL:$1|страница је премештена|странице су премештене|страница је премештено}}, и више не може да буде аутоматски премештено.',
 'movelogpage' => 'Дневник премештања',
@@ -3047,7 +3044,7 @@ $1',
 'allmessages' => 'Системске поруке',
 'allmessagesname' => 'Назив',
 'allmessagesdefault' => 'Подразумевани текст',
-'allmessagescurrent' => 'Текст поруке',
+'allmessagescurrent' => 'Тренутни текст поруке',
 'allmessagestext' => 'Ово је списак свих системских порука које су доступне у именском простору „Медијавики“.
 Посетите [https://www.mediawiki.org/wiki/Localisation Медијавики локализацију] и [//translatewiki.net Транслејтвики] ако желите да помогнете у превођењу.',
 'allmessagesnotsupportedDB' => "Ова страница не може да се користи јер је '''\$wgUseDatabaseMessages''' онемогућен.",
@@ -3056,7 +3053,7 @@ $1',
 'allmessages-filter-unmodified' => 'неизмењене',
 'allmessages-filter-all' => 'све',
 'allmessages-filter-modified' => 'измењене',
-'allmessages-prefix' => 'Филтрирај по предметку:',
+'allmessages-prefix' => 'Филтрирај по префиксу:',
 'allmessages-language' => 'Језик:',
 'allmessages-filter-submit' => 'Иди',
 
@@ -4231,7 +4228,7 @@ $5
 * <span class="mw-specialpagerestricted">Ограничене посебне странице</span>',
 'specialpages-group-maintenance' => 'Извештаји одржавања',
 'specialpages-group-other' => 'Остале посебне странице',
-'specialpages-group-login' => 'Пријава/регистрација',
+'specialpages-group-login' => 'Пријава / регистрација',
 'specialpages-group-changes' => 'Скорашње измене и дневници',
 'specialpages-group-media' => 'Извештаји о мултимедијалном садржају и отпремања',
 'specialpages-group-users' => 'Корисници и корисничка права',
@@ -4346,7 +4343,7 @@ $5
 'logentry-rights-rights' => '$1 је {{GENDER:$2|променио|променила}} чланство групе за $3 из $4 у $5',
 'logentry-rights-rights-legacy' => '$1 је {{GENDER:$2|променио|променила}} чланство групе за $3',
 'logentry-rights-autopromote' => '$1 је аутоматски {{GENDER:$2|унапређен|унапређена}} из $4 у $5',
-'rightsnone' => '(ниÑ\88Ñ\82а)',
+'rightsnone' => '(нема)',
 
 # Feedback
 'feedback-bugornote' => 'Ако сте спремни да детаљно опишете технички проблем, онда [$1 пријавите грешку].
index 1083899..24766d4 100644 (file)
@@ -307,7 +307,6 @@ $separatorTransformTable = array( ',' => '.', '.' => ',' );
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Podvlačenje veza:',
-'tog-justify' => 'Poravnaj pasuse',
 'tog-hideminor' => 'Sakrij manje izmene u spisku skorašnjih izmena',
 'tog-hidepatrolled' => 'Sakrij pregledane izmene u spisku skorašnjih izmena',
 'tog-newpageshidepatrolled' => 'Sakrij pregledane stranice sa spiska novih stranica',
@@ -470,7 +469,6 @@ $messages = array(
 'vector-action-protect' => 'Zaštiti',
 'vector-action-undelete' => 'Vrati',
 'vector-action-unprotect' => 'Promeni zaštitu',
-'vector-simplesearch-preference' => 'Uprošćeno polje za pretragu (samo za temu „Vektorsko“)',
 'vector-view-create' => 'Napravi',
 'vector-view-edit' => 'Uredi',
 'vector-view-history' => 'Istorija',
@@ -491,7 +489,7 @@ $messages = array(
 'history' => 'Istorija stranice',
 'history_short' => 'Istorija',
 'updatedmarker' => 'ažurirano od moje poslednje posete',
-'printableversion' => 'Verzija za štampu',
+'printableversion' => 'Za štampanje',
 'permalink' => 'Trajna veza',
 'print' => 'Štampaj',
 'view' => 'Pogledaj',
@@ -1142,7 +1140,7 @@ Ovakve argumente bi trebalo izbegavati.",
 # "Undo" feature
 'undo-success' => 'Izmena se može vratiti.
 Proverite razlike ispod, pa sačuvajte izmene.',
-'undo-failure' => 'Ne mogu da vratim izmenu zbog postojanja sukobljenih međuizmena.',
+'undo-failure' => 'Ova izmena se ne može poništiti zbog konflikta izmena.',
 'undo-norev' => 'Ne mogu da vratim izmenu jer ne postoji ili je obrisana.',
 'undo-summary' => 'Poništena izmena $1 {{GENDER:$2|korisnika|korisnice}} [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]])',
 
@@ -1321,7 +1319,6 @@ Korišćenje navigacionih veza će poništiti ovu kolonu.',
 'showhideselectedversions' => 'Prikaži/sakrij izabrane izmene',
 'editundo' => 'poništi',
 'diff-empty' => '(Nema razlike)',
-'diff-multi' => '({{PLURAL:$1|nije prikazana međuizmena|nisu prikazane $1 međuizmene|nije prikazano $1 međuizmena}} {{PLURAL:$2|jednog|$2|$2}} korisnika)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Nije prikazana međuizmena|Nisu prikazane $1 međuizmene|Nije prikazano $1 međuizmena}} od više od $2 korisnika)',
 'difference-missing-revision' => 'Ne mogu da pronađem {{PLURAL:$2|jednu izmenu|$2 izmene|$2 izmena}} od ove razlike ($1).
 
@@ -1530,7 +1527,7 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'group-all' => '(svi)',
 
 'group-user-member' => '{{GENDER:$1|korisnik|korisnica|korisnik}}',
-'group-autoconfirmed-member' => '{{GENDER:$1|automatski potvrđen korisnik|automatski potvrđena korisnica|automatski potvrđen korisnik}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|automatski potvrđen korisnik|automatski potvrđena korisnica}}',
 'group-bot-member' => '{{GENDER:$1|bot}}',
 'group-sysop-member' => '{{GENDER:$1|administrator|administratorka}}',
 'group-bureaucrat-member' => '{{GENDER:$1|birokrata|birokratkinja}}',
@@ -1621,7 +1618,7 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'action-createaccount' => 'otvaranje ovog korisničkog naloga',
 'action-minoredit' => 'označavanje ove izmene kao manje',
 'action-move' => 'premesti ovu stranicu',
-'action-move-subpages' => 'premesti ovu stranicu, kao i njene podstranice',
+'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-upload' => 'slanje ove datoteke',
@@ -1748,7 +1745,7 @@ Promenite naziv datoteke i ponovo je pošaljite.',
 {{PLURAL:$3|Poželjna vrsta datoteke je|Poželjne vrste datoteka su}} $2.',
 'filetype-banned-type' => "'''„.$1“''' {{PLURAL:$4|je zabranjena vrsta datoteke|su zabranjene vrste datoteka}}.
 {{PLURAL:$3|Dozvoljena vrsta datoteke je|Dozvoljene vrste datoteka su}} $2.",
-'filetype-missing' => 'Ova datoteka nema ekstenziju.',
+'filetype-missing' => 'Ova datoteka nema ekstenziju (npr. „.jpg“).',
 'empty-file' => 'Poslata datoteka je prazna.',
 'file-too-large' => 'Poslata datoteka je prevelika.',
 'filename-tooshort' => 'Naziv datoteke je prekratak.',
@@ -1795,8 +1792,8 @@ Pogledajte istoriju brisanja pre ponovnog slanja.',
 'uploadwarning' => 'Upozorenje pri otpremanju',
 'uploadwarning-text' => 'Izmenite opis datoteke i pokušajte ponovo.',
 'savefile' => 'Sačuvaj datoteku',
-'uploadedimage' => '{{GENDER:|je poslao|je poslala|je poslao}} „[[$1]]“',
-'overwroteimage' => '{{GENDER:|je poslao|je poslala}} novu verziju datoteke „[[$1]]“',
+'uploadedimage' => 'je poslao „[[$1]]“',
+'overwroteimage' => 'je poslao novu verziju datoteke „[[$1]]“',
 'uploaddisabled' => 'Otpremanje je onemogućeno.',
 'copyuploaddisabled' => 'Slanje putem URL adrese je onemogućeno.',
 'uploadfromurl-queued' => 'Slanje je stavljeno na spisak čekanja.',
@@ -2055,7 +2052,7 @@ Njen opis možete da izmenite na [$2 odgovarajućoj stranici].',
 
 # MIME search
 'mimesearch' => 'MIME pretraga',
-'mimesearch-summary' => 'Ova stranica omogućava filtriranje datoteka prema njihovim vrstama MIME.
+'mimesearch-summary' => 'Ova stranica omogućava filtriranje datoteka prema njihovim MIME tipovima.
 Ulazni podaci: contenttype/subtype, npr. <code>image/jpeg</code>.',
 'mimetype' => 'MIME vrsta:',
 'download' => 'preuzmi',
@@ -2466,10 +2463,10 @@ Vratite se na prethodnu stranicu, ponovo je učitajte i pokušajte ponovo.',
 
 # Protect
 'protectlogpage' => 'Dnevnik zaključavanja',
-'protectlogtext' => 'Ispod je spisak izmena u vidu zaštite stranica.
+'protectlogtext' => 'Ispod je spisak zaštićenih stranica.
 Pogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za više detalja.',
 'protectedarticle' => '{{GENDER:|je zaštitio|je zaštitila}} „[[$1]]“',
-'modifiedarticleprotection' => '{{GENDER:|je promenio|je promenila|je promenio}} stepen zaštite za „[[$1]]“',
+'modifiedarticleprotection' => 'je promenio stepen zaštite za „[[$1]]“',
 'unprotectedarticle' => 'je skinuo zaštitu sa stranice „[[$1]]“',
 'movedarticleprotection' => '{{GENDER:|je premestio|je premestila|je premestio}} postavke zaštite sa „[[$2]]“ na „[[$1]]“',
 'protect-title' => 'Stepen zaštite za „$1“',
@@ -2516,7 +2513,7 @@ Možete da promenite stepen zaštite, ali to neće uticati na prenosivu zaštitu
 'protect-edit-reasonlist' => 'Uredi razloge zaštićivanja',
 'protect-expiry-options' => '1 sat:1 hour,1 dan:1 day,1 nedelja:1 week,2 nedelje:2 weeks,1 mesec:1 month,3 meseca:3 months,6 meseci:6 months,1 godina:1 year,trajno:infinite',
 'restriction-type' => 'Dozvola:',
-'restriction-level' => 'Stepen ograničenja:',
+'restriction-level' => 'Nivo zaštite:',
 'minimum-size' => 'Najmanja veličina',
 'maximum-size' => 'Najveća veličina:',
 'pagesize' => '(bajtovi)',
@@ -2530,7 +2527,7 @@ Možete da promenite stepen zaštite, ali to neće uticati na prenosivu zaštitu
 # Restriction levels
 'restriction-level-sysop' => 'potpuno zaštićeno',
 'restriction-level-autoconfirmed' => 'poluzaštićeno',
-'restriction-level-all' => 'bilo koji stepen',
+'restriction-level-all' => 'svi nivoi',
 
 # Undelete
 'undelete' => 'Prikaz obrisanih stranica',
@@ -2838,7 +2835,7 @@ Izaberite drugo ime.',
 'move-subpages' => 'Premesti i podstranice (do $1)',
 'move-talk-subpages' => 'Premesti podstranice stranice za razgovor (do $1)',
 'movepage-page-exists' => 'Stranica $1 već postoji i ne može se zameniti.',
-'movepage-page-moved' => 'Stranica $1 je premeštena u $2.',
+'movepage-page-moved' => 'Stranica $1 je premeštena na $2.',
 'movepage-page-unmoved' => 'Stranica $1 ne može da se premesti na $2.',
 'movepage-max-pages' => 'Najviše $1 {{PLURAL:$1|stranica je premeštena|stranice su premeštene|stranica je premešteno}}, i više ne može da bude automatski premešteno.',
 'movelogpage' => 'Dnevnik premeštanja',
@@ -2904,7 +2901,7 @@ U drugom slučaju, možete koristiti i vezu, na primer [[{{#Special:Export}}/{{M
 'allmessages' => 'Sistemske poruke',
 'allmessagesname' => 'Naziv',
 'allmessagesdefault' => 'Podrazumevani tekst',
-'allmessagescurrent' => 'Tekst poruke',
+'allmessagescurrent' => 'Trenutni tekst poruke',
 'allmessagestext' => 'Ovo je spisak svih sistemskih poruka koje su dostupne u imenskom prostoru „Medijaviki“.
 Posetite [https://www.mediawiki.org/wiki/Localisation Medijaviki lokalizaciju] i [//translatewiki.net Translejtviki] ako želite da pomognete u prevođenju.',
 'allmessagesnotsupportedDB' => "Ova stranica ne može da se koristi jer je '''\$wgUseDatabaseMessages''' onemogućen.",
@@ -2913,7 +2910,7 @@ Posetite [https://www.mediawiki.org/wiki/Localisation Medijaviki lokalizaciju] i
 'allmessages-filter-unmodified' => 'neizmenjene',
 'allmessages-filter-all' => 'sve',
 'allmessages-filter-modified' => 'izmenjene',
-'allmessages-prefix' => 'Filtriraj po predmetku:',
+'allmessages-prefix' => 'Filtriraj po prefiksu:',
 'allmessages-language' => 'Jezik:',
 'allmessages-filter-submit' => 'Idi',
 
@@ -4068,7 +4065,7 @@ Trebalo bi da ste primili [{{SERVER}}{{SCRIPTPATH}}/COPYING primerak GNU-ove op
 * <span class="mw-specialpagerestricted">Ograničene posebne stranice</span>',
 'specialpages-group-maintenance' => 'Izveštaji održavanja',
 'specialpages-group-other' => 'Ostale posebne stranice',
-'specialpages-group-login' => 'Prijava/registracija',
+'specialpages-group-login' => 'Prijava / registracija',
 'specialpages-group-changes' => 'Skorašnje izmene i dnevnici',
 'specialpages-group-media' => 'Izveštaji o multimedijalnom sadržaju i otpremanja',
 'specialpages-group-users' => 'Korisnici i korisnička prava',
@@ -4183,7 +4180,7 @@ Trebalo bi da ste primili [{{SERVER}}{{SCRIPTPATH}}/COPYING primerak GNU-ove op
 'logentry-rights-rights' => '$1 je {{GENDER:$1|promenio|promenila}} članstvo grupe za $3 iz $4 u $5',
 'logentry-rights-rights-legacy' => '$1 je {{GENDER:$2|promenio|promenila}} čalnstvo grupe za $3',
 'logentry-rights-autopromote' => '$1 je automatski {{GENDER:$1|unapređen|unapređena}} iz $4 u $5',
-'rightsnone' => '(ništa)',
+'rightsnone' => '(nema)',
 
 # Feedback
 'feedback-bugornote' => 'Ako ste spremni da detaljno opišete tehnički problem, onda [$1 prijavite grešku].
index 360fea2..821e75d 100644 (file)
@@ -46,7 +46,6 @@ $namespaceGenderAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Ferwiese unnerstriekje:',
-'tog-justify' => 'Text as Bloksats',
 'tog-hideminor' => 'Litje Annerengen uutbländje',
 'tog-hidepatrolled' => 'Kontrollierde Annerengen in do "Lääste Annerengen" uutbländje',
 'tog-newpageshidepatrolled' => 'Kontrollierde Sieden ap ju Lieste „Näie Sieden“ ferbierge',
@@ -924,7 +923,6 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
 'compareselectedversions' => 'Wäälde Versione ferglieke',
 'showhideselectedversions' => 'Uutwäälde Versione wiese/fersteete',
 'editundo' => 'tounichte moakje',
-'diff-multi' => ' ({{PLURAL:$1|Ne deertwiske lääsende Version|$1 deertwiske lääsende Versione}} fon {{PLURAL:$2|n Benutser|$2 Benutsere}} {{PLURAL:$1|wäd|wäide}} nit wiesd)',
 'diff-multi-manyusers' => ' ({{PLURAL:$1|Ne deertwiske lääsende Version|$1 deertwiske lääsende Versione}} fon moor as {{PLURAL:$2|Benutser|$2 Benutsere}} nit wiesd)',
 
 # Search results
@@ -1835,7 +1833,6 @@ Wan du die Artikkel wier fon ju Foulgelieste ou hoalje moatest, klik ap ju Siede
 'watchmethod-list' => 'Uurpröiwjen fon ju Beooboachtengslieste ätter lääste Beoarbaidengen',
 'watchlistcontains' => 'Jou Beooboachtengslieste änthaalt $1 {{PLURAL:$1|Siede|Sieden}}.',
 'iteminvalidname' => "Problem mäd dän Iendraach '$1', ungultige Noome...",
-'wlnote' => "Hier {{PLURAL:$1|foulget do lääste Annerenge|foulgje do lääste '''$1''' Annerengen}} fon do lääste {{PLURAL:$2|Uur|'''$2''' Uuren}}.",
 'wlshowlast' => 'Wies do lääste $1 Uuren, $2 Deege, of $3 (in do lääste 30 Deege).',
 'watchlist-options' => 'Anwiesoptione',
 
@@ -2414,7 +2411,6 @@ Do ap dän lokoale Reekener spiekerje un deerätter hier hoochleede.',
 'tooltip-pt-watchlist' => 'Lieste fon do beooboachtede Sieden',
 'tooltip-pt-mycontris' => 'Lieste fon dien Biedraage',
 'tooltip-pt-login' => 'Jou ientoulogjen wäd wäil jädden blouked, man is neen Plicht.',
-'tooltip-pt-anonlogin' => 'Sik ientoulogjen wäd wäil jädden blouked, man is neen Plicht.',
 'tooltip-pt-logout' => 'Oumäldje',
 'tooltip-ca-talk' => 'Diskussion uur dän Inhoold fon ju Siede',
 'tooltip-ca-edit' => 'Siede beoarbaidje. Jädden foar dät Spiekerjen ju Foarbekiekfunktion benutsje.',
index 70e614e..e801917 100644 (file)
@@ -129,7 +129,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Gurat-handapan tutumbu',
-'tog-justify' => 'Lempengkeun alinéa',
 'tog-hideminor' => 'Sumputkeun éditan minor dina nu anyar robah',
 'tog-hidepatrolled' => 'Sumputkeun anu geus diroris ti béréndélan nu anyar robah',
 'tog-newpageshidepatrolled' => 'Sumputkeun nu geus diroris tina béréndélan kaca anyar',
@@ -138,9 +137,7 @@ $messages = array(
 'tog-numberheadings' => 'Nomeran lulugu sacara otomatis',
 'tog-showtoolbar' => "Témbongkeun ''toolbar'' édit (JavaScript)",
 'tog-editondblclick' => 'Édit kaca ku klik ganda (JavaScript)',
-'tog-editsection' => 'Tambahkeun tumbu [édit] ngarah bisa ngarobah eusi bab',
 'tog-editsectiononrightclick' => 'Fungsikeun ngédit sub-bagean kalawan klik-katuhu dina judul bagean (JavaScript)',
-'tog-showtoc' => 'Témbongkeun daptar eusi<br />(pikeun kaca nu leuwih ti tilu subjudul)',
 'tog-rememberpassword' => 'Apalkeun login kuring dina ieu panyungsi (pikeun paling lila $1 {{PLURAL:$1|poé|poé}})',
 'tog-watchcreations' => 'Tambahkeun kaca-kaca jieunan kuring jeung berkas muatan kuring kana awaskeuneun',
 'tog-watchdefault' => 'Tambahkeun kaca jeung berkas anu diédit ku kuring kana awaskeuneun',
@@ -994,7 +991,6 @@ Pastikeun yén ieu parobahan bisa miara jujutan kaca sagemblengna.',
 'compareselectedversions' => 'Bandingkeun vérsi nu dipilih',
 'showhideselectedversions' => 'Témbongkeun/sumputkeun révisi nu dipilih',
 'editundo' => 'bolaykeun',
-'diff-multi' => '({{PLURAL:$1|Hiji révisi antara|$1 révisi antara}} karya {{PLURAL:$2|hiji kontributor|$2 kontributor}} teu ditémbongkeun)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Hiji révisi antara|$1 révisi antara}} karya leuwih ti {{PLURAL:$2|pamaké|pamaké}} teu ditémbongkeun)',
 
 # Search results
@@ -1818,7 +1814,6 @@ Jaga, parobahan na kaca ieu katut kaca obrolanana bakal dibéréndélkeun di din
 'watchmethod-list' => 'mariksa nu anyar robah na kaca nu diawaskeun',
 'watchlistcontains' => 'Anjeun ngawaskeun $1 {{PLURAL:$1|kaca|kaca}}.',
 'iteminvalidname' => "Masalah dina '$1', ngaran teu bener...",
-'wlnote' => "Di handap ieu mangrupa $1 {{PLURAL:$1|robahan|robahan}} ahir salila '''$2''' jam.",
 'wlshowlast' => 'Témbongkeun $1 jam $2 poé $3 ahir',
 'watchlist-options' => 'Pilihan awaskeuneun',
 
@@ -2298,7 +2293,6 @@ Sadaya aktivitas impor transwiki baris kacatet dina [[Special:Log/import|log imp
 'tooltip-pt-watchlist' => 'Daptar kaca nu diawaskeun ku anjeun parobahanana.',
 'tooltip-pt-mycontris' => 'Daptar tulisan Anjeun',
 'tooltip-pt-login' => 'Leuwih hadé asup log, sanajan teu wajib',
-'tooltip-pt-anonlogin' => 'Anjeun leuwih hadé asup log, sanajan teu wajib.',
 'tooltip-pt-logout' => 'Kaluar log',
 'tooltip-ca-talk' => 'Sawala ngeunaan eusi kaca',
 'tooltip-ca-edit' => 'Anjeun bisa ngédit kaca ieu. Paké tombol pramidang méméh nyimpen.',
index 56f32a3..a51d384 100644 (file)
@@ -327,7 +327,6 @@ $dateFormats = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Stryk under länkar:',
-'tog-justify' => 'Marginaljustera stycken',
 'tog-hideminor' => 'Visa inte mindre redigeringar i senaste ändringar',
 'tog-hidepatrolled' => 'Dölj patrullerade redigeringar i senaste ändringar',
 'tog-newpageshidepatrolled' => 'Göm patrullerade sidor från listan över nya sidor',
@@ -490,7 +489,6 @@ $messages = array(
 'vector-action-protect' => 'Skrivskydda',
 'vector-action-undelete' => 'Återställ',
 'vector-action-unprotect' => 'Ändra skydd',
-'vector-simplesearch-preference' => 'Aktivera förenklat sökfält (endast Vector-utseendet)',
 'vector-view-create' => 'Skapa',
 'vector-view-edit' => 'Redigera',
 'vector-view-history' => 'Visa historik',
@@ -656,9 +654,9 @@ Detta kan tyda på en bugg i mjukvaran.',
 'databaseerror-query' => 'Fråga: $1',
 'databaseerror-function' => 'Funktion: $1',
 'databaseerror-error' => 'Fel: $1',
-'laggedslavemode' => 'Varning: Sidan kan sakna de senaste uppdateringarna.',
+'laggedslavemode' => '<strong>Varning:</strong> Sidan kan sakna de senaste uppdateringarna.',
 'readonly' => 'Databasen är låst',
-'enterlockreason' => 'Ange varför sidan låsts, och ge en uppskattning av hur länge skrivskyddet bör behållas.',
+'enterlockreason' => 'Ange varför sidan låsts, och ge en uppskattning av hur länge låset kommer att släppas',
 'readonlytext' => 'Databasen är tillfälligt låst för nya inlägg och andra modifieringar, förmodligen på grund av rutinmässigt underhåll, efter vilket den kommer den att återgå till normalläge.
 
 Den administratör som låste den har angivit följande förklaring: $1',
@@ -1032,16 +1030,16 @@ Det kan ha flyttats eller raderats medan du tittade på sidan.',
 'accmailtitle' => 'Lösenord skickat.',
 'accmailtext' => "Ett slumpgenererat lösenord för [[User talk:$1|$1]] har skickats till $2. Det kan ändras på sidan ''[[Special:ChangePassword|ändra lösenord]]'' när du loggar in.",
 'newarticle' => '(Ny)',
-'newarticletext' => 'Du har klickat på en länk till en sida som inte finns ännu. Du kan själv skapa sidan genom att skriva i fältet nedan (du kan läsa mer på [[{{MediaWiki:Helppage}}|hjälpsidan]]). Om du inte vill skriva något kan du bara trycka på "tillbaka" i din webbläsare.',
+'newarticletext' => 'Du har klickat på en länk till en sida som inte finns ännu. För att skapa sidan, börja att skriva i fältet nedan (du kan läsa mer på [[{{MediaWiki:Helppage}}|hjälpsidan]]). Om du kom hit av misstag kan du bara trycka på <strong>tillbaka</strong>-knappen i din webbläsare.',
 'anontalkpagetext' => "----''Detta är diskussionssidan för en anonym användare som inte ännu skapat ett konto, eller som inte använder det.
 Därför måste vi använda den numeriska IP-adressen för att identifiera honom/henne.
 En sådan IP-adress kan delas av flera användare.
 Om du är en anonym användare och känner att irrelevanta kommentarer har riktats mot dig, vänligen [[Special:UserLogin/signup|skapa ett konto]] eller [[Special:UserLogin|logga in]] för att undvika framtida förväxlingar med andra anonyma användare.''",
 'noarticletext' => 'Det finns just nu ingen text på denna sida.
-Du kan [[Special:Search/{{PAGENAME}}|söka efter denna sidtitel]] på andra sidor, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} söka i loggarna], eller [{{fullurl:{{FULLPAGENAME}}|action=edit}} redigera denna sida]</span>.',
+Du kan [[Special:Search/{{PAGENAME}}|söka efter denna sidtitel]] på andra sidor, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} söka i relaterade loggar], eller [{{fullurl:{{FULLPAGENAME}}|action=edit}} redigera denna sida]</span>.',
 'noarticletext-nopermission' => 'Det finns för tillfället ingen text på denna sida.
 Du kan [[Special:Search/{{PAGENAME}}|söka efter denna sidas titel]] på andra sidor,
-eller <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} söka i relaterade loggar]</span>.',
+eller <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} söka i relaterade loggar]</span> men du har inte behörighet att skapa sidan.',
 'missing-revision' => 'Revisionen #$1 av sidan med namnet "{{PAGENAME}}" finns inte.
 
 Detta orsakas vanligen av efter en gammal historiklänk till en sida som har raderats.
@@ -1125,7 +1123,7 @@ Den senaste loggposten tillhandahålls nedan som referens:",
 'templatesusedsection' => '{{PLURAL:$1|Mall|Mallar}} som används i det här avsnittet:',
 'template-protected' => '(skyddad)',
 'template-semiprotected' => '(delvis skyddad)',
-'hiddencategories' => 'Denna sida är medlem i följande {{PLURAL:$1|dold kategori|dolda kategorier}}:',
+'hiddencategories' => 'Denna sida är medlem i {{PLURAL:$1|en dold kategori|$1 dolda kategorier}}:',
 'edittools' => '<!-- Denna text kommer att visas nedanför redigeringsrutor och uppladdningsformulär. -->',
 'nocreatetext' => '{{SITENAME}} har begränsat möjligheterna att skapa nya sidor.
 Du kan redigera existerande sidor, eller [[Special:UserLogin|logga in eller skapa ett användarkonto]].',
@@ -1156,7 +1154,7 @@ Den finns redan.',
 'invalid-content-data' => 'Ogiltig innehållsdata',
 'content-not-allowed-here' => 'innehåll av "$1" är inte tillåtet på sidan [[$2]]',
 'editwarning-warning' => 'Om du lämnar den här sidan kommer du att förlora alla ändringar du har gjort.
-Om du är inloggad kan du slå av den här varningen under "Redigering" i dina inställningar.',
+Om du är inloggad kan du slå av den här varningen under "{{int:prefs-editing}}" i dina inställningar.',
 'editpage-notsupportedcontentformat-title' => 'Innehållsformat stöds inte',
 'editpage-notsupportedcontentformat-text' => 'Innehållsformatet $1 stöds inte av innehållsmodellen $2.',
 
@@ -1193,6 +1191,7 @@ Dessa parametrar har uteslutits.',
 Var god och kontrollera jämförelsen nedan för att bekräfta att detta är vad du avser att göra, och spara sedan ändringarna nedan för att göra redigeringen ogjord.',
 'undo-failure' => 'Redigeringen kunde inte göras ogjord på grund av konflikt med mellanliggande redigeringar.',
 'undo-norev' => 'Redigeringen kan inte göras ogjord eftersom den inte finns eller har raderats.',
+'undo-nochange' => 'Det verkar som att redigeringen redan har blivit ogjord.',
 'undo-summary' => 'Gör version $1 av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskussion]]) ogjord',
 'undo-summary-username-hidden' => 'Gör version $1 av en dold användare ogjord',
 
@@ -1221,7 +1220,7 @@ Anledningen enligt $3 var ''$2''",
 'page_first' => 'första',
 'page_last' => 'sista',
 'histlegend' => "Val av diff: markera i klickrutorna för att jämföra versioner och tryck enter eller knappen längst ner.<br />
-Förklaring: (nuvarande) = skillnad mot nuvarande version; (föregående) = skillnad mot föregående version; '''m''' = mindre ändring.",
+Förklaring: '''({{int:cur}})''' = skillnad mot senaste version; '''({{int:last}})''' = skillnad mot föregående version; '''{{int:minoreditletter}}''' = mindre ändring.",
 'history-fieldset-title' => 'Bläddra i historiken',
 'history-show-deleted' => 'Endast borttagna',
 'histfirst' => 'äldsta',
@@ -1375,7 +1374,8 @@ Se till att sidhistorikens kontinuitet behålls när du sammanfogar historik.',
 'showhideselectedversions' => 'Visa/dölj valda versioner',
 'editundo' => 'gör ogjord',
 'diff-empty' => '(Ingen skillnad)',
-'diff-multi' => '({{PLURAL:$1|En mellanliggande version|$1 mellanliggande versioner}} av {{PLURAL:$2|en användare|$2 användare}} visas inte)',
+'diff-multi-sameuser' => '({{PLURAL:$1|En mellanliggande version|$1 mellanliggande versioner}} av samma användare visas inte)',
+'diff-multi-otherusers' => '({{PLURAL:$1|En mellanliggande version|$1 mellanliggande versioner}} av {{PLURAL:$2|en annan användare|$2 användare}} visas inte)',
 'diff-multi-manyusers' => '({{PLURAL:$1|En mellanliggande version|$1 mellanliggande versioner}} av mer än $2 användare visas inte)',
 'difference-missing-revision' => '{{PLURAL:$2|En revision|$2 revisioner}} av denna skillnad ($1) kunde inte hittas.
 
@@ -1395,8 +1395,8 @@ Detaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'nextn-title' => 'Nästa $1 {{PLURAL:$1|resultat|resultat}}',
 'shown-title' => 'Visa $1 {{PLURAL:$1|resultat|resultat}} per sida',
 'viewprevnext' => 'Visa ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-exists' => "'''Det finns en sida med namnet \"[[:\$1]]\" på denna wiki.''' {{PLURAL:\$2|0=|Se även de andra sökresultaten som hittades.}}",
-'searchmenu-new' => "'''Skapa sidan \"[[:\$1]]\" på denna wiki!'''",
+'searchmenu-exists' => '<strong>Det finns en sida med namnet "[[:$1]]" på denna wiki.</strong> {{PLURAL:$2|0=|Se även de andra sökresultaten som hittades.}}',
+'searchmenu-new' => '<strong>Skapa sidan "[[:$1]]" på denna wiki!</strong> {{PLURAL:$2|0=|Se även sidan som hittades med din sökning.|Se även sidorna som hittades med din sökning.}}',
 'searchprofile-articles' => 'Innehållssidor',
 'searchprofile-project' => 'Hjälp- och projektsidor',
 'searchprofile-images' => 'Multimedia',
@@ -1422,6 +1422,7 @@ Detaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'searchrelated' => 'relaterad',
 'searchall' => 'alla',
 'showingresults' => "Nedan visas upp till {{PLURAL:$1|'''1''' post|'''$1''' poster}} från och med nummer '''$2'''.",
+'showingresultsinrange' => 'Nedan visas upp till {{PLURAL:$3|<strong>1</strong> resultat|<strong>$1</strong> resultat}} mellan nummer <strong>$2</strong> och nummer <strong>$3</strong>.',
 'showingresultsnum' => "Nedan visas {{PLURAL:$3|'''1''' post|'''$3''' poster}} från och med nummer '''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Resultat '''$1''' av '''$3'''|Resultat '''$1 - $2''' av '''$3'''}} för '''$4'''",
 'search-nonefound' => 'Inga resultat matchade frågan.',
@@ -1531,7 +1532,7 @@ Programvaran använder detta värde för att adressera dig till andra med rätt
 'prefs-help-realname' => 'Riktigt namn behöver inte anges.
 Om du väljer att ange ditt riktiga namn, kommer det att användas för att tillskriva dig ditt arbete.',
 'prefs-help-email' => 'Att ange e-postadress är valfritt, men gör det möjligt att få ditt lösenord mejlat till dig om du glömmer det.',
-'prefs-help-email-others' => 'Du kan också välja att låta andra användare kontakta dig genom din användar- eller diskussionssida utan att avslöja din identitet.',
+'prefs-help-email-others' => 'Du kan också välja att låta andra kontakta dig via e-post genom en länk på din användar- eller diskussionssida. Din e-postadress avslöjas inte när andra användare kontaktar dig.',
 'prefs-help-email-required' => 'E-postadress måste anges.',
 'prefs-info' => 'Grundläggande information',
 'prefs-i18n' => 'Internationalisering',
@@ -1741,7 +1742,7 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
 'recentchanges-legend-heading' => "'''Teckenförklaring:'''",
 'recentchanges-legend-newpage' => '(se även [[Special:NewPages|listan över nya sidor]])',
 'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => "Nedan visas ändringar sedan '''$2''' (upp till '''$1''' visas).",
+'rcnotefrom' => "Nedan visas ändringar sedan '''$2''' (upp till '''$1''' ändringar visas).",
 'rclistfrom' => 'Visa ändringar från och med $1',
 'rcshowhideminor' => '$1 mindre ändringar',
 'rcshowhidebots' => '$1 robotar',
@@ -1863,6 +1864,8 @@ Om du fortfarande vill ladda upp din fil, var god gå tillbaka och välj ett nyt
 Om du ändå vill ladda upp din fil, gå då tillbaka och använd ett annat namn. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Den här filen är en dubblett till följande {{PLURAL:$1|fil|filer}}:',
 'file-deleted-duplicate' => 'En identisk fil till den här filen ([[:$1]]) har tidigare raderats. Du bör kontrollera den filens raderingshistorik innan du fortsätter att återuppladda den.',
+'file-deleted-duplicate-notitle' => 'En identisk fil till den här filen har tidigare raderats och titeln har undanhållits.
+Du borde be någon som kan se undanhållen fildata att granska situationen innan du försöker ladda upp den.',
 'uploadwarning' => 'Uppladdningsvarning',
 'uploadwarning-text' => 'Var god och ändra filbeskrivningen nedanför och försök igen.',
 'savefile' => 'Spara fil',
@@ -2241,17 +2244,27 @@ Varje rad innehåller länkar till den första och andra omdirigeringsidan, samt
 'deadendpagestext' => 'Följande sidor saknar länkar till andra sidor på {{SITENAME}}.',
 'protectedpages' => 'Skyddade sidor',
 'protectedpages-indef' => 'Endast skydd på obestämd tid',
+'protectedpages-summary' => 'Denna sida listar befintliga sidor som för närvarande är skyddade. För en lista över titlar som skyddas från att skapas, se [[{{#special:ProtectedTitles}}]].',
 'protectedpages-cascade' => 'Endast kaskaderande skydd',
 'protectedpages-noredirect' => 'Dölj omdirigeringar',
 'protectedpagesempty' => 'Inga sidor är skyddade under de villkoren.',
+'protectedpages-timestamp' => 'Tidsstämpel',
+'protectedpages-page' => 'Sida',
+'protectedpages-expiry' => 'Upphör',
+'protectedpages-performer' => 'Skyddar användare',
+'protectedpages-params' => 'Skyddsparametrar',
+'protectedpages-reason' => 'Anledning',
+'protectedpages-unknown-timestamp' => 'Okänd',
+'protectedpages-unknown-performer' => 'Okänd användare',
 'protectedtitles' => 'Skyddade titlar',
+'protectedtitles-summary' => 'Denna sida listar de titlar som skyddas från att skapas. För en lista över befintliga sidor som är skyddade, se [[{{#special:ProtectedPages}}]].',
 'protectedtitlesempty' => 'Just nu finns inga skyddade sidtitlar med de parametrarna.',
 'listusers' => 'Användarlista',
 'listusers-editsonly' => 'Visa endast användare som redigerat',
 'listusers-creationsort' => 'Sortera efter datum skapat',
 'listusers-desc' => 'Sortera i fallande ordning',
 'usereditcount' => '$1 {{PLURAL:$1|redigering|redigeringar}}',
-'usercreated' => '{{GENDER:$3|Skapat}} $1 $2',
+'usercreated' => '{{GENDER:$3|Skapade}} den $1 $2',
 'newpages' => 'Nya sidor',
 'newpages-username' => 'Användare:',
 'ancientpages' => 'Äldsta sidorna',
@@ -2272,7 +2285,7 @@ Observera att andra webbplatser kan länka direkt till en fil med en URL. Filer
 # Book sources
 'booksources' => 'Bokkällor',
 'booksources-search-legend' => 'Sök efter bokkällor',
-'booksources-go' => '',
+'booksources-go' => 'Visa',
 'booksources-text' => 'Nedan följer en lista över länkar till webbplatser som säljer nya och begagnade böcker, och som kanske har ytterligare information om de böcker du söker.',
 'booksources-invalid-isbn' => 'Det angivna ISBN-numret verkar inte vara giltigt. Kontrollera källan för eventuella fel.',
 
@@ -2430,6 +2443,7 @@ Framtida ändringar av den här sidan och dess diskussionssida kommer att listas
 'watchmethod-list' => 'letar efter nyligen gjorda ändringar bland bevakade sidor',
 'watchlistcontains' => 'Din bevakningslista innehåller $1 {{PLURAL:$1|sida|sidor}}.',
 'iteminvalidname' => "Problem med ''$1'', ogiltigt namn...",
+'wlnote2' => 'Nedan finns ändringarna från {{PLURAL:$1|den senaste timmen|de senaste <strong>$1</strong> timmarna}}, med början den $2 kl. $3.',
 'wlshowlast' => 'Visa senaste $1 timmarna $2 dygnen $3',
 'watchlist-options' => 'Alternativ för bevakningslistan',
 
@@ -2515,7 +2529,7 @@ Se $2 för noteringar om de senaste raderingarna.',
 'delete-edit-reasonlist' => 'Redigera anledningar för radering',
 'delete-toobig' => 'Denna sida har en lång redigeringshistorik med mer än $1 {{PLURAL:$1|sidversion|sidversioner}}. Borttagning av sådana sidor har begränsats för att förhindra oavsiktliga driftstörningar på {{SITENAME}}.',
 'delete-warning-toobig' => 'Denna sida har en lång redigeringshistorik med mer än $1 {{PLURAL:$1|sidversion|sidversioner}}. Att radera sidan kan skapa problem med hanteringen av databasen på {{SITENAME}}; var försiktig.',
-'deleting-backlinks-warning' => "'''Varning:''' Andra sidor länkar till sidan som du är på väg att radera.",
+'deleting-backlinks-warning' => "'''Varning:''' Andra sidor länkar till eller inkluderar sidan som du är på väg att radera.",
 
 # Rollback
 'rollback' => 'Rulla tillbaka ändringar',
@@ -2542,7 +2556,7 @@ Sidan ändrades senast av [[User:$3|$3]] ([[User talk:$3|diskussion]]{{int:pipe-
 'protectlogpage' => 'Skrivskyddslogg',
 'protectlogtext' => 'Detta är en lista över applicerande och borttagande av skrivskydd.
 Se [[Special:ProtectedPages|listan över skyddade sidor]] för listan över aktiva sidskydd.',
-'protectedarticle' => 'skrivskyddade [[$1]]',
+'protectedarticle' => 'skrivskyddade "[[$1]]"',
 'modifiedarticleprotection' => 'ändrade skyddsnivån för "[[$1]]"',
 'unprotectedarticle' => 'tog bort skrivskydd från "[[$1]]"',
 'movedarticleprotection' => 'flyttade skrivskyddsinställningar från "[[$2]]" till "[[$1]]"',
@@ -2659,7 +2673,7 @@ $1',
 
 # Namespace form on various pages
 'namespace' => 'Namnrymd:',
-'invert' => 'Uteslut vald namnrymd',
+'invert' => 'Invertera val',
 'tooltip-invert' => 'Markera denna ruta för att dölja ändringar på sidor inom det valda namnrymden (och tillhörande namnrymden om det är markerat)',
 'namespace_association' => 'Associerad namnrymd',
 'tooltip-namespace_association' => 'Markera denna ruta för att även inkludera diskussions- eller ämnesnamnrymden som är associerad med den valda namnrymden',
@@ -2768,7 +2782,7 @@ För att se alla aktuella blockeringar, gå till [[Special:BlockList|listan öve
 'blocklist-userblocks' => 'Göm kontoblockeringar',
 'blocklist-tempblocks' => 'Dölj tillfälliga blockeringar',
 'blocklist-addressblocks' => 'Göm enskilda IP-blockeringar',
-'blocklist-rangeblocks' => 'Göm intervallblokeringar',
+'blocklist-rangeblocks' => 'Göm intervallblockeringar',
 'blocklist-timestamp' => 'Tidsstämpel',
 'blocklist-target' => 'Mål',
 'blocklist-expiry' => 'Upphör',
@@ -2815,7 +2829,7 @@ Se [[Special:BlockList|blockeringslistan]] för en översikt av gällande blocke
 'range_block_disabled' => 'Möjligheten för administratörer att blockera intervall av IP-adresser har stängts av.',
 'ipb_expiry_invalid' => 'Ogiltig varaktighetstid.',
 'ipb_expiry_temp' => 'För att dölja användarnamnet måste blockeringen vara permanent.',
-'ipb_hide_invalid' => 'Kan inte undanhålla detta konto; det kan ha för många redigeringar.',
+'ipb_hide_invalid' => 'Kan inte undanhålla detta konto; det har fler än {{PLURAL:$1|en redigering|$1 redigeringar}}.',
 'ipb_already_blocked' => '"$1" är redan blockerad',
 'ipb-needreblock' => '$1 är redan blockerad. Vill du ändra inställningarna?',
 'ipb-otherblocks-header' => 'Andra {{PLURAL:$1|blockering|blockeringar}}',
@@ -2915,7 +2929,7 @@ Välj något annat namn istället.',
 'movesubpagetext' => 'Denna sida har $1 {{PLURAL:$1|undersida|undersidor}} som visas nedan.',
 'movenosubpage' => 'Denna sida har inga undersidor.',
 'movereason' => 'Anledning:',
-'revertmove' => 'flytta tillbaka',
+'revertmove' => 'återställ',
 'delete_and_move' => 'Radera och flytta',
 'delete_and_move_text' => '==Radering krävs==
 Den titel du vill flytta sidan till, "[[:$1]]", finns redan. Vill du radera den för att möjliggöra flytt av denna sida dit?',
@@ -2982,6 +2996,7 @@ Besök [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] elle
 'allmessages-prefix' => 'Filtrera efter prefix:',
 'allmessages-language' => 'Språk:',
 'allmessages-filter-submit' => 'Gå',
+'allmessages-filter-translate' => 'Översätt',
 
 # Thumbnails
 'thumbnail-more' => 'Förstora',
@@ -2998,6 +3013,7 @@ $2',
 'thumbnail_image-type' => 'Bildtypen stöds inte',
 'thumbnail_gd-library' => 'Inkomplett GD library konfigurering: saknar funktionen $1',
 'thumbnail_image-missing' => 'Fil verkar saknas: $1',
+'thumbnail_image-failure-limit' => 'Det har nyligen förekommit alltför många misslyckade ($1 eller fler) försök skapa den här miniatyrbilden. Försök igen senare.',
 
 # Special:Import
 'import' => 'Importera sidor',
@@ -3033,7 +3049,7 @@ Spara den på din dator och ladda upp den här.',
 'importuploaderrortemp' => 'Uppladdningen av importfilen misslyckades. En temporär katalog saknas.',
 'import-parse-failure' => 'Tolkningsfel vid XML-import',
 'import-noarticle' => 'Inga sidor att importera!',
-'import-nonewrevisions' => 'Alla sidversioner hade importerats tidigare.',
+'import-nonewrevisions' => 'Inga sidversioner importerades (alla var antingen redan där eller hoppades över p.g.a. fel).',
 'xml-error-string' => '$1 på rad $2, kolumn $3 (byte $4): $5',
 'import-upload' => 'Ladda upp XML-data',
 'import-token-mismatch' => 'Sessionsdata har förlorats. Var god pröva igen.',
@@ -3044,6 +3060,7 @@ Spara den på din dator och ladda upp den här.',
 '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-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>',
 'import-rootpage-invalid' => 'Angiven grundsida är en ogiltig titel.',
 'import-rootpage-nosubpage' => 'Namnrymden "$1" till grundsidan tillåter inte undersidor.',
@@ -3099,12 +3116,12 @@ Vänligen använd förhandsgranskningsknappen innan du sparar.',
 'tooltip-n-currentevents' => 'Hitta bakgrundsinformation om aktuella händelser',
 'tooltip-n-recentchanges' => 'Lista över senaste ändringar i wikin',
 'tooltip-n-randompage' => 'Gå till en slumpmässigt vald sida',
-'tooltip-n-help' => 'Hjälp och information',
+'tooltip-n-help' => 'Platsen för att hitta',
 'tooltip-t-whatlinkshere' => 'Lista över alla wikisidor som länkar hit',
 'tooltip-t-recentchangeslinked' => 'Visa senaste ändringarna av sidor som den här sidan länkar till',
-'tooltip-feed-rss' => 'RSS-matning för den här sidan',
-'tooltip-feed-atom' => 'Atom-matning för den här sidan',
-'tooltip-t-contributions' => 'Visa lista över bidrag från den här användaren',
+'tooltip-feed-rss' => 'RSS-flöde för den här sidan',
+'tooltip-feed-atom' => 'Atom-flöde för den här sidan',
+'tooltip-t-contributions' => 'En lista över bidrag från den här användaren',
 'tooltip-t-emailuser' => 'Skicka e-post till den här användaren',
 'tooltip-t-upload' => 'Ladda upp filer',
 'tooltip-t-specialpages' => 'Lista över alla specialsidor',
@@ -3123,7 +3140,7 @@ Vänligen använd förhandsgranskningsknappen innan du sparar.',
 'tooltip-minoredit' => 'Markera som mindre ändring',
 'tooltip-save' => 'Spara dina ändringar',
 'tooltip-preview' => 'Förhandsgranska dina ändringar, vänligen använd detta innan du sparar!',
-'tooltip-diff' => 'Visa vilka förändringar du har gjort av texten.',
+'tooltip-diff' => 'Visa vilka ändringar du har gjort i texten.',
 'tooltip-compareselectedversions' => 'Visa skillnaden mellan de två markerade versionerna av den här sidan.',
 'tooltip-watch' => 'Lägg till den här sidan i din bevakningslista',
 'tooltip-watchlistedit-normal-submit' => 'Ta bort titlar',
@@ -3132,7 +3149,7 @@ Vänligen använd förhandsgranskningsknappen innan du sparar.',
 'tooltip-upload' => 'Starta uppladdning',
 'tooltip-rollback' => '"Tillbakarullning" tar med en knapptryckning bort ändringar som gjorts av den som senast redigerade sidan',
 'tooltip-undo' => '"Gör ogjord" återställer denna redigering och öppnar redigeringsrutan med förhandsgranskning.
-Ger möjlighet att skriva en motivering i redigeringssammanfattningen',
+Den ger möjlighet att skriva en motivering i redigeringssammanfattningen.',
 'tooltip-preferences-save' => 'Spara inställningar',
 'tooltip-summary' => 'Skriv en kort sammanfattning',
 'interlanguage-link-title' => '$1 - $2',
@@ -3924,7 +3941,7 @@ Du kan också [[Special:EditWatchlist|använda standardeditorn]].',
 
 # Core parser functions
 'unknown_extension_tag' => 'Okänd tagg "$1"',
-'duplicate-defaultsort' => 'Varning: Standardsorteringsnyckeln "$2" tar över från den tidigare standardsorteringsnyckeln "$1".',
+'duplicate-defaultsort' => '\'\'\'Varning:\'\'\' Standardsorteringsnyckeln "$2" tar över från den tidigare standardsorteringsnyckeln "$1".',
 
 # Special:Version
 'version' => 'Version',
@@ -4017,8 +4034,8 @@ Du bör ha fått [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopia av GNU General Publi
 
 # External image whitelist
 'external_image_whitelist' => '#Lämna den här raden precis som den är<pre>
-#Skriv fragment av reguljära uttryck (bara delen som ska vara mellan //) här nedan
-#Dessa kommer att jämföras med URL:er för externa (hotlinkade) bilder
+#Skriv fragment av reguljära uttryck (bara delen som ska vara mellan //) nedan
+#Dessa kommer att jämföras med URL:er för externa bilder
 #De som matchar kommer att visas som bilder, annars visas bara en länk till bilden
 #Rader som börjar med # behandlas som kommentarer
 #Detta är skiftläges-okänsligt
@@ -4171,6 +4188,7 @@ Annars kan du använda det enkla formuläret nedan. Din kommentar kommer att lä
 'api-error-overwrite' => 'Det är inte tillåtet att skriva över en befintlig fil.',
 'api-error-stashfailed' => 'Internt fel: servern kunde inte lagra temporär fil.',
 'api-error-publishfailed' => 'Internt fel: Servern kunde inte publicera temporär fil.',
+'api-error-stasherror' => 'Ett fel uppstod under uppladdningen av filen till mellanlagringsfilen.',
 'api-error-timeout' => 'Servern svarade inte inom förväntad tid.',
 'api-error-unclassified' => 'Ett okänt fel uppstod',
 'api-error-unknown-code' => 'Okänt fel: "$1"',
@@ -4225,6 +4243,5 @@ Annars kan du använda det enkla formuläret nedan. Din kommentar kommer att lä
 'expand_templates_preview' => 'Förhandsvisning',
 
 # Unknown messages
-'createaccount-hook-aborted' => '$1',
 'uploadinvalidxml' => 'XML-koden i den uppladdade filen kunde inte tolkas.',
 );
index 79ce472..f8943f6 100644 (file)
@@ -125,7 +125,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Wekea mstari viungo:',
-'tog-justify' => 'Sawazisha ibara',
 'tog-hideminor' => 'Ficha mabadilisho madogo ya hivi karibuni',
 'tog-hidepatrolled' => 'Ficha kurasa zilizofanyiwa doria kwenye mabadiliko ya karibuni',
 'tog-newpageshidepatrolled' => 'Ficha kurasa zilizofanyiwa doria kwenye orodha ya kurasa mpya',
@@ -134,9 +133,7 @@ $messages = array(
 'tog-numberheadings' => 'Vichwa vya habari vijipange namba-vyenyewe',
 'tog-showtoolbar' => 'Onyesha mwambaa wa zana za kuhariria',
 'tog-editondblclick' => 'Hariri ukurasa kwa kubonyeza mara mbili',
-'tog-editsection' => 'Wezesha sehemu ya kuandikia kwa kutumia viungo vya [hariri]',
 'tog-editsectiononrightclick' => 'Wezesha sehemu ya kuandikia kwa kubonyeza kitufe cha kulia cha puku yako juu ya sehemu ya majina husika (JavaScript)',
-'tog-showtoc' => 'Onyesha mistari ya yaliyomo (kwa kila kurasa iliyo na zaidi ya vichwa vya habari 3)',
 'tog-rememberpassword' => 'Kumbuka kuingia kwangu pamoja na neno la siri katika kivinjari hiki (kwa muda usiozidi {{PLURAL:$1|siku}} $1)',
 'tog-watchcreations' => 'Ongeza kurasa nilizoumba katika maangalizi yangu',
 'tog-watchdefault' => 'Ongeza kurasa zote nilizohariri katika maangalizi yangu',
@@ -1060,7 +1057,6 @@ Tazama [[Special:BlockList|IP block orodha ya uzuio wa IP]] kuona orodha ya zuio
 'compareselectedversions' => 'Linganisha mapitio mawili uliyochagua',
 'showhideselectedversions' => 'Onyesha/ficha mapitio yaliyoteuliwa',
 'editundo' => 'tengua',
-'diff-multi' => '(Haionyeshwi {{PLURAL:$1|pitio moja la katikati lililoandikwa|mapitio $1 ya katikati yaliyoandikwa}} na {{PLURAL:$2|mtumiaji moja|watumiaji $2}})',
 
 # Search results
 'searchresults' => 'Matokeo ya utafutaji',
@@ -1974,7 +1970,6 @@ Mabadiliko katika ukurasa huo na ukurasa wake wa majadiliano utaonekana hapo.',
 'watchmethod-list' => 'Kupitia kurasa za maangalizi ili kupata madabiliko ya karibuni',
 'watchlistcontains' => 'Orodha ya maangalizi yako ina {{PLURAL:$1|pages|kurasa}}.',
 'iteminvalidname' => "Shida na kitu  '$1' ,  jina batili...",
-'wlnote' => "{{PLURAL:$1|is the last change|Mabadiliko '''$1''' ya}} mwisho katika {{PLURAL:$2|hour|masaa '''$2''' yaliyopita yanaonyeshwa}} chini, ilivyokuwa saa $4, tarehe $3.",
 'wlshowlast' => 'Onyesha kutoka masaa $1 siku $2 $3',
 'watchlist-options' => 'Hitiari za maangalizi',
 
@@ -2462,7 +2457,6 @@ Tafadhali jaribu tena.',
 'tooltip-pt-watchlist' => 'Orodha ya kurasa unazofuatilia kwa mabadiliko',
 'tooltip-pt-mycontris' => 'Orodha ya michango yako',
 'tooltip-pt-login' => 'Tunakushajiisha kuingia, lakini siyo lazima.',
-'tooltip-pt-anonlogin' => 'Tunakushajiisha kuingia, lakini siyo lazima',
 'tooltip-pt-logout' => 'Toka',
 'tooltip-ca-talk' => 'Mazungumzo kuhusu makala',
 'tooltip-ca-edit' => 'Unaweza kuhariri ukurasa huu.  Tafadhali tumia kitufe cha kuhakikisha kabla ya kuhifadhi.',
index 6b7b50c..d012453 100644 (file)
@@ -67,7 +67,6 @@ $namespaceGenderAliases = array();
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Podsztrychńyńcy linkůw:',
-'tog-justify' => 'Wyrůwnywej tekst we akapitach (justowańy)',
 'tog-hideminor' => 'Schow drobne pomjyńańa we ńydowno pomjyńanych',
 'tog-hidepatrolled' => 'Schow sprowdzůne sprowjyńa we ńydowno pomjyńanych',
 'tog-newpageshidepatrolled' => 'Schow sprawdzůne zajty na wykoźe nowych zajtůw',
@@ -967,7 +966,6 @@ $1",
 'compareselectedversions' => 'zrůwnej uobrane wersyje',
 'showhideselectedversions' => 'Ukoż/ukryj uobrane wersyje',
 'editundo' => 'uodćepej',
-'diff-multi' => '(Ńy pokozano {{PLURAL:$1|jydnyj wersyji postrzedńij|$1 wersyji postrzedńich}}, sprowjanej bez {{PLURAL:$2|jydnygo sprowjorza|$2 sprowjorzow}} .)',
 'diff-multi-manyusers' => '(Ńy pokozano {{PLURAL:$1|jydnyj wersyji postrzedńij|$1 wersyji postrzedńich}}, sprowjanej bez {{PLURAL:$2|jydnygo sprowjorza|$2 sprowjorzow}} .)',
 'difference-missing-revision' => '{{PLURAL:$2|Wersyjo|$2 wersyje|$2 wersyji}} #$1 zajty "{{PAGENAME}}" ńy {{PLURAL:$2|uostoła znaleźůno|uostoły znaleźůne|uostoło znaleźůnych}}. Zauobycz je to skiż starygo linky do wyćępanyj zajty. Powůd wyćepańa nojdźesz we [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejerze].',
 
@@ -1711,7 +1709,6 @@ Na tyi liśće bydźeš mjou rejer přišuych sprowjyń tyi zajty i jeji zajty g
 'watchmethod-list' => 'šnupańy w zajtach, na kere dowoš pozůr pośrůd půmjyńanych na uostatku',
 'watchlistcontains' => 'Lista zajtůw, na kere dowoš pozůr mo {{PLURAL:$1|jedna pozycja|$1 pozycje|$1 pozycyji}}.',
 'iteminvalidname' => 'Problym ze pozycjům „$1”, felerne mjano...',
-'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',
 
@@ -2220,7 +2217,6 @@ Wšyjstke uoperacyje importu transwiki sům uodnotowywane w [[Special:Log/import
 'tooltip-pt-watchlist' => 'Lista artiklůw, na kere dowosz pozůr',
 'tooltip-pt-mycontris' => 'Lista uody mje sprowjonych',
 'tooltip-pt-login' => 'Chćeli by my, cobyś śe nalogowoł, nale to ńy je powinne',
-'tooltip-pt-anonlogin' => 'Zachyncůmy do zalůgowańo śe, nale to ńy je uobowjůnzek',
 'tooltip-pt-logout' => 'Uodloguj śe ze wiki',
 'tooltip-ca-talk' => 'Dyskusyjo uo tym artiklu',
 'tooltip-ca-edit' => 'Mogesz sprowjać ta zajta. Podwjela spamjyntosz půmjyńańo, klikńij we knefel "Uobźyrej".',
index 0cf0f06..7d19b8c 100644 (file)
@@ -88,7 +88,6 @@ $digitGroupingPattern = "##,##,###";
 $messages = array(
 # User preference toggles
 'tog-underline' => 'இணைப்புகளுக்கு அடிக்கோடிடு',
-'tog-justify' => 'பத்திகளை ஓரச் சீர்மைப் படுத்து',
 'tog-hideminor' => 'அண்மைய மாற்றங்களில் சிறிய தொகுப்புகளை மறை',
 'tog-hidepatrolled' => 'அண்மைய மாற்றங்களில் பலமுறை பார்வையிட்ட தொகுப்புகளை மறைக்கவும்',
 'tog-newpageshidepatrolled' => 'பலமுறை பார்வையிட்ட பக்கங்களைப் புதியபக்கங்களின் பட்டியலில் காட்டவேண்டாம்.',
@@ -1067,7 +1066,6 @@ $1",
 'showhideselectedversions' => 'தெரிவு செய்யப்பட்ட மாற்றங்களை காட்டு/மறை',
 'editundo' => 'மீளமை',
 'diff-empty' => '(வேறுபாடு ஏதுமில்லை)',
-'diff-multi' => '({{PLURAL:$1|ஒரு இடைப்பட்ட திருத்தம்|$1 இடைப்பட்ட திருத்தங்கள்}} {{PLURAL:$2|பயனர்|$2 பயனர்கள்}}  செய்தவைகளை காட்டப்படவில்லை.)',
 'diff-multi-manyusers' => '({{PLURAL:$2|பயனரால்|$2 பயனர்களால்}} செய்யப்பட்ட {{PLURAL:$1|ஒரு இடைப்பட்ட திருத்தம்|$1 இடைப்பட்ட திருத்தங்கள்}}  காட்டப்படவில்லை.)',
 
 # Search results
@@ -2030,7 +2028,6 @@ $1',
 'watchmethod-list' => 'அண்மைய தொகுப்புகளுக்காக, கவனிக்கப்படுகின்ற பக்கங்கள் தேடிப் பார்க்கப்படுகிறன',
 'watchlistcontains' => 'உங்கள் கவனிப்புப் பட்டியல் {{PLURAL:$1|ஒரு பக்கத்தைக்|$1 பக்கங்களைக்}} கொண்டுள்ளது.',
 'iteminvalidname' => "விடயம் '$1' தொடர்பில் பிரச்சினை உள்ளது, செல்லுபடியாகாத பெயர்...",
-'wlnote' => "பின்வருவன கடைசி {{PLURAL:$2|மணித்தியாலத்தில்|'''$2''' மணித்தியாலங்களில்}} செய்யப்பட்ட {{PLURAL:$1|கடைசி ஒரு மாற்றமாகும்|கடைசி $1 மாற்றங்களாகும்}}.",
 'wlshowlast' => 'கடைசி $1 மணித்தியாலங்கள் $2 நாட்களைக் காட்டு $3',
 'watchlist-options' => 'கவனிப்பு பட்டியலின் விருப்பத் தேர்வுகள்',
 
@@ -2635,7 +2632,6 @@ $1',
 'tooltip-pt-watchlist' => 'மாற்றங்களுக்காக நீங்கள் கவனிக்கும் பக்கங்களின் பட்டியல்',
 'tooltip-pt-mycontris' => 'உங்கள் பங்களிப்புக்களின் பட்டியல்',
 'tooltip-pt-login' => 'நீங்கள் புகுபதிகை செய்ய ஊக்குவிக்கப்படுகிறீர்கள், ஆனால் இது கட்டாயமன்று.',
-'tooltip-pt-anonlogin' => 'நீங்கள் புகுபதிகைச் செய்ய ஊக்குவிக்கப்படுகிறீர்கள் எனினும் இது கட்டாயமல்ல.',
 'tooltip-pt-logout' => 'விடுபதிகை',
 'tooltip-ca-talk' => 'உள்ளடக்கப் பக்கம் தொடர்பான உரையாடல் பக்கம்',
 'tooltip-ca-edit' => 'நீங்கள் இப்பக்கத்தைத் தொகுக்க முடியும். "முன்தோற்றம் காட்டு" பொத்தானைப் பயன்படுத்திய பின்னர் உங்கள் மாற்றங்களை சேமிக்கவும்.',
index f114ce8..81d554b 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Arjunaraoc
+ * @author Ashokjayanti
  * @author Chaduvari
  * @author Jprmvnvijay5
  * @author Kaganer
@@ -144,17 +145,16 @@ $digitGroupingPattern = "##,##,###";
 $messages = array(
 # User preference toggles
 'tog-underline' => 'లంకె క్రీగీత:',
-'tog-justify' => 'పేరాలను ఇరు పక్కలా సమానంగా సర్దు',
 'tog-hideminor' => 'ఇటీవలి మార్పులలో చిన్న మార్పులను దాచు',
 'tog-hidepatrolled' => 'ఇటీవలి మార్పులలో నిఘా ఉన్న మార్పులను దాచు',
 'tog-newpageshidepatrolled' => 'కొత్త పేజీల జాబితా నుంచి నిఘా ఉన్న పేజీలను దాచు',
 'tog-extendwatchlist' => 'కేవలం ఇటీవలి మార్పులే కాక, మార్పులన్నీ చూపించటానికి నా వీక్షణా జాబితాను పెద్దది చేయి',
-'tog-usenewrc' => 'à°\87à°\9fà±\80వలి à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°®à°°à°¿à°¯à±\81 à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితాలలà±\8b à°®à°¾à°°à±\8dà°ªà±\81లనà±\81 à°ªà±\87à°\9cà±\80 à°µà°¾à°°à°¿గా చూపించు',
+'tog-usenewrc' => 'à°\87à°\9fà±\80వలి à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°®à°°à°¿à°¯à±\81 à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితాలలà±\8b à°®à°¾à°°à±\8dà°ªà±\81లనà±\81 à°ªà±\87à°\9cà±\80 à°µà°¾à°°à±\80గా చూపించు',
 'tog-numberheadings' => 'శీర్షికలకు అప్రమేయంగా వరుస సంఖ్యలు చేర్చు',
 'tog-showtoolbar' => 'దిద్దుబాటు పనిముట్ల పట్టీని చూపించు',
 'tog-editondblclick' => 'డబుల్‌ క్లిక్కు చేసినప్పుడు పేజీని మార్చు',
-'tog-editsectiononrightclick' => 'విభాగాల శీర్షికల మీద కుడినొక్కుతో విభాగపు దిద్దుబాటును చేతనంచేయి',
-'tog-rememberpassword' => 'ఈ విహారిణిలో నా ప్రవేశాన్ని గుర్తుంచుకో (గరిష్ఠంగా $1 {{PLURAL:$1|రోజు|రోజుల}}కి)',
+'tog-editsectiononrightclick' => 'విభాగాల శీర్షికల మీద కుడినొక్కుతో విభాగపు దిద్దుబాటును చేతనం చేయి',
+'tog-rememberpassword' => 'ఈ విహారిణిలో నా ప్రవేశాన్ని (గరిష్ఠంగా $1 {{PLURAL:$1|రోజు|రోజుల}} పాటు) గుర్తుంచుకో',
 'tog-watchcreations' => 'నేను సృష్టించే పేజీలను మరియు దస్త్రాలను నా వీక్షణ జాబితాకు చేర్చు',
 'tog-watchdefault' => 'నేను మార్చే పేజీలను మరియు దస్త్రాలను నా వీక్షణ జాబితాకు చేర్చు',
 'tog-watchmoves' => 'నేను తరలించిన పేజీలను మరియు దస్త్రాలను నా వీక్షణ జాబితాకు చేర్చు',
@@ -178,7 +178,7 @@ $messages = array(
 'tog-watchlisthideanons' => 'అజ్ఞాత వాడుకరుల మార్పులను విక్షణా జాబితాలో చూపించకు',
 'tog-watchlisthidepatrolled' => 'నిఘా ఉన్న మార్పులను వీక్షణజాబితా నుంచి దాచిపెట్టు',
 'tog-ccmeonemails' => 'నేను ఇతర వాడుకరులకు పంపించే ఈ-మెయిళ్ల కాపీలను నాకు కూడా పంపు',
-'tog-diffonly' => 'తేడాలను చూపిస్తున్నపుడు, కింద చూపించే పేజీలోని సమాచారాన్ని చూపించొద్దు',
+'tog-diffonly' => 'తేడాల కింద, పేజీలోని సమాచారాన్ని చూపించొద్దు',
 'tog-showhiddencats' => 'దాచిన వర్గాలను చూపించు',
 'tog-norollbackdiff' => 'రద్దు చేసాక తేడాలు చూపించవద్దు',
 'tog-useeditwarning' => 'ఏదైనా పేజీని నేను వదిలివెళ్తున్నప్పుడు దానిలో భద్రపరచని మార్పులు ఉంటే నన్ను హెచ్చరించు',
@@ -229,7 +229,7 @@ $messages = array(
 'may-gen' => 'మే',
 'june-gen' => 'జూన్',
 'july-gen' => 'జూలై',
-'august-gen' => 'à°\86à°\97à°·్టు',
+'august-gen' => 'à°\86à°\97à°¸్టు',
 'september-gen' => 'సెప్టెంబరు',
 'october-gen' => 'అక్టోబరు',
 'november-gen' => 'నవంబరు',
@@ -254,23 +254,23 @@ $messages = array(
 'june-date' => 'జూన్ $1',
 'july-date' => 'జూలై $1',
 'august-date' => 'ఆగస్టు $1',
-'september-date' => 'à°¸à±\86à°ªà±\8dà°\9fà±\86à°\82బరà±\8d $1',
-'october-date' => 'à°\85à°\95à±\8dà°\9fà±\8bబరà±\8d $1',
-'november-date' => 'నవà°\82బరà±\8d $1',
-'december-date' => 'à°¡à°¿à°¸à±\86à°\82బరà±\8d $1',
+'september-date' => 'à°¸à±\86à°ªà±\8dà°\9fà±\86à°\82బరà±\81 $1',
+'october-date' => 'à°\85à°\95à±\8dà°\9fà±\8bబరà±\81 $1',
+'november-date' => 'నవà°\82బరà±\81 $1',
+'december-date' => 'à°¡à°¿à°¸à±\86à°\82బరà±\81 $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|వర్గం|వర్గాలు}}',
 'category_header' => '"$1" వర్గంలోని పుటలు',
 'subcategories' => 'ఉపవర్గాలు',
-'category-media-header' => '"$1" వర్గంలో ఉన్న మీడియా ఫైళ్లు',
-'category-empty' => "''ప్రస్తుతం ఈ వర్గంలో ఎలాంటి పేజీలుగానీ మీడియా ఫైళ్లుగానీ లేవు.''",
+'category-media-header' => '"$1" వర్గంలో ఉన్న మీడియా',
+'category-empty' => '<em>ప్రస్తుతం ఈ వర్గంలో ఎలాంటి పేజీలుగానీ మీడియాగానీ లేవు.</em>',
 'hidden-categories' => '{{PLURAL:$1|దాచిన వర్గం|దాచిన వర్గాలు}}',
 'hidden-category-category' => 'దాచిన వర్గాలు',
-'category-subcat-count' => '{{PLURAL:$2|à°\88 à°µà°°à±\8dà°\97à°\82à°²à±\8b à°\95à±\8dà°°à°¿à°\82à°¦ à°\9aà±\82పిసà±\8dà°¤à±\81à°¨à±\8dà°¨ à°\92à°\95à±\87 à°\89పవరà±\8dà°\97à°\82 à°\89à°\82ది.|à°\88 à°µà°°à±\8dà°\97à°\82à°²à±\8b à°\89à°¨à±\8dà°¨ à°®à±\8aà°¤à±\8dà°¤à°\82 $2 à°µà°°à±\8dà°\97ాలలà±\8b à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤à°\82 {{PLURAL:$1|à°\92à°\95 à°\89పవరà±\8dà°\97ానà±\8dని|$1 à°\89పవరà±\8dà°\97ాలనà±\81}} à°\9aà±\82పిసà±\8dà°¤à±\81à°¨à±\8dనామà±\81.}}',
-'category-subcat-count-limited' => 'ఈ వర్గం క్రింద చూపిస్తున్న {{PLURAL:$1|ఒక ఉపవర్గం ఉంది|$1 ఉపవర్గాలు ఉన్నాయి}}.',
-'category-article-count' => '{{PLURAL:$2|à°\88 à°µà°°à±\8dà°\97à°\82à°²à±\8b à°\95à±\8dà°°à°¿à°\82à°¦ à°\9aà±\82పిసà±\8dà°¤à±\81à°¨à±\8dà°¨ à°\92à°\95à±\87 à°ªà±\87à°\9cà±\80 à°\89à°\82ది.|à°\88 à°µà°°à±\8dà°\97à°\82à°²à±\8b à°\89à°¨à±\8dà°¨ à°®à±\8aà°¤à±\8dà°¤à°\82 $2 à°ªà±\87à°\9cà±\80లలà±\8b à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤à°\82 {{PLURAL:$1|à°\92à°\95 à°ªà±\87à°\9cà±\80ని|$1 à°ªà±\87à°\9cà±\80లనà±\81}} à°\9aà±\82పిసà±\8dà°¤à±\81à°¨à±\8dనామà±\81.}}',
-'category-article-count-limited' => 'à°\88 à°µà°°à±\8dà°\97à°\82 à°\95à±\8dà°°à°¿à°\82à°¦ à°\9aà±\82పిసà±\8dà°¤à±\81à°¨à±\8dà°¨ {{PLURAL:$1|à°\92à°\95 à°ªà±\87à°\9cà±\80 à°\89à°\82ది|$1 à°ªà±\87à°\9cà±\80à°²à±\81 à°\89న్నాయి}}.',
+'category-subcat-count' => '{{PLURAL:$2|à°\88 à°µà°°à±\8dà°\97à°\82à°²à±\8b à°\95à°¿à°\82à°¦ à°\9aà±\82పిన à°\92à°\95à±\87 à°\89పవరà±\8dà°\97à°\82 à°\89à°\82ది.|à°\88 à°µà°°à±\8dà°\97à°\82à°²à±\8b à°\95à°¿à°\82ది {{PLURAL:$1|à°\89పవరà±\8dà°\97à°\82 à°\89à°\82ది|$1 à°\89పవరà±\8dà°\97ాలà±\81 à°\89à°¨à±\8dనాయి}}, à°®à±\8aà°¤à±\8dà°¤à°\82 $2 à°²à±\8b.}}',
+'category-subcat-count-limited' => 'ఈ వర్గంలో కింది {{PLURAL:$1|ఉపవర్గం ఉంది|$1 ఉపవర్గాలు ఉన్నాయి}}.',
+'category-article-count' => '{{PLURAL:$2|à°\88 à°µà°°à±\8dà°\97à°\82à°²à±\8b à°\95à°¿à°\82ది à°ªà±\87à°\9cà±\80 à°\92à°\95à°\9fà±\87 à°\89à°\82ది.|à°\88 à°µà°°à±\8dà°\97à°\82à°²à±\8b à°\95à°¿à°\82ది {{PLURAL:$1|à°ªà±\87à°\9cà±\80 à°\89à°\82ది|$1 à°ªà±\87à°\9cà±\80à°²à±\81à°¨à±\8dనాయి}}, à°®à±\8aà°¤à±\8dà°¤à°\82 $2 à°ªà±\87à°\9cà±\80లలà±\8b.}}',
+'category-article-count-limited' => 'à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤ à°µà°°à±\8dà°\97à°\82à°²à±\8b à°\95à°¿à°\82ది {{PLURAL:$1|à°ªà±\87à°\9cà±\80 à°\89à°\82ది|$1 à°ªà±\87à°\9cà±\80à°²à±\81న్నాయి}}.',
 'category-file-count' => '{{PLURAL:$2|ఈ వర్గంలో క్రింద చూపిస్తున్న ఒకే ఫైలు ఉంది.|ఈ వర్గంలో ఉన్న మొత్తం $2 పేజీలలో ప్రస్తుతం {{PLURAL:$1|ఒక ఫైలును|$1 ఫైళ్లను}} చూపిస్తున్నాము.}}',
 'category-file-count-limited' => 'ఈ వర్గం క్రింద చూపిస్తున్న {{PLURAL:$1|ఒక ఫైలు ఉంది|$1 ఫైళ్లు ఉన్నాయి}}.',
 'listingcontinuesabbrev' => '(కొనసాగింపు)',
@@ -306,7 +306,6 @@ $messages = array(
 'vector-action-protect' => 'సంరక్షించు',
 'vector-action-undelete' => 'తిరిగి చేర్చు',
 'vector-action-unprotect' => 'సంరక్షణను మార్చు',
-'vector-simplesearch-preference' => 'సరళమైన వెతుకుడు పట్టీని చేతనంచేయి (వెక్టర్ అలంకారానికి మాత్రమే)',
 'vector-view-create' => 'సృష్టించు',
 'vector-view-edit' => 'సవరించు',
 'vector-view-history' => 'చరిత్రను చూడండి',
@@ -338,6 +337,7 @@ $messages = array(
 'create-this-page' => 'ఈ పేజీని సృష్టించండి',
 'delete' => 'తొలగించు',
 'deletethispage' => 'ఈ పేజీని తొలగించండి',
+'undeletethispage' => 'ఈ పేజీ తొలగింపును ఆపు',
 'undelete_short' => '{{PLURAL:$1|ఒక్క రచనను|$1 రచనలను}} పునఃస్థాపించు',
 'viewdeleted_short' => '{{PLURAL:$1|తొలగించిన ఒక మార్పు|$1 తొలగించిన మార్పుల}}ను చూడండి',
 'protect' => 'సంరక్షించు',
@@ -366,7 +366,7 @@ $messages = array(
 'otherlanguages' => 'ఇతర భాషలలో',
 'redirectedfrom' => '($1 నుండి మళ్ళించబడింది)',
 'redirectpagesub' => 'దారిమార్పు పుట',
-'lastmodifiedat' => 'à°\88 à°ªà±\87à°\9cà±\80à°\95à°¿ $2, $1à°¨ à°\9aివరి à°®à°¾à°°à±\8dà°ªà±\81 à°\9cà°°à°¿à°\97à°¿à°¨ది.',
+'lastmodifiedat' => 'à°\88 à°ªà±\87à°\9cà±\80à°²à±\8b à°\9aివరి à°®à°¾à°°à±\8dà°ªà±\81 $1 à°¨ $2 à°\95à±\81 à°\9cà°°à°¿à°\97à°¿à°\82ది.',
 'viewcount' => 'ఈ పేజీ {{PLURAL:$1|ఒక్క సారి|$1 సార్లు}} దర్శించబడింది.',
 'protectedpage' => 'సంరక్షణలోని పేజీ',
 'jumpto' => 'ఇక్కడికి గెంతు:',
@@ -386,8 +386,8 @@ $1',
 'aboutpage' => 'Project:గురించి',
 'copyright' => 'విషయం $1 కి లోబడి లభ్యం, వేరుగా పేర్కొంటే తప్ప.',
 'copyrightpage' => '{{ns:project}}:ప్రచురణ హక్కులు',
-'currentevents' => 'à°\87à°ªà±\8dà°ªà°\9fà°¿ à°®à±\81à°\9aà±\8dà°\9aà°\9fà±\8dలు',
-'currentevents-url' => 'Project:à°\87à°ªà±\8dà°ªà°\9fà°¿ à°®à±\81à°\9aà±\8dà°\9aà°\9fà±\8dలు',
+'currentevents' => 'వరà±\8dతమాన à°\98à°\9fà°¨లు',
+'currentevents-url' => 'Project:వరà±\8dతమాన à°\98à°\9fà°¨లు',
 'disclaimers' => 'అస్వీకారములు',
 'disclaimerpage' => 'Project:సాధారణ నిష్పూచీ',
 'edithelp' => 'దిద్దుబాటు సహాయం',
@@ -505,24 +505,25 @@ $1',
 'cannotdelete-title' => '"$1" పుటను తొలగించలేరు',
 'delete-hook-aborted' => 'తొలగింపును హుక్ ఆపేసింది.
 వివరణ ఏమీ ఇవ్వలేదు.',
+'no-null-revision' => '"$1" పేజీకి కొత్త శూన్య కూర్పు (నల్ రివిజన్) ను సృష్టించలేకపోయాం',
 'badtitle' => 'తప్పు శీర్షిక',
 'badtitletext' => 'మీరు కోరిన పుట యొక్క పేరు చెల్లనిది, ఖాళీగా ఉంది, లేదా తప్పుగా ఇచ్చిన అంతర్వికీ లేదా అంతర-భాషా శీర్షిక అయివుండాలి.
 శీర్షికలలో ఉపయోగించకూడని అక్షరాలు దానిలో ఉండివుండొచ్చు.',
-'perfcached' => 'కింది డేటా ముందే సేకరించి పెట్టుకున్నది. కాబట్టి తాజా డేటాతో పోలిస్తే తేడాలుండవచ్చు. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'కింది సమాచారం ముందే సేకరించి పెట్టుకున్నది. దీన్ని $1న చివరిసారిగా తాజాకరించారు. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'కింది డేటా ముందే సేకరించి పెట్టుకున్నది. కాబట్టి తాజా డేటాతో పోలిస్తే తేడాలుండవచ్చు. ఈ కాషెలో గరిష్టంగా {{PLURAL:$1|ఒక్క ఫలితం ఉంది|$1 ఫలితాలు ఉన్నాయి}}.',
+'perfcachedts' => 'కింది సమాచారం ముందే సేకరించి పెట్టుకున్నది. దీన్ని $1న చివరిసారిగా తాజాకరించారు. ఈ కాషెలో గరిష్టంగా {{PLURAL:$4|ఒక్క ఫలితం ఉంది|$4 ఫలితాలు ఉన్నాయి}}.',
 'querypage-no-updates' => 'ప్రస్తుతం ఈ పుటకి తాజాకరణలని అచేతనం చేసారు.
 ఇక్కడున్న భోగట్టా కూడా తాజాకరించబడదు.',
 'viewsource' => 'మూలాన్ని చూపించు',
 'viewsource-title' => '$1 యొక్క సోర్సు చూడండి',
 'actionthrottled' => 'కార్యాన్ని ఆపేసారు',
 'actionthrottledtext' => 'స్పామును తగ్గించటానికి తీసుకున్న నిర్ణయాల వల్ల, మీరు ఈ కార్యాన్ని అతి తక్కువ సమయంలో బోలెడన్ని సార్లు చేయకుండా అడ్డుకుంటున్నాము. కొన్ని నిమిషాలు ఆగి మరలా ప్రయత్నించండి.',
-'protectedpagetext' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°®à°¾à°°à±\8dà°\9aà°\95à±\81à°\82à°¡à°¾ à°\89à°\82à°¡à±\87à°\82à°¦à±\81à°\95à±\81 à°¸à°\82à°°à°\95à±\8dà°·à°¿à°\82à°\9aారà±\81.',
+'protectedpagetext' => 'à°\88 à°ªà±\87à°\9cà±\80à°²à±\8b à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°µà°\97à±\88రాలà±\81 à°\9aà±\86à°¯à±\8dà°¯à°\95à±\81à°\82à°¡à°¾ à°\89à°\82à°¡à±\87à°\82à°¦à±\81à°\95à±\81 à°\97ానà±\81, à°¸à°\82à°°à°\95à±\8dà°·à°¿à°\82à°\9aబడిà°\82ది.',
 'viewsourcetext' => 'మీరీ పేజీ సోర్సును చూడవచ్చు, కాపీ చేసుకోవచ్చు:',
 'viewyourtext' => "ఈ పేజీకి '''మీ మార్పుల''' యొక్క మూలాన్ని చూడవచ్చు లేదా కాపీచేసుకోవచ్చు:",
-'protectedinterface' => 'సాఫà±\8dà°\9fà±\81à°µà±\87à°°à±\81 à°\87à°\82à°\9fà°°à±\81à°«à±\87à°¸à±\81à°\95à±\81 à°\9aà±\86à°\82దిన à°\9fà±\86à°\95à±\8dà°¸à±\8dà°\9fà±\81à°¨à±\81 à°\88 à°ªà±\87à°\9cà±\80 à°\85à°\82దిసà±\8dà°¤à±\81à°\82ది. à°¦à±\81à°¶à±\8dà°\9aà°°à±\8dయల à°¨à°¿à°µà°¾à°°à°£ à°\95à±\8bసమà±\88 à°¦à±\80à°¨à±\8dని à°²à°¾à°\95à±\81 à°\9aà±\87సాà°\82.',
-'editinginterface' => "'''హెచ్చరిక''': సాఫ్టువేరుకు ఇంటరుఫేసు టెక్స్టును అందించే పేజీని మీరు సరిదిద్దుతున్నారు.
+'protectedinterface' => 'à°\88 à°ªà±\87à°\9cà±\80, à°\88 à°µà°¿à°\95à±\80 à°¯à±\8aà°\95à±\8dà°\95 à°¸à°¾à°«à±\8dà°\9fà±\81à°µà±\87à°°à±\81 à°\87à°\82à°\9fà°°à±\81à°«à±\87à°¸à±\81à°\95à±\81 à°\9aà±\86à°\82దిన à°\9fà±\86à°\95à±\8dà°¸à±\8dà°\9fà±\81à°¨à±\81 à°\85à°\82దిసà±\8dà°¤à±\81à°\82ది. à°¦à±\81à°¶à±\8dà°\9aà°°à±\8dయల à°¨à°¿à°µà°¾à°°à°£ à°\95à±\8bసమà±\88 à°¦à±\80à°¨à±\8dని à°¸à°\82à°°à°\95à±\8dà°·à°¿à°\82à°\9aà°¾à°\82. à°µà°¿à°\95à±\80లనà±\8dనిà°\9fà°¿à°²à±\8bà°¨à±\81 à°\85à°¨à±\81వాదాలనà±\81 à°\9aà±\87à°°à±\8dà°\9aాలనà±\8dనా, à°®à°¾à°°à±\8dà°\9aాలనà±\8dనా à°®à±\80డియావిà°\95à±\80 à°¸à±\8dథానిà°\95à±\80à°\95à°°à°£ à°ªà±\8dà°°à°¾à°\9cà±\86à°\95à±\8dà°\9fà±\88à°¨ [//translatewiki.net/ translatewiki.net] à°¨à±\81 à°µà°¾à°¡à°\82à°¡à°¿.',
+'editinginterface' => '<strong>హెచ్చరిక:</strong> సాఫ్టువేరుకు ఇంటరుఫేసు టెక్స్టును అందించేందుకు పనికొచ్చే పేజీని మీరు సరిదిద్దుతున్నారు.
 ఈ పేజీలో చేసే మార్పుల వల్ల ఇతర వాడుకరులకు ఇంటరుఫేసు కనబడే విధానంలో తేడావస్తుంది.
-à°\85à°¨à±\81వాదాల à°\95à±\8aà°°à°\95à±\88à°¤à±\87, [//translatewiki.net/wiki/Main_Page?setlang=te à°\9fà±\8dరానà±\8dà°¸à±\8dâ\80\8cà°²à±\87à°\9fà±\8d à°µà°¿à°\95à±\80.à°¨à±\86à°\9fà±\8d], à°®à±\80డియావిà°\95à±\80 à°¸à±\8dథానిà°\95à±\80à°\95à°°à°£ à°ªà±\8dà°°à°¾à°\9cà±\86à°\95à±\8dà°\9fà±\81, à°¨à°¿ à°µà°¾à°¡à°\82à°¡à°¿.",
+విà°\95à±\80లనà±\8dనిà°\9fà°¿à°²à±\8bà°¨à±\81 à°\85à°¨à±\81వాదాలనà±\81 à°\9aà±\87à°°à±\8dà°\9aాలనà±\8dనా, à°®à°¾à°°à±\8dà°\9aాలనà±\8dనా à°®à±\80డియావిà°\95à±\80 à°¸à±\8dథానిà°\95à±\80à°\95à°°à°£ à°ªà±\8dà°°à°¾à°\9cà±\86à°\95à±\8dà°\9fà±\88à°¨ [//translatewiki.net/ translatewiki.net] à°¨à±\81 à°µà°¾à°¡à°\82à°¡à°¿.',
 'cascadeprotected' => 'కింది {{PLURAL:$1|పేజీని|పేజీలను}} కాస్కేడింగు ఆప్షనుతో చేసి సంరక్షించారు. ప్రస్తుత పేజీ, ఈ పేజీల్లో ఇంక్లూడు అయి ఉంది కాబట్టి, దిద్దుబాటు చేసే వీలు లేకుండా ఇది కూడా రక్షణలో ఉంది.
 $2',
 'namespaceprotected' => "'''$1''' నేంస్పేసులో మార్పులు చేయటానికి మీకు అనుమతి లేదు.",
@@ -538,8 +539,11 @@ $2',
 'filereadonlyerror' => 'ఫైలు ఖజానా "$2" రీడ్-ఓన్లీ స్థితిలో ఉండటం చేత "$1" ఫైలులో మార్పులు చెయ్యలేకపోయాం.
 
 దానికి తాళం వేసిన అధికారి ఇచ్చిన వివరణ ఇది: "$3".',
+'invalidtitle-knownnamespace' => 'పేరుబరి "$2", పాఠ్యము "$3" తో కూడిన ఈ శీర్షిక చెల్లనిది',
+'invalidtitle-unknownnamespace' => 'అపరిచితమైన పేరుబరి సంఖ్య "$1", పాఠ్యము "$2" తో కూడిన ఈ శీర్షిక చెల్లనిది',
 'exception-nologin' => 'లోనికి ప్రవేశించిలేరు',
 'exception-nologin-text' => 'ఈ పేజీని చూడడానికి లేదా ఈ చర్యను చెయ్యడానికి దయచేసి [[Special:Userlogin|ప్రవేశించండి]].',
+'exception-nologin-text-manual' => 'ఈ పేజీ చూసేందుకు లేదా ఈ పని చేసేందుకు $1.',
 
 # Virus scanner
 'virus-badscanner' => "తప్పుడు స్వరూపణం: తెలియని వైరస్ స్కానర్: ''$1''",
@@ -547,10 +551,9 @@ $2',
 'virus-unknownscanner' => 'అజ్ఞాత యాంటీవైరస్:',
 
 # Login and logout pages
-'logouttext' => "'''ఇప్పుడు మీరు నిష్క్రమించారు.'''
+'logouttext' => '<strong>ఇప్పుడు మీరు లాగౌటయ్యారు.</strong>
 
-మీరు {{SITENAME}}ని అజ్ఞాతంగా వాడుతూండొచ్చు, లేదా ఇదే వాడుకరిగా కానీ లేదా వేరే వాడుకరిగా కానీ <span class='plainlinks'>[$1 మళ్ళీ ప్రవేశించవచ్చు]</span>.
-అయితే, మీ విహారిణిలోని కోశాన్ని శుభ్రపరిచే వరకు కొన్ని పేజీలు మీరింకా ప్రవేశించి ఉన్నట్లుగానే చూపించవచ్చని గమనించండి.",
+అయితే, ఓ గమనిక.. మీ విహారిణిలోని కోశాన్ని ఖాళీ చేసేవరకూ కొన్ని పేజీలు మీరింకా లాగినై ఉన్నట్లుగానే చూపించవచ్చు.',
 'welcomeuser' => 'స్వాగతం, $1!',
 'welcomecreation-msg' => 'మీ ఖాతాని సృష్టించాం.
 మీ [[Special:Preferences|{{SITENAME}} అభిరుచులను]] మార్చుకోవడం మరువకండి.
@@ -571,6 +574,7 @@ $2',
 'createacct-yourpasswordagain-ph' => 'సంకేతపదాన్ని మళ్ళీ ఇవ్వండి',
 'remembermypassword' => 'ఈ కంప్యూటరులో నా ప్రవేశాన్ని గుర్తుంచుకో (గరిష్ఠంగా $1 {{PLURAL:$1|రోజు|రోజుల}}కి)',
 'userlogin-remembermypassword' => 'నన్ను ప్రవేశింపజేసి ఉంచు',
+'userlogin-signwithsecure' => 'సురక్షిత కనెక్షను వాడు',
 'yourdomainname' => 'మీ డోమైను',
 'password-change-forbidden' => 'ఈ వికీలో మీరు సంకేతపదాలను మార్చలేరు.',
 'externaldberror' => 'డేటాబేసు అధీకరణలో పొరపాటు జరిగింది లేదా మీ బయటి ఖాతాని తాజాకరించడానికి మీకు అనుమతి లేదు.',
@@ -654,15 +658,16 @@ $2',
 'passwordsent' => '"$1" కొరకు నమోదైన ఈ-మెయిలు చిరునామాకి కొత్త సంకేతపదాన్ని పంపించాం.
 అది అందిన తర్వాత ప్రవేశించి చూడండి.',
 'blocked-mailpassword' => 'దిద్దుబాట్లు చెయ్యకుండా ఈ ఐపీఅడ్రసును నిరోధించాం. అంచేత, దుశ్చర్యల నివారణ కోసం గాను, మరచిపోయిన సంకేతపదాన్ని పొందే అంశాన్ని అనుమతించము.',
-'eauthentsent' => 'à°\87à°\9aà±\8dà°\9aà°¿à°¨ à°\88-à°®à±\86యిలà±\81 à°\85à°¡à±\8dà°°à°¸à±\81à°\95à±\81 à°§à±\83à°µà±\80à°\95à°°à°£ à°®à±\86యిలà±\81 à°µà±\86à°³à±\8dళిà°\82ది.
-మరినà±\8dని à°®à±\86యిళà±\8dà°³à±\81 à°ªà°\82à°ªà±\87 à°®à±\81à°\82à°¦à±\81, à°®à±\80à°°à±\81 à°\86 à°®à±\86యిలà±\8dà°²à±\8b à°¸à±\82à°\9aà°¿à°\82à°\9aà°¿à°¨à°\9fà±\8dà°²à±\81à°\97à°¾ à°\9aà±\87సి, à°\88 à°\9aà°¿à°°à±\81నామా à°®à±\80à°¦à±\87నని à°§à±\83à°µà±\80à°\95à°°à°¿à°\82à°\9aà°\82à°¡ి.',
+'eauthentsent' => 'à°\87à°\9aà±\8dà°\9aà°¿à°¨ à°\88-à°®à±\86యిలà±\81 à°\85à°¡à±\8dà°°à°¸à±\81à°\95à±\81 à°§à±\83à°µà±\80à°\95à°°à°£ à°®à±\86యిలà±\81 à°ªà°\82పిà°\82à°\9aà°¾à°\82.
+à°\87à°\95à°ªà±\88 à°®à±\87à°®à±\81 à°\86 à°\96ాతాà°\95à±\81 à°®à±\86యిలà±\81 à°ªà°\82పాలà°\82à°\9fà±\87, à°®à±\81à°\82à°¦à±\81à°\97à°¾ à°®à±\80à°°à±\81 à°\86 à°®à±\86యిలà±\8dà°²à±\8b à°¸à±\82à°\9aà°¿à°\82à°\9aà°¿à°¨à°\9fà±\8dà°²à±\81à°\97à°¾ à°\9aà±\87సి, à°\88 à°\9aà°¿à°°à±\81నామా à°®à±\80à°¦à±\87నని à°§à±\83à°µà±\80à°\95à°°à°¿à°\82à°\9aాలి.',
 'throttled-mailpassword' => 'గడచిన {{PLURAL:$1|ఒక గంటలో|$1 గంటల్లో}} ఇప్పటికే  దాటుమాట మార్చినట్లుగా ఒక మెయిల్  పంపించివున్నాం.
 దుశ్చర్యలను నివారించేందుకు గాను, {{PLURAL:$1|ఒక గంటకి|$1 గంటలకి}} ఒక్కసారి మాత్రమే దాటుమాట మార్పు మెయిల్ పంపిస్తాము.',
 'mailerror' => 'మెయిలు పంపించడంలో లోపం: $1',
 'acct_creation_throttle_hit' => 'మీ ఐపీ చిరునామా వాడుతున్న ఈ వికీ సందర్శకులు గత ఒక్క రోజులో {{PLURAL:$1|1 ఖాతాని|$1 ఖాతాలను}} సృష్టించారు, ఈ కాల వ్యవధిలో అది గరిష్ఠ పరిమితి.
 అందువల్ల, ఈ ఐపీని వాడుతున్న సందర్శకులు ప్రస్తుతానికి ఇంక ఖాతాలని సృష్టించలేరు.',
 'emailauthenticated' => 'మీ ఈ-మెయిలు చిరునామా $2న $3కి ధృవీకరింపబడింది.',
-'emailnotauthenticated' => 'మీ ఈ-మెయిలు చిరునామాను ఇంకా ధృవీకరించలేదు. కాబట్టి కింద పేర్కొన్న అంశాలకు ఎటువంటి ఈ-మెయులునూ పంపించము.',
+'emailnotauthenticated' => 'మీ ఈ-మెయిలు చిరునామాను ఇంకా ధృవీకరించలేదు. 
+కింద పేర్కొన్న అంశాలకు సంబంధించి ఎటువంటి ఈ-మెయిలునూ పంపించము.',
 'noemailprefs' => 'కింది అంశాలు పని చెయ్యటానికి ఈ-మెయిలు చిరునామాను నమొదుచయ్యండి.',
 'emailconfirmlink' => 'మీ ఈ-మెయిలు చిరునామాను ధృవీకరించండి',
 'invalidemailaddress' => 'మీరు ఇచ్చిన ఈ-మెయిలు చిరునామా సరైన రీతిలో లేనందున అంగీకరించటంలేదు.
@@ -670,15 +675,15 @@ $2',
 'cannotchangeemail' => 'ఈ వికీలో ఖాతా ఈ-మెయిలు చిరునామాను మార్చుకోలేరు.',
 'emaildisabled' => 'ఈ సైటు ఈమెయిళ్ళను పంపించలేదు.',
 'accountcreated' => 'ఖాతాని సృష్టించాం',
-'accountcreatedtext' => '$1 కి వాడుకరి ఖాతాని సృష్టించాం.',
+'accountcreatedtext' => '[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|చర్చ]])కి వాడుకరి ఖాతాను సృష్టించాం.',
 'createaccount-title' => '{{SITENAME}} కోసం ఖాతా సృష్టి',
 'createaccount-text' => '{{SITENAME}} ($4) లో ఎవరో మీ ఈమెయిలు చిరునామాకి "$2" అనే పేరుగల ఖాతాని "$3" అనే సంకేతపదంతో సృష్టించారు.
 మీరు లోనికి ప్రవేశించి మీ సంకేతపదాన్ని ఇప్పుడే మార్చుకోవాలి.
 
 ఈ ఖాతాని పొరపాటున సృష్టిస్తే గనక, ఈ సందేశాన్ని పట్టించుకోకండి.',
 'usernamehasherror' => 'వాడుకరిపేరులో హాష్ అక్షరాలు ఉండకూడదు',
-'login-throttled' => 'à°\97à°¤ à°\95à±\8aà°¦à±\8dదిసà±\87à°ªà°\9fà°¿ à°¨à±\81à°\82à°¡à°¿ à°®à±\80à°°à±\81 à°\9aాలా à°ªà±\8dà°°à°µà±\87à°¶ ప్రయత్నాలు చేసారు.
-మళ్ళీ ప్రయత్నించే ముందు కాసేపు వేచివుండండి.',
+'login-throttled' => 'à°\95à±\8aà°¦à±\8dదిసà±\87à°ªà°\9fà°¿à°\97à°¾ à°®à±\80à°°à±\81 à°\9aాలా à°²à°¾à°\97à°¿à°¨à±\8d ప్రయత్నాలు చేసారు.
+మళ్ళీ ప్రయత్నించే ముందు $1 ఆగండి.',
 'login-abort-generic' => 'మీ లాగిన్ ప్రయత్నం విఫలమైంది - ఆగిపోయింది',
 'loginlanguagelabel' => 'భాష: $1',
 'suspicious-userlogout' => 'సరిగా పనిచేయని విహారిణి లేదా కాషింగ్ ప్రాక్సీ వల్ల పంపబడడం చేత, నిష్క్రమించాలనే మీ అభ్యర్థనని నిరాకరించారు.',
@@ -700,6 +705,8 @@ $2',
 'retypenew' => 'సంకేతపదం, మళ్ళీ',
 'resetpass_submit' => 'సంకేతపదాన్ని మార్చి లోనికి ప్రవేశించండి',
 'changepassword-success' => 'మీ సంకేతపదం విజయవంతంగా మార్చబడింది.',
+'changepassword-throttled' => 'కొద్దిసేపటిగా మీరు చాలా లాగిన్ ప్రయత్నాలు చేసారు.
+మళ్ళీ ప్రయత్నించే ముందు $1 ఆగండి.',
 'resetpass_forbidden' => 'సంకేతపదాలను మార్చటం కుదరదు',
 'resetpass-no-info' => 'ఈ పేజీని నేరుగా చూడటానికి మీరు లోనికి ప్రవేశించివుండాలి.',
 'resetpass-submit-loggedin' => 'సంకేతపదాన్ని మార్చు',
@@ -722,24 +729,25 @@ $2',
 'passwordreset-capture-help' => 'ఈ పెట్టెను చెక్ చేస్తే, ఈమెయిలును (తాత్కాలిక సంకేతపదంతో) వాడుకరికి పంపిస్తూనే, మీకూ చూపిస్తాం.',
 'passwordreset-email' => 'ఈ-మెయిలు చిరునామా:',
 'passwordreset-emailtitle' => '{{SITENAME}}లో ఖాతా వివరాలు',
-'passwordreset-emailtext-ip' => 'à°\8eవరà±\8b (బహà±\81శా à°®à±\80à°°à±\87, à°\90à°ªà±\80 à°\85à°¡à±\8dà°°à°¸à±\81 $1 à°¨à±\81à°\82à°\9aà°¿)  {{SITENAME}} ($4) à°²à±\8b à°®à±\80 à°\96ాతా à°µà°¿à°µà°°à°¾à°²à°¨à±\81 à°\9aà±\86à°ªà±\8dà°ªమంటూ అడిగారు. కింది వాడుకరి {{PLURAL:$3|ఖాతా|ఖాతాలు}}
-à°\88 à°\88à°®à±\86యిలà±\81 à°\85à°¡à±\8dà°°à°¸à±\81తో అనుసంధింపబడి ఉన్నాయి:
+'passwordreset-emailtext-ip' => 'à°\8eవరà±\8b (బహà±\81శా à°®à±\80à°°à±\87, à°\90à°ªà±\80 à°\85à°¡à±\8dà°°à°¸à±\81 $1 à°¨à±\81à°\82à°\9aà°¿)  {{SITENAME}} ($4) à°²à±\8b à°®à±\80 à°¸à°\82à°\95à±\87తపదానà±\8dని à°®à°¾à°°à±\8dà°\9aమంటూ అడిగారు. కింది వాడుకరి {{PLURAL:$3|ఖాతా|ఖాతాలు}}
+à°\88 à°\88à°®à±\86యిలà±\81 à°\9aà°¿à°°à±\81నామాతో అనుసంధింపబడి ఉన్నాయి:
 
 $2
 
-{{PLURAL:$3|à°\88 à°¤à°¾à°¤à±\8dà°\95ాలిà°\95 à°¸à°\82à°\95à±\87తపదానిà°\95à°¿|à°\88 à°¤à°¾à°¤à±\8dà°\95ాలిà°\95 à°¸à°\82à°\95à±\87తపదాలà°\95à±\81}} {{PLURAL:$5|à°\92à°\95à±\8dà°\95 రోజులో|$5 రోజుల్లో}} కాలం చెల్లుతుంది.
-ఇప్పుడు మీరు లాగినై కొత్త సంకేతపదాన్ని ఎంచుకోవాల్సి ఉంటుంది. ఈ అభ్యర్ధన చేసింది మరెవరైనా అయినా, లేక మీ అసలు సంకేతపదం మీకు గుర్తొచ్చి, మార్చాల్సిన అవసరం లేకపోయినా, మీరీ సందేశాన్ని పట్టించుకోనక్కర్లేదు. పాత సంకేతపదాన్నే వాడుతూ పోవచ్చు.',
-'passwordreset-emailtext-user' => '{{SITENAME}} à°²à±\8bని à°µà°¾à°¡à±\81à°\95à°°à°¿ $1, {{SITENAME}} ($4) à°²à±\8bని à°®à±\80 à°\96ాతా à°µà°¿à°µà°°à°¾à°²à°¨à±\81 à°\9aà±\86à°ªà±\8dà°ªమంటూ అడిగారు. కింది వాడుకరి {{PLURAL:$3|ఖాతా|ఖాతాలు}}
+{{PLURAL:$3|à°\88 à°¸à°\82à°\95à±\87తపదానిà°\95à°¿|à°\88 à°¸à°\82à°\95à±\87తపదాలà°\95à±\81}} {{PLURAL:$5|à°\92à°\95à±\8dà°\95రోజులో|$5 రోజుల్లో}} కాలం చెల్లుతుంది.
+ఇప్పుడు మీరు లాగినై కొత్త సంకేతపదాన్ని ఎంచుకోవాల్సి ఉంటుంది. ఈ అభ్యర్ధన చేసింది మరెవరైనా అయినా, లేక మీ అసలు సంకేతపదం మీకు గుర్తొచ్చి దాన్ని మార్చాల్సిన అవసరం లేదని అనుకున్నా, మీరీ సందేశాన్ని పట్టించుకోనక్కర్లేదు. పాత సంకేతపదాన్నే వాడుకోవచ్చు.',
+'passwordreset-emailtext-user' => '{{SITENAME}} à°²à±\8bని à°µà°¾à°¡à±\81à°\95à°°à°¿ $1, {{SITENAME}} ($4) à°²à±\8bని à°®à±\80 à°¸à°\82à°\95à±\87తపదానà±\8dని à°®à°¾à°°à±\8dà°\9aమంటూ అడిగారు. కింది వాడుకరి {{PLURAL:$3|ఖాతా|ఖాతాలు}}
 ఈ ఈమెయిలు అడ్రసుతో అనుసంధింపబడి ఉన్నాయి:
 
 $2
 
 {{PLURAL:$3|ఈ తాత్కాలిక సంకేతపదానికి|ఈ తాత్కాలిక సంకేతపదాలకు}} {{PLURAL:$5|ఒక్క రోజులో|$5 రోజుల్లో}} కాలం చెల్లుతుంది.
-ఇప్పుడు మీరు లాగినై కొత్త సంకేతపదాన్ని ఎంచుకోవాల్సి ఉంటుంది. ఈ అభ్యర్ధన చేసింది మరెవరైనా అయినా, లేక మీ అసలు సంకేతపదం మీకు గుర్తొచ్చి, మార్చాల్సిన అవసరం లేకపోయినా, మీరీ సందేశాన్ని పట్టించుకోనక్కర్లేదు. పాత సంకేతపదాన్నే వాడుతూ పోవచ్చు.',
+ఇప్పుడు మీరు లాగినై కొత్త సంకేతపదాన్ని ఎంచుకోవాల్సి ఉంటుంది. ఈ అభ్యర్ధన చేసింది మరెవరైనా అయినా, లేక మీ అసలు సంకేతపదం మీకు గుర్తొచ్చి దాన్ని మార్చాల్సిన అవసరం లేదని అనుకున్నా, మీరీ సందేశాన్ని పట్టించుకోనక్కర్లేదు. పాత సంకేతపదాన్నే వాడుకోవచ్చు.',
 'passwordreset-emailelement' => 'వాడుకరిపేరు: $1
 తాత్కాలిక సంకేతపదం: $2',
-'passwordreset-emailsent' => 'జ్ఞాపకం ఈమెయిలు పంపించాం.',
-'passwordreset-emailsent-capture' => 'క్రింద చూపబడిన, గుర్తుచేయు సందేశమును పంపినాము.',
+'passwordreset-emailsent' => 'సంకేతపదం మార్పు ఈమెయిలును పంపించాం.',
+'passwordreset-emailsent-capture' => 'క్రింద చూపిన సంకేతపదం మార్పు ఈమెయిలును పంపించాం.',
+'passwordreset-emailerror-capture' => 'కింద చూపిన సంకేతపదం మార్పు ఈమెయిలును తయారుచేసాం. కానీ దాన్ని {{GENDER:$2|వాడుకరికి}} పంపడం విఫలమైంది: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ఈ-మెయిలు చిరునామా మార్పు',
@@ -752,9 +760,21 @@ $2
 'changeemail-password' => 'మీ {{SITENAME}} సంకేతపదం:',
 'changeemail-submit' => 'ఈ-మెయిల్ మార్చు',
 'changeemail-cancel' => 'రద్దుచేయి',
+'changeemail-throttled' => 'మరీ ఎక్కువగా లాగిన్ ప్రయత్నాలు చేసారు.
+మళ్ళీ ప్రయత్నించే ముందు $1 ఆగండి.',
 
 # Special:ResetTokens
+'resettokens' => 'టోకెన్ ను రీసెట్ చెయ్యి',
+'resettokens-text' => 'మీ ఖాతాకు అనుబంధంగా ఉన్న గోపనీయ డేటాను చూపించే టోకెన్లను మీరు ఇక్కడ రీసెట్ చెయ్యవచ్చు.
+
+మీరా టోకెన్లను పొరపాటున ఎవరికైనా ఇచ్చి ఉన్నా, లేక మీ ఖాతా వివరాలు మరెవరికైనా తెలిసిపోయినా మీరీ పని చెయ్యాలి.',
+'resettokens-no-tokens' => 'రీసెట్ చేసేందుకు టోకెన్లేమీ లేవు.',
+'resettokens-legend' => 'టోకెన్లను రీసెట్ చెయ్యి',
+'resettokens-tokens' => 'టోకెన్లు:',
 'resettokens-token-label' => '$1 (ప్రస్తుత విలువ: $2)',
+'resettokens-watchlist-token' => '[[Special:Watchlist|changes to pages on your watchlist]] యొక్క జాల వడ్డన (Atom/RSS) కు టోకెన్',
+'resettokens-done' => 'టోకెన్లను రీసెట్ చేసాం.',
+'resettokens-resetbutton' => 'ఎంచుకున్న టోకెన్లను రీసెట్ చెయ్యి',
 
 # Edit page toolbar
 'bold_sample' => 'బొద్దు అక్షరాలు',
@@ -832,9 +852,7 @@ $2
 'loginreqlink' => 'లాగినవండి',
 'loginreqpagetext' => 'ఇతర పుటలను చూడడానికి మీరు $1 ఉండాలి.',
 'accmailtitle' => 'సంకేతపదం పంపించబడింది.',
-'accmailtext' => "[[User talk:$1|$1]] కొరకు ఒక యాదృచ్చిక సంకేతపదాన్ని $2కి పంపించాం.
-
-ఈ కొత్త ఖాతా యొక్క సంకేతపదాన్ని లోనికి ప్రవేశించిన తర్వాత ''[[Special:ChangePassword|సంకేతపదాన్ని మార్చుకోండి]]'' అన్న పేజీలో మార్చుకోవచ్చు.",
+'accmailtext' => "[[User talk:$1|$1]] కొరకు ఒక యాదృచ్ఛిక సంకేతపదాన్ని $2కి పంపించాం. లాగినయ్యాక, ''[[Special:ChangePassword|సంకేతపదాన్ని మార్చుకోండి]]'' అనే పేజీలో ఈ సంకేతపదాన్ని మార్చుకోవచ్చు.",
 'newarticle' => '(కొత్తది)',
 'newarticletext' => "ఈ లింకుకు సంబంధించిన పేజీ ఉనికిలొ లేదు.
 కింది పెట్టెలో మీ రచనను టైపు చేసి ఆ పేజీని సృష్టించండి (దీనిపై సమాచారం కొరకు [[{{MediaWiki:Helppage}}|సహాయం]] పేజీ చూడండి). మీరిక్కడికి పొరపాటున వచ్చి ఉంటే, మీ బ్రౌజరు '''back''' మీట నొక్కండి.",
@@ -845,11 +863,16 @@ $2
 లేదా [{{fullurl:{{FULLPAGENAME}}|action=edit}} ఈ పేజీని మార్చవచ్చు]</span>.',
 'noarticletext-nopermission' => 'ప్రస్తుతం ఈ పేజీలో పాఠ్యమేమీ లేదు.
 మీరు ఇతర పేజీలలో [[Special:Search/{{PAGENAME}}|ఈ పేజీ శీర్షిక కోసం వెతకవచ్చు]], లేదా <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} సంబంధిత చిట్టాలలో వెతకవచ్చు]</span>, కానీ ఈ పేజీని సృష్టించడానికి మీకు అనుమతి లేదు.',
+'missing-revision' => '"{{PAGENAME}}" అనే పేజీ యొక్క కూర్పు #$1 ఉనికిలో లేదు. సాధారణంగా ఏదైనా తొలగించబడిన పేజీ యొక్క కాలం చెల్లిన చరితం లింకును నొక్కినపుడు ఇది జరుగుతుంది. వివరాలు [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} తొలగింపు లాగ్] లో దొరుకుతాయి.',
 'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" అనే వాడుకరి ఖాతా నమోదయిలేదు. మీరు ఈ పేజీని సృష్టించ/సరిదిద్దాలనుకుంటే, సరిచూసుకోండి.',
 'userpage-userdoesnotexist-view' => 'వాడుకరి ఖాతా "$1" నమోదుకాలేదు.',
 'blocked-notice-logextract' => 'ప్రస్తుతం ఈ వాడుకరిని నిరోధించారు.
 నిరోధపు చిట్టాలోని చివరి పద్దుని మీ సమాచారం కోసం ఈ క్రింద ఇస్తున్నాం:',
-'clearyourcache' => "'''గమనిక - భద్రపరచిన తర్వాత, మార్పులను చూడడానికి మీ విహారిణి యొక్క కోశాన్ని తీసేయాల్సిరావచ్చు.''' '''మొజిల్లా/ ఫైర్‌ఫాక్స్‌ / సఫారి:''' ''Shift'' మీటని నొక్కిపట్టి ''రీలోడ్''ని నొక్కండి లేదా ''Ctrl-F5'' అనే మీటల్ని లేదా ''Ctrl-R'' (మాకింటోషులో ''Command-R'') అనే మీటల్ని కలిపి నొక్కండి; '''కాంకరర్: '''''రీలోడ్''ని నొక్కండి లేదా ''F5'' మీటని నొక్కండి; '''ఒపెరా:''' ''Tools → Preferences'' ద్వారా కోశాన్ని శుభ్రపరచండి; '''ఇంటర్నెట్ ఎక్ప్లోరర్:'''''Ctrl'' మీటని నొక్కిపట్టి ''రీఫ్రెష్''ని నొక్కండి లేదా ''Ctrl-F5'' మీటల్ని కలిపి నొక్కండి.",
+'clearyourcache' => '<strong>గమనిక:</strong> భద్రపరచిన తర్వాత, మార్పులను చూడాలంటే మీ విహారిణి యొక్క కోశాన్ని తీసేయాల్సిరావచ్చు.
+*<strong>ఫైర్‌ఫాక్స్‌ / సఫారి:</strong> <em>Shift</em> మీటని నొక్కిపట్టి <em>Reload</em>ని నొక్కండి లేదా <em>Ctrl-F5</em> గానీ <em>Ctrl-R</em> (మాకింటోషులో <em>⌘-Shift-R</em>) గానీ నొక్కండి
+* <strong>గూగుల్ క్రోమ్:</strong> <em>Ctrl-Shift-R</em> (మాక్ లో <em>⌘-Shift-R</em>) నొక్కండి
+*<strong>ఇంటర్నెట్ ఎక్ప్లోరర్:</strong> <em>Ctrl</em> ను నొక్కిపట్టి <em>Refresh</em> నొక్కండి లేదా <em>Ctrl-F5</em> నొక్కండి.
+*<em>ఒపెరా:</em> <em>Tools → Preferences</em> ద్వారా కోశాన్ని ఖాళీ చెయ్యండి',
 'usercssyoucanpreview' => "'''చిట్కా:''' భద్రపరిచేముందు మీ కొత్త CSSని పరీక్షించడానికి \"{{int:showpreview}}\" అనే బొత్తాన్ని వాడండి.",
 'userjsyoucanpreview' => "'''చిట్కా:''' భద్రపరిచేముందు మీ కొత్త జావాస్క్రిప్టుని పరీక్షించడానికి \"{{int:showpreview}}\" అనే బొత్తాన్ని వాడండి.",
 'usercsspreview' => "'''మీరు వాడుకరి CSSను కేవలం సరిచూస్తున్నారని గుర్తుంచుకోండి.'''
@@ -898,9 +921,10 @@ $2
 '''తగు అనుమతులు లేకుండా కాపీ హక్కులు గల రచనలను సమర్పించకండి!'''",
 'longpageerror' => "'''పొరపాటు: మీరు సమర్పించిన పాఠ్యం, గరిష్ఠ పరిమితి అయిన {{PLURAL:$2|ఒక కిలోబైటుని|$2 కిలోబైట్లను}} మించి {{PLURAL:$1|ఒక కిలోబైటు|$1 కిలోబైట్ల}} పొడవుంది.'''
  దీన్ని భద్రపరచలేము.",
-'readonlywarning' => "'''హెచ్చరిక: నిర్వహణ కొరకు డేటాబేసుకి తాళం వేసారు, కాబట్టి మీ మార్పుచేర్పులను ఇప్పుడు భద్రపరచలేరు. మీ మార్పులను ఒక ఫాఠ్య ఫైలులోకి కాపీ చేసి భద్రపరచుకొని, తరువాత సమర్పించండి.'''
+'readonlywarning' => '<strong>హెచ్చరిక: నిర్వహణ కొరకు డేటాబేసుకి తాళం వేసారు. కాబట్టి మీ మార్పుచేర్పులను ఇప్పుడు భద్రపరచలేరు.</strong> 
+మీ మార్పులను ఒక ఫాఠ్య ఫైలులోకి కాపీ చేసి భద్రపరచుకొని, తరువాత సమర్పించండి.
 
-తాళం వేసిన నిర్వాహకుడి వివరణ ఇదీ: $1",
+తాళం వేసిన నిర్వాహకుడి వివరణ ఇదీ: $1',
 'protectedpagewarning' => "'''హెచ్చరిక: ఈ పేజీ సంరక్షించబడినది, కనుక నిర్వాహక అనుమతులు ఉన్న వాడుకరులు మాత్రమే మార్చగలరు.'''
 చివరి చిట్టా పద్దుని మీ సమాచారం కోసం ఇక్కడ ఇస్తున్నాం:",
 'semiprotectedpagewarning' => "'''గమనిక:''' నమోదయిన వాడుకరులు మాత్రమే మార్పులు చెయ్యగలిగేలా ఈ పేజీకి సంరక్షించారు.
@@ -921,7 +945,7 @@ $2
 'sectioneditnotsupported-text' => 'ఈ పేజీలో విభాగాల దిద్దుబాటుకి తోడ్పాటు లేదు.',
 'permissionserrors' => 'అనుమతి లోపం',
 'permissionserrorstext' => 'కింద పేర్కొన్న {{PLURAL:$1|కారణం|కారణాల}} మూలంగా, ఆ పని చెయ్యడానికి మీకు అనుమతిలేదు:',
-'permissionserrorstext-withaction' => 'ఈ క్రింది {{PLURAL:$1|కారణం|కారణాల}} వల్ల, మీకు $2 అనుమతి లేదు:',
+'permissionserrorstext-withaction' => 'ఈ క్రింది {{PLURAL:$1|కారణం|కారణాల}} వల్ల, $2 అనుమతి మీకు లేదు:',
 'recreate-moveddeleted-warn' => "'''హెచ్చరిక: ఇంతకు మునుపు ఒకసారి తొలగించిన పేజీని మళ్లీ సృష్టిద్దామని మీరు ప్రయత్నిస్తున్నారు.'''
 
 ఈ పేజీపై మార్పులు చేసేముందు, అవి ఇక్కడ ఉండతగినవేనా కాదా అని ఒకసారి ఆలోచించండి.
@@ -939,9 +963,13 @@ $2
 'edit-already-exists' => 'కొత్త పేజీని సృష్టించలేము.
 అది ఇప్పటికే ఉంది.',
 'defaultmessagetext' => 'అప్రమేయ సందేశపు పాఠ్యం',
+'content-failed-to-parse' => '$1 మోడల్ కొరకు $2 పాఠ్యాన్ని పార్స్ చెయ్యలేకపోయాం: $3',
 'invalid-content-data' => 'తప్పుడు విషయం',
+'content-not-allowed-here' => '[[$2]] పేజీలో పాఠ్యం "$1" కి అనుమతి లేదు',
 'editwarning-warning' => 'ఈ పేజీని వదిలివెళ్ళడం వల్ల మీరు చేసిన మార్పులను కోల్పోయే అవకాశం ఉంది.
-మీరు ప్రవేశించివుంటే, ఈ హెచ్చరికని మీ అభిరుచులలో "మరపులు" అనే విభాగంలో అచేతనం చేసుకోవచ్చు.',
+మీరు లాగిన్ అయివుంటే, ఈ హెచ్చరికని మీ అభిరుచులలోని "{{int:prefs-editing}}"  విభాగంలో అచేతనం చేసుకోవచ్చు.',
+'editpage-notsupportedcontentformat-title' => 'పాఠ్యపు ఆకృతికి మద్దతు లేదు',
+'editpage-notsupportedcontentformat-text' => '$2 పాఠ్యపు మోడల్, పాఠ్యపు ఆకృతి $1 కి మద్దతు ఇవ్వదు',
 
 # Content models
 'content-model-wikitext' => 'వికీపాఠ్యం',
@@ -954,8 +982,8 @@ $2
 
 పార్సరు {{PLURAL:$2|పిలుపు|పిలుపులు}} $2 కంటే తక్కువ ఉండాలి,  ప్రస్తుతం {{PLURAL:$1|$1 పిలుపు ఉంది|$1  పిలుపులు ఉన్నాయి}}.',
 'expensive-parserfunction-category' => 'పార్సరు సందేశాలు అధికంగా ఉన్న పేజీలు',
-'post-expand-template-inclusion-warning' => "'''హెచ్చరిక''': మూస చేర్పు సైజు చాలా పెద్దదిగా ఉంది.
-à°\95à±\8aà°¨à±\8dని à°®à±\82సలనà±\81 à°\9aà±\87à°°à±\8dà°\9aà°²à±\87à°¦à±\81.",
+'post-expand-template-inclusion-warning' => '<strong>హెచ్చరిక:</strong> మూస ఇముడ్పు సైజు చాలా పెద్దదిగా ఉంది.
+à°\95à±\8aà°¨à±\8dని à°®à±\82సలà±\81 à°\87మడà±\8dà°\9aబడవà±\81.',
 'post-expand-template-inclusion-category' => 'మూస చేర్పు సైజును అధిగమించిన పేజీలు',
 'post-expand-template-argument-warning' => 'హెచ్చరిక: చాల పెద్ద సైజున్న మూస ఆర్గ్యుమెంటు, కనీసం ఒకటి, ఈ పేజీలో ఉంది.
 ఈ ఆర్గ్యుమెంట్లను వదలివేసాం.',
@@ -969,6 +997,7 @@ $2
 'undo-failure' => 'మధ్యలో జరిగిన దిద్దుబాట్లతో తలెత్తిన ఘర్షణ కారణంగా ఈ దిద్దుబాటును రద్దు చెయ్యలేక పోయాం.',
 'undo-norev' => 'ఈ దిద్దుబాటును అసలు లేకపోవటం వలన, లేదా తొలగించేయడం వలన రద్దుచేయలేకపోతున్నాం.',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|చర్చ]]) దిద్దుబాటు చేసిన కూర్పు $1 ను రద్దు చేసారు',
+'undo-summary-username-hidden' => 'దాచబడిన వాడుకరి చేసిన కూర్పు $1 ని వెనక్కి తిప్పండి',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'ఈ ఖాతా తెరవలేము',
@@ -1024,23 +1053,23 @@ $3 ఇచ్చిన కారణం: ''$2''",
 'rev-suppressed-text-unhide' => "ఈ పేజీకూర్పును '''అణచి పెట్టాం'''.
 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} అణచివేత చిట్టా]లో వివరాలు చూడవచ్చు.
 ముందుకు సాగాలనుకుంటే [$1 కూర్పును చూడవచ్చు].",
-'rev-deleted-text-view' => "ఈ పేజీ కూర్పుని '''తొలగించారు'''.
-à°\92à°\95 à°¨à°¿à°°à±\8dవాహà°\95à±\81à°¡à°¿à°\97à°¾ à°®à±\80à°°à±\81 à°¦à°¾à°¨à±\8dని à°\9aà±\82à°¡à°µà°\9aà±\8dà°\9aà±\81; [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°\9aà°¿à°\9fà±\8dà°\9fà°¾]à°²à±\8b à°µà°¿à°µà°°à°¾à°²à±\81 à°\89à°\82à°¡à°µà°\9aà±\8dà°\9aà±\81.",
-'rev-suppressed-text-view' => "ఈ పేజీకూర్పును '''అణచి పెట్టాం'''.
-à°\92à°\95 à°¨à°¿à°°à±\8dవాహà°\95à±\81à°¡à°¿à°\97à°¾ à°®à±\80à°°à±\81 à°¦à°¾à°¨à±\8dని à°\9aà±\82à°¡à°µà°\9aà±\8dà°\9aà±\81; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à°\85à°£à°\9aà°¿à°µà±\87à°¤ à°\9aà°¿à°\9fà±\8dà°\9fà°¾]à°²à±\8bవివరాలà±\81 à°\89à°\82à°¡à°µà°\9aà±\8dà°\9aà±\81.",
+'rev-deleted-text-view' => 'ఈ పేజీ కూర్పుని <strong>తొలగించారు</strong>
+à°®à±\80à°°à±\81 à°¦à°¾à°¨à±\8dని à°\9aà±\82à°¡à°µà°\9aà±\8dà°\9aà±\81; [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°\9aà°¿à°\9fà±\8dà°\9fà°¾]à°²à±\8b à°µà°¿à°µà°°à°¾à°²à±\81 à°¦à±\8aà°°à±\81à°\95à±\81తాయి.',
+'rev-suppressed-text-view' => 'ఈ పేజీకూర్పును <strong>అణచి పెట్టాం</strong>.
+à°®à±\80à°°à±\81 à°¦à°¾à°¨à±\8dని à°\9aà±\82à°¡à°µà°\9aà±\8dà°\9aà±\81; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à°\85à°£à°\9aà°¿à°µà±\87à°¤ à°\9aà°¿à°\9fà±\8dà°\9fà°¾]à°²à±\8bవివరాలà±\81 à°\89à°\82à°\9fాయి.',
 'rev-deleted-no-diff' => "మీరు తేడాలను చూడలేదు ఎందుకంటే ఒక కూర్పుని '''తొలగించారు'''.
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} తొలగింపు చిట్టా]లో వివరాలు ఉండవచ్చు.",
 'rev-suppressed-no-diff' => "ఈ తేడాని మీరు చూడలేరు ఎందుకంటే ఒక కూర్పుని '''తొలగించారు'''.",
-'rev-deleted-unhide-diff' => "ఈ తేడాల యొక్క కూర్పులలో ఒకదాన్ని '''తొలగించారు'''.
-[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°\9aà°¿à°\9fà±\8dà°\9fà°¾]à°²à±\8b à°µà°¿à°µà°°à°¾à°²à±\81 à°\89à°\82à°¡à°µà°\9aà±\8dà°\9aà±\81.
-మీరు కావాలనుకుంటే నిర్వాహకులుగా [$1 ఈ తేడాని చూడవచ్చు].",
-'rev-suppressed-unhide-diff' => "ఈ తేడా లోని ఒక కూర్పును '''అణచి పెట్టాం'''.
-[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à°\85à°£à°\9aà°¿à°µà±\87à°¤ à°\9aà°¿à°\9fà±\8dà°\9fà°¾]à°²à±\8bవివరాలà±\81 à°\89à°\82à°¡à°µà°\9aà±\8dà°\9aà±\81.  à°\95ావాలనà±\81à°\95à±\81à°\82à°\9fà±\87, à°\92à°\95 à°¨à°¿à°°à±\8dవాహà°\95à±\81à°¡à°¿à°\97à°¾ à°®à±\80à°°à±\81 [$1 à°\86 à°¤à±\87డానà±\81 à°\9aà±\82à°¡à°µà°\9aà±\8dà°\9aà±\81].",
-'rev-deleted-diff-view' => "ఈ తేడా లోని ఒక పేజీకూర్పును '''తొలగించాం'''.
-ఒక నిర్వాహకుడిగా మీరు ఈ తేడాను చూడవచ్చు; [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} తొలగింపు చిట్టా]లోవివరాలు ఉండవచ్చు.",
-'rev-suppressed-diff-view' => "
-ఈ తేడా లోని ఒక కూర్పును '''అణచి పెట్టాం'''.
-à°\92à°\95 à°¨à°¿à°°à±\8dవాహà°\95à±\81à°¡à°¿à°\97à°¾ à°®à±\80à°°à±\81 à°\88 à°¤à±\87డానà±\81 à°\9aà±\82à°¡à°µà°\9aà±\8dà°\9aà±\81; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à°\85à°£à°\9aà°¿à°µà±\87à°¤ à°\9aà°¿à°\9fà±\8dà°\9fà°¾]à°²à±\8bవివరాలà±\81 à°\89à°\82à°¡à°µà°\9aà±\8dà°\9aà±\81.",
+'rev-deleted-unhide-diff' => 'ఈ తేడాల యొక్క కూర్పులలో ఒకదాన్ని <strong>తొలగించారు</strong>.
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°\9aà°¿à°\9fà±\8dà°\9fà°¾]à°²à±\8b à°µà°¿à°µà°°à°¾à°²à±\81 à°\89à°\82à°\9fాయి.
+మీరు కావాలనుకుంటే [$1 ఈ తేడాని చూడవచ్చు].',
+'rev-suppressed-unhide-diff' => 'ఈ తేడా లోని ఒక కూర్పును <strong>అణచి పెట్టాం</strong>.
+[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à°\85à°£à°\9aà°¿à°µà±\87à°¤ à°\9aà°¿à°\9fà±\8dà°\9fà°¾]à°²à±\8bవివరాలà±\81 à°\89à°\82à°\9fాయి. 
+కావాలనుకుంటే, మీరు [$1 ఈ తేడాను చూడవచ్చు].',
+'rev-deleted-diff-view' => 'ఈ తేడా లోని ఒక పేజీకూర్పును <strong>తొలగించాం</strong>.
+మీరు ఈ తేడాను చూడవచ్చు; [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} తొలగింపు చిట్టా]లోవివరాలు ఉంటాయి.',
+'rev-suppressed-diff-view' => 'ఈ తేడా లోని ఒక కూర్పును <strong>అణచి పెట్టాం</strong>.
+à°®à±\80à°°à±\81 à°\88 à°¤à±\87డానà±\81 à°\9aà±\82à°¡à°µà°\9aà±\8dà°\9aà±\81; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à°\85à°£à°\9aà°¿à°µà±\87à°¤ à°\9aà°¿à°\9fà±\8dà°\9fà°¾]à°²à±\8bవివరాలà±\81 à°\89à°\82à°\9fాయి.',
 'rev-delundel' => 'చూపించు/దాచు',
 'rev-showdeleted' => 'చూపించు',
 'revisiondelete' => 'కూర్పులను తొలగించు/తొలగింపును రద్దుచెయ్యి',
@@ -1054,10 +1083,10 @@ $3 ఇచ్చిన కారణం: ''$2''",
 'revdelete-text' => "'''తొలగించిన కూర్పులు, ఘటనలూ పేజీ చరితం లోనూ, చిట్టాలలోనూ కనిపిస్తాయి, కానీ వాటిలో కొన్ని భాగాలు సార్వజనికంగా అందుబాటులో ఉండవు.'''
 {{SITENAME}} లోని ఇతర నిర్వాహకులు ఆ దాచిన భాగాలను చూడగలరు మరియు (ఏవిధమైన నియంత్రణలూ లేకుంటే) ఇదే అంతరవర్తి ద్వారా వాటిని పునస్థాపించగలరు.",
 'revdelete-confirm' => 'మీరు దీన్ని చేయగోరుతున్నారనీ, దీని పర్యవసానాలు మీకు తెలుసుననీ, మరియు మీరు దీన్ని [[{{MediaWiki:Policy-url}}|విధానం]] ప్రకారమే చేస్తున్నారనీ దయచేసి నిర్ధారించండి.',
-'revdelete-suppress-text' => 'అణచివేతను కింది సందర్భాలలో "మాత్రమే" వాడాలి:
+'revdelete-suppress-text' => 'అణచివేతను కింది సందర్భాలలో <strong>మాత్రమే</strong> వాడాలి:
 * బురదజల్లే ధోరణిలో ఉన్న సమాచారం
 * అనుచితమైన వ్యక్తిగత సమాచారం
-* "ఇంటి చిరునామాలు, టెలిఫోను నంబర్లు, సోషల్ సెక్యూరిటీ నంబర్లు, వగైరాలు"',
+*<em>ఇంటి చిరునామాలు, టెలిఫోను నంబర్లు, జాతీయ ఐడీ నంబర్లు, వగైరాలు</em>',
 'revdelete-legend' => 'సందర్శక నిబంధనలు అమర్చు',
 'revdelete-hide-text' => 'పునఃపరిశీలన పాఠ్యం',
 'revdelete-hide-image' => 'ఫైలులోని విషయాన్ని దాచు',
@@ -1066,8 +1095,8 @@ $3 ఇచ్చిన కారణం: ''$2''",
 'revdelete-hide-user' => 'దిద్దుబాటు చేసినవారి వాడుకరి పేరు/ఐపీ చిరునామా',
 'revdelete-hide-restricted' => 'డేటాను అందరిలాగే నిర్వాహకులకు కూడా కనబడనివ్వకు',
 'revdelete-radio-same' => '(మార్చకు)',
-'revdelete-radio-set' => 'à°\85à°µà±\81à°¨ు',
-'revdelete-radio-unset' => 'à°\95ాదు',
+'revdelete-radio-set' => 'దాà°\9aు',
+'revdelete-radio-unset' => 'à°\9aà±\82పిà°\82à°\9aు',
 'revdelete-suppress' => 'డేటాను అందరిలాగే నిర్వాహకులకు కూడా కనబడనివ్వకు',
 'revdelete-unsuppress' => 'పునస్థాపిత కూర్పులపై నిబంధనలను తీసివెయ్యి',
 'revdelete-log' => 'కారణం:',
@@ -1104,7 +1133,7 @@ $1",
 # Suppression log
 'suppressionlog' => 'అణచివేతల చిట్టా',
 'suppressionlogtext' => 'నిర్వాహకులకు కనబడని విషయం కలిగిన తొలగింపులు, నిరోధాల జాబితా ఇది.
-à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤à°\82 à°\85మలà±\8dà°²à±\8b à°\89à°¨à±\8dà°¨ à°¨à°¿à°·à±\87ధాలà±\81, à°¨à°¿à°°à±\8bధాల à°\9cాబితా à°\95à±\8bà°¸à°\82 [[Special:IPBlockList|à°\90à°ªà±\80 నిరోధాల జాబితా]] చూడండి.',
+à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤à°\82 à°\85మలà±\8dà°²à±\8b à°\89à°¨à±\8dà°¨ à°¨à°¿à°·à±\87ధాలà±\81, à°¨à°¿à°°à±\8bధాల à°\95à±\8bà°¸à°\82 [[Special:BlockList|నిరోధాల జాబితా]] చూడండి.',
 
 # History merging
 'mergehistory' => 'పేజీ చరితాలను విలీనం చెయ్యి',
@@ -1145,12 +1174,13 @@ $1",
 'showhideselectedversions' => 'ఎంచుకున్న కూర్పులను చూపించు/దాచు',
 'editundo' => 'మార్పుని రద్దుచెయ్యి',
 'diff-empty' => '(తేడా లేదు)',
-'diff-multi' => '({{PLURAL:$2|ఒక వాడుకరి|$2 వాడుకరుల}} యొక్క {{PLURAL:$1|ఒక మధ్యంతర కూర్పును|$1 మధ్యంతర కూర్పులను}} చూపించట్లేదు)',
+'diff-multi-sameuser' => '(ఇదే వాడుకరి యొక్క {{PLURAL:$1|ఒక మధ్యంతర కూర్పును|$1 మధ్యంతర కూర్పులను}} చూపించలేదు)',
+'diff-multi-otherusers' => '({{PLURAL:$2|మరో వాడుకరి|$2 వాడుకరుల}} యొక్క {{PLURAL:$1|ఒక మధ్యంతర కూర్పును|$1 మధ్యంతర కూర్పులను}} చూపించలేదు)',
 'diff-multi-manyusers' => '$2 మంది పైన ({{PLURAL:$2|ఒక వాడుకరి|వాడుకరుల}} యొక్క {{PLURAL:$1|ఒక మధ్యంతర కూర్పును|$1 మధ్యంతర కూర్పులను}} చూపించట్లేదు)',
-'difference-missing-revision' => 'ఈ తేడా ($1) యొక్క {{PLURAL:$2|ఒక కూర్పు|$2 కూర్పులు}} of this difference {{PLURAL:$2|కనబడలేదు|కనబడలేదు}}.
+'difference-missing-revision' => 'ఈ తేడా ($1) యొక్క {{PLURAL:$2|ఒక కూర్పు|$2 కూర్పులు}} {{PLURAL:$2|కనబడలేదు}}.
 
-సాధారణà°\82à°\97à°¾, à°¤à±\8aà°²à°\97à°¿à°\82à°\9aబడిన à°ªà±\87à°\9cà±\80 à°¯à±\8aà°\95à±\8dà°\95 à°\95ాలదà±\8bà°·à°\82 à°ªà°\9fà±\8dà°\9fిన ’తేడా’ లింకును నొక్కినపుడు ఇది జరుగుతుంది. 
-[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°²à°¾à°\97à±\8d] à°²à±\8b à°µà°¿à°µà°°à°¾à°²à±\81 à°¦à±\8aà°°à±\81à°\95à±\81à°¤ాయి.',
+సాధారణà°\82à°\97à°¾, à°¤à±\8aà°²à°\97à°¿à°\82à°\9aబడిన à°ªà±\87à°\9cà±\80 à°¯à±\8aà°\95à±\8dà°\95 à°\95ాలà°\82 à°\9aà±\86à°²à±\8dà°²ిన ’తేడా’ లింకును నొక్కినపుడు ఇది జరుగుతుంది. 
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°²à°¾à°\97à±\8d] à°²à±\8b à°µà°¿à°µà°°à°¾à°²à±\81 à°\89à°\82à°\9fాయి.',
 
 # Search results
 'searchresults' => 'వెదుకులాట ఫలితాలు',
@@ -1162,11 +1192,11 @@ $1",
 'prevn' => 'క్రితం {{PLURAL:$1|$1}}',
 'nextn' => 'తరువాతి {{PLURAL:$1|$1}}',
 'prevn-title' => 'గత $1 {{PLURAL:$1|ఫలితం|ఫలితాలు}}',
-'nextn-title' => 'తదà±\81పరి $1 {{PLURAL:$1|ఫలితం|ఫలితాలు}}',
+'nextn-title' => 'తరà±\81వాతి $1 {{PLURAL:$1|ఫలితం|ఫలితాలు}}',
 'shown-title' => 'పేజీకి $1 {{PLURAL:$1|ఫలితాన్ని|ఫలితాలను}} చూపించు',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) చూపించు.',
 'searchmenu-exists' => "'''ఈ వికీలో \"[[:\$1]]\" అనే పేజీ ఉంది'''",
-'searchmenu-new' => "'''ఈ వికీలో \"[[:\$1]]\" అనే పేరుతో పేజీని సృష్టించు!'''",
+'searchmenu-new' => '<strong>ఈ వికీలో "[[:$1]]" అనే పేరుతో పేజీని సృష్టించండి!</strong> {{PLURAL:$2|0=|మీ వెతుకులాటలో దొరికిన పేజీని కూడా చూడండి.|వెతుకులాట ఫలితాలను కూడా చూడండి.}}',
 'searchprofile-articles' => 'విషయపు పేజీలు',
 'searchprofile-project' => 'సహాయం మరియు ప్రాజెక్టు పేజీలు',
 'searchprofile-images' => 'బహుళమాధ్యమాలు',
@@ -1182,6 +1212,7 @@ $1",
 'search-result-score' => 'సంబంధం: $1%',
 'search-redirect' => '(దారిమార్పు $1)',
 'search-section' => '(విభాగం $1)',
+'search-file-match' => '(ఫైలు విషయంతో సరిపోలుతోంది)',
 'search-suggest' => 'మీరు అంటున్నది ఇదా: $1',
 'search-interwiki-caption' => 'సోదర ప్రాజెక్టులు',
 'search-interwiki-default' => '$1 ఫలితాలు:',
@@ -1390,7 +1421,7 @@ $1",
 'right-reupload-shared' => 'స్థానికంగా ఉమ్మడి మీడియా సొరుగులోని ఫైళ్ళను అధిక్రమించు',
 'right-upload_by_url' => 'URL అడ్రసునుండి ఫైలును అప్‌లోడు చెయ్యి',
 'right-purge' => 'పేజీకి సంబంధించిన సైటు కాషెను, నిర్ధారణ కోరకుండానే తొలగించు',
-'right-autoconfirmed' => 'à°\85à°°à±\8dà°§ à°¸à°\82à°°à°\95à±\8dషణలà±\8b à°\89à°¨à±\8dà°¨ à°ªà±\87à°\9cà±\80లలà±\8b à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\81 à°\9aà±\86à°¯à±\8dయి',
+'right-autoconfirmed' => 'à°\90à°ªà±\80 à°\86ధారిత à°°à±\87à°\9fà±\81 à°ªà°°à°¿à°®à°¿à°¤à±\81à°²à±\81 à°ªà±\8dరభావà°\82 à°\9aà±\82పవà±\81',
 'right-bot' => 'ఆటోమాటిక్ ప్రాసెస్ లాగా భావించబడు',
 'right-nominornewtalk' => 'చర్చా పేజీల్లో జరిగిన అతి చిన్న మార్పులకు కొత్తసందేశము వచ్చిందన్న సూచన చెయ్యవద్దు',
 'right-apihighlimits' => 'API ప్రశ్నల్లో ఉన్నత పరిమితులను వాడు',
@@ -1402,21 +1433,22 @@ $1",
 'right-deletedtext' => 'తొలగించిన పాఠ్యాన్ని మరియు తొలగించిన కూర్పుల మధ్య మార్పలని చూడగలగడం',
 'right-browsearchive' => 'తొలగించిన పేజీలను వెతుకు',
 'right-undelete' => 'పేజీ తొలగింపును రద్దు చెయ్యి',
-'right-suppressrevision' => 'నిరà±\8dవాహà°\95à±\81à°²à°\95à±\81 à°\95నబడà°\95à±\81à°\82à°¡à°¾ à°\89à°¨à±\8dà°¨ à°\95à±\82à°°à±\8dà°ªà±\81లనà±\81 à°¸à°®à±\80à°\95à±\8dà°·à°¿à°\82à°\9aà°¿ à°ªà±\8cనసà±\8dథాపిà°\82à°\9aà±\81',
-'right-suppressionlog' => 'à°\97à±\8bà°ªà±\8dà°¯à°\82à°\97à°¾ à°\89à°¨à±\8dà°¨ à°²à°¾à°\97à±\8dâ\80\8cలనà±\81 à°\9aà±\82à°¡à±\81',
+'right-suppressrevision' => 'నిరà±\8dవాహà°\95à±\81à°²à°\95à±\81 à°\95నబడà°\95à±\81à°\82à°¡à°¾ à°\89à°¨à±\8dà°¨ à°\95à±\82à°°à±\8dà°ªà±\81లనà±\81 à°¸à°®à±\80à°\95à±\8dà°·à°¿à°\82à°\9aà°¿ à°ªà±\81నసà±\8dథాపిà°\82à°\9aà°¡à°\82',
+'right-suppressionlog' => 'à°\97à±\8bà°ªà±\8dà°¯à°\82à°\97à°¾ à°\89à°¨à±\8dà°¨ à°²à°¾à°\97à±\8dâ\80\8cలనà±\81 à°\9aà±\82à°¡à°¡à°\82',
 'right-block' => 'దిద్దుబాటు చెయ్యకుండా ఇతర వాడుకరులను నిరోధించగలగడం',
 'right-blockemail' => 'ఈమెయిలు పంపకుండా సభ్యుని నిరోధించు',
 'right-hideuser' => 'ప్రజలకు కనబడకుండా చేసి, సభ్యనామాన్ని నిరోధించు',
 'right-ipblock-exempt' => 'ఐపీ నిరోధాలు, ఆటో నిరోధాలు, శ్రేణి నిరోధాలను తప్పించు',
 'right-proxyunbannable' => 'ప్రాక్సీల ఆటోమాటిక్ నిరోధాన్ని తప్పించు',
-'right-unblockself' => 'వారినà±\87 à°\85నిరà±\8bధిà°\82à°\9aà±\81à°\95à±\8bవడం',
-'right-protect' => 'à°¸à°\82à°°à°\95à±\8dà°·à°£ à°¸à±\8dథాయిలనà±\81 à°®à°¾à°°à±\8dà°\9aà±\81, à°¸à°\82రక్షిత పేజీలలో దిద్దుబాటు చెయ్యి',
-'right-editprotected' => 'సంరక్షిత పేజీలలో దిద్దుబటు చెయ్యి (కాస్కేడింగు సంరక్షణ లేనివి)',
+'right-unblockself' => 'à°¸à±\8dà°µà±\80à°¯ à°\85నిరà±\8bà°§ం',
+'right-protect' => 'à°¸à°\82à°°à°\95à±\8dà°·à°£ à°¸à±\8dథాయిలనà±\81 à°®à°¾à°°à±\8dà°\9aà±\81, à°\95ాసà±\8dà°\95à±\87à°¡à±\8d-రక్షిత పేజీలలో దిద్దుబాటు చెయ్యి',
+'right-editprotected' => '"{{int:protect-level-sysop}}" గా సంక్షించబడిన పేజీలను సరిదిద్దు',
 'right-editsemiprotected' => '"{{int:protect-level-autoconfirmed}}" గా సంరక్షించబడ్డ పేజీలను మార్చు',
 'right-editinterface' => 'యూజరు ఇంటరుఫేసులో దిద్దుబాటు చెయ్యి',
 'right-editusercssjs' => 'ఇతర వాడుకరుల CSS, JS ఫైళ్ళలో దిద్దుబాటు చెయ్యి',
 'right-editusercss' => 'ఇతర వాడుకరుల CSS ఫైళ్ళలో దిద్దుబాటు చెయ్యి',
 'right-edituserjs' => 'ఇతర వాడుకరుల JS ఫైళ్ళలో దిద్దుబాటు చెయ్యి',
+'right-editmyusercss' => 'మీ స్వంత వాడుకరి CSS ఫైళ్ళను సరిదిద్దండి',
 'right-editmyuserjs' => 'మీ స్వంత JavaScript దస్త్రాలను మార్చండి',
 'right-viewmywatchlist' => 'మీ స్వంత వీక్షణజాబితాను చూడండి',
 'right-editmywatchlist' => 'మీ స్వంత వీక్షణజాబితాను మార్చుకోండి. ఈ హక్కు లేకపోయినా, కొన్ని చర్యల ద్వారా పేజీలు జాబితాకు చేరుతాయని గమనించండి.',
@@ -1474,8 +1506,8 @@ $1",
 'action-block' => 'ఈ వాడుకరిని మార్పులు చేయడం నుండి నిరోధించే',
 'action-protect' => 'ఈ పేజీకి సంరక్షణా స్థాయిని మార్చే',
 'action-rollback' => 'ఏదైనా పేజీలో మార్పులు చేసిన చివరి వాడుకరి యొక్క మార్పులను త్వరితంగా వెనక్కి తీసుకెళ్ళు',
-'action-import' => 'మరà±\8b à°µà°¿à°\95à±\80 à°¨à±\81à°\82à°¡à°¿ à°\88 à°ªà±\87à°\9cà±\80ని à°¦à°¿à°\97à±\81మతి à°\9aà±\87à°¸à±\87',
-'action-importupload' => 'à°\8eà°\97à±\81మతి à°\9aà±\87సిన à°«à±\88à°²à±\81 à°¨à±\81à°\82à°¡à°¿ à°\88 à°ªà±\87à°\9cà±\80à°²à±\8bనిà°\95ి దిగుమతి చేసే',
+'action-import' => 'మరà±\8b à°µà°¿à°\95à±\80 à°¨à±\81à°\82à°¡à°¿ à°\88 à°ªà±\87à°\9cà±\80ని à°¦à°¿à°\97à±\81మతి à°\9aà±\86à°¯à±\8dయి',
+'action-importupload' => 'à°«à±\88à°²à±\81 à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªà±\81 à°¨à±\81à°\82à°¡ి దిగుమతి చేసే',
 'action-patrol' => 'ఇతరుల మార్పులను పర్యవేక్షించినవిగా గుర్తించే',
 'action-autopatrol' => 'మీ మార్పులను పర్యవేక్షించినవిగా గుర్తించే',
 'action-unwatchedpages' => 'వీక్షణలో లేని పేజీల జాబితాని చూసే',
@@ -1484,6 +1516,10 @@ $1",
 'action-userrights-interwiki' => 'ఇతర వికీలలో వాడుకరుల యొక్క హక్కులను మార్చే',
 'action-siteadmin' => 'డాటాబేసుకి తాళం వేసే లేదా తీసే',
 'action-sendemail' => 'ఈ-మెయిల్స్ పంపించు',
+'action-editmywatchlist' => 'మీ వీక్షణ జాబితాను సరిదిద్దండి',
+'action-viewmywatchlist' => 'మీ వీక్షణ జాబితాను చూడండి',
+'action-viewmyprivateinfo' => 'మీ గోపనీయ సమాచారాన్ని చూడండి',
+'action-editmyprivateinfo' => 'మీ గోపనీయ సమాచారాన్ని సరిదిద్దండి',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|ఒక మార్పు|$1 మార్పులు}}',
@@ -1492,6 +1528,7 @@ $1",
 'recentchanges' => 'ఇటీవలి మార్పులు',
 'recentchanges-legend' => 'ఇటీవలి మార్పుల ఎంపికలు',
 'recentchanges-summary' => 'వికీలో ఇటీవలే జరిగిన మార్పులను ఈ పేజీలో గమనించవచ్చు.',
+'recentchanges-noresult' => 'ఈ నియమాలకు సరిపోలే మార్పులు ఇచ్చిన కాలంలో లేవు.',
 'recentchanges-feed-description' => 'ఈ ఫీడు ద్వారా వికీలో జరుగుతున్న మార్పుల గురించి ఎప్పటికప్పుడు సమాచారాన్ని పొందండి.',
 'recentchanges-label-newpage' => 'ఈ మార్పు కొత్త పేజీని సృష్టించింది',
 'recentchanges-label-minor' => 'ఇది ఒక చిన్న మార్పు',
@@ -1504,7 +1541,7 @@ $1",
 'rclistfrom' => '$1 నుండి జరిగిన మార్పులను చూపించు',
 'rcshowhideminor' => 'చిన్న మార్పులను $1',
 'rcshowhidebots' => 'బాట్లను $1',
-'rcshowhideliu' => 'à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aà°¿à°¨ à°µà°¾à°¡à±\81à°\95à°°à±\81à°² à°®à°¾à°°à±\8dà°ªులను $1',
+'rcshowhideliu' => 'నమà±\8bà°¦à±\88à°¨ à°µà°¾à°¡à±\81à°\95à°°ులను $1',
 'rcshowhideanons' => 'అజ్ఞాత వాడుకరులను $1',
 'rcshowhidepatr' => 'నిఘాలో ఉన్న మార్పులను $1',
 'rcshowhidemine' => 'నా మార్పులను $1',
@@ -1618,6 +1655,8 @@ $1",
 ఇప్పటికీ మీ ఫైలుని ఎగుమతి చేయాలనుకుంటే, వెనక్కివెళ్ళి మరో పేరు వాడండి. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'ఈ ఫైలు క్రింద పేర్కొన్న {{PLURAL:$1|ఫైలుకి|ఫైళ్ళకి}} నకలు:',
 'file-deleted-duplicate' => 'గతంలో ఈ ఫైలు లాంటిదే ఒక ఫైలుని ([[:$1]]) తొలగించివున్నారు. మీరు దీన్ని ఎగుమతి చేసేముందు ఆ ఫైలు యొక్క తొలగింపు చరిత్రని ఒక్కసారి చూడండి.',
+'file-deleted-duplicate-notitle' => 'సరిగ్గా ఈ ఫైలునే పోలిన మరో ఫైలును గతంలో తొలగించాం. దాని పేరును అణచిపెట్టాం.
+దాన్ని తిరిగి ఎక్కించే ముందు, పరిస్థితిని సమీక్షించేందుకు గాను, అణచబడిన ఫైళ్ళ డేటాను చూడగలిగే వారిని అడగండి.',
 'uploadwarning' => 'ఎక్కింపు హెచ్చరిక',
 'uploadwarning-text' => 'ఫైలు వివరణని క్రింద మార్చి మళ్ళీ ప్రయత్నించండి.',
 'savefile' => 'దస్త్రాన్ని భద్రపరచు',
@@ -1661,15 +1700,44 @@ $1',
 'upload-too-many-redirects' => 'ఆ URLలో చాలా దారిమార్పులు ఉన్నాయి',
 'upload-unknown-size' => 'సైజు తెలియదు',
 'upload-http-error' => 'ఒక HTTP పొరపాటు జరిగింది: $1',
+'upload-copy-upload-invalid-domain' => 'ఈ డొమెయిన్ నుంచి కాపీ ఎక్కింపులు కుదరదు.',
 
 # File backend
+'backend-fail-stream' => '"$1" ఫైలును స్ట్రీమింగు చెయ్యలేకపోయాం.',
+'backend-fail-backup' => '"$1" ఫైలును బ్యాకప్పు చెయ్యలేకపోయాం.',
 'backend-fail-notexists' => '$1 ఫైలు అసలు లేనేలేదు.',
+'backend-fail-hashes' => 'పోలిక కోసం ఫైలు హాష్‍లను పొందలేకపోయాం.',
+'backend-fail-notsame' => 'సరిగ్గా సరిపోయే ఫైలు కాదు గానీ, ఒక ఫైలు ఈసరికే "$1" వద్ద ఉంది.',
+'backend-fail-invalidpath' => '"$1" సరైన స్టోరేజి పాత్ కాదు',
 'backend-fail-delete' => '$1 ఫైలును తొలగించలేకున్నాం.',
+'backend-fail-describe' => '"$1" ఫైలు మెటాడేటాను మార్చలేకపోయాం.',
 'backend-fail-alreadyexists' => '$1 అనే దస్త్రం ఇప్పటికే ఉంది.',
+'backend-fail-store' => '"$1" ఫైలును "$2" వద్ద భద్రపరచలేకపోయాం.',
+'backend-fail-copy' => '"$1" నుండి "$2" కి ఫైలును కాపీ చెయ్యలేకపోయాం.',
+'backend-fail-move' => '"$1" నుండి "$2" కి ఫైలును తరలించలేకపోయాం.',
 'backend-fail-opentemp' => 'తాత్కాలిక దస్త్రాన్ని తెరవలేకపోతున్నాం.',
+'backend-fail-writetemp' => 'తాత్కాలిక ఫైలులో రాయలేకపోయాం.',
 'backend-fail-closetemp' => 'తాత్కాలిక దస్త్రాన్ని మూసివేయలేకపోయాం.',
 'backend-fail-read' => '$1 దస్త్రము చదువలేకపోతిమి.',
 'backend-fail-create' => '$1 ఫైలులో రాయలేకున్నాం.',
+'backend-fail-maxsize' => '"$1" ఫైలు {{PLURAL:$2|ఒక బైట్|$2 బైట్ల}} కంటే పెద్దది కావడం చేత దాన్ని రాయలేకపోయాం.',
+'backend-fail-readonly' => 'స్టోరేజి బ్యాక్‍ఎండ్ "$1" ప్రస్తుతం రీడ్-ఓన్లీ స్థితిలో ఉంది. దానికి కారణం: "<em>$2</em>"',
+'backend-fail-connect' => 'స్టోరేజీ బ్యాక్‍ఎండ్ "$1" కి కనెక్టు కాలేక పోయాం.',
+'backend-fail-internal' => 'స్టోరేజీ బ్యాక్‍ఎండ్ "$1" లో ఏదో తెలియని లోపం దొర్లింది.',
+'backend-fail-contenttype' => '"$1" లో దాచాల్సిన ఫైలు యొక్క కంటెంటు రకమేంటో నిర్ధారించలేకపోయాం.',
+'backend-fail-batchsize' => 'స్టోరేజీ బ్యాక్‍ఎండ్ కు $1 ఫైలు {{PLURAL:$1|ఆపరేషన్|ఆపరేషన్ల}} తో కూడిన బ్యాచ్ ఒకటి ఇవ్వబడింది; పరిమితి: $2 {{PLURAL:$2|ఆపరేషన్|ఆపరేషన్లు}}.',
+'backend-fail-usable' => 'సరిపడా అనుమతులు లేకపోవడం వలన గానీ, అవసరమైన డైరెక్టరీలు/కంటెయినర్లు లేకపోవడం వలనగానీ "$1" ఫైలును చదవడం, రాయడం చెయ్యలేకపోయాం.',
+
+# Lock manager
+'lockmanager-notlocked' => '"$1" తాళం తియ్యలేకపోయాం; అదసలు లాక్ అయ్యేలేదు..',
+'lockmanager-fail-closelock' => '"$1" యొక్క లాక్ ఫైలును మూయలేకపోయాం.',
+'lockmanager-fail-deletelock' => '"$1" యొక్క లాక్ ఫైలును తొలగించలేకపోయాం.',
+'lockmanager-fail-acquirelock' => '"$1" కోసం లాక్ ను పొందలేకపోయాం.',
+'lockmanager-fail-openlock' => '"$1" కోసం లాక్ ఫైలును తెరవలేకపోయాం.',
+'lockmanager-fail-releaselock' => '"$1" యొక్క లాక్ ను విడుదల చెయ్యలేకపోయాం.',
+'lockmanager-fail-db-release' => 'డేటాబేసు $1 పై లాకులను విడుదల చెయ్యలేకపోయాం.',
+'lockmanager-fail-svr-acquire' => 'సర్వరు $1 పై లాకులను పొందలేకపోయాం.',
+'lockmanager-fail-svr-release' => 'సర్వరు $1 పై లాకులను విడుదల చెయ్యలేకపోయాం.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'ఈ ఫైలును ZIP పరీక్ష కోసం తెరవబోతే, ఏదో తెలియని లోపం ఎదురైంది.',
@@ -1680,7 +1748,10 @@ $1',
 దీనిపై సరైన భద్రతా పరీక్షలు చెయ్యలేం.',
 
 # Special:UploadStash
+'uploadstash' => 'భోషాణం ఎక్కింపు',
 'uploadstash-summary' => 'ఎక్కించినప్పటికీ వికీలో ప్రచురితం కాని  (లేదా ఎక్కింపు జరుగుతున్న) ఫైళ్ళు ఈ పేజీలో కనిపిస్తాయి. ఈ ఫైళ్ళు ఎక్కించిన వాడుకరికి తప్ప మరొకరికి కనబడవు.',
+'uploadstash-clear' => 'భోషాణం లోని ఫైళ్లను తీసివెయ్యి',
+'uploadstash-nofiles' => 'మీకు ఫైళ్ళ భోషాణమేమీ లేదు.',
 'uploadstash-badtoken' => 'ఆ చర్య విఫలమైంది. బహుశా మీ ఎడిటింగు అనుమతులకు కాలం చెల్లిందేమో. మళ్ళీ ప్రయత్నించండి.',
 'uploadstash-errclear' => 'ఫైళ్ళ తీసివేత విఫలమైంది.',
 'uploadstash-refresh' => 'దస్త్రాల జాబిజాను తాజాకరించు',
@@ -1727,8 +1798,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'upload_source_file' => ' (మీ కంప్యూటర్లో ఒక ఫైలు)',
 
 # Special:ListFiles
-'listfiles-summary' => 'ఈ ప్రత్యేక పేజీ ఇప్పటి వరకూ ఎక్కించిన దస్త్రాలన్నింటినీ చూపిస్తుంది.
-వాడుకరి పేరు మీద వడపోసినప్పుడు, ఆ వాడుకరి ఎక్కించిన కూర్పు ఆ దస్త్రం యొక్క సరికొత్త కూర్పు అయితేనే చూపిస్తుంది.',
+'listfiles-summary' => 'ఈ ప్రత్యేక పేజీ, ఎక్కించిన ఫైళ్ళన్నిటినీ చూపిస్తుంది.',
 'listfiles_search_for' => 'మీడియా పేరుకై వెతుకు:',
 'imgfile' => 'దస్త్రం',
 'listfiles' => 'దస్త్రాల జాబితా',
@@ -1739,6 +1809,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'listfiles_size' => 'పరిమాణం',
 'listfiles_description' => 'వివరణ',
 'listfiles_count' => 'కూర్పులు',
+'listfiles-show-all' => 'బొమ్మల పాత కూర్పులను కలుపు',
 'listfiles-latestversion' => 'ప్రస్తుత కూర్పు',
 'listfiles-latestversion-yes' => 'అవును',
 'listfiles-latestversion-no' => 'కాదు',
@@ -1753,7 +1824,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'filehist-current' => 'ప్రస్తుత',
 'filehist-datetime' => 'తేదీ/సమయం',
 'filehist-thumb' => 'నఖచిత్రం',
-'filehist-thumbtext' => '$1 à°¯à±\8aà°\95à±\8dà°\95 à°¨à°\96à°\9aà°¿à°¤à±\8dà°° à°\95à±\82à°°à±\8dà°ªà±\81',
+'filehist-thumbtext' => '$1 à°¨à°¾à°\9fà°¿ à°\95à±\82à°°à±\8dà°ªà±\81 à°¯à±\8aà°\95à±\8dà°\95 à°¨à°\96à°\9aà°¿à°¤à±\8dà°°à°\82',
 'filehist-nothumb' => 'నఖచిత్రం లేదు',
 'filehist-user' => 'వాడుకరి',
 'filehist-dimensions' => 'కొలతలు',
@@ -1774,6 +1845,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 మరింత సమాచారం కోసం, దయచేసి [$2 ఫైలు వివరణ పేజీ]ని చూడండి.',
 'sharedupload-desc-here' => 'ఈ ఫైలు $1 నుండి మరియు దీనిని ఇతర ప్రాజెక్టులలో కూడా ఉపయోగిస్తూ ఉండవచ్చు.
 దీని [$2 ఫైలు వివరణ పేజీ] లో ఉన్న వివరణని క్రింద చూపించాం.',
+'sharedupload-desc-edit' => 'ఈ ఫైలు $1 లోనిది. దాన్ని ఇతర ప్రాజెక్టులు కూడా వాడుతూ ఉండి ఉండవచ్చు.
+దాని [$2 ఫైలు వివరణ పేజీ] లోని వివరణను మారుస్తారేమో చూడండి.',
+'sharedupload-desc-create' => 'ఈ ఫైలు $1 లోనిది. దాన్ని ఇతర ప్రాజెక్టులు కూడా వాడుతూ ఉండి ఉండవచ్చు.
+దాని [$2 ఫైలు వివరణ పేజీ] లోని వివరణను మారుస్తారేమో చూడండి.',
 'filepage-nofile' => 'ఈ పేరుతో ఏ ఫైలు లేదు.',
 'filepage-nofile-link' => 'ఈ పేరుతో ఏ ఫైలూ లేదు, కానీ మీరు $1 ను అప్‌లోడ్ చెయ్యవచ్చు.',
 'uploadnewversion-linktext' => 'ఈ దస్త్రపు కొత్త కూర్పును ఎక్కించండి',
@@ -1835,8 +1910,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'randompage-nopages' => 'ఈ క్రింది {{PLURAL:$2|పెరుబరిలో|పెరుబరులలో}} పేజీలు ఏమి లేవు:$1',
 
 # Random page in category
+'randomincategory' => 'వర్గంలోని యాదృచ్చిక పేజీ',
 'randomincategory-invalidcategory' => '"$1" అనేది సరైన పర్గం పేరు కాదు.',
 'randomincategory-nopages' => '[[:Category:$1|$1]] వర్గంలో పేజీలేమీ లేవు.',
+'randomincategory-selectcategory' => 'ఈ వర్గం నుంచి ఒక యాదృచ్ఛిక పేజీని చూడండి: $1 $2.',
 'randomincategory-selectcategory-submit' => 'వెళ్ళు',
 
 # Random redirect
@@ -1864,7 +1941,13 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'statistics-users-active-desc' => 'గత {{PLURAL:$1|రోజు|$1 రోజుల}}లో ఒక్క చర్యైనా చేసిన వాడుకరులు',
 'statistics-mostpopular' => 'ఎక్కువగా చూసిన పేజీలు',
 
+'pageswithprop' => 'ఒక పేజీ లక్షణం కలిగిన పేజీలు',
+'pageswithprop-legend' => 'ఒక పేజీ లక్షణం కలిగిన పేజీలు',
+'pageswithprop-text' => 'ఫలానా పేజీ లక్షణం కలిగిన పేజీల జాబితాను ఈ పేజీలో చూడవచ్చు.',
+'pageswithprop-prop' => 'లక్షణం పేరు:',
 'pageswithprop-submit' => 'వెళ్ళు',
+'pageswithprop-prophidden-long' => 'long text లక్షణం విలువ దాచబడింది ($1)',
+'pageswithprop-prophidden-binary' => 'binary లక్షణం విలువ దాచబడింది ($1)',
 
 'doubleredirects' => 'జంట దారిమార్పులు',
 'doubleredirectstext' => 'ఇతర దారిమార్పు పుటలకి తీసుకెళ్ళే దారిమార్పులని ఈ పుట చూపిస్తుంది.
@@ -1892,6 +1975,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'ninterwikis' => '$1 {{PLURAL:$1|అంతర్వికీ|అంతర్వికీలు}}',
 'nlinks' => '$1 {{PLURAL:$1|లింకు|లింకులు}}',
 'nmembers' => '{{PLURAL:$1|ఒక ఉపవర్గం/పేజీ/ఫైలు|$1 ఉపవర్గాలు/పేజీలు/ఫైళ్లు}}',
+'nmemberschanged' => '$1 → $2 {{PLURAL:$2|సభ్యుడు|సభ్యులు}}',
 'nrevisions' => '{{PLURAL:$1|ఒక సంచిక|$1 సంచికలు}}',
 'nviews' => '$1 {{PLURAL:$1|దర్శనము|దర్శనలు}}',
 'nimagelinks' => '$1 {{PLURAL:$1|పుట|పుటల}}లో ఉపయోగించారు',
@@ -1910,15 +1994,19 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'wantedpages' => 'కోరిన పేజీలు',
 'wantedpages-badtitle' => 'ఫలితాల సమితిలో తప్పుడు శీర్షిక: $1',
 'wantedfiles' => 'కావలసిన ఫైళ్ళు',
+'wantedfiletext-cat' => 'కింది ఫైళ్ళను వాడారు, కానీ అవి ఉనికిలో లేవు. బయటి రిపాజిటరీలలోని ఫైళ్ళను, అవి ఉనికిలో ఉన్నప్పటికీ, చూపవచ్చు. అటువంటి తప్పు పాజిటివులు <del>కొట్టివేయబడతాయి</del>. పైగా, ఉనికిలో లేని ఫైళ్ళను ఇమిడ్చే పేజీలు [[:$1]] లో చేర్చబడతాయి.',
+'wantedfiletext-nocat' => 'కింది ఫైళ్ళను వాడారు, కానీ అవి ఉనికిలో లేవు. బయటి రిపాజిటరీలలోని ఫైళ్ళను, అవి ఉనికిలో ఉన్నప్పటికీ, చూపవచ్చు. అటువంటి తప్పు పాజిటివులు <del>కొట్టివేయబడతాయి</del>.',
 'wantedtemplates' => 'కావాల్సిన మూసలు',
 'mostlinked' => 'అధిక లింకులు చూపే పేజీలు',
 'mostlinkedcategories' => 'అధిక లింకులు చూపే వర్గాలు',
 'mostlinkedtemplates' => 'ఎక్కువగా ఉపయోగించిన మూసలు',
 'mostcategories' => 'అధిక వర్గాలలో చేరిన వ్యాసాలు',
 'mostimages' => 'అధిక లింకులు గల బొమ్మలు',
+'mostinterwikis' => 'అత్యధిక అంతరవికీ లింకులు కలిగిన పేజీలు',
 'mostrevisions' => 'అధిక సంచికలు గల వ్యాసాలు',
 'prefixindex' => 'ఉపసర్గతో అన్ని పేజీలు',
 'prefixindex-namespace' => 'ఉపసర్గతో ఉన్న పేజీలు ($1 పేరుబరి)',
+'prefixindex-strip' => 'జాబితాలో ఆదిపదాన్ని తీసివేయి',
 'shortpages' => 'చిన్న పేజీలు',
 'longpages' => 'పొడవు పేజీలు',
 'deadendpages' => 'అగాధ (డెడ్ఎండ్) పేజీలు',
@@ -1926,12 +2014,23 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'protectedpages' => 'సంరక్షిత పేజీలు',
 'protectedpages-indef' => 'అనంత సంరక్షణ మాత్రమే',
 'protectedpages-cascade' => 'కాస్కేడింగు రక్షణలు మాత్రమే',
+'protectedpages-noredirect' => 'దారిమార్పులను దాచు',
 'protectedpagesempty' => 'ఈ పరామితులతో ప్రస్తుతం ఏ పేజీలు కూడా సంరక్షించబడి లేవు.',
+'protectedpages-timestamp' => 'కాలముద్ర',
+'protectedpages-page' => 'పేజీ',
+'protectedpages-expiry' => 'కాలం చెల్లేది',
+'protectedpages-performer' => 'రక్షించబడే వాడుకరి',
+'protectedpages-params' => 'సంరక్షణ పరామితులు',
+'protectedpages-reason' => 'కారణం',
+'protectedpages-unknown-timestamp' => 'తెలియని',
+'protectedpages-unknown-performer' => 'తెలియని వాడుకరి',
 'protectedtitles' => 'సంరక్షిత శీర్షికలు',
+'protectedtitles-summary' => 'యీ పేజీలో ప్రస్తుతానికి నిర్మాణం నిషిద్దమైన శీర్ణికలన్నీ పొందుపరచబడ్డాయి.ప్రస్తుతం ఉన్న రక్షిత పేజీలకోసం యిక్కడ చూడండి [[{{#special:ProtectedPages}}]].',
 'protectedtitlesempty' => 'ఈ పరామితులతో ప్రస్తుతం శీర్షికలేమీ సరక్షించబడి లేవు.',
 'listusers' => 'వాడుకరుల జాబితా',
 'listusers-editsonly' => 'మార్పులు చేసిన వాడుకరులను మాత్రమే చూపించు',
 'listusers-creationsort' => 'చేరిన తేదీ క్రమంలో చూపించు',
+'listusers-desc' => 'అవోహణ క్రమంలో పేర్చు',
 'usereditcount' => '$1 {{PLURAL:$1|మార్పు|మార్పులు}}',
 'usercreated' => '$1 న $2కి {{GENDER:$3|చేరారు}}',
 'newpages' => 'కొత్త పేజీలు',
@@ -2008,7 +2107,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'linksearch-pat' => 'వెతకాల్సిన నమూనా:',
 'linksearch-ns' => 'పేరుబరి:',
 'linksearch-ok' => 'వెతుకు',
-'linksearch-text' => '"*.wikipedia.org" వంటి వైల్డ్ కార్డులు వాడవచ్చు.<br />ఉపయోగించుకోగల ప్రోటోకాళ్లు: <code>$1</code>',
+'linksearch-text' => '"*.wikipedia.org" వంటి వైల్డ్ కార్డులు వాడవచ్చు. కనీసం ఒక్కటైనా టాప్ లెవెల్ డొమెయిన్ ఉండాలి. ఉదా: "*.org".<br />ఉపయోగించుకోగల {{PLURAL:$2|ప్రోటోకోల్|ప్రోటోకోళ్లు}}: <code>$1</code> (ఏ ప్రోటోకోలునూ ఇవ్వకపోతే, http:// ను వాడబడుతుంది)',
 'linksearch-line' => '$2 నుండి $1కి లింకు ఉంది',
 'linksearch-error' => 'హోస్ట్‌నేముకు ముందు మాత్రమే వైల్డ్ కార్డులు వాడవచ్చు.',
 
@@ -2054,7 +2153,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'emailuser-title-target' => 'ఈ {{GENDER:$1|వాడుకరికి}} ఈమెయిలు పంపించండి',
 'emailuser-title-notarget' => 'ఈ-మెయిలు వాడుకరి',
 'emailpage' => 'వాడుకరికి ఈ-మెయిలుని పంపించు',
-'emailpagetext' => 'వాడà±\81à°\95à°°à°¿à°\95à°¿ ఈమెయిలు సందేశము పంపించుటకు క్రింది ఫారంను ఉపయోగించవచ్చు. [[Special:Preferences|మీ వాడుకరి అభిరుచుల]]లో మీరిచ్చిన ఈ-మెయిలు చిరునామా "నుండి" ఆ సందేశం వచ్చినట్లుగా ఉంటుంది, కనుక వేగుని అందుకునేవారు నేరుగా మీకు జవాబివ్వగలుగుతారు.',
+'emailpagetext' => 'à°\88 {{GENDER:$1|వాడà±\81à°\95à°°à°¿à°\95à°¿}} ఈమెయిలు సందేశము పంపించుటకు క్రింది ఫారంను ఉపయోగించవచ్చు. [[Special:Preferences|మీ వాడుకరి అభిరుచుల]]లో మీరిచ్చిన ఈ-మెయిలు చిరునామా "నుండి" ఆ సందేశం వచ్చినట్లుగా ఉంటుంది, కనుక వేగుని అందుకునేవారు నేరుగా మీకు జవాబివ్వగలుగుతారు.',
 'usermailererror' => 'మెయిలు ఆబ్జెక్టు ఈ లోపాన్ని చూపింది:',
 'defemailsubject' => 'వాడుకరి "$1" నుండి {{SITENAME}} ఈ-మెయిలు',
 'usermaildisabled' => 'వాడుకరి ఈ-మెయిళ్ళు అచేతనం చేసారు',
@@ -2092,8 +2191,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'watchnologin' => 'లాగిన్‌ అయిలేరు',
 'watchnologintext' => 'మీ వీక్షణ జాబితాను మార్చడానికి మీరు [[Special:UserLogin|లాగిన్‌]] అయి ఉండాలి.',
 'addwatch' => 'వీక్షణ జాబితాలో చేర్చు',
-'addedwatchtext' => "\"[[:\$1]]\" అనే పుట మీ [[Special:Watchlist|వీక్షణ జాబితా]]లో చేరింది.
-భవిష్యత్తులో ఈ పుటకి మరియు సంబంధిత చర్చాపుటకి జరిగే మార్పులు అక్కడ కనిపిస్తాయి, మరియు  [[Special:RecentChanges|ఇటీవలి మార్పుల జాబితా]]లో సులభంగా గుర్తించడానికి ఈ పుట '''బొద్దుగా''' కనిపిస్తుంది.",
+'addedwatchtext' => '"[[:$1]]" అనే పుట మీ [[Special:Watchlist|వీక్షణ జాబితా]]లో చేరింది.
+భవిష్యత్తులో ఈ పుటకి మరియు సంబంధిత చర్చాపుటకి జరిగే మార్పులు అక్కడ కనిపిస్తాయి.',
 'removewatch' => 'వీక్షణ జాబితా నుండి తొలగించు',
 'removedwatchtext' => '"[[:$1]]" అనే పేజీ [[Special:Watchlist|మీ వీక్షణ జాబితా]] నుండి తొలగించబడినది.',
 'watch' => 'వీక్షించు',
@@ -2103,13 +2202,13 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'notanarticle' => 'వ్యాసం పేజీ కాదు',
 'notvisiblerev' => 'ఈ కూర్పును తొలగించాం',
 'watchlist-details' => 'మీ వీక్షణ జాబితాలో {{PLURAL:$1|ఒక పేజీ ఉంది|$1 పేజీలు ఉన్నాయి}}, చర్చా పేజీలని వదిలేసి.',
-'wlheader-enotif' => 'à°\88-à°®à±\86యిలà±\81 à°ªà±\8dà°°à°\95à°\9fà°¨లు పంపబడతాయి.',
-'wlheader-showupdated' => "మీ గత సందర్శన తరువాత మారిన పేజీలు '''బొద్దు'''గా చూపించబడ్డాయి.",
+'wlheader-enotif' => 'à°\88-à°®à±\86యిలà±\81 à°\97మనిà°\95లు పంపబడతాయి.',
+'wlheader-showupdated' => 'మీ గత సందర్శన తరువాత మారిన పేజీలు <strong>బొద్దు</strong>గా చూపించబడ్డాయి.',
 'watchmethod-recent' => 'వీక్షణ జాబితాలోని పేజీల కొరకు ఇటీవలి మార్పులు పరిశీలించబడుతున్నాయి',
 'watchmethod-list' => 'ఇటీవలి మార్పుల కొరకు వీక్షణ జాబితాలోని పేజీలు పరిశీలించబడుతున్నాయి',
 'watchlistcontains' => 'మీ వీక్షణ జాబితాలో {{PLURAL:$1|ఒక పేజీ ఉంది|$1 పేజీలు ఉన్నాయి}}.',
 'iteminvalidname' => "'$1' తో ఇబ్బంది, సరైన పేరు కాదు...",
-'wlnote' => "$3 నాడు $4 సమయానికి, గడచిన {{PLURAL:$2|గంటలో|'''$2''' గంటలలో}} జరిగిన {{PLURAL:$1|ఒక్క మార్పు కింద ఉంది|'''$1''' మార్పులు కింద ఉన్నాయి}}.",
+'wlnote2' => '$2, $3 సమయానికి, గత {{PLURAL:$1|గంటలో|<strong>$1</strong> గంటల్లో}}, జరిగిన మార్పులు కింద ఇవ్వబడ్డాయి.',
 'wlshowlast' => 'గత $1 గంటలు $2 రోజులు $3 చూపించు',
 'watchlist-options' => 'వీక్షణ జాబితా ఎంపికలు',
 
@@ -2136,30 +2235,30 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'enotif_anon_editor' => 'అజ్ఞాత వాడుకరి $1',
 'enotif_body' => 'ప్రియమైన $WATCHINGUSERNAME,
 
+$PAGEINTRO $NEWPAGE
 
-{{SITENAME}}లో $PAGETITLE అనే పేజీని $PAGEEDITDATE సమయానికి $PAGEEDITOR $CHANGEDORCREATED, ప్రస్తుత కూర్పు కొరకు $PAGETITLE_URL చూడండి.
-
-$NEWPAGE
+చేర్పరి సారాంశం: $PAGESUMMARY $PAGEMINOREDIT
 
-రచయిత సారాంశం: $PAGESUMMARY $PAGEMINOREDIT
-
-రచయితను సంప్రదించండి:
+చేర్పరిని సంప్రదించండి:
 మెయిలు: $PAGEEDITOR_EMAIL
 వికీ: $PAGEEDITOR_WIKI
 
-à°®à±\80à°°à±\81 à°\88 à°ªà±\87à°\9cà±\80à°\95à°¿ à°µà±\86à°³à±\8dà°¤à±\87 à°¤à°ªà±\8dà°ª à°\87à°\95 à°®à±\81à°\82à°¦à±\81 à°\88 à°ªà±\87à°\9cà±\80à°\95à°¿ à°\9cà°°à°¿à°\97à±\87 à°®à°¾à°°à±\8dà°ªà±\81ల గురించిన వార్తలను మీకు పంపించము. మీ వీక్షణజాబితా లోని అన్ని పేజీలకు ఉన్న గమనింపు జెండాలను మార్చుకోవచ్చు.
+à°®à±\80à°°à±\81 à°²à°¾à°\97à°¿à°¨à±\88 à°\88 à°ªà±\87à°\9cà±\80à°\95à°¿ à°µà±\86à°³à±\8dà°¤à±\87 à°¤à°ªà±\8dà°ª à°\87à°\95 à°®à±\81à°\82à°¦à±\81 à°\9cà°°à°¿à°\97à±\87 à°\95ారà±\8dà°¯à°\95లాపాల గురించిన వార్తలను మీకు పంపించము. మీ వీక్షణజాబితా లోని అన్ని పేజీలకు ఉన్న గమనింపు జెండాలను మార్చుకోవచ్చు.
 
-             మీ స్నేహపూర్వక {{SITENAME}} గమనింపుల వ్యవస్థ
+మీ స్నేహపూర్వక {{SITENAME}} గమనింపుల వ్యవస్థ
 
 --
-మీ వీక్షణజాబితా అమరికలను మార్చుకునేందుకు,
-{{canonicalurl:{{#special:EditWatchlist}}}} ని చూడండి.
+మీ ఈమెయిలు గమనింపుల అమరికలను మార్చుకునేందుకు, చూడండి
+{{canonicalurl:{{#special:Preferences}}}}
+
+మీ వీక్షణ జాబితా అమరికలను మార్చుకునేందుకు, చూడండి
+{{canonicalurl:{{#special:EditWatchlist}}}}
 
-à°\88 à°ªà±\87à°\9cà±\80ని à°®à±\80 à°µà±\80à°\95à±\8dà°·à°£à°\9cాబితా à°¨à±\81à°\82à°¡à°¿ à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà±\81à°\95à±\81à°¨à±\87à°\82à°¦à±\81à°\95à±\81,
-$UNWATCHURL కి వెళ్ళండి.
+à°®à±\80 à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితా à°¨à±\81à°\82à°¡à°¿ à°ªà±\87à°\9cà±\80ని à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà±\87à°\82à°¦à±\81à°\95à±\81, à°\9aà±\82à°¡à°\82à°¡à°¿
+$UNWATCHURL
 
-à°®à±\80 à°\85à°­à°¿à°ªà±\8dరాయాలà±\81 à°\9aà±\86à°ªà±\8dà°ªà±\87à°\82à°¦à±\81à°\95à±\81 à°®à°°à°¿à°¯à±\81 à°®à°°à°¿à°\82à°¤ à°¸à°¹à°¾à°¯à°¾à°¨à°¿à°\95à±\88:
-{{canonicalurl:{{MediaWiki:helppage}}}}',
+à°«à±\80à°¡à±\81à°¬à±\8dయాà°\95à±\81à°\95à±\81, à°\87తర à°¸à°¹à°¾à°¯à°\82 à°\95à±\8bà°¸à°\82:
+{{canonicalurl:{{MediaWiki:Helppage}}}}',
 'created' => 'సృష్టించారు',
 'changed' => 'మార్చారు',
 
@@ -2193,7 +2292,7 @@ $UNWATCHURL కి వెళ్ళండి.
 'delete-edit-reasonlist' => 'తొలగింపు కారణాలని మార్చండి',
 'delete-toobig' => 'ఈ పేజీకి $1 {{PLURAL:$1|కూర్పుకు|కూర్పులకు}} మించిన, చాలా పెద్ద దిద్దుబాటు చరితం ఉంది. {{SITENAME}}కు అడ్డంకులు కలగడాన్ని నివారించేందుకు గాను, అలాంటి పెద్ద పేజీల తొలగింపును నియంత్రించాం.',
 'delete-warning-toobig' => 'ఈ పేజీకి $1 {{PLURAL:$1|కూర్పుకు|కూర్పులకు}} మించిన, చాలా పెద్ద దిద్దుబాటు చరితం ఉంది. దాన్ని తొలగిస్తే {{SITENAME}}కి చెందిన డేటాబేసు కార్యాలకు ఆటంకం కలగొచ్చు; అప్రమత్తతో ముందుకుసాగండి.',
-'deleting-backlinks-warning' => "'''హెచ్చరిక:''' మీరు తొలగించబోతున్న పేజీకి ఇతర పేజీల నుండి లింకులు ఉన్నాయి.",
+'deleting-backlinks-warning' => "'''హెచ్చరిక:''' మీరు తొలగించబోతున్న పేజీకి ఇతర పేజీల నుండి లింకులు ఉన్నాయి లేదా ఇక్కడ నుండి ట్రాన్స్‍క్లూడు అవుతున్నాయి.",
 
 # Rollback
 'rollback' => 'దిద్దుబాట్లను రద్దుచేయి',
@@ -2209,7 +2308,7 @@ $UNWATCHURL కి వెళ్ళండి.
 చివరి మార్పులు చేసినవారు: [[User:$3|$3]] ([[User talk:$3|చర్చ]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "దిద్దుబాటు సారాశం: \"''\$1''\".",
 'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|చర్చ]]) చేసిన మార్పులను [[User:$1|$1]] యొక్క చివరి కూర్పు వరకు తిప్పికొట్టారు.',
-'revertpage-nouser' => '(తొలగించిన వాడుకరిపేరు) చేసిన మార్పులను [[User:$1|$1]] యొక్క చివరి కూర్పుకి తిప్పికొట్టారు',
+'revertpage-nouser' => 'దాచబడిన వాడుకరి చేసిన మార్పులను [[User:$1|$1]] యొక్క చివరి కూర్పుకి తిప్పికొట్టారు',
 'rollback-success' => '$1 చేసిన దిద్దుబాట్లను వెనక్కు తీసుకెళ్ళాం; తిరిగి $2 చేసిన చివరి కూర్పుకు మార్చాం.',
 
 # Edit tokens
@@ -2326,6 +2425,7 @@ $1',
 'undelete-bad-store-key' => '$1 టైమ్‌స్టాంపు కలిగిన ఫైలు తొలగింపును రద్దు చెయ్యలేకున్నాం: తొలగింపుకు ముందే ఫైలు కనబడటం లేదు.',
 'undelete-cleanup-error' => 'వాడని భాండారం ఫైలు "$1" తొలగింపును రద్దు చెయ్యడంలో లోపం దొర్లింది.',
 'undelete-missing-filearchive' => 'ID $1 కలిగిన భాండారం ఫైలు డేటాబేసులో లేకపోవడం చేత దాన్ని పునస్థాపించలేకున్నాం. దాని తొలగింపును ఇప్పటికే రద్దుపరచి ఉండవచ్చు.',
+'undelete-error' => 'పుటను తిరిగి సృష్టించుటలో దోషం',
 'undelete-error-short' => 'ఫైలు $1 తొలగింపును రద్దు పరచడంలో లోపం దొర్లింది',
 'undelete-error-long' => 'ఫైలు $1 తొలగింపును రద్దు పరచడంలో లోపాలు దొర్లాయి',
 'undelete-show-file-confirm' => '$2 నాడు $3 సమయాన ఉన్న "<nowiki>$1</nowiki>" ఫైలు యొక్క తొలగించిన కూర్పుని మీరు నిజంగానే చూడాలనుకుంటున్నారా?',
@@ -2420,9 +2520,10 @@ $1',
 'ipb-confirm' => 'నిరోధాన్ని ధృవపరచండి',
 'badipaddress' => 'సరైన ఐ.పి. అడ్రసు కాదు',
 'blockipsuccesssub' => 'నిరోధం విజయవంతం అయింది',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] నిరోధించబడింది.
-<br />నిరోధాల సమీక్ష కొరకు [[Special:BlockList|ఐ.పి. నిరొధాల జాబితా]] చూడండి.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] నిరోధించబడింది.<br />
+నిరోధాల సమీక్ష కొరకు [[Special:BlockList|నిరోధాల జాబితా]] చూడండి.',
 'ipb-blockingself' => 'మిమ్మల్ని మీరే నిరోధించుకోబోతున్నారు! అదే మీ నిశ్చయమా?',
+'ipb-confirmaction' => 'మీరు నిజంగానే ఆ పని చెయ్యాలనుకుంటే, కింద ఉన్న "{{int:ipb-confirm}}" ఫీల్డును చెక్ చెయ్యండి.',
 'ipb-edit-dropdown' => 'నిరోధపు కారణాలను మార్చండి',
 'ipb-unblock-addr' => '$1 పై ఉన్న నిరోధాన్ని తొలగించండి',
 'ipb-unblock' => 'వాడుకరి పేరుపై లేదా ఐపీ చిరునామాపై ఉన్న నిరోధాన్ని తొలగించండి',
@@ -2440,6 +2541,7 @@ $1',
 'blocklist-userblocks' => 'ఖాతా నిరోధాలను దాచు',
 'blocklist-tempblocks' => 'తాత్కాలిక నిరోధాలను దాచు',
 'blocklist-addressblocks' => 'ఏకైక ఐపీ నిరోధాలను దాచు',
+'blocklist-rangeblocks' => 'శ్రేణి నిరోధకాలను దాచు',
 'blocklist-timestamp' => 'కాలముద్ర',
 'blocklist-target' => 'గమ్యం',
 'blocklist-expiry' => 'కాలం చేల్లేది',
@@ -2463,7 +2565,8 @@ $1',
 'change-blocklink' => 'నిరోధాన్ని మార్చండి',
 'contribslink' => 'రచనలు',
 'emaillink' => 'ఈ-మెయిలును పంపించు',
-'autoblocker' => 'మీ ఐ.పీ. అడ్రసును "[[User:$1|$1]]" ఇటీవల వాడుట చేత, అది ఆటోమాటిక్‌గా నిరోధించబడినది. $1ను నిరోధించడానికి కారణం: "\'\'\'$2\'\'\'"',
+'autoblocker' => 'మీ ఐ.పీ. అడ్రసును ఇటీవల "[[User:$1|$1]]" వాడటం చేత, అది ఆటోమాటిక్‌గా నిరోధించబడినది. 
+$1 ను నిరోధించడానికి కారణం: "$2"',
 'blocklogpage' => 'నిరోధాల చిట్టా',
 'blocklog-showlog' => 'ఈ వాడుకరిని గతంలో నిరోధించారు.
 మీ సమాచారం కోసం నిరోధపు చిట్టాని క్రింద ఇచ్చాం:',
@@ -2471,7 +2574,9 @@ $1',
 వివరాల కోసం అణచివేత చిట్టా కింద చూపబడింది:',
 'blocklogentry' => '"[[$1]]" పై నిరోధం అమలయింది. నిరోధ కాలం $2 $3',
 'reblock-logentry' => '[[$1]] కై నిరోధపు అమరికలను $2 $3 గడువుతో మార్చారు',
-'blocklogtext' => 'వాడుకరుల నిరోధాలు, పునస్థాపనల చిట్టా ఇది. ఆటోమాటిక్‌గా నిరోధానికి గురైన ఐ.పి. చిరునామాలు ఈ జాబితాలో ఉండవు. ప్రస్తుతం అమల్లో ఉన్న నిరోధాలు, నిషేధాల కొరకు [[Special:BlockList|ఐ.పి. నిరోధాల జాబితా]]ను చూడండి.',
+'blocklogtext' => 'వాడుకరుల నిరోధాలు, పునస్థాపనల చిట్టా ఇది. 
+ఆటోమాటిక్‌గా నిరోధానికి గురైన ఐ.పి. చిరునామాలు ఈ జాబితాలో ఉండవు. 
+ప్రస్తుతం అమల్లో ఉన్న నిరోధాలు, నిషేధాల కొరకు [[Special:BlockList|నిరోధాల జాబితా]]ను చూడండి.',
 'unblocklogentry' => '$1పై నిరోధం తొలగించబడింది',
 'block-log-flags-anononly' => 'అజ్ఞాత వాడుకర్లు మాత్రమే',
 'block-log-flags-nocreate' => 'ఖాతా సృష్టించడాన్ని అశక్తం చేసాం',
@@ -2483,7 +2588,7 @@ $1',
 'range_block_disabled' => 'శ్రేణి(రేంజి) నిరోధం చెయ్యగల నిర్వాహక అనుమతిని అశక్తం చేసాం.',
 'ipb_expiry_invalid' => 'అంతమయ్యే గడువు సరైనది కాదు.',
 'ipb_expiry_temp' => 'దాచిన వాడుకరిపేరు నిరోధాలు శాశ్వతంగా ఉండాలి.',
-'ipb_hide_invalid' => 'à°\88 à°\96ాతానà±\81 à°\85à°£à°\9aà°²à±\87à°\95à°ªà±\8bà°¤à±\81à°¨à±\8dనాà°\82. à°¦à°¾à°¨à°¿ à°\95à°¿à°\82à°¦ à°\9aాలా à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\8dà°²à±\81 à°\89à°\82à°¡à°¿ à°\89à°\82à°\9fాయి.',
+'ipb_hide_invalid' => 'à°\88 à°\96ాతానà±\81 à°\85à°£à°\9aà°²à±\87à°\95à°ªà±\8bà°¤à±\81à°¨à±\8dనాà°\82. à°¦à°¾à°¨à°¿ à°\96ాతాలà±\8b {{PLURAL:$1|à°\92à°\95à°\9fà°¿ à°\95à°\82à°\9fà±\87|$1 à°\95à°\82à°\9fà±\87}} à°\8eà°\95à±\8dà°\95à±\81à°µ à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\8dà°²à±\81 à°\89à°¨à±\8dà°¨ాయి.',
 'ipb_already_blocked' => '"$1" ను ఇప్పటికే నిరోధించాం',
 'ipb-needreblock' => '$1ని ఇప్పటికే నిరోధించారు. ఆ అమరికలని మీరు మార్చాలనుకుంటున్నారా?',
 'ipb-otherblocks-header' => 'ఇతర {{PLURAL:$1|నిరోధం|నిరోధాలు}}',
@@ -2582,7 +2687,7 @@ $1',
 'movesubpagetext' => 'ఈ పేజీకి క్రింద చూపించిన $1 {{PLURAL:$1|ఉపపేజీ ఉంది|ఉపపేజీలు ఉన్నాయి}}.',
 'movenosubpage' => 'ఈ పేజీకి ఉపపేజీలు ఏమీ లేవు.',
 'movereason' => 'కారణం:',
-'revertmove' => 'తరలిà°\82à°ªà±\81à°¨à±\81 à°°à°¦à±\8dà°¦à±\81à°\9aà±\87యి',
+'revertmove' => 'à°µà±\86à°¨à°\95à±\8dà°\95à±\81 à°¤à°¿à°ªà±\8dà°ªà±\81',
 'delete_and_move' => 'తొలగించి, తరలించు',
 'delete_and_move_text' => '==తొలగింపు అవసరం==
 
@@ -2595,6 +2700,7 @@ $1',
 'immobile-target-namespace-iw' => 'పేజీని తరలించడానికి అంతర్వికీ లింకు సరైన లక్ష్యం కాదు.',
 'immobile-source-page' => 'ఈ పేజీని తరలించలేరు.',
 'immobile-target-page' => 'ఆ లక్ష్యిత శీర్షికకి తరలించలేము.',
+'bad-target-model' => 'కోరుకున్న గమ్య స్థానం వేరే కంటెంటు మోడల్‍ను వాడుతోంది. $1 నుండి $2 కు మార్చలేం.',
 'imagenocrossnamespace' => 'ఫైలును, ఫైలుకు చెందని నేమ్‌స్పేసుకు తరలించలేం',
 'nonfile-cannot-move-to-file' => 'దస్త్రాలు కానివాటిని దస్త్రపు పేరుబరికి తరలించలేరు',
 'imagetypemismatch' => 'ఈ కొత్త ఫైలు ఎక్స్&zwnj;టెన్షన్ ఫైలు రకానికి సరిపోలేదు',
@@ -2611,15 +2717,17 @@ $1',
 దయచేసి మరొక పేరుని ఎంచుకోండి.',
 
 # Export
-'export' => 'à°\8eà°\97à±\81మతి à°ªà±\87à°\9cà±\80à°²à±\81',
+'export' => 'à°ªà±\87à°\9cà±\80à°² à°\8eà°\97à±\81మతి',
 'exporttext' => 'ఎంచుకున్న పేజీ లేదా పేజీలలోని వ్యాసం మరియు పేజీ చరితం లను XML లో ఎగుమతి చేసుకోవచ్చు. MediaWiki ని ఉపయోగించి Special:Import page ద్వారా దీన్ని వేరే వికీ లోకి దిగుమతి చేసుకోవచ్చు.
 
 పేజీలను ఎగుమతి చేసందుకు, కింద ఇచ్చిన టెక్స్టు బాక్సులో పేజీ పేర్లను లైనుకో పేరు చొప్పున ఇవ్వండి. ప్రస్తుత కూర్పుతో పాటు పాత కూర్పులు కూడా కావాలా, లేక ప్రస్తుత కూర్పు మాత్రమే చాలా అనే విషయం కూడా ఇవ్వవచ్చు.
 
 రెండో పద్ధతిలో అయితే, పేజీ యొక్క లింకును కూడా వాడవచ్చు. ఉదాహరణకు, "[[{{MediaWiki:Mainpage}}]]" కోసమైతే [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] అని ఇవ్వవచ్చు.',
+'exportall' => 'పేజీలన్నిటినీ ఎగుమతి చెయ్యి',
 'exportcuronly' => 'ప్రస్తుత కూర్పు మాత్రమే, పూర్తి చరితం వద్దు',
 'exportnohistory' => "----
 '''గమనిక:''' ఈ ఫారాన్ని ఉపయోగించి పేజీలయొక్క పూర్తి చరిత్రను ఎగుమతి చేయడాన్ని సర్వరుపై వత్తిడి పెరిగిన కారణంగా ప్రస్తుతం నిలిపివేశారు.",
+'exportlistauthors' => 'ప్రతీపేజీలోను చేర్పరుల పూర్తి జాబితాను కూడా ఉంచు',
 'export-submit' => 'ఎగుమతించు',
 'export-addcattext' => 'ఈ వర్గంలోని పేజీలను చేర్చు:',
 'export-addcat' => 'చేర్చు',
@@ -2645,18 +2753,24 @@ $1',
 'allmessages-prefix' => 'ఉపసర్గ పై వడపోత:',
 'allmessages-language' => 'భాష:',
 'allmessages-filter-submit' => 'వెళ్ళు',
+'allmessages-filter-translate' => 'అనువదించు',
 
 # Thumbnails
 'thumbnail-more' => 'పెద్దది చెయ్యి',
 'filemissing' => 'ఫైలు కనపడుటలేదు',
 'thumbnail_error' => '$1: నఖచిత్రం తయారుచెయ్యడంలో లోపం జరిగింది',
+'thumbnail_error_remote' => '$1 నుండి వచ్చిన లోప సందేశం:
+$2',
 'djvu_page_error' => 'DjVu పేజీ రేంజి దాటిపోయింది',
 'djvu_no_xml' => 'DjVu ఫైలు కోసం XMLను తీసుకుని రాలేకపోయాను',
+'thumbnail-temp-create' => 'తాత్కాలిక థంబ్‍నెయిల్ ఫైలును సృష్టించలేకపోయాం',
+'thumbnail-dest-create' => 'థంబ్‍నెయిలును గమ్యస్థానంలో భద్రపరచలేకపోయాం',
 'thumbnail_invalid_params' => 'నఖచిత్రాలకు సరయిన పారామీటర్లు లేవు',
 'thumbnail_dest_directory' => 'గమ్యస్థానంలో డైరెక్టరీని సృష్టించలేకపోయాం',
 'thumbnail_image-type' => 'ఈ బొమ్మ రకానికి మద్దతు లేదు',
 'thumbnail_gd-library' => 'అసంపూర్ణ GD సంచయపు ఏర్పాటు: $1 ఫంక్షను లేదు.',
 'thumbnail_image-missing' => 'ఫైలు తప్పిపోయినట్లున్నది: $1',
+'thumbnail_image-failure-limit' => 'ఈ థంబ్‍నెయిల్‍ను రెండరు చెయ్యడానికి చాలా ఎక్కువ విఫలయత్నాలు ($1 లేదా అంతకంటే ఎక్కువ) జరిగాయి. కాస్తాగి మళ్ళీ ప్రయత్నించండి.',
 
 # Special:Import
 'import' => 'పేజీలను దిగుమతి చేసుకోండి',
@@ -2669,6 +2783,7 @@ $1',
 'import-interwiki-templates' => 'అన్ని మూసలను ఉంచు',
 'import-interwiki-submit' => 'దిగుమతించు',
 'import-interwiki-namespace' => 'లక్ష్యిత నేంస్పేసు:',
+'import-interwiki-rootpage' => 'గమ్యస్థానపు మూలపు పేజీ (ఐచ్ఛికం):',
 'import-upload-filename' => 'పైలుపేరు:',
 'import-comment' => 'వ్యాఖ్య:',
 'importtext' => '[[Special:Export|ఎగుమతి ఉపకరణాన్ని]] ఉపయోగించి, ఈ ఫైలుని  మూల వికీ నుంచి ఎగుమతి చెయ్యండి.
@@ -2692,11 +2807,19 @@ $1',
 'importuploaderrortemp' => 'దిగుమతి ఫైలు అప్లోడు ఫలించలేదు. ఒక తాత్కాలిక ఫోల్డరు కనిపించటం లేదు.',
 'import-parse-failure' => 'దిగుమతి చేసుకుంటున్న XML విశ్లేషణ ఫలించలేదు',
 'import-noarticle' => 'దిగుమతి చెయ్యాల్సిన పేజీ లేదు!',
-'import-nonewrevisions' => 'à°\85à°¨à±\8dని à°\95à±\82à°°à±\8dà°ªà±\81à°²à±\82 à°\97à°¤à°\82à°²à±\8bà°¨à±\87 à°¦à°¿à°\97à±\81మతయà±\8dయాయి.',
+'import-nonewrevisions' => 'à°\95à±\82à°°à±\8dà°ªà±\81à°²à±\87à°µà±\80 à°¦à°¿à°\97à±\81మతి à°\95ాలà±\87à°¦à±\81 (à°\85వనà±\8dà°¨à±\80 à°\88సరిà°\95à±\87 à°\89à°\82à°¡à°¿ à°\89à°\82డాలి, à°²à±\87దా à°²à±\8bపాల à°\95ారణà°\82à°\97à°¾ à°µà°¦à°¿à°²à±\86à°¯à±\8dయబడà±\8dడాయి).',
 'xml-error-string' => '$1 $2వ లైనులో, వరుస $3 ($4వ బైటు): $5',
 'import-upload' => 'XML డేటాను అప్‌లోడు చెయ్యి',
 'import-token-mismatch' => 'సెషను భోగట్టా పోయింది. దయచేసి మళ్ళీ ప్రయత్నించండి.',
 'import-invalid-interwiki' => 'మీరు చెప్పిన వికీనుండి దిగుమతి చేయలేము.',
+'import-error-edit' => 'పేజీ "$1" లో మార్పుచేర్పులు చేసే అనుమతి మీకు లేదు కాబట్టి దాన్ని దిగుమతి చెయ్యలేదు.',
+'import-error-create' => 'పేజీ "$1" ను సృష్టించే అనుమతి మీకు లేదు కాబట్టి దాన్ని దిగుమతి చెయ్యలేదు.',
+'import-error-interwiki' => 'పేజీ "$1" యొక్క పేరు బయటి లింకుల (అంతరవికీ) కోసం అట్టేపెట్టబడింది కాబట్టి దాన్ని దిగుమతి చెయ్యలేదు.',
+'import-error-special' => 'పేజీ "$1" ప్రత్యేక పేరుబరికి చెందినది. ఈ పేరుబరిలో పేజీలు సృష్టించే అనుమతి లేదు. అందుచేత దాన్ని దిగుమతి చెయ్యలేదు.',
+'import-error-invalid' => 'పేజీ "$1" పేరు సరైనది కాదు కాబట్టి దాన్ని దిగుమతి చెయ్యలేదు.',
+'import-options-wrong' => 'తప్పు {{PLURAL:$2|ఐచ్ఛికం|ఐచ్ఛికాలు}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'ఇచ్చిన మూలపు పేజీ సరైన శీర్షిక కాదు.',
+'import-rootpage-nosubpage' => 'మూలపేజీ యొక్క పేరుబరి "$1" ఉపపేజీలను అనుమతించదు.',
 
 # Import log
 'importlogpage' => 'దిగుమతుల చిట్టా',
@@ -2709,6 +2832,10 @@ $1',
 # JavaScriptTest
 'javascripttest' => 'జావాస్క్రిప్ట్ పరీక్ష',
 'javascripttest-title' => '$1 పరీక్షలు నడుస్తున్నాయి',
+'javascripttest-pagetext-noframework' => 'ఈ పేజీ JavaScript పరీక్షల కోసం ఉద్దేశించబడింది.',
+'javascripttest-pagetext-unknownframework' => 'తెలియని పరీక్షా ఫ్రేమ్‍వర్కు "$1".',
+'javascripttest-pagetext-frameworks' => 'కింది పరీక్షా ఫ్రేమ్‍వర్కులలో ఒకదాన్ని ఎంచుకోండి: $1',
+'javascripttest-qunit-intro' => 'mediawiki.org లోని [$1 పరీక్షా డాక్యుమెంటేషన్] చూడండి.',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'మీ వాడుకరి పేజీ',
@@ -2719,7 +2846,6 @@ $1',
 'tooltip-pt-watchlist' => 'మీరు మార్పుల కొరకు గమనిస్తున్న పేజీల జాబితా',
 'tooltip-pt-mycontris' => 'మీ మార్పు-చేర్పుల జాబితా',
 'tooltip-pt-login' => 'మీరు లోనికి ప్రవేశించడాన్ని ప్రోత్సహిస్తున్నాం; కానీ అది తప్పనిసరి కాదు.',
-'tooltip-pt-anonlogin' => 'మీరు లోనికి ప్రవేశించడాన్ని ప్రోత్సహిస్తాం; కానీ, అది తప్పనిసరి కాదు',
 'tooltip-pt-logout' => 'నిష్క్రమించండి',
 'tooltip-ca-talk' => 'విషయపు పుట గురించి చర్చ',
 'tooltip-ca-edit' => 'ఈ పేజీని మీరు సరిదిద్దవచ్చు. దాచేముందు మునుజూపు బొత్తాన్ని వాడండి.',
@@ -2731,7 +2857,7 @@ $1',
 'tooltip-ca-delete' => 'ఈ పేజీని తొలగించండి',
 'tooltip-ca-undelete' => 'ఈ పేజీని తొలగించడానికి ముందు చేసిన మార్పులను పునఃస్థాపించు',
 'tooltip-ca-move' => 'ఈ పేజీని తరలించండి',
-'tooltip-ca-watch' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°®à±\80 à°µà°¿à°\95à±\8dషణా à°\9cాబితాà°\95à°¿ చేర్చుకోండి',
+'tooltip-ca-watch' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°®à±\80 à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితాà°\95à±\81 చేర్చుకోండి',
 'tooltip-ca-unwatch' => 'ఈ పేజీని మీ విక్షణా జాబితా నుండి తొలగించండి',
 'tooltip-search' => '{{SITENAME}} లో వెతకండి',
 'tooltip-search-go' => 'ఇదే పేరుతో పేజీ ఉంటే అక్కడికి తీసుకెళ్ళు',
@@ -2740,7 +2866,7 @@ $1',
 'tooltip-n-mainpage' => 'తలపుటను చూడండి',
 'tooltip-n-mainpage-description' => 'మొదటి పుటను చూడండి',
 'tooltip-n-portal' => 'ప్రాజెక్టు గురించి, మీరేం చేయవచ్చు, సమాచారం ఎక్కడ దొరుకుతుంది',
-'tooltip-n-currentevents' => 'à°\87à°ªà±\8dà°ªà°\9fà°¿ à°®à±\81à°\9aà±\8dà°\9aà°\9fà±\8dà°² à°¯à±\8aà°\95à±\8dà°\95 à°®à±\81à°¨à±\81à°ªà°\9fà°¿ à°®à°\82దలనà±\81 à°¤à±\86à°²à±\81à°¸à±\81à°\95à±\8aà°¨à±\81డి',
+'tooltip-n-currentevents' => 'వరà±\8dతమాన à°\98à°\9fనల à°¯à±\8aà°\95à±\8dà°\95 à°¨à±\87పథà±\8dయానà±\8dని à°¤à±\86à°²à±\81à°¸à±\81à°\95à±\8bà°\82డి',
 'tooltip-n-recentchanges' => 'వికీలో ఇటీవల జరిగిన మార్పుల జాబితా.',
 'tooltip-n-randompage' => 'ఓ యాదృచ్చిక పేజీని చూడండి',
 'tooltip-n-help' => 'తెలుసుకోడానికి ఓ మంచి ప్రదేశం.',
@@ -2803,15 +2929,46 @@ $1',
 'spambot_username' => 'మీడియావికీ స్పాము శుద్ధి',
 'spam_reverting' => '$1 కు లింకులు లేని గత కూర్పుకు తిరిగి తీసుకెళ్తున్నాం',
 'spam_blanking' => '$1 కు లింకులు ఉన్న కూర్పులన్నిటినీ ఖాళీ చేస్తున్నాం',
+'spam_deleting' => '$1 కు లింకులున్న కూర్పులను తొలగిస్తున్నాం',
+'simpleantispam-label' => 'యాంటీ స్పామ్ పరీక్ష.
+దీన్ని <strong>పూరించకండి</strong>!',
 
 # Info page
 'pageinfo-title' => '"$1" గురించి సమాచారం',
+'pageinfo-not-current' => 'పాత కూర్పులకు సంబంధించి ఈ సమాచారాన్ని ఇవ్వడం అసాధ్యం, సారీ.',
 'pageinfo-header-basic' => 'ప్రాథమిక సమాచారం',
 'pageinfo-header-edits' => 'మార్పుల చరిత్ర',
+'pageinfo-header-restrictions' => 'పేజీ సంరక్షణ',
+'pageinfo-header-properties' => 'పేజీ లక్షణాలు',
+'pageinfo-display-title' => 'శీర్షిక చూపించు',
+'pageinfo-length' => 'పేజీ నిడివి (బైట్లలో)',
+'pageinfo-article-id' => 'పేజీ ఐడీ',
+'pageinfo-language' => 'పేజీ విషయపు భాష',
+'pageinfo-content-model' => 'పేజీ కంటెంటు మోడల్',
+'pageinfo-robot-policy' => 'రోబోట్లచే ఇండెక్సవుతోంది',
+'pageinfo-robot-index' => 'అనుమతించబడింది',
+'pageinfo-robot-noindex' => 'అనుమతించబడలేదు',
 'pageinfo-views' => 'వీక్షణల సంఖ్య',
 'pageinfo-watchers' => 'పేజీ వీక్షకుల సంఖ్య',
+'pageinfo-few-watchers' => '$1 {{PLURAL:$1|వీక్షకుడి|వీక్షకుల}} కంటే తక్కువ',
+'pageinfo-redirects-name' => 'ఈ పేజీకి ఉన్న దారిమార్పుల సంఖ్య',
+'pageinfo-subpages-name' => 'ఈ పేజీకి ఉన్న ఉపపేజీల సంఖ్య',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|దారిమార్పు|దారిమార్పులు}}; $3 {{PLURAL:$3|దారిమార్పు కానిది|దారిమార్పు కానివి}})',
+'pageinfo-firstuser' => 'పేజీ సృష్టికర్త',
+'pageinfo-firsttime' => 'పేజీని సృష్టించిన తేదీ',
+'pageinfo-lastuser' => 'ఇట్టీవలి మార్పుచేర్పుల కర్త',
+'pageinfo-lasttime' => 'చివరిసారిగా మార్పు చేసిన తేదీ',
 'pageinfo-edits' => 'మొత్తం మార్పుల సంఖ్య',
+'pageinfo-authors' => 'ప్రత్యేక కర్తల మొత్తం సంఖ్య',
+'pageinfo-recent-edits' => 'ఇటీవలి మార్పుల సంఖ్య (గత $1 లోపు)',
+'pageinfo-recent-authors' => 'ప్రత్యేక కర్తల ఇటీవలి సంఖ్య',
+'pageinfo-magic-words' => 'చమత్కార {{PLURAL:$1|పదం|పదాలు}} ($1)',
+'pageinfo-hidden-categories' => 'దాచిన {{PLURAL:$1|వర్గం|వర్గాలు}} ($1)',
+'pageinfo-templates' => 'ట్రాన్స్‍క్లూడు చేసిన {{PLURAL:$1|మూస|మూసలు}} ($1)',
+'pageinfo-transclusions' => '($1) తో {{PLURAL:$1|పేజీ|పేజీలు}} ట్రాన్స్‍క్లూడు చెయ్యబడ్డాయి',
 'pageinfo-toolboxlink' => 'పేజీ సమాచారం',
+'pageinfo-redirectsto' => 'ఇక్కడికి దారిమార్పు:',
+'pageinfo-redirectsto-info' => 'సమాచారం',
 'pageinfo-contentpage-yes' => 'అవును',
 'pageinfo-protect-cascading-yes' => 'అవును',
 'pageinfo-category-info' => 'వర్గపు సమాచారం',
@@ -2835,6 +2992,7 @@ $1',
 'markedaspatrollederror' => 'నిఘాలో ఉన్నట్లుగా గుర్తించలేకున్నాం',
 'markedaspatrollederrortext' => 'నిఘాలో ఉన్నట్లు గుర్తించేందుకుగాను, కూర్పును చూపించాలి.',
 'markedaspatrollederror-noautopatrol' => 'మీరు చేసిన మార్పులను మీరే నిఘాలో పెట్టలేరు.',
+'markedaspatrollednotify' => '$1 లో చేసిన ఈ మార్పు పర్యవేక్షణలో ఉన్నట్టుగా గుర్తించబడింది.',
 
 # Patrol log
 'patrol-log-page' => 'నిఘా చిట్టా',
@@ -2876,6 +3034,8 @@ $1',
 'file-info-png-looped' => 'పునరావృతమవుతుంది',
 'file-info-png-repeat' => '{{PLURAL:$1|ఒకసారి|$1 సార్లు}} ఆడించారు',
 'file-info-png-frames' => '$1 {{PLURAL:$1|ఫ్రేము|ఫ్రేములు}}',
+'file-no-thumb-animation' => '<strong>గమనిక: సాంకేతిక కారణాల వల్ల, ఈ ఫైలు యొక్క థంబ్‍నెయిళ్ళు యానిమేటు చెయ్యబడవు.</strong>',
+'file-no-thumb-animation-gif' => '<strong>గమనిక: సాంకేతిక కారణాల వల్ల, ఇలాంటి అధిక రిసొల్యూషన్ కలిగిన బొమ్మలు యానిమేటు చెయ్యబడవు.</strong>',
 
 # Special:NewFiles
 'newimages' => 'కొత్త ఫైళ్ళ కొలువు',
@@ -3089,6 +3249,7 @@ $1',
 'exif-lens' => 'వాడిన కటకం',
 'exif-serialnumber' => 'కెమేరా యొక్క సీరియల్ నంబర్',
 'exif-cameraownername' => 'కేమెరా యజమాని',
+'exif-label' => 'సూచిక (లేబెల్)',
 'exif-rating' => 'రేటింగు (5 కి గాను)',
 'exif-rightscertificate' => 'హక్కుల నిర్వాహణ ధృవీకరణ పత్రం',
 'exif-copyrighted' => 'కాపీహక్కుల స్థితి',
@@ -3268,6 +3429,8 @@ $1',
 'exif-gpsdirection-t' => 'వాస్తవ దిశ',
 'exif-gpsdirection-m' => 'అయస్కాంత దిశ',
 
+'exif-ycbcrpositioning-1' => 'మధ్యగతం చేయబడిన',
+
 'exif-dc-contributor' => 'సహాయకులు',
 'exif-dc-date' => 'తేదీ‍‍(లు)',
 'exif-dc-publisher' => 'ప్రచురణకర్త',
@@ -3467,11 +3630,22 @@ $5
 'version-parser-function-hooks' => 'పార్సరుకు కొక్కాలు',
 'version-hook-name' => 'కొక్కెం పేరు',
 'version-hook-subscribedby' => 'ఉపయోగిస్తున్నవి',
-'version-version' => '(సంచిక $1)',
-'version-license' => 'లైసెన్సు',
+'version-version' => '(కూర్పు $1)',
+'version-license' => 'MediaWiki లైసెన్సు',
+'version-ext-license' => 'లైసెన్సు',
+'version-ext-colheader-name' => 'పొడిగింత',
+'version-ext-colheader-version' => 'కూర్పు',
+'version-ext-colheader-license' => 'లైసెన్సు',
+'version-ext-colheader-description' => 'వివరణ',
+'version-ext-colheader-credits' => 'కర్తలు',
+'version-license-title' => '$1 కోసం లైసెన్సు',
+'version-license-not-found' => 'ఈ పొడిగింతకు వివరమైన లైసెన్సు సమాచారమేమీ కనబడలేదు.',
+'version-credits-title' => '$1 యొక్క శ్రేయస్సులు',
+'version-credits-not-found' => 'ఈ పొడిగింతకు వివరమైన శ్రేయస్సు సమాచారమేమీ కనబడలేదు.',
 'version-poweredby-credits' => "ఈ వికీ  '''[https://www.mediawiki.org/ మీడియావికీ]'''చే శక్తిమంతం, కాపీహక్కులు  © 2001-$1 $2.",
 'version-poweredby-others' => 'ఇతరులు',
 'version-poweredby-translators' => 'translatewiki.net అనువాదకులు',
+'version-credits-summary' => 'కింది వ్యక్తులు [[Special:Version|MediaWiki]] కి చేసిన సేవకుగాను, వారిని గుర్తించదలచాం.',
 'version-license-info' => 'మీడియావికీ అన్నది స్వేచ్ఛా మృదూపకరణం; మీరు దీన్ని పునఃపంపిణీ చేయవచ్చు మరియు/లేదా ఫ్రీ సాఫ్ట్&zwnj;వేర్ ఫౌండేషన్ ప్రచురించిన గ్నూ జనరల్ పబ్లిక్ లైసెస్సు వెర్షను 2 లేదా (మీ ఎంపిక ప్రకారం) అంతకంటే కొత్త వెర్షను యొక్క నియమాలకు లోబడి మార్చుకోవచ్చు.
 
 మీడియావికీ ప్రజోపయోగ ఆకాంక్షతో పంపిణీ చేయబడుతుంది, కానీ ఎటువంటి వారంటీ లేకుండా; కనీసం ఏదైనా ప్రత్యేక ఉద్దేశానికి సరిపడుతుందని గానీ లేదా వస్తుత్వం యొక్క అంతర్నిహిత వారంటీ లేకుండా. మరిన్ని వివరాలకు గ్నూ జనరల్ పబ్లిక్ లైసెన్సుని చూడండి.
@@ -3507,8 +3681,7 @@ $5
 'specialpages' => 'ప్రత్యేక పేజీలు',
 'specialpages-note-top' => 'సూచిక',
 'specialpages-note' => '* మామూలు ప్రత్యేక పుటలు.
-* <strong class="mw-specialpagerestricted">నియంత్రిత ప్రత్యేక పుటలు.</strong>
-* <span class="mw-specialpagecached">Cached ప్రత్యేక పుటలు (పాతబడి ఉండొచ్చు).</span>',
+* <span class="mw-specialpagerestricted">నియంత్రిత ప్రత్యేక పుటలు.</span>',
 'specialpages-group-maintenance' => 'నిర్వహణా నివేదికలు',
 'specialpages-group-other' => 'ఇతర ప్రత్యేక పేజీలు',
 'specialpages-group-login' => 'ప్రవేశించండి / ఖాతాను సృష్టించుకోండి',
@@ -3540,11 +3713,13 @@ $5
 'tags' => 'సరైన మార్పు ట్యాగులు',
 'tag-filter' => '[[Special:Tags|ట్యాగుల]] వడపోత:',
 'tag-filter-submit' => 'వడపోయి',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|ట్యాగు|ట్యాగులు}}]]: $2)',
 'tags-title' => 'టాగులు',
 'tags-intro' => 'ఈ పేజీ మృదూపకరణం మార్పులకు ఇచ్చే ట్యాగులను, మరియు వాటి అర్ధాలను చూపిస్తుంది.',
 'tags-tag' => 'ట్యాగు పేరు',
 'tags-display-header' => 'మార్పుల జాబితాలో కనపించు రీతి',
 'tags-description-header' => 'అర్థం యొక్క పూర్తి వివరణ',
+'tags-active-header' => 'క్రియాశీలం?',
 'tags-hitcount-header' => 'ట్యాగులున్న మార్పులు',
 'tags-active-yes' => 'అవును',
 'tags-active-no' => 'కాదు',
@@ -3567,6 +3742,7 @@ $5
 'dberr-problems' => 'క్షమించండి! ఈ సైటు సాంకేతిక సమస్యలని ఎదుర్కొంటుంది.',
 'dberr-again' => 'కొన్ని నిమిషాలాగి మళ్ళీ ప్రయత్నించండి.',
 'dberr-info' => '(డాటాబేసు సర్వరుని సంధానించలేకున్నాం: $1)',
+'dberr-info-hidden' => '(డేటాబేసు సర్వరును కాంటాక్టు చెయ్యలేకున్నాం)',
 'dberr-usegoogle' => 'ఈలోపు మీరు గూగుల్ ద్వారా వెతకడానికి ప్రయత్నించండి.',
 'dberr-outofdate' => 'మా విషయం యొక్క వారి సూచీలు అంత తాజావి కావపోవచ్చని గమనించండి.',
 'dberr-cachederror' => 'అభ్యర్థించిన పేజీ యొక్క కోశం లోని కాపీ ఇది, అంత తాజాది కాకపోవచ్చు.',
@@ -3584,6 +3760,7 @@ $5
 'htmlform-selectorother-other' => 'ఇతర',
 'htmlform-no' => 'కాదు',
 'htmlform-yes' => 'అవును',
+'htmlform-chosen-placeholder' => 'ఒక ఐచ్ఛికాన్ని ఎంచుకోండి',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 పూర్తి-పాఠ్య అన్వేషణ తోడ్పాటుతో',
@@ -3591,27 +3768,51 @@ $5
 
 # New logging system
 'logentry-delete-delete' => '$1 $3 పేజీని {{GENDER:$2|తొలగించారు}}',
+'logentry-delete-restore' => 'పేజీ $3 ని $1 {{GENDER:$2|పునస్థాపించారు}}',
+'logentry-delete-event' => '$3 లో {{PLURAL:$5|ఒక లాగ్ ఘటన|$5 లాగ్ ఘటనల}} యొక్క కన్పట్టటాన్ని (విజిబిలిటీ) $1 {{GENDER:$2|మార్చారు}}: $4',
+'logentry-delete-revision' => 'పేజీ $3 లో {{PLURAL:$5|ఒక కూర్పు|$5 కూర్పుల}} యొక్క కన్పట్టటాన్ని (విజిబిలిటీ) $1 {{GENDER:$2|మార్చారు}}: $4',
+'logentry-delete-event-legacy' => '$3 లో లాగ్ ఘటనల కన్పట్టటాన్ని (విజిబిలిటీ) $1 {{GENDER:$2|మార్చారు}}',
+'logentry-delete-revision-legacy' => 'పేజీ $3 లో కూర్పుల కన్పట్టటాన్ని (విజిబిలిటీ) $1 {{GENDER:$2|మార్చారు}}',
+'logentry-suppress-delete' => 'పేజీ $3 ని $1 {{GENDER:$2|అణచిపెట్టారు}}',
+'logentry-suppress-event' => '$3 లోని {{PLURAL:$5|ఒక లాగ్ ఘటన|$5 లాగ్ ఘటనల}} ప్రేక్షకత్వాన్ని $1 రహస్యంగా {{GENDER:$2|మార్చారు}}: $4',
+'logentry-suppress-revision' => '$3 పేజీ యొక్క {{PLURAL:$5|ఒక కూర్పు|$5 కూర్పుల}} ప్రేక్షకత్వాన్ని $1 రహస్యంగా {{GENDER:$2|మార్చారు}}: $4',
+'logentry-suppress-event-legacy' => '$3 లోని లాగ్ ఘటనల ప్రేక్షకత్వాన్ని $1 రహస్యంగా {{GENDER:$2|మార్చారు}}',
+'logentry-suppress-revision-legacy' => 'పేజీ $3 యొక్క కూర్పుల ప్రేక్షకత్వాన్ని $1 రహస్యంగా {{GENDER:$2|మార్చారు}}',
 'revdelete-content-hid' => 'కంటెంట్ దాచబడింది',
 'revdelete-summary-hid' => 'మార్పుల సారాంశాన్ని దాచారు',
 'revdelete-uname-hid' => 'వాడుకరి పేరుని దాచారు',
+'revdelete-content-unhid' => 'కంటెంట్ బయటపెట్టబడింది',
+'revdelete-summary-unhid' => 'దిద్దుబాటు సారాంశం బయటపెట్టబడింది',
+'revdelete-uname-unhid' => 'వాడుకరిపేరు బయటపెట్టబడింది',
 'revdelete-restricted' => 'నిర్వాహకులకు ఆంక్షలు విధించాను',
 'revdelete-unrestricted' => 'నిర్వాహకులకున్న ఆంక్షలను ఎత్తేశాను',
-'logentry-move-move' => '$1 $3 పేజీని $4కి తరలించారు',
-'logentry-move-move-noredirect' => '$1 $3 పేజీని $4కి దారిమార్పు లేకుండా తరలించారు',
-'logentry-move-move_redir' => '$1 $3 పేజీని $4కి దారిమార్పు ద్వారా తరలించారు',
-'logentry-move-move_redir-noredirect' => '$1 $3 పేజీని $4కి దారిమార్పు లేకుండా తరలించారు',
-'logentry-newusers-newusers' => '$1 వాడుకరి ఖాతాను సృష్టించారు',
-'logentry-newusers-create' => '$1 ఒక వాడుకరి ఖాతాను సృష్టించారు',
-'logentry-newusers-create2' => '$1  వాడుకరి ఖాతా $3ను సృష్టించారు',
-'logentry-newusers-autocreate' => '$1 ఖాతాను ఆటోమెటిగ్గా సృష్టించారు',
+'logentry-move-move' => '$1, పేజీ $3 ను $4 కు {{GENDER:$2|తరలించారు}}',
+'logentry-move-move-noredirect' => '$1, పేజీ $3 ను $4 కు దారిమార్పు లేకుండా {{GENDER:$2|తరలించారు}}',
+'logentry-move-move_redir' => '$1, పేజీ $3 ను $4 కు దారిమార్పు ద్వారా {{GENDER:$2|తరలించారు}}',
+'logentry-move-move_redir-noredirect' => '$1, పేజీ $3 ను $4 కు దారిమార్పు ద్వారా దారిమార్పును ఉంచకుండా {{GENDER:$2|తరలించారు}}',
+'logentry-patrol-patrol' => '$1, పేజీ $3 యొక్క కూర్పు $4 ను పర్యవేక్షణలో ఉన్నట్లుగా {{GENDER:$2|గుర్తు పెట్టారు}}',
+'logentry-patrol-patrol-auto' => '$1, పేజీ $3 యొక్క కూర్పు $4 ను పర్యవేక్షణలో ఉన్నట్లుగా ఆటోమాటిగ్గా {{GENDER:$2|గుర్తు పెట్టారు}}',
+'logentry-newusers-newusers' => 'వాడుకరి ఖాతా $1 ను {{GENDER:$2|సృష్టించారు}}',
+'logentry-newusers-create' => 'వాడుకరి ఖాతా $1 ను {{GENDER:$2|సృష్టించారు}}',
+'logentry-newusers-create2' => '$1 వాడుకరి ఖాతా $3 ను {{GENDER:$2|సృష్టించారు}}',
+'logentry-newusers-byemail' => '$1 వాడుకరి ఖాతా $3 ను {{GENDER:$2|సృష్టించారు}}. సంకేతపదాన్ని ఈమెయిలులో పంపించాం',
+'logentry-newusers-autocreate' => 'వాడుకరి ఖాతా $1 ను ఆటోమేటిగ్గా {{GENDER:$2|సృష్టించారు}}',
+'logentry-rights-rights' => '$1, $3 యొక్క గుంపు సభ్యత్వాన్ని $4 నుండి $5 కు {{GENDER:$2|మార్చారు}}',
+'logentry-rights-rights-legacy' => '$1, $3 యొక్క గుంపు సభ్యత్వాన్ని {{GENDER:$2|మార్చారు}}',
+'logentry-rights-autopromote' => '$1, $4 నుండి $5 కు ఆటోమేటిగ్గా {{GENDER:$2|ప్రమోటు చెయ్యబడ్డారు}}',
 'rightsnone' => '(ఏమీలేవు)',
 
 # Feedback
+'feedback-bugornote' => 'ఏదైనా సాంకేతిక సమస్యను మీరు వివరించదలిస్తే [$1 లోపంపై ఫిర్యాదు చెయ్యండి].
+లేదంటే, కింద ఉన్న సులువైన ఫారాన్ని వాడండి. మీ వ్యాఖ్య మీ వాడుకరిపేరుతో సహా  "[$3 $2]" పేజీలో చేర్చబడుతుంది.',
 'feedback-subject' => 'విషయం:',
 'feedback-message' => 'సందేశం:',
 'feedback-cancel' => 'రద్దుచేయి',
 'feedback-submit' => 'ప్రతిస్పందనను దాఖలుచేయి',
+'feedback-adding' => 'ఫీడ్‍బ్యాకును పేజీలోకి చేరుస్తున్నాం...',
+'feedback-error1' => 'లోపం: API నుండి గుర్తుపట్టలేని ఫలితం',
 'feedback-error2' => 'దోషము: సవరణ విఫలమైంది',
+'feedback-error3' => 'లోపం: API నుండి ప్రతిస్పందన లేదు',
 'feedback-thanks' => 'కృతజ్ఞతలు! మీ ప్రతిస్పందనను “[$2 $1]” పేజీలో చేర్చాం.',
 'feedback-close' => 'పూర్తయ్యింది',
 'feedback-bugcheck' => 'అద్భుతం! ఇది ఇప్పటికే [$1 తెలిసిన బగ్గుల]లో లేదని సరిచూసుకోండి.',
@@ -3619,24 +3820,41 @@ $5
 
 # Search suggestions
 'searchsuggest-search' => 'వెతుకు',
+'searchsuggest-containing' => 'కలిగియున్న...',
 
 # API errors
 'api-error-badaccess-groups' => 'ఈ వికీ లోనికి దస్త్రాలను ఎక్కించే అనుమతి మీకు లేదు.',
+'api-error-badtoken' => 'అంతర్గత లోపం: చెడు టోకెన్.',
+'api-error-copyuploaddisabled' => 'URL ద్వారా ఎక్కించడం ఈ సర్వరులో అశక్తం చెయ్యబడింది.',
+'api-error-duplicate' => 'ఇదే విషయ పాఠ్యంతో ఈ సైటులో ఈసరికే {{PLURAL:$1|[$2 మరో ఫైలు] ఉంది|[$2 ఇతర ఫైళ్ళు] ఉన్నాయి}}.',
+'api-error-duplicate-archive' => 'ఇదే విషయ పాఠ్యంతో ఈ సైటులో ఈసరికే {{PLURAL:$1|[$2 మరో ఫైలు] ఉండేది|[$2 ఇతర ఫైళ్ళు] ఉండేవి}}. అయితే {{PLURAL:$1|అది తొలగించబడింది|అవి తొలగించబడ్డాయి}}.',
 'api-error-duplicate-archive-popup-title' => 'నకిలీ {{PLURAL:$1|దస్త్రాన్ని|దస్త్రాలను}} ఇప్పటికే తొలగించారు.',
 'api-error-duplicate-popup-title' => 'నకిలీ {{PLURAL:$1|దస్త్రం|దస్త్రాలు}}.',
 'api-error-empty-file' => 'మీరు దాఖలుచేసిన ఫైల్ ఖాళీది.',
 'api-error-emptypage' => 'కొత్త మరియు ఖాళీ పేజీలను సృష్టించడానికి అనుమతి లేదు.',
+'api-error-fetchfileerror' => 'అంతర్గత లోపం: ఈ ఫైలును తేవడంలో ఏదో తప్పు జరిగింది.',
+'api-error-fileexists-forbidden' => '"$1" పేరుతో ఓ ఫైలు ఈసరికే ఉంది. దాన్ని తిరగరాయడం కుదరదు.',
+'api-error-fileexists-shared-forbidden' => '"$1" పేరుతో ఓ ఫైలు ఈసరికే ఈ సహ ఫైలు ఖజానా (షేర్‍డ్ ఫైల్ రిపాజిటరీ)లో ఉంది. దాన్ని తిరగరాయడం కుదరదు.',
 'api-error-file-too-large' => 'మీరు సమర్పించిన దస్త్రం చాలా పెద్దగా ఉంది.',
 'api-error-filename-tooshort' => 'దస్త్రపు పేరు మరీ చిన్నగా ఉంది.',
 'api-error-filetype-banned' => 'ఈ రకపు దస్త్రాలని నిషేధించారు.',
-'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|అనేది అనుమతించబడిన ఫైలు రకం కాదు|అనేవి అనుమతించబడిన ఫైలు రకాలు కాదు}}. అనుమతించబడిన {{PLURAL:$3|ఫైలు రకం|ఫైలు రకాలు}} $2.',
+'api-error-filetype-banned-type' => '$1, అనుమతించబడిన {{PLURAL:$4|ఫైలు రకం కాదు|ఫైలు రకాలు కాదు}}. అనుమతించబడిన {{PLURAL:$3|ఫైలు రకం|ఫైలు రకాలు}}: $2.',
+'api-error-filetype-missing' => 'ఫైలుపేరులో ఓ ఎక్స్టెన్షను లేదు.',
+'api-error-hookaborted' => 'మీరు చేయ ప్రయత్నించిన మార్పును ఓ పొడిగింత అడ్డుకుంది.',
 'api-error-http' => 'అంతర్గత దోషము: సేవకానికి అనుసంధానమవలేకపోతున్నది.',
 'api-error-illegal-filename' => 'ఆ పైల్ పేరు అనుమతించబడదు.',
+'api-error-internal-error' => 'అంతర్గత లోపం: ఈ వికీలో మీ ఎక్కింపును ప్రాసెసు చెయ్యడంలో ఎదో తప్పు జరిగింది.',
 'api-error-invalid-file-key' => 'అంతర్గత దోషము: తాత్కాలిక నిల్వలో ఫైల్ కనపడలేదు.',
+'api-error-missingparam' => 'అంతర్గత దోషం: అభ్యర్ధనలో పరామితులు అన్నీ లేవు.',
 'api-error-mustbeloggedin' => 'దస్త్రాలను ఎక్కించడానికి మీరు ప్రవేశించివుండాలి.',
+'api-error-noimageinfo' => 'ఎక్కింపు జయప్రదమైంది. కానీ సర్వరు, ఆ ఫైలు గురించిన సమాచారమేమీ ఇవ్వలేదు.',
 'api-error-nomodule' => 'అంతర్గత దోషము: ఎక్కింపు పర్వికము అమర్చబడలేదు.',
 'api-error-ok-but-empty' => 'అంతర్గత దోషము: సేవకము నుండి ఎటువంటి స్పందనా లేదు.',
+'api-error-overwrite' => 'ఈసరికే ఉన్న ఫైలును తిరగరాయడానికి అనుమతి లేదు.',
 'api-error-stashfailed' => 'అంతర్గత పొరపాటు: తాత్కాలిక దస్త్రాన్ని భద్రపరచడంలో సేవకి విఫలమైంది.',
+'api-error-publishfailed' => 'అంతర్గత లోపం: తాత్కాలిక ఫైలును ప్రచురించడంలో సర్వరు విఫలమైంది.',
+'api-error-stasherror' => 'ఫైలును ఖాజానాకు ఎక్కించడంలో లోపం దొర్లింది.',
+'api-error-timeout' => 'సర్వరు ఆశించిన సమయం లోపు స్పందించలేదు.',
 'api-error-unclassified' => 'ఒక తెలియని దోషము సంభవించినది',
 'api-error-unknown-code' => 'తెలియని పొరపాటు: "$1".',
 'api-error-unknown-error' => 'అంతర్గత పొరపాటు: మీ దస్త్రాన్ని ఎక్కించేప్పుడు ఏదో పొరపాటు జరిగింది.',
@@ -3656,9 +3874,15 @@ $5
 'duration-centuries' => '$1 {{PLURAL:$1|శతాబ్దం|శతాబ్దాలు}}',
 'duration-millennia' => '$1 {{PLURAL:$1|సహస్రాబ్దం|సహస్రాబ్దాలు}}',
 
+# Image rotation
+'rotate-comment' => 'బొమ్మ సవ్యదిశలో $1 {{PLURAL:$1|డిగ్రీ|డిగ్రీలు}} తిప్పబడింది',
+
 # Limit report
+'limitreport-cputime' => 'CPU సమయం వినియోగం',
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|క్షణం|క్షణాలు}}',
+'limitreport-walltime' => 'నిజ సమయం వినియోగం',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|క్షణం|క్షణాలు}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|బైట్|బైట్లు}}',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|బైటు|బైట్లు}}',
 
 # Special:ExpandTemplates
@@ -3668,9 +3892,14 @@ $5
 'expand_templates_input' => 'విస్తరించవలసిన పాఠ్యం:',
 'expand_templates_output' => 'ఫలితం',
 'expand_templates_xml_output' => 'XML ఔట్&zwnj;పుట్',
+'expand_templates_html_output' => 'ముడి HTML ఔట్‍పుట్',
 'expand_templates_ok' => 'సరే',
 'expand_templates_remove_comments' => 'వ్యాఖ్యలను తొలగించు',
+'expand_templates_remove_nowiki' => 'ఫలితంలో <nowiki> ట్యాగులను అణచిపెట్టు',
 'expand_templates_generate_xml' => 'XML పార్స్ ట్రీని చూపించు',
+'expand_templates_generate_rawhtml' => 'ముడి HTML ను చూపించు',
 'expand_templates_preview' => 'మునుజూపు',
 
+# Unknown messages
+'uploadinvalidxml' => 'ఎక్కించిన ఫైలులోని XML ను పార్సు చెయ్యలేకపోయాం.',
 );
index 1c55f47..4ad46ab 100644 (file)
@@ -74,7 +74,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Subliña ligasaun sira:',
-'tog-justify' => 'Justifika parágrafu sira',
 'tog-hideminor' => "Lá'os hatudu muda ki-ki'ik iha mudansa foufoun sira",
 'tog-usenewrc' => 'Iha lista "mudansa foufoun sira" no "lista hateke": Hatudu mudansa iha grupu sira - grupu ida ba pájina ida (presiza JavaScript)',
 'tog-showtoolbar' => 'Hatudu kaixa edita (presiza JavaScript)',
index cfe3fbb..70773de 100644 (file)
@@ -72,7 +72,6 @@ $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхчшъэюя
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Зерпайвандҳо хат кашида шаванд:',
-'tog-justify' => 'Тамомченкардани бандҳо',
 'tog-hideminor' => 'Нишон надодани тағйироти ҷузъи дар феҳристи тағйироти охир',
 'tog-hidepatrolled' => 'Пинҳон кардани вироишҳои гаштхӯрда дар тағйироти охир',
 'tog-newpageshidepatrolled' => 'Пинҳони саҳифаҳои гаштхӯрда аз феҳристи саҳифаҳои нав',
@@ -816,7 +815,6 @@ $1',
 'lineno' => 'Сатри $1:',
 'compareselectedversions' => 'Нусхаҳои интихобшударо муқоиса кунед',
 'editundo' => 'ботил',
-'diff-multi' => '({{PLURAL:$1|як|$1}} вироиш миёнӣ тавассути {{PLURAL:$2|як|$2}} корбар нишон дода нашудааст)',
 
 # Search results
 'searchresults' => 'Натиҷаҳои ҷустуҷӯ',
index 6b3af02..de5f959 100644 (file)
@@ -14,7 +14,6 @@
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Zerpajvandho xat kaşida şavand:',
-'tog-justify' => 'Tamomcenkardani bandho',
 'tog-hideminor' => "Nişon nadodani taƣjiroti çuz'i dar fehristi taƣjiroti oxir",
 'tog-hidepatrolled' => 'Pinhon kardani viroişhoi gaştxūrda dar taƣjiroti oxir',
 'tog-newpageshidepatrolled' => 'Pinhoni sahifahoi gaştxūrda az fehristi sahifahoi nav',
@@ -23,9 +22,7 @@ $messages = array(
 'tog-numberheadings' => 'şumoraguzori~i xudkori invonho',
 'tog-showtoolbar' => 'Namoişi navori abzori viroiş (JavaScript)',
 'tog-editondblclick' => 'Viroiş namudani sahifaho hangomi du karat paxş namudani tugmai muşak (JavaScript)',
-'tog-editsection' => 'Içozat dodani viroişi qismati sahifa ba vositai pajvandi [viroiş]',
 'tog-editsectiononrightclick' => 'Ba kor andoxtani viroişi sarlavhahoi qismatho bo kliki rost (ÇavaSkript)',
-'tog-showtoc' => 'Namoişi fehristi mundariçon (baroi maqolahoi bo beş az 3 sarlavha)',
 'tog-rememberpassword' => 'Vurudi manro dar in mururgar dar xotir nigoh dor (haddi aksar to $1 {{PLURAL:$1|rūz|rūz}})',
 'tog-watchcreations' => 'Doxil namudani sahifahoe, ki man soxtaam ba fehristi nazaroti man',
 'tog-watchdefault' => 'Sahifahoi eçodkardaamro ba fehristi pajgiriam ilova kuned',
@@ -669,7 +666,6 @@ Itminon hosil kuned, ki in taƣjir davomnokiji ta'rixiji sahifaro nigoh dorad.",
 'lineno' => 'Satri $1:',
 'compareselectedversions' => 'Nusxahoi intixobşudaro muqoisa kuned',
 'editundo' => 'botil',
-'diff-multi' => '({{PLURAL:$1|viroişi mijonī|$1 viroişoti mijonī}} nişon doda naşudaast.)',
 
 # Search results
 'searchresults' => 'Natiçahoi çustuçū',
@@ -1228,7 +1224,6 @@ Agar şumo dertar az fehristi nazarotaton in sahifaro hazv kardan xohed, dar men
 'watchmethod-list' => 'barrasiji sahifahoi pajgirişuda baroi viroişhoi oxir',
 'watchlistcontains' => 'Fehristi pajgirihoi şumo $1 {{PLURAL:$1|sahifaro|sahifahoro}} dar bar megirad.',
 'iteminvalidname' => "Muşkilī bo mavridi '$1', nomi nomū'tabar ast...",
-'wlnote' => "Dar zer {{PLURAL:$1|oxirin taƣjir|'''$1''' oxirin taƣjirot}} dar $2 soati oxir {{PLURAL:omadaast|omadaand}}.",
 'wlshowlast' => 'Namoişi oxirin $1 soat $2 rūzho $3',
 'watchlist-options' => 'Ixtijoroti fehristi pajgiriho',
 
@@ -1650,7 +1645,6 @@ Pas onro ba kompjuteraton zaxira karda inço borguzorī kuned.",
 'tooltip-pt-watchlist' => 'Rūjxati sahifahoe, ki taƣjirothojaşonro Şumo nazorat mekuned',
 'tooltip-pt-mycontris' => 'Fehristi hissaguzorihoi şumo',
 'tooltip-pt-login' => 'Tavsija meşavad ki ba sistem vorid şavad, lekin içborī nest.',
-'tooltip-pt-anonlogin' => 'Ba şumo tavzeh meşavad, ki ba sistem vorid şaved, lekin in içborī nest.',
 'tooltip-pt-logout' => 'Xuruç az sistem',
 'tooltip-ca-talk' => 'Bahsi matni tarkibiji in sahifa',
 'tooltip-ca-edit' => 'Şumo in sahifaro viroiş karda metavoned. Peş az zaxira kardani sahifa peşnamoişro istifoda bared.',
index 9d280da..8b805f8 100644 (file)
@@ -197,7 +197,6 @@ $linkTrail = '/^([a-z]+)(.*)$/sD';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'การขีดเส้นใต้ลิงก์:',
-'tog-justify' => 'จัดย่อหน้าชิดขอบ',
 'tog-hideminor' => 'ซ่อนการแก้ไขเล็กน้อยในหน้าปรับปรุงล่าสุด',
 'tog-hidepatrolled' => 'ซ่อนการแก้ไขที่ตรวจแล้วในหน้าปรับปรุงล่าสุด',
 'tog-newpageshidepatrolled' => 'ซ่อนหน้าที่ตรวจแล้วจากรายการหน้าใหม่',
@@ -520,6 +519,12 @@ $1',
 # General errors
 'error' => 'ผิดพลาด',
 'databaseerror' => 'ผิดพลาดที่ฐานข้อมูล',
+'databaseerror-text' => 'เกิดความผิดพลาดข้อคำถามของฐานข้อมูล
+ซึ่งอาจบ่งชี้ว่ามีจุดบกพร่องในซอฟต์แวร์',
+'databaseerror-textcl' => 'เกิดความผิดพลาดข้อคำถามของฐานข้อมูล',
+'databaseerror-query' => 'ข้อคำถาม: $1',
+'databaseerror-function' => 'ฟังก์ชัน: $1',
+'databaseerror-error' => 'ความผิดพลาด: $1',
 'laggedslavemode' => "'''คำเตือน:''' ข้อมูลในหน้าอาจไม่ใช่ข้อมูลล่าสุด",
 'readonly' => 'ฐานข้อมูลถูกล็อก',
 'enterlockreason' => 'ใส่เหตุแห่งการล็อก ทั้งเวลาที่คาดว่าจะปลดล็อก',
@@ -737,6 +742,8 @@ $1',
 'retypenew' => 'พิมพ์รหัสผ่านใหม่อีกครั้ง:',
 'resetpass_submit' => 'ตั้งรหัสผ่านและล็อกอิน',
 'changepassword-success' => 'เปลี่ยนรหัสผ่านของคุณเรียบร้อย',
+'changepassword-throttled' => 'คุณได้พยายามล็อกอินมากครั้งเกินไป
+กรุณารอ $1 ก่อนลองอีกครั้ง',
 'resetpass_forbidden' => 'ไม่สามารถเปลี่ยนรหัสผ่านได้',
 'resetpass-no-info' => 'คุณต้องล็อกอินเพื่อเข้าถึงหน้านี้โดยตรง',
 'resetpass-submit-loggedin' => 'เปลี่ยนรหัสผ่าน',
@@ -788,6 +795,8 @@ $2
 'changeemail-password' => 'รหัสผ่าน {{SITENAME}} ของคุณ:',
 'changeemail-submit' => 'เปลี่ยนอีเมล',
 'changeemail-cancel' => 'ยกเลิก',
+'changeemail-throttled' => 'คุณได้พยายามล็อกอินหลายครั้งเกินไป
+กรุณารอ $1 ก่อนลองอีกครั้ง',
 
 # Special:ResetTokens
 'resettokens' => 'ตั้งโทเค็นใหม่',
@@ -999,8 +1008,9 @@ $2
 'defaultmessagetext' => 'ข้อความสารโดยปริยาย',
 'invalid-content-data' => 'ข้อมูลเนื้อหาไม่ถูกต้อง',
 'content-not-allowed-here' => 'เนื้อหา "$1" ไม่อนุญาตในหน้า [[$2]]',
-'editwarning-warning' => 'การออกจากหน้านี้อาจทำให้ความเปลี่ยนแปลงที่คุณกระทำสูญหาย
-ถ้าคุณล็อกอินแล้ว คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน "การแก้ไข" ในการตั้งค่าของคุณ',
+'editwarning-warning' => 'การออกจากหน้านี้อาจทำให้ความเปลี่ยนแปลงที่คุณดำเนินการสูญหาย
+ถ้าคุณล็อกอินแล้ว คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน "{{int:prefs-editing}}" ในการตั้งค่าของคุณ',
+'editpage-notsupportedcontentformat-title' => 'รูปแบบเนื้อหาไม่ได้รับการรองรับ',
 
 # Content models
 'content-model-wikitext' => 'ข้อความวิกิ',
@@ -1026,6 +1036,7 @@ $2
 'undo-success' => 'การแก้ไขนี้สามารถย้อนกลับได้ กรุณาตรวจสอบข้อแตกต่างด้านล่างให้แน่ใจว่านี่คือสิ่งที่คุณต้องการทำ จากนั้นให้บันทึกการเปลี่ยนแปลงด้านล่างเพื่อเสร็จสิ้นขั้นตอน',
 'undo-failure' => 'การแก้ไขนี้ไม่สามารถย้อนกลับได้ เนื่องจากขัดแย้งกับการแก้ไขปัจจุบัน',
 'undo-norev' => 'ไม่สามารถย้อนการแก้ไขนี้ เพราะไม่มีหรือถูกลบไปแล้ว',
+'undo-nochange' => 'ดูเหมือนว่าการแก้ไขดังกล่าวถูกย้อนแล้ว',
 'undo-summary' => 'ย้อนการแก้ไขรุ่น $1 โดย [[Special:Contributions/$2|$2]] ([[User talk:$2|พูดคุย]])',
 'undo-summary-username-hidden' => 'ย้อนรุ่น $1 โดยผู้ใช้ไม่ระบุชื่อ',
 
@@ -1205,8 +1216,9 @@ $1",
 'showhideselectedversions' => 'แสดง/ซ่อนรุ่นที่เลือก',
 'editundo' => 'ย้อน',
 'diff-empty' => '(ไม่แตกต่าง)',
-'diff-multi' => '(มิได้แสดง $1 รุ่นระหว่างกลางโดย{{PLURAL:$2|ผู้ใช้คนหนึ่ง|ผู้ใช้ $2 คน}})',
-'diff-multi-manyusers' => 'การแก้ไข $1 รายการระหว่างกลางโดยผู้ใช้มากกว่า $2 คนไม่แสดงผล)',
+'diff-multi-sameuser' => '(มิได้แสดง $1 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน)',
+'diff-multi-otherusers' => '(มิได้แสดง $1 รุ่นระหว่างกลางโดยผู้ใช้ $2 คน)',
+'diff-multi-manyusers' => '(มิได้แสดง $1 รุ่นระหว่างกลางโดยผู้ใช้กว่า $2 คน)',
 'difference-missing-revision' => 'ไม่พบรุ่น{{PLURAL:$2|รุ่น| $2 รุ่น}}ของผลต่างนี้ ($1)
 
 โดยปกติเกิดจากการเข้าลิงก์ผลต่างของหน้าที่ถูกลบไปแล้ว 
@@ -1226,7 +1238,7 @@ $1",
 'shown-title' => 'แสดง $1 ผลลัพธ์ต่อหน้า',
 'viewprevnext' => 'ดู ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''มีหน้าชื่อ \"[[:\$1]]\" บนวิกินี้'''",
-'searchmenu-new' => "'''สร้างหน้า \"[[:\$1]]\" บนวิกินี้'''",
+'searchmenu-new' => '<strong>สร้างหน้า "[[:$1]]" บนวิกินี้!</strong> {{PLURAL:$2|0=|ดูหน้าที่พบด้วยการค้นหาของคุณ|ดูผลการค้นหาที่พบเพิ่มเติม}}',
 'searchprofile-articles' => 'หน้าเนื้อหา',
 'searchprofile-project' => 'คำอธิบายและหน้าโครงการ',
 'searchprofile-images' => 'มัลติมีเดีย',
@@ -1251,6 +1263,7 @@ $1",
 'searchrelated' => 'สัมพันธ์',
 'searchall' => 'ทั้งหมด',
 'showingresults' => "แสดง $1 รายการ เริ่มตั้งแต่รายการที่ '''$2'''",
+'showingresultsinrange' => 'ด้านล่างแสดงผลมากสุด {{PLURAL:$1|<strong>1</strong>|<strong>$1</strong>}} ในพิสัย #<strong>$2</strong> ถึง #<strong>$3</strong>',
 'showingresultsnum' => "แสดง $3 รายการ เริ่มตั้งแต่รายการที่  '''$2'''",
 'showingresultsheader' => "{{PLURAL:$5|ผลการค้นหา '''$1''' จาก '''$3'''|ผลการค้นหา '''$1 - $2''' จาก '''$3'''}} สำหรับ '''$4'''",
 'search-nonefound' => 'ไม่มีผลลัพธ์ตรงกับคำค้น',
@@ -2020,6 +2033,7 @@ $1',
 'protectedpages' => 'หน้าที่ถูกล็อก',
 'protectedpages-indef' => 'การล็อกแบบไม่มีกำหนดเท่านั้น',
 'protectedpages-cascade' => 'การล็อกแบบสืบทอดเท่านั้น',
+'protectedpages-noredirect' => 'ซ่อนการเปลี่ยนทาง',
 'protectedpagesempty' => 'ขณะนี้ไม่มีหน้าใดถูกล็อกตามพารามิเตอร์เหล่านี้',
 'protectedtitles' => 'ชื่อเรื่องที่ถูกป้องกัน',
 'protectedtitlesempty' => 'ปัจจุบันไม่มีหัวเรื่องที่ได้รับการป้องกันด้วยพารามิเตอร์เหล่านี้',
@@ -2205,6 +2219,7 @@ $1',
 'watchmethod-list' => 'ตรวจสอบหน้าเฝ้าดูกับการแก้ไขล่าสุด',
 'watchlistcontains' => 'รายการเฝ้าดูของคุณมี $1 หน้า',
 'iteminvalidname' => "เกิดปัญหากับรายการ '$1' ชื่อไม่ถูกต้อง...",
+'wlnote2' => 'ด้านล่างเป็นการเปลี่ยนแปลงล่าสุดในช่วง <strong>$1</strong> ชั่วโมงล่าสุด จนถึงวันที่ $2 เวลา $3 น.',
 'wlshowlast' => 'แสดง $1 ชั่วโมง $2 วันล่าสุด $3',
 'watchlist-options' => 'ตัวเลือกรายการเฝ้าดู',
 
@@ -2290,6 +2305,7 @@ $UNWATCHURL
 'delete-edit-reasonlist' => 'แก้ไขเหตุผลการลบ',
 'delete-toobig' => 'หน้านี้มีประวัติการแก้ไขนาดใหญ่ คือ กว่า $1 รุ่น การลบหน้าเช่นนี้ถูกจำกัดเพื่อป้องกันการรบกวน{{SITENAME}}โดยบังเอิญ',
 'delete-warning-toobig' => 'หน้านี้มีประวัติการแก้ไขขนาดใหญ่ กว่า $1 รุ่น การลบหน้านี้อาจรบกวนการทำงานของฐานข้อมูลของ {{SITENAME}} โปรดดำเนินการด้วยความระมัดระวัง',
+'deleting-backlinks-warning' => "'''คำเตือน:''' หน้าอื่นเชื่อมโยงมายังหรือดึงข้อมูลจากหน้าที่คุณกำลังลบ",
 
 # Rollback
 'rollback' => 'ย้อนการแก้ไขกลับฉุกเฉิน',
@@ -2566,7 +2582,7 @@ $1',
 'change-blocklink' => 'เปลี่ยนการบล็อก',
 'contribslink' => 'เรื่องที่เขียน',
 'emaillink' => 'ส่งอีเมล',
-'autoblocker' => 'à¹\84à¸\94à¹\89à¸\9aลà¹\87อà¸\81อัà¸\95à¹\82à¸\99มัà¸\95ิà¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\82อà¸\87à¸\84ุà¸\93à¹\83à¸\8aà¹\89à¹\82à¸\94ย "[[User:$1|$1]]" เมื่อเร็ว ๆ นี้
+'autoblocker' => 'à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81อัà¸\95à¹\82à¸\99มัà¸\95ิà¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81 "[[User:$1|$1]]" à¹\83à¸\8aà¹\89à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\82อà¸\87à¸\84ุà¸\93เมื่อเร็ว ๆ นี้
 เหตุผลที่ให้แก่การบล็อก $1 คือ: "$2"',
 'blocklogpage' => 'ปูมการบล็อก',
 'blocklog-showlog' => 'ผู้ใช้นี้ถูกสกัดกั้นมาก่อน
@@ -2589,7 +2605,7 @@ $1',
 'range_block_disabled' => 'การบล็อกช่วงไอพีของผู้ดูแลระบบถูกปิดการใช้งาน',
 'ipb_expiry_invalid' => 'วันหมดอายุไม่ถูกต้อง',
 'ipb_expiry_temp' => 'การบล็อกชื่อผู้ใช้ที่ซ่อนต้องเป็นการบล็อกถาวร',
-'ipb_hide_invalid' => 'à¹\84มà¹\88สามารà¸\96ยัà¸\9aยัà¹\89à¸\87à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ีà¹\89à¹\84à¸\94à¹\89 à¸­à¸²à¸\88à¹\80à¸\9eราะมีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82มาà¸\81à¹\80à¸\81ิà¸\99à¹\84à¸\9b',
+'ipb_hide_invalid' => 'à¹\84มà¹\88สามารà¸\96ยัà¸\9aยัà¹\89à¸\87à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ีà¹\89à¹\84à¸\94à¹\89 à¸­à¸²à¸\88à¹\80à¸\9eราะมีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82มาà¸\81à¸\81วà¹\88า $1 à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82',
 'ipb_already_blocked' => '"$1" ถูกบล็อกไปแล้วก่อนหน้านี้',
 'ipb-needreblock' => '$1 ถูกบล็อกแล้ว คุณต้องการเปลี่ยนการตั้งค่าหรือไม่',
 'ipb-otherblocks-header' => '{{PLURAL:$1|การบล็อก}}อื่น ๆ',
@@ -2752,6 +2768,7 @@ $1',
 'allmessages-prefix' => 'กรองด้วยคำขึ้นต้น:',
 'allmessages-language' => 'ภาษา:',
 'allmessages-filter-submit' => 'ไป',
+'allmessages-filter-translate' => 'การแปล',
 
 # Thumbnails
 'thumbnail-more' => 'ขยาย',
@@ -3412,7 +3429,7 @@ $1',
 'confirmemail_pending' => 'รหัสยืนยันได้ส่งไปยังอีเมลของคุณแล้ว 
 ถ้าคุณเพิ่งสร้างบัญชี คุณอาจต้องรอสักครู่ให้รหัสส่งไปถึงที่อยู่อีเมลคุณ แทนที่จะขอรหัสยืนยันใหม่ทันที',
 'confirmemail_send' => 'ส่งรหัสยืนยันทางอีเมล',
-'confirmemail_sent' => 'ส่งอีเมลยืนยันแล้ว',
+'confirmemail_sent' => 'สà¹\88à¸\87อีà¹\80มลสำหรัà¸\9aà¸\81ารยืà¸\99ยัà¸\99à¹\81ลà¹\89ว',
 'confirmemail_oncreate' => 'รหัสยืนยันถูกส่งไปยังที่อยู่อีเมลของคุณ
 รหัสนี้ไม่กำหนดให้ต้องล็อกอิน แต่คุณต้องระบุรหัสก่อนเปิดใช้งานคุณลักษณะที่อาศัยอีเมลทั้งหมดในวิกินี้',
 'confirmemail_sendfailed' => '{{SITENAME}}ไม่สามารถส่งอีเมลยืนยันได้
@@ -3598,7 +3615,7 @@ $5
 'version-hook-name' => 'ชื่อฮุก',
 'version-hook-subscribedby' => 'สนับสนุนโดย',
 'version-version' => '(รุ่น $1)',
-'version-license' => 'สัญญาอนุญาต',
+'version-license' => 'สัญญาอนุญาตมีเดียวิกิ',
 'version-poweredby-credits' => "วิกินี้จัดทำโดย '''[https://www.mediawiki.org/ MediaWiki]''', สงวนลิขสิทธิ์ © 2001-$1 โดย $2",
 'version-poweredby-others' => 'ผู้อื่น',
 'version-poweredby-translators' => 'ผู้แปล translatewiki.net',
index 1125b99..e3a4205 100644 (file)
@@ -40,7 +40,6 @@ $linkTrail = '/^([a-zÄäÇçĞğŇňÖöŞşÜüÝýŽž]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Çykgytlaryň aşagyny çyz:',
-'tog-justify' => 'Teksti iki ýaňa deňle',
 'tog-hideminor' => '"Soňky üýtgeşmeler" sahypasynda ujypsyzja özgerdişleri gizle',
 'tog-hidepatrolled' => '"Soňky üýtgeşmeler" sahypasynda patrullyk edilen özgerdişleri gizle',
 'tog-newpageshidepatrolled' => 'Patrullyk edilen sahypalary täze sahypalaryň sanawynda gizle',
@@ -914,7 +913,6 @@ Nawigasiýa çykgytlaryny ulanmaklygyň bu sütüni başky ýagdaýyna getirjekd
 'compareselectedversions' => 'Saýlanan wersiýalary deňeşdir',
 'showhideselectedversions' => 'Saýlanan wersiýalary görkez/gizle',
 'editundo' => 'yzyna al',
-'diff-multi' => '({{PLURAL:$2|Bir ulanyjy|$2 ulanyjy}} tarapyndan edilen {{PLURAL:$1|aralyk wersiýa|$1 sany aralyk wersiýa}} görkezilmeýär)',
 'diff-multi-manyusers' => '($2 ulanyjydan köp {{PLURAL:$2|ulanyjy|ulanyjy}} tarapyndan edilen {{PLURAL:$1|aralyk wersiýa|$1 sany aralyk wersiýa}} görkezilmeýär)',
 
 # Search results
@@ -1792,7 +1790,6 @@ Aňsatlyk bilen saýlap almak üçin bolsa, [[Special:RecentChanges|soňky üýt
 'watchmethod-list' => 'gözegçilikde saklaýan sahypalaryňyzdaky soňky özgerdişler barlanylýar',
 'watchlistcontains' => 'Gözegçilik sanawyňyzda $1 sany {{PLURAL:$1|sahypa|sahypa}} bar.',
 'iteminvalidname' => "'$1' elementinde problema bar, nädogry at...",
-'wlnote' => "Aşakda soňky {{PLURAL:$2|bir sagatda|'''$2''' sagatda}} edilen {{PLURAL:$1|soňky üýtgeşme|soňky '''$1''' üýtgeşme}} görkezilýär.",
 'wlshowlast' => 'Soňky $1 sagady $2 güni görkez $3',
 'watchlist-options' => 'Gözegçilik sanawynyň opsiýalary',
 
@@ -2360,7 +2357,6 @@ Kompýuteriňize ýazdyryň we şu ýere ýükläň.',
 'tooltip-pt-watchlist' => 'Gözegçilikde saklaýan sahypalarym',
 'tooltip-pt-mycontris' => 'Eden goşantlaryňyzyň sanawy',
 'tooltip-pt-login' => 'Hasaba girmegiňiz maslahat berilýär, ýöne hökmany däl.',
-'tooltip-pt-anonlogin' => 'Sessiýa açmagyňyz maslahat berilýär, yöne hökmany däl',
 'tooltip-pt-logout' => 'Hasapdan çyk',
 'tooltip-ca-talk' => 'Sahypanyň mazmuny barada garaýşyňy beýan et',
 'tooltip-ca-edit' => 'Bu sahypany redaktirläp bilersiňiz. Ýazdyrmankaňyz synlap görmekligi ýatdan çykarmaň.',
index 9ff45b2..acabe3d 100644 (file)
@@ -11,6 +11,7 @@
  * @author Aze
  * @author Dosmiin Barsbold
  * @author Felipe Aira
+ * @author Jewel457
  * @author Jojit fb
  * @author Kaganer
  * @author Namayan
@@ -149,7 +150,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Pagsasalungguhit ng kawing:',
-'tog-justify' => 'Pantayin ang mga talata',
 'tog-hideminor' => 'Itago ang mga maliliit na pagbabago sa mga huling binago',
 'tog-hidepatrolled' => 'Ikubli ang napatrolyang mga pagbabagong nasa kamakailang mga pagbabago',
 'tog-newpageshidepatrolled' => 'Itago ang napatrolyang mga pahina mula talaan ng bagong pahina',
@@ -572,7 +572,7 @@ Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SIT
 'createacct-yourpasswordagain-ph' => 'Muling ilagay ang hudyat',
 'remembermypassword' => 'Tandaan ang paglagda ko sa kompyuter na ito (pinakamarami na ang $1 {{PLURAL:$1|araw|mga araw}})',
 'userlogin-remembermypassword' => 'Panatilihin akong nakalagda',
-'userlogin-signwithsecure' => 'Gumamit ng wastong koneksyon',
+'userlogin-signwithsecure' => 'Gumamit ng ligtas na koneksyon',
 'yourdomainname' => 'Dominyo mo:',
 'password-change-forbidden' => 'Hindi mo maaaring palitan ang mga hudyat sa wiking ito.',
 'externaldberror' => 'Maaaring may kamalian sa pagpapatotoo ng kalipunan ng mga dato o kaya hindi ka pinahintulutang isapanahon ng iyong panlabas na kuwenta o patnugutan.',
@@ -592,18 +592,18 @@ Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SIT
 'gotaccount' => 'May kuwenta ka na ba? $1.',
 'gotaccountlink' => 'Lumagda',
 'userlogin-resetlink' => 'Nakalimutan mo ang iyong mga detalyeng panglagda?',
-'userlogin-resetpassword-link' => 'Nakalimutan ang hudyat?',
-'userlogin-createanother' => 'Lumikha ng isang akawnt',
-'createacct-join' => 'Ilagay ang iyong impormasyon sa baba.',
-'createacct-another-join' => 'Ilagay ang impormasyon ng bagong akawnt sa baba.',
+'userlogin-resetpassword-link' => 'Nakalimutan ba ang iyong hudyat?',
+'userlogin-createanother' => 'Lumikha ng iba pang akawnt',
+'createacct-join' => 'Ilagay ang iyong impormasyon sa ibaba.',
+'createacct-another-join' => 'Ilagay ang impormasyon ng bagong akawnt sa ibaba.',
 'createacct-emailrequired' => 'Direksiyong e-liham:',
 'createaccountmail' => 'Gumamit ng pansamantalang walang-piling hudyat at ipadala ito sa direksiyong e-liham na nakasaad sa ibaba',
 'createacct-realname' => 'Tunay na pangalan (maaaring wala)',
 'createaccountreason' => 'Dahilan:',
 'createacct-reason' => 'Dahilan',
 'createacct-reason-ph' => 'Bakit ka gagawa ng isa pang akawnt?',
-'createacct-imgcaptcha-ph' => 'Ilagay ang tekstong makikita sa taas.',
-'createacct-benefit-heading' => '{{SITENAME}} ay linikha ng mga taong tulad mo.',
+'createacct-imgcaptcha-ph' => 'Ilagay ang tekstong makikita sa itaas.',
+'createacct-benefit-heading' => '{{SITENAME}} ay nilikha ng mga taong iyong katulad.',
 'badretype' => 'Hindi magkatugma ang ipinasok mong mga hudyat.',
 'userexists' => 'May gumagamit na ng ipinasok na bansag.
 Pumili po ng ibang pangalan.',
@@ -637,7 +637,7 @@ Pakisubok muli.',
 'passwordtooshort' => 'Ang mga hudyat ay dapat mayroong {{PLURAL:$1|1 panitik|$1 panitik}} (karakter).',
 'password-name-match' => 'Dapat magkaiba ang hudyat mo sa bansag mo.',
 'password-login-forbidden' => 'Ipinagbabawal ang paggamit ng ganitong pangalan ng tagagamit at hudyat.',
-'mailmypassword' => 'Muling itakda ang hudyat',
+'mailmypassword' => 'Baguhin ang hudyat',
 'passwordremindertitle' => 'Bagong pansamantalang hudyat para sa {{SITENAME}}',
 'passwordremindertext' => 'Mayroong (na maaaring ikaw, mula sa adres ng IP na $1) humiling ng isang bagong
 hudyat para sa {{SITENAME}} ($4). Isang pansamantalang hudyat ang nilikha
@@ -1164,7 +1164,6 @@ Tiyakin na ang pagbabago ay makapagpapanatili ng pagkakatuluy-tuloy ng pahinang
 'compareselectedversions' => 'Paghambingin ang mga napiling bersyon',
 'showhideselectedversions' => 'Ipakita/itago ang napiling mga bersyon',
 'editundo' => 'ibalik',
-'diff-multi' => '({{PLURAL:$1|Isang panggitnang pagbabago|$1 panggitnang mga pagbabago}} ng {{PLURAL:$2|isang tagagamit|$2 mga tagagamit}} ang hindi ipinakikita.)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Isang panggitnang pagbabago|$1 panggitnang mga pagbabago}} ng {{PLURAL:$2|isang tagagamit|$2 mga tagagamit}} ang hindi ipinapakikita.)',
 'difference-missing-revision' => 'Hindi natagpuan ang {{PLURAL:$2|isang rebisyon|$2 mga rebisyon}} ng kaibahang ($1) ito.
 
@@ -1247,7 +1246,7 @@ Matatagpuan ang mga detalye sa loob ng [{{fullurl:{{#Special:Log}}/delete|page={
 'prefs-setemail' => 'Magtakda ng direksiyong e-liham',
 'prefs-email' => 'Mga pagpipilian para sa e-liham',
 'prefs-rendering' => 'Hitsura',
-'saveprefs' => 'Sagipin',
+'saveprefs' => 'Itala',
 'restoreprefs' => 'Ibalik ang lahat ng likas na mga pagtatakda',
 'prefs-editing' => 'May binabago',
 'rows' => 'Mga pahalang na hanay:',
@@ -2173,7 +2172,7 @@ Makikita doon ang lahat ng mga susunod na pagbabago sa pahinang ito pati na ang
 'watchmethod-list' => 'sinusuri ang binabantayang mga pahina para sa mga kamakailan lamang na mga pagbabago',
 'watchlistcontains' => 'Naglalaman ng $1 {{PLURAL:$1|pahina|mga pahina}} ang iyong talaan ng mga binabantayan.',
 'iteminvalidname' => "May suliranin ang bagay na '$1', hindi tanggap na pangalan...",
-'wlnote' => "Nasa ibaba ang {{PLURAL:$1|pinakahuling pagbabago|pinakahuling '''$1''' mga pagbabago}} sa loob ng huling {{PLURAL:$2|oras|'''$2''' mga oras}}, magmula noong $3 sa ganap na ika-$4.",
+'wlnote2' => 'Nasa ibaba ang mga pagbabago sa nakaraang {{PLURAL:$1|oras|<strong>$1',
 'wlshowlast' => 'Ipakita ang huling $1 mga oras $2 mga araw $3',
 'watchlist-options' => 'Mga pagpipilian para sa talaan ng mga binabantayan',
 
@@ -2721,6 +2720,7 @@ Pakidalaw ang [https://www.mediawiki.org/wiki/Localisation Lokalisasyong MediaWi
 'allmessages-prefix' => 'Salain ayon sa unlapi:',
 'allmessages-language' => 'Wika:',
 'allmessages-filter-submit' => 'Gawin',
+'allmessages-filter-translate' => 'Isalin',
 
 # Thumbnails
 'thumbnail-more' => 'Palakihin',
@@ -2811,7 +2811,6 @@ Sagipin mo ito sa iyong kompyuter at papaitaas na ikarga ito rito.',
 'tooltip-pt-watchlist' => 'Ang talaan ng mga pagbabago sa mga pahinang binabantayan mo',
 'tooltip-pt-mycontris' => 'Talaan ng mga ambag mo',
 'tooltip-pt-login' => 'Hinihimok kang lumagda, bagaman hindi ito kinakailangan.',
-'tooltip-pt-anonlogin' => 'Hinihimok kang lumagda, bagaman hindi ito kinakailangan.',
 'tooltip-pt-logout' => 'Umalis sa pagkakalagda',
 'tooltip-ca-talk' => 'Usapan tungkol sa nilalaman ng pahinang ito',
 'tooltip-ca-edit' => 'Maaaring baguhin ang pahinang ito. Paki gamit ang buton ng paunang tingin bago itala.',
index e1ff662..0088bad 100644 (file)
@@ -159,13 +159,11 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Линки жинтоно ријә быкәш:',
-'tog-justify' => 'Мәтни бә сәһифә кәно бәробәр быкә.',
 'tog-hideminor' => 'Охоминә дәгишонәдә гәдә дәгишон нишо мәдә.',
 'tog-hidepatrolled' => 'Нујә дәгишон сијоһијәдә дәвинә кардә быә дәгишон нишо мәкә.',
 'tog-newpageshidepatrolled' => 'Нијони огәтеј ноғо доә быә сәһифон бә тожә сәһифон сијоһиәдә',
 'tog-usenewrc' => 'Охоминә дәгишон сәһифәдә ијән ноғо доә сијоһијәдә дәгишон бә дәстон ҹо кардеј (гәрәке JavaScript)',
 'tog-numberheadings' => 'Автоматик башлығон нумрәләмиш быкә',
-'tog-showtoc' => 'Мындәриҹоти сијоһи нишо быдә (3 сәрловһәсә веј быә сәһифон)',
 'tog-watchcreations' => 'Зијод кардеј чымы офәјә быә сәһифон ијән фајлон бә ноғо доә сијоһи',
 'tog-watchdefault' => 'Зијод кардеј демы дәгиш кардә быә сәһифон ијән фајлон бә ноғо доә сијоһи',
 'tog-watchmoves' => 'Зијод кардеј фајлон ијән ном дәгиш кардә быә сәһифон бә ноғо доә сијоһи',
@@ -571,7 +569,6 @@ $messages = array(
 'lineno' => 'Сәтыр $1:',
 'compareselectedversions' => 'Сәчын кардә быә рәвојәтон мығојисә кардеј.',
 'editundo' => 'ләғв кардеј',
-'diff-multi' => '({{PLURAL:$2|Иглә истифадәчи|$2 истифадәчи}} тәрәфәдә кардә быә {{PLURAL:$1|иглә арә редактә|$1 арә редактә}} нушо додәни)',
 
 # Search results
 'searchresults' => 'Нәве нәтиҹон',
index 85c69e9..01b04a6 100644 (file)
@@ -419,7 +419,6 @@ Ko e ʻuhinga loka ko e $1 ia.",
 'lineno' => 'Laini hono $1:',
 'compareselectedversions' => 'Fakatatau ongo paaki fili',
 'editundo' => 'vete',
-'diff-multi' => '(Naʻe ʻikai ʻasi mai ʻa e paaki lotoloto ʻe $1).',
 
 # Search results
 'searchresults' => 'kumi hono ʻātunga',
@@ -749,7 +748,6 @@ Kapau ʻaho ʻe taha, te ke fietoʻo ʻa e pēsí mei hoʻo hokohoko leʻo, lomi
 'watchmethod-list' => 'ʻoku siviʻi ʻa e ngaahi peesi fakaleʻo ki he toki fatu',
 'watchlistcontains' => 'ʻOku ʻi ai ha peesi ʻe $1 ʻi hoʻo hokohoko leʻo.',
 'iteminvalidname' => "Meʻa fihi mo e meʻa '$1', hingo taʻeʻaongaʻi...",
-'wlnote' => 'ʻOku ʻasi ʻi lalo ʻa e liliu fakamuimui ʻe $1 ʻi he houa fakamuimui ʻe <b>$2</b>.',
 'wlshowlast' => 'ʻAsi mai houa fakamuimui ʻe $1, ʻaho ʻe $2, $3',
 
 # Displayed when you click the "watch" button and it is in the process of watching
index d4dbd4e..a6f20b3 100644 (file)
@@ -46,6 +46,7 @@
  * @author Nemo bis
  * @author Rapsar
  * @author Reedy
+ * @author Rhinestorm
  * @author Runningfridgesrule
  * @author Sadrettin
  * @author Srhat
@@ -357,7 +358,6 @@ $linkTrail = '/^([a-zÇĞçğİıÖöŞşÜüÂâÎîÛû]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Bağlantıların altını çiz:',
-'tog-justify' => 'Paragrafları iki yana yasla',
 'tog-hideminor' => 'Son değişiklikler sayfasında küçük değişiklikleri gizle',
 'tog-hidepatrolled' => 'Son değişikliklerde gözden geçirilen düzenlemeleri gizle',
 'tog-newpageshidepatrolled' => 'Kontrol edilmiş sayfaları yeni sayfalar listesinde gizle',
@@ -369,8 +369,8 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Bölüm başlığına sağ tıklayarak bölümleri düzenleyebilme olanağı ver',
 'tog-rememberpassword' => 'Girişimi bu tarayıcıda hatırla (en fazla $1 {{PLURAL:$1|gün|gün}} için)',
 'tog-watchcreations' => 'Açtığım sayfaları ve yüklediğim dosyaları izleme listeme ekle',
-'tog-watchdefault' => 'Düzenleme yaptığım sayfaları izleme listeme ekle',
-'tog-watchmoves' => 'Taşıdığım sayfaları izleme listeme ekle',
+'tog-watchdefault' => 'Düzenleme yaptığım sayfaları ve dosyaları izleme listeme ekle',
+'tog-watchmoves' => 'Taşıdığım sayfaları ve dosyaları izleme listeme ekle',
 'tog-watchdeletion' => 'Sildiğim sayfaları ve dosyaları izleme listeme ekle',
 'tog-minordefault' => 'Varsayılan olarak bütün düzenlemeleri küçük olarak işaretle',
 'tog-previewontop' => 'Ön izlemeyi düzenleme kutusunun üstünde göster',
@@ -520,7 +520,6 @@ $messages = array(
 'vector-action-protect' => 'Koru',
 'vector-action-undelete' => 'Silinmeyi geri al',
 'vector-action-unprotect' => 'Korumayı değiştir',
-'vector-simplesearch-preference' => 'Gelişmiş arama önerilerini etkinleştir (Sadece Vector görünümü için)',
 'vector-view-create' => 'Oluştur',
 'vector-view-edit' => 'Düzenle',
 'vector-view-history' => 'Geçmişi gör',
@@ -530,7 +529,7 @@ $messages = array(
 'namespaces' => 'Ad alanları',
 'variants' => 'Türevler',
 
-'navigation-heading' => 'Dolaşım menüsü',
+'navigation-heading' => 'Gezinti menüsü',
 'errorpagetitle' => 'Hata',
 'returnto' => '$1 sayfasına geri dön.',
 'tagline' => '{{SITENAME}} sitesinden',
@@ -1182,7 +1181,7 @@ Sayfa zaten mevcut.',
 'invalid-content-data' => 'Geçersiz içerik verisi',
 'content-not-allowed-here' => '"$1" içeriğine, [[$2]] sayfasında izin verilmemekte.',
 'editwarning-warning' => 'Bu sayfadan ayrılmak yaptığınız herhangi bir değişikliği kaybetmenize sebep olabilir.
-Eğer giriş yaptıysanız, bu uyarıyı, tercihlerinizin "Sayfa yazma alanı" bölümünde devre dışı bırakabilirsiniz.',
+Eğer giriş yaptıysanız, bu uyarıyı, tercihlerinizin "{{int:prefs-editing}}" bölümünde devre dışı bırakabilirsiniz.',
 'editpage-notsupportedcontentformat-title' => 'İçerik biçimi desteklenmiyor',
 'editpage-notsupportedcontentformat-text' => '$1 içerik biçimi $2 içerik modeli tarafından desteklenmiyor.',
 
@@ -1218,6 +1217,7 @@ Bu değişkenler atlandı.",
 'undo-success' => 'Bu değişiklik geri alınabilir. Lütfen aşağıdaki karşılaştırmayı kontrol edin, gerçekten bu değişikliği yapmak istediğinizden emin olun ve sayfayı kaydederek bir önceki değişikliği geriye alın.',
 'undo-failure' => 'Değişikliklerin çakışması nedeniyle geri alma işlemi başarısız oldu.',
 'undo-norev' => 'Değişiklik geri alınamaz çünkü ya silinmiş ya da varolmamaktadır.',
+'undo-nochange' => 'Düzeltme zaten geri alınmış.',
 'undo-summary' => '$1 değişikliği [[Special:Contributions/$2|$2]] ([[User talk:$2|mesaj]]) tarafından geri alındı.',
 'undo-summary-username-hidden' => 'Gizli bir kullanıcı tarafından $1 sürümü geri alınıyor',
 
@@ -1399,7 +1399,6 @@ Gezinti bağlantılarının bu sütunu sıfırlayacağını unutmayın.',
 'showhideselectedversions' => 'Seçili sürümleri göster/gizle',
 'editundo' => 'geri al',
 'diff-empty' => '(Fark yok)',
-'diff-multi' => '({{PLURAL:$2|Bir kullanıcı|$2 kullanıcı}} tarafından yapılan {{PLURAL:$1|bir ara revizyon|$1 ara revizyon}} gösterilmiyor)',
 'diff-multi-manyusers' => '($2 kullancıdan fazla {{PLURAL:$2|kullanıcı|kullanıcı}} tarafından yapılan {{PLURAL:$1|bir ara revizyon|$1 ara revizyon}} gösterilmiyor)',
 'difference-missing-revision' => 'Bu farkın {{PLURAL:$2|bir revizyonu|$2 revizyonu}} ($1) {{PLURAL:$2|bulunamadı|bulunamadı}}.
 
@@ -1420,7 +1419,7 @@ Ayrıntılar [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} silme g
 'shown-title' => 'Sayfa başına $1 {{PLURAL:$1|sonuç|sonuç}} göster',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) gör',
 'searchmenu-exists' => "'''Bu vikide \"[[:\$1]]\" adında bir sayfa mevcut'''",
-'searchmenu-new' => "'''Bu vikide \"[[:\$1]]\" sayfasını oluştur!'''",
+'searchmenu-new' => '<strong>Bu vikide "[[:$1]]" sayfasını oluştur!</strong> {{PLURAL:$2|0=|Ayrıca aramınızda bulunan sayfayı görün.|Ayrıca bulunan arama sonuçlarını görün.}}',
 'searchprofile-articles' => 'İçerik sayfaları',
 'searchprofile-project' => 'Yardım ve proje sayfaları',
 'searchprofile-images' => 'Çokluortam',
@@ -1446,6 +1445,7 @@ Ayrıntılar [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} silme g
 'searchrelated' => 'ilgili',
 'searchall' => 'hepsi',
 'showingresults' => "$2. sonuçtan başlayarak {{PLURAL:$1|'''1''' sonuç |'''$1''' sonuç }} aşağıdadır:",
+'showingresultsinrange' => '<strong>$2</strong> ile <strong>$3</strong> arasında toplam <strong>$1</strong> sonuç gösteriliyor.',
 'showingresultsnum' => "'''$2''' sonuçtan başlayarak {{PLURAL:$3|'''1''' sonuç|'''$3''' sonuç}} aşağıdadır:",
 'showingresultsheader' => "'''$4''' için {{PLURAL:$5|'''$3''' sonuçtan '''$1'''i|'''$1 - $2''' arası '''$3''' sonuç}}",
 'search-nonefound' => 'Sorguyla eşleşen bir sonuç yok.',
@@ -3063,7 +3063,7 @@ Dosyanın sadece bir kısmı yüklendi.',
 Geçici dosya kayıp.',
 'import-parse-failure' => 'XML içeri aktarma derlemesi başarısız',
 'import-noarticle' => 'İçe aktarılacak sayfa yok!',
-'import-nonewrevisions' => 'Tüm revizyonlar önceden içe aktarılmış.',
+'import-nonewrevisions' => 'Hiçbir revizyon içe aktarılmadı (zaten hepsi vardı ya da hatadan dolayı atlandı).',
 'xml-error-string' => '$2 satırında, $3 sütununda $1 (bayt $4): $5',
 'import-upload' => 'XML bilgileri yükle',
 'import-token-mismatch' => 'Oturum verisi kaybı. Lütfen yeniden deneyin.',
index 233145d..bd6f6a4 100644 (file)
@@ -379,7 +379,6 @@ Legend: '''({{int:cur}})''' = difference with latest revision, '''({{int:last}})
 'lineno' => 'Serṫo $1:',
 'compareselectedversions' => 'Compare selected revisions',
 'editundo' => 'slag',
-'diff-multi' => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one user|$2 users}} not shown)',
 
 # Search results
 'searchresults' => 'Nafqe duKruxyayḍux',
index 2496f50..38f405f 100644 (file)
@@ -13,7 +13,6 @@
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Hlanganisa nkhwatiheto:',
-'tog-justify' => 'Hikahata xirhapa',
 'tog-hideminor' => 'Tumbeta mindzulamiso leyi tsongo',
 'tog-hidepatrolled' => 'Tumbeta ku cinca loku languteriweke eka kucinca ka sweswinyana',
 'tog-newpageshidepatrolled' => 'Tumbeta kucinca loku languteriweke eka nxaxamelo wa matluka lamantswa',
@@ -22,9 +21,7 @@ $messages = array(
 'tog-numberheadings' => 'Tinhloko-mhaka leti hleriweke',
 'tog-showtoolbar' => 'Komba xiangarhi xo cinca (yitirhisa ntsalo wa Java)',
 'tog-editondblclick' => 'Lulamisa matluka hi ku thlava kambirhi (yitirhisa ntsalo wa Java)',
-'tog-editsection' => 'Pfula ku lulamisa xiyenge hi ku tirhisa xithlavinyeti xo [edit|lulamisa]',
 'tog-editsectiononrightclick' => 'Pfula ku lulamisa hi swiyenge hi ku thlava nhlokomhaka ya xiyenge (yitirhisa ntsalo wa Java)',
-'tog-showtoc' => 'Komba nxaxamelo wa leswingandzeni (eka tinhlokomhaka tinharhu kumbe kutlula)',
 'tog-rememberpassword' => 'Tsundzuka ku nghena eka Khompuyuta leyi (kufikela eka $1 {{PLURAL:$1|siku|masiku}})',
 'tog-watchcreations' => 'Hoxa matluka lawa ndzi matumbuluxaka eka leswi ndziswi languteke',
 'tog-watchdefault' => 'Hoxa matluka lawa ndzi malulamisaka eka leswi ndziswi languteke',
@@ -479,7 +476,6 @@ Swihlamuseri: '''({{int:sweswi}})''' = kuhambana na ndzulamiso wa sweswinyana, '
 'lineno' => 'Ntila $1:',
 'compareselectedversions' => 'Hambaniisa exikarhi ka mindzulamiso leyi langiweke',
 'editundo' => 'Thlerisela',
-'diff-multi' => '({{PLURAL:$1|ndzulamiso lowu landzeleke|$1 mindzulamiso leyi landzeleke}} hi {{PLURAL:$2|mutirhisi|$2 wavatirhisi}} leyingakombiwangiki)',
 
 # Search results
 'searchresults' => 'Lavisisa eka mimbuyelo',
index 6247a2a..801a33a 100644 (file)
@@ -15,6 +15,7 @@
  * @author KhayR
  * @author MF-Warburg
  * @author Marat Vildanov
+ * @author Marat-avgust
  * @author Reedy
  * @author Rinatus
  * @author Timming
@@ -213,7 +214,6 @@ $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъы
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Сылтамаларның астына сызу:',
-'tog-justify' => 'Текст киңлек буенча тигезләнсен',
 'tog-hideminor' => 'Соңгы үзгәртүләр исемлегендә кече үзгәртүләр яшерелсен',
 'tog-hidepatrolled' => 'Тикшерелгән үзгәртүләр яңа үзгәртүләр исемлегеннән яшерелсен.',
 'tog-newpageshidepatrolled' => 'Тикшерелгән битләр яңа битләр исемлегеннән яшерелсен',
@@ -222,9 +222,7 @@ $messages = array(
 'tog-numberheadings' => 'Атамалар автомат рәвештә номерлансын',
 'tog-showtoolbar' => 'Үзгәртү вакытында коралларның өске панеле күрсәтелсен (JavaScript кирәк)',
 'tog-editondblclick' => 'Битләргә ике чирттерү белән үзгәртү бите ачылсын (JavaScript кирәк)',
-'tog-editsection' => 'Һәр бүлектә «үзгәртү» сылтамасы күрсәтелсен',
 'tog-editsectiononrightclick' => 'Бүлек исеменә тычканның уң чирттермәсе белән төрткәч үзгәртү бите ачылсын (JavaScript кирәк)',
-'tog-showtoc' => 'Эчтәлек күрсәтелсен (3 тән күбрәк башламлы битләрдә)',
 'tog-rememberpassword' => 'Хисап язмамны бу браузерда саклансын (иң күп $1 {{PLURAL:$1|көн|көн|көн}}гә кадәр)',
 'tog-watchcreations' => 'Мин төзегән битләр һәм йөкләгән файллар күзәтү исемлегемә өстәлсен',
 'tog-watchdefault' => 'Мин үзгәрткән битләр һәм файллар күзәтү исемлегемә өстәлсен',
@@ -1113,7 +1111,6 @@ $1",
 'compareselectedversions' => 'Сайланган юрамаларны чагыштыру',
 'showhideselectedversions' => 'Сайланган юрамаларны күрсәтү/яшерү',
 'editundo' => 'үткәрмәү',
-'diff-multi' => '({{PLURAL:$2|1=бер кулланучының|$2 кулланучының}} {{PLURAL:$1|арадагы $1 версиясе күрсәтелмәгән}})',
 
 # Search results
 'searchresults' => 'Эзләү нәтиҗәләре',
index 88cecfd..ae89e0c 100644 (file)
@@ -94,7 +94,6 @@ $linkTrail = '/^([a-zäçğıñöşü“»]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Sıltamalarnıñ astına sızu:',
-'tog-justify' => 'Tekst kiñlek buyınça tigezlänsen',
 'tog-hideminor' => 'Soñğı üzgärtülär isemlegendä keçe üzgärtülär yäşerelsen',
 'tog-hidepatrolled' => 'Tikşerelgän üzgärtülär yaña üzgärtülär isemlegennän yäşerelsen.',
 'tog-newpageshidepatrolled' => 'Tikşerelgän bitlär yaña bitlär isemlegennän yäşerelsen',
@@ -103,9 +102,7 @@ $messages = array(
 'tog-numberheadings' => 'Atamalar avtomat räweştä nomerlansın',
 'tog-showtoolbar' => 'Üzgärtü waqıtında qorallarnıñ öske panele kürsätelsen (JavaScript kiräk)',
 'tog-editondblclick' => 'Bitlärgä ike çirtterü belän üzgärtü bite açılsın (JavaScript kiräk)',
-'tog-editsection' => 'Här bülektä «üzgärtü» sıltaması kürsätelsen',
 'tog-editsectiononrightclick' => 'Bülek isemenä tıçqannıñ uñ çirttermäse belän törtkäç üzgärtü bite açılsın (JavaScript kiräk)',
-'tog-showtoc' => 'Eçtälek kürsätelsen (3 tän kübräk başlamlı bitlärdä)',
 'tog-rememberpassword' => 'Xisap yazmamnı bu brauzerda saqlansın (iñ küp $1 {{PLURAL:$1|kön|kön|kön}}gä qädär)',
 'tog-watchcreations' => 'Tözegän bitlärem küzätü isemlegemä östälsen',
 'tog-watchdefault' => 'Üzgärtkän bitlärem küzätü isemlegemä östälsen',
index bc08686..4038be4 100644 (file)
@@ -108,7 +108,6 @@ $bookstoreList = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Холбааны шыяры:',
-'tog-justify' => 'Арынның дооразының аайы-биле сөзүглелди дескилээри',
 'tog-hideminor' => 'Сөөлгү өскерлиишкиннер арында бичии өскерлиишкиннерни чажырар',
 'tog-hidepatrolled' => 'Амгы өскерлиишкиннер арында истээн өскерлиишкиннерни чажырары',
 'tog-newpageshidepatrolled' => 'Чаа арыннарның даңзындан истээн арыннарны чажырары',
@@ -116,7 +115,6 @@ $messages = array(
 'tog-numberheadings' => 'Эгелерин авто-санаар',
 'tog-showtoolbar' => 'Өскертир херекселдерни көргүзер (JavaScript)',
 'tog-editondblclick' => 'Арынны өскертирде ийи катап базар (JavaScript)',
-'tog-editsection' => '[өскертири] деп холбаалар-биле section editing enable.',
 'tog-rememberpassword' => 'Мени бо компьютерге сактыры ($1 {{PLURAL:$1|1=хүн|хүн}} ишти)',
 'tog-watchcreations' => 'Мээң чаяан арыннарымны хайгаарал даңзымче немээри.',
 'tog-watchdefault' => 'Мээң өскерткен арыннарымны хайгаарал даңзымче немээри.',
@@ -588,7 +586,6 @@ Please check if you want to create/edit this page.',
 'lineno' => 'Одуруг $1:',
 'compareselectedversions' => 'Шилип алган хевирлери деңнээри',
 'editundo' => 'чөрчүүрү',
-'diff-multi' => '({{PLURAL:$2|$2 киржикчиниң}} {{PLURAL:$1|$1 түр хевирин көргүспээн}})',
 
 # Search results
 'searchresults' => 'Түңнелдер',
index 97dd6b4..6537cb5 100644 (file)
@@ -14,6 +14,7 @@
  * @author Reedy
  * @author Sahran
  * @author Tel'et
+ * @author بىلگە
  */
 
 $rtl = true;
@@ -49,7 +50,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'ئۇلانما ئاستى سىزىقى:',
-'tog-justify' => 'ئابزاس توغرىلا',
 'tog-hideminor' => 'يېقىنقى ئۆزگەرتىشتە ئازراقلا تەھرىرنى يوشۇر',
 'tog-hidepatrolled' => 'يېقىنقى ئۆزگەرتىشتە كۆزەتكەن تەھرىرنى يوشۇر',
 'tog-newpageshidepatrolled' => 'يېڭى بەت تىزىملىكىدە كۆزەتكەن تەھرىرنى يوشۇر',
@@ -213,7 +213,6 @@ $messages = array(
 'vector-action-protect' => 'قوغدا',
 'vector-action-undelete' => 'ئەسلىگە قايتۇر',
 'vector-action-unprotect' => 'قوغداش ئۆزگەرت',
-'vector-simplesearch-preference' => 'ئاددىي ئىزدەش ئىستون ئاچ (پەقەت ۋېكتور قېلىپ)',
 'vector-view-create' => 'قۇر',
 'vector-view-edit' => 'تەھرىر',
 'vector-view-history' => 'تارىخ كۆرسەت',
@@ -644,6 +643,8 @@ $1 ساقلاپ، ئاندىن قايتا سىناڭ.',
 'retypenew' => 'يېڭى پارولنى قايتا كىرگۈزۈڭ:',
 'resetpass_submit' => 'پارول بەلگىلەپ تىزىمغا كىرىڭ',
 'changepassword-success' => 'پارولىڭىز ئوڭۇشلۇق ئۆزگەرتىلدى!',
+'changepassword-throttled' => 'سىز بۇ ھېساباتتا تىزىمغا كىرىشنى كۆپ قېتىم سىنىدىڭىز.
+$1 ساقلاپ، ئاندىن قايتا سىناڭ.',
 'resetpass_forbidden' => 'پارولنى ئۆزگەرتەلمىدى',
 'resetpass-no-info' => 'سىز تىزىمغا كىرگەندىن كېيىن بىۋاسىتە بۇ بەتكە كىرىشىڭىز لازىم.',
 'resetpass-submit-loggedin' => 'پارولنى ئۆزگەرتىش',
@@ -699,9 +700,14 @@ $2
 'changeemail-password' => '{{SITENAME}} دىكى پارولىڭىز:',
 'changeemail-submit' => 'ئېلخەت ئۆزگەرت',
 'changeemail-cancel' => 'ۋاز كەچ',
+'changeemail-throttled' => 'سىز بۇ ھېساباتتا تىزىمغا كىرىشنى كۆپ قېتىم سىنىدىڭىز.
+$1 ساقلاپ، ئاندىن قايتا سىناڭ.',
 
 # Special:ResetTokens
 'resettokens' => 'ئاچقۇچلۇق بەلگىلەرنى قايتا بېكىتمەك',
+'resettokens-text' => 'سىز بۇ يەردە سىزنىڭ ھىساۋاتىڭىزگە مۇناسۋەتلىك شەخسى ئۇچۇر مەخپىيەتلىكىنى قايتا كۆرەلەيسىز.
+
+ئۇ ئۇچۇرلار ھەمبەھرلىنىپ كەتسە ياكى باشقىلار ئىشلىتۋالغان بولسا، ئۇ ئۇچۇرلارنى ئەسلىگە قايتۇرۇڭ.',
 'resettokens-no-tokens' => 'قايتا بېكىتىدىغان ھېچقانداق ئاچقۇچلۇق بەلگە يوق.',
 'resettokens-legend' => 'ئاچقۇچلۇق بەلگىلەرنى قايتا بېكىتمەك',
 'resettokens-tokens' => 'ئاچقۇچلۇق بەلگىلەر:',
@@ -923,7 +929,9 @@ $2
 'invalid-content-data' => 'مەزمۇن سانلىق مەلۇماتى ئىناۋەتسىز',
 'content-not-allowed-here' => '[[$2]] بەتتە "$1" مەزمۇنغا يول قويۇلمايدۇ',
 'editwarning-warning' => 'بەتتىن ئايرىلغاندا بەلكىم بارلىق تەھرىرلىگىنىڭىز بېكار بولۇپ كېتىشى مۇمكىن.
-ئ‍ەگەر تىزىمغا كىرسىڭىز، مايىللىق بېتىڭىزنىڭ «تەھرىر» بۆلىكىدە، بۇ ئەسكەرتمىنى ئىناۋەتسىز قىلالايسىز.',
+ئ‍ەگەر تىزىمغا كىرسىڭىز، مايىللىق بېتىڭىزنىڭ «{{int:prefs-editing}}» بۆلىكىدە، بۇ ئەسكەرتمىنى ئىناۋەتسىز قىلالايسىز.',
+'editpage-notsupportedcontentformat-title' => 'مەزمۇن ئەندىزىسىنى قوللىمىدى.',
+'editpage-notsupportedcontentformat-text' => 'مەزمۇن قېلىپى $2 نى مەزمۇن ئەندىزىسى $1 نى قوللىمىدى.',
 
 # Content models
 'content-model-wikitext' => 'ۋىكىتېكىست',
@@ -958,6 +966,7 @@ $2
 تۆۋەندىكى سېلىشتۇرۇشنى تەكشۈرۈپ بۇنىڭ ئۆزىڭىزنىڭ ئويى ئىكەنلىكىنى دەلىللەڭ، ئاندىن تۆۋەندىكى ئۆزگەرتىشنى ساقلاپ تەھرىرلەشتىن يېنىۋىلىڭ.',
 'undo-failure' => 'ئوتتۇرىلىقتا بىردەك بولماسلىق سەۋەبىدىن بۇ تەھرىردىن يېنىۋالغىلى بولمايدۇ.',
 'undo-norev' => 'تۈزىتىلگەن نەشرى مەۋجۇد ئەمەس ياكى ئۆچۈرۈلگەنلىكتىن، بۇ تەھرىردىن يېنىۋالغىلى بولمايدۇ.',
+'undo-nochange' => 'بۇ قېتىملىق تەھرىرلەش ۋاز كېچىلدى.',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|مۇنازىرە]]) ئېلىپ بارغان تۈزىتىش $1',
 'undo-summary-username-hidden' => 'بىر يوشۇرۇن ئىشلەتكۈچى تەرىپىدىن يېنىۋېلىندى $1.',
 
@@ -1045,7 +1054,7 @@ $3 تەمىنلىگەن چەكلەش سەۋەبى ''$2''",
 'revdelete-confirm' => 'بۇ مەشغۇلاتنى ئىجرا قىلسىڭىز ئاقىۋىتىنى چۈشىنىدىغانلىقىڭىزنى ھەمدە بۇ پروگراممىنىڭ [[{{MediaWiki:Policy-url}}|سىياسەت]]كە ئۇيغۇن كېلىدىغانلىقىنى جەزملەڭ.',
 'revdelete-suppress-text' => "'''پەقەت''' تۆۋەندىكى ئەھۋاللار يۈز بەرگەندىلا زىيارەت چەكلىنىدۇ:
 * نامۇۋاپىق شەخسىي ئۇچۇر
-*: ''home ئولتۇرۇشلۇق ئادرېس، تېلېفون نومۇر، كىملىك نومۇرى قاتارلىق.''",
+*: ''ئولتۇرۇشلۇق ئادرېس، تېلېفون نومۇر، كىملىك نومۇرى قاتارلىق.''",
 'revdelete-legend' => 'كۆرۈنۈشچانلىق چەكلىمە تەڭشىكى',
 'revdelete-hide-text' => 'تۈزىتىلگەن تېكىست',
 'revdelete-hide-image' => 'ھۆججەت مەزمۇنىنى يوشۇر',
@@ -1134,7 +1143,7 @@ $1",
 'compareselectedversions' => 'تاللانغان نەشرىنى سېلىشتۇر',
 'showhideselectedversions' => 'تاللانغان تۈزىتىلگەن نەشرىنى كۆرسەت/يوشۇر',
 'editundo' => 'يېنىۋال',
-'diff-multi' => '({{PLURAL:$2|ئىشلەتكۈچى|$2 ئىشلەتكۈچى}} نىڭ{{PLURAL:$1|تۈزىتىلگەن نەشرى|$1 تۈزىتىلگەن نەشرى}} كۆرسىتىلمىدى)',
+'diff-empty' => '(پەرقى يوق)',
 'diff-multi-manyusers' => '( $2  دىن كۆپ{{PLURAL:$2|ئىشلەتكۈچى|ئىشلەتكۈچى}} نىڭ {{PLURAL:$1|تۈزىتىلگەن نەشرى|$1 تۈزىتىلگەن نەشرى}}  كۆرسىتىلمىدى)',
 'difference-missing-revision' => '{{PLURAL:$2|نەشر|$2 نەشىر لەر}} نىڭ ($1) پەرق سېلىشتۇرما {{PLURAL:$2}} تېپىلمىدى.
 
@@ -1171,6 +1180,7 @@ $1",
 'search-result-score' => 'باغلىنىشچانلىق: $1%',
 'search-redirect' => '($1 قايتا نىشانلا)',
 'search-section' => '(ئابزاس $1)',
+'search-file-match' => '(ھۆججەت مەزمۇنى ماس كەلگەن)',
 'search-suggest' => 'ئىزدىمەكچى بولغىنىڭىز: $1',
 'search-interwiki-caption' => 'ھەمشىرە قۇرۇلۇشلار',
 'search-interwiki-default' => '$1 نەتىجە:',
@@ -1311,6 +1321,7 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
 'prefs-displaywatchlist' => 'كۆرسىتىش تاللانما',
 'prefs-tokenwatchlist' => 'ئاچقۇچ',
 'prefs-diffs' => 'پەرقلەر',
+'prefs-help-prefershttps' => 'بۇ سەپلەك، سىز قايتا تىزىمغا كىرگەندە ئىشلەيدۇ.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'ئېلخەت ئادرېسى ئىناۋەتلىك',
@@ -2165,7 +2176,6 @@ URL نىڭ توغرىلىقى ۋە تور بېكەتنى زىيارەت قىلى
 'watchmethod-list' => 'كۆزىتىۋاتقان بەتنىڭ يېقىنقى ئۆزگەرتىشىنى تەكشۈر',
 'watchlistcontains' => 'كۆزەت تىزىملىكىڭىزدە $1 {{PLURAL:$1|بەت|بەت}} بار.',
 'iteminvalidname' => "بەت'$1'  خاتالىقى، ئاتى ئىناۋەتسىز…",
-'wlnote' => "تۆۋەندىكىسى يېقىنقى {{PLURAL:$2|سائەت}} ئىچىدىكى ئاخىرقى '{{PLURAL:$1| قېتىملىق}}  ئۆزگەرتىش، $3 $4 گىچە.",
 'wlshowlast' => 'يېقىنقى $1 سائەت $2 كۈن $3 نىڭ ئۆزگەرتىشىنى كۆرسەت',
 'watchlist-options' => 'كۆزەت تىزىملىك تاللانما',
 
@@ -2828,7 +2838,6 @@ $1',
 'tooltip-pt-watchlist' => 'سىز كۆزىتىۋاتقان بەتلەر تىزىملىگى',
 'tooltip-pt-mycontris' => 'تۆھپە تىزىملىكىڭىز',
 'tooltip-pt-login' => 'تىزىمغا كىرىشىڭىزنى تەۋسىيە قىلىمىز ئەمما مەجبۇرىي ئەمەس',
-'tooltip-pt-anonlogin' => 'تىزىمغا كىرىشىڭىزنى تەۋسىيە قىلىمىز ئەمما مەجبۇرىي ئەمەس',
 'tooltip-pt-logout' => 'تىزىمدىن چىق',
 'tooltip-ca-talk' => 'بەت مەزمۇنى ھەققىدىكى مۇنازىرە',
 'tooltip-ca-edit' => 'بۇ بەتنى تەھرىرلىيەلەيسىز.
@@ -3953,8 +3962,15 @@ MediaWiki ئىشلىتىش مەقسىتىنى ئاساس قىلىپ ئېلان 
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|سېكۇنت}}',
 
 # Special:ExpandTemplates
+'expand_templates_input' => 'مەزمۇن كىرگۈزۈڭ:',
 'expand_templates_output' => 'نەتىجە',
+'expand_templates_xml_output' => 'XML چىقار',
+'expand_templates_html_output' => 'ئەسلى HTML چىقار',
 'expand_templates_ok' => 'جەزملە',
+'expand_templates_remove_comments' => 'ئىزاھاتنى ئۆچۈر',
+'expand_templates_remove_nowiki' => 'نەتىجىسىدە <nowiki> خەتكۈچ كۆرۈنمىسۇن',
+'expand_templates_generate_xml' => 'XML گىرامماتىكىسىنى كۆرسەت',
+'expand_templates_generate_rawhtml' => 'ئەسلى HTML نى كۆرسەت',
 'expand_templates_preview' => 'ئالدىن كۆزەت',
 
 );
index 1bdf398..5eb04b6 100644 (file)
@@ -368,7 +368,6 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Підкреслювати посилання:
 Підкреслювання посилань:',
-'tog-justify' => 'Вирівнювати текст по ширині сторінки',
 'tog-hideminor' => 'Приховати незначні редагування у списку останніх змін',
 'tog-hidepatrolled' => 'Приховувати патрульовані редагування у списку нових редагувань',
 'tog-newpageshidepatrolled' => 'Приховувати патрульовані сторінки у списку нових сторінок',
@@ -532,7 +531,6 @@ $messages = array(
 'vector-action-protect' => 'Захистити',
 'vector-action-undelete' => 'Відновити',
 'vector-action-unprotect' => 'Зміна захисту',
-'vector-simplesearch-preference' => 'Увімкнути спрощене поле пошуку (лише для оформлення "Векторне")',
 'vector-view-create' => 'Створити',
 'vector-view-edit' => 'Редагувати',
 'vector-view-history' => 'Переглянути історію',
@@ -1212,7 +1210,7 @@ $2
 'invalid-content-data' => 'Неприпустимі дані',
 'content-not-allowed-here' => 'Вміст «$1» недопустимий на сторінці [[$2]]',
 'editwarning-warning' => 'Перехід на іншу сторінку призведе до втрати ваших змін.
-Якщо ви ввійшли до системи, то ви можете відключити це попередження в розділі «Редагування» ваших налаштувань.',
+Якщо ви ввійшли до системи, то ви можете відключити це попередження в розділі "{{int:prefs-editing}}" ваших налаштувань.',
 'editpage-notsupportedcontentformat-title' => 'Непідтримуваний формат вмісту',
 'editpage-notsupportedcontentformat-text' => 'Формат вмісту $1 не підтримується моделлю вмісту $2.',
 
@@ -1249,6 +1247,7 @@ $2
 Будь ласка, перевірте порівняння нижче, щоб впевнитись, що це те, що ви хочете зробити, а потім збережіть зміни, щоб закінчити скасування редагування.',
 'undo-failure' => 'Неможливо скасувати редагування через несумісність проміжних змін.',
 'undo-norev' => 'Редагування не може бути скасоване, бо воно не існує або було вилучене.',
+'undo-nochange' => 'Схоже, редагування уже було скасовано.',
 'undo-summary' => 'Скасування редагування № $1 користувача [[Special:Contributions/$2|$2]] ([[User talk:$2|обговорення]])',
 'undo-summary-username-hidden' => 'Скасувати перевірку $1 прихованого користувача',
 
@@ -1429,7 +1428,8 @@ $1",
 'showhideselectedversions' => 'Показати/приховати обрані версії',
 'editundo' => 'скасувати',
 'diff-empty' => '(Немає відмінностей)',
-'diff-multi' => '({{PLURAL:$1|Одна проміжна версія одного користувача не показана|$1 проміжні версії {{PLURAL:$2|1=одного користувача|$2 користувачів}} не показані|$1 проміжних версій {{PLURAL:$2|1=одного користувача|$2 користувачів}} не показано}})',
+'diff-multi-sameuser' => '(не {{PLURAL:$1|показано одну проміжну версію|показані $1 проміжні версії|показано $1 проміжних версій}} цього учасника)',
+'diff-multi-otherusers' => '(не {{PLURAL:$1|показана одна проміжна версія|показано $1 проміжні версії|показані $1 проміжних версій}} {{PLURAL:$2|ще одного учасника|$2 учасників}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|не показана $1 проміжна версія|не показані $1 проміжні версії|не показано $1 проміжних версій}}, зроблених більш, ніж {{PLURAL:$2|1=$1 користувачем|$2 користувачами}})',
 'difference-missing-revision' => '{{PLURAL:$2|$2 версія|$2 версії|$2 версій}} для цього порівняння ($1) не {{PLURAL:$2|1=знайдена|знайдені}}.
 
@@ -1450,7 +1450,8 @@ $1",
 'shown-title' => 'Показувати $1 {{PLURAL:$1|запис|записи|записів}} на сторінці',
 'viewprevnext' => 'Переглянути ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''У цій вікі є сторінка з назвою «[[:$1]]»'''",
-'searchmenu-new' => "'''Створити сторінку «[[:$1]]» у цій вікі!'''",
+'searchmenu-new' => '<strong>Створити сторінку «[[:$1]]» у цьому вікі-проекті!</strong>
+{{PLURAL:$2|0=|Див. також сторінку, знайдену по результатами вашого пошуку.|Див. також знайдені результати пошуку.}}',
 'searchprofile-articles' => 'Статті',
 'searchprofile-project' => 'Сторінки довідки і проекту',
 'searchprofile-images' => 'Мультимедіа',
@@ -1476,6 +1477,7 @@ $1",
 'searchrelated' => "пов'язаний",
 'searchall' => 'усі',
 'showingresults' => "Нижче {{PLURAL:$1|показане|показані|показані}} '''$1''' {{PLURAL:$1|результат|результати|результатів}}, починаючи з №&nbsp;'''$2'''",
+'showingresultsinrange' => 'Нижче показано до {{PLURAL:$1|<strong>1</strong> результата|<strong>$1</strong> результатів|<strong>$1</strong> результати}} у діапазоні від #<strong>$2</strong> до #<strong>$3</strong>.',
 'showingresultsnum' => 'Нижче показано <strong>$3</strong> {{PLURAL:$3|результат|результати|результатів}}, починаючи з №&nbsp;<strong>$2</strong>.',
 'showingresultsheader' => "{{PLURAL:$5|1=Результат '''$1''' з '''$3'''|Результати '''$1 — $2''' з '''$3'''}} для '''$4'''",
 'search-nonefound' => 'Не знайдено результатів, що відповідають запиту.',
@@ -2312,6 +2314,14 @@ $1',
 'protectedpages-cascade' => 'Тільки каскадний захист',
 'protectedpages-noredirect' => 'Сховати перенаправлення',
 'protectedpagesempty' => 'Зараз нема захищених сторінок із зазначеними параметрами',
+'protectedpages-timestamp' => 'Часова мітка',
+'protectedpages-page' => 'Сторінка',
+'protectedpages-expiry' => 'Закінчується',
+'protectedpages-performer' => 'Захист користувача',
+'protectedpages-params' => 'Параметри захисту',
+'protectedpages-reason' => 'Причина',
+'protectedpages-unknown-timestamp' => 'Невідомо',
+'protectedpages-unknown-performer' => 'Невідомий користувач',
 'protectedtitles' => 'Заборонені назви',
 'protectedtitlesempty' => 'Зараз нема захищених назв із зазначеними параметрами.',
 'listusers' => 'Список користувачів',
@@ -2502,6 +2512,7 @@ $1',
 'watchmethod-list' => 'перегляд статей за якими ведеться спостереження',
 'watchlistcontains' => 'Ваш список спостереження містить $1 {{PLURAL:$1|сторінку|сторінки|сторінок}}.',
 'iteminvalidname' => 'Проблема з елементом «$1», недопустима назва…',
+'wlnote2' => 'Нижче наведено зміни за {{PLURAL:$1|останню годину|останні <strong>$1</strong> години|останні <strong>$1</strong> годин}} на $2 $3.',
 'wlshowlast' => 'Показати зміни за останні $1 годин $2 днів $3',
 'watchlist-options' => 'Налаштування списку спостереження',
 
@@ -3055,6 +3066,7 @@ $1',
 'allmessages-prefix' => 'Фільтр за префіксом:',
 'allmessages-language' => 'Мова:',
 'allmessages-filter-submit' => 'Виконати',
+'allmessages-filter-translate' => 'Перекласти',
 
 # Thumbnails
 'thumbnail-more' => 'Збільшити',
@@ -3071,6 +3083,7 @@ $2',
 'thumbnail_image-type' => 'Тип зображення не підтримується',
 'thumbnail_gd-library' => 'Неповна конфігурація бібліотеки GD, відсутня функція $1',
 'thumbnail_image-missing' => 'Очевидно, відсутній файл $1',
+'thumbnail_image-failure-limit' => 'Там було дуже багато недавніх невдалих спроб ($1 або більше) для візуалізації цього ескізу. Будь ласка, спробуйте ще раз пізніше.',
 
 # Special:Import
 'import' => 'Імпорт статей',
@@ -3105,7 +3118,7 @@ $2',
 'importuploaderrortemp' => 'Не вдалося завантажити або імпортувати файл. Тимчасова папка відсутня.',
 'import-parse-failure' => 'Помилка розбору XML під час імпорту',
 'import-noarticle' => 'Нема сторінки для імпорту!',
-'import-nonewrevisions' => 'УÑ\81Ñ\96 Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\97 Ð±Ñ\83ли Ñ\80анÑ\96Ñ\88е Ñ\96мпоÑ\80Ñ\82ованÑ\96.',
+'import-nonewrevisions' => 'Ð\9dÑ\96Ñ\8fкÑ\96 Ð¿Ð¾Ð¿Ñ\80авки Ð½Ðµ Ð±Ñ\83ли Ñ\96мпоÑ\80Ñ\82ованÑ\96 (вÑ\81Ñ\96 Ð²Ð¶Ðµ Ð±Ñ\83ли Ð¾Ð±Ñ\80обленÑ\96, Ð°Ð±Ð¾ Ð¿Ñ\80опÑ\83Ñ\89енÑ\96 Ñ\87еÑ\80ез Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸).',
 'xml-error-string' => '$1 в рядку $2, позиції $3 (байт $4): $5',
 'import-upload' => 'Завантажити XML-дані',
 'import-token-mismatch' => 'Утрачені дані сеансу. Будь ласка, спробуйте ще раз.',
@@ -3116,6 +3129,7 @@ $2',
 '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>',
 'import-rootpage-invalid' => 'Вказана некоректна назва кореневої сторінки',
 'import-rootpage-nosubpage' => 'В просторі назв вказаної кореневої сторінки «$1» заборонені підсторінки',
@@ -4467,6 +4481,5 @@ MediaWiki поширюється в надії, що вона буде кори
 'expand_templates_preview' => 'Попередній перегляд',
 
 # Unknown messages
-'createaccount-hook-aborted' => ' $1',
 'uploadinvalidxml' => 'Не вдалося проаналізувати XML у завантаженому файлі.',
 );
index 0a5161c..e6bf90f 100644 (file)
@@ -16,6 +16,7 @@
  * @author Rachitrali
  * @author Reedy
  * @author Tahir mq
+ * @author Wamiq
  * @author Wisesabre
  * @author ZxxZxxZ
  * @author לערי ריינהארט
@@ -168,34 +169,31 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'ربط کی خط کشیدگی:',
-'tog-justify' => 'سطور کی برابری',
-'tog-hideminor' => 'حالیہ تبدیلیوں میں معمولی ترمیمات چُھپاؤ',
-'tog-hidepatrolled' => 'حالیہ تبدیلیوں میں گشتی ترمیمات چُھپاؤ',
-'tog-newpageshidepatrolled' => 'جدید صفحاتی فہرست میں گشتی صفحات چُھپاؤ',
-'tog-extendwatchlist' => 'زیرِنظرفہرست کو پھیلاؤ تاکہ اِس میں تمام ترمیمات نظر آئیں، نہ کہ صرف حالیہ ترین',
-'tog-usenewrc' => 'افزودہ حالیہ تبدیلیاں استعمال کریں (JavaScript درکار ہوگا)',
-'tog-numberheadings' => 'سرخیوں کو خود نمبر دو',
-'tog-showtoolbar' => 'تدوینی اوزاردان دکھاؤ ( JavaScript چاہئے)',
-'tog-editondblclick' => 'طقین پر صفحات کی ترمیم (JavaScript چاہئے)',
-'tog-editsection' => '[ترمیم] روابط کے ذریعے سطری ترمیم کاری فعال کرو',
+'tog-hideminor' => 'حالیہ تبدیلیوں میں معمولی ترامیم چھپائیے',
+'tog-hidepatrolled' => 'حالیہ تبدیلیوں میں گشتی ترامیم چھپائیے',
+'tog-newpageshidepatrolled' => 'جدید صفحات کی فہرست میں گشتی صفحات چھپائیے',
+'tog-extendwatchlist' => 'زیر نظر فہرست کی توسیع کیجئے تاکہ تمام تبدیلیاں، نہ کہ صرف سب سے حالیہ تداوین دیکھی کجا سکیں',
+'tog-usenewrc' => 'حالیہ تبدیلیوں میں اور زیر نظر فہرست میں تبدیلیوں کو بلحاظ صفحہ گروہ بند کیجئے',
+'tog-numberheadings' => 'سرخیوں کو خودکار نمبر دیجئے',
+'tog-showtoolbar' => 'تدوینی اوزاردان دکھائیے',
+'tog-editondblclick' => 'طقین پر صفحات کی ترمیم کیجئے',
 'tog-editsectiononrightclick' => 'سطری عنوانات پر دایاں طق کے ذریعے سطری ترمیم کاری فعال بناؤ',
-'tog-showtoc' => 'فہرستِ مندرجات دکھاؤ (3 سے زیادہ سرخیوں والے صفحات کیلئے)',
 'tog-rememberpassword' => 'اِس متصفح پر میرے داخلِ نوشتگی معلومات یاد رکھو (زیادہ سے زیادہ $1 {{PLURAL:$1|دِن|ایام}} کیلئے)',
-'tog-watchcreations' => 'میرے مرتب شدہ صفحات کو میری زیرِنظرفہرست میں شامل کیا کرو',
-'tog-watchdefault' => 'Ù\85Û\8cرÛ\92 ØªØ±Ù\85Û\8cÙ\85 Ø´Ø¯Û\81 ØµÙ\81حات Ú©Ù\88 Ù\85Û\8cرÛ\8c Ø²Û\8cرÙ\90Ù\86ظرÙ\81Û\81رست Ù\85Û\8cÚº Ø´Ø§Ù\85Ù\84 Ú©Û\8cا Ú©Ø±Ù\88',
-'tog-watchmoves' => 'میں جن صفحات کو منتقل کرتا ہوں، اُن کو میری زیرِنظرفہرست میں شامل کیا کرو',
-'tog-watchdeletion' => 'میں جن صفحات کو حذف کروں، اُن کو میری زیرِنظرفہرست میں شامل کیا کرو',
+'tog-watchcreations' => 'میرے تخلیق کردہ صفحات اور میری زبر اثقال کردہ ملفات کو میری زیر نظر فہرست میں شامل کیا کیجئے',
+'tog-watchdefault' => 'Ù\85Û\8cرÛ\92 ØªØ¯Ù\88Û\8cÙ\86 Ø´Ø¯Û\81 ØµÙ\81حات Ø§Ù\88ر Ù\85Ù\84Ù\81ات Ú©Ù\88 Ù\85Û\8cرÛ\8c Ø²Û\8cر Ù\86ظر Ù\81Û\81رست Ù\85Û\8cÚº Ø´Ø§Ù\85Ù\84 Ú©Û\8cا Ú©Û\8cجئÛ\92',
+'tog-watchmoves' => 'میرے منتقل کردہ صفحات اور ملفات کو میری زیر نظر فہرست میں شامل کیا کیجئے',
+'tog-watchdeletion' => 'میرے حذف کردہ صفحات اور ملفات کو میری زیر نظر فہرست میں شامل کیا کیجئے',
 'tog-minordefault' => 'تمام ترمیمات کو ہمیشہ بطورِ معمولی ترمیم نشانزد کیا کرو',
 'tog-previewontop' => 'تدوینی خانہ سے پہلے نمائش دکھاؤ',
 'tog-previewonfirst' => 'پہلی ترمیم پر نمائش دکھاؤ',
-'tog-enotifwatchlistpages' => 'جب Ù\85Û\8cرÛ\8c Ø²Û\8cرÙ\90Ù\86ظرÙ\81Û\81رست Ù¾Ø± Ú©Ù\88ئÛ\8c ØµÙ\81Ø­Û\81 Ù\85Û\8cÚº ØªØ¨Ø¯Û\8cÙ\84Û\8c Ù\88اÙ\82ع Û\81Ù\88 ØªÙ\88 Ù\85جھÛ\92 Ø¨Ø±Ù\82Û\8c Ú\88اک Ø¨Ú¾Û\8cجÙ\88',
+'tog-enotifwatchlistpages' => 'جب Ù\85Û\8cرÛ\92 Ø²Û\8cر Ù\86ظر ØµÙ\81Ø­Û\81 Û\8cا Ù\85Ù\84Ù\81 Ù\85Û\8cÚº Ú©Ù\88ئÛ\8c ØªØ¨Ø¯Û\8cÙ\84Û\8c Û\81Ù\88 ØªÙ\88 Ù\85جھÛ\92 Ø¨Ø±Ù\82Û\8c Ú\88اک Ø¨Ú¾Û\8cجئÛ\92',
 'tog-enotifusertalkpages' => 'جب میرا تبادلۂ خیال صفحہ میں تبدیلی واقع ہو تو مجھے برقی ڈاک بھیجو',
-'tog-enotifminoredits' => 'صفحات میں معمولی ترمیمات کے بارے میں بھی مجھے برقی ڈاک بھیجو',
+'tog-enotifminoredits' => 'مجھے صفحات اور ملفات میں کی جانے والی معمولی ترامیم کی خبر بھی بذریعہ برقی ڈاک دیجئے',
 'tog-enotifrevealaddr' => 'خبرداری برقی خطوط میں میرا برقی ڈاک پتہ ظاہر کرو',
 'tog-shownumberswatching' => 'دیکھنے والے صارفین کی تعداد دکھاؤ',
 'tog-oldsig' => 'موجودہ دستخط:',
 'tog-fancysig' => '(سادہ دستخط بلا خودکار ربط)',
-'tog-uselivepreview' => 'براہِ راست نمائش استعمال کرو (JavaScript چاہئے نیز تجرباتی)',
+'tog-uselivepreview' => 'براہ راست نمائش (آزمائشی) استعمال کیجئے',
 'tog-forceeditsummary' => 'جب میں ترمیمی خلاصہ خالی چھوڑوں تو مجھے آگاہ کرو',
 'tog-watchlisthideown' => 'زیرِنظرفہرست سے میری ترمیمات چھپاؤ',
 'tog-watchlisthidebots' => 'زیرِنظرفہرست میں سے روبالی ترمیمات چھپاؤ',
@@ -206,11 +204,13 @@ $messages = array(
 'tog-ccmeonemails' => 'دیگر صارفین کو ارسال کردہ برقی خطوط کی نقول مجھے ارسال کریں۔',
 'tog-diffonly' => 'مختلفات کے نیچے صفحے کی مشمولات مت دکھاؤ',
 'tog-showhiddencats' => 'پوشیدہ زمرہ جات دکھاؤ',
+'tog-norollbackdiff' => 'استرجع کی انجام دہی کے بعد فرق ترک کیجئے',
 'tog-useeditwarning' => 'خبردار مجھے جب میں غیر محفوظ کردہ تبدیلیوں کے ساتھ ایک ترمیم کے صفحے کو چھوڑ دو',
+'tog-prefershttps' => 'دخول نوشتہ کے دوران محفوظ کنکشن استعمال کیجئے',
 
 'underline-always' => 'ہمیشہ',
 'underline-never' => 'کبھی نہیں',
-'underline-default' => 'متصفح کا طے شدہ',
+'underline-default' => 'جلد یا متصفح کا ڈیفالٹ',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'خانۂ تدوین کا اندازِ تحریر:',
@@ -270,6 +270,18 @@ $messages = array(
 'oct' => 'اکتوبر',
 'nov' => 'نومبر',
 'dec' => 'دسمبر',
+'january-date' => '$1 جنوری',
+'february-date' => '$1 فروری',
+'march-date' => '$1 مارچ',
+'april-date' => '$1 اپریل',
+'may-date' => '$1 مئی',
+'june-date' => '$1 جون',
+'july-date' => '$1 جولائی',
+'august-date' => '$1 اگست',
+'september-date' => '$1 ستمبر',
+'october-date' => '$1 اکتوبر',
+'november-date' => '$1 نومبر',
+'december-date' => '$1 دسمبر',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|زمرہ|زمرہ جات}}',
@@ -281,6 +293,8 @@ $messages = array(
 'hidden-category-category' => 'پوشیدہ زمرہ جات',
 'category-subcat-count' => '{{PLURAL:$2|اِس زمرہ میں صرف درج ذیل ذیلی زمرہ ہے.|اِس زمرہ میں درج ذیل {{PLURAL:$1|ذیلی زمرہ|$1 ذیلی زمرہ جات}}, کل $2 میں سے.}}',
 'category-subcat-count-limited' => 'اِس زمرہ میں درج ذیل {{PLURAL:$1|ذیلی زمرہ ہے|$1 ذیلی زمرہ جات ہیں}}.',
+'category-article-count' => '{{PLURAL:$2|اس زمرہ میں صرف یہ درج ذیل صفحہ مشمول ہے۔|اس زمرہ کے کل $2 صفحات میں سے $1 {{PLURAL:$1|صفحہ|صفحات}} درج ذیل {{PLURAL:$1|ہے|ہیں}}۔',
+'category-article-count-limited' => 'یہ درج ذیل {{PLURAL:$1|صفحہ|$1 صفحات}} اس زمرہ میں مشمول {{PLURAL:$1|ہے|ہیں}}۔',
 'listingcontinuesabbrev' => '۔جاری',
 'noindex-category' => 'غیر مندرج صفحات',
 
@@ -1290,7 +1304,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'unwatch' => 'زیرنظرمنسوخ',
 'watchlist-details' => 'آپ کی زیرِنظرفہرست پر {{PLURAL:$1|$1 صفحہ ہے|$1 صفحات ہیں}}، اِس میں تبادلۂ خیال صفحات کی تعداد شامل نہیں.',
 'watchlistcontains' => 'آپ کی زیرنظرفہرست میں $1 صفحات ہیں۔',
-'wlnote' => 'نیچےآخری $1 تبدیلیاں ہیں جو کے پیچھلے <b>$2</b> گھنٹوں میں کی گئیں۔',
 'wlshowlast' => 'دکھائیں آخری $1 گھنٹے $2 دن $3',
 'watchlist-options' => 'اختیارات برائے زیرِنظرفہرست',
 
index 2998e5f..02728c1 100644 (file)
@@ -112,7 +112,6 @@ $linkPrefixCharset = 'a-zA-Z\\x80-\\xffʻʼ«„';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Havolalarning tagiga chizish:',
-'tog-justify' => 'Matnni sahifaning eni boʻyicha tekislash',
 'tog-hideminor' => 'Yangi oʻzgarishlar roʻyxatida kichik tahrirlarni yashirish',
 'tog-hidepatrolled' => 'Yangi oʻzgarishlar roʻyxatida tekshirilgan tahrirlarni yashirish',
 'tog-newpageshidepatrolled' => 'Yangi sahifalar roʻyxatida tekshirilgan sahifalarni yashirish',
@@ -123,13 +122,13 @@ $messages = array(
 'tog-editondblclick' => 'Sichqoncha tugmasini ikki marta bosish orqali tahrirlashni boshlash',
 'tog-editsectiononrightclick' => 'Boʻlim sarlavhasiga sichqonchaning oʻng tugmasi bilan bosib tahrirlashni boshlash',
 'tog-rememberpassword' => 'Hisob ma’lumotlarim ushbu brauzerda eslab qolinsin (ko‘pi bilan $1 kunga)',
-'tog-watchcreations' => 'Men yaratgan sahifalarni va yuklagan fayllarni kuzatuv roʻyxatimga qoʻsh',
-'tog-watchdefault' => 'Men tahrirlagan sahifa va fayllarni kuzatuv roʻyxatimga qoʻsh',
-'tog-watchmoves' => 'Men koʻchirgan sahifa va fayllarni kuzatuv roʻyxatimga qoʻsh',
+'tog-watchcreations' => 'Men yaratgan sahifalar va yuklagan fayllar kuzatuv roʻyxatimga qoʻshilsin',
+'tog-watchdefault' => 'Men tahrirlagan sahifa va fayllar kuzatuv roʻyxatimga qoʻshilsin',
+'tog-watchmoves' => 'Men nomini koʻchirgan sahifa va fayllar kuzatuv roʻyxatimga qoʻshilsin',
 'tog-watchdeletion' => 'Men oʻchirgan sahifa va fayllarni kuzatuv roʻyxatimga qoʻsh',
 'tog-minordefault' => 'Sukut boʻyicha barcha tahrirlarimni «kichik tahrir» etib belgilash',
-'tog-previewontop' => 'Tahrir oynasi tepasida koʻrib chiqish',
-'tog-previewonfirst' => 'Tahrirlashga oʻtiboq koʻrib chiqishni boshlash',
+'tog-previewontop' => 'Koʻrib chiqish imkoniyati tahrir oynasi tepasida boʻlsin',
+'tog-previewonfirst' => 'Tahrirlashga oʻtgandayoq koʻrib chiqishni boshlash',
 'tog-enotifwatchlistpages' => 'Kuzatuv roʻyxatimdagi sahifa yoki fayllar oʻzgartirilsa, menga bu haqda xat yuborilsin',
 'tog-enotifusertalkpages' => 'Munozara sahifam oʻzgartirilsa, menga bu haqda xat yuborilsin',
 'tog-enotifminoredits' => 'Kichik tahrir qilinsa ham e-pochtamga bu haqda xat yuborilsin',
@@ -151,6 +150,7 @@ $messages = array(
 'tog-noconvertlink' => 'Sarlavhani oʻzgartirish havolasini oʻchirib qoʻyish',
 'tog-norollbackdiff' => 'Tahrir qaytarilganda, versiyalar taqqosi koʻrsatilmasin',
 'tog-useeditwarning' => 'Kiritgan oʻzgarishlarimni saqlamay sahifadan chiqib ketayotganim haqida ogohlantirilsin',
+'tog-prefershttps' => 'Doim himoyalangan holda kirish',
 
 'underline-always' => 'Har doim',
 'underline-never' => 'Hech qachon',
@@ -425,8 +425,10 @@ $1',
 'viewsource' => 'Manbasini koʻrish',
 'viewsource-title' => '$1 sahifasining manbasini koʻrish',
 'actionthrottled' => 'Tezlik cheklovi',
-'protectedpagetext' => 'Bu sahifa tahrirlash va boshqa oʻzgartirishlar kiritishdan himoyalangan.',
+'protectedpagetext' => 'Bu sahifa tahrirlash va boshqa oʻzgarishlar kiritishdan himoyalangan.',
 'viewsourcetext' => 'Siz bu sahifaning manbasini koʻrishingiz va uni nusxasini olishingiz mumkin:',
+'protectedinterface' => 'Ushbu sahifada dasturiy taʼminot interfeysi xabari mavjud. Bezoriliklardan saqlash uchun uni oʻzgartirish taʼqiqlangan.
+Ushbu xabar tarjimasini qoʻshish yoki oʻzgartirish uchun, iltimos, MediaWikining [//translatewiki.net/ translatewiki.net] mahalliylashtirish saytidan foydalaning.',
 'editinginterface' => "'''Diqqat:''' Siz dasturiy taʼminot interfeysi matni mavjud boʻlgan sahifani tahrirlamoqdasiz.
 Uning oʻzgartirilishi ushbu vikidagi boshqa foydalanuvchilar uchun ham interfeys oʻzgarishiga olib keladi.
 Ushbu xabar tarjimasini qoʻshish yoki oʻzgartirish uchun, iltimos, MediaWikining [//translatewiki.net/ translatewiki.net] mahalliylashtirish saytidan foydalaning.",
@@ -520,7 +522,7 @@ Ism yozilishini tekshirib koʻring.',
 
 # Change password dialog
 'changepassword' => 'Maxfiy soʻzni oʻzgartirish',
-'resetpass_header' => "Hisob mahfiy so'zini o'zgartirish",
+'resetpass_header' => 'Maxfiy soʻzni oʻzgartirish',
 'oldpassword' => "Eski mahfiy so'z:",
 'newpassword' => "Yangi mahfiy so'z:",
 'retypenew' => 'Yangi mahfiy soʻzni qayta tering:',
@@ -563,7 +565,7 @@ Vaqtinchalik maxfiy so'z: $2",
 'headline_tip' => '2-darajadagi sarlavha',
 'nowiki_sample' => 'Bu yerga formatlash zarur boʻlmagan matnni qoʻying',
 'nowiki_tip' => "Viki-formatlashga e'tibor qilmaslik",
-'image_tip' => 'Qoʻshilgan tasvir',
+'image_tip' => 'Fayl oʻrnatish',
 'media_tip' => 'Faylga havola',
 'sig_tip' => 'Imzoingiz va sana',
 'hr_tip' => "Yotiq (gorizontal) chiziq (ko'p ishlatmang)",
@@ -575,7 +577,7 @@ Vaqtinchalik maxfiy so'z: $2",
 'watchthis' => 'Sahifani kuzatish',
 'savearticle' => 'Saqlash',
 'preview' => 'Ko‘rib chiqish',
-'showpreview' => 'Korib chiqish',
+'showpreview' => 'Koʻrib chiqish',
 'showlivepreview' => 'Tezkor koʻrib chiqish',
 'showdiff' => 'O‘zgarishlarni ko‘rsatish',
 'anoneditwarning' => "'''Diqqat:''' Siz tizimga kirmagansiz. Ushbu sahifa tarixida Sizning IP manzilingiz yozib qolinadi.",
@@ -734,7 +736,6 @@ Bu yerda: '''({{int:cur}})''' = hozirgi koʻrinish bilan farqi, '''({{int:last}}
 'compareselectedversions' => 'Tanlangan versiyalarni solishtir',
 'showhideselectedversions' => 'Tanlangan versiyalarni koʻrsatish/yashirish',
 'editundo' => 'qaytarish',
-'diff-multi' => '({{PLURAL:$2|Bitta foydalanuvchining|$2 ta foydalanuvchining}} {{PLURAL:$1|bitta oraliq versiyasi|$1 ta oraliq versiyalari}} koʻrsatilmadi)',
 
 # Search results
 'searchresults' => 'Qidiruv natijalari',
@@ -750,7 +751,7 @@ Bu yerda: '''({{int:cur}})''' = hozirgi koʻrinish bilan farqi, '''({{int:last}}
 'shown-title' => 'Sahifada $1 ta natija koʻrsatish',
 'viewprevnext' => 'Koʻrish ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Ushbu vikida \"[[:\$1]]\" nomli sahifa mavjud.'''",
-'searchmenu-new' => "'''Ushbu vikida \"[[:\$1]]\" sahifasini yarat!'''",
+'searchmenu-new' => '<strong>\'\'\'Ushbu vikida "[[:$1]]" sahifasini yarat!</strong> {{PLURAL:$2|0=|Shuningdek qidiruvingiz orqali topilgan sahifani qarang.|Shuningdek topilgan qidiruv natijalarini qarang.}}',
 'searchprofile-articles' => 'Maqolalar',
 'searchprofile-project' => 'Yordam va loyiha sahifalari',
 'searchprofile-images' => 'Multimedia',
@@ -771,7 +772,7 @@ Bu yerda: '''({{int:cur}})''' = hozirgi koʻrinish bilan farqi, '''({{int:last}}
 'search-interwiki-default' => '$1 natijalar:',
 'search-interwiki-more' => '(yana)',
 'search-relatedarticle' => "Bog'liq",
-'searcheverything-enable' => 'Barcha nomfazolarda qidir',
+'searcheverything-enable' => 'Barcha nomfazolardan qidirish',
 'searchrelated' => 'bogʻlangan',
 'searchall' => 'barchasi',
 'showingresults' => "Quyida №'''$2'''dan boshlab {{PLURAL:$1|'''bitta''' natija|'''$1''' ta natija}} koʻrsatilgan.",
@@ -801,8 +802,10 @@ Bu yerda: '''({{int:cur}})''' = hozirgi koʻrinish bilan farqi, '''({{int:last}}
 'prefs-rc' => 'Yangi o‘zgartirishlar',
 'prefs-watchlist' => 'Kuzatuv roʻyxati',
 'prefs-watchlist-days' => 'Kunlar soni:',
-'prefs-watchlist-days-max' => 'Eng ko‘pi bilan $1 {{PLURAL:$1|kun}}',
-'prefs-watchlist-edits-max' => 'Eng katta son: 1000',
+'prefs-watchlist-days-max' => 'Maksimum $1 kun',
+'prefs-watchlist-edits' => 'Kengaytirilgan kuzatuv roʻyxatingizda koʻrsatiladigan oʻzgarishlar soni:',
+'prefs-watchlist-edits-max' => 'Maksimum: 1000',
+'prefs-watchlist-token' => 'Kuzatuv roʻyxatingiz tokeni:',
 'prefs-misc' => 'Boshqa moslamalar',
 'prefs-resetpass' => 'Maxfiy soʻzni oʻzgartirish',
 'prefs-changeemail' => 'Elektron pochta manzilini oʻzgartirish',
@@ -814,17 +817,19 @@ Bu yerda: '''({{int:cur}})''' = hozirgi koʻrinish bilan farqi, '''({{int:last}}
 'rows' => 'Qatorlar soni:',
 'columns' => 'Ustunlar soni:',
 'searchresultshead' => 'Qidiruv',
-'stub-threshold' => '<a href="#" class="stub">Chala maqolalarga ishorat</a> keltirish uchun pastki chegara (baytlarda):',
+'stub-threshold' => '[[Special:ShortPages|Chala maqolalarga]] ishorat keltirish uchun pastki chegara:',
 'stub-threshold-disabled' => 'Oʻchirib qoʻyilgan',
 'recentchangesdays' => 'Necha kunlik tahrirlar koʻrsatiladi:',
-'recentchangesdays-max' => 'Eng koʻpi — $1 kun',
+'recentchangesdays-max' => 'Maksimum $1 kun',
 'recentchangescount' => 'Sukut boʻyicha koʻrsatiladigan tahrirlar soni:',
-'prefs-help-recentchangescount' => 'Yangi oʻzgarishlar, tarix va qaydlar uchun.',
+'prefs-help-recentchangescount' => 'Yangi oʻzgarishlar, sahifalar tarixi va qaydlar uchun',
+'prefs-help-watchlist-token2' => 'Bu kuzatuv roʻyxatingizning veb-kanali uchun maxfiy kalit kodi.
+Bu kodni biladigan har kim sizning kuzatuv roʻyxatingizni koʻrishi mumkin, shuning uchun boshqalarga uni oshkor qilmang. [[Special:ResetTokens|Tokenni yangilash]].',
 'savedprefs' => 'Sizning moslamalaringiz saqlandi.',
 'timezonelegend' => 'Vaqt mintaqangiz:',
 'localtime' => 'Mahalliy vaqt:',
 'timezoneuseserverdefault' => 'Server moslamalaridan foydalanish ($1)',
-'timezoneuseoffset' => "Boshqa (siljishni ko'rsating)",
+'timezoneuseoffset' => 'Boshqa (siljishni koʻrsating)',
 'servertime' => 'Server vaqti:',
 'guesstimezone' => "Brauzerdan to'ldirish",
 'timezoneregion-africa' => 'Afrika',
@@ -984,6 +989,10 @@ Agar keltirsangiz, undan sahifa kim tomonidan tahrirlanganini koʻrsatish uchun
 'upload' => 'Fayl yuklash',
 'uploadbtn' => 'Fayl yuklash',
 'uploaderror' => 'Yuklashda xatolik',
+'upload-recreate-warning' => '<strong>Diqqat: bunday nomli fayl avval yoʻqotilgan yoki koʻchirilgan.</strong>
+
+Quyida bu sahifaga oid yoʻqotish va koʻchirish qaydlari keltirilgan:',
+'upload-permitted' => 'Yuklash mumkin fayl turlari: $1.',
 'uploadlogpage' => 'Yuklash qaydlari',
 'filename' => 'Fayl nomi',
 'filedesc' => 'Qisqa izoh',
@@ -992,11 +1001,20 @@ Agar keltirsangiz, undan sahifa kim tomonidan tahrirlanganini koʻrsatish uchun
 'filestatus' => 'Tarqatish shartlari:',
 'filesource' => 'Manba:',
 'uploadedfiles' => 'Yuklangan fayllar',
+'ignorewarnings' => 'Ogohlantirishlarga eʼtibor qilma',
 'uploadedimage' => '"[[$1]]"ni yukladi',
 'overwroteimage' => '"[[$1]]"ning yangi versiyasini yukladi',
+'upload-source' => 'Yuklanayotgan fayl',
+'sourcefilename' => 'Fayl nomi:',
+'destfilename' => 'Fayl nomi:',
+'upload-maxfilesize' => 'Faylning maksimal oʻlchami: $1',
+'upload-description' => 'Fayl tavsifi',
+'upload-options' => 'Yuklash moslamalari',
+'watchthisupload' => 'Bu faylni kuzatish',
 
 'license' => 'Litsenziyalash:',
 'license-header' => 'Litsenziyalash',
+'upload_source_file' => '(kompyuteringizdagi fayl)',
 
 # Special:ListFiles
 'listfiles-summary' => 'Ushbu maxsus sahifada barcha yuklangan fayllar koʻrsatilgan.',
@@ -1076,7 +1094,7 @@ Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
 'uncategorizedcategories' => 'Turkumlashtirilmagan turkumlar',
 'uncategorizedimages' => 'Turkumlashtirilmagan fayllar',
 'uncategorizedtemplates' => 'Turkumlashtirilmagan andozalar',
-'unusedcategories' => 'Ishlatilinmagan turkumlar',
+'unusedcategories' => 'Ishlatilmayotgan turkumlar',
 'unusedimages' => 'Ishlatilinmagan fayllar',
 'wantedcategories' => 'Talab qilinayotgan turkumlar',
 'mostcategories' => 'Eng koʻp turkumli sahifalar',
@@ -1124,9 +1142,9 @@ Natijalarni jurnal nomi, foydalanuvchi nomi (harflar katta-kichikligi inobatga o
 
 # Special:Categories
 'categories' => 'Turkumlar',
-'categoriespagetext' => 'The following {{PLURAL:$1|category contains|categories contain}} pages or media.
-[[Special:UnusedCategories|Unused categories]] are not shown here.
-Also see [[Special:WantedCategories|wanted categories]].',
+'categoriespagetext' => 'Quyidagi {{PLURAL:$1|turkumda|turkumlarda}} sahifa yoki media-fayllar mavjud.
+[[Special:UnusedCategories|Ishlatilmayotgan turkumlar]] bu yerda koʻrsatilmaydi.
+Shuningdek qarang: [[Special:WantedCategories|talab qilinayotgan turkumlar]].',
 'categoriesfrom' => 'Quyidagidan boshlanuvchi turkumlarni koʻrsatish:',
 'special-categories-sort-count' => 'miqdori bo‘yicha saralash',
 'special-categories-sort-abc' => 'alifbo bo‘yicha saralash',
@@ -1719,4 +1737,7 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'api-error-unknown-code' => 'Noaniq xato: "$1".',
 'api-error-unknownerror' => 'Noaniq xato: "$1".',
 
+# Limit report
+'limitreport-title' => 'Tahlillagich maʼlumotlari:',
+
 );
index 06a12e7..5323ad4 100644 (file)
@@ -161,7 +161,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Sotołinea i cołegamenti:',
-'tog-justify' => 'Paragrafo: giustifegà',
 'tog-hideminor' => 'Scondi i canbiamenti picenini in tei "Ultimi canbiamenti"',
 'tog-hidepatrolled' => 'Scondi i canbiamenti verificà in tei "Ultimi canbiamenti"',
 'tog-newpageshidepatrolled' => "Scondi łe pajine verifegae da l'elenco de łe pajine pì resenti",
@@ -1150,7 +1149,6 @@ Assicùrete che la continuità storica de la pagina no la vegna alterà.',
 'showhideselectedversions' => 'Mostra/scondi version selessionà',
 'editundo' => 'tira indrìo',
 'diff-empty' => '(Nissuna difarensa)',
-'diff-multi' => '({{PLURAL:$1|Una revision intermedia|$1 revision intermedie}} de {{PLURAL:$2|un utente|$2 utenti}} mia mostrà)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Una revision intermedia|$1 revision intermedie}} de pi de {{PLURAL:$2|un utente|$2 utenti}} mia mostrà)',
 'difference-missing-revision' => "{{PLURAL:$2|Na version|$2 version}} de sta difarensa ($1) {{PLURAL:$2|nó ła xe sta trovà|nó łe xe stae trovae}}.
 
@@ -2152,7 +2150,6 @@ I futuri canbiamenti a sta pàjina e a ła so pàjina de discusion i vegnarà el
 'watchmethod-list' => 'controło de i osservati speciałi par modifeghe recenti',
 'watchlistcontains' => 'La lista de i osservati speciałi la contien {{PLURAL:$1|una pagina|$1 pagine}}.',
 'iteminvalidname' => "Problemi con la voxe '$1', nome mìa vałido...",
-'wlnote' => "Cuà soto te cati {{PLURAL:$1|'l ultimo canbiamento|i ultimi '''$1''' canbiamenti}} inte {{PLURAL:$2|l'ultema ora|łe ultime '''$2''' ore}}; i dati i xe axornai a łe $4 del $3.",
 'wlshowlast' => 'Mostra le ultime $1 ore $2 zorni $3',
 'watchlist-options' => "Inpostassion de le pagine tegnùe d'ocio",
 
@@ -2781,7 +2778,6 @@ Salveło so'l to conpiuter e carghelo cuà.",
 'tooltip-pt-watchlist' => "La lista de le pagine che te sì drio tegner d'ocio",
 'tooltip-pt-mycontris' => 'Elenco de i to contributi',
 'tooltip-pt-login' => 'Te consiliemo de registrarte, ma no te ghè da farlo par forsa.',
-'tooltip-pt-anonlogin' => "Te consigliemo de registrarte, ma no'l xe obligatorio.",
 'tooltip-pt-logout' => 'Và fora',
 'tooltip-ca-talk' => 'Discussion sul contenuto de sta pagina',
 'tooltip-ca-edit' => 'Te poli canbiar sta pagina. Par piaser dòpara el boton de anteprima, prima de salvar.',
index 75374d3..f1eb0a7 100644 (file)
@@ -90,7 +90,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Jonoštada kosketused:',
-'tog-justify' => 'Tazoitada tekst lehtpolen levedusen mödhe',
 'tog-hideminor' => 'Peitta pened redakcijad veresiden toižetusiden nimikirjuteses',
 'tog-hidepatrolled' => 'Peitta patruliruidud redakcijad veresiden toižetusiden nimikirjuteses',
 'tog-newpageshidepatrolled' => 'Peitta patruliruidud redakcijad uziden lehtpoliden nimikirjuteses',
@@ -941,7 +940,6 @@ Tö ei voigoi kävutada sidä.',
 'compareselectedversions' => 'Rindatada valitud versijad',
 'showhideselectedversions' => 'Ozutada/peitta valitud versijad',
 'editundo' => 'heitta pätand',
-'diff-multi' => "({{PLURAL:$1|üks' keskmäine versii ei ole|$1 keskmäšt versijad ei olgoi}} {{PLURAL:$2|one user|$2 users}} ozutadud)",
 
 # Search results
 'searchresults' => "Ectä rezul'tatad",
@@ -2284,7 +2282,6 @@ Ei ole pordaigašt failhodrad.',
 'tooltip-pt-watchlist' => 'Lehtpoled, kudambid minä kaclen',
 'tooltip-pt-mycontris' => 'Minun redakcijoiden nimikirjutez',
 'tooltip-pt-login' => 'Naku sab kirjutadas sistemha, no necidä ei tarbiž radon täht',
-'tooltip-pt-anonlogin' => 'Naku sab kirjutadas sistemha, no necidä ei tarbiž radon täht',
 'tooltip-pt-logout' => 'Lähtta sistemaspäi',
 'tooltip-ca-talk' => 'Diskussii neciš lehtpoles',
 'tooltip-ca-edit' => "Sab redaktiruida necidä lehtpol't.
index 178bc97..1d4ef60 100644 (file)
@@ -339,7 +339,6 @@ $separatorTransformTable = array( ',' => '.', '.' => ',' );
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Gạch chân liên kết:',
-'tog-justify' => 'Căn đều hai bên đoạn văn',
 'tog-hideminor' => 'Ẩn sửa đổi nhỏ trong thay đổi gần đây',
 'tog-hidepatrolled' => 'Ẩn sửa đổi đã tuần tra trong trang thay đổi gần đây',
 'tog-newpageshidepatrolled' => 'Ẩn trang đã tuần tra trong danh sách các trang mới',
@@ -502,7 +501,6 @@ $messages = array(
 'vector-action-protect' => 'Khóa',
 'vector-action-undelete' => 'Phục hồi',
 'vector-action-unprotect' => 'Đổi mức khóa',
-'vector-simplesearch-preference' => 'Hộp tìm kiếm đơn giản (cần bề ngoài Vectơ)',
 'vector-view-create' => 'Tạo',
 'vector-view-edit' => 'Sửa đổi',
 'vector-view-history' => 'Xem lịch sử',
@@ -550,7 +548,7 @@ $messages = array(
 'postcomment' => 'Đề mục mới',
 'articlepage' => 'Xem trang nội dung',
 'talk' => 'Thảo luận',
-'views' => 'Hình dạng',
+'views' => 'Các hiển thị',
 'toolbox' => 'Công cụ',
 'userpage' => 'Xem trang thành viên',
 'projectpage' => 'Xem trang dự án',
@@ -882,7 +880,7 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 'retypenew' => 'Gõ lại:',
 'resetpass_submit' => 'Chọn mật khẩu và đăng nhập',
 'changepassword-success' => 'Đã đổi mật khẩu thành công!',
-'changepassword-throttled' => 'Bạn thử đăng nhập gần đây nhiều lần quá. Xin chờ $1 trước khi bạn thử lần nữa.',
+'changepassword-throttled' => 'Bạn đã thử đăng nhập gần đây nhiều lần quá. Xin chờ $1 trước khi bạn thử lần nữa.',
 'resetpass_forbidden' => 'Không được đổi mật khẩu',
 'resetpass-no-info' => 'Bạn phải đăng nhập mới có thể truy cập trực tiếp trang này.',
 'resetpass-submit-loggedin' => 'Thay đổi mật khẩu',
@@ -942,7 +940,7 @@ Mật khẩu tạm: $2',
 'changeemail-password' => 'Mật khẩu của bạn tại {{SITENAME}}:',
 'changeemail-submit' => 'Đổi địa chỉ',
 'changeemail-cancel' => 'Hủy bỏ',
-'changeemail-throttled' => 'Bạn thử đăng nhập nhiều lần quá. Xin chờ $1 trước khi bạn thử lần nữa.',
+'changeemail-throttled' => 'Bạn đã thử đăng nhập nhiều lần quá. Xin chờ $1 trước khi bạn thử lần nữa.',
 
 # Special:ResetTokens
 'resettokens' => 'Đặt lại dấu hiệu',
@@ -1157,7 +1155,7 @@ Nó đã tồn tại.',
 'invalid-content-data' => 'Dữ liệu nội dung không hợp lệ',
 'content-not-allowed-here' => 'Không cho phép đưa nội dung “$1” vào trang [[$2]]',
 'editwarning-warning' => 'Rời khỏi trang này sẽ khiến bạn mất các sửa đổi đã thực hiện.
-Nếu đã đăng nhập, bạn có thể tắt cảnh báo này tại mục “Sửa đổi” trong tùy chọn cá nhân.',
+Nếu đã đăng nhập, bạn có thể tắt cảnh báo này tại mục “{{int:prefs-editing}}” trong tùy chọn cá nhân.',
 'editpage-notsupportedcontentformat-title' => 'Không hỗ trợ định dạng nội dung',
 'editpage-notsupportedcontentformat-text' => 'Mô hình nội dung $2 không hỗ trợ định dạng nội dung $1.',
 
@@ -1193,6 +1191,7 @@ Những tham số này sẽ bị bỏ đi.',
 'undo-success' => 'Các sửa đổi có thể được lùi lại. Xin hãy kiểm tra phần so sánh bên dưới để xác nhận lại những gì bạn muốn làm, sau đó lưu thay đổi ở dưới để hoàn tất việc lùi lại sửa đổi.',
 'undo-failure' => 'Sửa đổi không thể phục hồi vì đã có những sửa đổi mới ở sau.',
 'undo-norev' => 'Sửa đổi không thể hồi phục vì nó không tồn tại hoặc đã bị xóa.',
+'undo-nochange' => 'Hình như sửa đổi này đã được lùi lại rồi.',
 'undo-summary' => 'Đã lùi lại sửa đổi $1 của [[Special:Contributions/$2|$2]] ([[User talk:$2|Thảo luận]])',
 'undo-summary-username-hidden' => 'Đã lùi lại sửa đổi $1 của một người dùng ẩn',
 
@@ -1372,7 +1371,8 @@ Xin hãy bảo đảm giữ vững tính liên tục của lịch sử trang.',
 'showhideselectedversions' => 'Thay đổi mức khả kiến của các phiên bản được chọn',
 'editundo' => 'lùi sửa',
 'diff-empty' => '(Không có sự khác biệt)',
-'diff-multi' => '(Không hiển thị {{PLURAL:$1||$1}} phiên bản {{PLURAL:$2||của $2 thành viên}} ở giữa)',
+'diff-multi-sameuser' => '(Không hiển thị {{PLURAL:$1||$1}} phiên bản của cùng người dùng ở giữa)',
+'diff-multi-otherusers' => '(Không hiển thị {{PLURAL:$1||$1}} phiên bản của {{PLURAL:$2|một người dùng khác|$2 người dùng}} ở giữa)',
 'diff-multi-manyusers' => '(Không hiển thị {{PLURAL:$1||$1}} phiên bản của hơn $2 thành viên ở giữa)',
 'difference-missing-revision' => 'Không tìm thấy {{PLURAL:$2|một phiên bản|$2 phiên bản}} trong khác biệt này ($1).
 
@@ -1393,7 +1393,7 @@ Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'shown-title' => 'Hiển thị $1 {{PLURAL:$1|kết quả|kết quả}} mỗi trang',
 'viewprevnext' => 'Xem ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "* Trang '''[[$1]]'''",
-'searchmenu-new' => "'''Tạo trang “[[:$1]]” trên wiki này!'''",
+'searchmenu-new' => "'''Tạo trang “[[:$1]]” trên wiki này!''' {{PLURAL:$2|0=|Hãy xem {{PLURAL:$2|kết quả|các kết quả}} tìm kiếm:}}",
 'searchprofile-articles' => 'Trang nội dung',
 'searchprofile-project' => 'Trang trợ giúp và trang dự án',
 'searchprofile-images' => 'Đa phương tiện',
@@ -1419,8 +1419,9 @@ Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'searchrelated' => 'có liên quan',
 'searchall' => 'tất cả',
 'showingresults' => "Dưới đây là {{PLURAL:$1|'''1'''|'''$1'''}} kết quả bắt đầu từ #'''$2'''.",
+'showingresultsinrange' => 'Dưới đây là cho tới <strong>$1</strong> kết quả từ #<strong>$2</strong> đến #<strong>$3</strong>.',
 'showingresultsnum' => "Dưới đây là {{PLURAL:$3|'''1'''|'''$3'''}} kết quả bắt đầu từ #'''$2'''.",
-'showingresultsheader' => "{{PLURAL:$5|Kết quả thứ '''$1''' trong tổng số '''$3''' kết quả|Kết quả từ '''$1 - $2''' trong tổng số '''$3''' kết quả}} cho '''$4'''",
+'showingresultsheader' => "{{PLURAL:$5|Kết quả thứ '''$1''' trong tổng số '''$3''' kết quả|Các kết quả '''$1–$2''' trong tổng số '''$3''' kết quả}} cho '''$4'''",
 'search-nonefound' => 'Không có kết quả nào khớp với câu truy vấn.',
 'powersearch-legend' => 'Tìm kiếm nâng cao',
 'powersearch-ns' => 'Tìm trong không gian tên:',
@@ -2427,6 +2428,7 @@ Những sửa đổi đối với trang này và trang thảo luận của nó s
 'watchmethod-list' => 'Dưới đây hiện danh sách các trang theo dõi.',
 'watchlistcontains' => 'Danh sách theo dõi của bạn có $1 {{PLURAL:$1|trang|trang}}.',
 'iteminvalidname' => 'Tên trang “$1” không hợp lệ…',
+'wlnote2' => 'Bên dưới có các thay đổi vào <strong>$1</strong> giờ qua, vào lúc $3 $2.',
 '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',
 
@@ -2791,7 +2793,7 @@ Xem lại những lần cấm tại [[Special:BlockList|danh sách cấm]].',
 'change-blocklink' => 'đổi mức cấm',
 'contribslink' => 'đóng góp',
 'emaillink' => 'gửi thư điện tử',
-'autoblocker' => 'Bạn bị tự động cấm vì địa chỉ IP của bạn vừa rồi đã được “[[User:$1|$1]]” sử dụng. Lý do đưa ra cho việc cấm $1 là: ”$2”',
+'autoblocker' => 'Bạn bị tự động cấm vì địa chỉ IP của bạn vừa rồi đã được “[[User:$1|$1]]” sử dụng. Lý do đưa ra cho việc cấm $1 là ”$2”',
 'blocklogpage' => 'Nhật trình cấm',
 'blocklog-showlog' => 'Thành viên này trước đây đã bị cấm. Nhật trình cấm được ghi ra ở đây để tiện theo dõi:',
 'blocklog-showsuppresslog' => 'Thành viên trước đây đã từng bị cấm và ẩn đi. Nhật trình ẩn được ghi dưới đây để tiện theo dõi:',
@@ -2977,6 +2979,7 @@ Mời vào [https://www.mediawiki.org/wiki/Localisation?uselang=vi Địa phươ
 'allmessages-prefix' => 'Lọc theo tiền tố:',
 'allmessages-language' => 'Ngôn ngữ:',
 'allmessages-filter-submit' => 'Xem',
+'allmessages-filter-translate' => 'Biên dịch',
 
 # Thumbnails
 'thumbnail-more' => 'Phóng lớn',
@@ -3028,7 +3031,7 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 'importuploaderrortemp' => 'Không thể tải tập tin nhập trang. Thiếu thư mục tạm.',
 'import-parse-failure' => 'Không thể phân tích tập tin nhập XML',
 'import-noarticle' => 'Không có trang nào để nhập cả!',
-'import-nonewrevisions' => 'Tất cả các phiên bản đều đã được nhập trước đây.',
+'import-nonewrevisions' => 'Không nhập phiên bản nào (tất cả các phiên bản đều đã có sẵn hoặc bị bỏ qua do lỗi).',
 'xml-error-string' => '$1 tại dòng $2, cột $3 (byte $4): $5',
 'import-upload' => 'Tải lên dữ liệu XML',
 'import-token-mismatch' => 'Mất dữ liệu phiên làm việc. Xin hãy thử lại lần nữa.',
@@ -3039,6 +3042,7 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 '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-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>',
 'import-rootpage-invalid' => 'Trang đích không hợp lệ.',
 'import-rootpage-nosubpage' => 'Không gian tên “$1” của trang gốc không cho phép các trang con.',
@@ -4332,6 +4336,5 @@ Nếu không thì bạn có thể điền biểu mẫu đơn giản ở dưới.
 'expand_templates_preview' => 'Xem trước',
 
 # Unknown messages
-'createaccount-hook-aborted' => '$1',
 'uploadinvalidxml' => 'Không thể phân tích mã XML trong tập tin tải lên.',
 );
index 483fb20..18caff0 100644 (file)
@@ -63,10 +63,8 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Linggs undârschdrajchn:',
-'tog-justify' => 'Dhägsd in Blogsads',
 'tog-hideminor' => 'Glaane ändrungn ned ôôdsajchn',
 'tog-hidepatrolled' => 'Ned dsajchn in dâ „Ledschdâ Ändrungn“, was an andrar schon brüüfd had',
-'tog-showtoc' => 'Inhalds-fârdsajchnis ôôdsajchn baj määr wi 3 iiwârschrifdn',
 'tog-rememberpassword' => 'Uf dem Ghombjuudâr schdändich ôôgmäld blajwn (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'tog-watchcreations' => 'Ale fon miir sälwâr gmachdn sajdn soln uf mâj beoobachdungs-lischdn',
 'tog-watchdefault' => 'Ale fon miir gändârdnd sajdn soln uf mâj beoobachdungs-lischdn',
@@ -475,7 +473,6 @@ Zu deiner Informadion folchd des Lösch- un Verschäibungs-Logbuch miid der Begr
 'lineno' => 'Dsajln $1:',
 'compareselectedversions' => 'Ausgwäälde wärsjoona fârglajchn',
 'editundo' => 'riggängich machng',
-'diff-multi' => '({{PLURAL:$1|A dazwischaliengde Version|$1 dazwischaliengde Versiona}} von {{PLURAL:$2|am Nutzer|$2 Nutzern}} {{PLURAL:$1|wird|werrn}} ned ozeichd)',
 
 # Search results
 'searchresults' => 'Bam suchng gfundne sachng',
@@ -551,7 +548,6 @@ Zu deiner Informadion folchd des Lösch- un Verschäibungs-Logbuch miid der Begr
 'rows' => 'Soofiil dsajln:',
 'columns' => 'Soofiil schbaldn',
 'searchresultshead' => 'Suuchn',
-'resultsperpage' => 'Broo rudsch dsajchn:',
 'recentchangesdays' => 'Wiifiil dääch dsrig baj  „Ledschdn ändrungn“',
 'recentchangesdays-max' => 'Hegschdns $1 {{PLURAL:$1|daach|dääch}}',
 'recentchangescount' => 'Wiifiil ändrungn dsrig baj „Ledschdn ändrungn“',
index cab261a..1b16414 100644 (file)
@@ -114,7 +114,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Dislienükön yümis:',
-'tog-justify' => 'Lonedükön bagafis',
 'tog-hideminor' => 'Klänedön redakamis pülik su lised votükamas nulik',
 'tog-hidepatrolled' => 'Klänedön redakamis pezepöl in lised votükamas nulik.',
 'tog-newpageshidepatrolled' => 'Klänedön padis pezepöl in lised padas nulik',
@@ -123,9 +122,7 @@ $messages = array(
 'tog-numberheadings' => 'Givön itjäfidiko nümis dilädatiädes',
 'tog-showtoolbar' => 'Jonön redakamastumemi',
 'tog-editondblclick' => 'Dälön redakön padis pö drän telik mugaknopa',
-'tog-editsection' => 'Dälön redakami dilädas me yüms: [redakön]',
 'tog-editsectiononrightclick' => 'Dälön redakami diläda me klik mugaknopa detik su dilädatiäds',
-'tog-showtoc' => 'Jonön ninädalisedi (su pads labü diläds plu 3)',
 'tog-rememberpassword' => 'Dakipolös nunädamanünis obik in bevüresodatävöm at (muiko {{PLURAL:$1|del|dels}} $1)',
 'tog-watchcreations' => 'Läükön padis fa ob pejafölis e ragivis fa ob pelöpükölis lä galädalised obik',
 'tog-watchdefault' => 'Läükön padis e ragivis fa ob peredakölis la galädalised obik',
@@ -929,7 +926,6 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
 'compareselectedversions' => 'Leigodolöd fomamis pevälöl',
 'showhideselectedversions' => 'Jonön/klänedön fomamis pevälöl',
 'editundo' => 'sädunön',
-'diff-multi' => '({{PLURAL:$1|Revid vüik bal|Revids vüik $1}} fa {{PLURAL:$2|geban bal|gebans $2}} no {{PLURAL:$1|pejonon|pejonons}})',
 
 # Search results
 'searchresults' => 'Sukaseks',
@@ -1692,7 +1688,6 @@ If vilol poso moükön padi de galädalised olik, välolös lä on knopi: „neg
 'watchmethod-list' => 'vestigam votükamas brefabüik padas galädaliseda',
 'watchlistcontains' => 'Galädalised olik labon {{PLURAL:$1|padi|padis}} $1.',
 'iteminvalidname' => "Fikul tefü el '$1': nem no lonöföl...",
-'wlnote' => "Is palisedons votükam{{PLURAL:$1| lätik|s lätik '''$1'''}} dü düp{{PLURAL:$2| lätik|s lätik '''$2'''}}.",
 'wlshowlast' => 'Jonolöd: düpis lätik $1, delis lätik $2, $3',
 'watchlist-options' => 'Paramets galädaliseda',
 
@@ -2215,7 +2210,6 @@ Dakipolös oni su nünöm olik e löpükolös oni isio.',
 'tooltip-pt-watchlist' => 'Lised padas, kö galädol tefü votükams',
 'tooltip-pt-mycontris' => 'Lised keblünotas olik',
 'tooltip-pt-login' => 'Binos gudik, ab no bligik, ad nunädön oyi.',
-'tooltip-pt-anonlogin' => 'Binos gudik - ab no zesüdik - ad nunädön oli.',
 'tooltip-pt-logout' => 'Senunädön oki',
 'tooltip-ca-talk' => 'Bespik dö ninädapad',
 'tooltip-ca-edit' => 'Kanol redakön padi at. Gebolös, begö! büologedi bü dakip.',
index b5e5fa4..12d010e 100644 (file)
@@ -350,7 +350,6 @@ Mõnõd šabloonad eväd lee lizettü.",
 'lineno' => 'Viiru $1:',
 'compareselectedversions' => 'Võrrõõ valitsõttuit verzijoit',
 'editundo' => 'kummut',
-'diff-multi' => 'Eb õõ näütettü {{PLURAL:$1|õsa-võttaja|õsa-võttajije}} {{PLURAL:$2|$2 väli-verssija $1|väli-verssijad $1}}',
 
 # Search results
 'searchresults' => 'Etsüü tulõmuhsõd',
index 13a30b2..92c7e57 100644 (file)
@@ -44,7 +44,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Lingiq ala tõmmadaq',
-'tog-justify' => 'Lõiguveereq sirgõs',
 'tog-hideminor' => 'Käkiq perämäidsin muutmiisin ärq väikuq parandusõq',
 'tog-hidepatrolled' => 'Käkiq perämäidsi muutmiisi nimekirän ärq muutmisõq, miä ommaq perräkaemisnimekirän',
 'tog-newpageshidepatrolled' => 'Käkiq vahtsidõ lehti nimekirän ärq ülekaeduq leheq',
@@ -53,9 +52,7 @@ $messages = array(
 'tog-numberheadings' => 'Päälkirjo automaatnummõrdus',
 'tog-showtoolbar' => 'Näütäq toimõndusõ tüüriistaripa',
 'tog-editondblclick' => 'Toimõndaq artikliid topõltklõpsu pääle',
-'tog-editsection' => 'Lupaq lõikõ toimõndaq [toimõndaq]-linkõga',
 'tog-editsectiononrightclick' => 'Lupaq lõikõ toimõndaq hüäpoolidsõ klõpsutusõga lõigu päälkirä pääl',
-'tog-showtoc' => 'Näütäq sisukõrda (rohkõmb ku kolmõ vaihõpäälkiräga lehile)',
 'tog-rememberpassword' => 'Salasõna miildejätmine tulõvaidsis kõrros (kõgõ inämb $1 {{PLURAL:$1|pääväs|pääväs}})',
 'tog-watchcreations' => 'Panõq muq luuduq leheq ja üleslaadiduq teedüstüq muq perräkaemisnimekirjä',
 'tog-watchdefault' => 'Panõq perräkaemisnimekirjä muq muudõduq leheq ja teedüstüq',
@@ -780,7 +777,6 @@ Lisateedüst või ollaq [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAME
 'lineno' => 'Rida $1:',
 'compareselectedversions' => 'Võrdõlõq valituid kujjõ',
 'editundo' => 'võtaq tagasi',
-'diff-multi' => '(Naidõ kujjõ vaihõl om {{PLURAL:$1|üts toimõndus|$1 kujjo, miä ommaq {{PLURAL:$2|üte pruukja tettüq|$2 esiq pruukja tettüq}}}}.)',
 
 # Search results
 'searchresults' => 'Otsmisõ tulõmiq',
@@ -1326,7 +1322,6 @@ ja sul piät umin [[Special:Preferences|säädmiisin]] olõma e-postiaadrõs, et
 'watchmethod-list' => 'perräkaetavidõ lehti perämädseq muutmisõq',
 'watchlistcontains' => 'Perräkaemisnimekirän om $1 {{PLURAL:$1|leht|lehte}}.',
 'iteminvalidname' => "Hädä lehega '$1'! Lehe nimen om viga.",
-'wlnote' => "Tan om '''$1''' {{PLURAL:$1|muutminõ|muutmist}} viimädse '''$2''' tunni ao seen.",
 'wlshowlast' => 'Näütäq viimädseq $1 tunni $2 päivä $3',
 'watchlist-options' => 'Perräkaemisnimekirä säädmine',
 
@@ -1723,7 +1718,6 @@ Please visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation
 'tooltip-pt-watchlist' => 'Nimekiri lehist, mil tahtnuq silmä pääl hoitaq',
 'tooltip-pt-mycontris' => 'Suq toimõnduisi nimekiri',
 'tooltip-pt-login' => 'Mineq nimega sisse vai tiiq hindäle pruukjanimi (soovitav).',
-'tooltip-pt-anonlogin' => 'Mineq nimega sisse vai tiiq hindäle pruukjanimi (soovitav).',
 'tooltip-pt-logout' => 'Mineq nime alt vällä',
 'tooltip-ca-talk' => 'Arotus lehe sisu üle',
 'tooltip-ca-edit' => 'Saa võit taad lehte toimõndaq.',
index 02a29df..124b0d4 100644 (file)
@@ -88,7 +88,6 @@ $linkTrail = '/^([a-zåâêîôûçéè]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Sorlignî les loyéns:',
-'tog-justify' => 'Djustifyî les hagnons',
 'tog-hideminor' => 'Èn nén mostrer les dierins candjmints mineurs',
 'tog-hidepatrolled' => 'Èn nén mostrer les candjmints ddja patrouyîs',
 'tog-newpageshidepatrolled' => 'Èn nén mostrer el djivêye des novelès pådjes les cenes dedja patrouyeyes',
@@ -97,9 +96,7 @@ $messages = array(
 'tog-numberheadings' => 'Limerotaedje otomatike des tites',
 'tog-showtoolbar' => "Mostrer l' bår d' usteyes e môde candjmint (JavaScript)",
 'tog-editondblclick' => 'Candjî les pådjes avou on dobe-clitch (JavaScript)',
-'tog-editsection' => "Eployî les loyéns «[candjî]» po candjî rén k' ene seccion",
 'tog-editsectiononrightclick' => 'Candjî les seccions avou on dobe-clitch sol tite (JavaScript)',
-'tog-showtoc' => "Mostrer l' tåvlea d' ådvins<br />(po ls årtikes avou pus di 3 seccions)",
 'tog-rememberpassword' => "Rimimbrer m' sicret inte les sessions (nén dpus ki po $1 {{PLURAL:$1|djoû|djoûs}})",
 'tog-watchcreations' => "Mete les pådjes ki dj' askepeye dins l' djivêye des pådjes shuvowes",
 'tog-watchdefault' => "Shuve les årtikes ki dj' fwai ou ki dj' candje",
@@ -1419,7 +1416,6 @@ Si vos vloz bodjî l' pådje foû di vosse djivêye des shuvous, clitchîz so «
 'watchmethod-list' => "Cwerant après les pådjes shuvowes k' ont stî candjeyes dierinnmint",
 'watchlistcontains' => 'I gn a {{PLURAL:$1|$1 pådje|$1 pådjes}} e vosse djivêye des pådjes a shuve.',
 'iteminvalidname' => "Åk n' a nén stî avou «$1», li no n' est nén valide...",
-'wlnote' => "Chal pa dzo {{PLURAL:$1|li dierin candjmint|les '''$1''' dierins candjmints}} {{PLURAL:$2|del dierinne eure|des '''$2''' dierinnès eures}}, disk' å $3 a $4.",
 'wlshowlast' => 'Mostrer les dierin(nè)s $1 eures, $2 djoûs ou $3',
 'watchlist-options' => 'Tchuzes del djivêye des shuvous',
 
@@ -1827,7 +1823,6 @@ Et s' el schaper so voste éndjole, et poy li ristitchî droci.",
 'tooltip-pt-watchlist' => 'Li djivêye des pådjes ki vos shujhoz po cwand ele sont candjeyes.',
 'tooltip-pt-mycontris' => 'Djivêye des ovraedjes da minne',
 'tooltip-pt-login' => "Vos estoz ecoraedjî d' vos elodjî, mins nerén, c' est nén oblidjî.",
-'tooltip-pt-anonlogin' => "Vos estoz ecoraedjî d' vos elodjî, mins nerén, c' est nén oblidjî.",
 'tooltip-pt-logout' => 'Vos dislodjî',
 'tooltip-ca-talk' => 'Copene åd fwait do contnou del pådje',
 'tooltip-ca-edit' => "Vos ploz candjî cisse pådje ci. S' i vs plait, eployîz l' boton «Vey divant» po vs acertiner k' tot est comifåt dvant d' schaper vos candjmints.",
index 0eace4e..a0df6fd 100644 (file)
@@ -65,7 +65,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Bagisa ha ilarom an mga sumpay:',
-'tog-justify' => 'Ig-justify an mga parrapho',
 'tog-hideminor' => 'Tago-a an mga gagmay nga pagliwat ha mga bag-o pa la nga mga kabag-ohan',
 'tog-hidepatrolled' => 'Tago-a in mga gin-patrol o binantayan nga mga pagliwat ha mga dipala naiha nga mga kabag-ohan',
 'tog-newpageshidepatrolled' => 'Tago-a an mga gin-patrol o binantayan nga mga pakli tikang han talaan hin bag-o nga pakli',
@@ -75,7 +74,6 @@ $messages = array(
 'tog-showtoolbar' => 'Igpakita an edit toolbar',
 'tog-editondblclick' => 'Igliwat in mga pakli ha doble nga klik',
 'tog-editsectiononrightclick' => 'Tugoti in pagliwat hin seksyon ha pag klik-ha-tuo dida hin mga ngaran o titulo hin seksyon',
-'tog-showtoc' => 'Igpakita in tabla hin sulod (para hin mga pakli nga sobra hin 3 ka titulo o pagngaran)',
 'tog-rememberpassword' => 'Hinumdomi an akon pan-sakob dinhi nga browser (para hin maximum nga $1 {{PLURAL:$1|nga adlaw|nga mga adlaw}})',
 'tog-watchcreations' => 'Igdugang in mga pakli nga akon ginhimo ngan mga paypay nga akon ginkarga ngadto han akon angay timan-an',
 'tog-watchdefault' => 'Igdugang in mga pakli ngan mga paypay nga akon ginliwat ngadto han akon angay timan-an',
@@ -228,7 +226,6 @@ $messages = array(
 'vector-action-protect' => 'Panalipda',
 'vector-action-undelete' => 'Igbalik an ginpara',
 'vector-action-unprotect' => 'Liwani an panalipod',
-'vector-simplesearch-preference' => 'Ginpadulot an yinano nga pamiling nga kahon (Panit vector la)',
 'vector-view-create' => 'Himo-a',
 'vector-view-edit' => 'Igliwat',
 'vector-view-history' => 'Kitaa an kaagi',
@@ -271,16 +268,16 @@ $messages = array(
 'newpage' => 'Bag-o nga pakli',
 'talkpage' => 'Pakighimangraw hiunong hini nga pakli',
 'talkpagelinktext' => 'Hiruhimangraw',
-'specialpage' => 'Ispisyal nga Pakli',
-'personaltools' => 'Mga pankalugaring nga garamiton',
+'specialpage' => 'Pinaurog nga pakli',
+'personaltools' => 'Mga pankalugaringon nga garamiton',
 'postcomment' => 'Bag-o nga bahin',
 'articlepage' => 'Kitaa in may sulod nga pakli',
 'talk' => 'Hiruhimangraw',
 'views' => 'Mga paglantaw',
-'toolbox' => 'Garamiton',
+'toolbox' => 'Mga higamit',
 'userpage' => 'Kitaa in pakli hin gumaramit',
 'projectpage' => 'Kitaa in pakli hin proyekto',
-'imagepage' => 'Kitaa in pakli hin fayl',
+'imagepage' => 'Kitaa in pakli hin paypay',
 'mediawikipage' => 'Kitaa in pakli hin mensahe',
 'templatepage' => 'Kitaa in pakli hin plantilya',
 'viewhelppage' => 'Kitaa in pakli hin bulig',
@@ -337,8 +334,8 @@ $1',
 'youhavenewmessages' => 'Mayda ka $1 ($2).',
 'youhavenewmessagesfromusers' => 'May-ada ka $1 tikang ha {{PLURAL:$3|iba nga gumaramit|$3 mga gumaramit}} ($2).',
 'youhavenewmessagesmanyusers' => 'May-ada ka $1 tikang ha damo nga mga gumaramit ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|uska bag-o nga mensahe|bag-o nga mga mensahe}}',
-'newmessagesdifflinkplural' => '$1 {{PLURAL:$1|nga pagbag-o|nga mga pagbag-o}}',
+'newmessageslinkplural' => '{{PLURAL:$1|usa ka bag-o nga mensahe|999=ka bag-o nga mga mensahe}}',
+'newmessagesdifflinkplural' => '$1 {{PLURAL:$1|nga pagbag-o|999=nga mga pagbag-o}}',
 'youhavenewmessagesmulti' => 'Mayda ka mga bag-o nga mensahe ha $1',
 'editsection' => 'igliwat',
 'editold' => 'igliwat',
@@ -468,7 +465,8 @@ An magdudurmara nga nagtrangka hini in naghatag hini nga eksplenasyon: "$3".',
 'invalidtitle-knownnamespace' => 'Titulo nga inbalido nga may pan-ngaran "$2 ngan teksto nga "$3"',
 'invalidtitle-unknownnamespace' => 'Diri ginkakarawat nga titulo tungod mayda ini hin mga diri nakikilala nga ngaran-lat\'ang ihap $1 ngan teksto "$2"',
 'exception-nologin' => 'Diri nakalog-in',
-'exception-nologin-text' => 'Ini nga pakli o pagbuhat in nagkikinahanglan nga ikaw in mag-log-in ha dinhi nga wiki.',
+'exception-nologin-text' => 'Alayon [[Special:Userlogin|pagsakob]] basi makakadto hiní nga pakli o buruhatón.',
+'exception-nologin-text-manual' => 'Alayon $1 basi makakadto hini nga pakli o buruhatón.',
 
 # Virus scanner
 'virus-badscanner' => "Maraot nga configuration: Waray kasabti nga virus scanner: ''$1''",
@@ -515,7 +513,7 @@ Ayaw kalimti pagbalyo han imo [[Special:Preferences|{{SITENAME}} preperensya]].'
 'gotaccount' => '¿Mayda kana akawnt? $1.',
 'gotaccountlink' => 'Sakob',
 'userlogin-resetlink' => 'Nangalimot han imo detalye han pagsakob?',
-'userlogin-resetpassword-link' => 'Ig-reset an imo tigaman-pagsakob',
+'userlogin-resetpassword-link' => '¿Nangalimot ka han imo tigaman-pansulod?',
 'helplogin-url' => 'Help:Pag-log-in',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Bulig han pag-log-in]]',
 'userlogin-loggedin' => 'Nakalog-in kana komo hi {{GENDER:$1|$1}}.
@@ -571,7 +569,7 @@ Alayon pagutro pagbutang.',
 'passwordtooshort' => 'An tigaman-pagsulod dapat diri maubos hit {{PLURAL:$1|1 nga agi|$1 nga agi}}.',
 'password-name-match' => 'An imo tigaman-pagsulod in kinahanglan iba ha imo agnay-hiton-gumaramit.',
 'password-login-forbidden' => 'An paggamit hini nga agnay-hit-gumaramit ngan tigaman-pagsulod in diri gintutugotan.',
-'mailmypassword' => 'Ig-e-mail an bag-o nga tigaman-pagsulod',
+'mailmypassword' => 'Ig-reset an tigaman-pagsulod',
 'passwordremindertitle' => 'Bag-o nga diri-pirmihan nga tigaman-pagsulod para han {{SITENAME}}',
 'passwordremindertext' => 'May-ada tawo (posible ikaw, tikang ha IP address nga $1) in umaro hin bag-o nga tigaman-pagsakob para han {{SITENAME}} ($4). Uska temporaryo nga tigaman-pagsakob para han gumaramit 
 "$2" in nahimo ngan ginbutang nga "$3". Kun ini an imo panuyuan, kinahanglanon nim maglog-in ngan pumili hin bag-o nga tigaman-pagsakob yana.
@@ -583,16 +581,17 @@ Kun iba nga tawo an naghimo ini nga paalayon, o kun nakahinumdom ka han imo tiga
 'passwordsent' => 'Uska bag-o nga password in ginpadangat ha e-mail address nga nakarehistro kan "$1".
 Alayon paglog-in utro kahuman mo makarawat ini.',
 'blocked-mailpassword' => 'An imo IP address in ginpugong ha pag-edit, ngan tungod hini in diri gintutugotan paggamit han password recovery function para malikyan an abuso.',
-'eauthentsent' => 'Uska kompirmasyon nga e-mail in ginpadangan ha gin-ngaranan nga e-mail address.
-San-o matagan pa hin iba nga e-mail para ha imo akawnt, kinahanglan mo sundon an mga surundan nga nakasurat ha e-mail, para makompirma nga imo gud ito akawnt.',
+'eauthentsent' => 'Mayda e-mail hin pagkumpirma nga ginpadará hini nga ginhatag nga e-mail adres.
+
+San-o magatagán pa hin ibá nga e-mail it akwant, kinahanglan nimo sundon an mga tugon nga nahabutáng han email basi makumpirma nga imo gud itón akawnt.',
 'throttled-mailpassword' => 'Usa nga tigaman-pagnakob reset email in ginpadangat na, ha sakob han urhi nga  {{PLURAL:$1|oras|$1 ka mga oras}}.
 Basi diri ini maabuso, uusa la nga tigaman-panakob in igpapadangat kada {{PLURAL:$1|oras|$1 ka mga oras}}.',
 'mailerror' => 'Sayop han pagpadangat hin surat: $1',
 'acct_creation_throttle_hit' => 'An mga bisita hinin nga wiki nga nagamit hit imo IP address in naghimo hin {{PLURAL:$1|1 nga akawnt|$1 nga mga akawnt}} ha sulod han urhi nga adlaw, kun diin ini an pinakadamo nga gintutugotan para han sulod nga takna.
 
 An resulta, an mga bisita nga nagamit hini nga IP address in diri na makakahimo hin akawnt, ha pagkayana.',
-'emailauthenticated' => 'Ginpamatuod an imo e-mail adres han $2 ha $3.',
-'emailnotauthenticated' => 'An imo email address in diri pa otentikado.
+'emailauthenticated' => 'Ginkumpirma an imo e-mail adres han han $2 ha $3.',
+'emailnotauthenticated' => 'Diri pa nakumpirma an imo email adres.
 Waray email nga igpapadangat ha mga masunod nga higamit.',
 'noemailprefs' => 'Igbutang an imo email address ha imo preperensya para umandar ini nga mga higamit.',
 'emailconfirmlink' => 'Igkompirma an imo e-mail address',
@@ -631,6 +630,8 @@ Para mahuman paglalog-on, kinahanglan mo magbutang hin bag-o nga tigaman-panakob
 'retypenew' => 'Utroha pagbutang an bag-o nga tigaman-pagsulod:',
 'resetpass_submit' => 'Igbutang an password ngan log in',
 'changepassword-success' => 'Malinamposon an pagbal-iw hit imo tigaman-panakob!',
+'changepassword-throttled' => 'Damo na nga mga paningkamot hin pagsakob an imo ginhimò.
+Alayon paghulat hin $1 san-o ka umutro.',
 'resetpass_forbidden' => 'Diri mababalyoan an mga tigaman-pagsulod',
 'resetpass-no-info' => 'Kinahanglan mo paglog-in para direkta ka makasakob dinhi nga pakli.',
 'resetpass-submit-loggedin' => 'Igbal-iw an tigaman-pagsulod',
@@ -643,7 +644,7 @@ Imo malinamposon nga ginsalyuan an imo tigaman-panakob o umaro ka na hin bag-o n
 # Special:PasswordReset
 'passwordreset' => 'igreset an tigaman-hit-pagsulod',
 'passwordreset-text-one' => 'Kompletoha ini nga porma paramakareset hin imo tigaman-panakob.',
-'passwordreset-text-many' => '{{PLURAL:$1|Butanga ha usa nga mga surodlan para mareset iton imo tigaman-panakob.}}',
+'passwordreset-text-many' => '{{PLURAL:$1|Butanga it usa nga mga surodlan basi makakarawat ko hin temporaryo nga tigaman-pansulod pinaagi ha email.}}',
 'passwordreset-legend' => 'igreset an tigaman-hit-pagsulod',
 'passwordreset-disabled' => 'Waray ginpaandar an password reset hini nga wiki.',
 'passwordreset-emaildisabled' => 'Mga mga higamit ha email in waray pinaandar hini nga wiki.',
@@ -653,6 +654,12 @@ Imo malinamposon nga ginsalyuan an imo tigaman-panakob o umaro ka na hin bag-o n
 'passwordreset-capture-help' => 'Kun imo igtsek ini nga kahon, an email (lakip an temporaryo nga tigaman-panakob) in igpapakita ha imo labot la han ginpadangat ha gumaramit.',
 'passwordreset-email' => 'E-mail adres:',
 'passwordreset-emailtitle' => 'Mga detalye han akawnt ha {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Mayda gumaramit (bangin hi ikaw, tikang han IP adres nga $1) nga naghangyo hin reset han imo tigaman-pansulod han {{SITENAME}} ($4). An nasunod nga gumaramit {{PLURAL:$3|nga akawnt|nga mga akawnt}} nahanungod hini nga email nga adres: 
+
+$2
+
+{{PLURAL:$3|Iní nga temporaryo nga tigaman-pansulod|Iní nga mga temporaryo nga tigaman-pansulod}} ma-waray bali hin {{PLURAL:$5|usa ka adlaw|$5 nga mga adlaw}}.
+Angay ka sumakob ngan pumílì hin bag-o nga tigaman-pansulod ha yanâ.  Kun mayda lain nga naghatag hini nga hangyo, o kun nahinumdoman mo an imo orihinal nga tigaman-pansulod, ngan nadírì ka na pagbalyo hiní, puyde mo pasagdan ini nga sumat ngan magpadayon hin paggamit han imo daan nga tigaman-pansulod.',
 'passwordreset-emailelement' => 'Agnay han gumaramit: $1
 Temporaryo nga tigaman han pagsakob: $2',
 'passwordreset-emailsent' => 'Ginpadangat an password reset email.',
@@ -670,6 +677,7 @@ Temporaryo nga tigaman han pagsakob: $2',
 'changeemail-password' => 'An imo {{SITENAME}} password:',
 'changeemail-submit' => 'Igbalyo an e-mail',
 'changeemail-cancel' => 'Pasagdi',
+'changeemail-throttled' => 'Nakadamo kada pag-log-in. Alayon paghulat hin $1 ugsa ka umutro.',
 
 # Special:ResetTokens
 'resettokens' => 'Igrest an mga token',
@@ -785,6 +793,7 @@ An pinakaurhi nga log entry han mga pinugong in ginhatag ha ubos para hit repere
 'previewnote' => "'''Hinumdumi nga pahiuna-nga-paggawas pa la ini.'''
 ¡Waray pa katipig an imo mga ginbag-o!",
 'continue-editing' => 'Pakadto han lugar hin panliwat',
+'edit_form_incomplete' => '<strong>An iba nga parte han imo pagliwat nga porma in waray umabot ha serbidor; alayon kitaa utro kun an imo mga pagliwat in aada pa ngan utroha pa.</strong>',
 'editing' => 'Ginliliwat an $1',
 'creating' => 'Ginhihimo an $1',
 'editingsection' => 'Ginliliwat an $1 (bahin)',
@@ -792,10 +801,16 @@ An pinakaurhi nga log entry han mga pinugong in ginhatag ha ubos para hit repere
 'editconflict' => 'Diri pagkakauroyon han pagliwat: $1',
 'yourtext' => 'Imo sinurat',
 'storedversion' => 'Nakahipos nga pagbag-o',
+'editingold' => '<strong>Pahimatngon: Imo ginliliwat an daan nga rebisyon hini nga pakli.</strong>
+Kun imo ini igtipig, an bisan ano nga mga pagliwat nga ginhimo tikang hini nga rebisyon in mawawara.',
 'yourdiff' => 'Mga kaibhan',
 'copyrightwarning' => "Iginpapasabot nga an ngatanan nga imo gin-amot ha {{SITENAME}} iginhatag mo ha ilarom han $2 (kitaa an $1 para han mga detalye).  Kun diri mo igkakalipay nga an imo ginsurat waray kalooy nga liliwaton ngan igpapakalat hit bisan hin-o nga it may gusto, alayon ayaw hiton igsumitir dinhi. <br />
 Nasaad ka liwat nga imo ini kalugaringon nga ginsurat, o ginkopya nimo ini tikang ha panimongto nga dominyo o kapareho nga waray-sabit nga kuruhaon.
 '''Ayaw igsumitir an mga buhat nga may ''copyright'' hin waray sarit!'''",
+'copyrightwarning2' => 'Alayon kasabot nga an ngatanan nga mga kontribusyon ha {{SITENAME}} in puydi liwaton, saliwanon, o tanggalon hin bisan hin-o nga karuyag magbuhat.
+Kun diri mo karuyag nga an imo sinurat in maliliwat la hin waray kalooy, ayaw gud igsumite dinhi.<br />
+Nasaad ka gihap nga ikaw mismo an nagsurat hini, o ginkopya mo ini ha dominyo publiko o kaparehas nga talwas nga ginkuhaan (kitaa an $1 para hin mga detalye).
+<strong>Ayaw igsumite an mga buhat nga naka-copywrite nga waray pagtugot!</strong>',
 'templatesused' => '{{PLURAL:$1|Batakan|Mga batakan}} nga gingamit dinhi nga pakli:',
 'template-protected' => '(pinaliporan)',
 'template-semiprotected' => '(katunga nga pinasaliporan)',
@@ -803,7 +818,7 @@ Nasaad ka liwat nga imo ini kalugaringon nga ginsurat, o ginkopya nimo ini tikan
 'nocreate-loggedin' => 'Diri ka gintutugotan paghimo hin mga bag-o nga pakli.',
 'sectioneditnotsupported-title' => 'Diri suportado han pagliwat han seksyon',
 'sectioneditnotsupported-text' => 'Diri suportado an pagliwat han seksyon ha dinhi nga pakli.',
-'permissionserrors' => 'Mga sayop hin mga pagtugot',
+'permissionserrors' => 'Sayop hin pagtugot',
 'permissionserrorstext' => 'Diri ka gintutugotan pagbuhat hito, mahitungod han mga nasunod nga {{PLURAL:$1|katadungan|mga katadungan}}:',
 'permissionserrorstext-withaction' => 'Waray ka permiso han $2, tungod han masunod nga {{PLURAL:$1|rason|mga rason}}:',
 'recreate-moveddeleted-warn' => "'''Pahimatngon: Naghihimo ka hin pakli nga ginpara na.'''
@@ -891,13 +906,13 @@ An mga detalye in mabibilngan ha [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'revisiondelete' => 'Pagpara/pagtanggal han pagpara nga mga rebisyon',
 'revdelete-show-file-confirm' => 'Sigurado ka nga gusto mo makita an ginpara nga pagliwat han file "<nowiki>$1</nowiki>" tikang $2 ha $3?',
 'revdelete-show-file-submit' => 'Oo',
-'revdelete-hide-text' => 'Tagoon an rebisyon han teksto',
+'revdelete-hide-text' => 'Rebisyon nga sinurat',
 'revdelete-hide-image' => 'Tagoon an sulod han paypay',
 'revdelete-hide-name' => 'Tagoon an buhat ngan kakadtoan',
-'revdelete-hide-comment' => 'Tagoon an dalikyat nga sumat han pagliwat',
+'revdelete-hide-comment' => 'Dalikyat nga sumat hin pagliwat',
 'revdelete-radio-same' => '(ayaw balyu-e)',
-'revdelete-radio-set' => 'Oo',
-'revdelete-radio-unset' => 'Ayaw',
+'revdelete-radio-set' => 'Tinago',
+'revdelete-radio-unset' => 'Nakikit-an',
 'revdelete-log' => 'Rason:',
 'revdel-restore' => 'igliwat an nakikit-an',
 'pagehist' => 'Kaagi han pakli',
@@ -935,7 +950,6 @@ Diri mo ini malalabtan.',
 'compareselectedversions' => 'Igkumpara an mga pinili nga pagbabag-o',
 'editundo' => 'Igpawara an ginbuhat',
 'diff-empty' => '(Waray pagkakaiba)',
-'diff-multi' => '({{PLURAL:$1|Usa nga panbutnga nga pagbag-o|$1 nga panbutnga nga pagbag-o}} ni {{PLURAL:$2|usa nga gumaramit|$2 nga mga gumaramit}} waray ginpakita)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Uska sapit-nahiuna nga rebisyon|$1 nga mga sapit-nanhiuna nga rebisyon}} nga may labaw nga $2 {{PLURAL:$2|gumaramit|mga gumaramit}} in diri ginpapakita)',
 
 # Search results
@@ -952,7 +966,7 @@ Diri mo ini malalabtan.',
 'shown-title' => 'Kitaa $1 {{PLURAL:$1|resulta|mga resulta}} kada pakli',
 'viewprevnext' => 'Kitaa an ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''May-ada pakli nga nakangaran hin \"[[:\$1]]\" hini nga wiki.'''",
-'searchmenu-new' => "'''Himoa an pakli \"[[:\$1]]\" hini nga wiki!'''",
+'searchmenu-new' => '<strong>Himoa an pakli nga "[[:$1]]" dinhi nga wiki!</strong> {{PLURAL:$2|0=|Kitaa gihapon an pakli nga nabilngan han imo pagbiling.|Kitaa gihapon an mga nabilngan nga ginmawas han pagbiling.}}',
 'searchprofile-articles' => 'Mga unod nga pakli',
 'searchprofile-project' => 'Mga Bulig ngan Proyekto nga pakli',
 'searchprofile-images' => 'Multimedia',
@@ -1082,7 +1096,7 @@ An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makonta
 'prefs-i18n' => 'Internasyonalisasyon',
 'prefs-signature' => 'Pirma',
 'prefs-dateformat' => 'Batakan han petsa',
-'prefs-advancedediting' => 'Abansado nga mga pagpipilian',
+'prefs-advancedediting' => 'Mga kasahiran nga pagpipilian',
 'prefs-preview' => 'Pahiuna nga pakita',
 'prefs-advancedrc' => 'Abansado nga mga pagpipilian',
 'prefs-advancedrendering' => 'Abansado nga mga pagpipilian',
@@ -1154,7 +1168,7 @@ Diri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki
 'right-reupload' => 'Sapawa an mga aada nga mga paypay',
 'right-reupload-own' => 'Igsapaw an aada yana nga mga paypay nga ginkarga-pasaka nimo mismo',
 'right-upload_by_url' => 'Igkarga paigbaw an mga paypay tikang ha uska URL',
-'right-autoconfirmed' => 'Igliwat an mga semi-pinanpasaliporan nga pakli',
+'right-autoconfirmed' => 'Diri malalalbtan hin IP-nga-nahibasi nga mga rate hin paglimit',
 'right-bot' => 'Igtrato komo uska naglulugaring nga proseso',
 'right-delete' => 'Igpara an mga pakli',
 'right-bigdelete' => 'Igpara an mga pakli nga may-ada dagko nga mga kaagi',
@@ -1209,8 +1223,8 @@ Diri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki
 'action-suppressionlog' => 'kitaa an kanan hini pribado nga talaan',
 'action-block' => 'Pugnga ini nga gumaramit ha pagliwat',
 'action-protect' => 'igsaliwan an katupngan han pananalipod para hini nga pakli',
-'action-import' => 'ig-angbit ini nga pakli tikang ha iba nga wiki',
-'action-importupload' => 'ig-angbit ini nga pakli tikang ha uska ginkarga-pasaka nga paypay',
+'action-import' => 'ig-angbit hin mga pakli tikang ha iba nga wiki',
+'action-importupload' => 'ig-angbit hin mga pakli pakli tikang ha uska ginkarga-pasaka nga paypay',
 'action-patrol' => 'markahi an kanan iba pagliwat komo nakapatrolya',
 'action-mergehistory' => 'Igtampo an kaagi hini nga pakli',
 'action-userrights' => 'Igliwat an ngatanan nga mga katungod han gumaramit',
@@ -1230,7 +1244,7 @@ Diri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki
 'rclistfrom' => 'Pakit-a an mga ginbag-ohan tikang han $1',
 'rcshowhideminor' => '$1 gudti nga mga pagliwat',
 'rcshowhidebots' => '$1 mga bot',
-'rcshowhideliu' => '$1 mga naka-log-in nga gumaramit',
+'rcshowhideliu' => '$1 an mga rehistrado nga gumaramit',
 'rcshowhideanons' => '$1 waray nagpakilala nga mga gumaramit',
 'rcshowhidepatr' => '$1 mga pinatrolya nga mga paliwat',
 'rcshowhidemine' => '$1 akon mga ginliwat',
@@ -1570,7 +1584,7 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'prevpage' => 'Nahiuna nga pakli ($1)',
 'allpagesfrom' => 'Igpakita an mga pakli nga nagtitikang ha:',
 'allpagesto' => 'Igpakita an mga pakli nga nahuhuman ha:',
-'allarticles' => 'Ngatanan nga mga artikulo',
+'allarticles' => 'Ngatanan nga mga barasahon',
 'allinnamespace' => "Ngatanan nga mga pakli ($1 ngaran-lat'ang)",
 'allpagessubmit' => 'Kadto-a',
 'allpages-bad-ns' => '{{SITENAME}} in waray ngaran-lat\'ang nga "$1".',
@@ -1705,9 +1719,11 @@ Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
 'deleteotherreason' => 'Lain/dugang nga katadungan:',
 'deletereasonotherlist' => 'Lain nga katadungan',
 'deletereason-dropdown' => "*Agsob nga rason hin pagpara
-** Tugon han manunurat
+** Spam
+** Bandalismo
 ** Pagtalapas ha katungod hin pagtatag-iya (''copyright'')
-** Bandalismo",
+** Tugon han manunurat
+** Utod nga redirek",
 'delete-edit-reasonlist' => 'Igliwat an mga rason han pagpara',
 
 # Rollback
@@ -2057,12 +2073,12 @@ Makikit-an nimo an ginkuhaaan',
 'pageinfo-display-title' => 'Iglatag an titulo',
 'pageinfo-length' => 'Kahilaba han pakli (ha mga byte)',
 'pageinfo-article-id' => 'ID han pakli',
-'pageinfo-robot-policy' => 'Pamilnga an kahimtang han makina',
-'pageinfo-robot-index' => 'Matutudlok',
-'pageinfo-robot-noindex' => 'Diri matutudlok',
+'pageinfo-robot-policy' => 'Pag-index hin mga robot',
+'pageinfo-robot-index' => 'Gintutugot',
+'pageinfo-robot-noindex' => 'Dírì gintutugot',
 'pageinfo-views' => 'Ihap han mga naglantaw',
 'pageinfo-watchers' => 'Ihap han nangingita hin pakli',
-'pageinfo-redirects-name' => 'Nairedirekta ha dinhi nga pakli',
+'pageinfo-redirects-name' => 'Ihap hin mga redirek ngani nga pakli',
 'pageinfo-subpages-name' => 'Mga bahinpakli hin nga pakli',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirekta|mga redirekta}}; $3 {{PLURAL:$3|diri redirekta|mga diri redirekta}})',
 'pageinfo-firstuser' => 'Naghimo han pakli',
@@ -2109,7 +2125,7 @@ $1',
 'file-info-size' => '$1 × $2 nga pixel, kadako han fayl: $3, MIME nga tipo: $4',
 'file-nohires' => 'Waray mas hiruhitaas nga resolusyon.',
 'svg-long-desc' => 'SVG nga fayl, ginbabanabanahan nga $1 × $2 nga mga pixel, kadako han fayl: $3',
-'show-big-image' => 'Bug-os nga resolusyon',
+'show-big-image' => 'Orihinal nga paypay',
 'show-big-image-preview' => 'Kadako hin nga pahiuna nga pagawas: $1.',
 'show-big-image-other' => 'Iba {{PLURAL:$2|nga resolusyon|nga mga resolusyon}}: $1.',
 'show-big-image-size' => '$1 × $2 nga mga pixel',
@@ -2215,7 +2231,7 @@ An iba in daan nakatago.
 'exif-cameraownername' => 'Tag-iya han kamera',
 'exif-usageterms' => 'Mga termino hit paggamit',
 
-'exif-copyrighted-false' => 'Dominyo panpubliko',
+'exif-copyrighted-false' => 'Status hin katungod-hin-panag-iya waray mahabutang',
 
 'exif-unknowndate' => 'Waray kasabti an petsa',
 
@@ -2399,7 +2415,7 @@ An iba in daan nakatago.
 'version-hooks' => 'Mga kawil',
 'version-hook-name' => 'Ngaran han kawil',
 'version-version' => '(Bersion $1)',
-'version-license' => 'Lisensya',
+'version-license' => 'MediaWiki nga Lisensya',
 'version-poweredby-credits' => "Ini nga wiki in pinapaandar han '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'mga iba',
 'version-software-product' => 'Produkto',
@@ -2471,10 +2487,10 @@ An iba in daan nakatago.
 'revdelete-content-hid' => 'sulod nakatago',
 'revdelete-summary-hid' => 'nakatago an dalikyat nga sumat han pagliwat',
 'revdelete-uname-hid' => 'nakatago an agnay-hit-gumaramit',
-'logentry-newusers-newusers' => '$1 in naghimo hin gumaramit nga akawnt',
-'logentry-newusers-create' => '$1 in naghimo hin gumaramit nga akawnt',
-'logentry-newusers-create2' => '$1 in naghimo hin gumaramit nga akawnt $3',
-'logentry-newusers-autocreate' => 'An akawnt nga $1 in lugaring nga nahimo',
+'logentry-newusers-newusers' => 'An gumaramit nga akawnt nga $1 {{GENDER:$2|ginhimo}}',
+'logentry-newusers-create' => 'An gumaramit nga akawnt nga $1 {{GENDER:$2|ginhimo}}',
+'logentry-newusers-create2' => 'An gumaramit nga akawnt nga $3 {{GENDER:$2|ginhimo}} ni $1',
+'logentry-newusers-autocreate' => 'An gumaramit nga akawnt nga $1 in lugaring nga {{GENDER:$2|ginhimo}}',
 'rightsnone' => '(waray)',
 
 # Feedback
index 3168503..f1bdc20 100644 (file)
@@ -85,7 +85,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Rëddaatu lëkkalekaay yi :',
-'tog-justify' => 'Maaseel xise yi',
 'tog-hideminor' => 'Nëbb coppite yu néewal yi mujj',
 'tog-hidepatrolled' => 'Nëbb coppite yi ñuy fuglu ci coppite yu mujj yi',
 'tog-newpageshidepatrolled' => 'Nëbb xët yi ñuy fuglu, yi ci limu xët yu bees yi',
@@ -834,7 +833,6 @@ Soo jëfandikoo lëkkalekaayu joow yi day neenal boyot yi nga jotoon a fal.',
 'lineno' => 'Rëdd $1 :',
 'compareselectedversions' => 'Méngale sumb yi nga fal',
 'editundo' => 'neenal',
-'diff-multi' => '({{PLURAL:$1|am sumb mu diggu feeñul|$1 sumb yu diggu feeñuñu}}.)',
 
 # Search results
 'searchresults' => 'Ngértey ceet gi',
@@ -1542,7 +1540,6 @@ Coppite yiy ñëw yu xët wi ak xëtu waxtaanuwaay wi mu àndal di nañu leen fa
 'watchmethod-list' => 'saytug xët yi ñuy topp ngir ay coppite yu mujj',
 'watchlistcontains' => "Sa limu toppte am na '''$1''' {{PLURAL:$1|xët|xët}}.",
 'iteminvalidname' => 'Ay jafe-jafe ak xët wii di « $1 » : tur bi baaxul.',
-'wlnote' => 'Fii ci suuf {{PLURAL:$1| ngay gis coppite yu mujj yi|ngay gis $1 coppite yu mujj}} ci {{PLURAL:$2|waxtu gu mujj gi|<b>$2</b> waxtu yu mujj}}.',
 'wlshowlast' => 'wone $1 waxtu yu mujj, $2 bess yu mujj, walla $3.',
 'watchlist-options' => 'Tànneefi limu toppte bi',
 
@@ -1923,7 +1920,6 @@ Manoo tudewaat aw xët ci wenn tur wi.',
 'tooltip-pt-watchlist' => 'Limu xët yi ngay topp',
 'tooltip-pt-mycontris' => 'Limu say cëru',
 'tooltip-pt-login' => 'Woo nan la ngir nga xammeku, waaye doonul lu manuta ñakk.',
-'tooltip-pt-anonlogin' => 'woo nan la ngir nga xammeku, waaye doonul lu manuta ñakk.',
 'tooltip-pt-logout' => 'Génn',
 'tooltip-ca-talk' => 'Waxtaan yi ñeel xët wii',
 'tooltip-ca-edit' => 'Man ngaa soppi xët wi. Ngir yàlla wonendil laataa ngay denc.',
index fd5eb15..9c58c28 100644 (file)
@@ -23,7 +23,6 @@ $fallback = 'zh-hans';
 $messages = array(
 # User preference toggles
 'tog-underline' => '鏈接下橫線:',
-'tog-justify' => '段對齊',
 'tog-hideminor' => '此垡變化裏囥脫小編',
 'tog-hidepatrolled' => '此垡變化裏囥脫巡脫編',
 'tog-newpageshidepatrolled' => '新頁表裏囥脫巡脫頁',
@@ -32,9 +31,7 @@ $messages = array(
 'tog-numberheadings' => '標題自動編號',
 'tog-showtoolbar' => '顯示編傢伙欄',
 'tog-editondblclick' => '捺兩記編頁',
-'tog-editsection' => '用【編寫】鏈接編段',
 'tog-editsectiononrightclick' => '用右捺標題編段',
-'tog-showtoc' => '顯示目錄(為超過3個標題個頁)',
 'tog-rememberpassword' => '箇流覽器裏記牢我個登錄狀態(記$1{{PLURAL:$1|日|日}})',
 'tog-watchcreations' => '畀我建个页搭我传个文件加进我个关注表里去',
 'tog-watchdefault' => '畀我编个页搭文件加进我个关注表里去',
@@ -914,7 +911,6 @@ $1",
 'compareselectedversions' => '比较选中个版本',
 'showhideselectedversions' => '显示/囥脱选定修订版本',
 'editundo' => '撤销',
-'diff-multi' => '($2个用户个$1个中央版本朆显示。)',
 
 # Search results
 'searchresults' => '搜寻结果',
@@ -1576,7 +1572,6 @@ $1",
 'tooltip-pt-watchlist' => '监控修改页面列表',
 'tooltip-pt-mycontris' => '你侬个贡献列表',
 'tooltip-pt-login' => '鼓励大家登录进来,不过也弗是板定要求',
-'tooltip-pt-anonlogin' => '鼓励登录,必过倒也弗是必须个。',
 'tooltip-pt-logout' => '登出',
 'tooltip-ca-talk' => '讨论内容页',
 'tooltip-ca-edit' => '箇页你侬好编。保存之前望望相起。',
index 072e95a..5f0af94 100644 (file)
@@ -25,7 +25,6 @@ $fallback = 'ka';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'რცხუეფიშ ათოღაზუა:',
-'tog-justify' => 'გამანგი აბზაცეფი',
 'tog-hideminor' => 'დოფული ციქა რედაქტირაფა ეკონია თირაფეფს',
 'tog-hidepatrolled' => 'დოფულით პატრულირებულ რედაქტირაფეფი ასერდეიან თირაფეფს',
 'tog-newpageshidepatrolled' => 'დოფულით პატრულირებულ ხასჷლეფი ახალ ხასჷლეფიშ ერკებულშე',
@@ -34,9 +33,7 @@ $messages = array(
 'tog-numberheadings' => 'ავტომატურო დონომერე დუდჯოხოეფი',
 'tog-showtoolbar' => 'რედაქტირაფაშ ხეჭკუდეფიშ ძირაფა (ითხინს JavaScript-ის)',
 'tog-editondblclick' => 'ხასჷლეფიშ რედაქტირაფა ჟირმანგი გეწკანტაფათ (ითხინს JavaScript-ის)',
-'tog-editsection' => 'ჩართი სექციაშ რედაქტირაფა [რედაქტირაფაშ] რცხუეფით',
 'tog-editsectiononrightclick' => 'ჩართი სექციაშ რედაქტირაფა სექციაშ ჯოხოშა მარძგვან გეწკანტაფათ (ითხინს JavaScript-ის)"',
-'tog-showtoc' => 'ქაძირი გჷშაგორალი (სუმშე უმოს დუდჯოხოამ ხასჷლეფშო)',
 'tog-showhiddencats' => 'ქაძირი ფულირი კატეგორიეფი',
 
 'underline-always' => 'ირო',
@@ -387,7 +384,6 @@ $messages = array(
 'lineno' => 'ღოზი $1:',
 'compareselectedversions' => 'გიშაგორილ ვერსიეფიშ მეზიმაფა',
 'editundo' => 'გოუქვაფა',
-'diff-multi' => '( {{PLURAL:$2|ართი მახვარებუშ|$2 მახვარებუშ}} {{PLURAL:$1|ართი შქაშქუმალირი რევიზია|$1 შქაშქუმალირი რევიზია}} ვა რე ძირაფილი)',
 
 # Search results
 'searchresults' => 'გორუაშ მოღალირობეფ',
index e305787..b10ee77 100644 (file)
@@ -198,7 +198,6 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'שטרייכט אונטער לינקען',
-'tog-justify' => 'גראד אויס פאראגראפן',
 'tog-hideminor' => 'באַהאַלטן מינערדיקע רעדאַקטירונגען אין לעצטע ענדערונגען',
 'tog-hidepatrolled' => 'באַהאַלטן פאַטראלירטע רעדאַקטירונגען אין לעצטע ענדערונגען',
 'tog-newpageshidepatrolled' => 'באַהאַלטן פאַטראלירטע בלעטער פון דער ליסטע פון נײַע בלעטער',
@@ -765,6 +764,8 @@ $2',
 'retypenew' => 'ווידער שרײַבן פאַסווארט:',
 'resetpass_submit' => 'שטעלן פאסווארט און אריינלאגירן',
 'changepassword-success' => 'אייער פאַסווארט איז געטוישט געווארן מיט דערפֿאלג!',
+'changepassword-throttled' => 'איר האט געפרוווט צופֿיל מאל אריינלאגירן.
+זייט אזוי גוט און וואַרט $1 איידער איר פרוווט נאכאמאל.',
 'resetpass_forbidden' => 'פאסווערטער קענען נישט ווערן געטוישט',
 'resetpass-no-info' => 'איר דארפֿט זיין אריינלאגירט צוצוקומען גלייך צו דעם דאזיגן בלאט.',
 'resetpass-submit-loggedin' => 'טוישן פאסווארט',
@@ -822,6 +823,8 @@ $2
 'changeemail-password' => 'אייער {{SITENAME}} פאסווארט:',
 'changeemail-submit' => 'ענדערן ע־פאסט אדרעס',
 'changeemail-cancel' => 'אַנולירן',
+'changeemail-throttled' => 'איר האט געפרוווט צופֿיל מאל אריינלאגירן.
+זייט אזוי גוט און וואַרט $1 איידער איר פרוווט נאכאמאל.',
 
 # Special:ResetTokens
 'resettokens' => 'צוריקזעצן טאקנס',
@@ -1255,7 +1258,7 @@ $1",
 'showhideselectedversions' => 'ווײַזן/באַהאַלטן געקליבענע רעוויזיעס',
 'editundo' => 'אַנולירן',
 'diff-empty' => '(קיין אונטערשייד)',
-'diff-multi' => '({{PLURAL:$1|איין מיטלסטע ווערסיע |$1 מיטלסטע ווערסיעס}} פֿון {{PLURAL:$2|איין באַניצער|$2 באַניצער}} נישט געוויזן.)',
+'diff-multi-otherusers' => '({{PLURAL:$1|איין מיטלסטע ווערסיע |$1 מיטלסטע ווערסיעס}} פֿון {{PLURAL:$2|איין אנדער באַניצער|$2 באַניצער}} נישט געוויזן.)',
 'diff-multi-manyusers' => '({{PLURAL:$1|איין מיטלסטע ווערסיע |$1 מיטלסטע ווערסיעס}} פֿון מער ווי {{PLURAL:$2|איין באַניצער|$2 באַניצער}} נישט געוויזן.)',
 'difference-missing-revision' => '{{PLURAL:$2|איין ווערסיע|$2 ווערסיעס}} פון דעם דיפערענץ ($1) {{PLURAL:$2|האט}} מען נישט געטראפן.
 
@@ -1276,7 +1279,7 @@ $1",
 'shown-title' => 'ווײַזן $1  {{PLURAL:$1|רעזולטאַט| רעזולטאַטן}} אויף א בלאַט',
 'viewprevnext' => 'קוקט אויף ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''ס'איז פֿאַראַן א בלאַט מיטן נאמען \"[[:\$1]]\" אין דער וויקי'''",
-'searchmenu-new' => "'''באַשאַפֿן דעם בלאַט \"[[:\$1]]\" אויף דער וויקי'''",
+'searchmenu-new' => '<strong>באַשאַפֿן דעם בלאַט "[[:$1]]" אויף דער וויקי!</strong> {{PLURAL:$2|0=|זעט אויך דעם בלאט געפֿונען מיט אײַער זוך.|זעט אויך די זוך רעזולטאטן געפֿונען.}}',
 'searchprofile-articles' => 'אינהאלט בלעטער',
 'searchprofile-project' => 'הילף און פראיעקט בלעטער',
 'searchprofile-images' => 'מולטימעדיע',
@@ -2011,6 +2014,7 @@ $1",
 'pageswithprop-prop' => 'אייגנשאפט נאמען:',
 'pageswithprop-submit' => 'גייט',
 'pageswithprop-prophidden-long' => 'לא גער טעקסט אייגנשאפט־ווערט באהאלטן ($1)',
+'pageswithprop-prophidden-binary' => 'בינארישער אייגנשאפט־ווערט באהאלטן ($1)',
 
 'doubleredirects' => 'געטאפלטע ווײַטערפֿירונגען',
 'doubleredirectstext' => 'דער בלאט רעכנט אויס בלעטער וואס פירן ווייטער צו אנדערע ווייטערפירן בלעטער.
@@ -2625,7 +2629,8 @@ $1',
 'change-blocklink' => 'ענדערן בלאק',
 'contribslink' => 'באַניצערס בײַשטײַערונגען',
 'emaillink' => 'שיקן ע־פאסט',
-'autoblocker' => 'דו ביסט געבלאקט אטאמאטיק ווייל דו טיילסט זיך די IP אדרעס מיט [[User:$1|$1]]. דער סיבה וואס איז אנגעבען געווארן  [[User:$1|$1]] איז: "$2".',
+'autoblocker' => 'אויטאמאטיש בלאקירט ווייל אײַער IP אדרעס איז לעצטנס געניצט געווארן דורך [[User:$1|$1]]. 
+דער סיבה וואס איז אנגעבען געווארן איז: "$2".',
 'blocklogpage' => 'בלאקירן לאג',
 'blocklog-showlog' => '{{GENDER:$1|דער באַניצער|די באַניצערין}} איז שוין געווארן פֿאַרשפאַרט אַמאָל.
 דער בלאקירונג לאג איז צוגעשטעלט אונטן:',
@@ -2864,7 +2869,7 @@ $2',
 אַ פראוויזארישער טעקע־האלטער פֿעלט.',
 'import-parse-failure' => 'פֿעלער בײַם אימפארטירן XML',
 'import-noarticle' => 'נישטא קיין בלאט צו אימפארטירן!',
-'import-nonewrevisions' => '×\90Ö·×\9c×¢ ×¨×¢×\95×\95×\99×\96×\99עס ×©×\95×\99×\9f ×\90×\99×\9eפ×\90ר×\98×\99ר×\98.',
+'import-nonewrevisions' => 'ק×\99×\99×\9f ×¨×¢×\95×\95×\99×\96×\99עס × ×\99ש×\98 ×\90×\99×\9eפ×\90ר×\98×\99ר×\98 (×\90×\93ער ×\90×\9c×¢ ×©×\95×\99×\9f ×\93×\90, ×\90×\93ער ×\90×\99×\91ער×\92×¢×\94×\99פ×\98 ×¦×\95×\9c×\99×\91 ×\92רײַ×\96×\9f).',
 'xml-error-string' => '$1 בײַ שורה $2, זייל $3 (בייט $4): $5',
 'import-upload' => 'אַרויפֿלאָדן XML דאַטן',
 'import-token-mismatch' => 'אָנווער פון סעסיע דאַטן.
@@ -2892,6 +2897,7 @@ $2',
 'javascripttest-title' => 'דורכפירנדיק $1 בדיקות',
 'javascripttest-pagetext-noframework' => ' דער בלאט איז רעזערווירט פאר JavaScript. פרואוון.',
 'javascripttest-pagetext-unknownframework' => 'אומבאקאנטער טעסטן גערעם "$1".',
+'javascripttest-pagetext-frameworks' => 'ביטע קלויבט איינעם פון די פאלגנדע טעסטן־גערעם: $1',
 'javascripttest-pagetext-skins' => 'קלויבט א באניצער־אייבערפלאך מיט וואס דורכצופירן די בדיקות:',
 'javascripttest-qunit-intro' => 'זעט [$1 דאקומענטאציע פאר טעסטן] בײַ mediawiki.org.',
 'javascripttest-qunit-heading' => 'מעדיעוויקי JavaScript QUnit קאנטראל־פראגראם',
@@ -3008,6 +3014,7 @@ $2',
 'pageinfo-length' => 'בלאט לענג (אין בייטן)',
 'pageinfo-article-id' => 'בלאט נומער',
 'pageinfo-language' => 'בלאט אינהאלט שפראך',
+'pageinfo-content-model' => 'בלאט אינהאלט מאדעל',
 'pageinfo-robot-policy' => 'אינדעקסירן דורך ראבאטן',
 'pageinfo-robot-index' => 'דערלויבט',
 'pageinfo-robot-noindex' => 'נישט דערלויבט',
index 4e256e0..0b48808 100644 (file)
@@ -55,7 +55,6 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Ìfàlàsábẹ́ àwọn àjápọ̀:',
-'tog-justify' => "Ṣ'àlàyé gbólóhùn ọ̀rọ̀",
 'tog-hideminor' => 'Ìbòmọ́lẹ̀ àwọn àtúnṣe kékeré nínú àwọn àtúnse tuntun',
 'tog-hidepatrolled' => 'Ìbòmọ́lẹ̀ àwọn àtúnṣe oníìṣọ́ nínú àwọn àtúnṣe tuntun',
 'tog-newpageshidepatrolled' => 'Ìbòmọ́lẹ̀ àwọn ojúewé oníìṣọ́ lọ́dọ̀ àtòjọ ojúewé tuntun',
@@ -1086,7 +1085,6 @@ Kò ṣe é bòmọ́lẹ̀.',
 'showhideselectedversions' => 'Ìfihàn/ìbòmọ́lẹ̀ àwọn àtúnyẹ̀wò ṣíṣàyàn',
 'editundo' => 'dápadà',
 'diff-empty' => '(Kò ní yàtọ̀)',
-'diff-multi' => '({{PLURAL:$1|Àtúnyẹ̀wò inú àrin kan|Àwọn àtúnyẹ̀wò inú àrin $1}} látọwọ́ {{PLURAL:$2|oníṣe kan|àwọn oníṣe $2}} kò jẹ́ fífihàn)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Àtúnyẹ̀wò inú àrin kan|Àwọn àtúnyẹ̀wò inú àrin $1}} látọwọ́ {{PLURAL:$2|oníṣe|àwọn oníṣe}} tó pọ̀ju $2 lọ kò jẹ́ fífihàn)',
 'difference-missing-revision' => '{{PLURAL:$2|Àtúnyẹ̀wò kan|Àwọn àtúnyẹ̀wò $2}} ìyàtọ̀ yìí ($1) kò {{PLURAL:$2|sí|sí}}.
 
@@ -2105,7 +2103,6 @@ A óò ṣ\'àkójọ àwọn àtúnṣe ọjọ́wajú sí ojúewé yìí àti
 'watchmethod-list' => 'únwo àwọn ojúewé mímójútó fún àwọn àtúnṣe tuntun',
 'watchlistcontains' => 'Àwọn ìmójútó yín ní {{PLURAL:$1|ojúewé|àwọn ojúewé}} $1 nínú.',
 'iteminvalidname' => "Ìṣòro wà pẹ̀lú '$1', orúkọ àìtọ́...",
-'wlnote' => "Lábẹ́ {{PLURAL:$1|ni àtúnṣe tó gbẹ̀yìn|ni àwọn àtúnṣe '''$1''' tí wọn gbẹ̀yìn}} ní {{PLURAL:$2|wákàtí kan|wákàtí '''$2'''}} sẹ́yìn, títí dí ọjọ́ $3, $4.",
 'wlshowlast' => 'Ìfihàn wákàtí $1 sẹ́yìn ọjọ́ $2 sẹ́yìn $3',
 'watchlist-options' => 'Àṣàyàn ìmójútọ́',
 
@@ -2760,7 +2757,6 @@ Fáìlì náà jẹ́ rírùsóké ní àbọ̀.',
 'tooltip-pt-watchlist' => 'Àkójọ àwọn ojúewé tí ẹ̀ ún mójútó bóyá wọ́nyí padà',
 'tooltip-pt-mycontris' => 'Àkójọ àwọn àfikún yín',
 'tooltip-pt-login' => 'A gbà yín níyànjú kí ẹwọlé, bótilẹ̀jẹ́pẹ́ kò pọndandan.',
-'tooltip-pt-anonlogin' => 'A gbàyín níyànjú láti wọlé, bótilẹ̀jẹ́pé kò ṣe dandan.',
 'tooltip-pt-logout' => 'Ìjáde',
 'tooltip-ca-talk' => 'Ìfọ̀rọ̀wérọ̀ nípa ohun inú ojúewé yìí',
 'tooltip-ca-edit' => 'Ẹ le ṣe àtúnṣe sí ojúewé yìí.
index 3c7d5cb..ff1e984 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Anson2812
+ * @author Antonytse
  * @author Horacewai2
  * @author Justincheng12345
  * @author Kaganer
@@ -235,15 +236,14 @@ $linkTrail = '/^([a-z]+)(.*)$/sD';
 $messages = array(
 # User preference toggles
 'tog-underline' => '連結加底線:',
-'tog-justify' => '拍齊段落',
 'tog-hideminor' => '最新更改唔顯示小修改',
 'tog-hidepatrolled' => '響最近修改度隱藏巡查過嘅編輯',
 'tog-newpageshidepatrolled' => '響新頁清單度隱藏巡查過嘅版',
 'tog-extendwatchlist' => '展開監視清單去顯示全部更改,唔係淨係最新嘅',
 'tog-usenewrc' => '用強化版最近更改(需要JavaScript)',
 'tog-numberheadings' => '標題自動編號',
-'tog-showtoolbar' => '顯示修改工具列(需要JavaScript)',
-'tog-editondblclick' => '撳兩下改嘢(需要JavaScript)',
+'tog-showtoolbar' => '顯示修改工具列',
+'tog-editondblclick' => '撳兩下改嘢',
 'tog-editsectiononrightclick' => '可以撳右掣更改個別段落(需要JavaScript)',
 'tog-rememberpassword' => '響呢個瀏覽器度記住我嘅登入資料 (最高維持$1{{PLURAL:$1|日|日}})',
 'tog-watchcreations' => '將我開嘅頁加入監視清單',
@@ -258,7 +258,7 @@ $messages = array(
 'tog-enotifminoredits' => '小修改都要電郵通知我',
 'tog-enotifrevealaddr' => '喺電郵通知信上面話畀人聽我嘅電郵地址',
 'tog-shownumberswatching' => '顯示有幾多人監視',
-'tog-oldsig' => '原有簽名嘅預覽:',
+'tog-oldsig' => '現有簽名:',
 'tog-fancysig' => '將簽名以維基字對待(冇自動連結)',
 'tog-uselivepreview' => '用即時預覽(需要JavaScript)(實驗緊)',
 'tog-forceeditsummary' => '我冇入修改註解時通知我',
@@ -338,6 +338,18 @@ $messages = array(
 'oct' => '10月',
 'nov' => '11月',
 'dec' => '12月',
+'january-date' => '1月$1號',
+'february-date' => '2月$1號',
+'march-date' => '3月$1號',
+'april-date' => '4月$1號',
+'may-date' => '5月$1號',
+'june-date' => '6月$1號',
+'july-date' => '7月$1號',
+'august-date' => '8月$1號',
+'september-date' => '9月$1號',
+'october-date' => '10月$1號',
+'november-date' => '11月$1號',
+'december-date' => '12月$1號',
 
 # Categories related messages
 'pagecategories' => '屬於$1類',
@@ -384,7 +396,6 @@ $messages = array(
 'vector-action-protect' => '保護',
 'vector-action-undelete' => '去睇刪除咗嘅頁面',
 'vector-action-unprotect' => '解除保護',
-'vector-simplesearch-preference' => '打開加強搵嘢建議(只限Vector畫面)',
 'vector-view-create' => '建立',
 'vector-view-edit' => '編輯',
 'vector-view-history' => '睇吓歷史',
@@ -487,6 +498,7 @@ $1',
 'ok' => 'OK',
 'retrievedfrom' => '由 "$1" 收',
 'youhavenewmessages' => '你有$1($2)。',
+'newmessageslinkplural' => '新訊息',
 'youhavenewmessagesmulti' => '你響 $1 有新信',
 'editsection' => '編輯',
 'editold' => '編輯',
@@ -613,8 +625,13 @@ $1',
 'gotaccount' => '已經有戶口? $1。',
 'gotaccountlink' => '登入',
 'userlogin-resetlink' => '唔記得簽到資料?',
+'userlogin-resetpassword-link' => '唔記得密碼?',
+'userlogin-createanother' => '開過個戶口',
+'createacct-emailrequired' => '電郵地址',
 'createaccountmail' => '用電郵',
 'createaccountreason' => '原因:',
+'createacct-reason-ph' => '開過個戶口嘅原因',
+'createacct-submit' => '開戶口',
 'badretype' => '你入嘅密碼唔一致。',
 'userexists' => '你入嘅用戶名已經有人用咗,唔該揀過個名啦。',
 'loginerror' => '登入錯誤',
@@ -637,7 +654,7 @@ $1',
 'passwordtooshort' => '你嘅密碼最少要有$1個半形字元。',
 'password-name-match' => '你嘅密碼一定要同你嘅用戶名唔一樣。',
 'password-login-forbidden' => '呢個用戶名同密碼嘅利用係被禁止嘅。',
-'mailmypassword' => '寄個新密碼',
+'mailmypassword' => '重設密碼',
 'passwordremindertitle' => '{{SITENAME}}嘅新臨時密碼',
 'passwordremindertext' => '有人(可能係你,IP 位置 $1)
 請求 {{SITENAME}} 嘅新密碼 ($4)。
@@ -697,7 +714,18 @@ $1',
 
 # Special:PasswordReset
 'passwordreset' => '密碼重設',
-'passwordreset-username' => '用戶名',
+'passwordreset-legend' => '重設密碼',
+'passwordreset-username' => '用戶名:',
+'passwordreset-domain' => '域名:',
+'passwordreset-email' => '電郵地址:',
+'passwordreset-emailelement' => '用戶名:$1
+臨時密碼:$2',
+
+# Special:ChangeEmail
+'changeemail' => '改電郵地址',
+'changeemail-submit' => '轉電郵',
+'changeemail-cancel' => '取消',
+'changeemail-throttled' => '你試咗登入太多次,請喺$1後再試過。',
 
 # Edit page toolbar
 'bold_sample' => '粗體字',
@@ -807,6 +835,7 @@ $1',
 'note' => "'''留意:'''",
 'previewnote' => "'''請記住呢個只係預覽。'''
 更改嘅内容重未儲存!",
+'continue-editing' => '去編輯區',
 'previewconflict' => '呢個預覽係反映如果你選擇儲存嘅話,嘅上面嘅文字編輯區裏面嘅字會儲存落嚟。',
 'session_fail_preview' => "'''對唔住!由於小節嘅資料唔見咗,我哋唔能夠處理你嘅編輯。'''
 請再試過喇。如果仍然唔得嘅話,試下[[Special:UserLogout|登出]],然後重新登入。",
@@ -931,7 +960,7 @@ $1',
 'history-fieldset-title' => '瀏覽歷史',
 'history-show-deleted' => '只顯示刪除咗嘅',
 'histfirst' => '最早',
-'histlast' => '最',
+'histlast' => '最',
 'historysize' => '($1 {{PLURAL:$1|byte|bytes}})',
 'historyempty' => '(空)',
 
@@ -1071,7 +1100,6 @@ $1",
 'compareselectedversions' => '比較被選嘅修訂',
 'showhideselectedversions' => '顯示/隱藏揀咗嘅修訂',
 'editundo' => '復原',
-'diff-multi' => '(由$2位用戶所做嘅$1個中途修訂冇顯示到)',
 'diff-multi-manyusers' => '(由$2位更多用戶所做嘅$1個中途修訂冇顯示到)',
 
 # Search results
@@ -1189,7 +1217,7 @@ $1",
 'prefs-emailconfirm-label' => '電郵確認:',
 'youremail' => '電郵:',
 'username' => '用戶名:',
-'uid' => '用戶 ID:',
+'uid' => '{{GENDER:$1|用戶}}ID:',
 'prefs-memberingroups' => '{{PLURAL:$1|一|多}}組嘅成員:',
 'prefs-registration' => '註冊時間:',
 'yourrealname' => '真名:',
@@ -1264,8 +1292,8 @@ $1",
 
 'group-user-member' => '用戶',
 'group-autoconfirmed-member' => '自動確認用戶',
-'group-bot-member' => '機械人',
-'group-sysop-member' => '操作員',
+'group-bot-member' => '{{GENDER:$1|機械人}}',
+'group-sysop-member' => '{{GENDER:$1|管理員}}',
 'group-bureaucrat-member' => '事務員',
 'group-suppress-member' => '監督',
 
@@ -1545,6 +1573,10 @@ $1',
 'upload-unknown-size' => '未知嘅大細',
 'upload-http-error' => '一個HTTP錯誤發生咗: $1',
 
+# File backend
+'backend-fail-notexists' => '檔案$1唔存在。',
+'backend-fail-delete' => '刪唔到檔案「$1」。',
+
 # ZipDirectoryReader
 'zip-file-open-error' => '在開啟檔案進行ZIP檢查時出錯。',
 'zip-wrong-format' => '呢個唔係一個ZIP檔案。',
@@ -1787,6 +1819,7 @@ $1',
 'protectedpages-indef' => '只有無期保謢頁',
 'protectedpages-cascade' => '只有連串保護頁',
 'protectedpagesempty' => '響呢啲參數度,現時無頁面響度保護緊。',
+'protectedpages-reason' => '原因',
 'protectedtitles' => '保護咗嘅標題',
 'protectedtitlesempty' => '響呢啲參數之下並無標題保護住。',
 'listusers' => '用戶一覽',
@@ -1820,7 +1853,7 @@ $1',
 
 # Special:Log
 'specialloguserlabel' => '用戶:',
-'speciallogtitlelabel' => '標題:',
+'speciallogtitlelabel' => '目標(題目或者用戶):',
 'log' => '日誌',
 'all-logs-page' => '全部嘅公共日誌',
 'alllogstext' => '響{{SITENAME}}度全部日誌嘅綜合顯示。你可以選擇一個日誌類型、用戶名、或者受影響嘅頁面,嚟縮窄顯示嘅範圍。',
@@ -1931,7 +1964,7 @@ $1',
 'usermessage-editor' => '系統訊息',
 
 # Watchlist
-'watchlist' => '監視單',
+'watchlist' => '監視單',
 'mywatchlist' => '監視清單',
 'watchlistfor2' => '$1嘅監視清單 $2',
 'nowatchlist' => '你嘅監視清單度並冇任何項目。',
@@ -1954,7 +1987,6 @@ $1',
 'watchmethod-list' => '睇緊被監視頁有乜新修改',
 'watchlistcontains' => '你嘅監視清單裏面有$1頁。',
 'iteminvalidname' => "項目'$1'出錯,無效嘅名稱...",
-'wlnote' => "以下係最近'''$2'''個鐘之內嘅最新$1次修改。",
 'wlshowlast' => '顯示最近 $1 個鐘 $2 日 $3 嘅修改',
 'watchlist-options' => '監視清單選項',
 
@@ -2069,8 +2101,8 @@ wiki: $PAGEEDITOR_WIKI
 'protect-cascadeon' => '呢一版現時正響度保護緊,因為佢係響以下嘅{{PLURAL:$1|一|幾}}頁度包含咗,而當中又開咗連串保護。你可以更改呢一版嘅保護等級,但係呢個修改係唔會影響到嗰個連串保護。',
 'protect-default' => '容許全部用戶',
 'protect-fallback' => '需要"$1"嘅許可',
-'protect-level-autoconfirmed' => '限制新嘅同未註冊嘅用戶',
-'protect-level-sysop' => '只限操作員',
+'protect-level-autoconfirmed' => '只限已經自動確認嘅用戶',
+'protect-level-sysop' => '只限管理員',
 'protect-summary-cascade' => '連串保護',
 'protect-expiring' => '響 $1 (UTC) 到期',
 'protect-expiry-indefinite' => '唔定',
@@ -2503,7 +2535,6 @@ $1',
 'tooltip-pt-watchlist' => '你所監視嘅頁面更改一覽',
 'tooltip-pt-mycontris' => '你嘅貢獻一覽',
 'tooltip-pt-login' => '建議你去登入;但係唔係一定嘅',
-'tooltip-pt-anonlogin' => '建議你去登入;但係唔係一定嘅',
 'tooltip-pt-logout' => '登出',
 'tooltip-ca-talk' => '關於內容頁嘅討論',
 'tooltip-ca-edit' => '你可以編輯呢一頁。請在儲存之前先預覽一吓。',
index 3bd06b0..145427a 100644 (file)
@@ -45,7 +45,6 @@ $namespaceNames = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Lienks onderstreepn:',
-'tog-justify' => 'Paragraeven uutvullen',
 'tog-hideminor' => 'Kleine wijzigingen verbergen in recente wijzigingen',
 'tog-hidepatrolled' => "Gemarkeerde wiezigiengen verbarg'n in juust angepast",
 'tog-newpageshidepatrolled' => "Gemarkeerde pagina's verbarg'n in de lieste mei nuwe pagina's",
@@ -54,9 +53,7 @@ $messages = array(
 'tog-numberheadings' => 'Koppn automaotisch nummern',
 'tog-showtoolbar' => 'Bewerkiengswerkbalke weerheven (JavaScript vereist)',
 'tog-editondblclick' => 'Dubbelklikkn voe bewerkn (JavaScript vereist)',
-'tog-editsection' => "Bewerken van deêlpahina's meuhlijk maeken via [bewerken]-koppeliengen",
 'tog-editsectiononrightclick' => "Bewerken van deêlpahina's meulijk maeken mie een rechtermuusklik op een tussenkopje (JavaScript vereist)",
-'tog-showtoc' => "Inoudsopgaeve weerheven (voe pahina's mie minstes 3 tussenkopjes)",
 'tog-rememberpassword' => 'Anmeldhehevens ontouwen (maximaal $1 {{PLURAL:$1|dag|daege}})',
 'tog-watchcreations' => "Pahina's die ak anmik automaotisch volhen",
 'tog-watchdefault' => "Pahina's die ak bewerk automaotisch volhen",
@@ -765,7 +762,6 @@ Zurg da je bie deêze wiezigieng de heschiedenisdeurloôpendeid van de pagina be
 'lineno' => 'Rehel $1:',
 'compareselectedversions' => 'Anevienkte versies verhelieken',
 'editundo' => 'onedaene maeken',
-'diff-multi' => 'Von {{PLURAL:$2|eên gebruker|$2 gebrukers}} ({{PLURAL:$1|wor eên tussenlihhende versie|worn $1 tussenlihhende versies}} nie weereheven)',
 
 # Search results
 'searchresults' => 'Zoekresultaoten',
index 99125d2..63ba19d 100644 (file)
@@ -37,6 +37,7 @@
  * @author Jding2010
  * @author Jetlag
  * @author Jidanni
+ * @author Jienus
  * @author Jimmy xu wrk
  * @author Kaganer
  * @author KaiesTse
@@ -75,6 +76,7 @@
  * @author 乌拉跨氪
  * @author 御坂美琴
  * @author 燃玉
+ * @author 范
  * @author 阿pp
  */
 
@@ -384,7 +386,6 @@ $bookstoreList = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => '链接下划线:',
-'tog-justify' => '对齐段落',
 'tog-hideminor' => '隐藏最近更改中的小编辑',
 'tog-hidepatrolled' => '隐藏最近更改中的已巡查编辑',
 'tog-newpageshidepatrolled' => '隐藏新页面列表中的已巡查页面',
@@ -548,7 +549,6 @@ $messages = array(
 'vector-action-protect' => '保护',
 'vector-action-undelete' => '还原',
 'vector-action-unprotect' => '更改保护',
-'vector-simplesearch-preference' => '启用简化的搜索栏(仅Vector皮肤)',
 'vector-view-create' => '创建',
 'vector-view-edit' => '编辑',
 'vector-view-history' => '查看历史',
@@ -844,9 +844,9 @@ $2',
 'createacct-submit' => '创建您的账户',
 'createacct-another-submit' => '创建另一个账户',
 'createacct-benefit-heading' => '{{SITENAME}}是由像您这样的人建立的。',
-'createacct-benefit-body1' => '{{PLURAL:$1|编辑}}',
-'createacct-benefit-body2' => '{{PLURAL:$1|页面}}',
-'createacct-benefit-body3' => '最近{{PLURAL:$1|贡献者}}',
+'createacct-benefit-body1' => '{{PLURAL:$1|编辑}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|页面}}',
+'createacct-benefit-body3' => '最近{{PLURAL:$1|贡献者}}',
 'badretype' => '您所输入的密码并不相同。',
 'userexists' => '用户名已存在。请使用其他名称。',
 'loginerror' => '登录错误',
@@ -1159,7 +1159,7 @@ $2
 'content-failed-to-parse' => '未能将 $2 内容转换为 $1:$3',
 'invalid-content-data' => '无效的内容数据',
 'content-not-allowed-here' => '[[$2]]页面上不允许“$1”内容',
-'editwarning-warning' => '离开本页面可能导致你失去任何你已经作出的更改。如果你处于登录状态,你可以在你的设置的“编辑”部分停用该警告。',
+'editwarning-warning' => '离开本页面可能导致你失去任何你已经作出的更改。如果你处于登录状态,你可以在你的设置的“{{int:prefs-editing}}”部分停用该警告。',
 'editpage-notsupportedcontentformat-title' => '内容格式尚不支持',
 'editpage-notsupportedcontentformat-text' => '内容模型$2尚不支持内容格式$1。',
 
@@ -1194,6 +1194,7 @@ $2
 'undo-success' => '该编辑可以被撤销。请检查下面的对比以核实你想要撤销的内容,然后保存下面的更改以完成撤销。',
 'undo-failure' => '因存在冲突的中间编辑,本编辑不能撤销。',
 'undo-norev' => '该编辑无法撤消,因为它不存在或已被删除。',
+'undo-nochange' => '这次编辑似乎已被撤销。',
 'undo-summary' => '撤销[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])的版本$1',
 'undo-summary-username-hidden' => '取消由一匿名用户所作的修订$1',
 
@@ -1353,7 +1354,8 @@ $1",
 'showhideselectedversions' => '显示/隐藏选择的版本',
 'editundo' => '撤销',
 'diff-empty' => '(没有差异)',
-'diff-multi' => '(未显示$2个用户的$1个中间版本)',
+'diff-multi-sameuser' => '(相同用户的{{PLURAL:$1|一个|$1个}}中间修订版本未显示)',
+'diff-multi-otherusers' => '({{PLURAL:$1|某位用户|$2位用户}}的{{PLURAL:$1|一个|$1个}}中间修订版本未显示)',
 'diff-multi-manyusers' => '(未显示超过$2个用户的$1个中间版本)',
 'difference-missing-revision' => '此差异对比的{{PLURAL:$2|一个修订|$2个修订}}($1){{PLURAL:$2|没有}}找到。
 
@@ -1374,7 +1376,7 @@ $1",
 'shown-title' => '每页显示$1项结果',
 'viewprevnext' => '查看($1{{int:pipe-separator}}$2)($3)',
 'searchmenu-exists' => "'''本wiki上有名为“[[:$1]]”的页面。'''",
-'searchmenu-new' => "'''在本wiki上新建名为“[[:$1]]”的页面!'''",
+'searchmenu-new' => '<strong>在本Wiki上新建名为“[[:$1]]”的页面!</strong>{{PLURAL:$2|0=|另请查看您的搜索找的结果。|另请查看搜索结果。}}',
 'searchprofile-articles' => '内容页面',
 'searchprofile-project' => '帮助和项目页面',
 'searchprofile-images' => '多媒体',
@@ -1400,6 +1402,7 @@ $1",
 'searchrelated' => '相关',
 'searchall' => '所有',
 'showingresults' => "下面显示从第'''$2'''条结果开始的'''$1'''条结果。",
+'showingresultsinrange' => '以下显示从#<strong>$2</strong>至#<strong>$3</strong>范围的<strong>$1</strong>个结果。',
 'showingresultsnum' => "下面显示从第'''$2'''条结果开始的'''$3'''条结果。",
 'showingresultsheader' => "关于'''$4'''的{{PLURAL:$5|第'''$1'''条结果,共'''$3'''条结果|第'''$1~$2'''条结果,共'''$3'''条结果}}",
 'search-nonefound' => '找不到和查询相匹配的结果。',
@@ -1451,7 +1454,7 @@ $1",
 'recentchangesdays-max' => '最多$1天',
 'recentchangescount' => '默认显示的编辑数:',
 'prefs-help-recentchangescount' => '这包括最近更改、页面历史和日志。',
-'prefs-help-watchlist-token2' => '这是你的监视列表网页feed的密钥。任何知道它的人均可以阅读你的监视列表,因此不要分享它。[[Special:ResetTokens|如果需要重置它,请点击这里]]。',
+'prefs-help-watchlist-token2' => '这是你的监视列表网页feed的密钥。任何知道它的人均可以阅读你的监视列表,因此不要分享它。如果需要,[[Special:ResetTokens|您可重置它]]。',
 'savedprefs' => '你的系统设置已保存。',
 'timezonelegend' => '时区:',
 'localtime' => '当地时间:',
@@ -1734,7 +1737,7 @@ $1",
 'newsectionsummary' => '/* $1 */ 新段落',
 'rc-enhanced-expand' => '显示细节',
 'rc-enhanced-hide' => '隐藏细节',
-'rc-old-title' => '最初被创建为" $1 "',
+'rc-old-title' => '最初创建为“$1”',
 
 # Recent changes linked
 'recentchangeslinked' => '相关更改',
@@ -2177,10 +2180,20 @@ $1',
 'deadendpagestext' => '以下页面没有链接至{{SITENAME}}的其它页面。',
 'protectedpages' => '受保护页面',
 'protectedpages-indef' => '仅无限期保护',
+'protectedpages-summary' => '本页面列出当前受保护的页面。要浏览受限制创建的标题列表,请参见[[{{#special:ProtectedTitles}}]]。',
 'protectedpages-cascade' => '仅连锁保护',
 'protectedpages-noredirect' => '隐藏重定向',
 'protectedpagesempty' => '在这些参数下没有页面正在保护。',
+'protectedpages-timestamp' => '时间戳',
+'protectedpages-page' => '页面',
+'protectedpages-expiry' => '到期',
+'protectedpages-performer' => '保护用户',
+'protectedpages-params' => '保护参数',
+'protectedpages-reason' => '原因',
+'protectedpages-unknown-timestamp' => '未知',
+'protectedpages-unknown-performer' => '未知用户',
 'protectedtitles' => '受保护标题',
+'protectedtitles-summary' => '本页面列出当前限制创建的标题。要浏览受限制页面的列表,请参见[[{{#special:ProtectedPages}}]]。',
 'protectedtitlesempty' => '在这些参数之下并无标题正在保护。',
 'listusers' => '用户列表',
 'listusers-editsonly' => '只显示有编辑的用户',
@@ -2359,8 +2372,8 @@ $1',
 'watchmethod-list' => '查看监视页中的最新修改',
 'watchlistcontains' => '您的监视列表包含$1个页面。',
 'iteminvalidname' => "页面'$1'错误,无效命名...",
-'wlnote2' => '以下是最近<strong>$1</strong>小时的变化,作为$2,$3。',
-'wlshowlast' => '显示过去$1小时或$2天内的$3',
+'wlnote2' => '以下是最近<strong>$1</strong>小时的变化,截至$2 $3。',
+'wlshowlast' => '显示过去$1小时$2天$3',
 'watchlist-options' => '监视列表选项',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -2713,8 +2726,8 @@ $1',
 'change-blocklink' => '更改封禁',
 'contribslink' => '贡献',
 'emaillink' => '发送电子邮件',
-'autoblocker' => '由于您与“[[User:$1|$1]]”共享一个IP地址而被自动封禁。
-$1被封禁的理由是“$2”',
+'autoblocker' => '因为您与“[[User:$1|$1]]”共享一个IP地址而被自动封禁。
+$1被封禁的理由是“$2”',
 'blocklogpage' => '封禁日志',
 'blocklog-showlog' => '该用户曾被封禁。下面提供封禁日志以供参考:',
 'blocklog-showsuppresslog' => '该用户曾被封禁并隐藏。下面提供封锁日志以供参考:',
@@ -2891,7 +2904,7 @@ $1被封禁的理由是:“$2”',
 'allmessages-filter-legend' => '过滤',
 'allmessages-filter' => '按自定义状态过滤:',
 'allmessages-filter-unmodified' => '未修改',
-'allmessages-filter-all' => '所有',
+'allmessages-filter-all' => '全部',
 'allmessages-filter-modified' => '曾修改',
 'allmessages-prefix' => '以前缀过滤:',
 'allmessages-language' => '语言:',
@@ -2913,6 +2926,7 @@ $2',
 'thumbnail_image-type' => '图像类型不支持',
 'thumbnail_gd-library' => '未完成的GD设置:功能遗失 $1',
 'thumbnail_image-missing' => '文件可能丢失:$1',
+'thumbnail_image-failure-limit' => '近期尝试生成此缩略图失败太多次($1次或更多)。请稍后再试。',
 
 # Special:Import
 'import' => '导入页面',
@@ -2946,7 +2960,7 @@ $2',
 'importuploaderrortemp' => '上传导入文件失败。临时文件夹已遗失。',
 'import-parse-failure' => 'XML导入语法失败',
 'import-noarticle' => '没有页面作导入!',
-'import-nonewrevisions' => 'æ\89\80æ\9c\89ç\9a\84修订ä¹\8bå\89\8dæ\9b¾å·²å¯¼å\85¥。',
+'import-nonewrevisions' => '没æ\9c\89导å\85¥ä¿®è®¢ï¼\88æ\89\80æ\9c\89é\83½å·²å­\98å\9c¨æ\88\96å\9b é\94\99误跳è¿\87ï¼\89。',
 'xml-error-string' => '$1于行$2,列$3($4字节):$5',
 'import-upload' => '上传XML数据',
 'import-token-mismatch' => '会话数据遗失。请重试。',
@@ -2957,6 +2971,7 @@ $2',
 'import-error-special' => '页面“$1”未导入,因为它需要使用一个不能创建页面的特殊名字空间。',
 'import-error-invalid' => '页面“$1”未能导入,因为它的名字无效。',
 'import-error-unserialize' => '页面“$1”的版本$2无法反序列化。此版本使用内容模型$3序列化为$4。',
+'import-error-bad-location' => '在此wiki使用了内容模式$3的修订版本$2不能被保存至“$1”,这是因为此模式在此页面不被支持。',
 'import-options-wrong' => '{{PLURAL:$2|选项}}出错:<nowiki>$1</nowiki>',
 'import-rootpage-invalid' => '根页面的标题无效。',
 'import-rootpage-nosubpage' => '名字空间为“$1”的根页面不允许子页面。',
@@ -4157,6 +4172,5 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含
 'expand_templates_preview' => '预览',
 
 # Unknown messages
-'createaccount-hook-aborted' => '$1',
 'uploadinvalidxml' => '上传文件中的XML无法解析。',
 );
index 66f0ca5..8ee9c6b 100644 (file)
@@ -12,6 +12,7 @@
  * @author Andrew971218
  * @author Bencmq
  * @author Breawycker
+ * @author Byfserag
  * @author Ch.Andrew
  * @author Cwlin0416
  * @author Danny0838
@@ -270,7 +271,6 @@ $bookstoreList = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => '連結加底線:',
-'tog-justify' => '段落對齊',
 'tog-hideminor' => '隱藏最近更改中的小修改',
 'tog-hidepatrolled' => '隱藏最近更改中巡查過的編輯',
 'tog-newpageshidepatrolled' => '隱藏新頁面清單中巡查過的頁面',
@@ -433,7 +433,6 @@ $messages = array(
 'vector-action-protect' => '保護',
 'vector-action-undelete' => '恢復被刪頁面',
 'vector-action-unprotect' => '更改保護',
-'vector-simplesearch-preference' => '啟用簡化搜尋欄(僅限 Vector 外觀)',
 'vector-view-create' => '建立',
 'vector-view-edit' => '編輯',
 'vector-view-history' => '檢視歷史',
@@ -736,7 +735,7 @@ $2',
 'createacct-captcha' => '安全驗證',
 'createacct-imgcaptcha-ph' => '輸入您在上方看到的文字',
 'createacct-submit' => '建立帳號',
-'createacct-another-submit' => '建ç«\8bå\8f¦ä¸\80å\80\8b使ç\94¨è\80\85帳è\99\9f',
+'createacct-another-submit' => '建立另一帳號',
 'createacct-benefit-heading' => '{{SITENAME}}是由像您一樣的人建立。',
 'createacct-benefit-body1' => '{{PLURAL:$1|次編輯}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|篇頁面}}',
@@ -1088,7 +1087,7 @@ $2
 'content-failed-to-parse' => '未能轉換$2 內容成為$1:$3',
 'invalid-content-data' => '內容資料無效',
 'content-not-allowed-here' => '[[$2]]頁面上不允許「$1」內容',
-'editwarning-warning' => '離開這個頁面可能會令您失去之前作出的所有更改。若您已經登入,您可在偏好設定的「編輯」部份裡關閉此警告。',
+'editwarning-warning' => '離開這個頁面可能會令您失去之前作出的所有更改。若您已經登入,您可在偏好設定的「{{int:prefs-editing}}」部份裡關閉此警告。',
 'editpage-notsupportedcontentformat-title' => '內容格式尚無法支援',
 'editpage-notsupportedcontentformat-text' => '內容模型$2尚無法支援內容格式$1。',
 
@@ -1124,6 +1123,7 @@ $2
 'undo-success' => '該編輯可以被撤銷。請檢查以下對比以核實這正是您想做的,然後儲存以下更改以完成撤銷編輯。',
 'undo-failure' => '由於中途的編輯不一致,此編輯不能撤銷。',
 'undo-norev' => '由於其修訂版本不存在或已刪除,此編輯不能撤銷。',
+'undo-nochange' => '是次編輯似乎已經被撤銷。',
 'undo-summary' => '取消由[[Special:Contributions/$2|$2]] ([[User talk:$2|對話]])所作出的修訂 $1',
 'undo-summary-username-hidden' => '隱藏的用戶撤銷$1的修訂',
 
@@ -1285,7 +1285,8 @@ $1",
 'showhideselectedversions' => '顯示/隱藏選定的修訂版本',
 'editundo' => '復原',
 'diff-empty' => '(沒有差異)',
-'diff-multi' => '(由{{PLURAL:$2|1名用戶|$2名用戶}}作出的{{PLURAL:$1|一個中途修訂版本|$1個中途修訂版本}}未被顯示)',
+'diff-multi-sameuser' => '(未顯示同用戶所作出之$1次版本)',
+'diff-multi-otherusers' => '(未顯示$2位用戶所作出之$1次版本)',
 'diff-multi-manyusers' => '(由多於$2名用戶作出的{{PLURAL:$1|一個中途修訂版本|$1個中途修訂版本}} 未被顯示)',
 'difference-missing-revision' => '{{PLURAL:$2|1次修訂|$2 次修訂}}差異($1)不存在。
 
@@ -1306,7 +1307,7 @@ $1",
 'shown-title' => '每頁顯示 $1 項結果',
 'viewprevnext' => '檢視($1 {{int:pipe-separator}} $2)($3)',
 'searchmenu-exists' => "'''在這個 wiki 上已有一頁面叫做「[[:$1]]」。'''",
-'searchmenu-new' => "'''在這個 wiki 上建立這個頁面「[[:$1]]」!'''",
+'searchmenu-new' => '<strong>於此wiki建立這個頁面「[[:$1]]」!</strong>請參見已發現之$2條搜尋結果。',
 'searchprofile-articles' => '內容頁面',
 'searchprofile-project' => '幫助和計劃頁面',
 'searchprofile-images' => '多媒體',
@@ -1332,6 +1333,7 @@ $1",
 'searchrelated' => '相關',
 'searchall' => '所有',
 'showingresults' => '下面顯示從第 <b>$2</b> 條開始的 <b>$1</b> 條結果:',
+'showingresultsinrange' => '以下顯示於#<strong>$2</strong>至#<strong>$3</strong>之<strong>$1</strong>個搜尋結果。',
 'showingresultsnum' => "下面顯示從第 '''$2''' 條開始的 '''{{PLURAL:$3|1|$3}}''' 條結果。",
 'showingresultsheader' => "對'''$4'''的{{PLURAL:$5|第 '''$1''' 至第 '''$3''' 項結果|第 '''$1 - $2''' 項,共 '''$3''' 項結果}}",
 'search-nonefound' => '在查詢中無結果相符。',
@@ -2126,10 +2128,20 @@ $1',
 'deadendpagestext' => '以下頁面沒有連結到{{SITENAME}}中的其它頁面。',
 'protectedpages' => '受保護頁面',
 'protectedpages-indef' => '只有無期之保護頁面',
+'protectedpages-summary' => '此頁面列出當前受保護之頁面。欲訪問受白紙保護之標題列表,請參見[[{{#special:ProtectedTitles}}]]。',
 'protectedpages-cascade' => '只有連鎖之保護頁面',
 'protectedpages-noredirect' => '隱藏重定向',
 'protectedpagesempty' => '在這些參數下沒有頁面正在保護。',
+'protectedpages-timestamp' => '時間戳',
+'protectedpages-page' => '頁面',
+'protectedpages-expiry' => '過期',
+'protectedpages-performer' => '保護用戶',
+'protectedpages-params' => '保護參數',
+'protectedpages-reason' => '原因',
+'protectedpages-unknown-timestamp' => '未知',
+'protectedpages-unknown-performer' => '未知用戶',
 'protectedtitles' => '受保護標題',
+'protectedtitles-summary' => '此頁面列出當前受白紙保護之標題。欲訪問受保護頁面之列表,請參見[[{{#special:ProtectedPages}}]]。',
 'protectedtitlesempty' => '在這些參數之下並無標題正在保護。',
 'listusers' => '用戶列表',
 'listusers-editsonly' => '只顯示有編輯的用戶',
@@ -2314,7 +2326,7 @@ $1',
 'watchmethod-list' => '檢查最近編輯的被監視頁面',
 'watchlistcontains' => '您的監視列表包含$1個頁面。',
 'iteminvalidname' => "頁面 '$1' 錯誤,無效命名...",
-'wlnote2' => '以下是新近<strong>$1</strong>小時的更改,作為$2,$3。',
+'wlnote2' => '以下是新近<strong>$1</strong>小時的更改,截至$2 $3。',
 'wlshowlast' => '顯示最近$1小時;$2天;$3的修改。',
 'watchlist-options' => '監視列表選項',
 
@@ -2676,8 +2688,8 @@ $1',
 'change-blocklink' => '變更封禁',
 'contribslink' => '貢獻',
 'emaillink' => '傳送電郵',
-'autoblocker' => '因為您與â\80\9c[[User:$1|$1]]â\80\9då\85±äº«ä¸\80å\80\8bIPå\9c°å\9d\80è\80\8c被è\87ªå\8b\95æ\9f¥å°\81ã\80\82
-$1被封禁的理由是“$2”',
+'autoblocker' => '因為您與ã\80\8c[[User:$1|$1]]ã\80\8då\85±äº«å\90\8cä¸\80IPä½\8då\9d\80è\80\8c被è\87ªå\8b\95å°\81ç¦\81ã\80\82
+$1被封禁的理由是「$2」',
 'blocklogpage' => '查封日誌',
 'blocklog-showlog' => '這位用戶曾經被封鎖過。在下列提供封鎖記錄以便參考:',
 'blocklog-showsuppresslog' => '這位用戶曾經被封鎖和隱藏過。在下列提供廢止記錄以便參考:',
@@ -2882,6 +2894,7 @@ $2',
 'thumbnail_image-type' => '圖片類型不支援',
 'thumbnail_gd-library' => '未完成的GD設定: 功能遺失 $1',
 'thumbnail_image-missing' => '檔案似乎遺失: $1',
+'thumbnail_image-failure-limit' => '新近嘗試生成此縮略圖失敗太多($1次或以上)。請稍後再試。',
 
 # Special:Import
 'import' => '匯入頁面',
@@ -2917,7 +2930,7 @@ $2',
 'importuploaderrortemp' => '上載匯入檔案失敗。臨時資料夾已遺失。',
 'import-parse-failure' => 'XML匯入語法失敗',
 'import-noarticle' => '沒有頁面作匯入!',
-'import-nonewrevisions' => '所有的修訂已經在先前匯入。',
+'import-nonewrevisions' => '並無修訂導入(全數已存在,或出錯而跳過)。',
 'xml-error-string' => '$1 於行$2,欄$3 ($4位元組): $5',
 'import-upload' => '上傳XML資料',
 'import-token-mismatch' => '小節資料遺失。請再嘗試。',
@@ -2928,6 +2941,7 @@ $2',
 'import-error-special' => '「$1」未能導入因為該頁面使用一個不能創建頁面的特殊名字空間。',
 'import-error-invalid' => '「$1」不能導入,因為名字無效。',
 'import-error-unserialize' => '頁面「$1」的修訂版本「$2」不能反序列。該修訂版本是以$3內容模式序列為$4。',
+'import-error-bad-location' => '於此wiki使用的內容模式$3的修訂版本$2並無可能存儲為「$1」,這是因為此種模式於該頁面無法支援。',
 'import-options-wrong' => '{{PLURAL:$2|選項}}出錯:<nowiki>$1</nowiki>',
 'import-rootpage-invalid' => '指定的根頁標題無效。',
 'import-rootpage-nosubpage' => '名字空間「$1」的根頁面不允許子頁面。',
@@ -3743,7 +3757,7 @@ $5
 'colon-separator' => ':',
 'word-separator' => '',
 'parentheses' => '($1)',
-'quotation-marks' => '“$1”',
+'quotation-marks' => '「$1」',
 
 # Multipage image navigation
 'imgmultipageprev' => '← 上一頁',
@@ -4118,6 +4132,5 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'expand_templates_preview' => '預覽',
 
 # Unknown messages
-'createaccount-hook-aborted' => '$1',
 'uploadinvalidxml' => '上載檔案中的XML無法解析。',
 );
index 4e2e869..edd97fd 100644 (file)
@@ -5,7 +5,7 @@
  * UTS #35 Revision 33
  * http://www.unicode.org/reports/tr35/tr35-33/tr35-numbers.html#Language_Plural_Rules
  *
- * @author Niklas Laxstrom, Tim Starling
+ * @author Niklas Laxström, Tim Starling
  *
  * @copyright Copyright © 2010-2012, Niklas Laxström
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0
index fb2cd8c..d9ef350 100644 (file)
@@ -114,13 +114,6 @@ abstract class Maintenance {
         */
        public $fileHandle;
 
-       /**
-        * List of all the core maintenance scripts. This is added
-        * to scripts added by extensions in $wgMaintenanceScripts
-        * and returned by getMaintenanceScripts()
-        */
-       protected static $mCoreScripts = null;
-
        /**
         * Default constructor. Children should call this *first* if implementing
         * their own constructors
@@ -1007,52 +1000,6 @@ abstract class Maintenance {
                return __DIR__;
        }
 
-       /**
-        * Get the list of available maintenance scripts. Note
-        * that if you call this _before_ calling doMaintenance
-        * you won't have any extensions in it yet
-        * @return Array
-        */
-       public static function getMaintenanceScripts() {
-               global $wgMaintenanceScripts;
-               return $wgMaintenanceScripts + self::getCoreScripts();
-       }
-
-       /**
-        * Return all of the core maintenance scripts
-        * @return array
-        */
-       protected static function getCoreScripts() {
-               if ( !self::$mCoreScripts ) {
-                       $paths = array(
-                               __DIR__,
-                               __DIR__ . '/language',
-                               __DIR__ . '/storage',
-                       );
-                       self::$mCoreScripts = array();
-                       foreach ( $paths as $p ) {
-                               $handle = opendir( $p );
-                               while ( ( $file = readdir( $handle ) ) !== false ) {
-                                       if ( $file == 'Maintenance.php' ) {
-                                               continue;
-                                       }
-                                       $file = $p . '/' . $file;
-                                       if ( is_dir( $file ) || !strpos( $file, '.php' ) ||
-                                               ( strpos( file_get_contents( $file ), '$maintClass' ) === false ) ) {
-                                               continue;
-                                       }
-                                       require $file;
-                                       $vars = get_defined_vars();
-                                       if ( array_key_exists( 'maintClass', $vars ) ) {
-                                               self::$mCoreScripts[$vars['maintClass']] = $file;
-                                       }
-                               }
-                               closedir( $handle );
-                       }
-               }
-               return self::$mCoreScripts;
-       }
-
        /**
         * Returns a database to be used by current maintenance script. It can be set by setDB().
         * If not set, wfGetDB() will be used.
diff --git a/maintenance/benchmarks/benchmarkParse.php b/maintenance/benchmarks/benchmarkParse.php
new file mode 100644 (file)
index 0000000..cec2beb
--- /dev/null
@@ -0,0 +1,163 @@
+<?php
+/**
+ * Benchmark script for parse operations
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Tim Starling <tstarling@wikimedia.org>
+ * @ingroup Benchmark
+ */
+
+require __DIR__ . '/../Maintenance.php';
+
+/**
+ * Maintenance script to benchmark how long it takes to parse a given title at an optionally
+ * specified timestamp
+ *
+ * @since 1.23
+ */
+class BenchmarkParse extends Maintenance {
+       /** @var string MediaWiki concatenated string timestamp (YYYYMMDDHHMMSS) */
+       private $templateTimestamp = null;
+
+       /** @var array Cache that maps a Title DB key to revision ID for the requested timestamp */
+       private $idCache = array();
+
+       function __construct() {
+               parent::__construct();
+               $this->addDescription( 'Benchmark parse operation' );
+               $this->addArg( 'title', 'The name of the page to parse' );
+               $this->addOption( 'cold', 'Don\'t repeat the parse operation to warm the cache' );
+               $this->addOption( 'page-time',
+                       'Use the version of the page which was current at the given time',
+                       false, true );
+               $this->addOption( 'tpl-time',
+                       'Use templates which were current at the given time (except that moves and ' .
+                               'deletes are not handled properly)',
+                       false, true );
+       }
+
+       function execute() {
+               if ( $this->hasOption( 'tpl-time' ) ) {
+                       $this->templateTimestamp = wfTimestamp( TS_MW, strtotime( $this->getOption( 'tpl-time' ) ) );
+                       Hooks::register( 'BeforeParserFetchTemplateAndtitle', array( $this, 'onFetchTemplate' ) );
+               }
+
+               $title = Title::newFromText( $this->getArg() );
+               if ( !$title ) {
+                       $this->error( "Invalid title" );
+                       exit( 1 );
+               }
+
+               if ( $this->hasOption( 'page-time' ) ) {
+                       $pageTimestamp = wfTimestamp( TS_MW, strtotime( $this->getOption( 'page-time' ) ) );
+                       $id = $this->getRevIdForTime( $title, $pageTimestamp );
+                       if ( !$id ) {
+                               $this->error( "The page did not exist at that time" );
+                               exit( 1 );
+                       }
+
+                       $revision = Revision::newFromId( $id );
+               } else {
+                       $revision = Revision::newFromTitle( $title );
+               }
+
+               if ( !$revision ) {
+                       $this->error( "Unable to load revision, incorrect title?" );
+                       exit( 1 );
+               }
+
+               if ( !$this->hasOption( 'cold' ) ) {
+                       $this->runParser( $revision );
+               }
+
+               $startUsage = getrusage();
+               $startTime = microtime( true );
+               $this->runParser( $revision );
+               $endUsage = getrusage();
+               $endTime = microtime( true );
+
+               printf( "CPU time = %.3f s, wall clock time = %.3f s\n",
+                       // CPU time
+                       $endUsage['ru_utime.tv_sec'] + $endUsage['ru_utime.tv_usec'] * 1e-6
+                               - $startUsage['ru_utime.tv_sec'] - $startUsage['ru_utime.tv_usec'] * 1e-6,
+                       // Wall clock time
+                       $endTime - $startTime );
+       }
+
+       /**
+        * Fetch the ID of the revision of a Title that occurred
+        *
+        * @param Title $title
+        * @param string $timestamp
+        * @return bool|string Revision ID, or false if not found or error
+        */
+       function getRevIdForTime( Title $title, $timestamp ) {
+               $dbr = wfGetDB( DB_SLAVE );
+
+               $id = $dbr->selectField(
+                       array( 'revision', 'page' ),
+                       'rev_id',
+                       array(
+                               'page_namespace' => $title->getNamespace(),
+                               'page_title' => $title->getDBkey(),
+                               'rev_timestamp <= ' . $dbr->addQuotes( $timestamp )
+                       ),
+                       __METHOD__,
+                       array( 'ORDER BY' => 'rev_timestamp DESC', 'LIMIT' => 1 ),
+                       array( 'revision' => array( 'INNER JOIN', 'rev_page=page_id' ) )
+               );
+
+               return $id;
+       }
+
+       /**
+        * Parse the text from a given Revision
+        *
+        * @param Revision $revision
+        */
+       function runParser( Revision $revision ) {
+               $content = $revision->getContent();
+               $content->getParserOutput( $revision->getTitle(), $revision->getId() );
+       }
+
+       /**
+        * Hook into the parser's revision ID fetcher. Make sure that the parser only
+        * uses revisions around the specified timestamp.
+        *
+        * @param Parser $parser
+        * @param Title $title
+        * @param bool &$skip
+        * @param string|bool &$id
+        * @return bool
+        */
+       function onFetchTemplate( Parser $parser, Title $title, &$skip, &$id ) {
+               $pdbk = $title->getPrefixedDBkey();
+               if ( !isset( $this->idCache[$pdbk] ) ) {
+                       $proposedId = $this->getRevIdForTime( $title, $this->templateTimestamp );
+                       $this->idCache[$pdbk] = $proposedId;
+               }
+               if ( $this->idCache[$pdbk] !== false ) {
+                       $id = $this->idCache[$pdbk];
+               }
+
+               return true;
+       }
+}
+
+$maintClass = 'BenchmarkParse';
+require RUN_MAINTENANCE_IF_MAIN;
index dc8626d..297c972 100644 (file)
@@ -153,9 +153,6 @@ class CheckSyntax extends Maintenance {
                if ( file_exists( "$IP/LocalSettings.php" ) ) {
                        $this->mFiles[] = "$IP/LocalSettings.php";
                }
-               if ( file_exists( "$IP/AdminSettings.php" ) ) {
-                       $this->mFiles[] = "$IP/AdminSettings.php";
-               }
 
                $this->output( 'done.', 'listfiles' );
        }
index 4b8c9fe..12b1241 100644 (file)
@@ -39,7 +39,7 @@ class CleanupSpam extends Maintenance {
        }
 
        public function execute() {
-               global $wgLocalDatabases, $wgUser;
+               global $IP, $wgLocalDatabases, $wgUser;
 
                $username = wfMessage( 'spambot_username' )->text();
                $wgUser = User::newFromName( $username );
@@ -67,7 +67,9 @@ class CleanupSpam extends Maintenance {
                                        array( 'el_index' . $dbr->buildLike( $like ) ), __METHOD__ );
                                if ( $count ) {
                                        $found = true;
-                                       passthru( "php cleanupSpam.php --wiki='$wikiID' $spec | sed 's/^/$wikiID:  /'" );
+                                       $cmd = wfShellWikiCmd( "$IP/maintenance/cleanupSpam.php",
+                                               array( '--wiki', $wikiID, $spec ) );
+                                       passthru( "$cmd | sed 's/^/$wikiID:  /'" );
                                }
                        }
                        if ( $found ) {
index 3dcf12c..978d44f 100644 (file)
@@ -90,12 +90,6 @@ if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
        require $maintenance->loadSettings();
 }
 
-if ( $maintenance->getDbType() === Maintenance::DB_ADMIN
-       && is_readable( "$IP/AdminSettings.php" )
-) {
-       require "$IP/AdminSettings.php";
-}
-
 if ( $maintenance->getDbType() === Maintenance::DB_NONE ) {
        if ( $wgLocalisationCacheConf['storeClass'] === false && ( $wgLocalisationCacheConf['store'] == 'db' || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory ) ) ) {
                $wgLocalisationCacheConf['storeClass'] = 'LCStoreNull';
index f56e91f..51f2cac 100644 (file)
@@ -55,7 +55,7 @@ if ( isset( $options['d'] ) ) {
 }
 
 $useReadline = function_exists( 'readline_add_history' )
-                       && Maintenance::posix_isatty( 0 /*STDIN*/ );
+       && Maintenance::posix_isatty( 0 /*STDIN*/ );
 
 if ( $useReadline ) {
        $historyFile = isset( $_ENV['HOME'] ) ?
@@ -63,12 +63,27 @@ if ( $useReadline ) {
        readline_read_history( $historyFile );
 }
 
+$e = null; // PHP exception
 while ( ( $line = Maintenance::readconsole() ) !== false ) {
+       if ( $e && !preg_match( '/^(exit|die);?$/', $line ) ) {
+               // Internal state may be corrupted or fatals may occur later due
+               // to some object not being set. Don't drop out of eval in case
+               // lines were being pasted in (which would then get dumped to the shell).
+               // Instead, just absorb the remaning commands. Let "exit" through per DWIM.
+               echo "Exception was thrown before; please restart eval.php\n";
+               continue;
+       }
        if ( $useReadline ) {
                readline_add_history( $line );
                readline_write_history( $historyFile );
        }
-       $val = eval( $line . ";" );
+       try {
+               $val = eval( $line . ";" );
+       } catch ( Exception $e ) {
+               echo "Caught exception " . get_class( $e ) .
+                       ": {$e->getMessage()}\n" . $e->getTraceAsString() . "\n";
+               continue;
+       }
        if ( wfIsHHVM() || is_null( $val ) ) {
                echo "\n";
        } elseif ( is_string( $val ) || is_numeric( $val ) ) {
index 60bb8d8..52cb209 100644 (file)
@@ -23,8 +23,6 @@
  * @author Antoine Musso <hashar@free.fr>
  */
 
-define( 'MW_SETUP_NO_CACHE', 1 );
-define( 'MW_SETUP_NO_CONTEXT', 1 );
 require_once __DIR__ . '/Maintenance.php';
 
 /**
index bbe1860..aa138bd 100644 (file)
@@ -25,6 +25,7 @@
                                        "mw.inspect",
                                        "mw.inspect.reports",
                                        "mw.notification",
+                                       "mw.Notification_",
                                        "mw.user",
                                        "mw.util",
                                        "mw.plugin.*"
                                "name": "Language",
                                "classes": [
                                        "mw.language*",
-                                       "mw.cldr"
+                                       "mw.cldr",
+                                       "mw.jqueryMsg"
+                               ]
+                       },
+                       {
+                               "name": "Page",
+                               "classes": [
+                                       "mw.page*"
+                               ]
+                       },
+                       {
+                               "name": "Interfaces",
+                               "classes": [
+                                       "mw.Feedback"
                                ]
                        }
                ]
index d0e2628..7326ed2 100644 (file)
@@ -7,24 +7,30 @@
        "--warnings": ["-no_doc"],
        "--builtin-classes": true,
        "--output": "../../docs/js",
+       "--external": "HTMLElement,HTMLDocument,Window",
        "--": [
                "./external.js",
                "../../resources/mediawiki/mediawiki.js",
+               "../../resources/mediawiki/mediawiki.htmlform.js",
+               "../../resources/mediawiki/mediawiki.feedback.js",
                "../../resources/mediawiki/mediawiki.log.js",
                "../../resources/mediawiki/mediawiki.util.js",
                "../../resources/mediawiki/mediawiki.Title.js",
                "../../resources/mediawiki/mediawiki.Uri.js",
                "../../resources/mediawiki/mediawiki.inspect.js",
+               "../../resources/mediawiki/mediawiki.jqueryMsg.js",
                "../../resources/mediawiki/mediawiki.notify.js",
                "../../resources/mediawiki/mediawiki.notification.js",
                "../../resources/mediawiki/mediawiki.user.js",
                "../../resources/mediawiki.action/mediawiki.action.edit.js",
                "../../resources/mediawiki.action/mediawiki.action.view.postEdit.js",
                "../../resources/mediawiki.page/mediawiki.page.startup.js",
+               "../../resources/mediawiki.page/mediawiki.page.watch.ajax.js",
                "../../resources/mediawiki.api",
                "../../resources/mediawiki.language",
                "../../resources/jquery/jquery.localize.js",
                "../../resources/jquery/jquery.spinner.js",
-               "../../resources/oojs"
+               "../../resources/oojs",
+               "../../resources/oojs-ui"
        ]
 }
index 97a00a9..46b0362 100644 (file)
@@ -123,6 +123,7 @@ $wgIgnoredMessages = array(
        'recentchanges-url',
        'recentchangestext',
        'revision-info-current',
+       'createaccount-hook-aborted',
        'revision-nav',
        'rfcurl',
        'shareddescriptionfollows',
@@ -148,7 +149,6 @@ $wgIgnoredMessages = array(
        'booksources-summary',
        'categories-summary',
        'blocklist-summary',
-       'protectedtitles-summary',
        'listusers-summary',
        'longpages-summary',
        'preferences-summary',
@@ -179,7 +179,7 @@ $wgIgnoredMessages = array(
        'userrights-summary',
        'brokenredirects-summary',
        'deadendpages-summary',
-       'protectedpages-summary',
+       'protectedpages-unknown-reason',
        'disambiguations-summary',
        'pageswithprop-summary',
        'doubleredirects-summary',
index 63e2091..73f5ca2 100644 (file)
@@ -196,7 +196,6 @@ $wgMessageStructure = array(
                'vector-action-protect',
                'vector-action-undelete',
                'vector-action-unprotect',
-               'vector-simplesearch-preference',
                'vector-view-create',
                'vector-view-edit',
                'vector-view-history',
@@ -796,6 +795,7 @@ $wgMessageStructure = array(
                'undo-success',
                'undo-failure',
                'undo-norev',
+               'undo-nochange',
                'undo-summary',
                'undo-summary-username-hidden',
        ),
@@ -942,7 +942,8 @@ $wgMessageStructure = array(
                'showhideselectedversions',
                'editundo',
                'diff-empty',
-               'diff-multi',
+               'diff-multi-sameuser',
+               'diff-multi-otherusers',
                'diff-multi-manyusers',
                'difference-missing-revision',
        ),
@@ -989,6 +990,7 @@ $wgMessageStructure = array(
                'searchrelated',
                'searchall',
                'showingresults',
+               'showingresultsinrange',
                'showingresultsnum',
                'showingresultsheader',
                'search-nonefound',
@@ -1813,6 +1815,15 @@ $wgMessageStructure = array(
                'protectedpages-cascade',
                'protectedpages-noredirect',
                'protectedpagesempty',
+               'protectedpages-timestamp',
+               'protectedpages-page',
+               'protectedpages-expiry',
+               'protectedpages-performer',
+               'protectedpages-params',
+               'protectedpages-reason',
+               'protectedpages-unknown-timestamp',
+               'protectedpages-unknown-performer',
+               'protectedpages-unknown-reason',
                'protectedtitles',
                'protectedtitles-summary',
                'protectedtitlesempty',
@@ -2487,6 +2498,7 @@ $wgMessageStructure = array(
                'thumbnail_image-type',
                'thumbnail_gd-library',
                'thumbnail_image-missing',
+               'thumbnail_image-failure-limit'
        ),
        'import' => array(
                'import',
index ac09246..f902e58 100755 (executable)
@@ -30,9 +30,9 @@ def unichr3( *args ):
     return [unichr( int( i[2:7], 16 ) ) for i in args if i[2:7]]
 
 # DEFINE
-UNIHAN_VER = '6.2.0'
+UNIHAN_VER = '6.3.0'
 SF_MIRROR = 'dfn'
-SCIM_TABLES_VER = '0.5.11'
+SCIM_TABLES_VER = '0.5.13'
 SCIM_PINYIN_VER = '0.5.92'
 LIBTABE_VER = '0.2.3'
 # END OF DEFINE
@@ -59,7 +59,11 @@ def uncompress( fp, member, encoding = 'U8' ):
     shutil.move( member, name )
     if '/' in member:
         shutil.rmtree( member.split( '/', 1 )[0] )
-    return open( name, 'rb', encoding, 'ignore' )
+    if pyversion[:1] in ['2']:
+        fc = open( name, 'rb', encoding, 'ignore' )
+    else:
+        fc = open( name, 'r', encoding = encoding, errors = 'ignore' )
+    return fc
 
 unzip = lambda path, member, encoding = 'U8': \
         uncompress( zf.ZipFile( path ), member, encoding )
@@ -136,7 +140,10 @@ def unihanParser( path ):
 
 def applyExcludes( mlist, path ):
     """ Apply exclude rules from path to mlist. """
-    excludes = open( path, 'rb', 'U8' ).read().split()
+    if pyversion[:1] in ['2']:
+        excludes = open( path, 'rb', 'U8' ).read().split()
+    else:
+        excludes = open( path, 'r', encoding = 'U8' ).read().split()
     excludes = [word.split( '#' )[0].strip() for word in excludes]
     excludes = '|'.join( excludes )
     excptn = re.compile( '.*(?:%s).*' % excludes )
@@ -145,7 +152,7 @@ def applyExcludes( mlist, path ):
     return mlist
 
 def charManualTable( path ):
-    fp = open( path, 'rb', 'U8' )
+    fp = open( path, 'r', encoding = 'U8' )
     ret = {}
     for line in fp:
         elems = line.split( '#' )[0].split( '|' )
@@ -156,13 +163,18 @@ def charManualTable( path ):
         
 def toManyRules( src_table ):
     tomany = set()
-    for ( f, t ) in src_table.iteritems():
-        for i in range( 1, len( t ) ):
-            tomany.add( t[i] )
+    if pyversion[:1] in ['2']:
+        for ( f, t ) in src_table.iteritems():
+            for i in range( 1, len( t ) ):
+                tomany.add( t[i] )
+    else:
+        for ( f, t ) in src_table.items():
+            for i in range( 1, len( t ) ):
+                tomany.add( t[i] )
     return tomany
 
 def removeRules( path, table ):
-    fp = open( path, 'rb', 'U8' )
+    fp = open( path, 'r', encoding = 'U8' )
     texc = list()
     for line in fp:
         elems = line.split( '=>' )
@@ -179,13 +191,18 @@ def removeRules( path, table ):
         if t:
             texc.append( t )
     texcptn = re.compile( '^(?:%s)$' % '|'.join( texc ) )
-    for (tmp_f, tmp_t) in table.copy().iteritems():
-        if texcptn.match( tmp_t ):
-            table.pop( tmp_f )
+    if pyversion[:1] in ['2']:
+        for (tmp_f, tmp_t) in table.copy().iteritems():
+            if texcptn.match( tmp_t ):
+                table.pop( tmp_f )
+    else:
+        for (tmp_f, tmp_t) in table.copy().items():
+            if texcptn.match( tmp_t ):
+                table.pop( tmp_f )
     return table
 
 def customRules( path ):
-    fp = open( path, 'rb', 'U8' )
+    fp = open( path, 'r', encoding = 'U8' )
     ret = dict()
     for line in fp:
         elems = line.split( '#' )[0].split()
@@ -210,7 +227,7 @@ def translate( text, conv_table ):
     return text
 
 def manualWordsTable( path, conv_table, reconv_table ):
-    fp = open( path, 'rb', 'U8' )
+    fp = open( path, 'r', encoding = 'U8' )
     reconv_table = {}
     wordlist = [line.split( '#' )[0].strip() for line in fp]
     wordlist = list( set( wordlist ) )
@@ -285,8 +302,12 @@ def main():
     t2s_1tomany.update( charManualTable( 'trad2simp.manual' ) )
     s2t_1tomany.update( charManualTable( 'simp2trad.manual' ) )
     
-    t2s_1to1 = dict( [( f, t[0] ) for ( f, t ) in t2s_1tomany.iteritems()] )
-    s2t_1to1 = dict( [( f, t[0] ) for ( f, t ) in s2t_1tomany.iteritems()] )
+    if pyversion[:1] in ['2']:
+      t2s_1to1 = dict( [( f, t[0] ) for ( f, t ) in t2s_1tomany.iteritems()] )
+      s2t_1to1 = dict( [( f, t[0] ) for ( f, t ) in s2t_1tomany.iteritems()] )
+    else:
+      t2s_1to1 = dict( [( f, t[0] ) for ( f, t ) in t2s_1tomany.items()] )
+      s2t_1to1 = dict( [( f, t[0] ) for ( f, t ) in s2t_1tomany.items()] )
     
     s_tomany = toManyRules( t2s_1tomany )
     t_tomany = toManyRules( s2t_1tomany )
@@ -333,10 +354,16 @@ def main():
     
     # Final tables
     # sorted list toHans
-    t2s_1to1 = dict( [( f, t ) for ( f, t ) in t2s_1to1.iteritems() if f != t] )
+    if pyversion[:1] in ['2']:
+        t2s_1to1 = dict( [( f, t ) for ( f, t ) in t2s_1to1.iteritems() if f != t] )
+    else:
+        t2s_1to1 = dict( [( f, t ) for ( f, t ) in t2s_1to1.items() if f != t] )
     toHans = dictToSortedList( t2s_1to1, 0 ) + dictToSortedList( t2s_word2word, 1 )
     # sorted list toHant
-    s2t_1to1 = dict( [( f, t ) for ( f, t ) in s2t_1to1.iteritems() if f != t] )
+    if pyversion[:1] in ['2']:
+        s2t_1to1 = dict( [( f, t ) for ( f, t ) in s2t_1to1.iteritems() if f != t] )
+    else:
+        s2t_1to1 = dict( [( f, t ) for ( f, t ) in s2t_1to1.items() if f != t] )
     toHant = dictToSortedList( s2t_1to1, 0 ) + dictToSortedList( s2t_word2word, 1 )
     # sorted list toCN
     toCN = dictToSortedList( customRules( 'toCN.manual' ), 1 )
@@ -372,7 +399,10 @@ $zh2Hant = array(\n'''
         +  PHPArray( toSG ) \
         +  '\n);\n'
     
-    f = open( os.path.join( '..', '..', '..', 'includes', 'ZhConversion.php' ), 'wb', encoding = 'utf8' )
+    if pyversion[:1] in ['2']:
+        f = open( os.path.join( '..', '..', '..', 'includes', 'ZhConversion.php' ), 'wb', encoding = 'utf8' )
+    else:
+        f = open( os.path.join( '..', '..', '..', 'includes', 'ZhConversion.php' ), 'w', buffering = 4096, encoding = 'utf8' )
     print ('Writing ZhConversion.php ... ')
     f.write( php )
     f.close()
index 71fdd61..dc560e3 100644 (file)
 -- tables.
 
 -- LINE:53
-CREATE TABLE /*$wgDBprefix*/user (
+CREATE TABLE /*_*/mwuser (
    user_id           INT           NOT NULL  PRIMARY KEY IDENTITY(0,1),
    user_name         NVARCHAR(255)  NOT NULL UNIQUE DEFAULT '',
    user_real_name    NVARCHAR(255)  NOT NULL DEFAULT '',
    user_password     NVARCHAR(255)  NOT NULL DEFAULT '',
    user_newpassword  NVARCHAR(255)  NOT NULL DEFAULT '',
-   user_newpass_time DATETIME NULL,
+   user_newpass_time varchar(14) NULL DEFAULT NULL,
    user_email        NVARCHAR(255)  NOT NULL DEFAULT '',
    user_options      NVARCHAR(MAX) NOT NULL DEFAULT '',
-   user_touched      DATETIME      NOT NULL DEFAULT GETDATE(),
+   user_touched      varchar(14)      NOT NULL DEFAULT '',
    user_token        NCHAR(32)      NOT NULL DEFAULT '',
-   user_email_authenticated DATETIME DEFAULT NULL,
+   user_email_authenticated varchar(14) DEFAULT NULL,
    user_email_token  NCHAR(32) DEFAULT '',
-   user_email_token_expires DATETIME DEFAULT NULL,
-   user_registration DATETIME DEFAULT NULL,
-   user_editcount    INT NULL
+   user_email_token_expires varchar(14) DEFAULT NULL,
+   user_registration varchar(14) DEFAULT NULL,
+   user_editcount    INT NULL DEFAULT NULL
 );
-CREATE        INDEX /*$wgDBprefix*/user_email_token ON /*$wgDBprefix*/[user](user_email_token);
-CREATE UNIQUE INDEX /*$wgDBprefix*/[user_name]        ON /*$wgDBprefix*/[user]([user_name]);
-;
+CREATE UNIQUE INDEX /*i*/user_name ON /*_*/mwuser (user_name);
+CREATE INDEX /*i*/user_email_token ON /*_*/mwuser (user_email_token);
+CREATE INDEX /*i*/user_email ON /*_*/mwuser (user_email);
+
+-- Insert a dummy user to represent anons
+INSERT INTO /*_*/mwuser (user_name) VALUES ('##Anonymous##');
 
 --
 -- User permissions have been broken out to a separate table;
@@ -57,86 +60,106 @@ CREATE UNIQUE INDEX /*$wgDBprefix*/[user_name]        ON /*$wgDBprefix*/[user]([
 -- permissions assigned to a user in each project.
 --
 -- This table replaces the old user_rights field which used a
--- comma-separated blob.
-CREATE TABLE /*$wgDBprefix*/user_groups (
-   ug_user  INT     NOT NULL REFERENCES /*$wgDBprefix*/[user](user_id) ON DELETE CASCADE,
-   ug_group NVARCHAR(16) NOT NULL DEFAULT '',
+-- comma-separated nvarchar(max).
+CREATE TABLE /*_*/user_groups (
+   ug_user  INT     NOT NULL REFERENCES /*_*/mwuser(user_id) ON DELETE CASCADE,
+   ug_group NVARCHAR(255) NOT NULL DEFAULT '',
+);
+CREATE UNIQUE clustered INDEX /*i*/ug_user_group ON /*_*/user_groups (ug_user, ug_group);
+CREATE INDEX /*i*/ug_group ON /*_*/user_groups(ug_group);
+
+-- Stores the groups the user has once belonged to.
+-- The user may still belong to these groups (check user_groups).
+-- Users are not autopromoted to groups from which they were removed.
+CREATE TABLE /*_*/user_former_groups (
+  ufg_user INT NOT NULL REFERENCES /*_*/mwuser(user_id) ON DELETE CASCADE,
+  ufg_group nvarchar(255) NOT NULL default ''
 );
-CREATE UNIQUE clustered INDEX /*$wgDBprefix*/user_groups_unique ON /*$wgDBprefix*/user_groups(ug_user, ug_group);
-CREATE INDEX /*$wgDBprefix*/user_group ON /*$wgDBprefix*/user_groups(ug_group);
+CREATE UNIQUE INDEX /*i*/ufg_user_group ON /*_*/user_former_groups (ufg_user,ufg_group);
 
 -- Stores notifications of user talk page changes, for the display
 -- of the "you have new messages" box
--- Changed user_id column to mwuser_id to avoid clashing with user_id function
-CREATE TABLE /*$wgDBprefix*/user_newtalk (
-   user_id INT         NOT NULL DEFAULT 0 REFERENCES /*$wgDBprefix*/[user](user_id) ON DELETE CASCADE,
+-- Changed user_id column to user_id to avoid clashing with user_id function
+CREATE TABLE /*_*/user_newtalk (
+   user_id INT         NOT NULL REFERENCES /*_*/mwuser(user_id) ON DELETE CASCADE,
    user_ip NVARCHAR(40) NOT NULL DEFAULT '',
-   user_last_timestamp DATETIME NOT NULL DEFAULT '',
+   user_last_timestamp varchar(14) DEFAULT NULL,
 );
-CREATE INDEX /*$wgDBprefix*/user_group_id ON /*$wgDBprefix*/user_newtalk([user_id]);
-CREATE INDEX /*$wgDBprefix*/user_ip       ON /*$wgDBprefix*/user_newtalk(user_ip);
+CREATE INDEX /*i*/un_user_id ON /*_*/user_newtalk (user_id);
+CREATE INDEX /*i*/un_user_ip ON /*_*/user_newtalk (user_ip);
 
 --
 -- User preferences and other fun stuff
--- replaces old user.user_options BLOB
+-- replaces old user.user_options nvarchar(max)
 --
-CREATE TABLE /*$wgDBprefix*/user_properties (
-       up_user INT NOT NULL,
-       up_property NVARCHAR(32) NOT NULL,
+CREATE TABLE /*_*/user_properties (
+       up_user INT NOT NULL REFERENCES /*_*/mwuser(user_id) ON DELETE CASCADE,
+       up_property NVARCHAR(255) NOT NULL,
        up_value NVARCHAR(MAX),
 );
-CREATE UNIQUE clustered INDEX /*$wgDBprefix*/user_props_user_prop ON /*$wgDBprefix*/user_properties(up_user, up_property);
-CREATE INDEX /*$wgDBprefix*/user_props_prop ON /*$wgDBprefix*/user_properties(up_property);
+CREATE UNIQUE CLUSTERED INDEX /*i*/user_properties_user_property ON /*_*/user_properties (up_user,up_property);
+CREATE INDEX /*i*/user_properties_property ON /*_*/user_properties (up_property);
 
 
 --
 -- Core of the wiki: each page has an entry here which identifies
 -- it by title and contains some essential metadata.
 --
-CREATE TABLE /*$wgDBprefix*/page (
-   page_id        INT          NOT NULL  PRIMARY KEY clustered IDENTITY,
+CREATE TABLE /*_*/page (
+   page_id        INT          NOT NULL  PRIMARY KEY IDENTITY(0,1),
    page_namespace INT          NOT NULL,
    page_title     NVARCHAR(255)  NOT NULL,
-   page_restrictions NVARCHAR(255) NULL,
+   page_restrictions NVARCHAR(255) NOT NULL,
    page_counter BIGINT            NOT NULL DEFAULT 0,
    page_is_redirect BIT           NOT NULL DEFAULT 0,
    page_is_new BIT                NOT NULL DEFAULT 0,
-   page_random NUMERIC(15,14)     NOT NULL DEFAULT RAND(),
-   page_touched DATETIME NOT NULL DEFAULT GETDATE(),
-   page_latest INT NOT NULL,
+   page_random real     NOT NULL DEFAULT RAND(),
+   page_touched varchar(14) NOT NULL default '',
+   page_links_updated varchar(14) DEFAULT NULL,
+   page_latest INT, -- FK inserted later
    page_len INT NOT NULL,
+   page_content_model nvarchar(32) default null
 );
-CREATE UNIQUE INDEX /*$wgDBprefix*/page_unique_name ON /*$wgDBprefix*/page(page_namespace, page_title);
-CREATE        INDEX /*$wgDBprefix*/page_random_idx  ON /*$wgDBprefix*/page(page_random);
-CREATE        INDEX /*$wgDBprefix*/page_len_idx     ON /*$wgDBprefix*/page(page_len);
-;
+CREATE UNIQUE INDEX /*i*/name_title ON /*_*/page (page_namespace,page_title);
+CREATE INDEX /*i*/page_random ON /*_*/page (page_random);
+CREATE INDEX /*i*/page_len ON /*_*/page (page_len);
+CREATE INDEX /*i*/page_redirect_namespace_len ON /*_*/page (page_is_redirect, page_namespace, page_len);
+
+-- insert a dummy page
+INSERT INTO /*_*/page (page_namespace, page_title, page_restrictions, page_latest, page_len) VALUES (-1,'','',0,0);
 
 --
 -- Every edit of a page creates also a revision row.
 -- This stores metadata about the revision, and a reference
 -- to the TEXT storage backend.
 --
-CREATE TABLE /*$wgDBprefix*/revision (
-   rev_id INT NOT NULL UNIQUE IDENTITY,
-   rev_page INT NOT NULL,
-   rev_text_id INT  NOT NULL,
-   rev_comment NVARCHAR(max) NOT NULL,
-   rev_user INT  NOT NULL DEFAULT 0 /*REFERENCES [user](user_id)*/,
+CREATE TABLE /*_*/revision (
+   rev_id INT NOT NULL UNIQUE IDENTITY(0,1),
+   rev_page INT NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
+   rev_text_id INT  NOT NULL, -- FK added later
+   rev_comment NVARCHAR(255) NOT NULL,
+   rev_user INT REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
    rev_user_text NVARCHAR(255) NOT NULL DEFAULT '',
-   rev_timestamp DATETIME NOT NULL DEFAULT GETDATE(),
+   rev_timestamp varchar(14) NOT NULL default '',
    rev_minor_edit BIT NOT NULL DEFAULT 0,
-   rev_deleted BIT  NOT NULL DEFAULT 0,
+   rev_deleted TINYINT  NOT NULL DEFAULT 0,
    rev_len INT,
-   rev_parent_id INT DEFAULT NULL,
-
+   rev_parent_id INT DEFAULT NULL REFERENCES /*_*/revision(rev_id),
+   rev_sha1 nvarchar(32) not null default '',
+   rev_content_model nvarchar(32) default null,
+   rev_content_format nvarchar(64) default null
 );
-CREATE UNIQUE clustered INDEX /*$wgDBprefix*/revision_unique ON /*$wgDBprefix*/revision(rev_page, rev_id);
-CREATE UNIQUE INDEX /*$wgDBprefix*/rev_id             ON /*$wgDBprefix*/revision(rev_id);
-CREATE        INDEX /*$wgDBprefix*/rev_timestamp      ON /*$wgDBprefix*/revision(rev_timestamp);
-CREATE        INDEX /*$wgDBprefix*/page_timestamp     ON /*$wgDBprefix*/revision(rev_page, rev_timestamp);
-CREATE        INDEX /*$wgDBprefix*/user_timestamp     ON /*$wgDBprefix*/revision(rev_user, rev_timestamp);
-CREATE        INDEX /*$wgDBprefix*/usertext_timestamp ON /*$wgDBprefix*/revision(rev_user_text, rev_timestamp);
-;
+CREATE UNIQUE CLUSTERED INDEX /*i*/rev_page_id ON /*_*/revision (rev_page, rev_id);
+CREATE INDEX /*i*/rev_timestamp ON /*_*/revision (rev_timestamp);
+CREATE INDEX /*i*/page_timestamp ON /*_*/revision (rev_page,rev_timestamp);
+CREATE INDEX /*i*/user_timestamp ON /*_*/revision (rev_user,rev_timestamp);
+CREATE INDEX /*i*/usertext_timestamp ON /*_*/revision (rev_user_text,rev_timestamp);
+CREATE INDEX /*i*/page_user_timestamp ON /*_*/revision (rev_page,rev_user,rev_timestamp);
+
+-- insert a dummy revision
+INSERT INTO /*_*/revision (rev_page,rev_text_id,rev_comment,rev_user,rev_len) VALUES (0,0,'',0,0);
+
+ALTER TABLE /*_*/page ADD CONSTRAINT FK_page_latest_page_id FOREIGN KEY (page_latest) REFERENCES /*_*/revision(rev_id);
 
 --
 -- Holds TEXT of individual page revisions.
@@ -145,12 +168,17 @@ CREATE        INDEX /*$wgDBprefix*/usertext_timestamp ON /*$wgDBprefix*/revision
 -- MediaWiki 1.4 and earlier: an upgrade will transform that
 -- table INTo the 'text' table to minimize unnecessary churning
 -- and downtime. If upgrading, the other fields will be left unused.
-CREATE TABLE /*$wgDBprefix*/text (
-   old_id INT NOT NULL  PRIMARY KEY clustered IDENTITY,
-   old_text TEXT NOT NULL,
+CREATE TABLE /*_*/text (
+   old_id INT NOT NULL  PRIMARY KEY IDENTITY(0,1),
+   old_text nvarchar(max) NOT NULL,
    old_flags NVARCHAR(255) NOT NULL,
 );
 
+-- insert a dummy text
+INSERT INTO /*_*/text (old_text,old_flags) VALUES ('','');
+
+ALTER TABLE /*_*/revision ADD CONSTRAINT FK_rev_text_id_old_id FOREIGN KEY (rev_text_id) REFERENCES /*_*/text(old_id) ON DELETE CASCADE;
+
 --
 -- Holding area for deleted articles, which may be viewed
 -- or restored by admins through the Special:Undelete interface.
@@ -158,577 +186,1142 @@ CREATE TABLE /*$wgDBprefix*/text (
 -- fields, with several caveats.
 -- Cannot reasonably create views on this table, due to the presence of TEXT
 -- columns.
-CREATE TABLE /*$wgDBprefix*/archive (
-   ar_id NOT NULL PRIMARY KEY clustered IDENTITY,
+CREATE TABLE /*_*/archive (
+   ar_id int NOT NULL PRIMARY KEY IDENTITY,
    ar_namespace SMALLINT NOT NULL DEFAULT 0,
    ar_title NVARCHAR(255) NOT NULL DEFAULT '',
    ar_text NVARCHAR(MAX) NOT NULL,
    ar_comment NVARCHAR(255) NOT NULL,
-   ar_user INT NULL REFERENCES /*$wgDBprefix*/[user](user_id) ON DELETE SET NULL,
+   ar_user INT REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
    ar_user_text NVARCHAR(255) NOT NULL,
-   ar_timestamp DATETIME NOT NULL DEFAULT GETDATE(),
+   ar_timestamp varchar(14) NOT NULL default '',
    ar_minor_edit BIT NOT NULL DEFAULT 0,
    ar_flags NVARCHAR(255) NOT NULL,
-   ar_rev_id INT,
-   ar_text_id INT,
-   ar_deleted BIT NOT NULL DEFAULT 0,
-   ar_len INT DEFAULT NULL,
-   ar_page_id INT NULL,
-   ar_parent_id INT NULL,
+   ar_rev_id INT NULL, -- NOT a FK, the row gets deleted from revision and moved here
+   ar_text_id INT REFERENCES /*_*/text(old_id) ON DELETE CASCADE,
+   ar_deleted TINYINT NOT NULL DEFAULT 0,
+   ar_len INT,
+   ar_page_id INT NULL, -- NOT a FK, the row gets deleted from page and moved here
+   ar_parent_id INT NULL REFERENCES /*_*/revision(rev_id),
+   ar_sha1 nvarchar(32) default null,
+   ar_content_model nvarchar(32) DEFAULT NULL,
+  ar_content_format nvarchar(64) DEFAULT NULL
 );
-CREATE INDEX /*$wgDBprefix*/ar_name_title_timestamp ON /*$wgDBprefix*/archive(ar_namespace,ar_title,ar_timestamp);
-CREATE INDEX /*$wgDBprefix*/ar_usertext_timestamp ON /*$wgDBprefix*/archive(ar_user_text,ar_timestamp);
-CREATE INDEX /*$wgDBprefix*/ar_user_text    ON /*$wgDBprefix*/archive(ar_user_text);
+CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
+CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp);
+CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id);
 
 
 --
 -- Track page-to-page hyperlinks within the wiki.
 --
-CREATE TABLE /*$wgDBprefix*/pagelinks (
-   pl_from INT NOT NULL DEFAULT 0 REFERENCES /*$wgDBprefix*/page(page_id) ON DELETE CASCADE,
-   pl_namespace SMALLINT NOT NULL DEFAULT 0,
+CREATE TABLE /*_*/pagelinks (
+   pl_from INT NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
+   pl_namespace INT NOT NULL DEFAULT 0,
    pl_title NVARCHAR(255) NOT NULL DEFAULT '',
 );
-CREATE UNIQUE INDEX /*$wgDBprefix*/pl_from ON /*$wgDBprefix*/pagelinks(pl_from,pl_namespace,pl_title);
-CREATE UNIQUE INDEX /*$wgDBprefix*/pl_namespace ON /*$wgDBprefix*/pagelinks(pl_namespace,pl_title,pl_from);
+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);
+
 
 --
 -- Track template inclusions.
 --
-CREATE TABLE /*$wgDBprefix*/templatelinks (
-   tl_from INT NOT NULL DEFAULT 0 REFERENCES /*$wgDBprefix*/page(page_id) ON DELETE CASCADE,
-   tl_namespace SMALLINT NOT NULL DEFAULT 0,
-   tl_title NVARCHAR(255) NOT NULL DEFAULT '',
+CREATE TABLE /*_*/templatelinks (
+  tl_from int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
+  tl_namespace int NOT NULL default 0,
+  tl_title nvarchar(255) NOT NULL default ''
 );
-CREATE UNIQUE INDEX /*$wgDBprefix*/tl_from ON /*$wgDBprefix*/templatelinks(tl_from,tl_namespace,tl_title);
-CREATE UNIQUE INDEX /*$wgDBprefix*/tl_namespace ON /*$wgDBprefix*/templatelinks(tl_namespace,tl_title,tl_from);
+
+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);
+
 
 --
 -- Track links to images *used inline*
 -- We don't distinguish live from broken links here, so
--- they do not need to be changed ON upload/removal.
+-- they do not need to be changed on upload/removal.
 --
-CREATE TABLE /*$wgDBprefix*/imagelinks (
-   il_from INT NOT NULL DEFAULT 0 REFERENCES /*$wgDBprefix*/page(page_id) ON DELETE CASCADE,
-   il_to NVARCHAR(255)  NOT NULL DEFAULT '',
-   CONSTRAINT /*$wgDBprefix*/il_from PRIMARY KEY(il_from,il_to),
+CREATE TABLE /*_*/imagelinks (
+  -- Key to page_id of the page containing the image / media link.
+  il_from int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
+
+  -- Filename of target image.
+  -- This is also the page_title of the file's description page;
+  -- all such pages are in namespace 6 (NS_FILE).
+  il_to nvarchar(255) NOT NULL default ''
 );
-CREATE UNIQUE INDEX /*$wgDBprefix*/il_from_to ON /*$wgDBprefix*/imagelinks(il_from,il_to);
-CREATE UNIQUE INDEX /*$wgDBprefix*/il_to_from ON /*$wgDBprefix*/imagelinks(il_to,il_from);
+
+CREATE UNIQUE INDEX /*i*/il_from ON /*_*/imagelinks (il_from,il_to);
+CREATE UNIQUE INDEX /*i*/il_to ON /*_*/imagelinks (il_to,il_from);
 
 --
 -- Track category inclusions *used inline*
 -- This tracks a single level of category membership
--- (folksonomic tagging, really).
 --
-CREATE TABLE /*$wgDBprefix*/categorylinks (
-   cl_from INT NOT NULL DEFAULT 0,
-   cl_to NVARCHAR(255)  NOT NULL DEFAULT '',
-   cl_sortkey NVARCHAR(150)  NOT NULL DEFAULT '',
-   cl_timestamp DATETIME NOT NULL DEFAULT GETDATE(),
-   CONSTRAINT /*$wgDBprefix*/cl_from PRIMARY KEY(cl_from, cl_to),
+CREATE TABLE /*_*/categorylinks (
+  -- Key to page_id of the page defined as a category member.
+  cl_from int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
+
+  -- Name of the category.
+  -- This is also the page_title of the category's description page;
+  -- all such pages are in namespace 14 (NS_CATEGORY).
+  cl_to nvarchar(255) NOT NULL default '',
+
+  -- A binary string obtained by applying a sortkey generation algorithm
+  -- (Collation::getSortKey()) to page_title, or cl_sortkey_prefix . "\n"
+  -- . page_title if cl_sortkey_prefix is nonempty.
+  cl_sortkey varbinary(230) NOT NULL default 0x,
+
+  -- A prefix for the raw sortkey manually specified by the user, either via
+  -- [[Category:Foo|prefix]] or {{defaultsort:prefix}}.  If nonempty, it's
+  -- concatenated with a line break followed by the page title before the sortkey
+  -- conversion algorithm is run.  We store this so that we can update
+  -- collations without reparsing all pages.
+  -- Note: If you change the length of this field, you also need to change
+  -- code in LinksUpdate.php. See bug 25254.
+  cl_sortkey_prefix varbinary(255) NOT NULL default 0x,
+
+  -- This isn't really used at present. Provided for an optional
+  -- sorting method by approximate addition time.
+  cl_timestamp varchar(14) NOT NULL,
+
+  -- Stores $wgCategoryCollation at the time cl_sortkey was generated.  This
+  -- can be used to install new collation versions, tracking which rows are not
+  -- yet updated.  '' means no collation, this is a legacy row that needs to be
+  -- updated by updateCollation.php.  In the future, it might be possible to
+  -- specify different collations per category.
+  cl_collation nvarchar(32) NOT NULL default '',
+
+  -- Stores whether cl_from is a category, file, or other page, so we can
+  -- paginate the three categories separately.  This never has to be updated
+  -- after the page is created, since none of these page types can be moved to
+  -- any other.
+  -- SQL server doesn't have enums, so we approximate with this
+  cl_type varchar(10) NOT NULL default 'page' CHECK (cl_type IN('page', 'subcat', 'file'))
 );
-CREATE UNIQUE INDEX /*$wgDBprefix*/cl_from_to   ON /*$wgDBprefix*/categorylinks(cl_from,cl_to);
--- We always sort within a given category...
-CREATE INDEX /*$wgDBprefix*/cl_sortkey   ON /*$wgDBprefix*/categorylinks(cl_to,cl_sortkey);
--- Not really used?
-CREATE INDEX /*$wgDBprefix*/cl_timestamp ON /*$wgDBprefix*/categorylinks(cl_to,cl_timestamp);
---;
+
+CREATE UNIQUE INDEX /*i*/cl_from ON /*_*/categorylinks (cl_from,cl_to);
+
+-- We always sort within a given category, and within a given type.  FIXME:
+-- Formerly this index didn't cover cl_type (since that didn't exist), so old
+-- callers won't be using an index: fix this?
+CREATE INDEX /*i*/cl_sortkey ON /*_*/categorylinks (cl_to,cl_type,cl_sortkey,cl_from);
+
+-- Used by the API (and some extensions)
+CREATE INDEX /*i*/cl_timestamp ON /*_*/categorylinks (cl_to,cl_timestamp);
+
+-- FIXME: Not used, delete this
+CREATE INDEX /*i*/cl_collation ON /*_*/categorylinks (cl_collation);
 
 --
 -- Track all existing categories.  Something is a category if 1) it has an en-
 -- try somewhere in categorylinks, or 2) it once did.  Categories might not
 -- have corresponding pages, so they need to be tracked separately.
 --
-CREATE TABLE /*$wgDBprefix*/category (
-  cat_id int NOT NULL IDENTITY(1,1),
-  cat_title nvarchar(255)  NOT NULL,
+CREATE TABLE /*_*/category (
+  -- Primary key
+  cat_id int NOT NULL PRIMARY KEY IDENTITY,
+
+  -- Name of the category, in the same form as page_title (with underscores).
+  -- If there is a category page corresponding to this category, by definition,
+  -- it has this name (in the Category namespace).
+  cat_title nvarchar(255) NOT NULL,
+
+  -- The numbers of member pages (including categories and media), subcatego-
+  -- ries, and Image: namespace members, respectively.  These are signed to
+  -- make underflow more obvious.  We make the first number include the second
+  -- two for better sorting: subtracting for display is easy, adding for order-
+  -- ing is not.
   cat_pages int NOT NULL default 0,
   cat_subcats int NOT NULL default 0,
-  cat_files int NOT NULL default 0,
-  cat_hidden tinyint NOT NULL default 0,
+  cat_files int NOT NULL default 0
 );
 
-CREATE UNIQUE INDEX /*$wgDBprefix*/cat_title   ON /*$wgDBprefix*/category(cat_title);
--- For Special:Mostlinkedcategories
-CREATE INDEX /*$wgDBprefix*/cat_pages   ON /*$wgDBprefix*/category(cat_pages);
+CREATE UNIQUE INDEX /*i*/cat_title ON /*_*/category (cat_title);
 
+-- For Special:Mostlinkedcategories
+CREATE INDEX /*i*/cat_pages ON /*_*/category (cat_pages);
 
-CREATE TABLE /*$wgDBprefix*/change_tag (
-  ct_rc_id   int  NOT NULL default 0,
-  ct_log_id  int  NOT NULL default 0,
-  ct_rev_id  int  NOT NULL default 0,
-  ct_tag     varchar(255)  NOT NULL,
-  ct_params  varchar(255)  NOT NULL,
-);
-CREATE UNIQUE INDEX /*$wgDBprefix*/change_tag_rc_tag ON /*$wgDBprefix*/change_tag(ct_rc_id,ct_tag);
-CREATE UNIQUE INDEX /*$wgDBprefix*/change_tag_log_tag ON /*$wgDBprefix*/change_tag(ct_log_id,ct_tag);
-CREATE UNIQUE INDEX /*$wgDBprefix*/change_tag_rev_tag ON /*$wgDBprefix*/change_tag(ct_rev_id,ct_tag);
-CREATE INDEX /*$wgDBprefix*/change_tag_tag_id ON /*$wgDBprefix*/change_tag(ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
 
-CREATE TABLE /*$wgDBprefix*/tag_summary (
-  ts_rc_id   INT NOT NULL default 0,
-  ts_log_id  INT NOT NULL default 0,
-  ts_rev_id  INT NOT NULL default 0,
-  ts_tags    varchar(255)  NOT NULL
+--
+-- Track links to external URLs
+--
+CREATE TABLE /*_*/externallinks (
+  -- Primary key
+  el_id int NOT NULL PRIMARY KEY IDENTITY,
+
+  -- page_id of the referring page
+  el_from int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
+
+  -- The URL
+  el_to nvarchar(max) NOT NULL,
+
+  -- In the case of HTTP URLs, this is the URL with any username or password
+  -- removed, and with the labels in the hostname reversed and converted to
+  -- lower case. An extra dot is added to allow for matching of either
+  -- example.com or *.example.com in a single scan.
+  -- Example:
+  --      http://user:password@sub.example.com/page.html
+  --   becomes
+  --      http://com.example.sub./page.html
+  -- which allows for fast searching for all pages under example.com with the
+  -- clause:
+  --      WHERE el_index LIKE 'http://com.example.%'
+  el_index nvarchar(450) NOT NULL
 );
-CREATE UNIQUE INDEX /*$wgDBprefix*/tag_summary_rc_id ON /*$wgDBprefix*/tag_summary(ts_rc_id);
-CREATE UNIQUE INDEX /*$wgDBprefix*/tag_summary_log_id ON /*$wgDBprefix*/tag_summary(ts_log_id);
-CREATE UNIQUE INDEX /*$wgDBprefix*/tag_summary_rev_id ON /*$wgDBprefix*/tag_summary(ts_rev_id);
 
-CREATE TABLE /*$wgDBprefix*/valid_tag (
-  vt_tag varchar(255) NOT NULL PRIMARY KEY
-);
+CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from);
+CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index);
 
 --
--- Table for storing localisation data
+-- Track interlanguage links
 --
-CREATE TABLE /*$wgDBprefix*/l10n_cache (
-       -- language code
-       lc_lang NVARCHAR(32) NOT NULL,
+CREATE TABLE /*_*/langlinks (
+  -- page_id of the referring page
+  ll_from int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
 
-       -- cache key
-       lc_key NVARCHAR(255) NOT NULL,
+  -- Language code of the target
+  ll_lang nvarchar(20) NOT NULL default '',
 
-       -- Value
-       lc_value TEXT NOT NULL DEFAULT '',
+  -- Title of the target, including namespace
+  ll_title nvarchar(255) NOT NULL default ''
 );
-CREATE INDEX /*$wgDBprefix*/lc_lang_key ON /*$wgDBprefix*/l10n_cache (lc_lang, lc_key);
 
---
--- Track links to external URLs
--- IE >= 4 supports no more than 2083 characters in a URL
-CREATE TABLE /*$wgDBprefix*/externallinks (
-   el_id INT NOT NULL PRIMARY KEY clustered IDENTITY,
-   el_from INT NOT NULL DEFAULT '0',
-   el_to VARCHAR(2083) NOT NULL,
-   el_index VARCHAR(896) NOT NULL,
-);
--- Maximum key length ON SQL Server is 900 bytes
-CREATE INDEX /*$wgDBprefix*/externallinks_index   ON /*$wgDBprefix*/externallinks(el_index);
+CREATE UNIQUE INDEX /*i*/ll_from ON /*_*/langlinks (ll_from, ll_lang);
+CREATE INDEX /*i*/ll_lang ON /*_*/langlinks (ll_lang, ll_title);
 
---
--- Track INTerlanguage links
---
-CREATE TABLE /*$wgDBprefix*/langlinks (
-   ll_from  INT          NOT NULL DEFAULT 0,
-   ll_lang  NVARCHAR(20)  NOT NULL DEFAULT '',
-   ll_title NVARCHAR(255)  NOT NULL DEFAULT '',
-   CONSTRAINT /*$wgDBprefix*/langlinks_pk PRIMARY KEY(ll_from, ll_lang),
-);
-CREATE UNIQUE INDEX /*$wgDBprefix*/langlinks_reverse_key ON /*$wgDBprefix*/langlinks(ll_lang,ll_title);
 
 --
 -- Track inline interwiki links
 --
-CREATE TABLE /*$wgDBprefix*/iwlinks (
-       -- page_id of the referring page
-       iwl_from INT NOT NULL DEFAULT 0,
+CREATE TABLE /*_*/iwlinks (
+  -- page_id of the referring page
+  iwl_from int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
 
-       -- Interwiki prefix code of the target
-       iwl_prefix NVARCHAR(20) NOT NULL DEFAULT '',
+  -- Interwiki prefix code of the target
+  iwl_prefix nvarchar(20) NOT NULL default '',
 
-       -- Title of the target, including namespace
-       iwl_title NVARCHAR(255) NOT NULL DEFAULT '',
+  -- Title of the target, including namespace
+  iwl_title nvarchar(255) NOT NULL default ''
 );
 
-CREATE UNIQUE INDEX /*$wgDBprefix*/iwl_from ON /*$wgDBprefix*/iwlinks(iwl_from,iwl_prefix,iwl_title);
-CREATE UNIQUE INDEX /*$wgDBprefix*/iwl_prefix ON /*$wgDBprefix*/iwlinks(iwl_prefix,iwl_title);
+CREATE UNIQUE INDEX /*i*/iwl_from ON /*_*/iwlinks (iwl_from, iwl_prefix, iwl_title);
+CREATE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
+CREATE INDEX /*i*/iwl_prefix_from_title ON /*_*/iwlinks (iwl_prefix, iwl_from, iwl_title);
 
 
 --
 -- Contains a single row with some aggregate info
--- ON the state of the site.
+-- on the state of the site.
 --
-CREATE TABLE /*$wgDBprefix*/site_stats (
-   ss_row_id        INT  NOT NULL DEFAULT 1 PRIMARY KEY,
-   ss_total_views   BIGINT DEFAULT 0,
-   ss_total_edits   BIGINT DEFAULT 0,
-   ss_good_articles BIGINT DEFAULT 0,
-   ss_total_pages   BIGINT DEFAULT -1,
-   ss_users         BIGINT DEFAULT -1,
-   ss_active_users  BIGINT DEFAULT -1,
-   ss_admins        INT    DEFAULT -1,
-   ss_images INT DEFAULT 0,
+CREATE TABLE /*_*/site_stats (
+  -- The single row should contain 1 here.
+  ss_row_id int NOT NULL,
+
+  -- Total number of page views, if hit counters are enabled.
+  ss_total_views bigint default 0,
+
+  -- Total number of edits performed.
+  ss_total_edits bigint default 0,
+
+  -- An approximate count of pages matching the following criteria:
+  -- * in namespace 0
+  -- * not a redirect
+  -- * contains the text '[['
+  -- See Article::isCountable() in includes/Article.php
+  ss_good_articles bigint default 0,
+
+  -- Total pages, theoretically equal to SELECT COUNT(*) FROM page; except faster
+  ss_total_pages bigint default '-1',
+
+  -- Number of users, theoretically equal to SELECT COUNT(*) FROM user;
+  ss_users bigint default '-1',
+
+  -- Number of users that still edit
+  ss_active_users bigint default '-1',
+
+  -- Number of images, equivalent to SELECT COUNT(*) FROM image
+  ss_images int default 0
 );
 
--- INSERT INTO site_stats DEFAULT VALUES;
+-- Pointless index to assuage developer superstitions
+CREATE UNIQUE INDEX /*i*/ss_row_id ON /*_*/site_stats (ss_row_id);
+
 
 --
 -- Stores an ID for every time any article is visited;
--- depending ON $wgHitcounterUpdateFreq, it is
+-- depending on $wgHitcounterUpdateFreq, it is
 -- periodically cleared and the page_counter column
--- in the page table updated for the all articles
+-- in the page table updated for all the articles
 -- that have been visited.)
 --
-CREATE TABLE /*$wgDBprefix*/hitcounter (
-   hc_id BIGINT NOT NULL
+CREATE TABLE /*_*/hitcounter (
+  hc_id int NOT NULL
 );
 
+
 --
--- The Internet is full of jerks, alas. Sometimes it's handy
+-- The internet is full of jerks, alas. Sometimes it's handy
 -- to block a vandal or troll account.
 --
-CREATE TABLE /*$wgDBprefix*/ipblocks (
-       ipb_id      INT NOT NULL  PRIMARY KEY,
-       ipb_address NVARCHAR(255) NOT NULL,
-       ipb_user    INT NOT NULL DEFAULT 0,
-       ipb_by      INT NOT NULL DEFAULT 0,
-       ipb_by_text NVARCHAR(255) NOT NULL DEFAULT '',
-       ipb_reason  NVARCHAR(255) NOT NULL,
-       ipb_timestamp DATETIME NOT NULL DEFAULT GETDATE(),
-       ipb_auto BIT NOT NULL DEFAULT 0,
-       ipb_anon_only BIT NOT NULL DEFAULT 0,
-       ipb_create_account BIT NOT NULL DEFAULT 1,
-       ipb_enable_autoblock BIT NOT NULL DEFAULT 1,
-       ipb_expiry DATETIME NOT NULL DEFAULT GETDATE(),
-       ipb_range_start NVARCHAR(32) NOT NULL DEFAULT '',
-       ipb_range_end NVARCHAR(32) NOT NULL DEFAULT '',
-       ipb_deleted BIT NOT NULL DEFAULT 0,
-       ipb_block_email BIT NOT NULL DEFAULT 0,
-       ipb_allow_usertalk BIT NOT NULL DEFAULT 0,
-       ipb_parent_block_id   INT DEFAULT NULL,
+CREATE TABLE /*_*/ipblocks (
+  -- Primary key, introduced for privacy.
+  ipb_id int NOT NULL PRIMARY KEY IDENTITY,
+
+  -- Blocked IP address in dotted-quad form or user name.
+  ipb_address nvarchar(255) NOT NULL,
+
+  -- Blocked user ID or 0 for IP blocks.
+  ipb_user int REFERENCES /*_*/mwuser(user_id),
+
+  -- User ID who made the block.
+  ipb_by int REFERENCES /*_*/mwuser(user_id) ON DELETE CASCADE,
+
+  -- User name of blocker
+  ipb_by_text nvarchar(255) NOT NULL default '',
+
+  -- Text comment made by blocker.
+  ipb_reason nvarchar(255) NOT NULL,
+
+  -- Creation (or refresh) date in standard YMDHMS form.
+  -- IP blocks expire automatically.
+  ipb_timestamp varchar(14) NOT NULL default '',
+
+  -- Indicates that the IP address was banned because a banned
+  -- user accessed a page through it. If this is 1, ipb_address
+  -- will be hidden, and the block identified by block ID number.
+  ipb_auto bit NOT NULL default 0,
+
+  -- If set to 1, block applies only to logged-out users
+  ipb_anon_only bit NOT NULL default 0,
+
+  -- Block prevents account creation from matching IP addresses
+  ipb_create_account bit NOT NULL default 1,
+
+  -- Block triggers autoblocks
+  ipb_enable_autoblock bit NOT NULL default 1,
+
+  -- Time at which the block will expire.
+  -- May be "infinity"
+  ipb_expiry varchar(14) NOT NULL,
+
+  -- Start and end of an address range, in hexadecimal
+  -- Size chosen to allow IPv6
+  -- FIXME: these fields were originally blank for single-IP blocks,
+  -- but now they are populated. No migration was ever done. They
+  -- should be fixed to be blank again for such blocks (bug 49504).
+  ipb_range_start varchar(255) NOT NULL,
+  ipb_range_end varchar(255) NOT NULL,
+
+  -- Flag for entries hidden from users and Sysops
+  ipb_deleted bit NOT NULL default 0,
+
+  -- Block prevents user from accessing Special:Emailuser
+  ipb_block_email bit NOT NULL default 0,
+
+  -- Block allows user to edit their own talk page
+  ipb_allow_usertalk bit NOT NULL default 0,
+
+  -- ID of the block that caused this block to exist
+  -- Autoblocks set this to the original block
+  -- so that the original block being deleted also
+  -- deletes the autoblocks
+  ipb_parent_block_id int default NULL REFERENCES /*_*/ipblocks(ipb_id)
+
 );
+
 -- Unique index to support "user already blocked" messages
 -- Any new options which prevent collisions should be included
---UNIQUE INDEX ipb_address (ipb_address(255), ipb_user, ipb_auto, ipb_anon_only),
-CREATE UNIQUE INDEX /*$wgDBprefix*/ipb_address   ON /*$wgDBprefix*/ipblocks(ipb_address, ipb_user, ipb_auto, ipb_anon_only);
-CREATE        INDEX /*$wgDBprefix*/ipb_user      ON /*$wgDBprefix*/ipblocks(ipb_user);
-CREATE        INDEX /*$wgDBprefix*/ipb_range     ON /*$wgDBprefix*/ipblocks(ipb_range_start, ipb_range_end);
-CREATE        INDEX /*$wgDBprefix*/ipb_timestamp ON /*$wgDBprefix*/ipblocks(ipb_timestamp);
-CREATE        INDEX /*$wgDBprefix*/ipb_expiry    ON /*$wgDBprefix*/ipblocks(ipb_expiry);
-;
+CREATE UNIQUE INDEX /*i*/ipb_address ON /*_*/ipblocks (ipb_address, ipb_user, ipb_auto, ipb_anon_only);
+
+CREATE INDEX /*i*/ipb_user ON /*_*/ipblocks (ipb_user);
+CREATE INDEX /*i*/ipb_range ON /*_*/ipblocks (ipb_range_start, ipb_range_end);
+CREATE INDEX /*i*/ipb_timestamp ON /*_*/ipblocks (ipb_timestamp);
+CREATE INDEX /*i*/ipb_expiry ON /*_*/ipblocks (ipb_expiry);
+CREATE INDEX /*i*/ipb_parent_block_id ON /*_*/ipblocks (ipb_parent_block_id);
+
 
 --
 -- Uploaded images and other files.
-CREATE TABLE /*$wgDBprefix*/image (
-   img_name varchar(255) NOT NULL default '',
-   img_size INT  NOT NULL DEFAULT 0,
-   img_width INT NOT NULL DEFAULT 0,
-   img_height INT NOT NULL DEFAULT 0,
-   img_metadata TEXT NOT NULL, -- was MEDIUMBLOB
-   img_bits SMALLINT NOT NULL DEFAULT 0,
-   img_media_type NVARCHAR(MAX) DEFAULT 'UNKNOWN',
-   img_major_mime NVARCHAR(MAX) DEFAULT 'UNKNOWN',
-   img_minor_mime NVARCHAR(MAX) NOT NULL DEFAULT 'unknown',
-   img_description NVARCHAR(MAX) NOT NULL,
-   img_user INT NOT NULL DEFAULT 0,
-   img_user_text VARCHAR(255) NOT NULL DEFAULT '',
-   img_timestamp DATETIME NOT NULL DEFAULT GETDATE(),
-   img_sha1 VARCHAR(255) NOT NULL default '',
-);
--- Used by Special:Imagelist for sort-by-size
-CREATE INDEX /*$wgDBprefix*/img_size ON /*$wgDBprefix*/[image](img_size);
--- Used by Special:Newimages and Special:Imagelist
-CREATE INDEX /*$wgDBprefix*/img_timestamp ON /*$wgDBprefix*/[image](img_timestamp)
-CREATE INDEX /*$wgDBprefix*/[img_sha1] ON /*wgDBprefix*/[image](img_sha1)
+--
+CREATE TABLE /*_*/image (
+  -- Filename.
+  -- This is also the title of the associated description page,
+  -- which will be in namespace 6 (NS_FILE).
+  img_name varbinary(255) NOT NULL default 0x PRIMARY KEY,
+
+  -- File size in bytes.
+  img_size int NOT NULL default 0,
+
+  -- For images, size in pixels.
+  img_width int NOT NULL default 0,
+  img_height int NOT NULL default 0,
+
+  -- Extracted Exif metadata stored as a serialized PHP array.
+  img_metadata varbinary(max) NOT NULL,
+
+  -- For images, bits per pixel if known.
+  img_bits int NOT NULL default 0,
+
+  -- Media type as defined by the MEDIATYPE_xxx constants
+  img_media_type varchar(16) default null check (img_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE')),
+
+  -- major part of a MIME media type as defined by IANA
+  -- see http://www.iana.org/assignments/media-types/
+  img_major_mime varchar(16) not null default 'unknown' check (img_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart')),
+
+  -- minor part of a MIME media type as defined by IANA
+  -- the minor parts are not required to adher to any standard
+  -- but should be consistent throughout the database
+  -- see http://www.iana.org/assignments/media-types/
+  img_minor_mime nvarchar(100) NOT NULL default 'unknown',
+
+  -- Description field as entered by the uploader.
+  -- This is displayed in image upload history and logs.
+  img_description nvarchar(255) NOT NULL,
+
+  -- user_id and user_name of uploader.
+  img_user int REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
+  img_user_text nvarchar(255) NOT NULL,
+
+  -- Time of the upload.
+  img_timestamp nvarchar(14) NOT NULL default '',
+
+  -- SHA-1 content hash in base-36
+  img_sha1 nvarchar(32) NOT NULL default ''
+);
+
+CREATE INDEX /*i*/img_usertext_timestamp ON /*_*/image (img_user_text,img_timestamp);
+-- Used by Special:ListFiles for sort-by-size
+CREATE INDEX /*i*/img_size ON /*_*/image (img_size);
+-- Used by Special:Newimages and Special:ListFiles
+CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp);
+-- Used in API and duplicate search
+CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1);
+-- Used to get media of one type
+CREATE INDEX /*i*/img_media_mime ON /*_*/image (img_media_type,img_major_mime,img_minor_mime);
+
 
 --
 -- Previous revisions of uploaded files.
 -- Awkwardly, image rows have to be moved into
 -- this table at re-upload time.
 --
-CREATE TABLE /*$wgDBprefix*/oldimage (
-   oi_name VARCHAR(255) NOT NULL DEFAULT '',
-   oi_archive_name VARCHAR(255) NOT NULL DEFAULT '',
-   oi_size INT NOT NULL DEFAULT 0,
-   oi_width INT NOT NULL DEFAULT 0,
-   oi_height INT NOT NULL DEFAULT 0,
-   oi_bits SMALLINT NOT NULL DEFAULT 0,
-   oi_description NVARCHAR(MAX) NOT NULL,
-   oi_user INT NOT NULL DEFAULT 0,
-   oi_user_text VARCHAR(255) NOT NULL DEFAULT '',
-   oi_timestamp DATETIME NOT NULL DEFAULT GETDATE(),
-   oi_metadata TEXT NOT NULL,
-   oi_media_type NVARCHAR(MAX) DEFAULT 'UNKNOWN',
-   oi_major_mime NVARCHAR(MAX) NOT NULL DEFAULT 'UNKNOWN',
-   oi_minor_mime NVARCHAR(MAX) NOT NULL DEFAULT 'unknown',
-   oi_deleted BIT NOT NULL default 0,
-   oi_sha1 VARCHAR(255) NOT NULL default '',
-);
-CREATE INDEX /*$wgDBprefix*/oi_usertext_timestamp ON /*$wgDBprefix*/oldimage(oi_user_text,oi_timestamp);
-CREATE INDEX /*$wgDBprefix*/oi_name_timestamp ON /*$wgDBprefix*/oldimage(oi_name, oi_timestamp);
-CREATE INDEX /*$wgDBprefix*/oi_name_archive_name ON /*$wgDBprefix*/oldimage(oi_name,oi_archive_name);
-CREATE INDEX /*$wgDBprefix*/[oi_sha1] ON /*$wgDBprefix*/oldimage(oi_sha1);
+CREATE TABLE /*_*/oldimage (
+  -- Base filename: key to image.img_name
+  oi_name varbinary(255) NOT NULL default 0x REFERENCES /*_*/image(img_name) ON DELETE CASCADE ON UPDATE CASCADE,
+
+  -- Filename of the archived file.
+  -- This is generally a timestamp and '!' prepended to the base name.
+  oi_archive_name varbinary(255) NOT NULL default 0x,
+
+  -- Other fields as in image...
+  oi_size int NOT NULL default 0,
+  oi_width int NOT NULL default 0,
+  oi_height int NOT NULL default 0,
+  oi_bits int NOT NULL default 0,
+  oi_description nvarchar(255) NOT NULL,
+  oi_user int REFERENCES /*_*/mwuser(user_id),
+  oi_user_text nvarchar(255) NOT NULL,
+  oi_timestamp varchar(14) NOT NULL default '',
+
+  oi_metadata nvarchar(max) NOT NULL,
+  oi_media_type varchar(16) default null check (oi_media_type IN('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE')),
+  oi_major_mime varchar(16) not null default 'unknown' check (oi_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart')),
+  oi_minor_mime nvarchar(100) NOT NULL default 'unknown',
+  oi_deleted tinyint NOT NULL default 0,
+  oi_sha1 nvarchar(32) NOT NULL default ''
+);
+
+CREATE INDEX /*i*/oi_usertext_timestamp ON /*_*/oldimage (oi_user_text,oi_timestamp);
+CREATE INDEX /*i*/oi_name_timestamp ON /*_*/oldimage (oi_name,oi_timestamp);
+-- oi_archive_name truncated to 14 to avoid key length overflow
+CREATE INDEX /*i*/oi_name_archive_name ON /*_*/oldimage (oi_name,oi_archive_name);
+CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1);
+
 
 --
 -- Record of deleted file data
 --
-CREATE TABLE /*$wgDBprefix*/filearchive (
-   fa_id INT NOT NULL PRIMARY KEY,
-   fa_name NVARCHAR(255)  NOT NULL DEFAULT '',
-   fa_archive_name NVARCHAR(255)  DEFAULT '',
-   fa_storage_group NVARCHAR(16),
-   fa_storage_key NVARCHAR(64)  DEFAULT '',
-   fa_deleted_user INT,
-   fa_deleted_timestamp NVARCHAR(14) DEFAULT NULL,
-   fa_deleted_reason NVARCHAR(255),
-   fa_size SMALLINT  DEFAULT 0,
-   fa_width SMALLINT DEFAULT 0,
-   fa_height SMALLINT DEFAULT 0,
-   fa_metadata NVARCHAR(MAX), -- was mediumblob
-   fa_bits SMALLINT DEFAULT 0,
-   fa_media_type NVARCHAR(11) DEFAULT NULL,
-   fa_major_mime NVARCHAR(11) DEFAULT 'unknown',
-   fa_minor_mime NVARCHAR(32) DEFAULT 'unknown',
-   fa_description NVARCHAR(255),
-   fa_user INT DEFAULT 0,
-   fa_user_text NVARCHAR(255) DEFAULT '',
-   fa_timestamp DATETIME DEFAULT GETDATE(),
-   fa_deleted BIT NOT NULL DEFAULT 0,
-);
--- Pick by image name
-CREATE INDEX /*$wgDBprefix*/filearchive_name ON /*$wgDBprefix*/filearchive(fa_name,fa_timestamp);
--- Pick by dupe files
-CREATE INDEX /*$wgDBprefix*/filearchive_dupe ON /*$wgDBprefix*/filearchive(fa_storage_group,fa_storage_key);
--- Pick by deletion time
-CREATE INDEX /*$wgDBprefix*/filearchive_time ON /*$wgDBprefix*/filearchive(fa_deleted_timestamp);
--- Pick by deleter
-CREATE INDEX /*$wgDBprefix*/filearchive_user ON /*$wgDBprefix*/filearchive(fa_deleted_user);
+CREATE TABLE /*_*/filearchive (
+  -- Unique row id
+  fa_id int NOT NULL PRIMARY KEY IDENTITY,
+
+  -- Original base filename; key to image.img_name, page.page_title, etc
+  fa_name nvarchar(255) NOT NULL default '',
+
+  -- Filename of archived file, if an old revision
+  fa_archive_name nvarchar(255) default '',
+
+  -- Which storage bin (directory tree or object store) the file data
+  -- is stored in. Should be 'deleted' for files that have been deleted;
+  -- any other bin is not yet in use.
+  fa_storage_group nvarchar(16),
+
+  -- SHA-1 of the file contents plus extension, used as a key for storage.
+  -- eg 8f8a562add37052a1848ff7771a2c515db94baa9.jpg
+  --
+  -- If NULL, the file was missing at deletion time or has been purged
+  -- from the archival storage.
+  fa_storage_key nvarchar(64) default '',
+
+  -- Deletion information, if this file is deleted.
+  fa_deleted_user int,
+  fa_deleted_timestamp varchar(14) default '',
+  fa_deleted_reason nvarchar(max),
+
+  -- Duped fields from image
+  fa_size int default 0,
+  fa_width int default 0,
+  fa_height int default 0,
+  fa_metadata nvarchar(max),
+  fa_bits int default 0,
+  fa_media_type varchar(16) default null check (fa_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE')),
+  fa_major_mime varchar(16) not null default 'unknown' check (fa_major_mime in('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart')),
+  fa_minor_mime nvarchar(100) default 'unknown',
+  fa_description nvarchar(255),
+  fa_user int default 0 REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
+  fa_user_text nvarchar(255),
+  fa_timestamp varchar(14) default '',
+
+  -- Visibility of deleted revisions, bitfield
+  fa_deleted tinyint NOT NULL default 0,
+
+  -- sha1 hash of file content
+  fa_sha1 nvarchar(32) NOT NULL default ''
+);
+
+-- pick out by image name
+CREATE INDEX /*i*/fa_name ON /*_*/filearchive (fa_name, fa_timestamp);
+-- pick out dupe files
+CREATE INDEX /*i*/fa_storage_group ON /*_*/filearchive (fa_storage_group, fa_storage_key);
+-- sort by deletion time
+CREATE INDEX /*i*/fa_deleted_timestamp ON /*_*/filearchive (fa_deleted_timestamp);
+-- sort by uploader
+CREATE INDEX /*i*/fa_user_timestamp ON /*_*/filearchive (fa_user_text,fa_timestamp);
+-- find file by sha1, 10 bytes will be enough for hashes to be indexed
+CREATE INDEX /*i*/fa_sha1 ON /*_*/filearchive (fa_sha1);
+
+
+--
+-- Store information about newly uploaded files before they're
+-- moved into the actual filestore
+--
+CREATE TABLE /*_*/uploadstash (
+  us_id int NOT NULL PRIMARY KEY IDENTITY,
+
+  -- the user who uploaded the file.
+  us_user int REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
+
+  -- file key. this is how applications actually search for the file.
+  -- this might go away, or become the primary key.
+  us_key nvarchar(255) NOT NULL,
+
+  -- the original path
+  us_orig_path nvarchar(255) NOT NULL,
+
+  -- the temporary path at which the file is actually stored
+  us_path nvarchar(255) NOT NULL,
+
+  -- which type of upload the file came from (sometimes)
+  us_source_type nvarchar(50),
+
+  -- the date/time on which the file was added
+  us_timestamp varchar(14) NOT NULL,
+
+  us_status nvarchar(50) NOT NULL,
+
+  -- chunk counter starts at 0, current offset is stored in us_size
+  us_chunk_inx int NULL,
+
+  -- Serialized file properties from File::getPropsFromPath
+  us_props nvarchar(max),
+
+  -- file size in bytes
+  us_size int NOT NULL,
+  -- this hash comes from File::sha1Base36(), and is 31 characters
+  us_sha1 nvarchar(31) NOT NULL,
+  us_mime nvarchar(255),
+  -- Media type as defined by the MEDIATYPE_xxx constants, should duplicate definition in the image table
+  us_media_type varchar(16) default null check (us_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE')),
+  -- image-specific properties
+  us_image_width int,
+  us_image_height int,
+  us_image_bits smallint
+
+);
+
+-- sometimes there's a delete for all of a user's stuff.
+CREATE INDEX /*i*/us_user ON /*_*/uploadstash (us_user);
+-- pick out files by key, enforce key uniqueness
+CREATE UNIQUE INDEX /*i*/us_key ON /*_*/uploadstash (us_key);
+-- the abandoned upload cleanup script needs this
+CREATE INDEX /*i*/us_timestamp ON /*_*/uploadstash (us_timestamp);
+
 
 --
 -- Primarily a summary table for Special:Recentchanges,
 -- this table contains some additional info on edits from
 -- the last few days, see Article::editUpdates()
 --
-CREATE TABLE /*$wgDBprefix*/recentchanges (
-   rc_id INT NOT NULL,
-   rc_timestamp DATETIME DEFAULT GETDATE(),
-   rc_cur_time DATETIME DEFAULT GETDATE(),
-   rc_user INT DEFAULT 0,
-   rc_user_text NVARCHAR(255) DEFAULT '',
-   rc_namespace SMALLINT DEFAULT 0,
-   rc_title NVARCHAR(255)  DEFAULT '',
-   rc_comment NVARCHAR(255) DEFAULT '',
-   rc_minor BIT DEFAULT 0,
-   rc_bot BIT DEFAULT 0,
-   rc_new BIT DEFAULT 0,
-   rc_cur_id INT DEFAULT 0,
-   rc_this_oldid INT DEFAULT 0,
-   rc_last_oldid INT DEFAULT 0,
-   rc_type tinyint DEFAULT 0,
-   rc_patrolled BIT DEFAULT 0,
-   rc_ip NCHAR(40) DEFAULT '',
-   rc_old_len INT DEFAULT 0,
-   rc_new_len INT DEFAULT 0,
-   rc_deleted BIT DEFAULT 0,
-   rc_logid INT DEFAULT 0,
-   rc_log_type NVARCHAR(255) NULL DEFAULT NULL,
-   rc_log_action NVARCHAR(255) NULL DEFAULT NULL,
-   rc_params NVARCHAR(MAX) DEFAULT '',
-);
-CREATE INDEX /*$wgDBprefix*/rc_timestamp       ON /*$wgDBprefix*/recentchanges(rc_timestamp);
-CREATE INDEX /*$wgDBprefix*/rc_namespace_title ON /*$wgDBprefix*/recentchanges(rc_namespace, rc_title);
-CREATE INDEX /*$wgDBprefix*/rc_cur_id          ON /*$wgDBprefix*/recentchanges(rc_cur_id);
-CREATE INDEX /*$wgDBprefix*/new_name_timestamp ON /*$wgDBprefix*/recentchanges(rc_new,rc_namespace,rc_timestamp);
-CREATE INDEX /*$wgDBprefix*/rc_ip              ON /*$wgDBprefix*/recentchanges(rc_ip);
-CREATE INDEX /*$wgDBprefix*/rc_ns_usertext     ON /*$wgDBprefix*/recentchanges(rc_namespace, rc_user_text);
-CREATE INDEX /*$wgDBprefix*/rc_user_text       ON /*$wgDBprefix*/recentchanges(rc_user_text, rc_timestamp);
-;
-
-CREATE TABLE /*$wgDBprefix*/watchlist (
-   wl_user INT NOT NULL,
-   wl_namespace SMALLINT NOT NULL DEFAULT 0,
-   wl_title NVARCHAR(255)  NOT NULL DEFAULT '',
-   wl_notificationtimestamp NVARCHAR(14) DEFAULT NULL,
-
-);
-CREATE UNIQUE INDEX /*$wgDBprefix*/namespace_title ON /*$wgDBprefix*/watchlist(wl_namespace,wl_title);
-
--- Needs fulltext index.
-CREATE TABLE /*$wgDBprefix*/searchindex (
-   si_page INT NOT NULL unique REFERENCES /*$wgDBprefix*/page(page_id) ON DELETE CASCADE,
-   si_title varbinary(max) NOT NULL,
-   si_text varbinary(max) NOT NULL,
-   si_ext CHAR(4) NOT NULL DEFAULT '.txt',
-);
-CREATE FULLTEXT CATALOG wikidb AS DEFAULT;
-CREATE UNIQUE CLUSTERED INDEX searchindex_page ON searchindex (si_page);
-CREATE FULLTEXT INDEX on searchindex (si_title TYPE COLUMN si_ext, si_text  TYPE COLUMN si_ext)
-KEY INDEX searchindex_page
-;
-
--- This table is not used unless profiling is turned on
-CREATE TABLE profiling (
-  pf_count   INTEGER         NOT NULL DEFAULT 0,
-  pf_time    NUMERIC(18,10)  NOT NULL DEFAULT 0,
-  pf_name    NVARCHAR(200)            NOT NULL,
-  pf_server  NVARCHAR(200)            NULL
-);
-CREATE UNIQUE INDEX pf_name_server ON profiling (pf_name, pf_server);
-
---
--- Recognized INTerwiki link prefixes
---
-CREATE TABLE /*$wgDBprefix*/interwiki (
-   iw_prefix NCHAR(32) NOT NULL PRIMARY KEY,
-   iw_url NCHAR(127)   NOT NULL,
-   iw_api TEXT NOT NULL DEFAULT '',
-   iw_wikiid NVARCHAR(64) NOT NULL DEFAULT '',
-   iw_local BIT NOT NULL,
-   iw_trans BIT NOT NULL DEFAULT 0,
+CREATE TABLE /*_*/recentchanges (
+  rc_id int NOT NULL PRIMARY KEY IDENTITY,
+  rc_timestamp varchar(14) not null default '',
+
+  -- This is no longer used
+  -- Field kept in database for downgrades
+  -- @todo: add drop patch with 1.24
+  rc_cur_time varchar(14) NOT NULL default '',
+
+  -- As in revision
+  rc_user int NOT NULL default 0 REFERENCES /*_*/mwuser(user_id),
+  rc_user_text nvarchar(255) NOT NULL,
+
+  -- When pages are renamed, their RC entries do _not_ change.
+  rc_namespace int NOT NULL default 0,
+  rc_title nvarchar(255) NOT NULL default '',
+
+  -- as in revision...
+  rc_comment nvarchar(255) NOT NULL default '',
+  rc_minor bit NOT NULL default 0,
+
+  -- Edits by user accounts with the 'bot' rights key are
+  -- marked with a 1 here, and will be hidden from the
+  -- default view.
+  rc_bot bit NOT NULL default 0,
+
+  -- Set if this change corresponds to a page creation
+  rc_new bit NOT NULL default 0,
+
+  -- Key to page_id (was cur_id prior to 1.5).
+  -- This will keep links working after moves while
+  -- retaining the at-the-time name in the changes list.
+  rc_cur_id int REFERENCES /*_*/page(page_id),
+
+  -- rev_id of the given revision
+  rc_this_oldid int REFERENCES /*_*/revision(rev_id),
+
+  -- rev_id of the prior revision, for generating diff links.
+  rc_last_oldid int REFERENCES /*_*/revision(rev_id),
+
+  -- The type of change entry (RC_EDIT,RC_NEW,RC_LOG,RC_EXTERNAL)
+  rc_type tinyint NOT NULL default 0,
+
+  -- The source of the change entry (replaces rc_type)
+  -- default of '' is temporary, needed for initial migration
+  rc_source nvarchar(16) not null default '',
+
+  -- If the Recent Changes Patrol option is enabled,
+  -- users may mark edits as having been reviewed to
+  -- remove a warning flag on the RC list.
+  -- A value of 1 indicates the page has been reviewed.
+  rc_patrolled bit NOT NULL default 0,
+
+  -- Recorded IP address the edit was made from, if the
+  -- $wgPutIPinRC option is enabled.
+  rc_ip nvarchar(40) NOT NULL default '',
+
+  -- Text length in characters before
+  -- and after the edit
+  rc_old_len int,
+  rc_new_len int,
+
+  -- Visibility of recent changes items, bitfield
+  rc_deleted tinyint NOT NULL default 0,
+
+  -- Value corresponding to log_id, specific log entries
+  rc_logid int, -- FK added later
+  -- Store log type info here, or null
+  rc_log_type nvarchar(255) NULL default NULL,
+  -- Store log action or null
+  rc_log_action nvarchar(255) NULL default NULL,
+  -- Log params
+  rc_params nvarchar(max) NULL
+);
+
+CREATE INDEX /*i*/rc_timestamp ON /*_*/recentchanges (rc_timestamp);
+CREATE INDEX /*i*/rc_namespace_title ON /*_*/recentchanges (rc_namespace, rc_title);
+CREATE INDEX /*i*/rc_cur_id ON /*_*/recentchanges (rc_cur_id);
+CREATE INDEX /*i*/new_name_timestamp ON /*_*/recentchanges (rc_new,rc_namespace,rc_timestamp);
+CREATE INDEX /*i*/rc_ip ON /*_*/recentchanges (rc_ip);
+CREATE INDEX /*i*/rc_ns_usertext ON /*_*/recentchanges (rc_namespace, rc_user_text);
+CREATE INDEX /*i*/rc_user_text ON /*_*/recentchanges (rc_user_text, rc_timestamp);
+
+
+CREATE TABLE /*_*/watchlist (
+  -- Key to user.user_id
+  wl_user int NOT NULL REFERENCES /*_*/mwuser(user_id) ON DELETE CASCADE,
+
+  -- Key to page_namespace/page_title
+  -- Note that users may watch pages which do not exist yet,
+  -- or existed in the past but have been deleted.
+  wl_namespace int NOT NULL default 0,
+  wl_title nvarchar(255) NOT NULL default '',
+
+  -- Timestamp used to send notification e-mails and show "updated since last visit" markers on
+  -- history and recent changes / watchlist. Set to NULL when the user visits the latest revision
+  -- of the page, which means that they should be sent an e-mail on the next change.
+  wl_notificationtimestamp varchar(14)
+
+);
+
+CREATE UNIQUE INDEX /*i*/wl_user ON /*_*/watchlist (wl_user, wl_namespace, wl_title);
+CREATE INDEX /*i*/namespace_title ON /*_*/watchlist (wl_namespace, wl_title);
+
+
+--
+-- Our search index for the builtin MediaWiki search
+--
+CREATE TABLE /*_*/searchindex (
+  -- Key to page_id
+  si_page int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
+
+  -- Munged version of title
+  si_title nvarchar(255) NOT NULL default '',
+
+  -- Munged version of body text
+  si_text nvarchar(max) NOT NULL
+);
+
+CREATE UNIQUE INDEX /*i*/si_page ON /*_*/searchindex (si_page);
+-- Fulltext index is defined in MssqlInstaller.php
+
+--
+-- Recognized interwiki link prefixes
+--
+CREATE TABLE /*_*/interwiki (
+  -- The interwiki prefix, (e.g. "Meatball", or the language prefix "de")
+  iw_prefix nvarchar(32) NOT NULL,
+
+  -- The URL of the wiki, with "$1" as a placeholder for an article name.
+  -- Any spaces in the name will be transformed to underscores before
+  -- insertion.
+  iw_url nvarchar(max) NOT NULL,
+
+  -- The URL of the file api.php
+  iw_api nvarchar(max) NOT NULL,
+
+  -- The name of the database (for a connection to be established with wfGetLB( 'wikiid' ))
+  iw_wikiid nvarchar(64) NOT NULL,
+
+  -- A boolean value indicating whether the wiki is in this project
+  -- (used, for example, to detect redirect loops)
+  iw_local bit NOT NULL,
+
+  -- Boolean value indicating whether interwiki transclusions are allowed.
+  iw_trans bit NOT NULL default 0
 );
 
+CREATE UNIQUE INDEX /*i*/iw_prefix ON /*_*/interwiki (iw_prefix);
+
+
 --
 -- Used for caching expensive grouped queries
 --
-CREATE TABLE /*$wgDBprefix*/querycache (
-   qc_type      NCHAR(32)  NOT NULL,
-   qc_value     INT       NOT NULL DEFAULT '0',
-   qc_namespace SMALLINT       NOT NULL DEFAULT 0,
-   qc_title     NCHAR(255)  NOT NULL DEFAULT '',
-   CONSTRAINT /*$wgDBprefix*/qc_pk PRIMARY KEY (qc_type,qc_value)
+CREATE TABLE /*_*/querycache (
+  -- A key name, generally the base name of of the special page.
+  qc_type nvarchar(32) NOT NULL,
+
+  -- Some sort of stored value. Sizes, counts...
+  qc_value int NOT NULL default 0,
+
+  -- Target namespace+title
+  qc_namespace int NOT NULL default 0,
+  qc_title nvarchar(255) NOT NULL default ''
 );
 
+CREATE INDEX /*i*/qc_type ON /*_*/querycache (qc_type,qc_value);
+
+
 --
 -- For a few generic cache operations if not using Memcached
 --
-CREATE TABLE /*$wgDBprefix*/objectcache (
-   keyname NCHAR(255)  NOT NULL DEFAULT '',
-   [value] NVARCHAR(MAX), -- IMAGE,
-   exptime DATETIME, -- This is treated as a DATETIME
-);
-CREATE CLUSTERED INDEX /*$wgDBprefix*/[objectcache_time] ON /*$wgDBprefix*/objectcache(exptime);
-CREATE UNIQUE INDEX /*$wgDBprefix*/[objectcache_PK] ON /*wgDBprefix*/objectcache(keyname);
---
--- Cache of INTerwiki transclusion
---
-CREATE TABLE /*$wgDBprefix*/transcache (
-   tc_url      NVARCHAR(255)  NOT NULL PRIMARY KEY,
-   tc_contents NVARCHAR(MAX),
-   tc_time     INT NOT NULL,
-);
-
-CREATE TABLE /*$wgDBprefix*/logging (
-   log_id INT  PRIMARY KEY IDENTITY,
-   log_type NCHAR(10) NOT NULL DEFAULT '',
-   log_action NCHAR(10) NOT NULL DEFAULT '',
-   log_timestamp DATETIME NOT NULL DEFAULT GETDATE(),
-   log_user INT NOT NULL DEFAULT 0,
-   log_user_text NVARCHAR(255) NOT NULL DEFAULT '',
-   log_namespace INT NOT NULL DEFAULT 0,
-   log_title NVARCHAR(255)  NOT NULL DEFAULT '',
-   log_page INT NULL DEFAULT NULL,
-   log_comment NVARCHAR(255) NOT NULL DEFAULT '',
-   log_params NVARCHAR(MAX) NOT NULL,
-   log_deleted BIT NOT NULL DEFAULT 0,
-);
-CREATE INDEX /*$wgDBprefix*/type_time ON /*$wgDBprefix*/logging (log_type, log_timestamp);
-CREATE INDEX /*$wgDBprefix*/user_time ON /*$wgDBprefix*/logging (log_user, log_timestamp);
-CREATE INDEX /*$wgDBprefix*/page_time ON /*$wgDBprefix*/logging (log_namespace, log_title, log_timestamp);
-CREATE INDEX /*$wgDBprefix*/times ON /*$wgDBprefix*/logging (log_timestamp);
-CREATE INDEX /*$wgDBprefix*/log_user_type_time ON /*$wgDBprefix*/logging (log_user, log_type, log_timestamp);
-CREATE INDEX /*$wgDBprefix*/log_page_id_time ON /*$wgDBprefix*/logging (log_page,log_timestamp);
-CREATE INDEX /*$wgDBprefix*/log_user_text_type_time ON /*$wgDBprefix*/logging (log_user_text, log_type, log_timestamp);
-CREATE INDEX /*$wgDBprefix*/log_user_text_time ON /*$wgDBprefix*/logging (log_user_text, log_timestamp);
-
-CREATE TABLE /*$wgDBprefix*/log_search (
-       -- The type of ID (rev ID, log ID, rev timestamp, username)
-       ls_field NVARCHAR(32) NOT NULL,
-       -- The value of the ID
-       ls_value NVARCHAR(255) NOT NULL,
-       -- Key to log_id
-       ls_log_id INT NOT NULL default 0,
-);
-CREATE UNIQUE INDEX /*$wgDBprefix*/ls_field_val ON /*$wgDBprefix*/log_search (ls_field,ls_value,ls_log_id);
-CREATE INDEX /*$wgDBprefix*/ls_log_id ON /*$wgDBprefix*/log_search (ls_log_id);
+CREATE TABLE /*_*/objectcache (
+  keyname nvarchar(255) NOT NULL default '' PRIMARY KEY,
+  value varbinary(max),
+  exptime varchar(14)
+);
+CREATE INDEX /*i*/exptime ON /*_*/objectcache (exptime);
+
+
+--
+-- Cache of interwiki transclusion
+--
+CREATE TABLE /*_*/transcache (
+  tc_url nvarchar(255) NOT NULL,
+  tc_contents nvarchar(max),
+  tc_time varchar(14) NOT NULL
+);
+
+CREATE UNIQUE INDEX /*i*/tc_url_idx ON /*_*/transcache (tc_url);
+
+
+CREATE TABLE /*_*/logging (
+  -- Log ID, for referring to this specific log entry, probably for deletion and such.
+  log_id int NOT NULL PRIMARY KEY IDENTITY(0,1),
+
+  -- Symbolic keys for the general log type and the action type
+  -- within the log. The output format will be controlled by the
+  -- action field, but only the type controls categorization.
+  log_type nvarchar(32) NOT NULL default '',
+  log_action nvarchar(32) NOT NULL default '',
+
+  -- Timestamp. Duh.
+  log_timestamp varchar(14) NOT NULL default '',
+
+  -- The user who performed this action; key to user_id
+  log_user int REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
+
+  -- Name of the user who performed this action
+  log_user_text nvarchar(255) NOT NULL default '',
+
+  -- Key to the page affected. Where a user is the target,
+  -- this will point to the user page.
+  log_namespace int NOT NULL default 0,
+  log_title nvarchar(255) NOT NULL default '',
+  log_page int NULL REFERENCES /*_*/page(page_id) ON DELETE SET NULL,
+
+  -- Freeform text. Interpreted as edit history comments.
+  log_comment nvarchar(255) NOT NULL default '',
+
+  -- miscellaneous parameters:
+  -- LF separated list (old system) or serialized PHP array (new system)
+  log_params nvarchar(max) NOT NULL,
+
+  -- rev_deleted for logs
+  log_deleted tinyint NOT NULL default 0
+);
+
+CREATE INDEX /*i*/type_time ON /*_*/logging (log_type, log_timestamp);
+CREATE INDEX /*i*/user_time ON /*_*/logging (log_user, log_timestamp);
+CREATE INDEX /*i*/page_time ON /*_*/logging (log_namespace, log_title, log_timestamp);
+CREATE INDEX /*i*/times ON /*_*/logging (log_timestamp);
+CREATE INDEX /*i*/log_user_type_time ON /*_*/logging (log_user, log_type, log_timestamp);
+CREATE INDEX /*i*/log_page_id_time ON /*_*/logging (log_page,log_timestamp);
+CREATE INDEX /*i*/type_action ON /*_*/logging (log_type, log_action, log_timestamp);
+CREATE INDEX /*i*/log_user_text_type_time ON /*_*/logging (log_user_text, log_type, log_timestamp);
+CREATE INDEX /*i*/log_user_text_time ON /*_*/logging (log_user_text, log_timestamp);
+
+INSERT INTO /*_*/logging (log_user,log_page,log_params) VALUES(0,0,'');
+
+ALTER TABLE /*_*/recentchanges ADD CONSTRAINT FK_rc_logid_log_id FOREIGN KEY (rc_logid) REFERENCES /*_*/logging(log_id) ON DELETE CASCADE;
+
+CREATE TABLE /*_*/log_search (
+  -- The type of ID (rev ID, log ID, rev timestamp, username)
+  ls_field nvarchar(32) NOT NULL,
+  -- The value of the ID
+  ls_value nvarchar(255) NOT NULL,
+  -- Key to log_id
+  ls_log_id int REFERENCES /*_*/logging(log_id) ON DELETE CASCADE
+);
+CREATE UNIQUE INDEX /*i*/ls_field_val ON /*_*/log_search (ls_field,ls_value,ls_log_id);
+CREATE INDEX /*i*/ls_log_id ON /*_*/log_search (ls_log_id);
 
 
 -- Jobs performed by parallel apache threads or a command-line daemon
-CREATE TABLE /*$wgDBprefix*/job (
-   job_id INT NOT NULL  PRIMARY KEY,
-   job_cmd NVARCHAR(200)  NOT NULL DEFAULT '',
-   job_namespace INT NOT NULL,
-   job_title NVARCHAR(200)  NOT NULL,
-   job_params NVARCHAR(255)  NOT NULL,
+CREATE TABLE /*_*/job (
+  job_id int NOT NULL PRIMARY KEY IDENTITY,
+
+  -- Command name
+  -- Limited to 60 to prevent key length overflow
+  job_cmd nvarchar(60) NOT NULL default '',
+
+  -- Namespace and title to act on
+  -- Should be 0 and '' if the command does not operate on a title
+  job_namespace int NOT NULL,
+  job_title nvarchar(255) NOT NULL,
+
+  -- Timestamp of when the job was inserted
+  -- NULL for jobs added before addition of the timestamp
+  job_timestamp nvarchar(14) NULL default NULL,
+
+  -- Any other parameters to the command
+  -- Stored as a PHP serialized array, or an empty string if there are no parameters
+  job_params nvarchar(max) NOT NULL,
+
+  -- Random, non-unique, number used for job acquisition (for lock concurrency)
+  job_random int NOT NULL default 0,
+
+  -- The number of times this job has been locked
+  job_attempts int NOT NULL default 0,
+
+  -- Field that conveys process locks on rows via process UUIDs
+  job_token nvarchar(32) NOT NULL default '',
+
+  -- Timestamp when the job was locked
+  job_token_timestamp varchar(14) NULL default NULL,
+
+  -- Base 36 SHA1 of the job parameters relevant to detecting duplicates
+  job_sha1 nvarchar(32) NOT NULL default ''
 );
-CREATE INDEX /*$wgDBprefix*/job_idx ON /*$wgDBprefix*/job(job_cmd,job_namespace,job_title);
+
+CREATE INDEX /*i*/job_sha1 ON /*_*/job (job_sha1);
+CREATE INDEX /*i*/job_cmd_token ON /*_*/job (job_cmd,job_token,job_random);
+CREATE INDEX /*i*/job_cmd_token_id ON /*_*/job (job_cmd,job_token,job_id);
+CREATE INDEX /*i*/job_cmd ON /*_*/job (job_cmd, job_namespace, job_title);
+CREATE INDEX /*i*/job_timestamp ON /*_*/job (job_timestamp);
+
 
 -- Details of updates to cached special pages
-CREATE TABLE /*$wgDBprefix*/querycache_info (
-   qci_type NVARCHAR(32) NOT NULL DEFAULT '' PRIMARY KEY,
-   qci_timestamp NVARCHAR(14) NOT NULL DEFAULT '19700101000000',
+CREATE TABLE /*_*/querycache_info (
+  -- Special page name
+  -- Corresponds to a qc_type value
+  qci_type nvarchar(32) NOT NULL default '',
+
+  -- Timestamp of last update
+  qci_timestamp varchar(14) NOT NULL default ''
 );
 
+CREATE UNIQUE INDEX /*i*/qci_type ON /*_*/querycache_info (qci_type);
+
+
 -- For each redirect, this table contains exactly one row defining its target
-CREATE TABLE /*$wgDBprefix*/redirect (
-       rd_from INT NOT NULL DEFAULT 0 REFERENCES /*$wgDBprefix*/[page](page_id) ON DELETE CASCADE,
-       rd_namespace SMALLINT NOT NULL DEFAULT '0',
-       rd_title NVARCHAR(255)  NOT NULL DEFAULT '',
-       rd_interwiki NVARCHAR(32) DEFAULT NULL,
-       rd_fragment NVARCHAR(255) DEFAULT NULL,
+CREATE TABLE /*_*/redirect (
+  -- Key to the page_id of the redirect page
+  rd_from int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
+
+  -- Key to page_namespace/page_title of the target page.
+  -- The target page may or may not exist, and due to renames
+  -- and deletions may refer to different page records as time
+  -- goes by.
+  rd_namespace int NOT NULL default 0,
+  rd_title nvarchar(255) NOT NULL default '',
+  rd_interwiki nvarchar(32) default NULL,
+  rd_fragment nvarchar(255) default NULL
 );
-CREATE UNIQUE INDEX /*$wgDBprefix*/rd_ns_title ON /*$wgDBprefix*/redirect(rd_namespace,rd_title,rd_from);
+
+CREATE INDEX /*i*/rd_ns_title ON /*_*/redirect (rd_namespace,rd_title,rd_from);
+
 
 -- Used for caching expensive grouped queries that need two links (for example double-redirects)
-CREATE TABLE /*$wgDBprefix*/querycachetwo (
-   qcc_type NCHAR(32) NOT NULL,
-   qcc_value INT NOT NULL DEFAULT 0,
-   qcc_namespace INT NOT NULL DEFAULT 0,
-   qcc_title NCHAR(255)  NOT NULL DEFAULT '',
-   qcc_namespacetwo INT NOT NULL DEFAULT 0,
-   qcc_titletwo NCHAR(255)  NOT NULL DEFAULT '',
-   CONSTRAINT /*$wgDBprefix*/qcc_type PRIMARY KEY(qcc_type,qcc_value),
-);
-CREATE UNIQUE INDEX /*$wgDBprefix*/qcc_title    ON /*$wgDBprefix*/querycachetwo(qcc_type,qcc_namespace,qcc_title);
-CREATE UNIQUE INDEX /*$wgDBprefix*/qcc_titletwo ON /*$wgDBprefix*/querycachetwo(qcc_type,qcc_namespacetwo,qcc_titletwo);
-
-
---- Used for storing page restrictions (i.e. protection levels)
-CREATE TABLE /*$wgDBprefix*/page_restrictions (
-   pr_id INT UNIQUE IDENTITY,
-   pr_page INT NOT NULL REFERENCES /*$wgDBprefix*/page(page_id) ON DELETE CASCADE,
-   pr_type NVARCHAR(200) NOT NULL,
-   pr_level NVARCHAR(200) NOT NULL,
-   pr_cascade SMALLINT NOT NULL,
-   pr_user INT NULL,
-   pr_expiry DATETIME NULL,
-   CONSTRAINT /*$wgDBprefix*/pr_pagetype PRIMARY KEY(pr_page,pr_type),
-);
-CREATE INDEX /*$wgDBprefix*/pr_page      ON /*$wgDBprefix*/page_restrictions(pr_page);
-CREATE INDEX /*$wgDBprefix*/pr_typelevel ON /*$wgDBprefix*/page_restrictions(pr_type,pr_level);
-CREATE INDEX /*$wgDBprefix*/pr_pagelevel ON /*$wgDBprefix*/page_restrictions(pr_level);
-CREATE INDEX /*$wgDBprefix*/pr_cascade   ON /*$wgDBprefix*/page_restrictions(pr_cascade);
-;
+CREATE TABLE /*_*/querycachetwo (
+  -- A key name, generally the base name of of the special page.
+  qcc_type nvarchar(32) NOT NULL,
+
+  -- Some sort of stored value. Sizes, counts...
+  qcc_value int NOT NULL default 0,
+
+  -- Target namespace+title
+  qcc_namespace int NOT NULL default 0,
+  qcc_title nvarchar(255) NOT NULL default '',
+
+  -- Target namespace+title2
+  qcc_namespacetwo int NOT NULL default 0,
+  qcc_titletwo nvarchar(255) NOT NULL default ''
+);
+
+CREATE INDEX /*i*/qcc_type ON /*_*/querycachetwo (qcc_type,qcc_value);
+CREATE INDEX /*i*/qcc_title ON /*_*/querycachetwo (qcc_type,qcc_namespace,qcc_title);
+CREATE INDEX /*i*/qcc_titletwo ON /*_*/querycachetwo (qcc_type,qcc_namespacetwo,qcc_titletwo);
+
+
+-- Used for storing page restrictions (i.e. protection levels)
+CREATE TABLE /*_*/page_restrictions (
+  -- Field for an ID for this restrictions row (sort-key for Special:ProtectedPages)
+  pr_id int NOT NULL PRIMARY KEY IDENTITY,
+  -- Page to apply restrictions to (Foreign Key to page).
+  pr_page int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
+  -- The protection type (edit, move, etc)
+  pr_type nvarchar(60) NOT NULL,
+  -- The protection level (Sysop, autoconfirmed, etc)
+  pr_level nvarchar(60) NOT NULL,
+  -- Whether or not to cascade the protection down to pages transcluded.
+  pr_cascade bit NOT NULL,
+  -- Field for future support of per-user restriction.
+  pr_user int NULL,
+  -- Field for time-limited protection.
+  pr_expiry varchar(14) NULL
+);
+
+CREATE UNIQUE INDEX /*i*/pr_pagetype ON /*_*/page_restrictions (pr_page,pr_type);
+CREATE INDEX /*i*/pr_typelevel ON /*_*/page_restrictions (pr_type,pr_level);
+CREATE INDEX /*i*/pr_level ON /*_*/page_restrictions (pr_level);
+CREATE INDEX /*i*/pr_cascade ON /*_*/page_restrictions (pr_cascade);
+
 
 -- Protected titles - nonexistent pages that have been protected
-CREATE TABLE /*$wgDBprefix*/protected_titles (
+CREATE TABLE /*_*/protected_titles (
   pt_namespace int NOT NULL,
-  pt_title NVARCHAR(255) NOT NULL,
-  pt_user int NOT NULL,
-  pt_reason NVARCHAR(3555),
-  pt_timestamp DATETIME NOT NULL,
-  pt_expiry DATETIME NOT NULL default '',
-  pt_create_perm NVARCHAR(60) NOT NULL,
-  PRIMARY KEY (pt_namespace,pt_title),
+  pt_title nvarchar(255) NOT NULL,
+  pt_user int REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
+  pt_reason nvarchar(255),
+  pt_timestamp varchar(14) NOT NULL,
+  pt_expiry varchar(14) NOT NULL,
+  pt_create_perm nvarchar(60) NOT NULL
 );
-CREATE INDEX /*$wgDBprefix*/pt_timestamp   ON /*$wgDBprefix*/protected_titles(pt_timestamp);
-;
+
+CREATE UNIQUE INDEX /*i*/pt_namespace_title ON /*_*/protected_titles (pt_namespace,pt_title);
+CREATE INDEX /*i*/pt_timestamp ON /*_*/protected_titles (pt_timestamp);
+
 
 -- Name/value pairs indexed by page_id
-CREATE TABLE /*$wgDBprefix*/page_props (
-  pp_page int NOT NULL,
-  pp_propname NVARCHAR(60) NOT NULL,
-  pp_value NVARCHAR(MAX) NOT NULL,
-  PRIMARY KEY (pp_page,pp_propname)
+CREATE TABLE /*_*/page_props (
+  pp_page int NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
+  pp_propname nvarchar(60) NOT NULL,
+  pp_value nvarchar(max) NOT NULL
 );
 
+CREATE UNIQUE INDEX /*i*/pp_page_propname ON /*_*/page_props (pp_page,pp_propname);
+CREATE UNIQUE INDEX /*i*/pp_propname_page ON /*_*/page_props (pp_propname,pp_page);
+
+
 -- A table to log updates, one text key row per update.
-CREATE TABLE /*$wgDBprefix*/updatelog (
-  ul_key NVARCHAR(255) NOT NULL,
-  PRIMARY KEY (ul_key)
+CREATE TABLE /*_*/updatelog (
+  ul_key nvarchar(255) NOT NULL PRIMARY KEY,
+  ul_value nvarchar(max)
 );
 
--- NOTE To enable full text indexing on SQL 2008 you need to create an account FDH$MSSQLSERVER
--- AND assign a password for the FDHOST process to run under
--- Once you have assigned a password to that account, you need to run the following stored procedure
--- replacing XXXXX with the password you used.
--- EXEC sp_fulltext_resetfdhostaccount @username = 'FDH$MSSQLSERVER', @password = 'XXXXXX' ;
 
+-- A table to track tags for revisions, logs and recent changes.
+CREATE TABLE /*_*/change_tag (
+  -- RCID for the change
+  ct_rc_id int NULL REFERENCES /*_*/recentchanges(rc_id),
+  -- LOGID for the change
+  ct_log_id int NULL REFERENCES /*_*/logging(log_id),
+  -- REVID for the change
+  ct_rev_id int NULL REFERENCES /*_*/revision(rev_id),
+  -- Tag applied
+  ct_tag nvarchar(255) NOT NULL,
+  -- Parameters for the tag, presently unused
+  ct_params nvarchar(max) NULL
+);
+
+CREATE UNIQUE INDEX /*i*/change_tag_rc_tag ON /*_*/change_tag (ct_rc_id,ct_tag);
+CREATE UNIQUE INDEX /*i*/change_tag_log_tag ON /*_*/change_tag (ct_log_id,ct_tag);
+CREATE UNIQUE INDEX /*i*/change_tag_rev_tag ON /*_*/change_tag (ct_rev_id,ct_tag);
+-- Covering index, so we can pull all the info only out of the index.
+CREATE INDEX /*i*/change_tag_tag_id ON /*_*/change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
+
+
+-- Rollup table to pull a LIST of tags simply without ugly GROUP_CONCAT
+-- that only works on MySQL 4.1+
+CREATE TABLE /*_*/tag_summary (
+  -- RCID for the change
+  ts_rc_id int NULL REFERENCES /*_*/recentchanges(rc_id),
+  -- LOGID for the change
+  ts_log_id int NULL REFERENCES /*_*/logging(log_id),
+  -- REVID for the change
+  ts_rev_id int NULL REFERENCES /*_*/revision(rev_id),
+  -- Comma-separated list of tags
+  ts_tags nvarchar(max) NOT NULL
+);
+
+CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
+CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
+CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
+
+
+CREATE TABLE /*_*/valid_tag (
+  vt_tag nvarchar(255) NOT NULL PRIMARY KEY
+);
+
+-- Table for storing localisation data
+CREATE TABLE /*_*/l10n_cache (
+  -- Language code
+  lc_lang nvarchar(32) NOT NULL,
+  -- Cache key
+  lc_key nvarchar(255) NOT NULL,
+  -- Value
+  lc_value varbinary(max) NOT NULL
+);
+CREATE INDEX /*i*/lc_lang_key ON /*_*/l10n_cache (lc_lang, lc_key);
+
+-- Table for caching JSON message texts for the resource loader
+CREATE TABLE /*_*/msg_resource (
+  -- Resource name
+  mr_resource nvarchar(255) NOT NULL,
+  -- Language code
+  mr_lang nvarchar(32) NOT NULL,
+  -- JSON blob
+  mr_blob varbinary(max) NOT NULL,
+  -- Timestamp of last update
+  mr_timestamp varchar(14) NOT NULL
+);
+CREATE UNIQUE INDEX /*i*/mr_resource_lang ON /*_*/msg_resource (mr_resource, mr_lang);
+
+-- Table for administering which message is contained in which resource
+CREATE TABLE /*_*/msg_resource_links (
+  mrl_resource varbinary(255) NOT NULL,
+  -- Message key
+  mrl_message varbinary(255) NOT NULL
+);
+CREATE UNIQUE INDEX /*i*/mrl_message_resource ON /*_*/msg_resource_links (mrl_message, mrl_resource);
+
+-- Table caching which local files a module depends on that aren't
+-- registered directly, used for fast retrieval of file dependency.
+-- Currently only used for tracking images that CSS depends on
+CREATE TABLE /*_*/module_deps (
+  -- Module name
+  md_module nvarchar(255) NOT NULL,
+  -- Skin name
+  md_skin nvarchar(32) NOT NULL,
+  -- JSON nvarchar(max) with file dependencies
+  md_deps nvarchar(max) NOT NULL
+);
+CREATE UNIQUE INDEX /*i*/md_module_skin ON /*_*/module_deps (md_module, md_skin);
+
+-- Holds all the sites known to the wiki.
+CREATE TABLE /*_*/sites (
+  -- Numeric id of the site
+  site_id                    int        NOT NULL PRIMARY KEY IDENTITY,
+
+  -- Global identifier for the site, ie 'enwiktionary'
+  site_global_key            nvarchar(32)       NOT NULL,
+
+  -- Type of the site, ie 'mediawiki'
+  site_type                  nvarchar(32)       NOT NULL,
+
+  -- Group of the site, ie 'wikipedia'
+  site_group                 nvarchar(32)       NOT NULL,
+
+  -- Source of the site data, ie 'local', 'wikidata', 'my-magical-repo'
+  site_source                nvarchar(32)       NOT NULL,
+
+  -- Language code of the sites primary language.
+  site_language              nvarchar(32)       NOT NULL,
+
+  -- Protocol of the site, ie 'http://', 'irc://', '//'
+  -- This field is an index for lookups and is build from type specific data in site_data.
+  site_protocol              nvarchar(32)       NOT NULL,
+
+  -- Domain of the site in reverse order, ie 'org.mediawiki.www.'
+  -- This field is an index for lookups and is build from type specific data in site_data.
+  site_domain                NVARCHAR(255)        NOT NULL,
+
+  -- Type dependent site data.
+  site_data                  nvarchar(max)                NOT NULL,
+
+  -- If site.tld/path/key:pageTitle should forward users to  the page on
+  -- the actual site, where "key" is the local identifier.
+  site_forward              bit                NOT NULL,
+
+  -- Type dependent site config.
+  -- For instance if template transclusion should be allowed if it's a MediaWiki.
+  site_config               nvarchar(max)                NOT NULL
+);
+
+CREATE UNIQUE INDEX /*i*/sites_global_key ON /*_*/sites (site_global_key);
+CREATE INDEX /*i*/sites_type ON /*_*/sites (site_type);
+CREATE INDEX /*i*/sites_group ON /*_*/sites (site_group);
+CREATE INDEX /*i*/sites_source ON /*_*/sites (site_source);
+CREATE INDEX /*i*/sites_language ON /*_*/sites (site_language);
+CREATE INDEX /*i*/sites_protocol ON /*_*/sites (site_protocol);
+CREATE INDEX /*i*/sites_domain ON /*_*/sites (site_domain);
+CREATE INDEX /*i*/sites_forward ON /*_*/sites (site_forward);
+
+-- Links local site identifiers to their corresponding site.
+CREATE TABLE /*_*/site_identifiers (
+  -- Key on site.site_id
+  si_site                    int        NOT NULL REFERENCES /*_*/sites(site_id) ON DELETE CASCADE,
+
+  -- local key type, ie 'interwiki' or 'langlink'
+  si_type                    nvarchar(32)       NOT NULL,
+
+  -- local key value, ie 'en' or 'wiktionary'
+  si_key                     nvarchar(32)       NOT NULL
+);
 
---- Add the full-text capabilities, depricated in SQL Server 2005, FTS is enabled on all user created tables by default unless you are using SQL Server 2005 Express
---sp_fulltext_database 'enable';
---sp_fulltext_catalog 'WikiCatalog', 'create'
---sp_fulltext_table
---sp_fulltext_column
---sp_fulltext_table 'Articles', 'activate'
+CREATE UNIQUE INDEX /*i*/site_ids_type ON /*_*/site_identifiers (si_type, si_key);
+CREATE INDEX /*i*/site_ids_site ON /*_*/site_identifiers (si_site);
+CREATE INDEX /*i*/site_ids_key ON /*_*/site_identifiers (si_key);
index 93e931c..3aa8109 100644 (file)
@@ -377,6 +377,7 @@ CREATE TABLE uploadstash (
   us_key          TEXT,
   us_orig_path    TEXT,
   us_path         TEXT,
+  us_props        BYTEA,
   us_source_type  TEXT,
   us_timestamp    TIMESTAMPTZ,
   us_status       TEXT,
index 40c6951..c5ade2d 100644 (file)
@@ -34,19 +34,18 @@ class UpdateSpecialPages extends Maintenance {
                parent::__construct();
                $this->addOption( 'list', 'List special page names' );
                $this->addOption( 'only', 'Only update "page"; case sensitive, ' .
-               'check correct case by calling this script with --list or on ' .
-               'includes/QueryPage.php. Ex: --only=BrokenRedirects', false, true );
+                       'check correct case by calling this script with --list or on ' .
+                       'includes/QueryPage.php. Ex: --only=BrokenRedirects', false, true );
                $this->addOption( 'override', 'Also update pages that have updates disabled' );
        }
 
        public function execute() {
                global $IP, $wgQueryPages, $wgQueryCacheLimit, $wgDisableQueryPageUpdate;
 
-               if ( !$this->hasOption( 'list' ) && !$this->hasOption( 'only' ) ) {
-                       $this->doSpecialPageCacheUpdates();
-               }
                $dbw = wfGetDB( DB_MASTER );
 
+               $this->doSpecialPageCacheUpdates( $dbw );
+
                // This is needed to initialise $wgQueryPages
                require_once "$IP/includes/QueryPage.php";
 
@@ -56,12 +55,14 @@ class UpdateSpecialPages extends Maintenance {
 
                        # --list : just show the name of pages
                        if ( $this->hasOption( 'list' ) ) {
-                               $this->output( "$special\n" );
+                               $this->output( "$special [QueryPage]\n" );
                                continue;
                        }
 
-                       if ( !$this->hasOption( 'override' ) && $wgDisableQueryPageUpdate && in_array( $special, $wgDisableQueryPageUpdate ) ) {
-                               $this->output( sprintf( "%-30s disabled\n", $special ) );
+                       if ( !$this->hasOption( 'override' )
+                               && $wgDisableQueryPageUpdate && in_array( $special, $wgDisableQueryPageUpdate ) )
+                       {
+                               $this->output( sprintf( "%-30s [QueryPage] disabled\n", $special ) );
                                continue;
                        }
 
@@ -81,7 +82,7 @@ class UpdateSpecialPages extends Maintenance {
                        }
 
                        if ( !$this->hasOption( 'only' ) || $this->getOption( 'only' ) == $queryPage->getName() ) {
-                               $this->output( sprintf( '%-30s ', $special ) );
+                               $this->output( sprintf( '%-30s [QueryPage] ', $special ) );
                                if ( $queryPage->isExpensive() ) {
                                        $t1 = explode( ' ', microtime() );
                                        # Do the query
@@ -125,32 +126,41 @@ class UpdateSpecialPages extends Maintenance {
                }
        }
 
-       public function doSpecialPageCacheUpdates() {
+       public function doSpecialPageCacheUpdates( $dbw ) {
                global $wgSpecialPageCacheUpdates;
-               $dbw = wfGetDB( DB_MASTER );
 
                foreach ( $wgSpecialPageCacheUpdates as $special => $call ) {
-                       if ( !is_callable( $call ) ) {
-                               $this->error( "Uncallable function $call!" );
+                       # --list : just show the name of pages
+                       if ( $this->hasOption( 'list' ) ) {
+                               $this->output( "$special [callback]\n" );
                                continue;
                        }
-                       $this->output( sprintf( '%-30s ', $special ) );
-                       $t1 = explode( ' ', microtime() );
-                       call_user_func( $call, $dbw );
-                       $t2 = explode( ' ', microtime() );
-                       $elapsed = ( $t2[0] - $t1[0] ) + ( $t2[1] - $t1[1] );
-                       $hours = intval( $elapsed / 3600 );
-                       $minutes = intval( $elapsed % 3600 / 60 );
-                       $seconds = $elapsed - $hours * 3600 - $minutes * 60;
-                       if ( $hours ) {
-                               $this->output( $hours . 'h ' );
-                       }
-                       if ( $minutes ) {
-                               $this->output( $minutes . 'm ' );
+
+                       if ( !$this->hasOption( 'only' ) || $this->getOption( 'only' ) == $special ) {
+                               if ( !is_callable( $call ) ) {
+                                       $this->error( "Uncallable function $call!" );
+                                       continue;
+                               }
+                               $this->output( sprintf( '%-30s [callback] ', $special ) );
+                               $t1 = explode( ' ', microtime() );
+                               call_user_func( $call, $dbw );
+                               $t2 = explode( ' ', microtime() );
+
+                               $this->output( "completed in " );
+                               $elapsed = ( $t2[0] - $t1[0] ) + ( $t2[1] - $t1[1] );
+                               $hours = intval( $elapsed / 3600 );
+                               $minutes = intval( $elapsed % 3600 / 60 );
+                               $seconds = $elapsed - $hours * 3600 - $minutes * 60;
+                               if ( $hours ) {
+                                       $this->output( $hours . 'h ' );
+                               }
+                               if ( $minutes ) {
+                                       $this->output( $minutes . 'm ' );
+                               }
+                               $this->output( sprintf( "%.2fs\n", $seconds ) );
+                               # Wait for the slave to catch up
+                               wfWaitForSlaves();
                        }
-                       $this->output( sprintf( "completed in %.2fs\n", $seconds ) );
-                       # Wait for the slave to catch up
-                       wfWaitForSlaves();
                }
        }
 }
index 8a13440..7f5b75a 100644 (file)
@@ -129,28 +129,6 @@ return array(
                'remoteBasePath' => $GLOBALS['wgStylePath'],
                'localBasePath' => $GLOBALS['wgStyleDirectory'],
        ),
-       // FIXME: Remove in favour of skins.monobook.styles when cache expires
-       'skins.monobook' => array(
-               'styles' => array(
-                       'common/commonElements.css' => array( 'media' => 'screen' ),
-                       'common/commonContent.css' => array( 'media' => 'screen' ),
-                       'common/commonInterface.css' => array( 'media' => 'screen' ),
-                       'monobook/main.css' => array( 'media' => 'screen' ),
-               ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-       // FIXME: Remove in favour of skins.vector.styles when cache expires
-       'skins.vector' => array(
-               'styles' => array(
-                       'common/commonElements.css' => array( 'media' => 'screen' ),
-                       'common/commonContent.css' => array( 'media' => 'screen' ),
-                       'common/commonInterface.css' => array( 'media' => 'screen' ),
-                       'vector/styles.less',
-               ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
        'skins.vector.styles' => array(
                // Used in the web installer. Test it after modifying this definition!
                'styles' => array(
@@ -361,6 +339,9 @@ return array(
                'scripts' => 'resources/jquery/jquery.textSelection.js',
                'dependencies' => 'jquery.client',
        ),
+       'jquery.throttle-debounce' => array(
+               'scripts' => 'resources/jquery/jquery.ba-throttle-debounce.js',
+       ),
        'jquery.validate' => array(
                'scripts' => 'resources/jquery/jquery.validate.js',
        ),
@@ -658,6 +639,81 @@ return array(
                'group' => 'jquery.ui',
        ),
 
+       /* Moment.js */
+
+       'moment' => array(
+               'scripts' => 'resources/moment/moment.js',
+               'languageScripts' => array(
+                       'ar-ma' => 'resources/moment/lang/ar-ma.js',
+                       'ar' => 'resources/moment/lang/ar.js',
+                       'bg' => 'resources/moment/lang/bg.js',
+                       'br' => 'resources/moment/lang/br.js',
+                       'bs' => 'resources/moment/lang/bs.js',
+                       'ca' => 'resources/moment/lang/ca.js',
+                       'cs' => 'resources/moment/lang/cs.js',
+                       'cv' => 'resources/moment/lang/cv.js',
+                       'cy' => 'resources/moment/lang/cy.js',
+                       'da' => 'resources/moment/lang/da.js',
+                       'de' => 'resources/moment/lang/de.js',
+                       'el' => 'resources/moment/lang/el.js',
+                       'en-au' => 'resources/moment/lang/en-au.js',
+                       'en-ca' => 'resources/moment/lang/en-ca.js',
+                       'en-gb' => 'resources/moment/lang/en-gb.js',
+                       'eo' => 'resources/moment/lang/eo.js',
+                       'es' => 'resources/moment/lang/es.js',
+                       'et' => 'resources/moment/lang/et.js',
+                       'eu' => 'resources/moment/lang/eu.js',
+                       'fa' => 'resources/moment/lang/fa.js',
+                       'fi' => 'resources/moment/lang/fi.js',
+                       'fo' => 'resources/moment/lang/fo.js',
+                       'fr-ca' => 'resources/moment/lang/fr-ca.js',
+                       'fr' => 'resources/moment/lang/fr.js',
+                       'gl' => 'resources/moment/lang/gl.js',
+                       'he' => 'resources/moment/lang/he.js',
+                       'hi' => 'resources/moment/lang/hi.js',
+                       'hr' => 'resources/moment/lang/hr.js',
+                       'hu' => 'resources/moment/lang/hu.js',
+                       'hy-am' => 'resources/moment/lang/hy-am.js',
+                       'id' => 'resources/moment/lang/id.js',
+                       'is' => 'resources/moment/lang/is.js',
+                       'it' => 'resources/moment/lang/it.js',
+                       'ja' => 'resources/moment/lang/ja.js',
+                       'ka' => 'resources/moment/lang/ka.js',
+                       'ko' => 'resources/moment/lang/ko.js',
+                       'lt' => 'resources/moment/lang/lt.js',
+                       'lv' => 'resources/moment/lang/lv.js',
+                       'mk' => 'resources/moment/lang/mk.js',
+                       'ml' => 'resources/moment/lang/ml.js',
+                       'mr' => 'resources/moment/lang/mr.js',
+                       'ms-my' => 'resources/moment/lang/ms-my.js',
+                       'nb' => 'resources/moment/lang/nb.js',
+                       'ne' => 'resources/moment/lang/ne.js',
+                       'nl' => 'resources/moment/lang/nl.js',
+                       'nn' => 'resources/moment/lang/nn.js',
+                       'pl' => 'resources/moment/lang/pl.js',
+                       'pt-br' => 'resources/moment/lang/pt-br.js',
+                       'pt' => 'resources/moment/lang/pt.js',
+                       'ro' => 'resources/moment/lang/ro.js',
+                       'rs' => 'resources/moment/lang/rs.js',
+                       'ru' => 'resources/moment/lang/ru.js',
+                       'sk' => 'resources/moment/lang/sk.js',
+                       'sl' => 'resources/moment/lang/sl.js',
+                       'sq' => 'resources/moment/lang/sq.js',
+                       'sv' => 'resources/moment/lang/sv.js',
+                       'ta' => 'resources/moment/lang/ta.js',
+                       'th' => 'resources/moment/lang/th.js',
+                       'tl-ph' => 'resources/moment/lang/tl-ph.js',
+                       'tr' => 'resources/moment/lang/tr.js',
+                       'tzm-la' => 'resources/moment/lang/tzm-la.js',
+                       'tzm' => 'resources/moment/lang/tzm.js',
+                       'uk' => 'resources/moment/lang/uk.js',
+                       'uz' => 'resources/moment/lang/uz.js',
+                       'vn' => 'resources/moment/lang/vn.js',
+                       'zh-cn' => 'resources/moment/lang/zh-cn.js',
+                       'zh-tw' => 'resources/moment/lang/zh-tw.js',
+               ),
+       ),
+
        /* MediaWiki */
 
        'mediawiki' => array(
@@ -770,7 +826,10 @@ return array(
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.notification' => array(
-               'styles' => 'resources/mediawiki/mediawiki.notification.css',
+               'styles' => array(
+                       'resources/mediawiki/mediawiki.notification.css',
+                       'resources/mediawiki/mediawiki.notification.hideForPrint.css' => array( 'media' => 'print' ),
+               ),
                'scripts' => 'resources/mediawiki/mediawiki.notification.js',
                'dependencies' => array(
                        'mediawiki.page.startup',
@@ -804,6 +863,14 @@ return array(
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'mediawiki.toc' => array(
+               'scripts' => 'resources/mediawiki/mediawiki.toc.js',
+               'dependencies' => array(
+                       'jquery.cookie',
+               ),
+               'messages' => array( 'showtoc', 'hidetoc' ),
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
        'mediawiki.Uri' => array(
                'scripts' => 'resources/mediawiki/mediawiki.Uri.js',
                'targets' => array( 'desktop', 'mobile' ),
@@ -822,11 +889,10 @@ return array(
                'scripts' => 'resources/mediawiki/mediawiki.util.js',
                'dependencies' => array(
                        'jquery.client',
-                       'jquery.cookie',
                        'jquery.mwExtension',
                        'mediawiki.notify',
+                       'mediawiki.toc',
                ),
-               'messages' => array( 'showtoc', 'hidetoc' ),
                'position' => 'top', // For $wgPreloadJavaScriptMwUtil
                'targets' => array( 'desktop', 'mobile' ),
        ),
@@ -909,8 +975,12 @@ return array(
        ),
        'mediawiki.action.edit.editWarning' => array(
                'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.editWarning.js',
+               'dependencies' => array(
+                       'mediawiki.jqueryMsg'
+               ),
                'messages' => array(
                        'editwarning-warning',
+                       'prefs-editing'
                ),
        ),
        // Alias for backwards compatibility
@@ -1198,21 +1268,6 @@ return array(
                'styles' => 'resources/mediawiki.special/mediawiki.special.version.css',
        ),
 
-       /* MediaWiki Tests */
-
-       'mediawiki.tests.qunit.testrunner' => array(
-               'scripts' => 'tests/qunit/data/testrunner.js',
-               'dependencies' => array(
-                       'jquery.getAttrs',
-                       'jquery.qunit',
-                       'jquery.qunit.completenessTest',
-                       'mediawiki.page.startup',
-                       'mediawiki.page.ready',
-               ),
-               'position' => 'top',
-               'targets' => array( 'desktop', 'mobile' ),
-       ),
-
        /* MediaWiki Legacy */
 
        'mediawiki.legacy.ajax' => array(
@@ -1296,8 +1351,8 @@ return array(
                'targets' => array( 'desktop', 'mobile' ),
        ),
 
-       /* OOJS */
-       // WARNING: oojs is NOT COMPATIBLE with older browsers and
+       /* OOjs */
+       // WARNING: OOjs and OOjs-UI are NOT COMPATIBLE with older browsers and
        // WILL BREAK if loaded in browsers that don't support ES5
        'oojs' => array(
                'scripts' => array(
@@ -1305,4 +1360,23 @@ return array(
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
+
+       'oojs-ui' => array(
+               'scripts' => array(
+                       'resources/oojs-ui/oojs-ui.js',
+               ),
+               'styles' => array(
+                       'resources/oojs-ui/oojs-ui.svg.css',
+               ),
+               'messages' => array(
+                       'ooui-dialog-action-close',
+                       'ooui-outline-control-move-down',
+                       'ooui-outline-control-move-up',
+                       'ooui-toolbar-more',
+               ),
+               'dependencies' => array(
+                       'oojs',
+               ),
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
 );
index a9fcec8..6e47c60 100644 (file)
@@ -33,6 +33,9 @@
                 
                 $tip.find('.tipsy-inner')[this.options.html ? 'html' : 'text'](title);
                 $tip[0].className = 'tipsy'; // reset classname in case of dynamic gravity
+                if (this.options.className) {
+                    $tip.addClass(maybeCall(this.options.className, this.$element[0]));
+                }
                 $tip.remove().css({top: 0, left: 0, visibility: 'hidden', display: 'block'}).appendTo(document.body);
                 
                 var pos = $.extend({}, this.$element.offset(), {
@@ -78,9 +81,6 @@
                 }
                 
                 $tip.css(tp).addClass('tipsy-' + gravity);
-                if (this.options.className) {
-                    $tip.addClass(maybeCall(this.options.className, this.$element[0]));
-                }
                 
                 if (this.options.fade) {
                     $tip.stop().css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: this.options.opacity}, 100);
         getTitle: function() {
             var title, $e = this.$element, o = this.options;
             fixTitle($e);
-            var title, o = this.options;
             if (typeof o.title == 'string') {
                 title = $e.attr(o.title == 'title' ? 'original-title' : o.title);
             } else if (typeof o.title == 'function') {
diff --git a/resources/jquery/jquery.ba-throttle-debounce.js b/resources/jquery/jquery.ba-throttle-debounce.js
new file mode 100644 (file)
index 0000000..fa30bdf
--- /dev/null
@@ -0,0 +1,252 @@
+/*!
+ * jQuery throttle / debounce - v1.1 - 3/7/2010
+ * http://benalman.com/projects/jquery-throttle-debounce-plugin/
+ * 
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+
+// Script: jQuery throttle / debounce: Sometimes, less is more!
+//
+// *Version: 1.1, Last updated: 3/7/2010*
+// 
+// Project Home - http://benalman.com/projects/jquery-throttle-debounce-plugin/
+// GitHub       - http://github.com/cowboy/jquery-throttle-debounce/
+// Source       - http://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.js
+// (Minified)   - http://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.min.js (0.7kb)
+// 
+// About: License
+// 
+// Copyright (c) 2010 "Cowboy" Ben Alman,
+// Dual licensed under the MIT and GPL licenses.
+// http://benalman.com/about/license/
+// 
+// About: Examples
+// 
+// These working examples, complete with fully commented code, illustrate a few
+// ways in which this plugin can be used.
+// 
+// Throttle - http://benalman.com/code/projects/jquery-throttle-debounce/examples/throttle/
+// Debounce - http://benalman.com/code/projects/jquery-throttle-debounce/examples/debounce/
+// 
+// About: Support and Testing
+// 
+// Information about what version or versions of jQuery this plugin has been
+// tested with, what browsers it has been tested in, and where the unit tests
+// reside (so you can test it yourself).
+// 
+// jQuery Versions - none, 1.3.2, 1.4.2
+// Browsers Tested - Internet Explorer 6-8, Firefox 2-3.6, Safari 3-4, Chrome 4-5, Opera 9.6-10.1.
+// Unit Tests      - http://benalman.com/code/projects/jquery-throttle-debounce/unit/
+// 
+// About: Release History
+// 
+// 1.1 - (3/7/2010) Fixed a bug in <jQuery.throttle> where trailing callbacks
+//       executed later than they should. Reworked a fair amount of internal
+//       logic as well.
+// 1.0 - (3/6/2010) Initial release as a stand-alone project. Migrated over
+//       from jquery-misc repo v0.4 to jquery-throttle repo v1.0, added the
+//       no_trailing throttle parameter and debounce functionality.
+// 
+// Topic: Note for non-jQuery users
+// 
+// jQuery isn't actually required for this plugin, because nothing internal
+// uses any jQuery methods or properties. jQuery is just used as a namespace
+// under which these methods can exist.
+// 
+// Since jQuery isn't actually required for this plugin, if jQuery doesn't exist
+// when this plugin is loaded, the method described below will be created in
+// the `Cowboy` namespace. Usage will be exactly the same, but instead of
+// $.method() or jQuery.method(), you'll need to use Cowboy.method().
+
+(function(window,undefined){
+  '$:nomunge'; // Used by YUI compressor.
+  
+  // Since jQuery really isn't required for this plugin, use `jQuery` as the
+  // namespace only if it already exists, otherwise use the `Cowboy` namespace,
+  // creating it if necessary.
+  var $ = window.jQuery || window.Cowboy || ( window.Cowboy = {} ),
+    
+    // Internal method reference.
+    jq_throttle;
+  
+  // Method: jQuery.throttle
+  // 
+  // Throttle execution of a function. Especially useful for rate limiting
+  // execution of handlers on events like resize and scroll. If you want to
+  // rate-limit execution of a function to a single time, see the
+  // <jQuery.debounce> method.
+  // 
+  // In this visualization, | is a throttled-function call and X is the actual
+  // callback execution:
+  // 
+  // > Throttled with `no_trailing` specified as false or unspecified:
+  // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
+  // > X    X    X    X    X    X        X    X    X    X    X    X
+  // > 
+  // > Throttled with `no_trailing` specified as true:
+  // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
+  // > X    X    X    X    X             X    X    X    X    X
+  // 
+  // Usage:
+  // 
+  // > var throttled = jQuery.throttle( delay, [ no_trailing, ] callback );
+  // > 
+  // > jQuery('selector').bind( 'someevent', throttled );
+  // > jQuery('selector').unbind( 'someevent', throttled );
+  // 
+  // This also works in jQuery 1.4+:
+  // 
+  // > jQuery('selector').bind( 'someevent', jQuery.throttle( delay, [ no_trailing, ] callback ) );
+  // > jQuery('selector').unbind( 'someevent', callback );
+  // 
+  // Arguments:
+  // 
+  //  delay - (Number) A zero-or-greater delay in milliseconds. For event
+  //    callbacks, values around 100 or 250 (or even higher) are most useful.
+  //  no_trailing - (Boolean) Optional, defaults to false. If no_trailing is
+  //    true, callback will only execute every `delay` milliseconds while the
+  //    throttled-function is being called. If no_trailing is false or
+  //    unspecified, callback will be executed one final time after the last
+  //    throttled-function call. (After the throttled-function has not been
+  //    called for `delay` milliseconds, the internal counter is reset)
+  //  callback - (Function) A function to be executed after delay milliseconds.
+  //    The `this` context and all arguments are passed through, as-is, to
+  //    `callback` when the throttled-function is executed.
+  // 
+  // Returns:
+  // 
+  //  (Function) A new, throttled, function.
+  
+  $.throttle = jq_throttle = function( delay, no_trailing, callback, debounce_mode ) {
+    // After wrapper has stopped being called, this timeout ensures that
+    // `callback` is executed at the proper times in `throttle` and `end`
+    // debounce modes.
+    var timeout_id,
+      
+      // Keep track of the last time `callback` was executed.
+      last_exec = 0;
+    
+    // `no_trailing` defaults to falsy.
+    if ( typeof no_trailing !== 'boolean' ) {
+      debounce_mode = callback;
+      callback = no_trailing;
+      no_trailing = undefined;
+    }
+    
+    // The `wrapper` function encapsulates all of the throttling / debouncing
+    // functionality and when executed will limit the rate at which `callback`
+    // is executed.
+    function wrapper() {
+      var that = this,
+        elapsed = +new Date() - last_exec,
+        args = arguments;
+      
+      // Execute `callback` and update the `last_exec` timestamp.
+      function exec() {
+        last_exec = +new Date();
+        callback.apply( that, args );
+      };
+      
+      // If `debounce_mode` is true (at_begin) this is used to clear the flag
+      // to allow future `callback` executions.
+      function clear() {
+        timeout_id = undefined;
+      };
+      
+      if ( debounce_mode && !timeout_id ) {
+        // Since `wrapper` is being called for the first time and
+        // `debounce_mode` is true (at_begin), execute `callback`.
+        exec();
+      }
+      
+      // Clear any existing timeout.
+      timeout_id && clearTimeout( timeout_id );
+      
+      if ( debounce_mode === undefined && elapsed > delay ) {
+        // In throttle mode, if `delay` time has been exceeded, execute
+        // `callback`.
+        exec();
+        
+      } else if ( no_trailing !== true ) {
+        // In trailing throttle mode, since `delay` time has not been
+        // exceeded, schedule `callback` to execute `delay` ms after most
+        // recent execution.
+        // 
+        // If `debounce_mode` is true (at_begin), schedule `clear` to execute
+        // after `delay` ms.
+        // 
+        // If `debounce_mode` is false (at end), schedule `callback` to
+        // execute after `delay` ms.
+        timeout_id = setTimeout( debounce_mode ? clear : exec, debounce_mode === undefined ? delay - elapsed : delay );
+      }
+    };
+    
+    // Set the guid of `wrapper` function to the same of original callback, so
+    // it can be removed in jQuery 1.4+ .unbind or .die by using the original
+    // callback as a reference.
+    if ( $.guid ) {
+      wrapper.guid = callback.guid = callback.guid || $.guid++;
+    }
+    
+    // Return the wrapper function.
+    return wrapper;
+  };
+  
+  // Method: jQuery.debounce
+  // 
+  // Debounce execution of a function. Debouncing, unlike throttling,
+  // guarantees that a function is only executed a single time, either at the
+  // very beginning of a series of calls, or at the very end. If you want to
+  // simply rate-limit execution of a function, see the <jQuery.throttle>
+  // method.
+  // 
+  // In this visualization, | is a debounced-function call and X is the actual
+  // callback execution:
+  // 
+  // > Debounced with `at_begin` specified as false or unspecified:
+  // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
+  // >                          X                                 X
+  // > 
+  // > Debounced with `at_begin` specified as true:
+  // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
+  // > X                                 X
+  // 
+  // Usage:
+  // 
+  // > var debounced = jQuery.debounce( delay, [ at_begin, ] callback );
+  // > 
+  // > jQuery('selector').bind( 'someevent', debounced );
+  // > jQuery('selector').unbind( 'someevent', debounced );
+  // 
+  // This also works in jQuery 1.4+:
+  // 
+  // > jQuery('selector').bind( 'someevent', jQuery.debounce( delay, [ at_begin, ] callback ) );
+  // > jQuery('selector').unbind( 'someevent', callback );
+  // 
+  // Arguments:
+  // 
+  //  delay - (Number) A zero-or-greater delay in milliseconds. For event
+  //    callbacks, values around 100 or 250 (or even higher) are most useful.
+  //  at_begin - (Boolean) Optional, defaults to false. If at_begin is false or
+  //    unspecified, callback will only be executed `delay` milliseconds after
+  //    the last debounced-function call. If at_begin is true, callback will be
+  //    executed only at the first debounced-function call. (After the
+  //    throttled-function has not been called for `delay` milliseconds, the
+  //    internal counter is reset)
+  //  callback - (Function) A function to be executed after delay milliseconds.
+  //    The `this` context and all arguments are passed through, as-is, to
+  //    `callback` when the debounced-function is executed.
+  // 
+  // Returns:
+  // 
+  //  (Function) A new, debounced, function.
+  
+  $.debounce = function( delay, at_begin, callback ) {
+    return callback === undefined
+      ? jq_throttle( delay, at_begin, false )
+      : jq_throttle( delay, callback, at_begin !== false );
+  };
+  
+})(this);
index f35782b..4c6a7ac 100644 (file)
                        if ( nav === undefined ) {
                                nav = window.navigator;
                        }
+
                        // Use the cached version if possible
-                       if ( profileCache[nav.userAgent] === undefined ) {
+                       if ( profileCache[ nav.userAgent + '|' + nav.platform ] !== undefined ) {
+                               return profileCache[ nav.userAgent + '|' + nav.platform ];
+                       }
 
-                               var
-                                       versionNumber,
+                       var
+                               versionNumber,
+                               key = nav.userAgent + '|' + nav.platform,
 
-                                       /* Configuration */
+                               /* Configuration */
 
-                                       // Name of browsers or layout engines we don't recognize
-                                       uk = 'unknown',
-                                       // Generic version digit
-                                       x = 'x',
-                                       // Strings found in user agent strings that need to be conformed
-                                       wildUserAgents = ['Opera', 'Navigator', 'Minefield', 'KHTML', 'Chrome', 'PLAYSTATION 3', 'Iceweasel'],
-                                       // Translations for conforming user agent strings
-                                       userAgentTranslations = [
-                                               // Tons of browsers lie about being something they are not
-                                               [/(Firefox|MSIE|KHTML,?\slike\sGecko|Konqueror)/, ''],
-                                               // Chrome lives in the shadow of Safari still
-                                               ['Chrome Safari', 'Chrome'],
-                                               // KHTML is the layout engine not the browser - LIES!
-                                               ['KHTML', 'Konqueror'],
-                                               // Firefox nightly builds
-                                               ['Minefield', 'Firefox'],
-                                               // This helps keep different versions consistent
-                                               ['Navigator', 'Netscape'],
-                                               // This prevents version extraction issues, otherwise translation would happen later
-                                               ['PLAYSTATION 3', 'PS3']
-                                       ],
-                                       // Strings which precede a version number in a user agent string - combined and used as
-                                       // match 1 in version detection
-                                       versionPrefixes = [
-                                               'camino', 'chrome', 'firefox', 'iceweasel', 'netscape', 'netscape6', 'opera', 'version', 'konqueror',
-                                               'lynx', 'msie', 'safari', 'ps3', 'android'
-                                       ],
-                                       // Used as matches 2, 3 and 4 in version extraction - 3 is used as actual version number
-                                       versionSuffix = '(\\/|\\;?\\s|)([a-z0-9\\.\\+]*?)(\\;|dev|rel|\\)|\\s|$)',
-                                       // Names of known browsers
-                                       names = [
-                                               'camino', 'chrome', 'firefox', 'iceweasel', 'netscape', 'konqueror', 'lynx', 'msie', 'opera',
-                                               'safari', 'ipod', 'iphone', 'blackberry', 'ps3', 'rekonq', 'android'
-                                       ],
-                                       // Tanslations for conforming browser names
-                                       nameTranslations = [],
-                                       // Names of known layout engines
-                                       layouts = ['gecko', 'konqueror', 'msie', 'trident', 'opera', 'webkit'],
-                                       // Translations for conforming layout names
-                                       layoutTranslations = [ ['konqueror', 'khtml'], ['msie', 'trident'], ['opera', 'presto'] ],
-                                       // Names of supported layout engines for version number
-                                       layoutVersions = ['applewebkit', 'gecko', 'trident'],
-                                       // Names of known operating systems
-                                       platforms = ['win', 'wow64', 'mac', 'linux', 'sunos', 'solaris', 'iphone'],
-                                       // Translations for conforming operating system names
-                                       platformTranslations = [ ['sunos', 'solaris'], ['wow64', 'win'] ],
+                               // Name of browsers or layout engines we don't recognize
+                               uk = 'unknown',
+                               // Generic version digit
+                               x = 'x',
+                               // Strings found in user agent strings that need to be conformed
+                               wildUserAgents = ['Opera', 'Navigator', 'Minefield', 'KHTML', 'Chrome', 'PLAYSTATION 3', 'Iceweasel'],
+                               // Translations for conforming user agent strings
+                               userAgentTranslations = [
+                                       // Tons of browsers lie about being something they are not
+                                       [/(Firefox|MSIE|KHTML,?\slike\sGecko|Konqueror)/, ''],
+                                       // Chrome lives in the shadow of Safari still
+                                       ['Chrome Safari', 'Chrome'],
+                                       // KHTML is the layout engine not the browser - LIES!
+                                       ['KHTML', 'Konqueror'],
+                                       // Firefox nightly builds
+                                       ['Minefield', 'Firefox'],
+                                       // This helps keep different versions consistent
+                                       ['Navigator', 'Netscape'],
+                                       // This prevents version extraction issues, otherwise translation would happen later
+                                       ['PLAYSTATION 3', 'PS3']
+                               ],
+                               // Strings which precede a version number in a user agent string - combined and used as
+                               // match 1 in version detection
+                               versionPrefixes = [
+                                       'camino', 'chrome', 'firefox', 'iceweasel', 'netscape', 'netscape6', 'opera', 'version', 'konqueror',
+                                       'lynx', 'msie', 'safari', 'ps3', 'android'
+                               ],
+                               // Used as matches 2, 3 and 4 in version extraction - 3 is used as actual version number
+                               versionSuffix = '(\\/|\\;?\\s|)([a-z0-9\\.\\+]*?)(\\;|dev|rel|\\)|\\s|$)',
+                               // Names of known browsers
+                               names = [
+                                       'camino', 'chrome', 'firefox', 'iceweasel', 'netscape', 'konqueror', 'lynx', 'msie', 'opera',
+                                       'safari', 'ipod', 'iphone', 'blackberry', 'ps3', 'rekonq', 'android'
+                               ],
+                               // Tanslations for conforming browser names
+                               nameTranslations = [],
+                               // Names of known layout engines
+                               layouts = ['gecko', 'konqueror', 'msie', 'trident', 'opera', 'webkit'],
+                               // Translations for conforming layout names
+                               layoutTranslations = [ ['konqueror', 'khtml'], ['msie', 'trident'], ['opera', 'presto'] ],
+                               // Names of supported layout engines for version number
+                               layoutVersions = ['applewebkit', 'gecko', 'trident'],
+                               // Names of known operating systems
+                               platforms = ['win', 'wow64', 'mac', 'linux', 'sunos', 'solaris', 'iphone'],
+                               // Translations for conforming operating system names
+                               platformTranslations = [ ['sunos', 'solaris'], ['wow64', 'win'] ],
 
-                                       /* Methods */
+                               /* Methods */
 
-                                       /**
-                                        * Performs multiple replacements on a string
-                                        */
-                                       translate = function ( source, translations ) {
-                                               var i;
-                                               for ( i = 0; i < translations.length; i++ ) {
-                                                       source = source.replace( translations[i][0], translations[i][1] );
-                                               }
-                                               return source;
-                                       },
+                               /**
+                                * Performs multiple replacements on a string
+                                */
+                               translate = function ( source, translations ) {
+                                       var i;
+                                       for ( i = 0; i < translations.length; i++ ) {
+                                               source = source.replace( translations[i][0], translations[i][1] );
+                                       }
+                                       return source;
+                               },
 
-                                       /* Pre-processing */
+                               /* Pre-processing */
 
-                                       ua = nav.userAgent,
-                                       match,
-                                       name = uk,
-                                       layout = uk,
-                                       layoutversion = uk,
-                                       platform = uk,
-                                       version = x;
+                               ua = nav.userAgent,
+                               match,
+                               name = uk,
+                               layout = uk,
+                               layoutversion = uk,
+                               platform = uk,
+                               version = x;
 
-                               if ( match = new RegExp( '(' + wildUserAgents.join( '|' ) + ')' ).exec( ua ) ) {
-                                       // Takes a userAgent string and translates given text into something we can more easily work with
-                                       ua = translate( ua, userAgentTranslations );
-                               }
-                               // Everything will be in lowercase from now on
-                               ua = ua.toLowerCase();
+                       if ( match = new RegExp( '(' + wildUserAgents.join( '|' ) + ')' ).exec( ua ) ) {
+                               // Takes a userAgent string and translates given text into something we can more easily work with
+                               ua = translate( ua, userAgentTranslations );
+                       }
+                       // Everything will be in lowercase from now on
+                       ua = ua.toLowerCase();
 
-                               /* Extraction */
+                       /* Extraction */
 
-                               if ( match = new RegExp( '(' + names.join( '|' ) + ')' ).exec( ua ) ) {
-                                       name = translate( match[1], nameTranslations );
-                               }
-                               if ( match = new RegExp( '(' + layouts.join( '|' ) + ')' ).exec( ua ) ) {
-                                       layout = translate( match[1], layoutTranslations );
-                               }
-                               if ( match = new RegExp( '(' + layoutVersions.join( '|' ) + ')\\\/(\\d+)').exec( ua ) ) {
-                                       layoutversion = parseInt( match[2], 10 );
-                               }
-                               if ( match = new RegExp( '(' + platforms.join( '|' ) + ')' ).exec( nav.platform.toLowerCase() ) ) {
-                                       platform = translate( match[1], platformTranslations );
-                               }
-                               if ( match = new RegExp( '(' + versionPrefixes.join( '|' ) + ')' + versionSuffix ).exec( ua ) ) {
-                                       version = match[3];
-                               }
+                       if ( match = new RegExp( '(' + names.join( '|' ) + ')' ).exec( ua ) ) {
+                               name = translate( match[1], nameTranslations );
+                       }
+                       if ( match = new RegExp( '(' + layouts.join( '|' ) + ')' ).exec( ua ) ) {
+                               layout = translate( match[1], layoutTranslations );
+                       }
+                       if ( match = new RegExp( '(' + layoutVersions.join( '|' ) + ')\\\/(\\d+)').exec( ua ) ) {
+                               layoutversion = parseInt( match[2], 10 );
+                       }
+                       if ( match = new RegExp( '(' + platforms.join( '|' ) + ')' ).exec( nav.platform.toLowerCase() ) ) {
+                               platform = translate( match[1], platformTranslations );
+                       }
+                       if ( match = new RegExp( '(' + versionPrefixes.join( '|' ) + ')' + versionSuffix ).exec( ua ) ) {
+                               version = match[3];
+                       }
 
-                               /* Edge Cases -- did I mention about how user agent string lie? */
+                       /* Edge Cases -- did I mention about how user agent string lie? */
 
-                               // Decode Safari's crazy 400+ version numbers
-                               if ( name === 'safari' && version > 400 ) {
-                                       version = '2.0';
+                       // Decode Safari's crazy 400+ version numbers
+                       if ( name === 'safari' && version > 400 ) {
+                               version = '2.0';
+                       }
+                       // Expose Opera 10's lies about being Opera 9.8
+                       if ( name === 'opera' && version >= 9.8 ) {
+                               match = ua.match( /\bversion\/([0-9\.]*)/ );
+                               if ( match && match[1] ) {
+                                       version = match[1];
+                               } else {
+                                       version = '10';
                                }
-                               // Expose Opera 10's lies about being Opera 9.8
-                               if ( name === 'opera' && version >= 9.8 ) {
-                                       match = ua.match( /\bversion\/([0-9\.]*)/ );
-                                       if ( match && match[1] ) {
-                                               version = match[1];
-                                       } else {
-                                               version = '10';
-                                       }
+                       }
+                       // And Opera 15's lies about being Chrome
+                       if ( name === 'chrome' && ( match = ua.match( /\bopr\/([0-9\.]*)/ ) ) ) {
+                               if ( match[1] ) {
+                                       name = 'opera';
+                                       version = match[1];
                                }
-                               // And Opera 15's lies about being Chrome
-                               if ( name === 'chrome' && ( match = ua.match( /\bopr\/([0-9\.]*)/ ) ) ) {
-                                       if ( match[1] ) {
-                                               name = 'opera';
-                                               version = match[1];
-                                       }
+                       }
+                       // And IE 11's lies about being not being IE
+                       if ( layout === 'trident' && layoutversion >= 7 && ( match = ua.match( /\brv[ :\/]([0-9\.]*)/ ) ) ) {
+                               if ( match[1] ) {
+                                       name = 'msie';
+                                       version = match[1];
                                }
-                               // And IE 11's lies about being not being IE
-                               if ( layout === 'trident' && layoutversion >= 7 && ( match = ua.match( /\brv[ :\/]([0-9\.]*)/ ) ) ) {
-                                       if ( match[1] ) {
-                                               name = 'msie';
-                                               version = match[1];
-                                       }
+                       }
+                       // And Amazon Silk's lies about being Android on mobile or Safari on desktop
+                       if ( match = ua.match( /\bsilk\/([0-9.\-_]*)/ ) ) {
+                               if ( match[1] ) {
+                                       name = 'silk';
+                                       version = match[1];
                                }
+                       }
 
-                               versionNumber = parseFloat( version, 10 ) || 0.0;
+                       versionNumber = parseFloat( version, 10 ) || 0.0;
 
-                               /* Caching */
+                       /* Caching */
 
-                               profileCache[nav.userAgent] = {
-                                       name: name,
-                                       layout: layout,
-                                       layoutVersion: layoutversion,
-                                       platform: platform,
-                                       version: version,
-                                       versionBase: ( version !== x ? Math.floor( versionNumber ).toString() : x ),
-                                       versionNumber: versionNumber
-                               };
-                       }
-                       return profileCache[nav.userAgent];
+                       return profileCache[ key  ] = {
+                               name: name,
+                               layout: layout,
+                               layoutVersion: layoutversion,
+                               platform: platform,
+                               version: version,
+                               versionBase: ( version !== x ? Math.floor( versionNumber ).toString() : x ),
+                               versionNumber: versionNumber
+                       };
                },
 
                /**
index 0159079..3d1f29a 100644 (file)
         * Return false if fullscreen is not supported.
         */
        setupFullscreen = function () {
-               if ( document.fullscreenEnabled ||
-                               document.mozFullScreenEnabled ||
-                               document.webkitFullscreenEnabled ||
-                               document.msFullscreenEnabled
-               ) {
+               if ( $.support.fullscreen ) {
                        // When the fullscreen mode is changed, trigger the
                        // fullscreen events (and when exiting,
                        // also remove the fullscreen class)
                        return this;
                }
        };
+       
+       $.support.fullscreen = document.fullscreenEnabled ||
+               document.webkitFullscreenEnabled ||
+               document.mozFullScreenEnabled ||
+               document.msFullscreenEnabled;
 }( jQuery ) );
index 89bb64d..2bab5b3 100644 (file)
@@ -10,7 +10,7 @@
                // Get the original values of some form elements
                $( '#wpTextbox1, #wpSummary' ).each( function () {
                        $( this ).data( 'origtext', $( this ).val() );
-               });
+               } );
                var savedWindowOnBeforeUnload;
                $( window )
                        .on( 'beforeunload.editwarning', function () {
index 43642d0..4c2fc3a 100644 (file)
 
                $previewDataHolder = $( '<div>' );
                targetUrl = $editform.attr( 'action' );
+               targetUrl += targetUrl.indexOf( '?' ) !== -1 ? '&' : '?';
+               targetUrl += $.param( {
+                       debug: mw.config.get( 'debug' ),
+                       uselang: mw.config.get( 'wgUserLanguage' ),
+                       useskin: mw.config.get( 'skin' )
+               } );
 
                // Gather all the data from the form
                postData = $editform.formToArray();
index cdc6767..6012d93 100644 (file)
                                        } );
                                } )
                                // AJAX success just means "200 OK" response, also check API error codes
-                               .done( function ( result ) {
+                               .done( function ( result, textStatus, jqXHR ) {
                                        if ( result === undefined || result === null || result === '' ) {
                                                apiDeferred.reject( 'ok-but-empty',
                                                        'OK response but empty result (check HTTP headers?)'
                                                var code = result.error.code === undefined ? 'unknown' : result.error.code;
                                                apiDeferred.reject( code, result );
                                        } else {
-                                               apiDeferred.resolve( result );
+                                               apiDeferred.resolve( result, jqXHR );
                                        }
                                } );
 
index c7e9bd9..486e993 100644 (file)
@@ -2,7 +2,7 @@
  * Hebrew (עברית) language functions
  */
 
-mediaWiki.language.convertGrammar = function( word, form ) {
+mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms = mediaWiki.language.getData( 'he', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
                return grammarForms[form][word];
index 5d2c271..80b68cc 100644 (file)
@@ -28,6 +28,7 @@
 }
 
 /* Note gzip compression means that it is okay to embed twice */
+/* http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
 .background-image-svg(@svg, @fallback) {
        background-image: url(@fallback);
        /* SVG support using a transparent gradient to guarantee cross-browser
diff --git a/resources/mediawiki.less/mediawiki.mixins.rotation.less b/resources/mediawiki.less/mediawiki.mixins.rotation.less
new file mode 100644 (file)
index 0000000..82de5de
--- /dev/null
@@ -0,0 +1,31 @@
+// This is a separate file because importing the mixin causes
+// the keyframes blocks to be included in the output, regardless
+// of whether .rotation is used.
+@-webkit-keyframes rotate {
+       from {
+               -webkit-transform:rotate(0deg);
+       }
+       to {
+               -webkit-transform:rotate(360deg);
+       }
+}
+
+@keyframes rotate {
+       from {
+               transform: rotate(0deg);
+       }
+       to {
+               transform: rotate(360deg);
+       }
+}
+
+.rotation(@time) {
+       -webkit-animation-name: rotate;
+       -webkit-animation-duration: @time;
+       -webkit-animation-iteration-count: infinite;
+       -webkit-animation-timing-function: linear;
+       animation-name: rotate;
+       animation-duration: @time;
+       animation-iteration-count: infinite;
+       animation-timing-function: linear;
+}
index 75908ee..5fb14dd 100644 (file)
@@ -16,6 +16,9 @@
                $patrolLinks.on( 'click', function ( e ) {
                        var $spinner, href, rcid, apiRequest;
 
+                       // Start preloading the notification module (normally loaded by mw.notify())
+                       mw.loader.load( ['mediawiki.notification'], null, true );
+
                        // Hide the link and create a spinner to show it inside the brackets.
                        $spinner = $.createSpinner( {
                                size: 'small',
index ef287c4..9489403 100644 (file)
@@ -1,20 +1,20 @@
 /**
  * Animate watch/unwatch links to use asynchronous API requests to
  * watch pages, rather than navigating to a different URI.
+ *
+ * @class mw.page.watch.ajax
  */
 ( function ( mw, $ ) {
-       /**
-        * The name of the page to watch or unwatch.
-        */
+       // The name of the page to watch or unwatch
        var title = mw.config.get( 'wgRelevantPageName', mw.config.get( 'wgPageName' ) );
 
        /**
         * Update the link text, link href attribute and (if applicable)
         * "loading" class.
         *
-        * @param $link {jQuery} Anchor tag of (un)watch link.
-        * @param action {String} One of 'watch', 'unwatch'.
-        * @param state {String} [optional] 'idle' or 'loading'. Default is 'idle'.
+        * @param {jQuery} $link Anchor tag of (un)watch link
+        * @param {string} action One of 'watch', 'unwatch'
+        * @param {string} [state="idle"] 'idle' or 'loading'. Default is 'idle'
         */
        function updateWatchLink( $link, action, state ) {
                var accesskeyTip, msgKey, $li, otherAction;
                accesskeyTip = $link.attr( 'title' ).match( mw.util.tooltipAccessKeyRegexp );
                $li = $link.closest( 'li' );
 
-               /**
-                * Trigger a 'watchpage' event for this List item.
-                * Announce the otherAction value as the first param.
-                * Used to monitor the state of watch link.
-                * TODO: Revise when system wide hooks are implemented
-                */
+               // Trigger a 'watchpage' event for this List item.
+               // Announce the otherAction value as the first param.
+               // Used to monitor the state of watch link.
+               // TODO: Revise when system wide hooks are implemented
                if ( state === undefined ) {
                        $li.trigger( 'watchpage.mw', otherAction );
                }
        }
 
        /**
-        * @todo This should be moved somewhere more accessible.
-        * @param url {String}
-        * @return {String} The extracted action, defaults to 'view'.
+        * TODO: This should be moved somewhere more accessible.
+        *
+        * @private
+        * @param {string} url
+        * @return {string} The extracted action, defaults to 'view'
         */
        function mwUriGetAction( url ) {
                var action, actionPaths, key, i, m, parts;
 
                actionPaths = mw.config.get( 'wgActionPaths' );
 
-               // @todo Does MediaWiki give action path or query param
+               // TODO: Does MediaWiki give action path or query param
                // precedence ? If the former, move this to the bottom
                action = mw.util.getParamValue( 'action', url );
                if ( action !== null ) {
@@ -95,7 +95,7 @@
                return 'view';
        }
 
-       // Expose local methods
+       // Expose public methods
        mw.page.watch = {
                updateWatchLink: updateWatchLink
        };
                $links.click( function ( e ) {
                        var action, api, $link;
 
+                       // Start preloading the notification module (normally loaded by mw.notify())
+                       mw.loader.load( ['mediawiki.notification'], null, true );
+
                        action = mwUriGetAction( this.href );
 
                        if ( action !== 'watch' && action !== 'unwatch' ) {
index 7b1d416..ee4fc06 100644 (file)
@@ -96,7 +96,7 @@ div.searchresult {
        margin-left: 0.4em;
 }
 .mw-search-results li {
-       padding-bottom: 1em;
+       padding-bottom: 1.2em;
        list-style: none;
        list-style-image: none;
 }
@@ -264,6 +264,18 @@ td.mw-statistics-numbers {
        text-align: right;
 }
 
+/**** Special:ProtectedPages ****/
+table.mw-protectedpages span.mw-usertoollinks,
+span.mw-protectedpages-length,
+span.mw-protectedpages-actions {
+       white-space: nowrap;
+       font-size: 90%;
+}
+span.mw-protectedpages-unknown {
+       color: grey;
+       font-size: 90%;
+}
+
 /**** Special:UserRights ****/
 .mw-userrights-disabled {
        color: #888;
index 3842064..0078724 100644 (file)
@@ -111,7 +111,7 @@ jQuery( function ( $ ) {
                        keyRight = 39,
                        $el;
 
-               if( event.keyCode === keyLeft ) {
+               if ( event.keyCode === keyLeft ) {
                        $el = $( '#preftoc li.selected' ).prev().find( 'a' );
                } else if ( event.keyCode === keyRight ) {
                        $el = $( '#preftoc li.selected' ).next().find( 'a' );
index 85730f5..dc44c84 100644 (file)
@@ -5,19 +5,16 @@
        /* @embed */
        background: url(images/glyph-people-large.png) no-repeat 50%;
        margin: 0 auto;
+       padding-top: 4em;
 }
 
-#mw-createaccount-cta h3,
-#mw-createaccount-another h3 {
+#mw-createaccount-cta,
+#mw-createaccount-another {
        font-size: 0.9em;
        font-weight: normal;
        text-align: center;
 }
 
-#mw-createaccount-cta h3 {
-       padding-top: 4em;
-}
-
 #mw-createaccount-join {
        margin-left: 0.75em;
        /* Separate from background image */
index 8276b1c..73b5dc4 100644 (file)
@@ -1,25 +1,32 @@
+@import "mediawiki.mixins";
 @import "../../settings/typography";
 @import "../../mixins/effects";
 
 // Buttons
 //
+// All buttons start with mw-ui-button class, modified by other classes.
+// It can be any element.  Due to a lack of a CSS reset, the exact styling of
+// the button depends on what type of element is used.
+// There are two kinds of buttons, the default is a "Call to Action" with an obvious border
+// and there is a quiet kind without a border.
+//
 // Styleguide 2.
 
 @buttonBorderRadius: 3px;
+@transitionDuration: .1s;
+@transitionFunction: ease-in-out;
 
-// Button styling
-//
-// Basic button styling to be used on desktop skins. Can be any element.
-// Due to a lack of a CSS reset, the exact styling of the button depends on what type of element is used.
+// Neutral button styling
 //
 // Markup:
-// <div class="mw-ui-button">button.mw-ui-button</div>
+// <button class="mw-ui-button">.mw-ui-button</button>
+// <button class="mw-ui-button" disabled>.mw-ui-button</button>
 //
 // Styleguide 2.1.
 .mw-ui-button {
        // Container layout
        display: inline-block;
-       padding: 0.4em 1em 0.4em 1em;
+       padding: .5em 1em;
        margin: 0;
 
        // IE6/IE7 hack
@@ -28,7 +35,7 @@
        zoom: 1;
 
        // Container styling
-       .buttonColors();
+       .button-colors(@colorWhite);
        border-radius: @buttonBorderRadius;
 
        // Ensure that buttons and inputs are nicely aligned when they have differing heights
 
        // Content styling
        text-align: center;
-       text-decoration: none;
-
        font-weight: bold;
+       text-shadow: 0 1px rgba(0, 0, 0, .1);
 
        // Interaction styling
        cursor: pointer;
 
-       &:disabled,
-       &.mw-ui-disabled {
+       &:disabled {
+               text-shadow: none;
                cursor: default;
        }
 
+       .transition(background @transitionDuration @transitionFunction, color @transitionDuration @transitionFunction, box-shadow @transitionDuration @transitionFunction;);
+
        // Styling for specific button types
        // -----------------------------------------
+
+       // Big buttons
+       //
+       // Not all buttons are equal. You can emphasise certain actions over others
+       // using the mw-ui-big class.
+       //
+       // Markup:
+       // <button class="mw-ui-button mw-ui-big">.mw-ui-button</button>
+       // <button class="mw-ui-button mw-ui-progressive mw-ui-big">.mw-ui-progressive</button>
+       // <button class="mw-ui-button mw-ui-constructive mw-ui-big">.mw-ui-constructive</button>
+       // <button class="mw-ui-button mw-ui-destructive mw-ui-big">.mw-ui-destructive</button>
+       //
+       // Styleguide 2.1.6.
        &.mw-ui-big {
                font-size: @baseFontSize * 1.3;
        }
 
+       // Block buttons
+       //
+       // Some buttons might need to be stacked.
+       //
+       // Markup:
+       // <button class="mw-ui-button mw-ui-block">.mw-ui-button</button>
+       // <button class="mw-ui-button mw-ui-progressive mw-ui-block">.mw-ui-progressive</button>
+       // <button class="mw-ui-button mw-ui-constructive mw-ui-block">.mw-ui-constructive</button>
+       // <button class="mw-ui-button mw-ui-destructive mw-ui-block">.mw-ui-destructive</button>
+       //
+       // Styleguide 2.1.5.
        &.mw-ui-block {
                display: block;
                width: 100%;
        }
 
-       // Primary buttons
+       // Progressive buttons
        //
-       // Do not use the mw-ui-primary class use mw-ui-constructive instead. For blue buttons
-       // use mw-ui-progressive (coming soon)
+       // Use progressive buttons for actions which lead to a next step in the process.
+       // .mw-ui-primary is deprecated, kept for compatibility.
        //
        // Markup:
-       // <button class="mw-ui-button mw-ui-primary">mw-ui-primary</button>
+       // <button class="mw-ui-button mw-ui-progressive">.mw-ui-progressive</button>
+       // <button class="mw-ui-button mw-ui-progressive" disabled>.mw-ui-progressive</button>
        //
        // Styleguide 2.1.1.
+       &.mw-ui-progressive,
        &.mw-ui-primary {
-               .buttonColors(@agoraBlue);
+               .button-colors(@colorProgressive);
+
+               &.mw-ui-quiet {
+                       .button-colors-quiet(@colorProgressive);
+               }
        }
 
        // Constructive buttons
        // e.g. save changes button
        //
        // Markup:
-       // <button class="mw-ui-button mw-ui-constructive">mw-ui-constructive</button>
+       // <button class="mw-ui-button mw-ui-constructive">.mw-ui-constructive</button>
+       // <button class="mw-ui-button mw-ui-constructive" disabled>.mw-ui-constructive</button>
        //
        // Styleguide 2.1.2.
        &.mw-ui-constructive {
-               .buttonColors(@agoraGreen);
+               .button-colors(@colorConstructive);
+
+               &.mw-ui-quiet {
+                       .button-colors-quiet(@colorConstructive);
+               }
        }
 
        // Destructive buttons
        // This should not be used for cancel buttons.
        //
        // Markup:
-       // <button class="mw-ui-button mw-ui-destructive">mw-ui-destructive</button>
+       // <button class="mw-ui-button mw-ui-destructive">.mw-ui-destructive</button>
+       // <button class="mw-ui-button mw-ui-destructive" disabled>.mw-ui-destructive</button>
        //
        // Styleguide 2.1.3.
        &.mw-ui-destructive {
-               .buttonColors(@agoraRed);
+               .button-colors(@colorDestructive);
+
+               &.mw-ui-quiet {
+                       .button-colors-quiet(@colorDestructive);
+               }
+       }
+
+       // Quiet buttons
+       //
+       // Use quiet buttons when they are less important and alongisde other progressive/destructive/progressive buttons.
+       //
+       // Markup:
+       // <button class="mw-ui-button mw-ui-quiet">.mw-ui-button</button>
+       // <button class="mw-ui-button mw-ui-constructive mw-ui-quiet">.mw-ui-constructive</button>
+       // <button class="mw-ui-button mw-ui-constructive mw-ui-quiet" disabled>.mw-ui-constructive</button>
+       // <button class="mw-ui-button mw-ui-destructive mw-ui-quiet">.mw-ui-destructive</button>
+       // <button class="mw-ui-button mw-ui-destructive mw-ui-quiet" disabled>.mw-ui-destructive</button>
+       // <button class="mw-ui-button mw-ui-progressive mw-ui-quiet">.mw-ui-progressive</button>
+       // <button class="mw-ui-button mw-ui-progressive mw-ui-quiet" disabled>.mw-ui-progressive</button>
+       //
+       // Styleguide 2.1.4.
+       &.mw-ui-quiet {
+               background: transparent;
+               border: none;
+               text-shadow: none;
+               .button-colors-quiet(@colorGrayDark);
+
+               &:hover,
+               &:focus {
+                       box-shadow: none;
+               }
+
+               &:active,
+               &:disabled {
+                       background: transparent;
+               }
        }
 }
 
-// This overrides an underline declaration on a:hover and a:focus in commonElements.css, which the
-// class alone isn't specific enough to do
 a.mw-ui-button {
        text-decoration: none;
+
+       // This overrides an underline declaration on a:hover and a:focus in
+       // commonElements.css, which the class alone isn't specific enough to do.
+       &:hover,
+       &:focus {
+               text-decoration: none;
+       }
 }
 
 // Button groups
index d168e5f..eb8c203 100644 (file)
@@ -1,52 +1,81 @@
-/* Mixins for visual effects in CSS3 */
-
 @import "../settings/colors";
-
-// ----------------------------------------------------------------------------
-// Gradients
-// ----------------------------------------------------------------------------
-.vertical-gradient(@startColor: lighten(@agoraGray, 95%), @endColor: @agoraGray, @startPos: 0, @endPos: 100%) {
-       background-color: @endColor;
-       background-image: -moz-linear-gradient( top, @startColor @startPos, @endColor @endPos ); // Firefox 3.6+
-       background-image: -webkit-gradient( linear, left top, left bottom, color-stop( @startPos, @startColor ), color-stop( @endPos, @endColor ) ); // Safari 4+, Chrome 2+
-       background-image: -webkit-linear-gradient( top, @startColor @startPos, @endColor @endPos ); // Safari 5.1+, Chrome 10+
-       background-image: linear-gradient( @startColor @startPos, @endColor @endPos ); // Standard
-}
-
 // ----------------------------------------------------------------------------
 // Button styling
 // ----------------------------------------------------------------------------
 
-.buttonColors(@baseColor: @agoraGray) {
-       // Background color
-       .vertical-gradient(lighten(@baseColor, 7.5%), @baseColor);
-
-       border: 1px solid darken(@baseColor, 2%);
+.button-colors(@bgColor) {
+       background: @bgColor;
 
        &:hover,
-       &.mw-ui-hover {
-               .vertical-gradient(lighten(@baseColor, 12.5%), lighten(@baseColor, 7.5%));
-               text-decoration: none;
+       &:focus {
+               // The inner bottom bevel should match the active background color.
+               box-shadow: 0 1px rgba(0, 0, 0, 10%), inset 0 -3px rgba(0, 0, 0, 20%);
+               outline: none;
+               // remove outline in Firefox
+               &::-moz-focus-inner {
+                       border-color: transparent;
+               }
        }
 
-       &:active,
-       &.mw-ui-active {
-               background-image: none;
-               background-color: darken(@baseColor, 3%);
+       &:active {
+               // lessphp doesn't implement shade (https://github.com/leafo/lessphp/issues/528);
+               // it passes it through, then ResourceLoader drops it.
+               // background: shade(@bgColor, 20%);
+               background: mix(#000, @bgColor, 20%);
+               box-shadow: none;
        }
+}
+
+.button-colors(@bgColor) when (lightness(@bgColor) >= 70%) {
+       color: @colorGrayDark;
+       border: 1px solid @colorGrayLight;
+
+       &:disabled {
+               color: @colorGrayLight;
 
-       &:disabled,
-       &.mw-ui-disabled {
-               background-image: none;
-               background-color: @baseColor;
-               opacity: 0.5;
+               // make sure disabled buttons don't have hover and active states
+               &:hover,
+               &:active {
+                       background: @bgColor;
+                       box-shadow: none;
+               }
        }
 }
 
-.buttonColors(@baseColor: @agoraGray) when (lightness(@baseColor) >= 50%) {
-       color: #000;
+.button-colors(@bgColor) when (lightness(@bgColor) < 70%) {
+       color: @colorWhite;
+       border: none;
+
+       &:disabled {
+               background: @colorGrayLight;
+
+               // make sure disabled buttons don't have hover and active states
+               &:hover,
+               &:active {
+                       box-shadow: none;
+               }
+       }
 }
 
-.buttonColors(@baseColor: @agoraGray) when (lightness(@baseColor) < 50%) {
-       color: #fff;
+.button-colors-quiet(@textColor) {
+       // Quiet buttons all start gray, and reveal
+       // constructive/progressive/destructive color on hover and active.
+       color: @colorGrayDark;
+
+       &:hover,
+       &:focus {
+               // lessphp doesn't implement tint, see above
+               // color: tint(@textColor, 20%);
+               color: mix(#fff, @textColor, 20%);
+       }
+
+       &:active {
+               // lessphp doesn't implement shade, see above
+               // color: shade(@textColor, 20%);
+               color: mix(#000, @textColor, 20%);
+       }
+
+       &:disabled {
+               color: @colorGrayLight;
+       }
 }
index 1b177ee..b32e4e7 100644 (file)
@@ -4,7 +4,7 @@
 // For Vector, that should be layered on top with vector-type
 .agora-field-styling() {
 
-       border: 1px solid @agoraGray;
+       border: 1px solid @colorGrayLight;
 
        &:focus {
                // Styling focus of native checkboxes etc on Mac is almost impossible.
                        outline: 0; // Removes OS field focus
                }
 
-               box-shadow: @agoraBlueShadow 0px 0px 5px;
+               box-shadow: @colorProgressiveShadow 0px 0px 5px;
 
-               border-color: @agoraBlueShadow;
+               border-color: @colorProgressiveShadow;
        }
 
-       color: @agoraTextColor;
+       color: @colorText;
        padding: 0.35em 0.5em 0.35em 0.5em;
 
        // Ensure that buttons and inputs are nicely aligned when they have differing heights
@@ -27,7 +27,7 @@
 .agora-label-styling() {
        //font-weight: bold;
        font-size: 0.9em;
-       color: darken(@agoraGray, 50%);
+       color: darken(@colorGrayLight, 50%);
 
        * {
                font-weight: normal;
@@ -48,7 +48,7 @@
                height: auto;
                margin: 0 0.1em 0em 0;
                padding: 0;
-               border: 1px solid @agoraGray;
+               border: 1px solid @colorGrayLight;
                cursor: pointer;
        }
 }
index 208d6f6..18661de 100644 (file)
@@ -1,17 +1,10 @@
-// Grays
-// -----------------------------------------
-@agoraGray: #c9c9c9;
-@agoraTextColor: #252525;
-
-// Blues
-// -----------------------------------------
-@agoraBlue: #3366bb;
-@agoraBlueShadow: #4091ed;
-
-// Greens
-// -----------------------------------------
-@agoraGreen: #27aa65;
-
-// Reds
-// -----------------------------------------
-@agoraRed: #cc0000;
+@colorWhite: #fff;
+@colorGrayLight: #ccc;
+@colorGrayDark: #898989;
+@colorText: #252525;
+@colorProgressive: #347bff;
+// FIXME: remove @colorProgressiveShadow (shadows should be generated
+// in LESS by dimming the original colors)
+@colorProgressiveShadow: #4091ed;
+@colorConstructive: #00af89;
+@colorDestructive: #d11d13;
index 76c398c..83651ed 100644 (file)
@@ -1,5 +1,5 @@
 @baseFontSize: 1em;
 @baseLineHeight: 1.4 * @baseFontSize;
-@baseFontColor: @agoraTextColor;
+@baseFontColor: @colorText;
 
 @smallFontSize: 0.75em;
index 9de69b2..a498484 100644 (file)
@@ -1,41 +1,44 @@
-/**
+/*!
  * mediawiki.feedback
  *
  * @author Ryan Kaldari, 2010
  * @author Neil Kandalgaonkar, 2010-11
  * @since 1.19
- *
- * This is a way of getting simple feedback from users. It's useful
- * for testing new features -- users can give you feedback without
- * the difficulty of opening a whole new talk page. For this reason,
- * it also tends to collect a wider range of both positive and negative
- * comments. However you do need to tend to the feedback page. It will
- * get long relatively quickly, and you often get multiple messages
- * reporting the same issue.
- *
- * It takes the form of thing on your page which, when clicked, opens a small
- * dialog box. Submitting that dialog box appends its contents to a
- * wiki page that you specify, as a new section.
- *
- * Not compatible with LiquidThreads.
- *
- * Minimal example in how to use it:
- *
- *    var feedback = new mw.Feedback();
- *    $( '#myButton' ).click( function () { feedback.launch(); } );
- *
- * You can also launch the feedback form with a prefilled subject and body.
- * See the docs for the launch() method.
  */
 ( function ( mw, $ ) {
        /**
-        * Thingy for collecting user feedback on a wiki page
-        * @param {Array} options -- optional, all properties optional.
-        *  api: {mw.Api} if omitted, will just create a standard API
-        *  title: {mw.Title} the title of the page where you collect feedback. Defaults to "Feedback".
-        *  dialogTitleMessageKey: {String} message key for the title of the dialog box
-        *  bugsLink: {mw.Uri|String} url where bugs can be posted
-        *  bugsListLink: {mw.Uri|String} url where bugs can be listed
+        * This is a way of getting simple feedback from users. It's useful
+        * for testing new features -- users can give you feedback without
+        * the difficulty of opening a whole new talk page. For this reason,
+        * it also tends to collect a wider range of both positive and negative
+        * comments. However you do need to tend to the feedback page. It will
+        * get long relatively quickly, and you often get multiple messages
+        * reporting the same issue.
+        *
+        * It takes the form of thing on your page which, when clicked, opens a small
+        * dialog box. Submitting that dialog box appends its contents to a
+        * wiki page that you specify, as a new section.
+        *
+        * Not compatible with LiquidThreads.
+        *
+        * Minimal example in how to use it:
+        *
+        *     var feedback = new mw.Feedback();
+        *     $( '#myButton' ).click( function () { feedback.launch(); } );
+        *
+        * You can also launch the feedback form with a prefilled subject and body.
+        * See the docs for the #launch() method.
+        *
+        * @param {Object} [options]
+        * @param {mw.Api} [options.api] if omitted, will just create a standard API
+        * @param {mw.Title} [options.title="Feedback"] The title of the page where you collect
+        * feedback.
+        * @param {string} [options.dialogTitleMessageKey="feedback-submit"] Message key for the
+        * title of the dialog box
+        * @param {string} [options.bugsLink="//bugzilla.wikimedia.org/enter_bug.cgi"] URL where
+        * bugs can be posted
+        * @param {mw.Uri|string} [options.bugsListLink="//bugzilla.wikimedia.org/query.cgi"]
+        * URL where bugs can be listed
         */
        mw.Feedback = function ( options ) {
                if ( options === undefined ) {
@@ -67,6 +70,9 @@
        };
 
        mw.Feedback.prototype = {
+               /**
+                * Sets up interface
+                */
                setup: function () {
                        var $feedbackPageLink,
                                $bugNoteLink,
 
                },
 
+               /**
+                * Displays a section of the dialog.
+                *
+                * @param {"form"|"bugs"|"submitting"|"thanks"|"error"} s
+                * The section of the dialog to show.
+                */
                display: function ( s ) {
                        this.$dialog.dialog( { buttons:{} } ); // hide the buttons
                        this.$dialog.find( '.feedback-mode' ).hide(); // hide everything
                        this.$dialog.find( '.feedback-' + s ).show(); // show the desired div
                },
 
+               /**
+                * Display the submitting section.
+                */
                displaySubmitting: function () {
                        this.display( 'submitting' );
                },
 
+               /**
+                * Display the bugs section.
+                */
                displayBugs: function () {
                        var fb = this,
                                bugsButtons = {};
                        } );
                },
 
+               /**
+                * Display the thanks section.
+                */
                displayThanks: function () {
                        var fb = this,
                                closeButton = {};
 
                /**
                 * Display the feedback form
-                * @param {Object} optional prefilled contents for the feedback form. Object with properties:
-                *  subject: {String}
-                *      message: {String}
+                * @param {Object} [contents] Prefilled contents for the feedback form.
+                * @param {string} [contents.subject] The subject of the feedback
+                * @param {string} [contents.message] The content of the feedback
                 */
                displayForm: function ( contents ) {
                        var fb = this,
                        this.$dialog.dialog( { buttons: formButtons } ); // put the buttons back
                },
 
+               /**
+                * Display an error on the form.
+                *
+                * @param {string} message Should be a valid message key.
+                */
                displayError: function ( message ) {
                        var fb = this,
                                closeButton = {};
                        this.$dialog.dialog( { buttons: closeButton } );
                },
 
+               /**
+                * Close the feedback form.
+                */
                cancel: function () {
                        this.$dialog.dialog( 'close' );
                },
 
+               /**
+                * Submit the feedback form.
+                */
                submit: function () {
                        var subject, message,
                                fb = this;
 
                /**
                 * Modify the display form, and then open it, focusing interface on the subject.
-                * @param {Object} optional prefilled contents for the feedback form. Object with properties:
-                *                                              subject: {String}
-                *                                              message: {String}
+                * @param {Object} [contents] Prefilled contents for the feedback form.
+                * @param {string} [contents.subject] The subject of the feedback
+                * @param {string} [contents.message] The content of the feedback
                 */
                launch: function ( contents ) {
                        this.displayForm( contents );
index 7315677..0284e68 100644 (file)
@@ -1,12 +1,14 @@
 /**
  * Utility functions for jazzing up HTMLForm elements.
+ *
+ * @class jQuery.plugin.htmlform
  */
 ( function ( mw, $ ) {
 
        /**
         * jQuery plugin to fade or snap to visible state.
         *
-        * @param {boolean} instantToggle [optional]
+        * @param {boolean} [instantToggle=false]
         * @return {jQuery}
         */
        $.fn.goIn = function ( instantToggle ) {
@@ -19,7 +21,7 @@
        /**
         * jQuery plugin to fade or snap to hiding state.
         *
-        * @param {boolean} instantToggle [optional]
+        * @param {boolean} [instantToggle=false]
         * @return jQuery
         */
        $.fn.goOut = function ( instantToggle ) {
@@ -32,8 +34,9 @@
        /**
         * Bind a function to the jQuery object via live(), and also immediately trigger
         * the function on the objects with an 'instant' parameter set to true.
-        * @param {Function} callback Takes one parameter, which is {true} when the
-        *  event is called immediately, and {jQuery.Event} when triggered from an event.
+        * @param {Function} callback
+        * @param {boolean|jQuery.Event} callback.immediate True when the event is called immediately,
+        *  an event object when triggered from an event.
         */
        $.fn.liveAndTestAtStart = function ( callback ) {
                $( this )
                        } );
                }
        } );
+
+       /**
+        * @class jQuery
+        * @mixins jQuery.plugin.htmlform
+        */
 }( mediaWiki, jQuery ) );
index d93254b..e76141d 100644 (file)
                                // try to invoke it.
                                console.table.call( console, data );
                                return;
-                       } catch (e) {}
+                       } catch ( e ) {}
                        try {
                                console.log( $.toJSON( data, null, 2 ) );
                                return;
-                       } catch (e) {}
+                       } catch ( e ) {}
                        mw.log( data );
                },
 
 
                                        try {
                                                css = module.style.css.join();
-                                       } catch (e) { return; } // skip
+                                       } catch ( e ) { return; } // skip
 
                                        stats = inspect.auditSelectors( css );
                                        modules.push( {
                                        try {
                                                raw = localStorage.getItem( mw.loader.store.getStoreKey() );
                                                stats.totalSize = humanSize( $.byteLength( raw ) );
-                                       } catch (e) {}
+                                       } catch ( e ) {}
                                }
                                return [stats];
                        }
index 3322ad9..d7d90f4 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
 * Experimental advanced wikitext parser-emitter.
 * See: http://www.mediawiki.org/wiki/Extension:UploadWizard/MessageParser for docs
 *
@@ -6,6 +6,11 @@
 * @author mflaschen@wikimedia.org
 */
 ( function ( mw, $ ) {
+       /**
+        * @class mw.jqueryMsg
+        * @singleton
+        */
+
        var oldParser,
                slice = Array.prototype.slice,
                parserDefaults = {
@@ -59,6 +64,7 @@
         *
         * Object elements of children (jQuery, HTMLElement, TextNode, etc.) will be left as is.
         *
+        * @private
         * @param {jQuery} $parent Parent node wrapped by jQuery
         * @param {Object|string|Array} children What to append, with the same possible types as jQuery
         * @return {jQuery} $parent
@@ -82,6 +88,7 @@
        /**
         * Decodes the main HTML entities, those encoded by mw.html.escape.
         *
+        * @private
         * @param {string} encode Encoded string
         * @return {string} String with those entities decoded
         */
 
        /**
         * Given parser options, return a function that parses a key and replacements, returning jQuery object
+        *
+        * Try to parse a key and optional replacements, returning a jQuery object that may be a tree of jQuery nodes.
+        * If there was an error parsing, return the key and the error message (wrapped in jQuery). This should put the error right into
+        * the interface, without causing the page to halt script execution, and it hopefully should be clearer how to fix it.
+        * @private
         * @param {Object} parser options
-        * @return {Function} accepting ( String message key, String replacement1, String replacement2 ... ) and returning {jQuery}
+        * @return {Function}
+        * @return {Array} return.args First element is the key, replacements may be in array in 2nd element, or remaining elements.
+        * @return {jQuery} return.return
         */
        function getFailableParserFn( options ) {
                var parser = new mw.jqueryMsg.parser( options );
-               /**
-                * Try to parse a key and optional replacements, returning a jQuery object that may be a tree of jQuery nodes.
-                * If there was an error parsing, return the key and the error message (wrapped in jQuery). This should put the error right into
-                * the interface, without causing the page to halt script execution, and it hopefully should be clearer how to fix it.
-                *
-                * @param {Array} first element is the key, replacements may be in array in 2nd element, or remaining elements.
-                * @return {jQuery}
-                */
+
                return function ( args ) {
                        var key = args[0],
                                argsArray = $.isArray( args[1] ) ? args[1] : slice.call( args, 1 );
        mw.jqueryMsg = {};
 
        /**
-        * Class method.
         * Returns a function suitable for use as a global, to construct strings from the message key (and optional replacements).
         * e.g.
+        *
         *       window.gM = mediaWiki.parser.getMessageFunction( options );
         *       $( 'p#headline' ).html( gM( 'hello-user', username ) );
         *
         * Like the old gM() function this returns only strings, so it destroys any bindings. If you want to preserve bindings use the
         * jQuery plugin version instead. This is only included for backwards compatibility with gM().
         *
-        * @param {Array} parser options
-        * @return {Function} function suitable for assigning to window.gM
+        * N.B. replacements are variadic arguments or an array in second parameter. In other words:
+        *    somefunction( a, b, c, d )
+        * is equivalent to
+        *    somefunction( a, [b, c, d] )
+        *
+        * @param {Object} options parser options
+        * @return {Function} Function suitable for assigning to window.gM
+        * @return {string} return.key Message key.
+        * @return {Array|Mixed} return.replacements Optional variable replacements (variadically or an array).
+        * @return {string} return.return Rendered HTML.
         */
        mw.jqueryMsg.getMessageFunction = function ( options ) {
                var failableParserFn = getFailableParserFn( options ),
                        format = parserDefaults.format;
                }
 
-               /**
-                * N.B. replacements are variadic arguments or an array in second parameter. In other words:
-                *    somefunction( a, b, c, d )
-                * is equivalent to
-                *    somefunction( a, [b, c, d] )
-                *
-                * @param {string} key Message key.
-                * @param {Array|mixed} replacements Optional variable replacements (variadically or an array).
-                * @return {string} Rendered HTML.
-                */
                return function () {
                        var failableResult = failableParserFn( arguments );
                        if ( format === 'text' || format === 'escaped' ) {
        };
 
        /**
-        * Class method.
         * Returns a jQuery plugin which parses the message in the message key, doing replacements optionally, and appends the nodes to
         * the current selector. Bindings to passed-in jquery elements are preserved. Functions become click handlers for [$1 linktext] links.
         * e.g.
+        *
         *        $.fn.msg = mediaWiki.parser.getJqueryPlugin( options );
-        *        var userlink = $( '<a>' ).click( function () { alert( "hello!!") } );
+        *        var userlink = $( '<a>' ).click( function () { alert( "hello!!" ) } );
         *        $( 'p#headline' ).msg( 'hello-user', userlink );
         *
-        * @param {Array} parser options
-        * @return {Function} function suitable for assigning to jQuery plugin, such as $.fn.msg
+        * N.B. replacements are variadic arguments or an array in second parameter. In other words:
+        *    somefunction( a, b, c, d )
+        * is equivalent to
+        *    somefunction( a, [b, c, d] )
+        *
+        * We append to 'this', which in a jQuery plugin context will be the selected elements.
+        *
+        * @param {Object} options Parser options
+        * @return {Function} Function suitable for assigning to jQuery plugin, such as jQuery#msg
+        * @return {string} return.key Message key.
+        * @return {Array|Mixed} return.replacements Optional variable replacements (variadically or an array).
+        * @return {jQuery} return.return
         */
        mw.jqueryMsg.getPlugin = function ( options ) {
                var failableParserFn = getFailableParserFn( options );
-               /**
-                * N.B. replacements are variadic arguments or an array in second parameter. In other words:
-                *    somefunction( a, b, c, d )
-                * is equivalent to
-                *    somefunction( a, [b, c, d] )
-                *
-                * We append to 'this', which in a jQuery plugin context will be the selected elements.
-                * @param {string} key Message key.
-                * @param {Array|mixed} replacements Optional variable replacements (variadically or an array).
-                * @return {jQuery} this
-                */
+
                return function () {
                        var $target = this.empty();
                        // TODO: Simply appendWithoutParsing( $target, failableParserFn( arguments ).contents() )
        /**
         * The parser itself.
         * Describes an object, whose primary duty is to .parse() message keys.
-        * @param {Array} options
+        *
+        * @class
+        * @private
+        * @param {Object} options
         */
        mw.jqueryMsg.parser = function ( options ) {
                this.settings = $.extend( {}, parserDefaults, options );
                 *
                 * The two parts of the key are separated by colon.  For example:
                 *
-                * "message-key:true": ast
+                *     "message-key:true": ast
                 *
                 * if they key is "message-key" and onlyCurlyBraceTransform is true.
                 *
                 * This cache is shared by all instances of mw.jqueryMsg.parser.
                 *
+                * NOTE: We promise, it's static - when you create this empty object
+                * in the prototype, each new instance of the class gets a reference
+                * to the same object.
+                *
                 * @static
+                * @property {Object}
                 */
                astCache: {},
 
                 * Where the magic happens.
                 * Parses a message from the key, and swaps in replacements as necessary, wraps in jQuery
                 * If an error is thrown, returns original key, and logs the error
-                * @param {String} key Message key.
+                * @param {string} key Message key.
                 * @param {Array} replacements Variable replacements for $1, $2... $n
                 * @return {jQuery}
                 */
                parse: function ( key, replacements ) {
                        return this.emitter.emit( this.getAst( key ), replacements );
                },
+
                /**
                 * Fetch the message string associated with a key, return parsed structure. Memoized.
                 * Note that we pass '[' + key + ']' back for a missing message here.
-                * @param {String} key
-                * @return {String|Array} string of '[key]' if message missing, simple string if possible, array of arrays if needs parsing
+                * @param {string} key
+                * @return {string|Array} string of '[key]' if message missing, simple string if possible, array of arrays if needs parsing
                 */
                getAst: function ( key ) {
                        var cacheKey = [key, this.settings.onlyCurlyBraceTransform].join( ':' ), wikiText;
                 * CAVEAT: This does not parse all wikitext. It could be more efficient, but it's pretty good already.
                 * n.b. We want to move this functionality to the server. Nothing here is required to be on the client.
                 *
-                * @param {String} message string wikitext
+                * @param {string} input Message string wikitext
                 * @throws Error
                 * @return {Mixed} abstract syntax tree
                 */
                        // =========================================================
                        // parsing combinators - could be a library on its own
                        // =========================================================
-                       // Try parsers until one works, if none work return null
+
+                       /**
+                        * Try parsers until one works, if none work return null
+                        * @private
+                        * @param {Function[]} ps
+                        * @return {string|null}
+                        */
                        function choice( ps ) {
                                return function () {
                                        var i, result;
                                        return null;
                                };
                        }
-                       // try several ps in a row, all must succeed or return null
-                       // this is the only eager one
+
+                       /**
+                        * Try several ps in a row, all must succeed or return null.
+                        * This is the only eager one.
+                        * @private
+                        * @param {Function[]} ps
+                        * @return {string|null}
+                        */
                        function sequence( ps ) {
                                var i, res,
                                        originalPos = pos,
                                }
                                return result;
                        }
-                       // run the same parser over and over until it fails.
-                       // must succeed a minimum of n times or return null
+
+                       /**
+                        * Run the same parser over and over until it fails.
+                        * Must succeed a minimum of n times or return null.
+                        * @private
+                        * @param {number} n
+                        * @param {Function} p
+                        * @return {string|null}
+                        */
                        function nOrMore( n, p ) {
                                return function () {
                                        var originalPos = pos,
                                        return result;
                                };
                        }
-                       // There is a general pattern -- parse a thing, if that worked, apply transform, otherwise return null.
-                       // But using this as a combinator seems to cause problems when combined with nOrMore().
-                       // May be some scoping issue
+
+                       /**
+                        * There is a general pattern -- parse a thing, if that worked, apply transform, otherwise return null.
+                        *
+                        * TODO: But using this as a combinator seems to cause problems when combined with #nOrMore().
+                        * May be some scoping issue
+                        *
+                        * @private
+                        * @param {Function} p
+                        * @param {Function} fn
+                        * @return {string|null}
+                        */
                        function transform( p, fn ) {
                                return function () {
                                        var result = p();
                                        return result === null ? null : fn( result );
                                };
                        }
-                       // Helpers -- just make ps out of simpler JS builtin types
+
+                       /**
+                        * Just make parsers out of simpler JS builtin types
+                        * @private
+                        * @param {string} s
+                        * @return {Function}
+                        * @return {string} return.return
+                        */
                        function makeStringParser( s ) {
                                var len = s.length;
                                return function () {
                         * The regex being passed in should start with a ^ to anchor it to the start
                         * of the string.
                         *
+                        * @private
                         * @param {RegExp} regex anchored regex
                         * @return {Function} function to parse input based on the regex
                         */
                                };
                        }
 
-                       /**
-                        *  ===================================================================
-                        *  General patterns above this line -- wikitext specific parsers below
-                        *  ===================================================================
-                        */
+                       // ===================================================================
+                       // General patterns above this line -- wikitext specific parsers below
+                       // ===================================================================
+
                        // Parsing functions follow. All parsing functions work like this:
                        // They don't accept any arguments.
                        // Instead, they just operate non destructively on the string 'input'
                                ] );
                                return result === null ? null : [ result[0], result[2] ];
                        }
+                       function templateWithOutFirstParameter() {
+                               var result = sequence( [
+                                       templateName,
+                                       colon
+                               ] );
+                               return result === null ? null : [ result[0], '' ];
+                       }
                        colon = makeStringParser( ':' );
                        templateContents = choice( [
                                function () {
                                        var res = sequence( [
                                                // templates can have placeholders for dynamic replacement eg: {{PLURAL:$1|one car|$1 cars}}
                                                // or no placeholders eg: {{GRAMMAR:genitive|{{SITENAME}}}
-                                               choice( [ templateWithReplacement, templateWithOutReplacement ] ),
+                                               choice( [ templateWithReplacement, templateWithOutReplacement, templateWithOutFirstParameter ] ),
                                                nOrMore( 0, templateParam )
                                        ] );
                                        return res === null ? null : res[0].concat( res[1] );
                 * Parsing has been applied depth-first we can assume that all nodes here are single nodes
                 * Must return a single node to parents -- a jQuery with synthetic span
                 * However, unwrap any other synthetic spans in our children and pass them upwards
-                * @param {Array} nodes - mixed, some single nodes, some arrays of nodes
+                * @param {Mixed[]} nodes Some single nodes, some arrays of nodes
                 * @return {jQuery}
                 */
                concat: function ( nodes ) {
                 * Note that we expect the parsed parameter to be zero-based. i.e. $1 should have become [ 0 ].
                 * if the specified parameter is not found return the same string
                 * (e.g. "$99" -> parameter 98 -> not found -> return "$99" )
+                *
                 * TODO: Throw error if nodes.length > 1 ?
-                * @param {Array} of one element, integer, n >= 0
+                *
+                * @param {Array} nodes List of one element, integer, n >= 0
+                * @param {Array} replacements
                 * @return {String} replacement
                 */
                replace: function ( nodes, replacements ) {
                /**
                 * Converts array of HTML element key value pairs to object
                 *
-                * @param {Array} nodes array of consecutive key value pairs, with index 2 * n being a name and 2 * n + 1 the associated value
-                * @return {Object} object mapping attribute name to attribute value
+                * @param {Array} nodes Array of consecutive key value pairs, with index 2 * n being a
+                *  name and 2 * n + 1 the associated value
+                * @return {Object} Object mapping attribute name to attribute value
                 */
                htmlattributes: function ( nodes ) {
                        var i, len, mapping = {};
                /**
                 * Handles an (already-validated) HTML element.
                 *
-                * @param {Array} nodes nodes to process when creating element
+                * @param {Array} nodes Nodes to process when creating element
                 * @return {jQuery|Array} jQuery node for valid HTML or array for disallowed element
                 */
                htmlelement: function ( nodes ) {
                /**
                 * Transform parsed structure into external link
                 * If the href is a jQuery object, treat it as "enclosing" the link text.
-                *              ... function, treat it as the click handler
-                *              ... string, treat it as a URI
+                *
+                * - ... function, treat it as the click handler.
+                * - ... string, treat it as a URI.
+                *
                 * TODO: throw an error if nodes.length > 2 ?
-                * @param {Array} of two elements, {jQuery|Function|String} and {String}
+                *
+                * @param {Array} nodes List of two elements, {jQuery|Function|String} and {String}
                 * @return {jQuery}
                 */
                extlink: function ( nodes ) {
                 * as url), but we don't want to run the regular replace here-on: inserting a
                 * url as href-attribute of a link will automatically escape it already, so
                 * we don't want replace to (manually) escape it as well.
-                * TODO throw error if nodes.length > 1 ?
-                * @param {Array} of one element, integer, n >= 0
-                * @return {String} replacement
+                *
+                * TODO: throw error if nodes.length > 1 ?
+                *
+                * @param {Array} nodes List of one element, integer, n >= 0
+                * @return {string} replacement
                 */
                extlinkparam: function ( nodes, replacements ) {
                        var replacement,
                 * Transform parsed structure into pluralization
                 * n.b. The first node may be a non-integer (for instance, a string representing an Arabic number).
                 * So convert it back with the current language's convertNumber.
-                * @param {Array} of nodes, [ {String|Number}, {String}, {String} ... ]
-                * @return {String} selected pluralized form according to current language
+                * @param {Array} nodes List of nodes, [ {string|number}, {string}, {string} ... ]
+                * @return {string} selected pluralized form according to current language
                 */
                plural: function ( nodes ) {
                        var forms, count;
 
                /**
                 * Transform parsed structure according to gender.
-                * Usage {{gender:[ gender | mw.user object ] | masculine form|feminine form|neutral form}}.
-                * The first node is either a string, which can be "male" or "female",
-                * or a User object (not a username).
                 *
-                * @param {Array} of nodes, [ {String|mw.User}, {String}, {String}, {String} ]
-                * @return {String} selected gender form according to current language
+                * Usage: {{gender:[ mw.user object | '' | 'male' | 'female' | 'unknown' ] | masculine form | feminine form | neutral form}}.
+                *
+                * The first node must be one of:
+                * - the mw.user object (or a compatible one)
+                * - an empty string - indicating the current user, same effect as passing the mw.user object
+                * - a gender string ('male', 'female' or 'unknown')
+                *
+                * @param {Array} nodes List of nodes, [ {string|mw.user}, {string}, {string}, {string} ]
+                * @return {string} Selected gender form according to current language
                 */
                gender: function ( nodes ) {
-                       var gender, forms;
+                       var gender,
+                               maybeUser = nodes[0],
+                               forms = nodes.slice( 1 );
 
-                       if  ( nodes[0] && nodes[0].options instanceof mw.Map ) {
-                               gender = nodes[0].options.get( 'gender' );
-                       } else {
-                               gender = nodes[0];
+                       if ( maybeUser === '' ) {
+                               maybeUser = mw.user;
                        }
 
-                       forms = nodes.slice( 1 );
+                       // If we are passed a mw.user-like object, check their gender.
+                       // Otherwise, assume the gender string itself was passed .
+                       if ( maybeUser && maybeUser.options instanceof mw.Map ) {
+                               gender = maybeUser.options.get( 'gender' );
+                       } else {
+                               gender = maybeUser;
+                       }
 
                        return this.language.gender( gender, forms );
                },
 
                /**
                 * Transform parsed structure into grammar conversion.
-                * Invoked by putting {{grammar:form|word}} in a message
-                * @param {Array} of nodes [{Grammar case eg: genitive}, {String word}]
-                * @return {String} selected grammatical form according to current language
+                * Invoked by putting `{{grammar:form|word}}` in a message
+                * @param {Array} nodes List of nodes [{Grammar case eg: genitive}, {string word}]
+                * @return {string} selected grammatical form according to current language
                 */
                grammar: function ( nodes ) {
                        var form = nodes[0],
 
                /**
                 * Tranform parsed structure into a int: (interface language) message include
-                * Invoked by putting {{int:othermessage}} into a message
-                * @param {Array} of nodes
+                * Invoked by putting `{{int:othermessage}}` into a message
+                * @param {Array} nodes List of nodes
                 * @return {string} Other message
                 */
                int: function ( nodes ) {
                /**
                 * Takes an unformatted number (arab, no group separators and . as decimal separator)
                 * and outputs it in the localized digit script and formatted with decimal
-                * separator, according to the current language
-                * @param {Array} of nodes
-                * @return {Number|String} formatted number
+                * separator, according to the current language.
+                * @param {Array} nodes List of nodes
+                * @return {number|string} Formatted number
                 */
                formatnum: function ( nodes ) {
                        var isInteger = ( nodes[1] && nodes[1] === 'R' ) ? true : false,
                        return this.language.convertNumber( number, isInteger );
                }
        };
+
        // Deprecated! don't rely on gM existing.
        // The window.gM ought not to be required - or if required, not required here.
        // But moving it to extensions breaks it (?!)
        // Need to fix plugin so it could do attributes as well, then will be okay to remove this.
-       window.gM = mw.jqueryMsg.getMessageFunction();
+       // @deprecated since 1.23
+       mw.log.deprecate( window, 'gM', mw.jqueryMsg.getMessageFunction(), 'Use mw.message( ... ).parse() instead' );
+
+       /**
+        * @method
+        * @member jQuery
+        * @see mw.jqueryMsg#getPlugin
+        */
        $.fn.msg = mw.jqueryMsg.getPlugin();
 
        // Replace the default message parser with jqueryMsg
index 7879d6f..716c326 100644 (file)
@@ -23,6 +23,7 @@ template
 templateContents
   = twr:templateWithReplacement p:templateParam* { return twr.concat(p) }
   / twr:templateWithOutReplacement p:templateParam* { return twr.concat(p) }
+  / twr:templateWithOutFirstParameter p:templateParam* { return twr.concat(p) }
   / t:templateName p:templateParam* { return p.length ? [ t, p ] : [ t ] }
 
 templateWithReplacement
@@ -31,6 +32,9 @@ templateWithReplacement
 templateWithOutReplacement
   = t:templateName ":" p:paramExpression { return [ t, p ] }
 
+templateWithOutFirstParameter
+  = t:templateName ":" { return [ t, "" ] }
+
 templateParam
   = "|" e:paramExpression* { return e.length > 1 ? [ "CONCAT" ].concat(e) : e[0]; }
 
index e3aae9e..8b78370 100644 (file)
@@ -438,19 +438,6 @@ var mw = ( function ( $, undefined ) {
                        } );
                },
 
-               /**
-                * Dummy placeholder for {@link mw.log}
-                * @method
-                */
-               log: ( function () {
-                       var log = function () {};
-                       log.warn = function () {};
-                       log.deprecate = function ( obj, key, val ) {
-                               obj[key] = val;
-                       };
-                       return log;
-               }() ),
-
                // Make the Map constructor publicly available.
                Map: Map,
 
@@ -528,6 +515,75 @@ var mw = ( function ( $, undefined ) {
                        return mw.message.apply( mw.message, arguments ).toString();
                },
 
+               /**
+                * Dummy placeholder for {@link mw.log}
+                * @method
+                */
+               log: ( function () {
+                       // Also update the restoration of methods in mediawiki.log.js
+                       // when adding or removing methods here.
+                       var log = function () {};
+
+                       /**
+                        * @class mw.log
+                        * @singleton
+                        */
+
+                       /**
+                        * Write a message the console's warning channel.
+                        * Also logs a stacktrace for easier debugging.
+                        * Each action is silently ignored if the browser doesn't support it.
+                        *
+                        * @param {string...} msg Messages to output to console
+                        */
+                       log.warn = function () {
+                               var console = window.console;
+                               if ( console && console.warn ) {
+                                       console.warn.apply( console, arguments );
+                                       if ( console.trace ) {
+                                               console.trace();
+                                       }
+                               }
+                       };
+
+                       /**
+                        * Create a property in a host object that, when accessed, will produce
+                        * a deprecation warning in the console with backtrace.
+                        *
+                        * @param {Object} obj Host object of deprecated property
+                        * @param {string} key Name of property to create in `obj`
+                        * @param {Mixed} val The value this property should return when accessed
+                        * @param {string} [msg] Optional text to include in the deprecation message.
+                        */
+                       log.deprecate = !Object.defineProperty ? function ( obj, key, val ) {
+                               obj[key] = val;
+                       } : function ( obj, key, val, msg ) {
+                               msg = 'MWDeprecationWarning: Use of "' + key + '" property is deprecated.' +
+                                       ( msg ? ( ' ' + msg ) : '' );
+                               try {
+                                       Object.defineProperty( obj, key, {
+                                               configurable: true,
+                                               enumerable: true,
+                                               get: function () {
+                                                       mw.track( 'mw.deprecate', key );
+                                                       log.warn( msg );
+                                                       return val;
+                                               },
+                                               set: function ( newVal ) {
+                                                       mw.track( 'mw.deprecate', key );
+                                                       log.warn( msg );
+                                                       val = newVal;
+                                               }
+                                       } );
+                               } catch ( err ) {
+                                       // IE8 can throw on Object.defineProperty
+                                       obj[key] = val;
+                               }
+                       };
+
+                       return log;
+               }() ),
+
                /**
                 * Client-side module loader which integrates with the MediaWiki ResourceLoader
                 * @class mw.loader
@@ -984,6 +1040,8 @@ var mw = ( function ( $, undefined ) {
                         * @private
                         * @param {string} src URL to script, will be used as the src attribute in the script tag
                         * @param {Function} [callback] Callback which will be run when the script is done
+                        * @param {boolean} [async=false] Whether to load modules asynchronously.
+                        *  Ignored (and defaulted to `true`) if the document-ready event has already occurred.
                         */
                        function addScript( src, callback, async ) {
                                /*jshint evil:true */
@@ -1235,8 +1293,8 @@ var mw = ( function ( $, undefined ) {
                         * @param {string|string[]} dependencies Module name or array of string module names
                         * @param {Function} [ready] Callback to execute when all dependencies are ready
                         * @param {Function} [error] Callback to execute when any dependency fails
-                        * @param {boolean} [async] If true, load modules asynchronously even if
-                        *  document ready has not yet occurred.
+                        * @param {boolean} [async=false] Whether to load modules asynchronously.
+                        *  Ignored (and defaulted to `true`) if the document-ready event has already occurred.
                         */
                        function request( dependencies, ready, error, async ) {
                                var n;
@@ -1274,7 +1332,7 @@ var mw = ( function ( $, undefined ) {
                                mw.loader.work();
                        }
 
-                       function sortQuery(o) {
+                       function sortQuery( o ) {
                                var sorted = {}, key, a = [];
                                for ( key in o ) {
                                        if ( hasOwn.call( o, key ) ) {
@@ -1309,7 +1367,8 @@ var mw = ( function ( $, undefined ) {
                         * @param {Object} moduleMap Module map, see #buildModulesString
                         * @param {Object} currReqBase Object with other parameters (other than 'modules') to use in the request
                         * @param {string} sourceLoadScript URL of load.php
-                        * @param {boolean} async If true, use an asynchronous request even if document ready has not yet occurred
+                        * @param {boolean} async Whether to load modules asynchronously.
+                        *  Ignored (and defaulted to `true`) if the document-ready event has already occurred.
                         */
                        function doRequest( moduleMap, currReqBase, sourceLoadScript, async ) {
                                var request = $.extend(
@@ -1317,7 +1376,6 @@ var mw = ( function ( $, undefined ) {
                                        currReqBase
                                );
                                request = sortQuery( request );
-                               // Asynchronously append a script tag to the end of the body
                                // Append &* to avoid triggering the IE6 extension check
                                addScript( sourceLoadScript + '?' + $.param( request ) + '&*', null, async );
                        }
@@ -1685,10 +1743,9 @@ var mw = ( function ( $, undefined ) {
                                 * @param {string} [type='text/javascript'] mime-type to use if calling with a URL of an
                                 *  external script or style; acceptable values are "text/css" and
                                 *  "text/javascript"; if no type is provided, text/javascript is assumed.
-                                * @param {boolean} [async] If true, load modules asynchronously
-                                *  even if document ready has not yet occurred. If false, block before
-                                *  document ready and load async after. If not set, true will be
-                                *  assumed if loading a URL, and false will be assumed otherwise.
+                                * @param {boolean} [async] Whether to load modules asynchronously.
+                                *  Ignored (and defaulted to `true`) if the document-ready event has already occurred.
+                                *  Defaults to `true` if loading a URL, `false` otherwise.
                                 */
                                load: function ( modules, type, async ) {
                                        var filtered, m, module, l;
@@ -1708,7 +1765,7 @@ var mw = ( function ( $, undefined ) {
                                                        if ( type === 'text/css' ) {
                                                                // IE7-8 throws security warnings when inserting a <link> tag
                                                                // with a protocol-relative URL set though attributes (instead of
-                                                               // properties) - when on HTTPS. See also bug #.
+                                                               // properties) - when on HTTPS. See also bug 41331.
                                                                l = document.createElement( 'link' );
                                                                l.rel = 'stylesheet';
                                                                l.href = modules;
@@ -1800,14 +1857,6 @@ var mw = ( function ( $, undefined ) {
                                        return null;
                                },
 
-                               /**
-                                * @inheritdoc #getVersion
-                                * @deprecated since 1.18 use #getVersion instead
-                                */
-                               version: function () {
-                                       return mw.loader.getVersion.apply( mw.loader, arguments );
-                               },
-
                                /**
                                 * Get the state of a module.
                                 *
@@ -1831,19 +1880,6 @@ var mw = ( function ( $, undefined ) {
                                        } );
                                },
 
-                               /**
-                                * Load the `mediawiki.user` module.
-                                *
-                                * For backwards-compatibility with cached pages from before 2013 where:
-                                *
-                                * - the `mediawiki.user` module didn't exist yet
-                                * - `mw.user` was still part of mediawiki.js
-                                * - `mw.loader.go` still existed and called after `mw.loader.load()`
-                                */
-                               go: function () {
-                                       mw.loader.load( 'mediawiki.user' );
-                               },
-
                                /**
                                 * @inheritdoc mw.inspect#runReports
                                 * @method
@@ -1903,7 +1939,7 @@ var mw = ( function ( $, undefined ) {
                                                        mw.config.get( 'skin' ),
                                                        mw.config.get( 'wgResourceLoaderStorageVersion' ),
                                                        mw.config.get( 'wgUserLanguage' )
-                                               ].join(':');
+                                               ].join( ':' );
                                        },
 
                                        /**
@@ -1951,7 +1987,7 @@ var mw = ( function ( $, undefined ) {
                                                                mw.loader.store.items = data.items;
                                                                return;
                                                        }
-                                               } catch (e) {}
+                                               } catch ( e ) {}
 
                                                if ( raw === undefined ) {
                                                        // localStorage failed; disable store
@@ -2031,7 +2067,7 @@ var mw = ( function ( $, undefined ) {
                                                        return;
                                                }
 
-                                               mw.loader.store.items[key] = 'mw.loader.implement(' + args.join(',') + ');';
+                                               mw.loader.store.items[key] = 'mw.loader.implement(' + args.join( ',' ) + ');';
                                                mw.loader.store.update();
                                        },
 
index 75e4c96..dd22e35 100644 (file)
@@ -8,28 +8,32 @@
 
 ( function ( mw, $ ) {
 
-       /**
-        * @class mw.log
-        * @singleton
-        */
+       // Reference to dummy
+       // We don't need the dummy, but it has other methods on it
+       // that we need to restore afterwards.
+       var original = mw.log,
+               slice = Array.prototype.slice;
 
        /**
-        * Logs a message to the console.
+        * Logs a message to the console in debug mode.
         *
         * In the case the browser does not have a console API, a console is created on-the-fly by appending
         * a `<div id="mw-log-console">` element to the bottom of the body and then appending this and future
         * messages to that, instead of the console.
         *
+        * @member mw.log
         * @param {string...} msg Messages to output to console.
         */
        mw.log = function () {
                // Turn arguments into an array
-               var     args = Array.prototype.slice.call( arguments ),
+               var args = slice.call( arguments ),
                        // Allow log messages to use a configured prefix to identify the source window (ie. frame)
                        prefix = mw.config.exists( 'mw.log.prefix' ) ? mw.config.get( 'mw.log.prefix' ) + '> ' : '';
 
                // Try to use an existing console
-               if ( window.console !== undefined && $.isFunction( window.console.log ) ) {
+               // Generally we can cache this, but in this case we want to re-evaluate this as a
+               // global property live so that things like Firebug Lite can take precedence.
+               if ( window.console && window.console.log ) {
                        args.unshift( prefix );
                        window.console.log.apply( window.console, args );
                        return;
                } );
        };
 
-       /**
-        * Write a message the console's warning channel.
-        * Also logs a stacktrace for easier debugging.
-        * Each action is silently ignored if the browser doesn't support it.
-        *
-        * @param {string...} msg Messages to output to console
-        */
-       mw.log.warn = function () {
-               var console = window.console;
-               if ( console && console.warn ) {
-                       console.warn.apply( console, arguments );
-                       if ( console.trace ) {
-                               console.trace();
-                       }
-               }
-       };
-
-       /**
-        * Create a property in a host object that, when accessed, will produce
-        * a deprecation warning in the console with backtrace.
-        *
-        * @param {Object} obj Host object of deprecated property
-        * @param {string} key Name of property to create in `obj`
-        * @param {Mixed} val The value this property should return when accessed
-        * @param {string} [msg] Optional text to include in the deprecation message.
-        */
-       mw.log.deprecate = !Object.defineProperty ? function ( obj, key, val ) {
-               obj[key] = val;
-       } : function ( obj, key, val, msg ) {
-               msg = 'MWDeprecationWarning: Use of "' + key + '" property is deprecated.' +
-                       ( msg ? ( ' ' + msg ) : '' );
-               try {
-                       Object.defineProperty( obj, key, {
-                               configurable: true,
-                               enumerable: true,
-                               get: function () {
-                                       mw.log.warn( msg );
-                                       return val;
-                               },
-                               set: function ( newVal ) {
-                                       mw.log.warn( msg );
-                                       val = newVal;
-                               }
-                       } );
-               } catch ( err ) {
-                       // IE8 can throw on Object.defineProperty
-                       obj[key] = val;
-               }
-       };
+       // Restore original methods
+       mw.log.warn = original.warn;
+       mw.log.deprecate = original.deprecate;
 
 }( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.notification.hideForPrint.css b/resources/mediawiki/mediawiki.notification.hideForPrint.css
new file mode 100644 (file)
index 0000000..4f9162e
--- /dev/null
@@ -0,0 +1,3 @@
+.mw-notification-area {
+       display: none;
+}
index 4ede809..f142fa4 100644 (file)
@@ -8,17 +8,17 @@
                preReadyNotifQueue = [];
 
        /**
-        * Creates a Notification object for 1 message.
-        * Does not insert anything into the document (see #start).
+        * A Notification object for 1 message.
         *
-        * The "_" in the name is to avoid a bug (http://github.com/senchalabs/jsduck/issues/304)
+        * The "_" in the name is to avoid a bug (http://github.com/senchalabs/jsduck/issues/304).
         * It is not part of the actual class name.
         *
         * @class mw.Notification_
         * @alternateClassName mw.Notification
-        * @private
         *
-        * @constructor
+        * @constructor The constructor is not publicly accessible; use mw.notification#notify instead.
+        *  This does not insert anything into the document (see #start).
+        * @private
         */
        function Notification( message, options ) {
                var $notification, $notificationTitle, $notificationContent;
        }
 
        /**
-        * Start the notification.
-        * This inserts it into the page, closes any matching tagged notifications,
-        * handles the fadeIn animations and repacement transitions, and starts autoHide timers.
+        * Start the notification. Called automatically by mw.notification#notify
+        * (possibly asynchronously on document-ready).
+        *
+        * This inserts the notification into the page, closes any matching tagged notifications,
+        * handles the fadeIn animations and replacement transitions, and starts autoHide timers.
+        *
+        * @private
         */
        Notification.prototype.start = function () {
                var
         * Close/hide the notification.
         *
         * @param {Object} options An object containing options for the closing of the notification.
-        *  These are typically only used internally.
         *
         *  - speed: Use a close speed different than the default 'slow'.
         *  - placeholder: Set to false to disable the placeholder transition.
         * Helper function, take a list of notification divs and call
         * a function on the Notification instance attached to them.
         *
+        * @private
+        * @static
         * @param {jQuery} $notifications A jQuery object containing notification divs
         * @param {string} fn The name of the function to call on the Notification instance
         */
                 * @param {HTMLElement|jQuery|mw.Message|string} message
                 * @param {Object} options The options to use for the notification.
                 *  See #defaults for details.
-                * @return {Object} Object with a close function to close the notification
+                * @return {mw.Notification} Notification object
                 */
                notify: function ( message, options ) {
                        var notif;
                        } else {
                                preReadyNotifQueue.push( notif );
                        }
-                       return { close: $.proxy( notif.close, notif ) };
+
+                       return notif;
                },
 
                /**
index 0713541..8d950a0 100644 (file)
 
                // Compute form data for search suggestions functionality.
                function computeResultRenderCache( context ) {
-                       var $form, formAction, baseHref, linkParams;
+                       var $form, baseHref, linkParams;
 
                        // Compute common parameters for links' hrefs
                        $form = context.config.$region.closest( 'form' );
 
-                       formAction = $form.attr( 'action' );
-                       baseHref = formAction + ( formAction.match(/\?/) ? '&' : '?' );
+                       baseHref = $form.attr( 'action' );
+                       baseHref += baseHref.indexOf( '?' ) > -1 ? '&' : '?';
 
                        linkParams = {};
                        $.each( $form.serializeArray(), function ( idx, obj ) {
                        // Generic selector for skins with multiple searchboxes (used by CologneBlue)
                        '.mw-searchInput'
                ];
-               $( searchboxesSelectors.join(', ') )
+               $( searchboxesSelectors.join( ', ' ) )
                        .suggestions( {
                                fetch: function ( query ) {
                                        var $el;
                        special: {
                                render: specialRenderFunction,
                                select: function ( $input ) {
-                                       $input.closest( 'form' ).append(
-                                               $( '<input type="hidden" name="fulltext" value="1"/>' )
-                                       );
-                                       $input.closest( 'form' ).submit();
+                                       $input.closest( 'form' )
+                                               .append( $( '<input type="hidden" name="fulltext" value="1"/>' ) )
+                                               .submit();
                                }
                        },
                        $region: $searchRegion
                } );
 
+               // If the form includes any fallback fulltext search buttons, remove them
+               $searchInput.closest( 'form' ).find( '.mw-fallbackSearchButton' ).remove();
+
                // In most skins (at least Monobook and Vector), the font-size is messed up in <body>.
                // (they use 2 elements to get a sane font-height). So, instead of making exceptions for
                // each skin or adding more stylesheets, just copy it from the active element so auto-fit.
diff --git a/resources/mediawiki/mediawiki.toc.js b/resources/mediawiki/mediawiki.toc.js
new file mode 100644 (file)
index 0000000..3279900
--- /dev/null
@@ -0,0 +1,64 @@
+( function ( mw, $ ) {
+       'use strict';
+
+       // Table of contents toggle
+       mw.hook( 'wikipage.content' ).add( function ( $content ) {
+
+               /**
+                * Hide/show the table of contents element
+                *
+                * @param {jQuery} $toggleLink A jQuery object of the toggle link.
+                */
+               function toggleToc( $toggleLink ) {
+                       var $tocList = $content.find( '#toc ul:first' );
+
+                       // This function shouldn't be called if there's no TOC,
+                       // but just in case...
+                       if ( $tocList.length ) {
+                               if ( $tocList.is( ':hidden' ) ) {
+                                       $tocList.slideDown( 'fast' );
+                                       $toggleLink.text( mw.msg( 'hidetoc' ) );
+                                       $content.find( '#toc' ).removeClass( 'tochidden' );
+                                       $.cookie( 'mw_hidetoc', null, {
+                                               expires: 30,
+                                               path: '/'
+                                       } );
+                               } else {
+                                       $tocList.slideUp( 'fast' );
+                                       $toggleLink.text( mw.msg( 'showtoc' ) );
+                                       $content.find( '#toc' ).addClass( 'tochidden' );
+                                       $.cookie( 'mw_hidetoc', '1', {
+                                               expires: 30,
+                                               path: '/'
+                                       } );
+                               }
+                       }
+               }
+
+               var $tocTitle, $tocToggleLink, hideTocCookie;
+               $tocTitle = $content.find( '#toctitle' );
+               $tocToggleLink = $content.find( '#togglelink' );
+               // Only add it if there is a TOC and there is no toggle added already
+               if ( $content.find( '#toc' ).length && $tocTitle.length && !$tocToggleLink.length ) {
+                       hideTocCookie = $.cookie( 'mw_hidetoc' );
+                       $tocToggleLink = $( '<a href="#" class="internal" id="togglelink"></a>' )
+                               .text( mw.msg( 'hidetoc' ) )
+                               .click( function ( e ) {
+                                       e.preventDefault();
+                                       toggleToc( $( this ) );
+                               } );
+                       $tocTitle.append(
+                               $tocToggleLink
+                                       .wrap( '<span class="toctoggle"></span>' )
+                                       .parent()
+                                               .prepend( '&nbsp;[' )
+                                               .append( ']&nbsp;' )
+                       );
+
+                       if ( hideTocCookie === '1' ) {
+                               toggleToc( $tocToggleLink );
+                       }
+               }
+       } );
+
+}( mediaWiki, jQuery ) );
index 820cd0a..082f807 100644 (file)
                                // Make sure we don't unset util.$content if it was preset and we don't find anything
                                return util.$content;
                        } )();
-
-                       // Table of contents toggle
-                       mw.hook( 'wikipage.content' ).add( function ( $content ) {
-                               var $tocTitle, $tocToggleLink, hideTocCookie;
-                               $tocTitle = $content.find( '#toctitle' );
-                               $tocToggleLink = $content.find( '#togglelink' );
-                               // Only add it if there is a TOC and there is no toggle added already
-                               if ( $content.find( '#toc' ).length && $tocTitle.length && !$tocToggleLink.length ) {
-                                       hideTocCookie = $.cookie( 'mw_hidetoc' );
-                                       $tocToggleLink = $( '<a href="#" class="internal" id="togglelink"></a>' )
-                                               .text( mw.msg( 'hidetoc' ) )
-                                               .click( function ( e ) {
-                                                       e.preventDefault();
-                                                       util.toggleToc( $( this ) );
-                                               } );
-                                       $tocTitle.append(
-                                               $tocToggleLink
-                                                       .wrap( '<span class="toctoggle"></span>' )
-                                                       .parent()
-                                                               .prepend( '&nbsp;[' )
-                                                               .append( ']&nbsp;' )
-                                       );
-
-                                       if ( hideTocCookie === '1' ) {
-                                               util.toggleToc( $tocToggleLink );
-                                       }
-                               }
-                       } );
                },
 
                /* Main body */
                 *  completed (including the animation).
                 * @return {Mixed} Boolean visibility of the toc (true if it's visible)
                 * or Null if there was no table of contents.
+                * @deprecated since 1.23 Use jQuery
                 */
                toggleToc: function ( $toggleLink, callback ) {
-                       var $tocList = $( '#toc ul:first' );
+                       var ret, $tocList = $( '#toc ul:first' );
 
                        // This function shouldn't be called if there's no TOC,
                        // but just in case...
-                       if ( $tocList.length ) {
-                               if ( $tocList.is( ':hidden' ) ) {
-                                       $tocList.slideDown( 'fast', callback );
-                                       $toggleLink.text( mw.msg( 'hidetoc' ) );
-                                       $( '#toc' ).removeClass( 'tochidden' );
-                                       $.cookie( 'mw_hidetoc', null, {
-                                               expires: 30,
-                                               path: '/'
-                                       } );
-                                       return true;
-                               } else {
-                                       $tocList.slideUp( 'fast', callback );
-                                       $toggleLink.text( mw.msg( 'showtoc' ) );
-                                       $( '#toc' ).addClass( 'tochidden' );
-                                       $.cookie( 'mw_hidetoc', '1', {
-                                               expires: 30,
-                                               path: '/'
-                                       } );
-                                       return false;
-                               }
-                       } else {
+                       if ( !$tocList.length ) {
                                return null;
                        }
+                       ret = $tocList.is( ':hidden' );
+                       $toggleLink.click();
+                       $tocList.promise().done( callback );
+                       return ret;
                },
 
                /**
 
                /**
                 * Add the appropriate prefix to the accesskey shown in the tooltip.
-                * If the nodeList parameter is given, only those nodes are updated;
-                * otherwise, all the nodes that will probably have accesskeys by
-                * default are updated.
+                *
+                * If the `$nodes` parameter is given, only those nodes are updated;
+                * otherwise, depending on browser support, we update either all elements
+                * with accesskeys on the page or a bunch of elements which are likely to
+                * have them on core skins.
                 *
                 * @param {Array|jQuery} [$nodes] A jQuery object, or array of nodes to update.
                 */
                updateTooltipAccessKeys: function ( $nodes ) {
                        if ( !$nodes ) {
-                               // Rather than going into a loop of all anchor tags, limit to few elements that
-                               // contain the relevant anchor tags.
-                               // Input and label are rare enough that no such optimization is needed
-                               $nodes = $( '#column-one a, #mw-head a, #mw-panel a, #p-logo a, input, label' );
+                               if ( document.querySelectorAll ) {
+                                       // If we're running on a browser where we can do this efficiently,
+                                       // just find all elements that have accesskeys. We can't use jQuery's
+                                       // polyfill for the selector since looping over all elements on page
+                                       // load might be too slow.
+                                       $nodes = $( document.querySelectorAll( '[accesskey]' ) );
+                               } else {
+                                       // Otherwise go through some elements likely to have accesskeys rather
+                                       // than looping over all of them. Unfortunately this will not fully
+                                       // work for custom skins with different HTML structures. Input, label
+                                       // and button should be rare enough that no optimizations are needed.
+                                       $nodes = $( '#column-one a, #mw-head a, #mw-panel a, #p-logo a, input, label, button' );
+                               }
                        } else if ( !( $nodes instanceof $ ) ) {
                                $nodes = $( $nodes );
                        }
diff --git a/resources/moment/LICENSE b/resources/moment/LICENSE
new file mode 100644 (file)
index 0000000..b44e3a6
--- /dev/null
@@ -0,0 +1,22 @@
+Copyright (c) 2011-2013 Tim Wood, Iskren Chernev, Moment.js contributors
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/resources/moment/lang/ar-ma.js b/resources/moment/lang/ar-ma.js
new file mode 100644 (file)
index 0000000..1c159f1
--- /dev/null
@@ -0,0 +1,56 @@
+// moment.js language configuration
+// language : Moroccan Arabic (ar-ma)
+// author : ElFadili Yassine : https://github.com/ElFadiliY
+// author : Abdel Said : https://github.com/abdelsaid
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('ar-ma', {
+        months : "يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),
+        monthsShort : "يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),
+        weekdays : "الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
+        weekdaysShort : "احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),
+        weekdaysMin : "ح_ن_ث_ر_خ_ج_س".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[اليوم على الساعة] LT",
+            nextDay: '[غدا على الساعة] LT',
+            nextWeek: 'dddd [على الساعة] LT',
+            lastDay: '[أمس على الساعة] LT',
+            lastWeek: 'dddd [على الساعة] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "في %s",
+            past : "منذ %s",
+            s : "ثوان",
+            m : "دقيقة",
+            mm : "%d دقائق",
+            h : "ساعة",
+            hh : "%d ساعات",
+            d : "يوم",
+            dd : "%d أيام",
+            M : "شهر",
+            MM : "%d أشهر",
+            y : "سنة",
+            yy : "%d سنوات"
+        },
+        week : {
+            dow : 6, // Saturday is the first day of the week.
+            doy : 12  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/ar.js b/resources/moment/lang/ar.js
new file mode 100644 (file)
index 0000000..6e27d29
--- /dev/null
@@ -0,0 +1,56 @@
+// moment.js language configuration
+// language : Arabic (ar)
+// author : Abdel Said : https://github.com/abdelsaid
+// changes in months, weekdays : Ahmed Elkhatib
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('ar', {
+        months : "يناير/ كانون الثاني_فبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوفمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),
+        monthsShort : "يناير/ كانون الثاني_فبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوفمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),
+        weekdays : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
+        weekdaysShort : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
+        weekdaysMin : "ح_ن_ث_ر_خ_ج_س".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[اليوم على الساعة] LT",
+            nextDay: '[غدا على الساعة] LT',
+            nextWeek: 'dddd [على الساعة] LT',
+            lastDay: '[أمس على الساعة] LT',
+            lastWeek: 'dddd [على الساعة] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "في %s",
+            past : "منذ %s",
+            s : "ثوان",
+            m : "دقيقة",
+            mm : "%d دقائق",
+            h : "ساعة",
+            hh : "%d ساعات",
+            d : "يوم",
+            dd : "%d أيام",
+            M : "شهر",
+            MM : "%d أشهر",
+            y : "سنة",
+            yy : "%d سنوات"
+        },
+        week : {
+            dow : 6, // Saturday is the first day of the week.
+            doy : 12  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/bg.js b/resources/moment/lang/bg.js
new file mode 100644 (file)
index 0000000..f47ed65
--- /dev/null
@@ -0,0 +1,86 @@
+// moment.js language configuration
+// language : bulgarian (bg)
+// author : Krasen Borisov : https://github.com/kraz
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('bg', {
+        months : "януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),
+        monthsShort : "янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),
+        weekdays : "неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),
+        weekdaysShort : "нед_пон_вто_сря_чет_пет_съб".split("_"),
+        weekdaysMin : "нд_пн_вт_ср_чт_пт_сб".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "D.MM.YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : '[Днес в] LT',
+            nextDay : '[Утре в] LT',
+            nextWeek : 'dddd [в] LT',
+            lastDay : '[Вчера в] LT',
+            lastWeek : function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                case 6:
+                    return '[В изминалата] dddd [в] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[В изминалия] dddd [в] LT';
+                }
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "след %s",
+            past : "преди %s",
+            s : "няколко секунди",
+            m : "минута",
+            mm : "%d минути",
+            h : "час",
+            hh : "%d часа",
+            d : "ден",
+            dd : "%d дни",
+            M : "месец",
+            MM : "%d месеца",
+            y : "година",
+            yy : "%d години"
+        },
+        ordinal : function (number) {
+            var lastDigit = number % 10,
+                last2Digits = number % 100;
+            if (number === 0) {
+                return number + '-ев';
+            } else if (last2Digits === 0) {
+                return number + '-ен';
+            } else if (last2Digits > 10 && last2Digits < 20) {
+                return number + '-ти';
+            } else if (lastDigit === 1) {
+                return number + '-ви';
+            } else if (lastDigit === 2) {
+                return number + '-ри';
+            } else if (lastDigit === 7 || lastDigit === 8) {
+                return number + '-ми';
+            } else {
+                return number + '-ти';
+            }
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/br.js b/resources/moment/lang/br.js
new file mode 100644 (file)
index 0000000..39c60df
--- /dev/null
@@ -0,0 +1,107 @@
+// moment.js language configuration
+// language : breton (br)
+// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function relativeTimeWithMutation(number, withoutSuffix, key) {
+        var format = {
+            'mm': "munutenn",
+            'MM': "miz",
+            'dd': "devezh"
+        };
+        return number + ' ' + mutation(format[key], number);
+    }
+
+    function specialMutationForYears(number) {
+        switch (lastNumber(number)) {
+        case 1:
+        case 3:
+        case 4:
+        case 5:
+        case 9:
+            return number + ' bloaz';
+        default:
+            return number + ' vloaz';
+        }
+    }
+
+    function lastNumber(number) {
+        if (number > 9) {
+            return lastNumber(number % 10);
+        }
+        return number;
+    }
+
+    function mutation(text, number) {
+        if (number === 2) {
+            return softMutation(text);
+        }
+        return text;
+    }
+
+    function softMutation(text) {
+        var mutationTable = {
+            'm': 'v',
+            'b': 'v',
+            'd': 'z'
+        };
+        if (mutationTable[text.charAt(0)] === undefined) {
+            return text;
+        }
+        return mutationTable[text.charAt(0)] + text.substring(1);
+    }
+
+    return moment.lang('br', {
+        months : "Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),
+        monthsShort : "Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),
+        weekdays : "Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),
+        weekdaysShort : "Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),
+        weekdaysMin : "Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),
+        longDateFormat : {
+            LT : "h[e]mm A",
+            L : "DD/MM/YYYY",
+            LL : "D [a viz] MMMM YYYY",
+            LLL : "D [a viz] MMMM YYYY LT",
+            LLLL : "dddd, D [a viz] MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : '[Hiziv da] LT',
+            nextDay : '[Warc\'hoazh da] LT',
+            nextWeek : 'dddd [da] LT',
+            lastDay : '[Dec\'h da] LT',
+            lastWeek : 'dddd [paset da] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "a-benn %s",
+            past : "%s 'zo",
+            s : "un nebeud segondennoù",
+            m : "ur vunutenn",
+            mm : relativeTimeWithMutation,
+            h : "un eur",
+            hh : "%d eur",
+            d : "un devezh",
+            dd : relativeTimeWithMutation,
+            M : "ur miz",
+            MM : relativeTimeWithMutation,
+            y : "ur bloaz",
+            yy : specialMutationForYears
+        },
+        ordinal : function (number) {
+            var output = (number === 1) ? 'añ' : 'vet';
+            return number + output;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/bs.js b/resources/moment/lang/bs.js
new file mode 100644 (file)
index 0000000..83a9b4c
--- /dev/null
@@ -0,0 +1,139 @@
+// moment.js language configuration
+// language : bosnian (bs)
+// author : Nedim Cholich : https://github.com/frontyard
+// based on (hr) translation by Bojan Marković
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+
+    function translate(number, withoutSuffix, key) {
+        var result = number + " ";
+        switch (key) {
+        case 'm':
+            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+        case 'mm':
+            if (number === 1) {
+                result += 'minuta';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'minute';
+            } else {
+                result += 'minuta';
+            }
+            return result;
+        case 'h':
+            return withoutSuffix ? 'jedan sat' : 'jednog sata';
+        case 'hh':
+            if (number === 1) {
+                result += 'sat';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'sata';
+            } else {
+                result += 'sati';
+            }
+            return result;
+        case 'dd':
+            if (number === 1) {
+                result += 'dan';
+            } else {
+                result += 'dana';
+            }
+            return result;
+        case 'MM':
+            if (number === 1) {
+                result += 'mjesec';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'mjeseca';
+            } else {
+                result += 'mjeseci';
+            }
+            return result;
+        case 'yy':
+            if (number === 1) {
+                result += 'godina';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'godine';
+            } else {
+                result += 'godina';
+            }
+            return result;
+        }
+    }
+
+    return moment.lang('bs', {
+               months : "januar_februar_mart_april_maj_juni_juli_avgust_septembar_oktobar_novembar_decembar".split("_"),
+               monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),
+        weekdays : "nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),
+        weekdaysShort : "ned._pon._uto._sri._čet._pet._sub.".split("_"),
+        weekdaysMin : "ne_po_ut_sr_če_pe_su".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "DD. MM. YYYY",
+            LL : "D. MMMM YYYY",
+            LLL : "D. MMMM YYYY LT",
+            LLLL : "dddd, D. MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay  : '[danas u] LT',
+            nextDay  : '[sutra u] LT',
+
+            nextWeek : function () {
+                switch (this.day()) {
+                case 0:
+                    return '[u] [nedjelju] [u] LT';
+                case 3:
+                    return '[u] [srijedu] [u] LT';
+                case 6:
+                    return '[u] [subotu] [u] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[u] dddd [u] LT';
+                }
+            },
+            lastDay  : '[jučer u] LT',
+            lastWeek : function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                    return '[prošlu] dddd [u] LT';
+                case 6:
+                    return '[prošle] [subote] [u] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[prošli] dddd [u] LT';
+                }
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "za %s",
+            past   : "prije %s",
+            s      : "par sekundi",
+            m      : translate,
+            mm     : translate,
+            h      : translate,
+            hh     : translate,
+            d      : "dan",
+            dd     : translate,
+            M      : "mjesec",
+            MM     : translate,
+            y      : "godinu",
+            yy     : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/ca.js b/resources/moment/lang/ca.js
new file mode 100644 (file)
index 0000000..cf47113
--- /dev/null
@@ -0,0 +1,66 @@
+// moment.js language configuration
+// language : catalan (ca)
+// author : Juan G. Hurtado : https://github.com/juanghurtado
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('ca', {
+        months : "gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),
+        monthsShort : "gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),
+        weekdays : "diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),
+        weekdaysShort : "dg._dl._dt._dc._dj._dv._ds.".split("_"),
+        weekdaysMin : "Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : function () {
+                return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+            },
+            nextDay : function () {
+                return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+            },
+            nextWeek : function () {
+                return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+            },
+            lastDay : function () {
+                return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+            },
+            lastWeek : function () {
+                return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "en %s",
+            past : "fa %s",
+            s : "uns segons",
+            m : "un minut",
+            mm : "%d minuts",
+            h : "una hora",
+            hh : "%d hores",
+            d : "un dia",
+            dd : "%d dies",
+            M : "un mes",
+            MM : "%d mesos",
+            y : "un any",
+            yy : "%d anys"
+        },
+        ordinal : '%dº',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/cs.js b/resources/moment/lang/cs.js
new file mode 100644 (file)
index 0000000..c1396cf
--- /dev/null
@@ -0,0 +1,155 @@
+// moment.js language configuration
+// language : czech (cs)
+// author : petrbela : https://github.com/petrbela
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var months = "leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),
+        monthsShort = "led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_");
+
+    function plural(n) {
+        return (n > 1) && (n < 5) && (~~(n / 10) !== 1);
+    }
+
+    function translate(number, withoutSuffix, key, isFuture) {
+        var result = number + " ";
+        switch (key) {
+        case 's':  // a few seconds / in a few seconds / a few seconds ago
+            return (withoutSuffix || isFuture) ? 'pár vteřin' : 'pár vteřinami';
+        case 'm':  // a minute / in a minute / a minute ago
+            return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');
+        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'minuty' : 'minut');
+            } else {
+                return result + 'minutami';
+            }
+            break;
+        case 'h':  // an hour / in an hour / an hour ago
+            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+        case 'hh': // 9 hours / in 9 hours / 9 hours ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'hodiny' : 'hodin');
+            } else {
+                return result + 'hodinami';
+            }
+            break;
+        case 'd':  // a day / in a day / a day ago
+            return (withoutSuffix || isFuture) ? 'den' : 'dnem';
+        case 'dd': // 9 days / in 9 days / 9 days ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'dny' : 'dní');
+            } else {
+                return result + 'dny';
+            }
+            break;
+        case 'M':  // a month / in a month / a month ago
+            return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';
+        case 'MM': // 9 months / in 9 months / 9 months ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'měsíce' : 'měsíců');
+            } else {
+                return result + 'měsíci';
+            }
+            break;
+        case 'y':  // a year / in a year / a year ago
+            return (withoutSuffix || isFuture) ? 'rok' : 'rokem';
+        case 'yy': // 9 years / in 9 years / 9 years ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'roky' : 'let');
+            } else {
+                return result + 'lety';
+            }
+            break;
+        }
+    }
+
+    return moment.lang('cs', {
+        months : months,
+        monthsShort : monthsShort,
+        monthsParse : (function (months, monthsShort) {
+            var i, _monthsParse = [];
+            for (i = 0; i < 12; i++) {
+                // use custom parser to solve problem with July (červenec)
+                _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
+            }
+            return _monthsParse;
+        }(months, monthsShort)),
+        weekdays : "neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),
+        weekdaysShort : "ne_po_út_st_čt_pá_so".split("_"),
+        weekdaysMin : "ne_po_út_st_čt_pá_so".split("_"),
+        longDateFormat : {
+            LT: "H:mm",
+            L : "DD.MM.YYYY",
+            LL : "D. MMMM YYYY",
+            LLL : "D. MMMM YYYY LT",
+            LLLL : "dddd D. MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[dnes v] LT",
+            nextDay: '[zítra v] LT',
+            nextWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[v neděli v] LT';
+                case 1:
+                case 2:
+                    return '[v] dddd [v] LT';
+                case 3:
+                    return '[ve středu v] LT';
+                case 4:
+                    return '[ve čtvrtek v] LT';
+                case 5:
+                    return '[v pátek v] LT';
+                case 6:
+                    return '[v sobotu v] LT';
+                }
+            },
+            lastDay: '[včera v] LT',
+            lastWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[minulou neděli v] LT';
+                case 1:
+                case 2:
+                    return '[minulé] dddd [v] LT';
+                case 3:
+                    return '[minulou středu v] LT';
+                case 4:
+                case 5:
+                    return '[minulý] dddd [v] LT';
+                case 6:
+                    return '[minulou sobotu v] LT';
+                }
+            },
+            sameElse: "L"
+        },
+        relativeTime : {
+            future : "za %s",
+            past : "před %s",
+            s : translate,
+            m : translate,
+            mm : translate,
+            h : translate,
+            hh : translate,
+            d : translate,
+            dd : translate,
+            M : translate,
+            MM : translate,
+            y : translate,
+            yy : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/cv.js b/resources/moment/lang/cv.js
new file mode 100644 (file)
index 0000000..a5812de
--- /dev/null
@@ -0,0 +1,59 @@
+// moment.js language configuration
+// language : chuvash (cv)
+// author : Anatoly Mironov : https://github.com/mirontoli
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('cv', {
+        months : "кăрлач_нарăс_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),
+        monthsShort : "кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),
+        weekdays : "вырсарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_эрнекун_шăматкун".split("_"),
+        weekdaysShort : "выр_тун_ытл_юн_кĕç_эрн_шăм".split("_"),
+        weekdaysMin : "вр_тн_ыт_юн_кç_эр_шм".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD-MM-YYYY",
+            LL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",
+            LLL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",
+            LLLL : "dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"
+        },
+        calendar : {
+            sameDay: '[Паян] LT [сехетре]',
+            nextDay: '[Ыран] LT [сехетре]',
+            lastDay: '[Ĕнер] LT [сехетре]',
+            nextWeek: '[Çитес] dddd LT [сехетре]',
+            lastWeek: '[Иртнĕ] dddd LT [сехетре]',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : function (output) {
+                var affix = /сехет$/i.exec(output) ? "рен" : /çул$/i.exec(output) ? "тан" : "ран";
+                return output + affix;
+            },
+            past : "%s каялла",
+            s : "пĕр-ик çеккунт",
+            m : "пĕр минут",
+            mm : "%d минут",
+            h : "пĕр сехет",
+            hh : "%d сехет",
+            d : "пĕр кун",
+            dd : "%d кун",
+            M : "пĕр уйăх",
+            MM : "%d уйăх",
+            y : "пĕр çул",
+            yy : "%d çул"
+        },
+        ordinal : '%d-мĕш',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/cy.js b/resources/moment/lang/cy.js
new file mode 100644 (file)
index 0000000..b47d7c2
--- /dev/null
@@ -0,0 +1,77 @@
+// moment.js language configuration
+// language : Welsh (cy)
+// author : Robert Allen
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang("cy", {
+        months: "Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),
+        monthsShort: "Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),
+        weekdays: "Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),
+        weekdaysShort: "Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),
+        weekdaysMin: "Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),
+        // time formats are the same as en-gb
+        longDateFormat: {
+            LT: "HH:mm",
+            L: "DD/MM/YYYY",
+            LL: "D MMMM YYYY",
+            LLL: "D MMMM YYYY LT",
+            LLLL: "dddd, D MMMM YYYY LT"
+        },
+        calendar: {
+            sameDay: '[Heddiw am] LT',
+            nextDay: '[Yfory am] LT',
+            nextWeek: 'dddd [am] LT',
+            lastDay: '[Ddoe am] LT',
+            lastWeek: 'dddd [diwethaf am] LT',
+            sameElse: 'L'
+        },
+        relativeTime: {
+            future: "mewn %s",
+            past: "%s yn àl",
+            s: "ychydig eiliadau",
+            m: "munud",
+            mm: "%d munud",
+            h: "awr",
+            hh: "%d awr",
+            d: "diwrnod",
+            dd: "%d diwrnod",
+            M: "mis",
+            MM: "%d mis",
+            y: "blwyddyn",
+            yy: "%d flynedd"
+        },
+        // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
+        ordinal: function (number) {
+            var b = number,
+                output = '',
+                lookup = [
+                    '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed
+                    'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed
+                ];
+
+            if (b > 20) {
+                if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
+                    output = 'fed'; // not 30ain, 70ain or 90ain
+                } else {
+                    output = 'ain';
+                }
+            } else if (b > 0) {
+                output = lookup[b];
+            }
+
+            return number + output;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/da.js b/resources/moment/lang/da.js
new file mode 100644 (file)
index 0000000..2fa8244
--- /dev/null
@@ -0,0 +1,56 @@
+// moment.js language configuration
+// language : danish (da)
+// author : Ulrik Nielsen : https://github.com/mrbase
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('da', {
+        months : "januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),
+        monthsShort : "jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),
+        weekdays : "søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),
+        weekdaysShort : "søn_man_tir_ons_tor_fre_lør".split("_"),
+        weekdaysMin : "sø_ma_ti_on_to_fr_lø".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D. MMMM, YYYY LT"
+        },
+        calendar : {
+            sameDay : '[I dag kl.] LT',
+            nextDay : '[I morgen kl.] LT',
+            nextWeek : 'dddd [kl.] LT',
+            lastDay : '[I går kl.] LT',
+            lastWeek : '[sidste] dddd [kl] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "om %s",
+            past : "%s siden",
+            s : "få sekunder",
+            m : "et minut",
+            mm : "%d minutter",
+            h : "en time",
+            hh : "%d timer",
+            d : "en dag",
+            dd : "%d dage",
+            M : "en måned",
+            MM : "%d måneder",
+            y : "et år",
+            yy : "%d år"
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/de.js b/resources/moment/lang/de.js
new file mode 100644 (file)
index 0000000..988f328
--- /dev/null
@@ -0,0 +1,71 @@
+// moment.js language configuration
+// language : german (de)
+// author : lluchs : https://github.com/lluchs
+// author: Menelion Elensúle: https://github.com/Oire
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function processRelativeTime(number, withoutSuffix, key, isFuture) {
+        var format = {
+            'm': ['eine Minute', 'einer Minute'],
+            'h': ['eine Stunde', 'einer Stunde'],
+            'd': ['ein Tag', 'einem Tag'],
+            'dd': [number + ' Tage', number + ' Tagen'],
+            'M': ['ein Monat', 'einem Monat'],
+            'MM': [number + ' Monate', number + ' Monaten'],
+            'y': ['ein Jahr', 'einem Jahr'],
+            'yy': [number + ' Jahre', number + ' Jahren']
+        };
+        return withoutSuffix ? format[key][0] : format[key][1];
+    }
+
+    return moment.lang('de', {
+        months : "Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),
+        monthsShort : "Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),
+        weekdays : "Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),
+        weekdaysShort : "So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),
+        weekdaysMin : "So_Mo_Di_Mi_Do_Fr_Sa".split("_"),
+        longDateFormat : {
+            LT: "H:mm [Uhr]",
+            L : "DD.MM.YYYY",
+            LL : "D. MMMM YYYY",
+            LLL : "D. MMMM YYYY LT",
+            LLLL : "dddd, D. MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[Heute um] LT",
+            sameElse: "L",
+            nextDay: '[Morgen um] LT',
+            nextWeek: 'dddd [um] LT',
+            lastDay: '[Gestern um] LT',
+            lastWeek: '[letzten] dddd [um] LT'
+        },
+        relativeTime : {
+            future : "in %s",
+            past : "vor %s",
+            s : "ein paar Sekunden",
+            m : processRelativeTime,
+            mm : "%d Minuten",
+            h : processRelativeTime,
+            hh : "%d Stunden",
+            d : processRelativeTime,
+            dd : processRelativeTime,
+            M : processRelativeTime,
+            MM : processRelativeTime,
+            y : processRelativeTime,
+            yy : processRelativeTime
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/el.js b/resources/moment/lang/el.js
new file mode 100644 (file)
index 0000000..9dfea23
--- /dev/null
@@ -0,0 +1,79 @@
+// moment.js language configuration
+// language : modern greek (el)
+// author : Aggelos Karalias : https://github.com/mehiel
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('el', {
+        monthsNominativeEl : "Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),
+        monthsGenitiveEl : "Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),
+        months : function (momentToFormat, format) {
+            if (/D/.test(format.substring(0, format.indexOf("MMMM")))) { // if there is a day number before 'MMMM'
+                return this._monthsGenitiveEl[momentToFormat.month()];
+            } else {
+                return this._monthsNominativeEl[momentToFormat.month()];
+            }
+        },
+        monthsShort : "Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),
+        weekdays : "Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),
+        weekdaysShort : "Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),
+        weekdaysMin : "Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),
+        meridiem : function (hours, minutes, isLower) {
+            if (hours > 11) {
+                return isLower ? 'μμ' : 'ΜΜ';
+            } else {
+                return isLower ? 'πμ' : 'ΠΜ';
+            }
+        },
+        longDateFormat : {
+            LT : "h:mm A",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendarEl : {
+            sameDay : '[Σήμερα {}] LT',
+            nextDay : '[Αύριο {}] LT',
+            nextWeek : 'dddd [{}] LT',
+            lastDay : '[Χθες {}] LT',
+            lastWeek : '[την προηγούμενη] dddd [{}] LT',
+            sameElse : 'L'
+        },
+        calendar : function (key, mom) {
+            var output = this._calendarEl[key],
+                hours = mom && mom.hours();
+
+            return output.replace("{}", (hours % 12 === 1 ? "στη" : "στις"));
+        },
+        relativeTime : {
+            future : "σε %s",
+            past : "%s πριν",
+            s : "δευτερόλεπτα",
+            m : "ένα λεπτό",
+            mm : "%d λεπτά",
+            h : "μία ώρα",
+            hh : "%d ώρες",
+            d : "μία μέρα",
+            dd : "%d μέρες",
+            M : "ένας μήνας",
+            MM : "%d μήνες",
+            y : "ένας χρόνος",
+            yy : "%d χρόνια"
+        },
+        ordinal : function (number) {
+            return number + 'η';
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/en-au.js b/resources/moment/lang/en-au.js
new file mode 100644 (file)
index 0000000..4d91e25
--- /dev/null
@@ -0,0 +1,62 @@
+// moment.js language configuration
+// language : australian english (en-au)
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('en-au', {
+        months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
+        monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
+        weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
+        weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
+        weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
+        longDateFormat : {
+            LT : "h:mm A",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : '[Today at] LT',
+            nextDay : '[Tomorrow at] LT',
+            nextWeek : 'dddd [at] LT',
+            lastDay : '[Yesterday at] LT',
+            lastWeek : '[Last] dddd [at] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "in %s",
+            past : "%s ago",
+            s : "a few seconds",
+            m : "a minute",
+            mm : "%d minutes",
+            h : "an hour",
+            hh : "%d hours",
+            d : "a day",
+            dd : "%d days",
+            M : "a month",
+            MM : "%d months",
+            y : "a year",
+            yy : "%d years"
+        },
+        ordinal : function (number) {
+            var b = number % 10,
+                output = (~~ (number % 100 / 10) === 1) ? 'th' :
+                (b === 1) ? 'st' :
+                (b === 2) ? 'nd' :
+                (b === 3) ? 'rd' : 'th';
+            return number + output;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/en-ca.js b/resources/moment/lang/en-ca.js
new file mode 100644 (file)
index 0000000..a97e9f3
--- /dev/null
@@ -0,0 +1,59 @@
+// moment.js language configuration
+// language : canadian english (en-ca)
+// author : Jonathan Abourbih : https://github.com/jonbca
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('en-ca', {
+        months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
+        monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
+        weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
+        weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
+        weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
+        longDateFormat : {
+            LT : "h:mm A",
+            L : "YYYY-MM-DD",
+            LL : "D MMMM, YYYY",
+            LLL : "D MMMM, YYYY LT",
+            LLLL : "dddd, D MMMM, YYYY LT"
+        },
+        calendar : {
+            sameDay : '[Today at] LT',
+            nextDay : '[Tomorrow at] LT',
+            nextWeek : 'dddd [at] LT',
+            lastDay : '[Yesterday at] LT',
+            lastWeek : '[Last] dddd [at] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "in %s",
+            past : "%s ago",
+            s : "a few seconds",
+            m : "a minute",
+            mm : "%d minutes",
+            h : "an hour",
+            hh : "%d hours",
+            d : "a day",
+            dd : "%d days",
+            M : "a month",
+            MM : "%d months",
+            y : "a year",
+            yy : "%d years"
+        },
+        ordinal : function (number) {
+            var b = number % 10,
+                output = (~~ (number % 100 / 10) === 1) ? 'th' :
+                (b === 1) ? 'st' :
+                (b === 2) ? 'nd' :
+                (b === 3) ? 'rd' : 'th';
+            return number + output;
+        }
+    });
+}));
diff --git a/resources/moment/lang/en-gb.js b/resources/moment/lang/en-gb.js
new file mode 100644 (file)
index 0000000..3a7907b
--- /dev/null
@@ -0,0 +1,63 @@
+// moment.js language configuration
+// language : great britain english (en-gb)
+// author : Chris Gedrim : https://github.com/chrisgedrim
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('en-gb', {
+        months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
+        monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
+        weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
+        weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
+        weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : '[Today at] LT',
+            nextDay : '[Tomorrow at] LT',
+            nextWeek : 'dddd [at] LT',
+            lastDay : '[Yesterday at] LT',
+            lastWeek : '[Last] dddd [at] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "in %s",
+            past : "%s ago",
+            s : "a few seconds",
+            m : "a minute",
+            mm : "%d minutes",
+            h : "an hour",
+            hh : "%d hours",
+            d : "a day",
+            dd : "%d days",
+            M : "a month",
+            MM : "%d months",
+            y : "a year",
+            yy : "%d years"
+        },
+        ordinal : function (number) {
+            var b = number % 10,
+                output = (~~ (number % 100 / 10) === 1) ? 'th' :
+                (b === 1) ? 'st' :
+                (b === 2) ? 'nd' :
+                (b === 3) ? 'rd' : 'th';
+            return number + output;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/eo.js b/resources/moment/lang/eo.js
new file mode 100644 (file)
index 0000000..03b1abf
--- /dev/null
@@ -0,0 +1,65 @@
+// moment.js language configuration
+// language : esperanto (eo)
+// author : Colin Dean : https://github.com/colindean
+// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
+//          Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('eo', {
+        months : "januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro".split("_"),
+        monthsShort : "jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec".split("_"),
+        weekdays : "Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato".split("_"),
+        weekdaysShort : "Dim_Lun_Mard_Merk_Ĵaŭ_Ven_Sab".split("_"),
+        weekdaysMin : "Di_Lu_Ma_Me_Ĵa_Ve_Sa".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "YYYY-MM-DD",
+            LL : "D[-an de] MMMM, YYYY",
+            LLL : "D[-an de] MMMM, YYYY LT",
+            LLLL : "dddd, [la] D[-an de] MMMM, YYYY LT"
+        },
+        meridiem : function (hours, minutes, isLower) {
+            if (hours > 11) {
+                return isLower ? 'p.t.m.' : 'P.T.M.';
+            } else {
+                return isLower ? 'a.t.m.' : 'A.T.M.';
+            }
+        },
+        calendar : {
+            sameDay : '[Hodiaŭ je] LT',
+            nextDay : '[Morgaŭ je] LT',
+            nextWeek : 'dddd [je] LT',
+            lastDay : '[Hieraŭ je] LT',
+            lastWeek : '[pasinta] dddd [je] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "je %s",
+            past : "antaŭ %s",
+            s : "sekundoj",
+            m : "minuto",
+            mm : "%d minutoj",
+            h : "horo",
+            hh : "%d horoj",
+            d : "tago",//ne 'diurno', ĉar estas uzita por proksimumo
+            dd : "%d tagoj",
+            M : "monato",
+            MM : "%d monatoj",
+            y : "jaro",
+            yy : "%d jaroj"
+        },
+        ordinal : "%da",
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/es.js b/resources/moment/lang/es.js
new file mode 100644 (file)
index 0000000..0a38396
--- /dev/null
@@ -0,0 +1,66 @@
+// moment.js language configuration
+// language : spanish (es)
+// author : Julio Napurí : https://github.com/julionc
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('es', {
+        months : "enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),
+        monthsShort : "ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),
+        weekdays : "domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),
+        weekdaysShort : "dom._lun._mar._mié._jue._vie._sáb.".split("_"),
+        weekdaysMin : "Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "DD/MM/YYYY",
+            LL : "D [de] MMMM [de] YYYY",
+            LLL : "D [de] MMMM [de] YYYY LT",
+            LLLL : "dddd, D [de] MMMM [de] YYYY LT"
+        },
+        calendar : {
+            sameDay : function () {
+                return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+            },
+            nextDay : function () {
+                return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+            },
+            nextWeek : function () {
+                return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+            },
+            lastDay : function () {
+                return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+            },
+            lastWeek : function () {
+                return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "en %s",
+            past : "hace %s",
+            s : "unos segundos",
+            m : "un minuto",
+            mm : "%d minutos",
+            h : "una hora",
+            hh : "%d horas",
+            d : "un día",
+            dd : "%d días",
+            M : "un mes",
+            MM : "%d meses",
+            y : "un año",
+            yy : "%d años"
+        },
+        ordinal : '%dº',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/et.js b/resources/moment/lang/et.js
new file mode 100644 (file)
index 0000000..fb410ef
--- /dev/null
@@ -0,0 +1,76 @@
+// moment.js language configuration
+// language : estonian (et)
+// author : Henry Kehlmann : https://github.com/madhenry
+// improvements : Illimar Tambek : https://github.com/ragulka
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function processRelativeTime(number, withoutSuffix, key, isFuture) {
+        var format = {
+            's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'],
+            'm' : ['ühe minuti', 'üks minut'],
+            'mm': [number + ' minuti', number + ' minutit'],
+            'h' : ['ühe tunni', 'tund aega', 'üks tund'],
+            'hh': [number + ' tunni', number + ' tundi'],
+            'd' : ['ühe päeva', 'üks päev'],
+            'M' : ['kuu aja', 'kuu aega', 'üks kuu'],
+            'MM': [number + ' kuu', number + ' kuud'],
+            'y' : ['ühe aasta', 'aasta', 'üks aasta'],
+            'yy': [number + ' aasta', number + ' aastat']
+        };
+        if (withoutSuffix) {
+            return format[key][2] ? format[key][2] : format[key][1];
+        }
+        return isFuture ? format[key][0] : format[key][1];
+    }
+
+    return moment.lang('et', {
+        months        : "jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),
+        monthsShort   : "jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),
+        weekdays      : "pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),
+        weekdaysShort : "P_E_T_K_N_R_L".split("_"),
+        weekdaysMin   : "P_E_T_K_N_R_L".split("_"),
+        longDateFormat : {
+            LT   : "H:mm",
+            L    : "DD.MM.YYYY",
+            LL   : "D. MMMM YYYY",
+            LLL  : "D. MMMM YYYY LT",
+            LLLL : "dddd, D. MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay  : '[Täna,] LT',
+            nextDay  : '[Homme,] LT',
+            nextWeek : '[Järgmine] dddd LT',
+            lastDay  : '[Eile,] LT',
+            lastWeek : '[Eelmine] dddd LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s pärast",
+            past   : "%s tagasi",
+            s      : processRelativeTime,
+            m      : processRelativeTime,
+            mm     : processRelativeTime,
+            h      : processRelativeTime,
+            hh     : processRelativeTime,
+            d      : processRelativeTime,
+            dd     : '%d päeva',
+            M      : processRelativeTime,
+            MM     : processRelativeTime,
+            y      : processRelativeTime,
+            yy     : processRelativeTime
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/eu.js b/resources/moment/lang/eu.js
new file mode 100644 (file)
index 0000000..659b739
--- /dev/null
@@ -0,0 +1,60 @@
+// moment.js language configuration
+// language : euskara (eu)
+// author : Eneko Illarramendi : https://github.com/eillarra
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('eu', {
+        months : "urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),
+        monthsShort : "urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),
+        weekdays : "igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),
+        weekdaysShort : "ig._al._ar._az._og._ol._lr.".split("_"),
+        weekdaysMin : "ig_al_ar_az_og_ol_lr".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "YYYY-MM-DD",
+            LL : "YYYY[ko] MMMM[ren] D[a]",
+            LLL : "YYYY[ko] MMMM[ren] D[a] LT",
+            LLLL : "dddd, YYYY[ko] MMMM[ren] D[a] LT",
+            l : "YYYY-M-D",
+            ll : "YYYY[ko] MMM D[a]",
+            lll : "YYYY[ko] MMM D[a] LT",
+            llll : "ddd, YYYY[ko] MMM D[a] LT"
+        },
+        calendar : {
+            sameDay : '[gaur] LT[etan]',
+            nextDay : '[bihar] LT[etan]',
+            nextWeek : 'dddd LT[etan]',
+            lastDay : '[atzo] LT[etan]',
+            lastWeek : '[aurreko] dddd LT[etan]',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s barru",
+            past : "duela %s",
+            s : "segundo batzuk",
+            m : "minutu bat",
+            mm : "%d minutu",
+            h : "ordu bat",
+            hh : "%d ordu",
+            d : "egun bat",
+            dd : "%d egun",
+            M : "hilabete bat",
+            MM : "%d hilabete",
+            y : "urte bat",
+            yy : "%d urte"
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/fa.js b/resources/moment/lang/fa.js
new file mode 100644 (file)
index 0000000..4a690c4
--- /dev/null
@@ -0,0 +1,97 @@
+// moment.js language configuration
+// language : Persian Language
+// author : Ebrahim Byagowi : https://github.com/ebraminio
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var symbolMap = {
+        '1': '۱',
+        '2': '۲',
+        '3': '۳',
+        '4': '۴',
+        '5': '۵',
+        '6': '۶',
+        '7': '۷',
+        '8': '۸',
+        '9': '۹',
+        '0': '۰'
+    }, numberMap = {
+        '۱': '1',
+        '۲': '2',
+        '۳': '3',
+        '۴': '4',
+        '۵': '5',
+        '۶': '6',
+        '۷': '7',
+        '۸': '8',
+        '۹': '9',
+        '۰': '0'
+    };
+
+    return moment.lang('fa', {
+        months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+        monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+        weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
+        weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
+        weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd, D MMMM YYYY LT'
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 12) {
+                return "قبل از ظهر";
+            } else {
+                return "بعد از ظهر";
+            }
+        },
+        calendar : {
+            sameDay : '[امروز ساعت] LT',
+            nextDay : '[فردا ساعت] LT',
+            nextWeek : 'dddd [ساعت] LT',
+            lastDay : '[دیروز ساعت] LT',
+            lastWeek : 'dddd [پیش] [ساعت] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'در %s',
+            past : '%s پیش',
+            s : 'چندین ثانیه',
+            m : 'یک دقیقه',
+            mm : '%d دقیقه',
+            h : 'یک ساعت',
+            hh : '%d ساعت',
+            d : 'یک روز',
+            dd : '%d روز',
+            M : 'یک ماه',
+            MM : '%d ماه',
+            y : 'یک سال',
+            yy : '%d سال'
+        },
+        preparse: function (string) {
+            return string.replace(/[۰-۹]/g, function (match) {
+                return numberMap[match];
+            }).replace(/،/g, ',');
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            }).replace(/,/g, '،');
+        },
+        ordinal : '%dم',
+        week : {
+            dow : 6, // Saturday is the first day of the week.
+            doy : 12 // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/fi.js b/resources/moment/lang/fi.js
new file mode 100644 (file)
index 0000000..18529c1
--- /dev/null
@@ -0,0 +1,103 @@
+// moment.js language configuration
+// language : finnish (fi)
+// author : Tarmo Aidantausta : https://github.com/bleadof
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var numbers_past = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '),
+        numbers_future = ['nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden',
+                          numbers_past[7], numbers_past[8], numbers_past[9]];
+
+    function translate(number, withoutSuffix, key, isFuture) {
+        var result = "";
+        switch (key) {
+        case 's':
+            return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
+        case 'm':
+            return isFuture ? 'minuutin' : 'minuutti';
+        case 'mm':
+            result = isFuture ? 'minuutin' : 'minuuttia';
+            break;
+        case 'h':
+            return isFuture ? 'tunnin' : 'tunti';
+        case 'hh':
+            result = isFuture ? 'tunnin' : 'tuntia';
+            break;
+        case 'd':
+            return isFuture ? 'päivän' : 'päivä';
+        case 'dd':
+            result = isFuture ? 'päivän' : 'päivää';
+            break;
+        case 'M':
+            return isFuture ? 'kuukauden' : 'kuukausi';
+        case 'MM':
+            result = isFuture ? 'kuukauden' : 'kuukautta';
+            break;
+        case 'y':
+            return isFuture ? 'vuoden' : 'vuosi';
+        case 'yy':
+            result = isFuture ? 'vuoden' : 'vuotta';
+            break;
+        }
+        result = verbal_number(number, isFuture) + " " + result;
+        return result;
+    }
+
+    function verbal_number(number, isFuture) {
+        return number < 10 ? (isFuture ? numbers_future[number] : numbers_past[number]) : number;
+    }
+
+    return moment.lang('fi', {
+        months : "tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),
+        monthsShort : "tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),
+        weekdays : "sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),
+        weekdaysShort : "su_ma_ti_ke_to_pe_la".split("_"),
+        weekdaysMin : "su_ma_ti_ke_to_pe_la".split("_"),
+        longDateFormat : {
+            LT : "HH.mm",
+            L : "DD.MM.YYYY",
+            LL : "Do MMMM[ta] YYYY",
+            LLL : "Do MMMM[ta] YYYY, [klo] LT",
+            LLLL : "dddd, Do MMMM[ta] YYYY, [klo] LT",
+            l : "D.M.YYYY",
+            ll : "Do MMM YYYY",
+            lll : "Do MMM YYYY, [klo] LT",
+            llll : "ddd, Do MMM YYYY, [klo] LT"
+        },
+        calendar : {
+            sameDay : '[tänään] [klo] LT',
+            nextDay : '[huomenna] [klo] LT',
+            nextWeek : 'dddd [klo] LT',
+            lastDay : '[eilen] [klo] LT',
+            lastWeek : '[viime] dddd[na] [klo] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s päästä",
+            past : "%s sitten",
+            s : translate,
+            m : translate,
+            mm : translate,
+            h : translate,
+            hh : translate,
+            d : translate,
+            dd : translate,
+            M : translate,
+            MM : translate,
+            y : translate,
+            yy : translate
+        },
+        ordinal : "%d.",
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/fo.js b/resources/moment/lang/fo.js
new file mode 100644 (file)
index 0000000..2f1cbb8
--- /dev/null
@@ -0,0 +1,56 @@
+// moment.js language configuration
+// language : faroese (fo)
+// author : Ragnar Johannesen : https://github.com/ragnar123
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('fo', {
+        months : "januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),
+        monthsShort : "jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),
+        weekdays : "sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),
+        weekdaysShort : "sun_mán_týs_mik_hós_frí_ley".split("_"),
+        weekdaysMin : "su_má_tý_mi_hó_fr_le".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D. MMMM, YYYY LT"
+        },
+        calendar : {
+            sameDay : '[Í dag kl.] LT',
+            nextDay : '[Í morgin kl.] LT',
+            nextWeek : 'dddd [kl.] LT',
+            lastDay : '[Í gjár kl.] LT',
+            lastWeek : '[síðstu] dddd [kl] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "um %s",
+            past : "%s síðani",
+            s : "fá sekund",
+            m : "ein minutt",
+            mm : "%d minuttir",
+            h : "ein tími",
+            hh : "%d tímar",
+            d : "ein dagur",
+            dd : "%d dagar",
+            M : "ein mánaði",
+            MM : "%d mánaðir",
+            y : "eitt ár",
+            yy : "%d ár"
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/fr-ca.js b/resources/moment/lang/fr-ca.js
new file mode 100644 (file)
index 0000000..3280d79
--- /dev/null
@@ -0,0 +1,54 @@
+// moment.js language configuration
+// language : canadian french (fr-ca)
+// author : Jonathan Abourbih : https://github.com/jonbca
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('fr-ca', {
+        months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),
+        monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),
+        weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),
+        weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"),
+        weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "YYYY-MM-DD",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[Aujourd'hui à] LT",
+            nextDay: '[Demain à] LT',
+            nextWeek: 'dddd [à] LT',
+            lastDay: '[Hier à] LT',
+            lastWeek: 'dddd [dernier à] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "dans %s",
+            past : "il y a %s",
+            s : "quelques secondes",
+            m : "une minute",
+            mm : "%d minutes",
+            h : "une heure",
+            hh : "%d heures",
+            d : "un jour",
+            dd : "%d jours",
+            M : "un mois",
+            MM : "%d mois",
+            y : "un an",
+            yy : "%d ans"
+        },
+        ordinal : function (number) {
+            return number + (number === 1 ? 'er' : '');
+        }
+    });
+}));
diff --git a/resources/moment/lang/fr.js b/resources/moment/lang/fr.js
new file mode 100644 (file)
index 0000000..6b3dc52
--- /dev/null
@@ -0,0 +1,58 @@
+// moment.js language configuration
+// language : french (fr)
+// author : John Fischer : https://github.com/jfroffice
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('fr', {
+        months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),
+        monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),
+        weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),
+        weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"),
+        weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[Aujourd'hui à] LT",
+            nextDay: '[Demain à] LT',
+            nextWeek: 'dddd [à] LT',
+            lastDay: '[Hier à] LT',
+            lastWeek: 'dddd [dernier à] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "dans %s",
+            past : "il y a %s",
+            s : "quelques secondes",
+            m : "une minute",
+            mm : "%d minutes",
+            h : "une heure",
+            hh : "%d heures",
+            d : "un jour",
+            dd : "%d jours",
+            M : "un mois",
+            MM : "%d mois",
+            y : "un an",
+            yy : "%d ans"
+        },
+        ordinal : function (number) {
+            return number + (number === 1 ? 'er' : '');
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/gl.js b/resources/moment/lang/gl.js
new file mode 100644 (file)
index 0000000..8b14127
--- /dev/null
@@ -0,0 +1,71 @@
+// moment.js language configuration
+// language : galician (gl)
+// author : Juan G. Hurtado : https://github.com/juanghurtado
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('gl', {
+        months : "Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"),
+        monthsShort : "Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"),
+        weekdays : "Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"),
+        weekdaysShort : "Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"),
+        weekdaysMin : "Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : function () {
+                return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
+            },
+            nextDay : function () {
+                return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
+            },
+            nextWeek : function () {
+                return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
+            },
+            lastDay : function () {
+                return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT';
+            },
+            lastWeek : function () {
+                return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : function (str) {
+                if (str === "uns segundos") {
+                    return "nuns segundos";
+                }
+                return "en " + str;
+            },
+            past : "hai %s",
+            s : "uns segundos",
+            m : "un minuto",
+            mm : "%d minutos",
+            h : "unha hora",
+            hh : "%d horas",
+            d : "un día",
+            dd : "%d días",
+            M : "un mes",
+            MM : "%d meses",
+            y : "un ano",
+            yy : "%d anos"
+        },
+        ordinal : '%dº',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/he.js b/resources/moment/lang/he.js
new file mode 100644 (file)
index 0000000..b85dbe8
--- /dev/null
@@ -0,0 +1,77 @@
+// moment.js language configuration
+// language : Hebrew (he)
+// author : Tomer Cohen : https://github.com/tomer
+// author : Moshe Simantov : https://github.com/DevelopmentIL
+// author : Tal Ater : https://github.com/TalAter
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('he', {
+        months : "ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),
+        monthsShort : "ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),
+        weekdays : "ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),
+        weekdaysShort : "א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),
+        weekdaysMin : "א_ב_ג_ד_ה_ו_ש".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D [ב]MMMM YYYY",
+            LLL : "D [ב]MMMM YYYY LT",
+            LLLL : "dddd, D [ב]MMMM YYYY LT",
+            l : "D/M/YYYY",
+            ll : "D MMM YYYY",
+            lll : "D MMM YYYY LT",
+            llll : "ddd, D MMM YYYY LT"
+        },
+        calendar : {
+            sameDay : '[היום ב־]LT',
+            nextDay : '[מחר ב־]LT',
+            nextWeek : 'dddd [בשעה] LT',
+            lastDay : '[אתמול ב־]LT',
+            lastWeek : '[ביום] dddd [האחרון בשעה] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "בעוד %s",
+            past : "לפני %s",
+            s : "מספר שניות",
+            m : "דקה",
+            mm : "%d דקות",
+            h : "שעה",
+            hh : function (number) {
+                if (number === 2) {
+                    return "שעתיים";
+                }
+                return number + " שעות";
+            },
+            d : "יום",
+            dd : function (number) {
+                if (number === 2) {
+                    return "יומיים";
+                }
+                return number + " ימים";
+            },
+            M : "חודש",
+            MM : function (number) {
+                if (number === 2) {
+                    return "חודשיים";
+                }
+                return number + " חודשים";
+            },
+            y : "שנה",
+            yy : function (number) {
+                if (number === 2) {
+                    return "שנתיים";
+                }
+                return number + " שנים";
+            }
+        }
+    });
+}));
diff --git a/resources/moment/lang/hi.js b/resources/moment/lang/hi.js
new file mode 100644 (file)
index 0000000..8e6e99c
--- /dev/null
@@ -0,0 +1,105 @@
+// moment.js language configuration
+// language : hindi (hi)
+// author : Mayank Singhal : https://github.com/mayanksinghal
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var symbolMap = {
+        '1': '१',
+        '2': '२',
+        '3': '३',
+        '4': '४',
+        '5': '५',
+        '6': '६',
+        '7': '७',
+        '8': '८',
+        '9': '९',
+        '0': '०'
+    },
+    numberMap = {
+        '१': '1',
+        '२': '2',
+        '३': '3',
+        '४': '4',
+        '५': '5',
+        '६': '6',
+        '७': '7',
+        '८': '8',
+        '९': '9',
+        '०': '0'
+    };
+
+    return moment.lang('hi', {
+        months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split("_"),
+        monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split("_"),
+        weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split("_"),
+        weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split("_"),
+        weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split("_"),
+        longDateFormat : {
+            LT : "A h:mm बजे",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY, LT",
+            LLLL : "dddd, D MMMM YYYY, LT"
+        },
+        calendar : {
+            sameDay : '[आज] LT',
+            nextDay : '[कल] LT',
+            nextWeek : 'dddd, LT',
+            lastDay : '[कल] LT',
+            lastWeek : '[पिछले] dddd, LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s में",
+            past : "%s पहले",
+            s : "कुछ ही क्षण",
+            m : "एक मिनट",
+            mm : "%d मिनट",
+            h : "एक घंटा",
+            hh : "%d घंटे",
+            d : "एक दिन",
+            dd : "%d दिन",
+            M : "एक महीने",
+            MM : "%d महीने",
+            y : "एक वर्ष",
+            yy : "%d वर्ष"
+        },
+        preparse: function (string) {
+            return string.replace(/[१२३४५६७८९०]/g, function (match) {
+                return numberMap[match];
+            });
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            });
+        },
+        // Hindi notation for meridiems are quite fuzzy in practice. While there exists
+        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return "रात";
+            } else if (hour < 10) {
+                return "सुबह";
+            } else if (hour < 17) {
+                return "दोपहर";
+            } else if (hour < 20) {
+                return "शाम";
+            } else {
+                return "रात";
+            }
+        },
+        week : {
+            dow : 0, // Sunday is the first day of the week.
+            doy : 6  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/hr.js b/resources/moment/lang/hr.js
new file mode 100644 (file)
index 0000000..2e3bf11
--- /dev/null
@@ -0,0 +1,140 @@
+// moment.js language configuration
+// language : hrvatski (hr)
+// author : Bojan Marković : https://github.com/bmarkovic
+
+// based on (sl) translation by Robert Sedovšek
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+
+    function translate(number, withoutSuffix, key) {
+        var result = number + " ";
+        switch (key) {
+        case 'm':
+            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+        case 'mm':
+            if (number === 1) {
+                result += 'minuta';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'minute';
+            } else {
+                result += 'minuta';
+            }
+            return result;
+        case 'h':
+            return withoutSuffix ? 'jedan sat' : 'jednog sata';
+        case 'hh':
+            if (number === 1) {
+                result += 'sat';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'sata';
+            } else {
+                result += 'sati';
+            }
+            return result;
+        case 'dd':
+            if (number === 1) {
+                result += 'dan';
+            } else {
+                result += 'dana';
+            }
+            return result;
+        case 'MM':
+            if (number === 1) {
+                result += 'mjesec';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'mjeseca';
+            } else {
+                result += 'mjeseci';
+            }
+            return result;
+        case 'yy':
+            if (number === 1) {
+                result += 'godina';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'godine';
+            } else {
+                result += 'godina';
+            }
+            return result;
+        }
+    }
+
+    return moment.lang('hr', {
+        months : "sječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),
+        monthsShort : "sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),
+        weekdays : "nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),
+        weekdaysShort : "ned._pon._uto._sri._čet._pet._sub.".split("_"),
+        weekdaysMin : "ne_po_ut_sr_če_pe_su".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "DD. MM. YYYY",
+            LL : "D. MMMM YYYY",
+            LLL : "D. MMMM YYYY LT",
+            LLLL : "dddd, D. MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay  : '[danas u] LT',
+            nextDay  : '[sutra u] LT',
+
+            nextWeek : function () {
+                switch (this.day()) {
+                case 0:
+                    return '[u] [nedjelju] [u] LT';
+                case 3:
+                    return '[u] [srijedu] [u] LT';
+                case 6:
+                    return '[u] [subotu] [u] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[u] dddd [u] LT';
+                }
+            },
+            lastDay  : '[jučer u] LT',
+            lastWeek : function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                    return '[prošlu] dddd [u] LT';
+                case 6:
+                    return '[prošle] [subote] [u] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[prošli] dddd [u] LT';
+                }
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "za %s",
+            past   : "prije %s",
+            s      : "par sekundi",
+            m      : translate,
+            mm     : translate,
+            h      : translate,
+            hh     : translate,
+            d      : "dan",
+            dd     : translate,
+            M      : "mjesec",
+            MM     : translate,
+            y      : "godinu",
+            yy     : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/hu.js b/resources/moment/lang/hu.js
new file mode 100644 (file)
index 0000000..4d84ebd
--- /dev/null
@@ -0,0 +1,98 @@
+// moment.js language configuration
+// language : hungarian (hu)
+// author : Adam Brunner : https://github.com/adambrunner
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
+
+    function translate(number, withoutSuffix, key, isFuture) {
+        var num = number,
+            suffix;
+
+        switch (key) {
+        case 's':
+            return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';
+        case 'm':
+            return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
+        case 'mm':
+            return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
+        case 'h':
+            return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
+        case 'hh':
+            return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
+        case 'd':
+            return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
+        case 'dd':
+            return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
+        case 'M':
+            return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+        case 'MM':
+            return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+        case 'y':
+            return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
+        case 'yy':
+            return num + (isFuture || withoutSuffix ? ' év' : ' éve');
+        }
+
+        return '';
+    }
+
+    function week(isFuture) {
+        return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]';
+    }
+
+    return moment.lang('hu', {
+        months : "január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),
+        monthsShort : "jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),
+        weekdays : "vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),
+        weekdaysShort : "vas_hét_kedd_sze_csüt_pén_szo".split("_"),
+        weekdaysMin : "v_h_k_sze_cs_p_szo".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "YYYY.MM.DD.",
+            LL : "YYYY. MMMM D.",
+            LLL : "YYYY. MMMM D., LT",
+            LLLL : "YYYY. MMMM D., dddd LT"
+        },
+        calendar : {
+            sameDay : '[ma] LT[-kor]',
+            nextDay : '[holnap] LT[-kor]',
+            nextWeek : function () {
+                return week.call(this, true);
+            },
+            lastDay : '[tegnap] LT[-kor]',
+            lastWeek : function () {
+                return week.call(this, false);
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s múlva",
+            past : "%s",
+            s : translate,
+            m : translate,
+            mm : translate,
+            h : translate,
+            hh : translate,
+            d : translate,
+            dd : translate,
+            M : translate,
+            MM : translate,
+            y : translate,
+            yy : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/hy-am.js b/resources/moment/lang/hy-am.js
new file mode 100644 (file)
index 0000000..951655b
--- /dev/null
@@ -0,0 +1,113 @@
+// moment.js language configuration
+// language : Armenian (hy-am)
+// author : Armendarabyan : https://github.com/armendarabyan
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+
+    function monthsCaseReplace(m, format) {
+        var months = {
+            'nominative': 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_'),
+            'accusative': 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_')
+        },
+
+        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return months[nounCase][m.month()];
+    }
+
+    function monthsShortCaseReplace(m, format) {
+        var monthsShort = 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_');
+
+        return monthsShort[m.month()];
+    }
+
+    function weekdaysCaseReplace(m, format) {
+        var weekdays = 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_');
+
+        return weekdays[m.day()];
+    }
+
+    return moment.lang('hy-am', {
+        months : monthsCaseReplace,
+        monthsShort : monthsShortCaseReplace,
+        weekdays : weekdaysCaseReplace,
+        weekdaysShort : "կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),
+        weekdaysMin : "կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD.MM.YYYY",
+            LL : "D MMMM YYYY թ.",
+            LLL : "D MMMM YYYY թ., LT",
+            LLLL : "dddd, D MMMM YYYY թ., LT"
+        },
+        calendar : {
+            sameDay: '[այսօր] LT',
+            nextDay: '[վաղը] LT',
+            lastDay: '[երեկ] LT',
+            nextWeek: function () {
+                return 'dddd [օրը ժամը] LT';
+            },
+            lastWeek: function () {
+                return '[անցած] dddd [օրը ժամը] LT';
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "%s հետո",
+            past : "%s առաջ",
+            s : "մի քանի վայրկյան",
+            m : "րոպե",
+            mm : "%d րոպե",
+            h : "ժամ",
+            hh : "%d ժամ",
+            d : "օր",
+            dd : "%d օր",
+            M : "ամիս",
+            MM : "%d ամիս",
+            y : "տարի",
+            yy : "%d տարի"
+        },
+
+        meridiem : function (hour) {
+            if (hour < 4) {
+                return "գիշերվա";
+            } else if (hour < 12) {
+                return "առավոտվա";
+            } else if (hour < 17) {
+                return "ցերեկվա";
+            } else {
+                return "երեկոյան";
+            }
+        },
+
+        ordinal: function (number, period) {
+            switch (period) {
+            case 'DDD':
+            case 'w':
+            case 'W':
+            case 'DDDo':
+                if (number === 1) {
+                    return number + '-ին';
+                }
+                return number + '-րդ';
+            default:
+                return number;
+            }
+        },
+
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/id.js b/resources/moment/lang/id.js
new file mode 100644 (file)
index 0000000..f186280
--- /dev/null
@@ -0,0 +1,67 @@
+// moment.js language configuration
+// language : Bahasa Indonesia (id)
+// author : Mohammad Satrio Utomo : https://github.com/tyok
+// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('id', {
+        months : "Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),
+        monthsShort : "Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),
+        weekdays : "Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),
+        weekdaysShort : "Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),
+        weekdaysMin : "Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),
+        longDateFormat : {
+            LT : "HH.mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY [pukul] LT",
+            LLLL : "dddd, D MMMM YYYY [pukul] LT"
+        },
+        meridiem : function (hours, minutes, isLower) {
+            if (hours < 11) {
+                return 'pagi';
+            } else if (hours < 15) {
+                return 'siang';
+            } else if (hours < 19) {
+                return 'sore';
+            } else {
+                return 'malam';
+            }
+        },
+        calendar : {
+            sameDay : '[Hari ini pukul] LT',
+            nextDay : '[Besok pukul] LT',
+            nextWeek : 'dddd [pukul] LT',
+            lastDay : '[Kemarin pukul] LT',
+            lastWeek : 'dddd [lalu pukul] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "dalam %s",
+            past : "%s yang lalu",
+            s : "beberapa detik",
+            m : "semenit",
+            mm : "%d menit",
+            h : "sejam",
+            hh : "%d jam",
+            d : "sehari",
+            dd : "%d hari",
+            M : "sebulan",
+            MM : "%d bulan",
+            y : "setahun",
+            yy : "%d tahun"
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/is.js b/resources/moment/lang/is.js
new file mode 100644 (file)
index 0000000..5b6b2a8
--- /dev/null
@@ -0,0 +1,124 @@
+// moment.js language configuration
+// language : icelandic (is)
+// author : Hinrik Örn Sigurðsson : https://github.com/hinrik
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function plural(n) {
+        if (n % 100 === 11) {
+            return true;
+        } else if (n % 10 === 1) {
+            return false;
+        }
+        return true;
+    }
+
+    function translate(number, withoutSuffix, key, isFuture) {
+        var result = number + " ";
+        switch (key) {
+        case 's':
+            return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';
+        case 'm':
+            return withoutSuffix ? 'mínúta' : 'mínútu';
+        case 'mm':
+            if (plural(number)) {
+                return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');
+            } else if (withoutSuffix) {
+                return result + 'mínúta';
+            }
+            return result + 'mínútu';
+        case 'hh':
+            if (plural(number)) {
+                return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');
+            }
+            return result + 'klukkustund';
+        case 'd':
+            if (withoutSuffix) {
+                return 'dagur';
+            }
+            return isFuture ? 'dag' : 'degi';
+        case 'dd':
+            if (plural(number)) {
+                if (withoutSuffix) {
+                    return result + 'dagar';
+                }
+                return result + (isFuture ? 'daga' : 'dögum');
+            } else if (withoutSuffix) {
+                return result + 'dagur';
+            }
+            return result + (isFuture ? 'dag' : 'degi');
+        case 'M':
+            if (withoutSuffix) {
+                return 'mánuður';
+            }
+            return isFuture ? 'mánuð' : 'mánuði';
+        case 'MM':
+            if (plural(number)) {
+                if (withoutSuffix) {
+                    return result + 'mánuðir';
+                }
+                return result + (isFuture ? 'mánuði' : 'mánuðum');
+            } else if (withoutSuffix) {
+                return result + 'mánuður';
+            }
+            return result + (isFuture ? 'mánuð' : 'mánuði');
+        case 'y':
+            return withoutSuffix || isFuture ? 'ár' : 'ári';
+        case 'yy':
+            if (plural(number)) {
+                return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
+            }
+            return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
+        }
+    }
+
+    return moment.lang('is', {
+        months : "janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),
+        monthsShort : "jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),
+        weekdays : "sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),
+        weekdaysShort : "sun_mán_þri_mið_fim_fös_lau".split("_"),
+        weekdaysMin : "Su_Má_Þr_Mi_Fi_Fö_La".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "DD/MM/YYYY",
+            LL : "D. MMMM YYYY",
+            LLL : "D. MMMM YYYY [kl.] LT",
+            LLLL : "dddd, D. MMMM YYYY [kl.] LT"
+        },
+        calendar : {
+            sameDay : '[í dag kl.] LT',
+            nextDay : '[á morgun kl.] LT',
+            nextWeek : 'dddd [kl.] LT',
+            lastDay : '[í gær kl.] LT',
+            lastWeek : '[síðasta] dddd [kl.] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "eftir %s",
+            past : "fyrir %s síðan",
+            s : translate,
+            m : translate,
+            mm : translate,
+            h : "klukkustund",
+            hh : translate,
+            d : translate,
+            dd : translate,
+            M : translate,
+            MM : translate,
+            y : translate,
+            yy : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/it.js b/resources/moment/lang/it.js
new file mode 100644 (file)
index 0000000..84b7698
--- /dev/null
@@ -0,0 +1,59 @@
+// moment.js language configuration
+// language : italian (it)
+// author : Lorenzo : https://github.com/aliem
+// author: Mattia Larentis: https://github.com/nostalgiaz
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('it', {
+        months : "Gennaio_Febbraio_Marzo_Aprile_Maggio_Giugno_Luglio_Agosto_Settembre_Ottobre_Novembre_Dicembre".split("_"),
+        monthsShort : "Gen_Feb_Mar_Apr_Mag_Giu_Lug_Ago_Set_Ott_Nov_Dic".split("_"),
+        weekdays : "Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),
+        weekdaysShort : "Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),
+        weekdaysMin : "D_L_Ma_Me_G_V_S".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: '[Oggi alle] LT',
+            nextDay: '[Domani alle] LT',
+            nextWeek: 'dddd [alle] LT',
+            lastDay: '[Ieri alle] LT',
+            lastWeek: '[lo scorso] dddd [alle] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : function (s) {
+                return ((/^[0-9].+$/).test(s) ? "tra" : "in") + " " + s;
+            },
+            past : "%s fa",
+            s : "alcuni secondi",
+            m : "un minuto",
+            mm : "%d minuti",
+            h : "un'ora",
+            hh : "%d ore",
+            d : "un giorno",
+            dd : "%d giorni",
+            M : "un mese",
+            MM : "%d mesi",
+            y : "un anno",
+            yy : "%d anni"
+        },
+        ordinal: '%dº',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/ja.js b/resources/moment/lang/ja.js
new file mode 100644 (file)
index 0000000..9cd7e9e
--- /dev/null
@@ -0,0 +1,58 @@
+// moment.js language configuration
+// language : japanese (ja)
+// author : LI Long : https://github.com/baryon
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('ja', {
+        months : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
+        monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
+        weekdays : "日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),
+        weekdaysShort : "日_月_火_水_木_金_土".split("_"),
+        weekdaysMin : "日_月_火_水_木_金_土".split("_"),
+        longDateFormat : {
+            LT : "Ah時m分",
+            L : "YYYY/MM/DD",
+            LL : "YYYY年M月D日",
+            LLL : "YYYY年M月D日LT",
+            LLLL : "YYYY年M月D日LT dddd"
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 12) {
+                return "午前";
+            } else {
+                return "午後";
+            }
+        },
+        calendar : {
+            sameDay : '[今日] LT',
+            nextDay : '[明日] LT',
+            nextWeek : '[来週]dddd LT',
+            lastDay : '[昨日] LT',
+            lastWeek : '[前週]dddd LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s後",
+            past : "%s前",
+            s : "数秒",
+            m : "1分",
+            mm : "%d分",
+            h : "1時間",
+            hh : "%d時間",
+            d : "1日",
+            dd : "%d日",
+            M : "1ヶ月",
+            MM : "%dヶ月",
+            y : "1年",
+            yy : "%d年"
+        }
+    });
+}));
diff --git a/resources/moment/lang/ka.js b/resources/moment/lang/ka.js
new file mode 100644 (file)
index 0000000..0cebdaa
--- /dev/null
@@ -0,0 +1,108 @@
+// moment.js language configuration
+// language : Georgian (ka)
+// author : Irakli Janiashvili : https://github.com/irakli-janiashvili
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+
+    function monthsCaseReplace(m, format) {
+        var months = {
+            'nominative': 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),
+            'accusative': 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_')
+        },
+
+        nounCase = (/D[oD] *MMMM?/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return months[nounCase][m.month()];
+    }
+
+    function weekdaysCaseReplace(m, format) {
+        var weekdays = {
+            'nominative': 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),
+            'accusative': 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_')
+        },
+
+        nounCase = (/(წინა|შემდეგ)/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return weekdays[nounCase][m.day()];
+    }
+
+    return moment.lang('ka', {
+        months : monthsCaseReplace,
+        monthsShort : "იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ".split("_"),
+        weekdays : weekdaysCaseReplace,
+        weekdaysShort : "კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ".split("_"),
+        weekdaysMin : "კვ_ორ_სა_ოთ_ხუ_პა_შა".split("_"),
+        longDateFormat : {
+            LT : "h:mm A",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : '[დღეს] LT[-ზე]',
+            nextDay : '[ხვალ] LT[-ზე]',
+            lastDay : '[გუშინ] LT[-ზე]',
+            nextWeek : '[შემდეგ] dddd LT[-ზე]',
+            lastWeek : '[წინა] dddd LT-ზე',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : function (s) {
+                return (/(წამი|წუთი|საათი|წელი)/).test(s) ?
+                    s.replace(/ი$/, "ში") :
+                    s + "ში";
+            },
+            past : function (s) {
+                if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) {
+                    return s.replace(/(ი|ე)$/, "ის წინ");
+                }
+                if ((/წელი/).test(s)) {
+                    return s.replace(/წელი$/, "წლის წინ");
+                }
+            },
+            s : "რამდენიმე წამი",
+            m : "წუთი",
+            mm : "%d წუთი",
+            h : "საათი",
+            hh : "%d საათი",
+            d : "დღე",
+            dd : "%d დღე",
+            M : "თვე",
+            MM : "%d თვე",
+            y : "წელი",
+            yy : "%d წელი"
+        },
+        ordinal : function (number) {
+            if (number === 0) {
+                return number;
+            }
+
+            if (number === 1) {
+                return number + "-ლი";
+            }
+
+            if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) {
+                return "მე-" + number;
+            }
+
+            return number + "-ე";
+        },
+        week : {
+            dow : 1,
+            doy : 7
+        }
+    });
+}));
diff --git a/resources/moment/lang/ko.js b/resources/moment/lang/ko.js
new file mode 100644 (file)
index 0000000..3b469df
--- /dev/null
@@ -0,0 +1,63 @@
+// moment.js language configuration
+// language : korean (ko)
+//
+// authors 
+//
+// - Kyungwook, Park : https://github.com/kyungw00k
+// - Jeeeyul Lee <jeeeyul@gmail.com>
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('ko', {
+        months : "1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),
+        monthsShort : "1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),
+        weekdays : "일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),
+        weekdaysShort : "일_월_화_수_목_금_토".split("_"),
+        weekdaysMin : "일_월_화_수_목_금_토".split("_"),
+        longDateFormat : {
+            LT : "A h시 mm분",
+            L : "YYYY.MM.DD",
+            LL : "YYYY년 MMMM D일",
+            LLL : "YYYY년 MMMM D일 LT",
+            LLLL : "YYYY년 MMMM D일 dddd LT"
+        },
+        meridiem : function (hour, minute, isUpper) {
+            return hour < 12 ? '오전' : '오후';
+        },
+        calendar : {
+            sameDay : '오늘 LT',
+            nextDay : '내일 LT',
+            nextWeek : 'dddd LT',
+            lastDay : '어제 LT',
+            lastWeek : '지난주 dddd LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s 후",
+            past : "%s 전",
+            s : "몇초",
+            ss : "%d초",
+            m : "일분",
+            mm : "%d분",
+            h : "한시간",
+            hh : "%d시간",
+            d : "하루",
+            dd : "%d일",
+            M : "한달",
+            MM : "%d달",
+            y : "일년",
+            yy : "%d년"
+        },
+        ordinal : '%d일',
+        meridiemParse : /(오전|오후)/,
+        isPM : function (token) {
+            return token === "오후";
+        }
+    });
+}));
diff --git a/resources/moment/lang/lb.js b/resources/moment/lang/lb.js
new file mode 100644 (file)
index 0000000..946ba13
--- /dev/null
@@ -0,0 +1,160 @@
+// moment.js language configuration
+// language : Luxembourgish (lb)
+// author : mweimerskirch : https://github.com/mweimerskirch
+
+// Note: Luxembourgish has a very particular phonological rule ("Eifeler Regel") that causes the
+// deletion of the final "n" in certain contexts. That's what the "eifelerRegelAppliesToWeekday"
+// and "eifelerRegelAppliesToNumber" methods are meant for
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function processRelativeTime(number, withoutSuffix, key, isFuture) {
+        var format = {
+            'm': ['eng Minutt', 'enger Minutt'],
+            'h': ['eng Stonn', 'enger Stonn'],
+            'd': ['een Dag', 'engem Dag'],
+            'dd': [number + ' Deeg', number + ' Deeg'],
+            'M': ['ee Mount', 'engem Mount'],
+            'MM': [number + ' Méint', number + ' Méint'],
+            'y': ['ee Joer', 'engem Joer'],
+            'yy': [number + ' Joer', number + ' Joer']
+        };
+        return withoutSuffix ? format[key][0] : format[key][1];
+    }
+
+    function processFutureTime(string) {
+        var number = string.substr(0, string.indexOf(' '));
+        if (eifelerRegelAppliesToNumber(number)) {
+            return "a " + string;
+        }
+        return "an " + string;
+    }
+
+    function processPastTime(string) {
+        var number = string.substr(0, string.indexOf(' '));
+        if (eifelerRegelAppliesToNumber(number)) {
+            return "viru " + string;
+        }
+        return "virun " + string;
+    }
+
+    function processLastWeek(string1) {
+        var weekday = this.format('d');
+        if (eifelerRegelAppliesToWeekday(weekday)) {
+            return '[Leschte] dddd [um] LT';
+        }
+        return '[Leschten] dddd [um] LT';
+    }
+
+    /**
+     * Returns true if the word before the given week day loses the "-n" ending.
+     * e.g. "Leschten Dënschdeg" but "Leschte Méindeg"
+     *
+     * @param weekday {integer}
+     * @returns {boolean}
+     */
+    function eifelerRegelAppliesToWeekday(weekday) {
+        weekday = parseInt(weekday, 10);
+        switch (weekday) {
+        case 0: // Sonndeg
+        case 1: // Méindeg
+        case 3: // Mëttwoch
+        case 5: // Freideg
+        case 6: // Samschdeg
+            return true;
+        default: // 2 Dënschdeg, 4 Donneschdeg
+            return false;
+        }
+    }
+
+    /**
+     * Returns true if the word before the given number loses the "-n" ending.
+     * e.g. "an 10 Deeg" but "a 5 Deeg"
+     *
+     * @param number {integer}
+     * @returns {boolean}
+     */
+    function eifelerRegelAppliesToNumber(number) {
+        number = parseInt(number, 10);
+        if (isNaN(number)) {
+            return false;
+        }
+        if (number < 0) {
+            // Negative Number --> always true
+            return true;
+        } else if (number < 10) {
+            // Only 1 digit
+            if (4 <= number && number <= 7) {
+                return true;
+            }
+            return false;
+        } else if (number < 100) {
+            // 2 digits
+            var lastDigit = number % 10, firstDigit = number / 10;
+            if (lastDigit === 0) {
+                return eifelerRegelAppliesToNumber(firstDigit);
+            }
+            return eifelerRegelAppliesToNumber(lastDigit);
+        } else if (number < 10000) {
+            // 3 or 4 digits --> recursively check first digit
+            while (number >= 10) {
+                number = number / 10;
+            }
+            return eifelerRegelAppliesToNumber(number);
+        } else {
+            // Anything larger than 4 digits: recursively check first n-3 digits
+            number = number / 1000;
+            return eifelerRegelAppliesToNumber(number);
+        }
+    }
+
+    return moment.lang('lb', {
+        months: "Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),
+        monthsShort: "Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),
+        weekdays: "Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),
+        weekdaysShort: "So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),
+        weekdaysMin: "So_Mé_Dë_Më_Do_Fr_Sa".split("_"),
+        longDateFormat: {
+            LT: "H:mm [Auer]",
+            L: "DD.MM.YYYY",
+            LL: "D. MMMM YYYY",
+            LLL: "D. MMMM YYYY LT",
+            LLLL: "dddd, D. MMMM YYYY LT"
+        },
+        calendar: {
+            sameDay: "[Haut um] LT",
+            sameElse: "L",
+            nextDay: '[Muer um] LT',
+            nextWeek: 'dddd [um] LT',
+            lastDay: '[Gëschter um] LT',
+            lastWeek: processLastWeek
+        },
+        relativeTime: {
+            future: processFutureTime,
+            past: processPastTime,
+            s: "e puer Sekonnen",
+            m: processRelativeTime,
+            mm: "%d Minutten",
+            h: processRelativeTime,
+            hh: "%d Stonnen",
+            d: processRelativeTime,
+            dd: processRelativeTime,
+            M: processRelativeTime,
+            MM: processRelativeTime,
+            y: processRelativeTime,
+            yy: processRelativeTime
+        },
+        ordinal: '%d.',
+        week: {
+            dow: 1, // Monday is the first day of the week.
+            doy: 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/lt.js b/resources/moment/lang/lt.js
new file mode 100644 (file)
index 0000000..1cf6457
--- /dev/null
@@ -0,0 +1,118 @@
+// moment.js language configuration
+// language : Lithuanian (lt)
+// author : Mindaugas Mozūras : https://github.com/mmozuras
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var units = {
+        "m" : "minutė_minutės_minutę",
+        "mm": "minutės_minučių_minutes",
+        "h" : "valanda_valandos_valandą",
+        "hh": "valandos_valandų_valandas",
+        "d" : "diena_dienos_dieną",
+        "dd": "dienos_dienų_dienas",
+        "M" : "mėnuo_mėnesio_mėnesį",
+        "MM": "mėnesiai_mėnesių_mėnesius",
+        "y" : "metai_metų_metus",
+        "yy": "metai_metų_metus"
+    },
+    weekDays = "pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis_sekmadienis".split("_");
+
+    function translateSeconds(number, withoutSuffix, key, isFuture) {
+        if (withoutSuffix) {
+            return "kelios sekundės";
+        } else {
+            return isFuture ? "kelių sekundžių" : "kelias sekundes";
+        }
+    }
+
+    function translateSingular(number, withoutSuffix, key, isFuture) {
+        return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]);
+    }
+
+    function special(number) {
+        return number % 10 === 0 || (number > 10 && number < 20);
+    }
+
+    function forms(key) {
+        return units[key].split("_");
+    }
+
+    function translate(number, withoutSuffix, key, isFuture) {
+        var result = number + " ";
+        if (number === 1) {
+            return result + translateSingular(number, withoutSuffix, key[0], isFuture);
+        } else if (withoutSuffix) {
+            return result + (special(number) ? forms(key)[1] : forms(key)[0]);
+        } else {
+            if (isFuture) {
+                return result + forms(key)[1];
+            } else {
+                return result + (special(number) ? forms(key)[1] : forms(key)[2]);
+            }
+        }
+    }
+
+    function relativeWeekDay(moment, format) {
+        var nominative = format.indexOf('dddd LT') === -1,
+            weekDay = weekDays[moment.weekday()];
+
+        return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + "į";
+    }
+
+    return moment.lang("lt", {
+        months : "sausio_vasario_kovo_balandžio_gegužės_biržėlio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),
+        monthsShort : "sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),
+        weekdays : relativeWeekDay,
+        weekdaysShort : "Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),
+        weekdaysMin : "S_P_A_T_K_Pn_Š".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "YYYY-MM-DD",
+            LL : "YYYY [m.] MMMM D [d.]",
+            LLL : "YYYY [m.] MMMM D [d.], LT [val.]",
+            LLLL : "YYYY [m.] MMMM D [d.], dddd, LT [val.]",
+            l : "YYYY-MM-DD",
+            ll : "YYYY [m.] MMMM D [d.]",
+            lll : "YYYY [m.] MMMM D [d.], LT [val.]",
+            llll : "YYYY [m.] MMMM D [d.], ddd, LT [val.]"
+        },
+        calendar : {
+            sameDay : "[Šiandien] LT",
+            nextDay : "[Rytoj] LT",
+            nextWeek : "dddd LT",
+            lastDay : "[Vakar] LT",
+            lastWeek : "[Praėjusį] dddd LT",
+            sameElse : "L"
+        },
+        relativeTime : {
+            future : "po %s",
+            past : "prieš %s",
+            s : translateSeconds,
+            m : translateSingular,
+            mm : translate,
+            h : translateSingular,
+            hh : translate,
+            d : translateSingular,
+            dd : translate,
+            M : translateSingular,
+            MM : translate,
+            y : translateSingular,
+            yy : translate
+        },
+        ordinal : function (number) {
+            return number + '-oji';
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/lv.js b/resources/moment/lang/lv.js
new file mode 100644 (file)
index 0000000..ffe25cf
--- /dev/null
@@ -0,0 +1,77 @@
+// moment.js language configuration
+// language : latvian (lv)
+// author : Kristaps Karlsons : https://github.com/skakri
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var units = {
+        'mm': 'minūti_minūtes_minūte_minūtes',
+        'hh': 'stundu_stundas_stunda_stundas',
+        'dd': 'dienu_dienas_diena_dienas',
+        'MM': 'mēnesi_mēnešus_mēnesis_mēneši',
+        'yy': 'gadu_gadus_gads_gadi'
+    };
+
+    function format(word, number, withoutSuffix) {
+        var forms = word.split('_');
+        if (withoutSuffix) {
+            return number % 10 === 1 && number !== 11 ? forms[2] : forms[3];
+        } else {
+            return number % 10 === 1 && number !== 11 ? forms[0] : forms[1];
+        }
+    }
+
+    function relativeTimeWithPlural(number, withoutSuffix, key) {
+        return number + ' ' + format(units[key], number, withoutSuffix);
+    }
+
+    return moment.lang('lv', {
+        months : "janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),
+        monthsShort : "jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),
+        weekdays : "svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),
+        weekdaysShort : "Sv_P_O_T_C_Pk_S".split("_"),
+        weekdaysMin : "Sv_P_O_T_C_Pk_S".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD.MM.YYYY",
+            LL : "YYYY. [gada] D. MMMM",
+            LLL : "YYYY. [gada] D. MMMM, LT",
+            LLLL : "YYYY. [gada] D. MMMM, dddd, LT"
+        },
+        calendar : {
+            sameDay : '[Šodien pulksten] LT',
+            nextDay : '[Rīt pulksten] LT',
+            nextWeek : 'dddd [pulksten] LT',
+            lastDay : '[Vakar pulksten] LT',
+            lastWeek : '[Pagājušā] dddd [pulksten] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s vēlāk",
+            past : "%s agrāk",
+            s : "dažas sekundes",
+            m : "minūti",
+            mm : relativeTimeWithPlural,
+            h : "stundu",
+            hh : relativeTimeWithPlural,
+            d : "dienu",
+            dd : relativeTimeWithPlural,
+            M : "mēnesi",
+            MM : relativeTimeWithPlural,
+            y : "gadu",
+            yy : relativeTimeWithPlural
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/mk.js b/resources/moment/lang/mk.js
new file mode 100644 (file)
index 0000000..5f272fa
--- /dev/null
@@ -0,0 +1,86 @@
+// moment.js language configuration
+// language : macedonian (mk)
+// author : Borislav Mickov : https://github.com/B0k0
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('mk', {
+        months : "јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември".split("_"),
+        monthsShort : "јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек".split("_"),
+        weekdays : "недела_понеделник_вторник_среда_четврток_петок_сабота".split("_"),
+        weekdaysShort : "нед_пон_вто_сре_чет_пет_саб".split("_"),
+        weekdaysMin : "нe_пo_вт_ср_че_пе_сa".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "D.MM.YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : '[Денес во] LT',
+            nextDay : '[Утре во] LT',
+            nextWeek : 'dddd [во] LT',
+            lastDay : '[Вчера во] LT',
+            lastWeek : function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                case 6:
+                    return '[Во изминатата] dddd [во] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[Во изминатиот] dddd [во] LT';
+                }
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "после %s",
+            past : "пред %s",
+            s : "неколку секунди",
+            m : "минута",
+            mm : "%d минути",
+            h : "час",
+            hh : "%d часа",
+            d : "ден",
+            dd : "%d дена",
+            M : "месец",
+            MM : "%d месеци",
+            y : "година",
+            yy : "%d години"
+        },
+        ordinal : function (number) {
+            var lastDigit = number % 10,
+                last2Digits = number % 100;
+            if (number === 0) {
+                return number + '-ев';
+            } else if (last2Digits === 0) {
+                return number + '-ен';
+            } else if (last2Digits > 10 && last2Digits < 20) {
+                return number + '-ти';
+            } else if (lastDigit === 1) {
+                return number + '-ви';
+            } else if (lastDigit === 2) {
+                return number + '-ри';
+            } else if (lastDigit === 7 || lastDigit === 8) {
+                return number + '-ми';
+            } else {
+                return number + '-ти';
+            }
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/ml.js b/resources/moment/lang/ml.js
new file mode 100644 (file)
index 0000000..cc7db9a
--- /dev/null
@@ -0,0 +1,64 @@
+// moment.js language configuration
+// language : malayalam (ml)
+// author : Floyd Pink : https://github.com/floydpink
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('ml', {
+        months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split("_"),
+        monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split("_"),
+        weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split("_"),
+        weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split("_"),
+        weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split("_"),
+        longDateFormat : {
+            LT : "A h:mm -നു",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY, LT",
+            LLLL : "dddd, D MMMM YYYY, LT"
+        },
+        calendar : {
+            sameDay : '[ഇന്ന്] LT',
+            nextDay : '[നാളെ] LT',
+            nextWeek : 'dddd, LT',
+            lastDay : '[ഇന്നലെ] LT',
+            lastWeek : '[കഴിഞ്ഞ] dddd, LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s കഴിഞ്ഞ്",
+            past : "%s മുൻപ്",
+            s : "അൽപ നിമിഷങ്ങൾ",
+            m : "ഒരു മിനിറ്റ്",
+            mm : "%d മിനിറ്റ്",
+            h : "ഒരു മണിക്കൂർ",
+            hh : "%d മണിക്കൂർ",
+            d : "ഒരു ദിവസം",
+            dd : "%d ദിവസം",
+            M : "ഒരു മാസം",
+            MM : "%d മാസം",
+            y : "ഒരു വർഷം",
+            yy : "%d വർഷം"
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return "രാത്രി";
+            } else if (hour < 12) {
+                return "രാവിലെ";
+            } else if (hour < 17) {
+                return "ഉച്ച കഴിഞ്ഞ്";
+            } else if (hour < 20) {
+                return "വൈകുന്നേരം";
+            } else {
+                return "രാത്രി";
+            }
+        }
+    });
+}));
diff --git a/resources/moment/lang/mr.js b/resources/moment/lang/mr.js
new file mode 100644 (file)
index 0000000..0d1adfd
--- /dev/null
@@ -0,0 +1,104 @@
+// moment.js language configuration
+// language : Marathi (mr)
+// author : Harshad Kale : https://github.com/kalehv
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var symbolMap = {
+        '1': '१',
+        '2': '२',
+        '3': '३',
+        '4': '४',
+        '5': '५',
+        '6': '६',
+        '7': '७',
+        '8': '८',
+        '9': '९',
+        '0': '०'
+    },
+    numberMap = {
+        '१': '1',
+        '२': '2',
+        '३': '3',
+        '४': '4',
+        '५': '5',
+        '६': '6',
+        '७': '7',
+        '८': '8',
+        '९': '9',
+        '०': '0'
+    };
+
+    return moment.lang('mr', {
+        months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split("_"),
+        monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split("_"),
+        weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split("_"),
+        weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split("_"),
+        weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split("_"),
+        longDateFormat : {
+            LT : "A h:mm वाजता",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY, LT",
+            LLLL : "dddd, D MMMM YYYY, LT"
+        },
+        calendar : {
+            sameDay : '[आज] LT',
+            nextDay : '[उद्या] LT',
+            nextWeek : 'dddd, LT',
+            lastDay : '[काल] LT',
+            lastWeek: '[मागील] dddd, LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s नंतर",
+            past : "%s पूर्वी",
+            s : "सेकंद",
+            m: "एक मिनिट",
+            mm: "%d मिनिटे",
+            h : "एक तास",
+            hh : "%d तास",
+            d : "एक दिवस",
+            dd : "%d दिवस",
+            M : "एक महिना",
+            MM : "%d महिने",
+            y : "एक वर्ष",
+            yy : "%d वर्षे"
+        },
+        preparse: function (string) {
+            return string.replace(/[१२३४५६७८९०]/g, function (match) {
+                return numberMap[match];
+            });
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            });
+        },
+        meridiem: function (hour, minute, isLower)
+        {
+            if (hour < 4) {
+                return "रात्री";
+            } else if (hour < 10) {
+                return "सकाळी";
+            } else if (hour < 17) {
+                return "दुपारी";
+            } else if (hour < 20) {
+                return "सायंकाळी";
+            } else {
+                return "रात्री";
+            }
+        },
+        week : {
+            dow : 0, // Sunday is the first day of the week.
+            doy : 6  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/ms-my.js b/resources/moment/lang/ms-my.js
new file mode 100644 (file)
index 0000000..501d5aa
--- /dev/null
@@ -0,0 +1,66 @@
+// moment.js language configuration
+// language : Bahasa Malaysia (ms-MY)
+// author : Weldan Jamili : https://github.com/weldan
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('ms-my', {
+        months : "Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),
+        monthsShort : "Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),
+        weekdays : "Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),
+        weekdaysShort : "Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),
+        weekdaysMin : "Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),
+        longDateFormat : {
+            LT : "HH.mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY [pukul] LT",
+            LLLL : "dddd, D MMMM YYYY [pukul] LT"
+        },
+        meridiem : function (hours, minutes, isLower) {
+            if (hours < 11) {
+                return 'pagi';
+            } else if (hours < 15) {
+                return 'tengahari';
+            } else if (hours < 19) {
+                return 'petang';
+            } else {
+                return 'malam';
+            }
+        },
+        calendar : {
+            sameDay : '[Hari ini pukul] LT',
+            nextDay : '[Esok pukul] LT',
+            nextWeek : 'dddd [pukul] LT',
+            lastDay : '[Kelmarin pukul] LT',
+            lastWeek : 'dddd [lepas pukul] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "dalam %s",
+            past : "%s yang lepas",
+            s : "beberapa saat",
+            m : "seminit",
+            mm : "%d minit",
+            h : "sejam",
+            hh : "%d jam",
+            d : "sehari",
+            dd : "%d hari",
+            M : "sebulan",
+            MM : "%d bulan",
+            y : "setahun",
+            yy : "%d tahun"
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/nb.js b/resources/moment/lang/nb.js
new file mode 100644 (file)
index 0000000..2f652ef
--- /dev/null
@@ -0,0 +1,57 @@
+// moment.js language configuration
+// language : norwegian bokmål (nb)
+// authors : Espen Hovlandsdal : https://github.com/rexxars
+//           Sigurd Gartmann : https://github.com/sigurdga
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('nb', {
+        months : "januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),
+        monthsShort : "jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),
+        weekdays : "søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),
+        weekdaysShort : "sø._ma._ti._on._to._fr._lø.".split("_"),
+        weekdaysMin : "sø_ma_ti_on_to_fr_lø".split("_"),
+        longDateFormat : {
+            LT : "H.mm",
+            L : "DD.MM.YYYY",
+            LL : "D. MMMM YYYY",
+            LLL : "D. MMMM YYYY [kl.] LT",
+            LLLL : "dddd D. MMMM YYYY [kl.] LT"
+        },
+        calendar : {
+            sameDay: '[i dag kl.] LT',
+            nextDay: '[i morgen kl.] LT',
+            nextWeek: 'dddd [kl.] LT',
+            lastDay: '[i går kl.] LT',
+            lastWeek: '[forrige] dddd [kl.] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "om %s",
+            past : "for %s siden",
+            s : "noen sekunder",
+            m : "ett minutt",
+            mm : "%d minutter",
+            h : "en time",
+            hh : "%d timer",
+            d : "en dag",
+            dd : "%d dager",
+            M : "en måned",
+            MM : "%d måneder",
+            y : "ett år",
+            yy : "%d år"
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/ne.js b/resources/moment/lang/ne.js
new file mode 100644 (file)
index 0000000..1d57b8c
--- /dev/null
@@ -0,0 +1,105 @@
+// moment.js language configuration
+// language : nepali/nepalese
+// author : suvash : https://github.com/suvash
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var symbolMap = {
+        '1': '१',
+        '2': '२',
+        '3': '३',
+        '4': '४',
+        '5': '५',
+        '6': '६',
+        '7': '७',
+        '8': '८',
+        '9': '९',
+        '0': '०'
+    },
+    numberMap = {
+        '१': '1',
+        '२': '2',
+        '३': '3',
+        '४': '4',
+        '५': '5',
+        '६': '6',
+        '७': '7',
+        '८': '8',
+        '९': '9',
+        '०': '0'
+    };
+
+    return moment.lang('ne', {
+        months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split("_"),
+        monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split("_"),
+        weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split("_"),
+        weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split("_"),
+        weekdaysMin : 'आइ._सो._मङ्_बु._बि._शु._श.'.split("_"),
+        longDateFormat : {
+            LT : "Aको h:mm बजे",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY, LT",
+            LLLL : "dddd, D MMMM YYYY, LT"
+        },
+        preparse: function (string) {
+            return string.replace(/[१२३४५६७८९०]/g, function (match) {
+                return numberMap[match];
+            });
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            });
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 3) {
+                return "राती";
+            } else if (hour < 10) {
+                return "बिहान";
+            } else if (hour < 15) {
+                return "दिउँसो";
+            } else if (hour < 18) {
+                return "बेलुका";
+            } else if (hour < 20) {
+                return "साँझ";
+            } else {
+                return "राती";
+            }
+        },
+        calendar : {
+            sameDay : '[आज] LT',
+            nextDay : '[भोली] LT',
+            nextWeek : '[आउँदो] dddd[,] LT',
+            lastDay : '[हिजो] LT',
+            lastWeek : '[गएको] dddd[,] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%sमा",
+            past : "%s अगाडी",
+            s : "केही समय",
+            m : "एक मिनेट",
+            mm : "%d मिनेट",
+            h : "एक घण्टा",
+            hh : "%d घण्टा",
+            d : "एक दिन",
+            dd : "%d दिन",
+            M : "एक महिना",
+            MM : "%d महिना",
+            y : "एक बर्ष",
+            yy : "%d बर्ष"
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/nl.js b/resources/moment/lang/nl.js
new file mode 100644 (file)
index 0000000..ffd454f
--- /dev/null
@@ -0,0 +1,67 @@
+// moment.js language configuration
+// language : dutch (nl)
+// author : Joris Röling : https://github.com/jjupiter
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var monthsShortWithDots = "jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),
+        monthsShortWithoutDots = "jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");
+
+    return moment.lang('nl', {
+        months : "januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),
+        monthsShort : function (m, format) {
+            if (/-MMM-/.test(format)) {
+                return monthsShortWithoutDots[m.month()];
+            } else {
+                return monthsShortWithDots[m.month()];
+            }
+        },
+        weekdays : "zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),
+        weekdaysShort : "zo._ma._di._wo._do._vr._za.".split("_"),
+        weekdaysMin : "Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD-MM-YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: '[vandaag om] LT',
+            nextDay: '[morgen om] LT',
+            nextWeek: 'dddd [om] LT',
+            lastDay: '[gisteren om] LT',
+            lastWeek: '[afgelopen] dddd [om] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "over %s",
+            past : "%s geleden",
+            s : "een paar seconden",
+            m : "één minuut",
+            mm : "%d minuten",
+            h : "één uur",
+            hh : "%d uur",
+            d : "één dag",
+            dd : "%d dagen",
+            M : "één maand",
+            MM : "%d maanden",
+            y : "één jaar",
+            yy : "%d jaar"
+        },
+        ordinal : function (number) {
+            return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/nn.js b/resources/moment/lang/nn.js
new file mode 100644 (file)
index 0000000..f59c415
--- /dev/null
@@ -0,0 +1,56 @@
+// moment.js language configuration
+// language : norwegian nynorsk (nn)
+// author : https://github.com/mechuwind
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('nn', {
+        months : "januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),
+        monthsShort : "jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),
+        weekdays : "sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),
+        weekdaysShort : "sun_mån_tys_ons_tor_fre_lau".split("_"),
+        weekdaysMin : "su_må_ty_on_to_fr_lø".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD.MM.YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: '[I dag klokka] LT',
+            nextDay: '[I morgon klokka] LT',
+            nextWeek: 'dddd [klokka] LT',
+            lastDay: '[I går klokka] LT',
+            lastWeek: '[Føregående] dddd [klokka] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "om %s",
+            past : "for %s siden",
+            s : "noen sekund",
+            m : "ett minutt",
+            mm : "%d minutt",
+            h : "en time",
+            hh : "%d timar",
+            d : "en dag",
+            dd : "%d dagar",
+            M : "en månad",
+            MM : "%d månader",
+            y : "ett år",
+            yy : "%d år"
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/pl.js b/resources/moment/lang/pl.js
new file mode 100644 (file)
index 0000000..97770d2
--- /dev/null
@@ -0,0 +1,98 @@
+// moment.js language configuration
+// language : polish (pl)
+// author : Rafal Hirsz : https://github.com/evoL
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var monthsNominative = "styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),
+        monthsSubjective = "stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");
+
+    function plural(n) {
+        return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1);
+    }
+
+    function translate(number, withoutSuffix, key) {
+        var result = number + " ";
+        switch (key) {
+        case 'm':
+            return withoutSuffix ? 'minuta' : 'minutę';
+        case 'mm':
+            return result + (plural(number) ? 'minuty' : 'minut');
+        case 'h':
+            return withoutSuffix  ? 'godzina'  : 'godzinę';
+        case 'hh':
+            return result + (plural(number) ? 'godziny' : 'godzin');
+        case 'MM':
+            return result + (plural(number) ? 'miesiące' : 'miesięcy');
+        case 'yy':
+            return result + (plural(number) ? 'lata' : 'lat');
+        }
+    }
+
+    return moment.lang('pl', {
+        months : function (momentToFormat, format) {
+            if (/D MMMM/.test(format)) {
+                return monthsSubjective[momentToFormat.month()];
+            } else {
+                return monthsNominative[momentToFormat.month()];
+            }
+        },
+        monthsShort : "sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),
+        weekdays : "niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),
+        weekdaysShort : "nie_pon_wt_śr_czw_pt_sb".split("_"),
+        weekdaysMin : "N_Pn_Wt_Śr_Cz_Pt_So".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD.MM.YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: '[Dziś o] LT',
+            nextDay: '[Jutro o] LT',
+            nextWeek: '[W] dddd [o] LT',
+            lastDay: '[Wczoraj o] LT',
+            lastWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[W zeszłą niedzielę o] LT';
+                case 3:
+                    return '[W zeszłą środę o] LT';
+                case 6:
+                    return '[W zeszłą sobotę o] LT';
+                default:
+                    return '[W zeszły] dddd [o] LT';
+                }
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "za %s",
+            past : "%s temu",
+            s : "kilka sekund",
+            m : translate,
+            mm : translate,
+            h : translate,
+            hh : translate,
+            d : "1 dzień",
+            dd : '%d dni',
+            M : "miesiąc",
+            MM : translate,
+            y : "rok",
+            yy : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/pt-br.js b/resources/moment/lang/pt-br.js
new file mode 100644 (file)
index 0000000..5cac19b
--- /dev/null
@@ -0,0 +1,56 @@
+// moment.js language configuration
+// language : brazilian portuguese (pt-br)
+// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('pt-br', {
+        months : "Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),
+        monthsShort : "Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),
+        weekdays : "Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),
+        weekdaysShort : "Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),
+        weekdaysMin : "Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D [de] MMMM [de] YYYY",
+            LLL : "D [de] MMMM [de] YYYY LT",
+            LLLL : "dddd, D [de] MMMM [de] YYYY LT"
+        },
+        calendar : {
+            sameDay: '[Hoje às] LT',
+            nextDay: '[Amanhã às] LT',
+            nextWeek: 'dddd [às] LT',
+            lastDay: '[Ontem às] LT',
+            lastWeek: function () {
+                return (this.day() === 0 || this.day() === 6) ?
+                    '[Último] dddd [às] LT' : // Saturday + Sunday
+                    '[Última] dddd [às] LT'; // Monday - Friday
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "em %s",
+            past : "%s atrás",
+            s : "segundos",
+            m : "um minuto",
+            mm : "%d minutos",
+            h : "uma hora",
+            hh : "%d horas",
+            d : "um dia",
+            dd : "%d dias",
+            M : "um mês",
+            MM : "%d meses",
+            y : "um ano",
+            yy : "%d anos"
+        },
+        ordinal : '%dº'
+    });
+}));
diff --git a/resources/moment/lang/pt.js b/resources/moment/lang/pt.js
new file mode 100644 (file)
index 0000000..7c1f2b5
--- /dev/null
@@ -0,0 +1,60 @@
+// moment.js language configuration
+// language : portuguese (pt)
+// author : Jefferson : https://github.com/jalex79
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('pt', {
+        months : "Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),
+        monthsShort : "Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),
+        weekdays : "Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),
+        weekdaysShort : "Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),
+        weekdaysMin : "Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D [de] MMMM [de] YYYY",
+            LLL : "D [de] MMMM [de] YYYY LT",
+            LLLL : "dddd, D [de] MMMM [de] YYYY LT"
+        },
+        calendar : {
+            sameDay: '[Hoje às] LT',
+            nextDay: '[Amanhã às] LT',
+            nextWeek: 'dddd [às] LT',
+            lastDay: '[Ontem às] LT',
+            lastWeek: function () {
+                return (this.day() === 0 || this.day() === 6) ?
+                    '[Último] dddd [às] LT' : // Saturday + Sunday
+                    '[Última] dddd [às] LT'; // Monday - Friday
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "em %s",
+            past : "%s atrás",
+            s : "segundos",
+            m : "um minuto",
+            mm : "%d minutos",
+            h : "uma hora",
+            hh : "%d horas",
+            d : "um dia",
+            dd : "%d dias",
+            M : "um mês",
+            MM : "%d meses",
+            y : "um ano",
+            yy : "%d anos"
+        },
+        ordinal : '%dº',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/ro.js b/resources/moment/lang/ro.js
new file mode 100644 (file)
index 0000000..77d7355
--- /dev/null
@@ -0,0 +1,72 @@
+// moment.js language configuration
+// language : romanian (ro)
+// author : Vlad Gurdiga : https://github.com/gurdiga
+// author : Valentin Agachi : https://github.com/avaly
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function relativeTimeWithPlural(number, withoutSuffix, key) {
+        var format = {
+            'mm': 'minute',
+            'hh': 'ore',
+            'dd': 'zile',
+            'MM': 'luni',
+            'yy': 'ani'
+        },
+            separator = ' ';
+        if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {
+            separator = ' de ';
+        }
+
+        return number + separator + format[key];
+    }
+
+    return moment.lang('ro', {
+        months : "ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),
+        monthsShort : "ian_feb_mar_apr_mai_iun_iul_aug_sep_oct_noi_dec".split("_"),
+        weekdays : "duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),
+        weekdaysShort : "Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),
+        weekdaysMin : "Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "DD.MM.YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY H:mm",
+            LLLL : "dddd, D MMMM YYYY H:mm"
+        },
+        calendar : {
+            sameDay: "[azi la] LT",
+            nextDay: '[mâine la] LT',
+            nextWeek: 'dddd [la] LT',
+            lastDay: '[ieri la] LT',
+            lastWeek: '[fosta] dddd [la] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "peste %s",
+            past : "%s în urmă",
+            s : "câteva secunde",
+            m : "un minut",
+            mm : relativeTimeWithPlural,
+            h : "o oră",
+            hh : relativeTimeWithPlural,
+            d : "o zi",
+            dd : relativeTimeWithPlural,
+            M : "o lună",
+            MM : relativeTimeWithPlural,
+            y : "un an",
+            yy : relativeTimeWithPlural
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/rs.js b/resources/moment/lang/rs.js
new file mode 100644 (file)
index 0000000..8627553
--- /dev/null
@@ -0,0 +1,139 @@
+// moment.js language configuration
+// language : serbian (rs)
+// author : Limon Monte : https://github.com/limonte
+// based on (bs) translation by Nedim Cholich
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+
+    function translate(number, withoutSuffix, key) {
+        var result = number + " ";
+        switch (key) {
+        case 'm':
+            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+        case 'mm':
+            if (number === 1) {
+                result += 'minuta';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'minute';
+            } else {
+                result += 'minuta';
+            }
+            return result;
+        case 'h':
+            return withoutSuffix ? 'jedan sat' : 'jednog sata';
+        case 'hh':
+            if (number === 1) {
+                result += 'sat';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'sata';
+            } else {
+                result += 'sati';
+            }
+            return result;
+        case 'dd':
+            if (number === 1) {
+                result += 'dan';
+            } else {
+                result += 'dana';
+            }
+            return result;
+        case 'MM':
+            if (number === 1) {
+                result += 'mesec';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'meseca';
+            } else {
+                result += 'meseci';
+            }
+            return result;
+        case 'yy':
+            if (number === 1) {
+                result += 'godina';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'godine';
+            } else {
+                result += 'godina';
+            }
+            return result;
+        }
+    }
+
+    return moment.lang('rs', {
+        months : "januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),
+        monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),
+        weekdays : "nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota".split("_"),
+        weekdaysShort : "ned._pon._uto._sre._čet._pet._sub.".split("_"),
+        weekdaysMin : "ne_po_ut_sr_če_pe_su".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "DD. MM. YYYY",
+            LL : "D. MMMM YYYY",
+            LLL : "D. MMMM YYYY LT",
+            LLLL : "dddd, D. MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay  : '[danas u] LT',
+            nextDay  : '[sutra u] LT',
+
+            nextWeek : function () {
+                switch (this.day()) {
+                case 0:
+                    return '[u] [nedelju] [u] LT';
+                case 3:
+                    return '[u] [sredu] [u] LT';
+                case 6:
+                    return '[u] [subotu] [u] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[u] dddd [u] LT';
+                }
+            },
+            lastDay  : '[juče u] LT',
+            lastWeek : function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                    return '[prošlu] dddd [u] LT';
+                case 6:
+                    return '[prošle] [subote] [u] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[prošli] dddd [u] LT';
+                }
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "za %s",
+            past   : "pre %s",
+            s      : "par sekundi",
+            m      : translate,
+            mm     : translate,
+            h      : translate,
+            hh     : translate,
+            d      : "dan",
+            dd     : translate,
+            M      : "mesec",
+            MM     : translate,
+            y      : "godinu",
+            yy     : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/ru.js b/resources/moment/lang/ru.js
new file mode 100644 (file)
index 0000000..1d1816c
--- /dev/null
@@ -0,0 +1,163 @@
+// moment.js language configuration
+// language : russian (ru)
+// author : Viktorminator : https://github.com/Viktorminator
+// Author : Menelion Elensúle : https://github.com/Oire
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function plural(word, num) {
+        var forms = word.split('_');
+        return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+    }
+
+    function relativeTimeWithPlural(number, withoutSuffix, key) {
+        var format = {
+            'mm': 'минута_минуты_минут',
+            'hh': 'час_часа_часов',
+            'dd': 'день_дня_дней',
+            'MM': 'месяц_месяца_месяцев',
+            'yy': 'год_года_лет'
+        };
+        if (key === 'm') {
+            return withoutSuffix ? 'минута' : 'минуту';
+        }
+        else {
+            return number + ' ' + plural(format[key], +number);
+        }
+    }
+
+    function monthsCaseReplace(m, format) {
+        var months = {
+            'nominative': 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
+            'accusative': 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_')
+        },
+
+        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return months[nounCase][m.month()];
+    }
+
+    function monthsShortCaseReplace(m, format) {
+        var monthsShort = {
+            'nominative': 'янв_фев_мар_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
+            'accusative': 'янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек'.split('_')
+        },
+
+        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return monthsShort[nounCase][m.month()];
+    }
+
+    function weekdaysCaseReplace(m, format) {
+        var weekdays = {
+            'nominative': 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),
+            'accusative': 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_')
+        },
+
+        nounCase = (/\[ ?[Вв] ?(?:прошлую|следующую)? ?\] ?dddd/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return weekdays[nounCase][m.day()];
+    }
+
+    return moment.lang('ru', {
+        months : monthsCaseReplace,
+        monthsShort : monthsShortCaseReplace,
+        weekdays : weekdaysCaseReplace,
+        weekdaysShort : "вс_пн_вт_ср_чт_пт_сб".split("_"),
+        weekdaysMin : "вс_пн_вт_ср_чт_пт_сб".split("_"),
+        monthsParse : [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|я]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i],
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD.MM.YYYY",
+            LL : "D MMMM YYYY г.",
+            LLL : "D MMMM YYYY г., LT",
+            LLLL : "dddd, D MMMM YYYY г., LT"
+        },
+        calendar : {
+            sameDay: '[Сегодня в] LT',
+            nextDay: '[Завтра в] LT',
+            lastDay: '[Вчера в] LT',
+            nextWeek: function () {
+                return this.day() === 2 ? '[Во] dddd [в] LT' : '[В] dddd [в] LT';
+            },
+            lastWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[В прошлое] dddd [в] LT';
+                case 1:
+                case 2:
+                case 4:
+                    return '[В прошлый] dddd [в] LT';
+                case 3:
+                case 5:
+                case 6:
+                    return '[В прошлую] dddd [в] LT';
+                }
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "через %s",
+            past : "%s назад",
+            s : "несколько секунд",
+            m : relativeTimeWithPlural,
+            mm : relativeTimeWithPlural,
+            h : "час",
+            hh : relativeTimeWithPlural,
+            d : "день",
+            dd : relativeTimeWithPlural,
+            M : "месяц",
+            MM : relativeTimeWithPlural,
+            y : "год",
+            yy : relativeTimeWithPlural
+        },
+
+        // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
+
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return "ночи";
+            } else if (hour < 12) {
+                return "утра";
+            } else if (hour < 17) {
+                return "дня";
+            } else {
+                return "вечера";
+            }
+        },
+
+        ordinal: function (number, period) {
+            switch (period) {
+            case 'M':
+            case 'd':
+            case 'DDD':
+                return number + '-й';
+            case 'D':
+                return number + '-го';
+            case 'w':
+            case 'W':
+                return number + '-я';
+            default:
+                return number;
+            }
+        },
+
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/sk.js b/resources/moment/lang/sk.js
new file mode 100644 (file)
index 0000000..ed8a41d
--- /dev/null
@@ -0,0 +1,156 @@
+// moment.js language configuration
+// language : slovak (sk)
+// author : Martin Minka : https://github.com/k2s
+// based on work of petrbela : https://github.com/petrbela
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var months = "január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),
+        monthsShort = "jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");
+
+    function plural(n) {
+        return (n > 1) && (n < 5);
+    }
+
+    function translate(number, withoutSuffix, key, isFuture) {
+        var result = number + " ";
+        switch (key) {
+        case 's':  // a few seconds / in a few seconds / a few seconds ago
+            return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami';
+        case 'm':  // a minute / in a minute / a minute ago
+            return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');
+        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'minúty' : 'minút');
+            } else {
+                return result + 'minútami';
+            }
+            break;
+        case 'h':  // an hour / in an hour / an hour ago
+            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+        case 'hh': // 9 hours / in 9 hours / 9 hours ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'hodiny' : 'hodín');
+            } else {
+                return result + 'hodinami';
+            }
+            break;
+        case 'd':  // a day / in a day / a day ago
+            return (withoutSuffix || isFuture) ? 'deň' : 'dňom';
+        case 'dd': // 9 days / in 9 days / 9 days ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'dni' : 'dní');
+            } else {
+                return result + 'dňami';
+            }
+            break;
+        case 'M':  // a month / in a month / a month ago
+            return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';
+        case 'MM': // 9 months / in 9 months / 9 months ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'mesiace' : 'mesiacov');
+            } else {
+                return result + 'mesiacmi';
+            }
+            break;
+        case 'y':  // a year / in a year / a year ago
+            return (withoutSuffix || isFuture) ? 'rok' : 'rokom';
+        case 'yy': // 9 years / in 9 years / 9 years ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'roky' : 'rokov');
+            } else {
+                return result + 'rokmi';
+            }
+            break;
+        }
+    }
+
+    return moment.lang('sk', {
+        months : months,
+        monthsShort : monthsShort,
+        monthsParse : (function (months, monthsShort) {
+            var i, _monthsParse = [];
+            for (i = 0; i < 12; i++) {
+                // use custom parser to solve problem with July (červenec)
+                _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
+            }
+            return _monthsParse;
+        }(months, monthsShort)),
+        weekdays : "nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),
+        weekdaysShort : "ne_po_ut_st_št_pi_so".split("_"),
+        weekdaysMin : "ne_po_ut_st_št_pi_so".split("_"),
+        longDateFormat : {
+            LT: "H:mm",
+            L : "DD.MM.YYYY",
+            LL : "D. MMMM YYYY",
+            LLL : "D. MMMM YYYY LT",
+            LLLL : "dddd D. MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[dnes o] LT",
+            nextDay: '[zajtra o] LT',
+            nextWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[v nedeľu o] LT';
+                case 1:
+                case 2:
+                    return '[v] dddd [o] LT';
+                case 3:
+                    return '[v stredu o] LT';
+                case 4:
+                    return '[vo štvrtok o] LT';
+                case 5:
+                    return '[v piatok o] LT';
+                case 6:
+                    return '[v sobotu o] LT';
+                }
+            },
+            lastDay: '[včera o] LT',
+            lastWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[minulú nedeľu o] LT';
+                case 1:
+                case 2:
+                    return '[minulý] dddd [o] LT';
+                case 3:
+                    return '[minulú stredu o] LT';
+                case 4:
+                case 5:
+                    return '[minulý] dddd [o] LT';
+                case 6:
+                    return '[minulú sobotu o] LT';
+                }
+            },
+            sameElse: "L"
+        },
+        relativeTime : {
+            future : "za %s",
+            past : "pred %s",
+            s : translate,
+            m : translate,
+            mm : translate,
+            h : translate,
+            hh : translate,
+            d : translate,
+            dd : translate,
+            M : translate,
+            MM : translate,
+            y : translate,
+            yy : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/sl.js b/resources/moment/lang/sl.js
new file mode 100644 (file)
index 0000000..d260f80
--- /dev/null
@@ -0,0 +1,144 @@
+// moment.js language configuration
+// language : slovenian (sl)
+// author : Robert Sedovšek : https://github.com/sedovsek
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function translate(number, withoutSuffix, key) {
+        var result = number + " ";
+        switch (key) {
+        case 'm':
+            return withoutSuffix ? 'ena minuta' : 'eno minuto';
+        case 'mm':
+            if (number === 1) {
+                result += 'minuta';
+            } else if (number === 2) {
+                result += 'minuti';
+            } else if (number === 3 || number === 4) {
+                result += 'minute';
+            } else {
+                result += 'minut';
+            }
+            return result;
+        case 'h':
+            return withoutSuffix ? 'ena ura' : 'eno uro';
+        case 'hh':
+            if (number === 1) {
+                result += 'ura';
+            } else if (number === 2) {
+                result += 'uri';
+            } else if (number === 3 || number === 4) {
+                result += 'ure';
+            } else {
+                result += 'ur';
+            }
+            return result;
+        case 'dd':
+            if (number === 1) {
+                result += 'dan';
+            } else {
+                result += 'dni';
+            }
+            return result;
+        case 'MM':
+            if (number === 1) {
+                result += 'mesec';
+            } else if (number === 2) {
+                result += 'meseca';
+            } else if (number === 3 || number === 4) {
+                result += 'mesece';
+            } else {
+                result += 'mesecev';
+            }
+            return result;
+        case 'yy':
+            if (number === 1) {
+                result += 'leto';
+            } else if (number === 2) {
+                result += 'leti';
+            } else if (number === 3 || number === 4) {
+                result += 'leta';
+            } else {
+                result += 'let';
+            }
+            return result;
+        }
+    }
+
+    return moment.lang('sl', {
+        months : "januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),
+        monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),
+        weekdays : "nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),
+        weekdaysShort : "ned._pon._tor._sre._čet._pet._sob.".split("_"),
+        weekdaysMin : "ne_po_to_sr_če_pe_so".split("_"),
+        longDateFormat : {
+            LT : "H:mm",
+            L : "DD. MM. YYYY",
+            LL : "D. MMMM YYYY",
+            LLL : "D. MMMM YYYY LT",
+            LLLL : "dddd, D. MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay  : '[danes ob] LT',
+            nextDay  : '[jutri ob] LT',
+
+            nextWeek : function () {
+                switch (this.day()) {
+                case 0:
+                    return '[v] [nedeljo] [ob] LT';
+                case 3:
+                    return '[v] [sredo] [ob] LT';
+                case 6:
+                    return '[v] [soboto] [ob] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[v] dddd [ob] LT';
+                }
+            },
+            lastDay  : '[včeraj ob] LT',
+            lastWeek : function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                case 6:
+                    return '[prejšnja] dddd [ob] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[prejšnji] dddd [ob] LT';
+                }
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "čez %s",
+            past   : "%s nazaj",
+            s      : "nekaj sekund",
+            m      : translate,
+            mm     : translate,
+            h      : translate,
+            hh     : translate,
+            d      : "en dan",
+            dd     : translate,
+            M      : "en mesec",
+            MM     : translate,
+            y      : "eno leto",
+            yy     : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/sq.js b/resources/moment/lang/sq.js
new file mode 100644 (file)
index 0000000..a5e44b5
--- /dev/null
@@ -0,0 +1,57 @@
+// moment.js language configuration
+// language : Albanian (sq)
+// author : Flakërim Ismani : https://github.com/flakerimi
+// author: Menelion Elensúle: https://github.com/Oire (tests)
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('sq', {
+        months : "Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),
+        monthsShort : "Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),
+        weekdays : "E Diel_E Hënë_E Marte_E Mërkure_E Enjte_E Premte_E Shtunë".split("_"),
+        weekdaysShort : "Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),
+        weekdaysMin : "D_H_Ma_Më_E_P_Sh".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : '[Sot në] LT',
+            nextDay : '[Neser në] LT',
+            nextWeek : 'dddd [në] LT',
+            lastDay : '[Dje në] LT',
+            lastWeek : 'dddd [e kaluar në] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "në %s",
+            past : "%s me parë",
+            s : "disa sekonda",
+            m : "një minut",
+            mm : "%d minuta",
+            h : "një orë",
+            hh : "%d orë",
+            d : "një ditë",
+            dd : "%d ditë",
+            M : "një muaj",
+            MM : "%d muaj",
+            y : "një vit",
+            yy : "%d vite"
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/sv.js b/resources/moment/lang/sv.js
new file mode 100644 (file)
index 0000000..0de8c40
--- /dev/null
@@ -0,0 +1,63 @@
+// moment.js language configuration
+// language : swedish (sv)
+// author : Jens Alm : https://github.com/ulmus
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('sv', {
+        months : "januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),
+        monthsShort : "jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),
+        weekdays : "söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),
+        weekdaysShort : "sön_mån_tis_ons_tor_fre_lör".split("_"),
+        weekdaysMin : "sö_må_ti_on_to_fr_lö".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "YYYY-MM-DD",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: '[Idag] LT',
+            nextDay: '[Imorgon] LT',
+            lastDay: '[Igår] LT',
+            nextWeek: 'dddd LT',
+            lastWeek: '[Förra] dddd[en] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "om %s",
+            past : "för %s sedan",
+            s : "några sekunder",
+            m : "en minut",
+            mm : "%d minuter",
+            h : "en timme",
+            hh : "%d timmar",
+            d : "en dag",
+            dd : "%d dagar",
+            M : "en månad",
+            MM : "%d månader",
+            y : "ett år",
+            yy : "%d år"
+        },
+        ordinal : function (number) {
+            var b = number % 10,
+                output = (~~ (number % 100 / 10) === 1) ? 'e' :
+                (b === 1) ? 'a' :
+                (b === 2) ? 'a' :
+                (b === 3) ? 'e' : 'e';
+            return number + output;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/ta.js b/resources/moment/lang/ta.js
new file mode 100644 (file)
index 0000000..cc742c9
--- /dev/null
@@ -0,0 +1,112 @@
+// moment.js language configuration
+// language : tamil (ta)
+// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    /*var symbolMap = {
+            '1': '௧',
+            '2': '௨',
+            '3': '௩',
+            '4': '௪',
+            '5': '௫',
+            '6': '௬',
+            '7': '௭',
+            '8': '௮',
+            '9': '௯',
+            '0': '௦'
+        },
+        numberMap = {
+            '௧': '1',
+            '௨': '2',
+            '௩': '3',
+            '௪': '4',
+            '௫': '5',
+            '௬': '6',
+            '௭': '7',
+            '௮': '8',
+            '௯': '9',
+            '௦': '0'
+        }; */
+
+    return moment.lang('ta', {
+        months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split("_"),
+        monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split("_"),
+        weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split("_"),
+        weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split("_"),
+        weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY, LT",
+            LLLL : "dddd, D MMMM YYYY, LT"
+        },
+        calendar : {
+            sameDay : '[இன்று] LT',
+            nextDay : '[நாளை] LT',
+            nextWeek : 'dddd, LT',
+            lastDay : '[நேற்று] LT',
+            lastWeek : '[கடந்த வாரம்] dddd, LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s இல்",
+            past : "%s முன்",
+            s : "ஒரு சில விநாடிகள்",
+            m : "ஒரு நிமிடம்",
+            mm : "%d நிமிடங்கள்",
+            h : "ஒரு மணி நேரம்",
+            hh : "%d மணி நேரம்",
+            d : "ஒரு நாள்",
+            dd : "%d நாட்கள்",
+            M : "ஒரு மாதம்",
+            MM : "%d மாதங்கள்",
+            y : "ஒரு வருடம்",
+            yy : "%d ஆண்டுகள்"
+        },
+/*        preparse: function (string) {
+            return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {
+                return numberMap[match];
+            });
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            });
+        },*/
+        ordinal : function (number) {
+            return number + 'வது';
+        },
+
+
+// refer http://ta.wikipedia.org/s/1er1      
+
+        meridiem : function (hour, minute, isLower) {
+            if (hour >= 6 && hour <= 10) {
+                return " காலை";
+            } else   if (hour >= 10 && hour <= 14) {
+                return " நண்பகல்";
+            } else    if (hour >= 14 && hour <= 18) {
+                return " எற்பாடு";
+            } else   if (hour >= 18 && hour <= 20) {
+                return " மாலை";
+            } else  if (hour >= 20 && hour <= 24) {
+                return " இரவு";
+            } else  if (hour >= 0 && hour <= 6) {
+                return " வைகறை";
+            }
+        },
+        week : {
+            dow : 0, // Sunday is the first day of the week.
+            doy : 6  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/th.js b/resources/moment/lang/th.js
new file mode 100644 (file)
index 0000000..70336c8
--- /dev/null
@@ -0,0 +1,58 @@
+// moment.js language configuration
+// language : thai (th)
+// author : Kridsada Thanabulpong : https://github.com/sirn
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('th', {
+        months : "มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),
+        monthsShort : "มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา".split("_"),
+        weekdays : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),
+        weekdaysShort : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"), // yes, three characters difference
+        weekdaysMin : "อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),
+        longDateFormat : {
+            LT : "H นาฬิกา m นาที",
+            L : "YYYY/MM/DD",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY เวลา LT",
+            LLLL : "วันddddที่ D MMMM YYYY เวลา LT"
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 12) {
+                return "ก่อนเที่ยง";
+            } else {
+                return "หลังเที่ยง";
+            }
+        },
+        calendar : {
+            sameDay : '[วันนี้ เวลา] LT',
+            nextDay : '[พรุ่งนี้ เวลา] LT',
+            nextWeek : 'dddd[หน้า เวลา] LT',
+            lastDay : '[เมื่อวานนี้ เวลา] LT',
+            lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "อีก %s",
+            past : "%sที่แล้ว",
+            s : "ไม่กี่วินาที",
+            m : "1 นาที",
+            mm : "%d นาที",
+            h : "1 ชั่วโมง",
+            hh : "%d ชั่วโมง",
+            d : "1 วัน",
+            dd : "%d วัน",
+            M : "1 เดือน",
+            MM : "%d เดือน",
+            y : "1 ปี",
+            yy : "%d ปี"
+        }
+    });
+}));
diff --git a/resources/moment/lang/tl-ph.js b/resources/moment/lang/tl-ph.js
new file mode 100644 (file)
index 0000000..8044483
--- /dev/null
@@ -0,0 +1,58 @@
+// moment.js language configuration
+// language : Tagalog/Filipino (tl-ph)
+// author : Dan Hagman
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('tl-ph', {
+        months : "Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),
+        monthsShort : "Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),
+        weekdays : "Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),
+        weekdaysShort : "Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),
+        weekdaysMin : "Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "MM/D/YYYY",
+            LL : "MMMM D, YYYY",
+            LLL : "MMMM D, YYYY LT",
+            LLLL : "dddd, MMMM DD, YYYY LT"
+        },
+        calendar : {
+            sameDay: "[Ngayon sa] LT",
+            nextDay: '[Bukas sa] LT',
+            nextWeek: 'dddd [sa] LT',
+            lastDay: '[Kahapon sa] LT',
+            lastWeek: 'dddd [huling linggo] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "sa loob ng %s",
+            past : "%s ang nakalipas",
+            s : "ilang segundo",
+            m : "isang minuto",
+            mm : "%d minuto",
+            h : "isang oras",
+            hh : "%d oras",
+            d : "isang araw",
+            dd : "%d araw",
+            M : "isang buwan",
+            MM : "%d buwan",
+            y : "isang taon",
+            yy : "%d taon"
+        },
+        ordinal : function (number) {
+            return number;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/tr.js b/resources/moment/lang/tr.js
new file mode 100644 (file)
index 0000000..e90f250
--- /dev/null
@@ -0,0 +1,93 @@
+// moment.js language configuration
+// language : turkish (tr)
+// authors : Erhan Gundogan : https://github.com/erhangundogan,
+//           Burak Yiğit Kaya: https://github.com/BYK
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+
+    var suffixes = {
+        1: "'inci",
+        5: "'inci",
+        8: "'inci",
+        70: "'inci",
+        80: "'inci",
+
+        2: "'nci",
+        7: "'nci",
+        20: "'nci",
+        50: "'nci",
+
+        3: "'üncü",
+        4: "'üncü",
+        100: "'üncü",
+
+        6: "'ncı",
+
+        9: "'uncu",
+        10: "'uncu",
+        30: "'uncu",
+
+        60: "'ıncı",
+        90: "'ıncı"
+    };
+
+    return moment.lang('tr', {
+        months : "Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),
+        monthsShort : "Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),
+        weekdays : "Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),
+        weekdaysShort : "Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),
+        weekdaysMin : "Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD.MM.YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd, D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay : '[bugün saat] LT',
+            nextDay : '[yarın saat] LT',
+            nextWeek : '[haftaya] dddd [saat] LT',
+            lastDay : '[dün] LT',
+            lastWeek : '[geçen hafta] dddd [saat] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "%s sonra",
+            past : "%s önce",
+            s : "birkaç saniye",
+            m : "bir dakika",
+            mm : "%d dakika",
+            h : "bir saat",
+            hh : "%d saat",
+            d : "bir gün",
+            dd : "%d gün",
+            M : "bir ay",
+            MM : "%d ay",
+            y : "bir yıl",
+            yy : "%d yıl"
+        },
+        ordinal : function (number) {
+            if (number === 0) {  // special case for zero
+                return number + "'ıncı";
+            }
+            var a = number % 10,
+                b = number % 100 - a,
+                c = number >= 100 ? 100 : null;
+
+            return number + (suffixes[a] || suffixes[b] || suffixes[c]);
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/tzm-la.js b/resources/moment/lang/tzm-la.js
new file mode 100644 (file)
index 0000000..be1d878
--- /dev/null
@@ -0,0 +1,55 @@
+// moment.js language configuration
+// language : Morocco Central Atlas Tamaziɣt in Latin (tzm-la)
+// author : Abdel Said : https://github.com/abdelsaid
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('tzm-la', {
+        months : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),
+        monthsShort : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),
+        weekdays : "asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),
+        weekdaysShort : "asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),
+        weekdaysMin : "asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[asdkh g] LT",
+            nextDay: '[aska g] LT',
+            nextWeek: 'dddd [g] LT',
+            lastDay: '[assant g] LT',
+            lastWeek: 'dddd [g] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "dadkh s yan %s",
+            past : "yan %s",
+            s : "imik",
+            m : "minuḍ",
+            mm : "%d minuḍ",
+            h : "saɛa",
+            hh : "%d tassaɛin",
+            d : "ass",
+            dd : "%d ossan",
+            M : "ayowr",
+            MM : "%d iyyirn",
+            y : "asgas",
+            yy : "%d isgasn"
+        },
+        week : {
+            dow : 6, // Saturday is the first day of the week.
+            doy : 12  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/tzm.js b/resources/moment/lang/tzm.js
new file mode 100644 (file)
index 0000000..c7c76bd
--- /dev/null
@@ -0,0 +1,55 @@
+// moment.js language configuration
+// language : Morocco Central Atlas Tamaziɣt (tzm)
+// author : Abdel Said : https://github.com/abdelsaid
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('tzm', {
+        months : "ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),
+        monthsShort : "ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),
+        weekdays : "ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
+        weekdaysShort : "ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
+        weekdaysMin : "ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "dddd D MMMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[ⴰⵙⴷⵅ ⴴ] LT",
+            nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',
+            nextWeek: 'dddd [ⴴ] LT',
+            lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',
+            lastWeek: 'dddd [ⴴ] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s",
+            past : "ⵢⴰⵏ %s",
+            s : "ⵉⵎⵉⴽ",
+            m : "ⵎⵉⵏⵓⴺ",
+            mm : "%d ⵎⵉⵏⵓⴺ",
+            h : "ⵙⴰⵄⴰ",
+            hh : "%d ⵜⴰⵙⵙⴰⵄⵉⵏ",
+            d : "ⴰⵙⵙ",
+            dd : "%d oⵙⵙⴰⵏ",
+            M : "ⴰⵢoⵓⵔ",
+            MM : "%d ⵉⵢⵢⵉⵔⵏ",
+            y : "ⴰⵙⴳⴰⵙ",
+            yy : "%d ⵉⵙⴳⴰⵙⵏ"
+        },
+        week : {
+            dow : 6, // Saturday is the first day of the week.
+            doy : 12  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/uk.js b/resources/moment/lang/uk.js
new file mode 100644 (file)
index 0000000..47056cb
--- /dev/null
@@ -0,0 +1,157 @@
+// moment.js language configuration
+// language : ukrainian (uk)
+// author : zemlanin : https://github.com/zemlanin
+// Author : Menelion Elensúle : https://github.com/Oire
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function plural(word, num) {
+        var forms = word.split('_');
+        return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+    }
+
+    function relativeTimeWithPlural(number, withoutSuffix, key) {
+        var format = {
+            'mm': 'хвилина_хвилини_хвилин',
+            'hh': 'година_години_годин',
+            'dd': 'день_дні_днів',
+            'MM': 'місяць_місяці_місяців',
+            'yy': 'рік_роки_років'
+        };
+        if (key === 'm') {
+            return withoutSuffix ? 'хвилина' : 'хвилину';
+        }
+        else if (key === 'h') {
+            return withoutSuffix ? 'година' : 'годину';
+        }
+        else {
+            return number + ' ' + plural(format[key], +number);
+        }
+    }
+
+    function monthsCaseReplace(m, format) {
+        var months = {
+            'nominative': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_'),
+            'accusative': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_')
+        },
+
+        nounCase = (/D[oD]? *MMMM?/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return months[nounCase][m.month()];
+    }
+
+    function weekdaysCaseReplace(m, format) {
+        var weekdays = {
+            'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'),
+            'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'),
+            'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_')
+        },
+
+        nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ?
+            'accusative' :
+            ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ?
+                'genitive' :
+                'nominative');
+
+        return weekdays[nounCase][m.day()];
+    }
+
+    function processHoursFunction(str) {
+        return function () {
+            return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
+        };
+    }
+
+    return moment.lang('uk', {
+        months : monthsCaseReplace,
+        monthsShort : "січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),
+        weekdays : weekdaysCaseReplace,
+        weekdaysShort : "нд_пн_вт_ср_чт_пт_сб".split("_"),
+        weekdaysMin : "нд_пн_вт_ср_чт_пт_сб".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD.MM.YYYY",
+            LL : "D MMMM YYYY р.",
+            LLL : "D MMMM YYYY р., LT",
+            LLLL : "dddd, D MMMM YYYY р., LT"
+        },
+        calendar : {
+            sameDay: processHoursFunction('[Сьогодні '),
+            nextDay: processHoursFunction('[Завтра '),
+            lastDay: processHoursFunction('[Вчора '),
+            nextWeek: processHoursFunction('[У] dddd ['),
+            lastWeek: function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                case 5:
+                case 6:
+                    return processHoursFunction('[Минулої] dddd [').call(this);
+                case 1:
+                case 2:
+                case 4:
+                    return processHoursFunction('[Минулого] dddd [').call(this);
+                }
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "за %s",
+            past : "%s тому",
+            s : "декілька секунд",
+            m : relativeTimeWithPlural,
+            mm : relativeTimeWithPlural,
+            h : "годину",
+            hh : relativeTimeWithPlural,
+            d : "день",
+            dd : relativeTimeWithPlural,
+            M : "місяць",
+            MM : relativeTimeWithPlural,
+            y : "рік",
+            yy : relativeTimeWithPlural
+        },
+
+        // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
+
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return "ночі";
+            } else if (hour < 12) {
+                return "ранку";
+            } else if (hour < 17) {
+                return "дня";
+            } else {
+                return "вечора";
+            }
+        },
+
+        ordinal: function (number, period) {
+            switch (period) {
+            case 'M':
+            case 'd':
+            case 'DDD':
+            case 'w':
+            case 'W':
+                return number + '-й';
+            case 'D':
+                return number + '-го';
+            default:
+                return number;
+            }
+        },
+
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/uz.js b/resources/moment/lang/uz.js
new file mode 100644 (file)
index 0000000..a5b06fa
--- /dev/null
@@ -0,0 +1,55 @@
+// moment.js language configuration
+// language : uzbek
+// author : Sardor Muminov : https://github.com/muminoff
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('uz', {
+        months : "январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),
+        monthsShort : "янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),
+        weekdays : "Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),
+        weekdaysShort : "Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),
+        weekdaysMin : "Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM YYYY",
+            LLL : "D MMMM YYYY LT",
+            LLLL : "D MMMM YYYY, dddd LT"
+        },
+        calendar : {
+            sameDay : '[Бугун соат] LT [да]',
+            nextDay : '[Эртага] LT [да]',
+            nextWeek : 'dddd [куни соат] LT [да]',
+            lastDay : '[Кеча соат] LT [да]',
+            lastWeek : '[Утган] dddd [куни соат] LT [да]',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : "Якин %s ичида",
+            past : "Бир неча %s олдин",
+            s : "фурсат",
+            m : "бир дакика",
+            mm : "%d дакика",
+            h : "бир соат",
+            hh : "%d соат",
+            d : "бир кун",
+            dd : "%d кун",
+            M : "бир ой",
+            MM : "%d ой",
+            y : "бир йил",
+            yy : "%d йил"
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/vn.js b/resources/moment/lang/vn.js
new file mode 100644 (file)
index 0000000..f28e7c3
--- /dev/null
@@ -0,0 +1,62 @@
+// moment.js language configuration
+// language : vietnamese (vn)
+// author : Bang Nguyen : https://github.com/bangnk
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('vn', {
+        months : "tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),
+        monthsShort : "Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),
+        weekdays : "chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),
+        weekdaysShort : "CN_T2_T3_T4_T5_T6_T7".split("_"),
+        weekdaysMin : "CN_T2_T3_T4_T5_T6_T7".split("_"),
+        longDateFormat : {
+            LT : "HH:mm",
+            L : "DD/MM/YYYY",
+            LL : "D MMMM [năm] YYYY",
+            LLL : "D MMMM [năm] YYYY LT",
+            LLLL : "dddd, D MMMM [năm] YYYY LT",
+            l : "DD/M/YYYY",
+            ll : "D MMM YYYY",
+            lll : "D MMM YYYY LT",
+            llll : "ddd, D MMM YYYY LT"
+        },
+        calendar : {
+            sameDay: "[Hôm nay lúc] LT",
+            nextDay: '[Ngày mai lúc] LT',
+            nextWeek: 'dddd [tuần tới lúc] LT',
+            lastDay: '[Hôm qua lúc] LT',
+            lastWeek: 'dddd [tuần rồi lúc] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : "%s tới",
+            past : "%s trước",
+            s : "vài giây",
+            m : "một phút",
+            mm : "%d phút",
+            h : "một giờ",
+            hh : "%d giờ",
+            d : "một ngày",
+            dd : "%d ngày",
+            M : "một tháng",
+            MM : "%d tháng",
+            y : "một năm",
+            yy : "%d năm"
+        },
+        ordinal : function (number) {
+            return number;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/zh-cn.js b/resources/moment/lang/zh-cn.js
new file mode 100644 (file)
index 0000000..50a3ed9
--- /dev/null
@@ -0,0 +1,108 @@
+// moment.js language configuration
+// language : chinese
+// author : suupic : https://github.com/suupic
+// author : Zeno Zeng : https://github.com/zenozeng
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('zh-cn', {
+        months : "一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),
+        monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
+        weekdays : "星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),
+        weekdaysShort : "周日_周一_周二_周三_周四_周五_周六".split("_"),
+        weekdaysMin : "日_一_二_三_四_五_六".split("_"),
+        longDateFormat : {
+            LT : "Ah点mm",
+            L : "YYYY-MM-DD",
+            LL : "YYYY年MMMD日",
+            LLL : "YYYY年MMMD日LT",
+            LLLL : "YYYY年MMMD日ddddLT",
+            l : "YYYY-MM-DD",
+            ll : "YYYY年MMMD日",
+            lll : "YYYY年MMMD日LT",
+            llll : "YYYY年MMMD日ddddLT"
+        },
+        meridiem : function (hour, minute, isLower) {
+            var hm = hour * 100 + minute;
+            if (hm < 600) {
+                return "凌晨";
+            } else if (hm < 900) {
+                return "早上";
+            } else if (hm < 1130) {
+                return "上午";
+            } else if (hm < 1230) {
+                return "中午";
+            } else if (hm < 1800) {
+                return "下午";
+            } else {
+                return "晚上";
+            }
+        },
+        calendar : {
+            sameDay : function () {
+                return this.minutes() === 0 ? "[今天]Ah[点整]" : "[今天]LT";
+            },
+            nextDay : function () {
+                return this.minutes() === 0 ? "[明天]Ah[点整]" : "[明天]LT";
+            },
+            lastDay : function () {
+                return this.minutes() === 0 ? "[昨天]Ah[点整]" : "[昨天]LT";
+            },
+            nextWeek : function () {
+                var startOfWeek, prefix;
+                startOfWeek = moment().startOf('week');
+                prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]';
+                return this.minutes() === 0 ? prefix + "dddAh点整" : prefix + "dddAh点mm";
+            },
+            lastWeek : function () {
+                var startOfWeek, prefix;
+                startOfWeek = moment().startOf('week');
+                prefix = this.unix() < startOfWeek.unix()  ? '[上]' : '[本]';
+                return this.minutes() === 0 ? prefix + "dddAh点整" : prefix + "dddAh点mm";
+            },
+            sameElse : 'LL'
+        },
+        ordinal : function (number, period) {
+            switch (period) {
+            case "d":
+            case "D":
+            case "DDD":
+                return number + "日";
+            case "M":
+                return number + "月";
+            case "w":
+            case "W":
+                return number + "周";
+            default:
+                return number;
+            }
+        },
+        relativeTime : {
+            future : "%s内",
+            past : "%s前",
+            s : "几秒",
+            m : "1分钟",
+            mm : "%d分钟",
+            h : "1小时",
+            hh : "%d小时",
+            d : "1天",
+            dd : "%d天",
+            M : "1个月",
+            MM : "%d个月",
+            y : "1年",
+            yy : "%d年"
+        },
+        week : {
+            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/moment/lang/zh-tw.js b/resources/moment/lang/zh-tw.js
new file mode 100644 (file)
index 0000000..bbb0737
--- /dev/null
@@ -0,0 +1,84 @@
+// moment.js language configuration
+// language : traditional chinese (zh-tw)
+// author : Ben : https://github.com/ben-lin
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.lang('zh-tw', {
+        months : "一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),
+        monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
+        weekdays : "星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),
+        weekdaysShort : "週日_週一_週二_週三_週四_週五_週六".split("_"),
+        weekdaysMin : "日_一_二_三_四_五_六".split("_"),
+        longDateFormat : {
+            LT : "Ah點mm",
+            L : "YYYY年MMMD日",
+            LL : "YYYY年MMMD日",
+            LLL : "YYYY年MMMD日LT",
+            LLLL : "YYYY年MMMD日ddddLT",
+            l : "YYYY年MMMD日",
+            ll : "YYYY年MMMD日",
+            lll : "YYYY年MMMD日LT",
+            llll : "YYYY年MMMD日ddddLT"
+        },
+        meridiem : function (hour, minute, isLower) {
+            var hm = hour * 100 + minute;
+            if (hm < 900) {
+                return "早上";
+            } else if (hm < 1130) {
+                return "上午";
+            } else if (hm < 1230) {
+                return "中午";
+            } else if (hm < 1800) {
+                return "下午";
+            } else {
+                return "晚上";
+            }
+        },
+        calendar : {
+            sameDay : '[今天]LT',
+            nextDay : '[明天]LT',
+            nextWeek : '[下]ddddLT',
+            lastDay : '[昨天]LT',
+            lastWeek : '[上]ddddLT',
+            sameElse : 'L'
+        },
+        ordinal : function (number, period) {
+            switch (period) {
+            case "d" :
+            case "D" :
+            case "DDD" :
+                return number + "日";
+            case "M" :
+                return number + "月";
+            case "w" :
+            case "W" :
+                return number + "週";
+            default :
+                return number;
+            }
+        },
+        relativeTime : {
+            future : "%s內",
+            past : "%s前",
+            s : "幾秒",
+            m : "一分鐘",
+            mm : "%d分鐘",
+            h : "一小時",
+            hh : "%d小時",
+            d : "一天",
+            dd : "%d天",
+            M : "一個月",
+            MM : "%d個月",
+            y : "一年",
+            yy : "%d年"
+        }
+    });
+}));
diff --git a/resources/moment/moment.js b/resources/moment/moment.js
new file mode 100644 (file)
index 0000000..b79da7f
--- /dev/null
@@ -0,0 +1,2400 @@
+//! moment.js
+//! version : 2.5.1
+//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
+//! license : MIT
+//! momentjs.com
+
+(function (undefined) {
+
+    /************************************
+        Constants
+    ************************************/
+
+    var moment,
+        VERSION = "2.5.1",
+        global = this,
+        round = Math.round,
+        i,
+
+        YEAR = 0,
+        MONTH = 1,
+        DATE = 2,
+        HOUR = 3,
+        MINUTE = 4,
+        SECOND = 5,
+        MILLISECOND = 6,
+
+        // internal storage for language config files
+        languages = {},
+
+        // moment internal properties
+        momentProperties = {
+            _isAMomentObject: null,
+            _i : null,
+            _f : null,
+            _l : null,
+            _strict : null,
+            _isUTC : null,
+            _offset : null,  // optional. Combine with _isUTC
+            _pf : null,
+            _lang : null  // optional
+        },
+
+        // check for nodeJS
+        hasModule = (typeof module !== 'undefined' && module.exports && typeof require !== 'undefined'),
+
+        // ASP.NET json date format regex
+        aspNetJsonRegex = /^\/?Date\((\-?\d+)/i,
+        aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,
+
+        // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
+        // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
+        isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,
+
+        // format tokens
+        formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,
+        localFormattingTokens = /(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,
+
+        // parsing token regexes
+        parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99
+        parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999
+        parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999
+        parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999
+        parseTokenDigits = /\d+/, // nonzero number of digits
+        parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic.
+        parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z
+        parseTokenT = /T/i, // T (ISO separator)
+        parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
+
+        //strict parsing regexes
+        parseTokenOneDigit = /\d/, // 0 - 9
+        parseTokenTwoDigits = /\d\d/, // 00 - 99
+        parseTokenThreeDigits = /\d{3}/, // 000 - 999
+        parseTokenFourDigits = /\d{4}/, // 0000 - 9999
+        parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999
+        parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf
+
+        // iso 8601 regex
+        // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
+        isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
+
+        isoFormat = 'YYYY-MM-DDTHH:mm:ssZ',
+
+        isoDates = [
+            ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/],
+            ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/],
+            ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/],
+            ['GGGG-[W]WW', /\d{4}-W\d{2}/],
+            ['YYYY-DDD', /\d{4}-\d{3}/]
+        ],
+
+        // iso time formats and regexes
+        isoTimes = [
+            ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d{1,3}/],
+            ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/],
+            ['HH:mm', /(T| )\d\d:\d\d/],
+            ['HH', /(T| )\d\d/]
+        ],
+
+        // timezone chunker "+10:00" > ["10", "00"] or "-1530" > ["-15", "30"]
+        parseTimezoneChunker = /([\+\-]|\d\d)/gi,
+
+        // getter and setter names
+        proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'),
+        unitMillisecondFactors = {
+            'Milliseconds' : 1,
+            'Seconds' : 1e3,
+            'Minutes' : 6e4,
+            'Hours' : 36e5,
+            'Days' : 864e5,
+            'Months' : 2592e6,
+            'Years' : 31536e6
+        },
+
+        unitAliases = {
+            ms : 'millisecond',
+            s : 'second',
+            m : 'minute',
+            h : 'hour',
+            d : 'day',
+            D : 'date',
+            w : 'week',
+            W : 'isoWeek',
+            M : 'month',
+            y : 'year',
+            DDD : 'dayOfYear',
+            e : 'weekday',
+            E : 'isoWeekday',
+            gg: 'weekYear',
+            GG: 'isoWeekYear'
+        },
+
+        camelFunctions = {
+            dayofyear : 'dayOfYear',
+            isoweekday : 'isoWeekday',
+            isoweek : 'isoWeek',
+            weekyear : 'weekYear',
+            isoweekyear : 'isoWeekYear'
+        },
+
+        // format function strings
+        formatFunctions = {},
+
+        // tokens to ordinalize and pad
+        ordinalizeTokens = 'DDD w W M D d'.split(' '),
+        paddedTokens = 'M D H h m s w W'.split(' '),
+
+        formatTokenFunctions = {
+            M    : function () {
+                return this.month() + 1;
+            },
+            MMM  : function (format) {
+                return this.lang().monthsShort(this, format);
+            },
+            MMMM : function (format) {
+                return this.lang().months(this, format);
+            },
+            D    : function () {
+                return this.date();
+            },
+            DDD  : function () {
+                return this.dayOfYear();
+            },
+            d    : function () {
+                return this.day();
+            },
+            dd   : function (format) {
+                return this.lang().weekdaysMin(this, format);
+            },
+            ddd  : function (format) {
+                return this.lang().weekdaysShort(this, format);
+            },
+            dddd : function (format) {
+                return this.lang().weekdays(this, format);
+            },
+            w    : function () {
+                return this.week();
+            },
+            W    : function () {
+                return this.isoWeek();
+            },
+            YY   : function () {
+                return leftZeroFill(this.year() % 100, 2);
+            },
+            YYYY : function () {
+                return leftZeroFill(this.year(), 4);
+            },
+            YYYYY : function () {
+                return leftZeroFill(this.year(), 5);
+            },
+            YYYYYY : function () {
+                var y = this.year(), sign = y >= 0 ? '+' : '-';
+                return sign + leftZeroFill(Math.abs(y), 6);
+            },
+            gg   : function () {
+                return leftZeroFill(this.weekYear() % 100, 2);
+            },
+            gggg : function () {
+                return leftZeroFill(this.weekYear(), 4);
+            },
+            ggggg : function () {
+                return leftZeroFill(this.weekYear(), 5);
+            },
+            GG   : function () {
+                return leftZeroFill(this.isoWeekYear() % 100, 2);
+            },
+            GGGG : function () {
+                return leftZeroFill(this.isoWeekYear(), 4);
+            },
+            GGGGG : function () {
+                return leftZeroFill(this.isoWeekYear(), 5);
+            },
+            e : function () {
+                return this.weekday();
+            },
+            E : function () {
+                return this.isoWeekday();
+            },
+            a    : function () {
+                return this.lang().meridiem(this.hours(), this.minutes(), true);
+            },
+            A    : function () {
+                return this.lang().meridiem(this.hours(), this.minutes(), false);
+            },
+            H    : function () {
+                return this.hours();
+            },
+            h    : function () {
+                return this.hours() % 12 || 12;
+            },
+            m    : function () {
+                return this.minutes();
+            },
+            s    : function () {
+                return this.seconds();
+            },
+            S    : function () {
+                return toInt(this.milliseconds() / 100);
+            },
+            SS   : function () {
+                return leftZeroFill(toInt(this.milliseconds() / 10), 2);
+            },
+            SSS  : function () {
+                return leftZeroFill(this.milliseconds(), 3);
+            },
+            SSSS : function () {
+                return leftZeroFill(this.milliseconds(), 3);
+            },
+            Z    : function () {
+                var a = -this.zone(),
+                    b = "+";
+                if (a < 0) {
+                    a = -a;
+                    b = "-";
+                }
+                return b + leftZeroFill(toInt(a / 60), 2) + ":" + leftZeroFill(toInt(a) % 60, 2);
+            },
+            ZZ   : function () {
+                var a = -this.zone(),
+                    b = "+";
+                if (a < 0) {
+                    a = -a;
+                    b = "-";
+                }
+                return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2);
+            },
+            z : function () {
+                return this.zoneAbbr();
+            },
+            zz : function () {
+                return this.zoneName();
+            },
+            X    : function () {
+                return this.unix();
+            },
+            Q : function () {
+                return this.quarter();
+            }
+        },
+
+        lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'];
+
+    function defaultParsingFlags() {
+        // We need to deep clone this object, and es5 standard is not very
+        // helpful.
+        return {
+            empty : false,
+            unusedTokens : [],
+            unusedInput : [],
+            overflow : -2,
+            charsLeftOver : 0,
+            nullInput : false,
+            invalidMonth : null,
+            invalidFormat : false,
+            userInvalidated : false,
+            iso: false
+        };
+    }
+
+    function padToken(func, count) {
+        return function (a) {
+            return leftZeroFill(func.call(this, a), count);
+        };
+    }
+    function ordinalizeToken(func, period) {
+        return function (a) {
+            return this.lang().ordinal(func.call(this, a), period);
+        };
+    }
+
+    while (ordinalizeTokens.length) {
+        i = ordinalizeTokens.pop();
+        formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i);
+    }
+    while (paddedTokens.length) {
+        i = paddedTokens.pop();
+        formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2);
+    }
+    formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3);
+
+
+    /************************************
+        Constructors
+    ************************************/
+
+    function Language() {
+
+    }
+
+    // Moment prototype object
+    function Moment(config) {
+        checkOverflow(config);
+        extend(this, config);
+    }
+
+    // Duration Constructor
+    function Duration(duration) {
+        var normalizedInput = normalizeObjectUnits(duration),
+            years = normalizedInput.year || 0,
+            months = normalizedInput.month || 0,
+            weeks = normalizedInput.week || 0,
+            days = normalizedInput.day || 0,
+            hours = normalizedInput.hour || 0,
+            minutes = normalizedInput.minute || 0,
+            seconds = normalizedInput.second || 0,
+            milliseconds = normalizedInput.millisecond || 0;
+
+        // representation for dateAddRemove
+        this._milliseconds = +milliseconds +
+            seconds * 1e3 + // 1000
+            minutes * 6e4 + // 1000 * 60
+            hours * 36e5; // 1000 * 60 * 60
+        // Because of dateAddRemove treats 24 hours as different from a
+        // day when working around DST, we need to store them separately
+        this._days = +days +
+            weeks * 7;
+        // It is impossible translate months into days without knowing
+        // which months you are are talking about, so we have to store
+        // it separately.
+        this._months = +months +
+            years * 12;
+
+        this._data = {};
+
+        this._bubble();
+    }
+
+    /************************************
+        Helpers
+    ************************************/
+
+
+    function extend(a, b) {
+        for (var i in b) {
+            if (b.hasOwnProperty(i)) {
+                a[i] = b[i];
+            }
+        }
+
+        if (b.hasOwnProperty("toString")) {
+            a.toString = b.toString;
+        }
+
+        if (b.hasOwnProperty("valueOf")) {
+            a.valueOf = b.valueOf;
+        }
+
+        return a;
+    }
+
+    function cloneMoment(m) {
+        var result = {}, i;
+        for (i in m) {
+            if (m.hasOwnProperty(i) && momentProperties.hasOwnProperty(i)) {
+                result[i] = m[i];
+            }
+        }
+
+        return result;
+    }
+
+    function absRound(number) {
+        if (number < 0) {
+            return Math.ceil(number);
+        } else {
+            return Math.floor(number);
+        }
+    }
+
+    // left zero fill a number
+    // see http://jsperf.com/left-zero-filling for performance comparison
+    function leftZeroFill(number, targetLength, forceSign) {
+        var output = '' + Math.abs(number),
+            sign = number >= 0;
+
+        while (output.length < targetLength) {
+            output = '0' + output;
+        }
+        return (sign ? (forceSign ? '+' : '') : '-') + output;
+    }
+
+    // helper function for _.addTime and _.subtractTime
+    function addOrSubtractDurationFromMoment(mom, duration, isAdding, ignoreUpdateOffset) {
+        var milliseconds = duration._milliseconds,
+            days = duration._days,
+            months = duration._months,
+            minutes,
+            hours;
+
+        if (milliseconds) {
+            mom._d.setTime(+mom._d + milliseconds * isAdding);
+        }
+        // store the minutes and hours so we can restore them
+        if (days || months) {
+            minutes = mom.minute();
+            hours = mom.hour();
+        }
+        if (days) {
+            mom.date(mom.date() + days * isAdding);
+        }
+        if (months) {
+            mom.month(mom.month() + months * isAdding);
+        }
+        if (milliseconds && !ignoreUpdateOffset) {
+            moment.updateOffset(mom);
+        }
+        // restore the minutes and hours after possibly changing dst
+        if (days || months) {
+            mom.minute(minutes);
+            mom.hour(hours);
+        }
+    }
+
+    // check if is an array
+    function isArray(input) {
+        return Object.prototype.toString.call(input) === '[object Array]';
+    }
+
+    function isDate(input) {
+        return  Object.prototype.toString.call(input) === '[object Date]' ||
+                input instanceof Date;
+    }
+
+    // compare two arrays, return the number of differences
+    function compareArrays(array1, array2, dontConvert) {
+        var len = Math.min(array1.length, array2.length),
+            lengthDiff = Math.abs(array1.length - array2.length),
+            diffs = 0,
+            i;
+        for (i = 0; i < len; i++) {
+            if ((dontConvert && array1[i] !== array2[i]) ||
+                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
+                diffs++;
+            }
+        }
+        return diffs + lengthDiff;
+    }
+
+    function normalizeUnits(units) {
+        if (units) {
+            var lowered = units.toLowerCase().replace(/(.)s$/, '$1');
+            units = unitAliases[units] || camelFunctions[lowered] || lowered;
+        }
+        return units;
+    }
+
+    function normalizeObjectUnits(inputObject) {
+        var normalizedInput = {},
+            normalizedProp,
+            prop;
+
+        for (prop in inputObject) {
+            if (inputObject.hasOwnProperty(prop)) {
+                normalizedProp = normalizeUnits(prop);
+                if (normalizedProp) {
+                    normalizedInput[normalizedProp] = inputObject[prop];
+                }
+            }
+        }
+
+        return normalizedInput;
+    }
+
+    function makeList(field) {
+        var count, setter;
+
+        if (field.indexOf('week') === 0) {
+            count = 7;
+            setter = 'day';
+        }
+        else if (field.indexOf('month') === 0) {
+            count = 12;
+            setter = 'month';
+        }
+        else {
+            return;
+        }
+
+        moment[field] = function (format, index) {
+            var i, getter,
+                method = moment.fn._lang[field],
+                results = [];
+
+            if (typeof format === 'number') {
+                index = format;
+                format = undefined;
+            }
+
+            getter = function (i) {
+                var m = moment().utc().set(setter, i);
+                return method.call(moment.fn._lang, m, format || '');
+            };
+
+            if (index != null) {
+                return getter(index);
+            }
+            else {
+                for (i = 0; i < count; i++) {
+                    results.push(getter(i));
+                }
+                return results;
+            }
+        };
+    }
+
+    function toInt(argumentForCoercion) {
+        var coercedNumber = +argumentForCoercion,
+            value = 0;
+
+        if (coercedNumber !== 0 && isFinite(coercedNumber)) {
+            if (coercedNumber >= 0) {
+                value = Math.floor(coercedNumber);
+            } else {
+                value = Math.ceil(coercedNumber);
+            }
+        }
+
+        return value;
+    }
+
+    function daysInMonth(year, month) {
+        return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
+    }
+
+    function daysInYear(year) {
+        return isLeapYear(year) ? 366 : 365;
+    }
+
+    function isLeapYear(year) {
+        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
+    }
+
+    function checkOverflow(m) {
+        var overflow;
+        if (m._a && m._pf.overflow === -2) {
+            overflow =
+                m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH :
+                m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE :
+                m._a[HOUR] < 0 || m._a[HOUR] > 23 ? HOUR :
+                m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE :
+                m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND :
+                m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND :
+                -1;
+
+            if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
+                overflow = DATE;
+            }
+
+            m._pf.overflow = overflow;
+        }
+    }
+
+    function isValid(m) {
+        if (m._isValid == null) {
+            m._isValid = !isNaN(m._d.getTime()) &&
+                m._pf.overflow < 0 &&
+                !m._pf.empty &&
+                !m._pf.invalidMonth &&
+                !m._pf.nullInput &&
+                !m._pf.invalidFormat &&
+                !m._pf.userInvalidated;
+
+            if (m._strict) {
+                m._isValid = m._isValid &&
+                    m._pf.charsLeftOver === 0 &&
+                    m._pf.unusedTokens.length === 0;
+            }
+        }
+        return m._isValid;
+    }
+
+    function normalizeLanguage(key) {
+        return key ? key.toLowerCase().replace('_', '-') : key;
+    }
+
+    // Return a moment from input, that is local/utc/zone equivalent to model.
+    function makeAs(input, model) {
+        return model._isUTC ? moment(input).zone(model._offset || 0) :
+            moment(input).local();
+    }
+
+    /************************************
+        Languages
+    ************************************/
+
+
+    extend(Language.prototype, {
+
+        set : function (config) {
+            var prop, i;
+            for (i in config) {
+                prop = config[i];
+                if (typeof prop === 'function') {
+                    this[i] = prop;
+                } else {
+                    this['_' + i] = prop;
+                }
+            }
+        },
+
+        _months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
+        months : function (m) {
+            return this._months[m.month()];
+        },
+
+        _monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
+        monthsShort : function (m) {
+            return this._monthsShort[m.month()];
+        },
+
+        monthsParse : function (monthName) {
+            var i, mom, regex;
+
+            if (!this._monthsParse) {
+                this._monthsParse = [];
+            }
+
+            for (i = 0; i < 12; i++) {
+                // make the regex if we don't have it already
+                if (!this._monthsParse[i]) {
+                    mom = moment.utc([2000, i]);
+                    regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
+                    this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
+                }
+                // test the regex
+                if (this._monthsParse[i].test(monthName)) {
+                    return i;
+                }
+            }
+        },
+
+        _weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
+        weekdays : function (m) {
+            return this._weekdays[m.day()];
+        },
+
+        _weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
+        weekdaysShort : function (m) {
+            return this._weekdaysShort[m.day()];
+        },
+
+        _weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
+        weekdaysMin : function (m) {
+            return this._weekdaysMin[m.day()];
+        },
+
+        weekdaysParse : function (weekdayName) {
+            var i, mom, regex;
+
+            if (!this._weekdaysParse) {
+                this._weekdaysParse = [];
+            }
+
+            for (i = 0; i < 7; i++) {
+                // make the regex if we don't have it already
+                if (!this._weekdaysParse[i]) {
+                    mom = moment([2000, 1]).day(i);
+                    regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
+                    this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
+                }
+                // test the regex
+                if (this._weekdaysParse[i].test(weekdayName)) {
+                    return i;
+                }
+            }
+        },
+
+        _longDateFormat : {
+            LT : "h:mm A",
+            L : "MM/DD/YYYY",
+            LL : "MMMM D YYYY",
+            LLL : "MMMM D YYYY LT",
+            LLLL : "dddd, MMMM D YYYY LT"
+        },
+        longDateFormat : function (key) {
+            var output = this._longDateFormat[key];
+            if (!output && this._longDateFormat[key.toUpperCase()]) {
+                output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) {
+                    return val.slice(1);
+                });
+                this._longDateFormat[key] = output;
+            }
+            return output;
+        },
+
+        isPM : function (input) {
+            // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
+            // Using charAt should be more compatible.
+            return ((input + '').toLowerCase().charAt(0) === 'p');
+        },
+
+        _meridiemParse : /[ap]\.?m?\.?/i,
+        meridiem : function (hours, minutes, isLower) {
+            if (hours > 11) {
+                return isLower ? 'pm' : 'PM';
+            } else {
+                return isLower ? 'am' : 'AM';
+            }
+        },
+
+        _calendar : {
+            sameDay : '[Today at] LT',
+            nextDay : '[Tomorrow at] LT',
+            nextWeek : 'dddd [at] LT',
+            lastDay : '[Yesterday at] LT',
+            lastWeek : '[Last] dddd [at] LT',
+            sameElse : 'L'
+        },
+        calendar : function (key, mom) {
+            var output = this._calendar[key];
+            return typeof output === 'function' ? output.apply(mom) : output;
+        },
+
+        _relativeTime : {
+            future : "in %s",
+            past : "%s ago",
+            s : "a few seconds",
+            m : "a minute",
+            mm : "%d minutes",
+            h : "an hour",
+            hh : "%d hours",
+            d : "a day",
+            dd : "%d days",
+            M : "a month",
+            MM : "%d months",
+            y : "a year",
+            yy : "%d years"
+        },
+        relativeTime : function (number, withoutSuffix, string, isFuture) {
+            var output = this._relativeTime[string];
+            return (typeof output === 'function') ?
+                output(number, withoutSuffix, string, isFuture) :
+                output.replace(/%d/i, number);
+        },
+        pastFuture : function (diff, output) {
+            var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
+            return typeof format === 'function' ? format(output) : format.replace(/%s/i, output);
+        },
+
+        ordinal : function (number) {
+            return this._ordinal.replace("%d", number);
+        },
+        _ordinal : "%d",
+
+        preparse : function (string) {
+            return string;
+        },
+
+        postformat : function (string) {
+            return string;
+        },
+
+        week : function (mom) {
+            return weekOfYear(mom, this._week.dow, this._week.doy).week;
+        },
+
+        _week : {
+            dow : 0, // Sunday is the first day of the week.
+            doy : 6  // The week that contains Jan 1st is the first week of the year.
+        },
+
+        _invalidDate: 'Invalid date',
+        invalidDate: function () {
+            return this._invalidDate;
+        }
+    });
+
+    // Loads a language definition into the `languages` cache.  The function
+    // takes a key and optionally values.  If not in the browser and no values
+    // are provided, it will load the language file module.  As a convenience,
+    // this function also returns the language values.
+    function loadLang(key, values) {
+        values.abbr = key;
+        if (!languages[key]) {
+            languages[key] = new Language();
+        }
+        languages[key].set(values);
+        return languages[key];
+    }
+
+    // Remove a language from the `languages` cache. Mostly useful in tests.
+    function unloadLang(key) {
+        delete languages[key];
+    }
+
+    // Determines which language definition to use and returns it.
+    //
+    // With no parameters, it will return the global language.  If you
+    // pass in a language key, such as 'en', it will return the
+    // definition for 'en', so long as 'en' has already been loaded using
+    // moment.lang.
+    function getLangDefinition(key) {
+        var i = 0, j, lang, next, split,
+            get = function (k) {
+                if (!languages[k] && hasModule) {
+                    try {
+                        require('./lang/' + k);
+                    } catch (e) { }
+                }
+                return languages[k];
+            };
+
+        if (!key) {
+            return moment.fn._lang;
+        }
+
+        if (!isArray(key)) {
+            //short-circuit everything else
+            lang = get(key);
+            if (lang) {
+                return lang;
+            }
+            key = [key];
+        }
+
+        //pick the language from the array
+        //try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
+        //substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
+        while (i < key.length) {
+            split = normalizeLanguage(key[i]).split('-');
+            j = split.length;
+            next = normalizeLanguage(key[i + 1]);
+            next = next ? next.split('-') : null;
+            while (j > 0) {
+                lang = get(split.slice(0, j).join('-'));
+                if (lang) {
+                    return lang;
+                }
+                if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
+                    //the next array item is better than a shallower substring of this one
+                    break;
+                }
+                j--;
+            }
+            i++;
+        }
+        return moment.fn._lang;
+    }
+
+    /************************************
+        Formatting
+    ************************************/
+
+
+    function removeFormattingTokens(input) {
+        if (input.match(/\[[\s\S]/)) {
+            return input.replace(/^\[|\]$/g, "");
+        }
+        return input.replace(/\\/g, "");
+    }
+
+    function makeFormatFunction(format) {
+        var array = format.match(formattingTokens), i, length;
+
+        for (i = 0, length = array.length; i < length; i++) {
+            if (formatTokenFunctions[array[i]]) {
+                array[i] = formatTokenFunctions[array[i]];
+            } else {
+                array[i] = removeFormattingTokens(array[i]);
+            }
+        }
+
+        return function (mom) {
+            var output = "";
+            for (i = 0; i < length; i++) {
+                output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];
+            }
+            return output;
+        };
+    }
+
+    // format date using native date object
+    function formatMoment(m, format) {
+
+        if (!m.isValid()) {
+            return m.lang().invalidDate();
+        }
+
+        format = expandFormat(format, m.lang());
+
+        if (!formatFunctions[format]) {
+            formatFunctions[format] = makeFormatFunction(format);
+        }
+
+        return formatFunctions[format](m);
+    }
+
+    function expandFormat(format, lang) {
+        var i = 5;
+
+        function replaceLongDateFormatTokens(input) {
+            return lang.longDateFormat(input) || input;
+        }
+
+        localFormattingTokens.lastIndex = 0;
+        while (i >= 0 && localFormattingTokens.test(format)) {
+            format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
+            localFormattingTokens.lastIndex = 0;
+            i -= 1;
+        }
+
+        return format;
+    }
+
+
+    /************************************
+        Parsing
+    ************************************/
+
+
+    // get the regex to find the next token
+    function getParseRegexForToken(token, config) {
+        var a, strict = config._strict;
+        switch (token) {
+        case 'DDDD':
+            return parseTokenThreeDigits;
+        case 'YYYY':
+        case 'GGGG':
+        case 'gggg':
+            return strict ? parseTokenFourDigits : parseTokenOneToFourDigits;
+        case 'Y':
+        case 'G':
+        case 'g':
+            return parseTokenSignedNumber;
+        case 'YYYYYY':
+        case 'YYYYY':
+        case 'GGGGG':
+        case 'ggggg':
+            return strict ? parseTokenSixDigits : parseTokenOneToSixDigits;
+        case 'S':
+            if (strict) { return parseTokenOneDigit; }
+            /* falls through */
+        case 'SS':
+            if (strict) { return parseTokenTwoDigits; }
+            /* falls through */
+        case 'SSS':
+            if (strict) { return parseTokenThreeDigits; }
+            /* falls through */
+        case 'DDD':
+            return parseTokenOneToThreeDigits;
+        case 'MMM':
+        case 'MMMM':
+        case 'dd':
+        case 'ddd':
+        case 'dddd':
+            return parseTokenWord;
+        case 'a':
+        case 'A':
+            return getLangDefinition(config._l)._meridiemParse;
+        case 'X':
+            return parseTokenTimestampMs;
+        case 'Z':
+        case 'ZZ':
+            return parseTokenTimezone;
+        case 'T':
+            return parseTokenT;
+        case 'SSSS':
+            return parseTokenDigits;
+        case 'MM':
+        case 'DD':
+        case 'YY':
+        case 'GG':
+        case 'gg':
+        case 'HH':
+        case 'hh':
+        case 'mm':
+        case 'ss':
+        case 'ww':
+        case 'WW':
+            return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits;
+        case 'M':
+        case 'D':
+        case 'd':
+        case 'H':
+        case 'h':
+        case 'm':
+        case 's':
+        case 'w':
+        case 'W':
+        case 'e':
+        case 'E':
+            return parseTokenOneOrTwoDigits;
+        default :
+            a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), "i"));
+            return a;
+        }
+    }
+
+    function timezoneMinutesFromString(string) {
+        string = string || "";
+        var possibleTzMatches = (string.match(parseTokenTimezone) || []),
+            tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [],
+            parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0],
+            minutes = +(parts[1] * 60) + toInt(parts[2]);
+
+        return parts[0] === '+' ? -minutes : minutes;
+    }
+
+    // function to convert string input to date
+    function addTimeToArrayFromToken(token, input, config) {
+        var a, datePartArray = config._a;
+
+        switch (token) {
+        // MONTH
+        case 'M' : // fall through to MM
+        case 'MM' :
+            if (input != null) {
+                datePartArray[MONTH] = toInt(input) - 1;
+            }
+            break;
+        case 'MMM' : // fall through to MMMM
+        case 'MMMM' :
+            a = getLangDefinition(config._l).monthsParse(input);
+            // if we didn't find a month name, mark the date as invalid.
+            if (a != null) {
+                datePartArray[MONTH] = a;
+            } else {
+                config._pf.invalidMonth = input;
+            }
+            break;
+        // DAY OF MONTH
+        case 'D' : // fall through to DD
+        case 'DD' :
+            if (input != null) {
+                datePartArray[DATE] = toInt(input);
+            }
+            break;
+        // DAY OF YEAR
+        case 'DDD' : // fall through to DDDD
+        case 'DDDD' :
+            if (input != null) {
+                config._dayOfYear = toInt(input);
+            }
+
+            break;
+        // YEAR
+        case 'YY' :
+            datePartArray[YEAR] = toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
+            break;
+        case 'YYYY' :
+        case 'YYYYY' :
+        case 'YYYYYY' :
+            datePartArray[YEAR] = toInt(input);
+            break;
+        // AM / PM
+        case 'a' : // fall through to A
+        case 'A' :
+            config._isPm = getLangDefinition(config._l).isPM(input);
+            break;
+        // 24 HOUR
+        case 'H' : // fall through to hh
+        case 'HH' : // fall through to hh
+        case 'h' : // fall through to hh
+        case 'hh' :
+            datePartArray[HOUR] = toInt(input);
+            break;
+        // MINUTE
+        case 'm' : // fall through to mm
+        case 'mm' :
+            datePartArray[MINUTE] = toInt(input);
+            break;
+        // SECOND
+        case 's' : // fall through to ss
+        case 'ss' :
+            datePartArray[SECOND] = toInt(input);
+            break;
+        // MILLISECOND
+        case 'S' :
+        case 'SS' :
+        case 'SSS' :
+        case 'SSSS' :
+            datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000);
+            break;
+        // UNIX TIMESTAMP WITH MS
+        case 'X':
+            config._d = new Date(parseFloat(input) * 1000);
+            break;
+        // TIMEZONE
+        case 'Z' : // fall through to ZZ
+        case 'ZZ' :
+            config._useUTC = true;
+            config._tzm = timezoneMinutesFromString(input);
+            break;
+        case 'w':
+        case 'ww':
+        case 'W':
+        case 'WW':
+        case 'd':
+        case 'dd':
+        case 'ddd':
+        case 'dddd':
+        case 'e':
+        case 'E':
+            token = token.substr(0, 1);
+            /* falls through */
+        case 'gg':
+        case 'gggg':
+        case 'GG':
+        case 'GGGG':
+        case 'GGGGG':
+            token = token.substr(0, 2);
+            if (input) {
+                config._w = config._w || {};
+                config._w[token] = input;
+            }
+            break;
+        }
+    }
+
+    // convert an array to a date.
+    // the array should mirror the parameters below
+    // note: all values past the year are optional and will default to the lowest possible value.
+    // [year, month, day , hour, minute, second, millisecond]
+    function dateFromConfig(config) {
+        var i, date, input = [], currentDate,
+            yearToUse, fixYear, w, temp, lang, weekday, week;
+
+        if (config._d) {
+            return;
+        }
+
+        currentDate = currentDateArray(config);
+
+        //compute day of the year from weeks and weekdays
+        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
+            fixYear = function (val) {
+                var int_val = parseInt(val, 10);
+                return val ?
+                  (val.length < 3 ? (int_val > 68 ? 1900 + int_val : 2000 + int_val) : int_val) :
+                  (config._a[YEAR] == null ? moment().weekYear() : config._a[YEAR]);
+            };
+
+            w = config._w;
+            if (w.GG != null || w.W != null || w.E != null) {
+                temp = dayOfYearFromWeeks(fixYear(w.GG), w.W || 1, w.E, 4, 1);
+            }
+            else {
+                lang = getLangDefinition(config._l);
+                weekday = w.d != null ?  parseWeekday(w.d, lang) :
+                  (w.e != null ?  parseInt(w.e, 10) + lang._week.dow : 0);
+
+                week = parseInt(w.w, 10) || 1;
+
+                //if we're parsing 'd', then the low day numbers may be next week
+                if (w.d != null && weekday < lang._week.dow) {
+                    week++;
+                }
+
+                temp = dayOfYearFromWeeks(fixYear(w.gg), week, weekday, lang._week.doy, lang._week.dow);
+            }
+
+            config._a[YEAR] = temp.year;
+            config._dayOfYear = temp.dayOfYear;
+        }
+
+        //if the day of the year is set, figure out what it is
+        if (config._dayOfYear) {
+            yearToUse = config._a[YEAR] == null ? currentDate[YEAR] : config._a[YEAR];
+
+            if (config._dayOfYear > daysInYear(yearToUse)) {
+                config._pf._overflowDayOfYear = true;
+            }
+
+            date = makeUTCDate(yearToUse, 0, config._dayOfYear);
+            config._a[MONTH] = date.getUTCMonth();
+            config._a[DATE] = date.getUTCDate();
+        }
+
+        // Default to current date.
+        // * if no year, month, day of month are given, default to today
+        // * if day of month is given, default month and year
+        // * if month is given, default only year
+        // * if year is given, don't default anything
+        for (i = 0; i < 3 && config._a[i] == null; ++i) {
+            config._a[i] = input[i] = currentDate[i];
+        }
+
+        // Zero out whatever was not defaulted, including time
+        for (; i < 7; i++) {
+            config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
+        }
+
+        // add the offsets to the time to be parsed so that we can have a clean array for checking isValid
+        input[HOUR] += toInt((config._tzm || 0) / 60);
+        input[MINUTE] += toInt((config._tzm || 0) % 60);
+
+        config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input);
+    }
+
+    function dateFromObject(config) {
+        var normalizedInput;
+
+        if (config._d) {
+            return;
+        }
+
+        normalizedInput = normalizeObjectUnits(config._i);
+        config._a = [
+            normalizedInput.year,
+            normalizedInput.month,
+            normalizedInput.day,
+            normalizedInput.hour,
+            normalizedInput.minute,
+            normalizedInput.second,
+            normalizedInput.millisecond
+        ];
+
+        dateFromConfig(config);
+    }
+
+    function currentDateArray(config) {
+        var now = new Date();
+        if (config._useUTC) {
+            return [
+                now.getUTCFullYear(),
+                now.getUTCMonth(),
+                now.getUTCDate()
+            ];
+        } else {
+            return [now.getFullYear(), now.getMonth(), now.getDate()];
+        }
+    }
+
+    // date from string and format string
+    function makeDateFromStringAndFormat(config) {
+
+        config._a = [];
+        config._pf.empty = true;
+
+        // This array is used to make a Date, either with `new Date` or `Date.UTC`
+        var lang = getLangDefinition(config._l),
+            string = '' + config._i,
+            i, parsedInput, tokens, token, skipped,
+            stringLength = string.length,
+            totalParsedInputLength = 0;
+
+        tokens = expandFormat(config._f, lang).match(formattingTokens) || [];
+
+        for (i = 0; i < tokens.length; i++) {
+            token = tokens[i];
+            parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
+            if (parsedInput) {
+                skipped = string.substr(0, string.indexOf(parsedInput));
+                if (skipped.length > 0) {
+                    config._pf.unusedInput.push(skipped);
+                }
+                string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
+                totalParsedInputLength += parsedInput.length;
+            }
+            // don't parse if it's not a known token
+            if (formatTokenFunctions[token]) {
+                if (parsedInput) {
+                    config._pf.empty = false;
+                }
+                else {
+                    config._pf.unusedTokens.push(token);
+                }
+                addTimeToArrayFromToken(token, parsedInput, config);
+            }
+            else if (config._strict && !parsedInput) {
+                config._pf.unusedTokens.push(token);
+            }
+        }
+
+        // add remaining unparsed input length to the string
+        config._pf.charsLeftOver = stringLength - totalParsedInputLength;
+        if (string.length > 0) {
+            config._pf.unusedInput.push(string);
+        }
+
+        // handle am pm
+        if (config._isPm && config._a[HOUR] < 12) {
+            config._a[HOUR] += 12;
+        }
+        // if is 12 am, change hours to 0
+        if (config._isPm === false && config._a[HOUR] === 12) {
+            config._a[HOUR] = 0;
+        }
+
+        dateFromConfig(config);
+        checkOverflow(config);
+    }
+
+    function unescapeFormat(s) {
+        return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
+            return p1 || p2 || p3 || p4;
+        });
+    }
+
+    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
+    function regexpEscape(s) {
+        return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
+    }
+
+    // date from string and array of format strings
+    function makeDateFromStringAndArray(config) {
+        var tempConfig,
+            bestMoment,
+
+            scoreToBeat,
+            i,
+            currentScore;
+
+        if (config._f.length === 0) {
+            config._pf.invalidFormat = true;
+            config._d = new Date(NaN);
+            return;
+        }
+
+        for (i = 0; i < config._f.length; i++) {
+            currentScore = 0;
+            tempConfig = extend({}, config);
+            tempConfig._pf = defaultParsingFlags();
+            tempConfig._f = config._f[i];
+            makeDateFromStringAndFormat(tempConfig);
+
+            if (!isValid(tempConfig)) {
+                continue;
+            }
+
+            // if there is any input that was not parsed add a penalty for that format
+            currentScore += tempConfig._pf.charsLeftOver;
+
+            //or tokens
+            currentScore += tempConfig._pf.unusedTokens.length * 10;
+
+            tempConfig._pf.score = currentScore;
+
+            if (scoreToBeat == null || currentScore < scoreToBeat) {
+                scoreToBeat = currentScore;
+                bestMoment = tempConfig;
+            }
+        }
+
+        extend(config, bestMoment || tempConfig);
+    }
+
+    // date from iso format
+    function makeDateFromString(config) {
+        var i, l,
+            string = config._i,
+            match = isoRegex.exec(string);
+
+        if (match) {
+            config._pf.iso = true;
+            for (i = 0, l = isoDates.length; i < l; i++) {
+                if (isoDates[i][1].exec(string)) {
+                    // match[5] should be "T" or undefined
+                    config._f = isoDates[i][0] + (match[6] || " ");
+                    break;
+                }
+            }
+            for (i = 0, l = isoTimes.length; i < l; i++) {
+                if (isoTimes[i][1].exec(string)) {
+                    config._f += isoTimes[i][0];
+                    break;
+                }
+            }
+            if (string.match(parseTokenTimezone)) {
+                config._f += "Z";
+            }
+            makeDateFromStringAndFormat(config);
+        }
+        else {
+            config._d = new Date(string);
+        }
+    }
+
+    function makeDateFromInput(config) {
+        var input = config._i,
+            matched = aspNetJsonRegex.exec(input);
+
+        if (input === undefined) {
+            config._d = new Date();
+        } else if (matched) {
+            config._d = new Date(+matched[1]);
+        } else if (typeof input === 'string') {
+            makeDateFromString(config);
+        } else if (isArray(input)) {
+            config._a = input.slice(0);
+            dateFromConfig(config);
+        } else if (isDate(input)) {
+            config._d = new Date(+input);
+        } else if (typeof(input) === 'object') {
+            dateFromObject(config);
+        } else {
+            config._d = new Date(input);
+        }
+    }
+
+    function makeDate(y, m, d, h, M, s, ms) {
+        //can't just apply() to create a date:
+        //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
+        var date = new Date(y, m, d, h, M, s, ms);
+
+        //the date constructor doesn't accept years < 1970
+        if (y < 1970) {
+            date.setFullYear(y);
+        }
+        return date;
+    }
+
+    function makeUTCDate(y) {
+        var date = new Date(Date.UTC.apply(null, arguments));
+        if (y < 1970) {
+            date.setUTCFullYear(y);
+        }
+        return date;
+    }
+
+    function parseWeekday(input, language) {
+        if (typeof input === 'string') {
+            if (!isNaN(input)) {
+                input = parseInt(input, 10);
+            }
+            else {
+                input = language.weekdaysParse(input);
+                if (typeof input !== 'number') {
+                    return null;
+                }
+            }
+        }
+        return input;
+    }
+
+    /************************************
+        Relative Time
+    ************************************/
+
+
+    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
+    function substituteTimeAgo(string, number, withoutSuffix, isFuture, lang) {
+        return lang.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
+    }
+
+    function relativeTime(milliseconds, withoutSuffix, lang) {
+        var seconds = round(Math.abs(milliseconds) / 1000),
+            minutes = round(seconds / 60),
+            hours = round(minutes / 60),
+            days = round(hours / 24),
+            years = round(days / 365),
+            args = seconds < 45 && ['s', seconds] ||
+                minutes === 1 && ['m'] ||
+                minutes < 45 && ['mm', minutes] ||
+                hours === 1 && ['h'] ||
+                hours < 22 && ['hh', hours] ||
+                days === 1 && ['d'] ||
+                days <= 25 && ['dd', days] ||
+                days <= 45 && ['M'] ||
+                days < 345 && ['MM', round(days / 30)] ||
+                years === 1 && ['y'] || ['yy', years];
+        args[2] = withoutSuffix;
+        args[3] = milliseconds > 0;
+        args[4] = lang;
+        return substituteTimeAgo.apply({}, args);
+    }
+
+
+    /************************************
+        Week of Year
+    ************************************/
+
+
+    // firstDayOfWeek       0 = sun, 6 = sat
+    //                      the day of the week that starts the week
+    //                      (usually sunday or monday)
+    // firstDayOfWeekOfYear 0 = sun, 6 = sat
+    //                      the first week is the week that contains the first
+    //                      of this day of the week
+    //                      (eg. ISO weeks use thursday (4))
+    function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) {
+        var end = firstDayOfWeekOfYear - firstDayOfWeek,
+            daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(),
+            adjustedMoment;
+
+
+        if (daysToDayOfWeek > end) {
+            daysToDayOfWeek -= 7;
+        }
+
+        if (daysToDayOfWeek < end - 7) {
+            daysToDayOfWeek += 7;
+        }
+
+        adjustedMoment = moment(mom).add('d', daysToDayOfWeek);
+        return {
+            week: Math.ceil(adjustedMoment.dayOfYear() / 7),
+            year: adjustedMoment.year()
+        };
+    }
+
+    //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
+    function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) {
+        var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear;
+
+        weekday = weekday != null ? weekday : firstDayOfWeek;
+        daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0);
+        dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1;
+
+        return {
+            year: dayOfYear > 0 ? year : year - 1,
+            dayOfYear: dayOfYear > 0 ?  dayOfYear : daysInYear(year - 1) + dayOfYear
+        };
+    }
+
+    /************************************
+        Top Level Functions
+    ************************************/
+
+    function makeMoment(config) {
+        var input = config._i,
+            format = config._f;
+
+        if (input === null) {
+            return moment.invalid({nullInput: true});
+        }
+
+        if (typeof input === 'string') {
+            config._i = input = getLangDefinition().preparse(input);
+        }
+
+        if (moment.isMoment(input)) {
+            config = cloneMoment(input);
+
+            config._d = new Date(+input._d);
+        } else if (format) {
+            if (isArray(format)) {
+                makeDateFromStringAndArray(config);
+            } else {
+                makeDateFromStringAndFormat(config);
+            }
+        } else {
+            makeDateFromInput(config);
+        }
+
+        return new Moment(config);
+    }
+
+    moment = function (input, format, lang, strict) {
+        var c;
+
+        if (typeof(lang) === "boolean") {
+            strict = lang;
+            lang = undefined;
+        }
+        // object construction must be done this way.
+        // https://github.com/moment/moment/issues/1423
+        c = {};
+        c._isAMomentObject = true;
+        c._i = input;
+        c._f = format;
+        c._l = lang;
+        c._strict = strict;
+        c._isUTC = false;
+        c._pf = defaultParsingFlags();
+
+        return makeMoment(c);
+    };
+
+    // creating with utc
+    moment.utc = function (input, format, lang, strict) {
+        var c;
+
+        if (typeof(lang) === "boolean") {
+            strict = lang;
+            lang = undefined;
+        }
+        // object construction must be done this way.
+        // https://github.com/moment/moment/issues/1423
+        c = {};
+        c._isAMomentObject = true;
+        c._useUTC = true;
+        c._isUTC = true;
+        c._l = lang;
+        c._i = input;
+        c._f = format;
+        c._strict = strict;
+        c._pf = defaultParsingFlags();
+
+        return makeMoment(c).utc();
+    };
+
+    // creating with unix timestamp (in seconds)
+    moment.unix = function (input) {
+        return moment(input * 1000);
+    };
+
+    // duration
+    moment.duration = function (input, key) {
+        var duration = input,
+            // matching against regexp is expensive, do it on demand
+            match = null,
+            sign,
+            ret,
+            parseIso;
+
+        if (moment.isDuration(input)) {
+            duration = {
+                ms: input._milliseconds,
+                d: input._days,
+                M: input._months
+            };
+        } else if (typeof input === 'number') {
+            duration = {};
+            if (key) {
+                duration[key] = input;
+            } else {
+                duration.milliseconds = input;
+            }
+        } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) {
+            sign = (match[1] === "-") ? -1 : 1;
+            duration = {
+                y: 0,
+                d: toInt(match[DATE]) * sign,
+                h: toInt(match[HOUR]) * sign,
+                m: toInt(match[MINUTE]) * sign,
+                s: toInt(match[SECOND]) * sign,
+                ms: toInt(match[MILLISECOND]) * sign
+            };
+        } else if (!!(match = isoDurationRegex.exec(input))) {
+            sign = (match[1] === "-") ? -1 : 1;
+            parseIso = function (inp) {
+                // We'd normally use ~~inp for this, but unfortunately it also
+                // converts floats to ints.
+                // inp may be undefined, so careful calling replace on it.
+                var res = inp && parseFloat(inp.replace(',', '.'));
+                // apply sign while we're at it
+                return (isNaN(res) ? 0 : res) * sign;
+            };
+            duration = {
+                y: parseIso(match[2]),
+                M: parseIso(match[3]),
+                d: parseIso(match[4]),
+                h: parseIso(match[5]),
+                m: parseIso(match[6]),
+                s: parseIso(match[7]),
+                w: parseIso(match[8])
+            };
+        }
+
+        ret = new Duration(duration);
+
+        if (moment.isDuration(input) && input.hasOwnProperty('_lang')) {
+            ret._lang = input._lang;
+        }
+
+        return ret;
+    };
+
+    // version number
+    moment.version = VERSION;
+
+    // default format
+    moment.defaultFormat = isoFormat;
+
+    // This function will be called whenever a moment is mutated.
+    // It is intended to keep the offset in sync with the timezone.
+    moment.updateOffset = function () {};
+
+    // This function will load languages and then set the global language.  If
+    // no arguments are passed in, it will simply return the current global
+    // language key.
+    moment.lang = function (key, values) {
+        var r;
+        if (!key) {
+            return moment.fn._lang._abbr;
+        }
+        if (values) {
+            loadLang(normalizeLanguage(key), values);
+        } else if (values === null) {
+            unloadLang(key);
+            key = 'en';
+        } else if (!languages[key]) {
+            getLangDefinition(key);
+        }
+        r = moment.duration.fn._lang = moment.fn._lang = getLangDefinition(key);
+        return r._abbr;
+    };
+
+    // returns language data
+    moment.langData = function (key) {
+        if (key && key._lang && key._lang._abbr) {
+            key = key._lang._abbr;
+        }
+        return getLangDefinition(key);
+    };
+
+    // compare moment object
+    moment.isMoment = function (obj) {
+        return obj instanceof Moment ||
+            (obj != null &&  obj.hasOwnProperty('_isAMomentObject'));
+    };
+
+    // for typechecking Duration objects
+    moment.isDuration = function (obj) {
+        return obj instanceof Duration;
+    };
+
+    for (i = lists.length - 1; i >= 0; --i) {
+        makeList(lists[i]);
+    }
+
+    moment.normalizeUnits = function (units) {
+        return normalizeUnits(units);
+    };
+
+    moment.invalid = function (flags) {
+        var m = moment.utc(NaN);
+        if (flags != null) {
+            extend(m._pf, flags);
+        }
+        else {
+            m._pf.userInvalidated = true;
+        }
+
+        return m;
+    };
+
+    moment.parseZone = function (input) {
+        return moment(input).parseZone();
+    };
+
+    /************************************
+        Moment Prototype
+    ************************************/
+
+
+    extend(moment.fn = Moment.prototype, {
+
+        clone : function () {
+            return moment(this);
+        },
+
+        valueOf : function () {
+            return +this._d + ((this._offset || 0) * 60000);
+        },
+
+        unix : function () {
+            return Math.floor(+this / 1000);
+        },
+
+        toString : function () {
+            return this.clone().lang('en').format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ");
+        },
+
+        toDate : function () {
+            return this._offset ? new Date(+this) : this._d;
+        },
+
+        toISOString : function () {
+            var m = moment(this).utc();
+            if (0 < m.year() && m.year() <= 9999) {
+                return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+            } else {
+                return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+            }
+        },
+
+        toArray : function () {
+            var m = this;
+            return [
+                m.year(),
+                m.month(),
+                m.date(),
+                m.hours(),
+                m.minutes(),
+                m.seconds(),
+                m.milliseconds()
+            ];
+        },
+
+        isValid : function () {
+            return isValid(this);
+        },
+
+        isDSTShifted : function () {
+
+            if (this._a) {
+                return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0;
+            }
+
+            return false;
+        },
+
+        parsingFlags : function () {
+            return extend({}, this._pf);
+        },
+
+        invalidAt: function () {
+            return this._pf.overflow;
+        },
+
+        utc : function () {
+            return this.zone(0);
+        },
+
+        local : function () {
+            this.zone(0);
+            this._isUTC = false;
+            return this;
+        },
+
+        format : function (inputString) {
+            var output = formatMoment(this, inputString || moment.defaultFormat);
+            return this.lang().postformat(output);
+        },
+
+        add : function (input, val) {
+            var dur;
+            // switch args to support add('s', 1) and add(1, 's')
+            if (typeof input === 'string') {
+                dur = moment.duration(+val, input);
+            } else {
+                dur = moment.duration(input, val);
+            }
+            addOrSubtractDurationFromMoment(this, dur, 1);
+            return this;
+        },
+
+        subtract : function (input, val) {
+            var dur;
+            // switch args to support subtract('s', 1) and subtract(1, 's')
+            if (typeof input === 'string') {
+                dur = moment.duration(+val, input);
+            } else {
+                dur = moment.duration(input, val);
+            }
+            addOrSubtractDurationFromMoment(this, dur, -1);
+            return this;
+        },
+
+        diff : function (input, units, asFloat) {
+            var that = makeAs(input, this),
+                zoneDiff = (this.zone() - that.zone()) * 6e4,
+                diff, output;
+
+            units = normalizeUnits(units);
+
+            if (units === 'year' || units === 'month') {
+                // average number of days in the months in the given dates
+                diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2
+                // difference in months
+                output = ((this.year() - that.year()) * 12) + (this.month() - that.month());
+                // adjust by taking difference in days, average number of days
+                // and dst in the given months.
+                output += ((this - moment(this).startOf('month')) -
+                        (that - moment(that).startOf('month'))) / diff;
+                // same as above but with zones, to negate all dst
+                output -= ((this.zone() - moment(this).startOf('month').zone()) -
+                        (that.zone() - moment(that).startOf('month').zone())) * 6e4 / diff;
+                if (units === 'year') {
+                    output = output / 12;
+                }
+            } else {
+                diff = (this - that);
+                output = units === 'second' ? diff / 1e3 : // 1000
+                    units === 'minute' ? diff / 6e4 : // 1000 * 60
+                    units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60
+                    units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
+                    units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
+                    diff;
+            }
+            return asFloat ? output : absRound(output);
+        },
+
+        from : function (time, withoutSuffix) {
+            return moment.duration(this.diff(time)).lang(this.lang()._abbr).humanize(!withoutSuffix);
+        },
+
+        fromNow : function (withoutSuffix) {
+            return this.from(moment(), withoutSuffix);
+        },
+
+        calendar : function () {
+            // We want to compare the start of today, vs this.
+            // Getting start-of-today depends on whether we're zone'd or not.
+            var sod = makeAs(moment(), this).startOf('day'),
+                diff = this.diff(sod, 'days', true),
+                format = diff < -6 ? 'sameElse' :
+                    diff < -1 ? 'lastWeek' :
+                    diff < 0 ? 'lastDay' :
+                    diff < 1 ? 'sameDay' :
+                    diff < 2 ? 'nextDay' :
+                    diff < 7 ? 'nextWeek' : 'sameElse';
+            return this.format(this.lang().calendar(format, this));
+        },
+
+        isLeapYear : function () {
+            return isLeapYear(this.year());
+        },
+
+        isDST : function () {
+            return (this.zone() < this.clone().month(0).zone() ||
+                this.zone() < this.clone().month(5).zone());
+        },
+
+        day : function (input) {
+            var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
+            if (input != null) {
+                input = parseWeekday(input, this.lang());
+                return this.add({ d : input - day });
+            } else {
+                return day;
+            }
+        },
+
+        month : function (input) {
+            var utc = this._isUTC ? 'UTC' : '',
+                dayOfMonth;
+
+            if (input != null) {
+                if (typeof input === 'string') {
+                    input = this.lang().monthsParse(input);
+                    if (typeof input !== 'number') {
+                        return this;
+                    }
+                }
+
+                dayOfMonth = this.date();
+                this.date(1);
+                this._d['set' + utc + 'Month'](input);
+                this.date(Math.min(dayOfMonth, this.daysInMonth()));
+
+                moment.updateOffset(this);
+                return this;
+            } else {
+                return this._d['get' + utc + 'Month']();
+            }
+        },
+
+        startOf: function (units) {
+            units = normalizeUnits(units);
+            // the following switch intentionally omits break keywords
+            // to utilize falling through the cases.
+            switch (units) {
+            case 'year':
+                this.month(0);
+                /* falls through */
+            case 'month':
+                this.date(1);
+                /* falls through */
+            case 'week':
+            case 'isoWeek':
+            case 'day':
+                this.hours(0);
+                /* falls through */
+            case 'hour':
+                this.minutes(0);
+                /* falls through */
+            case 'minute':
+                this.seconds(0);
+                /* falls through */
+            case 'second':
+                this.milliseconds(0);
+                /* falls through */
+            }
+
+            // weeks are a special case
+            if (units === 'week') {
+                this.weekday(0);
+            } else if (units === 'isoWeek') {
+                this.isoWeekday(1);
+            }
+
+            return this;
+        },
+
+        endOf: function (units) {
+            units = normalizeUnits(units);
+            return this.startOf(units).add((units === 'isoWeek' ? 'week' : units), 1).subtract('ms', 1);
+        },
+
+        isAfter: function (input, units) {
+            units = typeof units !== 'undefined' ? units : 'millisecond';
+            return +this.clone().startOf(units) > +moment(input).startOf(units);
+        },
+
+        isBefore: function (input, units) {
+            units = typeof units !== 'undefined' ? units : 'millisecond';
+            return +this.clone().startOf(units) < +moment(input).startOf(units);
+        },
+
+        isSame: function (input, units) {
+            units = units || 'ms';
+            return +this.clone().startOf(units) === +makeAs(input, this).startOf(units);
+        },
+
+        min: function (other) {
+            other = moment.apply(null, arguments);
+            return other < this ? this : other;
+        },
+
+        max: function (other) {
+            other = moment.apply(null, arguments);
+            return other > this ? this : other;
+        },
+
+        zone : function (input) {
+            var offset = this._offset || 0;
+            if (input != null) {
+                if (typeof input === "string") {
+                    input = timezoneMinutesFromString(input);
+                }
+                if (Math.abs(input) < 16) {
+                    input = input * 60;
+                }
+                this._offset = input;
+                this._isUTC = true;
+                if (offset !== input) {
+                    addOrSubtractDurationFromMoment(this, moment.duration(offset - input, 'm'), 1, true);
+                }
+            } else {
+                return this._isUTC ? offset : this._d.getTimezoneOffset();
+            }
+            return this;
+        },
+
+        zoneAbbr : function () {
+            return this._isUTC ? "UTC" : "";
+        },
+
+        zoneName : function () {
+            return this._isUTC ? "Coordinated Universal Time" : "";
+        },
+
+        parseZone : function () {
+            if (this._tzm) {
+                this.zone(this._tzm);
+            } else if (typeof this._i === 'string') {
+                this.zone(this._i);
+            }
+            return this;
+        },
+
+        hasAlignedHourOffset : function (input) {
+            if (!input) {
+                input = 0;
+            }
+            else {
+                input = moment(input).zone();
+            }
+
+            return (this.zone() - input) % 60 === 0;
+        },
+
+        daysInMonth : function () {
+            return daysInMonth(this.year(), this.month());
+        },
+
+        dayOfYear : function (input) {
+            var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1;
+            return input == null ? dayOfYear : this.add("d", (input - dayOfYear));
+        },
+
+        quarter : function () {
+            return Math.ceil((this.month() + 1.0) / 3.0);
+        },
+
+        weekYear : function (input) {
+            var year = weekOfYear(this, this.lang()._week.dow, this.lang()._week.doy).year;
+            return input == null ? year : this.add("y", (input - year));
+        },
+
+        isoWeekYear : function (input) {
+            var year = weekOfYear(this, 1, 4).year;
+            return input == null ? year : this.add("y", (input - year));
+        },
+
+        week : function (input) {
+            var week = this.lang().week(this);
+            return input == null ? week : this.add("d", (input - week) * 7);
+        },
+
+        isoWeek : function (input) {
+            var week = weekOfYear(this, 1, 4).week;
+            return input == null ? week : this.add("d", (input - week) * 7);
+        },
+
+        weekday : function (input) {
+            var weekday = (this.day() + 7 - this.lang()._week.dow) % 7;
+            return input == null ? weekday : this.add("d", input - weekday);
+        },
+
+        isoWeekday : function (input) {
+            // behaves the same as moment#day except
+            // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
+            // as a setter, sunday should belong to the previous week.
+            return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7);
+        },
+
+        get : function (units) {
+            units = normalizeUnits(units);
+            return this[units]();
+        },
+
+        set : function (units, value) {
+            units = normalizeUnits(units);
+            if (typeof this[units] === 'function') {
+                this[units](value);
+            }
+            return this;
+        },
+
+        // If passed a language key, it will set the language for this
+        // instance.  Otherwise, it will return the language configuration
+        // variables for this instance.
+        lang : function (key) {
+            if (key === undefined) {
+                return this._lang;
+            } else {
+                this._lang = getLangDefinition(key);
+                return this;
+            }
+        }
+    });
+
+    // helper for adding shortcuts
+    function makeGetterAndSetter(name, key) {
+        moment.fn[name] = moment.fn[name + 's'] = function (input) {
+            var utc = this._isUTC ? 'UTC' : '';
+            if (input != null) {
+                this._d['set' + utc + key](input);
+                moment.updateOffset(this);
+                return this;
+            } else {
+                return this._d['get' + utc + key]();
+            }
+        };
+    }
+
+    // loop through and add shortcuts (Month, Date, Hours, Minutes, Seconds, Milliseconds)
+    for (i = 0; i < proxyGettersAndSetters.length; i ++) {
+        makeGetterAndSetter(proxyGettersAndSetters[i].toLowerCase().replace(/s$/, ''), proxyGettersAndSetters[i]);
+    }
+
+    // add shortcut for year (uses different syntax than the getter/setter 'year' == 'FullYear')
+    makeGetterAndSetter('year', 'FullYear');
+
+    // add plural methods
+    moment.fn.days = moment.fn.day;
+    moment.fn.months = moment.fn.month;
+    moment.fn.weeks = moment.fn.week;
+    moment.fn.isoWeeks = moment.fn.isoWeek;
+
+    // add aliased format methods
+    moment.fn.toJSON = moment.fn.toISOString;
+
+    /************************************
+        Duration Prototype
+    ************************************/
+
+
+    extend(moment.duration.fn = Duration.prototype, {
+
+        _bubble : function () {
+            var milliseconds = this._milliseconds,
+                days = this._days,
+                months = this._months,
+                data = this._data,
+                seconds, minutes, hours, years;
+
+            // The following code bubbles up values, see the tests for
+            // examples of what that means.
+            data.milliseconds = milliseconds % 1000;
+
+            seconds = absRound(milliseconds / 1000);
+            data.seconds = seconds % 60;
+
+            minutes = absRound(seconds / 60);
+            data.minutes = minutes % 60;
+
+            hours = absRound(minutes / 60);
+            data.hours = hours % 24;
+
+            days += absRound(hours / 24);
+            data.days = days % 30;
+
+            months += absRound(days / 30);
+            data.months = months % 12;
+
+            years = absRound(months / 12);
+            data.years = years;
+        },
+
+        weeks : function () {
+            return absRound(this.days() / 7);
+        },
+
+        valueOf : function () {
+            return this._milliseconds +
+              this._days * 864e5 +
+              (this._months % 12) * 2592e6 +
+              toInt(this._months / 12) * 31536e6;
+        },
+
+        humanize : function (withSuffix) {
+            var difference = +this,
+                output = relativeTime(difference, !withSuffix, this.lang());
+
+            if (withSuffix) {
+                output = this.lang().pastFuture(difference, output);
+            }
+
+            return this.lang().postformat(output);
+        },
+
+        add : function (input, val) {
+            // supports only 2.0-style add(1, 's') or add(moment)
+            var dur = moment.duration(input, val);
+
+            this._milliseconds += dur._milliseconds;
+            this._days += dur._days;
+            this._months += dur._months;
+
+            this._bubble();
+
+            return this;
+        },
+
+        subtract : function (input, val) {
+            var dur = moment.duration(input, val);
+
+            this._milliseconds -= dur._milliseconds;
+            this._days -= dur._days;
+            this._months -= dur._months;
+
+            this._bubble();
+
+            return this;
+        },
+
+        get : function (units) {
+            units = normalizeUnits(units);
+            return this[units.toLowerCase() + 's']();
+        },
+
+        as : function (units) {
+            units = normalizeUnits(units);
+            return this['as' + units.charAt(0).toUpperCase() + units.slice(1) + 's']();
+        },
+
+        lang : moment.fn.lang,
+
+        toIsoString : function () {
+            // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
+            var years = Math.abs(this.years()),
+                months = Math.abs(this.months()),
+                days = Math.abs(this.days()),
+                hours = Math.abs(this.hours()),
+                minutes = Math.abs(this.minutes()),
+                seconds = Math.abs(this.seconds() + this.milliseconds() / 1000);
+
+            if (!this.asSeconds()) {
+                // this is the same as C#'s (Noda) and python (isodate)...
+                // but not other JS (goog.date)
+                return 'P0D';
+            }
+
+            return (this.asSeconds() < 0 ? '-' : '') +
+                'P' +
+                (years ? years + 'Y' : '') +
+                (months ? months + 'M' : '') +
+                (days ? days + 'D' : '') +
+                ((hours || minutes || seconds) ? 'T' : '') +
+                (hours ? hours + 'H' : '') +
+                (minutes ? minutes + 'M' : '') +
+                (seconds ? seconds + 'S' : '');
+        }
+    });
+
+    function makeDurationGetter(name) {
+        moment.duration.fn[name] = function () {
+            return this._data[name];
+        };
+    }
+
+    function makeDurationAsGetter(name, factor) {
+        moment.duration.fn['as' + name] = function () {
+            return +this / factor;
+        };
+    }
+
+    for (i in unitMillisecondFactors) {
+        if (unitMillisecondFactors.hasOwnProperty(i)) {
+            makeDurationAsGetter(i, unitMillisecondFactors[i]);
+            makeDurationGetter(i.toLowerCase());
+        }
+    }
+
+    makeDurationAsGetter('Weeks', 6048e5);
+    moment.duration.fn.asMonths = function () {
+        return (+this - this.years() * 31536e6) / 2592e6 + this.years() * 12;
+    };
+
+
+    /************************************
+        Default Lang
+    ************************************/
+
+
+    // Set default language, other languages will inherit from English.
+    moment.lang('en', {
+        ordinal : function (number) {
+            var b = number % 10,
+                output = (toInt(number % 100 / 10) === 1) ? 'th' :
+                (b === 1) ? 'st' :
+                (b === 2) ? 'nd' :
+                (b === 3) ? 'rd' : 'th';
+            return number + output;
+        }
+    });
+
+    /* EMBED_LANGUAGES */
+
+    /************************************
+        Exposing Moment
+    ************************************/
+
+    function makeGlobal(deprecate) {
+        var warned = false, local_moment = moment;
+        /*global ender:false */
+        if (typeof ender !== 'undefined') {
+            return;
+        }
+        // here, `this` means `window` in the browser, or `global` on the server
+        // add `moment` as a global object via a string identifier,
+        // for Closure Compiler "advanced" mode
+        if (deprecate) {
+            global.moment = function () {
+                if (!warned && console && console.warn) {
+                    warned = true;
+                    console.warn(
+                            "Accessing Moment through the global scope is " +
+                            "deprecated, and will be removed in an upcoming " +
+                            "release.");
+                }
+                return local_moment.apply(null, arguments);
+            };
+            extend(global.moment, local_moment);
+        } else {
+            global['moment'] = moment;
+        }
+    }
+
+    // CommonJS module is defined
+    if (hasModule) {
+        module.exports = moment;
+        makeGlobal(true);
+    } else if (typeof define === "function" && define.amd) {
+        define("moment", function (require, exports, module) {
+            if (module.config && module.config() && module.config().noGlobal !== true) {
+                // If user provided noGlobal, he is aware of global
+                makeGlobal(module.config().noGlobal === undefined);
+            }
+
+            return moment;
+        });
+    } else {
+        makeGlobal();
+    }
+}).call(this);
diff --git a/resources/oojs-ui/i18n/ace.json b/resources/oojs-ui/i18n/ace.json
new file mode 100644 (file)
index 0000000..554ae57
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Si Gam Acèh"
+        ]
+    },
+    "ooui-dialog-action-close": "Tôp",
+    "ooui-outline-control-move-down": "Pinah item u yup",
+    "ooui-outline-control-move-up": "Pinah item u ateuëh",
+    "ooui-toolbar-more": "Lom"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/af.json b/resources/oojs-ui/i18n/af.json
new file mode 100644 (file)
index 0000000..a622f89
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "@metadata": {
+        "authors": [
+            "Naudefj"
+        ]
+    },
+    "ooui-dialog-action-close": "Sluit",
+    "ooui-outline-control-move-down": "Skuif item af",
+    "ooui-outline-control-move-up": "Skuif item op"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/am.json b/resources/oojs-ui/i18n/am.json
new file mode 100644 (file)
index 0000000..61e4ff6
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "@metadata": {
+        "authors": [
+            "Elfalem"
+        ]
+    },
+    "ooui-dialog-action-close": "ለመዝጋት"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ar.json b/resources/oojs-ui/i18n/ar.json
new file mode 100644 (file)
index 0000000..65e1364
--- /dev/null
@@ -0,0 +1,18 @@
+{
+    "@metadata": {
+        "authors": [
+            "Ciphers",
+            "Claw eg",
+            "Elfalem",
+            "Jdforrester",
+            "Mido",
+            "OsamaK",
+            "زكريا",
+            "مشعل الحربي"
+        ]
+    },
+    "ooui-dialog-action-close": "أغلق",
+    "ooui-outline-control-move-down": "انقل العنصر للأسفل",
+    "ooui-outline-control-move-up": "انقل العنصر للأعلى",
+    "ooui-toolbar-more": "مزيد"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/arc.json b/resources/oojs-ui/i18n/arc.json
new file mode 100644 (file)
index 0000000..0f9e75d
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "@metadata": {
+        "authors": [
+            "Basharh"
+        ]
+    },
+    "ooui-dialog-action-close": "ܣܟܘܪ"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ast.json b/resources/oojs-ui/i18n/ast.json
new file mode 100644 (file)
index 0000000..959ea23
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "Basharh",
+            "Bishnu Saikia",
+            "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-toolbar-more": "Más"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/az.json b/resources/oojs-ui/i18n/az.json
new file mode 100644 (file)
index 0000000..8bfcf88
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Cekli829",
+            "Interfase",
+            "Jduranboger"
+        ]
+    },
+    "ooui-dialog-action-close": "Bağla",
+    "ooui-outline-control-move-down": "Bəndi aşağı apar",
+    "ooui-outline-control-move-up": "Bəndi yuxarı apar"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ba.json b/resources/oojs-ui/i18n/ba.json
new file mode 100644 (file)
index 0000000..4af0114
--- /dev/null
@@ -0,0 +1,15 @@
+{
+    "@metadata": {
+        "authors": [
+            "AiseluRB",
+            "Amire80",
+            "Assele",
+            "Haqmar",
+            "Sagan",
+            "Рустам Нурыев"
+        ]
+    },
+    "ooui-dialog-action-close": "Ябырға",
+    "ooui-outline-control-move-down": "Аҫҡа күсерергә",
+    "ooui-outline-control-move-up": "Өҫкә күсерергә"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/bcl.json b/resources/oojs-ui/i18n/bcl.json
new file mode 100644 (file)
index 0000000..aff451e
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Geopoet",
+            "Sky Harbor"
+        ]
+    },
+    "ooui-dialog-action-close": "Seraduhon",
+    "ooui-outline-control-move-down": "Balyuhon an aytem paibaba",
+    "ooui-outline-control-move-up": "Balyuhon an aytem paitaas",
+    "ooui-toolbar-more": "Kadugangan"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/be-tarask.json b/resources/oojs-ui/i18n/be-tarask.json
new file mode 100644 (file)
index 0000000..5922f61
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "EugeneZelenko",
+            "Wizardist",
+            "Чаховіч Уладзіслаў",
+            "Zedlik"
+        ]
+    },
+    "ooui-dialog-action-close": "Закрыць",
+    "ooui-outline-control-move-down": "Перасунуць ніжэй",
+    "ooui-outline-control-move-up": "Перасунуць вышэй",
+    "ooui-toolbar-more": "Болей"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/be.json b/resources/oojs-ui/i18n/be.json
new file mode 100644 (file)
index 0000000..3058ab8
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "@metadata": {
+        "authors": [
+            "Чаховіч Уладзіслаў"
+        ]
+    },
+    "ooui-dialog-action-close": "Закрыць"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/bg.json b/resources/oojs-ui/i18n/bg.json
new file mode 100644 (file)
index 0000000..67e664b
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "DCLXVI",
+            "Hristofor.mirchev",
+            "පසිඳු කාවින්ද"
+        ]
+    },
+    "ooui-dialog-action-close": "Затваряне",
+    "ooui-toolbar-more": "Още"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/bn.json b/resources/oojs-ui/i18n/bn.json
new file mode 100644 (file)
index 0000000..c321ab1
--- /dev/null
@@ -0,0 +1,16 @@
+{
+    "@metadata": {
+        "authors": [
+            "Aftab1995",
+            "Bellayet",
+            "Jayantanth",
+            "Nasir8891",
+            "Runab",
+            "Sayak Sarkar"
+        ]
+    },
+    "ooui-dialog-action-close": "বন্ধ",
+    "ooui-outline-control-move-down": "আইটেম নিচে স্থানান্তর",
+    "ooui-outline-control-move-up": "আইটেম উপরে স্থানান্তর",
+    "ooui-toolbar-more": "আরও"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/br.json b/resources/oojs-ui/i18n/br.json
new file mode 100644 (file)
index 0000000..38eb9e8
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Fohanno",
+            "Fulup",
+            "Y-M D"
+        ]
+    },
+    "ooui-dialog-action-close": "Serriñ",
+    "ooui-outline-control-move-down": "Lakaat an elfenn da ziskenn",
+    "ooui-outline-control-move-up": "Lakaat an elfenn da bignat"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/bs.json b/resources/oojs-ui/i18n/bs.json
new file mode 100644 (file)
index 0000000..7449f07
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "DzWiki"
+        ]
+    },
+    "ooui-dialog-action-close": "Zatvori",
+    "ooui-outline-control-move-down": "Premjesti stavku dole",
+    "ooui-outline-control-move-up": "Premjesti stavku gore",
+    "ooui-toolbar-more": "Više"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ca.json b/resources/oojs-ui/i18n/ca.json
new file mode 100644 (file)
index 0000000..61bb1f6
--- /dev/null
@@ -0,0 +1,17 @@
+{
+    "@metadata": {
+        "authors": [
+            "Alvaro Vidal-Abarca",
+            "Amire80",
+            "Arnaugir",
+            "Pginer",
+            "QuimGil",
+            "SMP",
+            "Vriullop"
+        ]
+    },
+    "ooui-dialog-action-close": "Tanca",
+    "ooui-outline-control-move-down": "Baixa element",
+    "ooui-outline-control-move-up": "Puja element",
+    "ooui-toolbar-more": "Més"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ce.json b/resources/oojs-ui/i18n/ce.json
new file mode 100644 (file)
index 0000000..1e145ea
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Amire80",
+            "Умар"
+        ]
+    },
+    "ooui-dialog-action-close": "ДӀачӀагӀа",
+    "ooui-outline-control-move-down": "Лаха яккха элемент",
+    "ooui-outline-control-move-up": "Лаккха яккха элемент",
+    "ooui-toolbar-more": "Кхин тӀе"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ckb.json b/resources/oojs-ui/i18n/ckb.json
new file mode 100644 (file)
index 0000000..839f4a8
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "@metadata": {
+        "authors": [
+            "Calak",
+            "Muhammed taha"
+        ]
+    },
+    "ooui-dialog-action-close": "دایخە"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/co.json b/resources/oojs-ui/i18n/co.json
new file mode 100644 (file)
index 0000000..e5edb21
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "@metadata": {
+        "authors": [
+            "Paulu"
+        ]
+    },
+    "ooui-dialog-action-close": "Chjude",
+    "ooui-outline-control-move-down": "Fà falà l'ogettu",
+    "ooui-outline-control-move-up": "Fà cullà l'ogettu"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/cs.json b/resources/oojs-ui/i18n/cs.json
new file mode 100644 (file)
index 0000000..9661ec6
--- /dev/null
@@ -0,0 +1,20 @@
+{
+    "@metadata": {
+        "authors": [
+            "Chmee2",
+            "Jkjk",
+            "Juandev",
+            "Koo6",
+            "Littledogboy",
+            "Michaelbrabec",
+            "Mormegil",
+            "Polda18",
+            "Tchoř",
+            "ශ්වෙත"
+        ]
+    },
+    "ooui-dialog-action-close": "Zavřít",
+    "ooui-outline-control-move-down": "Přesunout položku dolů",
+    "ooui-outline-control-move-up": "Přesunout položku nahoru",
+    "ooui-toolbar-more": "Další"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/cu.json b/resources/oojs-ui/i18n/cu.json
new file mode 100644 (file)
index 0000000..fa9b1cf
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "@metadata": {
+        "authors": [
+            "ОйЛ"
+        ]
+    },
+    "ooui-dialog-action-close": "ꙁакрꙑи"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/cy.json b/resources/oojs-ui/i18n/cy.json
new file mode 100644 (file)
index 0000000..d37912d
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "Lloffiwr",
+            "Robin Owain",
+            "ОйЛ"
+        ]
+    },
+    "ooui-dialog-action-close": "Caeer",
+    "ooui-outline-control-move-down": "Symud yr eitem lawr",
+    "ooui-outline-control-move-up": "Symud yr eitem lan",
+    "ooui-toolbar-more": "Rhagor"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/da.json b/resources/oojs-ui/i18n/da.json
new file mode 100644 (file)
index 0000000..bf47bcb
--- /dev/null
@@ -0,0 +1,17 @@
+{
+    "@metadata": {
+        "authors": [
+            "Cgtdk",
+            "Christian List",
+            "EileenSanda",
+            "Laketown",
+            "Palnatoke",
+            "Simeondahl",
+            "Tehnix"
+        ]
+    },
+    "ooui-dialog-action-close": "Luk",
+    "ooui-outline-control-move-down": "Flyt ned",
+    "ooui-outline-control-move-up": "Flyt op",
+    "ooui-toolbar-more": "Mere"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/de.json b/resources/oojs-ui/i18n/de.json
new file mode 100644 (file)
index 0000000..3a66648
--- /dev/null
@@ -0,0 +1,20 @@
+{
+    "@metadata": {
+        "authors": [
+            "APPER",
+            "G.Hagedorn",
+            "Inkowik",
+            "Jcornelius",
+            "Jdforrester",
+            "Kghbln",
+            "Metalhead64",
+            "Murma174",
+            "Se4598",
+            "Tomabrafix"
+        ]
+    },
+    "ooui-dialog-action-close": "Schließen",
+    "ooui-outline-control-move-down": "Element nach unten verschieben",
+    "ooui-outline-control-move-up": "Element nach oben verschieben",
+    "ooui-toolbar-more": "Mehr"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/diq.json b/resources/oojs-ui/i18n/diq.json
new file mode 100644 (file)
index 0000000..bb0ac35
--- /dev/null
@@ -0,0 +1,16 @@
+{
+    "@metadata": {
+        "authors": [
+            "Erdemaslancan",
+            "Gorizon",
+            "Kghbln",
+            "Marmase",
+            "Mirzali",
+            "Se4598"
+        ]
+    },
+    "ooui-dialog-action-close": "Racnê",
+    "ooui-outline-control-move-down": "Bendi bere cêr",
+    "ooui-outline-control-move-up": "Bendi bere cor",
+    "ooui-toolbar-more": "Zewbi"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/dsb.json b/resources/oojs-ui/i18n/dsb.json
new file mode 100644 (file)
index 0000000..0f47587
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Michawiki"
+        ]
+    },
+    "ooui-dialog-action-close": "Zacyniś",
+    "ooui-outline-control-move-down": "Element dołoj pśesunuś",
+    "ooui-outline-control-move-up": "Element górjej pśesunuś",
+    "ooui-toolbar-more": "Wěcej"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/el.json b/resources/oojs-ui/i18n/el.json
new file mode 100644 (file)
index 0000000..66051f1
--- /dev/null
@@ -0,0 +1,18 @@
+{
+    "@metadata": {
+        "authors": [
+            "Astralnet",
+            "Dipa1965",
+            "Evropi",
+            "FocalPoint",
+            "Geraki",
+            "Glavkos",
+            "Nikosguard",
+            "Tifa93"
+        ]
+    },
+    "ooui-dialog-action-close": "Κλείσιμο",
+    "ooui-outline-control-move-down": "Μετακίνηση προς τα κάτω",
+    "ooui-outline-control-move-up": "Μετακίνηση προς τα πάνω",
+    "ooui-toolbar-more": "Περισσότερα"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/eml.json b/resources/oojs-ui/i18n/eml.json
new file mode 100644 (file)
index 0000000..5dd09f5
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Gloria sah",
+            "Lévi"
+        ]
+    },
+    "ooui-dialog-action-close": "Sèra",
+    "ooui-outline-control-move-down": "Spôsta in bâs",
+    "ooui-outline-control-move-up": "Spôsta in êlt",
+    "ooui-toolbar-more": "Êter"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/en.json b/resources/oojs-ui/i18n/en.json
new file mode 100644 (file)
index 0000000..d402de8
--- /dev/null
@@ -0,0 +1,23 @@
+{
+    "@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-dialog-action-close": "Close",
+    "ooui-outline-control-move-down": "Move item down",
+    "ooui-outline-control-move-up": "Move item up",
+    "ooui-toolbar-more": "More"
+}
diff --git a/resources/oojs-ui/i18n/eo.json b/resources/oojs-ui/i18n/eo.json
new file mode 100644 (file)
index 0000000..51f3261
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "Happy5214",
+            "KuboF",
+            "Shirayuki",
+            "Yekrats"
+        ]
+    },
+    "ooui-dialog-action-close": "Fermi",
+    "ooui-outline-control-move-down": "Movi eron suben",
+    "ooui-outline-control-move-up": "Movi eron supren",
+    "ooui-toolbar-more": "Pli"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/es.json b/resources/oojs-ui/i18n/es.json
new file mode 100644 (file)
index 0000000..0d822bc
--- /dev/null
@@ -0,0 +1,23 @@
+{
+    "@metadata": {
+        "authors": [
+            "Armando-Martin",
+            "Aruizdr",
+            "Benfutbol10",
+            "DJ Nietzsche",
+            "Erdemaslancan",
+            "Fitoschido",
+            "Imre",
+            "Invadinado",
+            "Jdforrester",
+            "Jduranboger",
+            "PoLuX124",
+            "Ralgis",
+            "Thehelpfulone"
+        ]
+    },
+    "ooui-dialog-action-close": "Cerrar",
+    "ooui-outline-control-move-down": "Mover abajo",
+    "ooui-outline-control-move-up": "Mover arriba",
+    "ooui-toolbar-more": "Más"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/et.json b/resources/oojs-ui/i18n/et.json
new file mode 100644 (file)
index 0000000..4af8dbe
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Avjoska",
+            "Pikne"
+        ]
+    },
+    "ooui-dialog-action-close": "Sule",
+    "ooui-outline-control-move-down": "Liiguta üksust allapoole",
+    "ooui-outline-control-move-up": "Liiguta üksust ülespoole",
+    "ooui-toolbar-more": "Veel"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/eu.json b/resources/oojs-ui/i18n/eu.json
new file mode 100644 (file)
index 0000000..5d3f08b
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "An13sa",
+            "Unai Fdz. de Betoño",
+            "Xabier Armendaritz"
+        ]
+    },
+    "ooui-dialog-action-close": "Itxi",
+    "ooui-outline-control-move-down": "Mugitu itema beherantz",
+    "ooui-outline-control-move-up": "Mugitu itema gorantz",
+    "ooui-toolbar-more": "Gehiago"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/fa.json b/resources/oojs-ui/i18n/fa.json
new file mode 100644 (file)
index 0000000..173acd7
--- /dev/null
@@ -0,0 +1,19 @@
+{
+    "@metadata": {
+        "authors": [
+            "Dalba",
+            "Ebraminio",
+            "Jdforrester",
+            "Ladsgroup",
+            "Mjbmr",
+            "Nojan Madinehi",
+            "Reza1615",
+            "Taha",
+            "درفش کاویانی"
+        ]
+    },
+    "ooui-dialog-action-close": "بستن",
+    "ooui-outline-control-move-down": "انتقال مورد به پایین",
+    "ooui-outline-control-move-up": "انتقال مورد به بالا",
+    "ooui-toolbar-more": "بیشتر"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/fi.json b/resources/oojs-ui/i18n/fi.json
new file mode 100644 (file)
index 0000000..dcd367f
--- /dev/null
@@ -0,0 +1,23 @@
+{
+    "@metadata": {
+        "authors": [
+            "Beluga",
+            "Crt",
+            "Harriv",
+            "Linnea",
+            "Nedergard",
+            "Nike",
+            "Olli",
+            "Pxos",
+            "Samoasambia",
+            "Silvonen",
+            "Skalman",
+            "Stryn",
+            "VezonThunder"
+        ]
+    },
+    "ooui-dialog-action-close": "Sulje",
+    "ooui-outline-control-move-down": "Siirrä kohdetta alaspäin",
+    "ooui-outline-control-move-up": "Siirrä kohdetta ylöspäin",
+    "ooui-toolbar-more": "Lisää"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/fo.json b/resources/oojs-ui/i18n/fo.json
new file mode 100644 (file)
index 0000000..00a48ff
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "EileenSanda"
+        ]
+    },
+    "ooui-dialog-action-close": "Lat aftur",
+    "ooui-outline-control-move-down": "Flyt lutin niður",
+    "ooui-outline-control-move-up": "Flyt lutin upp",
+    "ooui-toolbar-more": "Meira"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/fr.json b/resources/oojs-ui/i18n/fr.json
new file mode 100644 (file)
index 0000000..eb24b5a
--- /dev/null
@@ -0,0 +1,35 @@
+{
+    "@metadata": {
+        "authors": [
+            "Automatik",
+            "Benoit Rochon",
+            "Boniface",
+            "Brunoperel",
+            "Crochet.david",
+            "DavidL",
+            "Dereckson",
+            "Gomoko",
+            "Guillom",
+            "Hello71",
+            "Jean-Frédéric",
+            "Linedwell",
+            "Ltrlg",
+            "Metroitendo",
+            "NemesisIII",
+            "Nicolas NALLET",
+            "Npettiaux",
+            "Rastus Vernon",
+            "Seb35",
+            "Sherbrooke",
+            "Tpt",
+            "Trizek",
+            "Urhixidur",
+            "Verdy p",
+            "Wyz"
+        ]
+    },
+    "ooui-dialog-action-close": "Fermer",
+    "ooui-outline-control-move-down": "Faire descendre l’élément",
+    "ooui-outline-control-move-up": "Faire monter l’élément",
+    "ooui-toolbar-more": "Plus"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/frr.json b/resources/oojs-ui/i18n/frr.json
new file mode 100644 (file)
index 0000000..ee95b8a
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "ChrisPtDe",
+            "Murma174"
+        ]
+    },
+    "ooui-dialog-action-close": "Slütj",
+    "ooui-outline-control-move-down": "Element efter onern sküüw",
+    "ooui-outline-control-move-up": "Element efter boowen sküüw",
+    "ooui-toolbar-more": "Muar"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/fur.json b/resources/oojs-ui/i18n/fur.json
new file mode 100644 (file)
index 0000000..18ea383
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Klenje",
+            "Tocaibon"
+        ]
+    },
+    "ooui-dialog-action-close": "Siere",
+    "ooui-outline-control-move-down": "sposte sot",
+    "ooui-outline-control-move-up": "sposte in su",
+    "ooui-toolbar-more": "Altri"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/gl.json b/resources/oojs-ui/i18n/gl.json
new file mode 100644 (file)
index 0000000..5d0928f
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "Alison",
+            "Kscanne",
+            "Toliño"
+        ]
+    },
+    "ooui-dialog-action-close": "Pechar",
+    "ooui-outline-control-move-down": "Mover o elemento abaixo",
+    "ooui-outline-control-move-up": "Mover o elemento arriba",
+    "ooui-toolbar-more": "Máis"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/gu.json b/resources/oojs-ui/i18n/gu.json
new file mode 100644 (file)
index 0000000..65ec22b
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "Ashok modhvadia",
+            "KartikMistry",
+            "The Discoverer"
+        ]
+    },
+    "ooui-dialog-action-close": "બંધ કરો",
+    "ooui-outline-control-move-down": "વસ્તુ નીચે ખસેડો",
+    "ooui-outline-control-move-up": "વસ્તુ ઉપર ખસેડો",
+    "ooui-toolbar-more": "વધુ"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/he.json b/resources/oojs-ui/i18n/he.json
new file mode 100644 (file)
index 0000000..31b693c
--- /dev/null
@@ -0,0 +1,22 @@
+{
+    "@metadata": {
+        "authors": [
+            "Amire80",
+            "ExampleTomer",
+            "Guycn2",
+            "Matanya",
+            "Mooeypoo",
+            "Orsa",
+            "Shimmin Beg",
+            "אור שפירא",
+            "חיים",
+            "ערן",
+            "פוילישער",
+            "קיפודנחש"
+        ]
+    },
+    "ooui-dialog-action-close": "סגירה",
+    "ooui-outline-control-move-down": "להזיז את הפריט מטה",
+    "ooui-outline-control-move-up": "להזיז את הפריט מעלה",
+    "ooui-toolbar-more": "עוד"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/hi.json b/resources/oojs-ui/i18n/hi.json
new file mode 100644 (file)
index 0000000..8b79d34
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "Ansumang",
+            "Devayon",
+            "Rajesh",
+            "Siddhartha Ghai"
+        ]
+    },
+    "ooui-dialog-action-close": "बंद करें",
+    "ooui-outline-control-move-down": "प्रविष्टि नीचे ले जाएँ",
+    "ooui-outline-control-move-up": "प्रविष्टि ऊपर ले जाएँ",
+    "ooui-toolbar-more": "अधिक"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/hr.json b/resources/oojs-ui/i18n/hr.json
new file mode 100644 (file)
index 0000000..1c3f925
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "MaGa",
+            "Roberta F.",
+            "SpeedyGonsales"
+        ]
+    },
+    "ooui-dialog-action-close": "zatvori",
+    "ooui-outline-control-move-down": "Premjesti stavku dolje",
+    "ooui-outline-control-move-up": "Premjesti stavku gore",
+    "ooui-toolbar-more": "Više mogućnosti"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/hsb.json b/resources/oojs-ui/i18n/hsb.json
new file mode 100644 (file)
index 0000000..861c6e5
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "@metadata": {
+        "authors": [
+            "J budissin",
+            "Michawiki"
+        ]
+    },
+    "ooui-dialog-action-close": "Začinić"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/hu.json b/resources/oojs-ui/i18n/hu.json
new file mode 100644 (file)
index 0000000..9f7b435
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "Dj",
+            "Einstein2",
+            "Misibacsi",
+            "ViDam"
+        ]
+    },
+    "ooui-dialog-action-close": "Bezár",
+    "ooui-outline-control-move-down": "Elem mozgatása lefelé",
+    "ooui-outline-control-move-up": "Elem mozgatása felfelé",
+    "ooui-toolbar-more": "Tovább..."
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/hy.json b/resources/oojs-ui/i18n/hy.json
new file mode 100644 (file)
index 0000000..f6cb90b
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Vacio",
+            "Xelgen"
+        ]
+    },
+    "ooui-dialog-action-close": "Փակել",
+    "ooui-outline-control-move-down": "Իջեցնել կետը",
+    "ooui-outline-control-move-up": "Բարձրացնել կետը",
+    "ooui-toolbar-more": "Ավելին"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ia.json b/resources/oojs-ui/i18n/ia.json
new file mode 100644 (file)
index 0000000..e335553
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "@metadata": {
+        "authors": [
+            "McDutchie"
+        ]
+    },
+    "ooui-dialog-action-close": "Clauder"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/id.json b/resources/oojs-ui/i18n/id.json
new file mode 100644 (file)
index 0000000..6d3ba4d
--- /dev/null
@@ -0,0 +1,18 @@
+{
+    "@metadata": {
+        "authors": [
+            "Farras",
+            "Ilham151096",
+            "Iwan Novirion",
+            "Iyan",
+            "Kenrick95",
+            "McDutchie",
+            "Rv77ax",
+            "William Surya Permana"
+        ]
+    },
+    "ooui-dialog-action-close": "Tutup",
+    "ooui-outline-control-move-down": "Pindahkan butir ke bawah",
+    "ooui-outline-control-move-up": "Pindahkan butir ke atas",
+    "ooui-toolbar-more": "Lainnya"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ie.json b/resources/oojs-ui/i18n/ie.json
new file mode 100644 (file)
index 0000000..84d002d
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Makuba"
+        ]
+    },
+    "ooui-dialog-action-close": "Terminar",
+    "ooui-outline-control-move-down": "Mover element a infra",
+    "ooui-outline-control-move-up": "Mover element a supra",
+    "ooui-toolbar-more": "Plu"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ilo.json b/resources/oojs-ui/i18n/ilo.json
new file mode 100644 (file)
index 0000000..15f42e5
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Lam-ang"
+        ]
+    },
+    "ooui-dialog-action-close": "Irekep",
+    "ooui-outline-control-move-down": "Ipababa ti banag",
+    "ooui-outline-control-move-up": "Ipangato ti banag",
+    "ooui-toolbar-more": "Adu pay"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/is.json b/resources/oojs-ui/i18n/is.json
new file mode 100644 (file)
index 0000000..efe0e67
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Maxí",
+            "Snævar"
+        ]
+    },
+    "ooui-dialog-action-close": "Loka",
+    "ooui-outline-control-move-down": "Færa atriða niður",
+    "ooui-outline-control-move-up": "Færa atriða upp",
+    "ooui-toolbar-more": "Fleira"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/it.json b/resources/oojs-ui/i18n/it.json
new file mode 100644 (file)
index 0000000..6158cff
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "@metadata": {
+        "authors": [
+            "Beta16",
+            "Darth Kule",
+            "Doc.mari",
+            "Eleonora negri",
+            "Elitre",
+            "F. Cosoleto",
+            "FRacco",
+            "Gianfranco",
+            "Minerva Titani",
+            "Raoli",
+            "Una giornata uggiosa '94"
+        ]
+    },
+    "ooui-dialog-action-close": "Chiudi",
+    "ooui-outline-control-move-down": "Sposta in basso",
+    "ooui-outline-control-move-up": "Sposta in alto",
+    "ooui-toolbar-more": "Altro"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ja.json b/resources/oojs-ui/i18n/ja.json
new file mode 100644 (file)
index 0000000..789fbeb
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "Fryed-peach",
+            "Miya",
+            "Penn Station",
+            "Shirayuki"
+        ]
+    },
+    "ooui-dialog-action-close": "閉じる",
+    "ooui-outline-control-move-down": "項目を下に移動させる",
+    "ooui-outline-control-move-up": "項目を上に移動させる",
+    "ooui-toolbar-more": "その他"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/jv.json b/resources/oojs-ui/i18n/jv.json
new file mode 100644 (file)
index 0000000..a362079
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Gleki",
+            "NoiX180",
+            "Pras"
+        ]
+    },
+    "ooui-dialog-action-close": "Tutup",
+    "ooui-outline-control-move-down": "Pindhahaken butir mangandhap"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ka.json b/resources/oojs-ui/i18n/ka.json
new file mode 100644 (file)
index 0000000..78180af
--- /dev/null
@@ -0,0 +1,16 @@
+{
+    "@metadata": {
+        "authors": [
+            "BRUTE",
+            "David1010",
+            "Gleki",
+            "ITshnik",
+            "MIKHEIL",
+            "NoiX180",
+            "Pras"
+        ]
+    },
+    "ooui-dialog-action-close": "დახურვა",
+    "ooui-outline-control-move-down": "ელემენტის ქვემოთ გადატანა",
+    "ooui-outline-control-move-up": "ელემენტის ზემოთ გადატანა"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/kk-cyrl.json b/resources/oojs-ui/i18n/kk-cyrl.json
new file mode 100644 (file)
index 0000000..4c27b07
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Arystanbek"
+        ]
+    },
+    "ooui-dialog-action-close": "Жабу",
+    "ooui-outline-control-move-down": "Элементті төмен жылжыту",
+    "ooui-outline-control-move-up": "Элементті жоғары жылжыту",
+    "ooui-toolbar-more": "толығырақ"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/km.json b/resources/oojs-ui/i18n/km.json
new file mode 100644 (file)
index 0000000..2013ee3
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Sovichet"
+        ]
+    },
+    "ooui-dialog-action-close": "បិទ",
+    "ooui-outline-control-move-down": "រុញ​ទៅ​ក្រោម",
+    "ooui-outline-control-move-up": "រុញ​ទៅ​លើ",
+    "ooui-toolbar-more": "បន្ថែម"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ko.json b/resources/oojs-ui/i18n/ko.json
new file mode 100644 (file)
index 0000000..f1f61df
--- /dev/null
@@ -0,0 +1,15 @@
+{
+    "@metadata": {
+        "authors": [
+            "Freebiekr",
+            "Hym411",
+            "Kwj2772",
+            "LFM",
+            "아라"
+        ]
+    },
+    "ooui-dialog-action-close": "닫기",
+    "ooui-outline-control-move-down": "항목을 아래로 옮기기",
+    "ooui-outline-control-move-up": "항목을 위로 옮기기",
+    "ooui-toolbar-more": "더 보기"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/krc.json b/resources/oojs-ui/i18n/krc.json
new file mode 100644 (file)
index 0000000..f629139
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "@metadata": {
+        "authors": [
+            "Iltever"
+        ]
+    },
+    "ooui-dialog-action-close": "Джаб",
+    "ooui-outline-control-move-down": "Элементни тюбюне кёчюр",
+    "ooui-outline-control-move-up": "Элементни башына кёчюр"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/kw.json b/resources/oojs-ui/i18n/kw.json
new file mode 100644 (file)
index 0000000..95a9b91
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "@metadata": {
+        "authors": [
+            "George Animal",
+            "Nrowe",
+            "Purodha"
+        ]
+    },
+    "ooui-dialog-action-close": "Degea"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ky.json b/resources/oojs-ui/i18n/ky.json
new file mode 100644 (file)
index 0000000..2d62bda
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Chorobek",
+            "George Animal",
+            "Nrowe",
+            "Tynchtyk Chorotegin",
+            "Викиней"
+        ]
+    },
+    "ooui-dialog-action-close": "Жабуу"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/lb.json b/resources/oojs-ui/i18n/lb.json
new file mode 100644 (file)
index 0000000..a18894e
--- /dev/null
@@ -0,0 +1,17 @@
+{
+    "@metadata": {
+        "authors": [
+            "Autokrator",
+            "Chorobek",
+            "Robby",
+            "Soued031",
+            "Tynchtyk Chorotegin",
+            "UV",
+            "Викиней"
+        ]
+    },
+    "ooui-dialog-action-close": "Zoumaachen",
+    "ooui-outline-control-move-down": "Element erof réckelen",
+    "ooui-outline-control-move-up": "Element erop réckelen",
+    "ooui-toolbar-more": "Méi"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/lmo.json b/resources/oojs-ui/i18n/lmo.json
new file mode 100644 (file)
index 0000000..e506b7a
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Ninonino"
+        ]
+    },
+    "ooui-dialog-action-close": "Sèra",
+    "ooui-outline-control-move-down": "Spòsta 'n zó",
+    "ooui-outline-control-move-up": "Spòsta 'n sö",
+    "ooui-toolbar-more": "Amò"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/lt.json b/resources/oojs-ui/i18n/lt.json
new file mode 100644 (file)
index 0000000..b3a16e8
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "@metadata": {
+        "authors": [
+            "Audriusa",
+            "Eitvys200"
+        ]
+    },
+    "ooui-dialog-action-close": "Uždaryti"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/lv.json b/resources/oojs-ui/i18n/lv.json
new file mode 100644 (file)
index 0000000..c633339
--- /dev/null
@@ -0,0 +1,15 @@
+{
+    "@metadata": {
+        "authors": [
+            "Admresdeserv.",
+            "Audriusa",
+            "Eitvys200",
+            "Papuass",
+            "PeterisP"
+        ]
+    },
+    "ooui-dialog-action-close": "Aizvērt",
+    "ooui-outline-control-move-down": "Pārvietot vienumu uz leju",
+    "ooui-outline-control-move-up": "Pārvietot vienumu uz augšu",
+    "ooui-toolbar-more": "Vairāk"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/mg.json b/resources/oojs-ui/i18n/mg.json
new file mode 100644 (file)
index 0000000..dcb5fd5
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "@metadata": {
+        "authors": [
+            "Jagwar"
+        ]
+    },
+    "ooui-dialog-action-close": "Hidiana"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/min.json b/resources/oojs-ui/i18n/min.json
new file mode 100644 (file)
index 0000000..55174c0
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "@metadata": {
+        "authors": [
+            "Iwan Novirion",
+            "Jagwar"
+        ]
+    },
+    "ooui-dialog-action-close": "Tutuik"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/mk.json b/resources/oojs-ui/i18n/mk.json
new file mode 100644 (file)
index 0000000..b363a45
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "Bjankuloski06",
+            "Brest",
+            "Iwan Novirion"
+        ]
+    },
+    "ooui-dialog-action-close": "Затвори",
+    "ooui-outline-control-move-down": "Помести надолу",
+    "ooui-outline-control-move-up": "Помести нагоре",
+    "ooui-toolbar-more": "Повеќе"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ml.json b/resources/oojs-ui/i18n/ml.json
new file mode 100644 (file)
index 0000000..355e337
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "Kavya Manohar",
+            "Praveenp",
+            "Santhosh.thottingal",
+            "Vssun"
+        ]
+    },
+    "ooui-dialog-action-close": "അടയ്ക്കുക",
+    "ooui-outline-control-move-down": "ഇനം താഴേയ്ക്ക് മാറ്റുക",
+    "ooui-outline-control-move-up": "ഇനം മുകളിലേയ്ക്ക് മാറ്റുക",
+    "ooui-toolbar-more": "കൂടുതൽ"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/mr.json b/resources/oojs-ui/i18n/mr.json
new file mode 100644 (file)
index 0000000..d4db84f
--- /dev/null
@@ -0,0 +1,16 @@
+{
+    "@metadata": {
+        "authors": [
+            "Kaajawa",
+            "Mahitgar",
+            "Praju23",
+            "V.narsikar",
+            "Ydyashad",
+            "संतोष दहिवळ"
+        ]
+    },
+    "ooui-dialog-action-close": "बंद करा",
+    "ooui-outline-control-move-down": "घटक (आयटम) खाली सरकवा",
+    "ooui-outline-control-move-up": "घटक (आयटम) वर सरकवा",
+    "ooui-toolbar-more": "अधिक"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ms.json b/resources/oojs-ui/i18n/ms.json
new file mode 100644 (file)
index 0000000..21aef50
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Anakmalaysia",
+            "Aurora"
+        ]
+    },
+    "ooui-dialog-action-close": "Tutup",
+    "ooui-outline-control-move-down": "Alihkan perkara ke bawah",
+    "ooui-outline-control-move-up": "Alihkan perkara ke atas",
+    "ooui-toolbar-more": "Lagi"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/nap.json b/resources/oojs-ui/i18n/nap.json
new file mode 100644 (file)
index 0000000..6b0b3ec
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Chelin",
+            "Chrisportelli",
+            "PiRSquared17"
+        ]
+    },
+    "ooui-dialog-action-close": "Chiure",
+    "ooui-toolbar-more": "Atro"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/nb.json b/resources/oojs-ui/i18n/nb.json
new file mode 100644 (file)
index 0000000..7cdecaa
--- /dev/null
@@ -0,0 +1,15 @@
+{
+    "@metadata": {
+        "authors": [
+            "Danmichaelo",
+            "Event",
+            "Jeblad",
+            "Laaknor",
+            "Njardarlogar"
+        ]
+    },
+    "ooui-dialog-action-close": "Lukk",
+    "ooui-outline-control-move-down": "Flytt ned",
+    "ooui-outline-control-move-up": "Flytt opp",
+    "ooui-toolbar-more": "Mer"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/nds-nl.json b/resources/oojs-ui/i18n/nds-nl.json
new file mode 100644 (file)
index 0000000..81f8a43
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "@metadata": {
+        "authors": [
+            "Servien"
+        ]
+    },
+    "ooui-dialog-action-close": "Sluten",
+    "ooui-outline-control-move-down": "Onderwarp ummeneer zetten",
+    "ooui-outline-control-move-up": "Onderwarp umhoge zetten"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/nds.json b/resources/oojs-ui/i18n/nds.json
new file mode 100644 (file)
index 0000000..d0806d0
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Zylbath"
+        ]
+    },
+    "ooui-dialog-action-close": "Dichtmaken",
+    "ooui-outline-control-move-down": "Element na ünnen schuven",
+    "ooui-outline-control-move-up": "Element na baven schuven",
+    "ooui-toolbar-more": "Mehr"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ne.json b/resources/oojs-ui/i18n/ne.json
new file mode 100644 (file)
index 0000000..ae948c6
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "@metadata": {
+        "authors": [
+            "RajeshPandey",
+            "सरोज कुमार ढकाल"
+        ]
+    }
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/nl.json b/resources/oojs-ui/i18n/nl.json
new file mode 100644 (file)
index 0000000..75db0a7
--- /dev/null
@@ -0,0 +1,25 @@
+{
+    "@metadata": {
+        "authors": [
+            "Bluyten",
+            "Breghtje",
+            "Catrope",
+            "Flightmare",
+            "Hansmuller",
+            "Jdforrester",
+            "Keegan",
+            "Konovalov",
+            "RajeshPandey",
+            "Romaine",
+            "SPQRobin",
+            "Saruman",
+            "Siebrand",
+            "Southparkfan",
+            "सरोज कुमार ढकाल"
+        ]
+    },
+    "ooui-dialog-action-close": "Sluiten",
+    "ooui-outline-control-move-down": "Item omlaag verplaatsen",
+    "ooui-outline-control-move-up": "Item omhoog verplaatsen",
+    "ooui-toolbar-more": "Meer"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/nn.json b/resources/oojs-ui/i18n/nn.json
new file mode 100644 (file)
index 0000000..dd86f5e
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Jeblad",
+            "Njardarlogar"
+        ]
+    },
+    "ooui-dialog-action-close": "Lat att",
+    "ooui-outline-control-move-down": "Flytt element ned",
+    "ooui-outline-control-move-up": "Flytt element opp",
+    "ooui-toolbar-more": "Fleire"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/om.json b/resources/oojs-ui/i18n/om.json
new file mode 100644 (file)
index 0000000..dca7b7d
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Cedric31",
+            "Tumsaa"
+        ]
+    },
+    "ooui-dialog-action-close": "Cufi",
+    "ooui-outline-control-move-down": "Gad buusi",
+    "ooui-outline-control-move-up": "Ol baasi",
+    "ooui-toolbar-more": "Dabalata"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/or.json b/resources/oojs-ui/i18n/or.json
new file mode 100644 (file)
index 0000000..35721a1
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "@metadata": {
+        "authors": [
+            "Odisha1",
+            "Psubhashish",
+            "ଶିତିକଣ୍ଠ ଦାଶ"
+        ]
+    },
+    "ooui-dialog-action-close": "ବନ୍ଦ କରିବେ"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/pa.json b/resources/oojs-ui/i18n/pa.json
new file mode 100644 (file)
index 0000000..6c76d7f
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Amikeco",
+            "Babanwalia",
+            "Bouron",
+            "Nasir8891"
+        ]
+    },
+    "ooui-dialog-action-close": "বন্ধ"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/pl.json b/resources/oojs-ui/i18n/pl.json
new file mode 100644 (file)
index 0000000..ba33322
--- /dev/null
@@ -0,0 +1,22 @@
+{
+    "@metadata": {
+        "authors": [
+            "Babanwalia",
+            "Chrumps",
+            "Matma Rex",
+            "Mikołka",
+            "Nasir8891",
+            "Odie2",
+            "Rzuwig",
+            "Tar Lócesilion",
+            "Ty221",
+            "WTM",
+            "Woytecr",
+            "Wpedzich"
+        ]
+    },
+    "ooui-dialog-action-close": "Zamknij",
+    "ooui-outline-control-move-down": "Przenieś niżej",
+    "ooui-outline-control-move-up": "Przenieś wyżej",
+    "ooui-toolbar-more": "Więcej"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/pms.json b/resources/oojs-ui/i18n/pms.json
new file mode 100644 (file)
index 0000000..bb8f113
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "Borichèt",
+            "Dragonòt",
+            "පසිඳු කාවින්ද"
+        ]
+    },
+    "ooui-dialog-action-close": "Saré",
+    "ooui-outline-control-move-down": "Fé calé giù l'element",
+    "ooui-outline-control-move-up": "Fé monté l'element",
+    "ooui-toolbar-more": "Ëd pi"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ps.json b/resources/oojs-ui/i18n/ps.json
new file mode 100644 (file)
index 0000000..4f21707
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Ahmed-Najib-Biabani-Ibrahimkhel"
+        ]
+    },
+    "ooui-dialog-action-close": "تړل",
+    "ooui-outline-control-move-down": "توکی ښکته راوړل",
+    "ooui-outline-control-move-up": "توکی پورته راوړل",
+    "ooui-toolbar-more": "نور"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/pt-br.json b/resources/oojs-ui/i18n/pt-br.json
new file mode 100644 (file)
index 0000000..f758660
--- /dev/null
@@ -0,0 +1,19 @@
+{
+    "@metadata": {
+        "authors": [
+            "Cainamarques",
+            "Dianakc",
+            "Fúlvio",
+            "Helder.wiki",
+            "HenriqueCrang",
+            "Jaideraf",
+            "Luckas",
+            "OTAVIO1981",
+            555
+        ]
+    },
+    "ooui-dialog-action-close": "Fechar",
+    "ooui-outline-control-move-down": "Mover item para baixo",
+    "ooui-outline-control-move-up": "Mover item para cima",
+    "ooui-toolbar-more": "Mais"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/pt.json b/resources/oojs-ui/i18n/pt.json
new file mode 100644 (file)
index 0000000..a4dba27
--- /dev/null
@@ -0,0 +1,19 @@
+{
+    "@metadata": {
+        "authors": [
+            "Cainamarques",
+            "Fúlvio",
+            "GoEThe",
+            "Hamilton Abreu",
+            "Helder.wiki",
+            "Jaideraf",
+            "Jdforrester",
+            "Luckas",
+            "Vitorvicentevalente"
+        ]
+    },
+    "ooui-dialog-action-close": "Fechar",
+    "ooui-outline-control-move-down": "Mover item para baixo",
+    "ooui-outline-control-move-up": "Mover item para cima",
+    "ooui-toolbar-more": "Mais"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/qqq.json b/resources/oojs-ui/i18n/qqq.json
new file mode 100644 (file)
index 0000000..78a70d9
--- /dev/null
@@ -0,0 +1,26 @@
+{
+    "@metadata": {
+        "authors": [
+            "Amire80",
+            "Beta16",
+            "Erik Moeller",
+            "Jdforrester",
+            "Lloffiwr",
+            "Mooeypoo",
+            "Mormegil",
+            "Nike",
+            "PoLuX124",
+            "Purodha",
+            "Raymond",
+            "Sagan",
+            "Sayak Sarkar",
+            "Shirayuki",
+            "Siebrand",
+            "Trevor Parscal"
+        ]
+    },
+    "ooui-dialog-action-close": "Label text for button to exit from dialog.\n\n{{Identical|Close}}",
+    "ooui-outline-control-move-down": "Tool tip for a button that moves items in a list down one place",
+    "ooui-outline-control-move-up": "Tool tip for a button that moves items in a list up one place",
+    "ooui-toolbar-more": "Label for the toolbar group that contains a list of all other available tools.\n{{Identical|More}}"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/qu.json b/resources/oojs-ui/i18n/qu.json
new file mode 100644 (file)
index 0000000..9a412f5
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "AlimanRuna"
+        ]
+    },
+    "ooui-dialog-action-close": "Wichq'ay",
+    "ooui-outline-control-move-down": "Qallawata uraykuchiy",
+    "ooui-outline-control-move-up": "Qallawata huqariy",
+    "ooui-toolbar-more": "Aswan"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ro.json b/resources/oojs-ui/i18n/ro.json
new file mode 100644 (file)
index 0000000..861b2fe
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "AlimanRuna",
+            "Firilacroco",
+            "Minisarm",
+            "Stelistcristi"
+        ]
+    },
+    "ooui-dialog-action-close": "Închide",
+    "ooui-outline-control-move-down": "Mută elementul mai jos",
+    "ooui-outline-control-move-up": "Mută elementul mai sus",
+    "ooui-toolbar-more": "Mai mult"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/roa-tara.json b/resources/oojs-ui/i18n/roa-tara.json
new file mode 100644 (file)
index 0000000..c7699d6
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Joetaras"
+        ]
+    },
+    "ooui-dialog-action-close": "Achiude",
+    "ooui-outline-control-move-down": "Spuèste 'a vôsce sotte",
+    "ooui-outline-control-move-up": "Spuèste 'a vôsce sus",
+    "ooui-toolbar-more": "De cchiù"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ru.json b/resources/oojs-ui/i18n/ru.json
new file mode 100644 (file)
index 0000000..be7c6a5
--- /dev/null
@@ -0,0 +1,25 @@
+{
+    "@metadata": {
+        "authors": [
+            "Amire80",
+            "DR",
+            "Eugrus",
+            "Iluvatar",
+            "KPu3uC B Poccuu",
+            "Kalan",
+            "MaxBioHazard",
+            "NBS",
+            "Niklem",
+            "Okras",
+            "Ole Yves",
+            "Putnik",
+            "Sunpriat",
+            "Yury Katkov",
+            "Умар"
+        ]
+    },
+    "ooui-dialog-action-close": "Закрыть",
+    "ooui-outline-control-move-down": "Переместить элемент вниз",
+    "ooui-outline-control-move-up": "Переместить элемент вверх",
+    "ooui-toolbar-more": "Ещё"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/sah.json b/resources/oojs-ui/i18n/sah.json
new file mode 100644 (file)
index 0000000..9b3fcc8
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "@metadata": {
+        "authors": [
+            "Gazeb",
+            "HalanTul"
+        ]
+    },
+    "ooui-dialog-action-close": "Сап"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/scn.json b/resources/oojs-ui/i18n/scn.json
new file mode 100644 (file)
index 0000000..a699911
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "Gazeb",
+            "Gmelfi",
+            "HalanTul"
+        ]
+    },
+    "ooui-dialog-action-close": "Chiùi",
+    "ooui-outline-control-move-down": "Sposta di sutta",
+    "ooui-outline-control-move-up": "Sposta di supra",
+    "ooui-toolbar-more": "Àutri cosi"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/sh.json b/resources/oojs-ui/i18n/sh.json
new file mode 100644 (file)
index 0000000..5e29980
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "@metadata": {
+        "authors": [
+            "OC Ripper"
+        ]
+    },
+    "ooui-dialog-action-close": "Zatvori",
+    "ooui-outline-control-move-down": "Pomakni stavku dolje",
+    "ooui-outline-control-move-up": "Pomakni stavku gore"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/si.json b/resources/oojs-ui/i18n/si.json
new file mode 100644 (file)
index 0000000..cf7a9fd
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Singhalawap",
+            "පසිඳු කාවින්ද",
+            "ශ්වෙත"
+        ]
+    },
+    "ooui-dialog-action-close": "නිමවන්න",
+    "ooui-outline-control-move-down": "අයිතමය පහලටදමන්න",
+    "ooui-outline-control-move-up": "අයිතමය ඉහලටදමන්න"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/sk.json b/resources/oojs-ui/i18n/sk.json
new file mode 100644 (file)
index 0000000..60b6f43
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Mimarik",
+            "Teslaton"
+        ]
+    },
+    "ooui-dialog-action-close": "Zatvoriť",
+    "ooui-outline-control-move-down": "Posunúť položku nadol",
+    "ooui-outline-control-move-up": "Posunúť položku nahor",
+    "ooui-toolbar-more": "Viac"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/sl.json b/resources/oojs-ui/i18n/sl.json
new file mode 100644 (file)
index 0000000..d5bffd9
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "Dbc334",
+            "Eleassar",
+            "Pinky sl",
+            "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-toolbar-more": "Več"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/sq.json b/resources/oojs-ui/i18n/sq.json
new file mode 100644 (file)
index 0000000..424f1be
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Euriditi"
+        ]
+    },
+    "ooui-dialog-action-close": "Mbylle",
+    "ooui-outline-control-move-down": "Zhvendose artikullin më poshtë",
+    "ooui-outline-control-move-up": "Zhvendose artikullin më lart",
+    "ooui-toolbar-more": "Më tepër..."
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/sr-ec.json b/resources/oojs-ui/i18n/sr-ec.json
new file mode 100644 (file)
index 0000000..973baec
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "Milicevic01",
+            "Nikola Smolenski",
+            "Милан Јелисавчић"
+        ]
+    },
+    "ooui-dialog-action-close": "Затвори",
+    "ooui-outline-control-move-down": "Премести ставку на доле",
+    "ooui-outline-control-move-up": "Премести ставку на горе",
+    "ooui-toolbar-more": "Више"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/sv.json b/resources/oojs-ui/i18n/sv.json
new file mode 100644 (file)
index 0000000..74d654b
--- /dev/null
@@ -0,0 +1,20 @@
+{
+    "@metadata": {
+        "authors": [
+            "Ainali",
+            "Haxpett",
+            "Jopparn",
+            "Knuckles",
+            "Magol",
+            "Milicevic01",
+            "Per",
+            "Sendelbach",
+            "Skalman",
+            "WikiPhoenix"
+        ]
+    },
+    "ooui-dialog-action-close": "Stäng",
+    "ooui-outline-control-move-down": "Flytta ned objekt",
+    "ooui-outline-control-move-up": "Flytta upp objekt",
+    "ooui-toolbar-more": "Mer"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/sw.json b/resources/oojs-ui/i18n/sw.json
new file mode 100644 (file)
index 0000000..1c61b06
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Lloffiwr",
+            "Muddyb Blast Producer"
+        ]
+    },
+    "ooui-dialog-action-close": "Funga",
+    "ooui-outline-control-move-down": "Sogeza kipengee chini",
+    "ooui-outline-control-move-up": "Sogeza kipengee juu",
+    "ooui-toolbar-more": "Zaidi"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ta.json b/resources/oojs-ui/i18n/ta.json
new file mode 100644 (file)
index 0000000..a9795fd
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Jayarathina",
+            "Sank",
+            "Shanmugamp7",
+            "மதனாஹரன்"
+        ]
+    },
+    "ooui-dialog-action-close": "மூடுக"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/te.json b/resources/oojs-ui/i18n/te.json
new file mode 100644 (file)
index 0000000..a1f1285
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "Arjunaraoc",
+            "Jayarathina",
+            "Sank",
+            "Shanmugamp7",
+            "Veeven",
+            "Visdaviva",
+            "மதனாஹரன்"
+        ]
+    },
+    "ooui-dialog-action-close": "మూయి"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/th.json b/resources/oojs-ui/i18n/th.json
new file mode 100644 (file)
index 0000000..b7ee05a
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Supasate",
+            "Taweetham"
+        ]
+    },
+    "ooui-dialog-action-close": "ปิด",
+    "ooui-outline-control-move-down": "เลื่อนรายการลง",
+    "ooui-outline-control-move-up": "ย้ายรายการขึ้น"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/tl.json b/resources/oojs-ui/i18n/tl.json
new file mode 100644 (file)
index 0000000..a073882
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "AnakngAraw",
+            "Sky Harbor"
+        ]
+    },
+    "ooui-dialog-action-close": "Isara",
+    "ooui-outline-control-move-down": "Ilipat ang aytem pababa",
+    "ooui-outline-control-move-up": "Ilipat ang aytem pataas",
+    "ooui-toolbar-more": "Marami pa"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/tr.json b/resources/oojs-ui/i18n/tr.json
new file mode 100644 (file)
index 0000000..94d34a2
--- /dev/null
@@ -0,0 +1,17 @@
+{
+    "@metadata": {
+        "authors": [
+            "Emperyan",
+            "Incelemeelemani",
+            "LuCKY",
+            "Maidis",
+            "Rapsar",
+            "Talha Samil Cakir",
+            "TurkishStyles"
+        ]
+    },
+    "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"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/tt-cyrl.json b/resources/oojs-ui/i18n/tt-cyrl.json
new file mode 100644 (file)
index 0000000..1c0bd90
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "@metadata": {
+        "authors": [
+            "Ajdar"
+        ]
+    },
+    "ooui-dialog-action-close": "Ябу",
+    "ooui-outline-control-move-down": "Элементны аска күчерү",
+    "ooui-outline-control-move-up": "Элементны өскә күчерү"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/ug-arab.json b/resources/oojs-ui/i18n/ug-arab.json
new file mode 100644 (file)
index 0000000..efba086
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "@metadata": {
+        "authors": [
+            "Sahran",
+            "Tel'et",
+            "Tifinaghes"
+        ]
+    }
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/uk.json b/resources/oojs-ui/i18n/uk.json
new file mode 100644 (file)
index 0000000..9a47ad7
--- /dev/null
@@ -0,0 +1,24 @@
+{
+    "@metadata": {
+        "authors": [
+            "AS",
+            "Aced",
+            "Ahonc",
+            "Andriykopanytsia",
+            "Base",
+            "Perohanych",
+            "RLuts",
+            "Sahran",
+            "Sergento",
+            "Steve.rusyn",
+            "SteveR",
+            "Tel'et",
+            "Tifinaghes",
+            "Ата"
+        ]
+    },
+    "ooui-dialog-action-close": "Закрити",
+    "ooui-outline-control-move-down": "Перемістити елемент униз",
+    "ooui-outline-control-move-up": "Перемістити елемент вгору",
+    "ooui-toolbar-more": "Більше"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/uz.json b/resources/oojs-ui/i18n/uz.json
new file mode 100644 (file)
index 0000000..473fc75
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "@metadata": {
+        "authors": [
+            "CoderSI",
+            "Noor2020",
+            "Sociologist",
+            "පසිඳු කාවින්ද"
+        ]
+    },
+    "ooui-dialog-action-close": "Yopish",
+    "ooui-outline-control-move-down": "Elementni pastga koʻchirish",
+    "ooui-outline-control-move-up": "Elementni yuqoriga koʻchirish",
+    "ooui-toolbar-more": "Yana"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/vec.json b/resources/oojs-ui/i18n/vec.json
new file mode 100644 (file)
index 0000000..01833f7
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "@metadata": {
+        "authors": [
+            "Candalua",
+            "GatoSelvadego"
+        ]
+    },
+    "ooui-dialog-action-close": "Sara",
+    "ooui-outline-control-move-down": "Sposta in baso",
+    "ooui-outline-control-move-up": "Sposta in sima",
+    "ooui-toolbar-more": "Altro"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/vi.json b/resources/oojs-ui/i18n/vi.json
new file mode 100644 (file)
index 0000000..b545ce6
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "Cheers!",
+            "Jdforrester",
+            "Minh Nguyen"
+        ]
+    },
+    "ooui-dialog-action-close": "Đóng",
+    "ooui-outline-control-move-down": "Chuyển mục xuống",
+    "ooui-outline-control-move-up": "Chuyển mục lên",
+    "ooui-toolbar-more": "Thêm"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/vo.json b/resources/oojs-ui/i18n/vo.json
new file mode 100644 (file)
index 0000000..2ed7e2f
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "@metadata": {
+        "authors": [
+            "Malafaya"
+        ]
+    },
+    "ooui-dialog-action-close": "Färmükön",
+    "ooui-toolbar-more": "Pluikos"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/wuu.json b/resources/oojs-ui/i18n/wuu.json
new file mode 100644 (file)
index 0000000..72aa48b
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "@metadata": {
+        "authors": [
+            "Malafaya",
+            "十弌"
+        ]
+    },
+    "ooui-toolbar-more": "還多"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/yi.json b/resources/oojs-ui/i18n/yi.json
new file mode 100644 (file)
index 0000000..ab5c510
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "@metadata": {
+        "authors": [
+            "Malafaya",
+            "פוילישער",
+            "十弌"
+        ]
+    },
+    "ooui-dialog-action-close": "שליסן",
+    "ooui-outline-control-move-down": "רוקן עלעמענט אראפ",
+    "ooui-outline-control-move-up": "רוקן עלעמענט ארויף",
+    "ooui-toolbar-more": "נאך"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/yo.json b/resources/oojs-ui/i18n/yo.json
new file mode 100644 (file)
index 0000000..f71d3dd
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "@metadata": {
+        "authors": [
+            "Demmy"
+        ]
+    },
+    "ooui-dialog-action-close": "Ìpadé",
+    "ooui-outline-control-move-down": "Sún onítòún sí sàlẹ̀",
+    "ooui-outline-control-move-up": "Sún onítòún s'ókè",
+    "ooui-toolbar-more": "Míràn"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/zh-hans.json b/resources/oojs-ui/i18n/zh-hans.json
new file mode 100644 (file)
index 0000000..46cbae3
--- /dev/null
@@ -0,0 +1,25 @@
+{
+    "@metadata": {
+        "authors": [
+            "Anakmalaysia",
+            "Bencmq",
+            "Demmy",
+            "Hydra",
+            "Hzy980512",
+            "Liangent",
+            "Liuxinyu970226",
+            "Qiyue2001",
+            "Shirayuki",
+            "Shizhao",
+            "TianyinLee",
+            "Xiaomingyan",
+            "Yfdyh000",
+            "Zhangjintao",
+            "乌拉跨氪"
+        ]
+    },
+    "ooui-dialog-action-close": "关闭",
+    "ooui-outline-control-move-down": "下移项",
+    "ooui-outline-control-move-up": "上移项",
+    "ooui-toolbar-more": "更多"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/zh-hant.json b/resources/oojs-ui/i18n/zh-hant.json
new file mode 100644 (file)
index 0000000..9aace2f
--- /dev/null
@@ -0,0 +1,22 @@
+{
+    "@metadata": {
+        "authors": [
+            "Anakmalaysia",
+            "Ch.Andrew",
+            "Hydra",
+            "Justincheng12345",
+            "Liflon",
+            "Liuxinyu970226",
+            "Qiyue2001",
+            "Radish10cm",
+            "Shirayuki",
+            "Simon Shek",
+            "Spring Roll Conan",
+            "Waihorace"
+        ]
+    },
+    "ooui-dialog-action-close": "關閉",
+    "ooui-outline-control-move-down": "向下移項",
+    "ooui-outline-control-move-up": "向上移項",
+    "ooui-toolbar-more": "更多"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/zh-hk.json b/resources/oojs-ui/i18n/zh-hk.json
new file mode 100644 (file)
index 0000000..60e8fbd
--- /dev/null
@@ -0,0 +1,4 @@
+{
+    "@metadata": [],
+    "ooui-dialog-action-close": "關閉"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/i18n/zh-tw.json b/resources/oojs-ui/i18n/zh-tw.json
new file mode 100644 (file)
index 0000000..f7987e5
--- /dev/null
@@ -0,0 +1,7 @@
+{
+    "@metadata": [],
+    "ooui-dialog-action-close": "關閉",
+    "ooui-outline-control-move-down": "向下移",
+    "ooui-outline-control-move-up": "向上移",
+    "ooui-toolbar-more": "更多"
+}
\ No newline at end of file
diff --git a/resources/oojs-ui/images/fade-down.png b/resources/oojs-ui/images/fade-down.png
new file mode 100644 (file)
index 0000000..50c7931
Binary files /dev/null and b/resources/oojs-ui/images/fade-down.png differ
diff --git a/resources/oojs-ui/images/fade-up.png b/resources/oojs-ui/images/fade-up.png
new file mode 100644 (file)
index 0000000..7a0cb87
Binary files /dev/null and b/resources/oojs-ui/images/fade-up.png differ
diff --git a/resources/oojs-ui/images/icons/accept.png b/resources/oojs-ui/images/icons/accept.png
new file mode 100644 (file)
index 0000000..1075110
Binary files /dev/null and b/resources/oojs-ui/images/icons/accept.png differ
diff --git a/resources/oojs-ui/images/icons/accept.svg b/resources/oojs-ui/images/icons/accept.svg
new file mode 100644 (file)
index 0000000..df78186
--- /dev/null
@@ -0,0 +1,8 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="apply" style="opacity:0.75;">
+       <polygon id="check" style="fill-rule:evenodd;clip-rule:evenodd;" points="19.062,5.139 17.418,4 8.867,16.357 5.413,12.903 4,14.316 9.021,19.338"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/add-item.png b/resources/oojs-ui/images/icons/add-item.png
new file mode 100644 (file)
index 0000000..aa36cd0
Binary files /dev/null and b/resources/oojs-ui/images/icons/add-item.png differ
diff --git a/resources/oojs-ui/images/icons/add-item.svg b/resources/oojs-ui/images/icons/add-item.svg
new file mode 100644 (file)
index 0000000..ff95399
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24" height="24" viewBox="0, 0, 24, 24">
+  <g id="add-item">
+    <path d="M13,8 L11,8 L11,11 L8,11 L8,13 L11,13 L11,16 L13,16 L13,13 L16,13 L16,11 L13,11 z" fill="#000000"/>
+  </g>
+  <defs/>
+</svg>
diff --git a/resources/oojs-ui/images/icons/advanced.png b/resources/oojs-ui/images/icons/advanced.png
new file mode 100644 (file)
index 0000000..7f5ada5
Binary files /dev/null and b/resources/oojs-ui/images/icons/advanced.png differ
diff --git a/resources/oojs-ui/images/icons/advanced.svg b/resources/oojs-ui/images/icons/advanced.svg
new file mode 100644 (file)
index 0000000..3e87cab
--- /dev/null
@@ -0,0 +1,17 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="settings" style="opacity:0.75;">
+       <path id="gear" style="fill-rule:evenodd;clip-rule:evenodd;" d="M20.869,13.476C20.948,12.994,21,12.504,21,12
+               s-0.052-0.994-0.131-1.476l-2.463-0.259c-0.149-0.556-0.367-1.082-0.648-1.57l1.558-1.924c-0.576-0.806-1.281-1.511-2.087-2.087
+               l-1.924,1.558c-0.488-0.281-1.015-0.499-1.57-0.648l-0.259-2.463C12.994,3.052,12.504,3,12,3s-0.994,0.052-1.476,0.131
+               l-0.259,2.463C9.71,5.743,9.184,5.961,8.695,6.242L6.771,4.685C5.966,5.261,5.261,5.966,4.685,6.771l1.558,1.924
+               c-0.281,0.488-0.499,1.015-0.648,1.57l-2.463,0.259C3.052,11.006,3,11.496,3,12s0.052,0.994,0.131,1.476l2.463,0.259
+               c0.149,0.556,0.367,1.082,0.648,1.57l-1.558,1.924c0.576,0.806,1.281,1.511,2.087,2.087l1.924-1.558
+               c0.488,0.281,1.015,0.499,1.57,0.648l0.259,2.463C11.006,20.948,11.496,21,12,21s0.994-0.052,1.476-0.131l0.259-2.463
+               c0.556-0.149,1.082-0.367,1.57-0.648l1.924,1.558c0.806-0.576,1.511-1.281,2.087-2.087l-1.558-1.924
+               c0.281-0.488,0.499-1.015,0.648-1.57L20.869,13.476z M12,15.998c-2.209,0-3.998-1.789-3.998-3.998S9.791,8.002,12,8.002
+               S15.998,9.791,15.998,12S14.209,15.998,12,15.998z"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/alert.png b/resources/oojs-ui/images/icons/alert.png
new file mode 100644 (file)
index 0000000..992ea2a
Binary files /dev/null and b/resources/oojs-ui/images/icons/alert.png differ
diff --git a/resources/oojs-ui/images/icons/alert.svg b/resources/oojs-ui/images/icons/alert.svg
new file mode 100644 (file)
index 0000000..886a7c0
--- /dev/null
@@ -0,0 +1,10 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="alert" style="opacity:0.75;">
+       <rect id="point" x="11" y="16" style="fill-rule:evenodd;clip-rule:evenodd;" width="2" height="2"/>
+       <polygon id="stroke" style="fill-rule:evenodd;clip-rule:evenodd;" points="13.516,10 10.516,10 11,15 13,15"/>
+       <path id="triangle" d="M12.017,5.974L19.536,19H4.496L12.017,5.974 M12.017,3.5c-0.544,0-1.088,0.357-1.5,1.071L2.532,18.402 C1.707,19.831,2.382,21,4.032,21H20c1.65,0,2.325-1.169,1.5-2.599L13.517,4.572C13.104,3.857,12.561,3.5,12.017,3.5L12.017,3.5z"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/arched-arrow-ltr.png b/resources/oojs-ui/images/icons/arched-arrow-ltr.png
new file mode 100644 (file)
index 0000000..5db1c4d
Binary files /dev/null and b/resources/oojs-ui/images/icons/arched-arrow-ltr.png differ
diff --git a/resources/oojs-ui/images/icons/arched-arrow-ltr.svg b/resources/oojs-ui/images/icons/arched-arrow-ltr.svg
new file mode 100644 (file)
index 0000000..5b343a5
--- /dev/null
@@ -0,0 +1,8 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="arched-arrow-ltr" style="opacity:0.75;">
+       <path id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" d="M19.925,14.937l-2.391-6.901l-1.48,2.329 c-0.964-0.845-2.699-1.85-5.513-1.823c-4.887,0.046-6.524,4.244-6.524,4.244s2.753-2.639,6.925-1.949 c1.729,0.286,3.007,1.206,3.675,1.791l-1.474,2.319L19.925,14.937z"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/arched-arrow-rtl.png b/resources/oojs-ui/images/icons/arched-arrow-rtl.png
new file mode 100644 (file)
index 0000000..7931971
Binary files /dev/null and b/resources/oojs-ui/images/icons/arched-arrow-rtl.png differ
diff --git a/resources/oojs-ui/images/icons/arched-arrow-rtl.svg b/resources/oojs-ui/images/icons/arched-arrow-rtl.svg
new file mode 100644 (file)
index 0000000..bb5f10e
--- /dev/null
@@ -0,0 +1,8 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="arched-arrow-rtl" style="opacity:0.75;">
+       <path id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" d="M13.401,8.542c-2.814-0.027-4.549,0.978-5.513,1.823 l-1.48-2.329l-2.391,6.901l6.782,0.009l-1.474-2.319c0.668-0.584,1.945-1.504,3.675-1.791c4.172-0.69,6.925,1.949,6.925,1.949 S18.288,8.588,13.401,8.542z"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/check.png b/resources/oojs-ui/images/icons/check.png
new file mode 100644 (file)
index 0000000..82c3cb4
Binary files /dev/null and b/resources/oojs-ui/images/icons/check.png differ
diff --git a/resources/oojs-ui/images/icons/check.svg b/resources/oojs-ui/images/icons/check.svg
new file mode 100644 (file)
index 0000000..e67cd6c
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24" height="24" viewBox="0, 0, 24, 24">
+  <g id="check">
+    <path d="M7.105,13.473 L8.527,12.05 L10.428,13.952 L15.238,7 L16.895,8.148 L10.635,17 z" fill="#000000"/>
+  </g>
+  <defs/>
+</svg>
diff --git a/resources/oojs-ui/images/icons/clear.png b/resources/oojs-ui/images/icons/clear.png
new file mode 100644 (file)
index 0000000..697dd62
Binary files /dev/null and b/resources/oojs-ui/images/icons/clear.png differ
diff --git a/resources/oojs-ui/images/icons/clear.svg b/resources/oojs-ui/images/icons/clear.svg
new file mode 100644 (file)
index 0000000..d83eb02
--- /dev/null
@@ -0,0 +1,8 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="clear" style="opacity:0.75;">
+       <path id="circle_with_strike" style="fill-rule:evenodd;clip-rule:evenodd;" d="M11.999,5.022c-3.853,0-6.977,3.124-6.977,6.978 c0,3.853,3.124,6.978,6.977,6.978c3.854,0,6.979-3.125,6.979-6.978C18.978,8.146,15.853,5.022,11.999,5.022z M6.886,12 c0-1.092,0.572-3.25,0.93-2.929l7.113,7.113c0.488,0.525-1.837,0.931-2.93,0.931C9.174,17.114,6.886,14.824,6.886,12z M16.184,14.929L9.07,7.816c-0.445-0.483,1.837-0.931,2.929-0.931c2.827,0,5.115,2.289,5.115,5.114 C17.114,13.092,16.75,15.542,16.184,14.929z"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/close.png b/resources/oojs-ui/images/icons/close.png
new file mode 100644 (file)
index 0000000..f7eed9f
Binary files /dev/null and b/resources/oojs-ui/images/icons/close.png differ
diff --git a/resources/oojs-ui/images/icons/close.svg b/resources/oojs-ui/images/icons/close.svg
new file mode 100644 (file)
index 0000000..a0118c2
--- /dev/null
@@ -0,0 +1,8 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="close" style="opacity:0.75;">
+       <polygon id="x" style="fill-rule:evenodd;clip-rule:evenodd;" points="18.717,6.697 17.303,5.283 12,10.586 6.697,5.283 5.283,6.697 10.586,12 5.283,17.303 6.697,18.717 12,13.414 17.303,18.717 18.717,17.303 13.414,12            "/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/code.png b/resources/oojs-ui/images/icons/code.png
new file mode 100644 (file)
index 0000000..a5ebdbf
Binary files /dev/null and b/resources/oojs-ui/images/icons/code.png differ
diff --git a/resources/oojs-ui/images/icons/code.svg b/resources/oojs-ui/images/icons/code.svg
new file mode 100644 (file)
index 0000000..6f1ed53
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!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="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<g id="code" opacity="0.75">
+       <path id="left-bracket" d="M4,12v-1h1c1,0,1,0,1-1V7.614C6,7.1,6.024,6.718,6.073,6.472C6.127,6.22,6.212,6.009,6.33,5.839
+               C6.534,5.56,6.803,5.364,7.138,5.255C7.473,5.14,8.01,5,8.973,5H10v1H9.248c-0.457,0-0.77,0.191-0.936,0.408
+               C8.145,6.623,8,6.853,8,7.476v1.857c0,0.729-0.041,1.18-0.244,1.493c-0.2,0.307-0.562,0.529-1.09,0.667
+               c0.535,0.155,0.9,0.385,1.096,0.688C7.961,12.484,8,12.938,8,13.665v1.862c0,0.619,0.145,0.848,0.312,1.062
+               c0.166,0.22,0.479,0.407,0.936,0.407L10,17l0,0v1H8.973c-0.963,0-1.5-0.133-1.835-0.248c-0.335-0.109-0.604-0.307-0.808-0.591
+               c-0.118-0.165-0.203-0.374-0.257-0.625C6.024,16.283,6,15.9,6,15.387V13c0-1,0-1-1-1H4z"/>
+       <use transform="matrix(-1,0,0,1,24,0)" id="right-bracket" x="0" y="0" width="24" height="24" xlink:href="#left-bracket" />
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/collapse.png b/resources/oojs-ui/images/icons/collapse.png
new file mode 100644 (file)
index 0000000..38b796f
Binary files /dev/null and b/resources/oojs-ui/images/icons/collapse.png differ
diff --git a/resources/oojs-ui/images/icons/collapse.svg b/resources/oojs-ui/images/icons/collapse.svg
new file mode 100644 (file)
index 0000000..a89cebf
--- /dev/null
@@ -0,0 +1,8 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="collapse" style="opacity:0.75;">
+       <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="6.697,15.714 12,10.412 17.303,15.714 18.717,14.3 12,7.583 5.283,14.3"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/comment.png b/resources/oojs-ui/images/icons/comment.png
new file mode 100644 (file)
index 0000000..9546455
Binary files /dev/null and b/resources/oojs-ui/images/icons/comment.png differ
diff --git a/resources/oojs-ui/images/icons/comment.svg b/resources/oojs-ui/images/icons/comment.svg
new file mode 100644 (file)
index 0000000..e052935
--- /dev/null
@@ -0,0 +1,8 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="comment" style="opacity:0.75;">
+       <path id="speech_bubble" style="fill-rule:evenodd;clip-rule:evenodd;" d="M15,6H9C7.343,6,6,7.344,6,9v4c0,1.656,1.343,3,3,3v3 l3-3h3c1.657,0,3-1.344,3-3V9C18,7.344,16.657,6,15,6z"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/expand.png b/resources/oojs-ui/images/icons/expand.png
new file mode 100644 (file)
index 0000000..e90aca1
Binary files /dev/null and b/resources/oojs-ui/images/icons/expand.png differ
diff --git a/resources/oojs-ui/images/icons/expand.svg b/resources/oojs-ui/images/icons/expand.svg
new file mode 100644 (file)
index 0000000..b542f5f
--- /dev/null
@@ -0,0 +1,8 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="expand" style="opacity:0.75;">
+       <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="17.303,8.283 12,13.586 6.697,8.283 5.283,9.697 12,16.414 18.717,9.697"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/help.png b/resources/oojs-ui/images/icons/help.png
new file mode 100644 (file)
index 0000000..dca745b
Binary files /dev/null and b/resources/oojs-ui/images/icons/help.png differ
diff --git a/resources/oojs-ui/images/icons/help.svg b/resources/oojs-ui/images/icons/help.svg
new file mode 100644 (file)
index 0000000..c68bdda
--- /dev/null
@@ -0,0 +1,12 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="help" style="opacity:0.75;">
+       <path id="circle" style="fill-rule:evenodd;clip-rule:evenodd;" d="M12.001,2.085c-5.478,0-9.916,4.438-9.916,9.916 c0,5.476,4.438,9.914,9.916,9.914c5.476,0,9.914-4.438,9.914-9.914C21.915,6.523,17.477,2.085,12.001,2.085z M12.002,20.085 c-4.465,0-8.084-3.619-8.084-8.083c0-4.465,3.619-8.084,8.084-8.084c4.464,0,8.083,3.619,8.083,8.084 C20.085,16.466,16.466,20.085,12.002,20.085z"/>
+       <g id="question_mark">
+               <path id="top" style="fill-rule:evenodd;clip-rule:evenodd;" d="M11.766,6.688c-2.5,0-3.219,2.188-3.219,2.188l1.411,0.854 c0,0,0.298-0.791,0.901-1.229c0.516-0.375,1.625-0.625,2.219,0.125c0.701,0.885-0.17,1.587-1.078,2.719 C11.047,12.531,11,15,11,15h1.969c0,0,0.135-2.318,1.041-3.381c0.603-0.707,1.443-1.338,1.443-2.494S14.266,6.688,11.766,6.688z"/>
+               <rect id="bottom" x="11" y="16" style="fill-rule:evenodd;clip-rule:evenodd;" width="2" height="2"/>
+       </g>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/history.png b/resources/oojs-ui/images/icons/history.png
new file mode 100644 (file)
index 0000000..c049931
Binary files /dev/null and b/resources/oojs-ui/images/icons/history.png differ
diff --git a/resources/oojs-ui/images/icons/history.svg b/resources/oojs-ui/images/icons/history.svg
new file mode 100644 (file)
index 0000000..40c0ae3
--- /dev/null
@@ -0,0 +1,9 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="history" style="opacity:0.75;">
+       <path id="clock_hands" style="fill-rule:evenodd;clip-rule:evenodd;" d="M17.26,15.076c0,0-2.385-1.935-4.005-3.062 c0.72-2.397,1.702-6.559,1.702-6.559s-4.35,5.363-4.877,6.699c-0.463,1.168,1.459,2.209,2.346,1.678 C14.326,14.383,17.26,15.076,17.26,15.076z"/>
+       <path id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" d="M12.086,2.085c-5.478,0-9.916,4.438-9.916,9.916 c0,1.783,0.476,3.454,1.301,4.898l-2.223,2.04h5.688v-5.219l-2.066,1.896c-0.55-1.088-0.866-2.312-0.866-3.615 c0-4.465,3.619-8.084,8.084-8.084c4.464,0,8.083,3.619,8.083,8.084c0,4.464-3.619,8.083-8.083,8.083 c-1.145,0-2.228-0.247-3.213-0.678l-0.833,1.634c1.235,0.557,2.602,0.874,4.045,0.874c5.476,0,9.914-4.438,9.914-9.914 C22,6.523,17.562,2.085,12.086,2.085z"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/link.png b/resources/oojs-ui/images/icons/link.png
new file mode 100644 (file)
index 0000000..7dfa268
Binary files /dev/null and b/resources/oojs-ui/images/icons/link.png differ
diff --git a/resources/oojs-ui/images/icons/link.svg b/resources/oojs-ui/images/icons/link.svg
new file mode 100644 (file)
index 0000000..dadf69c
--- /dev/null
@@ -0,0 +1,15 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="link" style="opacity:0.75;">
+       <path id="right" d="M19.188,12.001c0,1.1-0.891,2.015-1.988,2.015l-4.195-0.015C13.543,15.089,13.968,16,15.002,16h3
+               C19.658,16,21,13.657,21,12s-1.342-4-2.998-4h-3c-1.034,0-1.459,0.911-1.998,1.999l4.195-0.015
+               C18.297,9.984,19.188,10.901,19.188,12.001z"/>
+       <path id="center" d="M8,12c0,0.535,0.42,1,0.938,1h6.109c0.518,0,0.938-0.465,0.938-1c0-0.534-0.42-1-0.938-1H8.938
+               C8.42,11,8,11.466,8,12z"/>
+       <path id="left" d="M4.816,11.999c0-1.1,0.891-2.015,1.988-2.015L11,9.999C10.461,8.911,10.036,8,9.002,8h-3
+               c-1.656,0-2.998,2.343-2.998,4s1.342,4,2.998,4h3c1.034,0,1.459-0.911,1.998-1.999l-4.195,0.015
+               C5.707,14.016,4.816,13.099,4.816,11.999z"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/menu.png b/resources/oojs-ui/images/icons/menu.png
new file mode 100644 (file)
index 0000000..b5ac60f
Binary files /dev/null and b/resources/oojs-ui/images/icons/menu.png differ
diff --git a/resources/oojs-ui/images/icons/menu.svg b/resources/oojs-ui/images/icons/menu.svg
new file mode 100644 (file)
index 0000000..657fab2
--- /dev/null
@@ -0,0 +1,10 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="menu" style="opacity:0.75;">
+       <path id="lines" d="M6,15h12c0.553,0,1,0.447,1,1v1c0,0.553-0.447,1-1,1H6c-0.553,0-1-0.447-1-1v-1C5,15.447,5.447,15,6,15z M5,11v1
+               c0,0.553,0.447,1,1,1h12c0.553,0,1-0.447,1-1v-1c0-0.553-0.447-1-1-1H6C5.447,10,5,10.447,5,11z M5,6v1c0,0.553,0.447,1,1,1h12
+               c0.553,0,1-0.447,1-1V6c0-0.553-0.447-1-1-1H6C5.447,5,5,5.447,5,6z"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/move-ltr.png b/resources/oojs-ui/images/icons/move-ltr.png
new file mode 100644 (file)
index 0000000..ded5f05
Binary files /dev/null and b/resources/oojs-ui/images/icons/move-ltr.png differ
diff --git a/resources/oojs-ui/images/icons/move-ltr.svg b/resources/oojs-ui/images/icons/move-ltr.svg
new file mode 100644 (file)
index 0000000..a378a5d
--- /dev/null
@@ -0,0 +1,9 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="move-ltr" style="opacity:0.75;">
+       <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="8.935,7.181 14.237,12.483 8.935,17.786
+               10.349,19.2 17.065,12.483 10.349,5.767"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/move-rtl.png b/resources/oojs-ui/images/icons/move-rtl.png
new file mode 100644 (file)
index 0000000..fc6e62d
Binary files /dev/null and b/resources/oojs-ui/images/icons/move-rtl.png differ
diff --git a/resources/oojs-ui/images/icons/move-rtl.svg b/resources/oojs-ui/images/icons/move-rtl.svg
new file mode 100644 (file)
index 0000000..c0b334b
--- /dev/null
@@ -0,0 +1,9 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="move-rtl" style="opacity:0.75;">
+       <polygon id="arrow_9_" style="fill-rule:evenodd;clip-rule:evenodd;" points="15.065,17.786 9.763,12.483 15.065,7.181
+               13.651,5.767 6.935,12.483 13.651,19.2"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/picture.png b/resources/oojs-ui/images/icons/picture.png
new file mode 100644 (file)
index 0000000..faf8af9
Binary files /dev/null and b/resources/oojs-ui/images/icons/picture.png differ
diff --git a/resources/oojs-ui/images/icons/picture.svg b/resources/oojs-ui/images/icons/picture.svg
new file mode 100644 (file)
index 0000000..078ce10
--- /dev/null
@@ -0,0 +1,12 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="picture" style="opacity:0.75;">
+       <path id="frame" style="fill-rule:evenodd;clip-rule:evenodd;" d="M18,4H6C4,3.993,3,4.993,3,6.993L3.014,16C3,18,4,18.988,6,19h12
+               c2-0.012,2.994-1,3-3.006V6.993C20.994,4.993,20,3.993,18,4z M19,17H5V6h14V17z"/>
+       <polygon id="mountains" style="fill-rule:evenodd;clip-rule:evenodd;" points="6,13.5 9.5,10 11.828,12.312 10.516,13.406
+               11.391,14.438 15.5,11 18,13 18,16 6,16"/>
+       <polygon id="sky" style="fill-rule:evenodd;clip-rule:evenodd;" points="6,12 9.516,7.844 12.562,11.016 15.5,9 18,11 18,7 6,7"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/remove-item.png b/resources/oojs-ui/images/icons/remove-item.png
new file mode 100644 (file)
index 0000000..2f11db3
Binary files /dev/null and b/resources/oojs-ui/images/icons/remove-item.png differ
diff --git a/resources/oojs-ui/images/icons/remove-item.svg b/resources/oojs-ui/images/icons/remove-item.svg
new file mode 100644 (file)
index 0000000..b95e7d3
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24" height="24" viewBox="0, 0, 24, 24">
+  <g id="remove-item">
+    <path d="M8,11 L16,11 L16,13 L8,13 z" fill="#000000"/>
+  </g>
+  <defs/>
+</svg>
diff --git a/resources/oojs-ui/images/icons/remove.png b/resources/oojs-ui/images/icons/remove.png
new file mode 100644 (file)
index 0000000..d7e116c
Binary files /dev/null and b/resources/oojs-ui/images/icons/remove.png differ
diff --git a/resources/oojs-ui/images/icons/remove.svg b/resources/oojs-ui/images/icons/remove.svg
new file mode 100644 (file)
index 0000000..17c8d39
--- /dev/null
@@ -0,0 +1,9 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="remove" style="opacity:0.75;">
+       <path id="trash_can" style="fill-rule:evenodd;clip-rule:evenodd;" d="M12,10h-1v6h1V10z M10,10H9v6h1V10z M14,10h-1v6h1V10z
+                M14,6V5H9v1H6v3h1v7.966l1,1.031v-0.074V18h6.984L15,17.982v0.015l1-1.031V9h1V6H14z M15,17H8V9h7V17z M16,8H7V7h9V8z"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/search.png b/resources/oojs-ui/images/icons/search.png
new file mode 100644 (file)
index 0000000..df29792
Binary files /dev/null and b/resources/oojs-ui/images/icons/search.png differ
diff --git a/resources/oojs-ui/images/icons/search.svg b/resources/oojs-ui/images/icons/search.svg
new file mode 100644 (file)
index 0000000..37feda4
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="search" style="opacity:0.75;">
+       <path id="magnifying_glass" d="M16.021,15.96l-2.374-2.375c-0.048-0.047-0.105-0.079-0.169-0.099c0.403-0.566,0.643-1.26,0.643-2.009
+               C14.12,9.557,12.563,8,10.644,8c-1.921,0-3.478,1.557-3.478,3.478c0,1.92,1.557,3.477,3.478,3.477c0.749,0,1.442-0.239,2.01-0.643
+               c0.019,0.063,0.051,0.121,0.098,0.169l2.375,2.374c0.19,0.189,0.543,0.143,0.79-0.104S16.21,16.15,16.021,15.96z M10.644,13.69
+               c-1.221,0-2.213-0.991-2.213-2.213c0-1.221,0.992-2.213,2.213-2.213c1.222,0,2.213,0.992,2.213,2.213
+               C12.856,12.699,11.865,13.69,10.644,13.69z"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/settings.png b/resources/oojs-ui/images/icons/settings.png
new file mode 100644 (file)
index 0000000..b1b35e9
Binary files /dev/null and b/resources/oojs-ui/images/icons/settings.png differ
diff --git a/resources/oojs-ui/images/icons/settings.svg b/resources/oojs-ui/images/icons/settings.svg
new file mode 100644 (file)
index 0000000..1464a79
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24" height="24" viewBox="0, 0, 24, 24">
+  <g id="settings" opacity="0.75">
+    <path d="M3,4 L6,4 L6,6 L3,6 z" fill="#000000"/>
+    <path d="M12,4 L21,4 L21,6 L12,6 z" fill="#000000"/>
+    <path d="M8,3 L10,3 C10.552,3 11,3.448 11,4 L11,6 C11,6.552 10.552,7 10,7 L8,7 C7.448,7 7,6.552 7,6 L7,4 C7,3.448 7.448,3 8,3 z" fill="#000000"/>
+    <path d="M3,11 L12,11 L12,13 L3,13 z" fill="#000000"/>
+    <path d="M18,11 L21,11 L21,13 L18,13 z" fill="#000000"/>
+    <path d="M14,10 L16,10 C16.552,10 17,10.448 17,11 L17,13 C17,13.552 16.552,14 16,14 L14,14 C13.448,14 13,13.552 13,13 L13,11 C13,10.448 13.448,10 14,10 z" fill="#000000"/>
+    <path d="M3,18 L9,18 L9,20 L3,20 z" fill="#000000"/>
+    <path d="M15,18 L21,18 L21,20 L15,20 z" fill="#000000"/>
+    <path d="M11,17 L13,17 C13.552,17 14,17.448 14,18 L14,20 C14,20.552 13.552,21 13,21 L11,21 C10.448,21 10,20.552 10,20 L10,18 C10,17.448 10.448,17 11,17 z" fill="#000000"/>
+  </g>
+  <defs/>
+</svg>
diff --git a/resources/oojs-ui/images/icons/tag.png b/resources/oojs-ui/images/icons/tag.png
new file mode 100644 (file)
index 0000000..722f4d7
Binary files /dev/null and b/resources/oojs-ui/images/icons/tag.png differ
diff --git a/resources/oojs-ui/images/icons/tag.svg b/resources/oojs-ui/images/icons/tag.svg
new file mode 100644 (file)
index 0000000..d21e5e3
--- /dev/null
@@ -0,0 +1,11 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="tag" style="opacity:0.75;">
+       <path d="M18.748,11.717c0.389,0.389,0.389,1.025,0,1.414l-4.949,4.95c-0.389,0.389-1.025,0.389-1.414,0l-6.01-6.01
+               c-0.389-0.389-0.707-1.157-0.707-1.707L5.667,6c0-0.55,0.45-1,1-1h4.364c0.55,0,1.318,0.318,1.707,0.707L18.748,11.717z
+                M8.104,7.456C7.525,8.032,7.526,8.97,8.103,9.549c0.578,0.577,1.516,0.577,2.095,0.001c0.576-0.578,0.576-1.517,0-2.095
+               C9.617,6.879,8.68,6.878,8.104,7.456z"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/icons/window.png b/resources/oojs-ui/images/icons/window.png
new file mode 100644 (file)
index 0000000..3d48a3c
Binary files /dev/null and b/resources/oojs-ui/images/icons/window.png differ
diff --git a/resources/oojs-ui/images/icons/window.svg b/resources/oojs-ui/images/icons/window.svg
new file mode 100644 (file)
index 0000000..621cf2c
--- /dev/null
@@ -0,0 +1,10 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
+        height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="window" style="opacity:0.75;">
+       <rect id="title" x="7" y="10" width="10" height="1"/>
+       <path id="window" d="M16,19H8c-2.206,0-4-1.794-4-4V9c0-2.206,1.794-4,4-4h8c2.206,0,4,1.794,4,4v6C20,17.206,18.206,19,16,19z
+                M8,7C6.897,7,6,7.897,6,9v6c0,1.103,0.897,2,2,2h8c1.103,0,2-0.897,2-2V9c0-1.103-0.897-2-2-2H8z"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/indicators/down.png b/resources/oojs-ui/images/indicators/down.png
new file mode 100644 (file)
index 0000000..47ff54c
Binary files /dev/null and b/resources/oojs-ui/images/indicators/down.png differ
diff --git a/resources/oojs-ui/images/indicators/down.svg b/resources/oojs-ui/images/indicators/down.svg
new file mode 100644 (file)
index 0000000..c871f60
--- /dev/null
@@ -0,0 +1,8 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
+        height="12px" viewBox="0 0 12 12" style="enable-background:new 0 0 12 12;" xml:space="preserve">
+<g id="down" style="opacity:0.75;">
+       <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="2.023,3 5.512,8.953 9,3"/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/indicators/required.png b/resources/oojs-ui/images/indicators/required.png
new file mode 100644 (file)
index 0000000..aeb35a3
Binary files /dev/null and b/resources/oojs-ui/images/indicators/required.png differ
diff --git a/resources/oojs-ui/images/indicators/required.svg b/resources/oojs-ui/images/indicators/required.svg
new file mode 100644 (file)
index 0000000..7c60ec0
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12" height="12" viewBox="0, 0, 12, 12">
+  <g id="required" opacity="0.75">
+    <path d="M7,0 L7,4.268 L10.696,2.134 L11.696,3.866 L8,6 L11.696,8.134 L10.696,9.866 L7,7.732 L7,12 L5,12 L5,7.732 L1.304,9.866 L0.304,8.134 L4,6 L0.304,3.866 L1.304,2.134 L5,4.268 L5,0 z" fill="#000000"/>
+  </g>
+  <defs/>
+</svg>
diff --git a/resources/oojs-ui/images/indicators/up.png b/resources/oojs-ui/images/indicators/up.png
new file mode 100644 (file)
index 0000000..b827f6d
Binary files /dev/null and b/resources/oojs-ui/images/indicators/up.png differ
diff --git a/resources/oojs-ui/images/indicators/up.svg b/resources/oojs-ui/images/indicators/up.svg
new file mode 100644 (file)
index 0000000..a5d7f38
--- /dev/null
@@ -0,0 +1,8 @@
+<?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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
+        height="12px" viewBox="0 0 12 12" style="enable-background:new 0 0 12 12;" xml:space="preserve">
+<g id="up" style="opacity:0.75;">
+       <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="5.512,2.006 2,8 9.024,8                "/>
+</g>
+</svg>
diff --git a/resources/oojs-ui/images/tail.svg b/resources/oojs-ui/images/tail.svg
new file mode 100644 (file)
index 0000000..4df8bb2
--- /dev/null
@@ -0,0 +1,9 @@
+<?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="tail">
+       <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>
+</svg>
diff --git a/resources/oojs-ui/images/textures/pending.gif b/resources/oojs-ui/images/textures/pending.gif
new file mode 100644 (file)
index 0000000..1194eed
Binary files /dev/null and b/resources/oojs-ui/images/textures/pending.gif differ
diff --git a/resources/oojs-ui/images/textures/transparency.png b/resources/oojs-ui/images/textures/transparency.png
new file mode 100644 (file)
index 0000000..b8e36d3
Binary files /dev/null and b/resources/oojs-ui/images/textures/transparency.png differ
diff --git a/resources/oojs-ui/images/toolbar-shadow.png b/resources/oojs-ui/images/toolbar-shadow.png
new file mode 100644 (file)
index 0000000..97e8d13
Binary files /dev/null and b/resources/oojs-ui/images/toolbar-shadow.png differ
diff --git a/resources/oojs-ui/oojs-ui.js b/resources/oojs-ui/oojs-ui.js
new file mode 100644 (file)
index 0000000..63ecf98
--- /dev/null
@@ -0,0 +1,7532 @@
+/*!
+ * OOjs UI v0.1.0-pre (424b40373e)
+ * 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: Fri Feb 14 2014 17:57:32 GMT-0800 (PST)
+ */
+( function () {
+
+'use strict';
+/**
+ * Namespace for all classes, static methods and static properties.
+ *
+ * @class
+ * @singleton
+ */
+OO.ui = {};
+
+OO.ui.bind = $.proxy;
+
+/**
+ * Get the user's language and any fallback languages.
+ *
+ * These language codes are used to localize user interface elements in the user's language.
+ *
+ * In environments that provide a localization system, this function should be overridden to
+ * return the user's language(s). The default implementation returns English (en) only.
+ *
+ * @returns {string[]} Language codes, in descending order of priority
+ */
+OO.ui.getUserLanguages = function () {
+       return [ 'en' ];
+};
+
+/**
+ * Get a value in an object keyed by language code.
+ *
+ * @param {Object.<string,Mixed>} obj Object keyed by language code
+ * @param {string|null} [lang] Language code, if omitted or null defaults to any user language
+ * @param {string} [fallback] Fallback code, used if no matching language can be found
+ * @returns {Mixed} Local value
+ */
+OO.ui.getLocalValue = function ( obj, lang, fallback ) {
+       var i, len, langs;
+
+       // Requested language
+       if ( obj[lang] ) {
+               return obj[lang];
+       }
+       // Known user language
+       langs = OO.ui.getUserLanguages();
+       for ( i = 0, len = langs.length; i < len; i++ ) {
+               lang = langs[i];
+               if ( obj[lang] ) {
+                       return obj[lang];
+               }
+       }
+       // Fallback language
+       if ( obj[fallback] ) {
+               return obj[fallback];
+       }
+       // First existing language
+       for ( lang in obj ) {
+               return obj[lang];
+       }
+
+       return undefined;
+};
+
+( function () {
+
+/**
+ * Message store for the default implementation of OO.ui.msg
+ *
+ * Environments that provide a localization system should not use this, but should override
+ * OO.ui.msg altogether.
+ *
+ * @private
+ */
+var messages = {
+       // Label text for button to exit from dialog
+       'ooui-dialog-action-close': 'Close',
+       // Tool tip for a button that moves items in a list down one place
+       'ooui-outline-control-move-down': 'Move item down',
+       // Tool tip for a button that moves items in a list up one place
+       'ooui-outline-control-move-up': 'Move item up',
+       // Label for the toolbar group that contains a list of all other available tools
+       'ooui-toolbar-more': 'More'
+};
+
+/**
+ * Get a localized message.
+ *
+ * In environments that provide a localization system, this function should be overridden to
+ * return the message translated in the user's language. The default implementation always returns
+ * English messages.
+ *
+ * After the message key, message parameters may optionally be passed. In the default implementation,
+ * any occurrences of $1 are replaced with the first parameter, $2 with the second parameter, etc.
+ * Alternative implementations of OO.ui.msg may use any substitution system they like, as long as
+ * they support unnamed, ordered message parameters.
+ *
+ * @abstract
+ * @param {string} key Message key
+ * @param {Mixed...} [params] Message parameters
+ * @returns {string} Translated message with parameters substituted
+ */
+OO.ui.msg = function ( key ) {
+       var message = messages[key], params = Array.prototype.slice.call( arguments, 1 );
+       if ( typeof message === 'string' ) {
+               // Perform $1 substitution
+               message = message.replace( /\$(\d+)/g, function ( unused, n ) {
+                       var i = parseInt( n, 10 );
+                       return params[i - 1] !== undefined ? params[i - 1] : '$' + n;
+               } );
+       } else {
+               // Return placeholder if message not found
+               message = '[' + key + ']';
+       }
+       return message;
+};
+
+OO.ui.deferMsg = function ( key ) {
+       return function () {
+               return OO.ui.msg( key );
+       };
+};
+
+OO.ui.resolveMsg = function ( msg ) {
+       if ( $.isFunction( msg ) ) {
+               return msg();
+       }
+       return msg;
+};
+
+} )();
+
+// Add more as you need
+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
+};
+/**
+ * DOM element abstraction.
+ *
+ * @class
+ * @abstract
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {Function} [$] jQuery for the frame the widget is in
+ * @cfg {string[]} [classes] CSS class names
+ * @cfg {jQuery} [$content] Content elements to append
+ */
+OO.ui.Element = function OoUiElement( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Properties
+       this.$ = config.$ || OO.ui.Element.getJQuery( document );
+       this.$element = this.$( this.$.context.createElement( this.getTagName() ) );
+       this.elementGroup = null;
+
+       // Initialization
+       if ( $.isArray( config.classes ) ) {
+               this.$element.addClass( config.classes.join( ' ' ) );
+       }
+       if ( config.$content ) {
+               this.$element.append( config.$content );
+       }
+};
+
+/* Static Properties */
+
+/**
+ * @static
+ * @property
+ * @inheritable
+ */
+OO.ui.Element.static = {};
+
+/**
+ * HTML tag name.
+ *
+ * This may be ignored if getTagName is overridden.
+ *
+ * @static
+ * @property {string}
+ * @inheritable
+ */
+OO.ui.Element.static.tagName = 'div';
+
+/* Static Methods */
+
+/**
+ * Gets a jQuery function within a specific document.
+ *
+ * @static
+ * @param {jQuery|HTMLElement|HTMLDocument|Window} context Context to bind the function to
+ * @param {OO.ui.Frame} [frame] Frame of the document context
+ * @returns {Function} Bound jQuery function
+ */
+OO.ui.Element.getJQuery = function ( context, frame ) {
+       function wrapper( selector ) {
+               return $( selector, wrapper.context );
+       }
+
+       wrapper.context = this.getDocument( context );
+
+       if ( frame ) {
+               wrapper.frame = frame;
+       }
+
+       return wrapper;
+};
+
+/**
+ * Get the document of an element.
+ *
+ * @static
+ * @param {jQuery|HTMLElement|HTMLDocument|Window} obj Object to get the document for
+ * @returns {HTMLDocument} Document object
+ * @throws {Error} If context is invalid
+ */
+OO.ui.Element.getDocument = function ( obj ) {
+       var doc =
+               // jQuery - selections created "offscreen" won't have a context, so .context isn't reliable
+               ( obj[0] && obj[0].ownerDocument ) ||
+               // Empty jQuery selections might have a context
+               obj.context ||
+               // HTMLElement
+               obj.ownerDocument ||
+               // Window
+               obj.document ||
+               // HTMLDocument
+               ( obj.nodeType === 9 && obj );
+
+       if ( doc ) {
+               return doc;
+       }
+
+       throw new Error( 'Invalid context' );
+};
+
+/**
+ * Get the window of an element or document.
+ *
+ * @static
+ * @param {jQuery|HTMLElement|HTMLDocument|Window} obj Context to get the window for
+ * @returns {Window} Window object
+ */
+OO.ui.Element.getWindow = function ( obj ) {
+       var doc = this.getDocument( obj );
+       return doc.parentWindow || doc.defaultView;
+};
+
+/**
+ * Get the direction of an element or document.
+ *
+ * @static
+ * @param {jQuery|HTMLElement|HTMLDocument|Window} obj Context to get the direction for
+ * @returns {string} Text direction, either `ltr` or `rtl`
+ */
+OO.ui.Element.getDir = function ( obj ) {
+       var isDoc, isWin;
+
+       if ( obj instanceof jQuery ) {
+               obj = obj[0];
+       }
+       isDoc = obj.nodeType === 9;
+       isWin = obj.document !== undefined;
+       if ( isDoc || isWin ) {
+               if ( isWin ) {
+                       obj = obj.document;
+               }
+               obj = obj.body;
+       }
+       return $( obj ).css( 'direction' );
+};
+
+/**
+ * Get the offset between two frames.
+ *
+ * TODO: Make this function not use recursion.
+ *
+ * @static
+ * @param {Window} from Window of the child frame
+ * @param {Window} [to=window] Window of the parent frame
+ * @param {Object} [offset] Offset to start with, used internally
+ * @returns {Object} Offset object, containing left and top properties
+ */
+OO.ui.Element.getFrameOffset = function ( from, to, offset ) {
+       var i, len, frames, frame, rect;
+
+       if ( !to ) {
+               to = window;
+       }
+       if ( !offset ) {
+               offset = { 'top': 0, 'left': 0 };
+       }
+       if ( from.parent === from ) {
+               return offset;
+       }
+
+       // Get iframe element
+       frames = from.parent.document.getElementsByTagName( 'iframe' );
+       for ( i = 0, len = frames.length; i < len; i++ ) {
+               if ( frames[i].contentWindow === from ) {
+                       frame = frames[i];
+                       break;
+               }
+       }
+
+       // Recursively accumulate offset values
+       if ( frame ) {
+               rect = frame.getBoundingClientRect();
+               offset.left += rect.left;
+               offset.top += rect.top;
+               if ( from !== to ) {
+                       this.getFrameOffset( from.parent, offset );
+               }
+       }
+       return offset;
+};
+
+/**
+ * Get the offset between two elements.
+ *
+ * @static
+ * @param {jQuery} $from
+ * @param {jQuery} $to
+ * @returns {Object} Translated position coordinates, containing top and left properties
+ */
+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 ) };
+};
+
+/**
+ * Get element border sizes.
+ *
+ * @static
+ * @param {HTMLElement} el Element to measure
+ * @return {Object} Dimensions object with `top`, `left`, `bottom` and `right` properties
+ */
+OO.ui.Element.getBorders = function ( el ) {
+       var doc = el.ownerDocument,
+               win = doc.parentWindow || doc.defaultView,
+               style = win && win.getComputedStyle ?
+                       win.getComputedStyle( el, null ) :
+                       el.currentStyle,
+               $el = $( el ),
+               top = parseFloat( style ? style.borderTopWidth : $el.css( 'borderTopWidth' ) ) || 0,
+               left = parseFloat( style ? style.borderLeftWidth : $el.css( 'borderLeftWidth' ) ) || 0,
+               bottom = parseFloat( style ? style.borderBottomWidth : $el.css( 'borderBottomWidth' ) ) || 0,
+               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 )
+       };
+};
+
+/**
+ * Get dimensions of an element or window.
+ *
+ * @static
+ * @param {HTMLElement|Window} el Element to measure
+ * @return {Object} Dimensions object with `borders`, `scroll`, `scrollbar` and `rect` properties
+ */
+OO.ui.Element.getDimensions = function ( el ) {
+       var $el, $win,
+               doc = el.ownerDocument || el.document,
+               win = doc.parentWindow || doc.defaultView;
+
+       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()
+                       },
+                       '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()
+                       },
+                       'scrollbar': {
+                               'right': $el.innerWidth() - el.clientWidth,
+                               'bottom': $el.innerHeight() - el.clientHeight
+                       },
+                       'rect': el.getBoundingClientRect()
+               };
+       }
+};
+
+/**
+ * Get closest scrollable container.
+ *
+ * Traverses up until either a scrollable element or the root is reached, in which case the window
+ * will be returned.
+ *
+ * @static
+ * @param {HTMLElement} el Element to find scrollable container for
+ * @param {string} [dimension] Dimension of scrolling to look for; `x`, `y` or omit for either
+ * @return {HTMLElement|Window} Closest scrollable container
+ */
+OO.ui.Element.getClosestScrollableContainer = function ( el, dimension ) {
+       var i, val,
+               props = [ 'overflow' ],
+               $parent = $( el ).parent();
+
+       if ( dimension === 'x' || dimension === 'y' ) {
+               props.push( 'overflow-' + dimension );
+       }
+
+       while ( $parent.length ) {
+               if ( $parent[0] === el.ownerDocument.body ) {
+                       return $parent[0];
+               }
+               i = props.length;
+               while ( i-- ) {
+                       val = $parent.css( props[i] );
+                       if ( val === 'auto' || val === 'scroll' ) {
+                               return $parent[0];
+                       }
+               }
+               $parent = $parent.parent();
+       }
+       return this.getDocument( el ).body;
+};
+
+/**
+ * Scroll element into view
+ *
+ * @static
+ * @param {HTMLElement} el Element to scroll into view
+ * @param {Object} [config={}] Configuration config
+ * @param {string} [config.duration] jQuery animation duration value
+ * @param {string} [config.direction] Scroll in only one direction, e.g. 'x' or 'y', omit
+ *  to scroll in both directions
+ * @param {Function} [config.complete] Function to call when scrolling completes
+ */
+OO.ui.Element.scrollIntoView = function ( el, config ) {
+       // Configuration initialization
+       config = config || {};
+
+       var anim = {},
+               callback = typeof config.complete === 'function' && config.complete,
+               sc = this.getClosestScrollableContainer( el, config.direction ),
+               $sc = $( sc ),
+               eld = this.getDimensions( el ),
+               scd = this.getDimensions( sc ),
+               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
+               };
+
+       if ( !config.direction || config.direction === 'y' ) {
+               if ( rel.top < 0 ) {
+                       anim.scrollTop = scd.scroll.top + rel.top;
+               } else if ( rel.top > 0 && rel.bottom < 0 ) {
+                       anim.scrollTop = scd.scroll.top + Math.min( rel.top, -rel.bottom );
+               }
+       }
+       if ( !config.direction || config.direction === 'x' ) {
+               if ( rel.left < 0 ) {
+                       anim.scrollLeft = scd.scroll.left + rel.left;
+               } else if ( rel.left > 0 && rel.right < 0 ) {
+                       anim.scrollLeft = scd.scroll.left + Math.min( rel.left, -rel.right );
+               }
+       }
+       if ( !$.isEmptyObject( anim ) ) {
+               $sc.stop( true ).animate( anim, config.duration || 'fast' );
+               if ( callback ) {
+                       $sc.queue( function ( next ) {
+                               callback();
+                               next();
+                       } );
+               }
+       } else {
+               if ( callback ) {
+                       callback();
+               }
+       }
+};
+
+/* Methods */
+
+/**
+ * Get the HTML tag name.
+ *
+ * Override this method to base the result on instance information.
+ *
+ * @returns {string} HTML tag name
+ */
+OO.ui.Element.prototype.getTagName = function () {
+       return this.constructor.static.tagName;
+};
+
+/**
+ * Get the DOM document.
+ *
+ * @returns {HTMLDocument} Document object
+ */
+OO.ui.Element.prototype.getElementDocument = function () {
+       return OO.ui.Element.getDocument( this.$element );
+};
+
+/**
+ * Get the DOM window.
+ *
+ * @returns {Window} Window object
+ */
+OO.ui.Element.prototype.getElementWindow = function () {
+       return OO.ui.Element.getWindow( this.$element );
+};
+
+/**
+ * Get closest scrollable container.
+ *
+ * @method
+ * @see #static-method-getClosestScrollableContainer
+ */
+OO.ui.Element.prototype.getClosestScrollableElementContainer = function () {
+       return OO.ui.Element.getClosestScrollableContainer( this.$element[0] );
+};
+
+/**
+ * Get group element is in.
+ *
+ * @returns {OO.ui.GroupElement|null} Group element, null if none
+ */
+OO.ui.Element.prototype.getElementGroup = function () {
+       return this.elementGroup;
+};
+
+/**
+ * Set group element is in.
+ *
+ * @param {OO.ui.GroupElement|null} group Group element, null if none
+ * @chainable
+ */
+OO.ui.Element.prototype.setElementGroup = function ( group ) {
+       this.elementGroup = group;
+       return this;
+};
+
+/**
+ * Scroll element into view
+ *
+ * @method
+ * @see #static-method-scrollIntoView
+ * @param {Object} [config={}]
+ */
+OO.ui.Element.prototype.scrollElementIntoView = function ( config ) {
+       return OO.ui.Element.scrollIntoView( this.$element[0], config );
+};
+
+( function () {
+       // Static
+       var specialFocusin;
+
+       function handler( e ) {
+               jQuery.event.simulate( 'focusin', e.target, jQuery.event.fix( e ), /* bubble = */ true );
+       }
+
+       specialFocusin = {
+               setup: function () {
+                       var doc = this.ownerDocument || this,
+                               attaches = $.data( doc, 'ooui-focusin-attaches' );
+                       if ( !attaches ) {
+                               doc.addEventListener( 'focus', handler, true );
+                       }
+                       $.data( doc, 'ooui-focusin-attaches', ( attaches || 0 ) + 1 );
+               },
+               teardown: function () {
+                       var doc = this.ownerDocument || this,
+                               attaches = $.data( doc, 'ooui-focusin-attaches' ) - 1;
+                       if ( !attaches ) {
+                               doc.removeEventListener( 'focus', handler, true );
+                               $.removeData( doc, 'ooui-focusin-attaches' );
+                       } else {
+                               $.data( doc, 'ooui-focusin-attaches', attaches );
+                       }
+               }
+       };
+
+       /**
+        * Bind a handler for an event on the DOM element.
+        *
+        * Uses jQuery internally for everything except for events which are
+        * known to have issues in the browser or in jQuery. This method
+        * should become obsolete eventually.
+        *
+        * @param {string} event
+        * @param {Function} callback
+        */
+       OO.ui.Element.prototype.onDOMEvent = function ( event, callback ) {
+               var orig;
+
+               if ( event === 'focusin' ) {
+                       // jQuery 1.8.3 has a bug with handling focusin events inside iframes.
+                       // Firefox doesn't support focusin at all, so we listen for 'focus' on the
+                       // document, and simulate a 'focusin' event on the target element and make
+                       // it bubble from there.
+                       //
+                       // - http://jsfiddle.net/sw3hr/
+                       // - http://bugs.jquery.com/ticket/14180
+                       // - https://github.com/jquery/jquery/commit/1cecf64e5aa4153
+
+                       // Replace jQuery's override with our own
+                       orig = $.event.special.focusin;
+                       $.event.special.focusin = specialFocusin;
+
+                       this.$element.on( event, callback );
+
+                       // Restore
+                       $.event.special.focusin = orig;
+
+               } else {
+                       this.$element.on( event, callback );
+               }
+       };
+
+       /**
+        * @param {string} event
+        * @param {Function} callback
+        */
+       OO.ui.Element.prototype.offDOMEvent = function ( event, callback ) {
+               var orig;
+               if ( event === 'focusin' ) {
+                       orig = $.event.special.focusin;
+                       $.event.special.focusin = specialFocusin;
+                       this.$element.off( event, callback );
+                       $.event.special.focusin = orig;
+               } else {
+                       this.$element.off( event, callback );
+               }
+       };
+}() );
+/**
+ * Embedded iframe with the same styles as its parent.
+ *
+ * @class
+ * @extends OO.ui.Element
+ * @mixins OO.EventEmitter
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.Frame = function OoUiFrame( config ) {
+       // Parent constructor
+       OO.ui.Element.call( this, config );
+
+       // Mixin constructors
+       OO.EventEmitter.call( this );
+
+       // Properties
+       this.initialized = false;
+       this.config = config;
+
+       // Initialize
+       this.$element
+               .addClass( 'oo-ui-frame' )
+               .attr( { 'frameborder': 0, 'scrolling': 'no' } );
+
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.Frame, OO.ui.Element );
+
+OO.mixinClass( OO.ui.Frame, OO.EventEmitter );
+
+/* Static Properties */
+
+OO.ui.Frame.static.tagName = 'iframe';
+
+/* Events */
+
+/**
+ * @event initialize
+ */
+
+/* Static Methods */
+
+/**
+ * Transplant the CSS styles from as parent document to a frame's document.
+ *
+ * This loops over the style sheets in the parent document, and copies their nodes to the
+ * frame's document. It then polls the document to see when all styles have loaded, and once they
+ * have, invokes the callback.
+ *
+ * If the styles still haven't loaded after a long time (5 seconds by default), we give up waiting
+ * and invoke the callback anyway. This protects against cases like a display: none; iframe in
+ * Firefox, where the styles won't load until the iframe becomes visible.
+ *
+ * For details of how we arrived at the strategy used in this function, see #load.
+ *
+ * @static
+ * @method
+ * @inheritable
+ * @param {HTMLDocument} parentDoc Document to transplant styles from
+ * @param {HTMLDocument} frameDoc Document to transplant styles to
+ * @param {Function} [callback] Callback to execute once styles have loaded
+ * @param {number} [timeout=5000] How long to wait before giving up (in ms). If 0, never give up.
+ */
+OO.ui.Frame.static.transplantStyles = function ( parentDoc, frameDoc, callback, timeout ) {
+       var i, numSheets, styleNode, newNode, timeoutID, pollNodeId, $pendingPollNodes,
+               $pollNodes = $( [] ),
+               // Fake font-family value
+               fontFamily = 'oo-ui-frame-transplantStyles-loaded';
+
+       for ( i = 0, numSheets = parentDoc.styleSheets.length; i < numSheets; i++ ) {
+               styleNode = parentDoc.styleSheets[i].ownerNode;
+               if ( callback && styleNode.nodeName.toLowerCase() === 'link' ) {
+                       // External stylesheet
+                       // Create a node with a unique ID that we're going to monitor to see when the CSS
+                       // has loaded
+                       pollNodeId = 'oo-ui-frame-transplantStyles-loaded-' + i;
+                       $pollNodes = $pollNodes.add( $( '<div>', frameDoc )
+                               .attr( 'id', pollNodeId )
+                               .appendTo( frameDoc.body )
+                       );
+
+                       // Add <style>@import url(...); #pollNodeId { font-family: ... }</style>
+                       // The font-family rule will only take effect once the @import finishes
+                       newNode = frameDoc.createElement( 'style' );
+                       newNode.textContent = '@import url(' + styleNode.href + ');\n' +
+                               '#' + pollNodeId + ' { font-family: ' + fontFamily + '; }';
+               } else {
+                       // Not an external stylesheet, or no polling required; just copy the node over
+                       newNode = frameDoc.importNode( styleNode, true );
+               }
+               frameDoc.head.appendChild( newNode );
+       }
+
+       if ( callback ) {
+               // Poll every 100ms until all external stylesheets have loaded
+               $pendingPollNodes = $pollNodes;
+               timeoutID = setTimeout( function pollExternalStylesheets() {
+                       while (
+                               $pendingPollNodes.length > 0 &&
+                               $pendingPollNodes.eq( 0 ).css( 'font-family' ) === fontFamily
+                       ) {
+                               $pendingPollNodes = $pendingPollNodes.slice( 1 );
+                       }
+
+                       if ( $pendingPollNodes.length === 0 ) {
+                               // We're done!
+                               if ( timeoutID !== null ) {
+                                       timeoutID = null;
+                                       $pollNodes.remove();
+                                       callback();
+                               }
+                       } else {
+                               timeoutID = setTimeout( pollExternalStylesheets, 100 );
+                       }
+               }, 100 );
+               // ...but give up after a while
+               if ( timeout !== 0 ) {
+                       setTimeout( function () {
+                               if ( timeoutID ) {
+                                       clearTimeout( timeoutID );
+                                       timeoutID = null;
+                                       $pollNodes.remove();
+                                       callback();
+                               }
+                       }, timeout || 5000 );
+               }
+       }
+};
+
+/* Methods */
+
+/**
+ * Load the frame contents.
+ *
+ * Once the iframe's stylesheets are loaded, the `initialize` event will be emitted.
+ *
+ * Sounds simple right? Read on...
+ *
+ * When you create a dynamic iframe using open/write/close, the window.load event for the
+ * iframe is triggered when you call close, and there's no further load event to indicate that
+ * everything is actually loaded.
+ *
+ * In Chrome, stylesheets don't show up in document.styleSheets until they have loaded, so we could
+ * just poll that array and wait for it to have the right length. However, in Firefox, stylesheets
+ * are added to document.styleSheets immediately, and the only way you can determine whether they've
+ * loaded is to attempt to access .cssRules and wait for that to stop throwing an exception. But
+ * cross-domain stylesheets never allow .cssRules to be accessed even after they have loaded.
+ *
+ * The workaround is to change all `<link href="...">` tags to `<style>@import url(...)</style>` tags.
+ * Because `@import` is blocking, Chrome won't add the stylesheet to document.styleSheets until
+ * the `@import` has finished, and Firefox won't allow .cssRules to be accessed until the `@import`
+ * has finished. And because the contents of the `<style>` tag are from the same origin, accessing
+ * .cssRules is allowed.
+ *
+ * However, now that we control the styles we're injecting, we might as well do away with
+ * browser-specific polling hacks like document.styleSheets and .cssRules, and instead inject
+ * `<style>@import url(...); #foo { font-family: someValue; }</style>`, then create `<div id="foo">`
+ * and wait for its font-family to change to someValue. Because `@import` is blocking, the font-family
+ * rule is not applied until after the `@import` finishes.
+ *
+ * All this stylesheet injection and polling magic is in #transplantStyles.
+ *
+ * @fires initialize
+ */
+OO.ui.Frame.prototype.load = function () {
+       var win = this.$element.prop( 'contentWindow' ),
+               doc = win.document,
+               frame = this;
+
+       // Figure out directionality:
+       this.dir = this.$element.closest( '[dir]' ).prop( 'dir' ) || 'ltr';
+
+       // Initialize contents
+       doc.open();
+       doc.write(
+               '<!doctype html>' +
+               '<html>' +
+                       '<body class="oo-ui-frame-body oo-ui-' + this.dir + '" style="direction:' + this.dir + ';" dir="' + this.dir + '">' +
+                               '<div class="oo-ui-frame-content"></div>' +
+                       '</body>' +
+               '</html>'
+       );
+       doc.close();
+
+       // Properties
+       this.$ = OO.ui.Element.getJQuery( doc, this );
+       this.$content = this.$( '.oo-ui-frame-content' );
+       this.$document = this.$( doc );
+
+       this.constructor.static.transplantStyles( this.getElementDocument(), this.$document[0],
+               function () {
+                       frame.initialized = true;
+                       frame.emit( 'initialize' );
+               }
+       );
+};
+
+/**
+ * Run a callback as soon as the frame has been initialized.
+ *
+ * @param {Function} callback
+ */
+OO.ui.Frame.prototype.run = function ( callback ) {
+       if ( this.initialized ) {
+               callback();
+       } else {
+               this.once( 'initialize', callback );
+       }
+};
+
+/**
+ * Sets the size of the frame.
+ *
+ * @method
+ * @param {number} width Frame width in pixels
+ * @param {number} height Frame height in pixels
+ * @chainable
+ */
+OO.ui.Frame.prototype.setSize = function ( width, height ) {
+       this.$element.css( { 'width': width, 'height': height } );
+       return this;
+};
+/**
+ * Container for elements in a child frame.
+ *
+ * There are two ways to specify a title: set the static `title` property or provide a `title`
+ * property in the configuration options. The latter will override the former.
+ *
+ * @class
+ * @abstract
+ * @extends OO.ui.Element
+ * @mixins OO.EventEmitter
+ *
+ * @constructor
+ * @param {OO.ui.WindowSet} windowSet Window set this dialog is part of
+ * @param {Object} [config] Configuration options
+ * @cfg {string|Function} [title] Title string or function that returns a string
+ * @cfg {string} [icon] Symbolic name of icon
+ * @fires initialize
+ */
+OO.ui.Window = function OoUiWindow( windowSet, config ) {
+       // Parent constructor
+       OO.ui.Element.call( this, config );
+
+       // Mixin constructors
+       OO.EventEmitter.call( this );
+
+       // Properties
+       this.windowSet = windowSet;
+       this.visible = false;
+       this.opening = false;
+       this.closing = false;
+       this.title = OO.ui.resolveMsg( config.title || this.constructor.static.title );
+       this.icon = config.icon || this.constructor.static.icon;
+       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.' );
+       };
+
+       // Initialization
+       this.$element
+               .addClass( 'oo-ui-window' )
+               // Hide the window using visibility: hidden; while the iframe is still loading
+               // Can't use display: none; because that prevents the iframe from loading in Firefox
+               .css( 'visibility', 'hidden' )
+               .append( this.$frame );
+       this.$frame
+               .addClass( 'oo-ui-window-frame' )
+               .append( this.frame.$element );
+
+       // Events
+       this.frame.connect( this, { 'initialize': 'initialize' } );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.Window, OO.ui.Element );
+
+OO.mixinClass( OO.ui.Window, OO.EventEmitter );
+
+/* Events */
+
+/**
+ * Initialize contents.
+ *
+ * Fired asynchronously after construction when iframe is ready.
+ *
+ * @event initialize
+ */
+
+/**
+ * Open window.
+ *
+ * Fired after window has been opened.
+ *
+ * @event open
+ * @param {Object} data Window opening data
+ */
+
+/**
+ * Close window.
+ *
+ * Fired after window has been closed.
+ *
+ * @event close
+ * @param {Object} data Window closing data
+ */
+
+/* Static Properties */
+
+/**
+ * Symbolic name of icon.
+ *
+ * @static
+ * @inheritable
+ * @property {string}
+ */
+OO.ui.Window.static.icon = 'window';
+
+/**
+ * Window title.
+ *
+ * @static
+ * @inheritable
+ * @property {string|Function} Title string or function that returns a string
+ */
+OO.ui.Window.static.title = null;
+
+/* Methods */
+
+/**
+ * Check if window is visible.
+ *
+ * @method
+ * @returns {boolean} Window is visible
+ */
+OO.ui.Window.prototype.isVisible = function () {
+       return this.visible;
+};
+
+/**
+ * Check if window is opening.
+ *
+ * @method
+ * @returns {boolean} Window is opening
+ */
+OO.ui.Window.prototype.isOpening = function () {
+       return this.opening;
+};
+
+/**
+ * Check if window is closing.
+ *
+ * @method
+ * @returns {boolean} Window is closing
+ */
+OO.ui.Window.prototype.isClosing = function () {
+       return this.closing;
+};
+
+/**
+ * Get the window frame.
+ *
+ * @method
+ * @returns {OO.ui.Frame} Frame of window
+ */
+OO.ui.Window.prototype.getFrame = function () {
+       return this.frame;
+};
+
+/**
+ * Get the window set.
+ *
+ * @method
+ * @returns {OO.ui.WindowSet} Window set
+ */
+OO.ui.Window.prototype.getWindowSet = function () {
+       return this.windowSet;
+};
+
+/**
+ * Get the window title.
+ *
+ * @returns {string} Title text
+ */
+OO.ui.Window.prototype.getTitle = function () {
+       return this.title;
+};
+
+/**
+ * Get the window icon.
+ *
+ * @returns {string} Symbolic name of icon
+ */
+OO.ui.Window.prototype.getIcon = function () {
+       return this.icon;
+};
+
+/**
+ * Set the size of window frame.
+ *
+ * @param {number} [width=auto] Custom width
+ * @param {number} [height=auto] Custom height
+ * @chainable
+ */
+OO.ui.Window.prototype.setSize = function ( width, height ) {
+       if ( !this.frame.$content ) {
+               return;
+       }
+
+       this.frame.$element.css( {
+               'width': width === undefined ? 'auto' : width,
+               'height': height === undefined ? 'auto' : height
+       } );
+
+       return this;
+};
+
+/**
+ * Set the title of the window.
+ *
+ * @param {string|Function} title Title text or a function that returns text
+ * @chainable
+ */
+OO.ui.Window.prototype.setTitle = function ( title ) {
+       this.title = OO.ui.resolveMsg( title );
+       if ( this.$title ) {
+               this.$title.text( title );
+       }
+       return this;
+};
+
+/**
+ * Set the icon of the window.
+ *
+ * @param {string} icon Symbolic name of icon
+ * @chainable
+ */
+OO.ui.Window.prototype.setIcon = function ( icon ) {
+       if ( this.$icon ) {
+               this.$icon.removeClass( 'oo-ui-icon-' + this.icon );
+       }
+       this.icon = icon;
+       if ( this.$icon ) {
+               this.$icon.addClass( 'oo-ui-icon-' + this.icon );
+       }
+
+       return this;
+};
+
+/**
+ * Set the position of window to fit with contents..
+ *
+ * @param {string} left Left offset
+ * @param {string} top Top offset
+ * @chainable
+ */
+OO.ui.Window.prototype.setPosition = function ( left, top ) {
+       this.$element.css( { 'left': left, 'top': top } );
+       return this;
+};
+
+/**
+ * Set the height of window to fit with contents.
+ *
+ * @param {number} [min=0] Min height
+ * @param {number} [max] Max height (defaults to content's outer height)
+ * @chainable
+ */
+OO.ui.Window.prototype.fitHeightToContents = function ( min, max ) {
+       var height = this.frame.$content.outerHeight();
+
+       this.frame.$element.css(
+               'height', Math.max( min || 0, max === undefined ? height : Math.min( max, height ) )
+       );
+
+       return this;
+};
+
+/**
+ * Set the width of window to fit with contents.
+ *
+ * @param {number} [min=0] Min height
+ * @param {number} [max] Max height (defaults to content's outer width)
+ * @chainable
+ */
+OO.ui.Window.prototype.fitWidthToContents = function ( min, max ) {
+       var width = this.frame.$content.outerWidth();
+
+       this.frame.$element.css(
+               'width', Math.max( min || 0, max === undefined ? width : Math.min( max, width ) )
+       );
+
+       return this;
+};
+
+/**
+ * Initialize window contents.
+ *
+ * The first time the window is opened, #initialize is called when it's safe to begin populating
+ * its contents. See #setup for a way to make changes each time the window opens.
+ *
+ * Once this method is called, this.$$ can be used to create elements within the frame.
+ *
+ * @method
+ * @fires initialize
+ * @chainable
+ */
+OO.ui.Window.prototype.initialize = function () {
+       // Properties
+       this.$ = this.frame.$;
+       this.$title = this.$( '<div class="oo-ui-window-title"></div>' )
+               .text( this.title );
+       this.$icon = this.$( '<div class="oo-ui-window-icon"></div>' )
+               .addClass( 'oo-ui-icon-' + this.icon );
+       this.$head = this.$( '<div class="oo-ui-window-head"></div>' );
+       this.$body = this.$( '<div class="oo-ui-window-body"></div>' );
+       this.$foot = this.$( '<div class="oo-ui-window-foot"></div>' );
+       this.$overlay = this.$( '<div class="oo-ui-window-overlay"></div>' );
+
+       // Initialization
+       this.frame.$content.append(
+               this.$head.append( this.$icon, this.$title ),
+               this.$body,
+               this.$foot,
+               this.$overlay
+       );
+
+       // Undo the visibility: hidden; hack from the constructor and apply display: none;
+       // We can do this safely now that the iframe has initialized
+       this.$element.hide().css( 'visibility', '' );
+
+       this.emit( 'initialize' );
+
+       return this;
+};
+
+/**
+ * Setup window for use.
+ *
+ * Each time the window is opened, once it's ready to be interacted with, this will set it up for
+ * use in a particular context, based on the `data` argument.
+ *
+ * When you override this method, you must call the parent method at the very beginning.
+ *
+ * @method
+ * @abstract
+ * @param {Object} [data] Window opening data
+ */
+OO.ui.Window.prototype.setup = function () {
+       // Override to do something
+};
+
+/**
+ * Tear down window after use.
+ *
+ * Each time the window is closed, and it's done being interacted with, this will tear it down and
+ * do something with the user's interactions within the window, based on the `data` argument.
+ *
+ * When you override this method, you must call the parent method at the very end.
+ *
+ * @method
+ * @abstract
+ * @param {Object} [data] Window closing data
+ */
+OO.ui.Window.prototype.teardown = function () {
+       // Override to do something
+};
+
+/**
+ * Open window.
+ *
+ * Do not override this method. See #setup for a way to make changes each time the window opens.
+ *
+ * @method
+ * @param {Object} [data] Window opening data
+ * @fires open
+ * @chainable
+ */
+OO.ui.Window.prototype.open = function ( data ) {
+       if ( !this.opening && !this.closing && !this.visible ) {
+               this.opening = true;
+               this.frame.run( OO.ui.bind( function () {
+                       this.$element.show();
+                       this.visible = true;
+                       this.frame.$element.focus();
+                       this.emit( 'opening', data );
+                       this.setup( data );
+                       this.emit( 'open', data );
+                       this.opening = false;
+               }, this ) );
+       }
+
+       return this;
+};
+
+/**
+ * Close window.
+ *
+ * See #teardown for a way to do something each time the window closes.
+ *
+ * @method
+ * @param {Object} [data] Window closing data
+ * @fires close
+ * @chainable
+ */
+OO.ui.Window.prototype.close = function ( data ) {
+       if ( !this.opening && !this.closing && this.visible ) {
+               this.frame.$content.find( ':focus' ).blur();
+               this.closing = true;
+               this.$element.hide();
+               this.visible = false;
+               this.emit( 'closing', data );
+               this.teardown( data );
+               this.emit( 'close', data );
+               this.closing = false;
+       }
+
+       return this;
+};
+/**
+ * Set of mutually exclusive windows.
+ *
+ * @class
+ * @extends OO.ui.Element
+ * @mixins OO.EventEmitter
+ *
+ * @constructor
+ * @param {OO.Factory} factory Window factory
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.WindowSet = function OoUiWindowSet( factory, config ) {
+       // Parent constructor
+       OO.ui.Element.call( this, config );
+
+       // Mixin constructors
+       OO.EventEmitter.call( this );
+
+       // Properties
+       this.factory = factory;
+       this.windows = {};
+       this.currentWindow = null;
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-windowSet' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.WindowSet, OO.ui.Element );
+
+OO.mixinClass( OO.ui.WindowSet, OO.EventEmitter );
+
+/* Events */
+
+/**
+ * @event opening
+ * @param {OO.ui.Window} win Window that's being opened
+ * @param {Object} config Window opening information
+ */
+
+/**
+ * @event open
+ * @param {OO.ui.Window} win Window that's been opened
+ * @param {Object} config Window opening information
+ */
+
+/**
+ * @event closing
+ * @param {OO.ui.Window} win Window that's being closed
+ * @param {Object} config Window closing information
+ */
+
+/**
+ * @event close
+ * @param {OO.ui.Window} win Window that's been closed
+ * @param {Object} config Window closing information
+ */
+
+/* Methods */
+
+/**
+ * Handle a window that's being opened.
+ *
+ * @method
+ * @param {OO.ui.Window} win Window that's being opened
+ * @param {Object} [config] Window opening information
+ * @fires opening
+ */
+OO.ui.WindowSet.prototype.onWindowOpening = function ( win, config ) {
+       if ( this.currentWindow && this.currentWindow !== win ) {
+               this.currentWindow.close();
+       }
+       this.currentWindow = win;
+       this.emit( 'opening', win, config );
+};
+
+/**
+ * Handle a window that's been opened.
+ *
+ * @method
+ * @param {OO.ui.Window} win Window that's been opened
+ * @param {Object} [config] Window opening information
+ * @fires open
+ */
+OO.ui.WindowSet.prototype.onWindowOpen = function ( win, config ) {
+       this.emit( 'open', win, config );
+};
+
+/**
+ * Handle a window that's being closed.
+ *
+ * @method
+ * @param {OO.ui.Window} win Window that's being closed
+ * @param {Object} [config] Window closing information
+ * @fires closing
+ */
+OO.ui.WindowSet.prototype.onWindowClosing = function ( win, config ) {
+       this.currentWindow = null;
+       this.emit( 'closing', win, config );
+};
+
+/**
+ * Handle a window that's been closed.
+ *
+ * @method
+ * @param {OO.ui.Window} win Window that's been closed
+ * @param {Object} [config] Window closing information
+ * @fires close
+ */
+OO.ui.WindowSet.prototype.onWindowClose = function ( win, config ) {
+       this.emit( 'close', win, config );
+};
+
+/**
+ * Get the current window.
+ *
+ * @method
+ * @returns {OO.ui.Window} Current window
+ */
+OO.ui.WindowSet.prototype.getCurrentWindow = function () {
+       return this.currentWindow;
+};
+
+/**
+ * Return a given window.
+ *
+ * @param {string} name Symbolic name of window
+ * @return {OO.ui.Window} Window with specified name
+ */
+OO.ui.WindowSet.prototype.getWindow = function ( name ) {
+       var win;
+
+       if ( !this.factory.lookup( name ) ) {
+               throw new Error( 'Unknown window: ' + name );
+       }
+       if ( !( name in this.windows ) ) {
+               win = this.windows[name] = this.factory.create( name, this, { '$': this.$ } );
+               win.connect( this, {
+                       'opening': [ 'onWindowOpening', win ],
+                       'open': [ 'onWindowOpen', win ],
+                       'closing': [ 'onWindowClosing', win ],
+                       'close': [ 'onWindowClose', win ]
+               } );
+               this.$element.append( win.$element );
+               win.getFrame().load();
+       }
+       return this.windows[name];
+};
+/**
+ * Modal dialog box.
+ *
+ * @class
+ * @abstract
+ * @extends OO.ui.Window
+ *
+ * @constructor
+ * @param {OO.ui.WindowSet} windowSet Window set this dialog is part of
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [footless] Hide foot
+ * @cfg {boolean} [small] Make the dialog small
+ */
+OO.ui.Dialog = function OoUiDialog( windowSet, config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Window.call( this, windowSet, config );
+
+       // Properties
+       this.visible = false;
+       this.footless = !!config.footless;
+       this.small = !!config.small;
+       this.onWindowMouseWheelHandler = OO.ui.bind( this.onWindowMouseWheel, this );
+       this.onDocumentKeyDownHandler = OO.ui.bind( this.onDocumentKeyDown, this );
+
+       // Events
+       this.$element.on( 'mousedown', false );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-dialog' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.Dialog, OO.ui.Window );
+
+/* Static Properties */
+
+/**
+ * Symbolic name of dialog.
+ *
+ * @abstract
+ * @static
+ * @property {string}
+ * @inheritable
+ */
+OO.ui.Dialog.static.name = '';
+
+/* Methods */
+
+/**
+ * Handle close button click events.
+ *
+ * @method
+ */
+OO.ui.Dialog.prototype.onCloseButtonClick = function () {
+       this.close( { 'action': 'cancel' } );
+};
+
+/**
+ * Handle window mouse wheel events.
+ *
+ * @method
+ * @param {jQuery.Event} e Mouse wheel event
+ */
+OO.ui.Dialog.prototype.onWindowMouseWheel = function () {
+       return false;
+};
+
+/**
+ * Handle document key down events.
+ *
+ * @method
+ * @param {jQuery.Event} e Key down event
+ */
+OO.ui.Dialog.prototype.onDocumentKeyDown = function ( e ) {
+       switch ( e.which ) {
+               case OO.ui.Keys.PAGEUP:
+               case OO.ui.Keys.PAGEDOWN:
+               case OO.ui.Keys.END:
+               case OO.ui.Keys.HOME:
+               case OO.ui.Keys.LEFT:
+               case OO.ui.Keys.UP:
+               case OO.ui.Keys.RIGHT:
+               case OO.ui.Keys.DOWN:
+                       // Prevent any key events that might cause scrolling
+                       return false;
+       }
+};
+
+/**
+ * Handle frame document key down events.
+ *
+ * @method
+ * @param {jQuery.Event} e Key down event
+ */
+OO.ui.Dialog.prototype.onFrameDocumentKeyDown = function ( e ) {
+       if ( e.which === OO.ui.Keys.ESCAPE ) {
+               this.close( { 'action': 'cancel' } );
+               return false;
+       }
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.Dialog.prototype.initialize = function () {
+       // Parent method
+       OO.ui.Window.prototype.initialize.call( this );
+
+       // Properties
+       this.closeButton = new OO.ui.ButtonWidget( {
+               '$': this.$,
+               'frameless': true,
+               'icon': 'close',
+               'title': OO.ui.msg( 'ooui-dialog-action-close' )
+       } );
+
+       // Events
+       this.closeButton.connect( this, { 'click': 'onCloseButtonClick' } );
+       this.frame.$document.on( 'keydown', OO.ui.bind( this.onFrameDocumentKeyDown, this ) );
+
+       // Initialization
+       this.frame.$content.addClass( 'oo-ui-dialog-content' );
+       if ( this.footless ) {
+               this.frame.$content.addClass( 'oo-ui-dialog-content-footless' );
+       }
+       if ( this.small ) {
+               this.$frame.addClass( 'oo-ui-window-frame-small' );
+       }
+       this.closeButton.$element.addClass( 'oo-ui-window-closeButton' );
+       this.$head.append( this.closeButton.$element );
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.Dialog.prototype.setup = function ( data ) {
+       // Parent method
+       OO.ui.Window.prototype.setup.call( this, data );
+
+       // Prevent scrolling in top-level window
+       this.$( window ).on( 'mousewheel', this.onWindowMouseWheelHandler );
+       this.$( document ).on( 'keydown', this.onDocumentKeyDownHandler );
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.Dialog.prototype.teardown = function ( data ) {
+       // Parent method
+       OO.ui.Window.prototype.teardown.call( this, data );
+
+       // Allow scrolling in top-level window
+       this.$( window ).off( 'mousewheel', this.onWindowMouseWheelHandler );
+       this.$( document ).off( 'keydown', this.onDocumentKeyDownHandler );
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.Dialog.prototype.close = function ( data ) {
+       if ( !this.opening && !this.closing && this.visible ) {
+               // Trigger transition
+               this.$element.addClass( 'oo-ui-dialog-closing' );
+               // Allow transition to complete before actually closing
+               setTimeout( OO.ui.bind( function () {
+                       this.$element.removeClass( 'oo-ui-dialog-closing' );
+                       // Parent method
+                       OO.ui.Window.prototype.close.call( this, data );
+               }, this ), 250 );
+       }
+};
+/**
+ * Container for elements.
+ *
+ * @class
+ * @abstract
+ * @extends OO.ui.Element
+ * @mixins OO.EventEmitter
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.Layout = function OoUiLayout( config ) {
+       // Initialize config
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Element.call( this, config );
+
+       // Mixin constructors
+       OO.EventEmitter.call( this );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-layout' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.Layout, OO.ui.Element );
+
+OO.mixinClass( OO.ui.Layout, OO.EventEmitter );
+/**
+ * User interface control.
+ *
+ * @class
+ * @abstract
+ * @extends OO.ui.Element
+ * @mixins OO.EventEmitter
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [disabled=false] Disable
+ */
+OO.ui.Widget = function OoUiWidget( config ) {
+       // Initialize config
+       config = $.extend( { 'disabled': false }, config );
+
+       // Parent constructor
+       OO.ui.Element.call( this, config );
+
+       // Mixin constructors
+       OO.EventEmitter.call( this );
+
+       // Properties
+       this.disabled = null;
+       this.wasDisabled = null;
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-widget' );
+       this.setDisabled( !!config.disabled );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.Widget, OO.ui.Element );
+
+OO.mixinClass( OO.ui.Widget, OO.EventEmitter );
+
+/* Events */
+
+/**
+ * @event disable
+ * @param {boolean} disabled Widget is disabled
+ */
+
+/* Methods */
+
+/**
+ * Check if the widget is disabled.
+ *
+ * @method
+ * @param {boolean} Button is disabled
+ */
+OO.ui.Widget.prototype.isDisabled = function () {
+       return this.disabled;
+};
+
+/**
+ * Update the disabled state, in case of changes in parent widget.
+ *
+ * @method
+ * @chainable
+ */
+OO.ui.Widget.prototype.updateDisabled = function () {
+       this.setDisabled( this.disabled );
+       return this;
+};
+
+/**
+ * Set the disabled state of the widget.
+ *
+ * This should probably change the widgets's appearance and prevent it from being used.
+ *
+ * @method
+ * @param {boolean} disabled Disable widget
+ * @chainable
+ */
+OO.ui.Widget.prototype.setDisabled = function ( disabled ) {
+       var isDisabled;
+
+       this.disabled = !!disabled;
+       isDisabled = this.isDisabled();
+       if ( isDisabled !== this.wasDisabled ) {
+               this.$element.toggleClass( 'oo-ui-widget-disabled', isDisabled );
+               this.emit( 'disable', isDisabled );
+       }
+       this.wasDisabled = isDisabled;
+       return this;
+};
+/**
+ * Element with a button.
+ *
+ * @class
+ * @abstract
+ *
+ * @constructor
+ * @param {jQuery} $button Button node, assigned to #$button
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [frameless] Render button without a frame
+ * @cfg {number} [tabIndex] Button's tab index
+ */
+OO.ui.ButtonedElement = function OoUiButtonedElement( $button, config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Properties
+       this.$button = $button;
+       this.tabIndex = null;
+       this.active = false;
+       this.onMouseUpHandler = OO.ui.bind( this.onMouseUp, this );
+
+       // Events
+       this.$button.on( 'mousedown', OO.ui.bind( this.onMouseDown, this ) );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-buttonedElement' );
+       this.$button
+               .addClass( 'oo-ui-buttonedElement-button' )
+               .attr( 'role', 'button' )
+               .prop( 'tabIndex', config.tabIndex || 0 );
+       if ( config.frameless ) {
+               this.$element.addClass( 'oo-ui-buttonedElement-frameless' );
+       } else {
+               this.$element.addClass( 'oo-ui-buttonedElement-framed' );
+       }
+};
+
+/* Methods */
+
+/**
+ * Handles mouse down events.
+ *
+ * @method
+ * @param {jQuery.Event} e Mouse down event
+ */
+OO.ui.ButtonedElement.prototype.onMouseDown = function () {
+       this.tabIndex = this.$button.attr( 'tabIndex' );
+       // Remove the tab-index while the button is down to prevent the button from stealing focus
+       this.$button.removeAttr( 'tabIndex' );
+       this.getElementDocument().addEventListener( 'mouseup', this.onMouseUpHandler, true );
+};
+
+/**
+ * Handles mouse up events.
+ *
+ * @method
+ * @param {jQuery.Event} e Mouse up event
+ */
+OO.ui.ButtonedElement.prototype.onMouseUp = function () {
+       // Restore the tab-index after the button is up to restore the button's accesssibility
+       this.$button.attr( 'tabIndex', this.tabIndex );
+       this.getElementDocument().removeEventListener( 'mouseup', this.onMouseUpHandler, true );
+};
+
+/**
+ * Set active state.
+ *
+ * @method
+ * @param {boolean} [value] Make button active
+ * @chainable
+ */
+OO.ui.ButtonedElement.prototype.setActive = function ( value ) {
+       this.$element.toggleClass( 'oo-ui-buttonedElement-active', !!value );
+       return this;
+};
+/**
+ * Element that can be automatically clipped to visible boundaies.
+ *
+ * @class
+ * @abstract
+ *
+ * @constructor
+ * @param {jQuery} $clippable Nodes to clip, assigned to #$clippable
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.ClippableElement = function OoUiClippableElement( $clippable, config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Properties
+       this.$clippable = $clippable;
+       this.clipping = false;
+       this.clipped = false;
+       this.$clippableContainer = null;
+       this.$clippableScroller = null;
+       this.$clippableWindow = null;
+       this.idealWidth = null;
+       this.idealHeight = null;
+       this.onClippableContainerScrollHandler = OO.ui.bind( this.clip, this );
+       this.onClippableWindowResizeHandler = OO.ui.bind( this.clip, this );
+
+       // Initialization
+       this.$clippable.addClass( 'oo-ui-clippableElement-clippable' );
+};
+
+/* Methods */
+
+/**
+ * Set clipping.
+ *
+ * @method
+ * @param {boolean} value Enable clipping
+ * @chainable
+ */
+OO.ui.ClippableElement.prototype.setClipping = function ( value ) {
+       value = !!value;
+
+       if ( this.clipping !== value ) {
+               this.clipping = value;
+               if ( this.clipping ) {
+                       this.$clippableContainer = this.$( this.getClosestScrollableElementContainer() );
+                       // If the clippable container is the body, we have to listen to scroll events and check
+                       // jQuery.scrollTop on the window because of browser inconsistencies
+                       this.$clippableScroller = this.$clippableContainer.is( 'body' ) ?
+                               this.$( OO.ui.Element.getWindow( this.$clippableContainer ) ) :
+                               this.$clippableContainer;
+                       this.$clippableScroller.on( 'scroll', this.onClippableContainerScrollHandler );
+                       this.$clippableWindow = this.$( this.getElementWindow() )
+                               .on( 'resize', this.onClippableWindowResizeHandler );
+                       // Initial clip after visible
+                       setTimeout( OO.ui.bind( this.clip, this ) );
+               } else {
+                       this.$clippableContainer = null;
+                       this.$clippableScroller.off( 'scroll', this.onClippableContainerScrollHandler );
+                       this.$clippableScroller = null;
+                       this.$clippableWindow.off( 'resize', this.onClippableWindowResizeHandler );
+                       this.$clippableWindow = null;
+               }
+       }
+
+       return this;
+};
+
+/**
+ * Check if the element will be clipped to fit the visible area of the nearest scrollable container.
+ *
+ * @method
+ * @return {boolean} Element will be clipped to the visible area
+ */
+OO.ui.ClippableElement.prototype.isClipping = function () {
+       return this.clipping;
+};
+
+/**
+ * Check if the bottom or right of the element is being clipped by the nearest scrollable container.
+ *
+ * @method
+ * @return {boolean} Part of the element is being clipped
+ */
+OO.ui.ClippableElement.prototype.isClipped = function () {
+       return this.clipped;
+};
+
+/**
+ * Set the ideal size.
+ *
+ * @method
+ * @param {number|string} [width] Width as a number of pixels or CSS string with unit suffix
+ * @param {number|string} [height] Height as a number of pixels or CSS string with unit suffix
+ */
+OO.ui.ClippableElement.prototype.setIdealSize = function ( width, height ) {
+       this.idealWidth = width;
+       this.idealHeight = height;
+};
+
+/**
+ * Clip element to visible boundaries and allow scrolling when needed.
+ *
+ * Element will be clipped the bottom or right of the element is within 10px of the edge of, or
+ * overlapped by, the visible area of the nearest scrollable container.
+ *
+ * @method
+ * @chainable
+ */
+OO.ui.ClippableElement.prototype.clip = function () {
+       if ( !this.clipping ) {
+               // this.$clippableContainer and this.$clippableWindow are null, so the below will fail
+               return this;
+       }
+
+       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,
+               scrollTop = this.$clippableScroller.scrollTop(),
+               scrollLeft = this.$clippableScroller.scrollLeft(),
+               desiredWidth = ( ccOffset.left + scrollLeft + ccWidth ) - cOffset.left,
+               desiredHeight = ( ccOffset.top + scrollTop + ccHeight ) - cOffset.top,
+               naturalWidth = this.$clippable.prop( 'scrollWidth' ),
+               naturalHeight = this.$clippable.prop( 'scrollHeight' ),
+               clipWidth = desiredWidth < naturalWidth,
+               clipHeight = desiredHeight < naturalHeight;
+
+       if ( clipWidth ) {
+               this.$clippable.css( { 'overflow-x': 'auto', 'width': desiredWidth } );
+       } else {
+               this.$clippable.css( { 'overflow-x': '', 'width': this.idealWidth || '' } );
+       }
+       if ( clipHeight ) {
+               this.$clippable.css( { 'overflow-y': 'auto', 'height': desiredHeight } );
+       } else {
+               this.$clippable.css( { 'overflow-y': '', 'height': this.idealHeight || '' } );
+       }
+
+       this.clipped = clipWidth || clipHeight;
+
+       return this;
+};
+/**
+ * Element with named flags, used for styling, that can be added, removed and listed and checked.
+ *
+ * @class
+ * @abstract
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {string[]} [flags=[]] Styling flags, e.g. 'primary', 'destructive' or 'constructive'
+ */
+OO.ui.FlaggableElement = function OoUiFlaggableElement( config ) {
+       // Config initialization
+       config = config || {};
+
+       // Properties
+       this.flags = {};
+
+       // Initialization
+       this.setFlags( config.flags );
+};
+
+/* Methods */
+
+/**
+ * Check if a flag is set.
+ *
+ * @method
+ * @param {string} flag Flag name to check
+ * @returns {boolean} Has flag
+ */
+OO.ui.FlaggableElement.prototype.hasFlag = function ( flag ) {
+       return flag in this.flags;
+};
+
+/**
+ * Get the names of all flags.
+ *
+ * @method
+ * @returns {string[]} flags Flag names
+ */
+OO.ui.FlaggableElement.prototype.getFlags = function () {
+       return Object.keys( this.flags );
+};
+
+/**
+ * Add one or more flags.
+ *
+ * @method
+ * @param {string[]|Object.<string, boolean>} flags List of flags to add, or list of set/remove
+ *  values, keyed by flag name
+ * @chainable
+ */
+OO.ui.FlaggableElement.prototype.setFlags = function ( flags ) {
+       var i, len, flag,
+               classPrefix = 'oo-ui-flaggableElement-';
+
+       if ( $.isArray( flags ) ) {
+               for ( i = 0, len = flags.length; i < len; i++ ) {
+                       flag = flags[i];
+                       // Set
+                       this.flags[flag] = true;
+                       this.$element.addClass( classPrefix + flag );
+               }
+       } else if ( OO.isPlainObject( flags ) ) {
+               for ( flag in flags ) {
+                       if ( flags[flag] ) {
+                               // Set
+                               this.flags[flag] = true;
+                               this.$element.addClass( classPrefix + flag );
+                       } else {
+                               // Remove
+                               delete this.flags[flag];
+                               this.$element.removeClass( classPrefix + flag );
+                       }
+               }
+       }
+       return this;
+};
+/**
+ * Element containing a sequence of child elements.
+ *
+ * @class
+ * @abstract
+ *
+ * @constructor
+ * @param {jQuery} $group Container node, assigned to #$group
+ * @param {Object} [config] Configuration options
+ * @cfg {Object.<string,string>} [aggregations] Events to aggregate, keyed by item event name
+ */
+OO.ui.GroupElement = function OoUiGroupElement( $group, config ) {
+       // Configuration
+       config = config || {};
+
+       // Properties
+       this.$group = $group;
+       this.items = [];
+       this.$items = this.$( [] );
+       this.aggregate = !$.isEmptyObject( config.aggregations );
+       this.aggregations = config.aggregations || {};
+};
+
+/* Methods */
+
+/**
+ * Get items.
+ *
+ * @method
+ * @returns {OO.ui.Element[]} Items
+ */
+OO.ui.GroupElement.prototype.getItems = function () {
+       return this.items.slice( 0 );
+};
+
+/**
+ * Add items.
+ *
+ * @method
+ * @param {OO.ui.Element[]} items Item
+ * @param {number} [index] Index to insert items at
+ * @chainable
+ */
+OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
+       var i, len, item, event, events, currentIndex,
+               $items = this.$( [] );
+
+       for ( i = 0, len = items.length; i < len; i++ ) {
+               item = items[i];
+
+               // Check if item exists then remove it first, effectively "moving" it
+               currentIndex = $.inArray( item, this.items );
+               if ( currentIndex >= 0 ) {
+                       this.removeItems( [ item ] );
+                       // Adjust index to compensate for removal
+                       if ( currentIndex < index ) {
+                               index--;
+                       }
+               }
+               // Add the item
+               if ( this.aggregate ) {
+                       events = {};
+                       for ( event in this.aggregations ) {
+                               events[event] = [ 'emit', this.aggregations[event], item ];
+                       }
+                       item.connect( this, events );
+               }
+               item.setElementGroup( this );
+               $items = $items.add( item.$element );
+       }
+
+       if ( index === undefined || index < 0 || index >= this.items.length ) {
+               this.$group.append( $items );
+               this.items.push.apply( this.items, items );
+       } else if ( index === 0 ) {
+               this.$group.prepend( $items );
+               this.items.unshift.apply( this.items, items );
+       } else {
+               this.$items.eq( index ).before( $items );
+               this.items.splice.apply( this.items, [ index, 0 ].concat( items ) );
+       }
+
+       this.$items = this.$items.add( $items );
+
+       return this;
+};
+
+/**
+ * Remove items.
+ *
+ * Items will be detached, not removed, so they can be used later.
+ *
+ * @method
+ * @param {OO.ui.Element[]} items Items to remove
+ * @chainable
+ */
+OO.ui.GroupElement.prototype.removeItems = function ( items ) {
+       var i, len, item, index;
+
+       // Remove specific items
+       for ( i = 0, len = items.length; i < len; i++ ) {
+               item = items[i];
+               index = $.inArray( item, this.items );
+               if ( index !== -1 ) {
+                       if ( this.aggregate ) {
+                               item.disconnect( this );
+                       }
+                       item.setElementGroup( null );
+                       this.items.splice( index, 1 );
+                       item.$element.detach();
+                       this.$items = this.$items.not( item.$element );
+               }
+       }
+
+       return this;
+};
+
+/**
+ * Clear all items.
+ *
+ * Items will be detached, not removed, so they can be used later.
+ *
+ * @method
+ * @chainable
+ */
+OO.ui.GroupElement.prototype.clearItems = function () {
+       var i, len, item;
+
+       // Remove all items
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               item = this.items[i];
+               if ( this.aggregate ) {
+                       item.disconnect( this );
+               }
+               item.setElementGroup( null );
+       }
+       this.items = [];
+       this.$items.detach();
+       this.$items = this.$( [] );
+};
+/**
+ * Element containing an icon.
+ *
+ * @class
+ * @abstract
+ *
+ * @constructor
+ * @param {jQuery} $icon Icon node, assigned to #$icon
+ * @param {Object} [config] Configuration options
+ * @cfg {Object|string} [icon=''] Symbolic icon name, or map of icon names keyed by language ID;
+ *  use the 'default' key to specify the icon to be used when there is no icon in the user's
+ *  language
+ */
+OO.ui.IconedElement = function OoUiIconedElement( $icon, config ) {
+       // Config intialization
+       config = config || {};
+
+       // Properties
+       this.$icon = $icon;
+       this.icon = null;
+
+       // Initialization
+       this.$icon.addClass( 'oo-ui-iconedElement-icon' );
+       this.setIcon( config.icon || this.constructor.static.icon );
+};
+
+/* Static Properties */
+
+OO.ui.IconedElement.static = {};
+
+/**
+ * Icon.
+ *
+ * Value should be the unique portion of an icon CSS class name, such as 'up' for 'oo-ui-icon-up'.
+ *
+ * For i18n purposes, this property can be an object containing a `default` icon name property and
+ * additional icon names keyed by language code.
+ *
+ * Example of i18n icon definition:
+ *     { 'default': 'bold-a', 'en': 'bold-b', 'de': 'bold-f' }
+ *
+ * @static
+ * @inheritable
+ * @property {Object|string} Symbolic icon name, or map of icon names keyed by language ID;
+ *  use the 'default' key to specify the icon to be used when there is no icon in the user's
+ *  language
+ */
+OO.ui.IconedElement.static.icon = null;
+
+/* Methods */
+
+/**
+ * Set icon.
+ *
+ * @method
+ * @param {Object|string} icon Symbolic icon name, or map of icon names keyed by language ID;
+ *  use the 'default' key to specify the icon to be used when there is no icon in the user's
+ *  language
+ * @chainable
+ */
+OO.ui.IconedElement.prototype.setIcon = function ( icon ) {
+       icon = OO.isPlainObject( icon ) ? OO.ui.getLocalValue( icon, null, 'default' ) : icon;
+
+       if ( this.icon ) {
+               this.$icon.removeClass( 'oo-ui-icon-' + this.icon );
+       }
+       if ( typeof icon === 'string' ) {
+               icon = icon.trim();
+               if ( icon.length ) {
+                       this.$icon.addClass( 'oo-ui-icon-' + icon );
+                       this.icon = icon;
+               }
+       }
+       this.$element.toggleClass( 'oo-ui-iconedElement', !!this.icon );
+
+       return this;
+};
+
+/**
+ * Get icon.
+ *
+ * @method
+ * @returns {string} Icon
+ */
+OO.ui.IconedElement.prototype.getIcon = function () {
+       return this.icon;
+};
+/**
+ * Element containing an indicator.
+ *
+ * @class
+ * @abstract
+ *
+ * @constructor
+ * @param {jQuery} $indicator Indicator node, assigned to #$indicator
+ * @param {Object} [config] Configuration options
+ * @cfg {string} [indicator] Symbolic indicator name
+ * @cfg {string} [indicatorTitle] Indicator title text or a function that return text
+ */
+OO.ui.IndicatedElement = function OoUiIndicatedElement( $indicator, config ) {
+       // Config intialization
+       config = config || {};
+
+       // Properties
+       this.$indicator = $indicator;
+       this.indicator = null;
+       this.indicatorLabel = null;
+
+       // Initialization
+       this.$indicator.addClass( 'oo-ui-indicatedElement-indicator' );
+       this.setIndicator( config.indicator || this.constructor.static.indicator );
+       this.setIndicatorTitle( config.indicatorTitle  || this.constructor.static.indicatorTitle );
+};
+
+/* Static Properties */
+
+OO.ui.IndicatedElement.static = {};
+
+/**
+ * indicator.
+ *
+ * @static
+ * @inheritable
+ * @property {string|null} Symbolic indicator name or null for no indicator
+ */
+OO.ui.IndicatedElement.static.indicator = null;
+
+/**
+ * Indicator title.
+ *
+ * @static
+ * @inheritable
+ * @property {string|Function|null} Indicator title text, a function that return text or null for no
+ *  indicator title
+ */
+OO.ui.IndicatedElement.static.indicatorTitle = null;
+
+/* Methods */
+
+/**
+ * Set indicator.
+ *
+ * @method
+ * @param {string|null} indicator Symbolic name of indicator to use or null for no indicator
+ * @chainable
+ */
+OO.ui.IndicatedElement.prototype.setIndicator = function ( indicator ) {
+       if ( this.indicator ) {
+               this.$indicator.removeClass( 'oo-ui-indicator-' + this.indicator );
+               this.indicator = null;
+       }
+       if ( typeof indicator === 'string' ) {
+               indicator = indicator.trim();
+               if ( indicator.length ) {
+                       this.$indicator.addClass( 'oo-ui-indicator-' + indicator );
+                       this.indicator = indicator;
+               }
+       }
+       this.$element.toggleClass( 'oo-ui-indicatedElement', !!this.indicator );
+
+       return this;
+};
+
+/**
+ * Set indicator label.
+ *
+ * @method
+ * @param {string|Function|null} indicator Indicator title text, a function that return text or null
+ *  for no indicator title
+ * @chainable
+ */
+OO.ui.IndicatedElement.prototype.setIndicatorTitle = function ( indicatorTitle ) {
+       this.indicatorTitle = indicatorTitle = OO.ui.resolveMsg( indicatorTitle );
+
+       if ( typeof indicatorTitle === 'string' && indicatorTitle.length ) {
+               this.$indicator.attr( 'title', indicatorTitle );
+       } else {
+               this.$indicator.removeAttr( 'title' );
+       }
+
+       return this;
+};
+
+/**
+ * Get indicator.
+ *
+ * @method
+ * @returns {string} title Symbolic name of indicator
+ */
+OO.ui.IndicatedElement.prototype.getIndicator = function () {
+       return this.indicator;
+};
+
+/**
+ * Get indicator title.
+ *
+ * @method
+ * @returns {string} Indicator title text
+ */
+OO.ui.IndicatedElement.prototype.getIndicatorTitle = function () {
+       return this.indicatorTitle;
+};
+/**
+ * Element containing a label.
+ *
+ * @class
+ * @abstract
+ *
+ * @constructor
+ * @param {jQuery} $label Label node, assigned to #$label
+ * @param {Object} [config] Configuration options
+ * @cfg {jQuery|string|Function} [label] Label nodes, text or a function that returns nodes or text
+ */
+OO.ui.LabeledElement = function OoUiLabeledElement( $label, config ) {
+       // Config intialization
+       config = config || {};
+
+       // Properties
+       this.$label = $label;
+       this.label = null;
+
+       // Initialization
+       this.$label.addClass( 'oo-ui-labeledElement-label' );
+       this.setLabel( config.label || this.constructor.static.label );
+};
+
+/* Static Properties */
+
+OO.ui.LabeledElement.static = {};
+
+/**
+ * Label.
+ *
+ * @static
+ * @inheritable
+ * @property {string|Function|null} Label text; a function that returns a nodes or text; or null for
+ *  no label
+ */
+OO.ui.LabeledElement.static.label = null;
+
+/* Methods */
+
+/**
+ * Set the label.
+ *
+ * An empty string will result in the label being hidden. A string containing only whitespace will
+ * be converted to a single &nbsp;
+ *
+ * @method
+ * @param {jQuery|string|Function|null} label Label nodes; text; a function that retuns nodes or
+ *  text; or null for no label
+ * @chainable
+ */
+OO.ui.LabeledElement.prototype.setLabel = function ( label ) {
+       var empty = false;
+
+       this.label = label = OO.ui.resolveMsg( label ) || null;
+       if ( typeof label === 'string' && label.length ) {
+               if ( label.match( /^\s*$/ ) ) {
+                       // Convert whitespace only string to a single non-breaking space
+                       this.$label.html( '&nbsp;' );
+               } else {
+                       this.$label.text( label );
+               }
+       } else if ( label instanceof jQuery ) {
+               this.$label.empty().append( label );
+       } else {
+               this.$label.empty();
+               empty = true;
+       }
+       this.$element.toggleClass( 'oo-ui-labeledElement', !empty );
+       this.$label.css( 'display', empty ? 'none' : '' );
+
+       return this;
+};
+
+/**
+ * Get the label.
+ *
+ * @method
+ * @returns {jQuery|string|Function|null} label Label nodes; text; a function that returns nodes or
+ *  text; or null for no label
+ */
+OO.ui.LabeledElement.prototype.getLabel = function () {
+       return this.label;
+};
+
+/**
+ * Fit the label.
+ *
+ * @method
+ * @chainable
+ */
+OO.ui.LabeledElement.prototype.fitLabel = function () {
+       if ( this.$label.autoEllipsis ) {
+               this.$label.autoEllipsis( { 'hasSpan': false, 'tooltip': true } );
+       }
+       return this;
+};
+/**
+ * Popuppable element.
+ *
+ * @class
+ * @abstract
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {number} [popupWidth=320] Width of popup
+ * @cfg {number} [popupHeight] Height of popup
+ * @cfg {Object} [popup] Configuration to pass to popup
+ */
+OO.ui.PopuppableElement = function OoUiPopuppableElement( config ) {
+       // Configuration initialization
+       config = $.extend( { 'popupWidth': 320 }, config );
+
+       // Properties
+       this.popup = new OO.ui.PopupWidget( $.extend(
+               { 'align': 'center', 'autoClose': true },
+               config.popup,
+               { '$': this.$, '$autoCloseIgnore': this.$element }
+       ) );
+       this.popupWidth = config.popupWidth;
+       this.popupHeight = config.popupHeight;
+};
+
+/* Methods */
+
+/**
+ * Get popup.
+ *
+ * @method
+ * @returns {OO.ui.PopupWidget} Popup widget
+ */
+OO.ui.PopuppableElement.prototype.getPopup = function () {
+       return this.popup;
+};
+
+/**
+ * Show popup.
+ *
+ * @method
+ */
+OO.ui.PopuppableElement.prototype.showPopup = function () {
+       this.popup.show().display( this.popupWidth, this.popupHeight );
+};
+
+/**
+ * Hide popup.
+ *
+ * @method
+ */
+OO.ui.PopuppableElement.prototype.hidePopup = function () {
+       this.popup.hide();
+};
+/**
+ * Element with a title.
+ *
+ * @class
+ * @abstract
+ *
+ * @constructor
+ * @param {jQuery} $label Titled node, assigned to #$titled
+ * @param {Object} [config] Configuration options
+ * @cfg {string|Function} [title] Title text or a function that returns text
+ */
+OO.ui.TitledElement = function OoUiTitledElement( $titled, config ) {
+       // Config intialization
+       config = config || {};
+
+       // Properties
+       this.$titled = $titled;
+       this.title = null;
+
+       // Initialization
+       this.setTitle( config.title || this.constructor.static.title );
+};
+
+/* Static Properties */
+
+OO.ui.TitledElement.static = {};
+
+/**
+ * Title.
+ *
+ * @static
+ * @inheritable
+ * @property {string|Function} Title text or a function that returns text
+ */
+OO.ui.TitledElement.static.title = null;
+
+/* Methods */
+
+/**
+ * Set title.
+ *
+ * @method
+ * @param {string|Function|null} title Title text, a function that returns text or null for no title
+ * @chainable
+ */
+OO.ui.TitledElement.prototype.setTitle = function ( title ) {
+       this.title = title = OO.ui.resolveMsg( title ) || null;
+
+       if ( typeof title === 'string' && title.length ) {
+               this.$titled.attr( 'title', title );
+       } else {
+               this.$titled.removeAttr( 'title' );
+       }
+
+       return this;
+};
+
+/**
+ * Get title.
+ *
+ * @method
+ * @returns {string} Title string
+ */
+OO.ui.TitledElement.prototype.getTitle = function () {
+       return this.title;
+};
+/**
+ * Generic toolbar tool.
+ *
+ * @class
+ * @abstract
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.IconedElement
+ *
+ * @constructor
+ * @param {OO.ui.ToolGroup} toolGroup
+ * @param {Object} [config] Configuration options
+ * @cfg {string|Function} [title] Title text or a function that returns text
+ */
+OO.ui.Tool = function OoUiTool( toolGroup, config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Widget.call( this, config );
+
+       // Mixin constructors
+       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
+
+       // Properties
+       this.toolGroup = toolGroup;
+       this.toolbar = this.toolGroup.getToolbar();
+       this.active = false;
+       this.$title = this.$( '<span>' );
+       this.$link = this.$( '<a>' );
+       this.title = null;
+
+       // Events
+       this.toolbar.connect( this, { 'updateState': 'onUpdateState' } );
+
+       // Initialization
+       this.$title.addClass( 'oo-ui-tool-title' );
+       this.$link
+               .addClass( 'oo-ui-tool-link' )
+               .append( this.$icon, this.$title );
+       this.$element
+               .data( 'oo-ui-tool', this )
+               .addClass(
+                       'oo-ui-tool ' + 'oo-ui-tool-name-' +
+                       this.constructor.static.name.replace( /^([^\/]+)\/([^\/]+).*$/, '$1-$2' )
+               )
+               .append( this.$link );
+       this.setTitle( config.title || this.constructor.static.title );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.Tool, OO.ui.Widget );
+
+OO.mixinClass( OO.ui.Tool, OO.ui.IconedElement );
+
+/* Events */
+
+/**
+ * @event select
+ */
+
+/* Static Properties */
+
+OO.ui.Tool.static.tagName = 'span';
+
+/**
+ * Symbolic name of tool.
+ *
+ * @abstract
+ * @static
+ * @property {string}
+ * @inheritable
+ */
+OO.ui.Tool.static.name = '';
+
+/**
+ * Tool group.
+ *
+ * @abstract
+ * @static
+ * @property {string}
+ * @inheritable
+ */
+OO.ui.Tool.static.group = '';
+
+/**
+ * Tool title.
+ *
+ * Title is used as a tooltip when the tool is part of a bar tool group, or a label when the tool
+ * is part of a list or menu tool group. If a trigger is associated with an action by the same name
+ * as the tool, a description of its keyboard shortcut for the appropriate platform will be
+ * appended to the title if the tool is part of a bar tool group.
+ *
+ * @abstract
+ * @static
+ * @property {string|Function} Title text or a function that returns text
+ * @inheritable
+ */
+OO.ui.Tool.static.title = '';
+
+/**
+ * Tool can be automatically added to tool groups.
+ *
+ * @static
+ * @property {boolean}
+ * @inheritable
+ */
+OO.ui.Tool.static.autoAdd = true;
+
+/**
+ * Check if this tool is compatible with given data.
+ *
+ * @method
+ * @static
+ * @inheritable
+ * @param {Mixed} data Data to check
+ * @returns {boolean} Tool can be used with data
+ */
+OO.ui.Tool.static.isCompatibleWith = function () {
+       return false;
+};
+
+/* Methods */
+
+/**
+ * Handle the toolbar state being updated.
+ *
+ * This is an abstract method that must be overridden in a concrete subclass.
+ *
+ * @abstract
+ * @method
+ */
+OO.ui.Tool.prototype.onUpdateState = function () {
+       throw new Error(
+               'OO.ui.Tool.onUpdateState not implemented in this subclass:' + this.constructor
+       );
+};
+
+/**
+ * Handle the tool being selected.
+ *
+ * This is an abstract method that must be overridden in a concrete subclass.
+ *
+ * @abstract
+ * @method
+ */
+OO.ui.Tool.prototype.onSelect = function () {
+       throw new Error(
+               'OO.ui.Tool.onSelect not implemented in this subclass:' + this.constructor
+       );
+};
+
+/**
+ * Check if the button is active.
+ *
+ * @method
+ * @param {boolean} Button is active
+ */
+OO.ui.Tool.prototype.isActive = function () {
+       return this.active;
+};
+
+/**
+ * Make the button appear active or inactive.
+ *
+ * @method
+ * @param {boolean} state Make button appear active
+ */
+OO.ui.Tool.prototype.setActive = function ( state ) {
+       this.active = !!state;
+       if ( this.active ) {
+               this.$element.addClass( 'oo-ui-tool-active' );
+       } else {
+               this.$element.removeClass( 'oo-ui-tool-active' );
+       }
+};
+
+/**
+ * Get the tool title.
+ *
+ * @method
+ * @param {string|Function} title Title text or a function that returns text
+ * @chainable
+ */
+OO.ui.Tool.prototype.setTitle = function ( title ) {
+       this.title = OO.ui.resolveMsg( title );
+       this.updateTitle();
+       return this;
+};
+
+/**
+ * Get the tool title.
+ *
+ * @method
+ * @returns {string} Title text
+ */
+OO.ui.Tool.prototype.getTitle = function () {
+       return this.title;
+};
+
+/**
+ * Get the tool's symbolic name.
+ *
+ * @method
+ * @returns {string} Symbolic name of tool
+ */
+OO.ui.Tool.prototype.getName = function () {
+       return this.constructor.static.name;
+};
+
+/**
+ * Update the title.
+ *
+ * @method
+ */
+OO.ui.Tool.prototype.updateTitle = function () {
+       var titleTooltips = this.toolGroup.constructor.static.titleTooltips,
+               accelTooltips = this.toolGroup.constructor.static.accelTooltips,
+               accel = this.toolbar.getToolAccelerator( this.constructor.static.name ),
+               tooltipParts = [];
+
+       this.$title.empty()
+               .text( this.title )
+               .append(
+                       this.$( '<span>' )
+                               .addClass( 'oo-ui-tool-accel' )
+                               .text( accel )
+               );
+
+       if ( titleTooltips && typeof this.title === 'string' && this.title.length ) {
+               tooltipParts.push( this.title );
+       }
+       if ( accelTooltips && typeof accel === 'string' && accel.length ) {
+               tooltipParts.push( accel );
+       }
+       if ( tooltipParts.length ) {
+               this.$link.attr( 'title', tooltipParts.join( ' ' ) );
+       } else {
+               this.$link.removeAttr( 'title' );
+       }
+};
+
+/**
+ * Destroy tool.
+ *
+ * @method
+ */
+OO.ui.Tool.prototype.destroy = function () {
+       this.toolbar.disconnect( this );
+       this.$element.remove();
+};
+/**
+ * Collection of tool groups.
+ *
+ * @class
+ * @extends OO.ui.Element
+ * @mixins OO.EventEmitter
+ * @mixins OO.ui.GroupElement
+ *
+ * @constructor
+ * @param {OO.Factory} toolFactory Factory for creating tools
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [actions] Add an actions section opposite to the tools
+ * @cfg {boolean} [shadow] Add a shadow below the toolbar
+ */
+OO.ui.Toolbar = function OoUiToolbar( toolFactory, config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Element.call( this, config );
+
+       // Mixin constructors
+       OO.EventEmitter.call( this );
+       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
+
+       // Properties
+       this.toolFactory = toolFactory;
+       this.groups = [];
+       this.tools = {};
+       this.$bar = this.$( '<div>' );
+       this.$actions = this.$( '<div>' );
+       this.initialized = false;
+
+       // Events
+       this.$element
+               .add( this.$bar ).add( this.$group ).add( this.$actions )
+               .on( 'mousedown', OO.ui.bind( this.onMouseDown, this ) );
+
+       // Initialization
+       this.$group.addClass( 'oo-ui-toolbar-tools' );
+       this.$bar.addClass( 'oo-ui-toolbar-bar' ).append( this.$group );
+       if ( config.actions ) {
+               this.$actions.addClass( 'oo-ui-toolbar-actions' );
+               this.$bar.append( this.$actions );
+       }
+       this.$bar.append( '<div style="clear:both"></div>' );
+       if ( config.shadow ) {
+               this.$bar.append( '<div class="oo-ui-toolbar-shadow"></div>' );
+       }
+       this.$element.addClass( 'oo-ui-toolbar' ).append( this.$bar );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.Toolbar, OO.ui.Element );
+
+OO.mixinClass( OO.ui.Toolbar, OO.EventEmitter );
+OO.mixinClass( OO.ui.Toolbar, OO.ui.GroupElement );
+
+/* Methods */
+
+/**
+ * Get the tool factory.
+ *
+ * @method
+ * @returns {OO.Factory} Tool factory
+ */
+OO.ui.Toolbar.prototype.getToolFactory = function () {
+       return this.toolFactory;
+};
+
+/**
+ * Handles mouse down events.
+ *
+ * @method
+ * @param {jQuery.Event} e Mouse down event
+ */
+OO.ui.Toolbar.prototype.onMouseDown = 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] ) {
+               return false;
+       }
+};
+
+/**
+ * Sets up handles and preloads required information for the toolbar to work.
+ * This must be called immediately after it is attached to a visible document.
+ */
+OO.ui.Toolbar.prototype.initialize = function () {
+       this.initialized = true;
+};
+
+/**
+ * Setup toolbar.
+ *
+ * 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' }`
+ *  - All tools: `'*'` - Using this will make the group a list with a "More" label by default
+ *
+ * @method
+ * @param {Object.<string,Array>} groups List of tool group configurations
+ * @param {Array|string} [groups.include] Tools to include
+ * @param {Array|string} [groups.exclude] Tools to exclude
+ * @param {Array|string} [groups.promote] Tools to promote to the beginning
+ * @param {Array|string} [groups.demote] Tools to demote to the end
+ */
+OO.ui.Toolbar.prototype.setup = function ( groups ) {
+       var i, len, type, group,
+               items = [],
+               // TODO: Use a registry instead
+               defaultType = 'bar',
+               constructors = {
+                       'bar': OO.ui.BarToolGroup,
+                       'list': OO.ui.ListToolGroup,
+                       'menu': OO.ui.MenuToolGroup
+               };
+
+       // Cleanup previous groups
+       this.reset();
+
+       // Build out new groups
+       for ( i = 0, len = groups.length; i < len; i++ ) {
+               group = groups[i];
+               if ( group.include === '*' ) {
+                       // Apply defaults to catch-all groups
+                       if ( group.type === undefined ) {
+                               group.type = 'list';
+                       }
+                       if ( group.label === undefined ) {
+                               group.label = 'ooui-toolbar-more';
+                       }
+               }
+               type = constructors[group.type] ? group.type : defaultType;
+               items.push(
+                       new constructors[type]( this, $.extend( { '$': this.$ }, group ) )
+               );
+       }
+       this.addItems( items );
+};
+
+/**
+ * Remove all tools and groups from the toolbar.
+ */
+OO.ui.Toolbar.prototype.reset = function () {
+       var i, len;
+
+       this.groups = [];
+       this.tools = {};
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               this.items[i].destroy();
+       }
+       this.clearItems();
+};
+
+/**
+ * Destroys toolbar, removing event handlers and DOM elements.
+ *
+ * Call this whenever you are done using a toolbar.
+ */
+OO.ui.Toolbar.prototype.destroy = function () {
+       this.reset();
+       this.$element.remove();
+};
+
+/**
+ * Check if tool has not been used yet.
+ *
+ * @param {string} name Symbolic name of tool
+ * @return {boolean} Tool is available
+ */
+OO.ui.Toolbar.prototype.isToolAvailable = function ( name ) {
+       return !this.tools[name];
+};
+
+/**
+ * Prevent tool from being used again.
+ *
+ * @param {OO.ui.Tool} tool Tool to reserve
+ */
+OO.ui.Toolbar.prototype.reserveTool = function ( tool ) {
+       this.tools[tool.getName()] = tool;
+};
+
+/**
+ * Allow tool to be used again.
+ *
+ * @param {OO.ui.Tool} tool Tool to release
+ */
+OO.ui.Toolbar.prototype.releaseTool = function ( tool ) {
+       delete this.tools[tool.getName()];
+};
+
+/**
+ * Get accelerator label for tool.
+ *
+ * This is a stub that should be overridden to provide access to accelerator information.
+ *
+ * @param {string} name Symbolic name of tool
+ * @returns {string|undefined} Tool accelerator label if available
+ */
+OO.ui.Toolbar.prototype.getToolAccelerator = function () {
+       return undefined;
+};
+/**
+ * Factory for tools.
+ *
+ * @class
+ * @extends OO.Factory
+ * @constructor
+ */
+OO.ui.ToolFactory = function OoUiToolFactory() {
+       // Parent constructor
+       OO.Factory.call( this );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.ToolFactory, OO.Factory );
+
+/* Methods */
+
+OO.ui.ToolFactory.prototype.getTools = function ( include, exclude, promote, demote ) {
+       var i, len, included, promoted, demoted,
+               auto = [],
+               used = {};
+
+       // Collect included and not excluded tools
+       included = OO.simpleArrayDifference( this.extract( include ), this.extract( exclude ) );
+
+       // Promotion
+       promoted = this.extract( promote, used );
+       demoted = this.extract( demote, used );
+
+       // Auto
+       for ( i = 0, len = included.length; i < len; i++ ) {
+               if ( !used[included[i]] ) {
+                       auto.push( included[i] );
+               }
+       }
+
+       return promoted.concat( auto ).concat( demoted );
+};
+
+/**
+ * Get a flat list of names from a list of names or groups.
+ *
+ * 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' }`
+ *  - All tools: `'*'`
+ *
+ * @private
+ * @param {Array|string} collection List of tools
+ * @param {Object} [used] Object with names that should be skipped as properties; extracted
+ *   names will be added as properties
+ * @return {string[]} List of extracted names
+ */
+OO.ui.ToolFactory.prototype.extract = function ( collection, used ) {
+       var i, len, item, name, tool,
+               names = [];
+
+       if ( collection === '*' ) {
+               for ( name in this.registry ) {
+                       tool = this.registry[name];
+                       if (
+                               // Only add tools by group name when auto-add is enabled
+                               tool.static.autoAdd &&
+                               // Exclude already used tools
+                               ( !used || !used[name] )
+                       ) {
+                               names.push( name );
+                               if ( used ) {
+                                       used[name] = true;
+                               }
+                       }
+               }
+       } else if ( $.isArray( collection ) ) {
+               for ( i = 0, len = collection.length; i < len; i++ ) {
+                       item = collection[i];
+                       // Allow plain strings as shorthand for named tools
+                       if ( typeof item === 'string' ) {
+                               item = { 'name': item };
+                       }
+                       if ( OO.isPlainObject( item ) ) {
+                               if ( item.group ) {
+                                       for ( name in this.registry ) {
+                                               tool = this.registry[name];
+                                               if (
+                                                       // Include tools with matching group
+                                                       tool.static.group === item.group &&
+                                                       // Only add tools by group name when auto-add is enabled
+                                                       tool.static.autoAdd &&
+                                                       // Exclude already used tools
+                                                       ( !used || !used[name] )
+                                               ) {
+                                                       names.push( name );
+                                                       if ( used ) {
+                                                               used[name] = true;
+                                                       }
+                                               }
+                                       }
+                               }
+                               // Include tools with matching name and exclude already used tools
+                               else if ( item.name && ( !used || !used[item.name] ) ) {
+                                       names.push( item.name );
+                                       if ( used ) {
+                                               used[item.name] = true;
+                                       }
+                               }
+                       }
+               }
+       }
+       return names;
+};
+/**
+ * Collection of tools.
+ *
+ * @class
+ * @abstract
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.GroupElement
+ *
+ * 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' }`
+ *  - All tools: `'*'`
+ *
+ * @constructor
+ * @param {OO.ui.Toolbar} toolbar
+ * @param {Object} [config] Configuration options
+ * @cfg {Array|string} [include=[]] List of tools to include
+ * @cfg {Array|string} [exclude=[]] List of tools to exclude
+ * @cfg {Array|string} [promote=[]] List of tools to promote to the beginning
+ * @cfg {Array|string} [demote=[]] List of tools to demote to the end
+ */
+OO.ui.ToolGroup = function OoUiToolGroup( toolbar, config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Widget.call( this, config );
+
+       // Mixin constructors
+       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
+
+       // Properties
+       this.toolbar = toolbar;
+       this.tools = {};
+       this.pressed = null;
+       this.include = config.include || [];
+       this.exclude = config.exclude || [];
+       this.promote = config.promote || [];
+       this.demote = config.demote || [];
+       this.onCapturedMouseUpHandler = OO.ui.bind( this.onCapturedMouseUp, this );
+
+       // 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 )
+       } );
+       this.toolbar.getToolFactory().connect( this, { 'register': 'onToolFactoryRegister' } );
+
+       // Initialization
+       this.$group.addClass( 'oo-ui-toolGroup-tools' );
+       this.$element
+               .addClass( 'oo-ui-toolGroup' )
+               .append( this.$group );
+       this.populate();
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.ToolGroup, OO.ui.Widget );
+
+OO.mixinClass( OO.ui.ToolGroup, OO.ui.GroupElement );
+
+/* Events */
+
+/**
+ * @event update
+ */
+
+/* Static Properties */
+
+/**
+ * Show labels in tooltips.
+ *
+ * @static
+ * @property {boolean}
+ * @inheritable
+ */
+OO.ui.ToolGroup.static.titleTooltips = false;
+
+/**
+ * Show acceleration labels in tooltips.
+ *
+ * @static
+ * @property {boolean}
+ * @inheritable
+ */
+OO.ui.ToolGroup.static.accelTooltips = false;
+
+/* Methods */
+
+/**
+ * Handle mouse down events.
+ *
+ * @method
+ * @param {jQuery.Event} e Mouse down event
+ */
+OO.ui.ToolGroup.prototype.onMouseDown = function ( e ) {
+       if ( !this.disabled && e.which === 1 ) {
+               this.pressed = this.getTargetTool( e );
+               if ( this.pressed ) {
+                       this.pressed.setActive( true );
+                       this.getElementDocument().addEventListener(
+                               'mouseup', this.onCapturedMouseUpHandler, true
+                       );
+                       return false;
+               }
+       }
+};
+
+/**
+ * Handle captured mouse up events.
+ *
+ * @method
+ * @param {Event} e Mouse up event
+ */
+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
+       // released, but since `this.pressed` will no longer be true, the second call will be ignored.
+       this.onMouseUp( e );
+};
+
+/**
+ * Handle mouse up events.
+ *
+ * @method
+ * @param {jQuery.Event} e Mouse up event
+ */
+OO.ui.ToolGroup.prototype.onMouseUp = function ( e ) {
+       var tool = this.getTargetTool( e );
+
+       if ( !this.disabled && e.which === 1 && this.pressed && this.pressed === tool ) {
+               this.pressed.onSelect();
+       }
+
+       this.pressed = null;
+       return false;
+};
+
+/**
+ * Handle mouse over events.
+ *
+ * @method
+ * @param {jQuery.Event} e Mouse over event
+ */
+OO.ui.ToolGroup.prototype.onMouseOver = function ( e ) {
+       var tool = this.getTargetTool( e );
+
+       if ( this.pressed && this.pressed === tool ) {
+               this.pressed.setActive( true );
+       }
+};
+
+/**
+ * Handle mouse out events.
+ *
+ * @method
+ * @param {jQuery.Event} e Mouse out event
+ */
+OO.ui.ToolGroup.prototype.onMouseOut = function ( e ) {
+       var tool = this.getTargetTool( e );
+
+       if ( this.pressed && this.pressed === tool ) {
+               this.pressed.setActive( false );
+       }
+};
+
+/**
+ * Get the closest tool to a jQuery.Event.
+ *
+ * Only tool links are considered, which prevents other elements in the tool such as popups from
+ * triggering tool group interactions.
+ *
+ * @method
+ * @private
+ * @param {jQuery.Event} e
+ * @returns {OO.ui.Tool|null} Tool, `null` if none was found
+ */
+OO.ui.ToolGroup.prototype.getTargetTool = function ( e ) {
+       var tool,
+               $item = this.$( e.target ).closest( '.oo-ui-tool-link' );
+
+       if ( $item.length ) {
+               tool = $item.parent().data( 'oo-ui-tool' );
+       }
+
+       return tool && !tool.isDisabled() ? tool : null;
+};
+
+/**
+ * Handle tool registry register events.
+ *
+ * If a tool is registered after the group is created, we must repopulate the list to account for:
+ * - a tool being added that may be included
+ * - a tool already included being overridden
+ *
+ * @param {string} name Symbolic name of tool
+ */
+OO.ui.ToolGroup.prototype.onToolFactoryRegister = function () {
+       this.populate();
+};
+
+/**
+ * Get the toolbar this group is in.
+ *
+ * @return {OO.ui.Toolbar} Toolbar of group
+ */
+OO.ui.ToolGroup.prototype.getToolbar = function () {
+       return this.toolbar;
+};
+
+/**
+ * Add and remove tools based on configuration.
+ *
+ * @method
+ */
+OO.ui.ToolGroup.prototype.populate = function () {
+       var i, len, name, tool,
+               toolFactory = this.toolbar.getToolFactory(),
+               names = {},
+               add = [],
+               remove = [],
+               list = this.toolbar.getToolFactory().getTools(
+                       this.include, this.exclude, this.promote, this.demote
+               );
+
+       // Build a list of needed tools
+       for ( i = 0, len = list.length; i < len; i++ ) {
+               name = list[i];
+               if (
+                       // Tool exists
+                       toolFactory.lookup( name ) &&
+                       // Tool is available or is already in this group
+                       ( this.toolbar.isToolAvailable( name ) || this.tools[name] )
+               ) {
+                       tool = this.tools[name];
+                       if ( !tool ) {
+                               // Auto-initialize tools on first use
+                               this.tools[name] = tool = toolFactory.create( name, this );
+                               tool.updateTitle();
+                       }
+                       this.toolbar.reserveTool( tool );
+                       add.push( tool );
+                       names[name] = true;
+               }
+       }
+       // Remove tools that are no longer needed
+       for ( name in this.tools ) {
+               if ( !names[name] ) {
+                       this.tools[name].destroy();
+                       this.toolbar.releaseTool( this.tools[name] );
+                       remove.push( this.tools[name] );
+                       delete this.tools[name];
+               }
+       }
+       if ( remove.length ) {
+               this.removeItems( remove );
+       }
+       // Update emptiness state
+       if ( add.length ) {
+               this.$element.removeClass( 'oo-ui-toolGroup-empty' );
+       } else {
+               this.$element.addClass( 'oo-ui-toolGroup-empty' );
+       }
+       // Re-add tools (moving existing ones to new locations)
+       this.addItems( add );
+};
+
+/**
+ * Destroy tool group.
+ *
+ * @method
+ */
+OO.ui.ToolGroup.prototype.destroy = function () {
+       var name;
+
+       this.clearItems();
+       this.toolbar.getToolFactory().disconnect( this );
+       for ( name in this.tools ) {
+               this.toolbar.releaseTool( this.tools[name] );
+               this.tools[name].disconnect( this ).destroy();
+               delete this.tools[name];
+       }
+       this.$element.remove();
+};
+/**
+ * Layout made of a fieldset and optional legend.
+ *
+ * Just add OO.ui.FieldLayout items.
+ *
+ * @class
+ * @extends OO.ui.Layout
+ * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.IconedElement
+ * @mixins OO.ui.GroupElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {string} [icon] Symbolic icon name
+ * @cfg {OO.ui.FieldLayout[]} [items] Items to add
+ */
+OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
+       // Config initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Layout.call( this, config );
+
+       // Mixin constructors
+       OO.ui.IconedElement.call( this, this.$( '<div>' ), config );
+       OO.ui.LabeledElement.call( this, this.$( '<legend>' ), config );
+       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
+
+       // Initialization
+       this.$element
+               .addClass( 'oo-ui-fieldsetLayout' )
+               .append( this.$icon, this.$label, this.$group );
+       if ( $.isArray( config.items ) ) {
+               this.addItems( config.items );
+       }
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.FieldsetLayout, OO.ui.Layout );
+
+OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.IconedElement );
+OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.GroupElement );
+
+/* Static Properties */
+
+OO.ui.FieldsetLayout.static.tagName = 'fieldset';
+/**
+ * Layout made of a field and optional label.
+ *
+ * @class
+ * @extends OO.ui.Layout
+ * @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
+ *    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
+ *    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
+ *    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
+ *    checkboxes or radio buttons
+ *
+ * @constructor
+ * @param {OO.ui.Widget} field Field widget
+ * @param {Object} [config] Configuration options
+ * @cfg {string} [align='left'] Alignment mode, either 'left', 'right', 'top' or 'inline'
+ */
+OO.ui.FieldLayout = function OoUiFieldLayout( field, config ) {
+       // Config initialization
+       config = $.extend( { 'align': 'left' }, config );
+
+       // Parent constructor
+       OO.ui.Layout.call( this, config );
+
+       // Mixin constructors
+       OO.ui.LabeledElement.call( this, this.$( '<label>' ), config );
+
+       // Properties
+       this.$field = this.$( '<div>' );
+       this.field = field;
+       this.align = null;
+
+       // Events
+       if ( this.field instanceof OO.ui.InputWidget ) {
+               this.$label.on( 'click', OO.ui.bind( this.onLabelClick, this ) );
+       }
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-fieldLayout' );
+       this.$field
+               .addClass( 'oo-ui-fieldLayout-field' )
+               .append( this.field.$element );
+       this.setAlignment( config.align );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.FieldLayout, OO.ui.Layout );
+
+OO.mixinClass( OO.ui.FieldLayout, OO.ui.LabeledElement );
+
+/* Methods */
+
+/**
+ * Handles label mouse click events.
+ *
+ * @method
+ * @param {jQuery.Event} e Mouse click event
+ */
+OO.ui.FieldLayout.prototype.onLabelClick = function () {
+       this.field.simulateLabelClick();
+       return false;
+};
+
+/**
+ * Get the field.
+ *
+ * @returns {OO.ui.Widget} Field widget
+ */
+OO.ui.FieldLayout.prototype.getField = function () {
+       return this.field;
+};
+
+/**
+ * Set the field alignment mode.
+ *
+ * @param {string} value Alignment mode, either 'left', 'right', 'top' or 'inline'
+ * @chainable
+ */
+OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
+       if ( value !== this.align ) {
+               // Default to 'left'
+               if ( [ 'left', 'right', 'top', 'inline' ].indexOf( value ) === -1 ) {
+                       value = 'left';
+               }
+               // Reorder elements
+               if ( value === 'inline' ) {
+                       this.$element.append( this.$field, this.$label );
+               } else {
+                       this.$element.append( this.$label, this.$field );
+               }
+               // Set classes
+               if ( this.align ) {
+                       this.$element.removeClass( 'oo-ui-fieldLayout-align-' + this.align );
+               }
+               this.align = value;
+               this.$element.addClass( 'oo-ui-fieldLayout-align-' + this.align );
+       }
+
+       return this;
+};
+/**
+ * Layout made of proportionally sized columns and rows.
+ *
+ * @class
+ * @extends OO.ui.Layout
+ *
+ * @constructor
+ * @param {OO.ui.PanelLayout[]} panels Panels in the grid
+ * @param {Object} [config] Configuration options
+ * @cfg {number[]} [widths] Widths of columns as ratios
+ * @cfg {number[]} [heights] Heights of columns as ratios
+ */
+OO.ui.GridLayout = function OoUiGridLayout( panels, config ) {
+       var i, len, widths;
+
+       // Config initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Layout.call( this, config );
+
+       // Properties
+       this.panels = [];
+       this.widths = [];
+       this.heights = [];
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-gridLayout' );
+       for ( i = 0, len = panels.length; i < len; i++ ) {
+               this.panels.push( panels[i] );
+               this.$element.append( panels[i].$element );
+       }
+       if ( config.widths || config.heights ) {
+               this.layout( config.widths || [1], config.heights || [1] );
+       } else {
+               // Arrange in columns by default
+               widths = [];
+               for ( i = 0, len = this.panels.length; i < len; i++ ) {
+                       widths[i] = 1;
+               }
+               this.layout( widths, [1] );
+       }
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.GridLayout, OO.ui.Layout );
+
+/* Events */
+
+/**
+ * @event layout
+ */
+
+/**
+ * @event update
+ */
+
+/* Static Properties */
+
+OO.ui.GridLayout.static.tagName = 'div';
+
+/* Methods */
+
+/**
+ * Set grid dimensions.
+ *
+ * @method
+ * @param {number[]} widths Widths of columns as ratios
+ * @param {number[]} heights Heights of rows as ratios
+ * @fires layout
+ * @throws {Error} If grid is not large enough to fit all panels
+ */
+OO.ui.GridLayout.prototype.layout = function ( widths, heights ) {
+       var x, y,
+               xd = 0,
+               yd = 0,
+               cols = widths.length,
+               rows = heights.length;
+
+       // Verify grid is big enough to fit panels
+       if ( cols * rows < this.panels.length ) {
+               throw new Error( 'Grid is not large enough to fit ' + this.panels.length + 'panels' );
+       }
+
+       // Sum up denominators
+       for ( x = 0; x < cols; x++ ) {
+               xd += widths[x];
+       }
+       for ( y = 0; y < rows; y++ ) {
+               yd += heights[y];
+       }
+       // Store factors
+       this.widths = [];
+       this.heights = [];
+       for ( x = 0; x < cols; x++ ) {
+               this.widths[x] = widths[x] / xd;
+       }
+       for ( y = 0; y < rows; y++ ) {
+               this.heights[y] = heights[y] / yd;
+       }
+       // Synchronize view
+       this.update();
+       this.emit( 'layout' );
+};
+
+/**
+ * Update panel positions and sizes.
+ *
+ * @method
+ * @fires update
+ */
+OO.ui.GridLayout.prototype.update = function () {
+       var x, y, panel,
+               i = 0,
+               left = 0,
+               top = 0,
+               dimensions,
+               width = 0,
+               height = 0,
+               cols = this.widths.length,
+               rows = this.heights.length;
+
+       for ( y = 0; y < rows; y++ ) {
+               for ( x = 0; x < cols; x++ ) {
+                       panel = this.panels[i];
+                       width = this.widths[x];
+                       height = this.heights[y];
+                       dimensions = {
+                               'width': Math.round( width * 100 ) + '%',
+                               'height': Math.round( height * 100 ) + '%',
+                               'top': Math.round( top * 100 ) + '%'
+                       };
+                       // If RTL, reverse:
+                       if ( OO.ui.Element.getDir( this.$.context ) === 'rtl' ) {
+                               dimensions.right = Math.round( left * 100 ) + '%';
+                       } else {
+                               dimensions.left = Math.round( left * 100 ) + '%';
+                       }
+                       panel.$element.css( dimensions );
+                       i++;
+                       left += width;
+               }
+               top += height;
+               left = 0;
+       }
+
+       this.emit( 'update' );
+};
+
+/**
+ * Get a panel at a given position.
+ *
+ * The x and y position is affected by the current grid layout.
+ *
+ * @method
+ * @param {number} x Horizontal position
+ * @param {number} y Vertical position
+ * @returns {OO.ui.PanelLayout} The panel at the given postion
+ */
+OO.ui.GridLayout.prototype.getPanel = function ( x, y ) {
+       return this.panels[( x * this.widths.length ) + y];
+};
+/**
+ * Layout containing a series of pages.
+ *
+ * @class
+ * @extends OO.ui.Layout
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [continuous=false] Show all pages, one after another
+ * @cfg {boolean} [autoFocus=false] Focus on the first focusable element when changing to a page
+ * @cfg {boolean} [outlined=false] Show an outline
+ * @cfg {boolean} [editable=false] Show controls for adding, removing and reordering pages
+ * @cfg {Object[]} [adders] List of adders for controls, each with name, icon and title properties
+ */
+OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
+       // Initialize configuration
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Layout.call( this, config );
+
+       // Properties
+       this.currentPageName = null;
+       this.pages = {};
+       this.ignoreFocus = false;
+       this.stackLayout = new OO.ui.StackLayout( { '$': this.$, 'continuous': !!config.continuous } );
+       this.autoFocus = !!config.autoFocus;
+       this.outlined = !!config.outlined;
+       if ( this.outlined ) {
+               this.editable = !!config.editable;
+               this.adders = config.adders || null;
+               this.outlineControlsWidget = null;
+               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] }
+               );
+               if ( this.editable ) {
+                       this.outlineControlsWidget = new OO.ui.OutlineControlsWidget(
+                               this.outlineWidget,
+                               { '$': this.$, 'adders': this.adders }
+                       );
+               }
+       }
+
+       // Events
+       this.stackLayout.connect( this, { 'set': 'onStackLayoutSet' } );
+       if ( this.outlined ) {
+               this.outlineWidget.connect( this, { 'select': 'onOutlineWidgetSelect' } );
+               // Event 'focus' does not bubble, but 'focusin' does
+               this.stackLayout.onDOMEvent( 'focusin', OO.ui.bind( this.onStackLayoutFocus, this ) );
+       }
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-bookletLayout' );
+       this.stackLayout.$element.addClass( 'oo-ui-bookletLayout-stackLayout' );
+       if ( this.outlined ) {
+               this.outlinePanel.$element
+                       .addClass( 'oo-ui-bookletLayout-outlinePanel' )
+                       .append( this.outlineWidget.$element );
+               if ( this.editable ) {
+                       this.outlinePanel.$element
+                               .addClass( 'oo-ui-bookletLayout-outlinePanel-editable' )
+                               .append( this.outlineControlsWidget.$element );
+               }
+               this.$element.append( this.gridLayout.$element );
+       } else {
+               this.$element.append( this.stackLayout.$element );
+       }
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.BookletLayout, OO.ui.Layout );
+
+/* Events */
+
+/**
+ * @event set
+ * @param {OO.ui.PageLayout} page Current page
+ */
+
+/**
+ * @event add
+ * @param {OO.ui.PageLayout[]} page Added pages
+ * @param {number} index Index pages were added at
+ */
+
+/**
+ * @event remove
+ * @param {OO.ui.PageLayout[]} pages Removed pages
+ */
+
+/* Methods */
+
+/**
+ * Handle stack layout focus.
+ *
+ * @method
+ * @param {jQuery.Event} e Focusin event
+ */
+OO.ui.BookletLayout.prototype.onStackLayoutFocus = function ( e ) {
+       var name, $target;
+
+       if ( this.ignoreFocus ) {
+               // Avoid recursion from programmatic focus trigger in #onStackLayoutSet
+               return;
+       }
+
+       $target = $( e.target ).closest( '.oo-ui-pageLayout' );
+       for ( name in this.pages ) {
+               if ( this.pages[ name ].$element[0] === $target[0] ) {
+                       this.setPage( name );
+                       break;
+               }
+       }
+};
+
+/**
+ * Handle stack layout set events.
+ *
+ * @method
+ * @param {OO.ui.PanelLayout|null} page The page panel that is now the current panel
+ */
+OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
+       if ( page ) {
+               page.scrollElementIntoView( { 'complete': OO.ui.bind( function () {
+                       this.ignoreFocus = true;
+                       if ( this.autoFocus ) {
+                               page.$element.find( ':input:first' ).focus();
+                       }
+                       this.ignoreFocus = false;
+               }, this ) } );
+       }
+};
+
+/**
+ * Handle outline widget select events.
+ *
+ * @method
+ * @param {OO.ui.OptionWidget|null} item Selected item
+ */
+OO.ui.BookletLayout.prototype.onOutlineWidgetSelect = function ( item ) {
+       if ( item ) {
+               this.setPage( item.getData() );
+       }
+};
+
+/**
+ * Check if booklet has an outline.
+ *
+ * @method
+ * @returns {boolean} Booklet is outlined
+ */
+OO.ui.BookletLayout.prototype.isOutlined = function () {
+       return this.outlined;
+};
+
+/**
+ * Check if booklet has editing controls.
+ *
+ * @method
+ * @returns {boolean} Booklet is outlined
+ */
+OO.ui.BookletLayout.prototype.isEditable = function () {
+       return this.editable;
+};
+
+/**
+ * Get the outline widget.
+ *
+ * @method
+ * @returns {OO.ui.OutlineWidget|null} Outline widget, or null if boolet has no outline
+ */
+OO.ui.BookletLayout.prototype.getOutline = function () {
+       return this.outlineWidget;
+};
+
+/**
+ * Get the outline controls widget. If the outline is not editable, null is returned.
+ *
+ * @method
+ * @returns {OO.ui.OutlineControlsWidget|null} The outline controls widget.
+ */
+OO.ui.BookletLayout.prototype.getOutlineControls = function () {
+       return this.outlineControlsWidget;
+};
+
+/**
+ * Get a page by name.
+ *
+ * @method
+ * @param {string} name Symbolic name of page
+ * @returns {OO.ui.PageLayout|undefined} Page, if found
+ */
+OO.ui.BookletLayout.prototype.getPage = function ( name ) {
+       return this.pages[name];
+};
+
+/**
+ * Get the current page name.
+ *
+ * @method
+ * @returns {string|null} Current page name
+ */
+OO.ui.BookletLayout.prototype.getPageName = function () {
+       return this.currentPageName;
+};
+
+/**
+ * Add a page to the layout.
+ *
+ * When pages are added with the same names as existing pages, the existing pages will be
+ * automatically removed before the new pages are added.
+ *
+ * @method
+ * @param {OO.ui.PageLayout[]} pages Pages to add
+ * @param {number} index Index to insert pages after
+ * @fires add
+ * @chainable
+ */
+OO.ui.BookletLayout.prototype.addPages = function ( pages, index ) {
+       var i, len, name, page, item,
+               items = [],
+               remove = [];
+
+       for ( i = 0, len = pages.length; i < len; i++ ) {
+               page = pages[i];
+               name = page.getName();
+               if ( name in this.pages ) {
+                       // Remove page with same name
+                       remove.push( this.pages[name] );
+               }
+               this.pages[page.getName()] = page;
+               if ( this.outlined ) {
+                       item = new OO.ui.OutlineItemWidget( name, page, { '$': this.$ } );
+                       page.setOutlineItem( item );
+                       items.push( item );
+               }
+       }
+       if ( remove.length ) {
+               this.removePages( remove );
+       }
+
+       if ( this.outlined && items.length ) {
+               this.outlineWidget.addItems( items, index );
+               this.updateOutlineWidget();
+       }
+       this.stackLayout.addItems( pages, index );
+       this.emit( 'add', pages, index );
+
+       return this;
+};
+
+/**
+ * Remove a page from the layout.
+ *
+ * @method
+ * @fires remove
+ * @chainable
+ */
+OO.ui.BookletLayout.prototype.removePages = function ( pages ) {
+       var i, len, name, page,
+               items = [];
+
+       for ( i = 0, len = pages.length; i < len; i++ ) {
+               page = pages[i];
+               name = page.getName();
+               delete this.pages[name];
+               if ( this.outlined ) {
+                       items.push( this.outlineWidget.getItemFromData( name ) );
+                       page.setOutlineItem( null );
+               }
+       }
+       if ( this.outlined && items.length ) {
+               this.outlineWidget.removeItems( items );
+               this.updateOutlineWidget();
+       }
+       this.stackLayout.removeItems( pages );
+       this.emit( 'remove', pages );
+
+       return this;
+};
+
+/**
+ * Clear all pages from the layout.
+ *
+ * @method
+ * @fires remove
+ * @chainable
+ */
+OO.ui.BookletLayout.prototype.clearPages = function () {
+       var i, len,
+               pages = this.stackLayout.getItems();
+
+       this.pages = {};
+       this.currentPageName = null;
+       if ( this.outlined ) {
+               this.outlineWidget.clearItems();
+               for ( i = 0, len = pages.length; i < len; i++ ) {
+                       pages[i].setOutlineItem( null );
+               }
+       }
+       this.stackLayout.clearItems();
+
+       this.emit( 'remove', pages );
+
+       return this;
+};
+
+/**
+ * Set the current page by name.
+ *
+ * @method
+ * @fires set
+ * @param {string} name Symbolic name of page
+ */
+OO.ui.BookletLayout.prototype.setPage = function ( name ) {
+       var selectedItem,
+               page = this.pages[name];
+
+       if ( this.outlined ) {
+               selectedItem = this.outlineWidget.getSelectedItem();
+               if ( selectedItem && selectedItem.getData() !== name ) {
+                       this.outlineWidget.selectItem( this.outlineWidget.getItemFromData( name ) );
+               }
+       }
+
+       if ( page ) {
+               this.currentPageName = name;
+               this.stackLayout.setItem( page );
+               this.emit( 'set', page );
+       }
+};
+
+/**
+ * Call this after adding or removing items from the OutlineWidget.
+ *
+ * @method
+ * @chainable
+ */
+OO.ui.BookletLayout.prototype.updateOutlineWidget = function () {
+       // Auto-select first item when nothing is selected anymore
+       if ( !this.outlineWidget.getSelectedItem() ) {
+               this.outlineWidget.selectItem( this.outlineWidget.getFirstSelectableItem() );
+       }
+
+       return this;
+};
+/**
+ * Layout that expands to cover the entire area of its parent, with optional scrolling and padding.
+ *
+ * @class
+ * @extends OO.ui.Layout
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [scrollable] Allow vertical scrolling
+ * @cfg {boolean} [padded] Pad the content from the edges
+ */
+OO.ui.PanelLayout = function OoUiPanelLayout( config ) {
+       // Config initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Layout.call( this, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-panelLayout' );
+       if ( config.scrollable ) {
+               this.$element.addClass( 'oo-ui-panelLayout-scrollable' );
+       }
+
+       if ( config.padded ) {
+               this.$element.addClass( 'oo-ui-panelLayout-padded' );
+       }
+
+       // Add directionality class:
+       this.$element.addClass( 'oo-ui-' + OO.ui.Element.getDir( this.$.context ) );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.PanelLayout, OO.ui.Layout );
+/**
+ * Page within an OO.ui.BookletLayout.
+ *
+ * @class
+ * @extends OO.ui.PanelLayout
+ *
+ * @constructor
+ * @param {string} name Unique symbolic name of page
+ * @param {Object} [config] Configuration options
+ * @param {string} [outlineItem] Outline item widget
+ */
+OO.ui.PageLayout = function OoUiPageLayout( name, config ) {
+       // Configuration initialization
+       config = $.extend( { 'scrollable': true }, config );
+
+       // Parent constructor
+       OO.ui.PanelLayout.call( this, config );
+
+       // Properties
+       this.name = name;
+       this.outlineItem = config.outlineItem || null;
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-pageLayout' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.PageLayout, OO.ui.PanelLayout );
+
+/* Methods */
+
+/**
+ * Get page name.
+ *
+ * @returns {string} Symbolic name of page
+ */
+OO.ui.PageLayout.prototype.getName = function () {
+       return this.name;
+};
+
+/**
+ * Get outline item.
+ *
+ * @returns {OO.ui.OutlineItemWidget|null} Outline item widget
+ */
+OO.ui.PageLayout.prototype.getOutlineItem = function () {
+       return this.outlineItem;
+};
+
+/**
+ * Get outline item.
+ *
+ * @param {OO.ui.OutlineItemWidget|null} outlineItem Outline item widget, null to clear
+ * @chainable
+ */
+OO.ui.PageLayout.prototype.setOutlineItem = function ( outlineItem ) {
+       this.outlineItem = outlineItem;
+       return this;
+};
+/**
+ * Layout containing a series of mutually exclusive pages.
+ *
+ * @class
+ * @extends OO.ui.PanelLayout
+ * @mixins OO.ui.GroupElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [continuous=false] Show all pages, one after another
+ * @cfg {string} [icon=''] Symbolic icon name
+ * @cfg {OO.ui.Layout[]} [items] Layouts to add
+ */
+OO.ui.StackLayout = function OoUiStackLayout( config ) {
+       // Config initialization
+       config = $.extend( { 'scrollable': true }, config );
+
+       // Parent constructor
+       OO.ui.PanelLayout.call( this, config );
+
+       // Mixin constructors
+       OO.ui.GroupElement.call( this, this.$element, config );
+
+       // Properties
+       this.currentItem = null;
+       this.continuous = !!config.continuous;
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-stackLayout' );
+       if ( this.continuous ) {
+               this.$element.addClass( 'oo-ui-stackLayout-continuous' );
+       }
+       if ( $.isArray( config.items ) ) {
+               this.addItems( config.items );
+       }
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.StackLayout, OO.ui.PanelLayout );
+
+OO.mixinClass( OO.ui.StackLayout, OO.ui.GroupElement );
+
+/* Events */
+
+/**
+ * @event set
+ * @param {OO.ui.PanelLayout|null} [item] Current item
+ */
+
+/* Methods */
+
+/**
+ * Add items.
+ *
+ * Adding an existing item (by value) will move it.
+ *
+ * @method
+ * @param {OO.ui.PanelLayout[]} items Items to add
+ * @param {number} [index] Index to insert items after
+ * @chainable
+ */
+OO.ui.StackLayout.prototype.addItems = function ( items, index ) {
+       OO.ui.GroupElement.prototype.addItems.call( this, items, index );
+
+       if ( !this.currentItem && items.length ) {
+               this.setItem( items[0] );
+       }
+
+       return this;
+};
+
+/**
+ * Remove items.
+ *
+ * Items will be detached, not removed, so they can be used later.
+ *
+ * @method
+ * @param {OO.ui.PanelLayout[]} items Items to remove
+ * @chainable
+ */
+OO.ui.StackLayout.prototype.removeItems = function ( items ) {
+       OO.ui.GroupElement.prototype.removeItems.call( this, items );
+       if ( $.inArray( this.currentItem, items  ) !== -1 ) {
+               this.currentItem = null;
+               if ( !this.currentItem && this.items.length ) {
+                       this.setItem( this.items[0] );
+               }
+       }
+
+       return this;
+};
+
+/**
+ * Clear all items.
+ *
+ * Items will be detached, not removed, so they can be used later.
+ *
+ * @method
+ * @chainable
+ */
+OO.ui.StackLayout.prototype.clearItems = function () {
+       this.currentItem = null;
+       OO.ui.GroupElement.prototype.clearItems.call( this );
+
+       return this;
+};
+
+/**
+ * Show item.
+ *
+ * Any currently shown item will be hidden.
+ *
+ * @method
+ * @param {OO.ui.PanelLayout} item Item to show
+ * @chainable
+ */
+OO.ui.StackLayout.prototype.setItem = function ( item ) {
+       if ( !this.continuous ) {
+               this.$items.css( 'display', '' );
+       }
+       if ( $.inArray( item, this.items ) !== -1 ) {
+               if ( !this.continuous ) {
+                       item.$element.css( 'display', 'block' );
+               }
+       } else {
+               item = null;
+       }
+       this.currentItem = item;
+       this.emit( 'set', item );
+
+       return this;
+};
+/**
+ * Horizontal bar layout of tools as icon buttons.
+ *
+ * @class
+ * @abstract
+ * @extends OO.ui.ToolGroup
+ *
+ * @constructor
+ * @param {OO.ui.Toolbar} toolbar
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.BarToolGroup = function OoUiBarToolGroup( toolbar, config ) {
+       // Parent constructor
+       OO.ui.ToolGroup.call( this, toolbar, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-barToolGroup' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.BarToolGroup, OO.ui.ToolGroup );
+
+/* Static Properties */
+
+OO.ui.BarToolGroup.static.titleTooltips = true;
+
+OO.ui.BarToolGroup.static.accelTooltips = true;
+/**
+ * Popup list of tools with an icon and optional label.
+ *
+ * @class
+ * @abstract
+ * @extends OO.ui.ToolGroup
+ * @mixins OO.ui.IconedElement
+ * @mixins OO.ui.IndicatedElement
+ * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.TitledElement
+ * @mixins OO.ui.ClippableElement
+ *
+ * @constructor
+ * @param {OO.ui.Toolbar} toolbar
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.ToolGroup.call( this, toolbar, config );
+
+       // Mixin constructors
+       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
+       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
+       OO.ui.LabeledElement.call( this, this.$( '<span>' ), config );
+       OO.ui.TitledElement.call( this, this.$element, config );
+       OO.ui.ClippableElement.call( this, this.$group, config );
+
+       // Properties
+       this.active = false;
+       this.dragging = false;
+       this.onBlurHandler = OO.ui.bind( this.onBlur, this );
+       this.$handle = this.$( '<span>' );
+
+       // Events
+       this.$handle.on( {
+               'mousedown': OO.ui.bind( this.onHandleMouseDown, this ),
+               'mouseup': OO.ui.bind( this.onHandleMouseUp, this )
+       } );
+
+       // Initialization
+       this.$handle
+               .addClass( 'oo-ui-popupToolGroup-handle' )
+               .append( this.$icon, this.$label, this.$indicator );
+       this.$element
+               .addClass( 'oo-ui-popupToolGroup' )
+               .prepend( this.$handle );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.PopupToolGroup, OO.ui.ToolGroup );
+
+OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.IconedElement );
+OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.IndicatedElement );
+OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.TitledElement );
+OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.ClippableElement );
+
+/* Static Properties */
+
+/* Methods */
+
+/**
+ * Handle focus being lost.
+ *
+ * The event is actually generated from a mouseup, so it is not a normal blur event object.
+ *
+ * @method
+ * @param {jQuery.Event} e Mouse up event
+ */
+OO.ui.PopupToolGroup.prototype.onBlur = function ( e ) {
+       // Only deactivate when clicking outside the dropdown element
+       if ( this.$( e.target ).closest( '.oo-ui-popupToolGroup' )[0] !== this.$element[0] ) {
+               this.setActive( false );
+       }
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.PopupToolGroup.prototype.onMouseUp = function ( e ) {
+       this.setActive( false );
+       return OO.ui.ToolGroup.prototype.onMouseUp.call( this, e );
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.PopupToolGroup.prototype.onMouseDown = function ( e ) {
+       return OO.ui.ToolGroup.prototype.onMouseDown.call( this, e );
+};
+
+/**
+ * Handle mouse up events.
+ *
+ * @method
+ * @param {jQuery.Event} e Mouse up event
+ */
+OO.ui.PopupToolGroup.prototype.onHandleMouseUp = function () {
+       return false;
+};
+
+/**
+ * Handle mouse down events.
+ *
+ * @method
+ * @param {jQuery.Event} e Mouse down event
+ */
+OO.ui.PopupToolGroup.prototype.onHandleMouseDown = function ( e ) {
+       if ( !this.disabled && e.which === 1 ) {
+               this.setActive( !this.active );
+       }
+       return false;
+};
+
+/**
+ * Switch into active mode.
+ *
+ * When active, mouseup events anywhere in the document will trigger deactivation.
+ *
+ * @method
+ */
+OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
+       value = !!value;
+       if ( this.active !== value ) {
+               this.active = value;
+               if ( value ) {
+                       this.setClipping( true );
+                       this.$element.addClass( 'oo-ui-popupToolGroup-active' );
+                       this.getElementDocument().addEventListener( 'mouseup', this.onBlurHandler, true );
+               } else {
+                       this.setClipping( false );
+                       this.$element.removeClass( 'oo-ui-popupToolGroup-active' );
+                       this.getElementDocument().removeEventListener( 'mouseup', this.onBlurHandler, true );
+               }
+       }
+};
+/**
+ * Drop down list layout of tools as labeled icon buttons.
+ *
+ * @class
+ * @abstract
+ * @extends OO.ui.PopupToolGroup
+ *
+ * @constructor
+ * @param {OO.ui.Toolbar} toolbar
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.ListToolGroup = function OoUiListToolGroup( toolbar, config ) {
+       // Parent constructor
+       OO.ui.PopupToolGroup.call( this, toolbar, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-listToolGroup' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.ListToolGroup, OO.ui.PopupToolGroup );
+
+/* Static Properties */
+
+OO.ui.ListToolGroup.static.accelTooltips = true;
+/**
+ * Drop down menu layout of tools as selectable menu items.
+ *
+ * @class
+ * @abstract
+ * @extends OO.ui.PopupToolGroup
+ *
+ * @constructor
+ * @param {OO.ui.Toolbar} toolbar
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.MenuToolGroup = function OoUiMenuToolGroup( toolbar, config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.PopupToolGroup.call( this, toolbar, config );
+
+       // Events
+       this.toolbar.connect( this, { 'updateState': 'onUpdateState' } );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-menuToolGroup' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.MenuToolGroup, OO.ui.PopupToolGroup );
+
+/* Static Properties */
+
+OO.ui.MenuToolGroup.static.accelTooltips = true;
+
+/* Methods */
+
+/**
+ * Handle the toolbar state being updated.
+ *
+ * When the state changes, the title of each active item in the menu will be joined together and
+ * used as a label for the group. The label will be empty if none of the items are active.
+ *
+ * @method
+ */
+OO.ui.MenuToolGroup.prototype.onUpdateState = function () {
+       var name,
+               labelTexts = [];
+
+       for ( name in this.tools ) {
+               if ( this.tools[name].isActive() ) {
+                       labelTexts.push( this.tools[name].getTitle() );
+               }
+       }
+
+       this.setLabel( labelTexts.join( ', ' ) );
+};
+/**
+ * UserInterface popup tool.
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.Tool
+ * @mixins OO.ui.PopuppableElement
+ *
+ * @constructor
+ * @param {OO.ui.Toolbar} toolbar
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.PopupTool = function OoUiPopupTool( toolbar, config ) {
+       // Parent constructor
+       OO.ui.Tool.call( this, toolbar, config );
+
+       // Mixin constructors
+       OO.ui.PopuppableElement.call( this, config );
+
+       // Initialization
+       this.$element
+               .addClass( 'oo-ui-popupTool' )
+               .append( this.popup.$element );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.PopupTool, OO.ui.Tool );
+
+OO.mixinClass( OO.ui.PopupTool, OO.ui.PopuppableElement );
+
+/* Methods */
+
+/**
+ * Handle the tool being selected.
+ *
+ * @inheritdoc
+ */
+OO.ui.PopupTool.prototype.onSelect = function () {
+       if ( !this.disabled ) {
+               if ( this.popup.isVisible() ) {
+                       this.hidePopup();
+               } else {
+                       this.showPopup();
+               }
+       }
+       this.setActive( false );
+       return false;
+};
+
+/**
+ * Handle the toolbar state being updated.
+ *
+ * @inheritdoc
+ */
+OO.ui.PopupTool.prototype.onUpdateState = function () {
+       this.setActive( false );
+};
+/**
+ * Group widget.
+ *
+ * Use together with OO.ui.ItemWidget to make disabled state inheritable.
+ *
+ * @class
+ * @abstract
+ * @extends OO.ui.GroupElement
+ *
+ * @constructor
+ * @param {jQuery} $group Container node, assigned to #$group
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.GroupWidget = function OoUiGroupWidget( $element, config ) {
+       // Parent constructor
+       OO.ui.GroupElement.call( this, $element, config );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.GroupWidget, OO.ui.GroupElement );
+
+/* Methods */
+
+/**
+ * Set the disabled state of the widget.
+ *
+ * This will also update the disabled state of child widgets.
+ *
+ * @method
+ * @param {boolean} disabled Disable widget
+ * @chainable
+ */
+OO.ui.GroupWidget.prototype.setDisabled = function ( disabled ) {
+       var i, len;
+
+       // Parent method
+       OO.ui.Widget.prototype.setDisabled.call( this, disabled );
+
+       // During construction, #setDisabled is called before the OO.ui.GroupElement constructor
+       if ( this.items ) {
+               for ( i = 0, len = this.items.length; i < len; i++ ) {
+                       this.items[i].updateDisabled();
+               }
+       }
+
+       return this;
+};
+/**
+ * Item widget.
+ *
+ * Use together with OO.ui.GroupWidget to make disabled state inheritable.
+ *
+ * @class
+ * @abstract
+ *
+ * @constructor
+ */
+OO.ui.ItemWidget = function OoUiItemWidget() {
+       //
+};
+
+/* Methods */
+
+/**
+ * Check if widget is disabled.
+ *
+ * Checks parent if present, making disabled state inheritable.
+ *
+ * @returns {boolean} Widget is disabled
+ */
+OO.ui.ItemWidget.prototype.isDisabled = function () {
+       return this.disabled ||
+               ( this.elementGroup instanceof OO.ui.Widget && this.elementGroup.isDisabled() );
+};
+
+/**
+ * Set group element is in.
+ *
+ * @param {OO.ui.GroupElement|null} group Group element, null if none
+ * @chainable
+ */
+OO.ui.ItemWidget.prototype.setElementGroup = function ( group ) {
+       // Parent method
+       OO.ui.Element.prototype.setElementGroup.call( this, group );
+
+       // Initialize item disabled states
+       this.updateDisabled();
+
+       return this;
+};
+/**
+ * Container for multiple related buttons.
+ *
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.GroupElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {OO.ui.ButtonWidget} [items] Buttons to add
+ */
+OO.ui.ButtonGroupWidget = function OoUiButtonGroupWidget( config ) {
+       // Parent constructor
+       OO.ui.Widget.call( this, config );
+
+       // Mixin constructors
+       OO.ui.GroupElement.call( this, this.$element, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-buttonGroupWidget' );
+       if ( $.isArray( config.items ) ) {
+               this.addItems( config.items );
+       }
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.ButtonGroupWidget, OO.ui.Widget );
+
+OO.mixinClass( OO.ui.ButtonGroupWidget, OO.ui.GroupElement );
+/**
+ * Creates an OO.ui.ButtonWidget object.
+ *
+ * @class
+ * @abstract
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.ButtonedElement
+ * @mixins OO.ui.IconedElement
+ * @mixins OO.ui.IndicatedElement
+ * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.TitledElement
+ * @mixins OO.ui.FlaggableElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {string} [title=''] Title text
+ * @cfg {string} [href] Hyperlink to visit when clicked
+ * @cfg {string} [target] Target to open hyperlink in
+ */
+OO.ui.ButtonWidget = function OoUiButtonWidget( config ) {
+       // Configuration initialization
+       config = $.extend( { 'target': '_blank' }, config );
+
+       // Parent constructor
+       OO.ui.Widget.call( this, config );
+
+       // Mixin constructors
+       OO.ui.ButtonedElement.call( this, this.$( '<a>' ), config );
+       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
+       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
+       OO.ui.LabeledElement.call( this, this.$( '<span>' ), config );
+       OO.ui.TitledElement.call( this, this.$button, config );
+       OO.ui.FlaggableElement.call( this, config );
+
+       // Properties
+       this.isHyperlink = typeof config.href === 'string';
+
+       // Events
+       this.$button.on( {
+               'click': OO.ui.bind( this.onClick, this ),
+               'keypress': OO.ui.bind( this.onKeyPress, this )
+       } );
+
+       // Initialization
+       this.$button
+               .append( this.$icon, this.$label, this.$indicator )
+               .attr( { 'href': config.href, 'target': config.target } );
+       this.$element
+               .addClass( 'oo-ui-buttonWidget' )
+               .append( this.$button );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.ButtonWidget, OO.ui.Widget );
+
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.ButtonedElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.IconedElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.IndicatedElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.TitledElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.FlaggableElement );
+
+/* Events */
+
+/**
+ * @event click
+ */
+
+/* Methods */
+
+/**
+ * Handles mouse click events.
+ *
+ * @method
+ * @param {jQuery.Event} e Mouse click event
+ * @fires click
+ */
+OO.ui.ButtonWidget.prototype.onClick = function () {
+       if ( !this.disabled ) {
+               this.emit( 'click' );
+               if ( this.isHyperlink ) {
+                       return true;
+               }
+       }
+       return false;
+};
+
+/**
+ * Handles keypress events.
+ *
+ * @method
+ * @param {jQuery.Event} e Keypress event
+ * @fires click
+ */
+OO.ui.ButtonWidget.prototype.onKeyPress = function ( e ) {
+       if ( !this.disabled && e.which === OO.ui.Keys.SPACE ) {
+               if ( this.isHyperlink ) {
+                       this.onClick();
+                       return true;
+               }
+       }
+       return false;
+};
+/**
+ * Creates an OO.ui.InputWidget object.
+ *
+ * @class
+ * @abstract
+ * @extends OO.ui.Widget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {string} [name=''] HTML input name
+ * @cfg {string} [value=''] Input value
+ * @cfg {boolean} [readOnly=false] Prevent changes
+ * @cfg {Function} [inputFilter] Filter function to apply to the input. Takes a string argument and returns a string.
+ */
+OO.ui.InputWidget = function OoUiInputWidget( config ) {
+       // Config intialization
+       config = $.extend( { 'readOnly': false }, config );
+
+       // Parent constructor
+       OO.ui.Widget.call( this, config );
+
+       // Properties
+       this.$input = this.getInputElement( config );
+       this.value = '';
+       this.readOnly = false;
+       this.inputFilter = config.inputFilter;
+
+       // Events
+       this.$input.on( 'keydown mouseup cut paste change input select', OO.ui.bind( this.onEdit, this ) );
+
+       // Initialization
+       this.$input
+               .attr( 'name', config.name )
+               .prop( 'disabled', this.disabled );
+       this.setReadOnly( config.readOnly );
+       this.$element.addClass( 'oo-ui-inputWidget' ).append( this.$input );
+       this.setValue( config.value );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.InputWidget, OO.ui.Widget );
+
+/* Events */
+
+/**
+ * @event change
+ * @param value
+ */
+
+/* Methods */
+
+/**
+ * Get input element.
+ *
+ * @method
+ * @param {Object} [config] Configuration options
+ * @returns {jQuery} Input element
+ */
+OO.ui.InputWidget.prototype.getInputElement = function () {
+       return this.$( '<input>' );
+};
+
+/**
+ * Handle potentially value-changing events.
+ *
+ * @method
+ * @param {jQuery.Event} e Key down, mouse up, cut, paste, change, input, or select event
+ */
+OO.ui.InputWidget.prototype.onEdit = function () {
+       if ( !this.disabled ) {
+               // Allow the stack to clear so the value will be updated
+               setTimeout( OO.ui.bind( function () {
+                       this.setValue( this.$input.val() );
+               }, this ) );
+       }
+};
+
+/**
+ * Get the value of the input.
+ *
+ * @method
+ * @returns {string} Input value
+ */
+OO.ui.InputWidget.prototype.getValue = function () {
+       return this.value;
+};
+
+/**
+ * Sets the direction of the current input, either RTL or LTR
+ *
+ * @method
+ * @param {boolean} isRTL
+ */
+OO.ui.InputWidget.prototype.setRTL = function ( isRTL ) {
+       if ( isRTL ) {
+               this.$input.removeClass( 'oo-ui-ltr' );
+               this.$input.addClass( 'oo-ui-rtl' );
+       } else {
+               this.$input.removeClass( 'oo-ui-rtl' );
+               this.$input.addClass( 'oo-ui-ltr' );
+       }
+};
+
+/**
+ * Set the value of the input.
+ *
+ * @method
+ * @param {string} value New value
+ * @fires change
+ * @chainable
+ */
+OO.ui.InputWidget.prototype.setValue = function ( value ) {
+       value = this.sanitizeValue( value );
+       if ( this.value !== value ) {
+               this.value = value;
+               this.emit( 'change', this.value );
+       }
+       // Update the DOM if it has changed. Note that with sanitizeValue, it
+       // is possible for the DOM value to change without this.value changing.
+       if ( this.$input.val() !== this.value ) {
+               this.$input.val( this.value );
+       }
+       return this;
+};
+
+/**
+ * Sanitize incoming value.
+ *
+ * Ensures value is a string, and converts undefined and null to empty strings.
+ *
+ * @method
+ * @param {string} value Original value
+ * @returns {string} Sanitized value
+ */
+OO.ui.InputWidget.prototype.sanitizeValue = function ( value ) {
+       if ( value === undefined || value === null ) {
+               return '';
+       } else if ( this.inputFilter ) {
+               return this.inputFilter( String( value ) );
+       } else {
+               return String( value );
+       }
+};
+
+/**
+ * Simulate the behavior of clicking on a label bound to this input.
+ *
+ * @method
+ */
+OO.ui.InputWidget.prototype.simulateLabelClick = function () {
+       if ( !this.isDisabled() ) {
+               if ( this.$input.is( ':checkbox,:radio' ) ) {
+                       this.$input.click();
+               } else if ( this.$input.is( ':input' ) ) {
+                       this.$input.focus();
+               }
+       }
+};
+
+/**
+ * Check if the widget is read-only.
+ *
+ * @method
+ * @param {boolean} Input is read-only
+ */
+OO.ui.InputWidget.prototype.isReadOnly = function () {
+       return this.readOnly;
+};
+
+/**
+ * Set the read-only state of the widget.
+ *
+ * This should probably change the widgets's appearance and prevent it from being used.
+ *
+ * @method
+ * @param {boolean} state Make input read-only
+ * @chainable
+ */
+OO.ui.InputWidget.prototype.setReadOnly = function ( state ) {
+       this.readOnly = !!state;
+       this.$input.prop( 'readonly', this.readOnly );
+       return this;
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.InputWidget.prototype.setDisabled = function ( state ) {
+       OO.ui.Widget.prototype.setDisabled.call( this, state );
+       if ( this.$input ) {
+               this.$input.prop( 'disabled', this.disabled );
+       }
+       return this;
+};
+/**
+ * Creates an OO.ui.CheckboxInputWidget object.
+ *
+ * @class
+ * @extends OO.ui.InputWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.CheckboxInputWidget = function OoUiCheckboxInputWidget( config ) {
+       // Parent constructor
+       OO.ui.InputWidget.call( this, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-checkboxInputWidget' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.CheckboxInputWidget, OO.ui.InputWidget );
+
+/* Events */
+
+/* Methods */
+
+/**
+ * Get input element.
+ *
+ * @returns {jQuery} Input element
+ */
+OO.ui.CheckboxInputWidget.prototype.getInputElement = function () {
+       return this.$( '<input type="checkbox" />' );
+};
+
+/**
+ * Get checked state of the checkbox
+ *
+ * @returns {boolean} If the checkbox is checked
+ */
+OO.ui.CheckboxInputWidget.prototype.getValue = function () {
+       return this.value;
+};
+
+/**
+ * Set value
+ */
+OO.ui.CheckboxInputWidget.prototype.setValue = function ( value ) {
+       value = !!value;
+       if ( this.value !== value ) {
+               this.value = value;
+               this.$input.prop( 'checked', this.value );
+               this.emit( 'change', this.value );
+       }
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.CheckboxInputWidget.prototype.onEdit = function () {
+       if ( !this.disabled ) {
+               // Allow the stack to clear so the value will be updated
+               setTimeout( OO.ui.bind( function () {
+                       this.setValue( this.$input.prop( 'checked' ) );
+               }, this ) );
+       }
+};
+/**
+ * Creates an OO.ui.LabelWidget object.
+ *
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.LabeledElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.LabelWidget = function OoUiLabelWidget( config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Widget.call( this, config );
+
+       // Mixin constructors
+       OO.ui.LabeledElement.call( this, this.$element, config );
+
+       // Properties
+       this.input = config.input;
+
+       // Events
+       if ( this.input instanceof OO.ui.InputWidget ) {
+               this.$element.on( 'click', OO.ui.bind( this.onClick, this ) );
+       }
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-labelWidget' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.LabelWidget, OO.ui.Widget );
+
+OO.mixinClass( OO.ui.LabelWidget, OO.ui.LabeledElement );
+
+/* Static Properties */
+
+OO.ui.LabelWidget.static.tagName = 'label';
+
+/* Methods */
+
+/**
+ * Handles label mouse click events.
+ *
+ * @method
+ * @param {jQuery.Event} e Mouse click event
+ */
+OO.ui.LabelWidget.prototype.onClick = function () {
+       this.input.simulateLabelClick();
+       return false;
+};
+/**
+ * Lookup input widget.
+ *
+ * Mixin that adds a menu showing suggested values to a text input. Subclasses must handle `select`
+ * events on #lookupMenu to make use of selections.
+ *
+ * @class
+ * @abstract
+ *
+ * @constructor
+ * @param {OO.ui.TextInputWidget} input Input widget
+ * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$overlay=this.$( 'body' )] Overlay layer
+ */
+OO.ui.LookupInputWidget = function OoUiLookupInputWidget( input, config ) {
+       // Config intialization
+       config = config || {};
+
+       // Properties
+       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
+       } );
+       this.lookupCache = {};
+       this.lookupQuery = null;
+       this.lookupRequest = null;
+       this.populating = false;
+
+       // Events
+       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 )
+       } );
+       this.lookupInput.connect( this, { 'change': 'onLookupInputChange' } );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-lookupWidget' );
+       this.lookupMenu.$element.addClass( 'oo-ui-lookupWidget-menu' );
+};
+
+/* Methods */
+
+/**
+ * Handle input focus event.
+ *
+ * @method
+ * @param {jQuery.Event} e Input focus event
+ */
+OO.ui.LookupInputWidget.prototype.onLookupInputFocus = function () {
+       this.openLookupMenu();
+};
+
+/**
+ * Handle input blur event.
+ *
+ * @method
+ * @param {jQuery.Event} e Input blur event
+ */
+OO.ui.LookupInputWidget.prototype.onLookupInputBlur = function () {
+       this.lookupMenu.hide();
+};
+
+/**
+ * Handle input mouse down event.
+ *
+ * @method
+ * @param {jQuery.Event} e Input mouse down event
+ */
+OO.ui.LookupInputWidget.prototype.onLookupInputMouseDown = function () {
+       this.openLookupMenu();
+};
+
+/**
+ * Handle input change event.
+ *
+ * @method
+ * @param {string} value New input value
+ */
+OO.ui.LookupInputWidget.prototype.onLookupInputChange = function () {
+       this.openLookupMenu();
+};
+
+/**
+ * Open the menu.
+ *
+ * @method
+ * @chainable
+ */
+OO.ui.LookupInputWidget.prototype.openLookupMenu = function () {
+       var value = this.lookupInput.getValue();
+
+       if ( this.lookupMenu.$input.is( ':focus' ) && $.trim( value ) !== '' ) {
+               this.populateLookupMenu();
+               if ( !this.lookupMenu.isVisible() ) {
+                       this.lookupMenu.show();
+               }
+       } else {
+               this.lookupMenu.clearItems();
+               this.lookupMenu.hide();
+       }
+
+       return this;
+};
+
+/**
+ * Populate lookup menu with current information.
+ *
+ * @method
+ * @chainable
+ */
+OO.ui.LookupInputWidget.prototype.populateLookupMenu = function () {
+       if ( !this.populating ) {
+               this.populating = true;
+               this.getLookupMenuItems()
+                       .done( OO.ui.bind( function ( items ) {
+                               this.lookupMenu.clearItems();
+                               if ( items.length ) {
+                                       this.lookupMenu.show();
+                                       this.lookupMenu.addItems( items );
+                                       this.initializeLookupMenuSelection();
+                                       this.openLookupMenu();
+                               } else {
+                                       this.lookupMenu.hide();
+                               }
+                               this.populating = false;
+                       }, this ) )
+                       .fail( OO.ui.bind( function () {
+                               this.lookupMenu.clearItems();
+                               this.populating = false;
+                       }, this ) );
+       }
+
+       return this;
+};
+
+/**
+ * Set selection in the lookup menu with current information.
+ *
+ * @method
+ * @chainable
+ */
+OO.ui.LookupInputWidget.prototype.initializeLookupMenuSelection = function () {
+       if ( !this.lookupMenu.getSelectedItem() ) {
+               this.lookupMenu.intializeSelection( this.lookupMenu.getFirstSelectableItem() );
+       }
+       this.lookupMenu.highlightItem( this.lookupMenu.getSelectedItem() );
+};
+
+/**
+ * Get lookup menu items for the current query.
+ *
+ * @method
+ * @returns {jQuery.Promise} Promise object which will be passed menu items as the first argument
+ * of the done event
+ */
+OO.ui.LookupInputWidget.prototype.getLookupMenuItems = function () {
+       var value = this.lookupInput.getValue(),
+               deferred = $.Deferred();
+
+       if ( value && value !== this.lookupQuery ) {
+               // Abort current request if query has changed
+               if ( this.lookupRequest ) {
+                       this.lookupRequest.abort();
+                       this.lookupQuery = null;
+                       this.lookupRequest = null;
+               }
+               if ( value in this.lookupCache ) {
+                       deferred.resolve( this.getLookupMenuItemsFromData( this.lookupCache[value] ) );
+               } else {
+                       this.lookupQuery = value;
+                       this.lookupRequest = this.getLookupRequest()
+                               .always( OO.ui.bind( function () {
+                                       this.lookupQuery = null;
+                                       this.lookupRequest = null;
+                               }, this ) )
+                               .done( OO.ui.bind( function ( data ) {
+                                       this.lookupCache[value] = this.getLookupCacheItemFromData( data );
+                                       deferred.resolve( this.getLookupMenuItemsFromData( this.lookupCache[value] ) );
+                               }, this ) )
+                               .fail( function () {
+                                       deferred.reject();
+                               } );
+                       this.pushPending();
+                       this.lookupRequest.always( OO.ui.bind( function () {
+                               this.popPending();
+                       }, this ) );
+               }
+       }
+       return deferred.promise();
+};
+
+/**
+ * Get a new request object of the current lookup query value.
+ *
+ * @method
+ * @abstract
+ * @returns {jqXHR} jQuery AJAX object, or promise object with an .abort() method
+ */
+OO.ui.LookupInputWidget.prototype.getLookupRequest = function () {
+       // Stub, implemented in subclass
+       return null;
+};
+
+/**
+ * Handle successful lookup request.
+ *
+ * Overriding methods should call #populateLookupMenu when results are available and cache results
+ * for future lookups in #lookupCache as an array of #OO.ui.MenuItemWidget objects.
+ *
+ * @method
+ * @abstract
+ * @param {Mixed} data Response from server
+ */
+OO.ui.LookupInputWidget.prototype.onLookupRequestDone = function () {
+       // Stub, implemented in subclass
+};
+
+/**
+ * Get a list of menu item widgets from the data stored by the lookup request's done handler.
+ *
+ * @method
+ * @abstract
+ * @param {Mixed} data Cached result data, usually an array
+ * @returns {OO.ui.MenuItemWidget[]} Menu items
+ */
+OO.ui.LookupInputWidget.prototype.getLookupMenuItemsFromData = function () {
+       // Stub, implemented in subclass
+       return [];
+};
+/**
+ * Creates an OO.ui.OptionWidget object.
+ *
+ * @class
+ * @abstract
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.IconedElement
+ * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.IndicatedElement
+ * @mixins OO.ui.FlaggableElement
+ *
+ * @constructor
+ * @param {Mixed} data Option data
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [selected=false] Select option
+ * @cfg {boolean} [highlighted=false] Highlight option
+ * @cfg {string} [rel] Value for `rel` attribute in DOM, allowing per-option styling
+ */
+OO.ui.OptionWidget = function OoUiOptionWidget( data, config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Widget.call( this, config );
+
+       // Mixin constructors
+       OO.ui.ItemWidget.call( this );
+       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
+       OO.ui.LabeledElement.call( this, this.$( '<span>' ), config );
+       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
+       OO.ui.FlaggableElement.call( this, config );
+
+       // Properties
+       this.data = data;
+       this.selected = false;
+       this.highlighted = false;
+
+       // Initialization
+       this.$element
+               .data( 'oo-ui-optionWidget', this )
+               .attr( 'rel', config.rel )
+               .addClass( 'oo-ui-optionWidget' )
+               .append( this.$label );
+       this.setSelected( config.selected );
+       this.setHighlighted( config.highlighted );
+
+       // Options
+       this.$element
+               .prepend( this.$icon )
+               .append( this.$indicator );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.OptionWidget, OO.ui.Widget );
+
+OO.mixinClass( OO.ui.OptionWidget, OO.ui.ItemWidget );
+OO.mixinClass( OO.ui.OptionWidget, OO.ui.IconedElement );
+OO.mixinClass( OO.ui.OptionWidget, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.OptionWidget, OO.ui.IndicatedElement );
+OO.mixinClass( OO.ui.OptionWidget, OO.ui.FlaggableElement );
+
+/* Static Properties */
+
+OO.ui.OptionWidget.static.tagName = 'li';
+
+OO.ui.OptionWidget.static.selectable = true;
+
+OO.ui.OptionWidget.static.highlightable = true;
+
+OO.ui.OptionWidget.static.scrollIntoViewOnSelect = false;
+
+/* Methods */
+
+/**
+ * Check if option can be selected.
+ *
+ * @method
+ * @returns {boolean} Item is selectable
+ */
+OO.ui.OptionWidget.prototype.isSelectable = function () {
+       return this.constructor.static.selectable && !this.disabled;
+};
+
+/**
+ * Check if option can be highlighted.
+ *
+ * @method
+ * @returns {boolean} Item is highlightable
+ */
+OO.ui.OptionWidget.prototype.isHighlightable = function () {
+       return this.constructor.static.highlightable && !this.disabled;
+};
+
+/**
+ * Check if option is selected.
+ *
+ * @method
+ * @returns {boolean} Item is selected
+ */
+OO.ui.OptionWidget.prototype.isSelected = function () {
+       return this.selected;
+};
+
+/**
+ * Check if option is highlighted.
+ *
+ * @method
+ * @returns {boolean} Item is highlighted
+ */
+OO.ui.OptionWidget.prototype.isHighlighted = function () {
+       return this.highlighted;
+};
+
+/**
+ * Set selected state.
+ *
+ * @method
+ * @param {boolean} [state=false] Select option
+ * @chainable
+ */
+OO.ui.OptionWidget.prototype.setSelected = function ( state ) {
+       if ( !this.disabled && this.constructor.static.selectable ) {
+               this.selected = !!state;
+               if ( this.selected ) {
+                       this.$element.addClass( 'oo-ui-optionWidget-selected' );
+                       if ( this.constructor.static.scrollIntoViewOnSelect ) {
+                               this.scrollElementIntoView();
+                       }
+               } else {
+                       this.$element.removeClass( 'oo-ui-optionWidget-selected' );
+               }
+       }
+       return this;
+};
+
+/**
+ * Set highlighted state.
+ *
+ * @method
+ * @param {boolean} [state=false] Highlight option
+ * @chainable
+ */
+OO.ui.OptionWidget.prototype.setHighlighted = function ( state ) {
+       if ( !this.disabled && this.constructor.static.highlightable ) {
+               this.highlighted = !!state;
+               if ( this.highlighted ) {
+                       this.$element.addClass( 'oo-ui-optionWidget-highlighted' );
+               } else {
+                       this.$element.removeClass( 'oo-ui-optionWidget-highlighted' );
+               }
+       }
+       return this;
+};
+
+/**
+ * Make the option's highlight flash.
+ *
+ * @method
+ * @param {Function} [done] Callback to execute when flash effect is complete.
+ */
+OO.ui.OptionWidget.prototype.flash = function ( done ) {
+       var $this = this.$element;
+
+       if ( !this.disabled && this.constructor.static.highlightable ) {
+               $this.removeClass( 'oo-ui-optionWidget-highlighted' );
+               setTimeout( OO.ui.bind( function () {
+                       $this.addClass( 'oo-ui-optionWidget-highlighted' );
+                       if ( done ) {
+                               setTimeout( done, 100 );
+                       }
+               }, this ), 100 );
+       }
+};
+
+/**
+ * Get option data.
+ *
+ * @method
+ * @returns {Mixed} Option data
+ */
+OO.ui.OptionWidget.prototype.getData = function () {
+       return this.data;
+};
+/**
+ * Create an OO.ui.SelectWidget object.
+ *
+ * @class
+ * @abstract
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.GroupElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {OO.ui.OptionWidget[]} [items] Options to add
+ */
+OO.ui.SelectWidget = function OoUiSelectWidget( config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Widget.call( this, config );
+
+       // Mixin constructors
+       OO.ui.GroupWidget.call( this, this.$element, config );
+
+       // Properties
+       this.pressed = false;
+       this.selecting = null;
+       this.hashes = {};
+
+       // Events
+       this.$element.on( {
+               'mousedown': OO.ui.bind( this.onMouseDown, this ),
+               'mouseup': OO.ui.bind( this.onMouseUp, this ),
+               'mousemove': OO.ui.bind( this.onMouseMove, this ),
+               'mouseover': OO.ui.bind( this.onMouseOver, this ),
+               'mouseleave': OO.ui.bind( this.onMouseLeave, this )
+       } );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-selectWidget' );
+       if ( $.isArray( config.items ) ) {
+               this.addItems( config.items );
+       }
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.SelectWidget, OO.ui.Widget );
+
+// Need to mixin base class as well
+OO.mixinClass( OO.ui.SelectWidget, OO.ui.GroupElement );
+
+OO.mixinClass( OO.ui.SelectWidget, OO.ui.GroupWidget );
+
+/* Events */
+
+/**
+ * @event highlight
+ * @param {OO.ui.OptionWidget|null} item Highlighted item
+ */
+
+/**
+ * @event select
+ * @param {OO.ui.OptionWidget|null} item Selected item
+ */
+
+/**
+ * @event add
+ * @param {OO.ui.OptionWidget[]} items Added items
+ * @param {number} index Index items were added at
+ */
+
+/**
+ * @event remove
+ * @param {OO.ui.OptionWidget[]} items Removed items
+ */
+
+/* Static Properties */
+
+OO.ui.SelectWidget.static.tagName = 'ul';
+
+/* Methods */
+
+/**
+ * Handle mouse down events.
+ *
+ * @method
+ * @private
+ * @param {jQuery.Event} e Mouse down event
+ */
+OO.ui.SelectWidget.prototype.onMouseDown = function ( e ) {
+       var item;
+
+       if ( !this.disabled && e.which === 1 ) {
+               this.pressed = true;
+               item = this.getTargetItem( e );
+               if ( item && item.isSelectable() ) {
+                       this.intializeSelection( item );
+                       this.selecting = item;
+                       this.$( this.$.context ).one( 'mouseup', OO.ui.bind( this.onMouseUp, this ) );
+               }
+       }
+       return false;
+};
+
+/**
+ * Handle mouse up events.
+ *
+ * @method
+ * @private
+ * @param {jQuery.Event} e Mouse up event
+ */
+OO.ui.SelectWidget.prototype.onMouseUp = function ( e ) {
+       var item;
+       this.pressed = false;
+       if ( !this.selecting ) {
+               item = this.getTargetItem( e );
+               if ( item && item.isSelectable() ) {
+                       this.selecting = item;
+               }
+       }
+       if ( !this.disabled && e.which === 1 && this.selecting ) {
+               this.selectItem( this.selecting );
+               this.selecting = null;
+       }
+       return false;
+};
+
+/**
+ * Handle mouse move events.
+ *
+ * @method
+ * @private
+ * @param {jQuery.Event} e Mouse move event
+ */
+OO.ui.SelectWidget.prototype.onMouseMove = function ( e ) {
+       var item;
+
+       if ( !this.disabled && this.pressed ) {
+               item = this.getTargetItem( e );
+               if ( item && item !== this.selecting && item.isSelectable() ) {
+                       this.intializeSelection( item );
+                       this.selecting = item;
+               }
+       }
+       return false;
+};
+
+/**
+ * Handle mouse over events.
+ *
+ * @method
+ * @private
+ * @param {jQuery.Event} e Mouse over event
+ */
+OO.ui.SelectWidget.prototype.onMouseOver = function ( e ) {
+       var item;
+
+       if ( !this.disabled ) {
+               item = this.getTargetItem( e );
+               if ( item && item.isHighlightable() ) {
+                       this.highlightItem( item );
+               }
+       }
+       return false;
+};
+
+/**
+ * Handle mouse leave events.
+ *
+ * @method
+ * @private
+ * @param {jQuery.Event} e Mouse over event
+ */
+OO.ui.SelectWidget.prototype.onMouseLeave = function () {
+       if ( !this.disabled ) {
+               this.highlightItem();
+       }
+       return false;
+};
+
+/**
+ * Get the closest item to a jQuery.Event.
+ *
+ * @method
+ * @private
+ * @param {jQuery.Event} e
+ * @returns {OO.ui.OptionWidget|null} Outline item widget, `null` if none was found
+ */
+OO.ui.SelectWidget.prototype.getTargetItem = function ( e ) {
+       var $item = this.$( e.target ).closest( '.oo-ui-optionWidget' );
+       if ( $item.length ) {
+               return $item.data( 'oo-ui-optionWidget' );
+       }
+       return null;
+};
+
+/**
+ * Get selected item.
+ *
+ * @method
+ * @returns {OO.ui.OptionWidget|null} Selected item, `null` if no item is selected
+ */
+OO.ui.SelectWidget.prototype.getSelectedItem = function () {
+       var i, len;
+
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               if ( this.items[i].isSelected() ) {
+                       return this.items[i];
+               }
+       }
+       return null;
+};
+
+/**
+ * Get highlighted item.
+ *
+ * @method
+ * @returns {OO.ui.OptionWidget|null} Highlighted item, `null` if no item is highlighted
+ */
+OO.ui.SelectWidget.prototype.getHighlightedItem = function () {
+       var i, len;
+
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               if ( this.items[i].isHighlighted() ) {
+                       return this.items[i];
+               }
+       }
+       return null;
+};
+
+/**
+ * Get an existing item with equivilant data.
+ *
+ * @method
+ * @param {Object} data Item data to search for
+ * @returns {OO.ui.OptionWidget|null} Item with equivilent value, `null` if none exists
+ */
+OO.ui.SelectWidget.prototype.getItemFromData = function ( data ) {
+       var hash = OO.getHash( data );
+
+       if ( hash in this.hashes ) {
+               return this.hashes[hash];
+       }
+
+       return null;
+};
+
+/**
+ * Highlight an item.
+ *
+ * Highlighting is mutually exclusive.
+ *
+ * @method
+ * @param {OO.ui.OptionWidget} [item] Item to highlight, omit to deselect all
+ * @fires highlight
+ * @chainable
+ */
+OO.ui.SelectWidget.prototype.highlightItem = function ( item ) {
+       var i, len;
+
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               this.items[i].setHighlighted( this.items[i] === item );
+       }
+       this.emit( 'highlight', item );
+
+       return this;
+};
+
+/**
+ * Select an item.
+ *
+ * @method
+ * @param {OO.ui.OptionWidget} [item] Item to select, omit to deselect all
+ * @fires select
+ * @chainable
+ */
+OO.ui.SelectWidget.prototype.selectItem = function ( item ) {
+       var i, len;
+
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               this.items[i].setSelected( this.items[i] === item );
+       }
+       this.emit( 'select', item );
+
+       return this;
+};
+
+/**
+ * Setup selection and highlighting.
+ *
+ * This should be used to synchronize the UI with the model without emitting events that would in
+ * turn update the model.
+ *
+ * @param {OO.ui.OptionWidget} [item] Item to select
+ * @chainable
+ */
+OO.ui.SelectWidget.prototype.intializeSelection = function( item ) {
+       var i, len, selected;
+
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               selected = this.items[i] === item;
+               this.items[i].setSelected( selected );
+               this.items[i].setHighlighted( selected );
+       }
+
+       return this;
+};
+
+/**
+ * Get an item relative to another one.
+ *
+ * @method
+ * @param {OO.ui.OptionWidget} item Item to start at
+ * @param {number} direction Direction to move in
+ * @returns {OO.ui.OptionWidget|null} Item at position, `null` if there are no items in the menu
+ */
+OO.ui.SelectWidget.prototype.getRelativeSelectableItem = function ( item, direction ) {
+       var inc = direction > 0 ? 1 : -1,
+               len = this.items.length,
+               index = item instanceof OO.ui.OptionWidget ?
+                       $.inArray( item, this.items ) : ( inc > 0 ? -1 : 0 ),
+               stopAt = Math.max( Math.min( index, len - 1 ), 0 ),
+               i = inc > 0 ?
+                       // Default to 0 instead of -1, if nothing is selected let's start at the beginning
+                       Math.max( index, -1 ) :
+                       // Default to n-1 instead of -1, if nothing is selected let's start at the end
+                       Math.min( index, len );
+
+       while ( true ) {
+               i = ( i + inc + len ) % len;
+               item = this.items[i];
+               if ( item instanceof OO.ui.OptionWidget && item.isSelectable() ) {
+                       return item;
+               }
+               // Stop iterating when we've looped all the way around
+               if ( i === stopAt ) {
+                       break;
+               }
+       }
+       return null;
+};
+
+/**
+ * Get the next selectable item.
+ *
+ * @method
+ * @returns {OO.ui.OptionWidget|null} Item, `null` if ther aren't any selectable items
+ */
+OO.ui.SelectWidget.prototype.getFirstSelectableItem = function () {
+       var i, len, item;
+
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               item = this.items[i];
+               if ( item instanceof OO.ui.OptionWidget && item.isSelectable() ) {
+                       return item;
+               }
+       }
+
+       return null;
+};
+
+/**
+ * Add items.
+ *
+ * When items are added with the same values as existing items, the existing items will be
+ * automatically removed before the new items are added.
+ *
+ * @method
+ * @param {OO.ui.OptionWidget[]} items Items to add
+ * @param {number} [index] Index to insert items after
+ * @fires add
+ * @chainable
+ */
+OO.ui.SelectWidget.prototype.addItems = function ( items, index ) {
+       var i, len, item, hash,
+               remove = [];
+
+       for ( i = 0, len = items.length; i < len; i++ ) {
+               item = items[i];
+               hash = OO.getHash( item.getData() );
+               if ( hash in this.hashes ) {
+                       // Remove item with same value
+                       remove.push( this.hashes[hash] );
+               }
+               this.hashes[hash] = item;
+       }
+       if ( remove.length ) {
+               this.removeItems( remove );
+       }
+
+       OO.ui.GroupElement.prototype.addItems.call( this, items, index );
+
+       // Always provide an index, even if it was omitted
+       this.emit( 'add', items, index === undefined ? this.items.length - items.length - 1 : index );
+
+       return this;
+};
+
+/**
+ * Remove items.
+ *
+ * Items will be detached, not removed, so they can be used later.
+ *
+ * @method
+ * @param {OO.ui.OptionWidget[]} items Items to remove
+ * @fires remove
+ * @chainable
+ */
+OO.ui.SelectWidget.prototype.removeItems = function ( items ) {
+       var i, len, item, hash;
+
+       for ( i = 0, len = items.length; i < len; i++ ) {
+               item = items[i];
+               hash = OO.getHash( item.getData() );
+               if ( hash in this.hashes ) {
+                       // Remove existing item
+                       delete this.hashes[hash];
+               }
+               if ( item.isSelected() ) {
+                       this.selectItem( null );
+               }
+       }
+       OO.ui.GroupElement.prototype.removeItems.call( this, items );
+
+       this.emit( 'remove', items );
+
+       return this;
+};
+
+/**
+ * Clear all items.
+ *
+ * Items will be detached, not removed, so they can be used later.
+ *
+ * @method
+ * @fires remove
+ * @chainable
+ */
+OO.ui.SelectWidget.prototype.clearItems = function () {
+       var items = this.items.slice();
+
+       // Clear all items
+       this.hashes = {};
+       OO.ui.GroupElement.prototype.clearItems.call( this );
+       this.selectItem( null );
+
+       this.emit( 'remove', items );
+
+       return this;
+};
+/**
+ * Creates an OO.ui.MenuItemWidget object.
+ *
+ * @class
+ * @extends OO.ui.OptionWidget
+ *
+ * @constructor
+ * @param {Mixed} data Item data
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.MenuItemWidget = function OoUiMenuItemWidget( data, config ) {
+       // Configuration initialization
+       config = $.extend( { 'icon': 'check' }, config );
+
+       // Parent constructor
+       OO.ui.OptionWidget.call( this, data, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-menuItemWidget' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.MenuItemWidget, OO.ui.OptionWidget );
+/**
+ * Create an OO.ui.MenuWidget object.
+ *
+ * @class
+ * @extends OO.ui.SelectWidget
+ * @mixins OO.ui.ClippableElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {OO.ui.InputWidget} [input] Input to bind keyboard handlers to
+ */
+OO.ui.MenuWidget = function OoUiMenuWidget( config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.SelectWidget.call( this, config );
+
+       // Mixin constructors
+       OO.ui.ClippableElement.call( this, this.$group, config );
+
+       // Properties
+       this.newItems = [];
+       this.$input = config.input ? config.input.$input : null;
+       this.$previousFocus = null;
+       this.isolated = !config.input;
+       this.visible = false;
+       this.onKeyDownHandler = OO.ui.bind( this.onKeyDown, this );
+
+       // Initialization
+       this.$element.hide().addClass( 'oo-ui-menuWidget' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.MenuWidget, OO.ui.SelectWidget );
+
+OO.mixinClass( OO.ui.MenuWidget, OO.ui.ClippableElement );
+
+/* Methods */
+
+/**
+ * Handles key down events.
+ *
+ * @method
+ * @param {jQuery.Event} e Key down event
+ */
+OO.ui.MenuWidget.prototype.onKeyDown = function ( e ) {
+       var nextItem,
+               handled = false,
+               highlightItem = this.getHighlightedItem();
+
+       if ( !this.disabled && this.visible ) {
+               if ( !highlightItem ) {
+                       highlightItem = this.getSelectedItem();
+               }
+               switch ( e.keyCode ) {
+                       case OO.ui.Keys.ENTER:
+                               this.selectItem( highlightItem );
+                               handled = true;
+                               break;
+                       case OO.ui.Keys.UP:
+                               nextItem = this.getRelativeSelectableItem( highlightItem, -1 );
+                               handled = true;
+                               break;
+                       case OO.ui.Keys.DOWN:
+                               nextItem = this.getRelativeSelectableItem( highlightItem, 1 );
+                               handled = true;
+                               break;
+                       case OO.ui.Keys.ESCAPE:
+                               if ( highlightItem ) {
+                                       highlightItem.setHighlighted( false );
+                               }
+                               this.hide();
+                               handled = true;
+                               break;
+               }
+
+               if ( nextItem ) {
+                       this.highlightItem( nextItem );
+                       nextItem.scrollElementIntoView();
+               }
+
+               if ( handled ) {
+                       e.preventDefault();
+                       e.stopPropagation();
+                       return false;
+               }
+       }
+};
+
+/**
+ * Check if the menu is visible.
+ *
+ * @method
+ * @returns {boolean} Menu is visible
+ */
+OO.ui.MenuWidget.prototype.isVisible = function () {
+       return this.visible;
+};
+
+/**
+ * Bind key down listener
+ *
+ * @method
+ */
+OO.ui.MenuWidget.prototype.bindKeyDownListener = function () {
+       if ( this.$input ) {
+               this.$input.on( 'keydown', this.onKeyDownHandler );
+       } else {
+               // Capture menu navigation keys
+               this.getElementWindow().addEventListener( 'keydown', this.onKeyDownHandler, true );
+       }
+};
+
+/**
+ * Unbind key down listener
+ *
+ * @method
+ */
+OO.ui.MenuWidget.prototype.unbindKeyDownListener = function () {
+       if ( this.$input ) {
+               this.$input.off( 'keydown' );
+       } else {
+               this.getElementWindow().removeEventListener( 'keydown', this.onKeyDownHandler, true );
+       }
+};
+
+/**
+ * Select an item.
+ *
+ * The menu will stay open if an item is silently selected.
+ *
+ * @method
+ * @param {OO.ui.OptionWidget} [item] Item to select, omit to deselect all
+ * @chainable
+ */
+OO.ui.MenuWidget.prototype.selectItem = function ( item ) {
+       // Parent method
+       OO.ui.SelectWidget.prototype.selectItem.call( this, item );
+
+       if ( !this.disabled ) {
+               if ( item ) {
+                       this.disabled = true;
+                       item.flash( OO.ui.bind( function () {
+                               this.hide();
+                               this.disabled = false;
+                       }, this ) );
+               } else {
+                       this.hide();
+               }
+       }
+
+       return this;
+};
+
+/**
+ * Add items.
+ *
+ * Adding an existing item (by value) will move it.
+ *
+ * @method
+ * @param {OO.ui.MenuItemWidget[]} items Items to add
+ * @param {number} [index] Index to insert items after
+ * @chainable
+ */
+OO.ui.MenuWidget.prototype.addItems = function ( items, index ) {
+       var i, len, item;
+
+       // Parent method
+       OO.ui.SelectWidget.prototype.addItems.call( this, items, index );
+
+       for ( i = 0, len = items.length; i < len; i++ ) {
+               item = items[i];
+               if ( this.visible ) {
+                       // Defer fitting label until
+                       item.fitLabel();
+               } else {
+                       this.newItems.push( item );
+               }
+       }
+
+       return this;
+};
+
+/**
+ * Show the menu.
+ *
+ * @method
+ * @chainable
+ */
+OO.ui.MenuWidget.prototype.show = function () {
+       var i, len;
+
+       if ( this.items.length ) {
+               this.$element.show();
+               this.visible = true;
+               this.bindKeyDownListener();
+
+               // Change focus to enable keyboard navigation
+               if ( this.isolated && this.$input && !this.$input.is( ':focus' ) ) {
+                       this.$previousFocus = this.$( ':focus' );
+                       this.$input.focus();
+               }
+               if ( this.newItems.length ) {
+                       for ( i = 0, len = this.newItems.length; i < len; i++ ) {
+                               this.newItems[i].fitLabel();
+                       }
+                       this.newItems = [];
+               }
+
+               this.setClipping( true );
+       }
+
+       return this;
+};
+
+/**
+ * Hide the menu.
+ *
+ * @method
+ * @chainable
+ */
+OO.ui.MenuWidget.prototype.hide = function () {
+       this.$element.hide();
+       this.visible = false;
+       this.unbindKeyDownListener();
+
+       if ( this.isolated && this.$previousFocus ) {
+               this.$previousFocus.focus();
+               this.$previousFocus = null;
+       }
+
+       this.setClipping( false );
+
+       return this;
+};
+/**
+ * Creates an OO.ui.MenuSectionItemWidget object.
+ *
+ * @class
+ * @extends OO.ui.OptionWidget
+ *
+ * @constructor
+ * @param {Mixed} data Item data
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.MenuSectionItemWidget = function OoUiMenuSectionItemWidget( data, config ) {
+       // Parent constructor
+       OO.ui.OptionWidget.call( this, data, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-menuSectionItemWidget' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.MenuSectionItemWidget, OO.ui.OptionWidget );
+
+OO.ui.MenuSectionItemWidget.static.selectable = false;
+
+OO.ui.MenuSectionItemWidget.static.highlightable = false;
+/**
+ * Create an OO.ui.OutlineWidget object.
+ *
+ * @class
+ * @extends OO.ui.SelectWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.OutlineWidget = function OoUiOutlineWidget( config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.SelectWidget.call( this, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-outlineWidget' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.OutlineWidget, OO.ui.SelectWidget );
+/**
+ * Creates an OO.ui.OutlineControlsWidget object.
+ *
+ * @class
+ *
+ * @constructor
+ * @param {OO.ui.OutlineWidget} outline Outline to control
+ * @param {Object} [config] Configuration options
+ * @cfg {Object[]} [adders] List of icons to show as addable item types, each an object with
+ *  name, title and icon properties
+ */
+OO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Widget.call( this, config );
+
+       // Properties
+       this.outline = outline;
+       this.adders = {};
+       this.$adders = this.$( '<div>' );
+       this.$movers = this.$( '<div>' );
+       this.addButton = new OO.ui.ButtonWidget( {
+               '$': this.$,
+               'frameless': true,
+               'icon': 'add-item'
+       } );
+       this.upButton = new OO.ui.ButtonWidget( {
+               '$': this.$,
+               'frameless': true,
+               'icon': 'collapse',
+               'title': OO.ui.msg( 'ooui-outline-control-move-up' )
+       } );
+       this.downButton = new OO.ui.ButtonWidget( {
+               '$': this.$,
+               'frameless': true,
+               'icon': 'expand',
+               'title': OO.ui.msg( 'ooui-outline-control-move-down' )
+       } );
+
+       // Events
+       outline.connect( this, {
+               'select': 'onOutlineChange',
+               'add': 'onOutlineChange',
+               'remove': 'onOutlineChange'
+       } );
+       this.upButton.connect( this, { 'click': ['emit', 'move', -1] } );
+       this.downButton.connect( this, { 'click': ['emit', 'move', 1] } );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-outlineControlsWidget' );
+       this.$adders.addClass( 'oo-ui-outlineControlsWidget-adders' );
+       this.$movers
+               .addClass( 'oo-ui-outlineControlsWidget-movers' )
+               .append( this.upButton.$element, this.downButton.$element );
+       this.$element.append( this.$adders, this.$movers );
+       if ( config.adders && config.adders.length ) {
+               this.setupAdders( config.adders );
+       }
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.OutlineControlsWidget, OO.ui.Widget );
+
+/* Events */
+
+/**
+ * @event move
+ * @param {number} places Number of places to move
+ */
+
+/* Methods */
+
+/**
+ * Handle outline change events.
+ *
+ * @method
+ */
+OO.ui.OutlineControlsWidget.prototype.onOutlineChange = function () {
+       var i, len, firstMovable, lastMovable,
+               movable = false,
+               items = this.outline.getItems(),
+               selectedItem = this.outline.getSelectedItem();
+
+       if ( selectedItem && selectedItem.isMovable() ) {
+               movable = true;
+               i = -1;
+               len = items.length;
+               while ( ++i < len ) {
+                       if ( items[i].isMovable() ) {
+                               firstMovable = items[i];
+                               break;
+                       }
+               }
+               i = len;
+               while ( i-- ) {
+                       if ( items[i].isMovable() ) {
+                               lastMovable = items[i];
+                               break;
+                       }
+               }
+       }
+       this.upButton.setDisabled( !movable || selectedItem === firstMovable );
+       this.downButton.setDisabled( !movable || selectedItem === lastMovable );
+};
+
+/**
+ * Setup adders icons.
+ *
+ * @method
+ * @param {Object[]} adders List of configuations for adder buttons, each containing a name, title
+ *  and icon property
+ */
+OO.ui.OutlineControlsWidget.prototype.setupAdders = function ( adders ) {
+       var i, len, addition, button,
+               $buttons = this.$( [] );
+
+       this.$adders.append( this.addButton.$element );
+       for ( i = 0, len = adders.length; i < len; i++ ) {
+               addition = adders[i];
+               button = new OO.ui.ButtonWidget( {
+                       '$': this.$, 'frameless': true, 'icon': addition.icon, 'title': addition.title
+               } );
+               button.connect( this, { 'click': ['emit', 'add', addition.name] } );
+               this.adders[addition.name] = button;
+               this.$adders.append( button.$element );
+               $buttons = $buttons.add( button.$element );
+       }
+};
+/**
+ * Creates an OO.ui.OutlineItemWidget object.
+ *
+ * @class
+ * @extends OO.ui.OptionWidget
+ *
+ * @constructor
+ * @param {Mixed} data Item data
+ * @param {Object} [config] Configuration options
+ * @cfg {number} [level] Indentation level
+ * @cfg {boolean} [movable] Allow modification from outline controls
+ */
+OO.ui.OutlineItemWidget = function OoUiOutlineItemWidget( data, config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.OptionWidget.call( this, data, config );
+
+       // Properties
+       this.level = 0;
+       this.movable = !!config.movable;
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-outlineItemWidget' );
+       this.setLevel( config.level );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.OutlineItemWidget, OO.ui.OptionWidget );
+
+/* Static Properties */
+
+OO.ui.OutlineItemWidget.static.highlightable = false;
+
+OO.ui.OutlineItemWidget.static.scrollIntoViewOnSelect = true;
+
+OO.ui.OutlineItemWidget.static.levelClass = 'oo-ui-outlineItemWidget-level-';
+
+OO.ui.OutlineItemWidget.static.levels = 3;
+
+/* Methods */
+
+/**
+ * Check if item is movable.
+ *
+ * Movablilty is used by outline controls.
+ *
+ * @returns {boolean} Item is movable
+ */
+OO.ui.OutlineItemWidget.prototype.isMovable = function () {
+       return this.movable;
+};
+
+/**
+ * Get indentation level.
+ *
+ * @returns {number} Indentation level
+ */
+OO.ui.OutlineItemWidget.prototype.getLevel = function () {
+       return this.level;
+};
+
+/**
+ * Set movability.
+ *
+ * Movablilty is used by outline controls.
+ *
+ * @param {boolean} movable Item is movable
+ * @chainable
+ */
+OO.ui.OutlineItemWidget.prototype.setMovable = function ( movable ) {
+       this.movable = !!movable;
+       return this;
+};
+
+/**
+ * Set indentation level.
+ *
+ * @method
+ * @param {number} [level=0] Indentation level, in the range of [0,#maxLevel]
+ * @chainable
+ */
+OO.ui.OutlineItemWidget.prototype.setLevel = function ( level ) {
+       var levels = this.constructor.static.levels,
+               levelClass = this.constructor.static.levelClass,
+               i = levels;
+
+       this.level = level ? Math.max( 0, Math.min( levels - 1, level ) ) : 0;
+       while ( i-- ) {
+               if ( this.level === i ) {
+                       this.$element.addClass( levelClass + i );
+               } else {
+                       this.$element.removeClass( levelClass + i );
+               }
+       }
+
+       return this;
+};
+/**
+ * Create an OO.ui.ButtonSelect object.
+ *
+ * @class
+ * @extends OO.ui.OptionWidget
+ * @mixins OO.ui.ButtonedElement
+ * @mixins OO.ui.FlaggableElement
+ *
+ * @constructor
+ * @param {Mixed} data Option data
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.ButtonOptionWidget = function OoUiButtonOptionWidget( data, config ) {
+       // Parent constructor
+       OO.ui.OptionWidget.call( this, data, config );
+
+       // Mixin constructors
+       OO.ui.ButtonedElement.call( this, this.$( '<a>' ), config );
+       OO.ui.FlaggableElement.call( this, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-buttonOptionWidget' );
+       this.$button.append( this.$element.contents() );
+       this.$element.append( this.$button );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.ButtonOptionWidget, OO.ui.OptionWidget );
+
+OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.ButtonedElement );
+OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.FlaggableElement );
+
+/* Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.ButtonOptionWidget.prototype.setSelected = function ( state ) {
+       OO.ui.OptionWidget.prototype.setSelected.call( this, state );
+
+       this.setActive( state );
+
+       return this;
+};
+/**
+ * Create an OO.ui.ButtonSelect object.
+ *
+ * @class
+ * @extends OO.ui.SelectWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.ButtonSelectWidget = function OoUiButtonSelectWidget( config ) {
+       // Parent constructor
+       OO.ui.SelectWidget.call( this, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-buttonSelectWidget' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.ButtonSelectWidget, OO.ui.SelectWidget );
+/**
+ * Creates an OO.ui.PopupWidget object.
+ *
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.LabeledElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [tail=true] Show tail pointing to origin of popup
+ * @cfg {string} [align='center'] Alignment of popup to origin
+ * @cfg {jQuery} [$container] Container to prevent popup from rendering outside of
+ * @cfg {boolean} [autoClose=false] Popup auto-closes when it loses focus
+ * @cfg {jQuery} [$autoCloseIgnore] Elements to not auto close when clicked
+ * @cfg {boolean} [head] Show label and close button at the top
+ */
+OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
+       // Config intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Widget.call( this, config );
+
+       // Mixin constructors
+       OO.ui.LabeledElement.call( this, this.$( '<div>' ), config );
+
+       // Properties
+       this.visible = false;
+       this.$popup = this.$( '<div>' );
+       this.$head = this.$( '<div>' );
+       this.$body = this.$( '<div>' );
+       this.$tail = this.$( '<div>' );
+       this.$container = config.$container || this.$( 'body' );
+       this.autoClose = !!config.autoClose;
+       this.$autoCloseIgnore = config.$autoCloseIgnore;
+       this.transitionTimeout = null;
+       this.tail = false;
+       this.align = config.align || 'center';
+       this.closeButton = new OO.ui.ButtonWidget( { '$': this.$, 'frameless': true, 'icon': 'close' } );
+       this.onMouseDownHandler = OO.ui.bind( this.onMouseDown, this );
+
+       // Events
+       this.closeButton.connect( this, { 'click': 'onCloseButtonClick' } );
+
+       // Initialization
+       this.useTail( config.tail !== undefined ? !!config.tail : true );
+       this.$body.addClass( 'oo-ui-popupWidget-body' );
+       this.$tail.addClass( 'oo-ui-popupWidget-tail' );
+       this.$head
+               .addClass( 'oo-ui-popupWidget-head' )
+               .append( this.$label, this.closeButton.$element );
+       if ( !config.head ) {
+               this.$head.hide();
+       }
+       this.$popup
+               .addClass( 'oo-ui-popupWidget-popup' )
+               .append( this.$head, this.$body );
+       this.$element.hide()
+               .addClass( 'oo-ui-popupWidget' )
+               .append( this.$popup, this.$tail );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.PopupWidget, OO.ui.Widget );
+
+OO.mixinClass( OO.ui.PopupWidget, OO.ui.LabeledElement );
+
+/* Events */
+
+/**
+ * @event hide
+ */
+
+/**
+ * @event show
+ */
+
+/* Methods */
+
+/**
+ * Handles mouse down events.
+ *
+ * @method
+ * @param {jQuery.Event} e Mouse down event
+ */
+OO.ui.PopupWidget.prototype.onMouseDown = function ( e ) {
+       if (
+               this.visible &&
+               !$.contains( this.$element[0], e.target ) &&
+               ( !this.$autoCloseIgnore || !this.$autoCloseIgnore.has( e.target ).length )
+       ) {
+               this.hide();
+       }
+};
+
+/**
+ * Bind mouse down listener
+ *
+ * @method
+ */
+OO.ui.PopupWidget.prototype.bindMouseDownListener = function () {
+       // Capture clicks outside popup
+       this.getElementWindow().addEventListener( 'mousedown', this.onMouseDownHandler, true );
+};
+
+/**
+ * Handles close button click events.
+ *
+ * @method
+ */
+OO.ui.PopupWidget.prototype.onCloseButtonClick = function () {
+       if ( this.visible ) {
+               this.hide();
+       }
+};
+
+/**
+ * Unbind mouse down listener
+ *
+ * @method
+ */
+OO.ui.PopupWidget.prototype.unbindMouseDownListener = function () {
+       this.getElementWindow().removeEventListener( 'mousedown', this.onMouseDownHandler, true );
+};
+
+/**
+ * Check if the popup is visible.
+ *
+ * @method
+ * @returns {boolean} Popup is visible
+ */
+OO.ui.PopupWidget.prototype.isVisible = function () {
+       return this.visible;
+};
+
+/**
+ * Set whether to show a tail.
+ *
+ * @method
+ * @returns {boolean} Make tail visible
+ */
+OO.ui.PopupWidget.prototype.useTail = function ( value ) {
+       value = !!value;
+       if ( this.tail !== value ) {
+               this.tail = value;
+               if ( value ) {
+                       this.$element.addClass( 'oo-ui-popupWidget-tailed' );
+               } else {
+                       this.$element.removeClass( 'oo-ui-popupWidget-tailed' );
+               }
+       }
+};
+
+/**
+ * Check if showing a tail.
+ *
+ * @method
+ * @returns {boolean} tail is visible
+ */
+OO.ui.PopupWidget.prototype.hasTail = function () {
+       return this.tail;
+};
+
+/**
+ * Show the context.
+ *
+ * @method
+ * @fires show
+ * @chainable
+ */
+OO.ui.PopupWidget.prototype.show = function () {
+       if ( !this.visible ) {
+               this.$element.show();
+               this.visible = true;
+               this.emit( 'show' );
+               if ( this.autoClose ) {
+                       this.bindMouseDownListener();
+               }
+       }
+       return this;
+};
+
+/**
+ * Hide the context.
+ *
+ * @method
+ * @fires hide
+ * @chainable
+ */
+OO.ui.PopupWidget.prototype.hide = function () {
+       if ( this.visible ) {
+               this.$element.hide();
+               this.visible = false;
+               this.emit( 'hide' );
+               if ( this.autoClose ) {
+                       this.unbindMouseDownListener();
+               }
+       }
+       return this;
+};
+
+/**
+ * Updates the position and size.
+ *
+ * @method
+ * @param {number} width Width
+ * @param {number} height Height
+ * @param {boolean} [transition=false] Use a smooth transition
+ * @chainable
+ */
+OO.ui.PopupWidget.prototype.display = function ( width, height, transition ) {
+       var padding = 10,
+               originOffset = Math.round( this.$element.offset().left ),
+               containerLeft = Math.round( this.$container.offset().left ),
+               containerWidth = this.$container.innerWidth(),
+               containerRight = containerLeft + containerWidth,
+               popupOffset = width * ( { 'left': 0, 'center': -0.5, 'right': -1 } )[this.align],
+               popupLeft = popupOffset - padding,
+               popupRight = popupOffset + padding + width + padding,
+               overlapLeft = ( originOffset + popupLeft ) - containerLeft,
+               overlapRight = containerRight - ( originOffset + popupRight );
+
+       // Prevent transition from being interrupted
+       clearTimeout( this.transitionTimeout );
+       if ( transition ) {
+               // Enable transition
+               this.$element.addClass( 'oo-ui-popupWidget-transitioning' );
+       }
+
+       if ( overlapRight < 0 ) {
+               popupOffset += overlapRight;
+       } else if ( overlapLeft < 0 ) {
+               popupOffset -= overlapLeft;
+       }
+
+       // Position body relative to anchor and resize
+       this.$popup.css( {
+               'left': popupOffset,
+               'width': width,
+               'height': height === undefined ? 'auto' : height
+       } );
+
+       if ( transition ) {
+               // Prevent transitioning after transition is complete
+               this.transitionTimeout = setTimeout( OO.ui.bind( function () {
+                       this.$element.removeClass( 'oo-ui-popupWidget-transitioning' );
+               }, this ), 200 );
+       } else {
+               // Prevent transitioning immediately
+               this.$element.removeClass( 'oo-ui-popupWidget-transitioning' );
+       }
+
+       return this;
+};
+/**
+ * Button that shows and hides a popup.
+ *
+ * @class
+ * @extends OO.ui.ButtonWidget
+ * @mixins OO.ui.PopuppableElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.PopupButtonWidget = function OoUiPopupButtonWidget( config ) {
+       // Parent constructor
+       OO.ui.ButtonWidget.call( this, config );
+
+       // Mixin constructors
+       OO.ui.PopuppableElement.call( this, config );
+
+       // Initialization
+       this.$element
+               .addClass( 'oo-ui-popupButtonWidget' )
+               .append( this.popup.$element );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.PopupButtonWidget, OO.ui.ButtonWidget );
+
+OO.mixinClass( OO.ui.PopupButtonWidget, OO.ui.PopuppableElement );
+
+/* Methods */
+
+/**
+ * Handles mouse click events.
+ *
+ * @method
+ * @param {jQuery.Event} e Mouse click event
+ */
+OO.ui.PopupButtonWidget.prototype.onClick = function ( e ) {
+       // Skip clicks within the popup
+       if ( $.contains( this.popup.$element[0], e.target ) ) {
+               return;
+       }
+
+       if ( !this.disabled ) {
+               if ( this.popup.isVisible() ) {
+                       this.hidePopup();
+               } else {
+                       this.showPopup();
+               }
+               OO.ui.ButtonWidget.prototype.onClick.call( this );
+       }
+       return false;
+};
+/**
+ * Creates an OO.ui.SearchWidget object.
+ *
+ * @class
+ * @extends OO.ui.Widget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {string|jQuery} [placeholder] Placeholder text for query input
+ * @cfg {string} [value] Initial query value
+ */
+OO.ui.SearchWidget = function OoUiSearchWidget( config ) {
+       // Configuration intialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Widget.call( this, config );
+
+       // Properties
+       this.query = new OO.ui.TextInputWidget( {
+               '$': this.$,
+               'icon': 'search',
+               'placeholder': config.placeholder,
+               'value': config.value
+       } );
+       this.results = new OO.ui.SelectWidget( { '$': this.$ } );
+       this.$query = this.$( '<div>' );
+       this.$results = this.$( '<div>' );
+
+       // Events
+       this.query.connect( this, {
+               'change': 'onQueryChange',
+               'enter': 'onQueryEnter'
+       } );
+       this.results.connect( this, {
+               'highlight': 'onResultsHighlight',
+               'select': 'onResultsSelect'
+       } );
+       this.query.$input.on( 'keydown', OO.ui.bind( this.onQueryKeydown, this ) );
+
+       // Initialization
+       this.$query
+               .addClass( 'oo-ui-searchWidget-query' )
+               .append( this.query.$element );
+       this.$results
+               .addClass( 'oo-ui-searchWidget-results' )
+               .append( this.results.$element );
+       this.$element
+               .addClass( 'oo-ui-searchWidget' )
+               .append( this.$results, this.$query );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.SearchWidget, OO.ui.Widget );
+
+/* Events */
+
+/**
+ * @event highlight
+ * @param {Object|null} item Item data or null if no item is highlighted
+ */
+
+/**
+ * @event select
+ * @param {Object|null} item Item data or null if no item is selected
+ */
+
+/* Methods */
+
+/**
+ * Handle query key down events.
+ *
+ * @method
+ * @param {jQuery.Event} e Key down event
+ */
+OO.ui.SearchWidget.prototype.onQueryKeydown = function ( e ) {
+       var highlightedItem, nextItem,
+               dir = e.which === OO.ui.Keys.DOWN ? 1 : ( e.which === OO.ui.Keys.UP ? -1 : 0 );
+
+       if ( dir ) {
+               highlightedItem = this.results.getHighlightedItem();
+               if ( !highlightedItem ) {
+                       highlightedItem = this.results.getSelectedItem();
+               }
+               nextItem = this.results.getRelativeSelectableItem( highlightedItem, dir );
+               this.results.highlightItem( nextItem );
+               nextItem.scrollElementIntoView();
+       }
+};
+
+/**
+ * Handle select widget select events.
+ *
+ * Clears existing results. Subclasses should repopulate items according to new query.
+ *
+ * @method
+ * @param {string} value New value
+ */
+OO.ui.SearchWidget.prototype.onQueryChange = function () {
+       // Reset
+       this.results.clearItems();
+};
+
+/**
+ * Handle select widget enter key events.
+ *
+ * Selects highlighted item.
+ *
+ * @method
+ * @param {string} value New value
+ */
+OO.ui.SearchWidget.prototype.onQueryEnter = function () {
+       // Reset
+       this.results.selectItem( this.results.getHighlightedItem() );
+};
+
+/**
+ * Handle select widget highlight events.
+ *
+ * @method
+ * @param {OO.ui.OptionWidget} item Highlighted item
+ * @fires highlight
+ */
+OO.ui.SearchWidget.prototype.onResultsHighlight = function ( item ) {
+       this.emit( 'highlight', item ? item.getData() : null );
+};
+
+/**
+ * Handle select widget select events.
+ *
+ * @method
+ * @param {OO.ui.OptionWidget} item Selected item
+ * @fires select
+ */
+OO.ui.SearchWidget.prototype.onResultsSelect = function ( item ) {
+       this.emit( 'select', item ? item.getData() : null );
+};
+
+/**
+ * Get the query input.
+ *
+ * @method
+ * @returns {OO.ui.TextInputWidget} Query input
+ */
+OO.ui.SearchWidget.prototype.getQuery = function () {
+       return this.query;
+};
+
+/**
+ * Get the results list.
+ *
+ * @method
+ * @returns {OO.ui.SelectWidget} Select list
+ */
+OO.ui.SearchWidget.prototype.getResults = function () {
+       return this.results;
+};
+/**
+ * Creates an OO.ui.TextInputWidget object.
+ *
+ * @class
+ * @extends OO.ui.InputWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {string} [placeholder] Placeholder text
+ * @cfg {string} [icon] Symbolic name of icon
+ * @cfg {boolean} [multiline=false] Allow multiple lines of text
+ */
+OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.InputWidget.call( this, config );
+
+       // Properties
+       this.pending = 0;
+       this.multiline = !!config.multiline;
+
+       // Events
+       this.$input.on( 'keypress', OO.ui.bind( this.onKeyPress, this ) );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-textInputWidget' );
+       if ( config.icon ) {
+               this.$element.addClass( 'oo-ui-textInputWidget-decorated' );
+               this.$element.append(
+                       this.$( '<span>' )
+                               .addClass( 'oo-ui-textInputWidget-icon oo-ui-icon-' + config.icon )
+                               .mousedown( OO.ui.bind( function () {
+                                       this.$input.focus();
+                                       return false;
+                               }, this ) )
+               );
+       }
+       if ( config.placeholder ) {
+               this.$input.attr( 'placeholder', config.placeholder );
+       }
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.TextInputWidget, OO.ui.InputWidget );
+
+/* Events */
+
+/**
+ * User presses enter inside the text box.
+ *
+ * Not called if input is multiline.
+ *
+ * @event enter
+ */
+
+/* Methods */
+
+/**
+ * Handles key press events.
+ *
+ * @param {jQuery.Event} e Key press event
+ * @fires enter If enter key is pressed and input is not multiline
+ */
+OO.ui.TextInputWidget.prototype.onKeyPress = function ( e ) {
+       if ( e.which === OO.ui.Keys.ENTER && !this.multiline ) {
+               this.emit( 'enter' );
+       }
+};
+
+/**
+ * Get input element.
+ *
+ * @method
+ * @param {Object} [config] Configuration options
+ * @returns {jQuery} Input element
+ */
+OO.ui.TextInputWidget.prototype.getInputElement = function ( config ) {
+       return config.multiline ? this.$( '<textarea>' ) : this.$( '<input type="text" />' );
+};
+
+/* Methods */
+
+/**
+ * Checks if input is pending.
+ *
+ * @method
+ * @returns {boolean} Input is pending
+ */
+OO.ui.TextInputWidget.prototype.isPending = function () {
+       return !!this.pending;
+};
+
+/**
+ * Increases the pending stack.
+ *
+ * @method
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.pushPending = function () {
+       this.pending++;
+       this.$element.addClass( 'oo-ui-textInputWidget-pending' );
+       this.$input.addClass( 'oo-ui-texture-pending' );
+       return this;
+};
+
+/**
+ * Reduces the pending stack.
+ *
+ * Clamped at zero.
+ *
+ * @method
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.popPending = function () {
+       this.pending = Math.max( 0, this.pending - 1 );
+       if ( !this.pending ) {
+               this.$element.removeClass( 'oo-ui-textInputWidget-pending' );
+               this.$input.removeClass( 'oo-ui-texture-pending' );
+       }
+       return this;
+};
+/**
+ * Creates an OO.ui.TextInputMenuWidget object.
+ *
+ * @class
+ * @extends OO.ui.MenuWidget
+ *
+ * @constructor
+ * @param {OO.ui.TextInputWidget} input Text input widget to provide menu for
+ * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$container=input.$element] Element to render menu under
+ */
+OO.ui.TextInputMenuWidget = function OoUiTextInputMenuWidget( input, config ) {
+       // Parent constructor
+       OO.ui.MenuWidget.call( this, config );
+
+       // Properties
+       this.input = input;
+       this.$container = config.$container || this.input.$element;
+       this.onWindowResizeHandler = OO.ui.bind( this.onWindowResize, this );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-textInputMenuWidget' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.TextInputMenuWidget, OO.ui.MenuWidget );
+
+/* Methods */
+
+/**
+ * Handle window resize event.
+ *
+ * @method
+ * @param {jQuery.Event} e Window resize event
+ */
+OO.ui.TextInputMenuWidget.prototype.onWindowResize = function () {
+       this.position();
+};
+
+/**
+ * Shows the menu.
+ *
+ * @method
+ * @chainable
+ */
+OO.ui.TextInputMenuWidget.prototype.show = function () {
+       // Parent method
+       OO.ui.MenuWidget.prototype.show.call( this );
+
+       this.position();
+       this.$( this.getElementWindow() ).on( 'resize', this.onWindowResizeHandler );
+       return this;
+};
+
+/**
+ * Hides the menu.
+ *
+ * @method
+ * @chainable
+ */
+OO.ui.TextInputMenuWidget.prototype.hide = function () {
+       // Parent method
+       OO.ui.MenuWidget.prototype.hide.call( this );
+
+       this.$( this.getElementWindow() ).off( 'resize', this.onWindowResizeHandler );
+       return this;
+};
+
+/**
+ * Positions the menu.
+ *
+ * @method
+ * @chainable
+ */
+OO.ui.TextInputMenuWidget.prototype.position = function () {
+       var frameOffset,
+               $container = this.$container,
+               dimensions = $container.offset();
+
+       // Position under input
+       dimensions.top += $container.height();
+
+       // Compensate for frame position if in a differnt frame
+       if ( this.input.$.frame && this.input.$.context !== this.$element[0].ownerDocument ) {
+               frameOffset = OO.ui.Element.getRelativePosition(
+                       this.input.$.frame.$element, this.$element.offsetParent()
+               );
+               dimensions.left += frameOffset.left;
+               dimensions.top += frameOffset.top;
+       } else {
+               // Fix for RTL (for some reason, no need to fix if the frameoffset is set)
+               if ( this.$element.css( 'direction' ) === 'rtl' ) {
+                       dimensions.right = this.$element.parent().position().left -
+                               dimensions.width - dimensions.left;
+                       // Erase the value for 'left':
+                       delete dimensions.left;
+               }
+       }
+
+       this.$element.css( dimensions );
+       this.setIdealSize( $container.width() );
+       return this;
+};
+/**
+ * Mixin for widgets with a boolean state.
+ *
+ * @class
+ * @abstract
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [value=false] Initial value
+ */
+OO.ui.ToggleWidget = function OoUiToggleWidget( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Properties
+       this.value = null;
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-toggleWidget' );
+       this.setValue( !!config.value );
+};
+
+/* Events */
+
+/**
+ * @event change
+ * @param {boolean} value Changed value
+ */
+
+/* Methods */
+
+/**
+ * Get the value of the toggle.
+ *
+ * @method
+ * @returns {boolean} Toggle value
+ */
+OO.ui.ToggleWidget.prototype.getValue = function () {
+       return this.value;
+};
+
+/**
+ * Set the value of the toggle.
+ *
+ * @method
+ * @param {boolean} value New value
+ * @fires change
+ * @chainable
+ */
+OO.ui.ToggleWidget.prototype.setValue = function ( value ) {
+       value = !!value;
+       if ( this.value !== value ) {
+               this.value = value;
+               this.emit( 'change', value );
+               this.$element.toggleClass( 'oo-ui-toggleWidget-on', value );
+               this.$element.toggleClass( 'oo-ui-toggleWidget-off', !value );
+       }
+       return this;
+};
+/**
+ * @class
+ * @extends OO.ui.ButtonWidget
+ * @mixins OO.ui.ToggleWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [value=false] Initial value
+ */
+OO.ui.ToggleButtonWidget = function OoUiToggleButtonWidget( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.ButtonWidget.call( this, config );
+
+       // Mixin constructors
+       OO.ui.ToggleWidget.call( this, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-toggleButtonWidget' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.ToggleButtonWidget, OO.ui.ButtonWidget );
+
+OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.ToggleWidget );
+
+/* Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.ToggleButtonWidget.prototype.onClick = function () {
+       if ( !this.disabled ) {
+               this.setValue( !this.value );
+       }
+
+       // Parent method
+       return OO.ui.ButtonWidget.prototype.onClick.call( this );
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.ToggleButtonWidget.prototype.setValue = function ( value ) {
+       value = !!value;
+       if ( value !== this.value ) {
+               this.setActive( value );
+       }
+
+       // Parent method
+       OO.ui.ToggleWidget.prototype.setValue.call( this, value );
+
+       return this;
+};
+/**
+ * @class
+ * @abstract
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.ToggleWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [value=false] Initial value
+ */
+OO.ui.ToggleSwitchWidget = function OoUiToggleSwitchWidget( config ) {
+       // Parent constructor
+       OO.ui.Widget.call( this, config );
+
+       // Mixin constructors
+       OO.ui.ToggleWidget.call( this, config );
+
+       // Properties
+       this.dragging = false;
+       this.dragStart = null;
+       this.sliding = false;
+       this.$on = this.$( '<span>' );
+       this.$grip = this.$( '<span>' );
+
+       // Events
+       this.$element.on( 'click', OO.ui.bind( this.onClick, this ) );
+
+       // Initialization
+       this.$on.addClass( 'oo-ui-toggleSwitchWidget-on' );
+       this.$grip.addClass( 'oo-ui-toggleSwitchWidget-grip' );
+       this.$element
+               .addClass( 'oo-ui-toggleSwitchWidget' )
+               .append( this.$on, this.$grip );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.ToggleSwitchWidget, OO.ui.Widget );
+
+OO.mixinClass( OO.ui.ToggleSwitchWidget, OO.ui.ToggleWidget );
+
+/* Methods */
+
+/**
+ * Handles mouse down events.
+ *
+ * @method
+ * @param {jQuery.Event} e Mouse down event
+ */
+OO.ui.ToggleSwitchWidget.prototype.onClick = function ( e ) {
+       if ( !this.disabled && e.which === 1 ) {
+               this.setValue( !this.value );
+       }
+};
+}() );
diff --git a/resources/oojs-ui/oojs-ui.svg.css b/resources/oojs-ui/oojs-ui.svg.css
new file mode 100644 (file)
index 0000000..917707e
--- /dev/null
@@ -0,0 +1,1815 @@
+/*!
+ * OOjs UI v0.1.0-pre-svg (424b40373e)
+ * 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: Fri Feb 14 2014 17:57:32 GMT-0800 (PST)
+ */
+/*csslint vendor-prefix:false */
+
+/* Textures */
+
+.oo-ui-texture-pending {
+       /* @embed */
+       background-image: url(images/textures/pending.gif);
+}
+
+.oo-ui-texture-transparency {
+       /* @embed */
+       background-image: url(images/textures/transparency.png);
+}
+
+/* Animation */
+
+@-webkit-keyframes oo-ui-zoom-in {
+       from { -webkit-transform: scale(0.5); }
+       to { -webkit-transform: scale(1); }
+}
+
+@-moz-keyframes oo-ui-zoom-in {
+       from { -moz-transform: scale(0.5); }
+       to { -moz-transform: scale(1); }
+}
+
+@-o-keyframes oo-ui-zoom-in {
+       from { -o-transform: scale(0.5); }
+       to { -o-transform: scale(1); }
+}
+
+@keyframes oo-ui-zoom-in {
+       from { transform: scale(0.5); }
+       to { transform: scale(1); }
+}
+
+@-webkit-keyframes oo-ui-fade-in {
+       from { opacity: 0; }
+       to { opacity: 1; }
+}
+
+@-moz-keyframes oo-ui-fade-in {
+       from { opacity: 0; }
+       to { opacity: 1; }
+}
+
+@-o-keyframes oo-ui-fade-in {
+       from { opacity: 0; }
+       to { opacity: 1; }
+}
+
+@keyframes oo-ui-fade-in {
+       from { opacity: 0; }
+       to { opacity: 1; }
+}
+
+/* RTL Definitions */
+
+/* @noflip */
+.oo-ui-rtl {
+       direction: rtl;
+}
+/* @noflip */
+.oo-ui-ltr {
+       direction: ltr;
+}
+.oo-ui-dialog {
+       position: fixed;
+       top: 0;
+       right: 0;
+       bottom: 0;
+       left: 0;
+       padding: 1em;
+       line-height: 1em;
+       background-color: #fff;
+       background-color: rgba(255,255,255,0.5);
+       -webkit-animation: oo-ui-fade-in 250ms ease-in-out 0 1 normal;
+       -moz-animation: oo-ui-fade-in 250ms ease-in-out 0 1 normal;
+       -o-animation: oo-ui-fade-in 250ms ease-in-out 0 1 normal;
+       animation: oo-ui-fade-in 250ms ease-in-out 0 1 normal;
+}
+
+.oo-ui-dialog-closing {
+       -webkit-animation: oo-ui-fade-in 250ms ease-in-out 0 1 reverse;
+       -moz-animation: oo-ui-fade-in 250ms ease-in-out 0 1 reverse;
+       -o-animation: oo-ui-fade-in 250ms ease-in-out 0 1 reverse;
+       animation: oo-ui-fade-in 250ms ease-in-out 0 1 reverse;
+}
+
+.oo-ui-dialog .oo-ui-window-frame {
+       position: fixed;
+       top: 1em;
+       right: 0;
+       bottom: 1em;
+       left: 0;
+       margin: auto;
+       width: 800px;
+       min-height: 12em;
+       max-height: 600px;
+       background-color: #fff;
+       border: solid 1px #ccc;
+       border-radius: 0.5em;
+       box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
+       overflow: hidden;
+       -webkit-animation: oo-ui-zoom-in 250ms ease-in-out 0 1 normal;
+       -moz-animation: oo-ui-zoom-in 250ms ease-in-out 0 1 normal;
+       -o-animation: oo-ui-zoom-in 250ms ease-in-out 0 1 normal;
+       animation: oo-ui-zoom-in 250ms ease-in-out 0 1 normal;
+}
+
+.oo-ui-dialog .oo-ui-window-frame.oo-ui-window-frame-small {
+       max-width: 600px;
+       max-height: 400px;
+}
+
+.oo-ui-dialog-closing .oo-ui-window-frame {
+       -webkit-animation: oo-ui-zoom-in 250ms ease-in-out 0 1 reverse;
+       -moz-animation: oo-ui-zoom-in 250ms ease-in-out 0 1 reverse;
+       -o-animation: oo-ui-zoom-in 250ms ease-in-out 0 1 reverse;
+       animation: oo-ui-zoom-in 250ms ease-in-out 0 1 reverse;
+}
+
+.oo-ui-dialog .oo-ui-frame {
+       width: 100%;
+       height: 100%;
+}
+
+.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;
+       -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+       box-sizing: border-box;
+       overflow: hidden;
+}
+
+.oo-ui-dialog-content .oo-ui-window-head {
+       top: 0;
+       height: 3.8em;
+       padding: 0.5em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-foot {
+       bottom: 0;
+       height: 4.8em;
+       padding: 1em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-body {
+       box-shadow: 0 0 0.66em rgba(0,0,0,0.25);
+       top: 3.8em;
+       bottom: 4.8em;
+}
+
+.oo-ui-dialog-content-footless .oo-ui-window-body {
+       bottom: 0;
+}
+
+.oo-ui-dialog-content-footless .oo-ui-window-foot {
+       display: none;
+}
+
+.oo-ui-dialog-content .oo-ui-window-icon {
+       width: 2.4em;
+       height: 2.8em;
+       line-height: 2.8em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-title {
+       line-height: 2.8em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-buttonedElement-framed {
+       float: left;
+       margin: 0.125em 0.25em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary,
+.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive,
+.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-buttonedElement-framed.oo-ui-flaggableElement-destructive {
+       float: right;
+}
+
+.oo-ui-dialog-content .oo-ui-window-closeButton {
+       float: right;
+       margin: 0.25em 0.25em;
+}
+
+/* OO.ui.ButtonedElement */
+
+a.oo-ui-buttonedElement-button {
+       color: #333;
+       cursor: pointer;
+       display: inline-block;
+       vertical-align: middle;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+       -moz-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+}
+
+.oo-ui-buttonedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
+.oo-ui-buttonedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+       display: none;
+}
+
+.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 {
+       opacity: 0.8;
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+       width: 1.9em;
+       height: 1.9em;
+}
+
+.oo-ui-buttonedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+       margin-left: 0;
+}
+
+.oo-ui-buttonedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator {
+       margin-right: -0.75em;
+}
+.oo-ui-buttonedElement.oo-ui-widget-disabled .oo-ui-buttonedElement-button {
+       cursor: default;
+}
+
+.oo-ui-buttonedElement-frameless {
+       display: inline-block;
+       position: relative;
+       -webkit-transition: opacity 200ms;
+       -moz-transition: opacity 200ms;
+       -o-transition: opacity 200ms;
+       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-widget-disabled .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+       opacity: 0.2;
+}
+
+.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+       display: inline-block;
+       vertical-align: middle;
+       margin-left: 0.25em;
+       color: #333;
+}
+
+.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-widget-disabled .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+       color: #ccc;
+}
+
+/* OO.ui.ButtonWidget */
+
+.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
+       display: inline-block;
+       font-size: 1em;
+       margin: 0.1em 0;
+       padding: 0.2em 0.8em;
+       border-radius: 0.3em;
+       vertical-align: top;
+       text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
+       text-align: center;
+
+       /* Animation */
+       -webkit-transition: border-color 100ms;
+       -moz-transition: border-color 100ms;
+       -o-transition: border-color 100ms;
+       transition: border-color 100ms;
+
+       /* Gray */
+       border: 1px #c9c9c9 solid;
+       background-color: #dddddd;
+       filter: progid:DXImageTransform.Microsoft.gradient(
+               GradientType=0,startColorstr=#ffffff, endColorstr=#dddddd
+       );
+       background-image: -webkit-gradient(
+               linear, right top, right 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%);
+}
+
+.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:active,
+.oo-ui-buttonedElement-framed.oo-ui-buttonedElement-active .oo-ui-buttonedElement-button {
+       box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+       color: black;
+
+       /* Gray */
+       border-color: #c9c9c9;
+       background-color: #dddddd;
+       filter: progid:DXImageTransform.Microsoft.gradient(
+               GradientType=0,startColorstr=#dddddd, endColorstr=#ffffff
+       );
+       background-image: -webkit-gradient(
+               linear, right top, right 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%);
+}
+
+.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.5em;
+       margin-right: 0;
+}
+
+.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+       display: inline-block;
+       vertical-align: middle;
+       line-height: 1.9em;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-destructive .oo-ui-buttonedElement-button {
+       /* Red text */
+       color: #d45353;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button {
+       /* Green */
+       border: solid 1px #b8d892;
+       background-color: #f0fbe1;
+       filter: progid:DXImageTransform.Microsoft.gradient(
+               GradientType=0,startColorstr=#f0fbe1, endColorstr=#c3e59a
+       );
+       background-image: -webkit-gradient(
+               linear, right top, right 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%);
+}
+
+.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:active,
+.oo-ui-buttonedElement-framed.oo-ui-buttonedElement-active.oo-ui-flaggableElement-constructive .oo-ui-buttonedElement-button {
+       /* Green */
+       border: solid 1px #b8d892;
+       background-color: #c3e59a;
+       filter: progid:DXImageTransform.Microsoft.gradient(
+               GradientType=0,startColorstr=#c3e59a, endColorstr=#f0fbe1
+       );
+       background-image: -webkit-gradient(
+               linear, right top, right 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%);
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button {
+       /* Blue */
+       border: solid 1px #a6cee1;
+       background-color: #eaf4fa;
+       filter: progid:DXImageTransform.Microsoft.gradient(
+               GradientType=0,startColorstr=#eaf4fa, endColorstr=#b0d9ee
+       );
+       background-image: -webkit-gradient(
+               linear, right top, right 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%);
+}
+
+.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:active,
+.oo-ui-buttonedElement-framed.oo-ui-buttonedElement-active.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button {
+       /* Blue */
+       border: solid 1px #a6cee1;
+       background-color: #b0d9ee;
+       filter: progid:DXImageTransform.Microsoft.gradient(
+               GradientType=0,startColorstr=#b0d9ee, endColorstr=#eaf4fa
+       );
+       background-image: -webkit-gradient(
+               linear, right top, right 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%);
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button:active,
+.oo-ui-buttonedElement-framed.oo-ui-buttonedElement-active.oo-ui-widget-disabled .oo-ui-buttonedElement-button:active {
+       opacity: 0.5;
+       cursor: default;
+       box-shadow: none;
+       color: #333;
+       background: #eee;
+}
+
+.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:focus {
+       border-color: #ccc;
+       box-shadow: none;
+}
+
+/* OO.ui.LabeledElement */
+
+.oo-ui-labeledElement-label {
+       display: block;
+}
+
+.oo-ui-clippableElement-clippable {
+       -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+       box-sizing: border-box;
+}
+.oo-ui-frame {
+       margin: 0;
+       padding: 0;
+}
+
+.oo-ui-frame-body {
+       margin: 0;
+       padding: 0;
+       background: none;
+}
+
+.oo-ui-frame-content {
+       font-family: sans-serif;
+       font-size: 0.8em;
+}
+/* OO.ui.GridLayout */
+/* OO.ui.PanelLayout */
+
+.oo-ui-gridLayout,
+.oo-ui-panelLayout {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+}
+
+.oo-ui-panelLayout-scrollable {
+       overflow-y: auto;
+}
+
+.oo-ui-panelLayout-padded {
+       padding: 2em;
+}
+
+/* OO.ui.FieldsetLayout */
+
+.oo-ui-fieldsetLayout {
+       position: relative;
+       border: none;
+       margin: 0;
+       padding: 0;
+}
+
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+       margin-top: 2em;
+}
+
+.oo-ui-fieldsetLayout-labeled {
+       margin-top: -0.75em;
+}
+
+.oo-ui-fieldsetLayout > legend.oo-ui-labeledElement-label {
+       font-size: 1.5em;
+       margin-bottom: 0.5em;
+       padding-left: 0;
+}
+
+.oo-ui-fieldsetLayout.oo-ui-iconedElement > legend.oo-ui-labeledElement-label {
+       padding-left: 1.75em;
+}
+
+.oo-ui-fieldsetLayout.oo-ui-iconedElement > .oo-ui-iconedElement-icon {
+       display: block;
+       position: absolute;
+       left: 0;
+       top: 0.5em;
+       width: 2em;
+       height: 2em;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+
+/* OO.ui.FieldLayout */
+
+.oo-ui-fieldLayout {
+       margin-bottom: 1em;
+}
+
+.oo-ui-fieldLayout:last-child {
+       margin-bottom: 0;
+}
+
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+    content: " ";
+    display: table;
+}
+
+.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: left;
+       width: 35%;
+       padding-top: 0.5em;
+       margin-right: 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: left;
+       width: 60%;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
+       text-align: right;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labeledElement-label {
+       display: inline-block;
+       vertical-align: middle;
+       padding: 0.75em 0.5em 0.5em 0.5em;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+       display: inline-block;
+       vertical-align: middle;
+       padding: 0.5em 0;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labeledElement-label {
+       padding: 0.5em 0;
+}
+
+/* OO.ui.BookletLayout */
+
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+       padding: 1.5em;
+       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 {
+       border-right: solid 1px #ddd;
+}
+
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 3em;
+       overflow-y: auto;
+}
+
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+       position: absolute;
+       bottom: 0;
+       left: 0;
+       right: 0;
+       box-shadow: 0 0 0.25em rgba(0,0,0,0.25);
+}
+
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+       display: none;
+}
+
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+       display: block;
+       position: relative;
+       margin-bottom: 1em;
+       box-shadow: 0 0 0.5em rgba(0,0,0,0.25);
+}
+
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout:last-child {
+       margin-bottom: 0;
+}
+/* OO.ui.PopupTool */
+
+.oo-ui-popupTool .oo-ui-popupWidget {
+       margin-left: 1.25em;
+       font-size: 0.8em;
+}
+
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-tail {
+       z-index: 4;
+}
+.oo-ui-toolbar {
+       clear: both;
+}
+
+.oo-ui-toolbar-bar {
+       border-bottom: solid 1px #ccc;
+       background-color: white;
+       /* @embed */
+       background-image: url(images/fade-up.png);
+       background-position: left bottom;
+       background-repeat: repeat-x;
+       padding-bottom: 1px;
+       line-height: 1em;
+}
+
+.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
+       border: none;
+       background: none;
+}
+
+.oo-ui-toolbar-bottom .oo-ui-toolbar-bar {
+       position: absolute;
+}
+
+.oo-ui-toolbar-actions {
+       float: right;
+}
+
+.oo-ui-toolbar-tools {
+       float: left;
+}
+
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+       -webkit-user-select: none;
+       -moz-user-select: none;
+       -ms-user-select: none;
+       -o-user-select: none;
+       user-select: none;
+}
+
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+       -webkit-touch-callout: default;
+       -webkit-user-select: all;
+       -moz-user-select: all;
+       -ms-user-select: all;
+       user-select: all;
+}
+
+.oo-ui-toolbar-shadow {
+       /* @embed */
+       background-image: url(images/toolbar-shadow.png);
+       background-position: left top;
+       background-repeat: repeat-x;
+       position: absolute;
+       bottom: -9px;
+       height: 9px;
+       width: 100%;
+       pointer-events: none;
+       -webkit-transition: opacity 500ms ease-in-out;
+       -moz-transition: opacity 500ms ease-in-out;
+       -o-transition: opacity 500ms ease-in-out;
+       transition: opacity 500ms ease-in-out;
+       opacity: 0.125;
+}
+/* OO.ui.ToolGroup */
+
+.oo-ui-toolGroup {
+       display: inline-block;
+       margin: 0.3em;
+       vertical-align: middle;
+       border-radius: 0.25em;
+       border: solid 1px transparent;
+       -webkit-transition: border-color 300ms;
+       -moz-transition: border-color 300ms;
+       -o-transition: border-color 300ms;
+       transition: border-color 300ms;
+}
+
+.oo-ui-toolGroup:hover {
+       border-color: rgba(0,0,0,0.1);
+}
+
+.oo-ui-toolGroup-empty {
+       display: none;
+}
+
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       color: #000;
+}
+
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+
+/* OO.ui.BarToolGroup */
+
+.oo-ui-barToolGroup > .oo-ui-iconedElement-icon,
+.oo-ui-barToolGroup > .oo-ui-iconedElement-label {
+       display: none;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool {
+       display: inline-block;
+       position: relative;
+       vertical-align: top;
+       margin: -1px 0 -1px -1px;
+       border: solid 1px transparent;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-link {
+       display: block;
+       height: 1.5em;
+       padding: 0.25em;
+       cursor: pointer;
+}
+
+.oo-ui-barToolGroup
+       .oo-ui-tool-active:not(.oo-ui-widget-disabled) +
+       .oo-ui-tool-active:not(.oo-ui-widget-disabled)
+{
+       border-left-color: rgba(0,0,0,0.1);
+}
+
+.oo-ui-barToolGroup .oo-ui-tool:first-child {
+       border-top-left-radius: 0.25em;
+       border-bottom-left-radius: 0.25em;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool:last-child {
+       margin-right: -1px;
+       border-top-right-radius: 0.25em;
+       border-bottom-right-radius: 0.25em;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool:hover:not(.oo-ui-widget-disabled) {
+       border-color: rgba(0,0,0,0.2);
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-active:not(.oo-ui-widget-disabled) {
+       border-color: rgba(0,0,0,0.2);
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+       display: block;
+       height: 1.5em;
+       width: 1.5em;
+       opacity: 0.8;
+}
+
+.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.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
+       opacity: 0.2;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool:not(.oo-ui-widget-disabled) .oo-ui-tool-link .oo-ui-iconedElement-icon {
+       opacity: 0.8;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool:hover:not(.oo-ui-widget-disabled) .oo-ui-tool-link .oo-ui-iconedElement-icon {
+       opacity: 1;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-title {
+       display: none;
+}
+
+/* OO.ui.PopupToolGroup */
+
+.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;
+       opacity: 0.8;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator {
+       right: 0;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
+       left: 0.25em;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
+       line-height: 2.6em;
+       font-size: 0.8em;
+       margin: 0 1em;
+}
+
+.oo-ui-popupToolGroup.oo-ui-iconedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
+       margin-left: 3.25em;
+}
+
+.oo-ui-popupToolGroup.oo-ui-indicatedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
+       margin-right: 2.25em;
+}
+
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+       display: none;
+       position: absolute;
+       top: 2em;
+       left: -1px;
+       z-index: 4;
+       border: solid 1px #ccc;
+       background-color: white;
+       box-shadow: 0 0.25em 1em rgba(0,0,0,0.25);
+}
+
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconedElement-icon {
+       background-repeat: no-repeat;
+       background-position: center center;
+}
+
+.oo-ui-popupToolGroup-active:not(.oo-ui-widget-disabled) > .oo-ui-toolGroup-tools {
+       display: block;
+}
+
+.oo-ui-popupToolGroup-active:not(.oo-ui-widget-disabled) {
+       border-bottom-left-radius: 0;
+       border-bottom-right-radius: 0;
+}
+
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+       display: inline-block;
+       vertical-align: middle;
+       height: 2em;
+       width: 2em;
+       margin-right: 0.5em;
+}
+
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       display: inline-block;
+       vertical-align: middle;
+       line-height: 2em;
+       font-size: 0.8em;
+}
+
+.oo-ui-popupToolGroup .oo-ui-tool-accel {
+       display: none;
+}
+
+/* OO.ui.ListToolGroup */
+
+.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;
+       border: solid 1px transparent;
+       margin: -1px 0;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool-link {
+       display: block;
+       cursor: pointer;
+       white-space: nowrap;
+       padding-right: 0.5em;
+}
+
+.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
+       border-color: rgba(0,0,0,0.2);
+}
+
+.oo-ui-listToolGroup
+       .oo-ui-tool-active:not(.oo-ui-widget-disabled) +
+       .oo-ui-tool-active:not(.oo-ui-widget-disabled)
+{
+       border-top-color: rgba(0,0,0,0.1);
+}
+
+.oo-ui-listToolGroup .oo-ui-tool:hover:not(.oo-ui-widget-disabled) {
+       border-color: rgba(0,0,0,0.2);
+}
+
+.oo-ui-listToolGroup .oo-ui-tool-active:not(.oo-ui-widget-disabled) {
+       border-color: rgba(0,0,0,0.2);
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
+}
+
+.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-tool:not(.oo-ui-widget-disabled) .oo-ui-tool-link .oo-ui-iconedElement-icon {
+       opacity: 0.8;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool:hover:not(.oo-ui-widget-disabled) .oo-ui-tool-link .oo-ui-iconedElement-icon {
+       opacity: 1;
+}
+
+/* OO.ui.MenuToolGroup */
+
+.oo-ui-menuToolGroup {
+       border-color: rgba(0,0,0,0.1);
+}
+
+.oo-ui-menuToolGroup: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-popupToolGroup-handle {
+       min-width: 8em;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool {
+       display: block;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+       display: block;
+       cursor: pointer;
+       white-space: nowrap;
+       padding: 0.25em 1em 0.25em 0.25em;
+}
+
+.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 {
+       /* @embed */
+       background-image: url(images/icons/check.png);
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool:hover {
+       background-color: #e1f3ff;
+}
+
+/* Common */
+
+.oo-ui-barToolGroup .oo-ui-tool-active:not(.oo-ui-widget-disabled),
+.oo-ui-listToolGroup .oo-ui-tool-active:not(.oo-ui-widget-disabled),
+.oo-ui-popupToolGroup-active:not(.oo-ui-widget-disabled) {
+       /* @embed */
+       background-image: url(images/fade-down.png);
+       background-position: left top;
+       background-repeat: repeat-x;
+       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+}
+/* OO.ui.ButtonWidget */
+
+.oo-ui-buttonWidget {
+       display: inline-block;
+       vertical-align: middle;
+}
+
+/* OO.ui.PopupButtonWidget */
+
+.oo-ui-popupButtonWidget {
+       position: relative;
+}
+
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+       position: absolute;
+       left: 1em;
+       cursor: auto;
+}
+
+/* OO.ui.ButtonGroupWidget */
+
+.oo-ui-buttonGroupWidget {
+       display: inline-block;
+       white-space: nowrap;
+       border-radius: 0.3em;
+}
+
+.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
+       border-radius: 0;
+       margin-bottom: -1px;
+       margin-left: -1px;
+}
+
+.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:first-child .oo-ui-buttonedElement-button {
+       border-bottom-left-radius: 0.3em;
+       border-top-left-radius: 0.3em;
+       margin-left: 0;
+}
+
+.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:last-child .oo-ui-buttonedElement-button {
+       border-bottom-right-radius: 0.3em;
+       border-top-right-radius: 0.3em;
+}
+
+/* OO.ui.SelectWidget */
+
+.oo-ui-selectWidget {
+       list-style: none;
+       margin: 0;
+       padding: 0;
+}
+
+/* OO.ui.OptionWidget */
+
+.oo-ui-optionWidget {
+       position: relative;
+       display: block;
+       border: none;
+       list-style: none;
+       margin: 0;
+       padding: 0.5em 2em 0.5em 3em;
+       cursor: pointer;
+}
+
+.oo-ui-optionWidget .oo-ui-labeledElement-label {
+       line-height: 1.5em;
+       white-space: nowrap;
+       text-overflow: ellipsis;
+       overflow: hidden;
+}
+
+.oo-ui-optionWidget-highlighted {
+       background-color: #e1f3ff;
+}
+
+.oo-ui-optionWidget-selected {
+       background-color: #a7dcff;
+}
+
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+       cursor: default;
+}
+
+.oo-ui-optionWidget .oo-ui-iconedElement-icon,
+.oo-ui-optionWidget .oo-ui-indicatedElement-indicator {
+       position: absolute;
+       top: 50%;
+       width: 2em;
+       height: 2em;
+       margin-top: -1em;
+       background-repeat: no-repeat;
+       background-position: center center;
+}
+
+.oo-ui-optionWidget .oo-ui-iconedElement-icon {
+       left: 0.5em;
+}
+
+.oo-ui-optionWidget .oo-ui-indicatedElement-indicator {
+       right: 0.5em;
+}
+
+/* OO.ui.OutlineItemWidget */
+
+.oo-ui-outlineItemWidget {
+       position: relative;
+       padding: 0.75em 0.75em 0.75em 3.5em;
+       -webkit-user-select: none;
+       -moz-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+       cursor: pointer;
+       font-size: 1.1em;
+}
+
+.oo-ui-outlineItemWidget-level-1 {
+       padding-left: 5em;
+}
+
+.oo-ui-outlineItemWidget-level-2 {
+       padding-left: 6.5em;
+}
+
+.oo-ui-outlineItemWidget.oo-ui-optionWidget-selected {
+       background-color: #a7dcff;
+       text-shadow: 0 1px 1px rgba(255,255,255,0.5);
+}
+
+.oo-ui-outlineItemWidget-level-0 .oo-ui-iconedElement-icon {
+       left: 1em;
+}
+
+.oo-ui-outlineItemWidget-level-1 .oo-ui-iconedElement-icon {
+       left: 2.5em;
+}
+
+.oo-ui-outlineItemWidget-level-2 .oo-ui-iconedElement-icon {
+       left: 4em;
+}
+
+.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,
+.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-indicatedElement-indicator {
+       opacity: 0.5;
+}
+.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-labeledElement-label {
+       color: #698AA0;
+}
+
+/* OO.ui.OutlineControlsWidget */
+
+.oo-ui-outlineControlsWidget {
+       height: 3em;
+       background-color: #fff;
+}
+
+.oo-ui-outlineControlsWidget-adders,
+.oo-ui-outlineControlsWidget-movers {
+       float: left;
+       -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+       box-sizing: border-box;
+       height: 3em;
+       padding: 0.5em;
+}
+
+.oo-ui-outlineControlsWidget-adders {
+       float: left;
+}
+.oo-ui-outlineControlsWidget-movers {
+       float: right;
+}
+
+.oo-ui-outlineControlsWidget-adders .oo-ui-buttonWidget {
+       float: left;
+}
+
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+       float: right;
+}
+
+.oo-ui-outlineControlsWidget-adders .oo-ui-buttonWidget:first-child,
+.oo-ui-outlineControlsWidget-adders .oo-ui-buttonWidget:first-child:hover {
+       opacity: 0.25;
+       cursor: default;
+}
+
+/* OO.ui.LabelWidget */
+
+.oo-ui-labelWidget {
+       padding: 0.5em 0;
+}
+
+/* OO.ui.TextInputWidget */
+
+.oo-ui-textInputWidget {
+       -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+       box-sizing: border-box;
+       width: 20em;
+       position: relative;
+}
+
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget input:focus[readonly],
+.oo-ui-widget-disabled.oo-ui-textInputWidget input:focus,
+.oo-ui-textInputWidget textarea,
+.oo-ui-textInputWidget textarea:focus[readonly],
+.oo-ui-widget-disabled.oo-ui-textInputWidget textarea:focus {
+       display: inline-block;
+       font-size: 1em;
+       font-family: sans-serif;
+       background-color: #fff;
+       border: solid 1px #ccc;
+       box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
+       padding: 0.5em;
+       border-radius: 0.25em;
+       -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+       box-sizing: border-box;
+       width: 100%;
+       resize: none;
+
+       /* Animation */
+       -webkit-transition: border-color 200ms, box-shadow 200ms;
+       -moz-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-pending input,
+.oo-ui-textInputWidget-pending textarea {
+       background-color: transparent;
+}
+
+.oo-ui-textInputWidget input:focus,
+.oo-ui-textInputWidget textarea:focus {
+       outline: none;
+       border-color: #a7dcff;
+       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-widget-disabled.oo-ui-textInputWidget input,
+.oo-ui-widget-disabled.oo-ui-textInputWidget input:focus,
+.oo-ui-widget-disabled.oo-ui-textInputWidget textarea,
+.oo-ui-widget-disabled.oo-ui-textInputWidget textarea:focus {
+       color: #ccc;
+       border-color: #ddd;
+       text-shadow: 0 1px 1px #fff;
+}
+
+.oo-ui-textInputWidget-decorated input,
+.oo-ui-textInputWidget-decorated textarea {
+       padding-left: 2em;
+}
+
+.oo-ui-textInputWidget-icon {
+       position: absolute;
+       top: 0;
+       left: 0;
+       width: 2em;
+       height: 100%;
+       background-position: right center;
+       background-repeat: no-repeat;
+}
+
+/* OO.ui.MenuWidget */
+
+.oo-ui-menuWidget {
+       position: absolute;
+       background: #fff;
+       margin-top: -1px;
+       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-menuWidget input {
+       position: absolute;
+       width: 0;
+       height: 0;
+       overflow: hidden;
+       opacity: 0;
+}
+
+/* OO.ui.MenuItemWidget */
+
+.oo-ui-menuItemWidget {
+       position: relative;
+}
+
+.oo-ui-menuItemWidget .oo-ui-iconedElement-icon {
+       display: none;
+}
+
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconedElement-icon {
+       display: block;
+}
+
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+       background-color: transparent;
+}
+
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted {
+       background-color: #e1f3ff;
+}
+
+/* OO.ui.MenuSectionItemWidget */
+
+.oo-ui-menuSectionItemWidget {
+       padding: 0.33em 0.75em;
+       color: #888;
+       cursor: default;
+}
+
+/* OO.ui.ButtonSelectWidget */
+
+.oo-ui-buttonSelectWidget {
+       display: inline-block;
+       white-space: nowrap;
+       border-radius: 0.3em;
+}
+
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button {
+       border-radius: 0;
+       margin-left: -1px;
+}
+
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonedElement-button {
+       border-bottom-left-radius: 0.3em;
+       border-top-left-radius: 0.3em;
+       margin-left: 0;
+}
+
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonedElement-button {
+       border-bottom-right-radius: 0.3em;
+       border-top-right-radius: 0.3em;
+}
+
+/* OO.ui.ButtonOptionWidget */
+
+.oo-ui-buttonOptionWidget {
+       display: inline-block;
+       padding: 0;
+       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;
+       vertical-align: middle;
+       height: 1.9em;
+       margin-top: 0;
+}
+
+/* OO.ui.PopupWidget */
+
+.oo-ui-popupWidget-popup {
+       position: absolute;
+       overflow: hidden;
+       border: solid 1px #ccc;
+       border-radius: 0.25em;
+       background-color: #fff;
+       box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-popupWidget-tail {
+       display: none;
+}
+
+.oo-ui-popupWidget-tailed .oo-ui-popupWidget-popup {
+       margin-top: 7px;
+}
+
+.oo-ui-popupWidget-tailed .oo-ui-popupWidget-tail {
+       display: block;
+       position: absolute;
+       /* @embed */
+       background-image: url(images/tail.svg);
+       background-repeat: no-repeat;
+       width: 15px;
+       height: 8px;
+       margin-left: -7px;
+}
+
+.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
+       -webkit-transition: width 100ms, height 100ms, left 100ms;
+       -moz-transition: width 100ms, height 100ms, left 100ms;
+       -o-transition: width 100ms, height 100ms, left 100ms;
+       transition: width 100ms, height 100ms, left 100ms;
+       -webkit-transition-timing-function: ease-in-out;
+       -moz-transition-timing-function: ease-in-out;
+       -o-transition-timing-function: ease-in-out;
+       transition-timing-function: ease-in-out;
+}
+
+.oo-ui-popupWidget-head {
+       height: 2.5em;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+       -moz-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+}
+
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+       float: right;
+       margin: 0.25em;
+}
+
+.oo-ui-popupWidget-head .oo-ui-labeledElement-label {
+       float: left;
+       margin: 0.75em 1em;
+       cursor: default;
+}
+
+.oo-ui-popupWidget-body {
+       box-shadow: 0 0 0.66em rgba(0,0,0,0.25);
+}
+
+/* OO.ui.SearchWidget */
+
+.oo-ui-searchWidget-query {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       height: 4em;
+       padding: 0 1em;
+       box-shadow: 0 0 0.5em rgba(0,0,0,0.2);
+}
+
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+       width: 100%;
+       margin: 0.75em 0;
+}
+
+.oo-ui-searchWidget-results {
+       position: absolute;
+       top: 4em;
+       bottom: 0;
+       left: 0;
+       right: 0;
+       padding: 1em;
+       overflow-x: hidden;
+       overflow-y: auto;
+       line-height: 0;
+}
+
+/* OO.ui.ToggleSwitchWidget */
+
+.oo-ui-toggleSwitchWidget {
+       position: relative;
+       display: inline-block;
+       vertical-align: middle;
+       height: 2em;
+       width: 3em;
+       border-radius: 1em;
+       overflow: hidden;
+       box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
+       border: solid 1px #ccc;
+       cursor: pointer;
+       -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+       box-sizing: border-box;
+       -webkit-transform: translateZ(0px);
+       -moz-transform: translateZ(0px);
+       -ms-transform: translateZ(0px);
+       -o-transform: translateZ(0px);
+       transform: translateZ(0px);
+
+       /* Gray */
+       background-color: #dddddd;
+       filter: progid:DXImageTransform.Microsoft.gradient(
+               GradientType=0,startColorstr=#dddddd, endColorstr=#ffffff
+       );
+       background-image: -webkit-gradient(
+               linear, right top, right 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%);
+}
+
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+       opacity: 0.5;
+       cursor: default;
+}
+
+.oo-ui-toggleSwitchWidget-grip {
+       -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+       -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+       -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+       transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+}
+
+.oo-ui-toggleSwitchWidget-grip {
+       position: absolute;
+       display: block;
+       top: 0.25em;
+       left: 0.25em;
+       width: 1.5em;
+       height: 1.5em;
+       border-radius: 1em;
+       box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
+       -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+       box-sizing: border-box;
+
+       /* Gray */
+       border: 1px #c9c9c9 solid;
+       background-color: #ffffff;
+       filter: progid:DXImageTransform.Microsoft.gradient(
+               GradientType=0,startColorstr=#ffffff, endColorstr=#dddddd
+       );
+       background-image: -webkit-gradient(
+               linear, right top, right 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%);
+}
+
+.oo-ui-toggleSwitchWidget:not(.oo-ui-widget-disabled):hover,
+.oo-ui-toggleSwitchWidget:not(.oo-ui-widget-disabled):hover .oo-ui-toggleSwitchWidget-grip {
+       border-color: #aaa;
+}
+
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+       left: 1.25em;
+       margin-left: -2px;
+}
+
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+       left: 0.25em;
+       margin-left: 0;
+}
+
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-on {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+       right: 0;
+       left: 0;
+       border-radius: 1em;
+       box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+       -moz-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+
+       -webkit-transition: opacity 200ms ease-in-out;
+       -moz-transition: opacity 200ms ease-in-out;
+       -o-transition: opacity 200ms ease-in-out;
+       transition: opacity 200ms ease-in-out;
+
+       /* Blue */
+       background-color: #eaf4fa;
+       filter: progid:DXImageTransform.Microsoft.gradient(
+               GradientType=0,startColorstr=#b0d9ee, endColorstr=#eaf4fa
+       );
+       background-image: -webkit-gradient(
+               linear, right top, right 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%);
+}
+
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-on {
+       opacity: 1;
+}
+
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-on {
+       opacity: 0;
+}
+.oo-ui-window-head {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+       -moz-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+}
+
+.oo-ui-window-body {
+       padding: 0 0.75em;
+}
+
+.oo-ui-window-icon {
+       float: left;
+       width: 2em;
+       height: 2em;
+       line-height: 2em;
+       margin-right: 0.5em;
+       background-position: right center;
+       background-repeat: no-repeat;
+}
+
+.oo-ui-window-title {
+       float: left;
+       line-height: 2em;
+       color: #333;
+       white-space: nowrap;
+       cursor: default;
+}
+
+.oo-ui-window-overlay {
+       font-family: sans-serif;
+       line-height: 1.5em;
+       font-size: 1em;
+       position: absolute;
+       top: 0;
+       left: 0;
+}
+/* Icons */
+
+.oo-ui-icon-add-item {
+       /* @embed */
+       background-image: url(images/icons/add-item.svg);
+}
+
+.oo-ui-icon-advanced {
+       /* @embed */
+       background-image: url(images/icons/advanced.svg);
+}
+
+.oo-ui-icon-alert {
+       /* @embed */
+       background-image: url(images/icons/alert.svg);
+}
+
+.oo-ui-icon-check {
+       /* @embed */
+       background-image: url(images/icons/check.svg);
+}
+
+.oo-ui-icon-clear {
+       /* @embed */
+       background-image: url(images/icons/clear.svg);
+}
+
+.oo-ui-icon-close {
+       /* @embed */
+       background-image: url(images/icons/close.svg);
+}
+
+.oo-ui-icon-code {
+       /* @embed */
+       background-image: url(images/icons/code.svg);
+}
+
+.oo-ui-icon-collapse {
+       /* @embed */
+       background-image: url(images/icons/collapse.svg);
+}
+
+.oo-ui-icon-comment {
+       /* @embed */
+       background-image: url(images/icons/comment.svg);
+}
+
+.oo-ui-icon-expand {
+       /* @embed */
+       background-image: url(images/icons/expand.svg);
+}
+
+.oo-ui-icon-help {
+       /* @embed */
+       background-image: url(images/icons/help.svg);
+}
+
+.oo-ui-icon-link {
+       /* @embed */
+       background-image: url(images/icons/link.svg);
+}
+
+.oo-ui-icon-menu {
+       /* @embed */
+       background-image: url(images/icons/menu.svg);
+}
+
+.oo-ui-icon-next {
+       /* @embed */
+       background-image: url(images/icons/move-ltr.svg);
+}
+
+.oo-ui-icon-picture {
+       /* @embed */
+       background-image: url(images/icons/picture.svg);
+}
+
+.oo-ui-icon-previous {
+       /* @embed */
+       background-image: url(images/icons/move-rtl.svg);
+}
+
+.oo-ui-icon-redo {
+       /* @embed */
+       background-image: url(images/icons/arched-arrow-ltr.svg);
+}
+
+.oo-ui-icon-remove {
+       /* @embed */
+       background-image: url(images/icons/remove.svg);
+}
+
+.oo-ui-icon-search {
+       /* @embed */
+       background-image: url(images/icons/search.svg);
+}
+
+.oo-ui-icon-settings {
+       /* @embed */
+       background-image: url(images/icons/settings.svg);
+}
+
+.oo-ui-icon-tag {
+       /* @embed */
+       background-image: url(images/icons/tag.svg);
+}
+
+.oo-ui-icon-undo {
+       /* @embed */
+       background-image: url(images/icons/arched-arrow-rtl.svg);
+}
+
+.oo-ui-icon-window {
+       /* @embed */
+       background-image: url(images/icons/window.svg);
+}
+
+/* Indicators */
+
+.oo-ui-indicator-down {
+       /* @embed */
+       background-image: url(images/indicators/down.svg);
+}
+
+.oo-ui-indicator-required {
+       /* @embed */
+       background-image: url(images/indicators/required.svg);
+}
+
+.oo-ui-indicator-up {
+       /* @embed */
+       background-image: url(images/indicators/up.svg);
+}
index 706f589..70cb221 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs v1.0.6
+ * OOjs v1.0.7-pre (9c04f3e917)
  * https://www.mediawiki.org/wiki/OOjs
  *
- * Copyright 2011-2013 OOjs Team and other contributors.
+ * Copyright 2011-2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: Tue Dec 10 2013 22:43:42 GMT+0100 (CET)
+ * Date: Fri Feb 14 2014 17:51:43 GMT-0800 (PST)
  */
 ( function ( global ) {
 
@@ -23,7 +23,6 @@ var
 
 /* Class Methods */
 
-
 /**
  * Assert whether a value is a plain object or not.
  *
@@ -64,23 +63,27 @@ oo.isPlainObject = function ( obj ) {
  *  multiple constructors consider storing an instance of the other constructor in a
  *  property instead, or perhaps use a mixin (see oo.mixinClass).
  *
- *     function Foo() {}
- *     Foo.prototype.jump = function () {};
+ *     function Thing() {}
+ *     Thing.prototype.exists = function () {};
  *
- *     function FooBar() {}
- *     oo.inheritClass( FooBar, Foo );
- *     FooBar.prop.feet = 2;
- *     FooBar.prototype.walk = function () {};
+ *     function Person() {
+ *         this.constructor.super.apply( this, arguments );
+ *     }
+ *     oo.inheritClass( Person, Thing );
+ *     Person.static.defaultEyeCount = 2;
+ *     Person.prototype.walk = function () {};
  *
- *     function FooBarQuux() {}
- *     OO.inheritClass( FooBarQuux, FooBar );
- *     FooBarQuux.prototype.jump = function () {};
+ *     function Jumper() {
+ *         this.constructor.super.apply( this, arguments );
+ *     }
+ *     OO.inheritClass( Jumper, Person );
+ *     Jumper.prototype.jump = function () {};
  *
- *     FooBarQuux.prop.feet === 2;
- *     var fb = new FooBar();
- *     fb.jump();
- *     fb.walk();
- *     fb instanceof Foo && fb instanceof FooBar && fb instanceof FooBarQuux;
+ *     Jumper.static.defaultEyeCount === 2;
+ *     var x = new Jumper();
+ *     x.jump();
+ *     x.walk();
+ *     x instanceof Thing && x instanceof Person && x instanceof Jumper;
  *
  * @method
  * @param {Function} targetFn
@@ -94,6 +97,7 @@ oo.inheritClass = function ( targetFn, originFn ) {
 
        var targetConstructor = targetFn.prototype.constructor;
 
+       targetFn.super = originFn;
        targetFn.prototype = Object.create( originFn.prototype, {
                // Restore constructor property of targetFn
                constructor: {
@@ -502,9 +506,9 @@ oo.EventEmitter.prototype.on = function ( event, callback, args, context ) {
        }
        // Add binding
        bindings.push( {
-               'callback': callback,
-               'args': args,
-               'context': context
+               callback: callback,
+               args: args,
+               context: context
        } );
        return this;
 };
diff --git a/resources/sinonjs/sinon-1.8.1.js b/resources/sinonjs/sinon-1.8.1.js
new file mode 100644 (file)
index 0000000..3e9865e
--- /dev/null
@@ -0,0 +1,4721 @@
+/**
+ * Sinon.JS 1.8.1, 2014/02/02
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS
+ *
+ * (The BSD License)
+ * 
+ * Copyright (c) 2010-2013, Christian Johansen, christian@cjohansen.no
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 
+ *     * Redistributions of source code must retain the above copyright notice,
+ *       this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright notice,
+ *       this list of conditions and the following disclaimer in the documentation
+ *       and/or other materials provided with the distribution.
+ *     * Neither the name of Christian Johansen nor the names of his contributors
+ *       may be used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+this.sinon = (function () {
+var samsam, formatio;
+function define(mod, deps, fn) { if (mod == "samsam") { samsam = deps(); } else { formatio = fn(samsam); } }
+define.amd = true;
+((typeof define === "function" && define.amd && function (m) { define("samsam", m); }) ||
+ (typeof module === "object" &&
+      function (m) { module.exports = m(); }) || // Node
+ function (m) { this.samsam = m(); } // Browser globals
+)(function () {
+    var o = Object.prototype;
+    var div = typeof document !== "undefined" && document.createElement("div");
+
+    function isNaN(value) {
+        // Unlike global isNaN, this avoids type coercion
+        // typeof check avoids IE host object issues, hat tip to
+        // lodash
+        var val = value; // JsLint thinks value !== value is "weird"
+        return typeof value === "number" && value !== val;
+    }
+
+    function getClass(value) {
+        // Returns the internal [[Class]] by calling Object.prototype.toString
+        // with the provided value as this. Return value is a string, naming the
+        // internal class, e.g. "Array"
+        return o.toString.call(value).split(/[ \]]/)[1];
+    }
+
+    /**
+     * @name samsam.isArguments
+     * @param Object object
+     *
+     * Returns ``true`` if ``object`` is an ``arguments`` object,
+     * ``false`` otherwise.
+     */
+    function isArguments(object) {
+        if (typeof object !== "object" || typeof object.length !== "number" ||
+                getClass(object) === "Array") {
+            return false;
+        }
+        if (typeof object.callee == "function") { return true; }
+        try {
+            object[object.length] = 6;
+            delete object[object.length];
+        } catch (e) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * @name samsam.isElement
+     * @param Object object
+     *
+     * Returns ``true`` if ``object`` is a DOM element node. Unlike
+     * Underscore.js/lodash, this function will return ``false`` if ``object``
+     * is an *element-like* object, i.e. a regular object with a ``nodeType``
+     * property that holds the value ``1``.
+     */
+    function isElement(object) {
+        if (!object || object.nodeType !== 1 || !div) { return false; }
+        try {
+            object.appendChild(div);
+            object.removeChild(div);
+        } catch (e) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * @name samsam.keys
+     * @param Object object
+     *
+     * Return an array of own property names.
+     */
+    function keys(object) {
+        var ks = [], prop;
+        for (prop in object) {
+            if (o.hasOwnProperty.call(object, prop)) { ks.push(prop); }
+        }
+        return ks;
+    }
+
+    /**
+     * @name samsam.isDate
+     * @param Object value
+     *
+     * Returns true if the object is a ``Date``, or *date-like*. Duck typing
+     * of date objects work by checking that the object has a ``getTime``
+     * function whose return value equals the return value from the object's
+     * ``valueOf``.
+     */
+    function isDate(value) {
+        return typeof value.getTime == "function" &&
+            value.getTime() == value.valueOf();
+    }
+
+    /**
+     * @name samsam.isNegZero
+     * @param Object value
+     *
+     * Returns ``true`` if ``value`` is ``-0``.
+     */
+    function isNegZero(value) {
+        return value === 0 && 1 / value === -Infinity;
+    }
+
+    /**
+     * @name samsam.equal
+     * @param Object obj1
+     * @param Object obj2
+     *
+     * Returns ``true`` if two objects are strictly equal. Compared to
+     * ``===`` there are two exceptions:
+     *
+     *   - NaN is considered equal to NaN
+     *   - -0 and +0 are not considered equal
+     */
+    function identical(obj1, obj2) {
+        if (obj1 === obj2 || (isNaN(obj1) && isNaN(obj2))) {
+            return obj1 !== 0 || isNegZero(obj1) === isNegZero(obj2);
+        }
+    }
+
+
+    /**
+     * @name samsam.deepEqual
+     * @param Object obj1
+     * @param Object obj2
+     *
+     * Deep equal comparison. Two values are "deep equal" if:
+     *
+     *   - They are equal, according to samsam.identical
+     *   - They are both date objects representing the same time
+     *   - They are both arrays containing elements that are all deepEqual
+     *   - They are objects with the same set of properties, and each property
+     *     in ``obj1`` is deepEqual to the corresponding property in ``obj2``
+     *
+     * Supports cyclic objects.
+     */
+    function deepEqualCyclic(obj1, obj2) {
+
+        // used for cyclic comparison
+        // contain already visited objects
+        var objects1 = [],
+            objects2 = [],
+        // contain pathes (position in the object structure)
+        // of the already visited objects
+        // indexes same as in objects arrays
+            paths1 = [],
+            paths2 = [],
+        // contains combinations of already compared objects
+        // in the manner: { "$1['ref']$2['ref']": true }
+            compared = {};
+
+        /**
+         * used to check, if the value of a property is an object
+         * (cyclic logic is only needed for objects)
+         * only needed for cyclic logic
+         */
+        function isObject(value) {
+
+            if (typeof value === 'object' && value !== null &&
+                    !(value instanceof Boolean) &&
+                    !(value instanceof Date)    &&
+                    !(value instanceof Number)  &&
+                    !(value instanceof RegExp)  &&
+                    !(value instanceof String)) {
+
+                return true;
+            }
+
+            return false;
+        }
+
+        /**
+         * returns the index of the given object in the
+         * given objects array, -1 if not contained
+         * only needed for cyclic logic
+         */
+        function getIndex(objects, obj) {
+
+            var i;
+            for (i = 0; i < objects.length; i++) {
+                if (objects[i] === obj) {
+                    return i;
+                }
+            }
+
+            return -1;
+        }
+
+        // does the recursion for the deep equal check
+        return (function deepEqual(obj1, obj2, path1, path2) {
+            var type1 = typeof obj1;
+            var type2 = typeof obj2;
+
+            // == null also matches undefined
+            if (obj1 === obj2 ||
+                    isNaN(obj1) || isNaN(obj2) ||
+                    obj1 == null || obj2 == null ||
+                    type1 !== "object" || type2 !== "object") {
+
+                return identical(obj1, obj2);
+            }
+
+            // Elements are only equal if identical(expected, actual)
+            if (isElement(obj1) || isElement(obj2)) { return false; }
+
+            var isDate1 = isDate(obj1), isDate2 = isDate(obj2);
+            if (isDate1 || isDate2) {
+                if (!isDate1 || !isDate2 || obj1.getTime() !== obj2.getTime()) {
+                    return false;
+                }
+            }
+
+            if (obj1 instanceof RegExp && obj2 instanceof RegExp) {
+                if (obj1.toString() !== obj2.toString()) { return false; }
+            }
+
+            var class1 = getClass(obj1);
+            var class2 = getClass(obj2);
+            var keys1 = keys(obj1);
+            var keys2 = keys(obj2);
+
+            if (isArguments(obj1) || isArguments(obj2)) {
+                if (obj1.length !== obj2.length) { return false; }
+            } else {
+                if (type1 !== type2 || class1 !== class2 ||
+                        keys1.length !== keys2.length) {
+                    return false;
+                }
+            }
+
+            var key, i, l,
+                // following vars are used for the cyclic logic
+                value1, value2,
+                isObject1, isObject2,
+                index1, index2,
+                newPath1, newPath2;
+
+            for (i = 0, l = keys1.length; i < l; i++) {
+                key = keys1[i];
+                if (!o.hasOwnProperty.call(obj2, key)) {
+                    return false;
+                }
+
+                // Start of the cyclic logic
+
+                value1 = obj1[key];
+                value2 = obj2[key];
+
+                isObject1 = isObject(value1);
+                isObject2 = isObject(value2);
+
+                // determine, if the objects were already visited
+                // (it's faster to check for isObject first, than to
+                // get -1 from getIndex for non objects)
+                index1 = isObject1 ? getIndex(objects1, value1) : -1;
+                index2 = isObject2 ? getIndex(objects2, value2) : -1;
+
+                // determine the new pathes of the objects
+                // - for non cyclic objects the current path will be extended
+                //   by current property name
+                // - for cyclic objects the stored path is taken
+                newPath1 = index1 !== -1
+                    ? paths1[index1]
+                    : path1 + '[' + JSON.stringify(key) + ']';
+                newPath2 = index2 !== -1
+                    ? paths2[index2]
+                    : path2 + '[' + JSON.stringify(key) + ']';
+
+                // stop recursion if current objects are already compared
+                if (compared[newPath1 + newPath2]) {
+                    return true;
+                }
+
+                // remember the current objects and their pathes
+                if (index1 === -1 && isObject1) {
+                    objects1.push(value1);
+                    paths1.push(newPath1);
+                }
+                if (index2 === -1 && isObject2) {
+                    objects2.push(value2);
+                    paths2.push(newPath2);
+                }
+
+                // remember that the current objects are already compared
+                if (isObject1 && isObject2) {
+                    compared[newPath1 + newPath2] = true;
+                }
+
+                // End of cyclic logic
+
+                // neither value1 nor value2 is a cycle
+                // continue with next level
+                if (!deepEqual(value1, value2, newPath1, newPath2)) {
+                    return false;
+                }
+            }
+
+            return true;
+
+        }(obj1, obj2, '$1', '$2'));
+    }
+
+    var match;
+
+    function arrayContains(array, subset) {
+        if (subset.length === 0) { return true; }
+        var i, l, j, k;
+        for (i = 0, l = array.length; i < l; ++i) {
+            if (match(array[i], subset[0])) {
+                for (j = 0, k = subset.length; j < k; ++j) {
+                    if (!match(array[i + j], subset[j])) { return false; }
+                }
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * @name samsam.match
+     * @param Object object
+     * @param Object matcher
+     *
+     * Compare arbitrary value ``object`` with matcher.
+     */
+    match = function match(object, matcher) {
+        if (matcher && typeof matcher.test === "function") {
+            return matcher.test(object);
+        }
+
+        if (typeof matcher === "function") {
+            return matcher(object) === true;
+        }
+
+        if (typeof matcher === "string") {
+            matcher = matcher.toLowerCase();
+            var notNull = typeof object === "string" || !!object;
+            return notNull &&
+                (String(object)).toLowerCase().indexOf(matcher) >= 0;
+        }
+
+        if (typeof matcher === "number") {
+            return matcher === object;
+        }
+
+        if (typeof matcher === "boolean") {
+            return matcher === object;
+        }
+
+        if (getClass(object) === "Array" && getClass(matcher) === "Array") {
+            return arrayContains(object, matcher);
+        }
+
+        if (matcher && typeof matcher === "object") {
+            var prop;
+            for (prop in matcher) {
+                if (!match(object[prop], matcher[prop])) {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        throw new Error("Matcher was not a string, a number, a " +
+                        "function, a boolean or an object");
+    };
+
+    return {
+        isArguments: isArguments,
+        isElement: isElement,
+        isDate: isDate,
+        isNegZero: isNegZero,
+        identical: identical,
+        deepEqual: deepEqualCyclic,
+        match: match,
+        keys: keys
+    };
+});
+((typeof define === "function" && define.amd && function (m) {
+    define("formatio", ["samsam"], m);
+}) || (typeof module === "object" && function (m) {
+    module.exports = m(require("samsam"));
+}) || function (m) { this.formatio = m(this.samsam); }
+)(function (samsam) {
+    
+    var formatio = {
+        excludeConstructors: ["Object", /^.$/],
+        quoteStrings: true
+    };
+
+    var hasOwn = Object.prototype.hasOwnProperty;
+
+    var specialObjects = [];
+    if (typeof global !== "undefined") {
+        specialObjects.push({ object: global, value: "[object global]" });
+    }
+    if (typeof document !== "undefined") {
+        specialObjects.push({
+            object: document,
+            value: "[object HTMLDocument]"
+        });
+    }
+    if (typeof window !== "undefined") {
+        specialObjects.push({ object: window, value: "[object Window]" });
+    }
+
+    function functionName(func) {
+        if (!func) { return ""; }
+        if (func.displayName) { return func.displayName; }
+        if (func.name) { return func.name; }
+        var matches = func.toString().match(/function\s+([^\(]+)/m);
+        return (matches && matches[1]) || "";
+    }
+
+    function constructorName(f, object) {
+        var name = functionName(object && object.constructor);
+        var excludes = f.excludeConstructors ||
+                formatio.excludeConstructors || [];
+
+        var i, l;
+        for (i = 0, l = excludes.length; i < l; ++i) {
+            if (typeof excludes[i] === "string" && excludes[i] === name) {
+                return "";
+            } else if (excludes[i].test && excludes[i].test(name)) {
+                return "";
+            }
+        }
+
+        return name;
+    }
+
+    function isCircular(object, objects) {
+        if (typeof object !== "object") { return false; }
+        var i, l;
+        for (i = 0, l = objects.length; i < l; ++i) {
+            if (objects[i] === object) { return true; }
+        }
+        return false;
+    }
+
+    function ascii(f, object, processed, indent) {
+        if (typeof object === "string") {
+            var qs = f.quoteStrings;
+            var quote = typeof qs !== "boolean" || qs;
+            return processed || quote ? '"' + object + '"' : object;
+        }
+
+        if (typeof object === "function" && !(object instanceof RegExp)) {
+            return ascii.func(object);
+        }
+
+        processed = processed || [];
+
+        if (isCircular(object, processed)) { return "[Circular]"; }
+
+        if (Object.prototype.toString.call(object) === "[object Array]") {
+            return ascii.array.call(f, object, processed);
+        }
+
+        if (!object) { return String((1/object) === -Infinity ? "-0" : object); }
+        if (samsam.isElement(object)) { return ascii.element(object); }
+
+        if (typeof object.toString === "function" &&
+                object.toString !== Object.prototype.toString) {
+            return object.toString();
+        }
+
+        var i, l;
+        for (i = 0, l = specialObjects.length; i < l; i++) {
+            if (object === specialObjects[i].object) {
+                return specialObjects[i].value;
+            }
+        }
+
+        return ascii.object.call(f, object, processed, indent);
+    }
+
+    ascii.func = function (func) {
+        return "function " + functionName(func) + "() {}";
+    };
+
+    ascii.array = function (array, processed) {
+        processed = processed || [];
+        processed.push(array);
+        var i, l, pieces = [];
+        for (i = 0, l = array.length; i < l; ++i) {
+            pieces.push(ascii(this, array[i], processed));
+        }
+        return "[" + pieces.join(", ") + "]";
+    };
+
+    ascii.object = function (object, processed, indent) {
+        processed = processed || [];
+        processed.push(object);
+        indent = indent || 0;
+        var pieces = [], properties = samsam.keys(object).sort();
+        var length = 3;
+        var prop, str, obj, i, l;
+
+        for (i = 0, l = properties.length; i < l; ++i) {
+            prop = properties[i];
+            obj = object[prop];
+
+            if (isCircular(obj, processed)) {
+                str = "[Circular]";
+            } else {
+                str = ascii(this, obj, processed, indent + 2);
+            }
+
+            str = (/\s/.test(prop) ? '"' + prop + '"' : prop) + ": " + str;
+            length += str.length;
+            pieces.push(str);
+        }
+
+        var cons = constructorName(this, object);
+        var prefix = cons ? "[" + cons + "] " : "";
+        var is = "";
+        for (i = 0, l = indent; i < l; ++i) { is += " "; }
+
+        if (length + indent > 80) {
+            return prefix + "{\n  " + is + pieces.join(",\n  " + is) + "\n" +
+                is + "}";
+        }
+        return prefix + "{ " + pieces.join(", ") + " }";
+    };
+
+    ascii.element = function (element) {
+        var tagName = element.tagName.toLowerCase();
+        var attrs = element.attributes, attr, pairs = [], attrName, i, l, val;
+
+        for (i = 0, l = attrs.length; i < l; ++i) {
+            attr = attrs.item(i);
+            attrName = attr.nodeName.toLowerCase().replace("html:", "");
+            val = attr.nodeValue;
+            if (attrName !== "contenteditable" || val !== "inherit") {
+                if (!!val) { pairs.push(attrName + "=\"" + val + "\""); }
+            }
+        }
+
+        var formatted = "<" + tagName + (pairs.length > 0 ? " " : "");
+        var content = element.innerHTML;
+
+        if (content.length > 20) {
+            content = content.substr(0, 20) + "[...]";
+        }
+
+        var res = formatted + pairs.join(" ") + ">" + content +
+                "</" + tagName + ">";
+
+        return res.replace(/ contentEditable="inherit"/, "");
+    };
+
+    function Formatio(options) {
+        for (var opt in options) {
+            this[opt] = options[opt];
+        }
+    }
+
+    Formatio.prototype = {
+        functionName: functionName,
+
+        configure: function (options) {
+            return new Formatio(options);
+        },
+
+        constructorName: function (object) {
+            return constructorName(this, object);
+        },
+
+        ascii: function (object, processed, indent) {
+            return ascii(this, object, processed, indent);
+        }
+    };
+
+    return Formatio.prototype;
+});
+/*jslint eqeqeq: false, onevar: false, forin: true, nomen: false, regexp: false, plusplus: false*/
+/*global module, require, __dirname, document*/
+/**
+ * Sinon core utilities. For internal use only.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+var sinon = (function (formatio) {
+    var div = typeof document != "undefined" && document.createElement("div");
+    var hasOwn = Object.prototype.hasOwnProperty;
+
+    function isDOMNode(obj) {
+        var success = false;
+
+        try {
+            obj.appendChild(div);
+            success = div.parentNode == obj;
+        } catch (e) {
+            return false;
+        } finally {
+            try {
+                obj.removeChild(div);
+            } catch (e) {
+                // Remove failed, not much we can do about that
+            }
+        }
+
+        return success;
+    }
+
+    function isElement(obj) {
+        return div && obj && obj.nodeType === 1 && isDOMNode(obj);
+    }
+
+    function isFunction(obj) {
+        return typeof obj === "function" || !!(obj && obj.constructor && obj.call && obj.apply);
+    }
+
+    function mirrorProperties(target, source) {
+        for (var prop in source) {
+            if (!hasOwn.call(target, prop)) {
+                target[prop] = source[prop];
+            }
+        }
+    }
+
+    function isRestorable (obj) {
+        return typeof obj === "function" && typeof obj.restore === "function" && obj.restore.sinon;
+    }
+
+    var sinon = {
+        wrapMethod: function wrapMethod(object, property, method) {
+            if (!object) {
+                throw new TypeError("Should wrap property of object");
+            }
+
+            if (typeof method != "function") {
+                throw new TypeError("Method wrapper should be function");
+            }
+
+            var wrappedMethod = object[property],
+                error;
+
+            if (!isFunction(wrappedMethod)) {
+                error = new TypeError("Attempted to wrap " + (typeof wrappedMethod) + " property " +
+                                    property + " as function");
+            }
+
+            if (wrappedMethod.restore && wrappedMethod.restore.sinon) {
+                error = new TypeError("Attempted to wrap " + property + " which is already wrapped");
+            }
+
+            if (wrappedMethod.calledBefore) {
+                var verb = !!wrappedMethod.returns ? "stubbed" : "spied on";
+                error = new TypeError("Attempted to wrap " + property + " which is already " + verb);
+            }
+
+            if (error) {
+                if (wrappedMethod._stack) {
+                    error.stack += '\n--------------\n' + wrappedMethod._stack;
+                }
+                throw error;
+            }
+
+            // IE 8 does not support hasOwnProperty on the window object and Firefox has a problem
+            // when using hasOwn.call on objects from other frames.
+            var owned = object.hasOwnProperty ? object.hasOwnProperty(property) : hasOwn.call(object, property);
+            object[property] = method;
+            method.displayName = property;
+            // Set up a stack trace which can be used later to find what line of
+            // code the original method was created on.
+            method._stack = (new Error('Stack Trace for original')).stack;
+
+            method.restore = function () {
+                // For prototype properties try to reset by delete first.
+                // If this fails (ex: localStorage on mobile safari) then force a reset
+                // via direct assignment.
+                if (!owned) {
+                    delete object[property];
+                }
+                if (object[property] === method) {
+                    object[property] = wrappedMethod;
+                }
+            };
+
+            method.restore.sinon = true;
+            mirrorProperties(method, wrappedMethod);
+
+            return method;
+        },
+
+        extend: function extend(target) {
+            for (var i = 1, l = arguments.length; i < l; i += 1) {
+                for (var prop in arguments[i]) {
+                    if (arguments[i].hasOwnProperty(prop)) {
+                        target[prop] = arguments[i][prop];
+                    }
+
+                    // DONT ENUM bug, only care about toString
+                    if (arguments[i].hasOwnProperty("toString") &&
+                        arguments[i].toString != target.toString) {
+                        target.toString = arguments[i].toString;
+                    }
+                }
+            }
+
+            return target;
+        },
+
+        create: function create(proto) {
+            var F = function () {};
+            F.prototype = proto;
+            return new F();
+        },
+
+        deepEqual: function deepEqual(a, b) {
+            if (sinon.match && sinon.match.isMatcher(a)) {
+                return a.test(b);
+            }
+            if (typeof a != "object" || typeof b != "object") {
+                return a === b;
+            }
+
+            if (isElement(a) || isElement(b)) {
+                return a === b;
+            }
+
+            if (a === b) {
+                return true;
+            }
+
+            if ((a === null && b !== null) || (a !== null && b === null)) {
+                return false;
+            }
+
+            var aString = Object.prototype.toString.call(a);
+            if (aString != Object.prototype.toString.call(b)) {
+                return false;
+            }
+
+            if (aString == "[object Date]") {
+                return a.valueOf() === b.valueOf();
+            }
+
+            var prop, aLength = 0, bLength = 0;
+
+            if (aString == "[object Array]" && a.length !== b.length) {
+                return false;
+            }
+
+            for (prop in a) {
+                aLength += 1;
+
+                if (!deepEqual(a[prop], b[prop])) {
+                    return false;
+                }
+            }
+
+            for (prop in b) {
+                bLength += 1;
+            }
+
+            return aLength == bLength;
+        },
+
+        functionName: function functionName(func) {
+            var name = func.displayName || func.name;
+
+            // Use function decomposition as a last resort to get function
+            // name. Does not rely on function decomposition to work - if it
+            // doesn't debugging will be slightly less informative
+            // (i.e. toString will say 'spy' rather than 'myFunc').
+            if (!name) {
+                var matches = func.toString().match(/function ([^\s\(]+)/);
+                name = matches && matches[1];
+            }
+
+            return name;
+        },
+
+        functionToString: function toString() {
+            if (this.getCall && this.callCount) {
+                var thisValue, prop, i = this.callCount;
+
+                while (i--) {
+                    thisValue = this.getCall(i).thisValue;
+
+                    for (prop in thisValue) {
+                        if (thisValue[prop] === this) {
+                            return prop;
+                        }
+                    }
+                }
+            }
+
+            return this.displayName || "sinon fake";
+        },
+
+        getConfig: function (custom) {
+            var config = {};
+            custom = custom || {};
+            var defaults = sinon.defaultConfig;
+
+            for (var prop in defaults) {
+                if (defaults.hasOwnProperty(prop)) {
+                    config[prop] = custom.hasOwnProperty(prop) ? custom[prop] : defaults[prop];
+                }
+            }
+
+            return config;
+        },
+
+        format: function (val) {
+            return "" + val;
+        },
+
+        defaultConfig: {
+            injectIntoThis: true,
+            injectInto: null,
+            properties: ["spy", "stub", "mock", "clock", "server", "requests"],
+            useFakeTimers: true,
+            useFakeServer: true
+        },
+
+        timesInWords: function timesInWords(count) {
+            return count == 1 && "once" ||
+                count == 2 && "twice" ||
+                count == 3 && "thrice" ||
+                (count || 0) + " times";
+        },
+
+        calledInOrder: function (spies) {
+            for (var i = 1, l = spies.length; i < l; i++) {
+                if (!spies[i - 1].calledBefore(spies[i]) || !spies[i].called) {
+                    return false;
+                }
+            }
+
+            return true;
+        },
+
+        orderByFirstCall: function (spies) {
+            return spies.sort(function (a, b) {
+                // uuid, won't ever be equal
+                var aCall = a.getCall(0);
+                var bCall = b.getCall(0);
+                var aId = aCall && aCall.callId || -1;
+                var bId = bCall && bCall.callId || -1;
+
+                return aId < bId ? -1 : 1;
+            });
+        },
+
+        log: function () {},
+
+        logError: function (label, err) {
+            var msg = label + " threw exception: ";
+            sinon.log(msg + "[" + err.name + "] " + err.message);
+            if (err.stack) { sinon.log(err.stack); }
+
+            setTimeout(function () {
+                err.message = msg + err.message;
+                throw err;
+            }, 0);
+        },
+
+        typeOf: function (value) {
+            if (value === null) {
+                return "null";
+            }
+            else if (value === undefined) {
+                return "undefined";
+            }
+            var string = Object.prototype.toString.call(value);
+            return string.substring(8, string.length - 1).toLowerCase();
+        },
+
+        createStubInstance: function (constructor) {
+            if (typeof constructor !== "function") {
+                throw new TypeError("The constructor should be a function.");
+            }
+            return sinon.stub(sinon.create(constructor.prototype));
+        },
+
+        restore: function (object) {
+            if (object !== null && typeof object === "object") {
+                for (var prop in object) {
+                    if (isRestorable(object[prop])) {
+                        object[prop].restore();
+                    }
+                }
+            }
+            else if (isRestorable(object)) {
+                object.restore();
+            }
+        }
+    };
+
+    var isNode = typeof module !== "undefined" && module.exports;
+    var isAMD = typeof define === 'function' && typeof define.amd === 'object' && define.amd;
+
+    if (isAMD) {
+        define(function(){
+            return sinon;
+        });
+    } else if (isNode) {
+        try {
+            formatio = require("formatio");
+        } catch (e) {}
+        module.exports = sinon;
+        module.exports.spy = require("./sinon/spy");
+        module.exports.spyCall = require("./sinon/call");
+        module.exports.behavior = require("./sinon/behavior");
+        module.exports.stub = require("./sinon/stub");
+        module.exports.mock = require("./sinon/mock");
+        module.exports.collection = require("./sinon/collection");
+        module.exports.assert = require("./sinon/assert");
+        module.exports.sandbox = require("./sinon/sandbox");
+        module.exports.test = require("./sinon/test");
+        module.exports.testCase = require("./sinon/test_case");
+        module.exports.assert = require("./sinon/assert");
+        module.exports.match = require("./sinon/match");
+    }
+
+    if (formatio) {
+        var formatter = formatio.configure({ quoteStrings: false });
+        sinon.format = function () {
+            return formatter.ascii.apply(formatter, arguments);
+        };
+    } else if (isNode) {
+        try {
+            var util = require("util");
+            sinon.format = function (value) {
+                return typeof value == "object" && value.toString === Object.prototype.toString ? util.inspect(value) : value;
+            };
+        } catch (e) {
+            /* Node, but no util module - would be very old, but better safe than
+             sorry */
+        }
+    }
+
+    return sinon;
+}(typeof formatio == "object" && formatio));
+
+/* @depend ../sinon.js */
+/*jslint eqeqeq: false, onevar: false, plusplus: false*/
+/*global module, require, sinon*/
+/**
+ * Match functions
+ *
+ * @author Maximilian Antoni (mail@maxantoni.de)
+ * @license BSD
+ *
+ * Copyright (c) 2012 Maximilian Antoni
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function assertType(value, type, name) {
+        var actual = sinon.typeOf(value);
+        if (actual !== type) {
+            throw new TypeError("Expected type of " + name + " to be " +
+                type + ", but was " + actual);
+        }
+    }
+
+    var matcher = {
+        toString: function () {
+            return this.message;
+        }
+    };
+
+    function isMatcher(object) {
+        return matcher.isPrototypeOf(object);
+    }
+
+    function matchObject(expectation, actual) {
+        if (actual === null || actual === undefined) {
+            return false;
+        }
+        for (var key in expectation) {
+            if (expectation.hasOwnProperty(key)) {
+                var exp = expectation[key];
+                var act = actual[key];
+                if (match.isMatcher(exp)) {
+                    if (!exp.test(act)) {
+                        return false;
+                    }
+                } else if (sinon.typeOf(exp) === "object") {
+                    if (!matchObject(exp, act)) {
+                        return false;
+                    }
+                } else if (!sinon.deepEqual(exp, act)) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    matcher.or = function (m2) {
+        if (!isMatcher(m2)) {
+            throw new TypeError("Matcher expected");
+        }
+        var m1 = this;
+        var or = sinon.create(matcher);
+        or.test = function (actual) {
+            return m1.test(actual) || m2.test(actual);
+        };
+        or.message = m1.message + ".or(" + m2.message + ")";
+        return or;
+    };
+
+    matcher.and = function (m2) {
+        if (!isMatcher(m2)) {
+            throw new TypeError("Matcher expected");
+        }
+        var m1 = this;
+        var and = sinon.create(matcher);
+        and.test = function (actual) {
+            return m1.test(actual) && m2.test(actual);
+        };
+        and.message = m1.message + ".and(" + m2.message + ")";
+        return and;
+    };
+
+    var match = function (expectation, message) {
+        var m = sinon.create(matcher);
+        var type = sinon.typeOf(expectation);
+        switch (type) {
+        case "object":
+            if (typeof expectation.test === "function") {
+                m.test = function (actual) {
+                    return expectation.test(actual) === true;
+                };
+                m.message = "match(" + sinon.functionName(expectation.test) + ")";
+                return m;
+            }
+            var str = [];
+            for (var key in expectation) {
+                if (expectation.hasOwnProperty(key)) {
+                    str.push(key + ": " + expectation[key]);
+                }
+            }
+            m.test = function (actual) {
+                return matchObject(expectation, actual);
+            };
+            m.message = "match(" + str.join(", ") + ")";
+            break;
+        case "number":
+            m.test = function (actual) {
+                return expectation == actual;
+            };
+            break;
+        case "string":
+            m.test = function (actual) {
+                if (typeof actual !== "string") {
+                    return false;
+                }
+                return actual.indexOf(expectation) !== -1;
+            };
+            m.message = "match(\"" + expectation + "\")";
+            break;
+        case "regexp":
+            m.test = function (actual) {
+                if (typeof actual !== "string") {
+                    return false;
+                }
+                return expectation.test(actual);
+            };
+            break;
+        case "function":
+            m.test = expectation;
+            if (message) {
+                m.message = message;
+            } else {
+                m.message = "match(" + sinon.functionName(expectation) + ")";
+            }
+            break;
+        default:
+            m.test = function (actual) {
+              return sinon.deepEqual(expectation, actual);
+            };
+        }
+        if (!m.message) {
+            m.message = "match(" + expectation + ")";
+        }
+        return m;
+    };
+
+    match.isMatcher = isMatcher;
+
+    match.any = match(function () {
+        return true;
+    }, "any");
+
+    match.defined = match(function (actual) {
+        return actual !== null && actual !== undefined;
+    }, "defined");
+
+    match.truthy = match(function (actual) {
+        return !!actual;
+    }, "truthy");
+
+    match.falsy = match(function (actual) {
+        return !actual;
+    }, "falsy");
+
+    match.same = function (expectation) {
+        return match(function (actual) {
+            return expectation === actual;
+        }, "same(" + expectation + ")");
+    };
+
+    match.typeOf = function (type) {
+        assertType(type, "string", "type");
+        return match(function (actual) {
+            return sinon.typeOf(actual) === type;
+        }, "typeOf(\"" + type + "\")");
+    };
+
+    match.instanceOf = function (type) {
+        assertType(type, "function", "type");
+        return match(function (actual) {
+            return actual instanceof type;
+        }, "instanceOf(" + sinon.functionName(type) + ")");
+    };
+
+    function createPropertyMatcher(propertyTest, messagePrefix) {
+        return function (property, value) {
+            assertType(property, "string", "property");
+            var onlyProperty = arguments.length === 1;
+            var message = messagePrefix + "(\"" + property + "\"";
+            if (!onlyProperty) {
+                message += ", " + value;
+            }
+            message += ")";
+            return match(function (actual) {
+                if (actual === undefined || actual === null ||
+                        !propertyTest(actual, property)) {
+                    return false;
+                }
+                return onlyProperty || sinon.deepEqual(value, actual[property]);
+            }, message);
+        };
+    }
+
+    match.has = createPropertyMatcher(function (actual, property) {
+        if (typeof actual === "object") {
+            return property in actual;
+        }
+        return actual[property] !== undefined;
+    }, "has");
+
+    match.hasOwn = createPropertyMatcher(function (actual, property) {
+        return actual.hasOwnProperty(property);
+    }, "hasOwn");
+
+    match.bool = match.typeOf("boolean");
+    match.number = match.typeOf("number");
+    match.string = match.typeOf("string");
+    match.object = match.typeOf("object");
+    match.func = match.typeOf("function");
+    match.array = match.typeOf("array");
+    match.regexp = match.typeOf("regexp");
+    match.date = match.typeOf("date");
+
+    if (commonJSModule) {
+        module.exports = match;
+    } else {
+        sinon.match = match;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+  * @depend ../sinon.js
+  * @depend match.js
+  */
+/*jslint eqeqeq: false, onevar: false, plusplus: false*/
+/*global module, require, sinon*/
+/**
+  * Spy calls
+  *
+  * @author Christian Johansen (christian@cjohansen.no)
+  * @author Maximilian Antoni (mail@maxantoni.de)
+  * @license BSD
+  *
+  * Copyright (c) 2010-2013 Christian Johansen
+  * Copyright (c) 2013 Maximilian Antoni
+  */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function throwYieldError(proxy, text, args) {
+        var msg = sinon.functionName(proxy) + text;
+        if (args.length) {
+            msg += " Received [" + slice.call(args).join(", ") + "]";
+        }
+        throw new Error(msg);
+    }
+
+    var slice = Array.prototype.slice;
+
+    var callProto = {
+        calledOn: function calledOn(thisValue) {
+            if (sinon.match && sinon.match.isMatcher(thisValue)) {
+                return thisValue.test(this.thisValue);
+            }
+            return this.thisValue === thisValue;
+        },
+
+        calledWith: function calledWith() {
+            for (var i = 0, l = arguments.length; i < l; i += 1) {
+                if (!sinon.deepEqual(arguments[i], this.args[i])) {
+                    return false;
+                }
+            }
+
+            return true;
+        },
+
+        calledWithMatch: function calledWithMatch() {
+            for (var i = 0, l = arguments.length; i < l; i += 1) {
+                var actual = this.args[i];
+                var expectation = arguments[i];
+                if (!sinon.match || !sinon.match(expectation).test(actual)) {
+                    return false;
+                }
+            }
+            return true;
+        },
+
+        calledWithExactly: function calledWithExactly() {
+            return arguments.length == this.args.length &&
+                this.calledWith.apply(this, arguments);
+        },
+
+        notCalledWith: function notCalledWith() {
+            return !this.calledWith.apply(this, arguments);
+        },
+
+        notCalledWithMatch: function notCalledWithMatch() {
+            return !this.calledWithMatch.apply(this, arguments);
+        },
+
+        returned: function returned(value) {
+            return sinon.deepEqual(value, this.returnValue);
+        },
+
+        threw: function threw(error) {
+            if (typeof error === "undefined" || !this.exception) {
+                return !!this.exception;
+            }
+
+            return this.exception === error || this.exception.name === error;
+        },
+
+        calledWithNew: function calledWithNew() {
+            return this.thisValue instanceof this.proxy;
+        },
+
+        calledBefore: function (other) {
+            return this.callId < other.callId;
+        },
+
+        calledAfter: function (other) {
+            return this.callId > other.callId;
+        },
+
+        callArg: function (pos) {
+            this.args[pos]();
+        },
+
+        callArgOn: function (pos, thisValue) {
+            this.args[pos].apply(thisValue);
+        },
+
+        callArgWith: function (pos) {
+            this.callArgOnWith.apply(this, [pos, null].concat(slice.call(arguments, 1)));
+        },
+
+        callArgOnWith: function (pos, thisValue) {
+            var args = slice.call(arguments, 2);
+            this.args[pos].apply(thisValue, args);
+        },
+
+        "yield": function () {
+            this.yieldOn.apply(this, [null].concat(slice.call(arguments, 0)));
+        },
+
+        yieldOn: function (thisValue) {
+            var args = this.args;
+            for (var i = 0, l = args.length; i < l; ++i) {
+                if (typeof args[i] === "function") {
+                    args[i].apply(thisValue, slice.call(arguments, 1));
+                    return;
+                }
+            }
+            throwYieldError(this.proxy, " cannot yield since no callback was passed.", args);
+        },
+
+        yieldTo: function (prop) {
+            this.yieldToOn.apply(this, [prop, null].concat(slice.call(arguments, 1)));
+        },
+
+        yieldToOn: function (prop, thisValue) {
+            var args = this.args;
+            for (var i = 0, l = args.length; i < l; ++i) {
+                if (args[i] && typeof args[i][prop] === "function") {
+                    args[i][prop].apply(thisValue, slice.call(arguments, 2));
+                    return;
+                }
+            }
+            throwYieldError(this.proxy, " cannot yield to '" + prop +
+                "' since no callback was passed.", args);
+        },
+
+        toString: function () {
+            var callStr = this.proxy.toString() + "(";
+            var args = [];
+
+            for (var i = 0, l = this.args.length; i < l; ++i) {
+                args.push(sinon.format(this.args[i]));
+            }
+
+            callStr = callStr + args.join(", ") + ")";
+
+            if (typeof this.returnValue != "undefined") {
+                callStr += " => " + sinon.format(this.returnValue);
+            }
+
+            if (this.exception) {
+                callStr += " !" + this.exception.name;
+
+                if (this.exception.message) {
+                    callStr += "(" + this.exception.message + ")";
+                }
+            }
+
+            return callStr;
+        }
+    };
+
+    callProto.invokeCallback = callProto.yield;
+
+    function createSpyCall(spy, thisValue, args, returnValue, exception, id) {
+        if (typeof id !== "number") {
+            throw new TypeError("Call id is not a number");
+        }
+        var proxyCall = sinon.create(callProto);
+        proxyCall.proxy = spy;
+        proxyCall.thisValue = thisValue;
+        proxyCall.args = args;
+        proxyCall.returnValue = returnValue;
+        proxyCall.exception = exception;
+        proxyCall.callId = id;
+
+        return proxyCall;
+    }
+    createSpyCall.toString = callProto.toString; // used by mocks
+
+    if (commonJSModule) {
+        module.exports = createSpyCall;
+    } else {
+        sinon.spyCall = createSpyCall;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+
+/**
+  * @depend ../sinon.js
+  * @depend call.js
+  */
+/*jslint eqeqeq: false, onevar: false, plusplus: false*/
+/*global module, require, sinon*/
+/**
+  * Spy functions
+  *
+  * @author Christian Johansen (christian@cjohansen.no)
+  * @license BSD
+  *
+  * Copyright (c) 2010-2013 Christian Johansen
+  */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+    var push = Array.prototype.push;
+    var slice = Array.prototype.slice;
+    var callId = 0;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function spy(object, property) {
+        if (!property && typeof object == "function") {
+            return spy.create(object);
+        }
+
+        if (!object && !property) {
+            return spy.create(function () { });
+        }
+
+        var method = object[property];
+        return sinon.wrapMethod(object, property, spy.create(method));
+    }
+
+    function matchingFake(fakes, args, strict) {
+        if (!fakes) {
+            return;
+        }
+
+        for (var i = 0, l = fakes.length; i < l; i++) {
+            if (fakes[i].matches(args, strict)) {
+                return fakes[i];
+            }
+        }
+    }
+
+    function incrementCallCount() {
+        this.called = true;
+        this.callCount += 1;
+        this.notCalled = false;
+        this.calledOnce = this.callCount == 1;
+        this.calledTwice = this.callCount == 2;
+        this.calledThrice = this.callCount == 3;
+    }
+
+    function createCallProperties() {
+        this.firstCall = this.getCall(0);
+        this.secondCall = this.getCall(1);
+        this.thirdCall = this.getCall(2);
+        this.lastCall = this.getCall(this.callCount - 1);
+    }
+
+    var vars = "a,b,c,d,e,f,g,h,i,j,k,l";
+    function createProxy(func) {
+        // Retain the function length:
+        var p;
+        if (func.length) {
+            eval("p = (function proxy(" + vars.substring(0, func.length * 2 - 1) +
+                ") { return p.invoke(func, this, slice.call(arguments)); });");
+        }
+        else {
+            p = function proxy() {
+                return p.invoke(func, this, slice.call(arguments));
+            };
+        }
+        return p;
+    }
+
+    var uuid = 0;
+
+    // Public API
+    var spyApi = {
+        reset: function () {
+            this.called = false;
+            this.notCalled = true;
+            this.calledOnce = false;
+            this.calledTwice = false;
+            this.calledThrice = false;
+            this.callCount = 0;
+            this.firstCall = null;
+            this.secondCall = null;
+            this.thirdCall = null;
+            this.lastCall = null;
+            this.args = [];
+            this.returnValues = [];
+            this.thisValues = [];
+            this.exceptions = [];
+            this.callIds = [];
+            if (this.fakes) {
+                for (var i = 0; i < this.fakes.length; i++) {
+                    this.fakes[i].reset();
+                }
+            }
+        },
+
+        create: function create(func) {
+            var name;
+
+            if (typeof func != "function") {
+                func = function () { };
+            } else {
+                name = sinon.functionName(func);
+            }
+
+            var proxy = createProxy(func);
+
+            sinon.extend(proxy, spy);
+            delete proxy.create;
+            sinon.extend(proxy, func);
+
+            proxy.reset();
+            proxy.prototype = func.prototype;
+            proxy.displayName = name || "spy";
+            proxy.toString = sinon.functionToString;
+            proxy._create = sinon.spy.create;
+            proxy.id = "spy#" + uuid++;
+
+            return proxy;
+        },
+
+        invoke: function invoke(func, thisValue, args) {
+            var matching = matchingFake(this.fakes, args);
+            var exception, returnValue;
+
+            incrementCallCount.call(this);
+            push.call(this.thisValues, thisValue);
+            push.call(this.args, args);
+            push.call(this.callIds, callId++);
+
+            try {
+                if (matching) {
+                    returnValue = matching.invoke(func, thisValue, args);
+                } else {
+                    returnValue = (this.func || func).apply(thisValue, args);
+                }
+
+                var thisCall = this.getCall(this.callCount - 1);
+                if (thisCall.calledWithNew() && typeof returnValue !== 'object') {
+                    returnValue = thisValue;
+                }
+            } catch (e) {
+                exception = e;
+            }
+
+            push.call(this.exceptions, exception);
+            push.call(this.returnValues, returnValue);
+
+            createCallProperties.call(this);
+
+            if (exception !== undefined) {
+                throw exception;
+            }
+
+            return returnValue;
+        },
+
+        getCall: function getCall(i) {
+            if (i < 0 || i >= this.callCount) {
+                return null;
+            }
+
+            return sinon.spyCall(this, this.thisValues[i], this.args[i],
+                                    this.returnValues[i], this.exceptions[i],
+                                    this.callIds[i]);
+        },
+
+        getCalls: function () {
+            var calls = [];
+            var i;
+
+            for (i = 0; i < this.callCount; i++) {
+                calls.push(this.getCall(i));
+            }
+
+            return calls;
+        },
+
+        calledBefore: function calledBefore(spyFn) {
+            if (!this.called) {
+                return false;
+            }
+
+            if (!spyFn.called) {
+                return true;
+            }
+
+            return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1];
+        },
+
+        calledAfter: function calledAfter(spyFn) {
+            if (!this.called || !spyFn.called) {
+                return false;
+            }
+
+            return this.callIds[this.callCount - 1] > spyFn.callIds[spyFn.callCount - 1];
+        },
+
+        withArgs: function () {
+            var args = slice.call(arguments);
+
+            if (this.fakes) {
+                var match = matchingFake(this.fakes, args, true);
+
+                if (match) {
+                    return match;
+                }
+            } else {
+                this.fakes = [];
+            }
+
+            var original = this;
+            var fake = this._create();
+            fake.matchingAguments = args;
+            fake.parent = this;
+            push.call(this.fakes, fake);
+
+            fake.withArgs = function () {
+                return original.withArgs.apply(original, arguments);
+            };
+
+            for (var i = 0; i < this.args.length; i++) {
+                if (fake.matches(this.args[i])) {
+                    incrementCallCount.call(fake);
+                    push.call(fake.thisValues, this.thisValues[i]);
+                    push.call(fake.args, this.args[i]);
+                    push.call(fake.returnValues, this.returnValues[i]);
+                    push.call(fake.exceptions, this.exceptions[i]);
+                    push.call(fake.callIds, this.callIds[i]);
+                }
+            }
+            createCallProperties.call(fake);
+
+            return fake;
+        },
+
+        matches: function (args, strict) {
+            var margs = this.matchingAguments;
+
+            if (margs.length <= args.length &&
+                sinon.deepEqual(margs, args.slice(0, margs.length))) {
+                return !strict || margs.length == args.length;
+            }
+        },
+
+        printf: function (format) {
+            var spy = this;
+            var args = slice.call(arguments, 1);
+            var formatter;
+
+            return (format || "").replace(/%(.)/g, function (match, specifyer) {
+                formatter = spyApi.formatters[specifyer];
+
+                if (typeof formatter == "function") {
+                    return formatter.call(null, spy, args);
+                } else if (!isNaN(parseInt(specifyer, 10))) {
+                    return sinon.format(args[specifyer - 1]);
+                }
+
+                return "%" + specifyer;
+            });
+        }
+    };
+
+    function delegateToCalls(method, matchAny, actual, notCalled) {
+        spyApi[method] = function () {
+            if (!this.called) {
+                if (notCalled) {
+                    return notCalled.apply(this, arguments);
+                }
+                return false;
+            }
+
+            var currentCall;
+            var matches = 0;
+
+            for (var i = 0, l = this.callCount; i < l; i += 1) {
+                currentCall = this.getCall(i);
+
+                if (currentCall[actual || method].apply(currentCall, arguments)) {
+                    matches += 1;
+
+                    if (matchAny) {
+                        return true;
+                    }
+                }
+            }
+
+            return matches === this.callCount;
+        };
+    }
+
+    delegateToCalls("calledOn", true);
+    delegateToCalls("alwaysCalledOn", false, "calledOn");
+    delegateToCalls("calledWith", true);
+    delegateToCalls("calledWithMatch", true);
+    delegateToCalls("alwaysCalledWith", false, "calledWith");
+    delegateToCalls("alwaysCalledWithMatch", false, "calledWithMatch");
+    delegateToCalls("calledWithExactly", true);
+    delegateToCalls("alwaysCalledWithExactly", false, "calledWithExactly");
+    delegateToCalls("neverCalledWith", false, "notCalledWith",
+        function () { return true; });
+    delegateToCalls("neverCalledWithMatch", false, "notCalledWithMatch",
+        function () { return true; });
+    delegateToCalls("threw", true);
+    delegateToCalls("alwaysThrew", false, "threw");
+    delegateToCalls("returned", true);
+    delegateToCalls("alwaysReturned", false, "returned");
+    delegateToCalls("calledWithNew", true);
+    delegateToCalls("alwaysCalledWithNew", false, "calledWithNew");
+    delegateToCalls("callArg", false, "callArgWith", function () {
+        throw new Error(this.toString() + " cannot call arg since it was not yet invoked.");
+    });
+    spyApi.callArgWith = spyApi.callArg;
+    delegateToCalls("callArgOn", false, "callArgOnWith", function () {
+        throw new Error(this.toString() + " cannot call arg since it was not yet invoked.");
+    });
+    spyApi.callArgOnWith = spyApi.callArgOn;
+    delegateToCalls("yield", false, "yield", function () {
+        throw new Error(this.toString() + " cannot yield since it was not yet invoked.");
+    });
+    // "invokeCallback" is an alias for "yield" since "yield" is invalid in strict mode.
+    spyApi.invokeCallback = spyApi.yield;
+    delegateToCalls("yieldOn", false, "yieldOn", function () {
+        throw new Error(this.toString() + " cannot yield since it was not yet invoked.");
+    });
+    delegateToCalls("yieldTo", false, "yieldTo", function (property) {
+        throw new Error(this.toString() + " cannot yield to '" + property +
+            "' since it was not yet invoked.");
+    });
+    delegateToCalls("yieldToOn", false, "yieldToOn", function (property) {
+        throw new Error(this.toString() + " cannot yield to '" + property +
+            "' since it was not yet invoked.");
+    });
+
+    spyApi.formatters = {
+        "c": function (spy) {
+            return sinon.timesInWords(spy.callCount);
+        },
+
+        "n": function (spy) {
+            return spy.toString();
+        },
+
+        "C": function (spy) {
+            var calls = [];
+
+            for (var i = 0, l = spy.callCount; i < l; ++i) {
+                var stringifiedCall = "    " + spy.getCall(i).toString();
+                if (/\n/.test(calls[i - 1])) {
+                    stringifiedCall = "\n" + stringifiedCall;
+                }
+                push.call(calls, stringifiedCall);
+            }
+
+            return calls.length > 0 ? "\n" + calls.join("\n") : "";
+        },
+
+        "t": function (spy) {
+            var objects = [];
+
+            for (var i = 0, l = spy.callCount; i < l; ++i) {
+                push.call(objects, sinon.format(spy.thisValues[i]));
+            }
+
+            return objects.join(", ");
+        },
+
+        "*": function (spy, args) {
+            var formatted = [];
+
+            for (var i = 0, l = args.length; i < l; ++i) {
+                push.call(formatted, sinon.format(args[i]));
+            }
+
+            return formatted.join(", ");
+        }
+    };
+
+    sinon.extend(spy, spyApi);
+
+    spy.spyCall = sinon.spyCall;
+
+    if (commonJSModule) {
+        module.exports = spy;
+    } else {
+        sinon.spy = spy;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend ../sinon.js
+ */
+/*jslint eqeqeq: false, onevar: false*/
+/*global module, require, sinon, process, setImmediate, setTimeout*/
+/**
+ * Stub behavior
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @author Tim Fischbach (mail@timfischbach.de)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    var slice = Array.prototype.slice;
+    var join = Array.prototype.join;
+    var proto;
+
+    var nextTick = (function () {
+        if (typeof process === "object" && typeof process.nextTick === "function") {
+            return process.nextTick;
+        } else if (typeof setImmediate === "function") {
+            return setImmediate;
+        } else {
+            return function (callback) {
+                setTimeout(callback, 0);
+            };
+        }
+    })();
+
+    function throwsException(error, message) {
+        if (typeof error == "string") {
+            this.exception = new Error(message || "");
+            this.exception.name = error;
+        } else if (!error) {
+            this.exception = new Error("Error");
+        } else {
+            this.exception = error;
+        }
+
+        return this;
+    }
+
+    function getCallback(behavior, args) {
+        var callArgAt = behavior.callArgAt;
+
+        if (callArgAt < 0) {
+            var callArgProp = behavior.callArgProp;
+
+            for (var i = 0, l = args.length; i < l; ++i) {
+                if (!callArgProp && typeof args[i] == "function") {
+                    return args[i];
+                }
+
+                if (callArgProp && args[i] &&
+                    typeof args[i][callArgProp] == "function") {
+                    return args[i][callArgProp];
+                }
+            }
+
+            return null;
+        }
+
+        return args[callArgAt];
+    }
+
+    function getCallbackError(behavior, func, args) {
+        if (behavior.callArgAt < 0) {
+            var msg;
+
+            if (behavior.callArgProp) {
+                msg = sinon.functionName(behavior.stub) +
+                    " expected to yield to '" + behavior.callArgProp +
+                    "', but no object with such a property was passed.";
+            } else {
+                msg = sinon.functionName(behavior.stub) +
+                    " expected to yield, but no callback was passed.";
+            }
+
+            if (args.length > 0) {
+                msg += " Received [" + join.call(args, ", ") + "]";
+            }
+
+            return msg;
+        }
+
+        return "argument at index " + behavior.callArgAt + " is not a function: " + func;
+    }
+
+    function callCallback(behavior, args) {
+        if (typeof behavior.callArgAt == "number") {
+            var func = getCallback(behavior, args);
+
+            if (typeof func != "function") {
+                throw new TypeError(getCallbackError(behavior, func, args));
+            }
+
+            if (behavior.callbackAsync) {
+                nextTick(function() {
+                    func.apply(behavior.callbackContext, behavior.callbackArguments);
+                });
+            } else {
+                func.apply(behavior.callbackContext, behavior.callbackArguments);
+            }
+        }
+    }
+
+    proto = {
+        create: function(stub) {
+            var behavior = sinon.extend({}, sinon.behavior);
+            delete behavior.create;
+            behavior.stub = stub;
+
+            return behavior;
+        },
+
+        isPresent: function() {
+            return (typeof this.callArgAt == 'number' ||
+                    this.exception ||
+                    typeof this.returnArgAt == 'number' ||
+                    this.returnThis ||
+                    this.returnValueDefined);
+        },
+
+        invoke: function(context, args) {
+            callCallback(this, args);
+
+            if (this.exception) {
+                throw this.exception;
+            } else if (typeof this.returnArgAt == 'number') {
+                return args[this.returnArgAt];
+            } else if (this.returnThis) {
+                return context;
+            }
+
+            return this.returnValue;
+        },
+
+        onCall: function(index) {
+            return this.stub.onCall(index);
+        },
+
+        onFirstCall: function() {
+            return this.stub.onFirstCall();
+        },
+
+        onSecondCall: function() {
+            return this.stub.onSecondCall();
+        },
+
+        onThirdCall: function() {
+            return this.stub.onThirdCall();
+        },
+
+        withArgs: function(/* arguments */) {
+            throw new Error('Defining a stub by invoking "stub.onCall(...).withArgs(...)" is not supported. ' +
+                            'Use "stub.withArgs(...).onCall(...)" to define sequential behavior for calls with certain arguments.');
+        },
+
+        callsArg: function callsArg(pos) {
+            if (typeof pos != "number") {
+                throw new TypeError("argument index is not number");
+            }
+
+            this.callArgAt = pos;
+            this.callbackArguments = [];
+            this.callbackContext = undefined;
+            this.callArgProp = undefined;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        callsArgOn: function callsArgOn(pos, context) {
+            if (typeof pos != "number") {
+                throw new TypeError("argument index is not number");
+            }
+            if (typeof context != "object") {
+                throw new TypeError("argument context is not an object");
+            }
+
+            this.callArgAt = pos;
+            this.callbackArguments = [];
+            this.callbackContext = context;
+            this.callArgProp = undefined;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        callsArgWith: function callsArgWith(pos) {
+            if (typeof pos != "number") {
+                throw new TypeError("argument index is not number");
+            }
+
+            this.callArgAt = pos;
+            this.callbackArguments = slice.call(arguments, 1);
+            this.callbackContext = undefined;
+            this.callArgProp = undefined;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        callsArgOnWith: function callsArgWith(pos, context) {
+            if (typeof pos != "number") {
+                throw new TypeError("argument index is not number");
+            }
+            if (typeof context != "object") {
+                throw new TypeError("argument context is not an object");
+            }
+
+            this.callArgAt = pos;
+            this.callbackArguments = slice.call(arguments, 2);
+            this.callbackContext = context;
+            this.callArgProp = undefined;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        yields: function () {
+            this.callArgAt = -1;
+            this.callbackArguments = slice.call(arguments, 0);
+            this.callbackContext = undefined;
+            this.callArgProp = undefined;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        yieldsOn: function (context) {
+            if (typeof context != "object") {
+                throw new TypeError("argument context is not an object");
+            }
+
+            this.callArgAt = -1;
+            this.callbackArguments = slice.call(arguments, 1);
+            this.callbackContext = context;
+            this.callArgProp = undefined;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        yieldsTo: function (prop) {
+            this.callArgAt = -1;
+            this.callbackArguments = slice.call(arguments, 1);
+            this.callbackContext = undefined;
+            this.callArgProp = prop;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+        yieldsToOn: function (prop, context) {
+            if (typeof context != "object") {
+                throw new TypeError("argument context is not an object");
+            }
+
+            this.callArgAt = -1;
+            this.callbackArguments = slice.call(arguments, 2);
+            this.callbackContext = context;
+            this.callArgProp = prop;
+            this.callbackAsync = false;
+
+            return this;
+        },
+
+
+        "throws": throwsException,
+        throwsException: throwsException,
+
+        returns: function returns(value) {
+            this.returnValue = value;
+            this.returnValueDefined = true;
+
+            return this;
+        },
+
+        returnsArg: function returnsArg(pos) {
+            if (typeof pos != "number") {
+                throw new TypeError("argument index is not number");
+            }
+
+            this.returnArgAt = pos;
+
+            return this;
+        },
+
+        returnsThis: function returnsThis() {
+            this.returnThis = true;
+
+            return this;
+        }
+    };
+
+    // create asynchronous versions of callsArg* and yields* methods
+    for (var method in proto) {
+        // need to avoid creating anotherasync versions of the newly added async methods
+        if (proto.hasOwnProperty(method) &&
+            method.match(/^(callsArg|yields)/) &&
+            !method.match(/Async/)) {
+            proto[method + 'Async'] = (function (syncFnName) {
+                return function () {
+                    var result = this[syncFnName].apply(this, arguments);
+                    this.callbackAsync = true;
+                    return result;
+                };
+            })(method);
+        }
+    }
+
+    if (commonJSModule) {
+        module.exports = proto;
+    } else {
+        sinon.behavior = proto;
+    }
+}(typeof sinon == "object" && sinon || null));
+/**
+ * @depend ../sinon.js
+ * @depend spy.js
+ * @depend behavior.js
+ */
+/*jslint eqeqeq: false, onevar: false*/
+/*global module, require, sinon*/
+/**
+ * Stub functions
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function stub(object, property, func) {
+        if (!!func && typeof func != "function") {
+            throw new TypeError("Custom stub should be function");
+        }
+
+        var wrapper;
+
+        if (func) {
+            wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func;
+        } else {
+            wrapper = stub.create();
+        }
+
+        if (!object && typeof property === "undefined") {
+            return sinon.stub.create();
+        }
+
+        if (typeof property === "undefined" && typeof object == "object") {
+            for (var prop in object) {
+                if (typeof object[prop] === "function") {
+                    stub(object, prop);
+                }
+            }
+
+            return object;
+        }
+
+        return sinon.wrapMethod(object, property, wrapper);
+    }
+
+    function getDefaultBehavior(stub) {
+        return stub.defaultBehavior || getParentBehaviour(stub) || sinon.behavior.create(stub);
+    }
+
+    function getParentBehaviour(stub) {
+        return (stub.parent && getCurrentBehavior(stub.parent));
+    }
+
+    function getCurrentBehavior(stub) {
+        var behavior = stub.behaviors[stub.callCount - 1];
+        return behavior && behavior.isPresent() ? behavior : getDefaultBehavior(stub);
+    }
+
+    var uuid = 0;
+
+    sinon.extend(stub, (function () {
+        var proto = {
+            create: function create() {
+                var functionStub = function () {
+                    return getCurrentBehavior(functionStub).invoke(this, arguments);
+                };
+
+                functionStub.id = "stub#" + uuid++;
+                var orig = functionStub;
+                functionStub = sinon.spy.create(functionStub);
+                functionStub.func = orig;
+
+                sinon.extend(functionStub, stub);
+                functionStub._create = sinon.stub.create;
+                functionStub.displayName = "stub";
+                functionStub.toString = sinon.functionToString;
+
+                functionStub.defaultBehavior = null;
+                functionStub.behaviors = [];
+
+                return functionStub;
+            },
+
+            resetBehavior: function () {
+                var i;
+
+                this.defaultBehavior = null;
+                this.behaviors = [];
+
+                delete this.returnValue;
+                delete this.returnArgAt;
+                this.returnThis = false;
+
+                if (this.fakes) {
+                    for (i = 0; i < this.fakes.length; i++) {
+                        this.fakes[i].resetBehavior();
+                    }
+                }
+            },
+
+            onCall: function(index) {
+                if (!this.behaviors[index]) {
+                    this.behaviors[index] = sinon.behavior.create(this);
+                }
+
+                return this.behaviors[index];
+            },
+
+            onFirstCall: function() {
+                return this.onCall(0);
+            },
+
+            onSecondCall: function() {
+                return this.onCall(1);
+            },
+
+            onThirdCall: function() {
+                return this.onCall(2);
+            }
+        };
+
+        for (var method in sinon.behavior) {
+            if (sinon.behavior.hasOwnProperty(method) &&
+                !proto.hasOwnProperty(method) &&
+                method != 'create' &&
+                method != 'withArgs' &&
+                method != 'invoke') {
+                proto[method] = (function(behaviorMethod) {
+                    return function() {
+                        this.defaultBehavior = this.defaultBehavior || sinon.behavior.create(this);
+                        this.defaultBehavior[behaviorMethod].apply(this.defaultBehavior, arguments);
+                        return this;
+                    };
+                }(method));
+            }
+        }
+
+        return proto;
+    }()));
+
+    if (commonJSModule) {
+        module.exports = stub;
+    } else {
+        sinon.stub = stub;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend ../sinon.js
+ * @depend stub.js
+ */
+/*jslint eqeqeq: false, onevar: false, nomen: false*/
+/*global module, require, sinon*/
+/**
+ * Mock functions.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+    var push = [].push;
+    var match;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    match = sinon.match;
+
+    if (!match && commonJSModule) {
+        match = require("./match");
+    }
+
+    function mock(object) {
+        if (!object) {
+            return sinon.expectation.create("Anonymous mock");
+        }
+
+        return mock.create(object);
+    }
+
+    sinon.mock = mock;
+
+    sinon.extend(mock, (function () {
+        function each(collection, callback) {
+            if (!collection) {
+                return;
+            }
+
+            for (var i = 0, l = collection.length; i < l; i += 1) {
+                callback(collection[i]);
+            }
+        }
+
+        return {
+            create: function create(object) {
+                if (!object) {
+                    throw new TypeError("object is null");
+                }
+
+                var mockObject = sinon.extend({}, mock);
+                mockObject.object = object;
+                delete mockObject.create;
+
+                return mockObject;
+            },
+
+            expects: function expects(method) {
+                if (!method) {
+                    throw new TypeError("method is falsy");
+                }
+
+                if (!this.expectations) {
+                    this.expectations = {};
+                    this.proxies = [];
+                }
+
+                if (!this.expectations[method]) {
+                    this.expectations[method] = [];
+                    var mockObject = this;
+
+                    sinon.wrapMethod(this.object, method, function () {
+                        return mockObject.invokeMethod(method, this, arguments);
+                    });
+
+                    push.call(this.proxies, method);
+                }
+
+                var expectation = sinon.expectation.create(method);
+                push.call(this.expectations[method], expectation);
+
+                return expectation;
+            },
+
+            restore: function restore() {
+                var object = this.object;
+
+                each(this.proxies, function (proxy) {
+                    if (typeof object[proxy].restore == "function") {
+                        object[proxy].restore();
+                    }
+                });
+            },
+
+            verify: function verify() {
+                var expectations = this.expectations || {};
+                var messages = [], met = [];
+
+                each(this.proxies, function (proxy) {
+                    each(expectations[proxy], function (expectation) {
+                        if (!expectation.met()) {
+                            push.call(messages, expectation.toString());
+                        } else {
+                            push.call(met, expectation.toString());
+                        }
+                    });
+                });
+
+                this.restore();
+
+                if (messages.length > 0) {
+                    sinon.expectation.fail(messages.concat(met).join("\n"));
+                } else {
+                    sinon.expectation.pass(messages.concat(met).join("\n"));
+                }
+
+                return true;
+            },
+
+            invokeMethod: function invokeMethod(method, thisValue, args) {
+                var expectations = this.expectations && this.expectations[method];
+                var length = expectations && expectations.length || 0, i;
+
+                for (i = 0; i < length; i += 1) {
+                    if (!expectations[i].met() &&
+                        expectations[i].allowsCall(thisValue, args)) {
+                        return expectations[i].apply(thisValue, args);
+                    }
+                }
+
+                var messages = [], available, exhausted = 0;
+
+                for (i = 0; i < length; i += 1) {
+                    if (expectations[i].allowsCall(thisValue, args)) {
+                        available = available || expectations[i];
+                    } else {
+                        exhausted += 1;
+                    }
+                    push.call(messages, "    " + expectations[i].toString());
+                }
+
+                if (exhausted === 0) {
+                    return available.apply(thisValue, args);
+                }
+
+                messages.unshift("Unexpected call: " + sinon.spyCall.toString.call({
+                    proxy: method,
+                    args: args
+                }));
+
+                sinon.expectation.fail(messages.join("\n"));
+            }
+        };
+    }()));
+
+    var times = sinon.timesInWords;
+
+    sinon.expectation = (function () {
+        var slice = Array.prototype.slice;
+        var _invoke = sinon.spy.invoke;
+
+        function callCountInWords(callCount) {
+            if (callCount == 0) {
+                return "never called";
+            } else {
+                return "called " + times(callCount);
+            }
+        }
+
+        function expectedCallCountInWords(expectation) {
+            var min = expectation.minCalls;
+            var max = expectation.maxCalls;
+
+            if (typeof min == "number" && typeof max == "number") {
+                var str = times(min);
+
+                if (min != max) {
+                    str = "at least " + str + " and at most " + times(max);
+                }
+
+                return str;
+            }
+
+            if (typeof min == "number") {
+                return "at least " + times(min);
+            }
+
+            return "at most " + times(max);
+        }
+
+        function receivedMinCalls(expectation) {
+            var hasMinLimit = typeof expectation.minCalls == "number";
+            return !hasMinLimit || expectation.callCount >= expectation.minCalls;
+        }
+
+        function receivedMaxCalls(expectation) {
+            if (typeof expectation.maxCalls != "number") {
+                return false;
+            }
+
+            return expectation.callCount == expectation.maxCalls;
+        }
+
+        function verifyMatcher(possibleMatcher, arg){
+            if (match && match.isMatcher(possibleMatcher)) {
+                return possibleMatcher.test(arg);
+            } else {
+                return true;
+            }
+        }
+
+        return {
+            minCalls: 1,
+            maxCalls: 1,
+
+            create: function create(methodName) {
+                var expectation = sinon.extend(sinon.stub.create(), sinon.expectation);
+                delete expectation.create;
+                expectation.method = methodName;
+
+                return expectation;
+            },
+
+            invoke: function invoke(func, thisValue, args) {
+                this.verifyCallAllowed(thisValue, args);
+
+                return _invoke.apply(this, arguments);
+            },
+
+            atLeast: function atLeast(num) {
+                if (typeof num != "number") {
+                    throw new TypeError("'" + num + "' is not number");
+                }
+
+                if (!this.limitsSet) {
+                    this.maxCalls = null;
+                    this.limitsSet = true;
+                }
+
+                this.minCalls = num;
+
+                return this;
+            },
+
+            atMost: function atMost(num) {
+                if (typeof num != "number") {
+                    throw new TypeError("'" + num + "' is not number");
+                }
+
+                if (!this.limitsSet) {
+                    this.minCalls = null;
+                    this.limitsSet = true;
+                }
+
+                this.maxCalls = num;
+
+                return this;
+            },
+
+            never: function never() {
+                return this.exactly(0);
+            },
+
+            once: function once() {
+                return this.exactly(1);
+            },
+
+            twice: function twice() {
+                return this.exactly(2);
+            },
+
+            thrice: function thrice() {
+                return this.exactly(3);
+            },
+
+            exactly: function exactly(num) {
+                if (typeof num != "number") {
+                    throw new TypeError("'" + num + "' is not a number");
+                }
+
+                this.atLeast(num);
+                return this.atMost(num);
+            },
+
+            met: function met() {
+                return !this.failed && receivedMinCalls(this);
+            },
+
+            verifyCallAllowed: function verifyCallAllowed(thisValue, args) {
+                if (receivedMaxCalls(this)) {
+                    this.failed = true;
+                    sinon.expectation.fail(this.method + " already called " + times(this.maxCalls));
+                }
+
+                if ("expectedThis" in this && this.expectedThis !== thisValue) {
+                    sinon.expectation.fail(this.method + " called with " + thisValue + " as thisValue, expected " +
+                        this.expectedThis);
+                }
+
+                if (!("expectedArguments" in this)) {
+                    return;
+                }
+
+                if (!args) {
+                    sinon.expectation.fail(this.method + " received no arguments, expected " +
+                        sinon.format(this.expectedArguments));
+                }
+
+                if (args.length < this.expectedArguments.length) {
+                    sinon.expectation.fail(this.method + " received too few arguments (" + sinon.format(args) +
+                        "), expected " + sinon.format(this.expectedArguments));
+                }
+
+                if (this.expectsExactArgCount &&
+                    args.length != this.expectedArguments.length) {
+                    sinon.expectation.fail(this.method + " received too many arguments (" + sinon.format(args) +
+                        "), expected " + sinon.format(this.expectedArguments));
+                }
+
+                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {
+
+                    if (!verifyMatcher(this.expectedArguments[i],args[i])) {
+                        sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) +
+                            ", didn't match " + this.expectedArguments.toString());
+                    }
+
+                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {
+                        sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) +
+                            ", expected " + sinon.format(this.expectedArguments));
+                    }
+                }
+            },
+
+            allowsCall: function allowsCall(thisValue, args) {
+                if (this.met() && receivedMaxCalls(this)) {
+                    return false;
+                }
+
+                if ("expectedThis" in this && this.expectedThis !== thisValue) {
+                    return false;
+                }
+
+                if (!("expectedArguments" in this)) {
+                    return true;
+                }
+
+                args = args || [];
+
+                if (args.length < this.expectedArguments.length) {
+                    return false;
+                }
+
+                if (this.expectsExactArgCount &&
+                    args.length != this.expectedArguments.length) {
+                    return false;
+                }
+
+                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {
+                    if (!verifyMatcher(this.expectedArguments[i],args[i])) {
+                        return false;
+                    }
+
+                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {
+                        return false;
+                    }
+                }
+
+                return true;
+            },
+
+            withArgs: function withArgs() {
+                this.expectedArguments = slice.call(arguments);
+                return this;
+            },
+
+            withExactArgs: function withExactArgs() {
+                this.withArgs.apply(this, arguments);
+                this.expectsExactArgCount = true;
+                return this;
+            },
+
+            on: function on(thisValue) {
+                this.expectedThis = thisValue;
+                return this;
+            },
+
+            toString: function () {
+                var args = (this.expectedArguments || []).slice();
+
+                if (!this.expectsExactArgCount) {
+                    push.call(args, "[...]");
+                }
+
+                var callStr = sinon.spyCall.toString.call({
+                    proxy: this.method || "anonymous mock expectation",
+                    args: args
+                });
+
+                var message = callStr.replace(", [...", "[, ...") + " " +
+                    expectedCallCountInWords(this);
+
+                if (this.met()) {
+                    return "Expectation met: " + message;
+                }
+
+                return "Expected " + message + " (" +
+                    callCountInWords(this.callCount) + ")";
+            },
+
+            verify: function verify() {
+                if (!this.met()) {
+                    sinon.expectation.fail(this.toString());
+                } else {
+                    sinon.expectation.pass(this.toString());
+                }
+
+                return true;
+            },
+
+            pass: function(message) {
+              sinon.assert.pass(message);
+            },
+            fail: function (message) {
+                var exception = new Error(message);
+                exception.name = "ExpectationError";
+
+                throw exception;
+            }
+        };
+    }());
+
+    if (commonJSModule) {
+        module.exports = mock;
+    } else {
+        sinon.mock = mock;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend ../sinon.js
+ * @depend stub.js
+ * @depend mock.js
+ */
+/*jslint eqeqeq: false, onevar: false, forin: true*/
+/*global module, require, sinon*/
+/**
+ * Collections of stubs, spies and mocks.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+    var push = [].push;
+    var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function getFakes(fakeCollection) {
+        if (!fakeCollection.fakes) {
+            fakeCollection.fakes = [];
+        }
+
+        return fakeCollection.fakes;
+    }
+
+    function each(fakeCollection, method) {
+        var fakes = getFakes(fakeCollection);
+
+        for (var i = 0, l = fakes.length; i < l; i += 1) {
+            if (typeof fakes[i][method] == "function") {
+                fakes[i][method]();
+            }
+        }
+    }
+
+    function compact(fakeCollection) {
+        var fakes = getFakes(fakeCollection);
+        var i = 0;
+        while (i < fakes.length) {
+          fakes.splice(i, 1);
+        }
+    }
+
+    var collection = {
+        verify: function resolve() {
+            each(this, "verify");
+        },
+
+        restore: function restore() {
+            each(this, "restore");
+            compact(this);
+        },
+
+        verifyAndRestore: function verifyAndRestore() {
+            var exception;
+
+            try {
+                this.verify();
+            } catch (e) {
+                exception = e;
+            }
+
+            this.restore();
+
+            if (exception) {
+                throw exception;
+            }
+        },
+
+        add: function add(fake) {
+            push.call(getFakes(this), fake);
+            return fake;
+        },
+
+        spy: function spy() {
+            return this.add(sinon.spy.apply(sinon, arguments));
+        },
+
+        stub: function stub(object, property, value) {
+            if (property) {
+                var original = object[property];
+
+                if (typeof original != "function") {
+                    if (!hasOwnProperty.call(object, property)) {
+                        throw new TypeError("Cannot stub non-existent own property " + property);
+                    }
+
+                    object[property] = value;
+
+                    return this.add({
+                        restore: function () {
+                            object[property] = original;
+                        }
+                    });
+                }
+            }
+            if (!property && !!object && typeof object == "object") {
+                var stubbedObj = sinon.stub.apply(sinon, arguments);
+
+                for (var prop in stubbedObj) {
+                    if (typeof stubbedObj[prop] === "function") {
+                        this.add(stubbedObj[prop]);
+                    }
+                }
+
+                return stubbedObj;
+            }
+
+            return this.add(sinon.stub.apply(sinon, arguments));
+        },
+
+        mock: function mock() {
+            return this.add(sinon.mock.apply(sinon, arguments));
+        },
+
+        inject: function inject(obj) {
+            var col = this;
+
+            obj.spy = function () {
+                return col.spy.apply(col, arguments);
+            };
+
+            obj.stub = function () {
+                return col.stub.apply(col, arguments);
+            };
+
+            obj.mock = function () {
+                return col.mock.apply(col, arguments);
+            };
+
+            return obj;
+        }
+    };
+
+    if (commonJSModule) {
+        module.exports = collection;
+    } else {
+        sinon.collection = collection;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/*jslint eqeqeq: false, plusplus: false, evil: true, onevar: false, browser: true, forin: false*/
+/*global module, require, window*/
+/**
+ * Fake timer API
+ * setTimeout
+ * setInterval
+ * clearTimeout
+ * clearInterval
+ * tick
+ * reset
+ * Date
+ *
+ * Inspired by jsUnitMockTimeOut from JsUnit
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+if (typeof sinon == "undefined") {
+    var sinon = {};
+}
+
+(function (global) {
+    var id = 1;
+
+    function addTimer(args, recurring) {
+        if (args.length === 0) {
+            throw new Error("Function requires at least 1 parameter");
+        }
+
+        if (typeof args[0] === "undefined") {
+            throw new Error("Callback must be provided to timer calls");
+        }
+
+        var toId = id++;
+        var delay = args[1] || 0;
+
+        if (!this.timeouts) {
+            this.timeouts = {};
+        }
+
+        this.timeouts[toId] = {
+            id: toId,
+            func: args[0],
+            callAt: this.now + delay,
+            invokeArgs: Array.prototype.slice.call(args, 2)
+        };
+
+        if (recurring === true) {
+            this.timeouts[toId].interval = delay;
+        }
+
+        return toId;
+    }
+
+    function parseTime(str) {
+        if (!str) {
+            return 0;
+        }
+
+        var strings = str.split(":");
+        var l = strings.length, i = l;
+        var ms = 0, parsed;
+
+        if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) {
+            throw new Error("tick only understands numbers and 'h:m:s'");
+        }
+
+        while (i--) {
+            parsed = parseInt(strings[i], 10);
+
+            if (parsed >= 60) {
+                throw new Error("Invalid time " + str);
+            }
+
+            ms += parsed * Math.pow(60, (l - i - 1));
+        }
+
+        return ms * 1000;
+    }
+
+    function createObject(object) {
+        var newObject;
+
+        if (Object.create) {
+            newObject = Object.create(object);
+        } else {
+            var F = function () {};
+            F.prototype = object;
+            newObject = new F();
+        }
+
+        newObject.Date.clock = newObject;
+        return newObject;
+    }
+
+    sinon.clock = {
+        now: 0,
+
+        create: function create(now) {
+            var clock = createObject(this);
+
+            if (typeof now == "number") {
+                clock.now = now;
+            }
+
+            if (!!now && typeof now == "object") {
+                throw new TypeError("now should be milliseconds since UNIX epoch");
+            }
+
+            return clock;
+        },
+
+        setTimeout: function setTimeout(callback, timeout) {
+            return addTimer.call(this, arguments, false);
+        },
+
+        clearTimeout: function clearTimeout(timerId) {
+            if (!this.timeouts) {
+                this.timeouts = [];
+            }
+
+            if (timerId in this.timeouts) {
+                delete this.timeouts[timerId];
+            }
+        },
+
+        setInterval: function setInterval(callback, timeout) {
+            return addTimer.call(this, arguments, true);
+        },
+
+        clearInterval: function clearInterval(timerId) {
+            this.clearTimeout(timerId);
+        },
+
+        setImmediate: function setImmediate(callback) {
+            var passThruArgs = Array.prototype.slice.call(arguments, 1);
+
+            return addTimer.call(this, [callback, 0].concat(passThruArgs), false);
+        },
+
+        clearImmediate: function clearImmediate(timerId) {
+            this.clearTimeout(timerId);
+        },
+
+        tick: function tick(ms) {
+            ms = typeof ms == "number" ? ms : parseTime(ms);
+            var tickFrom = this.now, tickTo = this.now + ms, previous = this.now;
+            var timer = this.firstTimerInRange(tickFrom, tickTo);
+
+            var firstException;
+            while (timer && tickFrom <= tickTo) {
+                if (this.timeouts[timer.id]) {
+                    tickFrom = this.now = timer.callAt;
+                    try {
+                      this.callTimer(timer);
+                    } catch (e) {
+                      firstException = firstException || e;
+                    }
+                }
+
+                timer = this.firstTimerInRange(previous, tickTo);
+                previous = tickFrom;
+            }
+
+            this.now = tickTo;
+
+            if (firstException) {
+              throw firstException;
+            }
+
+            return this.now;
+        },
+
+        firstTimerInRange: function (from, to) {
+            var timer, smallest = null, originalTimer;
+
+            for (var id in this.timeouts) {
+                if (this.timeouts.hasOwnProperty(id)) {
+                    if (this.timeouts[id].callAt < from || this.timeouts[id].callAt > to) {
+                        continue;
+                    }
+
+                    if (smallest === null || this.timeouts[id].callAt < smallest) {
+                        originalTimer = this.timeouts[id];
+                        smallest = this.timeouts[id].callAt;
+
+                        timer = {
+                            func: this.timeouts[id].func,
+                            callAt: this.timeouts[id].callAt,
+                            interval: this.timeouts[id].interval,
+                            id: this.timeouts[id].id,
+                            invokeArgs: this.timeouts[id].invokeArgs
+                        };
+                    }
+                }
+            }
+
+            return timer || null;
+        },
+
+        callTimer: function (timer) {
+            if (typeof timer.interval == "number") {
+                this.timeouts[timer.id].callAt += timer.interval;
+            } else {
+                delete this.timeouts[timer.id];
+            }
+
+            try {
+                if (typeof timer.func == "function") {
+                    timer.func.apply(null, timer.invokeArgs);
+                } else {
+                    eval(timer.func);
+                }
+            } catch (e) {
+              var exception = e;
+            }
+
+            if (!this.timeouts[timer.id]) {
+                if (exception) {
+                  throw exception;
+                }
+                return;
+            }
+
+            if (exception) {
+              throw exception;
+            }
+        },
+
+        reset: function reset() {
+            this.timeouts = {};
+        },
+
+        Date: (function () {
+            var NativeDate = Date;
+
+            function ClockDate(year, month, date, hour, minute, second, ms) {
+                // Defensive and verbose to avoid potential harm in passing
+                // explicit undefined when user does not pass argument
+                switch (arguments.length) {
+                case 0:
+                    return new NativeDate(ClockDate.clock.now);
+                case 1:
+                    return new NativeDate(year);
+                case 2:
+                    return new NativeDate(year, month);
+                case 3:
+                    return new NativeDate(year, month, date);
+                case 4:
+                    return new NativeDate(year, month, date, hour);
+                case 5:
+                    return new NativeDate(year, month, date, hour, minute);
+                case 6:
+                    return new NativeDate(year, month, date, hour, minute, second);
+                default:
+                    return new NativeDate(year, month, date, hour, minute, second, ms);
+                }
+            }
+
+            return mirrorDateProperties(ClockDate, NativeDate);
+        }())
+    };
+
+    function mirrorDateProperties(target, source) {
+        if (source.now) {
+            target.now = function now() {
+                return target.clock.now;
+            };
+        } else {
+            delete target.now;
+        }
+
+        if (source.toSource) {
+            target.toSource = function toSource() {
+                return source.toSource();
+            };
+        } else {
+            delete target.toSource;
+        }
+
+        target.toString = function toString() {
+            return source.toString();
+        };
+
+        target.prototype = source.prototype;
+        target.parse = source.parse;
+        target.UTC = source.UTC;
+        target.prototype.toUTCString = source.prototype.toUTCString;
+
+        for (var prop in source) {
+            if (source.hasOwnProperty(prop)) {
+                target[prop] = source[prop];
+            }
+        }
+
+        return target;
+    }
+
+    var methods = ["Date", "setTimeout", "setInterval",
+                   "clearTimeout", "clearInterval"];
+
+    if (typeof global.setImmediate !== "undefined") {
+        methods.push("setImmediate");
+    }
+
+    if (typeof global.clearImmediate !== "undefined") {
+        methods.push("clearImmediate");
+    }
+
+    function restore() {
+        var method;
+
+        for (var i = 0, l = this.methods.length; i < l; i++) {
+            method = this.methods[i];
+
+            if (global[method].hadOwnProperty) {
+                global[method] = this["_" + method];
+            } else {
+                try {
+                    delete global[method];
+                } catch (e) {}
+            }
+        }
+
+        // Prevent multiple executions which will completely remove these props
+        this.methods = [];
+    }
+
+    function stubGlobal(method, clock) {
+        clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(global, method);
+        clock["_" + method] = global[method];
+
+        if (method == "Date") {
+            var date = mirrorDateProperties(clock[method], global[method]);
+            global[method] = date;
+        } else {
+            global[method] = function () {
+                return clock[method].apply(clock, arguments);
+            };
+
+            for (var prop in clock[method]) {
+                if (clock[method].hasOwnProperty(prop)) {
+                    global[method][prop] = clock[method][prop];
+                }
+            }
+        }
+
+        global[method].clock = clock;
+    }
+
+    sinon.useFakeTimers = function useFakeTimers(now) {
+        var clock = sinon.clock.create(now);
+        clock.restore = restore;
+        clock.methods = Array.prototype.slice.call(arguments,
+                                                   typeof now == "number" ? 1 : 0);
+
+        if (clock.methods.length === 0) {
+            clock.methods = methods;
+        }
+
+        for (var i = 0, l = clock.methods.length; i < l; i++) {
+            stubGlobal(clock.methods[i], clock);
+        }
+
+        return clock;
+    };
+}(typeof global != "undefined" && typeof global !== "function" ? global : this));
+
+sinon.timers = {
+    setTimeout: setTimeout,
+    clearTimeout: clearTimeout,
+    setImmediate: (typeof setImmediate !== "undefined" ? setImmediate : undefined),
+    clearImmediate: (typeof clearImmediate !== "undefined" ? clearImmediate: undefined),
+    setInterval: setInterval,
+    clearInterval: clearInterval,
+    Date: Date
+};
+
+if (typeof module !== 'undefined' && module.exports) {
+    module.exports = sinon;
+}
+
+/*jslint eqeqeq: false, onevar: false*/
+/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/
+/**
+ * Minimal Event interface implementation
+ *
+ * Original implementation by Sven Fuchs: https://gist.github.com/995028
+ * Modifications and tests by Christian Johansen.
+ *
+ * @author Sven Fuchs (svenfuchs@artweb-design.de)
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2011 Sven Fuchs, Christian Johansen
+ */
+
+if (typeof sinon == "undefined") {
+    this.sinon = {};
+}
+
+(function () {
+    var push = [].push;
+
+    sinon.Event = function Event(type, bubbles, cancelable, target) {
+        this.initEvent(type, bubbles, cancelable, target);
+    };
+
+    sinon.Event.prototype = {
+        initEvent: function(type, bubbles, cancelable, target) {
+            this.type = type;
+            this.bubbles = bubbles;
+            this.cancelable = cancelable;
+            this.target = target;
+        },
+
+        stopPropagation: function () {},
+
+        preventDefault: function () {
+            this.defaultPrevented = true;
+        }
+    };
+
+    sinon.EventTarget = {
+        addEventListener: function addEventListener(event, listener) {
+            this.eventListeners = this.eventListeners || {};
+            this.eventListeners[event] = this.eventListeners[event] || [];
+            push.call(this.eventListeners[event], listener);
+        },
+
+        removeEventListener: function removeEventListener(event, listener) {
+            var listeners = this.eventListeners && this.eventListeners[event] || [];
+
+            for (var i = 0, l = listeners.length; i < l; ++i) {
+                if (listeners[i] == listener) {
+                    return listeners.splice(i, 1);
+                }
+            }
+        },
+
+        dispatchEvent: function dispatchEvent(event) {
+            var type = event.type;
+            var listeners = this.eventListeners && this.eventListeners[type] || [];
+
+            for (var i = 0; i < listeners.length; i++) {
+                if (typeof listeners[i] == "function") {
+                    listeners[i].call(this, event);
+                } else {
+                    listeners[i].handleEvent(event);
+                }
+            }
+
+            return !!event.defaultPrevented;
+        }
+    };
+}());
+
+/**
+ * @depend ../../sinon.js
+ * @depend event.js
+ */
+/*jslint eqeqeq: false, onevar: false*/
+/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/
+/**
+ * Fake XMLHttpRequest object
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+// wrapper for global
+(function(global) {
+
+    if (typeof sinon === "undefined") {
+        global.sinon = {};
+    }
+    sinon.xhr = { XMLHttpRequest: global.XMLHttpRequest };
+
+    var xhr = sinon.xhr;
+    xhr.GlobalXMLHttpRequest = global.XMLHttpRequest;
+    xhr.GlobalActiveXObject = global.ActiveXObject;
+    xhr.supportsActiveX = typeof xhr.GlobalActiveXObject != "undefined";
+    xhr.supportsXHR = typeof xhr.GlobalXMLHttpRequest != "undefined";
+    xhr.workingXHR = xhr.supportsXHR ? xhr.GlobalXMLHttpRequest : xhr.supportsActiveX
+                                     ? function() { return new xhr.GlobalActiveXObject("MSXML2.XMLHTTP.3.0") } : false;
+    xhr.supportsCORS = 'withCredentials' in (new sinon.xhr.GlobalXMLHttpRequest());
+
+    /*jsl:ignore*/
+    var unsafeHeaders = {
+        "Accept-Charset": true,
+        "Accept-Encoding": true,
+        "Connection": true,
+        "Content-Length": true,
+        "Cookie": true,
+        "Cookie2": true,
+        "Content-Transfer-Encoding": true,
+        "Date": true,
+        "Expect": true,
+        "Host": true,
+        "Keep-Alive": true,
+        "Referer": true,
+        "TE": true,
+        "Trailer": true,
+        "Transfer-Encoding": true,
+        "Upgrade": true,
+        "User-Agent": true,
+        "Via": true
+    };
+    /*jsl:end*/
+
+    function FakeXMLHttpRequest() {
+        this.readyState = FakeXMLHttpRequest.UNSENT;
+        this.requestHeaders = {};
+        this.requestBody = null;
+        this.status = 0;
+        this.statusText = "";
+        this.upload = new UploadProgress();
+        if (sinon.xhr.supportsCORS) {
+            this.withCredentials = false;
+        }
+
+
+        var xhr = this;
+        var events = ["loadstart", "load", "abort", "loadend"];
+
+        function addEventListener(eventName) {
+            xhr.addEventListener(eventName, function (event) {
+                var listener = xhr["on" + eventName];
+
+                if (listener && typeof listener == "function") {
+                    listener(event);
+                }
+            });
+        }
+
+        for (var i = events.length - 1; i >= 0; i--) {
+            addEventListener(events[i]);
+        }
+
+        if (typeof FakeXMLHttpRequest.onCreate == "function") {
+            FakeXMLHttpRequest.onCreate(this);
+        }
+    }
+
+    // An upload object is created for each
+    // FakeXMLHttpRequest and allows upload
+    // events to be simulated using uploadProgress
+    // and uploadError.
+    function UploadProgress() {
+        this.eventListeners = {
+            "progress": [],
+            "load": [],
+            "abort": [],
+            "error": []
+        }
+    }
+
+    UploadProgress.prototype.addEventListener = function(event, listener) {
+        this.eventListeners[event].push(listener);
+    };
+
+    UploadProgress.prototype.removeEventListener = function(event, listener) {
+        var listeners = this.eventListeners[event] || [];
+
+        for (var i = 0, l = listeners.length; i < l; ++i) {
+            if (listeners[i] == listener) {
+                return listeners.splice(i, 1);
+            }
+        }
+    };
+
+    UploadProgress.prototype.dispatchEvent = function(event) {
+        var listeners = this.eventListeners[event.type] || [];
+
+        for (var i = 0, listener; (listener = listeners[i]) != null; i++) {
+            listener(event);
+        }
+    };
+
+    function verifyState(xhr) {
+        if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {
+            throw new Error("INVALID_STATE_ERR");
+        }
+
+        if (xhr.sendFlag) {
+            throw new Error("INVALID_STATE_ERR");
+        }
+    }
+
+    // filtering to enable a white-list version of Sinon FakeXhr,
+    // where whitelisted requests are passed through to real XHR
+    function each(collection, callback) {
+        if (!collection) return;
+        for (var i = 0, l = collection.length; i < l; i += 1) {
+            callback(collection[i]);
+        }
+    }
+    function some(collection, callback) {
+        for (var index = 0; index < collection.length; index++) {
+            if(callback(collection[index]) === true) return true;
+        }
+        return false;
+    }
+    // largest arity in XHR is 5 - XHR#open
+    var apply = function(obj,method,args) {
+        switch(args.length) {
+        case 0: return obj[method]();
+        case 1: return obj[method](args[0]);
+        case 2: return obj[method](args[0],args[1]);
+        case 3: return obj[method](args[0],args[1],args[2]);
+        case 4: return obj[method](args[0],args[1],args[2],args[3]);
+        case 5: return obj[method](args[0],args[1],args[2],args[3],args[4]);
+        }
+    };
+
+    FakeXMLHttpRequest.filters = [];
+    FakeXMLHttpRequest.addFilter = function(fn) {
+        this.filters.push(fn)
+    };
+    var IE6Re = /MSIE 6/;
+    FakeXMLHttpRequest.defake = function(fakeXhr,xhrArgs) {
+        var xhr = new sinon.xhr.workingXHR();
+        each(["open","setRequestHeader","send","abort","getResponseHeader",
+              "getAllResponseHeaders","addEventListener","overrideMimeType","removeEventListener"],
+             function(method) {
+                 fakeXhr[method] = function() {
+                   return apply(xhr,method,arguments);
+                 };
+             });
+
+        var copyAttrs = function(args) {
+            each(args, function(attr) {
+              try {
+                fakeXhr[attr] = xhr[attr]
+              } catch(e) {
+                if(!IE6Re.test(navigator.userAgent)) throw e;
+              }
+            });
+        };
+
+        var stateChange = function() {
+            fakeXhr.readyState = xhr.readyState;
+            if(xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) {
+                copyAttrs(["status","statusText"]);
+            }
+            if(xhr.readyState >= FakeXMLHttpRequest.LOADING) {
+                copyAttrs(["responseText"]);
+            }
+            if(xhr.readyState === FakeXMLHttpRequest.DONE) {
+                copyAttrs(["responseXML"]);
+            }
+            if(fakeXhr.onreadystatechange) fakeXhr.onreadystatechange.call(fakeXhr, { target: fakeXhr });
+        };
+        if(xhr.addEventListener) {
+          for(var event in fakeXhr.eventListeners) {
+              if(fakeXhr.eventListeners.hasOwnProperty(event)) {
+                  each(fakeXhr.eventListeners[event],function(handler) {
+                      xhr.addEventListener(event, handler);
+                  });
+              }
+          }
+          xhr.addEventListener("readystatechange",stateChange);
+        } else {
+          xhr.onreadystatechange = stateChange;
+        }
+        apply(xhr,"open",xhrArgs);
+    };
+    FakeXMLHttpRequest.useFilters = false;
+
+    function verifyRequestSent(xhr) {
+        if (xhr.readyState == FakeXMLHttpRequest.DONE) {
+            throw new Error("Request done");
+        }
+    }
+
+    function verifyHeadersReceived(xhr) {
+        if (xhr.async && xhr.readyState != FakeXMLHttpRequest.HEADERS_RECEIVED) {
+            throw new Error("No headers received");
+        }
+    }
+
+    function verifyResponseBodyType(body) {
+        if (typeof body != "string") {
+            var error = new Error("Attempted to respond to fake XMLHttpRequest with " +
+                                 body + ", which is not a string.");
+            error.name = "InvalidBodyException";
+            throw error;
+        }
+    }
+
+    sinon.extend(FakeXMLHttpRequest.prototype, sinon.EventTarget, {
+        async: true,
+
+        open: function open(method, url, async, username, password) {
+            this.method = method;
+            this.url = url;
+            this.async = typeof async == "boolean" ? async : true;
+            this.username = username;
+            this.password = password;
+            this.responseText = null;
+            this.responseXML = null;
+            this.requestHeaders = {};
+            this.sendFlag = false;
+            if(sinon.FakeXMLHttpRequest.useFilters === true) {
+                var xhrArgs = arguments;
+                var defake = some(FakeXMLHttpRequest.filters,function(filter) {
+                    return filter.apply(this,xhrArgs)
+                });
+                if (defake) {
+                  return sinon.FakeXMLHttpRequest.defake(this,arguments);
+                }
+            }
+            this.readyStateChange(FakeXMLHttpRequest.OPENED);
+        },
+
+        readyStateChange: function readyStateChange(state) {
+            this.readyState = state;
+
+            if (typeof this.onreadystatechange == "function") {
+                try {
+                    this.onreadystatechange();
+                } catch (e) {
+                    sinon.logError("Fake XHR onreadystatechange handler", e);
+                }
+            }
+
+            this.dispatchEvent(new sinon.Event("readystatechange"));
+
+            switch (this.readyState) {
+                case FakeXMLHttpRequest.DONE:
+                    this.dispatchEvent(new sinon.Event("load", false, false, this));
+                    this.dispatchEvent(new sinon.Event("loadend", false, false, this));
+                    this.upload.dispatchEvent(new sinon.Event("load", false, false, this));
+                    this.upload.dispatchEvent(new ProgressEvent("progress", {loaded: 100, total: 100}));
+                    break;
+            }
+        },
+
+        setRequestHeader: function setRequestHeader(header, value) {
+            verifyState(this);
+
+            if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) {
+                throw new Error("Refused to set unsafe header \"" + header + "\"");
+            }
+
+            if (this.requestHeaders[header]) {
+                this.requestHeaders[header] += "," + value;
+            } else {
+                this.requestHeaders[header] = value;
+            }
+        },
+
+        // Helps testing
+        setResponseHeaders: function setResponseHeaders(headers) {
+            this.responseHeaders = {};
+
+            for (var header in headers) {
+                if (headers.hasOwnProperty(header)) {
+                    this.responseHeaders[header] = headers[header];
+                }
+            }
+
+            if (this.async) {
+                this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED);
+            } else {
+                this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED;
+            }
+        },
+
+        // Currently treats ALL data as a DOMString (i.e. no Document)
+        send: function send(data) {
+            verifyState(this);
+
+            if (!/^(get|head)$/i.test(this.method)) {
+                if (this.requestHeaders["Content-Type"]) {
+                    var value = this.requestHeaders["Content-Type"].split(";");
+                    this.requestHeaders["Content-Type"] = value[0] + ";charset=utf-8";
+                } else {
+                    this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8";
+                }
+
+                this.requestBody = data;
+            }
+
+            this.errorFlag = false;
+            this.sendFlag = this.async;
+            this.readyStateChange(FakeXMLHttpRequest.OPENED);
+
+            if (typeof this.onSend == "function") {
+                this.onSend(this);
+            }
+
+            this.dispatchEvent(new sinon.Event("loadstart", false, false, this));
+        },
+
+        abort: function abort() {
+            this.aborted = true;
+            this.responseText = null;
+            this.errorFlag = true;
+            this.requestHeaders = {};
+
+            if (this.readyState > sinon.FakeXMLHttpRequest.UNSENT && this.sendFlag) {
+                this.readyStateChange(sinon.FakeXMLHttpRequest.DONE);
+                this.sendFlag = false;
+            }
+
+            this.readyState = sinon.FakeXMLHttpRequest.UNSENT;
+
+            this.dispatchEvent(new sinon.Event("abort", false, false, this));
+
+            this.upload.dispatchEvent(new sinon.Event("abort", false, false, this));
+
+            if (typeof this.onerror === "function") {
+                this.onerror();
+            }
+        },
+
+        getResponseHeader: function getResponseHeader(header) {
+            if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {
+                return null;
+            }
+
+            if (/^Set-Cookie2?$/i.test(header)) {
+                return null;
+            }
+
+            header = header.toLowerCase();
+
+            for (var h in this.responseHeaders) {
+                if (h.toLowerCase() == header) {
+                    return this.responseHeaders[h];
+                }
+            }
+
+            return null;
+        },
+
+        getAllResponseHeaders: function getAllResponseHeaders() {
+            if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {
+                return "";
+            }
+
+            var headers = "";
+
+            for (var header in this.responseHeaders) {
+                if (this.responseHeaders.hasOwnProperty(header) &&
+                    !/^Set-Cookie2?$/i.test(header)) {
+                    headers += header + ": " + this.responseHeaders[header] + "\r\n";
+                }
+            }
+
+            return headers;
+        },
+
+        setResponseBody: function setResponseBody(body) {
+            verifyRequestSent(this);
+            verifyHeadersReceived(this);
+            verifyResponseBodyType(body);
+
+            var chunkSize = this.chunkSize || 10;
+            var index = 0;
+            this.responseText = "";
+
+            do {
+                if (this.async) {
+                    this.readyStateChange(FakeXMLHttpRequest.LOADING);
+                }
+
+                this.responseText += body.substring(index, index + chunkSize);
+                index += chunkSize;
+            } while (index < body.length);
+
+            var type = this.getResponseHeader("Content-Type");
+
+            if (this.responseText &&
+                (!type || /(text\/xml)|(application\/xml)|(\+xml)/.test(type))) {
+                try {
+                    this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText);
+                } catch (e) {
+                    // Unable to parse XML - no biggie
+                }
+            }
+
+            if (this.async) {
+                this.readyStateChange(FakeXMLHttpRequest.DONE);
+            } else {
+                this.readyState = FakeXMLHttpRequest.DONE;
+            }
+        },
+
+        respond: function respond(status, headers, body) {
+            this.setResponseHeaders(headers || {});
+            this.status = typeof status == "number" ? status : 200;
+            this.statusText = FakeXMLHttpRequest.statusCodes[this.status];
+            this.setResponseBody(body || "");
+        },
+
+        uploadProgress: function uploadProgress(progressEventRaw) {
+            this.upload.dispatchEvent(new ProgressEvent("progress", progressEventRaw));
+        },
+
+        uploadError: function uploadError(error) {
+            this.upload.dispatchEvent(new CustomEvent("error", {"detail": error}));
+        }
+    });
+
+    sinon.extend(FakeXMLHttpRequest, {
+        UNSENT: 0,
+        OPENED: 1,
+        HEADERS_RECEIVED: 2,
+        LOADING: 3,
+        DONE: 4
+    });
+
+    // Borrowed from JSpec
+    FakeXMLHttpRequest.parseXML = function parseXML(text) {
+        var xmlDoc;
+
+        if (typeof DOMParser != "undefined") {
+            var parser = new DOMParser();
+            xmlDoc = parser.parseFromString(text, "text/xml");
+        } else {
+            xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
+            xmlDoc.async = "false";
+            xmlDoc.loadXML(text);
+        }
+
+        return xmlDoc;
+    };
+
+    FakeXMLHttpRequest.statusCodes = {
+        100: "Continue",
+        101: "Switching Protocols",
+        200: "OK",
+        201: "Created",
+        202: "Accepted",
+        203: "Non-Authoritative Information",
+        204: "No Content",
+        205: "Reset Content",
+        206: "Partial Content",
+        300: "Multiple Choice",
+        301: "Moved Permanently",
+        302: "Found",
+        303: "See Other",
+        304: "Not Modified",
+        305: "Use Proxy",
+        307: "Temporary Redirect",
+        400: "Bad Request",
+        401: "Unauthorized",
+        402: "Payment Required",
+        403: "Forbidden",
+        404: "Not Found",
+        405: "Method Not Allowed",
+        406: "Not Acceptable",
+        407: "Proxy Authentication Required",
+        408: "Request Timeout",
+        409: "Conflict",
+        410: "Gone",
+        411: "Length Required",
+        412: "Precondition Failed",
+        413: "Request Entity Too Large",
+        414: "Request-URI Too Long",
+        415: "Unsupported Media Type",
+        416: "Requested Range Not Satisfiable",
+        417: "Expectation Failed",
+        422: "Unprocessable Entity",
+        500: "Internal Server Error",
+        501: "Not Implemented",
+        502: "Bad Gateway",
+        503: "Service Unavailable",
+        504: "Gateway Timeout",
+        505: "HTTP Version Not Supported"
+    };
+
+    sinon.useFakeXMLHttpRequest = function () {
+        sinon.FakeXMLHttpRequest.restore = function restore(keepOnCreate) {
+            if (xhr.supportsXHR) {
+                global.XMLHttpRequest = xhr.GlobalXMLHttpRequest;
+            }
+
+            if (xhr.supportsActiveX) {
+                global.ActiveXObject = xhr.GlobalActiveXObject;
+            }
+
+            delete sinon.FakeXMLHttpRequest.restore;
+
+            if (keepOnCreate !== true) {
+                delete sinon.FakeXMLHttpRequest.onCreate;
+            }
+        };
+        if (xhr.supportsXHR) {
+            global.XMLHttpRequest = sinon.FakeXMLHttpRequest;
+        }
+
+        if (xhr.supportsActiveX) {
+            global.ActiveXObject = function ActiveXObject(objId) {
+                if (objId == "Microsoft.XMLHTTP" || /^Msxml2\.XMLHTTP/i.test(objId)) {
+
+                    return new sinon.FakeXMLHttpRequest();
+                }
+
+                return new xhr.GlobalActiveXObject(objId);
+            };
+        }
+
+        return sinon.FakeXMLHttpRequest;
+    };
+
+    sinon.FakeXMLHttpRequest = FakeXMLHttpRequest;
+
+})(typeof global === "object" ? global : this);
+
+if (typeof module !== 'undefined' && module.exports) {
+    module.exports = sinon;
+}
+
+/**
+ * @depend fake_xml_http_request.js
+ */
+/*jslint eqeqeq: false, onevar: false, regexp: false, plusplus: false*/
+/*global module, require, window*/
+/**
+ * The Sinon "server" mimics a web server that receives requests from
+ * sinon.FakeXMLHttpRequest and provides an API to respond to those requests,
+ * both synchronously and asynchronously. To respond synchronuously, canned
+ * answers have to be provided upfront.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+if (typeof sinon == "undefined") {
+    var sinon = {};
+}
+
+sinon.fakeServer = (function () {
+    var push = [].push;
+    function F() {}
+
+    function create(proto) {
+        F.prototype = proto;
+        return new F();
+    }
+
+    function responseArray(handler) {
+        var response = handler;
+
+        if (Object.prototype.toString.call(handler) != "[object Array]") {
+            response = [200, {}, handler];
+        }
+
+        if (typeof response[2] != "string") {
+            throw new TypeError("Fake server response body should be string, but was " +
+                                typeof response[2]);
+        }
+
+        return response;
+    }
+
+    var wloc = typeof window !== "undefined" ? window.location : {};
+    var rCurrLoc = new RegExp("^" + wloc.protocol + "//" + wloc.host);
+
+    function matchOne(response, reqMethod, reqUrl) {
+        var rmeth = response.method;
+        var matchMethod = !rmeth || rmeth.toLowerCase() == reqMethod.toLowerCase();
+        var url = response.url;
+        var matchUrl = !url || url == reqUrl || (typeof url.test == "function" && url.test(reqUrl));
+
+        return matchMethod && matchUrl;
+    }
+
+    function match(response, request) {
+        var requestUrl = request.url;
+
+        if (!/^https?:\/\//.test(requestUrl) || rCurrLoc.test(requestUrl)) {
+            requestUrl = requestUrl.replace(rCurrLoc, "");
+        }
+
+        if (matchOne(response, this.getHTTPMethod(request), requestUrl)) {
+            if (typeof response.response == "function") {
+                var ru = response.url;
+                var args = [request].concat(ru && typeof ru.exec == "function" ? ru.exec(requestUrl).slice(1) : []);
+                return response.response.apply(response, args);
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    function log(response, request) {
+        var str;
+
+        str =  "Request:\n"  + sinon.format(request)  + "\n\n";
+        str += "Response:\n" + sinon.format(response) + "\n\n";
+
+        sinon.log(str);
+    }
+
+    return {
+        create: function () {
+            var server = create(this);
+            this.xhr = sinon.useFakeXMLHttpRequest();
+            server.requests = [];
+
+            this.xhr.onCreate = function (xhrObj) {
+                server.addRequest(xhrObj);
+            };
+
+            return server;
+        },
+
+        addRequest: function addRequest(xhrObj) {
+            var server = this;
+            push.call(this.requests, xhrObj);
+
+            xhrObj.onSend = function () {
+                server.handleRequest(this);
+
+                if (server.autoRespond && !server.responding) {
+                    setTimeout(function () {
+                        server.responding = false;
+                        server.respond();
+                    }, server.autoRespondAfter || 10);
+
+                    server.responding = true;
+                }
+            };
+        },
+
+        getHTTPMethod: function getHTTPMethod(request) {
+            if (this.fakeHTTPMethods && /post/i.test(request.method)) {
+                var matches = (request.requestBody || "").match(/_method=([^\b;]+)/);
+                return !!matches ? matches[1] : request.method;
+            }
+
+            return request.method;
+        },
+
+        handleRequest: function handleRequest(xhr) {
+            if (xhr.async) {
+                if (!this.queue) {
+                    this.queue = [];
+                }
+
+                push.call(this.queue, xhr);
+            } else {
+                this.processRequest(xhr);
+            }
+        },
+
+        respondWith: function respondWith(method, url, body) {
+            if (arguments.length == 1 && typeof method != "function") {
+                this.response = responseArray(method);
+                return;
+            }
+
+            if (!this.responses) { this.responses = []; }
+
+            if (arguments.length == 1) {
+                body = method;
+                url = method = null;
+            }
+
+            if (arguments.length == 2) {
+                body = url;
+                url = method;
+                method = null;
+            }
+
+            push.call(this.responses, {
+                method: method,
+                url: url,
+                response: typeof body == "function" ? body : responseArray(body)
+            });
+        },
+
+        respond: function respond() {
+            if (arguments.length > 0) this.respondWith.apply(this, arguments);
+            var queue = this.queue || [];
+            var requests = queue.splice(0);
+            var request;
+
+            while(request = requests.shift()) {
+                this.processRequest(request);
+            }
+        },
+
+        processRequest: function processRequest(request) {
+            try {
+                if (request.aborted) {
+                    return;
+                }
+
+                var response = this.response || [404, {}, ""];
+
+                if (this.responses) {
+                    for (var l = this.responses.length, i = l - 1; i >= 0; i--) {
+                        if (match.call(this, this.responses[i], request)) {
+                            response = this.responses[i].response;
+                            break;
+                        }
+                    }
+                }
+
+                if (request.readyState != 4) {
+                    log(response, request);
+
+                    request.respond(response[0], response[1], response[2]);
+                }
+            } catch (e) {
+                sinon.logError("Fake server request processing", e);
+            }
+        },
+
+        restore: function restore() {
+            return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments);
+        }
+    };
+}());
+
+if (typeof module !== 'undefined' && module.exports) {
+    module.exports = sinon;
+}
+
+/**
+ * @depend fake_server.js
+ * @depend fake_timers.js
+ */
+/*jslint browser: true, eqeqeq: false, onevar: false*/
+/*global sinon*/
+/**
+ * Add-on for sinon.fakeServer that automatically handles a fake timer along with
+ * the FakeXMLHttpRequest. The direct inspiration for this add-on is jQuery
+ * 1.3.x, which does not use xhr object's onreadystatehandler at all - instead,
+ * it polls the object for completion with setInterval. Dispite the direct
+ * motivation, there is nothing jQuery-specific in this file, so it can be used
+ * in any environment where the ajax implementation depends on setInterval or
+ * setTimeout.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function () {
+    function Server() {}
+    Server.prototype = sinon.fakeServer;
+
+    sinon.fakeServerWithClock = new Server();
+
+    sinon.fakeServerWithClock.addRequest = function addRequest(xhr) {
+        if (xhr.async) {
+            if (typeof setTimeout.clock == "object") {
+                this.clock = setTimeout.clock;
+            } else {
+                this.clock = sinon.useFakeTimers();
+                this.resetClock = true;
+            }
+
+            if (!this.longestTimeout) {
+                var clockSetTimeout = this.clock.setTimeout;
+                var clockSetInterval = this.clock.setInterval;
+                var server = this;
+
+                this.clock.setTimeout = function (fn, timeout) {
+                    server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);
+
+                    return clockSetTimeout.apply(this, arguments);
+                };
+
+                this.clock.setInterval = function (fn, timeout) {
+                    server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);
+
+                    return clockSetInterval.apply(this, arguments);
+                };
+            }
+        }
+
+        return sinon.fakeServer.addRequest.call(this, xhr);
+    };
+
+    sinon.fakeServerWithClock.respond = function respond() {
+        var returnVal = sinon.fakeServer.respond.apply(this, arguments);
+
+        if (this.clock) {
+            this.clock.tick(this.longestTimeout || 0);
+            this.longestTimeout = 0;
+
+            if (this.resetClock) {
+                this.clock.restore();
+                this.resetClock = false;
+            }
+        }
+
+        return returnVal;
+    };
+
+    sinon.fakeServerWithClock.restore = function restore() {
+        if (this.clock) {
+            this.clock.restore();
+        }
+
+        return sinon.fakeServer.restore.apply(this, arguments);
+    };
+}());
+
+/**
+ * @depend ../sinon.js
+ * @depend collection.js
+ * @depend util/fake_timers.js
+ * @depend util/fake_server_with_clock.js
+ */
+/*jslint eqeqeq: false, onevar: false, plusplus: false*/
+/*global require, module*/
+/**
+ * Manages fake collections as well as fake utilities such as Sinon's
+ * timers and fake XHR implementation in one convenient object.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+if (typeof module !== 'undefined' && module.exports) {
+    var sinon = require("../sinon");
+    sinon.extend(sinon, require("./util/fake_timers"));
+}
+
+(function () {
+    var push = [].push;
+
+    function exposeValue(sandbox, config, key, value) {
+        if (!value) {
+            return;
+        }
+
+        if (config.injectInto && !(key in config.injectInto) ) {
+            config.injectInto[key] = value;
+        } else {
+            push.call(sandbox.args, value);
+        }
+    }
+
+    function prepareSandboxFromConfig(config) {
+        var sandbox = sinon.create(sinon.sandbox);
+
+        if (config.useFakeServer) {
+            if (typeof config.useFakeServer == "object") {
+                sandbox.serverPrototype = config.useFakeServer;
+            }
+
+            sandbox.useFakeServer();
+        }
+
+        if (config.useFakeTimers) {
+            if (typeof config.useFakeTimers == "object") {
+                sandbox.useFakeTimers.apply(sandbox, config.useFakeTimers);
+            } else {
+                sandbox.useFakeTimers();
+            }
+        }
+
+        return sandbox;
+    }
+
+    sinon.sandbox = sinon.extend(sinon.create(sinon.collection), {
+        useFakeTimers: function useFakeTimers() {
+            this.clock = sinon.useFakeTimers.apply(sinon, arguments);
+
+            return this.add(this.clock);
+        },
+
+        serverPrototype: sinon.fakeServer,
+
+        useFakeServer: function useFakeServer() {
+            var proto = this.serverPrototype || sinon.fakeServer;
+
+            if (!proto || !proto.create) {
+                return null;
+            }
+
+            this.server = proto.create();
+            return this.add(this.server);
+        },
+
+        inject: function (obj) {
+            sinon.collection.inject.call(this, obj);
+
+            if (this.clock) {
+                obj.clock = this.clock;
+            }
+
+            if (this.server) {
+                obj.server = this.server;
+                obj.requests = this.server.requests;
+            }
+
+            return obj;
+        },
+
+        create: function (config) {
+            if (!config) {
+                return sinon.create(sinon.sandbox);
+            }
+
+            var sandbox = prepareSandboxFromConfig(config);
+            sandbox.args = sandbox.args || [];
+            var prop, value, exposed = sandbox.inject({});
+
+            if (config.properties) {
+                for (var i = 0, l = config.properties.length; i < l; i++) {
+                    prop = config.properties[i];
+                    value = exposed[prop] || prop == "sandbox" && sandbox;
+                    exposeValue(sandbox, config, prop, value);
+                }
+            } else {
+                exposeValue(sandbox, config, "sandbox", value);
+            }
+
+            return sandbox;
+        }
+    });
+
+    sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer;
+
+    if (typeof module !== 'undefined' && module.exports) {
+        module.exports = sinon.sandbox;
+    }
+}());
+
+/**
+ * @depend ../sinon.js
+ * @depend stub.js
+ * @depend mock.js
+ * @depend sandbox.js
+ */
+/*jslint eqeqeq: false, onevar: false, forin: true, plusplus: false*/
+/*global module, require, sinon*/
+/**
+ * Test function, sandboxes fakes
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function test(callback) {
+        var type = typeof callback;
+
+        if (type != "function") {
+            throw new TypeError("sinon.test needs to wrap a test function, got " + type);
+        }
+
+        return function () {
+            var config = sinon.getConfig(sinon.config);
+            config.injectInto = config.injectIntoThis && this || config.injectInto;
+            var sandbox = sinon.sandbox.create(config);
+            var exception, result;
+            var args = Array.prototype.slice.call(arguments).concat(sandbox.args);
+
+            try {
+                result = callback.apply(this, args);
+            } catch (e) {
+                exception = e;
+            }
+
+            if (typeof exception !== "undefined") {
+                sandbox.restore();
+                throw exception;
+            }
+            else {
+                sandbox.verifyAndRestore();
+            }
+
+            return result;
+        };
+    }
+
+    test.config = {
+        injectIntoThis: true,
+        injectInto: null,
+        properties: ["spy", "stub", "mock", "clock", "server", "requests"],
+        useFakeTimers: true,
+        useFakeServer: true
+    };
+
+    if (commonJSModule) {
+        module.exports = test;
+    } else {
+        sinon.test = test;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend ../sinon.js
+ * @depend test.js
+ */
+/*jslint eqeqeq: false, onevar: false, eqeqeq: false*/
+/*global module, require, sinon*/
+/**
+ * Test case, sandboxes all test functions
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    var commonJSModule = typeof module !== 'undefined' && module.exports;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon || !Object.prototype.hasOwnProperty) {
+        return;
+    }
+
+    function createTest(property, setUp, tearDown) {
+        return function () {
+            if (setUp) {
+                setUp.apply(this, arguments);
+            }
+
+            var exception, result;
+
+            try {
+                result = property.apply(this, arguments);
+            } catch (e) {
+                exception = e;
+            }
+
+            if (tearDown) {
+                tearDown.apply(this, arguments);
+            }
+
+            if (exception) {
+                throw exception;
+            }
+
+            return result;
+        };
+    }
+
+    function testCase(tests, prefix) {
+        /*jsl:ignore*/
+        if (!tests || typeof tests != "object") {
+            throw new TypeError("sinon.testCase needs an object with test functions");
+        }
+        /*jsl:end*/
+
+        prefix = prefix || "test";
+        var rPrefix = new RegExp("^" + prefix);
+        var methods = {}, testName, property, method;
+        var setUp = tests.setUp;
+        var tearDown = tests.tearDown;
+
+        for (testName in tests) {
+            if (tests.hasOwnProperty(testName)) {
+                property = tests[testName];
+
+                if (/^(setUp|tearDown)$/.test(testName)) {
+                    continue;
+                }
+
+                if (typeof property == "function" && rPrefix.test(testName)) {
+                    method = property;
+
+                    if (setUp || tearDown) {
+                        method = createTest(property, setUp, tearDown);
+                    }
+
+                    methods[testName] = sinon.test(method);
+                } else {
+                    methods[testName] = tests[testName];
+                }
+            }
+        }
+
+        return methods;
+    }
+
+    if (commonJSModule) {
+        module.exports = testCase;
+    } else {
+        sinon.testCase = testCase;
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend ../sinon.js
+ * @depend stub.js
+ */
+/*jslint eqeqeq: false, onevar: false, nomen: false, plusplus: false*/
+/*global module, require, sinon*/
+/**
+ * Assertions matching the test spy retrieval interface.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon, global) {
+    var commonJSModule = typeof module !== "undefined" && module.exports;
+    var slice = Array.prototype.slice;
+    var assert;
+
+    if (!sinon && commonJSModule) {
+        sinon = require("../sinon");
+    }
+
+    if (!sinon) {
+        return;
+    }
+
+    function verifyIsStub() {
+        var method;
+
+        for (var i = 0, l = arguments.length; i < l; ++i) {
+            method = arguments[i];
+
+            if (!method) {
+                assert.fail("fake is not a spy");
+            }
+
+            if (typeof method != "function") {
+                assert.fail(method + " is not a function");
+            }
+
+            if (typeof method.getCall != "function") {
+                assert.fail(method + " is not stubbed");
+            }
+        }
+    }
+
+    function failAssertion(object, msg) {
+        object = object || global;
+        var failMethod = object.fail || assert.fail;
+        failMethod.call(object, msg);
+    }
+
+    function mirrorPropAsAssertion(name, method, message) {
+        if (arguments.length == 2) {
+            message = method;
+            method = name;
+        }
+
+        assert[name] = function (fake) {
+            verifyIsStub(fake);
+
+            var args = slice.call(arguments, 1);
+            var failed = false;
+
+            if (typeof method == "function") {
+                failed = !method(fake);
+            } else {
+                failed = typeof fake[method] == "function" ?
+                    !fake[method].apply(fake, args) : !fake[method];
+            }
+
+            if (failed) {
+                failAssertion(this, fake.printf.apply(fake, [message].concat(args)));
+            } else {
+                assert.pass(name);
+            }
+        };
+    }
+
+    function exposedName(prefix, prop) {
+        return !prefix || /^fail/.test(prop) ? prop :
+            prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1);
+    }
+
+    assert = {
+        failException: "AssertError",
+
+        fail: function fail(message) {
+            var error = new Error(message);
+            error.name = this.failException || assert.failException;
+
+            throw error;
+        },
+
+        pass: function pass(assertion) {},
+
+        callOrder: function assertCallOrder() {
+            verifyIsStub.apply(null, arguments);
+            var expected = "", actual = "";
+
+            if (!sinon.calledInOrder(arguments)) {
+                try {
+                    expected = [].join.call(arguments, ", ");
+                    var calls = slice.call(arguments);
+                    var i = calls.length;
+                    while (i) {
+                        if (!calls[--i].called) {
+                            calls.splice(i, 1);
+                        }
+                    }
+                    actual = sinon.orderByFirstCall(calls).join(", ");
+                } catch (e) {
+                    // If this fails, we'll just fall back to the blank string
+                }
+
+                failAssertion(this, "expected " + expected + " to be " +
+                              "called in order but were called as " + actual);
+            } else {
+                assert.pass("callOrder");
+            }
+        },
+
+        callCount: function assertCallCount(method, count) {
+            verifyIsStub(method);
+
+            if (method.callCount != count) {
+                var msg = "expected %n to be called " + sinon.timesInWords(count) +
+                    " but was called %c%C";
+                failAssertion(this, method.printf(msg));
+            } else {
+                assert.pass("callCount");
+            }
+        },
+
+        expose: function expose(target, options) {
+            if (!target) {
+                throw new TypeError("target is null or undefined");
+            }
+
+            var o = options || {};
+            var prefix = typeof o.prefix == "undefined" && "assert" || o.prefix;
+            var includeFail = typeof o.includeFail == "undefined" || !!o.includeFail;
+
+            for (var method in this) {
+                if (method != "export" && (includeFail || !/^(fail)/.test(method))) {
+                    target[exposedName(prefix, method)] = this[method];
+                }
+            }
+
+            return target;
+        }
+    };
+
+    mirrorPropAsAssertion("called", "expected %n to have been called at least once but was never called");
+    mirrorPropAsAssertion("notCalled", function (spy) { return !spy.called; },
+                          "expected %n to not have been called but was called %c%C");
+    mirrorPropAsAssertion("calledOnce", "expected %n to be called once but was called %c%C");
+    mirrorPropAsAssertion("calledTwice", "expected %n to be called twice but was called %c%C");
+    mirrorPropAsAssertion("calledThrice", "expected %n to be called thrice but was called %c%C");
+    mirrorPropAsAssertion("calledOn", "expected %n to be called with %1 as this but was called with %t");
+    mirrorPropAsAssertion("alwaysCalledOn", "expected %n to always be called with %1 as this but was called with %t");
+    mirrorPropAsAssertion("calledWithNew", "expected %n to be called with new");
+    mirrorPropAsAssertion("alwaysCalledWithNew", "expected %n to always be called with new");
+    mirrorPropAsAssertion("calledWith", "expected %n to be called with arguments %*%C");
+    mirrorPropAsAssertion("calledWithMatch", "expected %n to be called with match %*%C");
+    mirrorPropAsAssertion("alwaysCalledWith", "expected %n to always be called with arguments %*%C");
+    mirrorPropAsAssertion("alwaysCalledWithMatch", "expected %n to always be called with match %*%C");
+    mirrorPropAsAssertion("calledWithExactly", "expected %n to be called with exact arguments %*%C");
+    mirrorPropAsAssertion("alwaysCalledWithExactly", "expected %n to always be called with exact arguments %*%C");
+    mirrorPropAsAssertion("neverCalledWith", "expected %n to never be called with arguments %*%C");
+    mirrorPropAsAssertion("neverCalledWithMatch", "expected %n to never be called with match %*%C");
+    mirrorPropAsAssertion("threw", "%n did not throw exception%C");
+    mirrorPropAsAssertion("alwaysThrew", "%n did not always throw exception%C");
+
+    if (commonJSModule) {
+        module.exports = assert;
+    } else {
+        sinon.assert = assert;
+    }
+}(typeof sinon == "object" && sinon || null, typeof window != "undefined" ? window : (typeof self != "undefined") ? self : global));
+
+return sinon;}.call(typeof window != 'undefined' && window || {}));
diff --git a/resources/sinonjs/sinon-ie-1.8.1.js b/resources/sinonjs/sinon-ie-1.8.1.js
new file mode 100644 (file)
index 0000000..f92e9db
--- /dev/null
@@ -0,0 +1,86 @@
+/**
+ * Sinon.JS 1.8.1, 2014/02/02
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS
+ *
+ * (The BSD License)
+ * 
+ * Copyright (c) 2010-2013, Christian Johansen, christian@cjohansen.no
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 
+ *     * Redistributions of source code must retain the above copyright notice,
+ *       this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright notice,
+ *       this list of conditions and the following disclaimer in the documentation
+ *       and/or other materials provided with the distribution.
+ *     * Neither the name of Christian Johansen nor the names of his contributors
+ *       may be used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*global sinon, setTimeout, setInterval, clearTimeout, clearInterval, Date*/
+/**
+ * Helps IE run the fake timers. By defining global functions, IE allows
+ * them to be overwritten at a later point. If these are not defined like
+ * this, overwriting them will result in anything from an exception to browser
+ * crash.
+ *
+ * If you don't require fake timers to work in IE, don't include this file.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+function setTimeout() {}
+function clearTimeout() {}
+function setImmediate() {}
+function clearImmediate() {}
+function setInterval() {}
+function clearInterval() {}
+function Date() {}
+
+// Reassign the original functions. Now their writable attribute
+// should be true. Hackish, I know, but it works.
+setTimeout = sinon.timers.setTimeout;
+clearTimeout = sinon.timers.clearTimeout;
+setImmediate = sinon.timers.setImmediate;
+clearImmediate = sinon.timers.clearImmediate;
+setInterval = sinon.timers.setInterval;
+clearInterval = sinon.timers.clearInterval;
+Date = sinon.timers.Date;
+
+/*global sinon*/
+/**
+ * Helps IE run the fake XMLHttpRequest. By defining global functions, IE allows
+ * them to be overwritten at a later point. If these are not defined like
+ * this, overwriting them will result in anything from an exception to browser
+ * crash.
+ *
+ * If you don't require fake XHR to work in IE, don't include this file.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+function XMLHttpRequest() {}
+
+// Reassign the original function. Now its writable attribute
+// should be true. Hackish, I know, but it works.
+XMLHttpRequest = sinon.xhr.XMLHttpRequest || undefined;
index dc5c001..a7c62b3 100644 (file)
@@ -283,7 +283,7 @@ class CologneBlueTemplate extends BaseTemplate {
                        <?php } ?>
                </div>
        </div>
-       <div id="article" role="main">
+       <div id="article" class="mw-body" role="main">
                <?php if ( $this->getSkin()->getSiteNotice() ) { ?>
                <div id="siteNotice"><?php echo $this->getSkin()->getSiteNotice() ?></div>
                <?php } ?>
index 0dcfe46..899a272 100644 (file)
@@ -428,22 +428,25 @@ class VectorTemplate extends BaseTemplate {
 <div id="p-search" role="search">
        <h3<?php $this->html( 'userlangattributes' ) ?>><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
        <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
-               <?php if ( $wgVectorUseSimpleSearch && $this->getSkin()->getUser()->getOption( 'vector-simplesearch' ) ) { ?>
-               <div id="simpleSearch">
-                       <?php if ( $this->data['rtl'] ) { ?>
-                       <?php echo $this->makeSearchButton( 'image', array( 'id' => 'searchButton', 'src' => $this->getSkin()->getSkinStylePath( 'images/search-rtl.png' ), 'width' => '12', 'height' => '13' ) ); ?>
-                       <?php } ?>
-                       <?php echo $this->makeSearchInput( array( 'id' => 'searchInput', 'type' => 'text' ) ); ?>
-                       <?php if ( !$this->data['rtl'] ) { ?>
-                       <?php echo $this->makeSearchButton( 'image', array( 'id' => 'searchButton', 'src' => $this->getSkin()->getSkinStylePath( 'images/search-ltr.png' ), 'width' => '12', 'height' => '13' ) ); ?>
-                       <?php } ?>
+               <?php if ( $wgVectorUseSimpleSearch ) { ?>
+                       <div id="simpleSearch">
                <?php } else { ?>
-               <div>
-                       <?php echo $this->makeSearchInput( array( 'id' => 'searchInput' ) ); ?>
-                       <?php echo $this->makeSearchButton( 'go', array( 'id' => 'searchGoButton', 'class' => 'searchButton' ) ); ?>
-                       <?php echo $this->makeSearchButton( 'fulltext', array( 'id' => 'mw-searchButton', 'class' => 'searchButton' ) ); ?>
+                       <div>
                <?php } ?>
-                       <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
+                       <?php
+                       echo $this->makeSearchInput( array( 'id' => 'searchInput' ) );
+                       echo Html::hidden( 'title', $this->get( 'searchtitle' ) );
+                       // We construct two buttons (for 'go' and 'fulltext' search modes), but only one will be
+                       // visible and actionable at a time (they are overlaid on top of each other in CSS).
+                       // * Browsers will use the 'fulltext' one by default (as it's the first in tree-order), which
+                       //   is desirable when they are unable to show search suggestions (either due to being broken
+                       //   or having JavaScript turned off).
+                       // * The mediawiki.searchSuggest module, after doing tests for the broken browsers, removes
+                       //   the 'fulltext' button and handles 'fulltext' search itself; this will reveal the 'go'
+                       //   button and cause it to be used.
+                       echo $this->makeSearchButton( 'fulltext', array( 'id' => 'mw-searchButton', 'class' => 'searchButton mw-fallbackSearchButton' ) );
+                       echo $this->makeSearchButton( 'go', array( 'id' => 'searchButton', 'class' => 'searchButton' ) );
+                       ?>
                </div>
        </form>
 </div>
index e2942d7..f3a5a49 100644 (file)
        height: 5em;
        background-position: bottom left;
        background-repeat: repeat-x;
-       .vertical-gradient(@body-background-color, @menu-background-color, 40%, 100%);
+       /* This image is only a fallback (for IE 6-9), so we do not @embed it. */
+       background-image: url('images/page-fade.png');
+       .vertical-gradient(@body-background-color, @menu-background-color, 50%, 100%);
+       background-color: @body-background-color;
 }
 
 #mw-head-base {
index 5d716b6..ec0b2fa 100644 (file)
@@ -30,69 +30,119 @@ div#simpleSearch {
        background-position: top left;
        background-repeat: repeat-x;
 
+       // Styles for both the search input and the button
        input {
+               position: absolute;
+               margin: 0;
+               padding: 0;
+               border: 0;
+               background-color: transparent;
                color: black;
+       }
+
+       // The search input
+       #searchInput {
+               top: 0;
+               left: 0;
+               width: 90%;
+               padding: 0.2em 0 0.2em 0.2em;
+               font-size: 13px;
+               direction: ltr;
+
                &:focus {
                        outline: none;
                }
 
+               // These rules MAY NOT be merged because of how CSS requires browsers
+               // to parse unrecognized selectors!
                &.placeholder {
                        color: #999;
                }
-
-               &:-ms-input-placeholder,
-               &:-moz-placeholder,
+               &:-ms-input-placeholder {
+                       color: #999;
+               }
+               &:-moz-placeholder {
+                       color: #999;
+               }
                &::-webkit-input-placeholder {
                        color: #999;
                }
 
-               &#searchInput {
-                       position: absolute;
-                       top: 0;
-                       left: 0;
-                       width: 90%;
-                       margin: 0;
-                       padding: 0;
-                       padding-left: 0.2em;
-                       padding-top: 0.2em;
-                       padding-bottom: 0.2em;
-                       outline: none;
-                       border: none;
-                       /*
-                        * DON'T PANIC! Browsers that won't scale this properly are the same browsers that have JS issues that prevent
-                        * this from ever being shown anyways.
-                       */
-                       font-size: 13px;
-                       background-color: transparent;
-                       direction: ltr;
+               // Undo the styles Webkit browsers apply to type=search fields,
+               // we provide our own
+               -webkit-appearance: textfield;
+
+               &::-webkit-search-decoration,
+               &::-webkit-search-cancel-button,
+               &::-webkit-search-results-button,
+               &::-webkit-search-results-decoration {
+                       -webkit-appearance: textfield;
                }
        }
 
-       button#searchButton {
-               position: absolute;
-               width: 10%;
-               right: 0;
+       // The buttons. They are displayed in the same position, and if both are
+       // present the fulltext search one obscures the 'Go' one.
+       #searchButton,
+       #mw-searchButton {
                top: 0;
-               padding: 0;
-               padding-top: 0.3em;
-               padding-bottom: 0.2em;
-               padding-right: 0.4em;
-               margin: 0;
-               border: none;
+               right: 0;
+               width: 10%;
+               height: 100%;
                cursor: pointer;
-               background-color: transparent;
-               background-image: none;
+               /* Hide button text and replace it with the image. */
+               /* This would be 100% if not for Firefox shenanigans (bug 60900). */
+               text-indent: 200%;
+               /* Needed to make IE6 respect the text-indent. */
+               line-height: 1;
+               /* Opera 12 on RTL flips the text in a funny way without this. */
+               /* @noflip */
+               direction: ltr;
+               white-space: nowrap;
+               overflow: hidden;
+               .background-image-svg('images/search-ltr.svg', 'images/search-ltr.png');
+               background-position: center center;
+               background-repeat: no-repeat;
+       }
 
-               /* OVERRIDDEN BY COMPLIANT BROWSERS */
-               img {
-                       border: none;
-                       margin: 0;
-                       margin-top: -3px;
-                       padding: 0;
-               }
-               /* IGNORED BY IE6 */
-               > img {
-                       margin: 0;
-               }
+       #mw-searchButton {
+               z-index: 1;
+       }
+}
+
+// The following styles exist only for backwards-compatibility with
+// cached HTML and are to be removed before 1.23 release.
+
+/* Fix direction changed for awful hacks */
+.sitedir-ltr div#simpleSearch button#searchButton {
+       /* @noflip */
+       direction: ltr;
+}
+.sitedir-rtl div#simpleSearch button#searchButton {
+       /* @noflip */
+       direction: rtl;
+}
+
+div#simpleSearch button#searchButton {
+       position: absolute;
+       padding: 0;
+       padding-top: 0.3em;
+       padding-bottom: 0.2em;
+       padding-right: 0.4em;
+       margin: 0;
+       border: none;
+       background-color: transparent;
+       background-image: none;
+       text-indent: 0;
+
+       /* OVERRIDDEN BY COMPLIANT BROWSERS */
+       img {
+               border: none;
+               margin: 0;
+               margin-top: -3px;
+               padding: 0;
+       }
+       /* IGNORED BY IE6 */
+       > img {
+               margin: 0;
        }
 }
index 43e77cd..7e24ae7 100644 (file)
@@ -120,18 +120,19 @@ div.vectorMenu {
        direction: ltr;
        /* @noflip */
        float: left;
-       /* SVG support using a transparent gradient to guarantee cross-browser
-        * compatibility (browsers able to understand gradient syntax support also SVG) */
        .background-image-svg('images/arrow-down-icon.svg', 'images/arrow-down-icon.png');
        /* @noflip */
        background-position: 100% 60%;
        background-repeat: no-repeat;
        cursor: pointer;
+       .transition(background-position 250ms);
+}
+
+div.vectorMenu.menuForceShow {
+       background-position: 100% 100%;
 }
 
 div.vectorMenuFocus {
-       /* SVG support using a transparent gradient to guarantee cross-browser
-        * compatibility (browsers able to understand gradient syntax support also SVG) */
        .background-image-svg('images/arrow-down-focus-icon.svg', 'images/arrow-down-focus-icon.png');
        background-position: 100% 60%;
 }
@@ -212,7 +213,7 @@ x:-moz-any-link {
 
 /* Enable forcing showing of the menu for accessibility */
 div.vectorMenu:hover div.menu,
-div.vectorMenu div.menuForceShow {
+div.vectorMenu.menuForceShow div.menu {
        display: block;
 }
 
index 6f93215..b76a825 100644 (file)
@@ -1,3 +1,5 @@
+@import "mediawiki.mixins.rotation"
+
 /* Watch/Unwatch Icon Styling */
 #ca-unwatch.icon a,
 #ca-watch.icon a {
        margin-top: -0.8em !ie;
        height: 0;
        overflow: hidden;
-       .background-image('images/watch-icons.png');
+       background-position: 5px 60%;
 }
 #ca-unwatch.icon a {
-       background-position: -43px 60%;
+       .background-image-svg('images/unwatch-icon.svg', 'images/unwatch-icon.png');
 }
 #ca-watch.icon a {
-       background-position: 5px 60%;
+       .background-image-svg('images/watch-icon.svg', 'images/watch-icon.png');
 }
 #ca-unwatch.icon a:hover,
 #ca-unwatch.icon a:focus {
-       background-position: -67px 60%;
+       .background-image-svg('images/unwatch-icon-hl.svg', 'images/unwatch-icon-hl.png');
 }
 #ca-watch.icon a:hover,
 #ca-watch.icon a:focus {
-       background-position: -19px 60%;
+       .background-image-svg('images/watch-icon-hl.svg', 'images/watch-icon-hl.png');
 }
 #ca-unwatch.icon a.loading,
 #ca-watch.icon a.loading {
-       .background-image('images/watch-icon-loading.gif');
-       background-position: 5px 60%;
+       .background-image-svg('images/watch-icon-loading.svg', 'images/watch-icon-loading.png');
+       .rotation(700ms);
+       background-position: 50% 60%;
+       -webkit-transform-origin: 50% 57%;
+       transform-origin: 50% 57%;
 }
 #ca-unwatch.icon a span,
 #ca-watch.icon a span {
index d0c4729..64a449f 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
@@ -11,8 +9,6 @@
    width="16"
    height="16"
    id="svg2">
-  <defs
-     id="defs4" />
   <metadata
      id="metadata7">
     <rdf:RDF>
index 8c5e04b..938494b 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
@@ -11,8 +9,6 @@
    width="16"
    height="16"
    id="svg2">
-  <defs
-     id="defs4" />
   <metadata
      id="metadata7">
     <rdf:RDF>
index f2edf26..be1ad89 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
@@ -11,8 +9,6 @@
    width="22"
    height="16"
    id="svg2">
-  <defs
-     id="defs4" />
   <metadata
      id="metadata7">
     <rdf:RDF>
index 9218ff2..a991501 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
@@ -11,8 +9,6 @@
    width="22"
    height="16"
    id="svg2">
-  <defs
-     id="defs4" />
   <metadata
      id="metadata7">
     <rdf:RDF>
index 60704d2..a1b58e5 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
@@ -11,8 +9,6 @@
    width="16"
    height="16"
    id="svg2">
-  <defs
-     id="defs4" />
   <metadata
      id="metadata7">
     <rdf:RDF>
index d88b57f..91ca5c4 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
@@ -8,60 +6,33 @@
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
    width="10"
    height="10"
-   id="svg6167"
-   version="1.1"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="Nowy dokument 22">
+   id="svg6167">
   <defs
      id="defs6169">
     <linearGradient
        id="linearGradient6707">
       <stop
-         style="stop-color:#b2bf46;stop-opacity:1;"
-         offset="0"
-         id="stop6709" />
+         id="stop6709"
+         style="stop-color:#b2bf46;stop-opacity:1"
+         offset="0" />
       <stop
-         style="stop-color:#c8d17b;stop-opacity:1;"
-         offset="1"
-         id="stop6711" />
+         id="stop6711"
+         style="stop-color:#c8d17b;stop-opacity:1"
+         offset="1" />
     </linearGradient>
     <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6707"
-       id="linearGradient6713"
        x1="22.262903"
        y1="9.1418257"
        x2="22.262903"
        y2="5.3889236"
+       id="linearGradient6713"
+       xlink:href="#linearGradient6707"
        gradientUnits="userSpaceOnUse"
        gradientTransform="matrix(0.96979296,0,0,0.96979296,858.75554,710.2631)" />
   </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="45.254834"
-     inkscape:cx="7.6304965"
-     inkscape:cy="5.5914204"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     inkscape:window-width="1920"
-     inkscape:window-height="1014"
-     inkscape:window-x="0"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1" />
   <metadata
      id="metadata6172">
     <rdf:RDF>
     </rdf:RDF>
   </metadata>
   <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-877.85712,-710.2193)">
+     transform="translate(-877.85712,-710.2193)"
+     id="layer1">
     <path
-       style="fill:url(#linearGradient6713);fill-opacity:1;stroke:#757f2a;stroke-width:0.96979296px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        d="m 880.63649,710.74799 0,5.78845 c -0.30291,0.0337 -0.60613,0.10534 -0.90918,0.24245 -1.08747,0.49204 -1.62536,1.48002 -1.21224,2.21234 0.41311,0.73233 1.60977,0.91632 2.69723,0.42429 0.87694,-0.39677 1.37959,-1.10894 1.33347,-1.75775 l 0,-0.15153 0,-3.81856 2.93968,0 0,2.84876 c -0.30894,0.0309 -0.62965,0.10227 -0.93948,0.24245 -1.07493,0.48636 -1.6206,1.48846 -1.21225,2.21234 0.40836,0.72389 1.59201,0.91065 2.66694,0.42429 0.87404,-0.39547 1.38893,-1.11233 1.33346,-1.75775 l 0,-0.15153 0,-6.75825 -6.69763,0 z"
        id="path6186"
-       inkscape:connector-curvature="0" />
+       style="fill:url(#linearGradient6713);fill-opacity:1;stroke:#757f2a;stroke-width:0.96979296px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
   </g>
 </svg>
index 1055769..fd05df8 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
@@ -8,83 +6,34 @@
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
    width="10"
    height="10"
-   id="svg7339"
-   version="1.1"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="document-icon.svg">
+   id="svg7339">
   <defs
      id="defs7341">
     <linearGradient
        id="linearGradient7918">
       <stop
-         style="stop-color:#e2e2e2;stop-opacity:1;"
-         offset="0"
-         id="stop7920" />
-      <stop
-         style="stop-color:#f8f8f8;stop-opacity:1;"
-         offset="1"
-         id="stop7922" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient7902">
-      <stop
-         style="stop-color:#e2e2e2;stop-opacity:1;"
-         offset="0"
-         id="stop7904" />
+         id="stop7920"
+         style="stop-color:#e2e2e2;stop-opacity:1"
+         offset="0" />
       <stop
-         style="stop-color:#e2e2e2;stop-opacity:1;"
-         offset="1"
-         id="stop7906" />
+         id="stop7922"
+         style="stop-color:#f8f8f8;stop-opacity:1"
+         offset="1" />
     </linearGradient>
     <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient7918"
-       id="radialGradient7931"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.4065972,0,0,2.1428629,6.7977966,-4.7132748)"
        cx="-16.71875"
        cy="3.344311"
+       r="2"
        fx="-16.71875"
        fy="3.344311"
-       r="2" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient7918"
        id="radialGradient7968"
+       xlink:href="#linearGradient7918"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.4065972,0,0,2.1428629,810.35359,682.73485)"
-       cx="-16.71875"
-       cy="3.344311"
-       fx="-16.71875"
-       fy="3.344311"
-       r="2" />
+       gradientTransform="matrix(1.4065972,0,0,2.1428629,810.35359,682.73485)" />
   </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="32"
-     inkscape:cx="3.7383502"
-     inkscape:cy="5.7078811"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     inkscape:window-width="1920"
-     inkscape:window-height="1041"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1" />
   <metadata
      id="metadata7344">
     <rdf:RDF>
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
+        <dc:title></dc:title>
       </cc:Work>
     </rdf:RDF>
   </metadata>
   <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-783.57141,-687.36218)">
+     transform="translate(-783.57141,-687.36218)"
+     id="layer1">
     <path
-       inkscape:connector-curvature="0"
-       style="fill:#ffffff;fill-opacity:1;stroke:#878787;stroke-width:0.89999998;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
        d="m 785.05579,687.85437 0,9.09375 7.03125,0 0,-6.84375 -2.25,-2.25 -4.78125,0 z"
-       id="rect7358" />
+       id="rect7358"
+       style="fill:#ffffff;fill-opacity:1;stroke:#878787;stroke-width:0.89999998;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
     <path
-       inkscape:connector-curvature="0"
-       style="fill:url(#radialGradient7968);fill-opacity:1;stroke:none"
        d="m 786.52454,689.44812 0,6.09375 4,0 0,-5.28125 -0.84375,0 0,-0.8125 -3.15625,0 z"
-       id="rect7896" />
-    <g
-       style="font-size:1px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-       id="text7952">
-      <path
-         d="m 786.54126,689.4494 0.0986,0 0,0.646 0.35498,0 0,0.083 -0.45361,0 0,-0.72901"
-         style=""
-         id="path2999" />
-      <path
-         d="m 787.28833,689.69452 c -0.0482,0 -0.0863,0.0189 -0.11426,0.0566 -0.028,0.0374 -0.042,0.0889 -0.042,0.1543 0,0.0654 0.0138,0.11702 0.0415,0.15478 0.028,0.0374 0.0662,0.0562 0.11475,0.0562 0.0479,0 0.0858,-0.0189 0.11377,-0.0566 0.028,-0.0378 0.042,-0.0892 0.042,-0.15429 0,-0.0648 -0.014,-0.11605 -0.042,-0.15381 -0.028,-0.0381 -0.0659,-0.0571 -0.11377,-0.0571 m 0,-0.0762 c 0.0781,0 0.13949,0.0254 0.18408,0.0762 0.0446,0.0508 0.0669,0.12109 0.0669,0.21094 0,0.0895 -0.0223,0.15983 -0.0669,0.21093 -0.0446,0.0508 -0.10596,0.0762 -0.18408,0.0762 -0.0784,0 -0.13997,-0.0254 -0.18457,-0.0762 -0.0443,-0.0511 -0.0664,-0.12142 -0.0664,-0.21093 0,-0.0898 0.0221,-0.16016 0.0664,-0.21094 0.0446,-0.0508 0.10612,-0.0762 0.18457,-0.0762"
-         style=""
-         id="path3001" />
-      <path
-         d="m 788.00464,689.71552 c -0.0101,-0.006 -0.0212,-0.0101 -0.0332,-0.0127 -0.0117,-0.003 -0.0247,-0.004 -0.0391,-0.004 -0.0508,0 -0.0898,0.0166 -0.11718,0.0498 -0.027,0.0329 -0.0405,0.0802 -0.0405,0.14209 l 0,0.28809 -0.0903,0 0,-0.54688 0.0903,0 0,0.085 c 0.0189,-0.0332 0.0435,-0.0578 0.0737,-0.0737 0.0303,-0.0163 0.0671,-0.0244 0.11035,-0.0244 0.006,0 0.013,4.9e-4 0.0205,0.001 0.007,6.5e-4 0.0158,0.002 0.0249,0.003 l 4.9e-4,0.0923"
-         style=""
-         id="path3003" />
-      <path
-         d="m 788.54614,689.88251 0,0.0439 -0.41308,0 c 0.004,0.0618 0.0225,0.10905 0.0557,0.1416 0.0335,0.0322 0.0801,0.0483 0.13965,0.0483 0.0345,0 0.0679,-0.004 0.1001,-0.0127 0.0326,-0.008 0.0648,-0.0212 0.0967,-0.0381 l 0,0.085 c -0.0322,0.0137 -0.0653,0.0241 -0.0991,0.0312 -0.0339,0.007 -0.0682,0.0108 -0.10303,0.0108 -0.0872,0 -0.15641,-0.0254 -0.20752,-0.0762 -0.0508,-0.0508 -0.0762,-0.11946 -0.0762,-0.20605 0,-0.0895 0.0241,-0.16048 0.0723,-0.21289 0.0485,-0.0527 0.11377,-0.0791 0.1958,-0.0791 0.0736,0 0.13168,0.0238 0.17432,0.0713 0.043,0.0472 0.0645,0.11149 0.0645,0.19287 m -0.0898,-0.0264 c -6.5e-4,-0.0491 -0.0145,-0.0884 -0.0415,-0.11768 -0.0267,-0.0293 -0.0622,-0.0439 -0.10644,-0.0439 -0.0501,0 -0.0903,0.0142 -0.12061,0.0425 -0.0299,0.0283 -0.0472,0.0682 -0.0517,0.11963 l 0.32031,-4.9e-4"
-         style=""
-         id="path3005" />
-      <path
-         d="m 789.11938,689.73651 c 0.0225,-0.0404 0.0493,-0.0701 0.0806,-0.0893 0.0312,-0.0192 0.068,-0.0288 0.11035,-0.0288 0.057,0 0.10091,0.02 0.13184,0.0601 0.0309,0.0397 0.0464,0.0964 0.0464,0.16992 l 0,0.33008 -0.0903,0 0,-0.32715 c 0,-0.0524 -0.009,-0.0913 -0.0278,-0.1167 -0.0186,-0.0254 -0.0469,-0.0381 -0.085,-0.0381 -0.0466,0 -0.0833,0.0155 -0.11035,0.0464 -0.027,0.0309 -0.0405,0.0731 -0.0405,0.12646 l 0,0.30909 -0.0903,0 0,-0.32715 c 0,-0.0527 -0.009,-0.0916 -0.0278,-0.1167 -0.0186,-0.0254 -0.0472,-0.0381 -0.0859,-0.0381 -0.0459,0 -0.0824,0.0156 -0.10938,0.0469 -0.027,0.0309 -0.0405,0.0729 -0.0405,0.12597 l 0,0.30909 -0.0903,0 0,-0.54688 0.0903,0 0,0.085 c 0.0205,-0.0335 0.0451,-0.0583 0.0737,-0.0742 0.0286,-0.016 0.0627,-0.0239 0.10205,-0.0239 0.0397,0 0.0734,0.0101 0.10107,0.0303 0.028,0.0202 0.0487,0.0495 0.062,0.0879"
-         style=""
-         id="path3007" />
-      <path
-         d="m 786.53735,690.88153 0.0899,0 0,0.54688 -0.0899,0 0,-0.54688 m 0,-0.21289 0.0899,0 0,0.11377 -0.0899,0 0,-0.11377"
-         style=""
-         id="path3009" />
-      <path
-         d="m 786.90161,691.34637 0,0.29004 -0.0903,0 0,-0.75488 0.0903,0 0,0.083 c 0.0189,-0.0326 0.0426,-0.0566 0.0713,-0.0723 0.029,-0.016 0.0635,-0.0239 0.10352,-0.0239 0.0664,0 0.12028,0.0264 0.16162,0.0791 0.0417,0.0527 0.0625,0.12207 0.0625,0.20801 0,0.0859 -0.0208,0.15527 -0.0625,0.208 -0.0413,0.0527 -0.0952,0.0791 -0.16162,0.0791 -0.04,0 -0.0745,-0.008 -0.10352,-0.0234 -0.0286,-0.0159 -0.0524,-0.0402 -0.0713,-0.0728 m 0.30567,-0.19091 c -10e-6,-0.0661 -0.0137,-0.11784 -0.041,-0.15528 -0.027,-0.0378 -0.0643,-0.0566 -0.11182,-0.0566 -0.0475,0 -0.085,0.0189 -0.1123,0.0566 -0.027,0.0374 -0.0405,0.0892 -0.0405,0.15528 0,0.0661 0.0135,0.118 0.0405,0.15576 0.0273,0.0374 0.0648,0.0562 0.1123,0.0562 0.0475,0 0.0848,-0.0187 0.11182,-0.0562 0.0273,-0.0378 0.041,-0.0897 0.041,-0.15576"
-         style=""
-         id="path3011" />
-      <path
-         d="m 787.7981,690.89764 0,0.085 c -0.0254,-0.013 -0.0518,-0.0228 -0.0791,-0.0293 -0.0273,-0.007 -0.0557,-0.01 -0.085,-0.01 -0.0446,0 -0.0781,0.007 -0.10058,0.0205 -0.0221,0.0137 -0.0332,0.0342 -0.0332,0.0615 0,0.0208 0.008,0.0373 0.0239,0.0493 0.0159,0.0117 0.048,0.023 0.0962,0.0337 l 0.0308,0.007 c 0.0638,0.0137 0.10905,0.033 0.13575,0.0581 0.027,0.0247 0.0405,0.0594 0.0405,0.10401 0,0.0508 -0.0202,0.091 -0.0605,0.1206 -0.04,0.0296 -0.0952,0.0444 -0.16553,0.0444 -0.0293,0 -0.0599,-0.003 -0.0918,-0.009 -0.0316,-0.006 -0.0649,-0.014 -0.1001,-0.0254 l 0,-0.0928 c 0.0332,0.0173 0.0659,0.0303 0.0982,0.0391 0.0322,0.008 0.0641,0.0127 0.0957,0.0127 0.0423,0 0.0749,-0.007 0.0977,-0.0215 0.0228,-0.0147 0.0342,-0.0352 0.0342,-0.0615 0,-0.0244 -0.008,-0.0431 -0.0249,-0.0562 -0.0163,-0.013 -0.0522,-0.0255 -0.10792,-0.0376 l -0.0312,-0.007 c -0.0557,-0.0117 -0.0959,-0.0296 -0.1206,-0.0537 -0.0247,-0.0244 -0.0371,-0.0578 -0.0371,-0.1001 0,-0.0514 0.0182,-0.0912 0.0547,-0.11914 0.0365,-0.028 0.0882,-0.042 0.15527,-0.042 0.0332,0 0.0644,0.002 0.0937,0.007 0.0293,0.005 0.0563,0.0122 0.0811,0.022"
-         style=""
-         id="path3013" />
-      <path
-         d="m 787.96167,691.21259 0,-0.33106 0.0898,0 0,0.32764 c 0,0.0518 0.0101,0.0907 0.0303,0.1167 0.0202,0.0257 0.0505,0.0386 0.0908,0.0386 0.0485,0 0.0868,-0.0155 0.11474,-0.0464 0.0283,-0.0309 0.0425,-0.0731 0.0425,-0.12646 l 0,-0.31006 0.0898,0 0,0.54688 -0.0898,0 0,-0.084 c -0.0218,0.0332 -0.0472,0.0579 -0.0762,0.0742 -0.0286,0.0159 -0.062,0.0239 -0.1001,0.0239 -0.0628,0 -0.11051,-0.0195 -0.14306,-0.0586 -0.0326,-0.0391 -0.0488,-0.0962 -0.0488,-0.17138 m 0.22607,-0.34424 0,0"
-         style=""
-         id="path3015" />
-      <path
-         d="m 789.03149,690.98651 c 0.0225,-0.0404 0.0493,-0.0701 0.0806,-0.0893 0.0312,-0.0192 0.068,-0.0288 0.11035,-0.0288 0.057,0 0.10091,0.02 0.13184,0.0601 0.0309,0.0397 0.0464,0.0964 0.0464,0.16992 l 0,0.33008 -0.0903,0 0,-0.32715 c 0,-0.0524 -0.009,-0.0913 -0.0278,-0.1167 -0.0186,-0.0254 -0.0469,-0.0381 -0.085,-0.0381 -0.0465,0 -0.0833,0.0155 -0.11035,0.0464 -0.027,0.0309 -0.0405,0.0731 -0.0405,0.12646 l 0,0.30909 -0.0903,0 0,-0.32715 c 0,-0.0527 -0.009,-0.0916 -0.0278,-0.1167 -0.0186,-0.0254 -0.0472,-0.0381 -0.0859,-0.0381 -0.0459,0 -0.0824,0.0156 -0.10938,0.0469 -0.027,0.0309 -0.0405,0.0729 -0.0405,0.12597 l 0,0.30909 -0.0903,0 0,-0.54688 0.0903,0 0,0.085 c 0.0205,-0.0335 0.0451,-0.0583 0.0737,-0.0742 0.0286,-0.016 0.0627,-0.0239 0.10205,-0.0239 0.0397,0 0.0734,0.0101 0.10107,0.0303 0.028,0.0202 0.0487,0.0495 0.062,0.0879"
-         style=""
-         id="path3017" />
-      <path
-         d="m 786.89722,692.21454 0,-0.2959 0.0898,0 0,0.75977 -0.0898,0 0,-0.082 c -0.0189,0.0326 -0.0428,0.0568 -0.0718,0.0728 -0.0286,0.0156 -0.0631,0.0234 -0.10352,0.0234 -0.0661,0 -0.11995,-0.0264 -0.16162,-0.0791 -0.0413,-0.0527 -0.062,-0.12207 -0.062,-0.208 0,-0.0859 0.0207,-0.15528 0.062,-0.20801 0.0417,-0.0527 0.0955,-0.0791 0.16162,-0.0791 0.0404,0 0.0749,0.008 0.10352,0.0239 0.029,0.0156 0.0529,0.0397 0.0718,0.0723 m -0.30616,0.19092 c 0,0.0661 0.0135,0.118 0.0405,0.15576 0.0274,0.0374 0.0648,0.0562 0.11231,0.0562 0.0475,0 0.085,-0.0187 0.1123,-0.0562 0.0273,-0.0378 0.041,-0.0897 0.041,-0.15576 0,-0.0661 -0.0137,-0.11784 -0.041,-0.15528 -0.0273,-0.0378 -0.0648,-0.0566 -0.1123,-0.0566 -0.0475,0 -0.085,0.0189 -0.11231,0.0566 -0.027,0.0374 -0.0405,0.0892 -0.0405,0.15528"
-         style=""
-         id="path3019" />
-      <path
-         d="m 787.38403,692.19452 c -0.0482,0 -0.0863,0.0189 -0.11425,0.0566 -0.028,0.0374 -0.042,0.0889 -0.042,0.1543 0,0.0654 0.0138,0.11702 0.0415,0.15478 0.028,0.0374 0.0662,0.0562 0.11474,0.0562 0.0478,0 0.0858,-0.0189 0.11377,-0.0566 0.028,-0.0378 0.042,-0.0892 0.042,-0.15429 0,-0.0648 -0.014,-0.11605 -0.042,-0.15381 -0.028,-0.0381 -0.0659,-0.0571 -0.11377,-0.0571 m 0,-0.0762 c 0.0781,0 0.13949,0.0254 0.18409,0.0762 0.0446,0.0508 0.0669,0.12109 0.0669,0.21094 0,0.0895 -0.0223,0.15983 -0.0669,0.21093 -0.0446,0.0508 -0.10596,0.0762 -0.18409,0.0762 -0.0785,0 -0.13997,-0.0254 -0.18457,-0.0762 -0.0443,-0.0511 -0.0664,-0.12142 -0.0664,-0.21093 0,-0.0898 0.0221,-0.16016 0.0664,-0.21094 0.0446,-0.0508 0.10612,-0.0762 0.18457,-0.0762"
-         style=""
-         id="path3021" />
-      <path
-         d="m 787.78345,691.91864 0.0898,0 0,0.75977 -0.0898,0 0,-0.75977"
-         style=""
-         id="path3023" />
-      <path
-         d="m 788.27271,692.19452 c -0.0482,0 -0.0863,0.0189 -0.11426,0.0566 -0.028,0.0374 -0.042,0.0889 -0.042,0.1543 -10e-6,0.0654 0.0138,0.11702 0.0415,0.15478 0.028,0.0374 0.0662,0.0562 0.11475,0.0562 0.0479,0 0.0858,-0.0189 0.11376,-0.0566 0.028,-0.0378 0.042,-0.0892 0.042,-0.15429 0,-0.0648 -0.014,-0.11605 -0.042,-0.15381 -0.028,-0.0381 -0.0659,-0.0571 -0.11376,-0.0571 m 0,-0.0762 c 0.0781,0 0.13948,0.0254 0.18408,0.0762 0.0446,0.0508 0.0669,0.12109 0.0669,0.21094 0,0.0895 -0.0223,0.15983 -0.0669,0.21093 -0.0446,0.0508 -0.10596,0.0762 -0.18408,0.0762 -0.0785,0 -0.13998,-0.0254 -0.18458,-0.0762 -0.0443,-0.0511 -0.0664,-0.12142 -0.0664,-0.21093 0,-0.0898 0.0221,-0.16016 0.0664,-0.21094 0.0446,-0.0508 0.10612,-0.0762 0.18458,-0.0762"
-         style=""
-         id="path3025" />
-      <path
-         d="m 788.98901,692.21552 c -0.0101,-0.006 -0.0212,-0.0101 -0.0332,-0.0127 -0.0117,-0.003 -0.0247,-0.004 -0.0391,-0.004 -0.0508,0 -0.0898,0.0166 -0.11719,0.0498 -0.027,0.0329 -0.0405,0.0802 -0.0405,0.14209 l 0,0.28809 -0.0903,0 0,-0.54688 0.0903,0 0,0.085 c 0.0189,-0.0332 0.0435,-0.0578 0.0737,-0.0737 0.0303,-0.0163 0.0671,-0.0244 0.11036,-0.0244 0.006,0 0.013,4.9e-4 0.0205,0.001 0.007,6.5e-4 0.0158,0.002 0.0249,0.003 l 4.8e-4,0.0923"
-         style=""
-         id="path3027" />
-      <path
-         d="m 786.88599,693.39764 0,0.085 c -0.0254,-0.013 -0.0518,-0.0228 -0.0791,-0.0293 -0.0273,-0.007 -0.0557,-0.01 -0.085,-0.01 -0.0446,0 -0.0781,0.007 -0.10058,0.0205 -0.0221,0.0137 -0.0332,0.0342 -0.0332,0.0615 0,0.0208 0.008,0.0373 0.0239,0.0493 0.0159,0.0117 0.048,0.023 0.0962,0.0337 l 0.0308,0.007 c 0.0638,0.0137 0.10905,0.033 0.13575,0.0581 0.027,0.0247 0.0405,0.0594 0.0405,0.10401 0,0.0508 -0.0202,0.091 -0.0605,0.1206 -0.04,0.0296 -0.0952,0.0444 -0.16553,0.0444 -0.0293,0 -0.0599,-0.003 -0.0918,-0.009 -0.0316,-0.006 -0.0649,-0.014 -0.1001,-0.0254 l 0,-0.0928 c 0.0332,0.0173 0.0659,0.0303 0.0982,0.0391 0.0322,0.008 0.0641,0.0127 0.0957,0.0127 0.0423,0 0.0749,-0.007 0.0977,-0.0215 0.0228,-0.0147 0.0342,-0.0352 0.0342,-0.0615 0,-0.0244 -0.008,-0.0431 -0.0249,-0.0562 -0.0163,-0.013 -0.0522,-0.0255 -0.10791,-0.0376 l -0.0312,-0.007 c -0.0557,-0.0117 -0.0959,-0.0296 -0.12061,-0.0537 -0.0247,-0.0244 -0.0371,-0.0578 -0.0371,-0.1001 0,-0.0514 0.0182,-0.0912 0.0547,-0.11914 0.0365,-0.028 0.0882,-0.042 0.15527,-0.042 0.0332,0 0.0644,0.002 0.0937,0.007 0.0293,0.005 0.0563,0.0122 0.0811,0.022"
-         style=""
-         id="path3029" />
-      <path
-         d="m 787.05884,693.38153 0.0898,0 0,0.54688 -0.0898,0 0,-0.54688 m 0,-0.21289 0.0898,0 0,0.11377 -0.0898,0 0,-0.11377"
-         style=""
-         id="path3031" />
-      <path
-         d="m 787.42505,693.22626 0,0.15527 0.18506,0 0,0.0698 -0.18506,0 0,0.29688 c 0,0.0446 0.006,0.0732 0.0181,0.0859 0.0124,0.0127 0.0373,0.019 0.0747,0.019 l 0.0923,0 0,0.0752 -0.0923,0 c -0.0693,0 -0.11719,-0.0129 -0.14355,-0.0386 -0.0264,-0.026 -0.0396,-0.0732 -0.0396,-0.1416 l 0,-0.29688 -0.0659,0 0,-0.0698 0.0659,0 0,-0.15527 0.0903,0"
-         style=""
-         id="path3033" />
-      <path
-         d="m 788.29565,693.6535 c -0.0726,0 -0.12288,0.008 -0.15087,0.0249 -0.028,0.0166 -0.042,0.0449 -0.042,0.085 0,0.0319 0.0104,0.0573 0.0312,0.0762 0.0212,0.0185 0.0498,0.0278 0.0859,0.0278 0.0498,0 0.0897,-0.0176 0.11963,-0.0527 0.0303,-0.0355 0.0454,-0.0825 0.0454,-0.14112 l 0,-0.02 -0.0894,0 m 0.1792,-0.0371 0,0.31202 -0.0898,0 0,-0.083 c -0.0205,0.0332 -0.0461,0.0578 -0.0767,0.0737 -0.0306,0.0156 -0.068,0.0234 -0.11231,0.0234 -0.056,0 -0.10058,-0.0156 -0.13378,-0.0469 -0.0329,-0.0316 -0.0493,-0.0737 -0.0493,-0.12646 0,-0.0615 0.0205,-0.10791 0.0615,-0.13916 0.0413,-0.0312 0.10287,-0.0469 0.18457,-0.0469 l 0.12598,0 0,-0.009 c 0,-0.0413 -0.0137,-0.0732 -0.041,-0.0957 -0.027,-0.0228 -0.0651,-0.0342 -0.11425,-0.0342 -0.0312,0 -0.0617,0.004 -0.0913,0.0112 -0.0296,0.007 -0.0581,0.0187 -0.0854,0.0337 l 0,-0.083 c 0.0329,-0.0127 0.0648,-0.0221 0.0957,-0.0283 0.0309,-0.007 0.061,-0.01 0.0903,-0.01 0.0791,0 0.13819,0.0205 0.17725,0.0615 0.0391,0.041 0.0586,0.10319 0.0586,0.18652"
-         style=""
-         id="path3035" />
-      <path
-         d="m 789.08618,693.48651 c 0.0225,-0.0404 0.0493,-0.0701 0.0806,-0.0893 0.0312,-0.0192 0.068,-0.0288 0.11035,-0.0288 0.057,0 0.10091,0.02 0.13184,0.0601 0.0309,0.0397 0.0464,0.0964 0.0464,0.16992 l 0,0.33008 -0.0903,0 0,-0.32715 c 0,-0.0524 -0.009,-0.0913 -0.0278,-0.1167 -0.0186,-0.0254 -0.0469,-0.0381 -0.085,-0.0381 -0.0466,0 -0.0833,0.0155 -0.11035,0.0464 -0.027,0.0309 -0.0405,0.0731 -0.0405,0.12646 l 0,0.30909 -0.0903,0 0,-0.32715 c 0,-0.0527 -0.009,-0.0916 -0.0278,-0.1167 -0.0186,-0.0254 -0.0472,-0.0381 -0.0859,-0.0381 -0.0459,0 -0.0824,0.0156 -0.10938,0.0469 -0.027,0.0309 -0.0405,0.0729 -0.0405,0.12597 l 0,0.30909 -0.0903,0 0,-0.54688 0.0903,0 0,0.085 c 0.0205,-0.0335 0.0451,-0.0583 0.0737,-0.0742 0.0286,-0.016 0.0627,-0.0239 0.10206,-0.0239 0.0397,0 0.0734,0.0101 0.10107,0.0303 0.028,0.0202 0.0487,0.0495 0.062,0.0879"
-         style=""
-         id="path3037" />
-      <path
-         d="m 790.10278,693.63251 0,0.0439 -0.41308,0 c 0.004,0.0618 0.0225,0.10905 0.0557,0.1416 0.0335,0.0322 0.0801,0.0483 0.13965,0.0483 0.0345,0 0.0679,-0.004 0.1001,-0.0127 0.0326,-0.008 0.0648,-0.0212 0.0967,-0.0381 l 0,0.085 c -0.0322,0.0137 -0.0653,0.0241 -0.0991,0.0312 -0.0339,0.007 -0.0682,0.0108 -0.10303,0.0108 -0.0872,0 -0.15641,-0.0254 -0.20752,-0.0762 -0.0508,-0.0508 -0.0762,-0.11946 -0.0762,-0.20605 0,-0.0895 0.0241,-0.16048 0.0723,-0.21289 0.0485,-0.0527 0.11377,-0.0791 0.1958,-0.0791 0.0736,0 0.13168,0.0238 0.17432,0.0713 0.043,0.0472 0.0645,0.11149 0.0645,0.19287 m -0.0898,-0.0264 c -6.5e-4,-0.0491 -0.0145,-0.0884 -0.0415,-0.11768 -0.0267,-0.0293 -0.0622,-0.0439 -0.10645,-0.0439 -0.0501,0 -0.0903,0.0142 -0.12061,0.0425 -0.0299,0.0283 -0.0472,0.0682 -0.0517,0.11963 l 0.32031,-4.9e-4"
-         style=""
-         id="path3039" />
-      <path
-         d="m 790.33911,693.22626 0,0.15527 0.18506,0 0,0.0698 -0.18506,0 0,0.29688 c 0,0.0446 0.006,0.0732 0.0181,0.0859 0.0124,0.0127 0.0373,0.019 0.0747,0.019 l 0.0923,0 0,0.0752 -0.0923,0 c -0.0693,0 -0.11718,-0.0129 -0.14355,-0.0386 -0.0264,-0.026 -0.0395,-0.0732 -0.0395,-0.1416 l 0,-0.29688 -0.0659,0 0,-0.0698 0.0659,0 0,-0.15527 0.0903,0"
-         style=""
-         id="path3041" />
-    </g>
+       id="rect7896"
+       style="fill:url(#radialGradient7968);fill-opacity:1;stroke:none" />
+    <path
+       d="m 790.33911,693.22626 c -0.0498,0.19786 0.33032,0.17787 0.003,0.27815 -0.16998,0.24799 0.39939,0.51157 -0.0311,0.38026 -0.0547,-0.17272 -0.19121,-0.57992 0.0276,-0.65857 m -0.23638,0.40635 c -0.1524,0.0463 -0.6328,0.0553 -0.24172,0.21827 0.48594,0.05 -0.34395,0.2177 -0.26091,-0.17076 -0.08,-0.37141 0.5251,-0.43406 0.50275,-0.0476 m -0.0898,-0.0264 c 0.0121,-0.34938 -0.523,0.0801 -0.0661,1.6e-4 0.022,-3e-5 0.0441,-7e-5 0.0661,-1e-4 M 789.086,693.4864 c 0.29829,-0.46808 0.54605,0.50739 0.27992,0.36129 0.16156,-0.25017 -0.25661,-0.58879 -0.25488,-0.19318 0.0618,0.20786 -0.16306,0.36284 -0.0814,0.0576 0.0107,-0.40895 -0.3951,-0.2098 -0.28228,0.0968 -0.10398,0.30793 -0.19195,-0.59656 0.0363,-0.38389 0.11037,-0.0424 0.2633,-0.11931 0.3025,0.062 m -0.79072,0.16676 c -0.35692,-0.0559 0.0391,0.45637 0.0912,0.0607 0.0111,-0.0474 -0.0478,-0.0975 -0.0913,-0.0606 m 0.1792,-0.0371 c 0.0389,0.27609 4.8e-4,0.31202 -0.23096,0.30993 -0.40958,0.0339 -0.12848,-0.45975 0.12931,-0.3933 -0.0182,-0.14721 -0.50917,-0.032 -0.16875,-0.16893 0.13714,-0.0119 0.30604,0.0969 0.27048,0.25186 m -1.04972,-0.38964 c -0.0498,0.19787 0.33033,0.17786 0.003,0.27815 -0.16997,0.24801 0.39941,0.51157 -0.0312,0.38026 -0.0548,-0.17265 -0.1912,-0.5799 0.0275,-0.65857 m -0.36616,0.15537 c 0.24316,0.0804 0.005,0.86043 -0.008,0.29992 0.004,-0.10008 0.0106,-0.19944 0.008,-0.29992 z m 0,-0.21289 c 0.22907,-0.0248 -0.0564,0.25715 0,0 z m -0.17285,0.229 c -0.0882,0.10339 -0.47525,0.0905 -0.12796,0.20033 0.32998,0.11579 -0.0901,0.56917 -0.25377,0.26243 0.35714,0.0875 0.26894,-0.20613 0.0291,-0.26075 -0.0991,-0.20406 0.219,-0.31306 0.35275,-0.20238 m 2.10283,-1.18179 c -0.31133,-0.19291 -0.2311,0.78642 -0.32232,0.2231 -0.003,-0.21834 -0.0409,-0.33207 0.20367,-0.28984 0.0532,-0.0761 0.16542,-0.007 0.1188,0.0663 m -0.71625,-0.0206 c -0.45977,0.0927 0.20216,0.73875 0.1549,0.16183 -0.008,-0.0784 -0.0689,-0.16424 -0.1549,-0.16175 m 0,-0.0762 c 0.53548,0.0229 0.0809,0.95772 -0.22515,0.4264 -0.0799,-0.16794 0.006,-0.44314 0.22515,-0.4264 z m -0.48925,-0.19976 c 0.18272,0.15398 0.0847,0.54861 0.0579,0.75376 -0.12668,-0.16038 -0.0274,-0.52657 -0.0579,-0.75376 z m -0.39942,0.27588 c -0.45976,0.0927 0.20217,0.73874 0.15491,0.16183 -0.008,-0.0784 -0.0689,-0.16425 -0.15491,-0.16175 m 0,-0.0762 c 0.53548,0.0229 0.0809,0.95772 -0.22514,0.4264 -0.0799,-0.16793 0.006,-0.44314 0.22514,-0.4264 z m -0.4868,0.0961 c -0.0625,-0.16476 0.0794,-0.45885 0.09,-0.12059 -0.0239,0.26428 0.11747,0.64725 -0.22523,0.59616 -0.43366,0.0367 -0.28113,-0.79293 0.1054,-0.51731 l 0.0299,0.0419 m -0.30616,0.19092 c 0.047,0.51755 0.63135,-0.23866 0.10766,-0.19898 -0.0793,0.0264 -0.13034,0.11753 -0.10766,0.19898 z m 2.44043,-1.41901 c 0.29826,-0.46803 0.54607,0.50725 0.27992,0.36136 0.16147,-0.25014 -0.25659,-0.58875 -0.25486,-0.19318 0.0619,0.20787 -0.16304,0.36286 -0.0814,0.0576 0.0107,-0.40895 -0.3951,-0.2098 -0.28228,0.0968 -0.10398,0.30793 -0.19195,-0.59655 0.0362,-0.3839 0.11037,-0.0424 0.26328,-0.11929 0.30249,0.062 m -1.07,0.22585 c -0.0292,-0.18312 0.0291,-0.522 0.10111,-0.12385 -0.10501,0.40792 0.38701,0.2743 0.27403,-0.0627 0.0564,-0.3908 0.20452,0.56128 -0.0268,0.36504 -0.17034,0.0747 -0.37234,0.0484 -0.34922,-0.17885 m -0.16355,-0.31494 c -0.0882,0.10339 -0.47525,0.0905 -0.12796,0.20033 0.32998,0.11579 -0.0901,0.56917 -0.25377,0.26243 0.35714,0.0875 0.26894,-0.20613 0.0291,-0.26075 -0.0991,-0.20406 0.219,-0.31306 0.35275,-0.20238 m -0.89668,0.44906 c 0.0709,0.22245 -0.11848,0.41831 -0.0905,0.067 -0.0102,-0.29611 -0.0793,-0.68343 0.34185,-0.49802 0.37303,0.11125 0.0193,0.78296 -0.25134,0.43095 m 0.30567,-0.19091 c -0.0477,-0.51709 -0.63035,0.23885 -0.1077,0.199 0.0793,-0.0265 0.1303,-0.11753 0.1077,-0.199 z m -0.66993,-0.2739 c 0.24336,0.0802 0.006,0.86052 -0.008,0.29994 0.004,-0.10009 0.0107,-0.19945 0.008,-0.29994 z m 0,-0.21289 c 0.22926,-0.0249 -0.0564,0.25727 0,0 z m 2.58203,-0.93213 c 0.29827,-0.46803 0.54607,0.50727 0.27992,0.36136 0.16146,-0.25013 -0.25657,-0.58874 -0.25484,-0.19316 0.0618,0.20786 -0.16306,0.36284 -0.0814,0.0576 0.0107,-0.40895 -0.3951,-0.2098 -0.28228,0.0968 -0.10398,0.30793 -0.19195,-0.59655 0.0363,-0.38389 0.11037,-0.0424 0.26329,-0.11932 0.30249,0.062 m -0.57342,0.14577 c -0.15244,0.0463 -0.6328,0.0553 -0.24172,0.21831 0.48594,0.0499 -0.34396,0.21764 -0.26091,-0.1708 -0.08,-0.37142 0.52507,-0.43399 0.50275,-0.0476 m -0.0898,-0.0264 c 0.0121,-0.34938 -0.52298,0.0801 -0.066,1.6e-4 0.022,-3e-5 0.0441,-7e-5 0.0661,-10e-5 m -0.4519,-0.14058 c -0.31132,-0.1929 -0.23109,0.78642 -0.32231,0.2231 -0.003,-0.21839 -0.0409,-0.33204 0.20369,-0.28978 0.0533,-0.0761 0.16541,-0.007 0.11871,0.0664 m -0.71627,-0.0206 c -0.45977,0.0927 0.20216,0.73875 0.1549,0.16183 -0.008,-0.0784 -0.0689,-0.16424 -0.1549,-0.16175 m 0,-0.0762 c 0.53548,0.0229 0.0809,0.95772 -0.22514,0.4264 -0.0799,-0.16794 0.006,-0.44314 0.22514,-0.4264 z m -0.74706,-0.169 c 0.25031,0.19128 -0.10354,0.79515 0.43395,0.67146 -0.24652,0.23651 -0.54896,-0.0523 -0.43399,-0.36033 0,-0.10371 0,-0.20743 0,-0.31114"
+       id="path3041"
+       style="fill:#000000;fill-opacity:1;stroke:none" />
     <path
-       style="fill:none;stroke:#878787;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
        d="m 789.74329,687.77624 0,2.35938 2.34375,0"
        id="path7894"
-       inkscape:connector-curvature="0" />
+       style="fill:none;stroke:#878787;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
   </g>
 </svg>
index d77b879..3918bef 100644 (file)
@@ -1,87 +1,14 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
    width="10"
    height="10"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="external-link-ltr-icon.svg"
-   inkscape:export-filename="/run/user/1000/gvfs/sftp:host=users.v-lo.krakow.pl,user=m4tx/home/WWW/m4tx/WWW/Wikimedia/skins/vector/images/external-link-ltr-icon.png"
-   inkscape:export-xdpi="144.13724"
-   inkscape:export-ydpi="144.13724">
-  <defs
-     id="defs4">
-    <marker
-       inkscape:stockid="Club"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Club"
-       style="overflow:visible">
-      <path
-         id="path3996"
-         d="M -1.5971367,-7.0977635 C -3.4863874,-7.0977635 -5.0235187,-5.5606321 -5.0235187,-3.6713813 C -5.0235187,-3.0147015 -4.7851656,-2.4444556 -4.4641095,-1.9232271 C -4.5028609,-1.8911157 -4.5437814,-1.8647646 -4.5806531,-1.8299921 C -5.2030765,-2.6849849 -6.1700514,-3.2751330 -7.3077730,-3.2751330 C -9.1970245,-3.2751331 -10.734155,-1.7380016 -10.734155,0.15124914 C -10.734155,2.0404999 -9.1970245,3.5776313 -7.3077730,3.5776313 C -6.3143268,3.5776313 -5.4391540,3.1355702 -4.8137404,2.4588126 C -4.9384274,2.8137041 -5.0235187,3.1803000 -5.0235187,3.5776313 C -5.0235187,5.4668819 -3.4863874,7.0040135 -1.5971367,7.0040135 C 0.29211394,7.0040135 1.8292454,5.4668819 1.8292454,3.5776313 C 1.8292454,2.7842354 1.5136868,2.0838028 1.0600576,1.5031550 C 2.4152718,1.7663868 3.7718375,2.2973711 4.7661444,3.8340272 C 4.0279463,3.0958289 3.5540908,1.7534117 3.5540908,-0.058529361 L 2.9247554,-0.10514681 L 3.5074733,-0.12845553 C 3.5074733,-1.9403966 3.9580199,-3.2828138 4.6962183,-4.0210121 C 3.7371277,-2.5387813 2.4390549,-1.9946496 1.1299838,-1.7134486 C 1.5341802,-2.2753578 1.8292454,-2.9268556 1.8292454,-3.6713813 C 1.8292454,-5.5606319 0.29211394,-7.0977635 -1.5971367,-7.0977635 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:0.74587913pt"
-         transform="scale(0.6)" />
-    </marker>
-    <marker
-       inkscape:stockid="DiamondM"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="DiamondM"
-       style="overflow:visible">
-      <path
-         id="path3849"
-         d="M 0,-7.0710768 L -7.0710894,0 L 0,7.0710589 L 7.0710462,0 L 0,-7.0710768 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
-         transform="scale(0.4)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lstart"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Lstart"
-       style="overflow:visible">
-      <path
-         id="path3767"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
-         transform="scale(0.8) translate(12.5,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.627417"
-     inkscape:cx="11.725312"
-     inkscape:cy="5.6780159"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     inkscape:window-width="1920"
-     inkscape:window-height="1041"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1" />
+   id="svg2">
   <metadata
      id="metadata7">
     <rdf:RDF>
     </rdf:RDF>
   </metadata>
   <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-826.42859,-698.79077)">
+     transform="translate(-826.42859,-698.79077)"
+     id="layer1">
     <rect
-       style="fill:#ffffff;stroke:#0066cc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
-       id="rect2996"
        width="5.9821429"
        height="5.9821429"
        x="826.92859"
        y="702.30865"
-       inkscape:export-filename="/home/m4tx/Pulpit/eheheh.png"
-       inkscape:export-xdpi="90.085777"
-       inkscape:export-ydpi="90.085777" />
+       id="rect2996"
+       style="fill:#ffffff;fill-opacity:1;stroke:#0066cc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
     <g
-       id="g4815"
        transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,762.87,-359.88339)"
-       inkscape:export-filename="/home/m4tx/Pulpit/eheheh.png"
-       inkscape:export-xdpi="90.085777"
-       inkscape:export-ydpi="90.085777">
+       id="g4815">
       <path
-         sodipodi:nodetypes="cccccccccc"
-         inkscape:connector-curvature="0"
-         id="path4777"
          d="m 796.90819,700.28317 3.70127,-3.70126 3.81174,3.81175 -0.0189,2.20336 -1.85234,0 0,3.8543 -3.80233,0 0,-3.97108 -1.8536,0 z"
+         id="path4777"
          style="fill:#0066ff;fill-opacity:1;stroke:none" />
       <path
-         sodipodi:nodetypes="cccccccc"
-         inkscape:connector-curvature="0"
-         id="path4779"
          d="m 800.60946,698.00244 3.46986,3.43865 -2.5702,0 0,4.07436 -1.7362,0 0,-4.07436 -2.61754,-3.6e-4 z"
+         id="path4779"
          style="fill:#ffffff;fill-opacity:1;stroke:none" />
     </g>
   </g>
index 7ddf89e..326a425 100644 (file)
@@ -7,81 +7,10 @@
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
    width="10"
    height="10"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="external-link-ltr-icon.svg"
-   inkscape:export-filename="/run/user/1000/gvfs/sftp:host=users.v-lo.krakow.pl,user=m4tx/home/WWW/m4tx/WWW/Wikimedia/skins/vector/images/external-link-ltr-icon.png"
-   inkscape:export-xdpi="144.13724"
-   inkscape:export-ydpi="144.13724">
-  <defs
-     id="defs4">
-    <marker
-       inkscape:stockid="Club"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Club"
-       style="overflow:visible">
-      <path
-         id="path3996"
-         d="M -1.5971367,-7.0977635 C -3.4863874,-7.0977635 -5.0235187,-5.5606321 -5.0235187,-3.6713813 C -5.0235187,-3.0147015 -4.7851656,-2.4444556 -4.4641095,-1.9232271 C -4.5028609,-1.8911157 -4.5437814,-1.8647646 -4.5806531,-1.8299921 C -5.2030765,-2.6849849 -6.1700514,-3.2751330 -7.3077730,-3.2751330 C -9.1970245,-3.2751331 -10.734155,-1.7380016 -10.734155,0.15124914 C -10.734155,2.0404999 -9.1970245,3.5776313 -7.3077730,3.5776313 C -6.3143268,3.5776313 -5.4391540,3.1355702 -4.8137404,2.4588126 C -4.9384274,2.8137041 -5.0235187,3.1803000 -5.0235187,3.5776313 C -5.0235187,5.4668819 -3.4863874,7.0040135 -1.5971367,7.0040135 C 0.29211394,7.0040135 1.8292454,5.4668819 1.8292454,3.5776313 C 1.8292454,2.7842354 1.5136868,2.0838028 1.0600576,1.5031550 C 2.4152718,1.7663868 3.7718375,2.2973711 4.7661444,3.8340272 C 4.0279463,3.0958289 3.5540908,1.7534117 3.5540908,-0.058529361 L 2.9247554,-0.10514681 L 3.5074733,-0.12845553 C 3.5074733,-1.9403966 3.9580199,-3.2828138 4.6962183,-4.0210121 C 3.7371277,-2.5387813 2.4390549,-1.9946496 1.1299838,-1.7134486 C 1.5341802,-2.2753578 1.8292454,-2.9268556 1.8292454,-3.6713813 C 1.8292454,-5.5606319 0.29211394,-7.0977635 -1.5971367,-7.0977635 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:0.74587913pt"
-         transform="scale(0.6)" />
-    </marker>
-    <marker
-       inkscape:stockid="DiamondM"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="DiamondM"
-       style="overflow:visible">
-      <path
-         id="path3849"
-         d="M 0,-7.0710768 L -7.0710894,0 L 0,7.0710589 L 7.0710462,0 L 0,-7.0710768 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
-         transform="scale(0.4)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lstart"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Lstart"
-       style="overflow:visible">
-      <path
-         id="path3767"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
-         transform="scale(0.8) translate(12.5,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.627417"
-     inkscape:cx="11.725312"
-     inkscape:cy="5.6780159"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     inkscape:window-width="1920"
-     inkscape:window-height="1041"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1" />
+   id="svg2">
   <metadata
      id="metadata7">
     <rdf:RDF>
     </rdf:RDF>
   </metadata>
   <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-826.42859,-698.79077)">
+     transform="translate(-826.42859,-698.79077)"
+     id="layer1">
     <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#0066cc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       id="rect2996"
        width="5.9821429"
        height="5.9821429"
        x="-835.92859"
        y="702.30865"
-       inkscape:export-filename="/home/m4tx/Pulpit/eheheh.png"
-       inkscape:export-xdpi="90.085777"
-       inkscape:export-ydpi="90.085777"
-       transform="scale(-1,1)" />
+       transform="scale(-1,1)"
+       id="rect2996"
+       style="fill:#ffffff;fill-opacity:1;stroke:#0066cc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
     <g
-       id="g4815"
        transform="matrix(-0.70710678,0.70710678,0.70710678,0.70710678,899.98717,-359.88339)"
-       inkscape:export-filename="/home/m4tx/Pulpit/eheheh.png"
-       inkscape:export-xdpi="90.085777"
-       inkscape:export-ydpi="90.085777">
+       id="g4815">
       <path
-         sodipodi:nodetypes="cccccccccc"
-         inkscape:connector-curvature="0"
-         id="path4777"
          d="m 796.90819,700.28317 3.70127,-3.70126 3.81174,3.81175 -0.0189,2.20336 -1.85234,0 0,3.8543 -3.80233,0 0,-3.97108 -1.8536,0 z"
+         id="path4777"
          style="fill:#0066ff;fill-opacity:1;stroke:none" />
       <path
-         sodipodi:nodetypes="cccccccc"
-         inkscape:connector-curvature="0"
-         id="path4779"
          d="m 800.60946,698.00244 3.46986,3.43865 -2.5702,0 0,4.07436 -1.7362,0 0,-4.07436 -2.61754,-3.6e-4 z"
+         id="path4779"
          style="fill:#ffffff;fill-opacity:1;stroke:none" />
     </g>
   </g>
index cd2106d..98d9041 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
@@ -8,83 +6,34 @@
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
    width="10"
    height="10"
-   id="svg7339"
-   version="1.1"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="Nowy dokument 30">
+   id="svg7339">
   <defs
      id="defs7341">
     <linearGradient
        id="linearGradient7918">
       <stop
-         style="stop-color:#e2e2e2;stop-opacity:1;"
-         offset="0"
-         id="stop7920" />
-      <stop
-         style="stop-color:#f8f8f8;stop-opacity:1;"
-         offset="1"
-         id="stop7922" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient7902">
-      <stop
-         style="stop-color:#e2e2e2;stop-opacity:1;"
-         offset="0"
-         id="stop7904" />
+         id="stop7920"
+         style="stop-color:#e2e2e2;stop-opacity:1"
+         offset="0" />
       <stop
-         style="stop-color:#e2e2e2;stop-opacity:1;"
-         offset="1"
-         id="stop7906" />
+         id="stop7922"
+         style="stop-color:#f8f8f8;stop-opacity:1"
+         offset="1" />
     </linearGradient>
     <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient7918"
-       id="radialGradient7924"
        cx="-16.71875"
        cy="3.344311"
+       r="2"
        fx="-16.71875"
        fy="3.344311"
-       r="2"
-       gradientTransform="matrix(1.4065972,0,0,2.1428629,6.7977966,-4.7132748)"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient7918"
        id="radialGradient7931"
+       xlink:href="#linearGradient7918"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.4065972,0,0,2.1428629,6.7977966,-4.7132748)"
-       cx="-16.71875"
-       cy="3.344311"
-       fx="-16.71875"
-       fy="3.344311"
-       r="2" />
+       gradientTransform="matrix(1.4065972,0,0,2.1428629,6.7977966,-4.7132748)" />
   </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.627417"
-     inkscape:cx="1.5361037"
-     inkscape:cy="9.1135498"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     inkscape:window-width="1920"
-     inkscape:window-height="1014"
-     inkscape:window-x="0"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1" />
   <metadata
      id="metadata7344">
     <rdf:RDF>
     </rdf:RDF>
   </metadata>
   <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-783.57141,-687.36218)">
+     transform="translate(-783.57141,-687.36218)"
+     id="layer1">
     <g
-       id="g7926"
-       transform="translate(19.984375,0.08593751)">
+       transform="translate(19.984375,0.08593751)"
+       id="g7926">
       <path
+         d="m -18.5,0.40625 0,9.09375 7.03125,0 0,-6.84375 -2.25,-2.25 -4.78125,0 z"
          transform="translate(783.57141,687.36218)"
          id="rect7358"
-         d="m -18.5,0.40625 0,9.09375 7.03125,0 0,-6.84375 -2.25,-2.25 -4.78125,0 z"
-         style="fill:#ffffff;fill-opacity:1;stroke:#878787;stroke-width:0.89999998;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-         inkscape:connector-curvature="0" />
+         style="fill:#ffffff;fill-opacity:1;stroke:#878787;stroke-width:0.89999998;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
       <path
-         id="rect7896"
-         transform="translate(783.57141,687.36218)"
          d="m -17.03125,2 0,6.09375 4,0 0,-5.28125 -0.84375,0 0,-0.8125 -3.15625,0 z"
-         style="fill:url(#radialGradient7931);fill-opacity:1;stroke:none"
-         inkscape:connector-curvature="0" />
+         transform="translate(783.57141,687.36218)"
+         id="rect7896"
+         style="fill:url(#radialGradient7931);fill-opacity:1;stroke:none" />
       <path
+         d="m -13.8125,0.32812497 0,2.35937503 2.34375,0"
          transform="translate(783.57141,687.36218)"
-         inkscape:connector-curvature="0"
          id="path7894"
-         d="m -13.8125,0.32812497 0,2.35937503 2.34375,0"
          style="fill:none;stroke:#878787;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
     </g>
   </g>
index 1c40d4a..bad5daf 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
@@ -8,72 +6,34 @@
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
    width="10"
    height="10"
-   id="svg3813"
-   version="1.1"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="lock-icon.svg">
+   id="svg3813">
   <defs
      id="defs3815">
     <linearGradient
        id="linearGradient4348">
       <stop
-         style="stop-color:#fff8bb;stop-opacity:1;"
-         offset="0"
-         id="stop4350" />
+         id="stop4350"
+         style="stop-color:#fff8bb;stop-opacity:1"
+         offset="0" />
       <stop
-         style="stop-color:#e9d84d;stop-opacity:1;"
-         offset="1"
-         id="stop4352" />
+         id="stop4352"
+         style="stop-color:#e9d84d;stop-opacity:1"
+         offset="1" />
     </linearGradient>
     <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4348"
-       id="radialGradient4354"
        cx="806.97711"
        cy="720.04266"
+       r="4.5721774"
        fx="806.97711"
        fy="720.04266"
-       r="4.5721774"
-       gradientTransform="matrix(0.66177697,-3.2424834e-7,5.5632116e-7,1.1354276,273.09596,-96.976308)"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4348"
        id="radialGradient4394"
+       xlink:href="#linearGradient4348"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.66177697,-3.2424834e-7,5.5632116e-7,1.1354276,273.09596,-96.976308)"
-       cx="806.97711"
-       cy="720.04266"
-       fx="806.97711"
-       fy="720.04266"
-       r="4.5721774" />
+       gradientTransform="matrix(0.66177697,-3.2424834e-7,5.5632116e-7,1.1354276,273.09596,-96.976308)" />
   </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="5.6568542"
-     inkscape:cx="-65.758796"
-     inkscape:cy="-20.849434"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     inkscape:window-width="1920"
-     inkscape:window-height="1041"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1" />
   <metadata
      id="metadata3818">
     <rdf:RDF>
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
+        <dc:title></dc:title>
       </cc:Work>
     </rdf:RDF>
   </metadata>
   <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-817.85712,-715.93359)">
+     transform="translate(-817.85712,-715.93359)"
+     id="layer1">
     <g
-       id="g4389"
-       transform="translate(14.984745,-0.12063576)">
+       transform="translate(14.984745,-0.12063576)"
+       id="g4389">
       <rect
-         y="719.4939"
-         x="803.37238"
-         height="6.0609155"
          width="8.1443548"
+         height="6.0609155"
+         x="803.37238"
+         y="719.4939"
          id="rect3832"
          style="fill:url(#radialGradient4394);fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:2;stroke-opacity:1;stroke-dasharray:none" />
       <path
-         sodipodi:end="6.2831853"
-         sodipodi:start="3.1415927"
+         d="m 2.4622467,2.0134813 a 2.9673231,1.420527 0 0 1 5.9346461,10e-8 l -2.9673231,0 z"
          transform="matrix(0.98668274,0,0,2.0515802,802.05109,715.32099)"
-         d="m 2.4622467,2.0134813 c 0,-0.7845354 1.3285159,-1.42052694 2.9673232,-1.4205269 1.6388072,3e-8 2.9673229,0.6359916 2.9673229,1.420527 l -2.9673231,0 z"
-         sodipodi:ry="1.420527"
-         sodipodi:rx="2.9673231"
-         sodipodi:cy="2.0134814"
-         sodipodi:cx="5.4295697"
          id="path4346"
-         style="fill:none;stroke:#888a85;stroke-width:0.68014622;stroke-linejoin:miter;stroke-miterlimit:2;stroke-opacity:1;stroke-dasharray:none"
-         sodipodi:type="arc" />
+         style="fill:none;stroke:#888a85;stroke-width:0.68014622;stroke-linejoin:miter;stroke-miterlimit:2;stroke-opacity:1;stroke-dasharray:none" />
       <path
-         style="fill:none;stroke:#ac5f08;stroke-width:1.04513526px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.69072164"
          d="m 807.32587,723.57494 0,-1.12645"
          id="path4368"
-         inkscape:connector-curvature="0" />
+         style="fill:none;stroke:#ac5f08;stroke-width:1.04513526px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.69072164" />
     </g>
   </g>
 </svg>
index 43b4ce8..cab6304 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
@@ -8,94 +6,34 @@
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
    width="10"
    height="10"
-   id="svg4396"
-   version="1.1"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="Nowy dokument 10">
+   id="svg4396">
   <defs
      id="defs4398">
     <linearGradient
        id="linearGradient4947">
       <stop
-         style="stop-color:#d2d2d2;stop-opacity:1;"
-         offset="0"
-         id="stop4949" />
-      <stop
-         style="stop-color:#f6f6f6;stop-opacity:0;"
-         offset="1"
-         id="stop4951" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient4927">
-      <stop
-         style="stop-color:#888a85;stop-opacity:1;"
-         offset="0"
-         id="stop4929" />
+         id="stop4949"
+         style="stop-color:#d2d2d2;stop-opacity:1"
+         offset="0" />
       <stop
-         style="stop-color:#888a85;stop-opacity:0;"
-         offset="1"
-         id="stop4931" />
+         id="stop4951"
+         style="stop-color:#f6f6f6;stop-opacity:0"
+         offset="1" />
     </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4927"
-       id="linearGradient4933"
-       x1="847.07153"
-       y1="696.06909"
-       x2="847.07153"
-       y2="699.29285"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(14,0)" />
     <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4947"
-       id="radialGradient4953"
        cx="861.14233"
        cy="699.01233"
+       r="4.9871311"
        fx="861.14233"
        fy="699.01233"
-       r="4.987131"
-       gradientTransform="matrix(1.1817158,0,0,1.1856764,-156.48316,-109.77743)"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4947"
        id="radialGradient4962"
+       xlink:href="#linearGradient4947"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1817158,0,0,1.1856764,-156.48316,-109.77743)"
-       cx="861.14233"
-       cy="699.01233"
-       fx="861.14233"
-       fy="699.01233"
-       r="4.987131" />
+       gradientTransform="matrix(1.1817158,0,0,1.1856764,-156.48316,-109.77743)" />
   </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="8"
-     inkscape:cx="17.964337"
-     inkscape:cy="-3.5009398"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     inkscape:window-width="1920"
-     inkscape:window-height="1014"
-     inkscape:window-x="0"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1" />
   <metadata
      id="metadata4401">
     <rdf:RDF>
     </rdf:RDF>
   </metadata>
   <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-832.14288,-690.2193)">
+     transform="translate(-832.14288,-690.2193)"
+     id="layer1">
     <g
-       id="g4957"
-       transform="translate(-23.99948,-20.005085)">
+       transform="translate(-23.99948,-20.005085)"
+       id="g4957">
       <path
-         inkscape:connector-curvature="0"
-         id="path4415"
          d="m 856.64003,714.98211 4.51344,-4.27677 4.49122,4.2557 0,4.78239 -8.96019,0 z"
+         id="path4415"
          style="fill:url(#radialGradient4962);fill-opacity:1;stroke:#888a85;stroke-width:0.96960205px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
       <path
-         sodipodi:nodetypes="ccc"
-         style="fill:#a8a7a3;fill-opacity:1;stroke:none"
          d="m 858.18557,715.14414 2.96409,-2.80866 2.94949,2.79482"
          id="path4937"
-         inkscape:connector-curvature="0" />
+         style="fill:#a8a7a3;fill-opacity:1;stroke:none" />
       <path
-         sodipodi:nodetypes="ccccc"
-         inkscape:connector-curvature="0"
-         id="path4955"
          d="m 857.89337,719.26617 3.26025,-3.14859 3.23877,3.11734 -3.24112,-1.90625 z"
+         id="path4955"
          style="fill:#888a85;fill-opacity:1;stroke:none" />
     </g>
   </g>
index b8f2102..e5514a7 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
    width="10"
    height="10"
-   id="svg4983"
-   version="1.1"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="news-icon.svg">
+   id="svg4983">
   <defs
      id="defs4985">
     <linearGradient
-       inkscape:collect="always"
        id="linearGradient5528">
       <stop
-         style="stop-color:#cccccc;stop-opacity:1;"
-         offset="0"
-         id="stop5530" />
+         id="stop5530"
+         style="stop-color:#cccccc;stop-opacity:1"
+         offset="0" />
       <stop
-         style="stop-color:#cccccc;stop-opacity:0;"
-         offset="1"
-         id="stop5532" />
+         id="stop5532"
+         style="stop-color:#cccccc;stop-opacity:0"
+         offset="1" />
     </linearGradient>
     <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5528"
-       id="linearGradient5534"
        x1="902.61218"
        y1="696.32751"
        x2="902.61218"
        y2="694.04303"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5528"
-       id="linearGradient5566"
-       gradientUnits="userSpaceOnUse"
-       x1="902.61218"
-       y1="696.32751"
-       x2="902.61218"
-       y2="694.04303" />
-    <linearGradient
-       inkscape:collect="always"
+       id="linearGradient3824"
        xlink:href="#linearGradient5528"
-       id="linearGradient3048"
        gradientUnits="userSpaceOnUse"
-       x1="902.61218"
-       y1="696.32751"
-       x2="902.61218"
-       y2="694.04303"
        gradientTransform="translate(-19.98763,0.00341)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5528"
-       id="linearGradient3799"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-29.98763,0.00341)"
-       x1="902.61218"
-       y1="696.32751"
-       x2="902.61218"
-       y2="694.04303" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5528"
-       id="linearGradient3821"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-907.84475,-687.35877)"
-       x1="902.61218"
-       y1="696.32751"
-       x2="902.61218"
-       y2="694.04303" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5528"
-       id="linearGradient3824"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-19.98763,0.00341)"
-       x1="902.61218"
-       y1="696.32751"
-       x2="902.61218"
-       y2="694.04303" />
   </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="45.254834"
-     inkscape:cx="0.50343757"
-     inkscape:cy="4.9811997"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     inkscape:window-width="1920"
-     inkscape:window-height="1041"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1" />
   <metadata
      id="metadata4988">
     <rdf:RDF>
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
+        <dc:title></dc:title>
       </cc:Work>
     </rdf:RDF>
   </metadata>
   <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-877.85712,-687.36218)">
-    <g
-       style="font-size:41.13991928px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-       id="text5536">
-      <path
-         inkscape:connector-curvature="0"
-         d="m 879.87841,689.39933 0.19335,0 0,0.60364 0.33948,0 0,0.14614 -0.53283,0 0,-0.74978"
-         style="font-size:1.02849805px;font-weight:bold;-inkscape-font-specification:Sans Bold"
-         id="path3051" />
-      <path
-         inkscape:connector-curvature="0"
-         d="m 880.52524,689.58665 0.17978,0 0,0.56246 -0.17978,0 0,-0.56246 m 0,-0.21896 0.17978,0 0,0.14664 -0.17978,0 0,-0.14664"
-         style="font-size:1.02849805px;font-weight:bold;-inkscape-font-specification:Sans Bold"
-         id="path3053" />
-      <path
-         inkscape:connector-curvature="0"
-         d="m 881.05857,690.06775 0,0.29529 -0.17979,0 0,-0.77639 0.17979,0 0,0.0824 c 0.0248,-0.0328 0.0522,-0.0569 0.0824,-0.0723 0.0301,-0.0157 0.0648,-0.0236 0.10396,-0.0236 0.0693,0 0.12621,0.0276 0.17074,0.0829 0.0445,0.0549 0.0668,0.12572 0.0668,0.21243 0,0.0867 -0.0223,0.15769 -0.0668,0.21293 -0.0445,0.0549 -0.10144,0.0824 -0.17074,0.0824 -0.0392,0 -0.0738,-0.008 -0.10396,-0.0231 -0.0301,-0.0157 -0.0576,-0.04 -0.0824,-0.0728 m 0.11952,-0.36409 c -0.0385,0 -0.0681,0.0142 -0.0889,0.0427 -0.0204,0.0281 -0.0306,0.0688 -0.0306,0.12203 0,0.0532 0.0102,0.0941 0.0306,0.12254 0.0208,0.0281 0.0504,0.0422 0.0889,0.0422 0.0385,0 0.0678,-0.0141 0.0879,-0.0422 0.0204,-0.0281 0.0306,-0.069 0.0306,-0.12254 0,-0.0536 -0.0102,-0.0944 -0.0306,-0.12253 -0.0201,-0.0281 -0.0494,-0.0422 -0.0879,-0.0422"
-         style="font-size:1.02849805px;font-weight:bold;-inkscape-font-specification:Sans Bold"
-         id="path3055" />
-      <path
-         inkscape:connector-curvature="0"
-         d="m 882.05543,689.60423 0,0.13659 c -0.0385,-0.0161 -0.0757,-0.0281 -0.11149,-0.0362 -0.0358,-0.008 -0.0696,-0.0121 -0.10144,-0.0121 -0.0341,0 -0.0596,0.004 -0.0763,0.0131 -0.0164,0.008 -0.0246,0.0214 -0.0246,0.0392 0,0.0144 0.006,0.0255 0.0186,0.0332 0.0127,0.008 0.0353,0.0134 0.0678,0.0171 l 0.0316,0.005 c 0.0921,0.0117 0.15401,0.031 0.18582,0.0578 0.0318,0.0268 0.0477,0.0688 0.0477,0.12605 -10e-6,0.0599 -0.0221,0.10496 -0.0663,0.13509 -0.0442,0.0301 -0.11015,0.0452 -0.19787,0.0452 -0.0372,0 -0.0757,-0.003 -0.11551,-0.009 -0.0395,-0.006 -0.0802,-0.0144 -0.12203,-0.0261 l 0,-0.1366 c 0.0358,0.0174 0.0725,0.0305 0.10998,0.0392 0.0378,0.009 0.0762,0.0131 0.115,0.0131 0.0352,0 0.0616,-0.005 0.0793,-0.0146 0.0178,-0.01 0.0266,-0.0241 0.0266,-0.0432 0,-0.0161 -0.006,-0.028 -0.0186,-0.0357 -0.0121,-0.008 -0.0363,-0.0142 -0.0728,-0.0186 l -0.0316,-0.004 c -0.08,-0.01 -0.1361,-0.0286 -0.16824,-0.0557 -0.0321,-0.0271 -0.0482,-0.0683 -0.0482,-0.12354 0,-0.0596 0.0204,-0.10379 0.0613,-0.13258 0.0408,-0.0288 0.10345,-0.0432 0.18782,-0.0432 0.0331,0 0.068,0.003 0.10446,0.008 0.0365,0.005 0.0762,0.0129 0.11902,0.0236"
-         style="font-size:1.02849805px;font-weight:bold;-inkscape-font-specification:Sans Bold"
-         id="path3057" />
-      <path
-         inkscape:connector-curvature="0"
-         d="m 882.22266,689.93015 0,-0.3435 0.18079,0 0,0.0563 c 0,0.0305 -1.7e-4,0.0688 -5e-4,0.115 -3.3e-4,0.0459 -5e-4,0.0765 -5e-4,0.0919 0,0.0452 10e-4,0.0778 0.004,0.0979 0.002,0.0198 0.006,0.0342 0.0121,0.0432 0.007,0.0117 0.0169,0.0208 0.0286,0.0271 0.0121,0.006 0.0258,0.01 0.0412,0.01 0.0375,0 0.067,-0.0144 0.0884,-0.0432 0.0214,-0.0288 0.0321,-0.0688 0.0321,-0.12003 l 0,-0.27771 0.17978,0 0,0.56246 -0.17978,0 0,-0.0814 c -0.0271,0.0328 -0.0559,0.0571 -0.0864,0.0728 -0.0301,0.0154 -0.0634,0.0231 -0.0999,0.0231 -0.0649,0 -0.1145,-0.0199 -0.14865,-0.0598 -0.0338,-0.0398 -0.0507,-0.0978 -0.0507,-0.17376"
-         style="font-size:1.02849805px;font-weight:bold;-inkscape-font-specification:Sans Bold"
-         id="path3059" />
-      <path
-         inkscape:connector-curvature="0"
-         d="m 883.48317,689.68006 c 0.0228,-0.0348 0.0497,-0.0613 0.0809,-0.0793 0.0315,-0.0184 0.066,-0.0276 0.10345,-0.0276 0.0646,0 0.11383,0.0199 0.14765,0.0598 0.0338,0.0398 0.0507,0.0978 0.0507,0.17376 l 0,0.3425 -0.18079,0 0,-0.29328 c 3.3e-4,-0.004 5e-4,-0.009 5e-4,-0.0136 3.3e-4,-0.005 5e-4,-0.0114 5e-4,-0.0201 0,-0.0398 -0.006,-0.0686 -0.0176,-0.0864 -0.0117,-0.0181 -0.0306,-0.0271 -0.0567,-0.0271 -0.0342,0 -0.0606,0.0141 -0.0794,0.0422 -0.0184,0.0281 -0.028,0.0688 -0.0286,0.12203 l 0,0.27621 -0.18079,0 0,-0.29328 c 0,-0.0623 -0.005,-0.10228 -0.0161,-0.12003 -0.0107,-0.0181 -0.0298,-0.0271 -0.0573,-0.0271 -0.0345,0 -0.0611,0.0142 -0.0798,0.0427 -0.0187,0.0281 -0.0281,0.0685 -0.0281,0.12103 l 0,0.27671 -0.18079,0 0,-0.56246 0.18079,0 0,0.0824 c 0.0221,-0.0318 0.0474,-0.0557 0.0758,-0.0718 0.0288,-0.0161 0.0604,-0.0241 0.0949,-0.0241 0.0388,0 0.0732,0.009 0.10295,0.0281 0.0298,0.0187 0.0524,0.045 0.0678,0.0788"
-         style="font-size:1.02849805px;font-weight:bold;-inkscape-font-specification:Sans Bold"
-         id="path3061" />
-    </g>
-    <g
-       transform="scale(1.0447384,0.95717741)"
-       style="font-size:48.46436691px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-       id="text5540">
-      <path
-         inkscape:connector-curvature="0"
-         d="m 847.3858,720.32852 -0.1621,0.43956 0.3248,0 -0.1627,-0.43956 m -0.0674,-0.11773 0.13548,0 0.33662,0.88327 -0.12423,0 -0.0805,-0.22659 -0.39815,0 -0.0805,0.22659 -0.12601,0 0.33721,-0.88327"
-         style="font-size:1.21160913px;-inkscape-font-specification:Sans"
-         id="path3064" />
-    </g>
-    <g
-       style="font-size:1px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-       id="text5544">
-      <path
-         inkscape:connector-curvature="0"
-         d="m 883.88953,691.50378 0.13281,0 0.32324,0.60987 0,-0.60987 0.0957,0 0,0.72901 -0.13281,0 -0.32324,-0.60987 0,0.60987 -0.0957,0 0,-0.72901"
-         id="path3067" />
-      <path
-         inkscape:connector-curvature="0"
-         d="m 885.10144,691.93689 0,0.0439 -0.41309,0 c 0.004,0.0619 0.0225,0.10905 0.0557,0.14161 0.0335,0.0322 0.0801,0.0483 0.13965,0.0483 0.0345,0 0.0679,-0.004 0.10009,-0.0127 0.0326,-0.008 0.0648,-0.0212 0.0967,-0.0381 l 0,0.085 c -0.0322,0.0137 -0.0653,0.0241 -0.0991,0.0312 -0.0339,0.007 -0.0682,0.0107 -0.10302,0.0107 -0.0872,0 -0.15642,-0.0254 -0.20752,-0.0762 -0.0508,-0.0508 -0.0762,-0.11947 -0.0762,-0.20606 0,-0.0895 0.0241,-0.16048 0.0723,-0.21289 0.0485,-0.0527 0.11377,-0.0791 0.1958,-0.0791 0.0736,0 0.13167,0.0238 0.17432,0.0713 0.043,0.0472 0.0645,0.11149 0.0645,0.19287 m -0.0898,-0.0264 c -6.5e-4,-0.0492 -0.0145,-0.0884 -0.0415,-0.11767 -0.0267,-0.0293 -0.0622,-0.0439 -0.10644,-0.0439 -0.0501,0 -0.0903,0.0142 -0.12061,0.0425 -0.0299,0.0283 -0.0472,0.0682 -0.0518,0.11963 l 0.32032,-4.9e-4"
-         id="path3069" />
-      <path
-         inkscape:connector-curvature="0"
-         d="m 885.19666,691.68591 0.0898,0 0.1123,0.42676 0.11182,-0.42676 0.10596,0 0.1123,0.42676 0.11182,-0.42676 0.0898,0 -0.14306,0.54688 -0.10596,0 -0.11768,-0.44824 -0.11816,0.44824 -0.10596,0 -0.14306,-0.54688"
-         id="path3071" />
-    </g>
-    <g
-       style="font-size:1px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-       id="text5548">
-      <path
-         inkscape:connector-curvature="0"
-         d="m 883.88953,693.52722 0.13281,0 0.32324,0.60986 0,-0.60986 0.0957,0 0,0.72901 -0.13281,0 -0.32324,-0.60987 0,0.60987 -0.0957,0 0,-0.72901"
-         id="path3074" />
-      <path
-         inkscape:connector-curvature="0"
-         d="m 885.10144,693.96033 0,0.0439 -0.41309,0 c 0.004,0.0618 0.0225,0.10905 0.0557,0.1416 0.0335,0.0322 0.0801,0.0483 0.13965,0.0483 0.0345,0 0.0679,-0.004 0.10009,-0.0127 0.0326,-0.008 0.0648,-0.0212 0.0967,-0.0381 l 0,0.085 c -0.0322,0.0137 -0.0653,0.0241 -0.0991,0.0312 -0.0339,0.007 -0.0682,0.0108 -0.10302,0.0108 -0.0872,0 -0.15642,-0.0254 -0.20752,-0.0762 -0.0508,-0.0508 -0.0762,-0.11946 -0.0762,-0.20605 0,-0.0895 0.0241,-0.16048 0.0723,-0.21289 0.0485,-0.0527 0.11377,-0.0791 0.1958,-0.0791 0.0736,0 0.13167,0.0238 0.17432,0.0713 0.043,0.0472 0.0645,0.11149 0.0645,0.19287 m -0.0898,-0.0264 c -6.5e-4,-0.0491 -0.0145,-0.0884 -0.0415,-0.11768 -0.0267,-0.0293 -0.0622,-0.0439 -0.10644,-0.0439 -0.0501,0 -0.0903,0.0142 -0.12061,0.0425 -0.0299,0.0283 -0.0472,0.0682 -0.0518,0.11963 l 0.32032,-4.9e-4"
-         id="path3076" />
-      <path
-         inkscape:connector-curvature="0"
-         d="m 885.19666,693.70935 0.0898,0 0.1123,0.42676 0.11182,-0.42676 0.10596,0 0.1123,0.42676 0.11182,-0.42676 0.0898,0 -0.14306,0.54688 -0.10596,0 -0.11768,-0.44825 -0.11816,0.44825 -0.10596,0 -0.14306,-0.54688"
-         id="path3078" />
-    </g>
+     transform="translate(-877.85712,-687.36218)"
+     id="layer1">
+    <path
+       d="m 885.19659,693.70929 c 0.18733,0.11152 0.2171,0.58028 0.28483,0.0765 0.21963,-0.21 0.25265,0.61085 0.31801,0.0641 0.27697,-0.42352 -0.0831,0.827 -0.17686,0.17405 -0.11702,-0.43251 -0.13186,0.58055 -0.33199,0.093 -0.0467,-0.13235 -0.0352,-0.27894 -0.0941,-0.40765 m -0.0951,0.25098 c -0.24545,-0.026 -0.58057,0.20963 -0.14983,0.20815 0.2341,0.24227 -0.5966,0.0435 -0.31586,-0.29597 0.073,-0.29368 0.48945,-0.19996 0.46582,0.0878 m -0.0898,-0.0264 c -0.008,-0.37273 -0.57907,0.10308 -3e-5,6e-5 m -1.12221,-0.4067 c 0.31303,-0.0182 0.47686,0.98363 0.45605,0.28209 0.0542,-0.83126 0.27546,1.00617 -0.15278,0.25362 -0.0894,-0.27779 -0.27195,-0.54907 -0.20757,-0.0888 -0.0326,0.82392 -0.13826,-0.33361 -0.0957,-0.44691 z m 1.30713,-1.84131 c 0.18733,0.11152 0.2171,0.58028 0.28483,0.0765 0.21963,-0.21 0.25265,0.61085 0.31801,0.0641 0.27697,-0.42352 -0.0831,0.827 -0.17686,0.17405 -0.11703,-0.43249 -0.13186,0.58055 -0.33199,0.093 -0.0467,-0.13235 -0.0352,-0.27894 -0.0941,-0.40765 m -0.0951,0.25098 c -0.24545,-0.026 -0.58058,0.20964 -0.14984,0.20816 0.23409,0.24222 -0.5966,0.0434 -0.31584,-0.29607 0.0729,-0.29368 0.48945,-0.19997 0.46581,0.0877 m -0.0898,-0.0264 c -0.008,-0.37272 -0.57905,0.1031 -3e-5,7e-5 m -1.12221,-0.40661 c 0.31303,-0.0182 0.47685,0.98364 0.45605,0.2821 0.0542,-0.83128 0.27546,1.00616 -0.15278,0.25361 -0.0894,-0.27779 -0.27195,-0.54907 -0.20757,-0.0888 -0.0326,0.82392 -0.13826,-0.33361 -0.0957,-0.44691 z m 1.40695,-2.02159 c -0.0925,0.22919 -0.31156,0.57023 0.14418,0.41318 -0.005,-0.13405 -0.10264,-0.27877 -0.14418,-0.41318 z m -0.0704,-0.11269 c 0.29905,0.0855 0.42028,0.62166 0.42088,0.84191 -0.13411,-0.4802 -0.68425,-0.0265 -0.73057,-0.076 0.0832,-0.2616 0.21061,-0.50913 0.3096,-0.76593 m -1.74281,0.31056 c 0.34612,-0.47913 0.56926,0.70098 0.21372,0.36363 0.0724,-0.32969 -0.28365,-0.36875 -0.1668,-0.0222 -0.26673,0.45246 -0.17742,-0.6565 -0.3994,-0.10395 -0.0864,0.678 -0.43164,-0.63601 0.14263,-0.31419 0.0903,0.008 0.17045,-0.0312 0.20982,0.0769 m -1.26048,0.25 c -0.10571,-0.34023 0.21201,-0.48784 0.17971,-0.0655 0.20532,0.47932 0.16846,-0.59018 0.40143,-0.15309 0.19369,0.48548 -0.51086,0.6449 -0.5806,0.21899 m -0.16777,-0.32628 c 0.003,0.21747 -0.51383,0.059 -0.0685,0.22157 0.38953,0.3392 -0.58676,0.41358 -0.309,0.22699 0.52432,-0.0372 -0.45958,-0.30319 0.0896,-0.4819 0.0946,-0.0287 0.2045,-0.0235 0.28796,0.0344 m -0.99688,0.46241 c 0.0892,0.4554 -0.3135,0.24019 -0.17953,-0.10036 -0.28045,-0.78623 1.07442,-0.23273 0.43248,0.1872 -0.0909,0.0271 -0.20018,-0.005 -0.25295,-0.0867 m 0.11952,-0.36409 c -0.39427,0.13009 0.34651,0.51437 0.0773,0.0311 l -0.034,-0.025 -0.0433,-0.006 z m -0.65285,-0.11717 c 0.42856,-0.041 0.0577,0.97963 -0.005,0.32973 0.003,-0.10996 0.007,-0.21971 0.005,-0.32973 z m 0,-0.21896 c 0.43196,-0.11169 -0.0481,0.43831 0,0 z m -0.64683,0.0316 c 0.44435,-0.0237 -0.0875,0.85036 0.53283,0.60364 -0.23411,0.42107 -0.67995,0.0409 -0.53283,-0.33773 0,-0.0886 0,-0.17727 0,-0.26591 z"
+       id="path3078"
+       style="fill:#000000;fill-opacity:1;stroke:none" />
     <rect
-       style="fill:#c0c1be;fill-opacity:1;stroke:#000000;stroke-width:0.10008001;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:2;stroke-opacity:1;stroke-dasharray:none"
-       id="rect5552"
        width="2.8749001"
        height="2.8749392"
        x="879.96875"
-       y="691.46332" />
+       y="691.46332"
+       id="rect5552"
+       style="fill:#c0c1be;fill-opacity:1;stroke:#000000;stroke-width:0.10008001;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:2;stroke-opacity:1;stroke-dasharray:none" />
     <path
-       style="fill:url(#linearGradient3824);fill-opacity:1;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        d="m 878.38837,687.89343 0,7.40625 c -2.1e-4,0.0102 0,0.021 0,0.0312 0,0.8311 0.6689,1.5 1.5,1.5 l 5.90625,0 c 0.0102,2.1e-4 0.021,0 0.0312,0 0.8311,0 1.5,-0.6689 1.5,-1.5 0,-0.0206 8.2e-4,-0.0421 0,-0.0625 l 0,-7.375 -8.9375,0 z"
        id="path3797"
-       inkscape:connector-curvature="0" />
+       style="fill:url(#linearGradient3824);fill-opacity:1;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
   </g>
 </svg>
diff --git a/skins/vector/images/page-fade.png b/skins/vector/images/page-fade.png
new file mode 100644 (file)
index 0000000..b4a6034
Binary files /dev/null and b/skins/vector/images/page-fade.png differ
diff --git a/skins/vector/images/search-ltr.svg b/skins/vector/images/search-ltr.svg
new file mode 100644 (file)
index 0000000..c001b47
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="13">
+       <g stroke-width="2" stroke="#6c6c6c" fill="none">
+               <path d="m11.29 11.71-4-4"/>
+               <circle cx="5" cy="5" r="4"/>
+       </g>
+</svg>
diff --git a/skins/vector/images/search-rtl.svg b/skins/vector/images/search-rtl.svg
new file mode 100644 (file)
index 0000000..20d945d
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="13">
+       <g stroke-width="2" stroke="#6c6c6c" fill="none">
+               <path d="m.71 11.71 4-4"/>
+               <circle cx="7" cy="5" r="4"/>
+       </g>
+</svg>
index f37517d..d65d57a 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
@@ -8,73 +6,34 @@
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
    width="10"
    height="10"
-   id="svg5587"
-   version="1.1"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="talk-icon.svg">
+   id="svg5587">
   <defs
      id="defs5589">
     <linearGradient
-       inkscape:collect="always"
        id="linearGradient6134">
       <stop
-         style="stop-color:#e9e9e9;stop-opacity:1;"
-         offset="0"
-         id="stop6136" />
+         id="stop6136"
+         style="stop-color:#e9e9e9;stop-opacity:1"
+         offset="0" />
       <stop
-         style="stop-color:#e9e9e9;stop-opacity:0;"
-         offset="1"
-         id="stop6138" />
+         id="stop6138"
+         style="stop-color:#e9e9e9;stop-opacity:0"
+         offset="1" />
     </linearGradient>
     <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6134"
-       id="radialGradient6140"
        cx="755.80591"
        cy="683.84875"
+       r="2.6564851"
        fx="755.80591"
        fy="683.84875"
-       r="2.656485"
-       gradientTransform="matrix(2.4898047,0,0,2.5230165,-1126.0032,-1041.5417)"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6134"
        id="radialGradient6146"
+       xlink:href="#linearGradient6134"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.4898047,0,0,2.5230165,-1126.0032,-1041.5417)"
-       cx="755.80591"
-       cy="683.84875"
-       fx="755.80591"
-       fy="683.84875"
-       r="2.656485" />
+       gradientTransform="matrix(2.4898047,0,0,2.5230165,-1126.0032,-1041.5417)" />
   </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="45.254834"
-     inkscape:cx="8.6391885"
-     inkscape:cy="3.9760181"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     inkscape:window-width="1920"
-     inkscape:window-height="1041"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1" />
   <metadata
      id="metadata5592">
     <rdf:RDF>
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
+        <dc:title></dc:title>
       </cc:Work>
     </rdf:RDF>
   </metadata>
   <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-763.57141,-681.64789)">
+     transform="translate(-763.57141,-681.64789)"
+     id="layer1">
     <g
-       id="g6142"
-       transform="matrix(1.0212411,0,0,0.97119998,-5.0201418,19.699049)">
+       transform="matrix(1.0212411,0,0,0.97119998,-5.0201418,19.699049)"
+       id="g6142">
       <path
-         sodipodi:nodetypes="sssscccsssss"
-         inkscape:connector-curvature="0"
-         id="rect5606"
-         transform="translate(763.57141,681.64789)"
          d="m -8.625,0.4375 c -0.4851513,0 -0.875,0.38984873 -0.875,0.875 l 0,4.375 c 0,0.4851513 0.3898487,0.875 0.875,0.875 l 0.125,0 0,2.6739053 3.4513641,-2.6739053 2.5173859,0 c 0.4851513,0 0.875,-0.3898487 0.875,-0.875 l 0,-4.375 c 0,-0.48515127 -0.3898487,-0.875 -0.875,-0.875 z"
+         transform="translate(763.57141,681.64789)"
+         id="rect5606"
          style="fill:#ffffff;fill-opacity:1;stroke:#888a85;stroke-width:0.98900002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:9.80000019;stroke-opacity:1;stroke-dasharray:none" />
       <path
-         style="fill:url(#radialGradient6146);fill-opacity:1;stroke:none"
          d="m 755.96029,683.3154 c -0.32861,0 -0.59267,0.23853 -0.59267,0.53539 l 0,2.67695 c 0,0.29685 0.26406,0.53539 0.59267,0.53539 l 0.0847,0 0,1.63611 2.33776,-1.63611 1.70516,0 c 0.32862,0 0.59268,-0.23854 0.59268,-0.53539 l 0,-2.67695 c 0,-0.29686 -0.26406,-0.53539 -0.59268,-0.53539 z"
          id="path6124"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="sssscccsssss" />
+         style="fill:url(#radialGradient6146);fill-opacity:1;stroke:none" />
     </g>
   </g>
 </svg>
diff --git a/skins/vector/images/unwatch-icon-hl.png b/skins/vector/images/unwatch-icon-hl.png
new file mode 100644 (file)
index 0000000..6b2b502
Binary files /dev/null and b/skins/vector/images/unwatch-icon-hl.png differ
diff --git a/skins/vector/images/unwatch-icon-hl.svg b/skins/vector/images/unwatch-icon-hl.svg
new file mode 100644 (file)
index 0000000..b41fd97
--- /dev/null
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   version="1.1"
+   width="16"
+   height="16"
+   id="svg2">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3788">
+      <stop
+         id="stop3790"
+         style="stop-color:#c2edff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3796"
+         style="stop-color:#68bdff;stop-opacity:1"
+         offset="0.5" />
+      <stop
+         id="stop3792"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="13.470111"
+       y1="14.363379"
+       x2="4.596477"
+       y2="3.3969929"
+       id="linearGradient3804"
+       xlink:href="#linearGradient3788"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Mateusz &quot;m4tx&quot; Maćkowski</dc:title>
+          </cc:Agent>
+        </dc:creator>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(-693.14288,-698.64789)"
+     id="layer1">
+    <path
+       d="M 8.3337586,-0.92098331 10.85748,4.1926362 16.500695,5.0126434 12.417226,8.9930409 13.381202,14.613453 8.3337584,11.959854 3.286314,14.613452 4.2502902,8.9930409 0.16682217,5.012643 5.8100362,4.1926362 z"
+       transform="matrix(0.86225302,0,0,0.86225302,694.06156,700.58832)"
+       id="path3768"
+       style="fill:url(#linearGradient3804);fill-opacity:1;stroke:#c8b250;stroke-width:1.15975237;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+  </g>
+</svg>
diff --git a/skins/vector/images/unwatch-icon.png b/skins/vector/images/unwatch-icon.png
new file mode 100644 (file)
index 0000000..9fd9436
Binary files /dev/null and b/skins/vector/images/unwatch-icon.png differ
diff --git a/skins/vector/images/unwatch-icon.svg b/skins/vector/images/unwatch-icon.svg
new file mode 100644 (file)
index 0000000..80fb36e
--- /dev/null
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   version="1.1"
+   width="16"
+   height="16"
+   id="svg2">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3788">
+      <stop
+         id="stop3790"
+         style="stop-color:#c2edff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3796"
+         style="stop-color:#68bdff;stop-opacity:1"
+         offset="0.5" />
+      <stop
+         id="stop3792"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="13.470111"
+       y1="14.363379"
+       x2="4.596477"
+       y2="3.3969929"
+       id="linearGradient3804"
+       xlink:href="#linearGradient3788"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Mateusz &quot;m4tx&quot; Maćkowski</dc:title>
+          </cc:Agent>
+        </dc:creator>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(-693.14288,-698.64789)"
+     id="layer1">
+    <path
+       d="M 8.3337586,-0.92098331 10.85748,4.1926362 16.500695,5.0126434 12.417226,8.9930409 13.381202,14.613453 8.3337584,11.959854 3.286314,14.613452 4.2502902,8.9930409 0.16682217,5.012643 5.8100362,4.1926362 z"
+       transform="matrix(0.86225302,0,0,0.86225302,694.06156,700.58832)"
+       id="path3768"
+       style="fill:url(#linearGradient3804);fill-opacity:1;stroke:#7cb5d1;stroke-width:1.15975237;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+  </g>
+</svg>
index 767d510..9b6f822 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
          style="stop-color:#000000;stop-opacity:0"
          offset="1" />
     </linearGradient>
-    <linearGradient
-       id="linearGradient4344">
-      <stop
-         id="stop4346"
-         style="stop-color:#727e0a;stop-opacity:1"
-         offset="0" />
-      <stop
-         id="stop4348"
-         style="stop-color:#5b6508;stop-opacity:1"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4338">
-      <stop
-         id="stop4340"
-         style="stop-color:#e9b15e;stop-opacity:1"
-         offset="0" />
-      <stop
-         id="stop4342"
-         style="stop-color:#966416;stop-opacity:1"
-         offset="1" />
-    </linearGradient>
     <linearGradient
        id="linearGradient4163">
       <stop
          style="stop-color:#df9725;stop-opacity:1"
          offset="1" />
     </linearGradient>
-    <radialGradient
-       cx="29.344931"
-       cy="17.064077"
-       r="9.1620579"
-       fx="29.344931"
-       fy="17.064077"
-       id="radialGradient3806"
-       xlink:href="#linearGradient3800"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       cx="31.112698"
-       cy="19.008621"
-       r="8.6620579"
-       fx="31.112698"
-       fy="19.008621"
-       id="radialGradient3822"
-       xlink:href="#linearGradient3816"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       x1="30.935921"
-       y1="29.553486"
-       x2="30.935921"
-       y2="35.803486"
-       id="linearGradient3830"
-       xlink:href="#linearGradient3824"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       cx="28.089741"
-       cy="27.203083"
-       r="13.56536"
-       fx="28.089741"
-       fy="27.203083"
-       id="radialGradient4169"
-       xlink:href="#linearGradient4163"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.297564,0,0,0.884831,-8.358505,4.940469)" />
-    <radialGradient
-       cx="29.344931"
-       cy="17.064077"
-       r="9.1620579"
-       fx="29.344931"
-       fy="17.064077"
-       id="radialGradient4171"
-       xlink:href="#linearGradient3800"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" />
-    <linearGradient
-       x1="30.935921"
-       y1="29.553486"
-       x2="30.935921"
-       y2="35.803486"
-       id="linearGradient4175"
-       xlink:href="#linearGradient3824"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(0.707108,0)" />
-    <radialGradient
-       cx="31.112698"
-       cy="19.008621"
-       r="8.6620579"
-       fx="31.112698"
-       fy="19.008621"
-       id="radialGradient4179"
-       xlink:href="#linearGradient3816"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       x1="30.935921"
-       y1="29.553486"
-       x2="30.935921"
-       y2="35.803486"
-       id="linearGradient4326"
-       xlink:href="#linearGradient3824"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-12.41789,-7)" />
-    <radialGradient
-       cx="29.344931"
-       cy="17.064077"
-       r="9.1620579"
-       fx="29.344931"
-       fy="17.064077"
-       id="radialGradient4328"
-       xlink:href="#linearGradient4338"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" />
-    <radialGradient
-       cx="31.112698"
-       cy="19.008621"
-       r="8.6620579"
-       fx="31.112698"
-       fy="19.008621"
-       id="radialGradient4330"
-       xlink:href="#linearGradient3816"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       x1="30.935921"
-       y1="29.553486"
-       x2="30.935921"
-       y2="35.803486"
-       id="linearGradient4332"
-       xlink:href="#linearGradient3824"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-13.125,-7)" />
-    <radialGradient
-       cx="31.112698"
-       cy="19.008621"
-       r="8.6620579"
-       fx="31.112698"
-       fy="19.008621"
-       id="radialGradient4336"
-       xlink:href="#linearGradient3816"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       cx="16.214741"
-       cy="19.836468"
-       r="13.56536"
-       fx="16.214741"
-       fy="19.836468"
-       id="radialGradient4350"
-       xlink:href="#linearGradient4344"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.681917,0,8.233773)" />
-    <linearGradient
-       x1="20.661695"
-       y1="35.817974"
-       x2="22.626925"
-       y2="36.217758"
-       id="linearGradient4362"
-       xlink:href="#linearGradient4356"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,6.231716,-2.651466)" />
-    <linearGradient
-       x1="22.686766"
-       y1="36.3904"
-       x2="21.408455"
-       y2="35.739632"
-       id="linearGradient4366"
-       xlink:href="#linearGradient4356"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,55.1096,-3.945209)" />
-    <linearGradient
-       x1="20.661695"
-       y1="35.817974"
-       x2="22.626925"
-       y2="36.217758"
-       id="linearGradient4372"
-       xlink:href="#linearGradient4356"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,-7.07212,-9.82492)" />
-    <linearGradient
-       x1="22.686766"
-       y1="36.3904"
-       x2="21.408455"
-       y2="35.739632"
-       id="linearGradient4374"
-       xlink:href="#linearGradient4356"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,41.80576,-11.11866)" />
-    <linearGradient
-       x1="22.686766"
-       y1="36.3904"
-       x2="21.408455"
-       y2="35.739632"
-       id="linearGradient1366"
-       xlink:href="#linearGradient4356"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,41.80576,-11.11866)" />
-    <linearGradient
-       x1="20.661695"
-       y1="35.817974"
-       x2="22.626925"
-       y2="36.217758"
-       id="linearGradient1369"
-       xlink:href="#linearGradient4356"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,-7.07212,-9.82492)" />
-    <linearGradient
-       x1="30.935921"
-       y1="29.553486"
-       x2="30.935921"
-       y2="35.803486"
-       id="linearGradient1372"
-       xlink:href="#linearGradient3824"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-12.41789,-7)" />
-    <radialGradient
-       cx="16.214741"
-       cy="19.836468"
-       r="13.56536"
-       fx="16.214741"
-       fy="19.836468"
-       id="radialGradient1381"
-       xlink:href="#linearGradient4344"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.681917,0,8.233773)" />
     <radialGradient
        cx="31.112698"
        cy="19.008621"
index d5e44b6..0b3d302 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
@@ -8,70 +6,33 @@
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
    width="10"
    height="10"
-   id="svg6734"
-   version="1.1"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="video-icon.svg">
+   id="svg6734">
   <defs
      id="defs6736">
     <linearGradient
        id="linearGradient7265">
       <stop
-         style="stop-color:#cccccc;stop-opacity:1;"
-         offset="0"
-         id="stop7267" />
+         id="stop7267"
+         style="stop-color:#cccccc;stop-opacity:1"
+         offset="0" />
       <stop
-         style="stop-color:#dfdfdf;stop-opacity:1;"
-         offset="1"
-         id="stop7269" />
+         id="stop7269"
+         style="stop-color:#dfdfdf;stop-opacity:1"
+         offset="1" />
     </linearGradient>
     <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient7265"
-       id="radialGradient7271"
        cx="5.0034118"
        cy="4.9650207"
+       r="4.999619"
        fx="5.0034118"
        fy="4.9650207"
-       r="4.9996192"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient7265"
        id="radialGradient7327"
-       gradientUnits="userSpaceOnUse"
-       cx="5.0034118"
-       cy="4.9650207"
-       fx="5.0034118"
-       fy="4.9650207"
-       r="4.9996192" />
+       xlink:href="#linearGradient7265"
+       gradientUnits="userSpaceOnUse" />
   </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.627417"
-     inkscape:cx="4.0209944"
-     inkscape:cy="7.104383"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     inkscape:window-width="1920"
-     inkscape:window-height="1014"
-     inkscape:window-x="0"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1" />
   <metadata
      id="metadata6739">
     <rdf:RDF>
     </rdf:RDF>
   </metadata>
   <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-903.57141,-715.93359)">
+     transform="translate(-903.57141,-715.93359)"
+     id="layer1">
     <path
-       style="fill:none;stroke:#5f6060;stroke-width:0.89999998000000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
        d="m 911.68723,725.33709 -0.61872,-0.92808 c 0,0 0.17677,0.92808 0.92808,1.01647 0.7513,0.0884 1.19324,0.0884 1.19324,0.0884"
        id="path7292"
-       inkscape:connector-curvature="0" />
+       style="fill:none;stroke:#5f6060;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
     <path
-       sodipodi:type="arc"
-       style="fill:url(#radialGradient7327);fill-opacity:1;stroke:#848484;stroke-width:0.89999998;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:9.80000019;stroke-opacity:1;stroke-dasharray:none"
-       id="path6755"
-       sodipodi:cx="5.0034118"
-       sodipodi:cy="4.9650207"
-       sodipodi:rx="4.5141191"
-       sodipodi:ry="4.5141191"
        d="m 9.5175309,4.9650207 a 4.5141191,4.5141191 0 1 1 -9.02823828,0 4.5141191,4.5141191 0 1 1 9.02823828,0 z"
-       transform="translate(903.4637,715.9024)" />
+       transform="translate(903.4637,715.9024)"
+       id="path6755"
+       style="fill:url(#radialGradient7327);fill-opacity:1;stroke:#848484;stroke-width:0.89999998;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:9.80000019;stroke-opacity:1;stroke-dasharray:none" />
     <g
-       id="g7310"
-       transform="matrix(0.897287,0,0,0.897287,111.13225,74.055304)">
+       transform="matrix(0.897287,0,0,0.897287,111.13225,74.055304)"
+       id="g7310">
       <path
+         d="m 5.03125,2.59375 a 0.59375,0.59375 0 1 1 -1.1875,0 0.59375,0.59375 0 1 1 1.1875,0 z"
          transform="matrix(1.4672484,-0.2948259,0.2948259,1.4672484,880.61345,716.13137)"
-         d="M 5.03125,2.59375 C 5.03125,2.9216691 4.7654191,3.1875 4.4375,3.1875 4.1095809,3.1875 3.84375,2.9216691 3.84375,2.59375 3.84375,2.2658309 4.1095809,2 4.4375,2 4.7654191,2 5.03125,2.2658309 5.03125,2.59375 z"
-         sodipodi:ry="0.59375"
-         sodipodi:rx="0.59375"
-         sodipodi:cy="2.59375"
-         sodipodi:cx="4.4375"
          id="path7300"
-         style="fill:#818181;fill-opacity:1;stroke:none"
-         sodipodi:type="arc" />
+         style="fill:#818181;fill-opacity:1;stroke:none" />
       <path
-         sodipodi:type="arc"
-         style="fill:#818181;fill-opacity:1;stroke:none"
+         d="m 5.03125,2.59375 a 0.59375,0.59375 0 1 1 -1.1875,0 0.59375,0.59375 0 1 1 1.1875,0 z"
+         transform="matrix(1.4672484,-0.2948259,0.2948259,1.4672484,878.85062,718.47146)"
          id="path7302"
-         sodipodi:cx="4.4375"
-         sodipodi:cy="2.59375"
-         sodipodi:rx="0.59375"
-         sodipodi:ry="0.59375"
-         d="M 5.03125,2.59375 C 5.03125,2.9216691 4.7654191,3.1875 4.4375,3.1875 4.1095809,3.1875 3.84375,2.9216691 3.84375,2.59375 3.84375,2.2658309 4.1095809,2 4.4375,2 4.7654191,2 5.03125,2.2658309 5.03125,2.59375 z"
-         transform="matrix(1.4672484,-0.2948259,0.2948259,1.4672484,878.85062,718.47146)" />
+         style="fill:#818181;fill-opacity:1;stroke:none" />
       <path
+         d="m 5.03125,2.59375 a 0.59375,0.59375 0 1 1 -1.1875,0 0.59375,0.59375 0 1 1 1.1875,0 z"
          transform="matrix(1.4672484,-0.2948259,0.2948259,1.4672484,883.48161,716.7296)"
-         d="M 5.03125,2.59375 C 5.03125,2.9216691 4.7654191,3.1875 4.4375,3.1875 4.1095809,3.1875 3.84375,2.9216691 3.84375,2.59375 3.84375,2.2658309 4.1095809,2 4.4375,2 4.7654191,2 5.03125,2.2658309 5.03125,2.59375 z"
-         sodipodi:ry="0.59375"
-         sodipodi:rx="0.59375"
-         sodipodi:cy="2.59375"
-         sodipodi:cx="4.4375"
          id="path7304"
-         style="fill:#818181;fill-opacity:1;stroke:none"
-         sodipodi:type="arc" />
+         style="fill:#818181;fill-opacity:1;stroke:none" />
       <path
-         sodipodi:type="arc"
-         style="fill:#818181;fill-opacity:1;stroke:none"
+         d="m 5.03125,2.59375 a 0.59375,0.59375 0 1 1 -1.1875,0 0.59375,0.59375 0 1 1 1.1875,0 z"
+         transform="matrix(1.4672484,-0.2948259,0.2948259,1.4672484,880.77974,720.67629)"
          id="path7306"
-         sodipodi:cx="4.4375"
-         sodipodi:cy="2.59375"
-         sodipodi:rx="0.59375"
-         sodipodi:ry="0.59375"
-         d="M 5.03125,2.59375 C 5.03125,2.9216691 4.7654191,3.1875 4.4375,3.1875 4.1095809,3.1875 3.84375,2.9216691 3.84375,2.59375 3.84375,2.2658309 4.1095809,2 4.4375,2 4.7654191,2 5.03125,2.2658309 5.03125,2.59375 z"
-         transform="matrix(1.4672484,-0.2948259,0.2948259,1.4672484,880.77974,720.67629)" />
+         style="fill:#818181;fill-opacity:1;stroke:none" />
       <path
+         d="m 5.03125,2.59375 a 0.59375,0.59375 0 1 1 -1.1875,0 0.59375,0.59375 0 1 1 1.1875,0 z"
          transform="matrix(1.4672484,-0.2948259,0.2948259,1.4672484,883.52712,719.65906)"
-         d="M 5.03125,2.59375 C 5.03125,2.9216691 4.7654191,3.1875 4.4375,3.1875 4.1095809,3.1875 3.84375,2.9216691 3.84375,2.59375 3.84375,2.2658309 4.1095809,2 4.4375,2 4.7654191,2 5.03125,2.2658309 5.03125,2.59375 z"
-         sodipodi:ry="0.59375"
-         sodipodi:rx="0.59375"
-         sodipodi:cy="2.59375"
-         sodipodi:cx="4.4375"
          id="path7308"
-         style="fill:#818181;fill-opacity:1;stroke:none"
-         sodipodi:type="arc" />
+         style="fill:#818181;fill-opacity:1;stroke:none" />
     </g>
   </g>
 </svg>
diff --git a/skins/vector/images/watch-icon-hl.png b/skins/vector/images/watch-icon-hl.png
new file mode 100644 (file)
index 0000000..4cb87cd
Binary files /dev/null and b/skins/vector/images/watch-icon-hl.png differ
diff --git a/skins/vector/images/watch-icon-hl.svg b/skins/vector/images/watch-icon-hl.svg
new file mode 100644 (file)
index 0000000..b78c978
--- /dev/null
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   version="1.1"
+   width="16"
+   height="16"
+   id="svg2">
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Mateusz &quot;m4tx&quot; Maćkowski</dc:title>
+          </cc:Agent>
+        </dc:creator>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(-693.14288,-698.64789)"
+     id="layer1">
+    <path
+       d="M 8.3337586,-0.92098331 10.85748,4.1926362 16.500695,5.0126434 12.417226,8.9930409 13.381202,14.613453 8.3337584,11.959854 3.286314,14.613452 4.2502902,8.9930409 0.16682217,5.012643 5.8100362,4.1926362 z"
+       transform="matrix(0.86225302,0,0,0.86225302,694.06156,700.58832)"
+       id="path3770"
+       style="fill:#ffffff;fill-opacity:1;stroke:#c8b250;stroke-width:1.15975237;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+  </g>
+</svg>
diff --git a/skins/vector/images/watch-icon-loading.gif b/skins/vector/images/watch-icon-loading.gif
deleted file mode 100644 (file)
index 618c308..0000000
Binary files a/skins/vector/images/watch-icon-loading.gif and /dev/null differ
diff --git a/skins/vector/images/watch-icon-loading.png b/skins/vector/images/watch-icon-loading.png
new file mode 100644 (file)
index 0000000..5f0c490
Binary files /dev/null and b/skins/vector/images/watch-icon-loading.png differ
diff --git a/skins/vector/images/watch-icon-loading.svg b/skins/vector/images/watch-icon-loading.svg
new file mode 100644 (file)
index 0000000..6b25f94
--- /dev/null
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   version="1.1"
+   width="16"
+   height="16"
+   id="svg2">
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Mateusz &quot;m4tx&quot; Maćkowski</dc:title>
+          </cc:Agent>
+        </dc:creator>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(-693.14288,-698.64789)"
+     id="layer1">
+    <path
+       d="M 8.3337586,-0.92098331 10.85748,4.1926362 16.500695,5.0126434 12.417226,8.9930409 13.381202,14.613453 8.3337584,11.959854 3.286314,14.613452 4.2502902,8.9930409 0.16682217,5.012643 5.8100362,4.1926362 z"
+       transform="matrix(0.86225302,0,0,0.86225302,694.06156,700.58832)"
+       id="path2998"
+       style="fill:#ffffff;fill-opacity:1;stroke:#d1d1d1;stroke-width:1.15975237;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+  </g>
+</svg>
diff --git a/skins/vector/images/watch-icon.png b/skins/vector/images/watch-icon.png
new file mode 100644 (file)
index 0000000..39daff2
Binary files /dev/null and b/skins/vector/images/watch-icon.png differ
diff --git a/skins/vector/images/watch-icon.svg b/skins/vector/images/watch-icon.svg
new file mode 100644 (file)
index 0000000..2654c8d
--- /dev/null
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   version="1.1"
+   width="16"
+   height="16"
+   id="svg2">
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Mateusz &quot;m4tx&quot; Maćkowski</dc:title>
+          </cc:Agent>
+        </dc:creator>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(-693.14288,-698.64789)"
+     id="layer1">
+    <path
+       d="M 8.3337586,-0.92098331 10.85748,4.1926362 16.500695,5.0126434 12.417226,8.9930409 13.381202,14.613453 8.3337584,11.959854 3.286314,14.613452 4.2502902,8.9930409 0.16682217,5.012643 5.8100362,4.1926362 z"
+       transform="matrix(0.86225302,0,0,0.86225302,694.06156,700.58832)"
+       id="path2998"
+       style="fill:#ffffff;fill-opacity:1;stroke:#7cb5d1;stroke-width:1.15975237;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+  </g>
+</svg>
diff --git a/skins/vector/images/watch-icons.png b/skins/vector/images/watch-icons.png
deleted file mode 100644 (file)
index 03aa7d5..0000000
Binary files a/skins/vector/images/watch-icons.png and /dev/null differ
index 2683a21..5a1fc05 100644 (file)
@@ -2,7 +2,7 @@
 
 div#content {
        margin-left: 11em;
-       padding: 1.5em 1.5em 1.5em 1.75em;
+       padding: 1.25em 1.5em 1.5em 1.5em;
 }
 #p-logo {
        left: @menu-main-logo-left;
index c2d0b92..2af6389 100644 (file)
@@ -9,7 +9,7 @@
 @content-font-color: black;
 @content-font-size: 0.8em;
 @content-line-height: 1.5em;
-@content-padding: 1.25em 1.5em 1.5em 1.5em;
+@content-padding: 1em;
 @content-heading-font-size: 1.6em;
 @content-heading-font-family: sans-serif;
 @body-background-color: #fff;
@@ -36,8 +36,8 @@
 @menu-personal-font-size: 0.75em;
 
 // Collapsible nav
-@collapsible-nav-heading-color: #4D4D4D;
-@collapsible-nav-heading-collapsed-color: #0645AD;
+@collapsible-nav-heading-color: #4d4d4d;
+@collapsible-nav-heading-collapsed-color: #0645ad;
 
 @collapsible-nav-heading-padding: 4px 0 3px 1.5em;
 @collapsible-nav-body-margin: 0 0 0 1.25em;
index aa64624..8420431 100644 (file)
@@ -9,7 +9,7 @@ jQuery( function ( $ ) {
                        // For accessibility, show the menu when the h3 is clicked (bug 24298/46486)
                        .on( 'click keypress', function ( e ) {
                                if( e.type === 'click' || e.which === 13 ) {
-                                       $el.find( '.menu:first' ).toggleClass( 'menuForceShow' );
+                                       $el.toggleClass( 'menuForceShow' );
                                        e.preventDefault();
                                }
                        } )
index 39fa09e..55e93e2 100644 (file)
@@ -642,48 +642,65 @@ class ParserTest {
                // foo="bar baz"
                // foo=[[bar baz]]
                // foo=bar,"baz quux"
-               $regex = '/\b
-                       ([\w-]+)                                                # Key
-                       \b
-                       (?:\s*
-                               =                                               # First sub-value
-                               \s*
-                               (
-                                       "
-                                               [^"]*                   # Quoted val
-                                       "
+               // foo={...json...}
+               $defs = '(?(DEFINE)
+                       (?<qstr>                                        # Quoted string
+                               "
+                               (?:[^\\\\"] | \\\\.)*
+                               "
+                       )
+                       (?<json>
+                               \{              # Open bracket
+                               (?:
+                                       [^"{}] |                                # Not a quoted string or object, or
+                                       (?&qstr) |                              # A quoted string, or
+                                       (?&json)                                # A json object (recursively)
+                               )*
+                               \}              # Close bracket
+                       )
+            (?<value>
+                               (?:
+                                       (?&qstr)                        # Quoted val
                                |
                                        \[\[
                                                [^]]*                   # Link target
                                        \]\]
                                |
                                        [\w-]+                          # Plain word
+                               |
+                                       (?&json)                        # JSON object
+                               )
+                       )
+               )';
+               $regex = '/'.$defs.'\b
+                       (?<k>[\w-]+)                            # Key
+                       \b
+                       (?:\s*
+                               =                                               # First sub-value
+                               \s*
+                               (?<v>
+                                       (?&value)
+                                       (?:\s*
+                                               ,                               # Sub-vals 1..N
+                                               \s*
+                                               (?&value)
+                                       )*
                                )
-                               (?:\s*
-                                       ,                                       # Sub-vals 1..N
-                                       \s*
-                                       (
-                                               "[^"]*"                 # Quoted val
-                                       |
-                                               \[\[[^]]*\]\]   # Link target
-                                       |
-                                               [\w-]+                  # Plain word
-                                       )
-                               )*
                        )?
                        /x';
+               $valueregex = '/'.$defs.'(?&value)/x';
 
                if ( preg_match_all( $regex, $instring, $matches, PREG_SET_ORDER ) ) {
                        foreach ( $matches as $bits ) {
-                               array_shift( $bits );
-                               $key = strtolower( array_shift( $bits ) );
-                               if ( count( $bits ) == 0 ) {
+                               $key = strtolower( $bits[ 'k' ] );
+                               if ( !isset( $bits[ 'v' ] ) ) {
                                        $opts[$key] = true;
-                               } elseif ( count( $bits ) == 1 ) {
-                                       $opts[$key] = $this->cleanupOption( array_shift( $bits ) );
                                } else {
-                                       // Array!
-                                       $opts[$key] = array_map( array( $this, 'cleanupOption' ), $bits );
+                                       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];
+                                       }
                                }
                        }
                }
@@ -692,12 +709,16 @@ class ParserTest {
 
        private function cleanupOption( $opt ) {
                if ( substr( $opt, 0, 1 ) == '"' ) {
-                       return substr( $opt, 1, -1 );
+                       return stripcslashes( substr( $opt, 1, -1 ) );
                }
 
                if ( substr( $opt, 0, 2 ) == '[[' ) {
                        return substr( $opt, 2, -2 );
                }
+
+               if ( substr( $opt, 0, 1 ) == '{' ) {
+                       return FormatJson::decode( $opt, true );
+               }
                return $opt;
        }
 
index 54e6199..078dfef 100644 (file)
@@ -40,6 +40,21 @@ class TitleTest extends MediaWikiTestCase {
         * @todo This method should be split into 2 separate tests each with a provider
         */
        public function testSecureAndSplit() {
+               $this->setMwGlobals( array(
+                       'wgLocalInterwiki' => 'localtestiw',
+                       'wgHooks' => array(
+                               'InterwikiLoadPrefix' => array(
+                                       function ( $prefix, &$data ) {
+                                               if ( $prefix === 'localtestiw' ) {
+                                                       $data = array( 'iw_url' => 'localtestiw' );
+                                               } elseif ( $prefix === 'remotetestiw' ) {
+                                                       $data = array( 'iw_url' => 'remotetestiw' );
+                                               }
+                                               return false;
+                                       }
+                               )
+                       )
+               ));
                // Valid
                foreach ( array(
                        'Sandbox',
@@ -58,7 +73,17 @@ class TitleTest extends MediaWikiTestCase {
                        'A~~',
                        // Length is 256 total, but only title part matters
                        'Category:' . str_repeat( 'x', 248 ),
-                       str_repeat( 'x', 252 )
+                       str_repeat( 'x', 252 ),
+                       // interwiki prefix
+                       'localtestiw: #anchor',
+                       'localtestiw:foo',
+                       'localtestiw: foo # anchor',
+                       'localtestiw: Talk: Sandbox # anchor',
+                       'remotetestiw:',
+                       'remotetestiw: Talk: # anchor',
+                       'remotetestiw: #bar',
+                       'remotetestiw: Talk:',
+                       'remotetestiw: Talk: Foo'
                ) as $text ) {
                        $this->assertInstanceOf( 'Title', Title::newFromText( $text ), "Valid: $text" );
                }
@@ -106,7 +131,11 @@ class TitleTest extends MediaWikiTestCase {
                        // Namespace prefix without actual title
                        'Talk:',
                        'Category: ',
-                       'Category: #bar'
+                       'Category: #bar',
+                       // interwiki prefix
+                       'localtestiw:',
+                       'localtestiw: Talk: # anchor',
+                       'localtestiw: Talk:'
                ) as $text ) {
                        $this->assertNull( Title::newFromText( $text ), "Invalid: $text" );
                }
index b7df3f6..ff33e82 100644 (file)
@@ -234,49 +234,4 @@ class UserTest extends MediaWikiTestCase {
                $this->assertEquals( $wgDefaultUserOptions['cols'], $this->user->getOption( 'cols' ) );
                $this->assertEquals( 'test', $this->user->getOption( 'someoption' ) );
        }
-
-       /**
-        * Helper, fetch user properties from the database.
-        * @param int $userId
-        */
-       function dbUserProperties( $userId ) {
-               $res = wfGetDB( DB_SLAVE )->select(
-                       'user_properties',
-                       array( 'up_property', 'up_value' ),
-                       array( 'up_user' => $userId ),
-                       __METHOD__
-               );
-               $ret = array();
-               foreach( $res as $row ) {
-                       $ret[$row->up_property] = $row->up_value;
-               }
-               return $ret;
-       }
-
-       public function testOnlySaveChangedOptions() {
-               $user = User::newFromName( 'UnitTestUser2' );
-               $user->addToDatabase();
-
-               // Fresh user only has default, so nothing should be in the DB
-               $dbProps = $this->dbUserProperties( $user->getId() );
-               $this->assertEmpty( $dbProps,
-                       "A new user should not have any user property saved in the DB" );
-
-               // Make sure we only save the altered option
-               $user->setOption( 'changed_opt', 'alix_20281' );
-               $user->setOption( 'switch', 1 );
-               $user->setOption( 'anotherswitch', 1 );
-               $user->saveSettings();
-
-               $expected = array (
-                       'changed_opt' => 'alix_20281',
-                       'switch' => '1',
-                       'anotherswitch' => '1',
-               );
-               $dbProps = $this->dbUserProperties( $user->getId() );
-
-               $this->assertEquals( $expected, $dbProps,
-                       "non default options should be saved, and default ones should not" );
-
-       }
 }
index 796adf3..6cf658f 100644 (file)
@@ -886,6 +886,49 @@ more stuff
                $this->assertEquals( "one", $page->getContent()->getNativeData() );
        }
 
+       /**
+        * @covers WikiPage::doRollback
+        */
+       public function testDoRollbackFailureSameContent() {
+               $admin = new User();
+               $admin->setName( "Admin" );
+               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
+
+               $text = "one";
+               $page = $this->newPage( "WikiPageTest_testDoRollback" );
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       "section one", EDIT_NEW, false, $admin );
+               $rev1 = $page->getRevision();
+
+               $user1 = new User();
+               $user1->setName( "127.0.1.11" );
+               $user1->addGroup( "sysop" ); #XXX: make the test user a sysop...
+               $text .= "\n\ntwo";
+               $page = new WikiPage( $page->getTitle() );
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       "adding section two", 0, false, $user1 );
+
+               # now, do a the rollback from the same user was doing the edit before
+               $resultDetails = array();
+               $token = $user1->getEditToken( array( $page->getTitle()->getPrefixedText(), $user1->getName() ), null );
+               $errors = $page->doRollback( $user1->getName(), "testing revert same user", $token, false, $resultDetails, $admin );
+
+               $this->assertEquals( array(), $errors, "Rollback failed same user" );
+
+               # now, try the rollback
+               $resultDetails = array();
+               $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user1->getName() ), null );
+               $errors = $page->doRollback( $user1->getName(), "testing revert", $token, false, $resultDetails, $admin );
+
+               $this->assertEquals( array( array( 'alreadyrolled', 'WikiPageTest testDoRollback',
+                       '127.0.1.11', 'Admin' ) ), $errors, "Rollback not failed" );
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
+                       "rollback did not revert to the correct revision" );
+               $this->assertEquals( "one", $page->getContent()->getNativeData() );
+       }
+
        public static function provideGetAutosummary() {
                return array(
                        array(
index a723245..8d134f7 100644 (file)
@@ -45,7 +45,7 @@ class ApiCreateAccountTest extends ApiTestCase {
 
                // Should first ask for token.
                $a = $result['createaccount'];
-               $this->assertEquals( 'needtoken', $a['result'] );
+               $this->assertEquals( 'NeedToken', $a['result'] );
                $token = $a['token'];
 
                // Finally create the account
@@ -63,7 +63,7 @@ class ApiCreateAccountTest extends ApiTestCase {
 
                $result = $ret[0];
                $this->assertNotInternalType( 'bool', $result );
-               $this->assertEquals( 'success', $result['createaccount']['result'] );
+               $this->assertEquals( 'Success', $result['createaccount']['result'] );
 
                // Try logging in with the new user.
                $ret = $this->doApiRequest( array(
index 6659414..15bd8bb 100644 (file)
@@ -116,6 +116,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        'testmultiselect-opt2' => 'registered-multiselect',
                        'testmultiselect-opt3' => 'registered-multiselect',
                        'testmultiselect-opt4' => 'registered-multiselect',
+                       'special' => 'special',
                );
 
                if ( $options === null ) {
@@ -389,6 +390,29 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                $this->assertEquals( self::$Success, $response );
        }
 
+       public function testSpecialOption() {
+               $this->mUserMock->expects( $this->never() )
+                       ->method( 'resetOptions' );
+
+               $this->mUserMock->expects( $this->never() )
+                       ->method( 'saveSettings' );
+
+               $request = $this->getSampleRequest( array(
+                       'change' => 'special=1'
+               ) );
+
+               $response = $this->executeQuery( $request );
+
+               $this->assertEquals( array(
+                       'options' => 'success',
+                       'warnings' => array(
+                               'options' => array(
+                                       '*' => "Validation error for 'special': cannot be set by this module"
+                               )
+                       )
+               ), $response );
+       }
+
        public function testUnknownOption() {
                $this->mUserMock->expects( $this->never() )
                        ->method( 'resetOptions' );
index 01fedc8..63f610f 100644 (file)
@@ -1,10 +1,41 @@
 <?php
 
+/* Modules registered when $wgEnableJavaScriptTest is true */
+
 return array(
 
-       /* Test suites for MediaWiki core modules */
+       /* Utilities */
+
+       'test.sinonjs' => array(
+               'scripts' => array(
+                       'resources/sinonjs/sinon-1.8.1.js',
+                       'resources/sinonjs/sinon-ie-1.8.1.js',
+               ),
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
+
+       'test.mediawiki.qunit.testrunner' => array(
+               'scripts' => array(
+                       'tests/qunit/data/testrunner.js',
+               ),
+               'dependencies' => array(
+                       'jquery.getAttrs',
+                       'jquery.qunit',
+                       'jquery.qunit.completenessTest',
+                       'mediawiki.page.ready',
+                       'mediawiki.page.startup',
+                       'test.sinonjs',
+               ),
+               'position' => 'top',
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
+
+       /*
+               Test suites for MediaWiki core modules
+               These must have a dependency on test.mediawiki.qunit.testrunner!
+       */
 
-       'mediawiki.tests.qunit.suites' => array(
+       'test.mediawiki.qunit.suites' => array(
                'scripts' => array(
                        'tests/qunit/suites/resources/startup.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js',
@@ -28,6 +59,7 @@ return array(
                        'tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js',
+                       'tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js',
@@ -65,6 +97,7 @@ return array(
                        'mediawiki.special.recentchanges',
                        'mediawiki.language',
                        'mediawiki.cldr',
+                       'test.mediawiki.qunit.testrunner',
                ),
        )
 );
index 1a2bfa1..ba00ff9 100644 (file)
@@ -1,6 +1,6 @@
-/*global CompletenessTest */
+/*global CompletenessTest, sinon */
 /*jshint evil: true */
-( function ( $, mw, QUnit, undefined ) {
+( function ( $, mw, QUnit ) {
        'use strict';
 
        var mwTestIgnore, mwTester,
                tooltip: 'Run the completeness test'
        } );
 
+       /**
+        * SinonJS
+        *
+        * Glue code for nicer integration with QUnit setup/teardown
+        * Inspired by http://sinonjs.org/releases/sinon-qunit-1.0.0.js
+        * Fixes:
+        * - Work properly with asynchronous QUnit by using module setup/teardown
+        *   instead of synchronously wrapping QUnit.test.
+        */
+       sinon.assert.fail = function ( msg ) {
+               QUnit.assert.ok( false, msg );
+       };
+       sinon.assert.pass = function ( msg ) {
+               QUnit.assert.ok( true, msg );
+       };
+       sinon.config = {
+               injectIntoThis: true,
+               injectInto: null,
+               properties: ['spy', 'stub', 'mock', 'clock', 'sandbox'],
+               // Don't fake timers by default
+               useFakeTimers: false,
+               useFakeServer: false
+       };
+       ( function () {
+               var orgModule = QUnit.module;
+
+               QUnit.module = function ( name, localEnv ) {
+                       localEnv = localEnv || {};
+                       orgModule( name, {
+                               setup: function () {
+                                       var config = sinon.getConfig( sinon.config );
+                                       config.injectInto = this;
+                                       sinon.sandbox.create( config );
+
+                                       if ( localEnv.setup ) {
+                                               localEnv.setup.call( this );
+                                       }
+                               },
+                               teardown: function () {
+                                       this.sandbox.verifyAndRestore();
+
+                                       if ( localEnv.teardown ) {
+                                               localEnv.teardown.call( this );
+                                       }
+                               }
+                       } );
+               };
+       }() );
+
        // Initiate when enabled
        if ( QUnit.urlParams.completenesstest ) {
 
                liveMessages = mw.messages.values;
 
                function freshConfigCopy( custom ) {
+                       var copy, warn;
                        // Tests should mock all factors that directly influence the tested code.
-                       // For backwards compatibility though we set mw.config to a copy of the live config
-                       // and extend it with the (optionally) given custom settings for this test
-                       // (instead of starting blank with only the given custmo settings).
-                       // This is a shallow copy, so we don't end up with settings taking an array value
-                       // extended with the custom settings - setting a config property means you override it,
-                       // not extend it.
-                       return $.extend( {}, liveConfig, custom );
+                       // For backwards compatibility though we set mw.config to a fresh copy of the live
+                       // config. This way any modifications made to mw.config during the test will not
+                       // affect other tests, nor the global scope outside the test runner.
+                       // This is a shallow copy, since overriding an array or object value via "custom"
+                       // should replace it. Setting a config property means you override it, not extend it.
+                       // NOTE: It is important that we temporarily disable mw.log#warn as extend() will
+                       // trigger MWDeprecationWarning for each of the deprecated properties.
+                       warn = mw.log.warn;
+                       mw.log.warn = $.noop;
+
+                       copy = $.extend( {}, liveConfig, custom );
+
+                       mw.log.warn = warn;
+
+                       return copy;
                }
 
                function freshMessagesCopy( custom ) {
                                        mw.config.values = freshConfigCopy( localEnv.config );
                                        mw.messages.values = freshMessagesCopy( localEnv.messages );
 
-                                       localEnv.setup();
+                                       localEnv.setup.call( this );
                                },
 
                                teardown: function () {
                                        log( 'MwEnvironment> TEARDOWN for "' + QUnit.config.current.module
                                                + ': ' + QUnit.config.current.testName + '"' );
 
-                                       localEnv.teardown();
+                                       localEnv.teardown.call( this );
 
                                        // Farewell, mock environment!
                                        mw.config.values = liveConfig;
         * initializations defined above in this file.
         */
        envExecCount = 0;
-       QUnit.module( 'mediawiki.tests.qunit.testrunner', QUnit.newMwEnvironment( {
+       QUnit.module( 'test.mediawiki.qunit.testrunner', QUnit.newMwEnvironment( {
                setup: function () {
                        envExecCount += 1;
                        this.mwHtmlLive = mw.html;
 
        } );
 
-       QUnit.module( 'mediawiki.tests.qunit.testrunner-after', QUnit.newMwEnvironment() );
+       QUnit.module( 'test.mediawiki.qunit.testrunner-after', QUnit.newMwEnvironment() );
 
        QUnit.test( 'Teardown', 3, function ( assert ) {
                assert.equal( mw.html.escape( '<' ), '&lt;', 'extra teardown() callback was ran.' );
index 6030206..df800bc 100644 (file)
                                        ltr: true,
                                        rtl: true
                                }
+                       },
+                       // Amazon Silk
+                       'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.0.13.81_10003810) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true': {
+                               title: 'Silk',
+                               platform: 'Desktop',
+                               profile: {
+                                       name: 'silk',
+                                       layout: 'webkit',
+                                       layoutVersion: 533,
+                                       platform: 'unknown',
+                                       version: '1.0.13.81_10003810',
+                                       versionBase: '1',
+                                       versionNumber: 1
+                               },
+                               wikiEditor: {
+                                       ltr: true,
+                                       rtl: true
+                               }
+                       },
+                       'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/2.1 Mobile Safari/535.19 Silk-Accelerated=true': {
+                               title: 'Silk',
+                               platform: 'Mobile',
+                               profile: {
+                                       name: 'silk',
+                                       layout: 'webkit',
+                                       layoutVersion: 535,
+                                       platform: 'unknown',
+                                       version: '2.1',
+                                       versionBase: '2',
+                                       versionNumber: 2.1
+                               },
+                               wikiEditor: {
+                                       ltr: true,
+                                       rtl: true
+                               }
                        }
                },
                testMap = {
index 9eda75c..c903193 100644 (file)
@@ -1,61 +1,84 @@
 ( function ( mw ) {
-       QUnit.module( 'mediawiki.api', QUnit.newMwEnvironment() );
+       QUnit.module( 'mediawiki.api', QUnit.newMwEnvironment( {
+               setup: function () {
+                       this.clock = this.sandbox.useFakeTimers();
+                       this.server = this.sandbox.useFakeServer();
+               },
+               teardown: function () {
+                       this.clock.tick( 1 );
+               }
+       }) );
 
-       QUnit.asyncTest( 'Basic functionality', function ( assert ) {
-               var api, d1, d2, d3;
-               QUnit.expect( 3 );
+       QUnit.test( 'Basic functionality', function ( assert ) {
+               QUnit.expect( 2 );
 
-               api = new mw.Api();
+               var api = new mw.Api();
 
-               d1 = api.get( {} )
+               api.get( {} )
                        .done( function ( data ) {
                                assert.deepEqual( data, [], 'If request succeeds without errors, resolve deferred' );
                        } );
 
-               d2 = api.get( {
-                       action: 'doesntexist'
-               } )
-                       .fail( function ( errorCode ) {
-                               assert.equal( errorCode, 'unknown_action', 'API error (e.g. "unknown_action") should reject the deferred' );
-                       } );
-
-               d3 = api.post( {} )
+               api.post( {} )
                        .done( function ( data ) {
                                assert.deepEqual( data, [], 'Simple POST request' );
                        } );
 
-               // After all are completed, continue the test suite.
-               QUnit.whenPromisesComplete( d1, d2, d3 ).always( function () {
-                       QUnit.start();
+               this.server.respond( function ( request ) {
+                       request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
                } );
        } );
 
-       QUnit.asyncTest( 'Deprecated callback methods', function ( assert ) {
-               var api, d1, d2, d3;
+
+       QUnit.test( 'API error', function ( assert ) {
+               QUnit.expect( 1 );
+
+               var api = new mw.Api();
+
+               api.get( { action: 'doesntexist' } )
+                       .fail( function ( errorCode ) {
+                               assert.equal( errorCode, 'unknown_action', 'API error should reject the deferred' );
+                       } );
+
+               this.server.respond( function ( request ) {
+                       request.respond( 200, { 'Content-Type': 'application/json' },
+                               '{ "error": { "code": "unknown_action" } }'
+                       );
+               } );
+       } );
+
+       QUnit.test( 'Deprecated callback methods', function ( assert ) {
                QUnit.expect( 3 );
 
-               api = new mw.Api();
+               var api = new mw.Api();
 
-               d1 = api.get( {}, function () {
+               api.get( {}, function () {
                        assert.ok( true, 'Function argument treated as success callback.' );
                } );
 
-               d2 = api.get( {}, {
+               api.get( {}, {
                        ok: function () {
                                assert.ok( true, '"ok" property treated as success callback.' );
                        }
                } );
 
-               d3 = api.get( {
-                       action: 'doesntexist'
-               }, {
+               api.get( { action: 'doesntexist' }, {
                        err: function () {
                                assert.ok( true, '"err" property treated as error callback.' );
                        }
                } );
 
-               QUnit.whenPromisesComplete( d1, d2, d3 ).always( function () {
-                       QUnit.start();
+               this.server.respondWith( /action=query/, function ( request ) {
+                       request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
                } );
+
+               this.server.respondWith( /action=doesntexist/, function ( request ) {
+                       request.respond( 200, { 'Content-Type': 'application/json' },
+                               '{ "error": { "code": "unknown_action" } }'
+                       );
+               } );
+
+               this.server.respond();
        } );
+
 }( mediaWiki ) );
index 6e13e13..292c576 100644 (file)
@@ -17,6 +17,7 @@
                                // The values for gender are not significant,
                                // what matters is which of the values is choosen by the parser
                                'gender-msg': '$1: {{GENDER:$2|blue|pink|green}}',
+                               'gender-msg-currentuser': '{{GENDER:|blue|pink|green}}',
 
                                'plural-msg': 'Found $1 {{PLURAL:$1|item|items}}',
 
                assert.equal( formatParse( 'plural-msg', 2 ), 'Found 2 items', 'Plural test for english' );
        } );
 
-       QUnit.test( 'Gender', 11, function ( assert ) {
+       QUnit.test( 'Gender', 15, function ( assert ) {
+               var originalGender = mw.user.options.get( 'gender' );
+
                // TODO: These tests should be for mw.msg once mw.msg integrated with mw.jqueryMsg
                // TODO: English may not be the best language for these tests. Use a language like Arabic or Russian
-               var user = mw.user;
-
-               user.options.set( 'gender', 'male' );
+               mw.user.options.set( 'gender', 'male' );
                assert.equal(
                        formatParse( 'gender-msg', 'Bob', 'male' ),
                        'Bob: blue',
                        'Masculine from string "male"'
                );
                assert.equal(
-                       formatParse( 'gender-msg', 'Bob', user ),
+                       formatParse( 'gender-msg', 'Bob', mw.user ),
                        'Bob: blue',
                        'Masculine from mw.user object'
                );
-
-               user.options.set( 'gender', 'unknown' );
                assert.equal(
-                       formatParse( 'gender-msg', 'Foo', user ),
-                       'Foo: green',
-                       'Neutral from mw.user object' );
+                       formatParse( 'gender-msg-currentuser' ),
+                       'blue',
+                       'Masculine for current user'
+               );
+
+               mw.user.options.set( 'gender', 'female' );
                assert.equal(
                        formatParse( 'gender-msg', 'Alice', 'female' ),
                        'Alice: pink',
                        'Feminine from string "female"' );
+               assert.equal(
+                       formatParse( 'gender-msg', 'Alice', mw.user ),
+                       'Alice: pink',
+                       'Feminine from mw.user object'
+               );
+               assert.equal(
+                       formatParse( 'gender-msg-currentuser' ),
+                       'pink',
+                       'Feminine for current user'
+               );
+
+               mw.user.options.set( 'gender', 'unknown' );
+               assert.equal(
+                       formatParse( 'gender-msg', 'Foo', mw.user ),
+                       'Foo: green',
+                       'Neutral from mw.user object' );
                assert.equal(
                        formatParse( 'gender-msg', 'User' ),
                        'User: green',
                        'User: green',
                        'Neutral from string "unknown"'
                );
+               assert.equal(
+                       formatParse( 'gender-msg-currentuser' ),
+                       'green',
+                       'Neutral for current user'
+               );
 
                mw.messages.set( 'gender-msg-one-form', '{{GENDER:$1|User}}: $2 {{PLURAL:$2|edit|edits}}' );
 
                        ' test',
                        'Invalid syntax should result in {{gender}} simply being stripped away'
                );
+
+               mw.user.options.set( 'gender', originalGender );
        } );
 
        QUnit.test( 'Grammar', 2, function ( assert ) {
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js
new file mode 100644 (file)
index 0000000..a4db0a1
--- /dev/null
@@ -0,0 +1,40 @@
+( function ( mw, $ ) {
+       QUnit.module( 'mediawiki.toc', QUnit.newMwEnvironment() );
+
+       QUnit.asyncTest( 'toggleToc', 4, function ( assert ) {
+               var tocHtml, $toggleLink, $tocList;
+
+               function actionC() {
+                       QUnit.start();
+               }
+
+               function actionB() {
+                       assert.strictEqual( $tocList.is( ':hidden' ), true, 'Return boolean true if the TOC is now visible.' );
+                       $toggleLink.click();
+                       $tocList.promise().done( actionC );
+               }
+
+               function actionA() {
+                       assert.strictEqual( $tocList.is( ':hidden' ), false, 'Return boolean false if the TOC is now hidden.' );
+                       $toggleLink.click();
+                       $tocList.promise().done( actionB );
+               }
+
+               assert.strictEqual( $( '#toc' ).length, 0, 'Return 0 if there is no table of contents on the page.' );
+
+               tocHtml = '<div id="toc" class="toc">' +
+                       '<div id="toctitle">' +
+                       '<h2>Contents</h2>' +
+                       '</div>' +
+                       '<ul><li></li></ul>' +
+                       '</div>';
+               $( tocHtml ).appendTo( '#qunit-fixture' );
+               mw.hook( 'wikipage.content' ).fire( $( '#qunit-fixture' ) );
+               $tocList = $( '#toc ul:first' );
+               $toggleLink = $( '#togglelink' );
+
+               assert.strictEqual( $toggleLink.length, 1, 'Toggle link is appended to the page.' );
+
+               actionA();
+       } );
+}( mediaWiki, jQuery ) );
index 9216f0a..5d1d279 100644 (file)
                tocHtml = '<div id="toc" class="toc">' +
                        '<div id="toctitle">' +
                        '<h2>Contents</h2>' +
-                       '<span class="toctoggle">&nbsp;[<a href="#" class="internal" id="togglelink">Hide</a>&nbsp;]</span>' +
                        '</div>' +
                        '<ul><li></li></ul>' +
                        '</div>';
                $( tocHtml ).appendTo( '#qunit-fixture' );
+               mw.hook( 'wikipage.content' ).fire( $( '#qunit-fixture' ) );
                $toggleLink = $( '#togglelink' );
 
                assert.strictEqual( $toggleLink.length, 1, 'Toggle link is appended to the page.' );
index ad5239e..88aecbd 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -307,6 +307,9 @@ function wfStreamThumb( array $params ) {
        if ( $user->pingLimiter( 'renderfile' ) ) {
                wfThumbError( 500, wfMessage( 'actionthrottledtext' ) );
                return;
+       } elseif ( wfThumbIsAttemptThrottled( $img, $thumbName, 5 ) ) {
+               wfThumbError( 500, wfMessage( 'thumbnail_image-failure-limit', 5 ) );
+               return;
        }
 
        // Thumbnail isn't already there, so create the new thumbnail...
@@ -332,6 +335,7 @@ function wfStreamThumb( array $params ) {
        }
 
        if ( $errorMsg !== false ) {
+               wfThumbIncrAttemptFailures( $img, $thumbName );
                wfThumbError( 500, $errorMsg );
        } else {
                // Stream the file if there were no errors
@@ -339,6 +343,45 @@ function wfStreamThumb( array $params ) {
        }
 }
 
+/**
+ * @param File $img
+ * @param string $thumbName
+ * @param int $limit
+ * @return int|bool
+ */
+function wfThumbIsAttemptThrottled( File $img, $thumbName, $limit ) {
+       global $wgMemc;
+
+       return ( $wgMemc->get( wfThumbAttemptKey( $img, $thumbName ) ) >= $limit );
+}
+
+/**
+ * @param File $img
+ * @param string $thumbName
+ */
+function wfThumbIncrAttemptFailures( File $img, $thumbName ) {
+       global $wgMemc;
+
+       $key = wfThumbAttemptKey( $img, $thumbName );
+       if ( !$wgMemc->incr( $key, 1 ) ) {
+               if ( !$wgMemc->add( $key, 1, 3600 ) ) {
+                       $wgMemc->incr( $key, 1 );
+               }
+       }
+}
+
+/**
+ * @param File $img
+ * @param string $thumbName
+ * @return string
+ */
+function wfThumbAttemptKey( File $img, $thumbName ) {
+       global $wgAttemptFailureEpoch;
+
+       return wfMemcKey( 'attempt-failures', $wgAttemptFailureEpoch,
+               $img->getRepo()->getName(), md5( $img->getName() ), md5( $thumbName ) );
+}
+
 /**
  * Convert pathinfo type parameter, into normal request parameters
  *