Merge "Revert "Convert Special:Search to OOUI""
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 24 Jul 2015 21:00:16 +0000 (21:00 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 24 Jul 2015 21:00:16 +0000 (21:00 +0000)
777 files changed:
.jscsrc
.jshintignore
.jshintrc
.rubocop.yml
Gemfile.lock
Gruntfile.js
RELEASE-NOTES-1.26
autoload.php
composer.json
docs/hooks.txt
includes/DefaultSettings.php
includes/EditPage.php
includes/Export.php
includes/GlobalFunctions.php
includes/Hooks.php
includes/Html.php
includes/HttpFunctions.php
includes/Linker.php
includes/MediaWiki.php
includes/Message.php
includes/OutputPage.php
includes/PHPVersionCheck.php
includes/Sanitizer.php
includes/TemplateParser.php
includes/Title.php
includes/User.php
includes/WatchedItem.php
includes/ZhConversion.php
includes/actions/InfoAction.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiMain.php
includes/api/ApiMessage.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiStashEdit.php
includes/api/ApiUpload.php
includes/api/i18n/bs.json
includes/api/i18n/ca.json
includes/api/i18n/ckb.json [new file with mode: 0644]
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/eu.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/ht.json [new file with mode: 0644]
includes/api/i18n/it.json
includes/api/i18n/ja.json
includes/api/i18n/ko.json
includes/api/i18n/ksh.json
includes/api/i18n/ky.json [new file with mode: 0644]
includes/api/i18n/lb.json
includes/api/i18n/oc.json
includes/api/i18n/pl.json
includes/api/i18n/qqq.json
includes/api/i18n/ru.json
includes/api/i18n/sv.json
includes/api/i18n/uk.json
includes/api/i18n/vi.json
includes/api/i18n/wuu.json [new file with mode: 0644]
includes/api/i18n/zh-hans.json
includes/api/i18n/zh-hant.json
includes/cache/LCStoreStaticArray.php
includes/cache/LinkBatch.php
includes/cache/MessageCache.php
includes/cache/UserCache.php
includes/changes/EnhancedChangesList.php
includes/changetags/ChangeTags.php
includes/changetags/ChangeTagsRevisionList.php
includes/content/JavaScriptContent.php
includes/content/JavaScriptContentHandler.php
includes/context/RequestContext.php
includes/db/DBConnRef.php
includes/db/Database.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabasePostgres.php
includes/db/IDatabase.php [new file with mode: 0644]
includes/db/LoadMonitor.php
includes/db/LoadMonitorMySQL.php [new file with mode: 0644]
includes/debug/logger/LegacyLogger.php
includes/debug/logger/LegacySpi.php
includes/debug/logger/LoggerFactory.php
includes/debug/logger/MonologSpi.php
includes/debug/logger/NullSpi.php
includes/debug/logger/Spi.php
includes/debug/logger/monolog/LegacyFormatter.php
includes/exception/MWExceptionHandler.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendStore.php
includes/filebackend/SwiftFileBackend.php
includes/filerepo/FileBackendDBRepoWrapper.php [new file with mode: 0644]
includes/filerepo/FileRepo.php
includes/filerepo/ForeignDBRepo.php
includes/filerepo/ForeignDBViaLBRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/gallery/PackedImageGallery.php
includes/htmlform/HTMLButtonField.php
includes/htmlform/HTMLCheckField.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/HTMLFormFieldWithButton.php
includes/htmlform/HTMLSelectNamespace.php
includes/htmlform/HTMLTextAreaField.php
includes/htmlform/HTMLTextField.php
includes/htmlform/HTMLTitleTextField.php [new file with mode: 0644]
includes/htmlform/HTMLUserTextField.php [new file with mode: 0644]
includes/htmlform/OOUIHTMLForm.php
includes/htmlform/VFormHTMLForm.php
includes/installer/MysqlInstaller.php
includes/installer/PostgresInstaller.php
includes/installer/PostgresUpdater.php
includes/installer/WebInstallerPage.php
includes/installer/i18n/ar.json
includes/installer/i18n/bn.json
includes/installer/i18n/bs.json
includes/installer/i18n/ce.json
includes/installer/i18n/cu.json
includes/installer/i18n/en.json
includes/installer/i18n/es.json
includes/installer/i18n/gl.json
includes/installer/i18n/hy.json
includes/installer/i18n/it.json
includes/installer/i18n/ja.json
includes/installer/i18n/ksh.json
includes/installer/i18n/nan.json
includes/installer/i18n/pl.json
includes/installer/i18n/ps.json
includes/installer/i18n/qqq.json
includes/installer/i18n/sv.json
includes/installer/i18n/vi.json
includes/installer/i18n/zh-hant.json
includes/jobqueue/JobQueue.php
includes/jobqueue/jobs/EmaillingJob.php
includes/jobqueue/jobs/RecentChangesUpdateJob.php
includes/libs/BufferingStatsdDataFactory.php
includes/libs/MultiHttpClient.php
includes/libs/objectcache/APCBagOStuff.php
includes/libs/objectcache/WANObjectCache.php
includes/mail/EmailNotification.php
includes/mail/UserMailer.php
includes/media/SVG.php
includes/media/XMP.php
includes/objectcache/MemcachedClient.php
includes/objectcache/RedisBagOStuff.php
includes/page/Article.php
includes/page/ImagePage.php
includes/parser/CoreParserFunctions.php
includes/parser/Parser.php
includes/password/UserPasswordPolicy.php
includes/profiler/output/ProfilerOutputStats.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderJqueryMsgModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/search/SearchMySQL.php
includes/search/SearchPostgres.php
includes/site/SiteSQLStore.php
includes/specialpage/FormSpecialPage.php
includes/specialpage/QueryPage.php
includes/specials/SpecialAllMessages.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWhatlinkshere.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
includes/upload/UploadBase.php
includes/upload/UploadFromUrl.php
includes/widget/AUTHORS.txt
includes/widget/NamespaceInputWidget.php [new file with mode: 0644]
includes/widget/TitleInputWidget.php
includes/widget/UserInputWidget.php [new file with mode: 0644]
jsduck.json
languages/Language.php
languages/Names.php
languages/i18n/af.json
languages/i18n/an.json
languages/i18n/ar.json
languages/i18n/arn.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/awa.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/bar.json
languages/i18n/bcc.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bho.json
languages/i18n/bjn.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/cdo.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/cv.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/frp.json
languages/i18n/frr.json
languages/i18n/fy.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/gom-deva.json
languages/i18n/gom-latn.json
languages/i18n/grc.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hsb.json
languages/i18n/ht.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ie.json
languages/i18n/ilo.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kab.json
languages/i18n/kk-cyrl.json
languages/i18n/km.json
languages/i18n/kn.json
languages/i18n/ko.json
languages/i18n/krc.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/ky.json
languages/i18n/lb.json
languages/i18n/li.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/luz.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/mai.json
languages/i18n/mdf.json
languages/i18n/mg.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mn.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/mzn.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/oc.json
languages/i18n/or.json
languages/i18n/pam.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.json
languages/i18n/prg.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/rm.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/ses.json
languages/i18n/sh.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sli.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/stq.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/sw.json
languages/i18n/szl.json
languages/i18n/te.json
languages/i18n/tg-cyrl.json
languages/i18n/tg-latn.json
languages/i18n/th.json
languages/i18n/tk.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/ug-arab.json
languages/i18n/uk.json
languages/i18n/vec.json
languages/i18n/vi.json
languages/i18n/vo.json
languages/i18n/wa.json
languages/i18n/wuu.json
languages/i18n/xmf.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesAzb.php
languages/messages/MessagesBcc.php
languages/messages/MessagesBgn.php
languages/messages/MessagesEn.php
languages/messages/MessagesLuz.php [new file with mode: 0644]
languages/messages/MessagesLv.php
languages/messages/MessagesPnb.php
maintenance/createAndPromote.php
maintenance/findHooks.php
maintenance/jsduck/categories.json
maintenance/jsduck/custom_tags.rb
maintenance/jsduck/external.js
maintenance/language/zhtable/simp2trad.manual
maintenance/language/zhtable/toCN.manual
maintenance/language/zhtable/toHK.manual
maintenance/language/zhtable/toTW.manual
maintenance/language/zhtable/toTrad.manual
maintenance/language/zhtable/tradphrases.manual
maintenance/language/zhtable/tradphrases_exclude.manual
maintenance/migrateFileRepoLayout.php [new file with mode: 0644]
maintenance/parse.php
maintenance/postgres/archives/patch-textsearch_bug66650.sql [new file with mode: 0644]
maintenance/postgres/update-keys.sql
maintenance/rebuildLocalisationCache.php
maintenance/sql.php
phpcs.xml [new file with mode: 0644]
resources/Resources.php
resources/ResourcesOOUI.php
resources/lib/jquery.i18n/CREDITS [new file with mode: 0644]
resources/lib/jquery.i18n/GPL-LICENSE [new file with mode: 0644]
resources/lib/jquery.i18n/MIT-LICENSE [new file with mode: 0644]
resources/lib/jquery.i18n/README.md [new file with mode: 0644]
resources/lib/jquery.i18n/package.json [new file with mode: 0644]
resources/lib/jquery.i18n/src/jquery.i18n.emitter.bidi.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/jquery.i18n.emitter.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/jquery.i18n.fallbacks.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/jquery.i18n.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/jquery.i18n.language.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/jquery.i18n.messagestore.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/jquery.i18n.parser.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/bs.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/dsb.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/fi.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/ga.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/he.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/hsb.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/hu.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/hy.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/la.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/ml.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/os.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/ru.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/sl.js [new file with mode: 0644]
resources/lib/jquery.i18n/src/languages/uk.js [new file with mode: 0644]
resources/lib/mustache/LICENSE [new file with mode: 0644]
resources/lib/oojs-ui/i18n/arq.json
resources/lib/oojs-ui/i18n/as.json
resources/lib/oojs-ui/i18n/ast.json
resources/lib/oojs-ui/i18n/be-tarask.json
resources/lib/oojs-ui/i18n/be.json
resources/lib/oojs-ui/i18n/bg.json
resources/lib/oojs-ui/i18n/bn.json
resources/lib/oojs-ui/i18n/bs.json
resources/lib/oojs-ui/i18n/ca.json
resources/lib/oojs-ui/i18n/ckb.json
resources/lib/oojs-ui/i18n/cu.json
resources/lib/oojs-ui/i18n/da.json
resources/lib/oojs-ui/i18n/dty.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/el.json
resources/lib/oojs-ui/i18n/eo.json
resources/lib/oojs-ui/i18n/et.json
resources/lib/oojs-ui/i18n/eu.json
resources/lib/oojs-ui/i18n/fa.json
resources/lib/oojs-ui/i18n/fi.json
resources/lib/oojs-ui/i18n/fr.json
resources/lib/oojs-ui/i18n/gu.json
resources/lib/oojs-ui/i18n/hi.json
resources/lib/oojs-ui/i18n/hu-formal.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/hu.json
resources/lib/oojs-ui/i18n/hy.json
resources/lib/oojs-ui/i18n/id.json
resources/lib/oojs-ui/i18n/ja.json
resources/lib/oojs-ui/i18n/jv.json
resources/lib/oojs-ui/i18n/ka.json
resources/lib/oojs-ui/i18n/ko.json
resources/lib/oojs-ui/i18n/la.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/li.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/lt.json
resources/lib/oojs-ui/i18n/ml.json
resources/lib/oojs-ui/i18n/mr.json
resources/lib/oojs-ui/i18n/ms.json
resources/lib/oojs-ui/i18n/nb.json
resources/lib/oojs-ui/i18n/nl.json
resources/lib/oojs-ui/i18n/oc.json
resources/lib/oojs-ui/i18n/om.json
resources/lib/oojs-ui/i18n/or.json
resources/lib/oojs-ui/i18n/pa.json
resources/lib/oojs-ui/i18n/pl.json
resources/lib/oojs-ui/i18n/pms.json
resources/lib/oojs-ui/i18n/ps.json
resources/lib/oojs-ui/i18n/pt-br.json
resources/lib/oojs-ui/i18n/ru.json
resources/lib/oojs-ui/i18n/sah.json
resources/lib/oojs-ui/i18n/sco.json
resources/lib/oojs-ui/i18n/sh.json
resources/lib/oojs-ui/i18n/sk.json
resources/lib/oojs-ui/i18n/sl.json
resources/lib/oojs-ui/i18n/sq.json
resources/lib/oojs-ui/i18n/sv.json
resources/lib/oojs-ui/i18n/ta.json
resources/lib/oojs-ui/i18n/tl.json
resources/lib/oojs-ui/i18n/uk.json
resources/lib/oojs-ui/i18n/vi.json
resources/lib/oojs-ui/i18n/yi.json
resources/lib/oojs-ui/i18n/yue.json
resources/lib/oojs-ui/i18n/zh-hant.json
resources/lib/oojs-ui/oojs-ui-apex-noimages.css
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-mediawiki-noimages.css
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/themes/apex/icons-editing-core.json
resources/lib/oojs-ui/themes/apex/icons-editing-styling.json
resources/lib/oojs-ui/themes/apex/icons.json
resources/lib/oojs-ui/themes/apex/images/icons/advanced.png
resources/lib/oojs-ui/themes/apex/images/icons/advanced.svg
resources/lib/oojs-ui/themes/apex/images/icons/alert.png
resources/lib/oojs-ui/themes/apex/images/icons/alert.svg
resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.png
resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.svg
resources/lib/oojs-ui/themes/apex/images/icons/bold-arab-ain.png
resources/lib/oojs-ui/themes/apex/images/icons/bold-arab-ain.svg
resources/lib/oojs-ui/themes/apex/images/icons/bold-arab-dad.png
resources/lib/oojs-ui/themes/apex/images/icons/bold-arab-dad.svg
resources/lib/oojs-ui/themes/apex/images/icons/bold-armn-to.png
resources/lib/oojs-ui/themes/apex/images/icons/bold-armn-to.svg
resources/lib/oojs-ui/themes/apex/images/icons/bold-cyrl-be.svg
resources/lib/oojs-ui/themes/apex/images/icons/bold-cyrl-zhe.png
resources/lib/oojs-ui/themes/apex/images/icons/bold-cyrl-zhe.svg
resources/lib/oojs-ui/themes/apex/images/icons/bold-g.png
resources/lib/oojs-ui/themes/apex/images/icons/bold-g.svg
resources/lib/oojs-ui/themes/apex/images/icons/cancel.svg
resources/lib/oojs-ui/themes/apex/images/icons/case-sensitive.png
resources/lib/oojs-ui/themes/apex/images/icons/case-sensitive.svg
resources/lib/oojs-ui/themes/apex/images/icons/check.svg
resources/lib/oojs-ui/themes/apex/images/icons/code.svg
resources/lib/oojs-ui/themes/apex/images/icons/editLock-ltr.svg
resources/lib/oojs-ui/themes/apex/images/icons/editLock-rtl.svg
resources/lib/oojs-ui/themes/apex/images/icons/external-link-rtl.svg
resources/lib/oojs-ui/themes/apex/images/icons/find-ltr.png
resources/lib/oojs-ui/themes/apex/images/icons/find-ltr.svg
resources/lib/oojs-ui/themes/apex/images/icons/find-rtl.png
resources/lib/oojs-ui/themes/apex/images/icons/find-rtl.svg
resources/lib/oojs-ui/themes/apex/images/icons/help-ltr.svg
resources/lib/oojs-ui/themes/apex/images/icons/help-rtl.svg
resources/lib/oojs-ui/themes/apex/images/icons/history.png
resources/lib/oojs-ui/themes/apex/images/icons/history.svg
resources/lib/oojs-ui/themes/apex/images/icons/italic-arab-keheh-jeem.png
resources/lib/oojs-ui/themes/apex/images/icons/italic-arab-keheh-jeem.svg
resources/lib/oojs-ui/themes/apex/images/icons/italic-arab-meem.png
resources/lib/oojs-ui/themes/apex/images/icons/italic-arab-meem.svg
resources/lib/oojs-ui/themes/apex/images/icons/italic-armn-sha.png
resources/lib/oojs-ui/themes/apex/images/icons/italic-armn-sha.svg
resources/lib/oojs-ui/themes/apex/images/icons/italic-c.png
resources/lib/oojs-ui/themes/apex/images/icons/italic-c.svg
resources/lib/oojs-ui/themes/apex/images/icons/italic-d.png
resources/lib/oojs-ui/themes/apex/images/icons/italic-d.svg
resources/lib/oojs-ui/themes/apex/images/icons/italic-e.svg
resources/lib/oojs-ui/themes/apex/images/icons/italic-geor-kan.png
resources/lib/oojs-ui/themes/apex/images/icons/italic-geor-kan.svg
resources/lib/oojs-ui/themes/apex/images/icons/italic-s.png
resources/lib/oojs-ui/themes/apex/images/icons/italic-s.svg
resources/lib/oojs-ui/themes/apex/images/icons/language.png
resources/lib/oojs-ui/themes/apex/images/icons/language.svg
resources/lib/oojs-ui/themes/apex/images/icons/link.svg
resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.png
resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.svg
resources/lib/oojs-ui/themes/apex/images/icons/notice.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/notice.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/regular-expression.png
resources/lib/oojs-ui/themes/apex/images/icons/regular-expression.svg
resources/lib/oojs-ui/themes/apex/images/icons/search.png
resources/lib/oojs-ui/themes/apex/images/icons/search.svg
resources/lib/oojs-ui/themes/apex/images/icons/secure-link.svg
resources/lib/oojs-ui/themes/apex/images/icons/specialCharacter.png
resources/lib/oojs-ui/themes/apex/images/icons/specialCharacter.svg
resources/lib/oojs-ui/themes/apex/images/icons/strikethrough-s.svg
resources/lib/oojs-ui/themes/apex/images/icons/tag.png
resources/lib/oojs-ui/themes/apex/images/icons/tag.svg
resources/lib/oojs-ui/themes/apex/images/icons/text-style.svg
resources/lib/oojs-ui/themes/apex/images/icons/underline-a.png
resources/lib/oojs-ui/themes/apex/images/icons/underline-a.svg
resources/lib/oojs-ui/themes/apex/images/icons/underline-u.svg
resources/lib/oojs-ui/themes/apex/images/indicators/clear.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/indicators/clear.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/indicators/search-ltr.png
resources/lib/oojs-ui/themes/apex/images/indicators/search-ltr.svg
resources/lib/oojs-ui/themes/apex/images/indicators/search-rtl.png
resources/lib/oojs-ui/themes/apex/images/indicators/search-rtl.svg
resources/lib/oojs-ui/themes/apex/indicators.json
resources/lib/oojs-ui/themes/mediawiki/icons-editing-styling.json
resources/lib/oojs-ui/themes/mediawiki/icons.json
resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/alert-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/alert-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/alert-warning.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/alert-warning.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/alert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/alert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-be-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-be.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-zhe-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-zhe-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-zhe.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-zhe.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/cancel-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/cancel.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/code-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/code.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editLock-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editLock-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editLock-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editLock-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/history-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/history-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/history.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/history.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-e-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-e.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/language.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/language.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-ltr-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-rtl-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/notice-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/notice-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/notice.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/notice.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/secure-link-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/secure-link.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-s-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-s.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-constructive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-destructive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-progressive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-warning.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-warning.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-style-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-style.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-ltr-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-rtl-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-a-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-a-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-a.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-a.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-u-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-u.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/indicators.json
resources/lib/oojs/oojs.jquery.js
resources/lib/qunitjs/qunit.css
resources/lib/qunitjs/qunit.js
resources/lib/sinonjs/sinon-1.15.0.js [deleted file]
resources/lib/sinonjs/sinon-1.15.4.js [new file with mode: 0644]
resources/lib/sinonjs/sinon-ie-1.15.0.js [deleted file]
resources/lib/sinonjs/sinon-ie-1.15.4.js [new file with mode: 0644]
resources/src/jquery/jquery.highlightText.js
resources/src/jquery/jquery.makeCollapsible.js
resources/src/jquery/jquery.tablesorter.js
resources/src/mediawiki.api/mediawiki.api.upload.js [new file with mode: 0644]
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.less/mediawiki.ui/mixins.less
resources/src/mediawiki.less/mediawiki.ui/variables.less
resources/src/mediawiki.messagePoster/mediawiki.messagePoster.factory.js
resources/src/mediawiki.page/mediawiki.page.ready.js
resources/src/mediawiki.skinning/elements.css
resources/src/mediawiki.ui/components/buttons.less
resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.base.css [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js
resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.infuse.js [deleted file]
resources/src/mediawiki/mediawiki.Upload.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.htmlform.ooui.css
resources/src/mediawiki/mediawiki.jqueryMsg.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.searchSuggest.js
resources/src/mediawiki/mediawiki.util.js
resources/src/startup.js
tests/browser/environments.yml
tests/browser/features/step_definitions/create_account_steps.rb
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/data/templates/bad_partial.mustache [new file with mode: 0644]
tests/phpunit/data/templates/has_partial.mustache [new file with mode: 0644]
tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/TemplateParserTest.php
tests/phpunit/includes/api/ApiMessageTest.php
tests/phpunit/includes/cache/MessageCacheTest.php
tests/phpunit/includes/content/CssContentTest.php
tests/phpunit/includes/content/JavaScriptContentHandlerTest.php [new file with mode: 0644]
tests/phpunit/includes/content/JavaScriptContentTest.php
tests/phpunit/includes/db/ORMTableTest.php
tests/phpunit/includes/debug/logger/LegacyLoggerTest.php [new file with mode: 0644]
tests/phpunit/includes/debug/logger/MonologSpiTest.php [new file with mode: 0644]
tests/phpunit/includes/debug/logging/LegacyLoggerTest.php [deleted file]
tests/phpunit/includes/filerepo/FileBackendDBRepoWrapperTest.php [new file with mode: 0644]
tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php [new file with mode: 0644]
tests/phpunit/includes/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/phpunit.php
tests/qunit/QUnitTestResources.php
tests/qunit/data/generateJqueryMsgData.php
tests/qunit/data/mediawiki.jqueryMsg.data.js
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.upload.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
thumb.php

diff --git a/.jscsrc b/.jscsrc
index 98b81db..6a3c564 100644 (file)
--- a/.jscsrc
+++ b/.jscsrc
@@ -3,5 +3,17 @@
 
        "disallowQuotedKeysInObjects": null,
        "requireSpacesInsideParentheses": null,
-       "requireSpacesInsideArrayBrackets": null
+       "requireSpacesInsideArrayBrackets": null,
+
+       "excludeFiles": [
+               "docs/**",
+               "extensions/**",
+               "node_modules/**",
+               "resources/lib/**",
+               "resources/src/jquery.tipsy/**",
+               "resources/src/jquery/jquery.farbtastic.js",
+               "resources/src/mediawiki.libs/**",
+               "skins/**",
+               "vendor/**"
+       ]
 }
index 1882151..fdde7d0 100644 (file)
@@ -8,4 +8,5 @@ resources/lib/**
 resources/src/jquery.tipsy/**
 resources/src/jquery/jquery.farbtastic.js
 resources/src/mediawiki.libs/**
-tests/frontend/node_modules/**
+skins/**
+vendor/**
index d72c31d..b84d276 100644 (file)
--- a/.jshintrc
+++ b/.jshintrc
@@ -22,6 +22,7 @@
                "mediaWiki": true,
                "JSON": true,
                "OO": true,
+               "performance": true,
                "jQuery": false,
                "QUnit": false,
                "sinon": false
index 61ffc1a..5b6c3f2 100644 (file)
@@ -1,6 +1,7 @@
 AllCops:
   Exclude:
     - 'extensions/**/*'
+    - 'node_modules/**/*'
     - 'skins/**/*'
     - 'tests/frontend/node_modules/**/*'
     - 'vendor/**/*'
index 7aa9dae..3a695ef 100644 (file)
@@ -7,7 +7,7 @@ GEM
     builder (3.2.2)
     childprocess (0.5.6)
       ffi (~> 1.0, >= 1.0.11)
-    cucumber (1.3.19)
+    cucumber (1.3.20)
       builder (>= 2.1.2)
       diff-lcs (>= 1.1.3)
       gherkin (~> 2.12)
@@ -26,7 +26,7 @@ GEM
     faraday-cookie_jar (0.0.6)
       faraday (>= 0.7.4)
       http-cookie (~> 1.0.0)
-    ffi (1.9.8)
+    ffi (1.9.10)
     gherkin (2.12.2)
       multi_json (~> 1.3)
     headless (1.0.2)
@@ -34,7 +34,7 @@ GEM
       domain_name (~> 0.5)
     i18n (0.7.0)
     json (1.8.3)
-    mediawiki_api (0.3.1)
+    mediawiki_api (0.4.1)
       faraday (~> 0.9, >= 0.9.0)
       faraday-cookie_jar (~> 0.0, >= 0.0.6)
     mediawiki_selenium (1.2.1)
@@ -48,7 +48,7 @@ GEM
       syntax (~> 1.2, >= 1.2.0)
       thor (~> 0.19, >= 0.19.1)
     mime-types (2.6.1)
-    multi_json (1.11.0)
+    multi_json (1.11.2)
     multi_test (0.1.2)
     multipart-post (2.0.0)
     netrc (0.10.3)
@@ -58,7 +58,7 @@ GEM
       watir-webdriver (>= 0.6.11)
     page_navigation (0.9)
       data_magic (>= 0.14)
-    parser (2.2.2.5)
+    parser (2.2.2.6)
       ast (>= 1.1, < 3.0)
     powerpack (0.1.1)
     rainbow (2.0.0)
@@ -68,15 +68,15 @@ GEM
       netrc (~> 0.7)
     rspec-expectations (2.99.2)
       diff-lcs (>= 1.1.3, < 2.0)
-    rubocop (0.31.0)
+    rubocop (0.32.1)
       astrolabe (~> 1.3)
-      parser (>= 2.2.2.1, < 3.0)
+      parser (>= 2.2.2.5, < 3.0)
       powerpack (~> 0.1)
       rainbow (>= 1.99.1, < 3.0)
       ruby-progressbar (~> 1.4)
     ruby-progressbar (1.7.5)
     rubyzip (1.1.7)
-    selenium-webdriver (2.45.0)
+    selenium-webdriver (2.46.2)
       childprocess (~> 0.5)
       multi_json (~> 1.0)
       rubyzip (~> 1.0)
@@ -86,8 +86,8 @@ GEM
     unf (0.1.4)
       unf_ext
     unf_ext (0.0.7.1)
-    watir-webdriver (0.7.0)
-      selenium-webdriver (>= 2.45)
+    watir-webdriver (0.8.0)
+      selenium-webdriver (>= 2.46.2)
     websocket (1.2.2)
     yml_reader (0.5)
 
@@ -97,3 +97,6 @@ PLATFORMS
 DEPENDENCIES
   mediawiki_selenium (~> 1.2.1)
   rubocop
+
+BUNDLED WITH
+   1.10.5
index 573db69..e1e5e4a 100644 (file)
@@ -15,39 +15,20 @@ module.exports = function ( grunt ) {
        karmaProxy[wgScriptPath] = wgServer + wgScriptPath;
 
        grunt.initConfig( {
-               pkg: grunt.file.readJSON( 'package.json' ),
                jshint: {
                        options: {
                                jshintrc: true
                        },
-                       all: [
-                               '*.js',
-                               '{includes,languages,resources,tests}/**/*.js'
-                       ]
+                       all: '.'
                },
                jscs: {
-                       all: [
-                               '<%= jshint.all %>',
-                               // Auto-generated file with JSON (double quotes)
-                               '!tests/qunit/data/mediawiki.jqueryMsg.data.js',
-                               // Skip functions are stored as script files but wrapped in a function when
-                               // executed. node-jscs trips on the would-be "Illegal return statement".
-                               '!resources/src/*-skip.js'
-
-                       // Exclude all files ignored by jshint
-                       ].concat( grunt.file.read( '.jshintignore' ).split( '\n' ).reduce( function ( patterns, pattern ) {
-                               // Filter out empty lines
-                               if ( pattern.length && pattern[0] !== '#' ) {
-                                       patterns.push( '!' + pattern );
-                               }
-                               return patterns;
-                       }, [] ) )
+                       all: '.'
                },
                jsonlint: {
                        all: [
                                '.jscsrc',
-                               '{languages,maintenance,resources}/**/*.json',
-                               'package.json'
+                               '**/*.json',
+                               '!{docs/js,extensions,node_modules,skins,vendor}/**'
                        ]
                },
                banana: {
@@ -57,10 +38,9 @@ module.exports = function ( grunt ) {
                },
                watch: {
                        files: [
-                               '<%= jscs.all %>',
-                               '<%= jsonlint.all %>',
-                               '.jshintignore',
-                               '.jshintrc'
+                               '.js*',
+                               '**/*',
+                               '!{docs,extensions,node_modules,skins,vendor}/**'
                        ],
                        tasks: 'test'
                },
index 111e775..f22a546 100644 (file)
@@ -9,6 +9,7 @@ MediaWiki 1.26 is an alpha-quality branch and is not recommended for use in
 production.
 
 === Configuration changes in 1.26 ===
+* $wgPasswordResetRoutes['email'] = true by default.
 * $wgEnableParserCache was deprecated, set $wgParserCacheType to CACHE_NONE
   instead if you want to disable the parser cache.
 * New-style continuation is now the default for API action=continue. Clients may
@@ -41,13 +42,19 @@ production.
 * Added new hooks 'EnhancedChangesListModifyLineData' &
   'EnhancedChangesListModifyBlockLineData', to modify the data used to build
   lines in enhanced recentchanges and watchlist.
+* Caches that need purging ability now use the WANObjectCache interface.
+  This corresponds to a new $wgMainWANCache setting, which defaults to using
+  the $wgMainCacheType settings.
+* Callers needing fast light-weight data stores use $wgMainStash to select
+  the store type from $wgObjectCaches. The default is the local database.
 
 ==== External libraries ====
 * Update es5-shim from v4.0.0 to v4.1.5.
 * Update json2 from revision 2014-02-04 to 2015-05-03.
-* Update Sinon.JS from 1.10.3 to 1.15.0.
+* Update Sinon.JS from 1.10.3 to 1.15.4.
 * Upgrade jQuery Client from v1.0.0 to v2.0.0.
-* Added mediawiki/at-ease 1.0.0
+* Added mediawiki/at-ease 1.0.0.
+* Update QUnit from v1.17.1 to v1.18.0.
 
 === Bug fixes in 1.26 ===
 * (T53283) load.php sometimes sends 304 response without full headers
@@ -82,6 +89,7 @@ changes to languages because of Phabricator reports.
 * Languages added:
 ** dty (डोटेली/Doteli), thanks to translators जनक राज भट्ट, बिप्लब आनन्द,
    मेश सिंह बोहरा, and राम प्रसाद जोशी
+** luz (لئری جئنوٙڤی / Southern Luri)
 
 === Other changes in 1.26 ===
 * ChangeTags::tagDescription() will return false if the interface message
@@ -126,6 +134,7 @@ changes to languages because of Phabricator reports.
 * $wgSpecialPageGroups was removed (deprecated in 1.21).
 * SpecialPageFactory::setGroup was removed (deprecated in 1.21).
 * SpecialPageFactory::getGroup was removed (deprecated in 1.21).
+* DatabaseBase::ignoreErrors() is now protected.
 
 == Compatibility ==
 
index 8e4da1e..a8940c4 100644 (file)
@@ -418,6 +418,7 @@ $wgAutoloadLocalClasses = array(
        'Field' => __DIR__ . '/includes/db/DatabaseUtility.php',
        'File' => __DIR__ . '/includes/filerepo/file/File.php',
        'FileBackend' => __DIR__ . '/includes/filebackend/FileBackend.php',
+       'FileBackendDBRepoWrapper' => __DIR__ . '/includes/filerepo/FileBackendDBRepoWrapper.php',
        'FileBackendError' => __DIR__ . '/includes/filebackend/FileBackend.php',
        'FileBackendException' => __DIR__ . '/includes/filebackend/FileBackend.php',
        'FileBackendGroup' => __DIR__ . '/includes/filebackend/FileBackendGroup.php',
@@ -488,10 +489,10 @@ $wgAutoloadLocalClasses = array(
        'HTMLFileCache' => __DIR__ . '/includes/cache/HTMLFileCache.php',
        'HTMLFloatField' => __DIR__ . '/includes/htmlform/HTMLFloatField.php',
        'HTMLForm' => __DIR__ . '/includes/htmlform/HTMLForm.php',
-       'HTMLFormFieldWithButton' => __DIR__ . '/includes/htmlform/HTMLFormFieldWithButton.php',
        'HTMLFormField' => __DIR__ . '/includes/htmlform/HTMLFormField.php',
        'HTMLFormFieldCloner' => __DIR__ . '/includes/htmlform/HTMLFormFieldCloner.php',
        'HTMLFormFieldRequiredOptionsException' => __DIR__ . '/includes/htmlform/HTMLFormFieldRequiredOptionsException.php',
+       'HTMLFormFieldWithButton' => __DIR__ . '/includes/htmlform/HTMLFormFieldWithButton.php',
        'HTMLHiddenField' => __DIR__ . '/includes/htmlform/HTMLHiddenField.php',
        'HTMLInfoField' => __DIR__ . '/includes/htmlform/HTMLInfoField.php',
        'HTMLIntField' => __DIR__ . '/includes/htmlform/HTMLIntField.php',
@@ -509,6 +510,8 @@ $wgAutoloadLocalClasses = array(
        'HTMLTextAreaField' => __DIR__ . '/includes/htmlform/HTMLTextAreaField.php',
        'HTMLTextField' => __DIR__ . '/includes/htmlform/HTMLTextField.php',
        'HTMLTextFieldWithButton' => __DIR__ . '/includes/htmlform/HTMLTextFieldWithButton.php',
+       'HTMLTitleTextField' => __DIR__ . '/includes/htmlform/HTMLTitleTextField.php',
+       'HTMLUserTextField' => __DIR__ . '/includes/htmlform/HTMLUserTextField.php',
        'HWLDFWordAccumulator' => __DIR__ . '/includes/diff/DairikiDiff.php',
        'HashBagOStuff' => __DIR__ . '/includes/libs/objectcache/HashBagOStuff.php',
        'HashConfig' => __DIR__ . '/includes/config/HashConfig.php',
@@ -530,7 +533,7 @@ $wgAutoloadLocalClasses = array(
        'ICacheHelper' => __DIR__ . '/includes/cache/CacheHelper.php',
        'IContextSource' => __DIR__ . '/includes/context/IContextSource.php',
        'IDBAccessObject' => __DIR__ . '/includes/dao/IDBAccessObject.php',
-       'IDatabase' => __DIR__ . '/includes/db/Database.php',
+       'IDatabase' => __DIR__ . '/includes/db/IDatabase.php',
        'IEContentAnalyzer' => __DIR__ . '/includes/libs/IEContentAnalyzer.php',
        'IEUrlExtension' => __DIR__ . '/includes/libs/IEUrlExtension.php',
        'IJobSpecification' => __DIR__ . '/includes/jobqueue/JobSpecification.php',
@@ -678,7 +681,7 @@ $wgAutoloadLocalClasses = array(
        'LoadBalancer' => __DIR__ . '/includes/db/LoadBalancer.php',
        'LoadBalancerSingle' => __DIR__ . '/includes/db/LBFactorySingle.php',
        'LoadMonitor' => __DIR__ . '/includes/db/LoadMonitor.php',
-       'LoadMonitorMySQL' => __DIR__ . '/includes/db/LoadMonitor.php',
+       'LoadMonitorMySQL' => __DIR__ . '/includes/db/LoadMonitorMySQL.php',
        'LoadMonitorNull' => __DIR__ . '/includes/db/LoadMonitor.php',
        'LocalFile' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
        'LocalFileDeleteBatch' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
@@ -753,7 +756,9 @@ $wgAutoloadLocalClasses = array(
        'MediaWiki\\Logger\\Monolog\\WikiProcessor' => __DIR__ . '/includes/debug/logger/monolog/WikiProcessor.php',
        'MediaWiki\\Logger\\NullSpi' => __DIR__ . '/includes/debug/logger/NullSpi.php',
        'MediaWiki\\Logger\\Spi' => __DIR__ . '/includes/debug/logger/Spi.php',
+       'MediaWiki\\Widget\\NamespaceInputWidget' => __DIR__ . '/includes/widget/NamespaceInputWidget.php',
        'MediaWiki\\Widget\\TitleInputWidget' => __DIR__ . '/includes/widget/TitleInputWidget.php',
+       'MediaWiki\\Widget\\UserInputWidget' => __DIR__ . '/includes/widget/UserInputWidget.php',
        'MemCachedClientforWiki' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
        'MemcLockManager' => __DIR__ . '/includes/filebackend/lockmanager/MemcLockManager.php',
        'MemcachedBagOStuff' => __DIR__ . '/includes/objectcache/MemcachedBagOStuff.php',
@@ -768,6 +773,7 @@ $wgAutoloadLocalClasses = array(
        'MessageCache' => __DIR__ . '/includes/cache/MessageCache.php',
        'MessageContent' => __DIR__ . '/includes/content/MessageContent.php',
        'MessageSpecifier' => __DIR__ . '/includes/libs/MessageSpecifier.php',
+       'MigrateFileRepoLayout' => __DIR__ . '/maintenance/migrateFileRepoLayout.php',
        'MigrateUserGroup' => __DIR__ . '/maintenance/migrateUserGroup.php',
        'MimeMagic' => __DIR__ . '/includes/MimeMagic.php',
        'MinifyScript' => __DIR__ . '/maintenance/minify.php',
@@ -896,6 +902,7 @@ $wgAutoloadLocalClasses = array(
        'PoolWorkArticleView' => __DIR__ . '/includes/poolcounter/PoolWorkArticleView.php',
        'PopulateBacklinkNamespace' => __DIR__ . '/maintenance/populateBacklinkNamespace.php',
        'PopulateCategory' => __DIR__ . '/maintenance/populateCategory.php',
+       'PopulateContentModel' => __DIR__ . '/maintenance/populateContentModel.php',
        'PopulateFilearchiveSha1' => __DIR__ . '/maintenance/populateFilearchiveSha1.php',
        'PopulateImageSha1' => __DIR__ . '/maintenance/populateImageSha1.php',
        'PopulateLogSearch' => __DIR__ . '/maintenance/populateLogSearch.php',
index 929b3e5..5740921 100644 (file)
                "leafo/lessphp": "0.5.0",
                "liuggio/statsd-php-client": "1.0.12",
                "mediawiki/at-ease": "1.0.0",
-               "oojs/oojs-ui": "0.11.7",
+               "oojs/oojs-ui": "0.12.1",
                "php": ">=5.3.3",
                "psr/log": "1.0.0",
                "wikimedia/cdb": "1.0.1",
                "wikimedia/assert": "0.2.2",
-               "wikimedia/composer-merge-plugin": "1.2.0",
+               "wikimedia/composer-merge-plugin": "1.2.1",
                "wikimedia/utfnormal": "1.0.2",
                "zordius/lightncandy": "0.21"
        },
@@ -51,7 +51,7 @@
        },
        "scripts": {
                "lint": "parallel-lint --exclude vendor",
-               "phpcs": "phpcs $PHPCS_ARGS -s --standard=vendor/mediawiki/mediawiki-codesniffer/MediaWiki --ignore=vendor,node_modules --encoding=utf-8 --extensions=php,php5,inc,sample",
+               "phpcs": "phpcs -p $PHPCS_ARGS",
                "test": [
                        "composer lint",
                        "composer phpcs"
index 23df983..65ae988 100644 (file)
@@ -2177,7 +2177,7 @@ the key.
 &$confstr: reference to a hash key string which can be modified
 $user: User (object) requesting the page
 
-'PageViewUpdate': Allow database (or other) changes to be made after a
+'PageViewUpdates': Allow database (or other) changes to be made after a
 page view is seen by MediaWiki.  Note this does not capture views made
 via external caches such as Squid.
 $wikipage: WikiPage (object) for the page being viewed.
@@ -2313,6 +2313,8 @@ that tests continue to run properly.
 'PasswordPoliciesForUser': Alter the effective password policy for a user.
 $user: User object whose policy you are modifying
 &$effectivePolicy: Array of policy statements that apply to this user
+$purpose: string indicating purpose of the check, one of 'login', 'create',
+  or 'reset'
 
 'PerformRetroactiveAutoblock': Called before a retroactive autoblock is applied
 to a user.
index f233ad7..22e9e30 100644 (file)
@@ -1021,7 +1021,7 @@ $wgSVGConverterPath = '';
 /**
  * Don't scale a SVG larger than this
  */
-$wgSVGMaxSize = 2048;
+$wgSVGMaxSize = 5120;
 
 /**
  * Don't read SVG metadata beyond this point.
@@ -1597,7 +1597,8 @@ $wgEnotifRevealEditorAddress = false;
 
 /**
  * Send notification mails on minor edits to watchlist pages. This is enabled
- * by default. Does not affect user talk notifications.
+ * by default. User talk notifications are affected by this, $wgEnotifUserTalk, and
+ * the nominornewtalk user right.
  */
 $wgEnotifMinorEdits = true;
 
@@ -1622,15 +1623,6 @@ $wgEnotifMaxRecips = 500;
  */
 $wgEnotifUseJobQ = false;
 
-/**
- * Use the job queue for user activity updates like updating "last visited"
- * fields for email notifications of page changes. This should only be enabled
- * if the jobs have a dedicated runner to avoid update lag.
- *
- * @since 1.26
- */
-$wgActivityUpdatesUseJobQueue = false;
-
 /**
  * Use real name instead of username in e-mail "from" field.
  */
@@ -4447,7 +4439,7 @@ $wgPasswordConfig = array(
  */
 $wgPasswordResetRoutes = array(
        'username' => true,
-       'email' => false,
+       'email' => true,
 );
 
 /**
@@ -6735,7 +6727,7 @@ $wgJobSerialCommitThreshold = false;
  * These settings should be global to all wikis.
  */
 $wgJobTypeConf = array(
-       'default' => array( 'class' => 'JobQueueDB', 'order' => 'random' ),
+       'default' => array( 'class' => 'JobQueueDB', 'order' => 'random', 'claimTTL' => 3600 ),
 );
 
 /**
@@ -6927,15 +6919,15 @@ $wgLogNames = array(
 $wgLogHeaders = array(
        '' => 'alllogstext',
        'block' => 'blocklogtext',
-       'protect' => 'protectlogtext',
-       'rights' => 'rightslogtext',
        'delete' => 'dellogpagetext',
-       'upload' => 'uploadlogpagetext',
-       'move' => 'movelogpagetext',
        'import' => 'importlogpagetext',
-       'patrol' => 'patrol-log-header',
        'merge' => 'mergelogpagetext',
+       'move' => 'movelogpagetext',
+       'patrol' => 'patrol-log-header',
+       'protect' => 'protectlogtext',
+       'rights' => 'rightslogtext',
        'suppress' => 'suppressionlogtext',
+       'upload' => 'uploadlogpagetext',
 );
 
 /**
@@ -6945,10 +6937,10 @@ $wgLogHeaders = array(
  * Extensions with custom log types may add to this array.
  */
 $wgLogActions = array(
-       'protect/protect' => 'protectedarticle',
        'protect/modify' => 'modifiedarticleprotection',
-       'protect/unprotect' => 'unprotectedarticle',
        'protect/move_prot' => 'movedarticleprotection',
+       'protect/protect' => 'protectedarticle',
+       'protect/unprotect' => 'unprotectedarticle',
 );
 
 /**
@@ -6958,35 +6950,35 @@ $wgLogActions = array(
  * @see LogFormatter
  */
 $wgLogActionsHandlers = array(
-       'move/move' => 'MoveLogFormatter',
-       'move/move_redir' => 'MoveLogFormatter',
+       'block/block' => 'BlockLogFormatter',
+       'block/reblock' => 'BlockLogFormatter',
+       'block/unblock' => 'BlockLogFormatter',
+       'contentmodel/change' => 'ContentModelLogFormatter',
        'delete/delete' => 'DeleteLogFormatter',
+       'delete/event' => 'DeleteLogFormatter',
        'delete/restore' => 'DeleteLogFormatter',
        'delete/revision' => 'DeleteLogFormatter',
-       'delete/event' => 'DeleteLogFormatter',
-       'suppress/revision' => 'DeleteLogFormatter',
-       'suppress/event' => 'DeleteLogFormatter',
-       'suppress/delete' => 'DeleteLogFormatter',
-       'patrol/patrol' => 'PatrolLogFormatter',
-       'rights/rights' => 'RightsLogFormatter',
-       'rights/autopromote' => 'RightsLogFormatter',
-       'upload/upload' => 'UploadLogFormatter',
-       'upload/overwrite' => 'UploadLogFormatter',
-       'upload/revert' => 'UploadLogFormatter',
-       'merge/merge' => 'MergeLogFormatter',
-       'tag/update' => 'TagLogFormatter',
-       'managetags/create' => 'LogFormatter',
-       'managetags/delete' => 'LogFormatter',
+       'import/interwiki' => 'LogFormatter',
+       'import/upload' => 'LogFormatter',
        'managetags/activate' => 'LogFormatter',
+       'managetags/create' => 'LogFormatter',
        'managetags/deactivate' => 'LogFormatter',
-       'block/block' => 'BlockLogFormatter',
-       'block/unblock' => 'BlockLogFormatter',
-       'block/reblock' => 'BlockLogFormatter',
+       'managetags/delete' => 'LogFormatter',
+       'merge/merge' => 'MergeLogFormatter',
+       'move/move' => 'MoveLogFormatter',
+       'move/move_redir' => 'MoveLogFormatter',
+       'patrol/patrol' => 'PatrolLogFormatter',
+       'rights/autopromote' => 'RightsLogFormatter',
+       'rights/rights' => 'RightsLogFormatter',
        'suppress/block' => 'BlockLogFormatter',
+       'suppress/delete' => 'DeleteLogFormatter',
+       'suppress/event' => 'DeleteLogFormatter',
        'suppress/reblock' => 'BlockLogFormatter',
-       'import/upload' => 'LogFormatter',
-       'import/interwiki' => 'LogFormatter',
-       'contentmodel/change' => 'ContentModelLogFormatter',
+       'suppress/revision' => 'DeleteLogFormatter',
+       'tag/update' => 'TagLogFormatter',
+       'upload/overwrite' => 'UploadLogFormatter',
+       'upload/revert' => 'UploadLogFormatter',
+       'upload/upload' => 'UploadLogFormatter',
 );
 
 /**
index bf322ae..0233b11 100644 (file)
@@ -3445,7 +3445,7 @@ HTML
 
                $this->deletedSinceEdit = false;
 
-               if ( $this->mTitle->isDeletedQuick() ) {
+               if ( !$this->mTitle->exists() && $this->mTitle->isDeletedQuick() ) {
                        $this->lastDelete = $this->getLastDelete();
                        if ( $this->lastDelete ) {
                                $deleteTime = wfTimestamp( TS_MW, $this->lastDelete->log_timestamp );
index 0d55d7d..adab21c 100644 (file)
@@ -874,7 +874,7 @@ class XmlDumpWriter {
                }
 
                global $wgContLang;
-               $prefix = str_replace( '_', ' ', $wgContLang->getNsText( $title->getNamespace() ) );
+               $prefix = $wgContLang->getFormattedNsText( $title->getNamespace() );
 
                if ( $prefix !== '' ) {
                        $prefix .= ':';
index 97042fd..167305d 100644 (file)
@@ -402,12 +402,17 @@ function wfRandomString( $length = 32 ) {
  *
  * ;:@&=$-_.+!*'(),
  *
+ * RFC 1738 says ~ is unsafe, however RFC 3986 considers it an unreserved
+ * character which should not be encoded. More importantly, google chrome
+ * always converts %7E back to ~, and converting it in this function can
+ * cause a redirect loop (T105265).
+ *
  * But + is not safe because it's used to indicate a space; &= are only safe in
  * paths and not in queries (and we don't distinguish here); ' seems kind of
  * scary; and urlencode() doesn't touch -_. to begin with.  Plus, although /
  * is reserved, we don't care.  So the list we unescape is:
  *
- * ;:@$!*(),/
+ * ;:@$!*(),/~
  *
  * However, IIS7 redirects fail when the url contains a colon (Bug 22709),
  * so no fancy : for IIS7.
@@ -426,7 +431,7 @@ function wfUrlencode( $s ) {
        }
 
        if ( is_null( $needle ) ) {
-               $needle = array( '%3B', '%40', '%24', '%21', '%2A', '%28', '%29', '%2C', '%2F' );
+               $needle = array( '%3B', '%40', '%24', '%21', '%2A', '%28', '%29', '%2C', '%2F', '%7E' );
                if ( !isset( $_SERVER['SERVER_SOFTWARE'] ) ||
                        ( strpos( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS/7' ) === false )
                ) {
@@ -437,7 +442,7 @@ function wfUrlencode( $s ) {
        $s = urlencode( $s );
        $s = str_ireplace(
                $needle,
-               array( ';', '@', '$', '!', '*', '(', ')', ',', '/', ':' ),
+               array( ';', '@', '$', '!', '*', '(', ')', ',', '/', '~', ':' ),
                $s
        );
 
@@ -1249,12 +1254,16 @@ function wfLogProfilingData() {
 
        $config = $context->getConfig();
        if ( $config->get( 'StatsdServer' ) ) {
-               $statsdServer = explode( ':', $config->get( 'StatsdServer' ) );
-               $statsdHost = $statsdServer[0];
-               $statsdPort = isset( $statsdServer[1] ) ? $statsdServer[1] : 8125;
-               $statsdSender = new SocketSender( $statsdHost, $statsdPort );
-               $statsdClient = new StatsdClient( $statsdSender );
-               $statsdClient->send( $context->getStats()->getBuffer() );
+               try {
+                       $statsdServer = explode( ':', $config->get( 'StatsdServer' ) );
+                       $statsdHost = $statsdServer[0];
+                       $statsdPort = isset( $statsdServer[1] ) ? $statsdServer[1] : 8125;
+                       $statsdSender = new SocketSender( $statsdHost, $statsdPort );
+                       $statsdClient = new StatsdClient( $statsdSender, true, false );
+                       $statsdClient->send( $context->getStats()->getBuffer() );
+               } catch ( Exception $ex ) {
+                       MWExceptionHandler::logException( $ex );
+               }
        }
 
        # Profiling must actually be enabled...
@@ -1416,7 +1425,7 @@ function wfGetLangObj( $langcode = false ) {
  *
  * This function replaces all old wfMsg* functions.
  *
- * @param string|string[] $key Message key, or array of keys
+ * @param string|string[]|MessageSpecifier $key Message key, or array of keys, or a MessageSpecifier
  * @param mixed $params,... Normal message parameters
  * @return Message
  *
@@ -3505,8 +3514,7 @@ function wfMemcKey( /*...*/ ) {
        $prefix = $wgCachePrefix === false ? wfWikiID() : $wgCachePrefix;
        $args = func_get_args();
        $key = $prefix . ':' . implode( ':', $args );
-       $key = str_replace( ' ', '_', $key );
-       return $key;
+       return strtr( $key, ' ', '_' );
 }
 
 /**
@@ -3527,7 +3535,7 @@ function wfForeignMemcKey( $db, $prefix /*...*/ ) {
        } else {
                $key = $db . ':' . implode( ':', $args );
        }
-       return str_replace( ' ', '_', $key );
+       return strtr( $key, ' ', '_' );
 }
 
 /**
@@ -3544,8 +3552,7 @@ function wfForeignMemcKey( $db, $prefix /*...*/ ) {
 function wfGlobalCacheKey( /*...*/ ) {
        $args = func_get_args();
        $key = 'global:' . implode( ':', $args );
-       $key = str_replace( ' ', '_', $key );
-       return $key;
+       return strtr( $key, ' ', '_' );
 }
 
 /**
index 28c54d2..036d65c 100644 (file)
@@ -135,7 +135,6 @@ class Hooks {
         *   returning null) is equivalent to returning true.
         */
        public static function run( $event, array $args = array(), $deprecatedVersion = null ) {
-               RequestContext::getMain()->getStats()->increment( 'hooks.' . $event );
                foreach ( self::getHandlers( $event ) as $hook ) {
                        // Turn non-array values into an array. (Can't use casting because of objects.)
                        if ( !is_array( $hook ) ) {
index 235096d..62ae0b8 100644 (file)
@@ -822,6 +822,47 @@ class Html {
                return self::element( 'textarea', self::getTextInputAttributes( $attribs ), $spacedValue );
        }
 
+       /**
+        * Helper for Html::namespaceSelector().
+        * @param array $params See Html::namespaceSelector()
+        * @return array
+        */
+       public static function namespaceSelectorOptions( array $params = array() ) {
+               global $wgContLang;
+
+               $options = array();
+
+               if ( !isset( $params['exclude'] ) || !is_array( $params['exclude'] ) ) {
+                       $params['exclude'] = array();
+               }
+
+               if ( isset( $params['all'] ) ) {
+                       // add an option that would let the user select all namespaces.
+                       // Value is provided by user, the name shown is localized for the user.
+                       $options[$params['all']] = wfMessage( 'namespacesall' )->text();
+               }
+               // Add all namespaces as options (in the content language)
+               $options += $wgContLang->getFormattedNamespaces();
+
+               $optionsOut = array();
+               // Filter out namespaces below 0 and massage labels
+               foreach ( $options as $nsId => $nsName ) {
+                       if ( $nsId < NS_MAIN || in_array( $nsId, $params['exclude'] ) ) {
+                               continue;
+                       }
+                       if ( $nsId === NS_MAIN ) {
+                               // For other namespaces use the namespace prefix as label, but for
+                               // main we don't use "" but the user message describing it (e.g. "(Main)" or "(Article)")
+                               $nsName = wfMessage( 'blanknamespace' )->text();
+                       } elseif ( is_int( $nsId ) ) {
+                               $nsName = $wgContLang->convertNamespace( $nsId );
+                       }
+                       $optionsOut[ $nsId ] = $nsName;
+               }
+
+               return $optionsOut;
+       }
+
        /**
         * Build a drop-down box for selecting a namespace
         *
@@ -841,8 +882,6 @@ class Html {
        public static function namespaceSelector( array $params = array(),
                array $selectAttribs = array()
        ) {
-               global $wgContLang;
-
                ksort( $selectAttribs );
 
                // Is a namespace selected?
@@ -859,37 +898,16 @@ class Html {
                        $params['selected'] = '';
                }
 
-               if ( !isset( $params['exclude'] ) || !is_array( $params['exclude'] ) ) {
-                       $params['exclude'] = array();
-               }
                if ( !isset( $params['disable'] ) || !is_array( $params['disable'] ) ) {
                        $params['disable'] = array();
                }
 
                // Associative array between option-values and option-labels
-               $options = array();
-
-               if ( isset( $params['all'] ) ) {
-                       // add an option that would let the user select all namespaces.
-                       // Value is provided by user, the name shown is localized for the user.
-                       $options[$params['all']] = wfMessage( 'namespacesall' )->text();
-               }
-               // Add all namespaces as options (in the content language)
-               $options += $wgContLang->getFormattedNamespaces();
+               $options = self::namespaceSelectorOptions( $params );
 
-               // Convert $options to HTML and filter out namespaces below 0
+               // Convert $options to HTML
                $optionsHtml = array();
                foreach ( $options as $nsId => $nsName ) {
-                       if ( $nsId < NS_MAIN || in_array( $nsId, $params['exclude'] ) ) {
-                               continue;
-                       }
-                       if ( $nsId === NS_MAIN ) {
-                               // For other namespaces use the namespace prefix as label, but for
-                               // main we don't use "" but the user message describing it (e.g. "(Main)" or "(Article)")
-                               $nsName = wfMessage( 'blanknamespace' )->text();
-                       } elseif ( is_int( $nsId ) ) {
-                               $nsName = $wgContLang->convertNamespace( $nsId );
-                       }
                        $optionsHtml[] = self::element(
                                'option', array(
                                        'disabled' => in_array( $nsId, $params['disable'] ),
index 825cd06..7b43a2d 100644 (file)
@@ -252,7 +252,7 @@ class MWHttpRequest {
                $this->parsedUrl = wfParseUrl( $this->url );
 
                if ( !$this->parsedUrl || !Http::isValidURI( $this->url ) ) {
-                       $this->status = Status::newFatal( 'http-invalid-url' );
+                       $this->status = Status::newFatal( 'http-invalid-url', $url );
                } else {
                        $this->status = Status::newGood( 100 ); // continue
                }
index 4a1aa87..bb65cdf 100644 (file)
@@ -77,7 +77,7 @@ class Linker {
                wfDeprecated( __METHOD__, '1.25' );
 
                $title = urldecode( $title );
-               $title = str_replace( '_', ' ', $title );
+               $title = strtr( $title, '_', ' ' );
                return self::getLinkAttributesInternal( $title, $class );
        }
 
@@ -1414,10 +1414,9 @@ class Linker {
 
                                # fix up urlencoded title texts (copied from Parser::replaceInternalLinks)
                                if ( strpos( $match[1], '%' ) !== false ) {
-                                       $match[1] = str_replace(
-                                               array( '<', '>' ),
-                                               array( '&lt;', '&gt;' ),
-                                               rawurldecode( $match[1] )
+                                       $match[1] = strtr(
+                                               rawurldecode( $match[1] ),
+                                               array( '<' => '&lt;', '>' => '&gt;' )
                                        );
                                }
 
index 5510d35..f488aa2 100644 (file)
@@ -363,9 +363,8 @@ class MediaWiki {
                        $this->context->setWikiPage( $article->getPage() );
                }
 
-               // NS_MEDIAWIKI has no redirects.
-               // It is also used for CSS/JS, so performance matters here...
-               if ( $title->getNamespace() == NS_MEDIAWIKI ) {
+               // Skip some unnecessary code if the content model doesn't support redirects
+               if ( !ContentHandler::getForTitle( $title )->supportsRedirects() ) {
                        return $article;
                }
 
index 329d97a..54abfd1 100644 (file)
  *
  * @since 1.17
  */
-class Message implements MessageSpecifier {
+class Message implements MessageSpecifier, Serializable {
 
        /**
         * In which language to get this message. True, which is the default,
@@ -226,8 +226,9 @@ class Message implements MessageSpecifier {
        /**
         * @since 1.17
         *
-        * @param string|string[] $key Message key or array of message keys to try and use the first
-        * non-empty message for.
+        * @param string|string[]|MessageSpecifier $key Message key, or array of
+        * message keys to try and use the first non-empty message for, or a
+        * MessageSpecifier to copy from.
         * @param array $params Message parameters.
         * @param Language $language Optional language of the message, defaults to $wgLang.
         *
@@ -236,6 +237,16 @@ class Message implements MessageSpecifier {
        public function __construct( $key, $params = array(), Language $language = null ) {
                global $wgLang;
 
+               if ( $key instanceof MessageSpecifier ) {
+                       if ( $params ) {
+                               throw new InvalidArgumentException(
+                                       '$params must be empty if $key is a MessageSpecifier'
+                               );
+                       }
+                       $params = $key->getParams();
+                       $key = $key->getKey();
+               }
+
                if ( !is_string( $key ) && !is_array( $key ) ) {
                        throw new InvalidArgumentException( '$key must be a string or an array' );
                }
@@ -252,6 +263,41 @@ class Message implements MessageSpecifier {
                $this->language = $language ?: $wgLang;
        }
 
+       /**
+        * @see Serializable::serialize()
+        * @since 1.26
+        * @return string
+        */
+       public function serialize() {
+               return serialize( array(
+                       'interface' => $this->interface,
+                       'language' => $this->language->getCode(),
+                       'key' => $this->key,
+                       'keysToTry' => $this->keysToTry,
+                       'parameters' => $this->parameters,
+                       'format' => $this->format,
+                       'useDatabase' => $this->useDatabase,
+                       'title' => $this->title,
+               ) );
+       }
+
+       /**
+        * @see Serializable::unserialize()
+        * @since 1.26
+        * @param string $serialized
+        */
+       public function unserialize( $serialized ) {
+               $data = unserialize( $serialized );
+               $this->interface = $data['interface'];
+               $this->key = $data['key'];
+               $this->keysToTry = $data['keysToTry'];
+               $this->parameters = $data['parameters'];
+               $this->format = $data['format'];
+               $this->useDatabase = $data['useDatabase'];
+               $this->language = Language::factory( $data['language'] );
+               $this->title = $data['title'];
+       }
+
        /**
         * @since 1.24
         *
@@ -327,7 +373,7 @@ class Message implements MessageSpecifier {
         *
         * @since 1.17
         *
-        * @param string|string[] $key Message key or array of keys.
+        * @param string|string[]|MessageSpecifier $key
         * @param mixed $param,... Parameters as strings.
         *
         * @return Message
index 0ed847e..a551fe1 100644 (file)
@@ -3433,19 +3433,19 @@ class OutputPage extends ContextSource {
                        $lang = $this->getTitle()->getPageLanguage();
                        if ( $lang->hasVariants() ) {
                                $variants = $lang->getVariants();
-                               foreach ( $variants as $_v ) {
-                                       $tags["variant-$_v"] = Html::element( 'link', array(
+                               foreach ( $variants as $variant ) {
+                                       $tags["variant-$variant"] = Html::element( 'link', array(
                                                'rel' => 'alternate',
-                                               'hreflang' => wfBCP47( $_v ),
-                                               'href' => $this->getTitle()->getLocalURL( array( 'variant' => $_v ) ) )
+                                               'hreflang' => wfBCP47( $variant ),
+                                               'href' => $this->getTitle()->getLocalURL( array( 'variant' => $variant ) ) )
                                        );
                                }
+                               # x-default link per https://support.google.com/webmasters/answer/189077?hl=en
+                               $tags["variant-x-default"] = Html::element( 'link', array(
+                                       'rel' => 'alternate',
+                                       'hreflang' => 'x-default',
+                                       'href' => $this->getTitle()->getLocalURL() ) );
                        }
-                       # x-default link per https://support.google.com/webmasters/answer/189077?hl=en
-                       $tags["variant-x-default"] = Html::element( 'link', array(
-                               'rel' => 'alternate',
-                               'hreflang' => 'x-default',
-                               'href' => $this->getTitle()->getLocalURL() ) );
                }
 
                # Copyright
@@ -3952,13 +3952,21 @@ class OutputPage extends ContextSource {
         * @since 1.25
         */
        public function enableOOUI() {
-               OOUI\Theme::setSingleton( new OOUI\MediaWikiTheme() );
+               $themes = ExtensionRegistry::getInstance()->getAttribute( 'SkinOOUIThemes' );
+               // Make keys (skin names) lowercase for case-insensitive matching.
+               $themes = array_change_key_case( $themes, CASE_LOWER );
+               $skinName = strtolower( $this->getSkin()->getSkinName() );
+               $theme = isset( $themes[ $skinName ] ) ? $themes[ $skinName ] : 'MediaWiki';
+               // For example, 'OOUI\MediaWikiTheme'.
+               $themeClass = "OOUI\\{$theme}Theme";
+               OOUI\Theme::setSingleton( new $themeClass() );
                OOUI\Element::setDefaultDir( $this->getLanguage()->getDir() );
                $this->addModuleStyles( array(
                        'oojs-ui.styles',
                        'oojs-ui.styles.icons',
                        'oojs-ui.styles.indicators',
                        'oojs-ui.styles.textures',
+                       'mediawiki.widgets.styles',
                ) );
        }
 }
index d11d021..9dec950 100644 (file)
 /**
  * Check php version and that external dependencies are installed, and
  * display an informative error if either condition is not satisfied.
+ *
+ * @note Since we can't rely on anything, the minimum PHP versions and MW current
+ * version are hardcoded here
  */
 function wfEntryPointCheck( $entryPoint ) {
+       $mwVersion = '1.26';
+       $minimumVersionPHP = '5.3.3';
+       $phpVersion = PHP_VERSION;
+
        if ( !function_exists( 'version_compare' )
-               || version_compare( PHP_VERSION, '5.3.3' ) < 0
-               || !file_exists( dirname( __FILE__ ) . '/../vendor/autoload.php' )
+               || version_compare( $phpVersion, $minimumVersionPHP ) < 0
        ) {
-               wfPHPVersionError( $entryPoint );
+               wfPHPVersionError( $entryPoint, $mwVersion, $minimumVersionPHP, $phpVersion );
+       }
+
+       if ( !file_exists( dirname( __FILE__ ) . '/../vendor/autoload.php' ) ) {
+               wfMissingVendorError( $entryPoint, $mwVersion );
        }
 }
 
@@ -49,47 +59,39 @@ function wfEntryPointCheck( $entryPoint ) {
  *   - api.php
  *   - mw-config/index.php
  *   - cli
- *
- * @note Since we can't rely on anything, the minimum PHP versions and MW current
- * version are hardcoded here
+ * @param string $mwVersion The number of the MediaWiki version used
+ * @param string $title HTML code to be put within an <h2> tag
+ * @param string $shortText
+ * @param string $longText
+ * @param string $longHtml
  */
-function wfPHPVersionError( $type ) {
-       $mwVersion = '1.26';
-       $minimumVersionPHP = '5.3.3';
-
-       $phpVersion = PHP_VERSION;
+function wfGenericError( $type, $mwVersion, $title, $shortText, $longText, $longHtml ) {
        $protocol = isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0';
-       $message = "MediaWiki $mwVersion requires at least "
-               . "PHP version $minimumVersionPHP, you are using PHP $phpVersion. Installing some "
-               . " external dependencies (e.g. via composer) is also required.";
 
        if ( $type == 'cli' ) {
-               $finalOutput = "Error: You are missing some external dependencies or are using on older PHP version. \n"
-                       . "MediaWiki $mwVersion needs PHP $minimumVersionPHP or higher.\n\n"
-                       . "Check if you have a newer php executable with a different name, such as php5.\n\n"
-                       . "MediaWiki now also has some external dependencies that need to be installed\n"
-                       . "via composer or from a separate git repo. Please see\n"
-                       . "https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries\n"
-                       . "for help on installing the required components.";
-       } elseif ( $type == 'index.php' || $type == 'mw-config/index.php' ) {
-               $pathinfo = pathinfo( $_SERVER['SCRIPT_NAME'] );
-               if ( $type == 'mw-config/index.php' ) {
-                       $dirname = dirname( $pathinfo['dirname'] );
-               } else {
-                       $dirname = $pathinfo['dirname'];
-               }
-               $encLogo = htmlspecialchars(
-                       str_replace( '//', '/', $dirname . '/' ) .
-                       'resources/assets/mediawiki.png'
-               );
-
+               $finalOutput = $longText;
+       } else {
                header( "$protocol 500 MediaWiki configuration Error" );
-               header( 'Content-type: text/html; charset=UTF-8' );
                // Don't cache error pages!  They cause no end of trouble...
                header( 'Cache-control: none' );
                header( 'Pragma: no-cache' );
 
-               $finalOutput = <<<HTML
+               if ( $type == 'index.php' || $type == 'mw-config/index.php' ) {
+                       $pathinfo = pathinfo( $_SERVER['SCRIPT_NAME'] );
+                       if ( $type == 'mw-config/index.php' ) {
+                               $dirname = dirname( $pathinfo['dirname'] );
+                       } else {
+                               $dirname = $pathinfo['dirname'];
+                       }
+                       $encLogo = htmlspecialchars(
+                               str_replace( '//', '/', $dirname . '/' ) .
+                               'resources/assets/mediawiki.png'
+                       );
+                       $shortHtml = htmlspecialchars( $shortText );
+
+                       header( 'Content-type: text/html; charset=UTF-8' );
+
+                       $finalOutput = <<<HTML
 <!DOCTYPE html>
 <html lang="en" dir="ltr">
        <head>
@@ -120,10 +122,43 @@ function wfPHPVersionError( $type ) {
                <h1>MediaWiki {$mwVersion} internal error</h1>
                <div class='error'>
                <p>
-                       {$message}
+                       {$shortHtml}
                </p>
-               <h2>Supported PHP versions</h2>
+               <h2>{$title}</h2>
                <p>
+                       {$longHtml}
+               </p>
+               </div>
+       </body>
+</html>
+HTML;
+               // Handle everything that's not index.php
+               } else {
+                       // So nothing thinks this is JS or CSS
+                       $finalOutput = ( $type == 'load.php' ) ? "/* $shortText */" : $shortText;
+               }
+       }
+       echo "$finalOutput\n";
+       die( 1 );
+}
+
+/**
+ * Display an error for the minimum PHP version requirement not being satisfied.
+ *
+ * @param string $type See wfGenericError
+ * @param string $mwVersion See wfGenericError
+ * @param string $minimumVersionPHP The minimum PHP version supported by MediaWiki
+ * @param string $phpVersion The current PHP version
+ */
+function wfPHPVersionError( $type, $mwVersion, $minimumVersionPHP, $phpVersion ) {
+       $shortText = "MediaWiki $mwVersion requires at least "
+               . "PHP version $minimumVersionPHP, you are using PHP $phpVersion.";
+
+       $longText = "Error: You might be using on older PHP version. \n"
+               . "MediaWiki $mwVersion needs PHP $minimumVersionPHP or higher.\n\n"
+               . "Check if you have a newer php executable with a different name, such as php5.\n\n";
+
+       $longHtml = <<<HTML
                        Please consider <a href="http://www.php.net/downloads.php">upgrading your copy of PHP</a>.
                        PHP versions less than 5.3.0 are no longer supported by the PHP Group and will not receive
                        security or bugfix updates.
@@ -134,24 +169,31 @@ function wfPHPVersionError( $type ) {
                        of MediaWiki from our website.  See our
                        <a href="https://www.mediawiki.org/wiki/Compatibility#PHP">compatibility page</a>
                        for details of which versions are compatible with prior versions of PHP.
-               </p>
-               <h2>External dependencies</h2>
-               <p>
+HTML;
+       wfGenericError( $type, $mwVersion, 'Supported PHP versions', $shortText, $longText, $longHtml );
+}
+
+/**
+ * Display an error for the vendor/autoload.php file not being found.
+ *
+ * @param string $type See wfGenericError
+ * @param string $mwVersion See wfGenericError
+ */
+function wfMissingVendorError( $type, $mwVersion ) {
+       $shortText = "Installing some external dependencies (e.g. via composer) is also required.";
+
+       $longText = "Error: You are missing some external dependencies. \n"
+               . "MediaWiki now also has some external dependencies that need to be installed\n"
+               . "via composer or from a separate git repo. Please see\n"
+               . "https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries\n"
+               . "for help on installing the required components.";
+
+       $longHtml = <<<HTML
                        MediaWiki now also has some external dependencies that need to be installed via
                        composer or from a separate git repo. Please see
                        <a href="https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries">mediawiki.org</a>
                        for help on installing the required components.
-               </p>
-               </div>
-       </body>
-</html>
 HTML;
-       // Handle everything that's not index.php
-       } else {
-               // So nothing thinks this is JS or CSS
-               $finalOutput = ( $type == 'load.php' ) ? "/* $message */" : $message;
-               header( "$protocol 500 MediaWiki configuration Error" );
-       }
-       echo "$finalOutput\n";
-       die( 1 );
+
+       wfGenericError( $type, $mwVersion, 'External dependencies', $shortText, $longText, $longHtml );
 }
index 2340cd9..ddaf1b2 100644 (file)
@@ -753,7 +753,7 @@ class Sanitizer {
                        }
 
                        # Allow any attribute beginning with "data-"
-                       if ( !preg_match( '/^data-/i', $attribute ) && !isset( $whitelist[$attribute] ) ) {
+                       if ( !preg_match( '/^data-(?!ooui)/i', $attribute ) && !isset( $whitelist[$attribute] ) ) {
                                continue;
                        }
 
index d53d593..f0a1ebb 100644 (file)
@@ -173,7 +173,9 @@ class TemplateParser {
                        array(
                                // Do not add more flags here without discussion.
                                // If you do add more flags, be sure to update unit tests as well.
-                               'flags' => LightnCandy::FLAG_ERROR_EXCEPTION
+                               'flags' => LightnCandy::FLAG_ERROR_EXCEPTION,
+                               'basedir' => $this->templateDir,
+                               'fileext' => '.mustache',
                        )
                );
        }
index 9c8ed47..8a15b54 100644 (file)
@@ -313,7 +313,7 @@ class Title {
                $filteredText = Sanitizer::decodeCharReferencesAndNormalize( $text );
 
                $t = new Title();
-               $t->mDbkeyform = str_replace( ' ', '_', $filteredText );
+               $t->mDbkeyform = strtr( $filteredText, ' ', '_' );
                $t->mDefaultNamespace = intval( $defaultNamespace );
 
                $t->secureAndSplit();
@@ -345,10 +345,10 @@ class Title {
                # but some URLs used it as a space replacement and they still come
                # from some external search tools.
                if ( strpos( self::legalChars(), '+' ) === false ) {
-                       $url = str_replace( '+', ' ', $url );
+                       $url = strtr( $url, '+', ' ' );
                }
 
-               $t->mDbkeyform = str_replace( ' ', '_', $url );
+               $t->mDbkeyform = strtr( $url, ' ', '_' );
 
                try {
                        $t->secureAndSplit();
@@ -509,10 +509,10 @@ class Title {
                $t->mInterwiki = $interwiki;
                $t->mFragment = $fragment;
                $t->mNamespace = $ns = intval( $ns );
-               $t->mDbkeyform = str_replace( ' ', '_', $title );
+               $t->mDbkeyform = strtr( $title, ' ', '_' );
                $t->mArticleID = ( $ns >= 0 ) ? -1 : 0;
                $t->mUrlform = wfUrlencode( $t->mDbkeyform );
-               $t->mTextform = str_replace( '_', ' ', $title );
+               $t->mTextform = strtr( $title, '_', ' ' );
                $t->mContentModel = false; # initialized lazily in getContentModel()
                return $t;
        }
@@ -1419,7 +1419,7 @@ class Title {
         * @param string $fragment Text
         */
        public function setFragment( $fragment ) {
-               $this->mFragment = str_replace( '_', ' ', substr( $fragment, 1 ) );
+               $this->mFragment = strtr( substr( $fragment, 1 ), '_', ' ' );
        }
 
        /**
@@ -1449,7 +1449,7 @@ class Title {
         */
        public function getPrefixedDBkey() {
                $s = $this->prefix( $this->mDbkeyform );
-               $s = str_replace( ' ', '_', $s );
+               $s = strtr( $s, ' ', '_' );
                return $s;
        }
 
@@ -1462,7 +1462,7 @@ class Title {
        public function getPrefixedText() {
                if ( $this->mPrefixedText === null ) {
                        $s = $this->prefix( $this->mTextform );
-                       $s = str_replace( '_', ' ', $s );
+                       $s = strtr( $s, '_', ' ' );
                        $this->mPrefixedText = $s;
                }
                return $this->mPrefixedText;
@@ -1610,7 +1610,7 @@ class Title {
         */
        public function getSubpageUrlForm() {
                $text = $this->getSubpageText();
-               $text = wfUrlencode( str_replace( ' ', '_', $text ) );
+               $text = wfUrlencode( strtr( $text, ' ', '_' ) );
                return $text;
        }
 
@@ -1621,7 +1621,7 @@ class Title {
         */
        public function getPrefixedURL() {
                $s = $this->prefix( $this->mDbkeyform );
-               $s = wfUrlencode( str_replace( ' ', '_', $s ) );
+               $s = wfUrlencode( strtr( $s, ' ', '_' ) );
                return $s;
        }
 
@@ -3370,7 +3370,7 @@ class Title {
 
                $this->mDbkeyform = $parts['dbkey'];
                $this->mUrlform = wfUrlencode( $this->mDbkeyform );
-               $this->mTextform = str_replace( '_', ' ', $this->mDbkeyform );
+               $this->mTextform = strtr( $this->mDbkeyform, '_', ' ' );
 
                # We already know that some pages won't be in the database!
                if ( $this->isExternal() || $this->mNamespace == NS_SPECIAL ) {
@@ -4547,15 +4547,17 @@ class Title {
        public function isValidRedirectTarget() {
                global $wgInvalidRedirectTargets;
 
-               // invalid redirect targets are stored in a global array, but explicitly disallow Userlogout here
-               if ( $this->isSpecial( 'Userlogout' ) ) {
-                       return false;
-               }
-
-               foreach ( $wgInvalidRedirectTargets as $target ) {
-                       if ( $this->isSpecial( $target ) ) {
+               if ( $this->isSpecialPage() ) {
+                       // invalid redirect targets are stored in a global array, but explicitly disallow Userlogout here
+                       if ( $this->isSpecial( 'Userlogout' ) ) {
                                return false;
                        }
+
+                       foreach ( $wgInvalidRedirectTargets as $target ) {
+                               if ( $this->isSpecial( $target ) ) {
+                                       return false;
+                               }
+                       }
                }
 
                return true;
@@ -4738,7 +4740,7 @@ class Title {
                        }
                } else {
                        // Even if there are no subpages in namespace, we still don't want "/" in MediaWiki message keys
-                       $editnoticeText = $editnotice_ns . '-' . str_replace( '/', '-', $this->getDBkey() );
+                       $editnoticeText = $editnotice_ns . '-' . strtr( $this->getDBkey(), '/', '-' );
                        $msg = wfMessage( $editnoticeText );
                        if ( $msg->exists() ) {
                                $html = $msg->parseAsBlock();
@@ -4759,4 +4761,26 @@ class Title {
                Hooks::run( 'TitleGetEditNotices', array( $this, $oldid, &$notices ) );
                return $notices;
        }
+
+       /**
+        * @return array
+        */
+       public function __sleep() {
+               return array(
+                       'mNamespace',
+                       'mDbkeyform',
+                       'mFragment',
+                       'mInterwiki',
+                       'mLocalInterwiki',
+                       'mUserCaseDBKey',
+                       'mDefaultNamespace',
+               );
+       }
+
+       public function __wakeup() {
+               $this->mArticleID = ( $this->mNamespace >= 0 ) ? -1 : 0;
+               $this->mUrlform = wfUrlencode( $this->mDbkeyform );
+               $this->mTextform = strtr( $this->mDbkeyform, '_', ' ' );
+       }
+
 }
index 63c0d37..cefbe62 100644 (file)
@@ -183,50 +183,50 @@ class User implements IDBAccessObject {
         */
        protected static $mAllRights = false;
 
-       /** @name Cache variables */
+       /** Cache variables */
        //@{
        public $mId;
-
+       /** @var string */
        public $mName;
-
+       /** @var string */
        public $mRealName;
-
        /**
         * @todo Make this actually private
         * @private
+        * @var Password
         */
        public $mPassword;
-
        /**
         * @todo Make this actually private
         * @private
+        * @var Password
         */
        public $mNewpassword;
-
+       /** @var string */
        public $mNewpassTime;
-
+       /** @var string */
        public $mEmail;
        /** @var string TS_MW timestamp from the DB */
        public $mTouched;
        /** @var string TS_MW timestamp from cache */
        protected $mQuickTouched;
-
+       /** @var string */
        protected $mToken;
-
+       /** @var string */
        public $mEmailAuthenticated;
-
+       /** @var string */
        protected $mEmailToken;
-
+       /** @var string */
        protected $mEmailTokenExpires;
-
+       /** @var string */
        protected $mRegistration;
-
+       /** @var int */
        protected $mEditCount;
-
+       /** @var array */
        public $mGroups;
-
+       /** @var array */
        protected $mOptionOverrides;
-
+       /** @var string */
        protected $mPasswordExpires;
        //@}
 
@@ -257,29 +257,29 @@ class User implements IDBAccessObject {
         * Lazy-initialized variables, invalidated with clearInstanceCache
         */
        protected $mNewtalk;
-
+       /** @var string */
        protected $mDatePreference;
-
+       /** @var string */
        public $mBlockedby;
-
+       /** @var string */
        protected $mHash;
-
+       /** @var array */
        public $mRights;
-
+       /** @var string */
        protected $mBlockreason;
-
+       /** @var array */
        protected $mEffectiveGroups;
-
+       /** @var array */
        protected $mImplicitGroups;
-
+       /** @var array */
        protected $mFormerGroups;
-
+       /** @var bool */
        protected $mBlockedGlobally;
-
+       /** @var bool */
        protected $mLocked;
-
+       /** @var bool */
        public $mHideName;
-
+       /** @var array */
        public $mOptions;
 
        /**
@@ -387,7 +387,8 @@ class User implements IDBAccessObject {
 
                // Try cache (unless this needs to lock the DB).
                // NOTE: if this thread called saveSettings(), the cache was cleared.
-               if ( ( $flags & self::READ_LOCKING ) || !$this->loadFromCache() ) {
+               $locking = ( ( $flags & self::READ_LOCKING ) == self::READ_LOCKING );
+               if ( $locking || !$this->loadFromCache() ) {
                        wfDebug( "User: cache miss for user {$this->mId}\n" );
                        // Load from DB (make sure this thread sees its own changes)
                        if ( wfGetLB()->hasOrMadeRecentMasterChanges() ) {
@@ -837,10 +838,11 @@ class User implements IDBAccessObject {
         * able to set their password to this.
         *
         * @param string $password Desired password
+        * @param string $purpose one of 'login', 'create', 'reset'
         * @return Status
         * @since 1.23
         */
-       public function checkPasswordValidity( $password ) {
+       public function checkPasswordValidity( $password, $purpose = 'login' ) {
                global $wgPasswordPolicy;
 
                $upp = new UserPasswordPolicy(
@@ -857,7 +859,7 @@ class User implements IDBAccessObject {
                }
 
                if ( $result === false ) {
-                       $status->merge( $upp->checkUserPassword( $this, $password ) );
+                       $status->merge( $upp->checkUserPassword( $this, $password, $purpose ) );
                        return $status;
                } elseif ( $result === true ) {
                        return $status;
@@ -2151,6 +2153,7 @@ class User implements IDBAccessObject {
                                && $newMessageLinks[0]['wiki'] === wfWikiID()
                                && $newMessageLinks[0]['rev']
                        ) {
+                               /** @var Revision $newMessageRevision */
                                $newMessageRevision = $newMessageLinks[0]['rev'];
                                $newMessageRevisionId = $newMessageRevision->getId();
                        }
@@ -3382,19 +3385,24 @@ class User implements IDBAccessObject {
                                return;
                        }
 
-                       $nextid = $oldid ? $title->getNextRevisionID( $oldid ) : null;
+                       $that = $this;
+                       // Try to update the DB post-send and only if needed...
+                       DeferredUpdates::addCallableUpdate( function() use ( $that, $title, $oldid ) {
+                               if ( !$that->getNewtalk() ) {
+                                       return; // no notifications to clear
+                               }
 
-                       if ( !$oldid || !$nextid ) {
-                               // If we're looking at the latest revision, we should definitely clear it
-                               $this->setNewtalk( false );
-                       } else {
-                               // Otherwise we should update its revision, if it's present
-                               if ( $this->getNewtalk() ) {
-                                       // Naturally the other one won't clear by itself
-                                       $this->setNewtalk( false );
-                                       $this->setNewtalk( true, Revision::newFromId( $nextid ) );
+                               // Delete the last notifications (they stack up)
+                               $that->setNewtalk( false );
+
+                               // If there is a new, unseen, revision, use its timestamp
+                               $nextid = $oldid
+                                       ? $title->getNextRevisionID( $oldid, Title::GAID_FOR_UPDATE )
+                                       : null;
+                               if ( $nextid ) {
+                                       $that->setNewtalk( true, Revision::newFromId( $nextid ) );
                                }
-                       }
+                       } );
                }
 
                if ( !$wgUseEnotif && !$wgShowUpdatedMarker ) {
@@ -3679,12 +3687,10 @@ class User implements IDBAccessObject {
                        $this->clearSharedCache();
                        // User was changed in the meantime or loaded with stale data
                        $from = ( $this->queryFlagsUsed & self::READ_LATEST ) ? 'master' : 'slave';
-                       MWExceptionHandler::logException( new MWException(
+                       throw new MWException(
                                "CAS update failed on user_touched for user ID '{$this->mId}' (read from $from);" .
-                               "the version of the user to be saved is older than the current version."
-                       ) );
-
-                       return;
+                               " the version of the user to be saved is older than the current version."
+                       );
                }
 
                $this->mTouched = $newTouched;
@@ -3705,20 +3711,28 @@ class User implements IDBAccessObject {
 
        /**
         * If only this user's username is known, and it exists, return the user ID.
+        *
+        * @param int $flags Bitfield of User:READ_* constants; useful for existence checks
         * @return int
         */
-       public function idForName() {
+       public function idForName( $flags = 0 ) {
                $s = trim( $this->getName() );
                if ( $s === '' ) {
                        return 0;
                }
 
-               $dbr = wfGetDB( DB_SLAVE );
-               $id = $dbr->selectField( 'user', 'user_id', array( 'user_name' => $s ), __METHOD__ );
-               if ( $id === false ) {
-                       $id = 0;
-               }
-               return $id;
+               $db = ( ( $flags & self::READ_LATEST ) == self::READ_LATEST )
+                       ? wfGetDB( DB_MASTER )
+                       : wfGetDB( DB_SLAVE );
+
+               $options = ( ( $flags & self::READ_LOCKING ) == self::READ_LOCKING )
+                       ? array( 'LOCK IN SHARE MODE' )
+                       : array();
+
+               $id = $db->selectField( 'user',
+                       'user_id', array( 'user_name' => $s ), __METHOD__, $options );
+
+               return (int)$id;
        }
 
        /**
@@ -4222,22 +4236,25 @@ class User implements IDBAccessObject {
         *
         * @param string $subject Message subject
         * @param string $body Message body
-        * @param string $from Optional From address; if unspecified, default
+        * @param User|null $from Optional sending user; if unspecified, default
         *   $wgPasswordSender will be used.
         * @param string $replyto Reply-To address
         * @return Status
         */
        public function sendMail( $subject, $body, $from = null, $replyto = null ) {
-               if ( is_null( $from ) ) {
-                       global $wgPasswordSender;
+               global $wgPasswordSender;
+
+               if ( $from instanceof User ) {
+                       $sender = MailAddress::newFromUser( $from );
+               } else {
                        $sender = new MailAddress( $wgPasswordSender,
                                wfMessage( 'emailsender' )->inContentLanguage()->text() );
-               } else {
-                       $sender = MailAddress::newFromUser( $from );
                }
-
                $to = MailAddress::newFromUser( $this );
-               return UserMailer::send( $to, $sender, $subject, $body, $replyto );
+
+               return UserMailer::send( $to, $sender, $subject, $body, array(
+                       'replyTo' => $replyto,
+               ) );
        }
 
        /**
index 73b0b93..adee126 100644 (file)
@@ -224,8 +224,6 @@ class WatchedItem {
        public function resetNotificationTimestamp(
                $force = '', $oldid = 0, $mode = self::IMMEDIATE
        ) {
-               global $wgActivityUpdatesUseJobQueue;
-
                // Only loggedin user can have a watchlist
                if ( wfReadOnly() || $this->mUser->isAnon() || !$this->isAllowed( 'editmywatchlist' ) ) {
                        return;
@@ -275,20 +273,20 @@ class WatchedItem {
                }
 
                // If the page is watched by the user (or may be watched), update the timestamp
-               if ( $mode === self::DEFERRED && $wgActivityUpdatesUseJobQueue ) {
-                       JobQueueGroup::singleton()->push(
-                               EnqueueJob::newFromLocalJobs( new JobSpecification(
-                                       'activityUpdateJob',
-                                       array(
-                                               'type'      => 'updateWatchlistNotification',
-                                               'userid'    => $this->getUserId(),
-                                               'notifTime' => $notificationTimestamp,
-                                               'curTime'   => time()
-                                       ),
-                                       array( 'removeDuplicates' => true ),
-                                       $title
-                               ) )
+               if ( $mode === self::DEFERRED ) {
+                       $job = new ActivityUpdateJob(
+                               $title,
+                               array(
+                                       'type'      => 'updateWatchlistNotification',
+                                       'userid'    => $this->getUserId(),
+                                       'notifTime' => $notificationTimestamp,
+                                       'curTime'   => time()
+                               )
                        );
+                       // Try to run this post-send
+                       DeferredUpdates::addCallableUpdate( function() use ( $job ) {
+                               $job->run();
+                       } );
                } else {
                        $dbw = wfGetDB( DB_MASTER );
                        $dbw->update( 'watchlist',
index 87cc48e..31806b7 100644 (file)
@@ -1370,6 +1370,7 @@ $zh2Hant = array(
 '脶' => '腡',
 '脸' => '臉',
 '腊' => '臘',
+'腌' => '醃',
 '腘' => '膕',
 '腭' => '齶',
 '腻' => '膩',
@@ -3355,6 +3356,7 @@ $zh2Hant = array(
 '干奴才' => '乾奴才',
 '干妹' => '乾妹',
 '干姊' => '乾姊',
+'干姐' => '乾姐',
 '干娘' => '乾娘',
 '干妈' => '乾媽',
 '干子' => '乾子',
@@ -3416,6 +3418,7 @@ $zh2Hant = array(
 '干癣' => '乾癬',
 '干瘾' => '乾癮',
 '干白儿' => '乾白兒',
+'干白葡萄酒' => '乾白葡萄酒',
 '干的' => '乾的',
 '干眼' => '乾眼',
 '干瞪眼' => '乾瞪眼',
@@ -3426,6 +3429,7 @@ $zh2Hant = array(
 '干篾片' => '乾篾片',
 '干粉' => '乾粉',
 '干粮' => '乾糧',
+'干红葡萄酒' => '乾紅葡萄酒',
 '干结' => '乾結',
 '干丝' => '乾絲',
 '干纲' => '乾綱',
@@ -3654,7 +3658,6 @@ $zh2Hant = array(
 '于贈' => '于贈',
 '于赠' => '于贈',
 '于越' => '于越',
-'于军' => '于軍',
 '于軍' => '于軍',
 '于道泉' => '于道泉',
 '于远伟' => '于遠偉',
@@ -3677,9 +3680,8 @@ $zh2Hant = array(
 '于韦斯屈莱' => '于韋斯屈萊',
 '于風政' => '于風政',
 '于风政' => '于風政',
+'于飛' => '于飛',
 '于飞' => '于飛',
-'于飛島' => '于飛島',
-'于飞岛' => '于飛島',
 '于余曲折' => '于餘曲折',
 '于鬯' => '于鬯',
 '于魁智' => '于魁智',
@@ -3731,6 +3733,7 @@ $zh2Hant = array(
 '人数里' => '人數裡',
 '人物志' => '人物誌',
 '人生天里' => '人生天里',
+'人发指' => '人髮指',
 '什锦面' => '什錦麵',
 '仇仇' => '仇讎',
 '介胄' => '介冑',
@@ -3744,7 +3747,6 @@ $zh2Hant = array(
 '代理发行' => '代理發行',
 '代码表' => '代碼表',
 '代表' => '代表',
-'令人发指' => '令人髮指',
 '以自制' => '以自制',
 '仲裁制' => '仲裁制',
 '件钟' => '件鐘',
@@ -3835,6 +3837,7 @@ $zh2Hant = array(
 '依托' => '依託',
 '侵并' => '侵併',
 '局促' => '侷促',
+'便于' => '便於',
 '系数' => '係數',
 '系为' => '係為',
 '保险柜' => '保險柜',
@@ -3844,6 +3847,7 @@ $zh2Hant = array(
 '修杰麟' => '修杰麟',
 '修胡刀' => '修鬍刀',
 '俯冲' => '俯衝',
+'个月里' => '個月裡',
 '个里' => '個裡',
 '个钟' => '個鐘',
 '个钟表' => '個鐘錶',
@@ -3854,7 +3858,6 @@ $zh2Hant = array(
 '候复' => '候覆',
 '倚闲' => '倚閑',
 '倛丑' => '倛醜',
-'借听于聋' => '借聽於聾',
 '借鉴' => '借鑑',
 '倦游' => '倦遊',
 '假里' => '假裡',
@@ -4066,8 +4069,8 @@ $zh2Hant = array(
 '分子钟' => '分子鐘',
 '分子云' => '分子雲',
 '分布于' => '分布於',
-'分散于' => '分散於',
 '分钟' => '分鐘',
+'分钟里' => '分鐘裡',
 '刑余' => '刑餘',
 '划一桨' => '划一槳',
 '划上' => '划上',
@@ -4243,7 +4246,6 @@ $zh2Hant = array(
 '卵与石斗' => '卵與石鬥',
 '卷须' => '卷鬚',
 '厂部' => '厂部',
-'厝薪于火' => '厝薪於火',
 '原子钟' => '原子鐘',
 '原钟' => '原鐘',
 '历物之意' => '厤物之意',
@@ -4256,6 +4258,7 @@ $zh2Hant = array(
 '反复' => '反覆',
 '反覆' => '反覆',
 '取舍' => '取捨',
+'取决于' => '取決於',
 '受雇' => '受僱',
 '受托' => '受託',
 '丛林里' => '叢林裡',
@@ -4517,6 +4520,7 @@ $zh2Hant = array(
 '回游' => '回遊',
 '因于' => '因於',
 '困倦起来' => '困倦起來',
+'困于' => '困於',
 '困兽之斗' => '困獸之鬥',
 '困兽犹斗' => '困獸猶鬥',
 '困斗' => '困鬥',
@@ -4568,6 +4572,7 @@ $zh2Hant = array(
 '埃及历史' => '埃及歷史',
 '埃及艳后' => '埃及豔后',
 '埃荣冲' => '埃榮衝',
+'城市里' => '城市裡',
 '城里' => '城裡',
 '埔子里' => '埔子里',
 '埔里社' => '埔裏社',
@@ -4765,7 +4770,6 @@ $zh2Hant = array(
 '字汇' => '字彙',
 '字码表' => '字碼表',
 '字里行间' => '字裡行間',
-'存十一于千百' => '存十一於千百',
 '存折' => '存摺',
 '存于' => '存於',
 '孛里海' => '孛里海',
@@ -4811,10 +4815,10 @@ $zh2Hant = array(
 '实干' => '實幹',
 '实累累' => '實纍纍',
 '写字台' => '寫字檯',
-'宽宽松松' => '寬寬鬆鬆',
 '宽于' => '寬於',
 '宽余' => '寬餘',
 '宽松' => '寬鬆',
+'宽松松' => '寬鬆鬆',
 '寮采' => '寮寀',
 '寶山庄' => '寶山庄',
 '宝历' => '寶曆',
@@ -4864,13 +4868,16 @@ $zh2Hant = array(
 '小型钟表面' => '小型鐘表面',
 '小型钟表' => '小型鐘錶',
 '小型钟面' => '小型鐘面',
+'小时里' => '小時裡',
 '小米面' => '小米麵',
 '小只' => '小隻',
 '少采' => '少採',
 '就范' => '就範',
 '就里' => '就裡',
 '尸位素餐' => '尸位素餐',
+'尸佼' => '尸佼',
 '尸利' => '尸利',
+'尸子' => '尸子',
 '尸居余气' => '尸居餘氣',
 '尸弃佛' => '尸棄佛',
 '尸祝' => '尸祝',
@@ -4900,7 +4907,7 @@ $zh2Hant = array(
 '山羊胡' => '山羊鬍',
 '山里有' => '山裡有',
 '山里的' => '山裡的',
-'山谷道' => '山谷道',
+'山谷' => '山谷',
 '山重水复' => '山重水複',
 '岫岩' => '岫巖',
 '岱岳' => '岱嶽',
@@ -4945,7 +4952,7 @@ $zh2Hant = array(
 '已占算' => '已占算',
 '巴尔干' => '巴爾幹',
 '巷里' => '巷裡',
-'市里' => '市裡',
+'市里的' => '市裡的',
 '布谷' => '布穀',
 '布谷鸟' => '布穀鳥',
 '布谷鸟钟' => '布穀鳥鐘',
@@ -4985,8 +4992,8 @@ $zh2Hant = array(
 '干了' => '幹了',
 '干事' => '幹事',
 '干些' => '幹些',
-'干人' => '幹人',
 '干什么' => '幹什麼',
+'干仗' => '幹仗',
 '干个' => '幹個',
 '干劲' => '幹勁',
 '干吏' => '幹吏',
@@ -5025,8 +5032,7 @@ $zh2Hant = array(
 '干起来' => '幹起來',
 '干路' => '幹路',
 '干办' => '幹辦',
-'干这一行' => '幹這一行',
-'干这种事' => '幹這種事',
+'干这' => '幹這',
 '干道' => '幹道',
 '干部' => '幹部',
 '干革命' => '幹革命',
@@ -5344,6 +5350,7 @@ $zh2Hant = array(
 '忠于' => '忠於',
 '快快当当' => '快快當當',
 '快冲' => '快衝',
+'怎么干' => '怎麼幹',
 '怒于' => '怒於',
 '怒气冲天' => '怒氣衝天',
 '怒火冲天' => '怒火衝天',
@@ -5441,6 +5448,7 @@ $zh2Hant = array(
 '截发' => '截髮',
 '战天斗地' => '戰天鬥地',
 '战栗' => '戰慄',
+'战于' => '戰於',
 '战斗' => '戰鬥',
 '戏里' => '戲裡',
 '戲院里' => '戲院里',
@@ -5734,7 +5742,6 @@ $zh2Hant = array(
 '控制' => '控制',
 '推情准理' => '推情準理',
 '推托之词' => '推托之詞',
-'推舟于陆' => '推舟於陸',
 '推托' => '推託',
 '提子干' => '提子乾',
 '提心吊胆' => '提心弔膽',
@@ -5876,126 +5883,10 @@ $zh2Hant = array(
 '方志恒' => '方志恒',
 '方法里' => '方法裡',
 '方志' => '方誌',
-'于0' => '於0',
-'于1' => '於1',
-'于1天' => '於1天',
-'于2' => '於2',
-'于2天' => '於2天',
-'于3' => '於3',
-'于3天' => '於3天',
-'于4' => '於4',
-'于4天' => '於4天',
-'于5' => '於5',
-'于5天' => '於5天',
-'于6' => '於6',
-'于6天' => '於6天',
-'于7' => '於7',
-'于7天' => '於7天',
-'于8' => '於8',
-'于8天' => '於8天',
-'于9' => '於9',
-'于9天' => '於9天',
-'于一' => '於一',
-'于一天' => '於一天',
-'于一役' => '於一役',
-'于七' => '於七',
-'于七天' => '於七天',
-'于三' => '於三',
-'于三天' => '於三天',
-'于世' => '於世',
-'于之' => '於之',
-'于乎' => '於乎',
-'于九' => '於九',
-'于九天' => '於九天',
-'于事' => '於事',
-'于二' => '於二',
-'于二天' => '於二天',
-'于五' => '於五',
-'于五天' => '於五天',
-'于人' => '於人',
-'于今' => '於今',
-'于他' => '於他',
-'于伏' => '於伏',
-'于何' => '於何',
-'于你' => '於你',
-'于八' => '於八',
-'于八天' => '於八天',
-'于六' => '於六',
-'于六天' => '於六天',
-'于前' => '於前',
-'于劣' => '於劣',
-'于勤' => '於勤',
-'于十' => '於十',
-'于十天' => '於十天',
-'于半' => '於半',
-'于呼哀哉' => '於呼哀哉',
-'于四' => '於四',
-'于四天' => '於四天',
-'于国' => '於國',
-'于坏' => '於坏',
-'于垂' => '於垂',
-'于夫罗' => '於夫羅',
-'於夫罗' => '於夫羅',
-'於夫羅' => '於夫羅',
-'于她' => '於她',
-'于好' => '於好',
-'于始' => '於始',
-'於姓' => '於姓',
-'于它' => '於它',
-'于家' => '於家',
-'于密' => '於密',
-'于差' => '於差',
-'于己' => '於己',
-'于市' => '於市',
-'于幕' => '於幕',
-'于弱' => '於弱',
-'于强' => '於強',
 '于后' => '於後',
 '于征' => '於徵',
-'于心' => '於心',
-'于怀' => '於懷',
-'于我' => '於我',
-'于戏' => '於戲',
-'于敝' => '於敝',
-'于斯' => '於斯',
-'于是' => '於是',
-'于是乎' => '於是乎',
-'于时' => '於時',
-'于梨华' => '於梨華',
-'於梨華' => '於梨華',
-'于乐' => '於樂',
-'于此' => '於此',
-'於氏' => '於氏',
-'于民' => '於民',
-'于水' => '於水',
-'于法' => '於法',
 '于海上' => '於海上',
 '于海边' => '於海邊',
-'于潜县' => '於潛縣',
-'于火' => '於火',
-'于焉' => '於焉',
-'于墙' => '於牆',
-'于物' => '於物',
-'于毕' => '於畢',
-'于尽' => '於盡',
-'于盲' => '於盲',
-'于祂' => '於祂',
-'于穆' => '於穆',
-'于终' => '於終',
-'于美' => '於美',
-'于色' => '於色',
-'于菟' => '於菟',
-'于蓝' => '於藍',
-'于行' => '於行',
-'于衷' => '於衷',
-'于该' => '於該',
-'于农' => '於農',
-'于途' => '於途',
-'于过' => '於過',
-'于邑' => '於邑',
-'于丑' => '於醜',
-'于野' => '於野',
-'于陆' => '於陸',
 '于震中' => '於震中',
 '于震前' => '於震前',
 '于震后' => '於震後',
@@ -6070,7 +5961,7 @@ $zh2Hant = array(
 '书签' => '書籤',
 '书面' => '書面',
 '曹子里' => '曹子里',
-'曼谷人' => '曼谷人',
+'曼谷' => '曼谷',
 '曾朴' => '曾樸',
 '最多' => '最多',
 '最多只' => '最多只',
@@ -6082,9 +5973,8 @@ $zh2Hant = array(
 '月历' => '月曆',
 '月历史' => '月歷史',
 '月球历表' => '月球曆表',
-'月离于毕' => '月離於畢',
+'月里来' => '月裡來',
 '月面' => '月面',
-'月丽于箕' => '月麗於箕',
 '有事之无范' => '有事之無範',
 '有仆' => '有僕',
 '有只不' => '有只不',
@@ -6276,8 +6166,8 @@ $zh2Hant = array(
 '朴陋' => '樸陋',
 '朴马' => '樸馬',
 '朴鲁' => '樸魯',
+'树干' => '樹幹',
 '树林里' => '樹林裡',
-'树干' => '樹榦',
 '树梁' => '樹樑',
 '桥梁' => '橋樑',
 '机械系' => '機械系',
@@ -6359,7 +6249,6 @@ $zh2Hant = array(
 '永志不忘' => '永誌不忘',
 '求知欲' => '求知慾',
 '求签' => '求籤',
-'求道于盲' => '求道於盲',
 '池里' => '池裡',
 '污蔑' => '污衊',
 '汤卤' => '汤滷',
@@ -6542,6 +6431,7 @@ $zh2Hant = array(
 '准头' => '準頭',
 '准点' => '準點',
 '沟大曲' => '溝大麯',
+'沟谷' => '溝谷',
 '溟蒙' => '溟濛',
 '溢于' => '溢於',
 '温洛克期' => '溫洛克期',
@@ -6631,6 +6521,7 @@ $zh2Hant = array(
 '沈海高速' => '瀋海高速',
 '沈阳' => '瀋陽',
 '泸州大曲' => '瀘州大麯',
+'沥干' => '瀝乾',
 '潇洒' => '瀟洒',
 '弥山遍野' => '瀰山遍野',
 '弥漫' => '瀰漫',
@@ -6682,8 +6573,6 @@ $zh2Hant = array(
 '燎发' => '燎髮',
 '烧干' => '燒乾',
 '燕几' => '燕几',
-'燕巢于幕' => '燕巢於幕',
-'燕燕于飞' => '燕燕于飛',
 '燕游' => '燕遊',
 '烫一个发' => '燙一個髮',
 '烫一次发' => '燙一次髮',
@@ -6783,6 +6672,7 @@ $zh2Hant = array(
 '生发' => '生髮',
 '产卵洄游' => '產卵洄游',
 '苏醒' => '甦醒',
+'用于' => '用於',
 '用法里' => '用法裡',
 '甩发' => '甩髮',
 '田子里' => '田子里',
@@ -6830,9 +6720,8 @@ $zh2Hant = array(
 '发签' => '發籤',
 '发松' => '發鬆',
 '发面' => '發麵',
-'白干' => '白乾',
+'白干儿' => '白乾兒',
 '白子里' => '白子里',
-'白干儿' => '白干兒',
 '白术' => '白朮',
 '白朴' => '白樸',
 '白净面皮' => '白淨面皮',
@@ -6926,6 +6815,7 @@ $zh2Hant = array(
 '眼眶里' => '眼眶裡',
 '眼睛里' => '眼睛裡',
 '眼里' => '眼裡',
+'着眼于' => '着眼於',
 '困乏' => '睏乏',
 '困了' => '睏了',
 '困倦' => '睏倦',
@@ -7381,6 +7271,7 @@ $zh2Hant = array(
 '老懞' => '老懞',
 '老于' => '老於',
 '老爷钟' => '老爺鐘',
+'老白干' => '老白乾',
 '老姜' => '老薑',
 '老板' => '老闆',
 '老面皮' => '老面皮',
@@ -7444,6 +7335,7 @@ $zh2Hant = array(
 '腊味' => '腊味',
 '腊毒' => '腊毒',
 '腊笔' => '腊筆',
+'腌臜' => '腌臢',
 '肾脏' => '腎臟',
 '腐干' => '腐乾',
 '腐余' => '腐餘',
@@ -7534,6 +7426,7 @@ $zh2Hant = array(
 '苑里' => '苑裡',
 '若干' => '若干',
 '苦干' => '苦幹',
+'苦于' => '苦於',
 '苦里' => '苦裡',
 '苦斗' => '苦鬥',
 '苎麻' => '苧麻',
@@ -7587,6 +7480,7 @@ $zh2Hant = array(
 '万象' => '萬象',
 '万只' => '萬隻',
 '万余' => '萬餘',
+'落于' => '落於',
 '落腮胡' => '落腮鬍',
 '落发' => '落髮',
 '叶叶琴' => '葉叶琴',
@@ -7594,6 +7488,7 @@ $zh2Hant = array(
 '葡萄干' => '葡萄乾',
 '董氏封发' => '董氏封髮',
 '葫芦里卖甚么药' => '葫蘆裡賣甚麼藥',
+'葬于' => '葬於',
 '蒙雾露' => '蒙霧露',
 '蒜发' => '蒜髮',
 '蒲席' => '蒲蓆',
@@ -7607,9 +7502,9 @@ $zh2Hant = array(
 '蓄须' => '蓄鬚',
 '席子' => '蓆子',
 '蓊郁' => '蓊鬱',
-'蓬蓬松松' => '蓬蓬鬆鬆',
 '蓬发' => '蓬髮',
 '蓬松' => '蓬鬆',
+'蓬松松' => '蓬鬆鬆',
 '参绥' => '蔘綏',
 '葱郁' => '蔥鬱',
 '荞麦面' => '蕎麥麵',
@@ -7687,6 +7582,7 @@ $zh2Hant = array(
 '萝卜干' => '蘿蔔乾',
 '虎须' => '虎鬚',
 '虎斗' => '虎鬥',
+'处于' => '處於',
 '虚夸' => '虛誇',
 '号志' => '號誌',
 '虫部' => '虫部',
@@ -7715,7 +7611,6 @@ $zh2Hant = array(
 '行凶' => '行兇',
 '行家里手' => '行家裡手',
 '行于' => '行於',
-'行百里者半于九十' => '行百里者半於九十',
 '卫后庄公' => '衛後莊公',
 '卫星钟' => '衛星鐘',
 '冲上' => '衝上',
@@ -7978,7 +7873,6 @@ $zh2Hant = array(
 '词汇' => '詞彙',
 '词余' => '詞餘',
 '询于' => '詢於',
-'询于刍荛' => '詢於芻蕘',
 '试制' => '試製',
 '詩云' => '詩云',
 '诗云' => '詩云',
@@ -8069,7 +7963,6 @@ $zh2Hant = array(
 '謷丑' => '謷醜',
 '謹愿' => '謹愿',
 '谨愿' => '謹愿',
-'谨于心' => '謹於心',
 '哗噪' => '譁噪',
 '哗嚣' => '譁囂',
 '哗然' => '譁然',
@@ -8183,8 +8076,8 @@ $zh2Hant = array(
 '挽输' => '輓輸',
 '挽辞' => '輓辭',
 '轻于' => '輕於',
-'轻轻松松' => '輕輕鬆鬆',
 '轻松' => '輕鬆',
+'轻松松' => '輕鬆鬆',
 '轮奸' => '輪姦',
 '轮回' => '輪迴',
 '转向往' => '轉向往',
@@ -8238,7 +8131,6 @@ $zh2Hant = array(
 '迷蒙' => '迷濛',
 '追凶' => '追兇',
 '退伙' => '退夥',
-'退藏于密' => '退藏於密',
 '逆钟' => '逆鐘',
 '逆钟向' => '逆鐘向',
 '逆风后' => '逆風後',
@@ -8275,6 +8167,7 @@ $zh2Hant = array(
 '这里' => '這裡',
 '这钟' => '這鐘',
 '这只' => '這隻',
+'这么干' => '這麼幹',
 '这出' => '這齣',
 '通奸' => '通姦',
 '通心面' => '通心麵',
@@ -8351,6 +8244,7 @@ $zh2Hant = array(
 '递回' => '遞迴',
 '远游' => '遠遊',
 '遨游' => '遨遊',
+'适于' => '適於',
 '遮丑' => '遮醜',
 '迁于' => '遷於',
 '选手表明' => '選手表明',
@@ -8393,6 +8287,7 @@ $zh2Hant = array(
 '部子里' => '部子里',
 '部落发' => '部落發',
 '郭后' => '郭后',
+'都市里' => '都市裡',
 '都于' => '都於',
 '乡愿' => '鄉愿',
 '鄉愿' => '鄉愿',
@@ -8409,6 +8304,7 @@ $zh2Hant = array(
 '酒麹' => '酒麴',
 '酥松' => '酥鬆',
 '酸姜' => '酸薑',
+'腌制' => '醃製',
 '醇朴' => '醇樸',
 '醉于' => '醉於',
 '醋坛' => '醋罈',
@@ -8882,11 +8778,13 @@ $zh2Hant = array(
 '风起云涌' => '風起雲湧',
 '風采' => '風采',
 '风采' => '風采',
+'风刮' => '風颳',
 '台风' => '颱風',
 '台风后' => '颱風後',
 '刮了' => '颳了',
 '刮倒' => '颳倒',
 '刮去' => '颳去',
+'刮大风' => '颳大風',
 '刮得' => '颳得',
 '刮走' => '颳走',
 '刮起' => '颳起',
@@ -9087,7 +8985,6 @@ $zh2Hant = array(
 '发式' => '髮式',
 '发引千钧' => '髮引千鈞',
 '发披肩' => '髮披肩',
-'发指' => '髮指',
 '发卷' => '髮捲',
 '发根' => '髮根',
 '发油' => '髮油',
@@ -9152,7 +9049,7 @@ $zh2Hant = array(
 '松通' => '鬆通',
 '松开' => '鬆開',
 '松饼' => '鬆餅',
-'松松' => '鬆鬆',
+'松松地' => '鬆鬆地',
 '鬈发' => '鬈髮',
 '胡子' => '鬍子',
 '胡梢' => '鬍梢',
@@ -9198,6 +9095,7 @@ $zh2Hant = array(
 '斗志' => '鬥志',
 '斗闷' => '鬥悶',
 '斗成' => '鬥成',
+'斗战' => '鬥戰',
 '斗打' => '鬥打',
 '斗批改' => '鬥批改',
 '斗技' => '鬥技',
@@ -9308,7 +9206,6 @@ $zh2Hant = array(
 '鲸须' => '鯨鬚',
 '鳥栖' => '鳥栖',
 '鸟栖市' => '鳥栖市',
-'鳳凰于飛' => '鳳凰于飛',
 '凤梨干' => '鳳梨乾',
 '鸣钟' => '鳴鐘',
 '鸿范' => '鴻範',
@@ -9343,7 +9240,7 @@ $zh2Hant = array(
 '咸菜' => '鹹菜',
 '咸菜干' => '鹹菜乾',
 '咸蛋' => '鹹蛋',
-'咸猪肉' => '鹹豬肉',
+'咸猪' => '鹹豬',
 '咸类' => '鹹類',
 '咸食' => '鹹食',
 '咸鱼' => '鹹魚',
@@ -9417,6 +9314,7 @@ $zh2Hant = array(
 '黑干将' => '黑幹將',
 '黑长发' => '黑長髮',
 '黑发' => '黑髮',
+'点个赞' => '點個讚',
 '点札' => '點劄',
 '点半钟' => '點半鐘',
 '点多钟' => '點多鐘',
@@ -14183,6 +14081,9 @@ $zh2TW = array(
 '攻打印' => '攻打印',
 '数字技术' => '數位技術',
 '數碼技術' => '數位技術',
+'数字照相机' => '數位照相機',
+'数码照相机' => '數位照相機',
+'數碼照相機' => '數位照相機',
 '数码相机' => '數位相機',
 '數碼相機' => '數位相機',
 '数字信号' => '數位訊號',
@@ -14465,6 +14366,7 @@ $zh2TW = array(
 '也門' => '葉門',
 '也门' => '葉門',
 '着' => '著',
+'着眼于' => '著眼於',
 '科摩罗' => '葛摩',
 '科摩羅' => '葛摩',
 '格林美獎' => '葛萊美獎',
@@ -14514,6 +14416,7 @@ $zh2TW = array(
 '瑙魯' => '諾魯',
 '瑙鲁' => '諾魯',
 '科特迪瓦' => '象牙海岸',
+'碧咸' => '貝克漢',
 '貝爾格萊德' => '貝爾格勒',
 '贝尔格莱德' => '貝爾格勒',
 '伯利兹' => '貝里斯',
@@ -14531,7 +14434,6 @@ $zh2TW = array(
 '莱索托' => '賴索托',
 '萊索托' => '賴索托',
 '塞浦路斯' => '賽普勒斯',
-'碧咸' => '贝克漢',
 '赫丘勒·波洛' => '赫丘勒·白羅',
 '赫鲁晓夫' => '赫魯雪夫',
 '切尔诺贝利' => '車諾比',
@@ -14680,6 +14582,7 @@ $zh2HK = array(
 '乘著作' => '乘著作',
 '乘著名' => '乘著名',
 '乘著書' => '乘著書',
+'乘著称' => '乘著稱',
 '乘著稱' => '乘著稱',
 '乘著者' => '乘著者',
 '乘著述' => '乘著述',
@@ -14697,6 +14600,7 @@ $zh2HK = array(
 '亮著作' => '亮著作',
 '亮著名' => '亮著名',
 '亮著書' => '亮著書',
+'亮著称' => '亮著稱',
 '亮著稱' => '亮著稱',
 '亮著者' => '亮著者',
 '亮著述' => '亮著述',
@@ -14772,6 +14676,7 @@ $zh2HK = array(
 '低著作' => '低著作',
 '低著名' => '低著名',
 '低著書' => '低著書',
+'低著称' => '低著稱',
 '低著稱' => '低著稱',
 '低著者' => '低著者',
 '低著述' => '低著述',
@@ -14991,10 +14896,12 @@ $zh2HK = array(
 '信著作' => '信著作',
 '信著名' => '信著名',
 '信著書' => '信著書',
+'信著称' => '信著稱',
 '信著稱' => '信著稱',
 '信著者' => '信著者',
 '信著述' => '信著述',
 '信著錄' => '信著錄',
+'个月里' => '個月裏',
 '个里' => '個裏',
 '倒楣' => '倒霉',
 '候著' => '候着',
@@ -15061,6 +14968,7 @@ $zh2HK = array(
 '光著作' => '光著作',
 '光著名' => '光著名',
 '光著書' => '光著書',
+'光著称' => '光著稱',
 '光著稱' => '光著稱',
 '光著者' => '光著者',
 '光著述' => '光著述',
@@ -15068,14 +14976,6 @@ $zh2HK = array(
 '柯林頓' => '克林頓',
 '克羅埃西亞' => '克羅地亞',
 '公布' => '公佈',
-'冀著' => '冀着',
-'冀著作' => '冀著作',
-'冀著名' => '冀著名',
-'冀著書' => '冀著書',
-'冀著稱' => '冀著稱',
-'冀著者' => '冀著者',
-'冀著述' => '冀著述',
-'冀著錄' => '冀著錄',
 '冒著' => '冒着',
 '冒著作' => '冒著作',
 '冒著名' => '冒著名',
@@ -15088,9 +14988,11 @@ $zh2HK = array(
 '恺撒' => '凱撒',
 '函数里' => '函數裏',
 '分布' => '分佈',
+'分布于' => '分佈於',
 '分佈著' => '分佈着',
 '分布著' => '分佈着',
 '分占' => '分佔',
+'分钟里' => '分鐘裏',
 '錢尼' => '切尼',
 '切尔诺贝利' => '切爾諾貝爾',
 '列支敦斯登' => '列支敦士登',
@@ -15110,6 +15012,7 @@ $zh2HK = array(
 '刻著作' => '刻著作',
 '刻著名' => '刻著名',
 '刻著書' => '刻著書',
+'刻著称' => '刻著稱',
 '刻著稱' => '刻著稱',
 '刻著者' => '刻著者',
 '刻著述' => '刻著述',
@@ -15127,18 +15030,11 @@ $zh2HK = array(
 '努力著作' => '努力著作',
 '努力著名' => '努力著名',
 '努力著書' => '努力著書',
+'努力著称' => '努力著稱',
 '努力著稱' => '努力著稱',
 '努力著者' => '努力著者',
 '努力著述' => '努力著述',
 '努力著錄' => '努力著錄',
-'努著' => '努着',
-'努著作' => '努著作',
-'努著名' => '努著名',
-'努著書' => '努著書',
-'努著稱' => '努著稱',
-'努著者' => '努著者',
-'努著述' => '努著述',
-'努著錄' => '努著錄',
 '布蘭登堡' => '勃蘭登堡',
 '動著' => '動着',
 '動著作' => '動著作',
@@ -15180,14 +15076,6 @@ $zh2HK = array(
 '厄利垂亞' => '厄立特里亞',
 '源代码' => '原始碼',
 '去山里' => '去山裏',
-'去著' => '去着',
-'去著作' => '去著作',
-'去著名' => '去著名',
-'去著書' => '去著書',
-'去著稱' => '去著稱',
-'去著者' => '去著者',
-'去著述' => '去著述',
-'去著錄' => '去著錄',
 '参数里' => '參數裏',
 '受著' => '受着',
 '受著作' => '受著作',
@@ -15254,6 +15142,7 @@ $zh2HK = array(
 '味著作' => '味著作',
 '味著名' => '味著名',
 '味著書' => '味著書',
+'味著称' => '味著稱',
 '味著稱' => '味著稱',
 '味著者' => '味著者',
 '味著述' => '味著述',
@@ -15346,14 +15235,6 @@ $zh2HK = array(
 '图里,' => '圖裏,',
 '土里' => '土裏',
 '在山里' => '在山裏',
-'在著' => '在着',
-'在著作' => '在著作',
-'在著名' => '在著名',
-'在著書' => '在著書',
-'在著稱' => '在著稱',
-'在著者' => '在著者',
-'在著述' => '在著述',
-'在著錄' => '在著錄',
 '蓋亞那' => '圭亞那',
 '地占' => '地佔',
 '地图里' => '地圖裏',
@@ -15372,9 +15253,11 @@ $zh2HK = array(
 '衣索匹亞' => '埃塞俄比亚',
 '衣索比亞' => '埃塞俄比亞',
 '葉里溫' => '埃里溫',
+'城市里' => '城市裏',
 '城里' => '城裏',
 '域里' => '域裏',
 '吉里巴斯' => '基里巴斯',
+'堅貞著' => '堅貞着',
 '场里' => '場裏',
 '塗著' => '塗着',
 '塞普勒斯' => '塞浦路斯',
@@ -15424,18 +15307,12 @@ $zh2HK = array(
 '威爾士' => '威爾斯',
 '子里' => '子裏',
 '字里行间' => '字裏行間',
+'存在著' => '存在着',
 '存著' => '存着',
+'存著作' => '存著作',
 '存著名' => '存著名',
 '孟德爾頌' => '孟德爾遜',
 '门德尔松' => '孟德爾遜',
-'孤著' => '孤着',
-'孤著作' => '孤著作',
-'孤著名' => '孤著名',
-'孤著書' => '孤著書',
-'孤著稱' => '孤著稱',
-'孤著者' => '孤著者',
-'孤著述' => '孤著述',
-'孤著錄' => '孤著錄',
 '學著' => '學着',
 '學著作' => '學著作',
 '學著名' => '學著名',
@@ -15449,6 +15326,7 @@ $zh2HK = array(
 '守著作' => '守著作',
 '守著名' => '守著名',
 '守著書' => '守著書',
+'守著称' => '守著稱',
 '守著稱' => '守著稱',
 '守著者' => '守著者',
 '守著述' => '守著述',
@@ -15459,6 +15337,7 @@ $zh2HK = array(
 '定著作' => '定著作',
 '定著名' => '定著名',
 '定著書' => '定著書',
+'定著称' => '定著稱',
 '定著稱' => '定著稱',
 '定著者' => '定著者',
 '定著述' => '定著述',
@@ -15502,6 +15381,7 @@ $zh2HK = array(
 '對著者' => '對著者',
 '對著述' => '對著述',
 '對著錄' => '對著錄',
+'小时里' => '小時裏',
 '少占' => '少佔',
 '就里' => '就裏',
 '尼克松' => '尼克遜',
@@ -15530,11 +15410,12 @@ $zh2HK = array(
 '巴士拉' => '巴斯拉',
 '巷里' => '巷裏',
 '市占' => '市佔',
-'市里' => '市裏',
+'市里的' => '市裏的',
 '布吉納法索' => '布基納法索',
 '布什' => '布殊',
 '布里斯托尔' => '布里斯托',
 '蒲隆地' => '布隆迪',
+'希冀著' => '希冀着',
 '席哈克' => '希拉克',
 '希拉蕊' => '希拉莉',
 '希特勒' => '希特拉',
@@ -15572,14 +15453,6 @@ $zh2HK = array(
 '店里' => '店裏',
 '坎城' => '康城',
 '戛纳' => '康城',
-'康著' => '康着',
-'康著作' => '康著作',
-'康著名' => '康著名',
-'康著書' => '康著書',
-'康著稱' => '康著稱',
-'康著者' => '康著者',
-'康著述' => '康著述',
-'康著錄' => '康著錄',
 '庙里' => '廟裏',
 '強占' => '強佔',
 '强占' => '強佔',
@@ -15628,6 +15501,7 @@ $zh2HK = array(
 '心著作' => '心著作',
 '心著名' => '心著名',
 '心著書' => '心著書',
+'心著称' => '心著稱',
 '心著稱' => '心著稱',
 '心著者' => '心著者',
 '心著述' => '心著述',
@@ -15642,13 +15516,6 @@ $zh2HK = array(
 '忍著者' => '忍著者',
 '忍著述' => '忍著述',
 '忍著錄' => '忍著錄',
-'志著作' => '志著作',
-'志著名' => '志著名',
-'志著書' => '志著書',
-'志著稱' => '志著稱',
-'志著者' => '志著者',
-'志著述' => '志著述',
-'志著錄' => '志著錄',
 '忙著' => '忙着',
 '忙著作' => '忙著作',
 '忙著名' => '忙著名',
@@ -15658,6 +15525,7 @@ $zh2HK = array(
 '忙著述' => '忙著述',
 '忙著錄' => '忙著錄',
 '忙里' => '忙裏',
+'忠貞著' => '忠貞着',
 '急著' => '急着',
 '急著作' => '急著作',
 '急著名' => '急著名',
@@ -15666,14 +15534,6 @@ $zh2HK = array(
 '急著者' => '急著者',
 '急著述' => '急著述',
 '急著錄' => '急著錄',
-'性著' => '性着',
-'性著作' => '性著作',
-'性著名' => '性著名',
-'性著書' => '性著書',
-'性著稱' => '性著稱',
-'性著者' => '性著者',
-'性著述' => '性著述',
-'性著錄' => '性著錄',
 '怪里怪气' => '怪裏怪氣',
 '悠著' => '悠着',
 '悠著作' => '悠著作',
@@ -15689,6 +15549,7 @@ $zh2HK = array(
 '想著作' => '想著作',
 '想著名' => '想著名',
 '想著書' => '想著書',
+'想著称' => '想著稱',
 '想著稱' => '想著稱',
 '想著者' => '想著者',
 '想著述' => '想著述',
@@ -15992,6 +15853,8 @@ $zh2HK = array(
 '散布' => '散佈',
 '散佈著' => '散佈着',
 '散布著' => '散佈着',
+'数字照相机' => '数碼照相機',
+'數位照相機' => '数碼照相機',
 '數著' => '數着',
 '数字技术' => '數碼技術',
 '數位技術' => '數碼技術',
@@ -16070,6 +15933,7 @@ $zh2HK = array(
 '会占卜' => '會占卜',
 '會占卜' => '會占卜',
 '会里' => '會裏',
+'月裡来' => '月裏來',
 '有著' => '有着',
 '有著作' => '有著作',
 '有著名' => '有著名',
@@ -16270,14 +16134,6 @@ $zh2HK = array(
 '海洛因' => '海洛英',
 '海湾布雷' => '海灣佈雷',
 '海灣布雷' => '海灣佈雷',
-'涵著' => '涵着',
-'涵著作' => '涵著作',
-'涵著名' => '涵著名',
-'涵著書' => '涵著書',
-'涵著稱' => '涵著稱',
-'涵著者' => '涵著者',
-'涵著述' => '涵著述',
-'涵著錄' => '涵著錄',
 '涼著' => '涼着',
 '涼著作' => '涼著作',
 '涼著名' => '涼著名',
@@ -16404,19 +16260,12 @@ $zh2HK = array(
 '猜著者' => '猜著者',
 '猜著述' => '猜著述',
 '猜著錄' => '猜著錄',
+'猶豫著' => '猶豫着',
 '狱里' => '獄裏',
 '独占' => '獨佔',
 '獨占' => '獨佔',
-'獨著' => '獨着',
 '獨立國家國協' => '獨立國家聯合體',
 '獨立國協' => '獨聯體',
-'獨著作' => '獨著作',
-'獨著名' => '獨著名',
-'獨著書' => '獨著書',
-'獨著稱' => '獨著稱',
-'獨著者' => '獨著者',
-'獨著述' => '獨著述',
-'獨著錄' => '獨著錄',
 '獲著' => '獲着',
 '獲著作' => '獲著作',
 '獲著名' => '獲著名',
@@ -16539,14 +16388,6 @@ $zh2HK = array(
 '盯著者' => '盯著者',
 '盯著述' => '盯著述',
 '盯著錄' => '盯著錄',
-'盾著' => '盾着',
-'盾著作' => '盾著作',
-'盾著名' => '盾著名',
-'盾著書' => '盾著書',
-'盾著稱' => '盾著稱',
-'盾著者' => '盾著者',
-'盾著述' => '盾著述',
-'盾著錄' => '盾著錄',
 '看不著' => '看不着',
 '看得著' => '看得着',
 '看法里' => '看法裏',
@@ -16624,6 +16465,7 @@ $zh2HK = array(
 '瞪著者' => '瞪著者',
 '瞪著述' => '瞪著述',
 '瞪著錄' => '瞪著錄',
+'矛盾著' => '矛盾着',
 '智慧財產權' => '知識產權',
 '智財權' => '知識產權',
 '短信' => '短訊',
@@ -16634,8 +16476,8 @@ $zh2HK = array(
 '硬件' => '硬件',
 '硬體' => '硬件',
 '碗里' => '碗裏',
+'貝克漢' => '碧咸',
 '贝克汉姆' => '碧咸',
-'贝克漢' => '碧咸',
 '社里' => '社裏',
 '福馬林' => '福爾馬林',
 '福著' => '福着',
@@ -16679,6 +16521,15 @@ $zh2HK = array(
 '穿著述' => '穿著述',
 '穿著錄' => '穿著錄',
 '窝里' => '窩裏',
+'立著' => '立着',
+'立著《' => '立著《',
+'立著作' => '立著作',
+'立著名' => '立著名',
+'立著有' => '立著有',
+'立著称' => '立著稱',
+'立著稱' => '立著稱',
+'立著者' => '立著者',
+'立著(' => '立著(',
 '站著' => '站着',
 '站著作' => '站著作',
 '站著名' => '站著名',
@@ -16812,6 +16663,7 @@ $zh2HK = array(
 '美著作' => '美著作',
 '美著名' => '美著名',
 '美著書' => '美著書',
+'美著称' => '美著稱',
 '美著稱' => '美著稱',
 '美著者' => '美著者',
 '美著述' => '美著述',
@@ -16967,14 +16819,7 @@ $zh2HK = array(
 '藏著者' => '藏著者',
 '藏著述' => '藏著述',
 '藏著錄' => '藏著錄',
-'藝著' => '藝着',
-'藝著作' => '藝著作',
-'藝著名' => '藝著名',
-'藝著書' => '藝著書',
-'藝著稱' => '藝著稱',
-'藝著者' => '藝著者',
-'藝著述' => '藝著述',
-'藝著錄' => '藝著錄',
+'蘊涵著' => '蘊涵着',
 '蘸著' => '蘸着',
 '蘸著作' => '蘸著作',
 '蘸著名' => '蘸著名',
@@ -17122,24 +16967,8 @@ $zh2HK = array(
 '豎著錄' => '豎著錄',
 '象徵著名' => '象徵著名',
 '象徵著' => '象著着',
-'豫著' => '豫着',
-'豫著作' => '豫著作',
-'豫著名' => '豫著名',
-'豫著書' => '豫著書',
-'豫著稱' => '豫著稱',
-'豫著者' => '豫著者',
-'豫著述' => '豫著述',
-'豫著錄' => '豫著錄',
 '貝爾格勒' => '貝爾格萊德',
 '布莱尔' => '貝理雅',
-'貞著' => '貞着',
-'貞著作' => '貞著作',
-'貞著名' => '貞著名',
-'貞著書' => '貞著書',
-'貞著稱' => '貞著稱',
-'貞著者' => '貞著者',
-'貞著述' => '貞著述',
-'貞著錄' => '貞著錄',
 '負著' => '負着',
 '貢寮' => '貢寮',
 '買凶' => '買兇',
@@ -17339,6 +17168,7 @@ $zh2HK = array(
 '遇著作' => '遇著作',
 '遇著名' => '遇著名',
 '遇著書' => '遇著書',
+'遇著称' => '遇著稱',
 '遇著稱' => '遇著稱',
 '遇著者' => '遇著者',
 '遇著述' => '遇著述',
@@ -17355,18 +17185,11 @@ $zh2HK = array(
 '達著者' => '達著者',
 '達著述' => '達著述',
 '達著錄' => '達著錄',
-'遠著' => '遠着',
-'遠著作' => '遠著作',
-'遠著名' => '遠著名',
-'遠著書' => '遠著書',
-'遠著稱' => '遠著稱',
-'遠著者' => '遠著者',
-'遠著述' => '遠著述',
-'遠著錄' => '遠著錄',
 '还占' => '還佔',
 '還占' => '還佔',
 '邋里邋遢' => '邋裏邋遢',
 '那里' => '那裏',
+'都市里' => '都市裏',
 '配合著' => '配合着',
 '配合著名' => '配合著名',
 '配图里' => '配圖裏',
@@ -17515,6 +17338,7 @@ $zh2HK = array(
 '雅著作' => '雅著作',
 '雅著名' => '雅著名',
 '雅著書' => '雅著書',
+'雅著称' => '雅著稱',
 '雅著稱' => '雅著稱',
 '雅著者' => '雅著者',
 '雅著述' => '雅著述',
@@ -17644,18 +17468,11 @@ $zh2HK = array(
 '高著作' => '高著作',
 '高著名' => '高著名',
 '高著書' => '高著書',
+'高著称' => '高著稱',
 '高著稱' => '高著稱',
 '高著者' => '高著者',
 '高著述' => '高著述',
 '高著錄' => '高著錄',
-'髭著' => '髭着',
-'髭著作' => '髭著作',
-'髭著名' => '髭著名',
-'髭著書' => '髭著書',
-'髭著稱' => '髭著稱',
-'髭著者' => '髭著者',
-'髭著述' => '髭著述',
-'髭著錄' => '髭著錄',
 '斗着' => '鬥着',
 '鬥著' => '鬥着',
 '鬥著作' => '鬥著作',
@@ -17814,6 +17631,7 @@ $zh2CN = array(
 '乘著作' => '乘著作',
 '乘著名' => '乘著名',
 '乘著錄' => '乘著录',
+'乘著称' => '乘著称',
 '乘著稱' => '乘著称',
 '乘著者' => '乘著者',
 '乘著述' => '乘著述',
@@ -17844,6 +17662,7 @@ $zh2CN = array(
 '亮著作' => '亮著作',
 '亮著名' => '亮著名',
 '亮著錄' => '亮著录',
+'亮著称' => '亮著称',
 '亮著稱' => '亮著称',
 '亮著者' => '亮著者',
 '亮著述' => '亮著述',
@@ -17899,6 +17718,7 @@ $zh2CN = array(
 '低著作' => '低著作',
 '低著名' => '低著名',
 '低著錄' => '低著录',
+'低著称' => '低著称',
 '低著稱' => '低著称',
 '低著者' => '低著者',
 '低著述' => '低著述',
@@ -17907,6 +17727,7 @@ $zh2CN = array(
 '住著作' => '住著作',
 '住著名' => '住著名',
 '住著錄' => '住著录',
+'住著称' => '住著称',
 '住著稱' => '住著称',
 '住著者' => '住著者',
 '住著述' => '住著述',
@@ -17929,6 +17750,7 @@ $zh2CN = array(
 '保障著作' => '保障著作',
 '保障著名' => '保障著名',
 '保障著錄' => '保障著录',
+'保障著称' => '保障著称',
 '保障著稱' => '保障著称',
 '保障著者' => '保障著者',
 '保障著述' => '保障著述',
@@ -17939,6 +17761,7 @@ $zh2CN = array(
 '信著作' => '信著作',
 '信著名' => '信著名',
 '信著錄' => '信著录',
+'信著称' => '信著称',
 '信著稱' => '信著称',
 '信著者' => '信著者',
 '信著述' => '信著述',
@@ -17986,6 +17809,7 @@ $zh2CN = array(
 '光著作' => '光著作',
 '光著名' => '光著名',
 '光著錄' => '光著录',
+'光著称' => '光著称',
 '光著稱' => '光著称',
 '光著者' => '光著者',
 '光著述' => '光著述',
@@ -18020,15 +17844,6 @@ $zh2CN = array(
 '關著者' => '关著者',
 '關著述' => '关著述',
 '關帳' => '关账',
-'氧份' => '养分',
-'冀著' => '冀着',
-'冀著書' => '冀著书',
-'冀著作' => '冀著作',
-'冀著名' => '冀著名',
-'冀著錄' => '冀著录',
-'冀著稱' => '冀著称',
-'冀著者' => '冀著者',
-'冀著述' => '冀著述',
 '記憶體' => '内存',
 '甘比亞' => '冈比亚',
 '冒著' => '冒着',
@@ -18051,6 +17866,7 @@ $zh2CN = array(
 '衝著' => '冲着',
 '沖著。' => '冲著。',
 '沖著《' => '冲著《',
+'沖著(' => '冲著(',
 '沖著,' => '冲著,',
 '沖帳' => '冲账',
 '涼著' => '凉着',
@@ -18096,6 +17912,7 @@ $zh2CN = array(
 '刻著作' => '刻著作',
 '刻著名' => '刻著名',
 '刻著錄' => '刻著录',
+'刻著称' => '刻著称',
 '刻著稱' => '刻著称',
 '刻著者' => '刻著者',
 '刻著述' => '刻著述',
@@ -18124,17 +17941,10 @@ $zh2CN = array(
 '努力著作' => '努力著作',
 '努力著名' => '努力著名',
 '努力著錄' => '努力著录',
+'努力著称' => '努力著称',
 '努力著稱' => '努力著称',
 '努力著者' => '努力著者',
 '努力著述' => '努力著述',
-'努著' => '努着',
-'努著書' => '努著书',
-'努著作' => '努著作',
-'努著名' => '努著名',
-'努著錄' => '努著录',
-'努著稱' => '努著称',
-'努著者' => '努著者',
-'努著述' => '努著述',
 '蘿拉' => '劳拉',
 '布蘭登堡' => '勃兰登堡',
 '白朗寧' => '勃朗宁',
@@ -18179,14 +17989,6 @@ $zh2CN = array(
 '壓著稱' => '压著称',
 '壓著者' => '压著者',
 '壓著述' => '压著述',
-'去著' => '去着',
-'去著書' => '去著书',
-'去著作' => '去著作',
-'去著名' => '去著名',
-'去著錄' => '去著录',
-'去著稱' => '去著称',
-'去著者' => '去著者',
-'去著述' => '去著述',
 '發著' => '发着',
 '發著《' => '发著《',
 '發著作' => '发著作',
@@ -18270,6 +18072,7 @@ $zh2CN = array(
 '味著作' => '味著作',
 '味著名' => '味著名',
 '味著錄' => '味著录',
+'味著称' => '味著称',
 '味著稱' => '味著称',
 '味著者' => '味著者',
 '味著述' => '味著述',
@@ -18360,14 +18163,6 @@ $zh2CN = array(
 '聖吉斯納域斯' => '圣基茨和尼维斯',
 '聖文森及格瑞那丁' => '圣文森特和格林纳丁斯',
 '聖馬利諾' => '圣马力诺',
-'在著' => '在着',
-'在著書' => '在著书',
-'在著作' => '在著作',
-'在著名' => '在著名',
-'在著錄' => '在著录',
-'在著稱' => '在著称',
-'在著者' => '在著者',
-'在著述' => '在著述',
 '蓋亞那' => '圭亚那',
 '坐著' => '坐着',
 '坐著書' => '坐著书',
@@ -18377,6 +18172,7 @@ $zh2CN = array(
 '坐著稱' => '坐著称',
 '坐著者' => '坐著者',
 '坐著述' => '坐著述',
+'堅貞著' => '坚贞着',
 '坦尚尼亞' => '坦桑尼亚',
 '伊波拉' => '埃博拉',
 '衣索匹亞' => '埃塞俄比亚',
@@ -18431,16 +18227,10 @@ $zh2CN = array(
 '字型檔' => '字库',
 '欄位' => '字段',
 '位元組' => '字节',
+'存在著' => '存在着',
 '存著' => '存着',
+'存著作' => '存著作',
 '存著名' => '存著名',
-'孤著' => '孤着',
-'孤著書' => '孤著书',
-'孤著作' => '孤著作',
-'孤著名' => '孤著名',
-'孤著錄' => '孤著录',
-'孤著稱' => '孤著称',
-'孤著者' => '孤著者',
-'孤著述' => '孤著述',
 '學姊' => '学姐',
 '學著' => '学着',
 '學著書' => '学著书',
@@ -18457,6 +18247,7 @@ $zh2CN = array(
 '守著作' => '守著作',
 '守著名' => '守著名',
 '守著錄' => '守著录',
+'守著称' => '守著称',
 '守著稱' => '守著称',
 '守著者' => '守著者',
 '守著述' => '守著述',
@@ -18468,6 +18259,7 @@ $zh2CN = array(
 '定著作' => '定著作',
 '定著名' => '定著名',
 '定著錄' => '定著录',
+'定著称' => '定著称',
 '定著稱' => '定著称',
 '定著者' => '定著者',
 '定著述' => '定著述',
@@ -18518,6 +18310,7 @@ $zh2CN = array(
 '布吉納法索' => '布基纳法索',
 '布隆泉' => '布隆方丹',
 '蒲隆地' => '布隆迪',
+'希冀著' => '希冀着',
 '席哈克' => '希拉克',
 '希拉莉' => '希拉里',
 '希拉蕊' => '希拉里',
@@ -18557,14 +18350,6 @@ $zh2CN = array(
 '應著稱' => '应著称',
 '應著者' => '应著者',
 '應著述' => '应著述',
-'康著' => '康着',
-'康著書' => '康著书',
-'康著作' => '康著作',
-'康著名' => '康著名',
-'康著錄' => '康著录',
-'康著稱' => '康著称',
-'康著者' => '康著者',
-'康著述' => '康著述',
 '建帳' => '建账',
 '克卜勒' => '开普勒',
 '蓋曼群島' => '开曼群岛',
@@ -18633,6 +18418,7 @@ $zh2CN = array(
 '心著作' => '心著作',
 '心著名' => '心著名',
 '心著錄' => '心著录',
+'心著称' => '心著称',
 '心著稱' => '心著称',
 '心著者' => '心著者',
 '心著述' => '心著述',
@@ -18644,14 +18430,6 @@ $zh2CN = array(
 '忍著稱' => '忍著称',
 '忍著者' => '忍著者',
 '忍著述' => '忍著述',
-'志著' => '志着',
-'志著書' => '志著书',
-'志著作' => '志著作',
-'志著名' => '志著名',
-'志著錄' => '志著录',
-'志著稱' => '志著称',
-'志著者' => '志著者',
-'志著述' => '志著述',
 '忙著' => '忙着',
 '忙著書' => '忙著书',
 '忙著作' => '忙著作',
@@ -18660,6 +18438,7 @@ $zh2CN = array(
 '忙著稱' => '忙著称',
 '忙著者' => '忙著者',
 '忙著述' => '忙著述',
+'忠貞著' => '忠贞着',
 '懷著' => '怀着',
 '懷著書' => '怀著书',
 '懷著作' => '怀著作',
@@ -18676,14 +18455,6 @@ $zh2CN = array(
 '急著稱' => '急著称',
 '急著者' => '急著者',
 '急著述' => '急著述',
-'性著' => '性着',
-'性著書' => '性著书',
-'性著作' => '性著作',
-'性著名' => '性著名',
-'性著錄' => '性著录',
-'性著稱' => '性著称',
-'性著者' => '性著者',
-'性著述' => '性著述',
 '匯流排' => '总线',
 '總帳' => '总账',
 '戀著' => '恋着',
@@ -18716,6 +18487,7 @@ $zh2CN = array(
 '想著作' => '想著作',
 '想著名' => '想著名',
 '想著錄' => '想著录',
+'想著称' => '想著称',
 '想著稱' => '想著称',
 '想著者' => '想著者',
 '想著述' => '想著述',
@@ -18988,6 +18760,7 @@ $zh2CN = array(
 '數碼電視' => '数字电视',
 '資料庫' => '数据库',
 '數著' => '数着',
+'數位照相機' => '数码照相机',
 '數位相機' => '数码相机',
 '數著作' => '数著作',
 '數著名' => '数著名',
@@ -19140,6 +18913,7 @@ $zh2CN = array(
 '柏林圍牆' => '柏林墙',
 '查帳' => '查账',
 '查維茲' => '查韦斯',
+'標志著' => '标志着',
 '標誌著' => '标志着',
 '格瑞那達' => '格林纳达',
 '格林美獎' => '格莱美奖',
@@ -19172,6 +18946,7 @@ $zh2CN = array(
 '毛里裘斯' => '毛里求斯',
 '公厘' => '毫米',
 '公釐' => '毫米',
+'氧份' => '氧分',
 '胺基酸' => '氨基酸',
 '水份' => '水分',
 '水氣' => '水汽',
@@ -19248,14 +19023,6 @@ $zh2CN = array(
 '潤著稱' => '润著称',
 '潤著者' => '润著者',
 '潤著述' => '润著述',
-'涵著' => '涵着',
-'涵著書' => '涵著书',
-'涵著作' => '涵著作',
-'涵著名' => '涵著名',
-'涵著錄' => '涵著录',
-'涵著稱' => '涵著称',
-'涵著者' => '涵著者',
-'涵著述' => '涵著述',
 '混帳' => '混账',
 '清澈' => '清澈',
 '清帳' => '清账',
@@ -19348,16 +19115,9 @@ $zh2CN = array(
 '千里達及托巴哥' => '特立尼达和多巴哥',
 '千里達托貝哥' => '特立尼达和托巴哥',
 '狗隻' => '犬只',
-'ç\8d¨è\91\97' => 'ç\8b¬着',
+'ç\8c¶è±«è\91\97' => 'ç\8a¹è±«着',
 '獨立國家國協' => '独立国家联合体',
 '獨立國協' => '独联体',
-'獨著書' => '独著书',
-'獨著作' => '独著作',
-'獨著名' => '独著名',
-'獨著錄' => '独著录',
-'獨著稱' => '独著称',
-'獨著者' => '独著者',
-'獨著述' => '独著述',
 '猜著' => '猜着',
 '猜著書' => '猜着书',
 '猜著作' => '猜著作',
@@ -19447,14 +19207,6 @@ $zh2CN = array(
 '盯著稱' => '盯著称',
 '盯著者' => '盯著者',
 '盯著述' => '盯著述',
-'盾著' => '盾着',
-'盾著書' => '盾著书',
-'盾著作' => '盾著作',
-'盾著名' => '盾著名',
-'盾著錄' => '盾著录',
-'盾著稱' => '盾著称',
-'盾著者' => '盾著者',
-'盾著述' => '盾著述',
 '看著' => '看着',
 '看著書' => '看着书',
 '看著作' => '看著作',
@@ -19597,6 +19349,7 @@ $zh2CN = array(
 '瞪著稱' => '瞪著称',
 '瞪著者' => '瞪著者',
 '瞪著述' => '瞪著述',
+'矛盾著' => '矛盾着',
 '智慧財產權' => '知识产权',
 '智財權' => '知识产权',
 '知識份子' => '知识分子',
@@ -19652,6 +19405,15 @@ $zh2CN = array(
 '穿著者' => '穿著者',
 '穿著述' => '穿著述',
 '突尼西亞' => '突尼斯',
+'立著' => '立着',
+'立著《' => '立著《',
+'立著作' => '立著作',
+'立著名' => '立著名',
+'立著有' => '立著有',
+'立著称' => '立著称',
+'立著稱' => '立著称',
+'立著者' => '立著者',
+'立著(' => '立著(',
 '豎著' => '竖着',
 '豎著書' => '竖著书',
 '豎著作' => '竖著作',
@@ -19752,6 +19514,7 @@ $zh2CN = array(
 '美著作' => '美著作',
 '美著名' => '美著名',
 '美著錄' => '美著录',
+'美著称' => '美著称',
 '美著稱' => '美著称',
 '美著者' => '美著者',
 '美著述' => '美著述',
@@ -19798,14 +19561,6 @@ $zh2CN = array(
 '舒麥加' => '舒马赫',
 '太空梭' => '航天飞机',
 '穿梭機' => '航天飞机',
-'藝著' => '艺着',
-'藝著書' => '艺著书',
-'藝著作' => '艺著作',
-'藝著名' => '艺著名',
-'藝著錄' => '艺著录',
-'藝著稱' => '艺著称',
-'藝著者' => '艺著者',
-'藝著述' => '艺著述',
 '愛滋' => '艾滋',
 '晶元' => '芯片',
 '晶片' => '芯片',
@@ -19858,6 +19613,7 @@ $zh2CN = array(
 '蒙著者' => '蒙著者',
 '蒙著述' => '蒙著述',
 '藍芽' => '蓝牙',
+'蘊涵著' => '蕴涵着',
 '薛丁格' => '薛定谔',
 '藏著' => '藏着',
 '藏著書' => '藏著书',
@@ -19888,6 +19644,7 @@ $zh2CN = array(
 '衣著作' => '衣著作',
 '衣著名' => '衣著名',
 '衣著錄' => '衣著录',
+'衣著称' => '衣著称',
 '衣著稱' => '衣著称',
 '衣著者' => '衣著者',
 '衣著述' => '衣著述',
@@ -19962,24 +19719,8 @@ $zh2CN = array(
 '數據機' => '调制解调器',
 '象徵著' => '象征着',
 '象徵著名' => '象征著名',
-'豫著' => '豫着',
-'豫著書' => '豫著书',
-'豫著作' => '豫著作',
-'豫著名' => '豫著名',
-'豫著錄' => '豫著录',
-'豫著稱' => '豫著称',
-'豫著者' => '豫著者',
-'豫著述' => '豫著述',
 '碧咸' => '贝克汉姆',
 '貝爾格勒' => '贝尔格莱德',
-'貞著' => '贞着',
-'貞著書' => '贞著书',
-'貞著作' => '贞著作',
-'貞著名' => '贞著名',
-'貞著錄' => '贞著录',
-'貞著稱' => '贞著称',
-'貞著者' => '贞著者',
-'貞著述' => '贞著述',
 '負著' => '负着',
 '貢寮' => '贡寮',
 '帳上' => '账上',
@@ -20151,14 +19892,6 @@ $zh2CN = array(
 '還帳' => '还账',
 '演化論' => '进化论',
 '進帳' => '进账',
-'遠著' => '远着',
-'遠著書' => '远著书',
-'遠著作' => '远著作',
-'遠著名' => '远著名',
-'遠著錄' => '远著录',
-'遠著稱' => '远著称',
-'遠著者' => '远著者',
-'遠著述' => '远著述',
 '連著' => '连着',
 '連結他' => '连结他',
 '連著書' => '连著书',
@@ -20200,6 +19933,7 @@ $zh2CN = array(
 '遇著作' => '遇著作',
 '遇著名' => '遇著名',
 '遇著錄' => '遇著录',
+'遇著称' => '遇著称',
 '遇著稱' => '遇著称',
 '遇著者' => '遇著者',
 '遇著述' => '遇著述',
@@ -20330,6 +20064,7 @@ $zh2CN = array(
 '雅著作' => '雅著作',
 '雅著名' => '雅著名',
 '雅著錄' => '雅著录',
+'雅著称' => '雅著称',
 '雅著稱' => '雅著称',
 '雅著者' => '雅著者',
 '雅著述' => '雅著述',
@@ -20436,17 +20171,10 @@ $zh2CN = array(
 '高著作' => '高著作',
 '高著名' => '高著名',
 '高著錄' => '高著录',
+'高著称' => '高著称',
 '高著稱' => '高著称',
 '高著者' => '高著者',
 '高著述' => '高著述',
-'髭著' => '髭着',
-'髭著書' => '髭著书',
-'髭著作' => '髭著作',
-'髭著名' => '髭著名',
-'髭著錄' => '髭著录',
-'髭著稱' => '髭著称',
-'髭著者' => '髭著者',
-'髭著述' => '髭著述',
 '魚雷' => '鱼雷',
 '鱼雷' => '鱼雷',
 '咪高峰' => '麦克风',
index 0c1a344..5491f81 100644 (file)
@@ -675,11 +675,11 @@ class InfoAction extends FormlessAction {
                $id = $title->getArticleID();
                $config = $this->context->getConfig();
 
-               $dbr = wfGetDB( DB_SLAVE );
+               $dbrWatchlist = wfGetDB( DB_SLAVE, 'watchlist' );
                $result = array();
 
                // Number of page watchers
-               $watchers = (int)$dbr->selectField(
+               $watchers = (int)$dbrWatchlist->selectField(
                        'watchlist',
                        'COUNT(*)',
                        array(
@@ -694,15 +694,15 @@ class InfoAction extends FormlessAction {
                        // Threshold: last visited about 26 weeks before latest edit
                        $updated = wfTimestamp( TS_UNIX, $this->page->getTimestamp() );
                        $age = $config->get( 'WatchersMaxAge' );
-                       $threshold = $dbr->timestamp( $updated - $age );
+                       $threshold = $dbrWatchlist->timestamp( $updated - $age );
                        // Number of page watchers who also visited a "recent" edit
-                       $visitingWatchers = (int)$dbr->selectField(
+                       $visitingWatchers = (int)$dbrWatchlist->selectField(
                                'watchlist',
                                'COUNT(*)',
                                array(
                                        'wl_namespace' => $title->getNamespace(),
                                        'wl_title' => $title->getDBkey(),
-                                       'wl_notificationtimestamp >= ' . $dbr->addQuotes( $threshold ) .
+                                       'wl_notificationtimestamp >= ' . $dbrWatchlist->addQuotes( $threshold ) .
                                        ' OR wl_notificationtimestamp IS NULL'
                                ),
                                __METHOD__
@@ -710,6 +710,7 @@ class InfoAction extends FormlessAction {
                        $result['visitingWatchers'] = $visitingWatchers;
                }
 
+               $dbr = wfGetDB( DB_SLAVE );
                // Total number of edits
                $edits = (int)$dbr->selectField(
                        'revision',
index 853b138..0ddb3c3 100644 (file)
@@ -169,6 +169,11 @@ class ApiFeedWatchlist extends ApiBase {
         * @return FeedItem
         */
        private function createFeedItem( $info ) {
+               if ( !isset( $info['title'] ) ) {
+                       // Probably a revdeled log entry, skip it.
+                       return null;
+               }
+
                $titleStr = $info['title'];
                $title = Title::newFromText( $titleStr );
                $curidParam = array();
@@ -205,9 +210,14 @@ class ApiFeedWatchlist extends ApiBase {
                }
 
                $timestamp = $info['timestamp'];
-               $user = $info['user'];
 
-               $completeText = "$comment ($user)";
+               if ( isset( $info['user'] ) ) {
+                       $user = $info['user'];
+                       $completeText = "$comment ($user)";
+               } else {
+                       $user = '';
+                       $completeText = (string)$comment;
+               }
 
                return new FeedItem( $titleStr, $completeText, $titleUrl, $timestamp, $user );
        }
index fec750f..f2059d7 100644 (file)
@@ -404,8 +404,6 @@ class ApiMain extends ApiBase {
                } else {
                        $this->executeActionWithErrorHandling();
                }
-               $this->getContext()->getStats()->increment(
-                       'api.modules.' . strtr( $this->getModule()->getModulePath(), '+', '.' ) );
        }
 
        /**
index 6717c39..db826a6 100644 (file)
@@ -132,6 +132,21 @@ class ApiMessage extends Message implements IApiMessage {
        public function setApiData( array $data ) {
                $this->apiData = $data;
        }
+
+       public function serialize() {
+               return serialize( array(
+                       'parent' => parent::serialize(),
+                       'apiCode' => $this->apiCode,
+                       'apiData' => $this->apiData,
+               ) );
+       }
+
+       public function unserialize( $serialized ) {
+               $data = unserialize( $serialized );
+               parent::unserialize( $data['parent'] );
+               $this->apiCode = $data['apiCode'];
+               $this->apiData = $data['apiData'];
+       }
 }
 
 /**
@@ -188,4 +203,19 @@ class ApiRawMessage extends RawMessage implements IApiMessage {
        public function setApiData( array $data ) {
                $this->apiData = $data;
        }
+
+       public function serialize() {
+               return serialize( array(
+                       'parent' => parent::serialize(),
+                       'apiCode' => $this->apiCode,
+                       'apiData' => $this->apiData,
+               ) );
+       }
+
+       public function unserialize( $serialized ) {
+               $data = unserialize( $serialized );
+               parent::unserialize( $data['parent'] );
+               $this->apiCode = $data['apiCode'];
+               $this->apiData = $data['apiData'];
+       }
 }
index cc884ec..152711f 100644 (file)
@@ -136,7 +136,11 @@ class ApiQueryAllMessages extends ApiQueryBase {
                        }
 
                        if ( !$skip ) {
-                               $a = array( 'name' => $message );
+                               $a = array(
+                                       'name' => $message,
+                                       'normalizedname' => MessageCache::normalizeKey( $message ),
+                               );
+
                                $args = array();
                                if ( isset( $params['args'] ) && count( $params['args'] ) != 0 ) {
                                        $args = $params['args'];
index 05daa7a..b52b1c6 100644 (file)
@@ -41,7 +41,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
         * @return string
         */
        private function getCanonicalUserName( $name ) {
-               return str_replace( '_', ' ', $name );
+               return strtr( $name, '_', ' ' );
        }
 
        public function execute() {
index bcd3c32..ba36c67 100644 (file)
@@ -592,7 +592,10 @@ class ApiQueryImageInfo extends ApiQueryBase {
                $retval = array();
                if ( is_array( $metadata ) ) {
                        foreach ( $metadata as $key => $value ) {
-                               $r = array( 'name' => $key );
+                               $r = array(
+                                       'name' => $key,
+                                       ApiResult::META_BC_BOOLS => array( 'value' ),
+                               );
                                if ( is_array( $value ) ) {
                                        $r['value'] = self::processMetaData( $value, $result );
                                } else {
index 3eb57fd..648d259 100644 (file)
@@ -451,6 +451,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        'prop' => array(
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_DFLT => 'ids|title|flags',
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                                ApiBase::PARAM_TYPE => array(
                                        'ids',
                                        'title',
index 1f469b8..a66b356 100644 (file)
@@ -112,6 +112,7 @@ class ApiStashEdit extends ApiBase {
                if ( $user->pingLimiter( 'stashedit' ) ) {
                        $status = 'ratelimited';
                } elseif ( $wgMemc->lock( $key, 0, 30 ) ) {
+                       /** @noinspection PhpUnusedLocalVariableInspection */
                        $unlocker = new ScopedCallback( function() use ( $key ) {
                                global $wgMemc;
                                $wgMemc->unlock( $key );
@@ -276,36 +277,55 @@ class ApiStashEdit extends ApiBase {
                }
 
                $dbr = wfGetDB( DB_SLAVE );
-               // Check that no templates used in the output changed...
-               $cWhr = array(); // conditions to find changes/creations
-               $dWhr = array(); // conditions to find deletions
+
+               $templates = array(); // conditions to find changes/creations
+               $templateUses = 0; // expected existing templates
                foreach ( $editInfo->output->getTemplateIds() as $ns => $stuff ) {
                        foreach ( $stuff as $dbkey => $revId ) {
-                               $cWhr[] = array( 'page_namespace' => $ns, 'page_title' => $dbkey,
-                                       'page_latest != ' . intval( $revId ) );
-                               $dWhr[] = array( 'page_namespace' => $ns, 'page_title' => $dbkey );
+                               $templates[(string)$ns][$dbkey] = (int)$revId;
+                               ++$templateUses;
                        }
                }
-               $change = $dbr->selectField( 'page', '1', $dbr->makeList( $cWhr, LIST_OR ), __METHOD__ );
-               $n = $dbr->selectField( 'page', 'COUNT(*)', $dbr->makeList( $dWhr, LIST_OR ), __METHOD__ );
-               if ( $change || $n != count( $dWhr ) ) {
-                       wfDebugLog( 'StashEdit', "Stale cache for key '$key'; template changed." );
-                       return false;
+               // Check that no templates used in the output changed...
+               if ( count( $templates ) ) {
+                       $res = $dbr->select(
+                               'page',
+                               array( 'ns' => 'page_namespace', 'dbk' => 'page_title', 'page_latest' ),
+                               $dbr->makeWhereFrom2d( $templates, 'page_namespace', 'page_title' ),
+                               __METHOD__
+                       );
+                       $changed = false;
+                       foreach ( $res as $row ) {
+                               $changed = $changed || ( $row->page_latest != $templates[$row->ns][$row->dbk] );
+                       }
+
+                       if ( $changed || $res->numRows() != $templateUses ) {
+                               wfDebugLog( 'StashEdit', "Stale cache for key '$key'; template changed." );
+                               return false;
+                       }
                }
 
-               // Check that no files used in the output changed...
-               $cWhr = array(); // conditions to find changes/creations
-               $dWhr = array(); // conditions to find deletions
+               $files = array(); // conditions to find changes/creations
                foreach ( $editInfo->output->getFileSearchOptions() as $name => $options ) {
-                       $cWhr[] = array( 'img_name' => $dbkey,
-                               'img_sha1 != ' . $dbr->addQuotes( strval( $options['sha1'] ) ) );
-                       $dWhr[] = array( 'img_name' => $dbkey );
+                       $files[$name] = (string)$options['sha1'];
                }
-               $change = $dbr->selectField( 'image', '1', $dbr->makeList( $cWhr, LIST_OR ), __METHOD__ );
-               $n = $dbr->selectField( 'image', 'COUNT(*)', $dbr->makeList( $dWhr, LIST_OR ), __METHOD__ );
-               if ( $change || $n != count( $dWhr ) ) {
-                       wfDebugLog( 'StashEdit', "Stale cache for key '$key'; file changed." );
-                       return false;
+               // Check that no files used in the output changed...
+               if ( count( $files ) ) {
+                       $res = $dbr->select(
+                               'image',
+                               array( 'name' => 'img_name', 'img_sha1' ),
+                               array( 'img_name' => array_keys( $files ) ),
+                               __METHOD__
+                       );
+                       $changed = false;
+                       foreach ( $res as $row ) {
+                               $changed = $changed || ( $row->img_sha1 != $files[$row->name] );
+                       }
+
+                       if ( $changed || $res->numRows() != count( $files ) ) {
+                               wfDebugLog( 'StashEdit', "Stale cache for key '$key'; file changed." );
+                               return false;
+                       }
                }
 
                wfDebugLog( 'StashEdit', "Cache hit for key '$key'." );
index 54294c9..398337b 100644 (file)
@@ -527,17 +527,28 @@ class ApiUpload extends ApiBase {
                                $this->dieUsage( $msg, 'filetype-banned', 0, $extradata );
                                break;
                        case UploadBase::VERIFICATION_ERROR:
+                               $params = $verification['details'];
+                               $key = array_shift( $params );
+                               $msg = $this->msg( $key, $params )->inLanguage( 'en' )->useDatabase( false )->text();
                                ApiResult::setIndexedTagName( $verification['details'], 'detail' );
-                               $this->dieUsage( 'This file did not pass file verification', 'verification-error',
+                               $this->dieUsage( "This file did not pass file verification: $msg", 'verification-error',
                                        0, array( 'details' => $verification['details'] ) );
                                break;
                        case UploadBase::HOOK_ABORTED:
-                               $this->dieUsage( "The modification you tried to make was aborted by an extension hook",
-                                       'hookaborted', 0, array( 'error' => $verification['error'] ) );
+                               if ( is_array( $verification['error'] ) ) {
+                                       $params = $verification['error'];
+                               } elseif ( $verification['error'] !== '' ) {
+                                       $params = array( $verification['error'] );
+                               } else {
+                                       $params = array( 'hookaborted' );
+                               }
+                               $key = array_shift( $params );
+                               $msg = $this->msg( $key, $params )->inLanguage( 'en' )->useDatabase( false )->text();
+                               $this->dieUsage( $msg, 'hookaborted', 0, array( 'details' => $verification['error'] ) );
                                break;
                        default:
                                $this->dieUsage( 'An unknown error occurred', 'unknown-error',
-                                       0, array( 'code' => $verification['status'] ) );
+                                       0, array( 'details' => array( 'code' => $verification['status'] ) ) );
                                break;
                }
        }
index 420e6ac..841bb2a 100644 (file)
@@ -1,14 +1,15 @@
 {
        "@metadata": {
                "authors": [
-                       "Palapa"
+                       "Palapa",
+                       "Semso98"
                ]
        },
        "apihelp-main-param-action": "Koju akciju izvesti.",
        "apihelp-main-param-format": "Format izlaza.",
        "apihelp-block-description": "Blokiraj korisnika",
        "apihelp-block-param-reason": "Razlog za blokadu",
-       "apihelp-block-example-ip-simple": "Blokiraj IP 192.0.2.5 na tri dana sa razlogom \"Prvi napad\"",
+       "apihelp-block-example-ip-simple": "Blokiraj IP adresu <kbd>192.0.2.5</kbd> na tri dana sa razlogom <kbd>Prvi napad</kbd>.",
        "apihelp-compare-param-fromtitle": "Prvi naslov za poređenje.",
        "apihelp-delete-description": "Obriši stranicu.",
        "apihelp-edit-param-text": "Sadržaj stranice.",
index 7aa1730..febe5cc 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Toniher",
                        "Macofe",
-                       "Xavier Dengra"
+                       "Xavier Dengra",
+                       "F3RaN"
                ]
        },
        "apihelp-main-param-format": "El format de la sortida.",
        "apihelp-feedrecentchanges-example-simple": "Mostra els canvis recents.",
        "apihelp-help-example-recursive": "Tota l'ajuda en una sola pàgina.",
        "apihelp-import-param-rootpage": "Importa com a subpàgina d'aquesta pàgina.",
-       "apihelp-login-example-login": "Inicia sessió."
+       "apihelp-login-param-name": "Nom d'usuari.",
+       "apihelp-login-param-password": "Contrasenya.",
+       "apihelp-login-example-login": "Inicia sessió.",
+       "apihelp-protect-param-cascade": "Activa la protecció en cascada (és a dir, protegeix les plantilles i imatges utilitzades en aquesta pàgina). S'ignora si cap dels nivells de protecció suporta la protecció en cascada.",
+       "apihelp-query+pageswithprop-example-generator": "Obtenir informació addicional sobre les 10 primeres pàgines utilitzant <code>__NOTOC__</code>.",
+       "apihelp-query+watchlist-paramvalue-prop-title": "Afegeix el títol de la pàgina.",
+       "apihelp-query+watchlist-paramvalue-prop-user": "Afegeix l'usuari que ha fet l'edició.",
+       "apihelp-query+watchlist-paramvalue-prop-userid": "Afegeix l'identificador d'usuari que ha fet l'edició.",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "Afegeix comentari de l'edició.",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "Afegeix timestamp de l'edició.",
+       "apihelp-query+watchlist-paramvalue-prop-patrol": "Etiqueta les modificacions que són vigilades.",
+       "apihelp-query+watchlist-paramvalue-prop-loginfo": "Afegeix informació de registre, si s'escau."
 }
diff --git a/includes/api/i18n/ckb.json b/includes/api/i18n/ckb.json
new file mode 100644 (file)
index 0000000..025741c
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Pirehelokan"
+               ]
+       },
+       "apihelp-parse-param-disabletoc": "پێرستی ناوەرۆک پیشان مەدە."
+}
index 5e86bcf..e3cc09b 100644 (file)
        "apihelp-expandtemplates-param-title": "Titel der Seite.",
        "apihelp-expandtemplates-param-text": "Zu konvertierender Wikitext.",
        "apihelp-expandtemplates-param-revid": "Versionsnummer, die für die Anzeige von <nowiki>{{REVISIONID}}</nowiki> und ähnlichen Variablen verwendet wird.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "Der expandierte Wikitext.",
+       "apihelp-expandtemplates-paramvalue-prop-parsetree": "Der XML-Parserbaum der Eingabe.",
        "apihelp-expandtemplates-param-includecomments": "Ob HTML-Kommentare in der Ausgabe eingeschlossen werden sollen.",
        "apihelp-expandtemplates-param-generatexml": "XML-Parserbaum erzeugen (ersetzt durch $1prop=parsetree).",
        "apihelp-expandtemplates-example-simple": "Den Wikitext <kbd><nowiki>{{Project:Spielwiese}}</nowiki></kbd> expandieren.",
        "apihelp-parse-paramvalue-prop-templates": "Gibt die Vorlagen im geparsten Wikitext zurück.",
        "apihelp-parse-paramvalue-prop-images": "Gibt die Bilder im geparsten Wikitext zurück.",
        "apihelp-parse-paramvalue-prop-externallinks": "Gibt die externen Links im geparsten Wikitext zurück.",
+       "apihelp-parse-paramvalue-prop-revid": "Ergänzt die Versionskennung der geparsten Seite.",
+       "apihelp-parse-paramvalue-prop-displaytitle": "Ergänzt den Titel des geparsten Wikitextes.",
        "apihelp-parse-param-section": "Gibt nur den Inhalt dieses Abschnittes zurück oder erstellt einen neuen Abschnitt, wenn <kbd>new</kbd> angegeben wird.\n\n<kbd>new</kbd> wird nur ausgewertet, wenn auch <var>text</var> angegeben wurde.",
        "apihelp-parse-param-sectiontitle": "Überschrift des neuen Abschnittes, wenn <var>section</var> = <kbd>new</kbd> ist.\n\nAnders als beim Bearbeiten der Seite wird der Parameter nicht durch die <var>summary</var> ersetzt, wenn er weggelassen oder leer ist.",
-       "apihelp-parse-param-disableeditsection": "Deaktiviert Abschnittsbearbeitungslinks in der Parserausgabe.",
+       "apihelp-parse-param-disableeditsection": "Lässt Abschnittsbearbeitungslinks in der Parserausgabe weg.",
        "apihelp-parse-param-preview": "Im Vorschaumodus parsen.",
-       "apihelp-parse-param-disabletoc": "Inhaltsverzeichnis in der Ausgabe deaktivieren.",
+       "apihelp-parse-param-disabletoc": "Inhaltsverzeichnis in der Ausgabe weglassen.",
        "apihelp-parse-example-page": "Eine Seite parsen.",
        "apihelp-parse-example-text": "Wikitext parsen.",
        "apihelp-parse-example-texttitle": "Parst den Wikitext über die Eingabe des Seitentitels.",
        "apihelp-protect-param-protections": "Liste der Schutzebenen nach dem Format <kbd>Aktion=Ebene</kbd> (z.B. <kbd>edit=sysop</kbd>).\n\n<strong>HINWEIS:</strong> Wenn eine Aktion nicht angegeben wird, wird deren Schutz entfernt.",
        "apihelp-protect-param-expiry": "Zeitstempel des Schutzablaufs. Wenn nur ein Zeitstempel übergeben wird, ist dieser für alle Seitenschutze gültig. Um eine unendliche Schutzdauer festzulegen, kannst du die Werte <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd> oder <kbd>never</kbd> übergeben.",
        "apihelp-protect-param-reason": "Grund für den Seitenschutz oder dessen Aufhebung.",
-       "apihelp-protect-param-cascade": "Aktiviert den Kaskadenschutz (alle eingebundenen Seiten werden ebenfalls geschützt). Wenn die übergebenen Schutzebenen keinen Kaskadenschutz unterstützen, wird dieser Parameter ignoriert.",
+       "apihelp-protect-param-cascade": "Aktiviert den Kaskadenschutz (z.&nbsp;B. werden eingebundene Vorlagen und Bilder in dieser Seite geschützt). Wird ignoriert, falls keine der angegebenen Schutzebenen Kaskaden unterstützt.",
        "apihelp-protect-param-watch": "Wenn vorhanden, fügt dieser Parameter die zu (ent-)sperrende Seite der Beobachtungsliste des aktuellen Benutzers hinzu.",
        "apihelp-protect-param-watchlist": "Die Seite bedingungslos zur Beobachtungsliste des aktuellen Benutzers hinzufügen oder von ihr entfernen, Einstellungen verwenden oder Beobachtung nicht ändern.",
        "apihelp-protect-example-protect": "Schützt eine Seite",
index 28eddf4..6c7ce81 100644 (file)
        "apihelp-parse-param-effectivelanglinks": "Includes language links supplied by extensions (for use with <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-section": "Only retrieve the content of this section number or when <kbd>new</kbd> generate a new section.\n\n<kbd>new</kbd> section is only honored when specifying <var>text</var>.",
        "apihelp-parse-param-sectiontitle": "New section title when <var>section</var> is <kbd>new</kbd>.\n\nUnlike page editing, this does not fall back to <var>summary</var> when omitted or empty.",
-       "apihelp-parse-param-disablepp": "Disable the PP Report from the parser output.",
-       "apihelp-parse-param-disableeditsection": "Disable edit section links from the parser output.",
+       "apihelp-parse-param-disablepp": "Omit the preprocessor report (\"NewPP limit report\") from the parser output.",
+       "apihelp-parse-param-disableeditsection": "Omit edit section links from the parser output.",
        "apihelp-parse-param-generatexml": "Generate XML parse tree (requires content model <code>$1</code>; replaced by <kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "Parse in preview mode.",
        "apihelp-parse-param-sectionpreview": "Parse in section preview mode (enables preview mode too).",
-       "apihelp-parse-param-disabletoc": "Disable table of contents in output.",
+       "apihelp-parse-param-disabletoc": "Omit table of contents in output.",
        "apihelp-parse-param-contentformat": "Content serialization format used for the input text. Only valid when used with $1text.",
        "apihelp-parse-param-contentmodel": "Content model of the input text. If omitted, $1title must be specified, and default will be the model of the specified title. Only valid when used with $1text.",
        "apihelp-parse-example-page": "Parse a page.",
        "apihelp-protect-param-protections": "List of protection levels, formatted <kbd>action=level</kbd> (e.g. <kbd>edit=sysop</kbd>).\n\n<strong>Note:</strong> Any actions not listed will have restrictions removed.",
        "apihelp-protect-param-expiry": "Expiry timestamps. If only one timestamp is set, it'll be used for all protections. Use <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, or <kbd>never</kbd>, for a never-expiring protection.",
        "apihelp-protect-param-reason": "Reason for (un)protecting.",
-       "apihelp-protect-param-cascade": "Enable cascading protection (i.e. protect pages included in this page). Ignored if all protection levels given do not support cascading.",
+       "apihelp-protect-param-cascade": "Enable cascading protection (i.e. protect transcluded templates and images used in this page). Ignored if none of the given protection levels support cascading.",
        "apihelp-protect-param-watch": "If set, add the page being (un)protected to the current user's watchlist.",
        "apihelp-protect-param-watchlist": "Unconditionally add or remove the page from the current user's watchlist, use preferences or do not change watch.",
        "apihelp-protect-example-protect": "Protect a page.",
        "apihelp-query+pageswithprop-param-limit": "The maximum number of pages to return.",
        "apihelp-query+pageswithprop-param-dir": "In which direction to sort.",
        "apihelp-query+pageswithprop-example-simple": "List the first 10 pages using <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
-       "apihelp-query+pageswithprop-example-generator": "Get page info about first 10 pages using <code>_&#95;NOTOC_&#95;</code>.",
+       "apihelp-query+pageswithprop-example-generator": "Get additional information about the first 10 pages using <code>_&#95;NOTOC_&#95;</code>.",
 
        "apihelp-query+prefixsearch-description": "Perform a prefix search for page titles.",
        "apihelp-query+prefixsearch-param-search": "Search string.",
        "apihelp-query+usercontribs-example-ipprefix": "Show contributions from all IP addresses with prefix <kbd>192.0.2.</kbd>.",
 
        "apihelp-query+userinfo-description": "Get information about the current user.",
-       "apihelp-query+userinfo-param-prop": "Which pieces of information to include:\n;blockinfo:Tags if the current user is blocked, by whom, and for what reason.\n;hasmsg:Adds a tag <samp>message</samp> if the current user has pending messages.\n;groups:Lists all the groups the current user belongs to.\n;implicitgroups:Lists all the groups the current user is automatically a member of.\n;rights:Lists all the rights the current user has.\n;changeablegroups:Lists the groups the current user can add to and remove from.\n;options:Lists all preferences the current user has set.\n;preferencestoken:<span class=\"apihelp-deprecated\">Deprecated.</span> Get a token to change current user's preferences.\n;editcount:Adds the current user's edit count.\n;ratelimits:Lists all rate limits applying to the current user.\n;realname:Adds the user's real name.\n;email:Adds the user's email address and email authentication date.\n;acceptlang:Echoes the <code>Accept-Language</code> header sent by the client in a structured format.\n;registrationdate:Adds the user's registration date.\n;unreadcount:Adds the count of unread pages on the user's watchlist (maximum $1; returns <samp>$2</samp> if more).",
+       "apihelp-query+userinfo-param-prop": "Which pieces of information to include:\n;blockinfo:Tags if the current user is blocked, by whom, and for what reason.\n;hasmsg:Adds a tag <samp>messages</samp> if the current user has pending messages.\n;groups:Lists all the groups the current user belongs to.\n;implicitgroups:Lists all the groups the current user is automatically a member of.\n;rights:Lists all the rights the current user has.\n;changeablegroups:Lists the groups the current user can add to and remove from.\n;options:Lists all preferences the current user has set.\n;preferencestoken:<span class=\"apihelp-deprecated\">Deprecated.</span> Get a token to change current user's preferences.\n;editcount:Adds the current user's edit count.\n;ratelimits:Lists all rate limits applying to the current user.\n;realname:Adds the user's real name.\n;email:Adds the user's email address and email authentication date.\n;acceptlang:Echoes the <code>Accept-Language</code> header sent by the client in a structured format.\n;registrationdate:Adds the user's registration date.\n;unreadcount:Adds the count of unread pages on the user's watchlist (maximum $1; returns <samp>$2</samp> if more).",
        "apihelp-query+userinfo-example-simple": "Get information about the current user.",
        "apihelp-query+userinfo-example-data": "Get additional information about the current user.",
 
        "apihelp-query+watchlist-param-user": "Only list changes by this user.",
        "apihelp-query+watchlist-param-excludeuser": "Don't list changes by this user.",
        "apihelp-query+watchlist-param-limit": "How many total results to return per request.",
-       "apihelp-query+watchlist-param-prop": "Which additional items to get:\n;ids:Adds revision IDs and page IDs.\n;title:Adds title of the page.\n;flags:Adds flags for the edit.\n;user:Adds the user who made the edit.\n;userid:Adds user ID of whom made the edit.\n;comment:Adds comment of the edit.\n;parsedcomment:Adds parsed comment of the edit.\n;timestamp:Adds timestamp of the edit.\n;patrol:Tags edits that are patrolled.\n;sizes:Adds the old and new lengths of the page.\n;notificationtimestamp:Adds timestamp of when the user was last notified about the edit.\n;loginfo:Adds log information where appropriate.",
+       "apihelp-query+watchlist-param-prop": "Which additional properties to get:",
+       "apihelp-query+watchlist-paramvalue-prop-ids": "Adds revision IDs and page IDs.",
+       "apihelp-query+watchlist-paramvalue-prop-title": "Adds title of the page.",
+       "apihelp-query+watchlist-paramvalue-prop-flags": "Adds flags for the edit.",
+       "apihelp-query+watchlist-paramvalue-prop-user": "Adds the user who made the edit.",
+       "apihelp-query+watchlist-paramvalue-prop-userid": "Adds user ID of whoever made the edit.",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "Adds comment of the edit.",
+       "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "Adds parsed comment of the edit.",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "Adds timestamp of the edit.",
+       "apihelp-query+watchlist-paramvalue-prop-patrol": "Tags edits that are patrolled.",
+       "apihelp-query+watchlist-paramvalue-prop-sizes": "Adds the old and new lengths of the page.",
+       "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Adds timestamp of when the user was last notified about the edit.",
+       "apihelp-query+watchlist-paramvalue-prop-loginfo": "Adds log information where appropriate.",
+
        "apihelp-query+watchlist-param-show": "Show only items that meet these criteria. For example, to see only minor edits done by logged-in users, set $1show=minor|!anon.",
        "apihelp-query+watchlist-param-type": "Which types of changes to show:\n;edit:Regular page edits.\n;external:External changes.\n;new:Page creations.\n;log:Log entries.",
        "apihelp-query+watchlist-param-owner": "Used along with $1token to access a different user's watchlist.",
index ab99948..885bc77 100644 (file)
@@ -11,7 +11,8 @@
                        "Ryo567",
                        "Csbotero",
                        "Chris TR",
-                       "Ncontinanza"
+                       "Ncontinanza",
+                       "Poco a poco"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|Preguntas frecuentes]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de correos]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API de anuncios]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Errores y peticiones]\n</div>\n<strong>Estado:</strong> Todas las características que se muestran en esta página debería funcionar, pero la API aún está en desarrollo activo y puede cambiar en cualquier momento. Suscríbete a [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la lista de correo de mediawiki-api-announce] para estar al día de las actualizaciones.\n\n<strong>Solicitudes erróneas:</strong> Cuando se envían solicitudes erróneas a la API, se envía un encabezado HTTP con la clave \"MediaWiki-API-Error\" y ambos valores, del encabezado y el código de error, se establecerán en el mismo valor. Para más información, véase [[mw:API:Errors_and_warnings|API: Errores y advertencias]].",
@@ -23,7 +24,7 @@
        "apihelp-main-param-requestid": "Cualquier valor dado aquí se incluirá en la respuesta. Se puede utilizar para distinguir solicitudes.",
        "apihelp-main-param-servedby": "Incluir el nombre del host que ha servido la solicitud en los resultados.",
        "apihelp-main-param-curtimestamp": "Incluir la marca de tiempo actual en el resultado.",
-       "apihelp-block-description": "Bloquear usuario",
+       "apihelp-block-description": "Bloquear a un usuario.",
        "apihelp-block-param-user": "El nombre de usuario, dirección IP o intervalo de IP que quieres bloquear.",
        "apihelp-block-param-expiry": "Fecha de expiración. Puede ser relativa (por ejemplo, <kbd>5 meses</kbd> o <kbd>2 semanas</kbd>) o absoluta (por ejemplo, <kbd>2014-09-18T12:34:56Z</kbd>). Si se establece en <kbd>infinito</kbd>, <kbd>indefinido</kbd>, o <kbd>nunca</kbd>, el bloqueo será permanente.",
        "apihelp-block-param-reason": "Razón para el bloqueo.",
@@ -49,7 +50,7 @@
        "apihelp-compare-param-fromid": "ID de la primera página a comparar.",
        "apihelp-compare-param-fromrev": "Primera revisión para comparar.",
        "apihelp-compare-param-totitle": "Segundo título para comparar.",
-       "apihelp-compare-param-toid": "Segunda página de IDENTIFICACIÓN para comparar.",
+       "apihelp-compare-param-toid": "Segunda identificador de página para comparar.",
        "apihelp-compare-param-torev": "Segunda revisión para comparar.",
        "apihelp-compare-example-1": "Crear una diferencia entre las revisiones 1 y 2.",
        "apihelp-createaccount-description": "Crear una nueva cuenta de usuario.",
@@ -93,7 +94,7 @@
        "apihelp-edit-param-undo": "Deshacer esta revisión. Reemplaza $1text, $1prependtext y $1appendtext.",
        "apihelp-edit-param-undoafter": "Deshacer todas las revisiones desde $1undo a esta. Si no está establecido solo se deshace una revisión.",
        "apihelp-edit-param-redirect": "Resolver redirecciones automáticamente.",
-       "apihelp-edit-param-contentformat": "Formato de serialización de contenido, utilizado para introducir texto.",
+       "apihelp-edit-param-contentformat": "Formato de serialización de contenido utilizado para el texto de entrada.",
        "apihelp-edit-param-contentmodel": "Modelo de contenido del nuevo contenido.",
        "apihelp-edit-param-token": "La clave debe enviarse siempre como el último parámetro o, al menos, después del parámetro $1text.",
        "apihelp-edit-example-edit": "Editar una página",
        "apihelp-managetags-example-delete": "Eliminar la etiqueta <kbd>vandlaismo</kbd> con el motivo <kbd>mal deletreado</kbd>",
        "apihelp-managetags-example-activate": "Activar una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>Para utilizar en patrullaje de edición</kbd>",
        "apihelp-managetags-example-deactivate": "Desactivar una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>Para utilizar en patrullaje de edición</kbd>",
-       "apihelp-move-description": "Mover una página.",
+       "apihelp-move-description": "Trasladar una página.",
        "apihelp-move-param-from": "Título de la página a renombrar. No se puede utilizar con <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "ID de la página a renombrar. No se puede utilizar con <var>$1from</var>.",
        "apihelp-move-param-to": "Título para cambiar el nombre de la página.",
        "apihelp-parse-param-effectivelanglinks": "Incluye enlaces de idiomas proporcionados por las extensiones (para utilizar con <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-preview": "Analizar en modo de vista previa.",
        "apihelp-parse-param-sectionpreview": "Analizar sección en modo de vista previa (activa el modo de vista previa).",
-       "apihelp-parse-param-disabletoc": "Desactivar la tabla de contenidos en la salida.",
+       "apihelp-parse-param-disabletoc": "Omitir la tabla de contenidos en la salida.",
        "apihelp-parse-example-page": "Analizar una página.",
        "apihelp-parse-example-text": "Analizar wikitexto.",
        "apihelp-parse-example-texttitle": "Analizar wikitexto, especificando el título de la página.",
        "apihelp-protect-param-pageid": "ID de la página a (des)proteger. No se puede utilizar con $1title.",
        "apihelp-protect-param-protections": "Lista de los niveles de protección, con formato <kbd>action=level</kbd> (por ejemplo: <kbd>edit=sysop</kbd>).\n\n<strong>Nota:</strong> Cualquier acción no mencionada tendrá las restricciones eliminadas.",
        "apihelp-protect-param-reason": "Motivo de la (des)protección.",
-       "apihelp-protect-param-cascade": "Activar la protección en cascada (por ejemple, proteger páginas incluida esta). Se ignorará si todos los niveles de protección dados no son compatibles con la función de cascada.",
+       "apihelp-protect-param-cascade": "Activar la protección en cascada (o sea, proteger plantillas e imágenes transcluidas usadas en esta página). Se ignorará si ninguno de los niveles de protección dados son compatibles con la función de cascada.",
        "apihelp-protect-example-protect": "Proteger una página",
        "apihelp-protect-example-unprotect": "Desproteger una página estableciendo la restricción a <kbd>todos</kbd>.",
        "apihelp-protect-example-unprotect2": "Desproteger una página anulando las restricciones.",
        "apihelp-query+allcategories-example-size": "Lista las categorías con información sobre el número de páginas de cada una.",
        "apihelp-query+alldeletedrevisions-description": "Listar todas las revisiones eliminadas por un usuario o en un espacio de nombres.",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Solo puede usarse con <var>$3user</var>.",
-       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "No puede ser utilizado con <var>$3user</var>.",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "No puede utilizarse con <var>$3user</var>.",
        "apihelp-query+alldeletedrevisions-param-start": "El sello de tiempo para comenzar la enumeración",
        "apihelp-query+alldeletedrevisions-param-end": "El sello de tiempo para detener la enumeración",
        "apihelp-query+alldeletedrevisions-param-from": "Empezar a listar en este título.",
        "apihelp-query+alllinks-param-from": "El título del enlace para comenzar la enumeración.",
        "apihelp-query+alllinks-param-to": "El título del enlace para detener la enumeración.",
        "apihelp-query+alllinks-param-prefix": "Buscar todos los títulos vinculados que comiencen con este valor.",
-       "apihelp-query+alllinks-param-namespace": "El espacio de nombre a enumerar.",
+       "apihelp-query+alllinks-param-namespace": "El espacio de nombres que enumerar.",
        "apihelp-query+alllinks-param-limit": "Cuántos elementos en total se devolverán.",
        "apihelp-query+alllinks-example-unique-generator": "Obtiene todos los títulos enlazados, marcando los que falten.",
        "apihelp-query+allmessages-param-prop": "Qué propiedades se obtendrán.",
        "apihelp-query+allpages-param-from": "El título de página para comenzar la enumeración",
        "apihelp-query+allpages-param-to": "El título de página para detener la enumeración.",
        "apihelp-query+allpages-param-prefix": "Buscar todos los títulos de las páginas que comiencen con este valor.",
-       "apihelp-query+allpages-param-namespace": "El espacio de nombre a enumerar.",
+       "apihelp-query+allpages-param-namespace": "El espacio de nombres que enumerar.",
        "apihelp-query+allpages-param-filterredir": "Qué páginas listar.",
        "apihelp-query+allpages-param-minsize": "Limitar a páginas con al menos este número de bytes.",
        "apihelp-query+allpages-param-maxsize": "Limitar a páginas con este número máximo de bytes.",
        "apihelp-query+allredirects-param-prefix": "Buscar todas las páginas de destino que empiecen con este valor.",
        "apihelp-query+allredirects-param-limit": "Cuántos elementos se devolverán.",
        "apihelp-query+alltransclusions-param-prefix": "Buscar todos los títulos transcluídos que comiencen con este valor.",
+       "apihelp-query+alltransclusions-example-unique": "Listar títulos transcluidos de forma única.",
        "apihelp-query+alltransclusions-example-unique-generator": "Obtiene todos los títulos transcluídos, marcando los que faltan.",
        "apihelp-query+allusers-description": "Enumerar todos los usuarios registrados.",
        "apihelp-query+allusers-param-prefix": "Buscar todos los usuarios que empiecen con este valor.",
        "apihelp-query+deletedrevs-example-mode3-talk": "Listar las primeras 50 páginas en el espacio de nombres {{ns:talk}} (modo 3).",
        "apihelp-query+disabled-description": "Se ha desactivado el módulo de consulta.",
        "apihelp-query+duplicatefiles-example-simple": "Buscar duplicados de [[:File:Alber Einstein Head.jpg]].",
-       "apihelp-query+duplicatefiles-example-generated": "Buscar duplicados en todos los ficheros.",
+       "apihelp-query+duplicatefiles-example-generated": "Buscar duplicados en todos los archivos.",
        "apihelp-query+embeddedin-description": "Encuentra todas las páginas que transcluyen el título dado.",
        "apihelp-query+embeddedin-param-title": "Título a buscar. No puede usarse en conjunto con $1pageid.",
        "apihelp-query+embeddedin-param-filterredir": "Cómo filtrar las redirecciones.",
        "apihelp-query+linkshere-example-generator": "Obtener información acerca de las páginas enlazadas a la [[Main Page|Portada]].",
        "apihelp-query+pageswithprop-param-limit": "El máximo número de páginas que se devolverán.",
        "apihelp-query+pageswithprop-example-simple": "Listar las 10 primeras páginas que utilicen <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
-       "apihelp-query+pageswithprop-example-generator": "Obtener información acerca de las 10 primeras páginas que utilicen <code>_&#95;NOTOC_&#95;</code>.",
+       "apihelp-query+pageswithprop-example-generator": "Obtener información adicional acerca de las 10 primeras páginas que utilicen <code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+prefixsearch-param-search": "Buscar cadena.",
        "apihelp-query+prefixsearch-param-namespace": "Espacio de nombres que buscar.",
        "apihelp-query+prefixsearch-param-limit": "Número máximo de resultados que devolver.",
        "apihelp-query+watchlist-param-start": "El sello de tiempo para comenzar la enumeración",
        "apihelp-query+watchlist-param-end": "El sello de tiempo para finalizar la enumeración.",
        "apihelp-query+watchlist-param-excludeuser": "No listar cambios de este usuario.",
+       "apihelp-query+watchlist-param-prop": "Qué propiedades adicionales se obtendrán:",
+       "apihelp-query+watchlist-paramvalue-prop-ids": "Añade identificadores de revisiones y de páginas.",
+       "apihelp-query+watchlist-paramvalue-prop-title": "Añade el título de la página.",
+       "apihelp-query+watchlist-paramvalue-prop-flags": "Añade marcas para la edición.",
+       "apihelp-query+watchlist-paramvalue-prop-user": "Añade el usuario que hizo la edición.",
+       "apihelp-query+watchlist-paramvalue-prop-userid": "Añade el identificador de usuario de quien hizo la edición.",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "Añade el comentario de la edición.",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "Añade fecha y hora de la edición.",
+       "apihelp-query+watchlist-paramvalue-prop-patrol": "Etiqueta las ediciones que están patrulladas.",
+       "apihelp-query+watchlist-paramvalue-prop-sizes": "Añade la longitud vieja y la nueva de la página.",
+       "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Añade fecha y hora de cuando el usuario fue notificado por última vez acerca de la edición.",
+       "apihelp-query+watchlist-paramvalue-prop-loginfo": "Añade información del registro cuando corresponda.",
        "apihelp-query+watchlistraw-param-show": "Sólo listar los elementos que cumplen estos criterios.",
        "apihelp-query+watchlistraw-param-fromtitle": "Título (con el prefijo de espacio de nombres) desde el que se empezará a enumerar.",
        "apihelp-query+watchlistraw-param-totitle": "Título (con el prefijo de espacio de nombres) desde el que se dejará de enumerar.",
index b418f1d..2bb9890 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Subi"
+                       "Subi",
+                       "Sator"
                ]
        },
        "apihelp-block-description": "Blokeatu erabiltzaile bat.",
@@ -35,6 +36,7 @@
        "apihelp-query+allusers-param-activeusers": "Bakarrik zerrendatu azken {{PLURAL:$1|eguneko|$1 egunetako}} erabiltzaile aktiboak.",
        "apihelp-query+imageinfo-param-urlheight": "$1urlwidth-en antzekoa.",
        "apihelp-query+imageusage-example-simple": "Erakutsi [[:File:Albert Einstein Head.jpg]] darabilten orriak",
+       "apihelp-query+langlinks-param-inlanguagecode": "Hizkuntza izenak aurkitzeko hizkuntza kodea.",
        "apihelp-query+prefixsearch-param-search": "Bilatu katea.",
        "apihelp-query+protectedtitles-example-simple": "Zerrendatu babestutako izenburuak",
        "apihelp-query+recentchanges-example-simple": "Zerrendatu aldaketa berriak.",
index 3a201a5..8bbecfa 100644 (file)
@@ -15,7 +15,9 @@
                        "Crochet.david",
                        "0x010C",
                        "Lucky",
-                       "Freak2fast4u"
+                       "Freak2fast4u",
+                       "Urhixidur",
+                       "Wladek92"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> Toutes les fonctionnalités affichées sur cette page devraient fonctionner, mais l’API est encore en cours de développement et peut changer à tout moment. Inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un en-tête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet en-tête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:API:Errors_and_warnings|API: Errors and warnings]].",
        "apihelp-parse-param-effectivelanglinks": "Inclut les liens de langue fournis par les extensions (à utiliser avec <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-section": "Récupérer uniquement le contenu de ce numéro de section ou quand <kbd>nouveau</kbd> génère une nouvelle section.\n\nLa <kbd>nouvelle</kbd> section est mise à l’honneur uniquement quand <var>text</var> est spécifié.",
        "apihelp-parse-param-sectiontitle": "Nouveau titre de section quand <var>section</var> vaut <kbd>nouveau</kbd>.\n\nÀ la différence de la modification de page, cela ne revient pas à <var>summary</var> quand il est omis ou vide.",
-       "apihelp-parse-param-disablepp": "Désactiver le rapport PP de la sortie de l’analyseur.",
-       "apihelp-parse-param-disableeditsection": "Désactiver les liens de modification de section de la sortie de l’analyseur.",
+       "apihelp-parse-param-disablepp": "Omettre le rapport du préprocesseur (« rapport de limite du nouveau PP ») de la sortie de l’analyseur.",
+       "apihelp-parse-param-disableeditsection": "Omettre les liens de modification de section de la sortie de l’analyseur.",
        "apihelp-parse-param-generatexml": "Générer un arbre d’analyse XML (nécessite le modèle de contenu <code>$1</code> ; remplacé par <kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "Analyser en mode aperçu.",
        "apihelp-parse-param-sectionpreview": "Analyser en mode aperçu de section (active aussi le mode aperçu).",
-       "apihelp-parse-param-disabletoc": "Désactiver la table des matières dans la sortie.",
+       "apihelp-parse-param-disabletoc": "Omettre la table des matières dans la sortie.",
        "apihelp-parse-param-contentformat": "Format de sérialisation du contenu utilisé pour le texte d’entrée. Valide uniquement si utilisé avec $1text.",
        "apihelp-parse-param-contentmodel": "Modèle de contenu du texte d’entrée. Si omis, $1title doit être spécifié, et la valeur par défaut sera le modèle du titre spécifié. Valide uniquement quand utilisé avec $1text.",
        "apihelp-parse-example-page": "Analyser une page.",
        "apihelp-protect-param-protections": "Liste des niveaux de protection, au format <kbd>action=niveau</kbd> (par ex. <kbd>edit=sysop</kbd>).\n\n<strong>NOTE :<strong> Toutes les actions non listées auront leur restrictions supprimées.",
        "apihelp-protect-param-expiry": "Horodatages d’expiration. Si un seul horodatage est fourni, il sera utilisé pour toutes les protections. Utiliser <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd> ou <kbd>never</kbd> pour une protection sans expiration.",
        "apihelp-protect-param-reason": "Motif de (dé)protection.",
-       "apihelp-protect-param-cascade": "Activer la protection en cascade (c’est-à-dire protéger les pages incluses dans cette page). Ignoré si tous les niveaux de protection fournis ne supportent pas la mise en cascade.",
+       "apihelp-protect-param-cascade": "Activer la protection en cascade (c’est-à-dire protéger les modèles transclus et les images utilisées dans cette page). Ignoré si aucun des niveaux de protection fournis ne supporte la mise en cascade.",
        "apihelp-protect-param-watch": "Si activé, ajouter la page (dé)protégée à la liste de suivi de l'utilisateur actuel.",
        "apihelp-protect-param-watchlist": "Ajouter ou supprimer sans condition la page de la liste de suivi de l'utilisateur actuel, utiliser les préférences ou ne pas modifier le suivi.",
        "apihelp-protect-example-protect": "Protéger une page",
        "apihelp-query+pageswithprop-param-limit": "Le nombre maximal de pages à renvoyer.",
        "apihelp-query+pageswithprop-param-dir": "Dans quelle direction trier.",
        "apihelp-query+pageswithprop-example-simple": "Lister les 10 premières pages en utilisant <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
-       "apihelp-query+pageswithprop-example-generator": "Obtenir des informations sur les 10 premières pages utilisant <code>_&#95;NOTOC_&#95;</code>.",
+       "apihelp-query+pageswithprop-example-generator": "Obtenir des informations supplémentaires sur les 10 premières pages utilisant <code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+prefixsearch-description": "Effectuer une recherche de préfixe sur les titres de page.",
        "apihelp-query+prefixsearch-param-search": "Chaîne de recherche.",
        "apihelp-query+prefixsearch-param-namespace": "Espaces de nom à rechercher.",
        "apihelp-query+revisions-example-first5-after": "Obtenir les 5 premières révisions de la <kbd>Page principale</kbd> faites après le 01/05/2006.",
        "apihelp-query+revisions-example-first5-not-localhost": "Obtenir les 5 premières révisions de la <kbd>Page principale</kbd> qui n’ont pas été faites par l’utilisateur anonyme <kbd>127.0.0.1</kbd>.",
        "apihelp-query+revisions-example-first5-user": "Obtenir les 5 premières révisions de la <kbd>Page principale</kbd> qui ont été faites par l’utilisateur <kbd>MédiaWiki par défaut</kbd>.",
-       "apihelp-query+revisions+base-param-prop": "Quelles propriétés obtenir pour chaque révision :\n;ids:L’ID de la révision.\n;flags:Marques de la révision (mineure).\n;timestamp:L’horodatage de la révision.\n;user:Utilisateur ayant fait la révision.\n;userid:ID de l’utilisateur ayant créé la révision.\n;size:Taille (en octets) de la révision.\n;sha1:SHA-1 (base 16) de la révision.\n;contentmodel:ID du modèle de contenu de la révision.\n;comment:Commentaire par l’utilisateur de la révision.\n;parsedcomment:Commentaire analysé par l’utilisateur de la révision.\n;content:Texte de la révision.\n;tags:Balises de la révision.\n;parsetree:L’arbre d’analyse XML du contenu de la révision.",
+       "apihelp-query+revisions+base-param-prop": "Quelles propriétés obtenir pour chaque révision :",
+       "apihelp-query+revisions+base-paramvalue-prop-ids": "L’ID de la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-flags": "Marques de la révision (mineure).",
+       "apihelp-query+revisions+base-paramvalue-prop-timestamp": "L’horodatage de la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-user": "L’utilisateur qui a fait la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-userid": "L’ID de l’utilisateur créateur de la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-size": "Longueur (en octets) de la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-sha1": "Hachage SHA-1 (base 16) de la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "ID du modèle de contenu de la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-comment": "Commentaire de l’utilisateur sur la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "Commentaire analysé de l’utilisateur sur la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Texte de la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-tags": "Balises de la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "L’arbre d’analyse XML du contenu de la révision (nécessite le modèle de contenu <code>$1</code>).",
        "apihelp-query+revisions+base-param-limit": "Limiter le nombre de révisions retournées.",
        "apihelp-query+revisions+base-param-expandtemplates": "Développer les modèles dans le contenu de la révision (nécessite $1prop=content).",
        "apihelp-query+revisions+base-param-generatexml": "Générer l’arbre d’analyse XML pour le contenu de la révision (nécessite $1prop=content ; remplacé par <kbd>$1prop=parsetree</kbd>).",
        "apihelp-query+usercontribs-example-user": "Afficher les contributions de l'utilisateur <kbd>Exemple</kbd>.",
        "apihelp-query+usercontribs-example-ipprefix": "Afficher les contributions de toutes les adresses IP avec le préfixe <kbd>192.0.2.</kbd>.",
        "apihelp-query+userinfo-description": "Obtenir de l’information sur l’utilisateur courant.",
-       "apihelp-query+userinfo-param-prop": "Quelles informations inclure :\n;blockinfo:Marque si l’utilisateur actuel est bloqué, par qui, et pour quelle raison.\n;hasmsg:Ajoute une balise <samp>message</samp> si l’utilisateur actuel a des messages en cours.\n;groups:Liste tous les groupes auxquels appartient l’utilisateur actuel.\n;implicitgroups:Liste tous les groupes dont l’utilisateur actuel est automatiquement membre.\n;rights:Liste tous les droits qu’a l’utilisateur actuel.\n;changeablegroups:Liste les groupes pour lesquels l’utilisateur actuel peut ajouter ou supprimer.\n;options:Liste toutes les préférences qu’a défini l’utilisateur actuel.\n;preferencestoken:<span class=\"apihelp-deprecated\">Obsolete.</span> Obtient un jeton pour modifier les préférences de l’utilisateur actuel.\n;editcount:Ajoute le compteur de modifications de l’utilisateur actuel.\n;ratelimits:Liste toutes les limites de débit s’appliquant à l’utilisateur actuel.\n;realname:Ajoute le vrai nom de l’utilisateur actuel.\n;email:Ajoute l’adresse de courriel de l’utilisateur et sa date d’authentification.\n;acceptlang:Renvoie en écho l’entête <code>Accept-Language</code> envoyé par le client dans un format structuré.\n;registrationdate:Ajoute la date d’inscription de l’utilisateur.\n;unreadcount:Ajoute le compteur de pages non lues de la liste de suivi de l’utilisateur (au maximum $1 ; renvoie <samp>$2</samp> s’il y en a plus).",
+       "apihelp-query+userinfo-param-prop": "Quelles informations inclure :\n;blockinfo:Marque si l’utilisateur actuel est bloqué, par qui, et pour quelle raison.\n;hasmsg:Ajoute une balise <samp>messages</samp> si l’utilisateur actuel a des messages en cours.\n;groups:Liste tous les groupes auxquels appartient l’utilisateur actuel.\n;implicitgroups:Liste tous les groupes dont l’utilisateur actuel est automatiquement membre.\n;rights:Liste tous les droits qu’a l’utilisateur actuel.\n;changeablegroups:Liste les groupes pour lesquels l’utilisateur actuel peut ajouter ou supprimer.\n;options:Liste toutes les préférences qu’a défini l’utilisateur actuel.\n;preferencestoken:<span class=\"apihelp-deprecated\">Obsolete.</span> Obtient un jeton pour modifier les préférences de l’utilisateur actuel.\n;editcount:Ajoute le compteur de modifications de l’utilisateur actuel.\n;ratelimits:Liste toutes les limites de débit s’appliquant à l’utilisateur actuel.\n;realname:Ajoute le vrai nom de l’utilisateur actuel.\n;email:Ajoute l’adresse de courriel de l’utilisateur et sa date d’authentification.\n;acceptlang:Renvoie en écho l’entête <code>Accept-Language</code> envoyé par le client dans un format structuré.\n;registrationdate:Ajoute la date d’inscription de l’utilisateur.\n;unreadcount:Ajoute le compteur de pages non lues de la liste de suivi de l’utilisateur (au maximum $1 ; renvoie <samp>$2</samp> s’il y en a plus).",
        "apihelp-query+userinfo-example-simple": "Obtenir de l’information sur l’utilisateur actuel",
        "apihelp-query+userinfo-example-data": "Obtenir des informations supplémentaires sur l’utilisateur actuel",
        "apihelp-query+users-description": "Obtenir des information sur une liste d’utilisateurs",
        "apihelp-query+watchlist-param-user": "Lister uniquement les modifications par cet utilisateur.",
        "apihelp-query+watchlist-param-excludeuser": "Ne pas lister les modifications faites par cet utilisateur.",
        "apihelp-query+watchlist-param-limit": "Combien de résultats au total renvoyer par demande.",
-       "apihelp-query+watchlist-param-prop": "Quels éléments supplémentaires obtenir :\n;ids:Ajoute les IDs de révision et de page.\n;title:Ajoute le titre de la page.\n;flags:Ajoute les marques de la modification.\n;user:Ajoute l’utilisateur ayant fait la modification.\n;userid:Ajoute l’ID de l’utilisateur ayant fait la modification.\n;comment:Ajoute le commentaire de la modification.\n;parsedcomment:Ajoute le commentaire analysé de la modification.\n;timestamp:Ajoute l’horodatage de la modification.\n;patrol:Marque les modifications patrouillées.\n;sizes:Ajoute les ancienne et nouvelle tailles de la page.\n;notificationtimestamp:Ajoute l’horodatage de quand l’utilisateur a été notifié de la modification la dernière fois.\n;loginfo:Ajoute l’information du journal quand c’est approprié.",
+       "apihelp-query+watchlist-param-prop": "Quelles propriétés supplémentaires obtenir :",
+       "apihelp-query+watchlist-paramvalue-prop-ids": "Ajoute les IDs de révision et de page",
+       "apihelp-query+watchlist-paramvalue-prop-title": "Ajoute le titre de la page.",
+       "apihelp-query+watchlist-paramvalue-prop-flags": "Ajoute les marqueurs de la modification.",
+       "apihelp-query+watchlist-paramvalue-prop-user": "Ajoute l’utilisateur ayant fait la modification.",
+       "apihelp-query+watchlist-paramvalue-prop-userid": "Ajoute l’ID de l’utilisateur ayant fait la modification.",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "Ajoute le commentaire de la modification.",
+       "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "Ajoute le commentaire analysé de la modification.",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "Ajoute l’horodatage de la modification.",
+       "apihelp-query+watchlist-paramvalue-prop-patrol": "Marque les modifications patrouillées.",
+       "apihelp-query+watchlist-paramvalue-prop-sizes": "Ajoute les tailles ancienne et nouvelle de la page.",
+       "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Ajoute l’horodatage de la dernière notification de la modification à l’utilisateur.",
+       "apihelp-query+watchlist-paramvalue-prop-loginfo": "Ajoute l’information de trace le cas échéant.",
        "apihelp-query+watchlist-param-show": "Afficher uniquement les éléments qui correspondent à ces critères. Par exemple, pour voir uniquement les modifications mineures faites par des utilisateurs connectés, mettre $1show=minor|!anon.",
        "apihelp-query+watchlist-param-type": "Quels types de modification afficher :\n;edit:Modifications de page normale.\n;external:Modifications externes.\n;new:Créations de page.\n;log:Entrées du journal.",
        "apihelp-query+watchlist-param-owner": "Utilisé avec $1token pour accéder à la liste de suivi d’un autre utilisateur.",
        "apihelp-undelete-param-watchlist": "Ajouter ou supprimer la page de la liste de suivi de l’utilisateur actuel sans condition, utiliser les préférences ou ne pas modifier le suivi.",
        "apihelp-undelete-example-page": "Annuler la suppression de la page <kbd>Main Page</kbd>.",
        "apihelp-undelete-example-revisions": "Annuler la suppression de deux révisions de la page <kbd>Main Page</kbd>.",
-       "apihelp-upload-description": "Télécharger un fichier, ou obtenir l’état des téléchargements en cours.\n\nPlusieurs méthodes sont disponibles :\n* Télécharger directement le contenu du fichier, en utilisant le paramètre <var>$1file</var>.\n* Télécharger le fichier par morceaux, en utilsiant les paramètres <var>$1filesize</var>, <var>$1chunk</var>, and <var>$1offset</var>.\n* Pour que le serveur MédiaWiki cherche un fichier depuis une URL, utiliser le paramètre <var>$1url</var>.\n* Terminer un téléchargement précédent qui a échoué à cause d’avertissements, en utilisant le paramètre <var>$1filekey</var>.\nNoter que le POST HTTP doit être fait comme un téléchargement de fichier (par ex. en utilisant <code>multipart/form-data</code>) en envoyant le <code>multipart/form-data</code>.",
+       "apihelp-upload-description": "Téléverser un fichier, ou obtenir l’état des téléversements en cours.\n\nPlusieurs méthodes sont disponibles :\n* Téléverser directement le contenu du fichier, en utilisant le paramètre <var>$1file</var>.\n* Téléverser le fichier par morceaux, en utilisant les paramètres <var>$1filesize</var>, <var>$1chunk</var>, and <var>$1offset</var>.\n* Pour que le serveur MédiaWiki cherche un fichier depuis une URL, utilisez le paramètre <var>$1url</var>.\n* Terminer un téléversement précédent qui a échoué à cause d’avertissements, en utilisant le paramètre <var>$1filekey</var>.\nNoter que le POST HTTP doit être fait comme un téléversement de fichier (par ex. en utilisant <code>multipart/form-data</code>) en envoyant le <code>multipart/form-data</code>.",
        "apihelp-upload-param-filename": "Nom de fichier cible.",
        "apihelp-upload-param-comment": "Télécharger le commentaire. Utilisé aussi comme texte de la page initiale pour les nouveaux fichiers si <var>$1text</var> n’est pas spécifié.",
        "apihelp-upload-param-text": "Texte de page initiale pour les nouveaux fichiers.",
        "apihelp-xmlfm-description": "Extraire les données au format XML (affiché proprement en HTML).",
        "apihelp-yaml-description": "Extraire les données au format YAML.",
        "apihelp-yamlfm-description": "Extraire les données YAML (affiché proprement en HTML).",
-       "api-format-title": "Résultat de l’API de MédiaWiki",
+       "api-format-title": "Résultat de l’API de MediaWiki",
        "api-format-prettyprint-header": "Voici la représentation HTML du format $1. HTML est utile pour le débogage, mais inapproprié pour être utilisé dans une application.\n\nSpécifiez le paramètre <var>format</var> pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez <kbd>format=$2</kbd>.\n\nVoyez la [[mw:API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
        "api-format-prettyprint-header-only-html": "Ceci est une représentation HTML à des fins de déboguage, et n’est pas approprié à une utilisation applicative.\n\nVoir la [[mw:API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
        "api-orm-param-props": "Champs à rechercher.",
        "api-pageset-param-redirects-nogenerator": "Résoudre automatiquement les redirections dans <var>$1titles</var>, <var>$1pageids</var> et <var>$1revids</var>.",
        "api-pageset-param-converttitles": "Convertir les titres dans d’autres variantes si nécessaire. Fonctionne uniquement si la langue de contenu du wiki supporte la conversion en variantes. Les langues qui supportent la conversion en variante incluent $1.",
        "api-help-title": "Aide de l’API de MediaWiki",
-       "api-help-lead": "Ceci est une page d’aide de l’API de MédiaWiki générée automatiquement.\n\nDocumentation et exemples : https://www.mediawiki.org/wiki/API",
+       "api-help-lead": "Ceci est une page d’aide de l’API de MediaWiki générée automatiquement.\n\nDocumentation et exemples : https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Module principal",
        "api-help-flag-deprecated": "Ce module est obsolète.",
        "api-help-flag-internal": "<strong>Ce module est interne ou instable.</strong> Son fonctionnement peut être modifié sans préavis.",
index c4166e7..442dbc7 100644 (file)
        "apihelp-parse-param-effectivelanglinks": "Inclúe ligazóns de idioma proporcionadas polas extensións (para usar con <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-section": "Recuperar unicamente o contido deste número de sección ou cando <kbd>new</kbd> xera unha nova sección.\n\nA sección <kbd>new</kbd> só é atendida cando se especifica <var>text</var>.",
        "apihelp-parse-param-sectiontitle": "Novo título de sección cando <var>section</var> é <kbd>new</kbd>.\n\nA diferenza da edición de páxinas, non se oculta no <var>summary</var> cando se omite ou está baleiro.",
-       "apihelp-parse-param-disablepp": "Desactivar o informe PP da saída do analizador.",
-       "apihelp-parse-param-disableeditsection": "Desactivar as ligazóns de edición de sección da saída do analizador.",
+       "apihelp-parse-param-disablepp": "Omitir o informe de preprocesador (\"Informe de límite NewPP\") da saída do analizador.",
+       "apihelp-parse-param-disableeditsection": "Omitir as ligazóns de edición de sección da saída do analizador.",
        "apihelp-parse-param-generatexml": "Xenerar unha árbore de análise XML (necesita o modelo de contido <code>$1</code>; substituído por <kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "Analizar en modo vista previa.",
        "apihelp-parse-param-sectionpreview": "Analizar en modo vista previa de sección (activa tamén o modo de vista previa).",
-       "apihelp-parse-param-disabletoc": "Desactiva o índice na saída.",
+       "apihelp-parse-param-disabletoc": "Omitir o índice na saída.",
        "apihelp-parse-param-contentformat": "Formato de serialización do contido usado para o texto de entrada. Só válido cando se usa con $1text.",
        "apihelp-parse-param-contentmodel": "Modelo de contido do texto de entrada. Se se omite, debe especificarse $1title, e o valor por defecto será o modelo do título especificado. Só válido cando se usa con $1text.",
        "apihelp-parse-example-page": "Analizar unha páxina.",
        "apihelp-protect-param-protections": "Lista dos niveis de protección, con formato <kbd>action=level</kbd> (p.ex. <kbd>edit=sysop</kbd>).\n\n<strong>Nota:</strong> Todas as accións que non estean listadas terán restriccións para ser eliminadas.",
        "apihelp-protect-param-expiry": "Selos de tempo de caducidade. Se só se indica un selo de tempo, usarase para todas as proteccións. Use <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, ou <kbd>never</kbd>, para unha protección sen caducidade.",
        "apihelp-protect-param-reason": "Razón para (des)protexer.",
-       "apihelp-protect-param-cascade": "Activar protección en cascada (p. ex. protexer páxinas incluídas nesta páxina). Ignorado se todos os niveis de protección proporcionados non permiten o uso en cascada.",
+       "apihelp-protect-param-cascade": "Activar protección en cascada (p. ex. protexer modelos transcluídos e imaxes usadas nesta páxina). Ignorado se ningún dos niveis de protección proporcionados soportan o uso en cascada.",
        "apihelp-protect-param-watch": "Se se define este parámetro, engadir a páxina que se (des)protexe á lista de vixilancia do usuario actual.",
        "apihelp-protect-param-watchlist": "Engadir ou eliminar sen condicións a páxina da lista de vixiancia do usuario actual, use as preferencias ou non cambie a vixiancia.",
        "apihelp-protect-example-protect": "Protexer unha páxina",
        "apihelp-query+pageswithprop-param-limit": "Máximo número de páxinas a retornar.",
        "apihelp-query+pageswithprop-param-dir": "En que dirección ordenar.",
        "apihelp-query+pageswithprop-example-simple": "Lista as dez primeiras páxinas que usan  <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
-       "apihelp-query+pageswithprop-example-generator": "Obter a infomación de páxina das dez primeiras páxinas que usan <code>_&#95;NOTOC_&#95;</code>.",
+       "apihelp-query+pageswithprop-example-generator": "Obter información adicional das dez primeiras páxinas que usan <code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+prefixsearch-description": "Facer unha busca de prefixo nos títulos das páxinas.",
        "apihelp-query+prefixsearch-param-search": "Buscar texto.",
        "apihelp-query+prefixsearch-param-namespace": "Espazo de nomes no que buscar.",
        "apihelp-query+usercontribs-example-user": "Mostrar as contribucións do usuario <kbd>Exemplo</kbd>.",
        "apihelp-query+usercontribs-example-ipprefix": "Mostrar contribucións de tódalas direccións IP que comezan por <kbd>192.0.2.</kbd>.",
        "apihelp-query+userinfo-description": "Obter información sobre o usuario actual.",
-       "apihelp-query+userinfo-param-prop": "Que pezas de información incluír:\n;blockinfo:Marca se o usuario actual está bloqueado, por que, e por que razón.\n;hasmsg:Engade unha etiqueta <samp>message</samp> (mensaxe) se o usuario actual ten mensaxes pendentes.\n;groups:Lista todos os grupos ós que pertence o usuario actual.\n;implicitgroups:Lista todos so grupos dos que o usuario actual é membro automaticamente. \n;rights:Lista todos os dereitos que ten o usuario actual.\n;changeablegroups:Lista os grupos ós que o usuario pode engadir ou eliminar a outros usuarios.\n;options:Lista todas as preferencias que ten seleccionadas o usuario actual.\n;preferencestoken:<span class=\"apihelp-deprecated\">Obsoleto.</span>Obtén o identificador para cambiar as preferencias do usuario actual.\n;editcount:Engade o contador de edicións do usuario actual.\n;ratelimits:Lista todos o límites de rango aplicados ó usuario actual.\n;realname:Engade o nome real do usuario.\n;email:Engade a dirección de correo electrónico do usuario e a data de autenticación desa dirección.\n;acceptlang:Reenvía a cabeceira <code>Accept-Language</code> enviada polo cliente nun formato estruturado.\n;registrationdate:Engade a data de rexistro do usuario.\n;unreadcount:Engade o número de páxinas sen ler da lista de vixiancia do usuario (máximo $1; devolve <samp>$2</samp> se son máis).",
+       "apihelp-query+userinfo-param-prop": "Que pezas de información incluír:\n;blockinfo:Marca se o usuario actual está bloqueado, por que, e por que razón.\n;hasmsg:Engade unha etiqueta <samp>messages</samp> (mensaxe) se o usuario actual ten mensaxes pendentes.\n;groups:Lista todos os grupos ós que pertence o usuario actual.\n;implicitgroups:Lista todos so grupos dos que o usuario actual é membro automaticamente. \n;rights:Lista todos os dereitos que ten o usuario actual.\n;changeablegroups:Lista os grupos ós que o usuario pode engadir ou eliminar a outros usuarios.\n;options:Lista todas as preferencias que ten seleccionadas o usuario actual.\n;preferencestoken:<span class=\"apihelp-deprecated\">Obsoleto.</span>Obtén o identificador para cambiar as preferencias do usuario actual.\n;editcount:Engade o contador de edicións do usuario actual.\n;ratelimits:Lista todos o límites de rango aplicados ó usuario actual.\n;realname:Engade o nome real do usuario.\n;email:Engade a dirección de correo electrónico do usuario e a data de autenticación desa dirección.\n;acceptlang:Reenvía a cabeceira <code>Accept-Language</code> enviada polo cliente nun formato estruturado.\n;registrationdate:Engade a data de rexistro do usuario.\n;unreadcount:Engade o número de páxinas sen ler da lista de vixiancia do usuario (máximo $1; devolve <samp>$2</samp> se son máis).",
        "apihelp-query+userinfo-example-simple": "Obter información sobre o usuario actual.",
        "apihelp-query+userinfo-example-data": "Obter información adicional sobre o usuario actual.",
        "apihelp-query+users-description": "Obter información sobre unha lista de usuarios.",
        "apihelp-query+watchlist-param-user": "Só listar cambios deste usuario.",
        "apihelp-query+watchlist-param-excludeuser": "Non listar cambios deste usuario.",
        "apihelp-query+watchlist-param-limit": "Cantos resultados totais mostrar por petición.",
-       "apihelp-query+watchlist-param-prop": "Que elementos adicionais obter:\n;ids:Engade os identificadores das revisións e os identificadores das páxinas.\n;title:Engade o título da páxina.\n;flags:Engade etiquetas para a edición.\n;user:Engade o usuario que fixo a edición.\n;userid:Engade o identificador do usuario que fixo a edición.\n;comment:Engade o comentario da edición.\n;parsedcomment:Engade o comentario analizado da edición.\n;timestamp:Engade o selo de tempo da edición.\n;patrol:Marca edicións que están vixiadas.\n;sizes:Engade o tamaño antigo e novo da páxina.\n;notificationtimestamp:Engade o selo de tempo da última vez en que o usuario foi avisado dunha modificación.\n;loginfo:Engade información do rexistro cando sexa axeitado.",
+       "apihelp-query+watchlist-param-prop": "Que propiedades adicionais obter:",
+       "apihelp-query+watchlist-paramvalue-prop-ids": "Engade os identificadores das revisións e os identificadores das páxinas.",
+       "apihelp-query+watchlist-paramvalue-prop-title": "Engade o título da páxina.",
+       "apihelp-query+watchlist-paramvalue-prop-flags": "Engade etiquetas para a edición.",
+       "apihelp-query+watchlist-paramvalue-prop-user": "Engade o usuario que fixo a edición.",
+       "apihelp-query+watchlist-paramvalue-prop-userid": "Engade o identificador do usuario que fixo a edición.",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "Engade o comentario da edición.",
+       "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "Engade o comentario analizado da edición.",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "Engade o selo de tempo da edición.",
+       "apihelp-query+watchlist-paramvalue-prop-patrol": "Marca edicións que están vixiadas.",
+       "apihelp-query+watchlist-paramvalue-prop-sizes": "Engade o tamaño antigo e novo da páxina.",
+       "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Engade o selo de tempo da última vez en que o usuario foi avisado da modificación.",
+       "apihelp-query+watchlist-paramvalue-prop-loginfo": "Engade información do rexistro cando sexa axeitado.",
        "apihelp-query+watchlist-param-show": "Só mostrar elementos que cumpran esos criterios. Por exemplo, para ver só edicións menores feitas por usuarios conectados, activar $1show=minor|!anon.",
        "apihelp-query+watchlist-param-type": "Que tipos de cambios mostrar:\n;edit:Modificacións normais de páxina.\n;external:Modificacións externas.\n;new:Creación de páxinas.\n;log:Entradas no rexistro.",
        "apihelp-query+watchlist-param-owner": "Usado con $1token para acceder á lista de páxinas de vixiancia doutro usuario.",
index c33805f..c885f4e 100644 (file)
@@ -87,6 +87,7 @@
        "apihelp-edit-param-notminor": "שינוי לא משני.",
        "apihelp-edit-param-bot": "סימון עריכה זו כבוט.",
        "apihelp-edit-param-basetimestamp": "חותם־זמן של גרסת הבסיס, משמש לזיהוי התנגשויות עריכה. אפשר לקבל אותו באמצעות [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
+       "apihelp-edit-param-starttimestamp": "חותם־הזמן של תחילת תהליך העריכה, משמש לזיהוי התנגשויות. אפשר לקבל ערך מתאים באמצעות <var>[[Special:ApiHelp/main|curtimestamp]]</var> בעת תחילת תהליך העריכה (למשל בזמן טעינת תוכן הדף לעריכה).",
        "apihelp-edit-param-recreate": "לעקוב את כל הטעויות על כך שהדף נמחק בינתיים.",
        "apihelp-edit-param-createonly": "לא לערוך את הדף אם הוא כבר קיים.",
        "apihelp-edit-param-nocreate": "לזרוק שגיאה אם הדף אינו קיים.",
        "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "נותן משתני הגדרות של JavaScript שייחודיים לדף הזה בתור מחרוזת JSON.",
        "apihelp-parse-paramvalue-prop-iwlinks": "מתן קישורי בינוויקי בקוד הוויקי המפוענח.",
        "apihelp-parse-paramvalue-prop-wikitext": "מתן קוד הוויקי המקורי שפוענח.",
-       "apihelp-parse-param-disablepp": "×\9c×\9b×\91×\95ת ×\90ת ×\93×\95\"×\97 ×\94Ö¾PP מפלט המפענח.",
-       "apihelp-parse-param-disableeditsection": "×\9c×\9b×\91×\95ת את קישורי עריכת הפסקאות מפלט המפענח.",
+       "apihelp-parse-param-disablepp": "×\9c×\94ש×\9e×\99×\98 ×\90ת ×\93×\95\"×\97 ×\94ק×\93×\9dÖ¾×\9e×¢×\91×\93 (\"NewPP limit report\") מפלט המפענח.",
+       "apihelp-parse-param-disableeditsection": "×\9c×\94ש×\9e×\99×\98 את קישורי עריכת הפסקאות מפלט המפענח.",
        "apihelp-parse-param-preview": "לפענח במצב תצוגה מקדימה.",
        "apihelp-parse-param-sectionpreview": "לפענח במצב תצוגה מקדימה של פסקה (מדליק גם את מצב תצוגה מקדימה).",
-       "apihelp-parse-param-disabletoc": "×\9c×\9b×\91×\95ת ×ª×\95×\9b×\9f עניינים בפלט.",
+       "apihelp-parse-param-disabletoc": "×\9c×\94ש×\9e×\99×\98 ×\90ת ×ª×\95×\9b×\9f ×\94עניינים בפלט.",
        "apihelp-parse-param-contentformat": "תסדיר הסדרת תוכן שישמש לטקסט הקלט. תקף רק עם $1text.",
        "apihelp-parse-example-page": "לפענח דף.",
        "apihelp-parse-example-text": "לפענח קוד ויקי.",
        "apihelp-protect-param-protections": "רשימת רמות הכנה, בתסדיר <kbd>action=level</kbd> (למשל <kbd>edit=sysop</kbd>).",
        "apihelp-protect-param-expiry": "חותמי־זמן של תפוגה. אם הוגדר רק חותם־זמן אחד, הוא ישמש לכל ההגנות. יש להשתמש ב־<kbd>infinite</kbd>‏, <kbd>indefinite</kbd>‏, <kbd>infinity</kbd>, או <kbd>never</kbd> להגנה שלא פגה לעולם.",
        "apihelp-protect-param-reason": "סיבה להגנה או הסרת הגנה.",
-       "apihelp-protect-param-cascade": "×\94פע×\9cת ×\94×\92× ×\94 ×\9e×\93×\95ר×\92ת (×\9b×\9c×\95×\9eר, ×\9c×\94×\92×\9f ×¢×\9c ×\93פ×\99×\9d ×©×\9b×\9c×\95×\9c×\99×\9d ×\91×\93×£ ×\94×\96×\94). ×\90×\99×\9f ×\9c×\96×\94 ×\94שפע×\94 ×\90×\9d ×\9b×\9c ×¨×\9e×\95ת ×\94×\94×\92× ×\94 ×©× ×\99תנ×\95 ×\90×\99× ×\9f ×ª×\95×\9e×\9b×\95ת בדירוג.",
+       "apihelp-protect-param-cascade": "×\94פע×\9cת ×\94×\92× ×\94 ×\9e×\93×\95ר×\92ת (×\9b×\9c×\95×\9eר, ×\9c×\94×\92×\9f ×¢×\9c ×\93פ×\99×\9d ×©×\9e×\95×\9b×\9c×\9c×\99×\9d ×\91×\93×£ ×\94×\96×\94 ×\95×¢×\9c ×ª×\9e×\95× ×\95ת ×©×\9eש×\9e×\95ת ×\91×\95). ×\90×\99×\9f ×\9c×\96×\94 ×\94שפע×\94 ×\90×\9d ×\90×£ ×\90×\97ת ×\9eר×\9e×\95ת ×\94×\94×\92× ×\94 ×©× ×\99תנ×\95 ×\90×\99× ×\94 ×ª×\95×\9e×\9bת בדירוג.",
        "apihelp-protect-param-watch": "אם זה מוגדר, הוספת הדף שהגנה נוספת אליו או מוסרת ממנו לרשימת המעקב של המשתמש הנוכחי.",
        "apihelp-protect-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
        "apihelp-protect-example-protect": "הגנה על דף.",
        "apihelp-query+allimages-param-sha1": "גיבוב SHA1 של תמונה. דריסת $1sha1base36.",
        "apihelp-query+allimages-param-sha1base36": "גיבוב SHA1 של התמונה בבסיס 36 (הבסיס בו נעשה שימוש במדיה־ויקי).",
        "apihelp-query+allimages-param-user": "להחזיר רק קבצים שהועלו על־ידי המשתמש הזה. יכול לשמש רק עם $1sort=timestamp. לא יכול לשמש יחד עם $1filterbots.",
+       "apihelp-query+allimages-param-filterbots": "איך לסנן קבצים שמעלים בוטים. יכול לשמש רק עם $1sort=timestamp. לא יכול לשמש יחד עם $1user.",
        "apihelp-query+allimages-param-limit": "כמה תמונות להחזיר בסך הכול.",
        "apihelp-query+allimages-example-B": "הצגת רשימה של קבצים שמתחילים באות <kbd>B</kbd>.",
        "apihelp-query+allimages-example-generator": "הצגת מידע על 4 קבצים המתחילים באות <kbd>T</kbd>.",
        "apihelp-query+allusers-description": "למנות את כל המשתמשים הרשומים.",
        "apihelp-query+allusers-param-from": "מאיזה שם משתמש להתחיל למנות.",
        "apihelp-query+allusers-param-to": "באיזה שם משתמש להפסיק למנות.",
+       "apihelp-query+allusers-param-prefix": "חיפוש כל המשתמשים שמתחילים בערך הזה.",
        "apihelp-query+allusers-param-dir": "באיזה כיוון למיין.",
+       "apihelp-query+allusers-param-group": "לכלול רק משתמשים בקבוצות הנתונות.",
+       "apihelp-query+allusers-param-excludegroup": "לא לכלול משתמשים בקבוצות הנתונות.",
+       "apihelp-query+allusers-param-rights": "לכלול רק משתמשים עם ההרשאות הנתונות. לא כולל הרשאות שניתנו בקבוצות משתמעות או אוטומטיות כגון *, user או autoconfirmed.",
        "apihelp-query+allusers-param-prop": "אילו פרטי מידע לכלול:\n;blockinfo:הוספת מידע עם החסימה הנוכחית של משתמש.\n;groups:הוספת קבוצות שמשתמש חבר בהן. זה משתמש ביותר משאבי דפדפן ויכול להחזיר פחות תוצאות מהמגבלה.\n;implicitgroups:לרשום את כל הקבוצות שהמשתמש חבר בהן אוטומטית.\n;rights:רשימת הההרשאות שיש למשתמש.\n;editcount:הוספת מניין העריכות של המשתמש .\n;registration:הוספת חותם־הזמן של זמן הרישום של המשתמש (יכול להיות ריק).",
+       "apihelp-query+allusers-param-limit": "כמה שמות משתמש בסך הכול לשנות.",
+       "apihelp-query+allusers-param-witheditsonly": "לרשום רק משתמשים שעשו עריכות.",
+       "apihelp-query+allusers-param-activeusers": "לרשום רק משתמשים שהיו פעילים {{PLURAL:$1|ביום האחרון|ביומיים האחרונים|ב־$1 הימים האחרונים}}.",
+       "apihelp-query+allusers-example-Y": "לרשום משתמשים שמתחילים ב־<kbd>Y</kbd>.",
        "apihelp-query+backlinks-description": "מציאת כל הדפים שמקשרים לדף הנתון.",
        "apihelp-query+backlinks-param-title": "איזו כותרת לחפש. לא ניתן להשתמש בזה יחד עם <var>$1pageid</var>.",
        "apihelp-query+backlinks-param-namespace": "איזה מרחב שם למנות.",
        "apihelp-query+blocks-param-start": "מאיזה חותם‏־זמן להתחיל למנות.",
        "apihelp-query+blocks-param-end": "באיזה חותם זמן להפסיק למנות.",
        "apihelp-query+blocks-param-prop": "אילו מאפיינים לקבל:\n;id:הוספת מזהה החסימה.\n;user:הוספת שם המשתמש שנחסם.\n;userid:הוספת המזהה של המשמש שנחסם.\n;by:הוספת שם המשתמש שחסם.\n;byid:הוספת מזהה המשתמש שחסם.\n;timestamp:הוספת חותם־הזמן של החסימה.\n;expiry:הוספת חותם־הזמן של תפוגת החסימה.\n;reason:הוספת הסיבה שניתנה לחסימה.\n;range:הוספת טווח כתובות ה־IP שהחסימה משפיעה עליהן.\n;flags:מתייג את ההחרמה (autoblock‏, anononly, וכו'.).",
+       "apihelp-query+blocks-example-simple": "רשימת חסימות.",
        "apihelp-query+categories-param-prop": "אילו מאפיינים נוספים לקבל עבור כל קטגוריה:\n;sortkey:הוספת מפתח מיון (מחרוזת הקסדצימלית) ותחילית מפתח מיון (החלק הקריא) עבור קטגוריה.\n;timestamp:הוספת חותם־הזמן של יצירת הקטגוריה.\n;hidden:תיוג קטגוריות שהוסתרו באמצעות _&#95;HIDDENCAT_&#95;.",
        "apihelp-query+categories-param-limit": "כמה קטגוריות להחזיר.",
        "apihelp-query+categories-param-dir": "באיזה כיוון לרשום.",
+       "apihelp-query+categoryinfo-description": "החזרת מידע על הקטגוריות הנתונות.",
        "apihelp-query+categorymembers-description": "רשימת כל הדפים בקטגוריה נתונה.",
        "apihelp-query+categorymembers-param-title": "איזו קטגוריה למנות (נדרש). חייב לכלול את התחילית <kbd>{{ns:category}}:</kbd>. לא יכול לשמש יחד עם <var>$1pageid</var>.",
        "apihelp-query+categorymembers-param-pageid": "מזהה הדף של הקטגוריה שצריך למנות. לא יכול לשמש יחד עם <var>$1title</var>.",
+       "apihelp-query+categorymembers-param-prop": "אילו חלקי מידע לכלול:\n;ids:הוספת מזהה הדף.\n;title:הוספת השם ומזהה מרחב השם של הדף.\n;sortkey:הוספת מפתח המיון שמשמש למיון בקטגוריה (מחרזות הקסדצימלית).\n;sortkeyprefix:הוספת מפתח המיון שמשמש למיון בקטגוריה (מחרוזת הקסדצימלית).\n;type:הוספת הסוג שהדף מוין אליו (דף, תת־קטגוריה, או קובץ).\n;timestamp:הוספת חותם־הזמן שבו הדף נכלל.",
        "apihelp-query+categorymembers-param-namespace": "לכלול רק דפים במרחבי השם האלה. יש לשים לב לכך ש־<kbd>$1type=subcat</kbd> או <kbd>$1type=file</kbd> יכולים לשמש במקום <kbd>$1namespace=14</kbd> או <kbd>6</kbd>.",
+       "apihelp-query+categorymembers-param-type": "איזה סוג של חברי קטגוריה לכלול. לא תקף כאשר מוגדר <kbd>$1sort=timestamp</kbd>.",
        "apihelp-query+categorymembers-param-limit": "מספר הדפים המרבי שיוחזר.",
        "apihelp-query+categorymembers-param-sort": "לפי איזה מאפיין למיין.",
        "apihelp-query+categorymembers-param-dir": "באיזה כיוון למיין.",
+       "apihelp-query+categorymembers-param-start": "מאיזה חותם־זמן להתחיל לרשום. יכול לשמש רק עם <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-end": "באיזה חותם־זמן לסיים לרשום. יכול לשמש רק עם <kbd>$1sort=timestamp</kbd>.",
        "apihelp-query+categorymembers-param-startsortkey": "כדאי להשתמש ב־$1starthexsortkey במקום.",
        "apihelp-query+categorymembers-param-endsortkey": "כדאי להשתמש ב־$1endhexsortkey במקום.",
        "apihelp-query+categorymembers-example-simple": "קבלת עשרת העמודים הראשונים שתחת <kbd>קטגוריה:פיזיקה</kbd>.",
        "apihelp-query+contributors-param-limit": "כמה תורמים להחזיר.",
        "apihelp-query+contributors-example-simple": "הצגת תורמים לדף <kbd>עמוד ראשי</kbd>.",
+       "apihelp-query+deletedrevisions-description": "קבלת מידע על גרסה מחוקה.\n\nיכול לשמש במספר דרכים:\n# קבלת גרסאות מחוקות עבור ערכת דפים, על־ידי הגדרת שמות או מזהי דף. ממוין לפי שם וחותם־זמן.\n# קבלת מידע על ערכת גרסאות מחוקות באמצעות הגדרת המזהים שלהם עם revid־ים. ממוין לפי מזהה גרסה.",
        "apihelp-query+deletedrevisions-param-start": "באיזה חותם־זמן להתחיל למנות. לא תקף בעיבור רשימת מזהי גרסה.",
        "apihelp-query+deletedrevisions-param-end": "באיזה חותם־זמן להפסיק למנות. לא תקף בעת עיבוד רשימת מזהי גרסה.",
        "apihelp-query+deletedrevisions-param-tag": "לרשום רק גרסאות עם התג הזה.",
        "apihelp-query+deletedrevisions-param-user": "לרשום רק גרסאות מאת המשתמש הזה.",
        "apihelp-query+deletedrevisions-param-excludeuser": "לא לרשום גרסאות מאת המשתמש הזה.",
+       "apihelp-query+deletedrevs-description": "רשימת גרסאות מחוקות.\n\nפועל בשלושה אופנים:\n# רשימת גרסאות מחוקות לשמות שניתנו, ממוינות לפי חותם־זמן.\n# רשימת תרומות מחוקות של המשתמש שניתן, ממוינות לפי חותם־זמן (בלי לציין שמות).\n# רשימת כל הגרסאות המחוקות במרחב השם שניתן, ממוינות לפי שם וחותם־זמן (בלי לציין שמות, בלי להגדיר $1user).\n\nפרמטרים מסוימים חלים רק על חלק מהאופנים ולא תקפים באחרים.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|מצב|מצבים}}: $2",
        "apihelp-query+deletedrevs-param-start": "באיזה חותם־זמן להתחיל למנות.",
        "apihelp-query+deletedrevs-param-end": "באיזה חותם־זמן להפסיק למנות.",
        "apihelp-query+embeddedin-param-title": "איזו כותרת לחפש. לא ניתן להשתמש בזה יחד עם $1pageid.",
        "apihelp-query+embeddedin-param-namespace": "איזה מרחב שם למנות.",
        "apihelp-query+embeddedin-param-dir": "באיזה כיוון לרשום.",
+       "apihelp-query+embeddedin-param-filterredir": "איך לסנן עבור הפניות.",
        "apihelp-query+embeddedin-param-limit": "כמה דפים להחזיר בסך הכול.",
        "apihelp-query+extlinks-param-limit": "כמה קישורים להחזיר.",
        "apihelp-query+exturlusage-description": "למנות דפים שמכילים URL נתון.",
        "apihelp-query+exturlusage-param-namespace": "איזה מרחב שם למנות.",
+       "apihelp-query+exturlusage-param-limit": "כמה דפים להחזיר.",
        "apihelp-query+filearchive-description": "למנות את כל הקבצים המחוקים לפי הסדר.",
        "apihelp-query+filearchive-param-from": "מאיזו כותרת תמונה להתחיל למנות.",
        "apihelp-query+filearchive-param-to": "באיזו כותרת תמונה להפסיק למנות.",
+       "apihelp-query+filearchive-param-limit": "כמה תמונות להחזיר בסך הכול.",
        "apihelp-query+filearchive-param-dir": "באיזה כיוון לרשום.",
+       "apihelp-query+filearchive-param-sha1": "גיבוב SHA1 של תמונה. דורס את $1sha1base36.",
+       "apihelp-query+filearchive-param-sha1base36": "גיבוב SHA1 של תמונה בבסיס 36 (משמש במדיה־ויקי).",
+       "apihelp-query+filearchive-param-prop": "איזה מידע על תמונה לקבל:\n;sha1:הוספת גיבוב SHA-1 עבור התמונה.\n;timestamp:הוספת חותם־זמן לגרסה המועלית.\n;user:הוספת המשתמש שהעלה על גרסת התמונה.\n;size:הוספת הגודל של התמונה בבתים והגובה, הרוחב ומניין הדפים (אם מתאים).\n;dimensions:כינוי ל־size.\n;description:הוספת תיאור לגרסת התמונה.\n;parseddescription:פענוח התיאור של הגרסה.\n;mime:הוספת ה־MIME של התמונה.\n;mediatype:הוספת סוג המדיה של התמונה.\n;metadata:רשימת מטא־נתוני Exif עבור גרסת הקובץ.\n;bitdepth:הוספת עומק הביטים של הגרסה.\n;archivename:הוספת שם הקובץ של גרסה מאורכבת עבור גרסאות שאינן האחרונה.",
        "apihelp-query+fileusage-param-namespace": "לכלול רק דפים במרחבי השם האלה.",
        "apihelp-query+fileusage-param-limit": "כמה להחזיר.",
        "apihelp-query+fileusage-param-show": "לחפש רק פריטים שמתאימים לאמות המידה הבאות:\n;redirect:להציג רק הפניות.\n;!redirect:לא להציג הפניות.",
        "apihelp-query+imageusage-param-namespace": "איזה מרחב שם לרשום.",
        "apihelp-query+imageusage-param-dir": "באיזה כיוון לרשום.",
        "apihelp-query+info-paramvalue-prop-watchers": "מספר העוקבים, אם קיבלת הרשאה.",
+       "apihelp-query+info-paramvalue-prop-notificationtimestamp": "חותם־זמן של הודעת רשימת מעקב של כל דף.",
        "apihelp-query+info-paramvalue-prop-readable": "האם המשתמש יכול להציג דף זה.",
        "apihelp-query+iwbacklinks-param-title": "איזה קישור בינוויקי לחפש. צריך להשתמש בזה יחד עם <var>$1blprefix</var>.",
        "apihelp-query+iwbacklinks-param-limit": "כמה דפים להחזיר בסך הכול.",
        "apihelp-query+linkshere-param-limit": "כמה להחזיר.",
        "apihelp-query+linkshere-param-show": "הצגת פריטים שתואמים את הדרישות הללו בלבד:\n;redirect:הצגת הפניות בלבד.\n;!redirect:הצגת קישורים שאינם הפניות בלבד.",
        "apihelp-query+logevents-description": "קבלת אירועים מהרישומים.",
+       "apihelp-query+logevents-param-prop": "אילו מאפיינים לקבל:\n;ids:הוספת המזהה של אירוע היומן.\n;title:הוספת שם הדף של אירוע היומן.\n;type:הוספת הסוג של אירוע היומן.\n;user:הוספת המשתמש האחראי על אירוע היומן.\n;userid:הוספת מזהה המשתמש האחראי על אירוע היומן.\n;timestamp:הוספת חותם־הזמן עבור האירוע.\n;comment:הוספת ההערה של האירוע.\n;parsedcomment:הוספת ההערה המפוענחת של האירוע.\n;details:הוספת פרטים נוספים על האירוע.\n;tags:רשימת התגים של האירוע.",
        "apihelp-query+logevents-param-start": "באיזה חותם־זמן להתחיל למנות.",
        "apihelp-query+logevents-param-end": "באיזה חותם זמן להפסיק לרשום.",
        "apihelp-query+pageswithprop-param-propname": "מאפיין דף שעבורו יימנו דפים.",
        "apihelp-query+pageswithprop-param-limit": "מספר הדפים המרבי שיוחזר.",
        "apihelp-query+pageswithprop-param-dir": "באיזה כיוון לסדר.",
        "apihelp-query+pageswithprop-example-simple": "הצגת עשרת הדפים הראשונים שעושים שימוש ב־<code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
-       "apihelp-query+pageswithprop-example-generator": "ק×\91×\9cת ×¤×¨×\98×\99×\94×\9d ×©ל עשרת הדפים הראשונים המשתמשים ב־<code>_&#95;NOTOC_&#95;</code>.",
+       "apihelp-query+pageswithprop-example-generator": "ק×\91×\9cת ×\9e×\99×\93×¢ × ×\95סף ×¢ל עשרת הדפים הראשונים המשתמשים ב־<code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+prefixsearch-param-search": "מחרוזת לחיפוש.",
        "apihelp-query+prefixsearch-param-namespace": "שמות מתחם לחיפוש.",
        "apihelp-query+prefixsearch-param-limit": "מספר התוצאות המרבי להחזרה.",
        "apihelp-query+prefixsearch-param-offset": "מספר תוצאות לדילוג.",
        "apihelp-query+protectedtitles-param-limit": "כמה דפים להחזיר בסך הכול.",
+       "apihelp-query+protectedtitles-param-start": "להתחיל לרשום בחותם־זמן ההגנה הזה.",
        "apihelp-query+protectedtitles-param-end": "באיזה חותם־זמן הגנה לסיים את הרשימה.",
+       "apihelp-query+protectedtitles-param-prop": "אילו מאפיינים לקבל:\n;timestamp:הוספת חותם־הזמן של הוספת ההגנה.\n;user:הוספת המשתמש שהוסיף את ההגנה.\n;userid:הוספת מזהה המשתמש שהוסיף את ההגנה.\n;comment:הוספת ההערה עבור ההגנה.\n;parsedcomment:הוספת ההערה המפוענחת עבור ההגנה.\n;expiry:הוספת חותם־הזמן של הסרת ההגנה.\n;level:הוספת רמת ההגנה.",
        "apihelp-query+querypage-param-limit": "מספר תוצאות להחזרה.",
        "apihelp-query+recentchanges-description": "מניית השינויים האחרונים.",
        "apihelp-query+recentchanges-param-start": "באיזה חותם־זמן להתחיל למנות.",
        "apihelp-query+recentchanges-param-end": "באיזה חותם זמן להפסיק לרשום.",
        "apihelp-query+recentchanges-param-user": "לרשום רק שינויים של המשתמש הזה.",
        "apihelp-query+recentchanges-param-excludeuser": "Don't list changes by this user",
+       "apihelp-query+recentchanges-param-prop": "לכלול פריטי מידע נוספים:\n;user:הוספת המשתמש האחראי על העריכה ותיוג אם זאת כתובת IP.\n;userid:הוספת המשתמש האחראי על העריכה.\n;comment:הוספת ההערה על העריכה.\n;parsedcomment:הוספת ההערה המפוענחת על העריכה.\n;flags:הוספת דגלים לעריכה.\n;timestamp:הוספת חותם־זמן של העריכה.\n;title:הוספת שם הדף של העריכה.\n;ids:הוספת מזהה הדף, מזהה שינויים אחרונים, והמזהה הגרסה החדשה והישנה.\n;sizes:הוספת אורך הדף החדש והישן בבתים.\n;redirect:מתייג שהדף הוא הפניה.\n;patrolled:מתייג עריכה בת־בדיקה בתור בדוקה או בלתי־בדוקה.\n;loginfo:הוספת מידע יומן (זהה יומן, סוג יומן וכו') לעיולי יומן.\n;tags:רשימת תגים עבור העיול.\n;sha1:הוספת סיכום־ביקורת תוכן לעיולים שמשויכים לגרסה.",
        "apihelp-query+recentchanges-param-limit": "כמה שינויים להחזיר בסך הכול.",
        "apihelp-query+recentchanges-param-type": "אילו סוגים של שינויים להציג.",
        "apihelp-query+recentchanges-param-toponly": "לרשום רק שינויים שהם הגרסה האחרונה.",
        "apihelp-query+revisions-param-startid": "מאיזה מזהה גרסה להתחיל למנות.",
        "apihelp-query+revisions-param-endid": "באיזה מזהה גרסה להפסיק את מניית הגרסאות.",
        "apihelp-query+revisions-param-start": "מאיזה חותם־זמן של גרסה להתחיל למנות.",
+       "apihelp-query+revisions-param-end": "למנות עד חותם־הזמן הזה.",
        "apihelp-query+revisions-param-tag": "לרשום רק גרסאות עם התג הזה.",
+       "apihelp-query+revisions+base-paramvalue-prop-timestamp": "חותם־הזמן של הגרסה.",
        "apihelp-query+revisions+base-param-limit": "הגבלת מספר הגרסאות שיוחזרו.",
        "apihelp-query+revisions+base-param-contentformat": "תסדיר ההסדרה שמשמש את <var>$1difftotext</var> וצפוי לפלט של תוכן.",
        "apihelp-query+search-description": "ביצוע חיפוש בכל הטקסט.",
        "apihelp-query+search-param-what": "איזה סוג חיפוש לבצע.",
        "apihelp-query+search-param-info": "אילו מטא־נתונים להחזיר.",
+       "apihelp-query+search-param-prop": "אילו מאפיינים להחזיר:\n;size:הוספת גודל הדף בבתים.\n;wordcount:הוספת מניין המילים של הדף.\n;timestamp:הוספת חותם־הזמן של העריכה האחרונה של הדף.\n;snippet:הוספת קטע קצר מפוענח מהדף.\n;titlesnippet:הוספת קטע קצר מפוענח משם הדף.\n;redirectsnippet:הוספת קטע קצר מפוענח משם ההפניה.\n;redirecttitle:הוספת שם ההפניה התואמת.\n;sectionsnippet:הוספת קטע קצר מפוענח של שם הפסקה התואמת.\n;sectiontitle:הוספת שם הפסקה התואמת.\n;categorysnippet:הוספת קטע קצר מפוענח של הקטגוריה התואמת.\n;isfilematch:הוספת בוליאני שמציין אם החיפוש תאם לתוכן של קובץ.\n;score:<span class=\"apihelp-deprecated\">מיושן וחסר־תוקן.</span>\n;hasrelated:<span class=\"apihelp-deprecated\">מיושן וחסר־תוקן.</span>",
        "apihelp-query+search-param-limit": "כמה דפים להחזיר בסך הכול.",
        "apihelp-query+siteinfo-param-inlanguagecode": "קוד שפה ששמות שפות מתורגמות (מאמץ טוב ביותר) ושמות עיצובים.",
        "apihelp-query+siteinfo-example-simple": "איזור מידע על האתר.",
        "apihelp-query+usercontribs-param-start": "באיזה חותם־הזמן להתחיל.",
        "apihelp-query+usercontribs-param-end": "באיזה חותם־הזמן לסיים",
        "apihelp-query+usercontribs-param-user": "עבור אילו משתמשים לאחזר תרומות.",
+       "apihelp-query+usercontribs-param-prop": "לכלול פריטי מידע נוספים:\n;ids:הוספת מזהה הדף ומזהה הגרסה.\n;title:הוספת השם ומזהה מרחב השם של הדף.\n;timestamp:הוספת חותם־הזמן של העריכה.\n;comment:הוספת ההערה על העריכה.\n;parsedcomment:הוספת ההערה המפוענחת של העריכה.\n;size:הוספת הגודל החדש של העריכה.\n;sizediff:הוספת ההפרש של העריכה אל מול ההורה שלה.\n;flags:הוספת הדגלים של העריכה.\n;patrolled:מתייג עריכות בדוקות.\n;tags:רשימת תגים עבור עריכות.",
        "apihelp-query+usercontribs-param-tag": "לרשום רק גרסאות עם התג הזה.",
        "apihelp-query+usercontribs-param-toponly": "לרשום רק שינויים שהם הגרסה האחרונה.",
-       "apihelp-query+userinfo-param-prop": "אילו חלקי מידע לכלול:\n;blockinfo:מתייג אם המשתמש הנוכחי נחסם, על־ידי מי ומאיזו סיבה.\n;hasmsg:הוספת התג <samp>message</samp> אם למשתמש הנוכחי יש הודעות ממתינות.\n;groups:רשימת כל הקבוצות שהמשתמש שייך אליהן.\n;implicitgroups:רשימת כל הקבוצות שהמשתמש שייך אליהן באופן אוטומטי.\n;rights:רשימת כל ההרשאות שיש למשתמש הזה.\n;changeablegroups:רשימת הקבוצות שהמשתמש הנוכחי יכול להוסיף אליהן ולגרוע מהן.\n;options:רשימת כל ההעדפות שהמשתמש הנוכחי הגדיר.\n;preferencestoken:<span class=\"apihelp-deprecated\">מיושן.</span> קבלת אסימון לשינוי ההעדפות של המשתמש הנוכחי.\n;editcount:הוספת מניין העריכות של המשתמש הנוכחי.\n;ratelimits:רשימת כל מגבלות הקצב שחלות על המשתמש הנוכחי.\n;realname:הוספת השם האמתי של המשתמש.\n;email:הוספת כתובת הדוא\"ל ותאריך אימות כתובת הדוא\"ל.\n;acceptlang:מדפיס את כותרת <code>Accept-Language</code> ששלח הלקוח בתסדיר מובנה.\n;registrationdate:הוספת תאריך הרישום של המשתמש.\n;unreadcount:הוספת מניין הדפים שלא נקראו ברשימת המעקב של המשתמש (לכל היותר $1; מחזיר <samp>$2</samp> אם יש יותר).",
+       "apihelp-query+userinfo-param-prop": "אילו חלקי מידע לכלול:\n;blockinfo:מתייג אם המשתמש הנוכחי נחסם, על־ידי מי ומאיזו סיבה.\n;hasmsg:הוספת התג <samp>messages</samp> אם למשתמש הנוכחי יש הודעות ממתינות.\n;groups:רשימת כל הקבוצות שהמשתמש שייך אליהן.\n;implicitgroups:רשימת כל הקבוצות שהמשתמש שייך אליהן באופן אוטומטי.\n;rights:רשימת כל ההרשאות שיש למשתמש הזה.\n;changeablegroups:רשימת הקבוצות שהמשתמש הנוכחי יכול להוסיף אליהן ולגרוע מהן.\n;options:רשימת כל ההעדפות שהמשתמש הנוכחי הגדיר.\n;preferencestoken:<span class=\"apihelp-deprecated\">מיושן.</span> קבלת אסימון לשינוי ההעדפות של המשתמש הנוכחי.\n;editcount:הוספת מניין העריכות של המשתמש הנוכחי.\n;ratelimits:רשימת כל מגבלות הקצב שחלות על המשתמש הנוכחי.\n;realname:הוספת השם האמתי של המשתמש.\n;email:הוספת כתובת הדוא\"ל ותאריך אימות כתובת הדוא\"ל.\n;acceptlang:מדפיס את כותרת <code>Accept-Language</code> ששלח הלקוח בתסדיר מובנה.\n;registrationdate:הוספת תאריך הרישום של המשתמש.\n;unreadcount:הוספת מניין הדפים שלא נקראו ברשימת המעקב של המשתמש (לכל היותר $1; מחזיר <samp>$2</samp> אם יש יותר).",
+       "apihelp-query+users-param-prop": "אילו חלקי מידע לקבל:\n;blockinfo:מתייג אם המשתמש חסום, על־ידי מי, ומאיזו סיבה.\n;groups:רשימת כל הקבוצות שהמשתמש שייך אליהן.\n;implicitgroups:רשימת כל הקבוצות שהמשתמש חבר בהן אוטומטית.\n;rights:רשימת כל ההרשאות שיש למשתמש.\n;editcount:הוספת מניין העריכות של המשתמש.\n;registration:הוספת חותם־הזמן של רישום המשתמש.\n;emailable:מתייג אם המשתמש יכול ורוצה לקבל דואר אלקטרוני דרך [[Special:Emailuser]].\n;gender:מתייג את המגדר של המשתמש. מחזיר \"male\"‏, \"female\" או \"unknown\".",
        "apihelp-query+watchlist-param-start": "מאיזה חותם־זמן להתחיל למנות.",
        "apihelp-query+watchlist-param-end": "באיזה חותם זמן להפסיק לרשום.",
        "apihelp-query+watchlist-param-user": "לרשום רק שינויים של המשתמש הזה.",
        "apihelp-query+watchlist-param-excludeuser": "Don't list changes by this user",
        "apihelp-query+watchlist-param-limit": "כמה תוצאות סך הכול להחזיר בכל בקשה.",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "הוספת חותם־זמן של העריכה.",
+       "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "הוספת חותם־זמן של ההודעה האחרונה למשתמש על העריכה.",
        "apihelp-query+watchlistraw-param-limit": "כמה תוצאות סך הכול להחזיר בכל בקשה.",
+       "apihelp-query+watchlistraw-param-prop": "אילו מאפיינים נוספים לקבל:\n;changed:הוספת חותם־הזמן של ההודעה האחרונה למשתמש על העריכה.",
        "apihelp-query+watchlistraw-param-fromtitle": "מאיזו כותרת (עם תחילית מרחב שם) להתחיל את המנייה.",
        "apihelp-query+watchlistraw-param-totitle": "באיזו כותרת (עם תחילית מרחב שם) להפסיק למנות.",
        "apihelp-rollback-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
+       "apihelp-setnotificationtimestamp-description": "עדכון חותם־הזמן של ההודעה עבור דפים במעקב.\n\nזה משפיע על הדגשת הדפים שהשתנו ברשימת המעקב ובהיסטוריה, ושליחת דואר אלקטרוני כאשר ההעדפה \"לשלוח אליי דואר אלקטרוני כאשר נעשה שינוי בדף או בקובץ ברשימת המעקב שלי\" מופעלת.",
+       "apihelp-setnotificationtimestamp-param-timestamp": "חותם־הזמן להגדרת חותם־זמן של הודעה.",
+       "apihelp-setnotificationtimestamp-param-torevid": "לאיזו גרסה להגדיר את חותם הזמן (רק דף אחד).",
+       "apihelp-setnotificationtimestamp-param-newerthanrevid": "הגרסה שחותם־הזמן של ההודעה יוגדר בתור חדש ממנה (רק דף אחד).",
+       "apihelp-setnotificationtimestamp-example-pagetimestamp": "הגדרת חותם־הזמן להודעה ל־<kbd>Main page</kbd> כך שכל העריכות מאז 1 בינואר 2012 מוגדרות בתור כאלה שלא נצפו.",
        "apihelp-tag-param-reason": "סיבה לשינוי.",
        "apihelp-tokens-description": "קבלת אסימונים לפעולות שמשנות נתונים.\n\nהיחידה הזאת הוכרזה בתור מיושנת לטובת [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
+       "apihelp-undelete-description": "שחזור גרסאות של דף מחוק.\n\nאפשר לאחזר רשימת גרסאות מחוקות (כולל חותמי־זמן) דרך [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]], ואפשר לאחזר רשימת מזהי קבצים מחוקים דרך [[Special:ApiHelp/query+filearchive|list=filearchive]].",
        "apihelp-undelete-param-reason": "סיבה לשחזור.",
+       "apihelp-undelete-param-timestamps": "חותמי־זמן של הגרסה לשחזור. אם גם <var>$1timestamps</var> וגם <var>$1fileids</var> ריקים, הכול ישוחזר.",
        "apihelp-undelete-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
        "apihelp-upload-param-filename": "שם קובץ היעד.",
        "apihelp-upload-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
        "api-orm-param-props": "באילו שדות לעשות שאילתה.",
        "api-orm-param-limit": "מספר מרבי של שורות להחזיר.",
        "api-pageset-param-titles": "רשימת כותרות.",
-       "api-pageset-param-pageids": "רש×\99×\9eת ×\9e×\96×\94×\99 ×\93×£ ×\9c×¢×\95×\91ד עליהם.",
+       "api-pageset-param-pageids": "רש×\99×\9eת ×\9e×\96×\94×\99 ×\93×£ ×\9c×¢×\91×\95ד עליהם.",
        "api-pageset-param-revids": "רשימת מזהי גרסה לעבוד עליהם.",
        "api-pageset-param-generator": "קבלת רשימת דפים לעבוד עליהם על־ידי הרצת יחידת ה־query שצוינה.\n\n<strong>לתשומת לבך:</strong> לשמות בפרמטר generator צריכה להיות התחילית \"g\", ר' דוגמאות.",
        "api-pageset-param-redirects-generator": "פתרון אוטומטי של הפניות ב־<var>$1titles</var>, ב־<var>$1pageids</var>, וב־<var>$1revids</var>, ודפים שמחזיר <var>$1generator</var>.",
diff --git a/includes/api/i18n/ht.json b/includes/api/i18n/ht.json
new file mode 100644 (file)
index 0000000..dee39e1
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Bfpage"
+               ]
+       },
+       "apihelp-query-param-rawcontinue": "Bay tounen done anvan tout koreksyon <samp>query-continue</samp> pou kontinyasyon"
+}
index bd168cb..190de54 100644 (file)
@@ -5,7 +5,8 @@
                        "Nivit",
                        "Toadino2",
                        "Gianfranco",
-                       "Alexmar983"
+                       "Alexmar983",
+                       "Ricordisamoa"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentazione (in inglese)]]\n* [[mw:API:FAQ|FAQ (in inglese)]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annunci sull'API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug & richieste]\n</div>\n<strong>Stato:</strong> Tutte le funzioni e caratteristiche mostrate su questa pagina dovrebbero funzionare, ma l'API è ancora in fase d'attivo sviluppo, e potrebbe cambiare in qualsiasi momenento. Iscriviti alla [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] per essere informato sugli aggiornamenti.\n\n<strong>Istruzioni sbagliate:</strong> quando vengono impartite all'API delle istruzioni sbagliate, un'intestazione HTTP verrà inviata col messaggio \"MediaWiki-API-Error\" e sia al valore dell'intestazione sia al codice d'errore verrà impostato lo stesso valore. Per maggiori informazioni leggi [[mw:API:Errors_and_warnings|API:Errori ed avvertimenti (in inglese)]].",
@@ -60,6 +61,7 @@
        "apihelp-disabled-description": "Questo modulo è stato disabilitato.",
        "apihelp-edit-description": "Crea e modifica pagine.",
        "apihelp-edit-param-title": "Titolo della pagina da modificare. Non può essere usato insieme con <var>$1pageid</var>.",
+       "apihelp-edit-param-pageid": "ID di pagina della pagina da modificare. Non può essere usato insieme con <var>$1title</var>.",
        "apihelp-edit-param-sectiontitle": "Il titolo per una nuova sezione.",
        "apihelp-edit-param-text": "Contenuto della pagina.",
        "apihelp-edit-param-summary": "Oggetto della modifica. Anche titolo della sezione se $1sezione=new e $1sectiontitle non è impostato.",
@@ -71,6 +73,7 @@
        "apihelp-edit-param-nocreate": "Genera un errore se la pagina non esiste.",
        "apihelp-edit-param-watch": "Aggiungi la pagina agli Osservati Speciali dell'utente corrente.",
        "apihelp-edit-param-unwatch": "Rimuovi la pagina dagli Osservati Speciali dell'utente corrente.",
+       "apihelp-edit-example-edit": "Modifica una pagina.",
        "apihelp-emailuser-description": "Manda un'e-mail ad un utente.",
        "apihelp-emailuser-param-ccme": "Mandami una copia di questa mail.",
        "apihelp-expandtemplates-description": "Espandi tutti i template nel wikitesto.",
        "apihelp-expandtemplates-param-prop": "Quale informazione ottenere.\n\nNota che se non è selezionato alcun valore, il risultato conterrà il codice wiki, ma l'output sarà in un formato obsoleto.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "Il wikitext espanso.",
        "apihelp-expandtemplates-paramvalue-prop-volatile": "Se l'output sia volatile e non debba essere riutilizzato altrove all'interno della pagina.",
+       "apihelp-move-description": "Sposta una pagina.",
+       "apihelp-options-example-reset": "Reimposta tutte le preferenze.",
+       "apihelp-query+blocks-example-simple": "Elenca i blocchi.",
        "apihelp-query+recentchanges-example-simple": "Elenco modifiche recenti.",
+       "apihelp-unblock-description": "Sblocca un utente",
+       "apihelp-undelete-param-title": "Titolo della pagina da ripristinare.",
        "apihelp-upload-example-url": "Carica da un URL.",
+       "api-help-main-header": "Modulo principale",
+       "api-help-license": "Licenza: [[$1|$2]]",
+       "api-help-license-unknown": "Licenza: <span class=\"apihelp-unknown\">sconosciuta</span>",
        "api-help-parameters": "{{PLURAL:$1|Parametro|Parametri}}:",
        "api-help-param-deprecated": "Deprecato.",
        "api-help-param-required": "Questo parametro è obbligatorio.",
+       "api-help-param-multi-max": "Il numero massimo di valori è {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} per i bot).",
        "api-help-param-default": "Predefinito: $1",
        "api-help-param-default-empty": "Predefinito: <span class=\"apihelp-empty\">(vuoto)</span>",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(nessuna descrizione)</span>",
index c99ae2a..267f1d6 100644 (file)
        "apihelp-checktoken-param-type": "調べるトークンの種類。",
        "apihelp-checktoken-param-token": "調べるトークン。",
        "apihelp-checktoken-example-simple": "<kbd>csrf</kbd> トークンの妥当性を調べる。",
+       "apihelp-compare-description": "2つの版間の差分を取得します。\n\n\"from\" と \"to\" の両方の版番号、ページ名、もしくはページIDを渡す必要があります。",
+       "apihelp-compare-param-fromtitle": "比較する1つ目のページ名。",
+       "apihelp-compare-param-fromid": "比較する1つ目のページID。",
+       "apihelp-compare-param-fromrev": "比較する1つ目の版。",
+       "apihelp-compare-param-totitle": "比較する2つ目のページ名。",
+       "apihelp-compare-param-toid": "比較する2つ目のページID。",
+       "apihelp-compare-param-torev": "比較する2つ目の版。",
        "apihelp-compare-example-1": "版1と2の差分を生成する。",
        "apihelp-createaccount-description": "新しい利用者アカウントを作成します。",
        "apihelp-createaccount-param-name": "利用者名。",
        "apihelp-createaccount-param-password": "パスワード (<var>$1mailpassword</var> が設定されると無視されます)。",
+       "apihelp-createaccount-param-domain": "外部認証のドメイン (省略可能)。",
        "apihelp-createaccount-param-token": "最初のリクエストで得られたアカウント作成用トークンです。",
        "apihelp-createaccount-param-email": "利用者の電子メールアドレス (任意)。",
        "apihelp-createaccount-param-realname": "利用者の本名 (省略可能)。",
@@ -53,6 +61,7 @@
        "apihelp-delete-param-reason": "削除の理由です。入力しない場合、自動的に生成された理由が使用されます。",
        "apihelp-delete-param-watch": "そのページを現在の利用者のウォッチリストに追加します。",
        "apihelp-delete-param-unwatch": "そのページを現在の利用者のウォッチリストから除去します。",
+       "apihelp-delete-param-oldimage": "削除する古い画像の[[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]] で取得できるような名前。",
        "apihelp-delete-example-simple": "<kbd>Main Page</kbd> を削除する",
        "apihelp-delete-example-reason": "<kbd>Preparing for move</kbd> という理由で <kbd>Main Page</kbd> を削除する",
        "apihelp-disabled-description": "このモジュールは無効化されています。",
@@ -73,6 +82,7 @@
        "apihelp-edit-param-watch": "そのページを現在の利用者のウォッチリストに追加します。",
        "apihelp-edit-param-unwatch": "そのページを現在の利用者のウォッチリストから除去します。",
        "apihelp-edit-param-prependtext": "このテキストをページの先頭に追加します。$1text をオーバーライドします。",
+       "apihelp-edit-param-appendtext": "このテキストをページの末尾に追加する。$1textを上書きします。\n\n新しい節を追加するにはこのパラメータではなく $1section=newを使用してください。",
        "apihelp-edit-param-undo": "この版を取り消します。$1text, $1prependtext および $1appendtext をオーバーライドします。",
        "apihelp-edit-param-undoafter": "$1undo からこの版までのすべての版を取り消します。設定しない場合、ひとつの版のみ取り消されます。",
        "apihelp-edit-param-token": "このトークンは常に最後のパラメーターとして、または少なくとも $1text パラメーターより後に送信されるべきです。",
@@ -88,7 +98,7 @@
        "apihelp-expandtemplates-description": "ウィキテキストに含まれるすべてのテンプレートを展開します。",
        "apihelp-expandtemplates-param-title": "ページの名前です。",
        "apihelp-expandtemplates-param-text": "変換するウィキテキストです。",
-       "apihelp-expandtemplates-paramvalue-prop-wikitext": "拡大ウィキテキスト。",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "展開されたウィキテキスト。",
        "apihelp-expandtemplates-param-includecomments": "HTMLコメントを出力に含めるかどうか。",
        "apihelp-expandtemplates-example-simple": "ウィキテキスト <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd> を展開する。",
        "apihelp-feedcontributions-description": "利用者の投稿記録フィードを返します。",
        "apihelp-import-example-import": "[[meta:Help:ParserFunctions]] をすべての履歴とともに名前空間100に取り込む。",
        "apihelp-login-param-name": "利用者名。",
        "apihelp-login-param-password": "パスワード。",
-       "apihelp-login-param-domain": "ドメイン(オプション)",
+       "apihelp-login-param-domain": "ドメイン (省略可能)",
        "apihelp-login-param-token": "最初のリクエストで取得したログイントークンです。",
        "apihelp-login-example-gettoken": "ログイントークンを取得する。",
        "apihelp-login-example-login": "ログイン",
        "apihelp-query+pageswithprop-description": "与えられたページプロパティが使用されているすべてのページを一覧表示します。",
        "apihelp-query+pageswithprop-param-limit": "返すページの最大数。",
        "apihelp-query+pageswithprop-example-simple": "<code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code> を使用している最初の10ページを一覧表示する。",
-       "apihelp-query+pageswithprop-example-generator": "Get page info about first 10 pages using <code>_&#95;NOTOC_&#95;</code> を使用している最初の10ページのページ情報を取得する。",
+       "apihelp-query+pageswithprop-example-generator": "<code>_&#95;NOTOC_&#95;</code> を使用している最初の10ページについての追加情報を取得する。",
        "apihelp-query+prefixsearch-description": "ページ名の先頭一致検索を行います。",
        "apihelp-query+prefixsearch-param-search": "検索文字列。",
        "apihelp-query+prefixsearch-param-namespace": "検索する名前空間。",
index 3f841ac..0d4877f 100644 (file)
@@ -26,6 +26,7 @@
        "apihelp-block-param-watchuser": "해당 사용자 또는 IP 주소의 사용자 문서 및 토론 문서를 주시합니다.",
        "apihelp-block-example-ip-simple": "IP <kbd>192.0.2.5</kbd>에 대해 <kbd>First strike</kbd>라는 이유로 3일간 차단하기",
        "apihelp-block-example-user-complex": "사용자 <kbd>Vandal</kbd>을 <kbd>Vandalism</kbd>이라는 이유로 무기한 차단하며 계정 생성 및 이메일 발송을 막기",
+       "apihelp-createaccount-description": "새 사용자 계정을 만듭니다.",
        "apihelp-createaccount-param-name": "사용자 이름",
        "apihelp-delete-description": "문서 삭제",
        "apihelp-delete-example-simple": "<kbd>Main Page</kbd>를 삭제합니다.",
index a51e85c..ba6fb38 100644 (file)
@@ -77,6 +77,8 @@
        "apihelp-edit-param-minor": "En klein Änderong.",
        "apihelp-edit-param-notminor": "Kein klein Änderong.",
        "apihelp-edit-param-bot": "Makeer heh di Änderog als vun enem Bot jemaat.",
+       "apihelp-edit-param-basetimestamp": "Dattom un Zigg för de Ußjangs_Väsjohn, di jenumme weed, öm dubbel Beärbeijdonge bemärke ze künne. Di kam_mer övver di Sigg <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\"[[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]]</code> eruß fenge.",
+       "apihelp-edit-param-starttimestamp": "Dattom un Zigg för wann et Beärbeijde loßß jing, di jenumme weed, öm dubbel Beärbeijdonge bemärke ze künne. Di kam_mer övver di Sigg <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\"[[Special:ApiHelp/main|curtimestamp]]</code> eruß fenge em Momang, woh mem Beärbeijde bejenne deihjt.",
        "apihelp-edit-param-recreate": "Övverjangk alle Fähler övver di Sigg, di en der Zweschezigg fott jeschneße wohd.",
        "apihelp-edit-param-createonly": "Donn di Sigg nit ändere, wann se ald doh es.",
        "apihelp-edit-param-nocreate": "Mäld ene Fähler, wann di Sigg nit doh es.",
        "apihelp-expandtemplates-param-revid": "De Kännong vun dä Väsjohn, för \n„<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\"><nowiki>{{REVISIONID}}</nowiki></code>“ un verwandte Wääte.",
        "apihelp-expandtemplates-paramvalue-prop-categories": "Alle Saachjroppe en dä Quällesigg, di em Wikkitäx vun de ußjejovve Sigg nit vorkumme.",
        "apihelp-expandtemplates-paramvalue-prop-properties": "De Sigge_Eijeschaffte, di vun de Zauberwööter em Wikkitäx faßjelaat wähde.",
+       "apihelp-expandtemplates-paramvalue-prop-ttl": "De längste Zigg noh dä de zweschejescheijscherte jevonge Dahte nmmieh jöltesch sin sulle.",
        "apihelp-expandtemplates-paramvalue-prop-modules": "Alle Moduhle vum <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Delivery system in MediaWiki for the optimized run-time loading and managing of modules\">ResourceLoader</i>, di noh de Paaserfonksjuhne en de Ußjahbe vörkumme sulle. Äntwehder „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">jsconfigvars</kbd>“ udder „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">encodedjsconfigvars</kbd>“ moß mer met „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">modules</kbd>“ zesamme aanforrdere.",
        "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Jitt de Varrejahble fun de Einschtällonge vun heh Sigg, di nur för di Sigg johd sin.",
        "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Jitt de Varrejahble fun de Einschtällonge vun heh Sigg, di nur för di Sigg johd sin, em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"JavaScript Object Notation\">JSON</i>-Fommahd als en Reih vun Zeijsche.",
        "apihelp-import-param-fullhistory": "För et Empottehre us enem andere Wikki: Donn de jannze Verjangeheid empottehre, nit blohß de aktoälle Väsjohn.",
        "apihelp-import-param-templates": "För et Empottehre us enem andere Wikki: Donn all de nühdejje Schablohne met empottehre.",
        "apihelp-import-param-namespace": "En heh dat Appachtemang emmpotehre. Kam_mer nit mem Parramehter „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1rootpage</var>“ zersamme bruche.",
-       "apihelp-import-param-rootpage": "Als Ongersigg vun heh dä Sigg empottehre. Weed ävver övverjange, wann dä der Parramehter „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1namespace</kbd>“ derbei aanjejovve es.",
+       "apihelp-import-param-rootpage": "Als Ongersigg vun heh dä Sigg empottehre. Km_mer nit zosamme met däm Parramehter „<varlang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1namespace</var>“ bruche.",
        "apihelp-import-example-import": "Donn di Sigg „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[meta:Help:ParserFunctions]]</code>“ en et Appachtemang <code>100</code>empottehre, met alle älldere Väsjohne ennjeschloßße.",
        "apihelp-login-param-name": "Metmaacher_Nahme.",
        "apihelp-login-param-password": "Paßwoot.",
        "apihelp-opensearch-param-suggest": "Don nix wann „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var>“ op „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">false</code>“ jesaz es.",
        "apihelp-opensearch-param-redirects": "Wi met Ömleidonge ömjonn?\n;return:Jivv de Ömleidonge sällver uß.\n;resolve:Jiff de Sigg uß, woh de Ömleidong hen jeiht. Dat künnt winnijer wi „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1limit</code>“ Sigge ußjävve.\nTradizonäll es dä Schtandatt „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">return</code>“ för „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1format=json</code>“ un „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">resolve</code>“ för alle anndere.",
        "apihelp-opensearch-param-format": "Et Fommaht zom Ußjävve.",
+       "apihelp-opensearch-param-warningsaserror": "Wann Warnonge opkumme met „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">format=json</kbd>“, dann donn ene Fähler vum <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> ußjävve anschtat se ze övverjonn.",
        "apihelp-opensearch-example-te": "Fengk Sigge, di met <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Te</kbd> aanfange.",
        "apihelp-options-param-reset": "Säz de Enschtällonge op dem Wikki singe Standatt.",
        "apihelp-options-param-optionname": "Dä Nahme vun ene Enschtällong, di op dä Wäät jesaz wähde sulle, dä „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1optionvalue</var>“ aanjitt.",
        "apihelp-options-param-optionvalue": "Ene Wäät vun dä Enschtällong, di vun „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1optionname</var>“ aanjejovve weed. Kann Sänkrääschte Schresche („|“) äänthallde.",
        "apihelp-options-example-reset": "Alle enschtälloonge retuur schtälle.",
+       "apihelp-options-example-change": "Donn de „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skin</kbd>“ un „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">hideminor</kbd>“ Enschtällonge ändere.",
        "apihelp-options-example-complex": "Donn alle Enschtällonge op der Schtandatt säze, dann säz „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skin</kbd>“ un „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">nickname</kbd>“.",
        "apihelp-paraminfo-description": "Holl Aanjahbe övver dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> ier Moduhle.",
        "apihelp-paraminfo-param-helpformat": "Et Fommaht vun de Täxe för Hölp.",
        "apihelp-paraminfo-param-formatmodules": "Leß met de Nahme vun de Moduhle zom Fommatehre (Wäät vum „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">format</var>“-Parramehter). Nemm schtatt dämm „<varlang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1modules</var>“.",
        "apihelp-paraminfo-example-1": "Zisch Aanjahbe övver <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd>, un <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>.",
        "apihelp-parse-param-summary": "De Zersammefaßong för ze pahse.",
+       "apihelp-parse-param-redirects": "Wann „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1page</var>“ udder „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1pageid</var>“ obb_en Ömleijdong jesaz es, donn dä follje.",
        "apihelp-parse-param-prop": "Wat för en Schtöker aan Ennfommazjuhne holle:",
        "apihelp-parse-paramvalue-prop-text": "Jitt dä jepahßde Täx vum Wikkitäx uß.",
        "apihelp-parse-paramvalue-prop-langlinks": "Jitt de Schprohche-Lengks em jepahßde Wikkitäx uß.",
        "apihelp-parse-paramvalue-prop-properties": "Jitt devärse Eijeschafte uß, di em jepahßde Wikkitäx faßjelaat woode sen.",
        "apihelp-parse-param-section": "Holl blohß dann der Ennhalld vun däm Affschnett met dä Nommer, udder wann „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</kbd>“ enjejovve es, maach ene neu Affschnett derbei.",
        "apihelp-parse-param-sectiontitle": "De Övverschreff för dä neuje Afschnet, wann <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">section</var> = <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</kbd> es.\n\nAnders wi beim Beärbeide vun dä Sigg weed dä Parramehter nit dorsch de <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">summary</var> ußjetuusch, wann hä fottjelohße udder läddesch es.",
-       "apihelp-parse-param-disabletoc": "Donn et Ennhaldsverzeijscheneß en de Ußjahbe vottlohze.",
+       "apihelp-parse-param-disableeditsection": "Donn e lenks för Affschnedde ze änndere en de Ußjahbe vum Paaser affschallde.",
+       "apihelp-parse-param-disabletoc": "Donn et Ennhaldsverzeijscheneß en de Ußjahbe vottlohße.",
        "apihelp-parse-example-page": "Donn en Sigg pahse.",
        "apihelp-parse-example-text": "Donn Wikkitäx pahse.",
        "apihelp-parse-example-texttitle": "Donn Wikkitäx pahse, un jiff derför en Övverschreff för en Sigg aan.",
        "apihelp-protect-param-title": "De Övverschreff vun dä Sigg zom Schöze udder Freijävve. Kam_mer nit zesamme met\n„<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1pageid</code>“ bruche.",
        "apihelp-protect-param-pageid": "De Kännong vun dä Sigg zom Schöze udder Freijävve. Kam_mer nit zesamme met\n„<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1pageid</code>“ bruche.",
        "apihelp-protect-param-reason": "Der Jrond för et Schöze udder Freijävve.",
+       "apihelp-protect-param-cascade": "Donn en Schotz-Kaskahd zohlohße, alsu ene Schoz för ennjeföhschte Schablohne un upjerohfe Bellder vun dä Sigg. Deiht nix, wann keine von dä aanjejovve Zoote Schoz en Kaskahd zohlöht.",
        "apihelp-protect-example-protect": "Donn en Sigg schöze.",
        "apihelp-purge-param-forcelinkupdate": "Bräng de Tabälle met de lengks obb ene neue Schtand.",
+       "apihelp-purge-example-simple": "Donn fö de Sigge „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“ un „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">API</kbd>“ de zweschejeschpeijscherte Väsjohn fottschmiiße.",
+       "apihelp-purge-example-generator": "Donn fö de eezte zehn Sigge em Schtanndadd_Appachtemang de zweschejeschpeijscherte Väsjohn fottschmiiße.",
        "apihelp-query-param-prop": "Wat för en Eijeschaffte holle för de affjerohchte Sigge.",
        "apihelp-query-param-list": "Wat för en Leßte holle.",
        "apihelp-query-param-meta": "Wat för en Metta_Dahte ze holle.",
        "apihelp-query+pageswithprop-description": "Donn alle Sigge met bechtemmpte Sigge_Eijeschaff opleßte.",
        "apihelp-query+pageswithprop-param-limit": "De jrüüßte Zahl Sigge för ußzejävve.",
        "apihelp-query+pageswithprop-param-dir": "En wälsche Reihjefollsch opleßte.",
+       "apihelp-query+pageswithprop-example-generator": "Holl zohsäzlejje Aanjahbe övver de eezde zehn Sigge, woh <code>_&#95;NOTOC_&#95;</code> dren vörkütt.",
        "apihelp-query+prefixsearch-description": "Söhk nohm Aanfang vun dä Övverschreffte vun de Sigge.",
        "apihelp-query+prefixsearch-param-search": "Noh wat söhke?",
        "apihelp-query+prefixsearch-param-namespace": "En wällschem Appachtemang söhke.",
        "apihelp-query+watchlist-param-end": "Et Dattum un Uhrzigg, bes wann opzälle.",
        "apihelp-query+watchlist-param-user": "Donn blohß Änderonge vun heh däm Metmaacher opleßte.",
        "apihelp-query+watchlist-param-excludeuser": "Donn kein Änderonge vun heh däm Metmaacher opleßte.",
+       "apihelp-query+watchlist-paramvalue-prop-title": "Mähd en Övverschhreff övver di Sigg.",
        "apihelp-query+watchlistraw-description": "Donn alle Sigge uß dem aktälle Metmaacher sing Oppaßleß holle.",
        "apihelp-query+watchlistraw-param-namespace": "Donn blohß Sigge en heh däm Appachtemang opleßte.",
        "apihelp-query+watchlistraw-example-simple": "Donn alle Sigge uß dem aktälle Metmaacher sing Oppaßleß opleßte.",
diff --git a/includes/api/i18n/ky.json b/includes/api/i18n/ky.json
new file mode 100644 (file)
index 0000000..3761975
--- /dev/null
@@ -0,0 +1,19 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Janatkg"
+               ]
+       },
+       "apihelp-block-description": "Колдонуучуну бөгөттөө",
+       "apihelp-block-param-reason": "Бөгөттөө себеби.",
+       "apihelp-block-example-ip-simple": " <kbd>192.0.2.5</kbd> IP дарегин үч күнгө <kbd>First strike</kbd> себеби менен бөгөттөө.",
+       "apihelp-checktoken-param-token": "Текшерүү белгиси.",
+       "apihelp-createaccount-param-name": "Колдонуучунун аты:",
+       "apihelp-createaccount-param-email": "Колдонуучунун email дареги (милдеттүү эмес)",
+       "apihelp-createaccount-param-realname": "Колдонуучунун чыныгы аты (милдеттүү эмес)",
+       "apihelp-delete-description": "Баракты өчүрүү",
+       "apihelp-delete-example-simple": "<kbd>Башбарагын</kbd> өчүрүү.",
+       "apihelp-edit-description": "Барактарды түзүү жана оңдоо.",
+       "apihelp-edit-param-text": "Барактын мазмуну.",
+       "apihelp-edit-param-minor": "Майда оңдоо."
+}
index 1c79b58..426f580 100644 (file)
@@ -95,6 +95,8 @@
        "apihelp-query+usercontribs-description": "All Ännerunge vun engem Benotzer kréien.",
        "apihelp-query+watchlist-param-user": "Nëmmen Ännerunge vun dësem Benotzer opzielen.",
        "apihelp-query+watchlist-param-excludeuser": "Ännerunge vun dësem Benotzer net opzielen.",
+       "apihelp-query+watchlist-paramvalue-prop-title": "Setzt den Titel vun der Säit derbäi.",
+       "apihelp-query+watchlist-paramvalue-prop-user": "Setzt de Benotzer derbäi deen d'Ännerung gemaach huet.",
        "apihelp-query+watchlistraw-param-show": "Nëmmen Elementer opzielen déi dëse Critèren entspriechen.",
        "apihelp-query+watchlistraw-example-simple": "Säite vum aktuelle Benotzer senger Iwwerwaachungslëscht opzielen",
        "apihelp-revisiondelete-description": "Versioune läschen a restauréieren.",
index c4ade1a..11c0a32 100644 (file)
@@ -36,6 +36,7 @@
        "apihelp-emailuser-param-ccme": "Me mandar una còpia d'aqueste corrièr electronic.",
        "apihelp-expandtemplates-param-title": "Títol de la pagina.",
        "apihelp-expandtemplates-param-text": "Wikitèxte de convertir.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "Lo wikitèxte desvolopat.",
        "apihelp-feedcontributions-param-feedformat": "Lo format del flux.",
        "apihelp-feedcontributions-param-year": "A partir de l’annada (e mai recent) :",
        "apihelp-feedcontributions-param-month": "A partir del mes (e mai recent) :",
        "apihelp-parse-example-page": "Analisar una pagina.",
        "apihelp-parse-example-text": "Analisar lo wikitèxte.",
        "apihelp-parse-example-summary": "Analisar un resumit.",
+       "apihelp-patrol-description": "Patrolhar una pagina o una revision.",
        "apihelp-protect-example-protect": "Protegir una pagina",
        "apihelp-query-param-list": "Quinas listas obténer.",
        "apihelp-query-param-meta": "Quinas metadonadas obténer.",
+       "apihelp-query+allcategories-description": "Enumerar totas las categorias.",
        "apihelp-query+alldeletedrevisions-param-from": "Aviar la lista a aqueste títol.",
        "apihelp-query+allimages-param-sort": "Proprietat per la quala cal triar.",
        "apihelp-query+blocks-example-simple": "Listar los blocatges",
-       "apihelp-query+blocks-example-users": "Listar los blocatges dels utilizaires <kbd>Alice</kbd> e <kbd>Bob</kbd>."
+       "apihelp-query+blocks-example-users": "Listar los blocatges dels utilizaires <kbd>Alice</kbd> e <kbd>Bob</kbd>.",
+       "apihelp-query+imageinfo-param-urlheight": "Similar a $1urlwidth.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Tèxte de la revision.",
+       "apihelp-query+revisions+base-paramvalue-prop-tags": "Balisas de la revision.",
+       "apihelp-tag-param-reason": "Motiu de la modificacion.",
+       "apihelp-unblock-description": "Desblocar un utilizaire.",
+       "apihelp-unblock-param-reason": "Motiu del desblocatge.",
+       "apihelp-unblock-example-id": "Levar lo blocatge d’ID #<kbd>105</kbd>.",
+       "apihelp-userrights-param-user": "Nom d'utilizaire.",
+       "apihelp-userrights-param-userid": "ID de l'utilizaire.",
+       "api-help-main-header": "Modul principal",
+       "api-help-source": "Font : $1",
+       "api-help-source-unknown": "Font : <span class=\"apihelp-unknown\">desconeguda</span>",
+       "api-help-license": "Licéncia : [[$1|$2]]",
+       "api-help-license-noname": "Licéncia : [[$1|Veire lo ligam]]",
+       "api-help-license-unknown": "Licéncia : <span class=\"apihelp-unknown\">desconeguda</span>",
+       "api-help-parameters": "{{PLURAL:$1|Paramètre|Paramètres}} :",
+       "api-help-param-deprecated": "Obsolet.",
+       "api-help-datatypes-header": "Tipe de donadas",
+       "api-help-param-default": "Per defaut : $1",
+       "api-credits-header": "Mercejaments"
 }
index 37d269a..e295886 100644 (file)
        "apihelp-parse-param-summary": "Powód do analizy.",
        "apihelp-parse-paramvalue-prop-wikitext": "Zwróć oryginalny wikitext, który został przeanalizowany.",
        "apihelp-parse-param-preview": "Analizuj w trybie podglądu.",
-       "apihelp-parse-param-disabletoc": "Wyłącz spis treści na wyjściu.",
+       "apihelp-parse-param-disabletoc": "Pomiń spis treści na wyjściu.",
        "apihelp-parse-example-page": "Przeanalizuj stronę.",
        "apihelp-parse-example-text": "Analizuj wikitext.",
        "apihelp-parse-example-summary": "Analizuj powód.",
        "apihelp-patrol-example-revid": "Sprawdź edycje.",
        "apihelp-protect-description": "Zmień poziom zabezpieczenia strony.",
        "apihelp-protect-param-reason": "Powód zabezpieczania/odbezpieczania.",
-       "apihelp-protect-param-cascade": "Włacz ochronę kaskadową (chronione są wszystkie strony zawarte w tej stronie). Ignorowane jeśli wszystkie poziomy ochrony nie wspierają kaskadowania.",
+       "apihelp-protect-param-cascade": "Włącz ochronę kaskadową (chronione są wszystkie osadzone szablony i obrazki na tej stronie). Ignorowane, jeśli żaden z danych poziomów ochrony nie wspiera kaskadowania.",
        "apihelp-protect-example-protect": "Zabezpiecz stronę",
        "apihelp-protect-example-unprotect": "Odbezpiecz stronę ustawiając ograniczenia na <kbd>wszystkie</kbd>.",
        "apihelp-protect-example-unprotect2": "Odbezpiecz stronę ustawiając brak ograniczeń.",
        "apihelp-query+linkshere-param-limit": "Ilość do zwrócenia.",
        "apihelp-query+logevents-description": "Pobierz eventy z logu.",
        "apihelp-query+logevents-example-simple": "Lista ostatnich zarejestrowanych zdarzeń.",
+       "apihelp-query+pageswithprop-example-generator": "Pobierz dodatkowe informacje o pierwszych 10 stronach wykorzystując <code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+prefixsearch-param-search": "Wyszukaj tekst.",
        "apihelp-query+prefixsearch-param-namespace": "Przestrzenie nazw do przeszukania.",
        "apihelp-query+prefixsearch-param-limit": "Maksymalna liczba zwracanych wyników.",
        "apihelp-query+recentchanges-example-simple": "Lista ostatnich zmian.",
        "apihelp-query+redirects-param-limit": "Ile przekierowań zwrócić.",
        "apihelp-query+revisions+base-paramvalue-prop-ids": "Identyfikator wersji.",
+       "apihelp-query+revisions+base-paramvalue-prop-flags": "Znaczniki wersji (drobne).",
+       "apihelp-query+revisions+base-paramvalue-prop-timestamp": "Znacznik czasu wersji.",
+       "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (base 16) wersji.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Tekst wersji.",
+       "apihelp-query+revisions+base-paramvalue-prop-tags": "Znaczniki wersji.",
        "apihelp-query+revisions+base-param-limit": "Ograniczenie na liczbę wersji, które będą zwrócone.",
        "apihelp-query+search-description": "Wykonaj wyszukiwanie pełnotekstowe.",
        "apihelp-query+search-param-info": "Które metadane zwrócić.",
        "apihelp-query+templates-param-limit": "Ile szablonów zwrócić?",
        "apihelp-query+transcludedin-param-limit": "Ile zwrócić.",
        "apihelp-query+watchlist-param-excludeuser": "Nie wyświetlaj zmian wykonanych przez tego użytkownika.",
+       "apihelp-query+watchlist-paramvalue-prop-title": "Dodaje tytuł strony.",
+       "apihelp-query+watchlist-paramvalue-prop-user": "Dodaje użytkownika, który wykonał edycję.",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "Dodaje komentarz do edycji.",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "Dodaje znacznik czasu edycji.",
+       "apihelp-query+watchlist-paramvalue-prop-sizes": "Dodaje starą i nową długość strony.",
        "apihelp-tag-param-reason": "Powód zmiany.",
        "apihelp-unblock-param-reason": "Powód odblokowania.",
        "apihelp-undelete-param-reason": "Powód przywracania.",
index 7f5b7b4..95562d8 100644 (file)
@@ -55,7 +55,7 @@
        "apihelp-compare-param-torev": "{{doc-apihelp-param|compare|torev}}",
        "apihelp-compare-example-1": "{{doc-apihelp-example|compare}}",
        "apihelp-createaccount-description": "{{doc-apihelp-description|createaccount}}",
-       "apihelp-createaccount-param-name": "{{doc-apihelp-param|createaccount|name}}",
+       "apihelp-createaccount-param-name": "{{doc-apihelp-param|createaccount|name}}\n{{Identical|Username}}",
        "apihelp-createaccount-param-password": "{{doc-apihelp-param|createaccount|password}}",
        "apihelp-createaccount-param-domain": "{{doc-apihelp-param|createaccount|domain}}",
        "apihelp-createaccount-param-token": "{{doc-apihelp-param|createaccount|token}}",
        "apihelp-login-param-domain": "{{doc-apihelp-param|login|domain}}",
        "apihelp-login-param-token": "{{doc-apihelp-param|login|token}}",
        "apihelp-login-example-gettoken": "{{doc-apihelp-example|login}}",
-       "apihelp-login-example-login": "{{doc-apihelp-example|login}}",
+       "apihelp-login-example-login": "{{doc-apihelp-example|login}}\n{{Identical|Log in}}",
        "apihelp-logout-description": "{{doc-apihelp-description|logout}}",
        "apihelp-logout-example-logout": "{{doc-apihelp-example|logout}}",
        "apihelp-managetags-description": "{{doc-apihelp-description|managetags}}",
        "apihelp-query+watchlist-param-user": "{{doc-apihelp-param|query+watchlist|user}}",
        "apihelp-query+watchlist-param-excludeuser": "{{doc-apihelp-param|query+watchlist|excludeuser}}",
        "apihelp-query+watchlist-param-limit": "{{doc-apihelp-param|query+watchlist|limit}}",
-       "apihelp-query+watchlist-param-prop": "{{doc-apihelp-param|query+watchlist|prop}}",
+       "apihelp-query+watchlist-param-prop": "{{doc-apihelp-param|query+watchlist|prop|paramvalues=1}}",
+       "apihelp-query+watchlist-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+watchlist|prop|ids}}",
+       "apihelp-query+watchlist-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+watchlist|prop|title}}",
+       "apihelp-query+watchlist-paramvalue-prop-flags": "{{doc-apihelp-paramvalue|query+watchlist|prop|flags}}",
+       "apihelp-query+watchlist-paramvalue-prop-user": "{{doc-apihelp-paramvalue|query+watchlist|prop|user}}",
+       "apihelp-query+watchlist-paramvalue-prop-userid": "{{doc-apihelp-paramvalue|query+watchlist|prop|userid}}",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "{{doc-apihelp-paramvalue|query+watchlist|prop|comment}}",
+       "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "{{doc-apihelp-paramvalue|query+watchlist|prop|parsedcomment}}",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "{{doc-apihelp-paramvalue|query+watchlist|prop|timestamp}}",
+       "apihelp-query+watchlist-paramvalue-prop-patrol": "{{doc-apihelp-paramvalue|query+watchlist|prop|patrol}}",
+       "apihelp-query+watchlist-paramvalue-prop-sizes": "{{doc-apihelp-paramvalue|query+watchlist|prop|sizes}}",
+       "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "{{doc-apihelp-paramvalue|query+watchlist|prop|notificationtimestamp}}",
+       "apihelp-query+watchlist-paramvalue-prop-loginfo": "{{doc-apihelp-paramvalue|query+watchlist|prop|loginfo}}",
        "apihelp-query+watchlist-param-show": "{{doc-apihelp-param|query+watchlist|show}}",
        "apihelp-query+watchlist-param-type": "{{doc-apihelp-param|query+watchlist|type}}",
        "apihelp-query+watchlist-param-owner": "{{doc-apihelp-param|query+watchlist|owner}}",
index c4c7045..2accd1f 100644 (file)
@@ -7,7 +7,8 @@
                        "Kaganer",
                        "Mariya",
                        "Дмитрий",
-                       "WindEwriX"
+                       "WindEwriX",
+                       "Ochilov"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Документация]]\n* [[mw:API:FAQ|ЧаВО]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Почтовая рассылка]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Новости API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Ошибки и запросы]\n</div>\n<strong>Статус:</strong> Все отображаемые на этой странице функции должны работать, однако API находится в статусе активной разработки, и может измениться в любой момент. Подпишитесь на  [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ почтовую рассылку mediawiki-api-announce], чтобы быть в курсе обновлений.\n\n<strong>Ошибочные запросы:</strong> Если API получает запрос с ошибкой, вернётся заголовок HTTP с ключом \"MediaWiki-API-Error\", после чего значение заголовка и код ошибки будут отправлены обратно и установлены в то же значение. Более подробную информацию см. [[mw:API:Errors_and_warnings|API: Ошибки и предупреждения]].",
@@ -26,6 +27,7 @@
        "apihelp-block-param-anononly": "Блокировать только анонимных пользователей (т. е. запретить анонимные правки для этого IP-адреса).",
        "apihelp-block-param-nocreate": "Запретить создание учётных записей.",
        "apihelp-block-param-watchuser": "Следить за страницей пользователя или IP-участника и страницей обсуждения.",
+       "apihelp-checktoken-param-type": "Тип маркера проходит тестирование.",
        "apihelp-checktoken-param-token": "токен для проверки",
        "apihelp-checktoken-param-maxtokenage": "Максимально допустимый возраст токена (в секундах).",
        "apihelp-checktoken-example-simple": "Проверить годность <kbd>csrf</kbd>-токена.",
        "apihelp-edit-param-notminor": "Значительное изменение (обычная, не «малая», правка).",
        "apihelp-edit-param-bot": "Пометить правку как сделанную ботом.",
        "apihelp-edit-param-createonly": "Не редактировать страницу, если она уже существует.",
+       "apihelp-edit-param-nocreate": "Выбрасывать ошибку, если страницы не существует.",
        "apihelp-edit-param-watch": "Добавить страницу к текущему списку наблюдения пользователя.",
        "apihelp-edit-param-unwatch": "Удалить страницу из списка наблюдения текущего пользователя.",
+       "apihelp-edit-param-redirect": "Автоматически разрешать редиректы.",
+       "apihelp-edit-param-contentformat": "Формат сериализации содержимого, используемый для ввода текста.",
        "apihelp-edit-example-edit": "Редактировать страницу",
        "apihelp-emailuser-description": "Письмо участнику",
        "apihelp-emailuser-param-target": "Адресат электронного письма",
@@ -75,6 +80,8 @@
        "apihelp-emailuser-example-email": "Отправить письмо пользователю <kbd>WikiSysop</kbd> с текстом <kbd>контентом</kbd>.",
        "apihelp-expandtemplates-description": "Разворачивает все шаблоны в wikitext.",
        "apihelp-expandtemplates-param-title": "Заголовок страницы.",
+       "apihelp-expandtemplates-param-text": "Викитекст для конвертирования",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "Расширенный викитекст",
        "apihelp-expandtemplates-paramvalue-prop-parsetree": "Дерево разбора XML входных данных.",
        "apihelp-feedcontributions-param-year": "От года (и ранее).",
        "apihelp-feedcontributions-param-month": "От месяца (и ранее).",
        "apihelp-none-description": "Нечего выводить",
        "apihelp-php-description": "Выходные данные в сериализованном формате PHP.",
        "apihelp-phpfm-description": "Выходные данные в сериализованном формате PHP (pretty-print in HTML).",
-       "apihelp-wddx-description": "Выходные данные в формате WDDX.",
        "apihelp-xml-description": "Выходные данные в формате XML.",
        "apihelp-yaml-description": "Выходные данные в формате yaml.",
        "api-format-title": "Результат MediaWiki API",
index 7784491..7ae00b3 100644 (file)
        "api-help-parameters": "{{PLURAL:$1|Parameter|Parametrar}}:",
        "api-help-param-deprecated": "Föråldrad.",
        "api-help-param-required": "Denna parameter är obligatorisk.",
-       "api-help-param-list": "{{PLURAL:$1|1=ett värde|2=värden (separade med \"{{!}}\")}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=Ett värde|2=Värden (separerade med <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Måste vara tom|Kan vara tom, eller $2}}",
        "api-help-param-limit": "Inte mer än $1 tillåts.",
        "api-help-param-limit2": "Inte mer än $1 ($2 för robotar) tillåts."
index 528f0b6..b439fb0 100644 (file)
@@ -6,15 +6,98 @@
                        "Ahonc"
                ]
        },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Документація]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Список розсилки]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Оголошення API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Баґи і запити]\n</div>\n<strong>Статус:</strong> Усі функції, вказані на цій сторінці, мають працювати, але API далі перебуває в активній розробці і може змінитися у будь-який момент. Підпишіться на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ список розсилки mediawiki-api-announce], щоб помічати оновлення.\n\n<strong>Хибні запити:</strong> Коли до API надсилаються хибні запити, буде відіслано HTTP-шапку з ключем «MediaWiki-API-Error», а тоді і значення шапки, і код помилки, надіслані назад, будуть встановлені з тим же значенням. Більше інформації див. на [[mw:API:Errors_and_warnings|API: Errors and warnings]].",
        "apihelp-main-param-action": "Яку дію виконати.",
        "apihelp-main-param-format": "Формат виводу.",
+       "apihelp-main-param-maxlag": "Максимальна затримка може використовуватися, коли MediaWiki інстальовано на реплікований кластер бази даних. Щоб зберегти дії, які спричиняють більшу затримку реплікації, цей параметр може змусити клієнт почекати, поки затримка реплікації не буде меншою за вказане значення. У випадку непомірної затримки, видається код помилки <samp>maxlag</samp> з повідомленням на зразок <samp>Очікування на $host: $lag секунд(и) затримки</samp>.<br />Див. [[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]] для детальнішої інформації.",
+       "apihelp-main-param-smaxage": "Встановити <code>s-maxage</code> HTTP кеш-контроль заголовок на стільки секунд. Помилки ніколи не кешуються.",
+       "apihelp-main-param-maxage": "Встановити <code>max-age</code> HTTP кеш-контроль заголовок на стільки секунд. Помилки ніколи не кешуються.",
+       "apihelp-main-param-assert": "Перевірити, що користувач увійшов у систему, якщо задано <kbd>user</kbd>, або має права бота, якщо задано <kbd>bot</kbd>.",
+       "apihelp-main-param-requestid": "Будь-яке значення, вказане тут, буде включене у відповідь. Може використовуватися, щоб відрізняти запити.",
+       "apihelp-main-param-servedby": "Включити в результати ім'я хоста, який обробив запит.",
+       "apihelp-main-param-curtimestamp": "Включити в результат поточну мітку часу.",
+       "apihelp-main-param-origin": "При доступі до API з використанням крос-доменного AJAX-запиту (CORS), задайте параметру значення вихідного домена. Він має бути включений у будь-який попередній запит і таким чином мусить бути частиною запиту URI (не тіла POST). Він повинен точно співпадати з одним з виходів у заголовку <code>Origin</code>, тобто бути заданим чимось на зразок <kbd>https://uk.wikipedia.org</kbd> або <kbd>https://meta.wikimedia.org</kbd>. Якщо цей параметр не співпадає з заголовком <code>Origin</code>, повернеться помилка 403. Якщо цей параметр співпадає з заголовком <code>Origin</code> і вихід знаходиться у білому списку, буде встановлено заголовок <code>Access-Control-Allow-Origin</code>.",
+       "apihelp-main-param-uselang": "Мова, що використовується для перекладу повідомлень. Список кодів можна знайти на <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> з <kbd>siprop=languages</kbd> або вказати <kbd>user</kbd> на використання поточного налаштування мови користувача, або вказати <kbd>content</kbd> на використання мови вмісту цієї вікі.",
        "apihelp-block-description": "Заблокувати користувача.",
        "apihelp-block-param-user": "Ім'я користувача, IP-адреса або діапазон IP-адрес для блокування.",
+       "apihelp-block-param-expiry": "Закінчення часу. Може бути відносним (напр., <kbd>5 місяців</kbd> або <kbd>2 тижні</kbd>) чи абсолютним (напр., <kbd>2014-09-18T12:34:56Z</kbd>). Якщо вказано <kbd>infinite</kbd>, <kbd>indefinite</kbd> або <kbd>never</kbd>, блокування не закінчиться ніколи.",
        "apihelp-block-param-reason": "Причина блокування.",
+       "apihelp-block-param-anononly": "Блокувати тільки анонімних користувачів (тобто відключити можливість анонімних редагувань з цієї IP-адреси).",
        "apihelp-block-param-nocreate": "Заборонити створення облікових записів.",
+       "apihelp-block-param-autoblock": "Автоматично блокувати IP-адреси, які цей користувач використовував останніми, та будь-які наступні адреси, з яких він спробує зайти в систему.",
+       "apihelp-block-param-noemail": "Заборонити користувачеві надсилати електронні листи через вікі. (Вимагає права <code>blockemail</code>).",
+       "apihelp-block-param-hidename": "Приховати ім'я користувача з журналу блокувань. (Вимагає права <code>hideuser</code>).",
+       "apihelp-block-param-allowusertalk": "Дозволити користувачу редагувати власну сторінку обговорення (залежить від <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-reblock": "Якщо користувач уже заблокований, переписати наявне блокування.",
+       "apihelp-block-param-watchuser": "Спостерігати за сторінкою користувача чи IP-адреси і сторінкою обговорення.",
+       "apihelp-block-example-ip-simple": "Блокувати IP-адресу <kbd>192.0.2.5</kbd> на три дні з причиною <kbd>First strike</kbd>.",
+       "apihelp-block-example-user-complex": "Блокувати користувача<kbd>Vandal</kbd> на невизначений термін з причиною <kbd>Vandalism</kbd> і заборонити створення нових облікових записів та надсилання електронної пошти.",
+       "apihelp-checktoken-description": "Перевірити коректність токена з <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
+       "apihelp-checktoken-param-type": "Тип токена, який тестується.",
+       "apihelp-checktoken-param-token": "Токен для тесту.",
+       "apihelp-checktoken-param-maxtokenage": "Максимально допустимий вік токена (у секундах).",
+       "apihelp-checktoken-example-simple": "Перевірити дійсність токена <kbd>csrf</kbd>.",
+       "apihelp-clearhasmsg-description": "Очищає прапорець <code>hasmsg</code> для поточного користувача.",
+       "apihelp-clearhasmsg-example-1": "Очистити прапорець <code>hasmsg</code> для поточного користувача.",
+       "apihelp-compare-description": "Отримати порівняння двох сторінок.\n\nПовинні бути номер версії, назва сторінки або ID сторінки для «від» і «до».",
+       "apihelp-compare-param-fromtitle": "Перший заголовок для порівняння.",
+       "apihelp-compare-param-fromid": "Перший ID сторінки для порівняння.",
+       "apihelp-compare-param-fromrev": "Перша версія для порівняння.",
+       "apihelp-compare-param-totitle": "Другий заголовок для порівняння.",
+       "apihelp-compare-param-toid": "Другий ID сторінки для порівняння.",
+       "apihelp-compare-param-torev": "Друга версія для порівняння.",
+       "apihelp-compare-example-1": "Створити порівняння версій 1 і 2.",
+       "apihelp-createaccount-description": "Створити новий обліковий запис користувача.",
        "apihelp-createaccount-param-name": "Ім'я користувача.",
        "apihelp-createaccount-param-password": "Пароль (ігнорується, якщо встановлено <var>$1mailpassword</var>).",
        "apihelp-createaccount-param-domain": "Домен для зовнішньої аутентифікації (опціонально).",
+       "apihelp-createaccount-param-token": "Токен створення облікового запису отримано у першому запиті.",
+       "apihelp-createaccount-param-email": "Адреса електронної пошти користувача (необов'язково).",
+       "apihelp-createaccount-param-realname": "Справжнє ім'я користувача (необов'язково).",
+       "apihelp-createaccount-param-mailpassword": "Якщо встановлено будь-яке значення, користувачеві буде надіслано випадковий пароль.",
+       "apihelp-createaccount-param-reason": "Необов'язкова причина для створення облікового запису, яка буде записана в журнал.",
+       "apihelp-createaccount-param-language": "Код мови для встановлення за замовчуванням для користувача (необов'язково, за замовчуванням — мова вмісту).",
+       "apihelp-createaccount-example-pass": "Створити користувача <kbd>testuser</kbd> з паролем <kbd>test123</kbd>.",
+       "apihelp-createaccount-example-mail": "Створити користувача <kbd>testmailuser</kbd> і надіслати на електронну пошту випадково-згенерований пароль.",
+       "apihelp-delete-description": "Вилучити сторінку.",
+       "apihelp-delete-param-title": "Назва сторінки для вилучення. Не можна використати разом з <var>$1pageid</var>.",
+       "apihelp-delete-param-pageid": "ID-сторінки на вилучення. Не можна використати разом з <var>$1title</var>.",
+       "apihelp-delete-param-reason": "Причина вилучення. Якщо не вказана, буде використано автоматично-згенеровану.",
+       "apihelp-delete-param-watch": "Додати сторінку у список спостереження поточного користувача.",
+       "apihelp-delete-param-watchlist": "Беззастережно додати або вилучити сторінку зі списку спостереження поточного користувача, використати налаштування або не змінювати спостереження.",
+       "apihelp-delete-param-unwatch": "Вилучити сторінку зі списку спостереження поточного користувача.",
+       "apihelp-delete-param-oldimage": "Назва старого зображення на вилучення, як вказано у [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
+       "apihelp-delete-example-simple": "Вилучити <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Вилучити <kbd>Main Page</kbd> з причиною <kbd>Preparing for move</kbd>.",
+       "apihelp-disabled-description": "Цей модуль було вимкнено.",
+       "apihelp-edit-description": "Створювати і редагувати сторінки.",
+       "apihelp-edit-param-title": "Назва сторінки для редагування. Не можна використати разом з <var>$1pageid</var>.",
+       "apihelp-edit-param-pageid": "ID-сторінки для редагування. Не можна використати разом з <var>$1title</var>.",
+       "apihelp-edit-param-section": "Номер розділу. <kbd>0</kbd> для вступного розділу, <kbd>new</kbd> для нового розділу.",
+       "apihelp-edit-param-sectiontitle": "Назва нового розділу.",
+       "apihelp-edit-param-text": "Вміст сторінки.",
+       "apihelp-edit-param-summary": "Опис редагування. Також заголовок розділу, коли $1section=new і коли $1sectiontitle не вказано.",
+       "apihelp-edit-param-tags": "Змінити теги для версії.",
+       "apihelp-edit-param-minor": "Незначне редагування.",
+       "apihelp-edit-param-notminor": "Не «незначне» редагування.",
+       "apihelp-edit-param-bot": "Помітити редагування як зроблене ботом.",
+       "apihelp-edit-param-basetimestamp": "Мітка часу для основної версії, використовується для виявлення конфлікту редагувань. Може бути отримана через [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
+       "apihelp-edit-param-starttimestamp": "Мітка часу, з якого почався процес редагування, використовується для виявлення конфліктів редагувань. Відповідне значення можна отримати з допомогою <var>[[Special:ApiHelp/main|curtimestamp]]</var> на початку процесу редагування (напр., коли завантажується вміст сторінки для редагування).",
+       "apihelp-edit-param-recreate": "Відкинути будь-які помилки щодо цієї сторінки, вилучені нещодавно.",
+       "apihelp-edit-param-createonly": "Не редагувати сторінку, якщо вона вже існує.",
+       "apihelp-edit-param-nocreate": "Видати помилку, якщо сторінка не існує.",
+       "apihelp-edit-param-watch": "Додати сторінку у список спостереження поточного користувача.",
+       "apihelp-edit-param-unwatch": "Вилучити сторінку зі списку спостереження поточного користувача.",
+       "apihelp-edit-param-watchlist": "Беззастережно додати або вилучити сторінку зі списку спостереження поточного користувача, використати налаштування або не змінювати спостереження.",
+       "apihelp-edit-param-md5": "MD5-хеш у параметрі $1text або параметрах $1prependtext і $1appendtext разом. Якщо вказано, редагування буде зроблене, лише якщо хеш правильний.",
+       "apihelp-edit-param-prependtext": "Додати цей текст на початок сторінки. Замінює $1text.",
+       "apihelp-edit-param-appendtext": "Додати цей текст у кінець сторінки. Замінює $1text.\n\nЩоб додати новий розділ, замість цього параметра використайте $1section=new.",
+       "apihelp-edit-param-undo": "Скасувати цю версію. Замінює $1text, $1prependtext та $1appendtext.",
+       "apihelp-edit-param-undoafter": "Скасувати усі версії від $1undo до цієї. Якщо не вказано, просто скасувати одну версію.",
+       "apihelp-edit-param-redirect": "Автоматично виправляти перенаправлення.",
+       "apihelp-edit-param-contentformat": "Формат серіалізації вмісту, використовуваний для введеного тексту.",
+       "apihelp-edit-param-contentmodel": "Модель вмісту нового вмісту.",
+       "apihelp-edit-param-token": "Токен завжди має надсилатися як останній параметр або хоча б після параметра $1text.",
        "apihelp-edit-example-edit": "Редагувати сторінку",
        "apihelp-edit-example-prepend": "Додати зміст на початок сторінки",
        "apihelp-edit-example-undo": "Скасувати версії з 13579 по 13585 з автоматичним описом змін",
        "apihelp-emailuser-param-subject": "Заголовок теми.",
        "apihelp-emailuser-param-text": "Тіло листа.",
        "apihelp-emailuser-param-ccme": "Надіслати копію цього повідомлення мені.",
-       "apihelp-emailuser-example-email": "Відправити листа користувачу \"WikiSysop\" з текстом \"Вміст\"",
+       "apihelp-emailuser-example-email": "Відправити листа користувачу <kbd>WikiSysop</kbd> з текстом <kbd>Вміст</kbd>.",
        "apihelp-expandtemplates-description": "Розгортає усі шаблони у вікітекст.",
        "apihelp-expandtemplates-param-title": "Заголовок сторінки.",
        "apihelp-expandtemplates-param-text": "Вікітекст для перетворення.",
+       "apihelp-expandtemplates-param-revid": "ID версії, для <nowiki>{{REVISIONID}}</nowiki> і подібних змінних.",
+       "apihelp-expandtemplates-param-prop": "Яку інформацію отримувати.\n\nЗважте, що якщо не вибрано значень, результат міститиме вікітекст, але буде в застарілому форматі.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "Розгорнений вікітекст.",
+       "apihelp-expandtemplates-paramvalue-prop-categories": "Будь-які категорії, наявні у джерелі, але не виведені у вікітексті результату.",
+       "apihelp-expandtemplates-paramvalue-prop-properties": "Властивості сторінки, визначені розгорненими магічними словами у вікітексті.",
+       "apihelp-expandtemplates-paramvalue-prop-volatile": "Чи результат тривкий і не повинен повторно використовуватись десь іще на сторінці.",
+       "apihelp-expandtemplates-paramvalue-prop-ttl": "Максимальний час, після якого кеш результату стане недійсним.",
+       "apihelp-expandtemplates-paramvalue-prop-modules": "Будь-які модулі ResourceLoader, які парсерні функції запитують на додання у результат. Або <kbd>jsconfigvars</kbd>, або <kbd>encodedjsconfigvars</kbd> має бути запитано разом з <kbd>modules</kbd>.",
+       "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Дає конфігурації JavaScript змінні, притаманні для сторінки.",
+       "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Дає конфігурації JavaScript змінні, притаманні для сторінки, як рядок JSON.",
+       "apihelp-expandtemplates-paramvalue-prop-parsetree": "Дерево парсу XML вхідних даних.",
+       "apihelp-expandtemplates-param-includecomments": "Чи включати HTML-коментарі у результат.",
+       "apihelp-expandtemplates-param-generatexml": "Дерево парсу XML вхідних даних (замінене на $1prop=parsetree).",
+       "apihelp-expandtemplates-example-simple": "Розгорнути вікітекст <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>.",
+       "apihelp-feedcontributions-description": "Повертає стрічку внеску користувача.",
+       "apihelp-feedcontributions-param-feedformat": "Формат стрічки.",
+       "apihelp-feedcontributions-param-user": "Для яких користувачів отримати внесок.",
+       "apihelp-feedcontributions-param-namespace": "За яким простором назв фільтрувати внески.",
+       "apihelp-feedcontributions-param-year": "Від року (і раніше).",
+       "apihelp-feedcontributions-param-month": "До місяця (і раніше).",
+       "apihelp-feedcontributions-param-tagfilter": "Відфільтрувати внесок, у якого є ці теґи.",
+       "apihelp-feedcontributions-param-deletedonly": "Показати лише вилучений внесок.",
+       "apihelp-feedcontributions-param-toponly": "Показати лише редагування, які є останніми версіями.",
+       "apihelp-feedcontributions-param-newonly": "Показати лише редагування, які є створеннями сторінок.",
+       "apihelp-feedcontributions-param-showsizediff": "Показати різницю розміру між версіями.",
+       "apihelp-feedcontributions-example-simple": "Вивести внесок для користувача <kbd>Example</kbd>.",
+       "apihelp-feedrecentchanges-description": "Видає стрічку нових редагувань.",
+       "apihelp-feedrecentchanges-param-feedformat": "Формат стрічки.",
+       "apihelp-feedrecentchanges-param-namespace": "Простір назв, до якого обмежити результати.",
+       "apihelp-feedrecentchanges-param-invert": "Усі простори назв, крім вибраного.",
+       "apihelp-feedrecentchanges-param-associated": "Включно з пов'язаним (обговорення чи головним) простором назв.",
+       "apihelp-feedrecentchanges-param-days": "Дні, до яких обмежити результати.",
+       "apihelp-feedrecentchanges-param-limit": "Максимальна кількість результатів для виведення.",
+       "apihelp-feedrecentchanges-param-from": "Показати зміни відтоді.",
+       "apihelp-feedrecentchanges-param-hideminor": "Приховати незначні редагування.",
+       "apihelp-feedrecentchanges-param-hidebots": "Приховати редагування ботів.",
+       "apihelp-feedrecentchanges-param-hideanons": "Приховати редагування анонімних користувачів.",
+       "apihelp-feedrecentchanges-param-hideliu": "Приховати редагування зареєстрованих користувачів.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Приховати відпатрульовані редагування.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Приховати редагування поточного користувача.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Фільтрувати за теґом.",
+       "apihelp-feedrecentchanges-param-target": "Показати лише зміни на сторінках, на які посилається ця сторінка.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Показати натомість лише зміни на сторінках, які посилаються на цю сторінку.",
+       "apihelp-feedrecentchanges-example-simple": "Показати нещодавні зміни.",
+       "apihelp-feedrecentchanges-example-30days": "Показати нещодавні зміни за 30 днів.",
+       "apihelp-feedwatchlist-description": "Видає стрічку списку спостереження.",
+       "apihelp-feedwatchlist-param-feedformat": "Формат стрічки.",
+       "apihelp-feedwatchlist-param-hours": "Список сторінок, змінених за цю кількість годин від зараз.",
+       "apihelp-feedwatchlist-param-linktosections": "За можливості, посилатися безпосередньо на змінені розділи.",
+       "apihelp-feedwatchlist-example-default": "Показати стрічку списку спостереження.",
+       "apihelp-filerevert-param-filename": "Цільова назва файлу, без префіксу File:.",
+       "apihelp-filerevert-param-comment": "Завантажити коментар.",
+       "apihelp-filerevert-param-archivename": "Архівна назва версії, до якої повернути.",
+       "apihelp-filerevert-example-revert": "Повернути <kbd>Wiki.png</kbd> до версії <kbd>2011-03-05T15:27:40Z</kbd>.",
+       "apihelp-help-description": "Відображати довідку для зазначених модулів.",
+       "apihelp-help-param-modules": "Модулі, для яких відображати довідку (значення параметрів <var>action</var> і <var>format</var> або <kbd>main</kbd>). Можна вказати під модулі через <kbd>+</kbd>.",
+       "apihelp-help-param-recursivesubmodules": "Включити довідку для підмодулів рекурсивно.",
+       "apihelp-help-param-helpformat": "Формат результату довідки.",
+       "apihelp-help-param-wrap": "Помістити результат у стандартну структуру API-відповіді.",
+       "apihelp-help-param-toc": "Включити зміст у HTML-результат.",
+       "apihelp-help-example-main": "Довідка для головного модуля.",
+       "apihelp-help-example-recursive": "Уся довідка на одній сторінці.",
+       "apihelp-help-example-help": "Довідка для самого модуля довідки.",
+       "apihelp-help-example-query": "Довідка для двох підмодулів запитів.",
+       "apihelp-imagerotate-description": "Поворот одного або декількох зображень.",
+       "apihelp-imagerotate-param-rotation": "Градуси для повороту зображення за годинниковою стрілкою.",
+       "apihelp-imagerotate-example-simple": "Повернути <kbd>File:Example.png</kbd> на <kbd>90</kbd> градусів.",
+       "apihelp-imagerotate-example-generator": "Повернути усі зображення у <kbd>Category:Flip</kbd> на <kbd>180</kbd> градусів.",
+       "apihelp-import-description": "Імпортувати сторінку з іншої вікі або з XML-файлу.\n\nЗважте, що HTTP POST має бути виконано як завантаження файлу (тобто з використанням даних різних частин/форм) під час надсилання файлу для параметра <var>xml</var>.",
+       "apihelp-import-param-summary": "Імпортувати підсумок.",
+       "apihelp-import-param-xml": "Завантажено XML-файл.",
+       "apihelp-import-param-interwikisource": "Для інтервікі-імпорту: вікі, з якої імпортувати.",
+       "apihelp-import-param-interwikipage": "Для інтервікі-імпорту: сторінки для імпорту.",
+       "apihelp-import-param-fullhistory": "Для інтервікі-імпорту: імпортувати повну історію, не лише поточну версію.",
+       "apihelp-import-param-templates": "Для інтервікі-імпорту: імпортувати також усі включені шаблони.",
+       "apihelp-import-param-namespace": "Імпортувати у цей простір назв. Не можна використати разом з <var>$1rootpage</var>.",
+       "apihelp-import-param-rootpage": "Імпортувати як підсторінку цієї сторінки. Не можна використати разом з <var>$1namespace</var>.",
+       "apihelp-import-example-import": "Імпортувати [[meta:Help:ParserFunctions]] у простір назв 100 з повною історією.",
+       "apihelp-login-description": "Увійти в систему й отримати куки автентифікації.\n\nУ випадку успішного входження в систему, потрібні куки буде включено в заголовки HTTP-відповіді. У разі невдалого входу, подальші спроби будуть обмежені до ліміту автоматичних спроб підбирання пароля.",
+       "apihelp-login-param-name": "Ім'я користувача.",
+       "apihelp-login-param-password": "Пароль.",
+       "apihelp-login-param-domain": "Домен (необов'язково).",
+       "apihelp-login-param-token": "Токен входу в систему, отриманий у першому запиті.",
+       "apihelp-login-example-gettoken": "Отримати токен входу в систему.",
+       "apihelp-login-example-login": "Увійти в систему.",
+       "apihelp-logout-description": "Вийти й очистити дані сесії.",
+       "apihelp-logout-example-logout": "Вийти з поточного облікового запису.",
+       "apihelp-managetags-description": "Виконати керівні завдання щодо зміни теґів.",
        "apihelp-move-param-ignorewarnings": "Ігнорувати всі попередження",
        "api-help-datatypes-header": "Типи даних"
 }
index 8c9f8c8..64bea5b 100644 (file)
        "apihelp-delete-description": "Xóa trang.",
        "apihelp-delete-param-title": "Xóa tiêu đề của trang. Không thể sử dụng cùng với <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "Xóa ID của trang. Không thể sử dụng cùng với <var>$1title</var>.",
-       "apihelp-delete-param-watch": "Thêm trang vào danh sách theo dõi của bạn.",
-       "apihelp-delete-param-unwatch": "Bỏ trang này khỏi danh sách theo dõi của bạn.",
-       "apihelp-delete-example-simple": "Xóa Trang Chính",
-       "apihelp-delete-example-reason": "Xóa Trang Chính với lý do “Chuẩn bị di chuyển”",
+       "apihelp-delete-param-watch": "Thêm trang vào danh sách theo dõi của người dùng hiện tại.",
+       "apihelp-delete-param-unwatch": "Bỏ trang này khỏi danh sách theo dõi của người dùng hiện tại.",
+       "apihelp-delete-example-simple": "Xóa <kbd>Trang Chính</kbd>.",
+       "apihelp-delete-example-reason": "Xóa <kbd>Trang Chính</kbd> với lý do <kbd>Chuẩn bị di chuyển</kbd>.",
        "apihelp-disabled-description": "Mô đun này đã bị vô hiệu hóa.",
        "apihelp-edit-description": "Tạo và sửa trang.",
-       "apihelp-edit-param-section": "Số phần trang. 0 là phần đầu; “new” là phần mới.",
+       "apihelp-edit-param-section": "Số phần trang. <kbd>0</kbd> là phần đầu; <kbd>new</kbd> là phần mới.",
        "apihelp-edit-param-sectiontitle": "Tên của phần mới.",
        "apihelp-edit-param-text": "Nội dung trang.",
        "apihelp-edit-param-summary": "Tóm lược sửa đổi. Cũng là tên phần khi $1section=new và $1sectiontitle không được đặt.",
@@ -53,8 +53,8 @@
        "apihelp-edit-param-bot": "Đánh dấu sửa đổi này là do bot thực hiện.",
        "apihelp-edit-param-createonly": "Không sửa đổi trang nếu nó đã tồn tại.",
        "apihelp-edit-param-nocreate": "Gây lỗi nếu trang không tồn tại.",
-       "apihelp-edit-param-watch": "Thêm trang vào danh sách theo dõi của bạn.",
-       "apihelp-edit-param-unwatch": "Bỏ trang này khỏi danh sách theo dõi của bạn.",
+       "apihelp-edit-param-watch": "Thêm trang vào danh sách theo dõi của người dùng hiện tại.",
+       "apihelp-edit-param-unwatch": "Bỏ trang này khỏi danh sách theo dõi của người dùng hiện tại.",
        "apihelp-edit-param-undo": "Hoàn tác sửa đổi này. Ghi đè $1text, $1prependtext và $ 1appendtext.",
        "apihelp-edit-param-undoafter": "Hoàn tác tất cả các sửa đổi từ $1undo cho tới sửa đổi này. Nếu không được thiết lập, chỉ cần lùi lại một sửa đổi.",
        "apihelp-edit-example-edit": "Sửa đổi trang",
@@ -65,7 +65,7 @@
        "apihelp-emailuser-param-subject": "Tiêu đề bức thư.",
        "apihelp-emailuser-param-text": "Nội dung bức thư.",
        "apihelp-emailuser-param-ccme": "Gửi bản sao của thư này cho tôi.",
-       "apihelp-emailuser-example-email": "Gửi thư điện tử cho thành viên “BQVWiki” với văn bản “Nội dung”",
+       "apihelp-emailuser-example-email": "Gửi thư điện tử cho thành viên <kbd>BQVWiki</kbd> với văn bản <kbd>Nội dung</kbd>.",
        "apihelp-expandtemplates-description": "Bung tất cả bản mẫu trong văn bản wiki.",
        "apihelp-expandtemplates-param-title": "Tên trang.",
        "apihelp-expandtemplates-param-text": "Văn bản wiki để bung.",
@@ -79,8 +79,8 @@
        "apihelp-help-example-query": "Trợ giúp cho hai module con truy vấn",
        "apihelp-imagerotate-description": "Xoay một hoặc nhiều hình ảnh.",
        "apihelp-imagerotate-param-rotation": "Độ xoay hình ảnh theo chiều kim đồng hồ.",
-       "apihelp-imagerotate-example-simple": "Xoay [[:Tập tin:Ví dụ.jpg]] 90 độ",
-       "apihelp-imagerotate-example-generator": "Xoay tất cả các hình ảnh trong [[:Thể loại:Búng]] 180 độ",
+       "apihelp-imagerotate-example-simple": "Xoay <kbd>Tập tin:Ví dụ.jpg</kbd> <kbd>90</kbd> độ.",
+       "apihelp-imagerotate-example-generator": "Xoay tất cả các hình ảnh trong <kbd>Thể loại:Búng</kbd> <kbd>180</kbd> độ.",
        "apihelp-login-param-name": "Tên người dùng.",
        "apihelp-login-param-password": "Mật khẩu.",
        "apihelp-login-param-domain": "Tên miền (tùy chọn).",
@@ -89,7 +89,7 @@
        "apihelp-login-example-login": "Đăng nhập",
        "apihelp-logout-example-logout": "Đăng xuất người dùng hiện tại",
        "apihelp-move-description": "Di chuyển trang.",
-       "apihelp-move-param-reason": "Lý do di chuyển.",
+       "apihelp-move-param-reason": "Lý do đổi tên.",
        "apihelp-move-param-noredirect": "Không tạo trang đổi hướng.",
        "apihelp-move-param-ignorewarnings": "Bỏ qua tất cả các cảnh báo.",
        "apihelp-opensearch-description": "Tìm kiếm trong wiki qua giao thức OpenSearch.",
        "apihelp-opensearch-param-limit": "Đa số kết quả để cho ra.",
        "apihelp-opensearch-param-namespace": "Không gian tên để tìm kiếm.",
        "apihelp-opensearch-param-format": "Định dạng kết quả được cho ra.",
-       "apihelp-opensearch-example-te": "Tìm trang bắt đầu với “Te”",
+       "apihelp-opensearch-example-te": "Tìm trang bắt đầu với <kbd>Te</kbd>.",
        "apihelp-options-example-reset": "Mặc định lại các tùy chọn",
        "apihelp-paraminfo-param-helpformat": "Định dạng chuỗi trợ giúp.",
        "apihelp-parse-param-summary": "Lời tóm lược để phân tích.",
-       "apihelp-parse-param-section": "Chỉ truy xuất nội dung của số bộ phận này.",
-       "apihelp-parse-param-disablepp": "Vô hiệu hóa phân tích cú pháp đầu ra của Báo cáo PP .",
+       "apihelp-parse-param-section": "Chỉ truy xuất nội dung của số phần này; nếu có <kbd>new</kbd> thì tạo phần mới.\n\nPhần <kbd>new</kbd> chỉ được chấp nhận khi định rõ <var>text</var>.",
+       "apihelp-parse-param-disablepp": "Bỏ qua thông báo bộ tiền xử lý (“NewPP limit report”) khi cho ra kết quả bộ xử lý.",
        "apihelp-parse-example-page": "Phân tích trang.",
        "apihelp-parse-example-text": "Phân tích văn bản wiki.",
        "apihelp-parse-example-texttitle": "Phân tích văn bản wiki theo tên trang.",
        "apihelp-parse-example-summary": "Phân tích lời tóm lược.",
        "apihelp-protect-example-protect": "Khóa trang.",
-       "apihelp-protect-example-unprotect": "Mở khóa trang bằng cách đặt hạn chế thành “all”",
+       "apihelp-protect-example-unprotect": "Mở khóa trang bằng cách đặt hạn chế thành <kbd>all</kbd>.",
        "apihelp-protect-example-unprotect2": "Mở khóa trang bằng cách không đặt hạn chế nào",
        "apihelp-purge-param-forcelinkupdate": "Cập nhật các bảng liên kết.",
        "apihelp-purge-example-generator": "Làm mới 10 trang đầu tiên trong không gian tên chính",
        "apihelp-query-param-meta": "Siêu dữ liệu để lấy.",
        "apihelp-query+allcategories-param-dir": "Hướng xếp loại.",
        "apihelp-rollback-description": "Hoàn tác chỉnh sửa cuối cùng của trang này.\n\nNếu người dùng cuối cùng đã cỉnh sửa trang này nhiều lần, tất cả chúng sẽ được hoàn tác lại như ban đầu.",
-       "apihelp-format-example-generic": "Định dạng kết quả truy vấn dưới dạng $1",
-       "apihelp-dbg-description": "Cho ra dữ liệu dưới dạng var_export() của PHP.",
-       "apihelp-dbgfm-description": "Cho ra dữ liệu dưới dạng var_export() của PHP (định dạng bằng HTML).",
+       "apihelp-format-example-generic": "Cho ra kết quả truy vấn dưới dạng $1.",
+       "apihelp-dbg-description": "Cho ra dữ liệu dưới dạng <code>var_export()</code> của PHP.",
+       "apihelp-dbgfm-description": "Cho ra dữ liệu dưới dạng <code>var_export()</code> của PHP (định dạng bằng HTML).",
        "apihelp-json-description": "Cho ra dữ liệu dưới dạng JSON.",
        "apihelp-jsonfm-description": "Cho ra dữ liệu dưới dạng JSON (định dạng bằng HTML).",
        "apihelp-none-description": "Không cho ra gì.",
        "apihelp-rawfm-description": "Cho ra dữ liệu với các phần tử gỡ lỗi dưới dạng JSON (định dạng bằng HTML).",
-       "apihelp-txt-description": "Cho ra dữ liệu dưới dạng print_r() của PHP.",
-       "apihelp-txtfm-description": "Cho ra dữ liệu dưới dạng print_r() của PHP (định dạng bằng HTML).",
+       "apihelp-txt-description": "Cho ra dữ liệu dưới dạng <code>print_r()</code> của PHP.",
+       "apihelp-txtfm-description": "Cho ra dữ liệu dưới dạng <code>print_r()</code> của PHP (định dạng bằng HTML).",
        "apihelp-xml-description": "Cho ra dữ liệu dưới dạng XML.",
        "apihelp-xmlfm-description": "Cho ra dữ liệu dưới dạng XML (định dạng bằng HTML).",
        "apihelp-yaml-description": "Cho ra dữ liệu dưới dạng YAML.",
        "api-help-parameters": "{{PLURAL:$1|Tham số|Các tham số}}:",
        "api-help-param-deprecated": "Bị phản đối.",
        "api-help-param-required": "Tham số này là bắt buộc.",
-       "api-help-param-list": "{{PLURAL:$1|1=Một giá trị|2=Các giá trị (phân tách bằng “{{!}}”)}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=Một giá trị|2=Các giá trị (phân tách bằng <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Cần phải để trống|Cần phải để trống hoặc là $2}}",
        "api-help-param-limit": "Không cho phép hơn $1.",
        "api-help-param-limit2": "Không cho phép hơn $1 ($2 đối với các bot).",
-       "api-help-param-multi-separate": "Phân tách các giá trị bằng “|”.",
+       "api-help-param-multi-separate": "Phân tách các giá trị bằng <kbd>|</kbd>.",
        "api-help-param-default": "Mặc định: $1",
        "api-help-param-default-empty": "Mặc định: <span class=\"apihelp-empty\">(trống)</span>",
        "api-help-examples": "{{PLURAL:$1|Ví dụ|Các ví dụ}}:",
diff --git a/includes/api/i18n/wuu.json b/includes/api/i18n/wuu.json
new file mode 100644 (file)
index 0000000..7df8a48
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "反共复国"
+               ]
+       },
+       "apihelp-main-param-action": "要执行个操作。"
+}
index 36b71cc..e2d05e0 100644 (file)
@@ -31,7 +31,7 @@
        "apihelp-block-description": "封禁一位用户。",
        "apihelp-block-param-user": "您要封禁的用户、IP地址或IP地址段。",
        "apihelp-block-param-expiry": "到期时间。可以是相对时间(例如<kbd>5 months</kbd>或<kbd>2 weeks</kbd>)或绝对时间(例如<kbd>2014-09-18T12:34:56Z</kbd>)。如果设置为<kbd>infinite</kbd>、<kbd>indefinite</kbd>或<kbd>never</kbd>,封禁将无限期。",
-       "apihelp-block-param-reason": "封禁的原因",
+       "apihelp-block-param-reason": "封禁的原因",
        "apihelp-block-param-anononly": "只封禁匿名用户(也就是说禁止此 IP 地址的匿名编辑)。",
        "apihelp-block-param-nocreate": "防止创建帐户。",
        "apihelp-block-param-autoblock": "自动封禁最近使用的IP地址,以及以后他们尝试登陆使用的IP地址。",
@@ -56,9 +56,9 @@
        "apihelp-compare-param-totitle": "要比较的第二个标题。",
        "apihelp-compare-param-toid": "要比较的第二个页面 ID。",
        "apihelp-compare-param-torev": "要比较的第二个修订版本。",
-       "apihelp-compare-example-1": "在版本1和2中创建差异",
+       "apihelp-compare-example-1": "在版本1和2中创建差异",
        "apihelp-createaccount-description": "创建一个新用户账户。",
-       "apihelp-createaccount-param-name": "用户名",
+       "apihelp-createaccount-param-name": "用户名",
        "apihelp-createaccount-param-password": "密码(如果设置<var>$1mailpassword</var>则忽略)。",
        "apihelp-createaccount-param-domain": "外部身份验证域 (可选)。",
        "apihelp-createaccount-param-token": "在第一个请求中获得的帐户创建标记。",
        "apihelp-edit-param-appendtext": "将该文本添加到该页面的结尾。覆盖$1text。\n\n采用$1section=new来添加一个新的章节,而不是这个参数。",
        "apihelp-edit-param-undo": "撤销此次修订。覆盖$1text、$1prependtext和$1appendtext。",
        "apihelp-edit-param-undoafter": "撤销从$1undo至此的所有修订。如果不设置就撤销一次修订。",
-       "apihelp-edit-param-redirect": "自动解重定向。",
+       "apihelp-edit-param-redirect": "自动解重定向。",
        "apihelp-edit-param-contentformat": "用于输入文本的内容串行化格式。",
        "apihelp-edit-param-contentmodel": "新内容的内容模型。",
        "apihelp-edit-param-token": "令牌应总是发送为最后参数,或至少在$1text参数之后。",
-       "apihelp-edit-example-edit": "编辑一个页面",
-       "apihelp-edit-example-prepend": "页面中预置<kbd>_&#95;NOTOC_&#95;</kbd>",
-       "apihelp-edit-example-undo": "通过13585撤销修订版本13579并自动填写编辑摘要",
+       "apihelp-edit-example-edit": "编辑一个页面",
+       "apihelp-edit-example-prepend": "页面中预置<kbd>_&#95;NOTOC_&#95;</kbd>",
+       "apihelp-edit-example-undo": "通过13585撤销修订版本13579并自动填写编辑摘要",
        "apihelp-emailuser-description": "电子邮件联系一位用户。",
        "apihelp-emailuser-param-target": "电子邮件的目标用户。",
        "apihelp-emailuser-param-subject": "主题页眉。",
        "apihelp-feedrecentchanges-param-tagfilter": "按标签过滤。",
        "apihelp-feedrecentchanges-param-target": "仅仅显示从该页面链出的那些页面的变更。",
        "apihelp-feedrecentchanges-param-showlinkedto": "仅仅显示链入到该页面的那些页面的变更。",
-       "apihelp-feedrecentchanges-example-simple": "显示最近更改",
-       "apihelp-feedrecentchanges-example-30days": "显示最近30天的更改",
+       "apihelp-feedrecentchanges-example-simple": "显示最近更改",
+       "apihelp-feedrecentchanges-example-30days": "显示最近30天的更改",
        "apihelp-feedwatchlist-description": "返回监视列表纲要。",
        "apihelp-feedwatchlist-param-feedformat": "纲要的格式。",
        "apihelp-feedwatchlist-param-hours": "列出从现在起数小时内修改的页面。",
        "apihelp-feedwatchlist-param-linktosections": "如果可能的话,直接链接到已变更的小节。",
-       "apihelp-feedwatchlist-example-default": "显示监视列表订阅",
+       "apihelp-feedwatchlist-example-default": "显示监视列表订阅",
        "apihelp-feedwatchlist-example-all6hrs": "显示过去6小时内受监视页面的所有更改。",
        "apihelp-filerevert-description": "回退一个文件至某一旧版本。",
        "apihelp-filerevert-param-filename": "目标文件名,不包含前缀“File:”。",
        "apihelp-help-param-helpformat": "帮助的输出格式。",
        "apihelp-help-param-wrap": "在一个标准API响应结构中包裹输出。",
        "apihelp-help-param-toc": "在HTML输出中包括目录。",
-       "apihelp-help-example-main": "主模块帮助",
-       "apihelp-help-example-recursive": "一个页面中的所有帮助",
-       "apihelp-help-example-help": "帮助模块本身的帮助",
-       "apihelp-help-example-query": "两个查询子模块的帮助",
+       "apihelp-help-example-main": "主模块帮助",
+       "apihelp-help-example-recursive": "一个页面中的所有帮助",
+       "apihelp-help-example-help": "帮助模块本身的帮助",
+       "apihelp-help-example-query": "两个查询子模块的帮助",
        "apihelp-imagerotate-description": "旋转一幅或多幅图像。",
        "apihelp-imagerotate-param-rotation": "顺时针旋转图像的度数。",
        "apihelp-imagerotate-example-simple": "<kbd>90</kbd>度旋转<kbd>File:Example.png</kbd>。",
        "apihelp-login-param-password": "密码。",
        "apihelp-login-param-domain": "域名(可选)。",
        "apihelp-login-param-token": "在首个请求中获得的登录令牌。",
-       "apihelp-login-example-gettoken": "检索登录令牌",
-       "apihelp-login-example-login": "登录",
+       "apihelp-login-example-gettoken": "检索登录令牌",
+       "apihelp-login-example-login": "登录",
        "apihelp-logout-description": "退出并清除会话数据。",
-       "apihelp-logout-example-logout": "退出当前用户",
+       "apihelp-logout-example-logout": "退出当前用户",
        "apihelp-managetags-description": "执行有关更改标签的管理任务。",
        "apihelp-managetags-param-operation": "要执行哪个操作:\n;create:创建一个新的更改标签供手动使用。\n;delete:从数据库中移除一个更改标签,包括移除已使用在所有修订版本、最近更改记录和日志记录上的该标签。\n;activate:激活一个更改标签,允许用户手动应用它。\n;deactivate:停用一个更改标签,阻止用户手动应用它。",
        "apihelp-managetags-param-tag": "要创建、删除、激活或取消激活的标签。要创建标签,标签必须不存在。要删除标签,标签必须存在。要激活标签,标签必须存在,且不被任何扩展使用。要取消激活标签,标签必须当前处于激活状态,且被手动定义。",
        "apihelp-options-param-resetkinds": "当<var>$1reset</var>选项被设置时,要重置的选项类型列表。",
        "apihelp-options-param-change": "更改列表,以name=value格式化(例如skin=vector)。值不能包含管道字符。如果没提供值(甚至没有等号),例如optionname|otheroption|...,选项将重置为默认值。",
        "apihelp-options-param-optionname": "应设置为由<var>$1optionvalue</var>提供值的选项名称。",
-       "apihelp-options-param-optionvalue": "使用<var>$1选项名</var>指定的选项值中,可以包含管道字符",
-       "apihelp-options-example-reset": "重置所有用户设置",
+       "apihelp-options-param-optionvalue": "使用<var>$1选项名</var>指定的选项值中,可以包含管道字符",
+       "apihelp-options-example-reset": "重置所有用户设置",
        "apihelp-options-example-change": "更改<kbd>skin</kbd>和<kbd>hideminor</kbd>设置。",
-       "apihelp-options-example-complex": "重置所有设置,然后设置<kbd>皮肤</kbd>和<kbd>昵称</kbd>。",
+       "apihelp-options-example-complex": "重置所有设置,然后设置<kbd>skin</kbd>和<kbd>nickname</kbd>。",
        "apihelp-paraminfo-description": "获取关于 API 模块的信息。",
        "apihelp-paraminfo-param-modules": "模块名称(<var>action</var>和<var>format</var>参数值,或<kbd>main</kbd>)的列表。可通过<kbd>+</kbd>指定子模块。",
        "apihelp-paraminfo-param-helpformat": "帮助字符串的格式。",
        "apihelp-paraminfo-param-querymodules": "查询模块名称(<var>prop</var>、<var>meta</var>或<var>list</var>参数值)的列表。使用<kbd>$1modules=query+foo</kbd>而不是<kbd>$1querymodules=foo</kbd>。",
-       "apihelp-paraminfo-param-mainmodule": "è\8e·å¾\97有关主要(最高级)模块的信息。也可使用<kbd>$1modules=main</kbd>。",
-       "apihelp-paraminfo-param-pagesetmodule": "è\8e·å¾\97有关页面设置模块(提供titles=和朋友)的信息。",
+       "apihelp-paraminfo-param-mainmodule": "è\8e·å\8f\96有关主要(最高级)模块的信息。也可使用<kbd>$1modules=main</kbd>。",
+       "apihelp-paraminfo-param-pagesetmodule": "è\8e·å\8f\96有关页面设置模块(提供titles=和朋友)的信息。",
        "apihelp-paraminfo-param-formatmodules": "格式模块名称(<var>format</var>参数的值)的列表。也可使用<var>$1modules</var>。",
        "apihelp-paraminfo-example-1": "显示<kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>、<kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>、<kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd>和<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>的信息。",
        "apihelp-parse-description": "解析内容并返回解析器输出。\n\n参见<kbd>[[Special:ApiHelp/query|action=query]]</kbd>的各种prop-module以从页面的当前版本获得信息。\n\n这里有几种方法可以指定解析的文本:\n# 指定一个页面或修订,使用<var>$1page</var>、<var>$1pageid</var>或<var>$1oldid</var>。\n# 明确指定内容,使用<var>$1text</var>、<var>$1title</var>和<var>$1contentmodel</var>。\n# 只指定一段摘要解析。<var>$1prop</var>应提供一个空值。",
        "apihelp-parse-paramvalue-prop-headitems": "提供项目以插入至页面的<code>&lt;head&gt;</code>。",
        "apihelp-parse-paramvalue-prop-headhtml": "提供页面的被解析<code>&lt;head&gt;</code>。",
        "apihelp-parse-paramvalue-prop-modules": "提供在页面中使用的ResourceLoader模块。无论<kbd>jsconfigvars</kbd>还是<kbd>encodedjsconfigvars</kbd>都必须与<kbd>modules</kbd>共同被请求。",
+       "apihelp-parse-paramvalue-prop-jsconfigvars": "针对页面提供JavaScript配置变量。",
+       "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "针对页面提供JavaScript配置变量为一个JSON字符串。",
        "apihelp-parse-paramvalue-prop-iwlinks": "在被解析的wiki文本中提供跨wiki链接。",
        "apihelp-parse-paramvalue-prop-wikitext": "提供被解析的原始wiki文本。",
        "apihelp-parse-paramvalue-prop-limitreportdata": "以结构化的方式提供限制报告。如果<var>$1disablepp</var>被设定则不提供数据。",
-       "apihelp-parse-paramvalue-prop-parsetree": "修订内容的XML解析数(需要内容模型<code>$1</code>)。",
+       "apihelp-parse-paramvalue-prop-limitreporthtml": "提供限制报告的HTML版本。当<var>$1disablepp</var>被设置时不会提供数据。",
+       "apihelp-parse-paramvalue-prop-parsetree": "修订内容的XML解析树(需要内容模型<code>$1</code>)",
        "apihelp-parse-param-pst": "在解析输入前,对输入做一次保存前变换处理。仅当使用文本时有效。",
        "apihelp-parse-param-effectivelanglinks": "包含由扩展提供的语言链接(用于与<kbd>$1prop=langlinks</kbd>一起使用)。",
        "apihelp-parse-param-section": "只检索此段数的内容,或只当<kbd>new</kbd>生成新的段落时检索。\n\n<kbd>new</kbd>段落只当指定<var>text</var>时受尊重。",
        "apihelp-parse-param-sectiontitle": "当<var>section</var>为<kbd>new</kbd>时新段落标题。\n\n不像页面编辑,当省略或为空时将不会备选为<var>summary</var>。",
-       "apihelp-parse-param-disablepp": "ä»\8e解æ\9e\90å\99¨è¾\93å\87ºä¸­ç¦\81ç\94¨PPæ\8a¥å\91\8a。",
-       "apihelp-parse-param-disableeditsection": "ä»\8e解æ\9e\90å\99¨è¾\93å\87ºä¸­ç¦\81ç\94¨编辑段落链接。",
+       "apihelp-parse-param-disablepp": "ä»\8e解æ\9e\90å\99¨è¾\93å\87ºä¸­ç\9c\81ç\95¥é¢\84å¤\84ç\90\86å\99¨æ\8a¥å\91\8aï¼\88â\80\9cNewPP limit reportâ\80\9dï¼\89。",
+       "apihelp-parse-param-disableeditsection": "ä»\8e解æ\9e\90å\99¨è¾\93å\87ºä¸­ç\9c\81ç\95¥编辑段落链接。",
        "apihelp-parse-param-generatexml": "生成XML解析树(需要内容模型<code>$1</code>;被<kbd>$2prop=parsetree</kbd>所取代)。",
        "apihelp-parse-param-preview": "在预览模式下解析。",
        "apihelp-parse-param-sectionpreview": "在小节预览模式下解析 (同时要启用预览模式)。",
-       "apihelp-parse-param-disabletoc": "在输出中禁用目录。",
+       "apihelp-parse-param-disabletoc": "在输出中省略目录。",
+       "apihelp-parse-param-contentformat": "用于输入文本的内容序列化格式。只当与$1text一起使用时有效。",
        "apihelp-parse-example-page": "解析一个页面。",
        "apihelp-parse-example-text": "解析wiki文本。",
-       "apihelp-parse-example-texttitle": "解析维基文本,指定页面标题。",
+       "apihelp-parse-example-texttitle": "解析wiki文本,指定页面标题。",
        "apihelp-parse-example-summary": "解析一个摘要。",
        "apihelp-patrol-description": "巡查页面或修订版本。",
        "apihelp-patrol-param-rcid": "所要巡查的最近变更 ID。",
        "apihelp-protect-param-protections": "保护等级列表,格式:<kbd>action=level</kbd>(例如<kbd>edit=sysop</kbd>)。\n\n<strong>注意:</strong>未列出的操作将移除限制。",
        "apihelp-protect-param-expiry": "到期时间戳。如果只有一个时间戳被设置,它将被用于所有保护。使用<kbd>infinite</kbd>、<kbd>indefinite</kbd>、<kbd>infinity</kbd>或<kbd>never</kbd>用于永不过期的保护。",
        "apihelp-protect-param-reason": "(解除)保护的原因。",
-       "apihelp-protect-param-cascade": "启用级联保护(也就是保护包含于此页面的页面)。如果所有提供的保护等级不支持级联,就将其忽略。",
+       "apihelp-protect-param-cascade": "启用连锁保护(也就是保护包含于此页面的页面)。如果所有提供的保护等级不支持连锁,就将其忽略。",
        "apihelp-protect-param-watch": "如果设置,就加入已开始(解除)保护的页面至当前用户的监视列表。",
        "apihelp-protect-param-watchlist": "无条件地将页面加入至当前用户的监视列表或将其移除,使用设置或不更改监视。",
        "apihelp-protect-example-protect": "保护一个页面。",
        "apihelp-query-param-prop": "要为已查询页面获取的属性。",
        "apihelp-query-param-list": "要获取的列表。",
        "apihelp-query-param-meta": "要获取的元数据。",
+       "apihelp-query-param-indexpageids": "包含一个额外的pageid段落,列举所有返回的页面ID。",
+       "apihelp-query-param-export": "导出所有指定或生成页面的当前修订。",
        "apihelp-query-param-exportnowrap": "返回导出XML,不需要将其包裹在一个XML结果中(与[[Special:Export]]格式相同)。只能与$1export一起使用。",
+       "apihelp-query-param-iwurl": "如果标题是一个跨wiki链接的话,是否获取完整URL。",
        "apihelp-query-param-rawcontinue": "为继续返回原始<samp>query-continue</samp>数据。",
        "apihelp-query-example-revisions": "获取<kbd>Main Page</kbd>的[[Special:ApiHelp/query+siteinfo|网站信息]]和[[Special:ApiHelp/query+revisions|修订版本]]。",
-       "apihelp-query-example-allpages": "获取以<kbd>API/</kbd>开头的页面的修订版本",
-       "apihelp-query+allcategories-description": "枚举所有类别。",
+       "apihelp-query-example-allpages": "获取以<kbd>API/</kbd>开头的页面的修订版本",
+       "apihelp-query+allcategories-description": "列举所有分类。",
        "apihelp-query+allcategories-param-from": "要作为枚举起始点的类别。",
        "apihelp-query+allcategories-param-to": "要作为枚举终止点的类别。",
-       "apihelp-query+allcategories-param-prefix": "æ\90\9c索此å\80¼å¼\80头ç\9a\84æ\89\80æ\9c\89分类标题。",
+       "apihelp-query+allcategories-param-prefix": "æ\90\9cç´¢æ\89\80æ\9c\89以此å\80¼å¼\80头ç\9a\84分类标题。",
        "apihelp-query+allcategories-param-dir": "排序方向。",
        "apihelp-query+allcategories-param-min": "只返回至少带这么多成员的分类。",
        "apihelp-query+allcategories-param-max": "只返回最多带这么多成员的分类。",
        "apihelp-query+allcategories-param-limit": "要返回多少个类别。",
        "apihelp-query+allcategories-param-prop": "要获取的属性:\n;size:在分类中添加页面数。\n;hidden:标记由_&#95;HIDDENCAT_&#95;隐藏的分类。",
        "apihelp-query+allcategories-example-size": "列出分类及其含有多少页面的信息。",
+       "apihelp-query+allcategories-example-generator": "为以<kbd>List</kbd>的分类检索有关分类页面本身的信息。",
        "apihelp-query+alldeletedrevisions-description": "列举由一位用户或在一个名字空间中所有已删除的修订。",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "只可以与<var>$3user</var>一起使用。",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "不能与<var>$3user</var>一起使用。",
        "apihelp-query+alldeletedrevisions-param-end": "枚举的结束时间戳。",
        "apihelp-query+alldeletedrevisions-param-from": "从此标题开始列出。",
        "apihelp-query+alldeletedrevisions-param-to": "列出至此标题为止。",
-       "apihelp-query+alldeletedrevisions-param-prefix": "æ\90\9cç´¢æ \87é¢\98以此å\80¼å¼\80头ç\9a\84æ\89\80æ\9c\89页é\9d¢。",
+       "apihelp-query+alldeletedrevisions-param-prefix": "æ\90\9cç´¢æ\89\80æ\9c\89以此å\80¼å¼\80头ç\9a\84页é\9d¢æ \87é¢\98。",
        "apihelp-query+alldeletedrevisions-param-tag": "只列出被此标签标记的修订。",
        "apihelp-query+alldeletedrevisions-param-user": "只列出此用户做出的修订。",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "不要列出此用户做出的修订。",
        "apihelp-query+alldeletedrevisions-param-namespace": "只列出此名字空间的页面。",
        "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>注意:</strong>由于[[mw:Manual:$wgMiserMode|miser模式]],同时使用<var>$1user</var>和<var>$1namespace</var>将导致继续前返回少于<var>$1limit</var>个结果,在极端条件下可能不返回任何结果。",
+       "apihelp-query+alldeletedrevisions-param-generatetitles": "当作为生成器使用时,生成标题而不是修订ID。",
        "apihelp-query+alldeletedrevisions-example-user": "列出由<kbd>Example<kbd>作出的最近50次已删除贡献。",
        "apihelp-query+alldeletedrevisions-example-ns-main": "列出前50次已删除的主名字空间修订。",
        "apihelp-query+allfileusages-description": "列出所有文件用途,包括不存在的。",
-       "apihelp-query+allfileusages-param-from": "文件的标题开始枚举于.",
+       "apihelp-query+allfileusages-param-from": "要列举的起始文件标题。",
        "apihelp-query+allfileusages-param-to": "要列举的最终文件标题。",
-       "apihelp-query+allfileusages-param-prefix": "搜索此值开头的所有文件标题。",
+       "apihelp-query+allfileusages-param-prefix": "搜索所有以此值开头的文件标题。",
+       "apihelp-query+allfileusages-param-unique": "只显示明显的文件标题。不能与$1prop=ids一起使用。\n当作为生成器使用时,产生目标页面而不是来源页面。",
        "apihelp-query+allfileusages-param-prop": "要包含的信息束:\n;ids:添加使用中的页面的页面ID(不能与$1unique一起使用)。\n;title:添加文件的标题。",
        "apihelp-query+allfileusages-param-limit": "要返回的总计项目。",
        "apihelp-query+allfileusages-param-dir": "罗列所采用的方向。",
        "apihelp-query+allimages-param-to": "要列举的最终图片标题。只能与$1sort=name一起使用。",
        "apihelp-query+allimages-param-start": "要列举的起始时间戳。只能与$1sort=timestamp一起使用。",
        "apihelp-query+allimages-param-end": "要列举的最终时间戳。只能与$1sort=timestamp一起使用。",
+       "apihelp-query+allimages-param-prefix": "搜索所有以此值开头的图像标题。只能与$1sort=name一起使用。",
        "apihelp-query+allimages-param-minsize": "限于至少这么多字节的图像。",
        "apihelp-query+allimages-param-maxsize": "限于顶多这么多字节的图像。",
        "apihelp-query+allimages-param-sha1": "图像的 SHA1 哈希。覆盖$1sha1base36。",
        "apihelp-query+allimages-param-sha1base36": "基于base 36的图片的SHA1哈希值(用于MediaWiki)。",
+       "apihelp-query+allimages-param-user": "只返回此用户上传的文件。只能与$1sort=timestamp一起使用。不能与$1filterbots一起使用。",
+       "apihelp-query+allimages-param-filterbots": "如何过滤由机器人上传的文件。只能与$1sort=timestamp一起使用。不能与$1user一起使用。",
        "apihelp-query+allimages-param-mime": "要搜索的MIME类型,例如<kbd>image/jpeg</kbd>。",
        "apihelp-query+allimages-param-limit": "共计要返回多少图像。",
        "apihelp-query+allimages-example-B": "显示以字母<kbd>B</kbd>开始的文件列表。",
        "apihelp-query+allimages-example-recent": "显示一个最近上传文件的列表,类似[[Special:NewFiles]]。",
        "apihelp-query+allimages-example-mimetypes": "显示带MIME类型<kbd>image/png</kbd>或<kbd>image/gif</kbd>的文件列表",
        "apihelp-query+allimages-example-generator": "显示有关4个以<kbd>T</kbd>开头的文件的信息。",
+       "apihelp-query+alllinks-description": "列举所有指向至指定名字空间的链接。",
        "apihelp-query+alllinks-param-from": "要列举的起始标题链接。",
        "apihelp-query+alllinks-param-to": "要列举的最终标题链接。",
+       "apihelp-query+alllinks-param-prefix": "搜索所有以此值开头的已链接标题。",
+       "apihelp-query+alllinks-param-unique": "只显示明显的链接标题。不能与<kbd>$1prop=ids</kbd>一起使用。\n当作为生成器使用时,产生目标页面而不是来源页面。",
+       "apihelp-query+alllinks-param-prop": "要包含的信息束:\n;ids:添加链接中的页面的页面ID(不能与<var>$1unique</var>一起使用)。\n;title:添加链接的标题。",
        "apihelp-query+alllinks-param-namespace": "要列举的名字空间。",
        "apihelp-query+alllinks-param-limit": "总共要返回多少个项目。",
        "apihelp-query+alllinks-param-dir": "列出方向。",
-       "apihelp-query+alllinks-example-unique": "列出唯一的链接标题",
-       "apihelp-query+alllinks-example-unique-generator": "è\8e·å¾\97所有已链接的标题,标记缺少的。",
-       "apihelp-query+alllinks-example-generator": "获取包含这些链接的页面",
+       "apihelp-query+alllinks-example-unique": "列出唯一的链接标题",
+       "apihelp-query+alllinks-example-unique-generator": "è\8e·å\8f\96所有已链接的标题,标记缺少的。",
+       "apihelp-query+alllinks-example-generator": "获取包含这些链接的页面",
        "apihelp-query+allmessages-description": "返回来自该网站的消息。",
        "apihelp-query+allmessages-param-messages": "要输出的消息。<kbd>*</kbd>(默认)表示所有消息。",
        "apihelp-query+allmessages-param-prop": "要获取的属性。",
        "apihelp-query+allmessages-param-prefix": "返回带有该前缀的消息。",
        "apihelp-query+allmessages-example-ipb": "显示以<kbd>ipb-</kbd>开始的消息。",
        "apihelp-query+allmessages-example-de": "显示德语版的<kbd>august</kbd>和<kbd>mainpage</kbd>消息。",
+       "apihelp-query+allpages-description": "循序列举在指定名字空间中的所有页面。",
        "apihelp-query+allpages-param-from": "枚举的起始页面标题。",
        "apihelp-query+allpages-param-to": "枚举的结束页面标题。",
+       "apihelp-query+allpages-param-prefix": "搜索所有以此值开头的页面标题。",
        "apihelp-query+allpages-param-namespace": "要列举的名字空间。",
        "apihelp-query+allpages-param-filterredir": "要列出哪些页面。",
        "apihelp-query+allpages-param-minsize": "限于至少这么多字节的页面。",
        "apihelp-query+allpages-param-maxsize": "限于至多这么多字节的页面。",
        "apihelp-query+allpages-param-prtype": "仅限于受保护页面。",
+       "apihelp-query+allpages-param-prfiltercascade": "过滤基于cascadingness的保护(当$1prtype未设置时忽略)。",
        "apihelp-query+allpages-param-limit": "返回的总计页面数。",
        "apihelp-query+allpages-param-dir": "罗列所采用的方向。",
+       "apihelp-query+allpages-param-filterlanglinks": "过滤基于页面是否有语言链接。注意这可能不考虑由扩展添加的语言链接。",
+       "apihelp-query+allpages-param-prexpiry": "要在页面上过滤的保护期限:\n;indefinite:只获取带无限期保护的页面。\n;definite:只获取带指定保护期限的页面。\n;all:获取任意保护期限的页面。",
        "apihelp-query+allpages-example-B": "显示以字母<kbd>B</kbd>开头的页面的列表。",
        "apihelp-query+allpages-example-generator": "显示有关4个以字母<kbd>T</kbd>开头的页面的信息。",
        "apihelp-query+allpages-example-generator-revisions": "显示前2个以<kbd>Re</kbd>开头的非重定向页面的内容。",
        "apihelp-query+allredirects-description": "列出至一个名字空间的重定向。",
        "apihelp-query+allredirects-param-from": "要列举的起始重定向标题。",
        "apihelp-query+allredirects-param-to": "要列举的最终重定向标题。",
+       "apihelp-query+allredirects-param-prefix": "搜索所有以此值开头的目标页面。",
+       "apihelp-query+allredirects-param-prop": "要包含的信息束:\n;ids:添加重定向页面的页面ID(不能与<var>$1unique</var>一起使用)。\n;title:添加重定向的标题。\n;fragment:添加来自重定向的碎片,如果有(不能与<var>$1unique</var>一起使用)。\n;interwiki:添加来自重定向的跨wiki前缀,如果有(不能与<var>$1unique</var>一起使用)。",
        "apihelp-query+allredirects-param-namespace": "要列举的名字空间。",
        "apihelp-query+allredirects-param-limit": "返回的总计项目数。",
        "apihelp-query+allredirects-param-dir": "罗列所采用的方向。",
-       "apihelp-query+allredirects-example-unique": "列出孤立目标页面",
-       "apihelp-query+allredirects-example-unique-generator": "è\8e·å¾\97æ\89\80æ\9c\89ç\9b®æ \87页é\9d¢ï¼\8cæ \87记丢失ç\9a\84",
-       "apihelp-query+allredirects-example-generator": "è\8e·å¾\97å\8c\85å\90«é\87\8då®\9aå\90\91ç\9a\84页é\9d¢",
+       "apihelp-query+allredirects-example-unique": "列出孤立目标页面",
+       "apihelp-query+allredirects-example-unique-generator": "è\8e·å\8f\96æ\89\80æ\9c\89ç\9b®æ \87页é\9d¢ï¼\8cæ \87记丢失ç\9a\84ã\80\82",
+       "apihelp-query+allredirects-example-generator": "è\8e·å\8f\96å\8c\85å\90«é\87\8då®\9aå\90\91ç\9a\84页é\9d¢ã\80\82",
        "apihelp-query+alltransclusions-description": "列出所有嵌入页面(使用&#123;&#123;x&#125;&#125;嵌入的页面),包括不存在的。",
+       "apihelp-query+alltransclusions-param-from": "要列举的起始嵌入标题。",
+       "apihelp-query+alltransclusions-param-to": "要列举的最终嵌入标题。",
+       "apihelp-query+alltransclusions-param-prefix": "搜索所有以此值开头的嵌入的标题。",
+       "apihelp-query+alltransclusions-param-prop": "要包含的信息束:\n;ids:添加嵌入中的页面的页面ID(不能与$1unique一起使用)。\n;title:添加嵌入的标题。",
        "apihelp-query+alltransclusions-param-namespace": "要列举的名字空间。",
        "apihelp-query+alltransclusions-param-limit": "要返回的总计项目。",
        "apihelp-query+alltransclusions-param-dir": "罗列所采用的方向。",
        "apihelp-query+allusers-description": "列举所有注册用户。",
        "apihelp-query+allusers-param-from": "枚举的起始用户名。",
        "apihelp-query+allusers-param-to": "枚举的结束用户名。",
-       "apihelp-query+allusers-param-prefix": "搜索以此值开始的所有用户。",
+       "apihelp-query+allusers-param-prefix": "搜索所有以此值开头的用户。",
        "apihelp-query+allusers-param-dir": "排序方向。",
        "apihelp-query+allusers-param-group": "只包含指定组中的用户。",
        "apihelp-query+allusers-param-excludegroup": "排除指定组中的用户。",
        "apihelp-query+allusers-param-rights": "仅列出有所选权限的用户。不包括隐性的或自动加入的用户组别(如*、用户或自动确认用户)所授予的权限。",
+       "apihelp-query+allusers-param-prop": "要包含的信息束:\n;blockinfo:添加有关用户当前封禁的信息。\n;groups:列举用户所在的组。这使用更多服务器资源,并可能返回少于限制的结果。\n;implicitgroups:Lists all the groups the user is automatically in.\n;rights:Lists rights that the user has.\n;editcount:Adds the edit count of the user.\n;registration:Adds the timestamp of when the user registered if available (may be blank).",
        "apihelp-query+allusers-param-limit": "返回的总计用户数。",
        "apihelp-query+allusers-param-witheditsonly": "只列出有编辑的用户。",
-       "apihelp-query+allusers-param-activeusers": "只列出最近$1内活跃的用户。",
+       "apihelp-query+allusers-param-activeusers": "只列出最近$1{{PLURAL:$1|天}}内活跃的用户。",
        "apihelp-query+allusers-example-Y": "列出以<kbd>Y</kbd>开头的用户。",
        "apihelp-query+backlinks-description": "查找所有链接至指定页面的页面。",
        "apihelp-query+backlinks-param-title": "要搜索的标题。不能与<var>$1pageid</var>一起使用。",
        "apihelp-query+backlinks-param-pageid": "要搜索的页面ID。不能与<var>$1title</var>一起使用。",
        "apihelp-query+backlinks-param-namespace": "要列举的名字空间。",
        "apihelp-query+backlinks-param-dir": "罗列所采用的方向。",
+       "apihelp-query+backlinks-param-filterredir": "如何过滤重定向。当<var>$1redirect</var>被启用时如果设置为<kbd>nonredirects</kbd>,这只会应用到第二级。",
        "apihelp-query+backlinks-param-limit": "返回总计页面数。如果<var>$1redirect</var>被启用,则限定分别适用于每一等级(这意味着将返回多达2 * <var>$1limit</var>个结果)。",
        "apihelp-query+backlinks-example-simple": "显示至<kbd>Main page<kbd>的链接。",
        "apihelp-query+backlinks-example-generator": "获取关于链接至<kbd>Main page<kbd>的页面的信息。",
        "apihelp-query+blocks-param-end": "枚举的结束时间戳。",
        "apihelp-query+blocks-param-ids": "要列出的封禁ID列表(可选)。",
        "apihelp-query+blocks-param-users": "要搜索的用户列表(可选)。",
+       "apihelp-query+blocks-param-limit": "封禁列表的最大数量。",
        "apihelp-query+blocks-param-prop": "要获取的属性:\n;id:添加封禁ID。\n;user:添加被封禁用户的用户名。\n;userid:添加被封禁用户的用户ID。\n;by:添加执行封禁的用户的用户名。\n;byid:添加执行封禁的用户的用户ID。\n;timestamp:添加封禁生效时的时间戳。\n;expiry:添加封禁截止时的时间戳。\n;reason:添加封禁原因。\n;range:添加受封禁影响的IP地址段。\n;flags:标记编辑禁止(自动封禁、仅限匿名用户等)。",
-       "apihelp-query+blocks-example-simple": "封禁列表",
+       "apihelp-query+blocks-example-simple": "封禁列表",
        "apihelp-query+blocks-example-users": "列出用户<kbd>Alice</kbd>和<kbd>Bob</kbd>的封禁。",
        "apihelp-query+categories-description": "页面属于的所有分类列表。",
        "apihelp-query+categories-param-prop": "要为每个分类获取的额外属性:\n;sortkey:为每个分类添加关键词(十六进制字符串)和关键词前缀(人类可读部分)。\n;timestamp:添加分类添加时的时间戳。\n;hidden:标记由_&#95;HIDDENCAT_&#95;隐藏的分类。",
        "apihelp-query+categorymembers-description": "在指定的分类中列出所有页面。",
        "apihelp-query+categorymembers-param-title": "要列举的分类(必需)。必须包括<kbd>{{ns:category}}:</kbd>前缀。不能与<var>$1pageid</var>一起使用。",
        "apihelp-query+categorymembers-param-pageid": "要枚举的分类的页面 ID。不能与<var>$1title</var>一起使用。",
+       "apihelp-query+categorymembers-param-prop": "要包含的信息束:\n;ids:添加页面ID。\n;title:添加页面标题和名字空间ID。\n;sortkey:Adds the sortkey used for sorting in the category (hexadecimal string).\n;sortkeyprefix:Adds the sortkey prefix used for sorting in the category (human-readable part of the sortkey).\n;type:Adds the type that the page has been categorised as (page, subcat or file).\n;timestamp:Adds the timestamp of when the page was included.",
        "apihelp-query+categorymembers-param-namespace": "仅包含这些名字空间的页面。注意<kbd>$1type=subcat</kbd>或<kbd>$1type=file</kbd>可能被使用,而不是<kbd>$1namespace=14</kbd>或<kbd>6</kbd>。",
        "apihelp-query+categorymembers-param-type": "包含的分类成员类型。当<kbd>$1sort=timestamp</kbd>被设置时会忽略。",
        "apihelp-query+categorymembers-param-limit": "返回页面的最大数量。",
        "apihelp-query+categorymembers-param-endhexsortkey": "结束列举的关键词,由<kbd>$1prop=sortkey</kbd>返回。不能与<kbd>$1sort=sortkey</kbd>一起使用。",
        "apihelp-query+categorymembers-param-startsortkey": "请改用$1starthexsortkey。",
        "apihelp-query+categorymembers-param-endsortkey": "请改用$1endhexsortkey。",
-       "apihelp-query+categorymembers-example-simple": "è\8e·å¾\97<kbd>Category:Physics</kbd>中的前10个页面。",
-       "apihelp-query+categorymembers-example-generator": "è\8e·å¾\97有关<kbd>Category:Physics</kbd>中的前10个页面的页面信息。",
+       "apihelp-query+categorymembers-example-simple": "è\8e·å\8f\96<kbd>Category:Physics</kbd>中的前10个页面。",
+       "apihelp-query+categorymembers-example-generator": "è\8e·å\8f\96有关<kbd>Category:Physics</kbd>中的前10个页面的页面信息。",
        "apihelp-query+contributors-description": "获取对一个页面的登录贡献者列表和匿名贡献数。",
        "apihelp-query+contributors-param-limit": "返回的贡献数。",
        "apihelp-query+contributors-example-simple": "显示<kbd>Main Page</kbd>的贡献。",
        "apihelp-query+deletedrevisions-param-excludeuser": "不要列出此用户做出的修订。",
        "apihelp-query+deletedrevisions-example-titles": "列出页面<kbd>Main Page</kbd>和<kbd>Talk:Main Page</kbd>的已删除修订,包含内容。",
        "apihelp-query+deletedrevisions-example-revids": "列出已删除修订<kbd>123456</kbd>的信息。",
+       "apihelp-query+deletedrevs-description": "列出被删除修订。\n\n操作于三种模式中:\n# 为指定标题列举已删除修订,按时间戳排列。\n# List deleted contributions for the given user, sorted by timestamp (no titles specified).\n# List all deleted revisions in the given namespace, sorted by title and timestamp (no titles specified, $1user not set).\n\nCertain parameters only apply to some modes and are ignored in others.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|模式}}:$2",
+       "apihelp-query+deletedrevs-param-start": "枚举的起始时间戳。",
+       "apihelp-query+deletedrevs-param-end": "枚举的结束时间戳。",
        "apihelp-query+deletedrevs-param-from": "从此标题开始列出。",
        "apihelp-query+deletedrevs-param-to": "列出至此标题为止。",
+       "apihelp-query+deletedrevs-param-prefix": "搜索所有以此值开头的页面标题。",
        "apihelp-query+deletedrevs-param-unique": "每个页面只列出一个修订。",
        "apihelp-query+deletedrevs-param-tag": "只列出被此标签标记的修订。",
        "apihelp-query+deletedrevs-param-user": "只列出此用户做出的修订。",
        "apihelp-query+deletedrevs-param-excludeuser": "不要列出此用户做出的修订。",
        "apihelp-query+deletedrevs-param-namespace": "只列出此名字空间的页面。",
+       "apihelp-query+deletedrevs-param-prop": "要获取的属性:\n;revid:添加被删除修订的修订ID。\n;parentid:添加上一修订的修订ID至页面。\n;user:添加做出修订的用户。\n;userid:添加做出修订的用户ID。\n;comment:添加修订摘要。\n;parsedcomment:添加解析过的修订摘要。\n;minor:如果修订是小编辑则加标签。\n;len:添加修订长度(字节)。\n;sha1:添加修订的SHA-1(base 16)。\n;content:添加修订内容。\n;token:<span class=\"apihelp-deprecated\">已弃用。</span>提供编辑令牌。\n;tags:修订标签。",
        "apihelp-query+deletedrevs-example-mode1": "列出最近已删除的对页面<kbd>Main Page</kbd>和<kbd>Talk:Main Page</kbd>的贡献,带内容(模式1)。",
        "apihelp-query+deletedrevs-example-mode2": "列出由<kbd>Bob</kbd>作出的最近50次已删除贡献(模式2)。",
-       "apihelp-query+deletedrevs-example-mode3-main": "列出前50次主名字空间已删除贡献(模式3)",
-       "apihelp-query+deletedrevs-example-mode3-talk": "列出前50次{{ns:talk}}名字空间已删除页面(模式3)",
+       "apihelp-query+deletedrevs-example-mode3-main": "列出前50次主名字空间已删除贡献(模式3)",
+       "apihelp-query+deletedrevs-example-mode3-talk": "列出前50次{{ns:talk}}名字空间已删除页面(模式3)",
        "apihelp-query+disabled-description": "此查询模块已被禁用。",
        "apihelp-query+duplicatefiles-param-limit": "返回多少重复文件。",
        "apihelp-query+duplicatefiles-param-dir": "罗列所采用的方向。",
        "apihelp-query+duplicatefiles-param-localonly": "只看本地存储库的文件。",
-       "apihelp-query+duplicatefiles-example-simple": "查找与[[:File:Albert Einstein Head.jpg]]重复的文件",
-       "apihelp-query+duplicatefiles-example-generated": "查找所有文件的重复文件",
+       "apihelp-query+duplicatefiles-example-simple": "查找与[[:File:Albert Einstein Head.jpg]]重复的文件。",
+       "apihelp-query+duplicatefiles-example-generated": "查找所有文件的重复文件。",
+       "apihelp-query+embeddedin-description": "查找所有嵌入指定标题的页面。",
        "apihelp-query+embeddedin-param-title": "要搜索的标题。不能与$1pageid一起使用。",
        "apihelp-query+embeddedin-param-pageid": "要搜索的页面ID。不能与$1title一起使用。",
        "apihelp-query+embeddedin-param-namespace": "列举的名字空间。",
        "apihelp-query+extlinks-param-query": "不使用协议搜索字符串。对于检查某一页面是否包含某一外部URL很有用。",
        "apihelp-query+extlinks-param-expandurl": "扩展协议相对URL与规范协议。",
        "apihelp-query+extlinks-example-simple": "获取<kbd>Main Page<kbd>的外部链接列表。",
+       "apihelp-query+exturlusage-description": "列举包含一个指定URL的页面。",
+       "apihelp-query+exturlusage-param-prop": "要包含的信息束:\n;ids:添加页面ID。\n;title:添加页面的标题和名字空间ID。\n;url:添加页面中使用的URL。",
        "apihelp-query+exturlusage-param-protocol": "URL协议。如果为空并且<var>$1query</var>被设置,协议为<kbd>http</kbd>。将此和<var>$1query</var>都留空以列举所有外部链接。",
        "apihelp-query+exturlusage-param-query": "不包括协议的搜索字符串。参见[[Special:LinkSearch]]。留空以列出所有外部链接。",
        "apihelp-query+exturlusage-param-namespace": "要列举的页面名字空间。",
        "apihelp-query+filearchive-param-dir": "罗列所采用的方向。",
        "apihelp-query+filearchive-param-sha1": "图片的SHA1哈希值。覆盖$1sha1base36。",
        "apihelp-query+filearchive-param-sha1base36": "基于base 36的图片的SHA1哈希值(用于MediaWiki)。",
-       "apihelp-query+filearchive-example-simple": "显示已删除文件列表",
+       "apihelp-query+filearchive-example-simple": "显示已删除文件列表",
        "apihelp-query+filerepoinfo-description": "返回有关wiki配置的图片存储库的元信息。",
        "apihelp-query+filerepoinfo-example-simple": "获得有关文件存储库的信息。",
        "apihelp-query+fileusage-description": "查找所有使用指定文件的页面。",
        "apihelp-query+fileusage-param-prop": "要获取的属性:\n;pageid:每个页面的页面ID。\n;title:每个页面的标题。\n;redirect:标记作为重定向的页面。",
        "apihelp-query+fileusage-param-namespace": "只包括这些名字空间的页面。",
        "apihelp-query+fileusage-param-limit": "返回多少。",
-       "apihelp-query+fileusage-example-simple": "获取使用[[:File:Example.jpg]]的页面列表",
-       "apihelp-query+fileusage-example-generator": "获取有关使用[[:File:Example.jpg]]的页面的信息",
+       "apihelp-query+fileusage-example-simple": "获取使用[[:File:Example.jpg]]的页面列表",
+       "apihelp-query+fileusage-example-generator": "获取有关使用[[:File:Example.jpg]]的页面的信息",
        "apihelp-query+imageinfo-description": "返回文件信息和上传历史。",
        "apihelp-query+imageinfo-param-prop": "要获取的文件信息:",
        "apihelp-query+imageinfo-paramvalue-prop-timestamp": "添加时间戳至上传的版本。",
        "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "解析版本上的注释。",
        "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "添加文件的规范标题。",
        "apihelp-query+imageinfo-paramvalue-prop-url": "为文件及其描述页面提供URL。",
-       "apihelp-query+imageinfo-paramvalue-prop-dimensions": "大小别名。",
+       "apihelp-query+imageinfo-paramvalue-prop-size": "添加文件大小(字节)及其高度、宽度和页面数(如果可以)。",
+       "apihelp-query+imageinfo-paramvalue-prop-dimensions": "用于大小的别名。",
        "apihelp-query+imageinfo-paramvalue-prop-sha1": "为文件加入SHA-1哈希值。",
        "apihelp-query+imageinfo-paramvalue-prop-mime": "添加文件的MIME类型。",
+       "apihelp-query+imageinfo-paramvalue-prop-thumbmime": "添加图片缩略图的MIME类型(需要url和参数$1urlwidth)。",
        "apihelp-query+imageinfo-paramvalue-prop-mediatype": "添加文件媒体类型。",
        "apihelp-query+imageinfo-paramvalue-prop-metadata": "列出这个版本的文件的EXIF元数据。",
+       "apihelp-query+imageinfo-paramvalue-prop-commonmetadata": "为文件的修订版本列出文件格式相关元数据。",
+       "apihelp-query+imageinfo-paramvalue-prop-extmetadata": "列出结合自多个来源的格式化的元数据。结果均依HTML格式化。",
+       "apihelp-query+imageinfo-paramvalue-prop-archivename": "添加用于非最新修订的存档修订的文件名。",
+       "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "添加修订的字节深度。",
+       "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "由Special:Upload所使用,以获取关于现有文件的信息。不适用于MediaWiki核心以外代码。",
        "apihelp-query+imageinfo-param-limit": "每个文件返回多少文件修订。",
        "apihelp-query+imageinfo-param-start": "开始列举的时间戳。",
        "apihelp-query+imageinfo-param-end": "列举的结束时间戳。",
        "apihelp-query+imageusage-param-pageid": "要搜索的页面ID。不能与$1title一起使用。",
        "apihelp-query+imageusage-param-namespace": "要列举的名字空间。",
        "apihelp-query+imageusage-param-dir": "罗列所采用的方向。",
-       "apihelp-query+imageusage-example-simple": "显示使用[[:File:Albert Einstein Head.jpg]]的页面",
-       "apihelp-query+imageusage-example-generator": "获取有关使用[[:File:Albert Einstein Head.jpg]]的页面的信息",
+       "apihelp-query+imageusage-example-simple": "显示使用[[:File:Albert Einstein Head.jpg]]的页面",
+       "apihelp-query+imageusage-example-generator": "获取有关使用[[:File:Albert Einstein Head.jpg]]的页面的信息",
        "apihelp-query+info-description": "获取基本页面信息。",
        "apihelp-query+info-param-prop": "要获取的额外属性:",
        "apihelp-query+info-paramvalue-prop-protection": "列出每个页面的保护等级。",
        "apihelp-query+info-paramvalue-prop-talkid": "每个非讨论页面的讨论页的页面ID。",
        "apihelp-query+info-paramvalue-prop-watched": "列出每个页面的被监视状态。",
        "apihelp-query+info-paramvalue-prop-watchers": "监视人员数,如果允许。",
+       "apihelp-query+info-paramvalue-prop-notificationtimestamp": "每个页面的监视列表通知时间戳。",
        "apihelp-query+info-paramvalue-prop-subjectid": "每个讨论页的母页面的页面ID。",
        "apihelp-query+info-paramvalue-prop-readable": "用户是否可以阅读此页面。",
        "apihelp-query+info-paramvalue-prop-preload": "提供由EditFormPreloadText返回的文本。",
        "apihelp-query+info-param-token": "请改用[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。",
        "apihelp-query+info-example-simple": "获取有关页面<kbd>Main Page</kbd>的信息。",
        "apihelp-query+info-example-protection": "获取<kbd>Main Page</kbd>相关的常规和保护信息。",
+       "apihelp-query+iwbacklinks-description": "查找所有链接至指定跨wiki链接的页面。\n\n可被用于查找带某一前缀的所有链接,或所有至某一标题的链接(带指定前缀)。两参数都不使用就意味着“所有跨wiki链接”。",
        "apihelp-query+iwbacklinks-param-prefix": "跨维基前缀。",
        "apihelp-query+iwbacklinks-param-title": "要搜索的跨wiki链接。必须与<var>$1blprefix</var>一起使用。",
        "apihelp-query+iwbacklinks-param-limit": "返回的总计页面数。",
        "apihelp-query+iwbacklinks-param-prop": "要获取的属性:\n;iwprefix:加入跨wiki前缀。\n;iwtitle:加入跨wiki标题。",
        "apihelp-query+iwbacklinks-param-dir": "罗列所采用的方向。",
-       "apihelp-query+iwbacklinks-example-simple": "è\8e·å¾\97链接至[[wikibooks:Test]]的页面。",
-       "apihelp-query+iwbacklinks-example-generator": "è\8e·å¾\97有关链接至[[wikibooks:Test]]的页面的信息。",
+       "apihelp-query+iwbacklinks-example-simple": "è\8e·å\8f\96链接至[[wikibooks:Test]]的页面。",
+       "apihelp-query+iwbacklinks-example-generator": "è\8e·å\8f\96有关链接至[[wikibooks:Test]]的页面的信息。",
        "apihelp-query+iwlinks-description": "从指定页面返回所有跨wiki链接。",
        "apihelp-query+iwlinks-param-url": "是否获取完整URL(不能与$1prop一起使用)。",
        "apihelp-query+iwlinks-param-limit": "返回多少跨wiki链接。",
        "apihelp-query+langbacklinks-param-limit": "返回的总计页面数。",
        "apihelp-query+langbacklinks-param-prop": "要获得的属性:\n;lllang:添加语言链接的语言代码。\n;lltitle:添加语言链接的标题。",
        "apihelp-query+langbacklinks-param-dir": "罗列所采用的方向。",
-       "apihelp-query+langbacklinks-example-simple": "获取链接至[[:fr:Test]]的页面",
-       "apihelp-query+langbacklinks-example-generator": "获取链接至[[:fr:Test]]的页面的信息",
+       "apihelp-query+langbacklinks-example-simple": "获取链接至[[:fr:Test]]的页面",
+       "apihelp-query+langbacklinks-example-generator": "获取链接至[[:fr:Test]]的页面的信息",
        "apihelp-query+langlinks-description": "从指定页面返回所有跨语言链接。",
        "apihelp-query+langlinks-param-limit": "返回多少语言链接。",
        "apihelp-query+langlinks-param-url": "是否获取完整URL(不能与<var>$1prop</var>一起使用)。",
        "apihelp-query+links-param-namespace": "只显示这些名字空间的链接。",
        "apihelp-query+links-param-limit": "返回多少链接。",
        "apihelp-query+links-param-dir": "罗列所采用的方向。",
-       "apihelp-query+links-example-simple": "从页面<kbd>Main Page</kbd>获取链接",
+       "apihelp-query+links-example-simple": "从页面<kbd>Main Page</kbd>获取链接",
        "apihelp-query+links-example-generator": "获取有关在页面<kbd>Main Page</kbd>中连接的页面的信息。",
        "apihelp-query+links-example-namespaces": "获取在{{ns:user}}和{{ns:template}}名字空间中来自页面<kbd>Main Page</kbd>的链接。",
        "apihelp-query+linkshere-description": "查找所有链接至指定页面的页面。",
-       "apihelp-query+linkshere-param-prop": "è¦\81è\8e·å¾\97的属性:\n;pageid:每个页面的页面ID。\n;title:每个页面的标题。\n;redirect:如果页面是一个重定向就标记。",
+       "apihelp-query+linkshere-param-prop": "è¦\81è\8e·å\8f\96的属性:\n;pageid:每个页面的页面ID。\n;title:每个页面的标题。\n;redirect:如果页面是一个重定向就标记。",
        "apihelp-query+linkshere-param-namespace": "只包括这些名字空间的页面。",
        "apihelp-query+linkshere-param-limit": "返回多少。",
        "apihelp-query+linkshere-param-show": "只显示符合以下标准的项:\n;redirect:只显示重定向。\n;!redirect:只显示非重定向。",
        "apihelp-query+logevents-param-start": "枚举的起始时间戳。",
        "apihelp-query+logevents-param-end": "枚举的结束时间戳。",
        "apihelp-query+logevents-param-prefix": "过滤以此前缀开头的记录。",
-       "apihelp-query+logevents-example-simple": "列出最近日志活动",
+       "apihelp-query+logevents-example-simple": "列出最近日志活动",
        "apihelp-query+pagepropnames-description": "列出wiki中所有使用中的页面属性名称。",
        "apihelp-query+pagepropnames-param-limit": "返回名称的最大数量。",
        "apihelp-query+pagepropnames-example-simple": "获取前10个属性名称。",
        "apihelp-query+pageprops-example-simple": "获取用于页面<kbd>Main Page</kbd>和<kbd>MediaWiki</kbd>的属性。",
        "apihelp-query+pageswithprop-description": "列出所有使用指定页面属性的页面。",
+       "apihelp-query+pageswithprop-param-prop": "要包含的信息束:\n;ids:添加页面ID。\n;title:添加页面的标题和名字空间ID。\n;value:添加页面属性值。",
        "apihelp-query+pageswithprop-param-limit": "返回页面的最大数量。",
        "apihelp-query+pageswithprop-param-dir": "排序的方向。",
        "apihelp-query+pageswithprop-example-simple": "列出前10个使用<code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>的页面。",
-       "apihelp-query+pageswithprop-example-generator": "获取有关前10个使用<code>_&#95;NOTOC_&#95;</code>的页面的信息。",
+       "apihelp-query+pageswithprop-example-generator": "获取有关前10个使用<code>_&#95;NOTOC_&#95;</code>的页面的额外信息。",
        "apihelp-query+prefixsearch-param-search": "搜索字符串。",
        "apihelp-query+prefixsearch-param-namespace": "搜索的名字空间。",
        "apihelp-query+prefixsearch-param-limit": "要返回的结果最大数。",
        "apihelp-query+prefixsearch-example-simple": "搜索以<kbd>meaning</kbd>开头的页面标题。",
        "apihelp-query+protectedtitles-param-namespace": "只列出这些名字空间的标题。",
        "apihelp-query+protectedtitles-param-limit": "返回的总计页面数。",
-       "apihelp-query+protectedtitles-example-simple": "受保护标题列表",
+       "apihelp-query+protectedtitles-example-simple": "受保护标题列表",
        "apihelp-query+protectedtitles-example-generator": "找到主命名空间中已保护的标题的链接。",
        "apihelp-query+querypage-param-limit": "返回的结果数。",
        "apihelp-query+querypage-example-ancientpages": "返回[[Special:Ancientpages]]的结果。",
        "apihelp-query+random-param-limit": "限制返回多少随机页面。",
        "apihelp-query+random-param-redirect": "加载一个随机重定向而不是一个随机页面。",
        "apihelp-query+random-example-simple": "从主名字空间返回两个随机页面。",
-       "apihelp-query+random-example-generator": "返回有关来自主名字空间的两个随机页面的页面信息",
+       "apihelp-query+random-example-generator": "返回有关来自主名字空间的两个随机页面的页面信息",
        "apihelp-query+recentchanges-description": "枚举最近更改。",
        "apihelp-query+recentchanges-param-start": "枚举的起始时间戳。",
        "apihelp-query+recentchanges-param-end": "枚举的结束时间戳。",
        "apihelp-query+recentchanges-param-token": "请改用<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
        "apihelp-query+recentchanges-param-limit": "返回总计更新数。",
        "apihelp-query+recentchanges-param-type": "显示的更改类型。",
-       "apihelp-query+recentchanges-example-simple": "最近更改列表",
+       "apihelp-query+recentchanges-example-simple": "最近更改列表",
        "apihelp-query+redirects-description": "返回至指定页面的所有重定向。",
        "apihelp-query+redirects-param-namespace": "只包含这些名字空间的页面。",
        "apihelp-query+redirects-param-limit": "返回多少重定向。",
        "apihelp-query+redirects-example-simple": "获取至[[Main Page]]的重定向列表。",
        "apihelp-query+redirects-example-generator": "获取所有重定向至[[Main Page]]的信息。",
        "apihelp-query+revisions-paraminfo-singlepageonly": "可能只能与单一页面使用(模式#2)。",
+       "apihelp-query+revisions-param-end": "列举直至此时间戳。",
        "apihelp-query+revisions-example-content": "获取带内容的数据,用于标题<kbd>API</kbd>和<kbd>Main Page</kbd>的最近修订。",
        "apihelp-query+revisions-example-last5": "获取<kbd>Main Page</kbd>的最近5次修订。",
        "apihelp-query+revisions-example-first5": "获取<kbd>Main Page</kbd>的前5次修订。",
        "apihelp-query+revisions-example-first5-after": "获取<kbd>Main Page</kbd>于2006年05月01日之后做出的前5次修订版本。",
        "apihelp-query+revisions-example-first5-not-localhost": "获取<kbd>Main Page</kbd>的前5次不是由匿名用户<kbd>127.0.0.1</kbd>做出的修订。",
        "apihelp-query+revisions-example-first5-user": "获取<kbd>Main Page</kbd>的前5次由用户<kbd>MediaWiki default</kbd>做出的修订。",
+       "apihelp-query+revisions+base-param-prop": "要为每个修订获取的属性:",
        "apihelp-query+revisions+base-paramvalue-prop-ids": "修订ID。",
        "apihelp-query+revisions+base-paramvalue-prop-flags": "修订标记(小编辑)。",
+       "apihelp-query+revisions+base-paramvalue-prop-timestamp": "修订的时间戳。",
+       "apihelp-query+revisions+base-paramvalue-prop-user": "做出修订的用户。",
+       "apihelp-query+revisions+base-paramvalue-prop-userid": "修订创建者的用户ID。",
+       "apihelp-query+revisions+base-paramvalue-prop-size": "修订的长度(字节)。",
+       "apihelp-query+revisions+base-paramvalue-prop-sha1": "修订的SHA-1(base 16)。",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "修订的内容模型ID。",
+       "apihelp-query+revisions+base-paramvalue-prop-comment": "由用户对修订做出的摘要。",
+       "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "由用户对修订做出的被解析的摘要。",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "修订文本。",
+       "apihelp-query+revisions+base-paramvalue-prop-tags": "修订标签。",
+       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "修订内容的XML解析树(需要内容模型<code>$1</code>)。",
        "apihelp-query+revisions+base-param-limit": "限制返回多少修订。",
+       "apihelp-query+revisions+base-param-expandtemplates": "展开修订内容中的模板(需要$1prop=content)。",
        "apihelp-query+revisions+base-param-generatexml": "生成用于修订内容的XML解析树(需要$1prop=content;被<kbd>$1prop=parsetree</kbd>所取代)。",
+       "apihelp-query+revisions+base-param-parse": "解析修订内容(需要$1prop=content)。由于性能原因,如果此选项被使用,$1limit会被强制为1。",
+       "apihelp-query+revisions+base-param-section": "只检索此段落数的内容。",
+       "apihelp-query+revisions+base-param-diffto": "要比较修订差异的修订ID。使用<kbd>prev</kbd>、<kbd>next</kbd>和<kbd>cur</kbd>分别用于上个、下个和当前修订。",
+       "apihelp-query+revisions+base-param-difftotext": "要比较修订差异的文本。只有修订的有限数字内的差异。覆盖<var>$1diffto</var>。如果<var>$1section</var>被设置,只有那个段落将与此文本之间比较差异",
+       "apihelp-query+revisions+base-param-contentformat": "序列化用于<var>$1difftotext</var>的格式并预估内容输出。",
        "apihelp-query+search-description": "执行一次全文本搜索。",
        "apihelp-query+search-param-search": "搜索所有匹配此值的页面标题或内容。根据wiki的搜索后端工具,您可以使用搜索字符串以调用特殊搜索功能。",
        "apihelp-query+search-param-namespace": "只在这些名字空间搜索。",
        "apihelp-query+search-example-generator": "获得有关搜索<kbd>meaning</kbd>返回页面的页面信息。",
        "apihelp-query+siteinfo-description": "返回有关网站的一般信息。",
        "apihelp-query+siteinfo-param-prop": "要获取的信息:\n;general:全部系统信息。\n;namespaces:注册的名字空间及其规范名称列表。\n;namespacealiases:注册的名字空间别名列表。\n;specialpagealiases:特殊页面别名列表。\n;magicwords:魔术字及其别名列表。\n;statistics:返回网站统计。\n;interwikimap:返回跨wiki映射(可选过滤,可选择使用<var>$1inlanguagecode</var>本地化)。\n;dbrepllag:返回数据库服务器与最高反应延迟。\n;usergroups:返回用户组及其相关权限。\n;libraries:返回wiki上安装的库。\n;extensions:返回wiki上安装的扩展。\n;fileextensions:返回允许上传的文件扩展名列表。\n;rightsinfo:如果可用,返回wiki的版权信息。\n;restrictions:返回可用的编辑限制(保护)类型信息。\n;languages:返回MediaWiki支持的语言列表(可选择使用<var>$1inlanguagecode</var>本地化)。\n;skins:返回所有启用的皮肤列表(可选择使用<var>$1inlanguagecode</var>本地化,否则是内容语言)。\n;extensiontags:返回解析器扩展标签列表。\n;functionhooks:返回解析器函数钩列表。\n;showhooks:返回所有订阅的钩列表(<var>[[mw:Manual:$wgHooks|$wgHooks]]</var>的内容)。\n;variables:返回变量ID列表。\n;protocols:返回外部链接中允许的协议列表。\n;defaultoptions:返回用户设置的默认值。",
+       "apihelp-query+siteinfo-param-filteriw": "只返回跨wiki地图中的本地或非本地记录。",
        "apihelp-query+siteinfo-param-showalldb": "列出所有数据库服务器,不只是最落后的那个。",
        "apihelp-query+siteinfo-param-numberingroup": "列出用户组中的用户数。",
        "apihelp-query+siteinfo-param-inlanguagecode": "用于本地化语言名称(尽可能)和皮肤名称的语言代码。",
-       "apihelp-query+siteinfo-example-simple": "获取网站信息",
-       "apihelp-query+siteinfo-example-interwiki": "获取本地跨wiki前缀列表",
+       "apihelp-query+siteinfo-example-simple": "取得网站信息。",
+       "apihelp-query+siteinfo-example-interwiki": "取得本地跨wiki前缀列表。",
        "apihelp-query+siteinfo-example-replag": "检查当前的响应延迟。",
        "apihelp-query+stashimageinfo-description": "返回用于藏匿文件的文件信息。",
+       "apihelp-query+stashimageinfo-param-sessionkey": "$1filekey的别名,用于向后兼容。",
        "apihelp-query+stashimageinfo-example-simple": "返回藏匿文件的信息。",
        "apihelp-query+tags-description": "列出更改标签。",
        "apihelp-query+tags-param-limit": "列出标签的最大数量。",
        "apihelp-query+tags-param-prop": "要获取哪个属性:\n;name:添加标签名称。\n;displayname:为标签添加系统消息。\n;description:为标签添加描述。\n;hitcount:已添加此标签的修订版本与日志数量。\n;defined:标识标签是否已定义。\n;source:获得标签来源,它可能包括用于扩展定义的标签的<samp>extension</samp>,以及用于可被用户手动应用的标签的<samp>manual</samp>。\n;active:标签是否仍可被应用。",
-       "apihelp-query+tags-example-simple": "可用标签列表",
+       "apihelp-query+tags-example-simple": "可用标签列表",
        "apihelp-query+templates-description": "返回指定页面上所有被嵌入的页面。",
        "apihelp-query+templates-param-namespace": "只显示此名字空间的模板。",
        "apihelp-query+templates-param-limit": "返回的模板数量。",
        "apihelp-query+tokens-param-type": "要请求的令牌类型。",
        "apihelp-query+tokens-example-simple": "检索一个csrf令牌(默认)。",
        "apihelp-query+tokens-example-types": "检索一个监视令牌和一个巡查令牌。",
+       "apihelp-query+transcludedin-param-prop": "要获取的属性:\n;pageid:每个页面的页面ID。\n;title:每个页面的标题。\n;redirect:标记作为重定向的页面。",
        "apihelp-query+transcludedin-param-namespace": "至包含这些名字空间的页面。",
        "apihelp-query+transcludedin-param-limit": "返回多少。",
+       "apihelp-query+transcludedin-param-show": "只显示符合以下标准的项:\n;redirect:只显示重定向。\n;!redirect:只显示非重定向。",
        "apihelp-query+transcludedin-example-simple": "获取嵌入<kbd>Main Page</kbd>的页面列表。",
        "apihelp-query+transcludedin-example-generator": "获取有关嵌入<kbd>Main Page</kbd>的页面的信息。",
        "apihelp-query+usercontribs-description": "获取一位用户的所有编辑。",
        "apihelp-query+usercontribs-param-limit": "返回贡献的最大数量。",
        "apihelp-query+usercontribs-param-start": "返回的起始时间戳。",
        "apihelp-query+usercontribs-param-end": "返回的最终时间戳。",
+       "apihelp-query+usercontribs-param-user": "要检索贡献的用户。",
        "apihelp-query+usercontribs-param-namespace": "只列出这些名字空间的贡献。",
+       "apihelp-query+usercontribs-param-prop": "包含额外的信息束:\n;ids:添加页面ID和修订ID。\n;title:添加页面标题及其名字空间ID。\n;timestamp:添加编辑的时间戳。\n;comment:添加编辑摘要。\n;parsedcomment:添加被解析的编辑摘要。\n;size:添加编辑的新大小。\n;sizediff:添加与父编辑相比该编辑的大小变化。\n;flags:添加编辑标记。\n;patrolled:标记已巡查编辑。\n;tags:列举用于编辑的标签。",
+       "apihelp-query+usercontribs-param-show": "只显示符合这些标准的项目,例如只显示不是小编辑的编辑:<kbd>$2show=!minor</kbd>。\n\n如果<kbd>$2show=patrolled</kbd>或<kbd>$2show=!patrolled</kbd>被设定,早于<var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var>($1秒)的修订不会被显示。",
        "apihelp-query+usercontribs-example-user": "显示用户<kbd>Example</kbd>的贡献。",
        "apihelp-query+usercontribs-example-ipprefix": "显示来自<kbd>192.0.2.</kbd>前缀所有 IP 地址的贡献。",
        "apihelp-query+userinfo-description": "获取有关当前用户的信息。",
-       "apihelp-query+userinfo-example-simple": "获取有关当前用户的信息",
-       "apihelp-query+userinfo-example-data": "获取有关当前用户的额外信息",
+       "apihelp-query+userinfo-param-prop": "要包含的信息束:\n;blockinfo:如果当前用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。\n;hasmsg:如果当前用户有等待中的消息的话,添加标签<samp>messages</samp>。\n;groups:Lists all the groups the current user belongs to.\n;implicitgroups:Lists all the groups the current user is automatically a member of.\n;rights:Lists all the rights the current user has.\n;changeablegroups:Lists the groups the current user can add to and remove from.\n;options:Lists all preferences the current user has set.\n;preferencestoken:<span class=\"apihelp-deprecated\">Deprecated.</span> Get a token to change current user's preferences.\n;editcount:Adds the current user's edit count.\n;ratelimits:Lists all rate limits applying to the current user.\n;realname:Adds the user's real name.\n;email:Adds the user's email address and email authentication date.\n;acceptlang:Echoes the <code>Accept-Language</code> header sent by the client in a structured format.\n;registrationdate:Adds the user's registration date.\n;unreadcount:Adds the count of unread pages on the user's watchlist (maximum $1; returns <samp>$2</samp> if more).",
+       "apihelp-query+userinfo-example-simple": "获取有关当前用户的信息。",
+       "apihelp-query+userinfo-example-data": "获取有关当前用户的额外信息。",
        "apihelp-query+users-description": "获取有关列出用户的信息。",
+       "apihelp-query+users-param-prop": "要包含的信息束:\n;blockinfo:如果用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。\n;groups:列举每位用户属于的所有组。\n;implicitgroups:Lists all the groups a user is automatically a member of.\n;rights:Lists all the rights each user has.\n;editcount:Adds the user's edit count.\n;registration:Adds the user's registration timestamp.\n;emailable:Tags if the user can and wants to receive email through [[Special:Emailuser]].\n;gender:Tags the gender of the user. Returns \"male\", \"female\", or \"unknown\".",
        "apihelp-query+users-param-token": "请改用<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
        "apihelp-query+users-example-simple": "返回用户<kbd>Example</kbd>的信息。",
        "apihelp-query+watchlist-param-start": "枚举的起始时间戳。",
        "apihelp-query+watchlist-param-user": "只列出此用户的更改。",
        "apihelp-query+watchlist-param-excludeuser": "不要列出此用户的更改。",
        "apihelp-query+watchlist-param-limit": "根据结果返回的结果总数。",
+       "apihelp-query+watchlist-param-prop": "要获取的额外属性:",
+       "apihelp-query+watchlist-paramvalue-prop-ids": "添加修订ID和页面ID。",
+       "apihelp-query+watchlist-paramvalue-prop-title": "添加页面标题。",
+       "apihelp-query+watchlist-paramvalue-prop-flags": "为编辑添加标记。",
+       "apihelp-query+watchlist-paramvalue-prop-user": "添加做出编辑的用户。",
+       "apihelp-query+watchlist-paramvalue-prop-userid": "添加做出编辑的用户的ID。",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "添加编辑摘要。",
+       "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "添加解析过的编辑摘要。",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "添加编辑时间戳。",
+       "apihelp-query+watchlist-paramvalue-prop-patrol": "将编辑标记为已巡查。",
+       "apihelp-query+watchlist-paramvalue-prop-sizes": "添加页面的旧有长度和新长度。",
+       "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "添加最近被通知有关编辑的用户的时间戳。",
+       "apihelp-query+watchlist-paramvalue-prop-loginfo": "在适当位置添加日志信息。",
+       "apihelp-query+watchlist-param-type": "要显示的更改类型:\n;edit:定期页面编辑。\n;external:外部更改。\n;new:页面创建。\n;log:日志记录。",
        "apihelp-query+watchlist-param-token": "允许访问其他用户监视列表的安全密钥(可通过用户的[[Special:Preferences#mw-prefsection-watchlist|参数设置]]找到)。",
        "apihelp-query+watchlist-example-generator": "在当前用户的监视列表中检索用于最近更改页面的页面信息。",
        "apihelp-query+watchlistraw-description": "获得当前用户的监视列表上的所有页面。",
        "apihelp-query+watchlistraw-param-namespace": "只列出指定名字空间的页面。",
        "apihelp-query+watchlistraw-param-limit": "根据结果返回的结果总数。",
+       "apihelp-query+watchlistraw-param-prop": "要获取的额外属性:\n;changed:添加最近被通知有关编辑的用户的时间戳。",
        "apihelp-query+watchlistraw-param-token": "允许访问其他用户监视列表的安全密钥(可通过用户的[[Special:Preferences#mw-prefsection-watchlist|参数设置]]找到)。",
        "apihelp-query+watchlistraw-param-fromtitle": "要列举的起始标题(带名字空间前缀)。",
        "apihelp-query+watchlistraw-param-totitle": "要列举的最终标题(带名字空间前缀)。",
        "apihelp-revisiondelete-param-reason": "删除或恢复的原因。",
        "apihelp-revisiondelete-example-revision": "隐藏<kbd>首页</kbd>的修订版本<kbd>12345</kbd>的内容。",
        "apihelp-revisiondelete-example-log": "隐藏日志记录<kbd>67890</kbd>上的所有数据,原因<kbd>BLP violation</kbd>。",
+       "apihelp-rollback-description": "撤销对页面的最近编辑。\n\n如果最近编辑页面的用户在一行中进行多次编辑,所有编辑将被回退。",
        "apihelp-rollback-param-title": "要回退的页面标题。不能与<var>$1pageid</var>一起使用。",
        "apihelp-rollback-param-pageid": "要回退的页面的页面 ID。不能与<var>$1title</var>一起使用。",
        "apihelp-rollback-param-watchlist": "无条件地将页面加入至当前用户的监视列表或将其移除,使用设置或不更改监视。",
        "apihelp-rollback-example-simple": "回退由用户<kbd>Example</kbd>对<kbd>Main Page</kbd>做出的最近编辑。",
        "apihelp-rollback-example-summary": "回退由IP用户<kbd>192.0.2.5</kbd>对页面<kbd>Main Page</kbd>做出的最近编辑,带编辑摘要<kbd>Reverting vandalism</kbd>,并将这些编辑和回退标记为机器人编辑。",
-       "apihelp-rsd-description": "导出一个RSD(Really Simple Discovery)架构",
-       "apihelp-rsd-example-simple": "导出RSD架构",
+       "apihelp-rsd-description": "导出一个RSD(Really Simple Discovery)架构",
+       "apihelp-rsd-example-simple": "导出RSD架构",
        "apihelp-setnotificationtimestamp-description": "更新用于监视页面的通知时间戳。\n\n这会影响监视列表和历史中已更改页面的高亮度,并且如果“当我的监视列表中的页面被更改时发送电子邮件通知我”的设置被启用的话,也会影响电子邮件的发送。",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "工作于所有已监视页面。",
        "apihelp-setnotificationtimestamp-param-timestamp": "要设置通知时间戳的时间戳。",
        "apihelp-unblock-param-reason": "解封的原因。",
        "apihelp-unblock-example-id": "解封封禁ID #<kbd>105</kbd>。",
        "apihelp-unblock-example-user": "解封用户<kbd>Bob</kbd>,原因<kbd>Sorry Bob</kbd>。",
+       "apihelp-undelete-description": "恢复一个被删除页面的修订。\n\n被删除修订的列表(包括时间戳)可通过[[Special:ApiHelp/query+deletedrevs|list=deletedrevs]]检索到,并且被删除的文件ID列表可通过[[Special:ApiHelp/query+filearchive|list=filearchive]]检索到。",
        "apihelp-undelete-param-title": "要恢复的页面标题。",
        "apihelp-undelete-param-reason": "恢复的原因。",
        "apihelp-undelete-param-fileids": "要恢复的文件修订ID。如果<var>$1timestamps</var>和<var>$1fileids</var>都为空,所有将被恢复。",
        "apihelp-upload-param-filesize": "全部上传的文件大小。",
        "apihelp-upload-param-offset": "块的偏移量(字节)。",
        "apihelp-upload-param-chunk": "大块内容。",
-       "apihelp-upload-example-url": "从URL上传",
+       "apihelp-upload-example-url": "从URL上传",
        "apihelp-upload-example-filekey": "完成一次由于警告而失败的上传。",
        "apihelp-userrights-description": "更改一位用户的组成员。",
        "apihelp-userrights-param-user": "用户名。",
        "apihelp-userrights-param-reason": "更改原因。",
        "apihelp-userrights-example-user": "将用户<kbd>FooBot</kbd>添加至<kbd>bot</kbd>用户组,并从<kbd>sysop</kbd>和<kbd>bureaucrat</kbd>组移除。",
        "apihelp-userrights-example-userid": "将ID为<kbd>123</kbd>的用户加入至<kbd>机器人</kbd>组,并将其从<kbd>管理员</kbd>和<kbd>行政员</kbd>组移除。",
+       "apihelp-watch-description": "从当前用户的监视列表中添加或移除页面。",
        "apihelp-watch-param-title": "要(取消)监视的页面。也可使用<var>$1titles</var>。",
        "apihelp-watch-example-watch": "监视页面<kbd>Main Page</kbd>。",
        "apihelp-watch-example-unwatch": "取消监视页面<kbd>Main Page</kbd>。",
        "apihelp-txtfm-description": "输出数据为PHP的<code>print_r()</code>格式(HTML优质打印效果)。",
        "apihelp-xml-description": "输出数据为XML格式。",
        "apihelp-xml-param-xslt": "如果指定,加入已命名的页面作为一个XSL样式表。值必须是在{{ns:mediawiki}}名字空间以<code>.xsl</code>为结尾的标题。",
+       "apihelp-xml-param-includexmlnamespace": "如果指定,添加一个XML名字空间。",
        "apihelp-xmlfm-description": "输出数据为XML格式(HTML优质打印效果)。",
        "apihelp-yaml-description": "输出数据为YAML格式。",
        "apihelp-yamlfm-description": "输出数据为YAML格式(HTML优质打印效果)。",
        "api-format-title": "MediaWiki API 结果",
        "api-format-prettyprint-header": "这是$1格式的HTML表示。HTML对调试很有用,但不适合应用程序使用。\n\n指定<var>format</var>参数以更改输出格式。要查看$1格式的非HTML表示,设置<kbd>format=$2</kbd>。\n\n参见[[mw:API|完整文档]],或[[Special:ApiHelp/main|API 帮助]]以获取更多信息。",
+       "api-format-prettyprint-header-only-html": "这是用来调试的HTML表现,不适合实际使用。\n\n参见[[mw:API|完整文档]],或[[Special:ApiHelp/main|API帮助]]以获取更多信息。",
        "api-orm-param-props": "要查询的字段。",
        "api-orm-param-limit": "返回的总行数。",
        "api-pageset-param-titles": "要工作的标题列表。",
        "api-pageset-param-pageids": "要工作的页面ID列表。",
        "api-pageset-param-revids": "要工作的修订ID列表。",
        "api-pageset-param-generator": "通过执行指定查询模块获得页面列表以工作。\n\n<strong>注意:</strong>发生器参数名称必须以“g”开头,参见例子。",
+       "api-pageset-param-redirects-generator": "自动解决在<var>$1titles</var>、<var>$1pageids</var>和<var>$1revids</var>,以及在由<var>$1generator</var>返回的页面中的重定向。",
        "api-pageset-param-redirects-nogenerator": "自动解决<var>$1titles</var>、<var>$1pageids</var>和<var>$1revids</var>中的重定向。",
+       "api-pageset-param-converttitles": "如有需要,将标题转换为其他变体。只有当wiki的内容语言支持变体转换时才能工作。支持变体转换的语言包括$1。",
        "api-help-title": "MediaWiki API 帮助",
        "api-help-lead": "这是自动生成的MediaWiki API文档页面。\n\n文档和例子:https://www.mediawiki.org/wiki/API:Main_page/zh",
        "api-help-main-header": "主模块",
        "api-help-param-integer-min": "{{PLURAL:$1|值}}必须不少于$2。",
        "api-help-param-integer-max": "{{PLURAL:$1|值}}必须不大于$3。",
        "api-help-param-integer-minmax": "{{PLURAL:$1|值}}必须介于$2和$3之间。",
+       "api-help-param-upload": "必须被公布为使用multipart/form-data的一次文件上传。",
        "api-help-param-multi-separate": "通过“<kbd>|</kbd>”隔开各值。",
        "api-help-param-multi-max": "值的最高数字是{{PLURAL:$1|$1}}(对于机器人则是{{PLURAL:$2|$2}})。",
        "api-help-param-default": "默认:$1",
index 8531e23..b1e6d95 100644 (file)
@@ -43,7 +43,7 @@
        "apihelp-createaccount-param-name": "使用者名稱。",
        "apihelp-createaccount-param-password": "密碼 (若有設定 <var>$1mailpassword</var> 則可略過)。",
        "apihelp-createaccount-param-domain": "外部認証使用的網域 (選填)。",
-       "apihelp-createaccount-param-token": "å·²å\8f\96å¾\97帳è\99\9f建ç«\8bå¯\86é\91°æ\96¼ç¬¬ä¸\80次è«\8bæ±\82。",
+       "apihelp-createaccount-param-token": "å\9c¨ç¬¬ä¸\80次è«\8bæ±\82æ\99\82å·²å\8f\96å¾\97ç\9a\84帳è\99\9f建ç«\8bé\87\91é\91°。",
        "apihelp-createaccount-param-email": "使用者的電子郵件地址 (選填) 。",
        "apihelp-createaccount-param-realname": "使用者的真實姓名 (選填)。",
        "apihelp-createaccount-param-mailpassword": "若設為其他值,將會以電子郵件寄送隨機密碼給使用者。",
        "apihelp-query+stashimageinfo-example-simple": "回傳儲藏檔案的檔案資訊。",
        "apihelp-query+templates-description": "回傳指定頁面中所有引用的頁面。",
        "apihelp-query+templates-param-limit": "要回傳的模板數量。",
-       "apihelp-query+tokens-param-type": "è¦\81è«\8bæ±\82ç\9a\84å¯\86é\91°é¡\9eå\9e\8bã\80\82",
+       "apihelp-query+tokens-param-type": "請求的密鑰類型。",
        "apihelp-query+tokens-example-simple": "接收 csrf 密鑰 (預設)。",
        "apihelp-query+tokens-example-types": "接收監視密鑰以及巡邏密鑰。",
        "apihelp-query+transcludedin-param-limit": "回傳的數量。",
        "apihelp-format-example-generic": "格式化查詢結果為 $1 格式",
        "apihelp-dbg-description": "使用 PHP 的 <code>var_export()</code> 格式輸出資料。",
        "apihelp-dbgfm-description": "使用 PHP 的 <code>var_export()</code> 格式輸出資料 (使用 HTML 格式顯示)。",
-       "apihelp-dump-description": "使用 PHP 的 <code>var_dump()</code> 格式輸出資料。",
-       "apihelp-dumpfm-description": "使用 PHP 的 <code>var_dump()</code> 格式輸出資料 (使用 HTML 格式顯示)。",
        "apihelp-json-description": "使用 JSON 格式輸出資料。",
        "apihelp-jsonfm-description": "使用 JSON 格式輸出資料 (使用 HTML 格式顯示)。",
        "apihelp-none-description": "不輸出。",
        "apihelp-rawfm-description": "使用 JSON 格式的除錯元素輸出資料 (使用 HTML 格式顯示)。",
        "apihelp-txt-description": "使用 PHP 的 <code>print_r()</code> 格式輸出資料。",
        "apihelp-txtfm-description": "使用 PHP 的 <code>print_r()</code> 格式輸出資料 (使用 HTML 格式顯示)。",
-       "apihelp-wddx-description": "使用 WDDX 格式輸出資料。",
-       "apihelp-wddxfm-description": "使用 WDDX 格式輸出資料 (使用 HTML 格式顯示)。",
        "apihelp-xml-description": "使用 XML 格式輸出資料。",
        "apihelp-xmlfm-description": "使用 XML 格式輸出資料 (使用 HTML 格式顯示)。",
        "apihelp-yaml-description": "使用 YAML 格式輸出資料。",
index 6a597ca..fff9bab 100644 (file)
@@ -79,7 +79,7 @@ class LCStoreStaticArray implements LCStore {
                        // [A]rray
                        return array( 'a', array_map( function ( $v ) {
                                return LCStoreStaticArray::encode( $v );
-                       }, $data ) );
+                       }, $value ) );
                }
 
                throw new RuntimeException( 'Cannot encode ' . var_export( $value, true ) );
index 77e4d49..698b304 100644 (file)
@@ -78,7 +78,7 @@ class LinkBatch {
                        $this->data[$ns] = array();
                }
 
-               $this->data[$ns][str_replace( ' ', '_', $dbkey )] = 1;
+               $this->data[$ns][strtr( $dbkey, ' ', '_' )] = 1;
        }
 
        /**
index 585fcd3..67a7461 100644 (file)
@@ -130,6 +130,24 @@ class MessageCache {
                self::$instance = null;
        }
 
+       /**
+        * Normalize message key input
+        *
+        * @param string $key Input message key to be normalized
+        * @return string Normalized message key
+        */
+       public static function normalizeKey( $key ) {
+               global $wgContLang;
+               $lckey = strtr( $key, ' ', '_' );
+               if ( ord( $lckey ) < 128 ) {
+                       $lckey[0] = strtolower( $lckey[0] );
+               } else {
+                       $lckey = $wgContLang->lcfirst( $lckey );
+               }
+
+               return $lckey;
+       }
+
        /**
         * @param BagOStuff $memCached A cache instance. If none, fall back to CACHE_NONE.
         * @param bool $useDB
@@ -784,12 +802,7 @@ class MessageCache {
                }
 
                // Normalise title-case input (with some inlining)
-               $lckey = strtr( $key, ' ', '_' );
-               if ( ord( $lckey ) < 128 ) {
-                       $lckey[0] = strtolower( $lckey[0] );
-               } else {
-                       $lckey = $wgContLang->lcfirst( $lckey );
-               }
+               $lckey = MessageCache::normalizeKey( $key );
 
                Hooks::run( 'MessageCache::get', array( &$lckey ) );
 
index 2a3aac2..51bf385 100644 (file)
@@ -123,11 +123,11 @@ class UserCache {
                $lb = new LinkBatch();
                foreach ( $usersToCheck as $userId => $name ) {
                        if ( $this->queryNeeded( $userId, 'userpage', $options ) ) {
-                               $lb->add( NS_USER, $row->user_name );
+                               $lb->add( NS_USER, $name );
                                $this->typesCached[$userId]['userpage'] = 1;
                        }
                        if ( $this->queryNeeded( $userId, 'usertalk', $options ) ) {
-                               $lb->add( NS_USER_TALK, $row->user_name );
+                               $lb->add( NS_USER_TALK, $name );
                                $this->typesCached[$userId]['usertalk'] = 1;
                        }
                }
index 9635c17..e5916bd 100644 (file)
@@ -544,12 +544,12 @@ class EnhancedChangesList extends ChangesList {
                        ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
 
                # Flag and Timestamp
-               $data['recentChangesFlags'] = $this->recentChangesFlags( array(
+               $data['recentChangesFlags'] = array(
                        'newpage' => $type == RC_NEW,
                        'minor' => $rcObj->mAttribs['rc_minor'],
                        'unpatrolled' => $rcObj->unpatrolled,
                        'bot' => $rcObj->mAttribs['rc_bot'],
-               ) );
+               );
                // timestamp is not really a link here, but is called timestampLink
                // for consistency with EnhancedChangesListModifyLineData
                $data['timestampLink'] = $rcObj->timestamp;
index 95f4816..bf8386f 100644 (file)
@@ -611,17 +611,16 @@ class ChangeTags {
         * Build a text box to select a change tag
         *
         * @param string $selected Tag to select by default
-        * @param bool $fullForm
-        *        - if false, then it returns an array of (label, form).
-        *        - if true, it returns an entire form around the selector.
-        * @param Title $title Title object to send the form to.
-        *        Used when, and only when $fullForm is true.
+        * @param bool $fullForm Affects return value, see below
+        * @param Title $title Title object to send the form to. Used only if $fullForm is true.
+        * @param bool $ooui Use an OOUI TextInputWidget as selector instead of a non-OOUI input field
+        *        You need to call OutputPage::enableOOUI() yourself.
         * @return string|array
-        *        - if $fullForm is false: Array with
-        *        - if $fullForm is true: String, html fragment
+        *        - if $fullForm is false: an array of (label, selector).
+        *        - if $fullForm is true: HTML of entire form built around the selector.
         */
        public static function buildTagFilterSelector( $selected = '',
-               $fullForm = false, Title $title = null
+               $fullForm = false, Title $title = null, $ooui = false
        ) {
                global $wgUseTagFilter;
 
@@ -634,14 +633,24 @@ class ChangeTags {
                                'label',
                                array( 'for' => 'tagfilter' ),
                                wfMessage( 'tag-filter' )->parse()
-                       ),
-                       Xml::input(
+                       )
+               );
+
+               if ( $ooui ) {
+                       $data[] = new OOUI\TextInputWidget( array(
+                               'id' => 'tagfilter',
+                               'name' => 'tagfilter',
+                               'value' => $selected,
+                               'classes' => 'mw-tagfilter-input',
+                       ) );
+               } else {
+                       $data[] = Xml::input(
                                'tagfilter',
                                20,
                                $selected,
                                array( 'class' => 'mw-tagfilter-input mw-ui-input mw-ui-input-inline', 'id' => 'tagfilter' )
-                       )
-               );
+                       );
+               }
 
                if ( !$fullForm ) {
                        return $data;
index 842d327..ec401bc 100644 (file)
@@ -52,7 +52,8 @@ class ChangeTagsRevisionList extends ChangeTagsList {
                        $queryInfo['fields'],
                        $queryInfo['conds'],
                        $queryInfo['join_conds'],
-                       $queryInfo['options']
+                       $queryInfo['options'],
+                       ''
                );
                return $db->select(
                        $queryInfo['tables'],
index c0194c2..6d23656 100644 (file)
  */
 class JavaScriptContent extends TextContent {
 
+       /**
+        * @var bool|Title|null
+        */
+       private $redirectTarget = false;
+
        /**
         * @param string $text JavaScript code.
         * @param string $modelId the content model name
@@ -73,4 +78,46 @@ class JavaScriptContent extends TextContent {
                return $html;
        }
 
+       /**
+        * If this page is a redirect, return the content
+        * if it should redirect to $target instead
+        *
+        * @param Title $target
+        * @return JavaScriptContent
+        */
+       public function updateRedirect( Title $target ) {
+               if ( !$this->isRedirect() ) {
+                       return $this;
+               }
+
+               return $this->getContentHandler()->makeRedirectContent( $target );
+       }
+
+       /**
+        * @return Title|null
+        */
+       public function getRedirectTarget() {
+               if ( $this->redirectTarget !== false ) {
+                       return $this->redirectTarget;
+               }
+               $this->redirectTarget = null;
+               $text = $this->getNativeData();
+               if ( strpos( $text, '/* #REDIRECT */' ) === 0 ) {
+                       // Extract the title from the url
+                       preg_match( '/title=(.*?)\\\\u0026action=raw/', $text, $matches );
+                       if ( isset( $matches[1] ) ) {
+                               $title = Title::newFromText( $matches[1] );
+                               if ( $title ) {
+                                       // Have a title, check that the current content equals what
+                                       // the redirect content should be
+                                       if ( $this->equals( $this->getContentHandler()->makeRedirectContent( $title ) ) ) {
+                                               $this->redirectTarget = $title;
+                                       }
+                               }
+                       }
+               }
+
+               return $this->redirectTarget;
+       }
+
 }
index d221897..65e3a6f 100644 (file)
@@ -41,4 +41,22 @@ class JavaScriptContentHandler extends CodeContentHandler {
        protected function getContentClass() {
                return 'JavaScriptContent';
        }
+
+       public function supportsRedirects() {
+               return true;
+       }
+
+       /**
+        * Create a redirect that is also valid JavaScript
+        *
+        * @param Title $destination
+        * @param string $text ignored
+        * @return JavaScriptContent
+        */
+       public function makeRedirectContent( Title $destination, $text = '' ) {
+               // The parameters are passed as a string so the / is not url-encoded by wfArrayToCgi
+               $url = $destination->getFullURL( 'action=raw&ctype=text/javascript', false, PROTO_RELATIVE );
+               $class = $this->getContentClass();
+               return new $class( '/* #REDIRECT */' . Xml::encodeJsCall( 'mw.loader.load', array( $url ) ) );
+       }
 }
index e676ec9..99c1a06 100644 (file)
@@ -494,15 +494,17 @@ class RequestContext implements IContextSource {
        /**
         * Import an client IP address, HTTP headers, user ID, and session ID
         *
-        * This sets the current session and sets $wgUser and $wgRequest.
+        * This sets the current session, $wgUser, and $wgRequest from $params.
         * Once the return value falls out of scope, the old context is restored.
-        * This method should only be called in contexts (CLI or HTTP job runners)
-        * where there is no session ID or end user receiving the response. This
+        * This method should only be called in contexts where there is no session
+        * ID or end user receiving the response (CLI or HTTP job runners). This
         * is partly enforced, and is done so to avoid leaking cookies if certain
         * error conditions arise.
         *
-        * This will setup the session from the given ID. This is useful when
-        * background scripts inherit context when acting on behalf of a user.
+        * This is useful when background scripts inherit context when acting on
+        * behalf of a user. In general the 'sessionId' parameter should be set
+        * to an empty string unless session importing is *truly* needed. This
+        * feature is somewhat deprecated.
         *
         * @note suhosin.session.encrypt may interfere with this method.
         *
index 7045494..b4f3f79 100644 (file)
@@ -3,6 +3,7 @@
  * Helper class to handle automatically marking connections as reusable (via RAII pattern)
  * as well handling deferring the actual network connection until the handle is used
  *
+ * @note: proxy methods are defined explicity to avoid interface errors
  * @ingroup Database
  * @since 1.22
  */
@@ -29,7 +30,7 @@ class DBConnRef implements IDatabase {
                }
        }
 
-       public function __call( $name, $arguments ) {
+       function __call( $name, array $arguments ) {
                if ( $this->conn === null ) {
                        list( $db, $groups, $wiki ) = $this->params;
                        $this->conn = $this->lb->getConnection( $db, $groups, $wiki );
@@ -38,7 +39,484 @@ class DBConnRef implements IDatabase {
                return call_user_func_array( array( $this->conn, $name ), $arguments );
        }
 
-       public function __destruct() {
+       public function getServerInfo() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function bufferResults( $buffer = null ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function trxLevel() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function trxTimestamp() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function tablePrefix( $prefix = null ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function dbSchema( $schema = null ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function getLBInfo( $name = null ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function setLBInfo( $name, $value = null ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function implicitGroupby() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function implicitOrderby() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function lastQuery() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function doneWrites() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function lastDoneWrites() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function writesOrCallbacksPending() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function pendingWriteQueryDuration() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function isOpen() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function setFlag( $flag ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function clearFlag( $flag ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function getFlag( $flag ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function getProperty( $name ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function getWikiID() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function getType() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function open( $server, $user, $password, $dbName ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function fetchObject( $res ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function fetchRow( $res ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function numRows( $res ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function numFields( $res ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function fieldName( $res, $n ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function insertId() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function dataSeek( $res, $row ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function lastErrno() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function lastError() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function fieldInfo( $table, $field ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function affectedRows() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function getSoftwareLink() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function getServerVersion() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function close() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function reportConnectionError( $error = 'Unknown error' ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function query( $sql, $fname = __METHOD__, $tempIgnore = false ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function freeResult( $res ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function selectField(
+               $table, $var, $cond = '', $fname = __METHOD__, $options = array()
+       ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function selectFieldValues(
+               $table, $var, $cond = '', $fname = __METHOD__, $options = array()
+       ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function select(
+               $table, $vars, $conds = '', $fname = __METHOD__,
+               $options = array(), $join_conds = array()
+       ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function selectSQLText(
+               $table, $vars, $conds = '', $fname = __METHOD__,
+               $options = array(), $join_conds = array()
+       ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function selectRow(
+               $table, $vars, $conds, $fname = __METHOD__,
+               $options = array(), $join_conds = array()
+       ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function estimateRowCount(
+               $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array()
+       ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function selectRowCount(
+               $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array()
+       ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function fieldExists( $table, $field, $fname = __METHOD__ ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function indexExists( $table, $index, $fname = __METHOD__ ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function tableExists( $table, $fname = __METHOD__ ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function indexUnique( $table, $index ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function insert( $table, $a, $fname = __METHOD__, $options = array() ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function update( $table, $values, $conds, $fname = __METHOD__, $options = array() ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function makeList( $a, $mode = LIST_COMMA ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function makeWhereFrom2d( $data, $baseKey, $subKey ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function bitNot( $field ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function bitAnd( $fieldLeft, $fieldRight ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function bitOr( $fieldLeft, $fieldRight ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function buildConcat( $stringList ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function buildGroupConcatField(
+               $delim, $table, $field, $conds = '', $join_conds = array()
+       ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function selectDB( $db ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function getDBname() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function getServer() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function addQuotes( $s ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function buildLike() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function anyChar() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function anyString() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function nextSequenceValue( $seqName ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function upsert(
+               $table, array $rows, array $uniqueIndexes, array $set, $fname = __METHOD__
+       ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function deleteJoin(
+               $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = __METHOD__
+       ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function delete( $table, $conds, $fname = __METHOD__ ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function insertSelect(
+               $destTable, $srcTable, $varMap, $conds,
+               $fname = __METHOD__, $insertOptions = array(), $selectOptions = array()
+       ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function unionSupportsOrderAndLimit() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function unionQueries( $sqls, $all ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function conditional( $cond, $trueVal, $falseVal ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function strreplace( $orig, $old, $new ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function getServerUptime() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function wasDeadlock() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function wasLockTimeout() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function wasErrorReissuable() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function wasReadOnlyError() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function masterPosWait( DBMasterPos $pos, $timeout ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function getSlavePos() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function getMasterPos() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function onTransactionIdle( $callback ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function onTransactionPreCommitOrIdle( $callback ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function startAtomic( $fname = __METHOD__ ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function endAtomic( $fname = __METHOD__ ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function begin( $fname = __METHOD__ ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function commit( $fname = __METHOD__, $flush = '' ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function rollback( $fname = __METHOD__, $flush = '' ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function listTables( $prefix = null, $fname = __METHOD__ ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function timestamp( $ts = 0 ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function timestampOrNull( $ts = null ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function resultObject( $result ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function ping() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function getLag() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function maxListLen() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function encodeBlob( $b ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function decodeBlob( $b ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function setSessionOptions( array $options ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function setSchemaVars( $vars ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function lockIsFree( $lockName, $method ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function lock( $lockName, $method, $timeout = 5 ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function unlock( $lockName, $method ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function namedLocksEnqueue() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function getInfinity() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function encodeExpiry( $expiry ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function decodeExpiry( $expiry, $format = TS_MW ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function setBigSelects( $value = true ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       /**
+        * Clean up the connection when out of scope
+        */
+       function __destruct() {
                if ( $this->conn !== null ) {
                        $this->lb->reuseConnection( $this->conn );
                }
index e74fe80..2ee4545 100644 (file)
  * @ingroup Database
  */
 
-/**
- * Interface for classes that implement or wrap DatabaseBase
- * @ingroup Database
- */
-interface IDatabase {
-}
-
 /**
  * Database abstraction object
  * @ingroup Database
@@ -237,7 +230,7 @@ abstract class DatabaseBase implements IDatabase {
         * @param null|bool $ignoreErrors
         * @return bool The previous value of the flag.
         */
-       public function ignoreErrors( $ignoreErrors = null ) {
+       protected function ignoreErrors( $ignoreErrors = null ) {
                return wfSetBit( $this->mFlags, DBO_IGNORE, $ignoreErrors );
        }
 
@@ -612,125 +605,6 @@ abstract class DatabaseBase implements IDatabase {
                return $this->getSqlFilePath( 'update-keys.sql' );
        }
 
-       /**
-        * Get the type of the DBMS, as it appears in $wgDBtype.
-        *
-        * @return string
-        */
-       abstract function getType();
-
-       /**
-        * Open a connection to the database. Usually aborts on failure
-        *
-        * @param string $server Database server host
-        * @param string $user Database user name
-        * @param string $password Database user password
-        * @param string $dbName Database name
-        * @return bool
-        * @throws DBConnectionError
-        */
-       abstract function open( $server, $user, $password, $dbName );
-
-       /**
-        * Fetch the next row from the given result object, in object form.
-        * Fields can be retrieved with $row->fieldname, with fields acting like
-        * member variables.
-        * If no more rows are available, false is returned.
-        *
-        * @param ResultWrapper|stdClass $res Object as returned from DatabaseBase::query(), etc.
-        * @return stdClass|bool
-        * @throws DBUnexpectedError Thrown if the database returns an error
-        */
-       abstract function fetchObject( $res );
-
-       /**
-        * Fetch the next row from the given result object, in associative array
-        * form. Fields are retrieved with $row['fieldname'].
-        * If no more rows are available, false is returned.
-        *
-        * @param ResultWrapper $res Result object as returned from DatabaseBase::query(), etc.
-        * @return array|bool
-        * @throws DBUnexpectedError Thrown if the database returns an error
-        */
-       abstract function fetchRow( $res );
-
-       /**
-        * Get the number of rows in a result object
-        *
-        * @param mixed $res A SQL result
-        * @return int
-        */
-       abstract function numRows( $res );
-
-       /**
-        * Get the number of fields in a result object
-        * @see http://www.php.net/mysql_num_fields
-        *
-        * @param mixed $res A SQL result
-        * @return int
-        */
-       abstract function numFields( $res );
-
-       /**
-        * Get a field name in a result object
-        * @see http://www.php.net/mysql_field_name
-        *
-        * @param mixed $res A SQL result
-        * @param int $n
-        * @return string
-        */
-       abstract function fieldName( $res, $n );
-
-       /**
-        * Get the inserted value of an auto-increment row
-        *
-        * The value inserted should be fetched from nextSequenceValue()
-        *
-        * Example:
-        * $id = $dbw->nextSequenceValue( 'page_page_id_seq' );
-        * $dbw->insert( 'page', array( 'page_id' => $id ) );
-        * $id = $dbw->insertId();
-        *
-        * @return int
-        */
-       abstract function insertId();
-
-       /**
-        * Change the position of the cursor in a result object
-        * @see http://www.php.net/mysql_data_seek
-        *
-        * @param mixed $res A SQL result
-        * @param int $row
-        */
-       abstract function dataSeek( $res, $row );
-
-       /**
-        * Get the last error number
-        * @see http://www.php.net/mysql_errno
-        *
-        * @return int
-        */
-       abstract function lastErrno();
-
-       /**
-        * Get a description of the last error
-        * @see http://www.php.net/mysql_error
-        *
-        * @return string
-        */
-       abstract function lastError();
-
-       /**
-        * mysql_fetch_field() wrapper
-        * Returns false if the field doesn't exist
-        *
-        * @param string $table Table name
-        * @param string $field Field name
-        *
-        * @return Field
-        */
-       abstract function fieldInfo( $table, $field );
-
        /**
         * Get information about an index into an object
         * @param string $table Table name
@@ -740,14 +614,6 @@ abstract class DatabaseBase implements IDatabase {
         */
        abstract function indexInfo( $table, $index, $fname = __METHOD__ );
 
-       /**
-        * Get the number of rows affected by the last write query
-        * @see http://www.php.net/mysql_affected_rows
-        *
-        * @return int
-        */
-       abstract function affectedRows();
-
        /**
         * Wrapper for addslashes()
         *
@@ -756,24 +622,6 @@ abstract class DatabaseBase implements IDatabase {
         */
        abstract function strencode( $s );
 
-       /**
-        * Returns a wikitext link to the DB's website, e.g.,
-        *   return "[http://www.mysql.com/ MySQL]";
-        * Should at least contain plain text, if for some reason
-        * your database has no website.
-        *
-        * @return string Wikitext of a link to the server software's web site
-        */
-       abstract function getSoftwareLink();
-
-       /**
-        * A string describing the current software version, like from
-        * mysql_get_server_info().
-        *
-        * @return string Version information from the database server.
-        */
-       abstract function getServerVersion();
-
        /**
         * Constructor.
         *
@@ -1067,7 +915,7 @@ abstract class DatabaseBase implements IDatabase {
         * @param string $sql
         * @return bool
         */
-       public function isWriteQuery( $sql ) {
+       protected function isWriteQuery( $sql ) {
                return !preg_match( '/^(?:SELECT|BEGIN|ROLLBACK|COMMIT|SET|SHOW|EXPLAIN|\(SELECT)\b/i', $sql );
        }
 
@@ -1080,7 +928,7 @@ abstract class DatabaseBase implements IDatabase {
         * @param string $sql
         * @return bool
         */
-       public function isTransactableQuery( $sql ) {
+       protected function isTransactableQuery( $sql ) {
                $verb = substr( $sql, 0, strcspn( $sql, " \t\r\n" ) );
                return !in_array( $verb, array( 'BEGIN', 'COMMIT', 'ROLLBACK', 'SHOW', 'SET' ) );
        }
@@ -1458,6 +1306,7 @@ abstract class DatabaseBase implements IDatabase {
         * @param string|array $options The query options. See DatabaseBase::select() for details.
         *
         * @return bool|array The values from the field, or false on failure
+        * @throws DBUnexpectedError
         * @since 1.25
         */
        public function selectFieldValues(
@@ -1918,7 +1767,7 @@ abstract class DatabaseBase implements IDatabase {
        ) {
                $rows = 0;
                $sql = $this->selectSQLText( $table, '1', $conds, $fname, $options );
-               $res = $this->query( "SELECT COUNT(*) AS rowcount FROM ($sql) tmp_count" );
+               $res = $this->query( "SELECT COUNT(*) AS rowcount FROM ($sql) tmp_count", $fname );
 
                if ( $res ) {
                        $row = $this->fetchRow( $res );
@@ -2879,6 +2728,7 @@ abstract class DatabaseBase implements IDatabase {
                        $rows = array( $rows );
                }
 
+               // @FXIME: this is not atomic, but a trx would break affectedRows()
                foreach ( $rows as $row ) {
                        # Delete rows which collide
                        if ( $uniqueIndexes ) {
index e326909..846da1c 100644 (file)
@@ -940,7 +940,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                                $value = $this->mDefaultBigSelects;
                        }
                } elseif ( $this->mDefaultBigSelects === null ) {
-                       $this->mDefaultBigSelects = (bool)$this->selectField( false, '@@sql_big_selects' );
+                       $this->mDefaultBigSelects = (bool)$this->selectField( false, '@@sql_big_selects', '', __METHOD__ );
                }
                $encValue = $value ? '1' : '0';
                $this->query( "SET sql_big_selects=$encValue", __METHOD__ );
index 9ad76ab..56a5b2c 100644 (file)
@@ -217,7 +217,7 @@ class PostgresTransactionState {
  * @since 1.19
  */
 class SavepointPostgres {
-       /** @var DatabaseBase Establish a savepoint within a transaction */
+       /** @var DatabasePostgres Establish a savepoint within a transaction */
        protected $dbw;
        protected $id;
        protected $didbegin;
diff --git a/includes/db/IDatabase.php b/includes/db/IDatabase.php
new file mode 100644 (file)
index 0000000..49d0514
--- /dev/null
@@ -0,0 +1,1513 @@
+<?php
+
+/**
+ * @defgroup Database Database
+ *
+ * This file deals with database interface functions
+ * and query specifics/optimisations.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
+ * Basic database interface for live and lazy-loaded DB handles
+ *
+ * @todo: loosen up DB classes from MWException
+ * @note: DatabaseBase and DBConnRef should be updated to reflect any changes
+ * @ingroup Database
+ */
+interface IDatabase {
+       /**
+        * A string describing the current software version, and possibly
+        * other details in a user-friendly way. Will be listed on Special:Version, etc.
+        * Use getServerVersion() to get machine-friendly information.
+        *
+        * @return string Version information from the database server
+        */
+       public function getServerInfo();
+
+       /**
+        * Turns buffering of SQL result sets on (true) or off (false). Default is
+        * "on".
+        *
+        * Unbuffered queries are very troublesome in MySQL:
+        *
+        *   - If another query is executed while the first query is being read
+        *     out, the first query is killed. This means you can't call normal
+        *     MediaWiki functions while you are reading an unbuffered query result
+        *     from a normal wfGetDB() connection.
+        *
+        *   - Unbuffered queries cause the MySQL server to use large amounts of
+        *     memory and to hold broad locks which block other queries.
+        *
+        * If you want to limit client-side memory, it's almost always better to
+        * split up queries into batches using a LIMIT clause than to switch off
+        * buffering.
+        *
+        * @param null|bool $buffer
+        * @return null|bool The previous value of the flag
+        */
+       public function bufferResults( $buffer = null );
+
+       /**
+        * Gets the current transaction level.
+        *
+        * Historically, transactions were allowed to be "nested". This is no
+        * longer supported, so this function really only returns a boolean.
+        *
+        * @return int The previous value
+        */
+       public function trxLevel();
+
+       /**
+        * Get the UNIX timestamp of the time that the transaction was established
+        *
+        * This can be used to reason about the staleness of SELECT data
+        * in REPEATABLE-READ transaction isolation level.
+        *
+        * @return float|null Returns null if there is not active transaction
+        * @since 1.25
+        */
+       public function trxTimestamp();
+
+       /**
+        * Get/set the table prefix.
+        * @param string $prefix The table prefix to set, or omitted to leave it unchanged.
+        * @return string The previous table prefix.
+        */
+       public function tablePrefix( $prefix = null );
+
+       /**
+        * 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 );
+
+       /**
+        * Get properties passed down from the server info array of the load
+        * balancer.
+        *
+        * @param string $name The entry of the info array to get, or null to get the
+        *   whole array
+        *
+        * @return array|mixed|null
+        */
+       public function getLBInfo( $name = null );
+
+       /**
+        * Set the LB info array, or a member of it. If called with one parameter,
+        * the LB info array is set to that parameter. If it is called with two
+        * parameters, the member with the given name is set to the given value.
+        *
+        * @param string $name
+        * @param array $value
+        */
+       public function setLBInfo( $name, $value = null );
+
+       /**
+        * Returns true if this database does an implicit sort when doing GROUP BY
+        *
+        * @return bool
+        */
+       public function implicitGroupby();
+
+       /**
+        * Returns true if this database does an implicit order by when the column has an index
+        * For example: SELECT page_title FROM page LIMIT 1
+        *
+        * @return bool
+        */
+       public function implicitOrderby();
+
+       /**
+        * Return the last query that went through DatabaseBase::query()
+        * @return string
+        */
+       public function lastQuery();
+
+       /**
+        * Returns true if the connection may have been used for write queries.
+        * Should return true if unsure.
+        *
+        * @return bool
+        */
+       public function doneWrites();
+
+       /**
+        * Returns the last time the connection may have been used for write queries.
+        * Should return a timestamp if unsure.
+        *
+        * @return int|float UNIX timestamp or false
+        * @since 1.24
+        */
+       public function lastDoneWrites();
+
+       /**
+        * Returns true if there is a transaction open with possible write
+        * queries or transaction pre-commit/idle callbacks waiting on it to finish.
+        *
+        * @return bool
+        */
+       public function writesOrCallbacksPending();
+
+       /**
+        * Get the time spend running write queries for this
+        *
+        * High times could be due to scanning, updates, locking, and such
+        *
+        * @return float|bool Returns false if not transaction is active
+        * @since 1.26
+        */
+       public function pendingWriteQueryDuration();
+
+       /**
+        * Is a connection to the database open?
+        * @return bool
+        */
+       public function isOpen();
+
+       /**
+        * Set a flag for this connection
+        *
+        * @param int $flag DBO_* constants from Defines.php:
+        *   - DBO_DEBUG: output some debug info (same as debug())
+        *   - DBO_NOBUFFER: don't buffer results (inverse of bufferResults())
+        *   - DBO_TRX: automatically start transactions
+        *   - DBO_DEFAULT: automatically sets DBO_TRX if not in command line mode
+        *       and removes it in command line mode
+        *   - DBO_PERSISTENT: use persistant database connection
+        */
+       public function setFlag( $flag );
+
+       /**
+        * Clear a flag for this connection
+        *
+        * @param int $flag DBO_* constants from Defines.php:
+        *   - DBO_DEBUG: output some debug info (same as debug())
+        *   - DBO_NOBUFFER: don't buffer results (inverse of bufferResults())
+        *   - DBO_TRX: automatically start transactions
+        *   - DBO_DEFAULT: automatically sets DBO_TRX if not in command line mode
+        *       and removes it in command line mode
+        *   - DBO_PERSISTENT: use persistant database connection
+        */
+       public function clearFlag( $flag );
+
+       /**
+        * Returns a boolean whether the flag $flag is set for this connection
+        *
+        * @param int $flag DBO_* constants from Defines.php:
+        *   - DBO_DEBUG: output some debug info (same as debug())
+        *   - DBO_NOBUFFER: don't buffer results (inverse of bufferResults())
+        *   - DBO_TRX: automatically start transactions
+        *   - DBO_PERSISTENT: use persistant database connection
+        * @return bool
+        */
+       public function getFlag( $flag );
+
+       /**
+        * General read-only accessor
+        *
+        * @param string $name
+        * @return string
+        */
+       public function getProperty( $name );
+
+       /**
+        * @return string
+        */
+       public function getWikiID();
+
+       /**
+        * Get the type of the DBMS, as it appears in $wgDBtype.
+        *
+        * @return string
+        */
+       public function getType();
+
+       /**
+        * Open a connection to the database. Usually aborts on failure
+        *
+        * @param string $server Database server host
+        * @param string $user Database user name
+        * @param string $password Database user password
+        * @param string $dbName Database name
+        * @return bool
+        * @throws DBConnectionError
+        */
+       public function open( $server, $user, $password, $dbName );
+
+       /**
+        * Fetch the next row from the given result object, in object form.
+        * Fields can be retrieved with $row->fieldname, with fields acting like
+        * member variables.
+        * If no more rows are available, false is returned.
+        *
+        * @param ResultWrapper|stdClass $res Object as returned from DatabaseBase::query(), etc.
+        * @return stdClass|bool
+        * @throws DBUnexpectedError Thrown if the database returns an error
+        */
+       public function fetchObject( $res );
+
+       /**
+        * Fetch the next row from the given result object, in associative array
+        * form. Fields are retrieved with $row['fieldname'].
+        * If no more rows are available, false is returned.
+        *
+        * @param ResultWrapper $res Result object as returned from DatabaseBase::query(), etc.
+        * @return array|bool
+        * @throws DBUnexpectedError Thrown if the database returns an error
+        */
+       public function fetchRow( $res );
+
+       /**
+        * Get the number of rows in a result object
+        *
+        * @param mixed $res A SQL result
+        * @return int
+        */
+       public function numRows( $res );
+
+       /**
+        * Get the number of fields in a result object
+        * @see http://www.php.net/mysql_num_fields
+        *
+        * @param mixed $res A SQL result
+        * @return int
+        */
+       public function numFields( $res );
+
+       /**
+        * Get a field name in a result object
+        * @see http://www.php.net/mysql_field_name
+        *
+        * @param mixed $res A SQL result
+        * @param int $n
+        * @return string
+        */
+       public function fieldName( $res, $n );
+
+       /**
+        * Get the inserted value of an auto-increment row
+        *
+        * The value inserted should be fetched from nextSequenceValue()
+        *
+        * Example:
+        * $id = $dbw->nextSequenceValue( 'page_page_id_seq' );
+        * $dbw->insert( 'page', array( 'page_id' => $id ) );
+        * $id = $dbw->insertId();
+        *
+        * @return int
+        */
+       public function insertId();
+
+       /**
+        * Change the position of the cursor in a result object
+        * @see http://www.php.net/mysql_data_seek
+        *
+        * @param mixed $res A SQL result
+        * @param int $row
+        */
+       public function dataSeek( $res, $row );
+
+       /**
+        * Get the last error number
+        * @see http://www.php.net/mysql_errno
+        *
+        * @return int
+        */
+       public function lastErrno();
+
+       /**
+        * Get a description of the last error
+        * @see http://www.php.net/mysql_error
+        *
+        * @return string
+        */
+       public function lastError();
+
+       /**
+        * mysql_fetch_field() wrapper
+        * Returns false if the field doesn't exist
+        *
+        * @param string $table Table name
+        * @param string $field Field name
+        *
+        * @return Field
+        */
+       public function fieldInfo( $table, $field );
+
+       /**
+        * Get the number of rows affected by the last write query
+        * @see http://www.php.net/mysql_affected_rows
+        *
+        * @return int
+        */
+       public function affectedRows();
+
+       /**
+        * Returns a wikitext link to the DB's website, e.g.,
+        *   return "[http://www.mysql.com/ MySQL]";
+        * Should at least contain plain text, if for some reason
+        * your database has no website.
+        *
+        * @return string Wikitext of a link to the server software's web site
+        */
+       public function getSoftwareLink();
+
+       /**
+        * A string describing the current software version, like from
+        * mysql_get_server_info().
+        *
+        * @return string Version information from the database server.
+        */
+       public function getServerVersion();
+
+       /**
+        * Closes a database connection.
+        * if it is open : commits any open transactions
+        *
+        * @throws MWException
+        * @return bool Operation success. true if already closed.
+        */
+       public function close();
+
+       /**
+        * @param string $error Fallback error message, used if none is given by DB
+        * @throws DBConnectionError
+        */
+       public function reportConnectionError( $error = 'Unknown error' );
+
+       /**
+        * Run an SQL query and return the result. Normally throws a DBQueryError
+        * on failure. If errors are ignored, returns false instead.
+        *
+        * In new code, the query wrappers select(), insert(), update(), delete(),
+        * etc. should be used where possible, since they give much better DBMS
+        * independence and automatically quote or validate user input in a variety
+        * of contexts. This function is generally only useful for queries which are
+        * explicitly DBMS-dependent and are unsupported by the query wrappers, such
+        * as CREATE TABLE.
+        *
+        * However, the query wrappers themselves should call this function.
+        *
+        * @param string $sql SQL query
+        * @param string $fname Name of the calling function, for profiling/SHOW PROCESSLIST
+        *     comment (you can use __METHOD__ or add some extra info)
+        * @param bool $tempIgnore Whether to avoid throwing an exception on errors...
+        *     maybe best to catch the exception instead?
+        * @throws MWException
+        * @return bool|ResultWrapper True for a successful write query, ResultWrapper object
+        *     for a successful read query, or false on failure if $tempIgnore set
+        */
+       public function query( $sql, $fname = __METHOD__, $tempIgnore = false );
+
+       /**
+        * Report a query error. Log the error, and if neither the object ignore
+        * flag nor the $tempIgnore flag is set, throw a DBQueryError.
+        *
+        * @param string $error
+        * @param int $errno
+        * @param string $sql
+        * @param string $fname
+        * @param bool $tempIgnore
+        * @throws DBQueryError
+        */
+       public function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false );
+
+       /**
+        * Free a result object returned by query() or select(). It's usually not
+        * necessary to call this, just use unset() or let the variable holding
+        * the result object go out of scope.
+        *
+        * @param mixed $res A SQL result
+        */
+       public function freeResult( $res );
+
+       /**
+        * A SELECT wrapper which returns a single field from a single result row.
+        *
+        * Usually throws a DBQueryError on failure. If errors are explicitly
+        * ignored, returns false on failure.
+        *
+        * If no result rows are returned from the query, false is returned.
+        *
+        * @param string|array $table Table name. See DatabaseBase::select() for details.
+        * @param string $var The field name to select. This must be a valid SQL
+        *   fragment: do not use unvalidated user input.
+        * @param string|array $cond The condition array. See DatabaseBase::select() for details.
+        * @param string $fname The function name of the caller.
+        * @param string|array $options The query options. See DatabaseBase::select() for details.
+        *
+        * @return bool|mixed The value from the field, or false on failure.
+        */
+       public function selectField(
+               $table, $var, $cond = '', $fname = __METHOD__, $options = array()
+       );
+
+       /**
+        * A SELECT wrapper which returns a list of single field values from result rows.
+        *
+        * Usually throws a DBQueryError on failure. If errors are explicitly
+        * ignored, returns false on failure.
+        *
+        * If no result rows are returned from the query, false is returned.
+        *
+        * @param string|array $table Table name. See DatabaseBase::select() for details.
+        * @param string $var The field name to select. This must be a valid SQL
+        *   fragment: do not use unvalidated user input.
+        * @param string|array $cond The condition array. See DatabaseBase::select() for details.
+        * @param string $fname The function name of the caller.
+        * @param string|array $options The query options. See DatabaseBase::select() for details.
+        *
+        * @return bool|array The values from the field, or false on failure
+        * @since 1.25
+        */
+       public function selectFieldValues(
+               $table, $var, $cond = '', $fname = __METHOD__, $options = array()
+       );
+
+       /**
+        * Execute a SELECT query constructed using the various parameters provided.
+        * See below for full details of the parameters.
+        *
+        * @param string|array $table Table name
+        * @param string|array $vars Field names
+        * @param string|array $conds Conditions
+        * @param string $fname Caller function name
+        * @param array $options Query options
+        * @param array $join_conds Join conditions
+        *
+        *
+        * @param string|array $table
+        *
+        * May be either an array of table names, or a single string holding a table
+        * name. If an array is given, table aliases can be specified, for example:
+        *
+        *    array( 'a' => 'user' )
+        *
+        * This includes the user table in the query, with the alias "a" available
+        * for use in field names (e.g. a.user_name).
+        *
+        * All of the table names given here are automatically run through
+        * DatabaseBase::tableName(), which causes the table prefix (if any) to be
+        * added, and various other table name mappings to be performed.
+        *
+        *
+        * @param string|array $vars
+        *
+        * May be either a field name or an array of field names. The field names
+        * can be complete fragments of SQL, for direct inclusion into the SELECT
+        * query. If an array is given, field aliases can be specified, for example:
+        *
+        *   array( 'maxrev' => 'MAX(rev_id)' )
+        *
+        * This includes an expression with the alias "maxrev" in the query.
+        *
+        * If an expression is given, care must be taken to ensure that it is
+        * DBMS-independent.
+        *
+        *
+        * @param string|array $conds
+        *
+        * May be either a string containing a single condition, or an array of
+        * conditions. If an array is given, the conditions constructed from each
+        * element are combined with AND.
+        *
+        * Array elements may take one of two forms:
+        *
+        *   - Elements with a numeric key are interpreted as raw SQL fragments.
+        *   - Elements with a string key are interpreted as equality conditions,
+        *     where the key is the field name.
+        *     - If the value of such an array element is a scalar (such as a
+        *       string), it will be treated as data and thus quoted appropriately.
+        *       If it is null, an IS NULL clause will be added.
+        *     - If the value is an array, an IN (...) clause will be constructed
+        *       from its non-null elements, and an IS NULL clause will be added
+        *       if null is present, such that the field may match any of the
+        *       elements in the array. The non-null elements will be quoted.
+        *
+        * Note that expressions are often DBMS-dependent in their syntax.
+        * DBMS-independent wrappers are provided for constructing several types of
+        * expression commonly used in condition queries. See:
+        *    - DatabaseBase::buildLike()
+        *    - DatabaseBase::conditional()
+        *
+        *
+        * @param string|array $options
+        *
+        * Optional: Array of query options. Boolean options are specified by
+        * including them in the array as a string value with a numeric key, for
+        * example:
+        *
+        *    array( 'FOR UPDATE' )
+        *
+        * The supported options are:
+        *
+        *   - OFFSET: Skip this many rows at the start of the result set. OFFSET
+        *     with LIMIT can theoretically be used for paging through a result set,
+        *     but this is discouraged in MediaWiki for performance reasons.
+        *
+        *   - LIMIT: Integer: return at most this many rows. The rows are sorted
+        *     and then the first rows are taken until the limit is reached. LIMIT
+        *     is applied to a result set after OFFSET.
+        *
+        *   - FOR UPDATE: Boolean: lock the returned rows so that they can't be
+        *     changed until the next COMMIT.
+        *
+        *   - DISTINCT: Boolean: return only unique result rows.
+        *
+        *   - GROUP BY: May be either an SQL fragment string naming a field or
+        *     expression to group by, or an array of such SQL fragments.
+        *
+        *   - HAVING: May be either an string containing a HAVING clause or an array of
+        *     conditions building the HAVING clause. If an array is given, the conditions
+        *     constructed from each element are combined with AND.
+        *
+        *   - ORDER BY: May be either an SQL fragment giving a field name or
+        *     expression to order by, or an array of such SQL fragments.
+        *
+        *   - USE INDEX: This may be either a string giving the index name to use
+        *     for the query, or an array. If it is an associative array, each key
+        *     gives the table name (or alias), each value gives the index name to
+        *     use for that table. All strings are SQL fragments and so should be
+        *     validated by the caller.
+        *
+        *   - EXPLAIN: In MySQL, this causes an EXPLAIN SELECT query to be run,
+        *     instead of SELECT.
+        *
+        * And also the following boolean MySQL extensions, see the MySQL manual
+        * for documentation:
+        *
+        *    - LOCK IN SHARE MODE
+        *    - STRAIGHT_JOIN
+        *    - HIGH_PRIORITY
+        *    - SQL_BIG_RESULT
+        *    - SQL_BUFFER_RESULT
+        *    - SQL_SMALL_RESULT
+        *    - SQL_CALC_FOUND_ROWS
+        *    - SQL_CACHE
+        *    - SQL_NO_CACHE
+        *
+        *
+        * @param string|array $join_conds
+        *
+        * Optional associative array of table-specific join conditions. In the
+        * most common case, this is unnecessary, since the join condition can be
+        * in $conds. However, it is useful for doing a LEFT JOIN.
+        *
+        * The key of the array contains the table name or alias. The value is an
+        * array with two elements, numbered 0 and 1. The first gives the type of
+        * join, the second is an SQL fragment giving the join condition for that
+        * table. For example:
+        *
+        *    array( 'page' => array( 'LEFT JOIN', 'page_latest=rev_id' ) )
+        *
+        * @return ResultWrapper|bool If the query returned no rows, a ResultWrapper
+        *   with no rows in it will be returned. If there was a query error, a
+        *   DBQueryError exception will be thrown, except if the "ignore errors"
+        *   option was set, in which case false will be returned.
+        */
+       public function select(
+               $table, $vars, $conds = '', $fname = __METHOD__,
+               $options = array(), $join_conds = array()
+       );
+
+       /**
+        * The equivalent of DatabaseBase::select() except that the constructed SQL
+        * is returned, instead of being immediately executed. This can be useful for
+        * doing UNION queries, where the SQL text of each query is needed. In general,
+        * however, callers outside of Database classes should just use select().
+        *
+        * @param string|array $table Table name
+        * @param string|array $vars Field names
+        * @param string|array $conds Conditions
+        * @param string $fname Caller function name
+        * @param string|array $options Query options
+        * @param string|array $join_conds Join conditions
+        *
+        * @return string SQL query string.
+        * @see DatabaseBase::select()
+        */
+       public function selectSQLText(
+               $table, $vars, $conds = '', $fname = __METHOD__,
+               $options = array(), $join_conds = array()
+       );
+
+       /**
+        * Single row SELECT wrapper. Equivalent to DatabaseBase::select(), except
+        * that a single row object is returned. If the query returns no rows,
+        * false is returned.
+        *
+        * @param string|array $table Table name
+        * @param string|array $vars Field names
+        * @param array $conds Conditions
+        * @param string $fname Caller function name
+        * @param string|array $options Query options
+        * @param array|string $join_conds Join conditions
+        *
+        * @return stdClass|bool
+        */
+       public function selectRow( $table, $vars, $conds, $fname = __METHOD__,
+               $options = array(), $join_conds = array()
+       );
+
+       /**
+        * Estimate the number of rows in dataset
+        *
+        * MySQL allows you to estimate the number of rows that would be returned
+        * by a SELECT query, using EXPLAIN SELECT. The estimate is provided using
+        * index cardinality statistics, and is notoriously inaccurate, especially
+        * when large numbers of rows have recently been added or deleted.
+        *
+        * For DBMSs that don't support fast result size estimation, this function
+        * will actually perform the SELECT COUNT(*).
+        *
+        * Takes the same arguments as DatabaseBase::select().
+        *
+        * @param string $table Table name
+        * @param string $vars Unused
+        * @param array|string $conds Filters on the table
+        * @param string $fname Function name for profiling
+        * @param array $options Options for select
+        * @return int Row count
+        */
+       public function estimateRowCount(
+               $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array()
+       );
+
+       /**
+        * Get the number of rows in dataset
+        *
+        * This is useful when trying to do COUNT(*) but with a LIMIT for performance.
+        *
+        * Takes the same arguments as DatabaseBase::select().
+        *
+        * @param string $table Table name
+        * @param string $vars Unused
+        * @param array|string $conds Filters on the table
+        * @param string $fname Function name for profiling
+        * @param array $options Options for select
+        * @return int Row count
+        * @since 1.24
+        */
+       public function selectRowCount(
+               $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array()
+       );
+
+       /**
+        * Determines whether a field exists in a table
+        *
+        * @param string $table Table name
+        * @param string $field Filed to check on that table
+        * @param string $fname Calling function name (optional)
+        * @return bool Whether $table has filed $field
+        */
+       public function fieldExists( $table, $field, $fname = __METHOD__ );
+
+       /**
+        * Determines whether an index exists
+        * Usually throws a DBQueryError on failure
+        * If errors are explicitly ignored, returns NULL on failure
+        *
+        * @param string $table
+        * @param string $index
+        * @param string $fname
+        * @return bool|null
+        */
+       public function indexExists( $table, $index, $fname = __METHOD__ );
+
+       /**
+        * Query whether a given table exists
+        *
+        * @param string $table
+        * @param string $fname
+        * @return bool
+        */
+       public function tableExists( $table, $fname = __METHOD__ );
+
+       /**
+        * Determines if a given index is unique
+        *
+        * @param string $table
+        * @param string $index
+        *
+        * @return bool
+        */
+       public function indexUnique( $table, $index );
+
+       /**
+        * INSERT wrapper, inserts an array into a table.
+        *
+        * $a may be either:
+        *
+        *   - A single associative array. The array keys are the field names, and
+        *     the values are the values to insert. The values are treated as data
+        *     and will be quoted appropriately. If NULL is inserted, this will be
+        *     converted to a database NULL.
+        *   - An array with numeric keys, holding a list of associative arrays.
+        *     This causes a multi-row INSERT on DBMSs that support it. The keys in
+        *     each subarray must be identical to each other, and in the same order.
+        *
+        * Usually throws a DBQueryError on failure. If errors are explicitly ignored,
+        * returns success.
+        *
+        * $options is an array of options, with boolean options encoded as values
+        * with numeric keys, in the same style as $options in
+        * DatabaseBase::select(). Supported options are:
+        *
+        *   - IGNORE: Boolean: if present, duplicate key errors are ignored, and
+        *     any rows which cause duplicate key errors are not inserted. It's
+        *     possible to determine how many rows were successfully inserted using
+        *     DatabaseBase::affectedRows().
+        *
+        * @param string $table Table name. This will be passed through
+        *   DatabaseBase::tableName().
+        * @param array $a Array of rows to insert
+        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
+        * @param array $options Array of options
+        *
+        * @return bool
+        */
+       public function insert( $table, $a, $fname = __METHOD__, $options = array() );
+
+       /**
+        * 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
+        */
+       public function update( $table, $values, $conds, $fname = __METHOD__, $options = array() );
+
+       /**
+        * 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
+        * @throws MWException|DBUnexpectedError
+        * @return string
+        */
+       public function makeList( $a, $mode = LIST_COMMA );
+
+       /**
+        * Build a partial where clause from a 2-d array such as used for LinkBatch.
+        * The keys on each level may be either integers or strings.
+        *
+        * @param array $data Organized as 2-d
+        *    array(baseKeyVal => array(subKeyVal => [ignored], ...), ...)
+        * @param string $baseKey Field name to match the base-level keys to (eg 'pl_namespace')
+        * @param string $subKey Field name to match the sub-level keys to (eg 'pl_title')
+        * @return string|bool SQL fragment, or false if no items in array
+        */
+       public function makeWhereFrom2d( $data, $baseKey, $subKey );
+
+       /**
+        * @param string $field
+        * @return string
+        */
+       public function bitNot( $field );
+
+       /**
+        * @param string $fieldLeft
+        * @param string $fieldRight
+        * @return string
+        */
+       public function bitAnd( $fieldLeft, $fieldRight );
+
+       /**
+        * @param string $fieldLeft
+        * @param string $fieldRight
+        * @return string
+        */
+       public function bitOr( $fieldLeft, $fieldRight );
+
+       /**
+        * Build a concatenation list to feed into a SQL query
+        * @param array $stringList List of raw SQL expressions; caller is
+        *   responsible for any quoting
+        * @return string
+        */
+       public function buildConcat( $stringList );
+
+       /**
+        * Build a GROUP_CONCAT or equivalent statement for a query.
+        *
+        * 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()
+       );
+
+       /**
+        * Change the current database
+        *
+        * @param string $db
+        * @return bool Success or failure
+        */
+       public function selectDB( $db );
+
+       /**
+        * Get the current DB name
+        * @return string
+        */
+       public function getDBname();
+
+       /**
+        * Get the server hostname or IP address
+        * @return string
+        */
+       public function getServer();
+
+       /**
+        * Adds quotes and backslashes.
+        *
+        * @param string|Blob $s
+        * @return string
+        */
+       public function addQuotes( $s );
+
+       /**
+        * LIKE statement wrapper, receives a variable-length argument list with
+        * parts of pattern to match containing either string literals that will be
+        * escaped or tokens returned by anyChar() or anyString(). Alternatively,
+        * the function could be provided with an array of aforementioned
+        * parameters.
+        *
+        * Example: $dbr->buildLike( 'My_page_title/', $dbr->anyString() ) returns
+        * a LIKE clause that searches for subpages of 'My page title'.
+        * Alternatively:
+        *   $pattern = array( 'My_page_title/', $dbr->anyString() );
+        *   $query .= $dbr->buildLike( $pattern );
+        *
+        * @since 1.16
+        * @return string Fully built LIKE statement
+        */
+       public function buildLike();
+
+       /**
+        * Returns a token for buildLike() that denotes a '_' to be used in a LIKE query
+        *
+        * @return LikeMatch
+        */
+       public function anyChar();
+
+       /**
+        * Returns a token for buildLike() that denotes a '%' to be used in a LIKE query
+        *
+        * @return LikeMatch
+        */
+       public function anyString();
+
+       /**
+        * Returns an appropriately quoted sequence value for inserting a new row.
+        * MySQL has autoincrement fields, so this is just NULL. But the PostgreSQL
+        * subclass will return an integer, and save the value for insertId()
+        *
+        * Any implementation of this function should *not* involve reusing
+        * sequence numbers created for rolled-back transactions.
+        * See http://bugs.mysql.com/bug.php?id=30767 for details.
+        * @param string $seqName
+        * @return null|int
+        */
+       public function nextSequenceValue( $seqName );
+
+       /**
+        * REPLACE query wrapper.
+        *
+        * REPLACE is a very handy MySQL extension, which functions like an INSERT
+        * except that when there is a duplicate key error, the old row is deleted
+        * and the new row is inserted in its place.
+        *
+        * We simulate this with standard SQL with a DELETE followed by INSERT. To
+        * perform the delete, we need to know what the unique indexes are so that
+        * we know how to find the conflicting rows.
+        *
+        * It may be more efficient to leave off unique indexes which are unlikely
+        * to collide. However if you do this, you run the risk of encountering
+        * errors which wouldn't have occurred in MySQL.
+        *
+        * @param string $table The table to replace the row(s) in.
+        * @param array $uniqueIndexes Is an array of indexes. Each element may be either
+        *    a field name or an array of field names
+        * @param array $rows Can be either a single row to insert, or multiple rows,
+        *    in the same format as for DatabaseBase::insert()
+        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
+        */
+       public function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ );
+
+       /**
+        * INSERT ON DUPLICATE KEY UPDATE wrapper, upserts an array into a table.
+        *
+        * This updates any conflicting rows (according to the unique indexes) using
+        * the provided SET clause and inserts any remaining (non-conflicted) rows.
+        *
+        * $rows may be either:
+        *   - A single associative array. The array keys are the field names, and
+        *     the values are the values to insert. The values are treated as data
+        *     and will be quoted appropriately. If NULL is inserted, this will be
+        *     converted to a database NULL.
+        *   - An array with numeric keys, holding a list of associative arrays.
+        *     This causes a multi-row INSERT on DBMSs that support it. The keys in
+        *     each subarray must be identical to each other, and in the same order.
+        *
+        * It may be more efficient to leave off unique indexes which are unlikely
+        * to collide. However if you do this, you run the risk of encountering
+        * errors which wouldn't have occurred in MySQL.
+        *
+        * Usually throws a DBQueryError on failure. If errors are explicitly ignored,
+        * returns success.
+        *
+        * @since 1.22
+        *
+        * @param string $table Table name. This will be passed through DatabaseBase::tableName().
+        * @param array $rows A single row or list of rows to insert
+        * @param array $uniqueIndexes List of single field names or field name tuples
+        * @param array $set An array of values to SET. For each array element, the
+        *   key gives the field name, and the value gives the data to set that
+        *   field to. The data will be quoted by DatabaseBase::addQuotes().
+        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
+        * @throws Exception
+        * @return bool
+        */
+       public function upsert(
+               $table, array $rows, array $uniqueIndexes, array $set, $fname = __METHOD__
+       );
+
+       /**
+        * DELETE where the condition is a join.
+        *
+        * MySQL overrides this to use a multi-table DELETE syntax, in other databases
+        * we use sub-selects
+        *
+        * For safety, an empty $conds will not delete everything. If you want to
+        * delete all rows where the join condition matches, set $conds='*'.
+        *
+        * DO NOT put the join condition in $conds.
+        *
+        * @param 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 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
+        * @throws DBUnexpectedError
+        */
+       public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds,
+               $fname = __METHOD__
+       );
+
+       /**
+        * DELETE query wrapper.
+        *
+        * @param array $table Table name
+        * @param string|array $conds Array of conditions. See $conds in DatabaseBase::select()
+        *   for the format. Use $conds == "*" to delete all rows
+        * @param string $fname Name of the calling function
+        * @throws DBUnexpectedError
+        * @return bool|ResultWrapper
+        */
+       public function delete( $table, $conds, $fname = __METHOD__ );
+
+       /**
+        * INSERT SELECT wrapper. Takes data from a SELECT query and inserts it
+        * into another table.
+        *
+        * @param string $destTable The table name to insert into
+        * @param string|array $srcTable May be either a table name, or an array of table names
+        *    to include in a join.
+        *
+        * @param array $varMap Must be an associative array of the form
+        *    array( 'dest1' => 'source1', ...). Source items may be literals
+        *    rather than field names, but strings should be quoted with
+        *    DatabaseBase::addQuotes()
+        *
+        * @param array $conds Condition array. See $conds in DatabaseBase::select() for
+        *    the details of the format of condition arrays. May be "*" to copy the
+        *    whole table.
+        *
+        * @param string $fname The function name of the caller, from __METHOD__
+        *
+        * @param array $insertOptions Options for the INSERT part of the query, see
+        *    DatabaseBase::insert() for details.
+        * @param array $selectOptions Options for the SELECT part of the query, see
+        *    DatabaseBase::select() for details.
+        *
+        * @return ResultWrapper
+        */
+       public function insertSelect( $destTable, $srcTable, $varMap, $conds,
+               $fname = __METHOD__,
+               $insertOptions = array(), $selectOptions = array()
+       );
+
+       /**
+        * Returns true if current database backend supports ORDER BY or LIMIT for separate subqueries
+        * within the UNION construct.
+        * @return bool
+        */
+       public function unionSupportsOrderAndLimit();
+
+       /**
+        * Construct a UNION query
+        * This is used for providing overload point for other DB abstractions
+        * not compatible with the MySQL syntax.
+        * @param array $sqls SQL statements to combine
+        * @param bool $all Use UNION ALL
+        * @return string SQL fragment
+        */
+       public function unionQueries( $sqls, $all );
+
+       /**
+        * Returns an SQL expression for a simple conditional. This doesn't need
+        * to be overridden unless CASE isn't supported in your DBMS.
+        *
+        * @param string|array $cond SQL expression which will result in a boolean value
+        * @param string $trueVal SQL expression to return if true
+        * @param string $falseVal SQL expression to return if false
+        * @return string SQL fragment
+        */
+       public function conditional( $cond, $trueVal, $falseVal );
+
+       /**
+        * Returns a comand for str_replace function in SQL query.
+        * Uses REPLACE() in MySQL
+        *
+        * @param string $orig Column to modify
+        * @param string $old Column to seek
+        * @param string $new Column to replace with
+        *
+        * @return string
+        */
+       public function strreplace( $orig, $old, $new );
+
+       /**
+        * Determines how long the server has been up
+        * STUB
+        *
+        * @return int
+        */
+       public function getServerUptime();
+
+       /**
+        * Determines if the last failure was due to a deadlock
+        * STUB
+        *
+        * @return bool
+        */
+       public function wasDeadlock();
+
+       /**
+        * Determines if the last failure was due to a lock timeout
+        * STUB
+        *
+        * @return bool
+        */
+       public function wasLockTimeout();
+
+       /**
+        * Determines if the last query error was something that should be dealt
+        * with by pinging the connection and reissuing the query.
+        * STUB
+        *
+        * @return bool
+        */
+       public function wasErrorReissuable();
+
+       /**
+        * Determines if the last failure was due to the database being read-only.
+        * STUB
+        *
+        * @return bool
+        */
+       public function wasReadOnlyError();
+
+       /**
+        * Wait for the slave to catch up to a given master position.
+        *
+        * @param DBMasterPos $pos
+        * @param int $timeout The maximum number of seconds to wait for
+        *   synchronisation
+        * @return int Zero if the slave was past that position already,
+        *   greater than zero if we waited for some period of time, less than
+        *   zero if we timed out.
+        */
+       public function masterPosWait( DBMasterPos $pos, $timeout );
+
+       /**
+        * Get the replication position of this slave
+        *
+        * @return DBMasterPos|bool False if this is not a slave.
+        */
+       public function getSlavePos();
+
+       /**
+        * Get the position of this master
+        *
+        * @return DBMasterPos|bool False if this is not a master
+        */
+       public function getMasterPos();
+
+       /**
+        * Run an anonymous function as soon as there is no transaction pending.
+        * If there is a transaction and it is rolled back, then the callback is cancelled.
+        * Queries in the function will run in AUTO-COMMIT mode unless there are begin() calls.
+        * Callbacks must commit any transactions that they begin.
+        *
+        * This is useful for updates to different systems or when separate transactions are needed.
+        * For example, one might want to enqueue jobs into a system outside the database, but only
+        * after the database is updated so that the jobs will see the data when they actually run.
+        * It can also be used for updates that easily cause deadlocks if locks are held too long.
+        *
+        * @param callable $callback
+        * @since 1.20
+        */
+       public function onTransactionIdle( $callback );
+
+       /**
+        * Run an anonymous function before the current transaction commits or now if there is none.
+        * If there is a transaction and it is rolled back, then the callback is cancelled.
+        * Callbacks must not start nor commit any transactions.
+        *
+        * This is useful for updates that easily cause deadlocks if locks are held too long
+        * but where atomicity is strongly desired for these updates and some related updates.
+        *
+        * @param callable $callback
+        * @since 1.22
+        */
+       public function onTransactionPreCommitOrIdle( $callback );
+
+       /**
+        * Begin an atomic section of statements
+        *
+        * If a transaction has been started already, just keep track of the given
+        * section name to make sure the transaction is not committed pre-maturely.
+        * This function can be used in layers (with sub-sections), so use a stack
+        * to keep track of the different atomic sections. If there is no transaction,
+        * start one implicitly.
+        *
+        * The goal of this function is to create an atomic section of SQL queries
+        * without having to start a new transaction if it already exists.
+        *
+        * Atomic sections are more strict than transactions. With transactions,
+        * attempting to begin a new transaction when one is already running results
+        * in MediaWiki issuing a brief warning and doing an implicit commit. All
+        * atomic levels *must* be explicitly closed using DatabaseBase::endAtomic(),
+        * and any database transactions cannot be began or committed until all atomic
+        * levels are closed. There is no such thing as implicitly opening or closing
+        * an atomic section.
+        *
+        * @since 1.23
+        * @param string $fname
+        * @throws DBError
+        */
+       public function startAtomic( $fname = __METHOD__ );
+
+       /**
+        * Ends an atomic section of SQL statements
+        *
+        * Ends the next section of atomic SQL statements and commits the transaction
+        * if necessary.
+        *
+        * @since 1.23
+        * @see DatabaseBase::startAtomic
+        * @param string $fname
+        * @throws DBError
+        */
+       public function endAtomic( $fname = __METHOD__ );
+
+       /**
+        * Begin a transaction. If a transaction is already in progress,
+        * that transaction will be committed before the new transaction is started.
+        *
+        * Note that when the DBO_TRX flag is set (which is usually the case for web
+        * requests, but not for maintenance scripts), any previous database query
+        * will have started a transaction automatically.
+        *
+        * Nesting of transactions is not supported. Attempts to nest transactions
+        * will cause a warning, unless the current transaction was started
+        * automatically because of the DBO_TRX flag.
+        *
+        * @param string $fname
+        * @throws DBError
+        */
+       public function begin( $fname = __METHOD__ );
+
+       /**
+        * Commits a transaction previously started using begin().
+        * If no transaction is in progress, a warning is issued.
+        *
+        * Nesting of transactions is not supported.
+        *
+        * @param string $fname
+        * @param string $flush Flush flag, set to 'flush' to disable warnings about
+        *   explicitly committing implicit transactions, or calling commit when no
+        *   transaction is in progress. This will silently break any ongoing
+        *   explicit transaction. Only set the flush flag if you are sure that it
+        *   is safe to ignore these warnings in your context.
+        * @throws DBUnexpectedError
+        */
+       public function commit( $fname = __METHOD__, $flush = '' );
+
+       /**
+        * Rollback a transaction previously started using begin().
+        * If no transaction is in progress, a warning is issued.
+        *
+        * No-op on non-transactional databases.
+        *
+        * @param string $fname
+        * @param string $flush Flush flag, set to 'flush' to disable warnings about
+        *   calling rollback when no transaction is in progress. This will silently
+        *   break any ongoing explicit transaction. Only set the flush flag if you
+        *   are sure that it is safe to ignore these warnings in your context.
+        * @throws DBUnexpectedError
+        * @since 1.23 Added $flush parameter
+        */
+       public function rollback( $fname = __METHOD__, $flush = '' );
+
+       /**
+        * List all tables on the database
+        *
+        * @param string $prefix Only show tables with this prefix, e.g. mw_
+        * @param string $fname Calling function name
+        * @throws MWException
+        * @return array
+        */
+       public function listTables( $prefix = null, $fname = __METHOD__ );
+
+       /**
+        * Convert a timestamp in one of the formats accepted by wfTimestamp()
+        * to the format used for inserting into timestamp fields in this DBMS.
+        *
+        * The result is unquoted, and needs to be passed through addQuotes()
+        * before it can be included in raw SQL.
+        *
+        * @param string|int $ts
+        *
+        * @return string
+        */
+       public function timestamp( $ts = 0 );
+
+       /**
+        * Convert a timestamp in one of the formats accepted by wfTimestamp()
+        * to the format used for inserting into timestamp fields in this DBMS. If
+        * NULL is input, it is passed through, allowing NULL values to be inserted
+        * into timestamp fields.
+        *
+        * The result is unquoted, and needs to be passed through addQuotes()
+        * before it can be included in raw SQL.
+        *
+        * @param string|int $ts
+        *
+        * @return string
+        */
+       public function timestampOrNull( $ts = null );
+
+       /**
+        * Take the result from a query, and wrap it in a ResultWrapper if
+        * necessary. Boolean values are passed through as is, to indicate success
+        * of write queries or failure.
+        *
+        * Once upon a time, DatabaseBase::query() returned a bare MySQL result
+        * resource, and it was necessary to call this function to convert it to
+        * a wrapper. Nowadays, raw database objects are never exposed to external
+        * callers, so this is unnecessary in external code. For compatibility with
+        * old code, ResultWrapper objects are passed through unaltered.
+        *
+        * @param bool|ResultWrapper|resource $result
+        * @return bool|ResultWrapper
+        */
+       public function resultObject( $result );
+
+       /**
+        * Ping the server and try to reconnect if it there is no connection
+        *
+        * @return bool Success or failure
+        */
+       public function ping();
+
+       /**
+        * Get slave lag. Currently supported only by MySQL.
+        *
+        * Note that this function will generate a fatal error on many
+        * installations. Most callers should use LoadBalancer::safeGetLag()
+        * instead.
+        *
+        * @return int Database replication lag in seconds
+        */
+       public function getLag();
+
+       /**
+        * Return the maximum number of items allowed in a list, or 0 for unlimited.
+        *
+        * @return int
+        */
+       public function maxListLen();
+
+       /**
+        * Some DBMSs have a special format for inserting into blob fields, they
+        * don't allow simple quoted strings to be inserted. To insert into such
+        * a field, pass the data through this function before passing it to
+        * DatabaseBase::insert().
+        *
+        * @param string $b
+        * @return string
+        */
+       public function encodeBlob( $b );
+
+       /**
+        * Some DBMSs return a special placeholder object representing blob fields
+        * in result objects. Pass the object through this function to return the
+        * original string.
+        *
+        * @param string|Blob $b
+        * @return string
+        */
+       public function decodeBlob( $b );
+
+       /**
+        * Override database's default behavior. $options include:
+        *     'connTimeout' : Set the connection timeout value in seconds.
+        *                     May be useful for very long batch queries such as
+        *                     full-wiki dumps, where a single query reads out over
+        *                     hours or days.
+        *
+        * @param array $options
+        * @return void
+        */
+       public function setSessionOptions( array $options );
+
+       /**
+        * Set variables to be used in sourceFile/sourceStream, in preference to the
+        * ones in $GLOBALS. If an array is set here, $GLOBALS will not be used at
+        * all. If it's set to false, $GLOBALS will be used.
+        *
+        * @param bool|array $vars Mapping variable name to value.
+        */
+       public function setSchemaVars( $vars );
+
+       /**
+        * Check to see if a named lock is available (non-blocking)
+        *
+        * @param string $lockName Name of lock to poll
+        * @param string $method Name of method calling us
+        * @return bool
+        * @since 1.20
+        */
+       public function lockIsFree( $lockName, $method );
+
+       /**
+        * Acquire a named lock
+        *
+        * Named locks are not related to transactions
+        *
+        * @param string $lockName Name of lock to aquire
+        * @param string $method Name of method calling us
+        * @param int $timeout
+        * @return bool
+        */
+       public function lock( $lockName, $method, $timeout = 5 );
+
+       /**
+        * Release a lock
+        *
+        * Named locks are not related to transactions
+        *
+        * @param string $lockName Name of lock to release
+        * @param string $method Name of method calling us
+        *
+        * @return int Returns 1 if the lock was released, 0 if the lock was not established
+        * by this thread (in which case the lock is not released), and NULL if the named
+        * lock did not exist
+        */
+       public function unlock( $lockName, $method );
+
+       /**
+        * Check to see if a named lock used by lock() use blocking queues
+        *
+        * @return bool
+        * @since 1.26
+        */
+       public function namedLocksEnqueue();
+
+       /**
+        * Find out when 'infinity' is. Most DBMSes support this. This is a special
+        * keyword for timestamps in PostgreSQL, and works with CHAR(14) as well
+        * because "i" sorts after all numbers.
+        *
+        * @return string
+        */
+       public function getInfinity();
+
+       /**
+        * Encode an expiry time into the DBMS dependent format
+        *
+        * @param string $expiry Timestamp for expiry, or the 'infinity' string
+        * @return string
+        */
+       public function encodeExpiry( $expiry );
+
+       /**
+        * Decode an expiry time into a DBMS independent format
+        *
+        * @param string $expiry DB timestamp field value for expiry
+        * @param int $format TS_* constant, defaults to TS_MW
+        * @return string
+        */
+       public function decodeExpiry( $expiry, $format = TS_MW );
+
+       /**
+        * Allow or deny "big selects" for this session only. This is done by setting
+        * the sql_big_selects session variable.
+        *
+        * This is a MySQL-specific feature.
+        *
+        * @param bool|string $value True for allow, false for deny, or "default" to
+        *   restore the initial value
+        */
+       public function setBigSelects( $value = true );
+}
index 7dc2da0..4975ea1 100644 (file)
@@ -64,108 +64,3 @@ class LoadMonitorNull implements LoadMonitor {
                return array_fill_keys( $serverIndexes, 0 );
        }
 }
-
-/**
- * Basic MySQL load monitor with no external dependencies
- * Uses memcached to cache the replication lag for a short time
- *
- * @ingroup Database
- */
-class LoadMonitorMySQL implements LoadMonitor {
-       /** @var LoadBalancer */
-       public $parent;
-       /** @var BagOStuff */
-       protected $srvCache;
-       /** @var BagOStuff */
-       protected $mainCache;
-
-       public function __construct( $parent ) {
-               global $wgMemc;
-
-               $this->parent = $parent;
-
-               $this->srvCache = ObjectCache::newAccelerator( array(), 'hash' );
-               $this->mainCache = $wgMemc ?: wfGetMainCache();
-       }
-
-       public function scaleLoads( &$loads, $group = false, $wiki = false ) {
-       }
-
-       public function getLagTimes( $serverIndexes, $wiki ) {
-               if ( count( $serverIndexes ) == 1 && reset( $serverIndexes ) == 0 ) {
-                       # Single server only, just return zero without caching
-                       return array( 0 => 0 );
-               }
-
-               $key = $this->getLagTimeCacheKey();
-               # Randomize TTLs to reduce stampedes (4.0 - 5.0 sec)
-               $ttl = mt_rand( 4e6, 5e6 ) / 1e6;
-               # Keep keys around longer as fallbacks
-               $staleTTL = 60;
-
-               # (a) Check the local APC cache
-               $value = $this->srvCache->get( $key );
-               if ( $value && $value['timestamp'] > ( microtime( true ) - $ttl ) ) {
-                       wfDebugLog( 'replication',  __FUNCTION__ . ": got lag times ($key) from local cache" );
-                       return $value['lagTimes']; // cache hit
-               }
-               $staleValue = $value ?: false;
-
-               # (b) Check the shared cache and backfill APC
-               $value = $this->mainCache->get( $key );
-               if ( $value && $value['timestamp'] > ( microtime( true ) - $ttl ) ) {
-                       $this->srvCache->set( $key, $value, $staleTTL );
-                       wfDebugLog( 'replication',  __FUNCTION__ . ": got lag times ($key) from main cache" );
-
-                       return $value['lagTimes']; // cache hit
-               }
-               $staleValue = $value ?: $staleValue;
-
-               # (c) Cache key missing or expired; regenerate and backfill
-               if ( $this->mainCache->lock( $key, 0, 10 ) ) {
-                       # Let this process alone update the cache value
-                       $cache = $this->mainCache;
-                       $unlocker = new ScopedCallback( function () use ( $cache, $key ) {
-                               $cache->unlock( $key );
-                       } );
-               } elseif ( $staleValue ) {
-                       # Could not acquire lock but an old cache exists, so use it
-                       return $value['lagTimes'];
-               }
-
-               $lagTimes = array();
-               foreach ( $serverIndexes as $i ) {
-                       if ( $i == 0 ) { # Master
-                               $lagTimes[$i] = 0;
-                       } elseif ( false !== ( $conn = $this->parent->getAnyOpenConnection( $i ) ) ) {
-                               $lagTimes[$i] = $conn->getLag();
-                       } elseif ( false !== ( $conn = $this->parent->openConnection( $i, $wiki ) ) ) {
-                               $lagTimes[$i] = $conn->getLag();
-                               # Close the connection to avoid sleeper connections piling up.
-                               # Note that the caller will pick one of these DBs and reconnect,
-                               # which is slightly inefficient, but this only matters for the lag
-                               # time cache miss cache, which is far less common that cache hits.
-                               $this->parent->closeConnection( $conn );
-                       }
-               }
-
-               # Add a timestamp key so we know when it was cached
-               $value = array( 'lagTimes' => $lagTimes, 'timestamp' => microtime( true ) );
-               $this->mainCache->set( $key, $value, $staleTTL );
-               $this->srvCache->set( $key, $value, $staleTTL );
-               wfDebugLog( 'replication',  __FUNCTION__ . ": re-calculated lag times ($key)" );
-
-               return $value['lagTimes'];
-       }
-
-       public function clearCaches() {
-               $key = $this->getLagTimeCacheKey();
-               $this->srvCache->delete( $key );
-               $this->mainCache->delete( $key );
-       }
-
-       private function getLagTimeCacheKey() {
-               # Lag is per-server, not per-DB, so key on the master DB name
-               return wfForeignMemcKey( $this->parent->getServerName( 0 ), '', 'lag_times' );
-       }
-}
diff --git a/includes/db/LoadMonitorMySQL.php b/includes/db/LoadMonitorMySQL.php
new file mode 100644 (file)
index 0000000..c80697b
--- /dev/null
@@ -0,0 +1,126 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
+ * Basic MySQL load monitor with no external dependencies
+ * Uses memcached to cache the replication lag for a short time
+ *
+ * @ingroup Database
+ */
+class LoadMonitorMySQL implements LoadMonitor {
+       /** @var LoadBalancer */
+       public $parent;
+       /** @var BagOStuff */
+       protected $srvCache;
+       /** @var BagOStuff */
+       protected $mainCache;
+
+       public function __construct( $parent ) {
+               global $wgMemc;
+
+               $this->parent = $parent;
+
+               $this->srvCache = ObjectCache::newAccelerator( array(), 'hash' );
+               $this->mainCache = $wgMemc ?: wfGetMainCache();
+       }
+
+       public function scaleLoads( &$loads, $group = false, $wiki = false ) {
+       }
+
+       public function getLagTimes( $serverIndexes, $wiki ) {
+               if ( count( $serverIndexes ) == 1 && reset( $serverIndexes ) == 0 ) {
+                       # Single server only, just return zero without caching
+                       return array( 0 => 0 );
+               }
+
+               $key = $this->getLagTimeCacheKey();
+               # Randomize TTLs to reduce stampedes (4.0 - 5.0 sec)
+               $ttl = mt_rand( 4e6, 5e6 ) / 1e6;
+               # Keep keys around longer as fallbacks
+               $staleTTL = 60;
+
+               # (a) Check the local APC cache
+               $value = $this->srvCache->get( $key );
+               if ( $value && $value['timestamp'] > ( microtime( true ) - $ttl ) ) {
+                       wfDebugLog( 'replication',  __FUNCTION__ . ": got lag times ($key) from local cache" );
+                       return $value['lagTimes']; // cache hit
+               }
+               $staleValue = $value ?: false;
+
+               # (b) Check the shared cache and backfill APC
+               $value = $this->mainCache->get( $key );
+               if ( $value && $value['timestamp'] > ( microtime( true ) - $ttl ) ) {
+                       $this->srvCache->set( $key, $value, $staleTTL );
+                       wfDebugLog( 'replication',  __FUNCTION__ . ": got lag times ($key) from main cache" );
+
+                       return $value['lagTimes']; // cache hit
+               }
+               $staleValue = $value ?: $staleValue;
+
+               # (c) Cache key missing or expired; regenerate and backfill
+               if ( $this->mainCache->lock( $key, 0, 10 ) ) {
+                       # Let this process alone update the cache value
+                       $cache = $this->mainCache;
+                       /** @noinspection PhpUnusedLocalVariableInspection */
+                       $unlocker = new ScopedCallback( function () use ( $cache, $key ) {
+                               $cache->unlock( $key );
+                       } );
+               } elseif ( $staleValue ) {
+                       # Could not acquire lock but an old cache exists, so use it
+                       return $staleValue['lagTimes'];
+               }
+
+               $lagTimes = array();
+               foreach ( $serverIndexes as $i ) {
+                       if ( $i == 0 ) { # Master
+                               $lagTimes[$i] = 0;
+                       } elseif ( false !== ( $conn = $this->parent->getAnyOpenConnection( $i ) ) ) {
+                               $lagTimes[$i] = $conn->getLag();
+                       } elseif ( false !== ( $conn = $this->parent->openConnection( $i, $wiki ) ) ) {
+                               $lagTimes[$i] = $conn->getLag();
+                               # Close the connection to avoid sleeper connections piling up.
+                               # Note that the caller will pick one of these DBs and reconnect,
+                               # which is slightly inefficient, but this only matters for the lag
+                               # time cache miss cache, which is far less common that cache hits.
+                               $this->parent->closeConnection( $conn );
+                       }
+               }
+
+               # Add a timestamp key so we know when it was cached
+               $value = array( 'lagTimes' => $lagTimes, 'timestamp' => microtime( true ) );
+               $this->mainCache->set( $key, $value, $staleTTL );
+               $this->srvCache->set( $key, $value, $staleTTL );
+               wfDebugLog( 'replication',  __FUNCTION__ . ": re-calculated lag times ($key)" );
+
+               return $value['lagTimes'];
+       }
+
+       public function clearCaches() {
+               $key = $this->getLagTimeCacheKey();
+               $this->srvCache->delete( $key );
+               $this->mainCache->delete( $key );
+       }
+
+       private function getLagTimeCacheKey() {
+               # Lag is per-server, not per-DB, so key on the master DB name
+               return wfGlobalCacheKey( 'lag-times', $this->parent->getServerName( 0 ) );
+       }
+}
index 6bd6411..ea4e1b1 100644 (file)
@@ -22,6 +22,7 @@ namespace MediaWiki\Logger;
 
 use DateTimeZone;
 use MWDebug;
+use MWExceptionHandler;
 use Psr\Log\AbstractLogger;
 use Psr\Log\LogLevel;
 use UDPTransport;
@@ -39,7 +40,7 @@ use UDPTransport;
  * See documentation in DefaultSettings.php for detailed explanations of each
  * variable.
  *
- * @see \MediaWiki\Logger\LoggerFactory
+ * @see \\MediaWiki\\Logger\\LoggerFactory
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
@@ -52,10 +53,10 @@ class LegacyLogger extends AbstractLogger {
        protected $channel;
 
        /**
-        * Convert Psr\Log\LogLevel constants into int for sane comparisons
+        * Convert Psr\\Log\\LogLevel constants into int for sane comparisons
         * These are the same values that Monlog uses
         *
-        * @var array
+        * @var array $levelMapping
         */
        protected static $levelMapping = array(
                LogLevel::DEBUG => 100,
@@ -99,7 +100,7 @@ class LegacyLogger extends AbstractLogger {
         *
         * @param string $channel
         * @param string $message
-        * @param string|int $level Psr\Log\LogEvent constant or Monlog level int
+        * @param string|int $level Psr\\Log\\LogEvent constant or Monlog level int
         * @param array $context
         * @return bool True if message should be sent to disk/network, false
         * otherwise
@@ -167,7 +168,7 @@ class LegacyLogger extends AbstractLogger {
         * @return string
         */
        public static function format( $channel, $message, $context ) {
-               global $wgDebugLogGroups;
+               global $wgDebugLogGroups, $wgLogExceptionBacktrace;
 
                if ( $channel === 'wfDebug' ) {
                        $text = self::formatAsWfDebug( $channel, $message, $context );
@@ -215,6 +216,16 @@ class LegacyLogger extends AbstractLogger {
                        $text = self::formatAsWfDebugLog( $channel, $message, $context );
                }
 
+               // Append stacktrace of exception if available
+               if ( $wgLogExceptionBacktrace &&
+                       isset( $context['exception'] ) &&
+                       $context['exception'] instanceof Exception
+               ) {
+                       $text .= MWExceptionHandler::getRedactedTraceAsString(
+                               $context['exception']->getTraceAsString()
+                       ) . "\n";
+               }
+
                return self::interpolate( $text, $context );
        }
 
@@ -301,7 +312,7 @@ class LegacyLogger extends AbstractLogger {
                if ( strpos( $message, '{' ) !== false ) {
                        $replace = array();
                        foreach ( $context as $key => $val ) {
-                               $replace['{' . $key . '}'] = $val;
+                               $replace['{' . $key . '}'] = self::flatten( $val );
                        }
                        $message = strtr( $message, $replace );
                }
@@ -309,6 +320,66 @@ class LegacyLogger extends AbstractLogger {
        }
 
 
+       /**
+        * Convert a logging context element to a string suitable for
+        * interpolation.
+        *
+        * @param mixed $item
+        * @return string
+        */
+       protected static function flatten( $item ) {
+               if ( null === $item ) {
+                       return '[Null]';
+               }
+
+               if ( is_bool( $item ) ) {
+                       return $item ? 'true' : 'false';
+               }
+
+               if ( is_float( $item ) ) {
+                       if ( is_infinite( $item ) ) {
+                               return ( $item > 0 ? '' : '-' ) . 'INF';
+                       }
+                       if ( is_nan( $item ) ) {
+                               return 'NaN';
+                       }
+                       return $data;
+               }
+
+               if ( is_scalar( $item ) ) {
+                       return (string) $item;
+               }
+
+               if ( is_array( $item ) ) {
+                       return '[Array(' . count( $item ) . ')]';
+               }
+
+               if ( $item instanceof \DateTime ) {
+                       return $item->format( 'c' );
+               }
+
+               if ( $item instanceof \Exception ) {
+                       return '[Exception ' . get_class( $item ) . '( ' .
+                               $item->getFile() . ':' . $item->getLine() . ') ' .
+                               $item->getMessage() . ']';
+               }
+
+               if ( is_object( $item ) ) {
+                       if ( method_exists( $item, '__toString' ) ) {
+                               return (string) $item;
+                       }
+
+                       return '[Object ' . get_class( $item ) . ']';
+               }
+
+               if ( is_resource( $item ) ) {
+                       return '[Resource ' . get_resource_type( $item ) . ']';
+               }
+
+               return '[Unknown ' . gettype( $item ) . ']';
+       }
+
+
        /**
         * Select the appropriate log output destination for the given log event.
         *
index 1bf39e4..6a7f1d0 100644 (file)
@@ -30,7 +30,7 @@ namespace MediaWiki\Logger;
  * );
  * @endcode
  *
- * @see \MediaWiki\Logger\LoggerFactory
+ * @see \\MediaWiki\\Logger\\LoggerFactory
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
@@ -47,7 +47,7 @@ class LegacySpi implements Spi {
         * Get a logger instance.
         *
         * @param string $channel Logging channel
-        * @return \Psr\Log\LoggerInterface Logger instance
+        * @return \\Psr\\Log\\LoggerInterface Logger instance
         */
        public function getLogger( $channel ) {
                if ( !isset( $this->singletons[$channel] ) ) {
index f6699ec..0b6965f 100644 (file)
@@ -25,7 +25,7 @@ use ObjectFactory;
 /**
  * PSR-3 logger instance factory.
  *
- * Creation of \Psr\Log\LoggerInterface instances is managed via the
+ * Creation of \\Psr\\Log\\LoggerInterface instances is managed via the
  * LoggerFactory::getInstance() static method which in turn delegates to the
  * currently registered service provider.
  *
@@ -38,7 +38,7 @@ use ObjectFactory;
  * $wgMWLoggerDefaultSpi is expected to be an array usable by
  * ObjectFactory::getObjectFromSpec() to create a class.
  *
- * @see \MediaWiki\Logger\Spi
+ * @see \\MediaWiki\\Logger\\Spi
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
@@ -53,10 +53,10 @@ class LoggerFactory {
 
 
        /**
-        * Register a service provider to create new \Psr\Log\LoggerInterface
+        * Register a service provider to create new \\Psr\\Log\\LoggerInterface
         * instances.
         *
-        * @param \MediaWiki\Logger\Spi $provider Provider to register
+        * @param \\MediaWiki\\Logger\\Spi $provider Provider to register
         */
        public static function registerProvider( Spi $provider ) {
                self::$spi = $provider;
@@ -71,7 +71,7 @@ class LoggerFactory {
         * Spi registration. $wgMWLoggerDefaultSpi is expected to be an
         * array usable by ObjectFactory::getObjectFromSpec() to create a class.
         *
-        * @return \MediaWiki\Logger\Spi
+        * @return \\MediaWiki\\Logger\\Spi
         * @see registerProvider()
         * @see ObjectFactory::getObjectFromSpec()
         */
@@ -91,7 +91,7 @@ class LoggerFactory {
         * Get a named logger instance from the currently configured logger factory.
         *
         * @param string $channel Logger channel (name)
-        * @return \Psr\Log\LoggerInterface
+        * @return \\Psr\\Log\\LoggerInterface
         */
        public static function getInstance( $channel ) {
                if ( !interface_exists( '\Psr\Log\LoggerInterface' ) ) {
index a07fdc4..7b54861 100644 (file)
@@ -30,7 +30,7 @@ use ObjectFactory;
  * Configured using an array of configuration data with the keys 'loggers',
  * 'processors', 'handlers' and 'formatters'.
  *
- * The ['loggers']['@default'] configuration will be used to create loggers
+ * The ['loggers']['\@default'] configuration will be used to create loggers
  * for any channel that isn't explicitly named in the 'loggers' configuration
  * section.
  *
@@ -129,7 +129,25 @@ class MonologSpi implements Spi {
         * @param array $config Configuration data.
         */
        public function __construct( array $config ) {
-               $this->config = $config;
+               $this->config = array();
+               $this->mergeConfig( $config );
+       }
+
+
+       /**
+        * Merge additional configuration data into the configuration.
+        *
+        * @since 1.26
+        * @param array $config Configuration data.
+        */
+       public function mergeConfig( array $config ) {
+               foreach ( $config as $key => $value ) {
+                       if ( isset( $this->config[$key] ) ) {
+                               $this->config[$key] = array_merge( $this->config[$key], $value );
+                       } else {
+                               $this->config[$key] = $value;
+                       }
+               }
                $this->reset();
        }
 
@@ -158,7 +176,7 @@ class MonologSpi implements Spi {
         * name will return the cached instance.
         *
         * @param string $channel Logging channel
-        * @return \Psr\Log\LoggerInterface Logger instance
+        * @return \\Psr\\Log\\LoggerInterface Logger instance
         */
        public function getLogger( $channel ) {
                if ( !isset( $this->singletons['loggers'][$channel] ) ) {
@@ -180,7 +198,7 @@ class MonologSpi implements Spi {
         * Create a logger.
         * @param string $channel Logger channel
         * @param array $spec Configuration
-        * @return \Monolog\Logger
+        * @return \\Monolog\\Logger
         */
        protected function createLogger( $channel, $spec ) {
                $obj = new Logger( $channel );
@@ -218,7 +236,7 @@ class MonologSpi implements Spi {
        /**
         * Create or return cached handler.
         * @param string $name Processor name
-        * @return \Monolog\Handler\HandlerInterface
+        * @return \\Monolog\\Handler\\HandlerInterface
         */
        public function getHandler( $name ) {
                if ( !isset( $this->singletons['handlers'][$name] ) ) {
@@ -238,7 +256,7 @@ class MonologSpi implements Spi {
        /**
         * Create or return cached formatter.
         * @param string $name Formatter name
-        * @return \Monolog\Formatter\FormatterInterface
+        * @return \\Monolog\\Formatter\\FormatterInterface
         */
        public function getFormatter( $name ) {
                if ( !isset( $this->singletons['formatters'][$name] ) ) {
index a82d2c4..c9c7482 100644 (file)
@@ -23,7 +23,7 @@ namespace MediaWiki\Logger;
 use Psr\Log\NullLogger;
 
 /**
- * LoggerFactory service provider that creates \Psr\Log\NullLogger
+ * LoggerFactory service provider that creates \\Psr\\Log\\NullLogger
  * instances. A NullLogger silently discards all log events sent to it.
  *
  * Usage:
@@ -33,7 +33,7 @@ use Psr\Log\NullLogger;
  * );
  * @endcode
  *
- * @see \MediaWiki\Logger\LoggerFactory
+ * @see \\MediaWiki\\Logger\\LoggerFactory
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
@@ -41,7 +41,7 @@ use Psr\Log\NullLogger;
 class NullSpi implements Spi {
 
        /**
-        * @var \Psr\Log\NullLogger $singleton
+        * @var \\Psr\\Log\\NullLogger $singleton
         */
        protected $singleton;
 
@@ -55,7 +55,7 @@ class NullSpi implements Spi {
         * Get a logger instance.
         *
         * @param string $channel Logging channel
-        * @return \Psr\Log\NullLogger Logger instance
+        * @return \\Psr\\Log\\NullLogger Logger instance
         */
        public function getLogger( $channel ) {
                return $this->singleton;
index 044789f..51818a3 100644 (file)
 namespace MediaWiki\Logger;
 
 /**
- * Service provider interface for \Psr\Log\LoggerInterface implementation
+ * Service provider interface for \\Psr\\Log\\LoggerInterface implementation
  * libraries.
  *
  * MediaWiki can be configured to use a class implementing this interface to
- * create new \Psr\Log\LoggerInterface instances via either the
+ * create new \\Psr\\Log\\LoggerInterface instances via either the
  * $wgMWLoggerDefaultSpi global variable or code that constructs an instance
  * and registers it via the LoggerFactory::registerProvider() static method.
  *
- * @see \MediaWiki\Logger\LoggerFactory
+ * @see \\MediaWiki\\Logger\\LoggerFactory
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
@@ -40,7 +40,7 @@ interface Spi {
         * Get a logger instance.
         *
         * @param string $channel Logging channel
-        * @return \Psr\Log\LoggerInterface Logger instance
+        * @return \\Psr\\Log\\LoggerInterface Logger instance
         */
        public function getLogger( $channel );
 
index 9ec15cb..42e7cab 100644 (file)
@@ -26,12 +26,12 @@ use Monolog\Formatter\NormalizerFormatter;
 /**
  * Log message formatter that mimics the legacy log message formatting of
  * `wfDebug`, `wfDebugLog`, `wfLogDBError` and `wfErrorLog` global functions by
- * delegating the formatting to \MediaWiki\Logger\LegacyLogger.
+ * delegating the formatting to \\MediaWiki\\Logger\\LegacyLogger.
  *
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2013 Bryan Davis and Wikimedia Foundation.
- * @see \MediaWiki\Logger\LegacyLogger
+ * @see \\MediaWiki\\Logger\\LegacyLogger
  */
 class LegacyFormatter extends NormalizerFormatter {
 
index 1681dc0..3f25930 100644 (file)
@@ -18,6 +18,8 @@
  * @file
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * Handler class for MWExceptions
  * @ingroup Exception
@@ -86,7 +88,7 @@ class MWExceptionHandler {
                        $message = "Exception encountered, of type \"" . get_class( $e ) . "\"";
 
                        if ( $wgShowExceptionDetails ) {
-                               $message .= "\n" . MWExceptionHandler::getLogMessage( $e ) . "\nBacktrace:\n" .
+                               $message .= "\n" . self::getLogMessage( $e ) . "\nBacktrace:\n" .
                                        self::getRedactedTraceAsString( $e ) . "\n";
                        }
 
@@ -127,10 +129,11 @@ class MWExceptionHandler {
        public static function rollbackMasterChangesAndLog( Exception $e ) {
                $factory = wfGetLBFactory();
                if ( $factory->hasMasterChanges() ) {
-                       wfDebugLog( 'Bug56269',
+                       $logger = LoggerFactory::getInstance( 'Bug56269' );
+                       $logger->warning(
                                'Exception thrown with an uncommited database transaction: ' .
-                                       MWExceptionHandler::getLogMessage( $e ) . "\n" .
-                                       $e->getTraceAsString()
+                               self::getLogMessage( $e ),
+                               self::getLogContext( $e )
                        );
                        $factory->rollbackMasterChanges();
                }
@@ -276,9 +279,23 @@ TXT;
         * @return string
         */
        public static function getRedactedTraceAsString( Exception $e ) {
+               return self::prettyPrintRedactedTrace(
+                       self::getRedactedTrace( $e )
+               );
+       }
+
+       /**
+        * Generate a string representation of a structured stack trace generated
+        * by getRedactedTrace().
+        *
+        * @param array $trace
+        * @return string
+        * @since 1.26
+        */
+       public static function prettyPrintRedactedTrace( array $trace ) {
                $text = '';
 
-               foreach ( self::getRedactedTrace( $e ) as $level => $frame ) {
+               foreach ( $trace as $level => $frame ) {
                        if ( isset( $frame['file'] ) && isset( $frame['line'] ) ) {
                                $text .= "#{$level} {$frame['file']}({$frame['line']}): ";
                        } else {
@@ -379,6 +396,64 @@ TXT;
                return "[$id] $url   $type from line $line of $file: $message";
        }
 
+       /**
+        * Get a PSR-3 log event context from an Exception.
+        *
+        * Creates a structured array containing information about the provided
+        * exception that can be used to augment a log message sent to a PSR-3
+        * logger.
+        *
+        * @param Exception $e
+        * @return array
+        */
+       public static function getLogContext( Exception $e ) {
+               return array(
+                       'exception' => $e,
+               );
+       }
+
+       /**
+        * Get a structured representation of an Exception.
+        *
+        * Returns an array of structured data (class, message, code, file,
+        * backtrace) derived from the given exception. The backtrace information
+        * will be redacted as per getRedactedTraceAsArray().
+        *
+        * @param Exception $e
+        * @return array
+        * @since 1.26
+        */
+       public static function getStructuredExceptionData( Exception $e ) {
+               global $wgLogExceptionBacktrace;
+               $data = array(
+                       'id' => self::getLogId( $e ),
+                       'type' => get_class( $e ),
+                       'file' => $e->getFile(),
+                       'line' => $e->getLine(),
+                       'message' => $e->getMessage(),
+                       'code' => $e->getCode(),
+                       'url' => self::getURL() ?: null,
+               );
+
+               if ( $e instanceof ErrorException &&
+                       ( error_reporting() & $e->getSeverity() ) === 0
+               ) {
+                       // Flag surpressed errors
+                       $data['suppressed'] = true;
+               }
+
+               if ( $wgLogExceptionBacktrace ) {
+                       $data['backtrace'] = self::getRedactedTrace( $e );
+               }
+
+               $previous = $e->getPrevious();
+               if ( $previous !== null ) {
+                       $data['previous'] = self::getStructuredExceptionData( $previous );
+               }
+
+               return $data;
+       }
+
        /**
         * Serialize an Exception object to JSON.
         *
@@ -433,33 +508,8 @@ TXT;
         * @return string|false JSON string if successful; false upon failure
         */
        public static function jsonSerializeException( Exception $e, $pretty = false, $escaping = 0 ) {
-               global $wgLogExceptionBacktrace;
-
-               $exceptionData = array(
-                       'id' => self::getLogId( $e ),
-                       'type' => get_class( $e ),
-                       'file' => $e->getFile(),
-                       'line' => $e->getLine(),
-                       'message' => $e->getMessage(),
-               );
-
-               if ( $e instanceof ErrorException && ( error_reporting() & $e->getSeverity() ) === 0 ) {
-                       // Flag surpressed errors
-                       $exceptionData['suppressed'] = true;
-               }
-
-               // Because MediaWiki is first and foremost a web application, we set a
-               // 'url' key unconditionally, but set it to null if the exception does
-               // not occur in the context of a web request, as a way of making that
-               // fact visible and explicit.
-               $exceptionData['url'] = self::getURL() ?: null;
-
-               if ( $wgLogExceptionBacktrace ) {
-                       // Argument values may not be serializable, so redact them.
-                       $exceptionData['backtrace'] = self::getRedactedTrace( $e );
-               }
-
-               return FormatJson::encode( $exceptionData, $pretty, $escaping );
+               $data = self::getStructuredExceptionData( $e );
+               return FormatJson::encode( $data, $pretty, $escaping );
        }
 
        /**
@@ -475,16 +525,16 @@ TXT;
                global $wgLogExceptionBacktrace;
 
                if ( !( $e instanceof MWException ) || $e->isLoggable() ) {
-                       $log = self::getLogMessage( $e );
-                       if ( $wgLogExceptionBacktrace ) {
-                               wfDebugLog( 'exception', $log . "\n" . $e->getTraceAsString() );
-                       } else {
-                               wfDebugLog( 'exception', $log );
-                       }
+                       $logger = LoggerFactory::getInstance( 'exception' );
+                       $logger->error(
+                               self::getLogMessage( $e ),
+                               self::getLogContext( $e )
+                       );
 
                        $json = self::jsonSerializeException( $e, false, FormatJson::ALL_OK );
                        if ( $json !== false ) {
-                               wfDebugLog( 'exception-json', $json, 'private' );
+                               $logger = LoggerFactory::getInstance( 'exception-json' );
+                               $logger->error( $json, array( 'private' => true ) );
                        }
 
                        Hooks::run( 'LogException', array( $e, false ) );
@@ -505,18 +555,18 @@ TXT;
                // Filter out unwanted errors manually (e.g. when MediaWiki\suppressWarnings is active).
                $suppressed = ( error_reporting() & $e->getSeverity() ) === 0;
                if ( !$suppressed ) {
-                       $log = self::getLogMessage( $e );
-                       if ( $wgLogExceptionBacktrace ) {
-                               wfDebugLog( $channel, $log . "\n" . $e->getTraceAsString() );
-                       } else {
-                               wfDebugLog( $channel, $log );
-                       }
+                       $logger = LoggerFactory::getInstance( $channel );
+                       $logger->error(
+                               self::getLogMessage( $e ),
+                               self::getLogContext( $e )
+                       );
                }
 
                // Include all errors in the json log (surpressed errors will be flagged)
                $json = self::jsonSerializeException( $e, false, FormatJson::ALL_OK );
                if ( $json !== false ) {
-                       wfDebugLog( "$channel-json", $json, 'private' );
+                       $logger = LoggerFactory::getInstance( "{$channel}-json" );
+                       $logger->error( $json, array( 'private' => true )  );
                }
 
                Hooks::run( 'LogException', array( $e, $suppressed ) );
index b87e26d..fa1c462 100644 (file)
@@ -380,6 +380,7 @@ abstract class FileBackend {
                                $op['headers']['Content-Disposition'] = $op['disposition'];
                        }
                }
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
                return $this->doOperationsInternal( $ops, $opts );
        }
@@ -612,6 +613,7 @@ abstract class FileBackend {
                                $op['headers']['Content-Disposition'] = $op['disposition'];
                        }
                }
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
                return $this->doQuickOperationsInternal( $ops );
        }
@@ -756,6 +758,7 @@ abstract class FileBackend {
                if ( empty( $params['bypassReadOnly'] ) && $this->isReadOnly() ) {
                        return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
                }
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
                return $this->doPrepare( $params );
        }
@@ -785,6 +788,7 @@ abstract class FileBackend {
                if ( empty( $params['bypassReadOnly'] ) && $this->isReadOnly() ) {
                        return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
                }
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
                return $this->doSecure( $params );
        }
@@ -816,6 +820,7 @@ abstract class FileBackend {
                if ( empty( $params['bypassReadOnly'] ) && $this->isReadOnly() ) {
                        return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
                }
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
                return $this->doPublish( $params );
        }
@@ -840,6 +845,7 @@ abstract class FileBackend {
                if ( empty( $params['bypassReadOnly'] ) && $this->isReadOnly() ) {
                        return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
                }
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
                return $this->doClean( $params );
        }
index 7d2d831..e4b07b8 100644 (file)
@@ -1364,19 +1364,38 @@ abstract class FileBackendStore extends FileBackend {
        abstract protected function directoriesAreVirtual();
 
        /**
-        * Check if a container name is valid.
+        * Check if a short container name is valid
+        *
+        * This checks for length and illegal characters.
+        * This may disallow certain characters that can appear
+        * in the prefix used to make the full container name.
+        *
+        * @param string $container
+        * @return bool
+        */
+       final protected static function isValidShortContainerName( $container ) {
+               // Suffixes like '.xxx' (hex shard chars) or '.seg' (file segments)
+               // might be used by subclasses. Reserve the dot character for sanity.
+               // The only way dots end up in containers (e.g. resolveStoragePath)
+               // is due to the wikiId container prefix or the above suffixes.
+               return self::isValidContainerName( $container ) && !preg_match( '/[.]/', $container );
+       }
+
+       /**
+        * Check if a full container name is valid
+        *
         * This checks for length and illegal characters.
+        * Limiting the characters makes migrations to other stores easier.
         *
         * @param string $container
         * @return bool
         */
        final protected static function isValidContainerName( $container ) {
-               // This accounts for Swift and S3 restrictions while leaving room
-               // for things like '.xxx' (hex shard chars) or '.seg' (segments).
-               // This disallows directory separators or traversal characters.
+               // This accounts for NTFS, Swift, and Ceph restrictions
+               // and disallows directory separators or traversal characters.
                // Note that matching strings URL encode to the same string;
-               // in Swift, the length restriction is *after* URL encoding.
-               return preg_match( '/^[a-z0-9][a-z0-9-_]{0,199}$/i', $container );
+               // in Swift/Ceph, the length restriction is *after* URL encoding.
+               return (bool)preg_match( '/^[a-z0-9][a-z0-9-_.]{0,199}$/i', $container );
        }
 
        /**
@@ -1393,17 +1412,17 @@ abstract class FileBackendStore extends FileBackend {
         * @return array (container, path, container suffix) or (null, null, null) if invalid
         */
        final protected function resolveStoragePath( $storagePath ) {
-               list( $backend, $container, $relPath ) = self::splitStoragePath( $storagePath );
+               list( $backend, $shortCont, $relPath ) = self::splitStoragePath( $storagePath );
                if ( $backend === $this->name ) { // must be for this backend
                        $relPath = self::normalizeContainerPath( $relPath );
-                       if ( $relPath !== null ) {
+                       if ( $relPath !== null && self::isValidShortContainerName( $shortCont ) ) {
                                // Get shard for the normalized path if this container is sharded
-                               $cShard = $this->getContainerShard( $container, $relPath );
+                               $cShard = $this->getContainerShard( $shortCont, $relPath );
                                // Validate and sanitize the relative path (backend-specific)
-                               $relPath = $this->resolveContainerPath( $container, $relPath );
+                               $relPath = $this->resolveContainerPath( $shortCont, $relPath );
                                if ( $relPath !== null ) {
                                        // Prepend any wiki ID prefix to the container name
-                                       $container = $this->fullContainerName( $container );
+                                       $container = $this->fullContainerName( $shortCont );
                                        if ( self::isValidContainerName( $container ) ) {
                                                // Validate and sanitize the container name (backend-specific)
                                                $container = $this->resolveContainerName( "{$container}{$cShard}" );
index 9bae2ae..2ccafe4 100644 (file)
@@ -666,8 +666,9 @@ class SwiftFileBackend extends FileBackendStore {
                        return $objHdrs; // nothing to do
                }
 
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
-               trigger_error( "$path was not stored with SHA-1 metadata.", E_USER_WARNING );
+               wfDebugLog( 'SwiftBackend', __METHOD__ . ": $path was not stored with SHA-1 metadata." );
 
                $auth = $this->getAuthentication();
                if ( !$auth ) {
@@ -677,6 +678,7 @@ class SwiftFileBackend extends FileBackendStore {
                }
 
                $status = Status::newGood();
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $scopeLockS = $this->getScopedFileLocks( array( $path ), LockManager::LOCK_UW, $status );
                if ( $status->isOK() ) {
                        $tmpFile = $this->getLocalCopy( array( 'src' => $path, 'latest' => 1 ) );
@@ -696,7 +698,8 @@ class SwiftFileBackend extends FileBackendStore {
                                }
                        }
                }
-               trigger_error( "Unable to set SHA-1 metadata for $path", E_USER_WARNING );
+
+               wfDebugLog( 'SwiftBackend', __METHOD__ . ": unable to set SHA-1 metadata for $path" );
                $objHdrs['x-object-meta-sha1base36'] = false;
 
                return $objHdrs; // failed
diff --git a/includes/filerepo/FileBackendDBRepoWrapper.php b/includes/filerepo/FileBackendDBRepoWrapper.php
new file mode 100644 (file)
index 0000000..0401d0c
--- /dev/null
@@ -0,0 +1,357 @@
+<?php
+/**
+ * Proxy backend that manages file layout rewriting for FileRepo.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, 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 FileRepo
+ * @ingroup FileBackend
+ * @author Aaron Schulz
+ */
+
+/**
+ * @brief Proxy backend that manages file layout rewriting for FileRepo.
+ *
+ * LocalRepo may be configured to store files under their title names or by SHA-1.
+ * This acts as a shim in the later case, providing backwards compatability for
+ * most callers. All "public"/"deleted" zone files actually go in an "original"
+ * container and are never changed.
+ *
+ * This requires something like thumb_handler.php and img_auth.php for client viewing of files.
+ *
+ * @ingroup FileRepo
+ * @ingroup FileBackend
+ * @since 1.25
+ */
+class FileBackendDBRepoWrapper extends FileBackend {
+       /** @var FileBackend */
+       protected $backend;
+       /** @var string */
+       protected $repoName;
+       /** @var Closure */
+       protected $dbHandleFunc;
+       /** @var ProcessCacheLRU */
+       protected $resolvedPathCache;
+       /** @var Array Map of (index => DBConnRef) */
+       protected $dbs;
+
+       public function __construct( array $config ) {
+               $config['name'] = $config['backend']->getName();
+               $config['wikiId'] = $config['backend']->getWikiId();
+               parent::__construct( $config );
+               $this->backend = $config['backend'];
+               $this->repoName = $config['repoName'];
+               $this->dbHandleFunc = $config['dbHandleFactory'];
+               $this->resolvedPathCache = new ProcessCacheLRU( 100 );
+       }
+
+       /**
+        * Get the underlying FileBackend that is being wrapped
+        *
+        * @return FileBackend
+        */
+       public function getInternalBackend() {
+               return $this->backend;
+       }
+
+       /**
+        * Translate a legacy "title" path to it's "sha1" counterpart
+        *
+        * E.g. mwstore://local-backend/local-public/a/ab/<name>.jpg
+        * => mwstore://local-backend/local-original/x/y/z/<sha1>.jpg
+        *
+        * @param string $path
+        * @param bool $latest
+        * @return string
+        */
+       public function getBackendPath( $path, $latest = true ) {
+               $paths = $this->getBackendPaths( array( $path ), $latest );
+               return current( $paths );
+       }
+
+       /**
+        * Translate legacy "title" paths to their "sha1" counterparts
+        *
+        * E.g. mwstore://local-backend/local-public/a/ab/<name>.jpg
+        * => mwstore://local-backend/local-original/x/y/z/<sha1>.jpg
+        *
+        * @param array $paths
+        * @param bool $latest
+        * @return array Translated paths in same order
+        */
+       public function getBackendPaths( array $paths, $latest = true ) {
+               $db = $this->getDB( $latest ? DB_MASTER : DB_SLAVE );
+               $origBasePath = $this->backend->getContainerStoragePath( "{$this->repoName}-original" );
+
+               // @TODO: batching
+               $resolved = array();
+               foreach ( $paths as $i => $path ) {
+                       if ( !$latest && $this->resolvedPathCache->has( $path, 'target', 10 ) ) {
+                               $resolved[$i] = $this->resolvedPathCache->get( $path, 'target' );
+                               continue;
+                       }
+
+                       list( , $container, $rel ) = FileBackend::splitStoragePath( $path );
+
+                       if ( $container === "{$this->repoName}-public" ) {
+                               $name = basename( $path );
+                               if ( strpos( $path, '!' ) !== false ) {
+                                       $sha1 = $db->selectField( 'oldimage', 'oi_sha1',
+                                               array( 'oi_archive_name' => $name ),
+                                               __METHOD__
+                                       );
+                               } else {
+                                       $sha1 = $db->selectField( 'image', 'img_sha1',
+                                               array( 'img_name' => $name ),
+                                               __METHOD__
+                                       );
+                               }
+                               if ( !strlen( $sha1 ) ) {
+                                       $resolved[$i] = $path; // give up
+                                       continue;
+                               }
+                               $resolved[$i] = $this->getPathForSHA1( $sha1 );
+                               $this->resolvedPathCache->set( $path, 'target', $resolved[$i] );
+                       } elseif ( $container === "{$this->repoName}-deleted" ) {
+                               $name = basename( $path ); // <hash>.<ext>
+                               $sha1 = substr( $name, 0, strpos( $name, '.' ) ); // ignore extension
+                               $resolved[$i] = $this->getPathForSHA1( $sha1 );
+                               $this->resolvedPathCache->set( $path, 'target', $resolved[$i] );
+                       } else {
+                               $resolved[$i] = $path;
+                       }
+               }
+
+               $res = array();
+               foreach ( $paths as $i => $path ) {
+                       $res[$i] = $resolved[$i];
+               }
+
+               return $res;
+       }
+
+       protected function doOperationsInternal( array $ops, array $opts ) {
+               return $this->backend->doOperationsInternal( $this->mungeOpPaths( $ops ), $opts );
+       }
+
+       protected function doQuickOperationsInternal( array $ops ) {
+               return $this->backend->doQuickOperationsInternal( $this->mungeOpPaths( $ops ) );
+       }
+
+       protected function doPrepare( array $params ) {
+               return $this->backend->doPrepare( $params );
+       }
+
+       protected function doSecure( array $params ) {
+               return $this->backend->doSecure( $params );
+       }
+
+       protected function doPublish( array $params ) {
+               return $this->backend->doPublish( $params );
+       }
+
+       protected function doClean( array $params ) {
+               return $this->backend->doClean( $params );
+       }
+
+       public function concatenate( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function fileExists( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function getFileTimestamp( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function getFileSize( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function getFileStat( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function getFileXAttributes( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function getFileSha1Base36( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function getFileProps( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function streamFile( array $params ) {
+               // The stream methods use the file extension to determine the
+               // Content-Type (as MediaWiki should already validate it on upload).
+               // The translated SHA1 path has no extension, so this needs to use
+               // the untranslated path extension.
+               $type = StreamFile::contentTypeFromPath( $params['src'] );
+               if ( $type && $type != 'unknown/unknown' ) {
+                       $params['headers'][] = "Content-type: $type";
+               }
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function getFileContentsMulti( array $params ) {
+               return $this->translateArrayResults( __FUNCTION__, $params );
+       }
+
+       public function getLocalReferenceMulti( array $params ) {
+               return $this->translateArrayResults( __FUNCTION__, $params );
+       }
+
+       public function getLocalCopyMulti( array $params ) {
+               return $this->translateArrayResults( __FUNCTION__, $params );
+       }
+
+       public function getFileHttpUrl( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function directoryExists( array $params ) {
+               return $this->backend->directoryExists( $params );
+       }
+
+       public function getDirectoryList( array $params ) {
+               return $this->backend->getDirectoryList( $params );
+       }
+
+       public function getFileList( array $params ) {
+               return $this->backend->getFileList( $params );
+       }
+
+       public function getFeatures() {
+               return $this->backend->getFeatures();
+       }
+
+       public function clearCache( array $paths = null ) {
+               $this->backend->clearCache( null ); // clear all
+       }
+
+       public function preloadCache( array $paths ) {
+               $paths = $this->getBackendPaths( $paths );
+               $this->backend->preloadCache( $paths );
+       }
+
+       public function preloadFileStat( array $params ) {
+               return $this->translateSrcParams( __FUNCTION__, $params );
+       }
+
+       public function getScopedLocksForOps( array $ops, Status $status ) {
+               return $this->backend->getScopedFileLocks( $ops, $status );
+       }
+
+       /**
+        * Get the ultimate original storage path for a file
+        *
+        * Use this when putting a new file into the system
+        *
+        * @param string $sha1 File SHA-1 base36
+        * @return string
+        */
+       public function getPathForSHA1( $sha1 ) {
+               if ( strlen( $sha1 ) < 3 ) {
+                       throw new MWException( "Invalid file SHA-1." );
+               }
+               return $this->backend->getContainerStoragePath( "{$this->repoName}-original" ) .
+                       "/{$sha1[0]}/{$sha1[1]}/{$sha1[2]}/{$sha1}";
+       }
+
+       /**
+        * Get a connection to the repo file registry DB
+        *
+        * @param integer $index
+        * @return DBConnRef
+        */
+       protected function getDB( $index ) {
+               if ( !isset( $this->db[$index] ) ) {
+                       $func = $this->dbHandleFunc;
+                       $this->db[$index] = $func( $index );
+               }
+               return $this->db[$index];
+       }
+
+       /**
+        * Translates paths found in the "src" or "srcs" keys of a params array
+        *
+        * @param string $function
+        * @param array $params
+        */
+       protected function translateSrcParams( $function, array $params ) {
+               $latest = !empty( $params['latest'] );
+
+               if ( isset( $params['src'] ) ) {
+                       $params['src'] = $this->getBackendPath( $params['src'], $latest );
+               }
+
+               if ( isset( $params['srcs'] ) ) {
+                       $params['srcs'] = $this->getBackendPaths( $params['srcs'], $latest );
+               }
+
+               return $this->backend->$function( $params );
+       }
+
+       /**
+        * Translates paths when the backend function returns results keyed by paths
+        *
+        * @param string $function
+        * @param array $params
+        * @return array
+        */
+       protected function translateArrayResults( $function, array $params ) {
+               $origPaths = $params['srcs'];
+               $params['srcs'] = $this->getBackendPaths( $params['srcs'], !empty( $params['latest'] ) );
+               $pathMap = array_combine( $params['srcs'], $origPaths );
+
+               $results = $this->backend->$function( $params );
+
+               $contents = array();
+               foreach ( $results as $path => $result ) {
+                       $contents[$pathMap[$path]] = $result;
+               }
+
+               return $contents;
+       }
+
+       /**
+        * Translate legacy "title" source paths to their "sha1" counterparts
+        *
+        * This leaves destination paths alone since we don't want those to mutate
+        *
+        * @param array $ops
+        * @return array
+        */
+       protected function mungeOpPaths( array $ops ) {
+               // Ops that use 'src' and do not mutate core file data there
+               static $srcRefOps = array( 'store', 'copy', 'describe' );
+               foreach ( $ops as &$op ) {
+                       if ( isset( $op['src'] ) && in_array( $op['op'], $srcRefOps ) ) {
+                               $op['src'] = $this->getBackendPath( $op['src'], true );
+                       }
+                       if ( isset( $op['srcs'] ) ) {
+                               $op['srcs'] = $this->getBackendPaths( $op['srcs'], true );
+                       }
+               }
+               return $ops;
+       }
+}
index e66fdaf..7370c5c 100644 (file)
@@ -49,6 +49,9 @@ class FileRepo {
        /** @var int */
        public $descriptionCacheExpiry;
 
+       /** @var bool */
+       protected $hasSha1Storage = false;
+
        /** @var FileBackend */
        protected $backend;
 
@@ -431,16 +434,18 @@ class FileRepo {
                # Now try an old version of the file
                if ( $time !== false ) {
                        $img = $this->newFile( $title, $time );
-                       $img->load( $flags );
-                       if ( $img && $img->exists() ) {
-                               if ( !$img->isDeleted( File::DELETED_FILE ) ) {
-                                       return $img; // always OK
-                               } elseif ( !empty( $options['private'] ) &&
-                                       $img->userCan( File::DELETED_FILE,
-                                               $options['private'] instanceof User ? $options['private'] : null
-                                       )
-                               ) {
-                                       return $img;
+                       if ( $img ) {
+                               $img->load( $flags );
+                               if ( $img->exists() ) {
+                                       if ( !$img->isDeleted( File::DELETED_FILE ) ) {
+                                               return $img; // always OK
+                                       } elseif ( !empty( $options['private'] ) &&
+                                               $img->userCan( File::DELETED_FILE,
+                                                       $options['private'] instanceof User ? $options['private'] : null
+                                               )
+                                       ) {
+                                               return $img;
+                                       }
                                }
                        }
                }
@@ -452,10 +457,10 @@ class FileRepo {
                $redir = $this->checkRedirect( $title );
                if ( $redir && $title->getNamespace() == NS_FILE ) {
                        $img = $this->newFile( $redir );
-                       $img->load( $flags );
                        if ( !$img ) {
                                return false;
                        }
+                       $img->load( $flags );
                        if ( $img->exists() ) {
                                $img->redirectedFrom( $title->getDBkey() );
 
@@ -1883,6 +1888,14 @@ class FileRepo {
 
                return $ret;
        }
+
+       /**
+        * Returns whether or not storage is SHA-1 based
+        * @return boolean
+        */
+       public function hasSha1Storage() {
+               return $this->hasSha1Storage;
+       }
 }
 
 /**
index 6e9e6ad..dfdb375 100644 (file)
@@ -76,17 +76,8 @@ class ForeignDBRepo extends LocalRepo {
         */
        function getMasterDB() {
                if ( !isset( $this->dbConn ) ) {
-                       $this->dbConn = DatabaseBase::factory( $this->dbType,
-                               array(
-                                       'host' => $this->dbServer,
-                                       'user' => $this->dbUser,
-                                       'password' => $this->dbPassword,
-                                       'dbname' => $this->dbName,
-                                       'flags' => $this->dbFlags,
-                                       'tablePrefix' => $this->tablePrefix,
-                                       'foreign' => true,
-                               )
-                       );
+                       $func = $this->getDBFactory();
+                       $this->dbConn = $func( DB_MASTER );
                }
 
                return $this->dbConn;
@@ -99,6 +90,25 @@ class ForeignDBRepo extends LocalRepo {
                return $this->getMasterDB();
        }
 
+       /**
+        * @return Closure
+        */
+       protected function getDBFactory() {
+               return function( $index ) {
+                       return DatabaseBase::factory( $this->dbType,
+                               array(
+                                       'host' => $this->dbServer,
+                                       'user' => $this->dbUser,
+                                       'password' => $this->dbPassword,
+                                       'dbname' => $this->dbName,
+                                       'flags' => $this->dbFlags,
+                                       'tablePrefix' => $this->tablePrefix,
+                                       'foreign' => true,
+                               )
+                       );
+               };
+       }
+
        /**
         * @return bool
         */
index 8153ffb..f49b716 100644 (file)
@@ -66,6 +66,16 @@ class ForeignDBViaLBRepo extends LocalRepo {
                return wfGetDB( DB_SLAVE, array(), $this->wiki );
        }
 
+       /**
+        * @return Closure
+        */
+       protected function getDBFactory() {
+               $wiki = $this->wiki;
+               return function( $index ) use ( $wiki ) {
+                       return wfGetDB( $index, array(), $wiki );
+               };
+       }
+
        function hasSharedCache() {
                return $this->hasSharedCache;
        }
index ef402ea..1852912 100644 (file)
@@ -29,6 +29,9 @@
  * @ingroup FileRepo
  */
 class LocalRepo extends FileRepo {
+       /** @var bool */
+       protected $hasSha1Storage = false;
+
        /** @var array */
        protected $fileFactory = array( 'LocalFile', 'newFromTitle' );
 
@@ -47,6 +50,20 @@ class LocalRepo extends FileRepo {
        /** @var array */
        protected $oldFileFactoryKey = array( 'OldLocalFile', 'newFromKey' );
 
+       function __construct( array $info = null ) {
+               parent::__construct( $info );
+
+               $this->hasSha1Storage = isset( $info['storageLayout'] ) && $info['storageLayout'] === 'sha1';
+
+               if ( $this->hasSha1Storage() ) {
+                       $this->backend = new FileBackendDBRepoWrapper( array(
+                               'backend'         => $this->backend,
+                               'repoName'        => $this->name,
+                               'dbHandleFactory' => $this->getDBFactory()
+                       ) );
+               }
+       }
+
        /**
         * @throws MWException
         * @param stdClass $row
@@ -82,6 +99,11 @@ class LocalRepo extends FileRepo {
         * @return FileRepoStatus
         */
        function cleanupDeletedBatch( array $storageKeys ) {
+               if ( $this->hasSha1Storage() ) {
+                       wfDebug( __METHOD__ . ": skipped because storage uses sha1 paths\n" );
+                       return Status::newGood();
+               }
+
                $backend = $this->backend; // convenience
                $root = $this->getZonePath( 'deleted' );
                $dbw = $this->getMasterDB();
@@ -285,7 +307,7 @@ class LocalRepo extends FileRepo {
                                $file = $that->newFileFromRow( $row );
                                // There must have been a search for this DB key, but this has to handle the
                                // cases were title capitalization is different on the client and repo wikis.
-                               $dbKeysLook = array( str_replace( ' ', '_', $file->getName() ) );
+                               $dbKeysLook = array( strtr( $file->getName(), ' ', '_' ) );
                                if ( !empty( $info['initialCapital'] ) ) {
                                        // Search keys for "hi.png" and "Hi.png" should use the "Hi.png file"
                                        $dbKeysLook[] = $wgContLang->lcfirst( $file->getName() );
@@ -469,6 +491,16 @@ class LocalRepo extends FileRepo {
                return wfGetDB( DB_MASTER );
        }
 
+       /**
+        * Get a callback to get a DB handle given an index (DB_SLAVE/DB_MASTER)
+        * @return Closure
+        */
+       protected function getDBFactory() {
+               return function( $index ) {
+                       return wfGetDB( $index );
+               };
+       }
+
        /**
         * Get a key on the primary cache for this repository.
         * Returns false if the repository's cache is not accessible at this site.
@@ -514,4 +546,56 @@ class LocalRepo extends FileRepo {
                        'favicon' => wfExpandUrl( $wgFavicon ),
                ) );
        }
+
+       public function store( $srcPath, $dstZone, $dstRel, $flags = 0 ) {
+               return $this->skipWriteOperationIfSha1( __FUNCTION__, func_get_args() );
+       }
+
+       public function storeBatch( array $triplets, $flags = 0 ) {
+               return $this->skipWriteOperationIfSha1( __FUNCTION__, func_get_args() );
+       }
+
+       public function cleanupBatch( array $files, $flags = 0 ) {
+               return $this->skipWriteOperationIfSha1( __FUNCTION__, func_get_args() );
+       }
+
+       public function publish(
+               $srcPath,
+               $dstRel,
+               $archiveRel,
+               $flags = 0,
+               array $options = array()
+       ) {
+               return $this->skipWriteOperationIfSha1( __FUNCTION__, func_get_args() );
+       }
+
+       public function publishBatch( array $ntuples, $flags = 0 ) {
+               return $this->skipWriteOperationIfSha1( __FUNCTION__, func_get_args() );
+       }
+
+       public function delete( $srcRel, $archiveRel ) {
+               return $this->skipWriteOperationIfSha1( __FUNCTION__, func_get_args() );
+       }
+
+       public function deleteBatch( array $sourceDestPairs ) {
+               return $this->skipWriteOperationIfSha1( __FUNCTION__, func_get_args() );
+       }
+
+       /**
+        * Skips the write operation if storage is sha1-based, executes it normally otherwise
+        *
+        * @param string $function
+        * @param array $args
+        * @return FileRepoStatus
+        */
+       protected function skipWriteOperationIfSha1( $function, array $args ) {
+               $this->assertWritableRepo(); // fail out if read-only
+
+               if ( $this->hasSha1Storage() ) {
+                       wfDebug( __METHOD__ . ": skipped because storage uses sha1 paths\n" );
+                       return Status::newGood();
+               } else {
+                       return call_user_func_array('parent::' . $function, $args );
+               }
+       }
 }
index 76ed27b..72b3ae9 100644 (file)
@@ -421,7 +421,10 @@ abstract class File implements IDBAccessObject {
        public function getLocalRefPath() {
                $this->assertRepoDefined();
                if ( !isset( $this->fsFile ) ) {
+                       $starttime = microtime( true );
                        $this->fsFile = $this->repo->getLocalReference( $this->getPath() );
+                       RequestContext::getMain()->getStats()->timing( 'media.thumbnail.generate.fetchoriginal', microtime( true ) - $starttime );
+
                        if ( !$this->fsFile ) {
                                $this->fsFile = false; // null => false; cache negative hits
                        }
@@ -1092,7 +1095,9 @@ abstract class File implements IDBAccessObject {
         * @return bool|MediaTransformOutput
         */
        public function generateAndSaveThumb( $tmpFile, $transformParams, $flags ) {
-               global $wgUseSquid, $wgIgnoreImageErrors;
+               global $wgIgnoreImageErrors;
+
+               $stats = RequestContext::getMain()->getStats();
 
                $handler = $this->getHandler();
 
@@ -1109,10 +1114,14 @@ abstract class File implements IDBAccessObject {
                        $this->generateBucketsIfNeeded( $normalisedParams, $flags );
                }
 
+               $starttime = microtime( true );
+
                // Actually render the thumbnail...
                $thumb = $handler->doTransform( $this, $tmpThumbPath, $thumbUrl, $transformParams );
                $tmpFile->bind( $thumb ); // keep alive with $thumb
 
+               $stats->timing( 'media.thumbnail.generate.transform', microtime( true ) - $starttime );
+
                if ( !$thumb ) { // bad params?
                        $thumb = false;
                } elseif ( $thumb->isError() ) { // transform error
@@ -1123,6 +1132,9 @@ abstract class File implements IDBAccessObject {
                        }
                } elseif ( $this->repo && $thumb->hasFile() && !$thumb->fileIsSource() ) {
                        // Copy the thumbnail from the file system into storage...
+
+                       $starttime = microtime( true );
+
                        $disposition = $this->getThumbDisposition( $thumbName );
                        $status = $this->repo->quickImport( $tmpThumbPath, $thumbPath, $disposition );
                        if ( $status->isOK() ) {
@@ -1130,18 +1142,14 @@ abstract class File implements IDBAccessObject {
                        } else {
                                $thumb = $this->transformErrorOutput( $thumbPath, $thumbUrl, $transformParams, $flags );
                        }
+
+                       $stats->timing( 'media.thumbnail.generate.store', microtime( true ) - $starttime );
+
                        // Give extensions a chance to do something with this thumbnail...
                        Hooks::run( 'FileTransformed', array( $this, $thumb, $tmpThumbPath, $thumbPath ) );
                }
 
-               // Purge. Useful in the event of Core -> Squid connection failure or squid
-               // purge collisions from elsewhere during failure. Don't keep triggering for
-               // "thumbs" which have the main image URL though (bug 13776)
-               if ( $wgUseSquid ) {
-                       if ( !$thumb || $thumb->isError() || $thumb->getUrl() != $this->getURL() ) {
-                               SquidUpdate::purge( array( $thumbUrl ) );
-                       }
-               }
+               wfDebugLog( 'thumbnailaccess', time() . ' ' . $thumbPath . ' ' . filesize( $tmpThumbPath ) . ' Generated ' );
 
                return $thumb;
        }
@@ -1167,6 +1175,8 @@ abstract class File implements IDBAccessObject {
                        return false;
                }
 
+               $starttime = microtime( true );
+
                $params['physicalWidth'] = $bucket;
                $params['width'] = $bucket;
 
@@ -1182,6 +1192,8 @@ abstract class File implements IDBAccessObject {
 
                $thumb = $this->generateAndSaveThumb( $tmpFile, $params, $flags );
 
+               $buckettime = microtime( true ) - $starttime;
+
                if ( !$thumb || $thumb->isError() ) {
                        return false;
                }
@@ -1191,6 +1203,8 @@ abstract class File implements IDBAccessObject {
                // this object exists
                $tmpFile->bind( $this );
 
+               RequestContext::getMain()->getStats()->timing( 'media.thumbnail.generate.bucket', $buckettime );
+
                return true;
        }
 
index 6abe00c..4070553 100644 (file)
@@ -1459,7 +1459,7 @@ class LocalFile extends File {
         * The archive name should be passed through to recordUpload for database
         * registration.
         *
-        * @param string $srcPath Local filesystem path to the source image
+        * @param string $srcPath Local filesystem path or virtual URL to the source image
         * @param int $flags A bitwise combination of:
         *     File::DELETE_SOURCE    Delete the source file, i.e. move rather than copy
         * @param array $options Optional additional parameters
@@ -1477,7 +1477,7 @@ class LocalFile extends File {
         * The archive name should be passed through to recordUpload for database
         * registration.
         *
-        * @param string $srcPath Local filesystem path to the source image
+        * @param string $srcPath Local filesystem path or virtual URL to the source image
         * @param string $dstRel Target relative path
         * @param int $flags A bitwise combination of:
         *     File::DELETE_SOURCE    Delete the source file, i.e. move rather than copy
@@ -1486,7 +1486,8 @@ class LocalFile extends File {
         *     archive name, or an empty string if it was a new file.
         */
        function publishTo( $srcPath, $dstRel, $flags = 0, array $options = array() ) {
-               if ( $this->getRepo()->getReadOnlyReason() !== false ) {
+               $repo = $this->getRepo();
+               if ( $repo->getReadOnlyReason() !== false ) {
                        return $this->readOnlyFatalStatus();
                }
 
@@ -1494,13 +1495,29 @@ class LocalFile extends File {
 
                $archiveName = wfTimestamp( TS_MW ) . '!' . $this->getName();
                $archiveRel = 'archive/' . $this->getHashPath() . $archiveName;
-               $flags = $flags & File::DELETE_SOURCE ? LocalRepo::DELETE_SOURCE : 0;
-               $status = $this->repo->publish( $srcPath, $dstRel, $archiveRel, $flags, $options );
 
-               if ( $status->value == 'new' ) {
-                       $status->value = '';
+               if ( $repo->hasSha1Storage() ) {
+                       $sha1 = $repo->isVirtualUrl( $srcPath )
+                               ? $repo->getFileSha1( $srcPath )
+                               : File::sha1Base36( $srcPath );
+                       $dst = $repo->getBackend()->getPathForSHA1( $sha1 );
+                       $status = $repo->quickImport( $srcPath, $dst );
+                       if ( $flags & File::DELETE_SOURCE ) {
+                               unlink( $srcPath );
+                       }
+
+                       if ( $this->exists() ) {
+                               $status->value = $archiveName;
+                       }
                } else {
-                       $status->value = $archiveName;
+                       $flags = $flags & File::DELETE_SOURCE ? LocalRepo::DELETE_SOURCE : 0;
+                       $status = $repo->publish( $srcPath, $dstRel, $archiveRel, $flags, $options );
+
+                       if ( $status->value == 'new' ) {
+                               $status->value = '';
+                       } else {
+                               $status->value = $archiveName;
+                       }
                }
 
                $this->unlock(); // done
@@ -1941,14 +1958,14 @@ class LocalFileDeleteBatch {
                $this->status = $file->repo->newGood();
        }
 
-       function addCurrent() {
+       public function addCurrent() {
                $this->srcRels['.'] = $this->file->getRel();
        }
 
        /**
         * @param string $oldName
         */
-       function addOld( $oldName ) {
+       public function addOld( $oldName ) {
                $this->srcRels[$oldName] = $this->file->getArchiveRel( $oldName );
                $this->archiveUrls[] = $this->file->getArchiveUrl( $oldName );
        }
@@ -1957,7 +1974,7 @@ class LocalFileDeleteBatch {
         * Add the old versions of the image to the batch
         * @return array List of archive names from old versions
         */
-       function addOlds() {
+       public function addOlds() {
                $archiveNames = array();
 
                $dbw = $this->file->repo->getMasterDB();
@@ -1978,7 +1995,7 @@ class LocalFileDeleteBatch {
        /**
         * @return array
         */
-       function getOldRels() {
+       protected function getOldRels() {
                if ( !isset( $this->srcRels['.'] ) ) {
                        $oldRels =& $this->srcRels;
                        $deleteCurrent = false;
@@ -2050,7 +2067,7 @@ class LocalFileDeleteBatch {
                return $hashes;
        }
 
-       function doDBInserts() {
+       protected function doDBInserts() {
                $dbw = $this->file->repo->getMasterDB();
                $encTimestamp = $dbw->addQuotes( $dbw->timestamp() );
                $encUserId = $dbw->addQuotes( $this->user->getId() );
@@ -2165,8 +2182,8 @@ class LocalFileDeleteBatch {
         * Run the transaction
         * @return FileRepoStatus
         */
-       function execute() {
-
+       public function execute() {
+               $repo = $this->file->getRepo();
                $this->file->lock();
 
                // Prepare deletion batch
@@ -2180,7 +2197,7 @@ class LocalFileDeleteBatch {
                        if ( isset( $hashes[$name] ) ) {
                                $hash = $hashes[$name];
                                $key = $hash . $dotExt;
-                               $dstRel = $this->file->repo->getDeletedHashPath( $key ) . $key;
+                               $dstRel = $repo->getDeletedHashPath( $key ) . $key;
                                $this->deletionBatch[$name] = array( $srcRel, $dstRel );
                        }
                }
@@ -2193,20 +2210,22 @@ class LocalFileDeleteBatch {
                // them in a separate transaction, then run the file ops, then update the fa_name fields.
                $this->doDBInserts();
 
-               // Removes non-existent file from the batch, so we don't get errors.
-               // This also handles files in the 'deleted' zone deleted via revision deletion.
-               $checkStatus = $this->removeNonexistentFiles( $this->deletionBatch );
-               if ( !$checkStatus->isGood() ) {
-                       $this->status->merge( $checkStatus );
-                       return $this->status;
-               }
-               $this->deletionBatch = $checkStatus->value;
+               if ( !$repo->hasSha1Storage() ) {
+                       // Removes non-existent file from the batch, so we don't get errors.
+                       // This also handles files in the 'deleted' zone deleted via revision deletion.
+                       $checkStatus = $this->removeNonexistentFiles( $this->deletionBatch );
+                       if ( !$checkStatus->isGood() ) {
+                               $this->status->merge( $checkStatus );
+                               return $this->status;
+                       }
+                       $this->deletionBatch = $checkStatus->value;
 
-               // Execute the file deletion batch
-               $status = $this->file->repo->deleteBatch( $this->deletionBatch );
+                       // Execute the file deletion batch
+                       $status = $this->file->repo->deleteBatch( $this->deletionBatch );
 
-               if ( !$status->isGood() ) {
-                       $this->status->merge( $status );
+                       if ( !$status->isGood() ) {
+                               $this->status->merge( $status );
+                       }
                }
 
                if ( !$this->status->isOK() ) {
@@ -2232,7 +2251,7 @@ class LocalFileDeleteBatch {
         * @param array $batch
         * @return Status
         */
-       function removeNonexistentFiles( $batch ) {
+       protected function removeNonexistentFiles( $batch ) {
                $files = $newBatch = array();
 
                foreach ( $batch as $batchItem ) {
@@ -2293,7 +2312,7 @@ class LocalFileRestoreBatch {
         * Add a file by ID
         * @param int $fa_id
         */
-       function addId( $fa_id ) {
+       public function addId( $fa_id ) {
                $this->ids[] = $fa_id;
        }
 
@@ -2301,14 +2320,14 @@ class LocalFileRestoreBatch {
         * Add a whole lot of files by ID
         * @param int[] $ids
         */
-       function addIds( $ids ) {
+       public function addIds( $ids ) {
                $this->ids = array_merge( $this->ids, $ids );
        }
 
        /**
         * Add all revisions of the file
         */
-       function addAll() {
+       public function addAll() {
                $this->all = true;
        }
 
@@ -2320,12 +2339,13 @@ class LocalFileRestoreBatch {
         * So we save the batch and let the caller call cleanup()
         * @return FileRepoStatus
         */
-       function execute() {
+       public function execute() {
                global $wgLang;
 
+               $repo = $this->file->getRepo();
                if ( !$this->all && !$this->ids ) {
                        // Do nothing
-                       return $this->file->repo->newGood();
+                       return $repo->newGood();
                }
 
                $lockOwnsTrx = $this->file->lock();
@@ -2382,9 +2402,9 @@ class LocalFileRestoreBatch {
                                continue;
                        }
 
-                       $deletedRel = $this->file->repo->getDeletedHashPath( $row->fa_storage_key ) .
+                       $deletedRel = $repo->getDeletedHashPath( $row->fa_storage_key ) .
                                $row->fa_storage_key;
-                       $deletedUrl = $this->file->repo->getVirtualUrl() . '/deleted/' . $deletedRel;
+                       $deletedUrl = $repo->getVirtualUrl() . '/deleted/' . $deletedRel;
 
                        if ( isset( $row->fa_sha1 ) ) {
                                $sha1 = $row->fa_sha1;
@@ -2498,27 +2518,29 @@ class LocalFileRestoreBatch {
                        $status->error( 'undelete-missing-filearchive', $id );
                }
 
-               // Remove missing files from batch, so we don't get errors when undeleting them
-               $checkStatus = $this->removeNonexistentFiles( $storeBatch );
-               if ( !$checkStatus->isGood() ) {
-                       $status->merge( $checkStatus );
-                       return $status;
-               }
-               $storeBatch = $checkStatus->value;
+               if ( !$repo->hasSha1Storage() ) {
+                       // Remove missing files from batch, so we don't get errors when undeleting them
+                       $checkStatus = $this->removeNonexistentFiles( $storeBatch );
+                       if ( !$checkStatus->isGood() ) {
+                               $status->merge( $checkStatus );
+                               return $status;
+                       }
+                       $storeBatch = $checkStatus->value;
 
-               // Run the store batch
-               // Use the OVERWRITE_SAME flag to smooth over a common error
-               $storeStatus = $this->file->repo->storeBatch( $storeBatch, FileRepo::OVERWRITE_SAME );
-               $status->merge( $storeStatus );
+                       // Run the store batch
+                       // Use the OVERWRITE_SAME flag to smooth over a common error
+                       $storeStatus = $this->file->repo->storeBatch( $storeBatch, FileRepo::OVERWRITE_SAME );
+                       $status->merge( $storeStatus );
 
-               if ( !$status->isGood() ) {
-                       // Even if some files could be copied, fail entirely as that is the
-                       // easiest thing to do without data loss
-                       $this->cleanupFailedBatch( $storeStatus, $storeBatch );
-                       $status->ok = false;
-                       $this->file->unlock();
+                       if ( !$status->isGood() ) {
+                               // Even if some files could be copied, fail entirely as that is the
+                               // easiest thing to do without data loss
+                               $this->cleanupFailedBatch( $storeStatus, $storeBatch );
+                               $status->ok = false;
+                               $this->file->unlock();
 
-                       return $status;
+                               return $status;
+                       }
                }
 
                // Run the DB updates
@@ -2542,7 +2564,7 @@ class LocalFileRestoreBatch {
                }
 
                // If store batch is empty (all files are missing), deletion is to be considered successful
-               if ( $status->successCount > 0 || !$storeBatch ) {
+               if ( $status->successCount > 0 || !$storeBatch || $repo->hasSha1Storage() ) {
                        if ( !$exists ) {
                                wfDebug( __METHOD__ . " restored {$status->successCount} items, creating a new current\n" );
 
@@ -2565,7 +2587,7 @@ class LocalFileRestoreBatch {
         * @param array $triplets
         * @return Status
         */
-       function removeNonexistentFiles( $triplets ) {
+       protected function removeNonexistentFiles( $triplets ) {
                $files = $filteredTriplets = array();
                foreach ( $triplets as $file ) {
                        $files[$file[0]] = $file[0];
@@ -2591,7 +2613,7 @@ class LocalFileRestoreBatch {
         * @param array $batch
         * @return array
         */
-       function removeNonexistentFromCleanup( $batch ) {
+       protected function removeNonexistentFromCleanup( $batch ) {
                $files = $newBatch = array();
                $repo = $this->file->repo;
 
@@ -2616,7 +2638,7 @@ class LocalFileRestoreBatch {
         * This should be called from outside the transaction in which execute() was called.
         * @return FileRepoStatus
         */
-       function cleanup() {
+       public function cleanup() {
                if ( !$this->cleanupBatch ) {
                        return $this->file->repo->newGood();
                }
@@ -2635,7 +2657,7 @@ class LocalFileRestoreBatch {
         * @param Status $storeStatus
         * @param array $storeBatch
         */
-       function cleanupFailedBatch( $storeStatus, $storeBatch ) {
+       protected function cleanupFailedBatch( $storeStatus, $storeBatch ) {
                $cleanupBatch = array();
 
                foreach ( $storeStatus->success as $i => $success ) {
@@ -2693,7 +2715,7 @@ class LocalFileMoveBatch {
        /**
         * Add the current image to the batch
         */
-       function addCurrent() {
+       public function addCurrent() {
                $this->cur = array( $this->oldRel, $this->newRel );
        }
 
@@ -2701,7 +2723,7 @@ class LocalFileMoveBatch {
         * Add the old versions of the image to the batch
         * @return array List of archive names from old versions
         */
-       function addOlds() {
+       public function addOlds() {
                $archiveBase = 'archive';
                $this->olds = array();
                $this->oldCount = 0;
@@ -2751,7 +2773,7 @@ class LocalFileMoveBatch {
         * Perform the move.
         * @return FileRepoStatus
         */
-       function execute() {
+       public function execute() {
                $repo = $this->file->repo;
                $status = $repo->newGood();
 
@@ -2782,22 +2804,26 @@ class LocalFileMoveBatch {
                wfDebugLog( 'imagemove', "Renamed {$this->file->getName()} in database: " .
                        "{$statusDb->successCount} successes, {$statusDb->failCount} failures" );
 
-               // Copy the files into their new location.
-               // If a prior process fataled copying or cleaning up files we tolerate any
-               // of the existing files if they are identical to the ones being stored.
-               $statusMove = $repo->storeBatch( $triplets, FileRepo::OVERWRITE_SAME );
-               wfDebugLog( 'imagemove', "Moved files for {$this->file->getName()}: " .
-                       "{$statusMove->successCount} successes, {$statusMove->failCount} failures" );
-               if ( !$statusMove->isGood() ) {
-                       // Delete any files copied over (while the destination is still locked)
-                       $this->cleanupTarget( $triplets );
-                       $destFile->unlock();
-                       $this->file->unlockAndRollback(); // unlocks the destination
-                       wfDebugLog( 'imagemove', "Error in moving files: " . $statusMove->getWikiText() );
-                       $statusMove->ok = false;
-
-                       return $statusMove;
+               if ( !$repo->hasSha1Storage() ) {
+                       // Copy the files into their new location.
+                       // If a prior process fataled copying or cleaning up files we tolerate any
+                       // of the existing files if they are identical to the ones being stored.
+                       $statusMove = $repo->storeBatch( $triplets, FileRepo::OVERWRITE_SAME );
+                       wfDebugLog( 'imagemove', "Moved files for {$this->file->getName()}: " .
+                               "{$statusMove->successCount} successes, {$statusMove->failCount} failures" );
+                       if ( !$statusMove->isGood() ) {
+                               // Delete any files copied over (while the destination is still locked)
+                               $this->cleanupTarget( $triplets );
+                               $destFile->unlock();
+                               $this->file->unlockAndRollback(); // unlocks the destination
+                               wfDebugLog( 'imagemove', "Error in moving files: " . $statusMove->getWikiText() );
+                               $statusMove->ok = false;
+
+                               return $statusMove;
+                       }
+                       $status->merge( $statusMove );
                }
+
                $destFile->unlock();
                $this->file->unlock(); // done
 
@@ -2805,7 +2831,6 @@ class LocalFileMoveBatch {
                $this->cleanupSource( $triplets );
 
                $status->merge( $statusDb );
-               $status->merge( $statusMove );
 
                return $status;
        }
@@ -2816,7 +2841,7 @@ class LocalFileMoveBatch {
         *
         * @return FileRepoStatus
         */
-       function doDBUpdates() {
+       protected function doDBUpdates() {
                $repo = $this->file->repo;
                $status = $repo->newGood();
                $dbw = $this->db;
@@ -2868,7 +2893,7 @@ class LocalFileMoveBatch {
         * Generate triplets for FileRepo::storeBatch().
         * @return array
         */
-       function getMoveTriplets() {
+       protected function getMoveTriplets() {
                $moves = array_merge( array( $this->cur ), $this->olds );
                $triplets = array(); // The format is: (srcUrl, destZone, destUrl)
 
@@ -2890,7 +2915,7 @@ class LocalFileMoveBatch {
         * @param array $triplets
         * @return Status
         */
-       function removeNonexistentFiles( $triplets ) {
+       protected function removeNonexistentFiles( $triplets ) {
                $files = array();
 
                foreach ( $triplets as $file ) {
@@ -2920,7 +2945,7 @@ class LocalFileMoveBatch {
         * files. Called if something went wrong half way.
         * @param array $triplets
         */
-       function cleanupTarget( $triplets ) {
+       protected function cleanupTarget( $triplets ) {
                // Create dest pairs from the triplets
                $pairs = array();
                foreach ( $triplets as $triplet ) {
@@ -2936,7 +2961,7 @@ class LocalFileMoveBatch {
         * Called at the end of the move process if everything else went ok.
         * @param array $triplets
         */
-       function cleanupSource( $triplets ) {
+       protected function cleanupSource( $triplets ) {
                // Create source file names from the triplets
                $files = array();
                foreach ( $triplets as $triplet ) {
index 52a49dd..821c85f 100644 (file)
@@ -21,8 +21,8 @@
  */
 
 class PackedImageGallery extends TraditionalImageGallery {
-       function __construct( $mode = 'traditional' ) {
-               parent::__construct( $mode );
+       function __construct( $mode = 'traditional', IContextSource $context = null ) {
+               parent::__construct( $mode, $context );
                // Does not support per row option.
                $this->mPerRow = 0;
        }
index afd7cf6..b0b08a6 100644 (file)
@@ -21,8 +21,20 @@ class HTMLButtonField extends HTMLFormField {
        }
 
        public function getInputHTML( $value ) {
+               $flags = '';
+               $prefix = 'mw-htmlform-';
+               if ( $this->mParent instanceof VFormHTMLForm ||
+                       $this->mParent->getConfig()->get( 'UseMediaWikiUIEverywhere' )
+               ) {
+                       $prefix = 'mw-ui-';
+                       // add mw-ui-button separately, so the descriptor doesn't need to set it
+                       $flags .= $prefix.'button';
+               }
+               foreach ( $this->mFlags as $flag ) {
+                       $flags .= ' ' . $prefix . $flag;
+               }
                $attr = array(
-                       'class' => 'mw-htmlform-submit ' . $this->mClass,
+                       'class' => 'mw-htmlform-submit ' . $this->mClass . $flags,
                        'id' => $this->mID,
                ) + $this->getAttributes( array( 'disabled', 'tabindex' ) );
 
@@ -32,7 +44,7 @@ class HTMLButtonField extends HTMLFormField {
        /**
         * Get the OOUI widget for this field.
         * @param string $value
-        * @return OOUI\ButtonInputWidget
+        * @return OOUI\\ButtonInputWidget
         */
        public function getInputOOUI( $value ) {
                return new OOUI\ButtonInputWidget( array(
index 55312ff..9666c4e 100644 (file)
@@ -45,7 +45,7 @@ class HTMLCheckField extends HTMLFormField {
         * Get the OOUI version of this field.
         * @since 1.26
         * @param string $value
-        * @return OOUI\CheckboxInputWidget The checkbox widget.
+        * @return OOUI\\CheckboxInputWidget The checkbox widget.
         */
        public function getInputOOUI( $value ) {
                if ( !empty( $this->mParams['invert'] ) ) {
index 702651e..48cc828 100644 (file)
@@ -153,6 +153,8 @@ class HTMLForm extends ContextSource {
                'email' => 'HTMLTextField',
                'password' => 'HTMLTextField',
                'url' => 'HTMLTextField',
+               'title' => 'HTMLTitleTextField',
+               'user' => 'HTMLUserTextField',
        );
 
        public $mFieldData;
@@ -165,7 +167,7 @@ class HTMLForm extends ContextSource {
        protected $mFieldTree;
        protected $mShowReset = false;
        protected $mShowSubmit = true;
-       protected $mSubmitFlag = 'constructive';
+       protected $mSubmitFlags = array( 'constructive', 'primary' );
 
        protected $mSubmitCallback;
        protected $mValidationErrorMessage;
@@ -869,7 +871,8 @@ class HTMLForm extends ContextSource {
 
                $html = ''
                        . $this->getErrors( $submitResult )
-                       . $this->mHeader
+                       // In OOUI forms, we handle mHeader elsewhere. FIXME This is horrible.
+                       . ( $this->getDisplayFormat() === 'ooui' ? '' : $this->mHeader )
                        . $this->getBody()
                        . $this->getHiddenFields()
                        . $this->getButtons()
@@ -893,7 +896,6 @@ class HTMLForm extends ContextSource {
                $attribs = array(
                        'action' => $this->getAction(),
                        'method' => $this->getMethod(),
-                       'class' => array( 'visualClear' ),
                        'enctype' => $encType,
                );
                if ( !empty( $this->mId ) ) {
@@ -912,10 +914,11 @@ class HTMLForm extends ContextSource {
        function wrapForm( $html ) {
                # Include a <fieldset> wrapper for style, if requested.
                if ( $this->mWrapperLegend !== false ) {
-                       $html = Xml::fieldset( $this->mWrapperLegend, $html );
+                       $legend = is_string( $this->mWrapperLegend ) ? $this->mWrapperLegend : false;
+                       $html = Xml::fieldset( $legend, $html );
                }
 
-               return Html::rawElement( 'form', $this->getFormAttributes(), $html );
+               return Html::rawElement( 'form', $this->getFormAttributes() + array( 'class' => 'visualClear' ), $html );
        }
 
        /**
@@ -972,7 +975,10 @@ class HTMLForm extends ContextSource {
                        $attribs['class'] = array( 'mw-htmlform-submit' );
 
                        if ( $useMediaWikiUIEverywhere ) {
-                               array_push( $attribs['class'], 'mw-ui-button', 'mw-ui-' . $this->mSubmitFlag );
+                               foreach ( $this->mSubmitFlags as $flag ) {
+                                       array_push( $attribs['class'], 'mw-ui-' . $flag );
+                               }
+                               array_push( $attribs['class'], 'mw-ui-button' );
                        }
 
                        $buttons .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
@@ -1099,7 +1105,7 @@ class HTMLForm extends ContextSource {
         * @since 1.24
         */
        public function setSubmitDestructive() {
-               $this->mSubmitFlag = 'destructive';
+               $this->mSubmitFlags = array( 'destructive', 'primary' );
        }
 
        /**
@@ -1107,7 +1113,7 @@ class HTMLForm extends ContextSource {
         * @since 1.25
         */
        public function setSubmitProgressive() {
-               $this->mSubmitFlag = 'progressive';
+               $this->mSubmitFlags = array( 'progressive', 'primary' );
        }
 
        /**
@@ -1219,9 +1225,10 @@ class HTMLForm extends ContextSource {
         * Prompt the whole form to be wrapped in a "<fieldset>", with
         * this text as its "<legend>" element.
         *
-        * @param string|bool $legend HTML to go inside the "<legend>" element, or
-        * false for no <legend>
-        *     Will be escaped
+        * @param string|bool $legend If false, no wrapper or legend will be displayed.
+        *     If true, a wrapper will be displayed, but no legend.
+        *     If a string, a wrapper will be displayed with that string as a legend.
+        *     The string will be escaped before being output (this doesn't support HTML).
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -1409,19 +1416,26 @@ class HTMLForm extends ContextSource {
                                if ( $sectionName ) {
                                        $config['id'] = Sanitizer::escapeId( $sectionName );
                                }
+                               if ( is_string( $this->mWrapperLegend ) ) {
+                                       $config['label'] = $this->mWrapperLegend;
+                               }
                                $fieldset = new OOUI\FieldsetLayout( $config );
                                // Ewww. We should pass this as $config['items'], but there might be string snippets.
                                $fieldset->group->appendContent( new OOUI\HtmlSnippet( $html ) );
-                               $html = $fieldset->toString();
+                               $html = $fieldset;
                        } else {
                                $html = Html::rawElement( 'div', $attribs, "\n$html\n" );
                        }
                }
 
-               if ( $this->mSubSectionBeforeFields ) {
-                       return $subsectionHtml . "\n" . $html;
+               if ( $subsectionHtml ) {
+                       if ( $this->mSubSectionBeforeFields ) {
+                               return $subsectionHtml . "\n" . $html;
+                       } else {
+                               return $html . "\n" . $subsectionHtml;
+                       }
                } else {
-                       return $html . "\n" . $subsectionHtml;
+                       return $html;
                }
        }
 
index e19273b..1d8137e 100644 (file)
@@ -49,7 +49,7 @@ abstract class HTMLFormField {
         * Defaults to false, which getOOUI will interpret as "use the HTML version"
         *
         * @param string $value
-        * @return OOUI\Widget|false
+        * @return OOUI\\Widget|false
         */
        function getInputOOUI( $value ) {
                return false;
@@ -581,13 +581,15 @@ abstract class HTMLFormField {
                }
 
                $fieldType = get_class( $this );
-               $field = new OOUI\FieldLayout( $inputField, array(
+               $helpText = $this->getHelpText();
+               $config = array(
                        'classes' => array( "mw-htmlform-field-$fieldType", $this->mClass, $errorClass ),
                        'align' => $this->getLabelAlignOOUI(),
                        'label' => $this->getLabel(),
-                       'help' => $this->getHelpText(),
+                       'help' => $helpText !== null ? new OOUI\HtmlSnippet( $helpText ) : null,
                        'infusable' => $infusable,
-               ) );
+               );
+               $field = $this->getFieldLayoutOOUI( $inputField, $config );
 
                return $field . $errors;
        }
@@ -600,6 +602,18 @@ abstract class HTMLFormField {
                return 'top';
        }
 
+       /**
+        * Get a FieldLayout (or subclass thereof) to wrap this field in when using OOUI output.
+        * @return OOUI\\FieldLayout|OOUI\\ActionFieldLayout
+        */
+       protected function getFieldLayoutOOUI( $inputField, $config ) {
+               if ( isset( $this->mClassWithButton ) ) {
+                       $buttonWidget = $this->mClassWithButton->getInputOOUI( '' );
+                       return new OOUI\ActionFieldLayout( $inputField, $buttonWidget, $config );
+               }
+               return new OOUI\FieldLayout( $inputField, $config );
+       }
+
        /**
         * Get the complete raw fields for the input, including help text,
         * labels, and whatever.
@@ -729,7 +743,7 @@ abstract class HTMLFormField {
        /**
         * Determine the help text to display
         * @since 1.20
-        * @return string
+        * @return string HTML
         */
        public function getHelpText() {
                $helptext = null;
@@ -873,7 +887,7 @@ abstract class HTMLFormField {
         * @return array Attributes
         */
        public function getAttributes( array $list, array $mappings = null ) {
-               static $boolAttribs = array( 'disabled', 'required', 'autofocus', 'multiple', 'readonly' );
+               static $boolAttribs = array( 'disabled', 'required', 'multiple', 'readonly' );
 
                $ret = array();
                foreach ( $list as $key ) {
index 113bb4b..6b02c49 100644 (file)
@@ -18,6 +18,9 @@ class HTMLFormFieldWithButton extends HTMLFormField {
        /** @var string $mButtonType Value for the button in this field */
        protected $mButtonValue;
 
+       /** @var string $mButtonType Value for the button in this field */
+       protected $mButtonFlags = array( 'primary', 'progressive' );
+
        public function __construct( $info ) {
                if ( isset( $info['buttonclass'] ) ) {
                        $this->mButtonClass = $info['buttonclass'];
@@ -34,6 +37,9 @@ class HTMLFormFieldWithButton extends HTMLFormField {
                if ( isset( $info['buttontype'] ) ) {
                        $this->mButtonType = $info['buttontype'];
                }
+               if ( isset( $info['buttonflags'] ) ) {
+                       $this->mButtonFlags = $info['buttonflags'];
+               }
                parent::__construct( $info );
        }
 
@@ -46,6 +52,16 @@ class HTMLFormFieldWithButton extends HTMLFormField {
                return Html::input( $this->mButtonName, $this->mButtonValue, $this->mButtonType, $attr );
        }
 
+       public function getInputOOUI( $value ) {
+               return new OOUI\ButtonInputWidget( array(
+                       'name' => $this->mButtonName,
+                       'value' => $this->mButtonValue,
+                       'type' => $this->mButtonType,
+                       'label' => $this->mButtonValue,
+                       'flags' => $this->mButtonFlags,
+               ) );
+       }
+
        /**
         * Combines the passed element with a button.
         * @param String $element Element to combine the button with.
index b2ec9ca..d6d564e 100644 (file)
@@ -3,13 +3,16 @@
  * Wrapper for Html::namespaceSelector to use in HTMLForm
  */
 class HTMLSelectNamespace extends HTMLFormField {
-       function getInputHTML( $value ) {
-               $allValue = ( isset( $this->mParams['all'] ) ? $this->mParams['all'] : 'all' );
+       public function __construct( $params ) {
+               parent::__construct( $params );
+               $this->mAllValue = isset( $this->mParams['all'] ) ? $this->mParams['all'] : 'all';
+       }
 
+       function getInputHTML( $value ) {
                return Html::namespaceSelector(
                        array(
                                'selected' => $value,
-                               'all' => $allValue
+                               'all' => $this->mAllValue
                        ), array(
                                'name' => $this->mName,
                                'id' => $this->mID,
@@ -17,4 +20,16 @@ class HTMLSelectNamespace extends HTMLFormField {
                        )
                );
        }
+
+       public function getInputOOUI( $value ) {
+               return new MediaWiki\Widget\NamespaceInputWidget( array(
+                       'valueNamespace' => $value,
+                       'nameNamespace' => $this->mName,
+                       'id' => $this->mID,
+                       'includeAllValue' => $this->mAllValue,
+                       // Disable additional checkboxes
+                       'nameInvert' => null,
+                       'nameAssociated' => null,
+               ) );
+       }
 }
index e4f78b2..aeb4b7c 100644 (file)
@@ -47,6 +47,10 @@ class HTMLTextAreaField extends HTMLFormField {
        }
 
        function getInputOOUI( $value ) {
+               if ( isset( $this->mParams['cols'] ) ) {
+                       throw new Exception( "OOUIHTMLForm does not support the 'cols' parameter for textareas" );
+               }
+
                $attribs = $this->getTooltipAndAccessKey();
 
                if ( $this->mClass !== '' ) {
@@ -72,6 +76,7 @@ class HTMLTextAreaField extends HTMLFormField {
                        'name' => $this->mName,
                        'multiline' => true,
                        'value' => $value,
+                       'rows' => $this->getRows(),
                ) + $attribs );
        }
 }
index 5c04ee2..40cff47 100644 (file)
@@ -120,11 +120,15 @@ class HTMLTextField extends HTMLFormField {
 
                $type = $this->getType( $attribs );
 
-               return new OOUI\TextInputWidget( array(
+               return $this->getInputWidget( array(
                        'id' => $this->mID,
                        'name' => $this->mName,
                        'value' => $value,
                        'type' => $type,
                ) + $attribs );
        }
+
+       protected function getInputWidget( $params ) {
+               return new OOUI\TextInputWidget( $params );
+       }
 }
diff --git a/includes/htmlform/HTMLTitleTextField.php b/includes/htmlform/HTMLTitleTextField.php
new file mode 100644 (file)
index 0000000..e1bc1a0
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+
+use MediaWiki\Widget\TitleInputWidget;
+
+/**
+ * Implements a text input field for page titles.
+ * Automatically does validation that the title is valid,
+ * as well as autocompletion if using the OOUI display format.
+ *
+ * FIXME: Does not work for forms that support GET requests.
+ *
+ * Optional parameters:
+ * 'namespace' - Namespace the page must be in
+ * 'creatable' - Whether to validate the title is creatable (not a special page)
+ * 'exists' - Whether to validate that the title already exists
+ *
+ * @since 1.26
+ */
+class HTMLTitleTextField extends HTMLTextField {
+       public function __construct( $params ) {
+               $params += array(
+                       'namespace' => false,
+                       'creatable' => false,
+                       'exists' => false,
+               );
+
+               parent::__construct( $params );
+       }
+
+       public function validate( $value, $alldata ) {
+               try {
+                       $title = Title::newFromTextThrow( $value );
+               } catch ( MalformedTitleException $e ) {
+                       $msg = $this->msg( $e->getErrorMessage() );
+                       $params = $e->getErrorMessageParameters();
+                       if ( $params ) {
+                               $msg->params( $params );
+                       }
+                       return $msg->parse();
+               }
+
+               $text = $title->getPrefixedText();
+               if ( $this->mParams['namespace'] !== false && !$title->inNamespace( $this->mParams['namespace'] ) ) {
+                       return $this->msg( 'htmlform-title-badnamespace', $this->mParams['namespace'], $text )->parse();
+               }
+
+               if ( $this->mParams['creatable'] && !$title->canExist() ) {
+                       return $this->msg( 'htmlform-title-not-creatable', $text )->escaped();
+               }
+
+               if ( $this->mParams['exists'] && !$title->exists() ) {
+                       return $this->msg( 'htmlform-title-not-exists', $text )->parse();
+               }
+
+               return parent::validate( $value, $alldata );
+       }
+
+       protected function getInputWidget( $params ) {
+               $this->mParent->getOutput()->addModules( 'mediawiki.widgets' );
+               if ( $this->mParams['namespace'] !== false ) {
+                       $params['namespace'] = $this->mParams['namespace'];
+               }
+               $params['relative'] = false;
+               return new TitleInputWidget( $params );
+       }
+}
diff --git a/includes/htmlform/HTMLUserTextField.php b/includes/htmlform/HTMLUserTextField.php
new file mode 100644 (file)
index 0000000..949fefd
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+
+use MediaWiki\Widget\UserInputWidget;
+
+/**
+ * Implements a text input field for user names.
+ * Automatically auto-completes if using the OOUI display format.
+ *
+ * FIXME: Does not work for forms that support GET requests.
+ *
+ * Optional parameters:
+ * 'exists' - Whether to validate that the user already exists
+ *
+ * @since 1.26
+ */
+class HTMLUserTextField extends HTMLTextField {
+       public function __construct( $params ) {
+               $params += array(
+                       'exists' => false,
+               );
+
+               parent::__construct( $params );
+       }
+
+       public function validate( $value, $alldata ) {
+               // check, if a user exists with the given username
+               $user = User::newFromName( $value );
+
+               if ( !$user ) {
+                       return $this->msg( 'htmlform-user-not-valid', $value )->parse();
+               } elseif ( $this->mParams['exists'] && $user->getId() === 0 ) {
+                       return $this->msg( 'htmlform-user-not-exists', $user->getName() )->parse();
+               }
+
+               return parent::validate( $value, $alldata );
+       }
+
+       protected function getInputWidget( $params ) {
+               $this->mParent->getOutput()->addModules( 'mediawiki.widgets' );
+
+               return new UserInputWidget( $params );
+       }
+}
index 80e91f7..eec13ee 100644 (file)
  * Compact stacked vertical format for forms, implemented using OOUI widgets.
  */
 class OOUIHTMLForm extends HTMLForm {
-       /**
-        * Wrapper and its legend are never generated in OOUI mode.
-        * @var boolean
-        */
-       protected $mWrapperLegend = false;
-
        public function __construct( $descriptor, $context = null, $messagePrefix = '' ) {
                parent::__construct( $descriptor, $context, $messagePrefix );
                $this->getOutput()->enableOOUI();
@@ -71,7 +65,7 @@ class OOUIHTMLForm extends HTMLForm {
                        $attribs['type'] = 'submit';
                        $attribs['label'] = $this->getSubmitText();
                        $attribs['value'] = $this->getSubmitText();
-                       $attribs['flags'] = array( $this->mSubmitFlag );
+                       $attribs['flags'] = $this->mSubmitFlags;
 
                        $buttons .= new OOUI\ButtonInputWidget( $attribs );
                }
@@ -110,23 +104,30 @@ class OOUIHTMLForm extends HTMLForm {
                return $html;
        }
 
-       function getFormAttributes() {
-               $attribs = parent::getFormAttributes();
-               if ( !isset( $attribs['class'] ) ) {
-                       $attribs['class'] = '';
+       function getBody() {
+               $fieldset = parent::getBody();
+               // FIXME This only works for forms with no subsections
+               if ( $fieldset instanceof OOUI\FieldsetLayout ) {
+                       $fieldset->group->prependContent( new OOUI\HtmlSnippet( $this->mHeader ) );
                }
-
-               if ( is_string( $attribs['class'] ) ) {
-                       $attribs['class'] = trim( $attribs['class'] . ' mw-htmlform-ooui' );
-               } else {
-                       $attribs['class'][] = 'mw-htmlform-ooui';
-               }
-
-               return $attribs;
+               return $fieldset;
        }
 
        function wrapForm( $html ) {
-               // Always discard $this->mWrapperLegend
-               return Html::rawElement( 'form', $this->getFormAttributes(), $html );
+               $form = new OOUI\FormLayout( $this->getFormAttributes() + array(
+                       'classes' => array( 'mw-htmlform-ooui' ),
+                       'content' => new OOUI\HtmlSnippet( $html ),
+               ) );
+
+               // Include a wrapper for style, if requested.
+               $form = new OOUI\PanelLayout( array(
+                       'classes' => array( 'mw-htmlform-ooui-wrapper' ),
+                       'expanded' => false,
+                       'padded' => $this->mWrapperLegend !== false,
+                       'framed' => $this->mWrapperLegend !== false,
+                       'content' => $form,
+               ) );
+
+               return $form;
        }
 }
index f1fd05d..3788379 100644 (file)
@@ -65,7 +65,7 @@ class VFormHTMLForm extends HTMLForm {
 
        protected function getFormAttributes() {
                $attribs = parent::getFormAttributes();
-               array_push( $attribs['class'], 'mw-ui-vform', 'mw-ui-container' );
+               $attribs['class'] = array( 'mw-ui-vform', 'mw-ui-container', 'visualClear' );
                return $attribs;
        }
 
@@ -95,8 +95,10 @@ class VFormHTMLForm extends HTMLForm {
                        $attribs['class'] = array(
                                'mw-htmlform-submit',
                                'mw-ui-button mw-ui-big mw-ui-block',
-                               'mw-ui-' . $this->mSubmitFlag,
                        );
+                       foreach ( $this->mSubmitFlags as $flag ) {
+                               $attribs['class'][] = 'mw-ui-' . $flag;
+                       }
 
                        $buttons .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
                }
index 3af08d6..e5c1a1d 100644 (file)
@@ -93,9 +93,7 @@ class MysqlInstaller extends DatabaseInstaller {
 
        public function submitConnectForm() {
                // Get variables from the request.
-               $newValues = $this->setVarsFromRequest( array(
-                       'wgDBserver', 'wgDBname', 'wgDBprefix', '_InstallUser', '_InstallPassword'
-               ) );
+               $newValues = $this->setVarsFromRequest( array( 'wgDBserver', 'wgDBname', 'wgDBprefix' ) );
 
                // Validate them.
                $status = Status::newGood();
@@ -110,12 +108,6 @@ class MysqlInstaller extends DatabaseInstaller {
                if ( !preg_match( '/^[a-z0-9_-]*$/i', $newValues['wgDBprefix'] ) ) {
                        $status->fatal( 'config-invalid-db-prefix', $newValues['wgDBprefix'] );
                }
-               if ( !strlen( $newValues['_InstallUser'] ) ) {
-                       $status->fatal( 'config-db-username-empty' );
-               }
-               if ( !strlen( $newValues['_InstallPassword'] ) ) {
-                       $status->fatal( 'config-db-password-empty', $newValues['_InstallUser'] );
-               }
                if ( !$status->isOK() ) {
                        return $status;
                }
index b18fe94..cb40f88 100644 (file)
@@ -83,10 +83,7 @@ class PostgresInstaller extends DatabaseInstaller {
 
        function submitConnectForm() {
                // Get variables from the request
-               $newValues = $this->setVarsFromRequest( array(
-                       'wgDBserver', 'wgDBport', 'wgDBname', 'wgDBmwschema',
-                       '_InstallUser', '_InstallPassword'
-               ) );
+               $newValues = $this->setVarsFromRequest( array( 'wgDBserver', 'wgDBport', 'wgDBname', 'wgDBmwschema' ) );
 
                // Validate them
                $status = Status::newGood();
@@ -98,12 +95,6 @@ class PostgresInstaller extends DatabaseInstaller {
                if ( !preg_match( '/^[a-zA-Z0-9_]*$/', $newValues['wgDBmwschema'] ) ) {
                        $status->fatal( 'config-invalid-schema', $newValues['wgDBmwschema'] );
                }
-               if ( !strlen( $newValues['_InstallUser'] ) ) {
-                       $status->fatal( 'config-db-username-empty' );
-               }
-               if ( !strlen( $newValues['_InstallPassword'] ) ) {
-                       $status->fatal( 'config-db-password-empty', $newValues['_InstallUser'] );
-               }
 
                // Submit user box
                if ( $status->isOK() ) {
index 6ac5436..4410271 100644 (file)
@@ -407,6 +407,8 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgField', 'mwuser', 'user_password_expires', 'TIMESTAMPTZ NULL' ),
                        array( 'changeFieldPurgeTable', 'l10n_cache', 'lc_value', 'bytea',
                                "replace(lc_value,'\','\\\\')::bytea" ),
+                       // 1.23.9
+                       array( 'rebuildTextSearch'),
 
                        // 1.24
                        array( 'addPgField', 'page_props', 'pp_sortkey', 'float NULL' ),
@@ -947,4 +949,12 @@ END;
                        $this->applyPatch( 'patch-tsearch2funcs.sql', false, "Rewriting tsearch2 triggers" );
                }
        }
+
+       protected function rebuildTextSearch() {
+               if ( $this->updateRowExists( 'patch-textsearch_bug66650.sql' ) ) {
+                       $this->output( "...bug 66650 already fixed or not applicable.\n" );
+                       return true;
+               };
+               $this->applyPatch( 'patch-textsearch_bug66650.sql', false, "Rebuilding text search for bug 66650" );
+       }
 }
index f40de71..f7910ba 100644 (file)
@@ -833,6 +833,8 @@ class WebInstallerName extends WebInstallerPage {
         * @return bool
         */
        public function submit() {
+               global $wgPasswordPolicy;
+
                $retVal = true;
                $this->parent->setVarsFromRequest( array( 'wgSitename', '_NamespaceType',
                        '_AdminName', '_AdminPassword', '_AdminPasswordConfirm', '_AdminEmail',
@@ -909,7 +911,8 @@ class WebInstallerName extends WebInstallerPage {
                $pwd = $this->getVar( '_AdminPassword' );
                $user = User::newFromName( $cname );
                if ( $user ) {
-                       $valid = $user->getPasswordValidity( $pwd );
+                       $status = $user->checkPasswordValidity( $pwd, 'create' );
+                       $valid = $status->isGood() ? true : $status->getMessage()->escaped();
                } else {
                        $valid = 'config-admin-name-invalid';
                }
index c43f356..201ef71 100644 (file)
@@ -55,6 +55,7 @@
        "config-db-wiki-settings": "حدِّد هذا الويكي",
        "config-db-name": "اسم قاعدة البيانات",
        "config-db-name-oracle": "سكيما قاعدة البيانات:",
+       "config-db-install-account": "حساب المستخدم للتنصيب",
        "config-db-username": "اسم مستخدم قاعدة البيانات:",
        "config-db-password": "كلمة سر قاعدة البيانات:",
        "config-db-prefix": "بادئة جدول قاعدة البيانات:",
index 0aecb70..1d8cd9c 100644 (file)
@@ -5,12 +5,14 @@
                        "Wikitanvir",
                        "Aftab1995",
                        "Tauhid16",
-                       "Aftabuzzaman"
+                       "Aftabuzzaman",
+                       "Hasive"
                ]
        },
        "config-desc": "মিডিয়াউইকির জন্য ইন্সটলার",
        "config-title": "মিডিয়াউইকি $1 ইন্সটলেশন",
        "config-information": "তথ্য",
+       "config-localsettings-upgrade": "A <code>LocalSettings.php</code> ফাইলটি মুছে ফেলা হয়েছে। এ ইন্সটলেশনটি আরো উন্নত করতে দয়া করে <code>$wgUpgradeKey</code> কোডটি বক্সে দিন। আপনি এটি পাবেন এখানে <code>LocalSettings.php</code>.",
        "config-localsettings-key": "হালনাগাদ কি",
        "config-localsettings-badkey": "আপনি যেই চাবিটি দিয়েছেন তা সঠিক নয়।",
        "config-session-error": "সেশন শুরুতে ত্রুটি: $1",
        "config-continue": "অব্যাহত →",
        "config-page-language": "ভাষা",
        "config-page-welcome": "মিডিয়াউইকিতে স্বাগতম!",
-       "config-page-dbconnect": "ডà§\87à¦\9fাবà§\87à¦\9cে সংযোগ দিন",
+       "config-page-dbconnect": "ডà§\87à¦\9fাবà§\87সে সংযোগ দিন",
        "config-page-upgrade": "ইতিমধ্যেই থাকা ইন্সটলেশন হালনাগাদ করুন",
-       "config-page-dbsettings": "ডà§\87à¦\9fাবà§\87à¦\9c সেটিংস",
+       "config-page-dbsettings": "ডà§\87à¦\9fাবà§\87স সেটিংস",
        "config-page-name": "নাম",
        "config-page-options": "অপশন",
        "config-page-install": "ইন্সটল",
        "config-page-complete": "সম্পূর্ণ!",
        "config-page-restart": "পুনরায় ইন্সটল প্রক্রিয়া চালু করুন",
        "config-page-readme": "এটি পড়ুন",
-       "config-page-releasenotes": "রিলিà¦\9c à¦¨à§\8bà¦\9f",
+       "config-page-releasenotes": "পà§\8dরà¦\95াশ à¦¸à¦\82à¦\95à§\8dরানà§\8dত à¦¬à¦¾à¦°à§\8dতা",
        "config-page-copying": "অনুলেপন",
        "config-page-upgradedoc": "হালনাগাদকরণ",
        "config-page-existingwiki": "ইতিমধ্যেই থাকা উইকি",
-       "config-help-restart": "à¦\86পনি à¦\95à§\80 à¦¸à¦\95ল à¦¸à¦\82রà¦\95à§\8dষিত à¦\89পাতà§\8dত à¦ªà¦°à¦¿à¦·à§\8dà¦\95ার à¦\95রতà§\87 à¦¯à¦¾ à¦\86পনি à¦ªà§\8dরবà§\87স à¦\95রিয়à§\87à¦\9bিলà§\87ন à¦\8fবà¦\82 à¦\87নà§\8dসà¦\9fালà§\87সন ব্যবস্থা পুনরায় আরম্ভ করতে চান?",
+       "config-help-restart": "à¦\86পনি à¦\95à§\80 à¦¸à¦\95ল à¦¸à¦\82রà¦\95à§\8dষিত à¦\89পাতà§\8dত à¦ªà¦°à¦¿à¦·à§\8dà¦\95ার à¦\95রতà§\87 à¦¯à¦¾ à¦\86পনি à¦ªà§\8dরবà§\87শ à¦\95রিয়à§\87à¦\9bিলà§\87ন à¦\8fবà¦\82 à¦\87নà§\8dসà¦\9fালà§\87শন ব্যবস্থা পুনরায় আরম্ভ করতে চান?",
        "config-restart": "হ্যাঁ, পুনরায় চালু করুন",
        "config-env-php": "পিএইচপি $1 ইন্সটল করা হয়েছে।",
        "config-env-hhvm": "HHVM $1 ইনস্টল করা হয়েছে।",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] ইনস্টল করা হয়েছে",
        "config-apc": "[http://www.php.net/apc এপিসি] ইনস্টল হয়েছে",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ইনস্টল করা হয়েছে",
-       "config-db-type": "ডà§\87à¦\9fাবà§\87à¦\9cের ধরন:",
+       "config-db-type": "ডà§\87à¦\9fাবà§\87সের ধরন:",
        "config-db-host": "ডেটাবেজের হোস্ট:",
        "config-db-wiki-settings": "এই উইকি সনাক্ত করুন",
-       "config-db-name": "à¦\89পাতà§\8dতসà¦\82à¦\97à§\8dরহশালা নামঃ",
+       "config-db-name": "ডà§\87à¦\9fাবà§\87সà§\87র নামঃ",
        "config-db-install-account": "ইন্সটলের জন্য ব্যবহারকারী অ্যাকাউন্ট",
        "config-db-username": "ডেটাবেজের ব্যবহারকারী নাম:",
        "config-db-password": "ডেটাবেজের পাসওয়ার্ড:",
-       "config-db-username-empty": "আপনাকে অবশ্যই \"{{int:config-db-username}}\"-এর জন্য একটি মান প্রবেশ করাতে হবে।",
        "config-db-wiki-account": "সাধারণ অভিযানের জন্য ব্যবহারকারী একাউন্ট",
        "config-db-prefix": "উপাত্তশালা ছক প্রিফিক্স:",
        "config-db-charset": "ডেটাবেজের অক্ষর সেট",
index 4d4522c..7a7cfb1 100644 (file)
@@ -3,15 +3,20 @@
                "authors": [
                        "CERminator",
                        "Palapa",
-                       "Emir Mujadzic"
+                       "Emir Mujadzic",
+                       "Semso98",
+                       "Srdjan m"
                ]
        },
        "config-desc": "Instalacija za MediaWiki",
        "config-title": "MediaWiki $1 instalacija",
        "config-information": "Informacija",
        "config-localsettings-upgrade": "Otkrivena je datoteka <code>LocalSettings.php</code>.\nDa biste unaprijedili vaš softver, molimo vas upišite vrijednost od <code>$wgUpgradeKey</code> u okvir ispod.\nNaći ćete ga u <code>LocalSettings.php</code>.",
+       "config-localsettings-cli-upgrade": "Datoteka <code>LocalSettings.php</code> file je otkrivena.\nZa nadogradnju ove instalacije, molimo da pokrenete <code>update.php</code> umjesto toga",
        "config-localsettings-key": "Ključ za nadgradnju:",
        "config-localsettings-badkey": "Ključ koji ste dali je pogrešan.",
+       "config-upgrade-key-missing": "Postojeća instalacije MediaWiki je pronađena.\nZa nadogradnju ove instalacije, molimo da stavite sljedeće liniju na dno vašeg <code>LocalSettings.php</code>:\n\n$1",
+       "config-localsettings-incomplete": "Postojeći <code>LocalSettings.php</code> se čini da je nepotpun.\nVarijabla $1 nije podešena.\nMolimo da zamjenite <code>LocalSettings.php</code> tako da je varijabla podešena, i kliknite \"{{int:Config-continue}}\".",
        "config-session-error": "Greška pri pokretanju sesije: $1",
        "config-no-session": "Vaši podaci sesije su izgubljeni!\nProvjerite vaš php.ini i provjerite da li je <code>session.save_path</code> postavljen na pravilni direktorijum.",
        "config-your-language": "Vaš jezik:",
        "config-admin-name": "Vaše korisničko ime:",
        "config-admin-password": "Lozinka:",
        "config-admin-password-confirm": "Ponovno unesite lozinku:",
-       "config-admin-email": "E-mail adresa:",
+       "config-admin-email": "Adresa e-pošte:",
        "config-profile-wiki": "Otvori wiki",
        "config-profile-private": "Privatna wiki",
        "config-license-pd": "Javno vlasništvo",
        "config-logo": "Logo URL:",
        "config-cc-again": "Odaberi ponovno...",
+       "config-skins": "Teme",
        "config-install-step-done": "završeno",
        "config-install-step-failed": "neuspješno",
        "config-install-extensions": "Uključujući ekstenzije",
index 077c503..0709665 100644 (file)
@@ -31,7 +31,6 @@
        "config-no-fts3": "'''Тергам бе''': SQLite гулйина хуттург йоцуш [//sqlite.org/fts3.html FTS3] — лахар болхбеш хир дац оцу бухца.",
        "config-no-cli-uri": "'''ДӀахьедар''': <code>--scriptpath</code> параметр язйина яц, иза Ӏад йитарца лелош ю: <code>$1</code> .",
        "config-db-name": "Хаамийн базан цӀе:",
-       "config-db-username-empty": "Ахьа «{{int:config-db-username}}» параметран маьӀна даздан дезаш ду.",
        "config-db-charset": "Базан хаамийн символийн гулам",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 бинаран",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
@@ -54,7 +53,7 @@
        "config-profile-no-anon": "ДӀаяздар кхолла деза",
        "config-profile-fishbowl": "ДӀаяздарш долу тадархошна бен",
        "config-profile-private": "ДӀачӀаьгӀна вики",
-       "config-license": "Авторан бакъонаш а лицензи а:",
+       "config-license": "Авторан бакъонаш а, лицензи а:",
        "config-license-cc-by-sa": "Creative Commons Attribution Share Alike",
        "config-license-cc-by": "Creative Commons Attribution",
        "config-license-cc-by-nc-sa": "Creative Commons Attribution Non-Commercial Share Alike",
index 1bd12bb..0c69d27 100644 (file)
@@ -4,7 +4,11 @@
                        "ОйЛ"
                ]
        },
+       "config-information": "плирофорїꙗ",
+       "config-your-language": "твои ѩꙁꙑкъ :",
        "config-page-language": "ѩꙁꙑкъ",
        "config-page-name": "имѧ",
+       "config-page-options": "строи",
+       "config-page-complete": "ꙁаврьшєно ѥстъ",
        "config-help": "помощь"
 }
index c19e3ee..1eb8e03 100644 (file)
@@ -97,8 +97,6 @@
        "config-db-install-account": "User account for installation",
        "config-db-username": "Database username:",
        "config-db-password": "Database password:",
-       "config-db-password-empty": "Please enter a password for the new database user: $1.\nWhile it may be possible to create users with no passwords, it is not secure.",
-       "config-db-username-empty": "You must enter a value for \"{{int:config-db-username}}\".",
        "config-db-install-username": "Enter the username that will be used to connect to the database during the installation process.\nThis is not the username of the MediaWiki account; this is the username for your database.",
        "config-db-install-password": "Enter the password that will be used to connect to the database during the installation process.\nThis is not the password for the MediaWiki account; this is the password for your database.",
        "config-db-install-help": "Enter the username and password that will be used to connect to the database during the installation process.",
index da5d93f..5a26449 100644 (file)
@@ -79,7 +79,7 @@
        "config-outdated-sqlite": "<strong>Advertencia:</strong> tienes SQLite $1, que es inferior a la mínima versión requerida: $2. SQLite no estará disponible.",
        "config-no-fts3": "<strong>Advertencia:</strong> SQLite está compilado sin el [//sqlite.org/fts3.html módulo FTS3]. Las funcionalidades de búsqueda no estarán disponibles en esta instalación.",
        "config-register-globals-error": "<strong>Error: la opción de PHP <code>[http://php.net/register_globals register_globals]</code> está activada.\nDebe estar desactivada para continuar con la instalación.</strong>\nVéase [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] para obtener ayuda sobre cómo hacerlo.",
-       "config-magic-quotes-gpc": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] está activa!</strong>\nEsta opción corrompe la entrada de datos de forma impredecible.\nUsted no puede instalar o utilizar MediaWiki a menos que esta opción esté deshabilitada.",
+       "config-magic-quotes-gpc": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] está activa!</strong>\nEsta opción corrompe la entrada de datos de forma impredecible.\nNo puedes instalar o utilizar MediaWiki a menos que esta opción esté desactivada.",
        "config-magic-quotes-runtime": "'''Fatal: ¡[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está activada!'''\nEsta opción causa la imprevisible corrupción de la entrada de datos.\nNo puedes instalar o utilizar MediaWiki a menos que esta opción esté inhabilitada.",
        "config-magic-quotes-sybase": "'''Fatal: ¡[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está activada!'''\nEsta opción causa la imprevisible corrupción de la entrada de datos.\nNo puedes instalar o utilizar MediaWiki a menos que esta opción esté inhabilitada.",
        "config-mbstring": "'''Fatal: La opción [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está activada!'''\nEsta opción causa errores y puede corromper los datos de una forma imprevisible.\nNo se puede instalar o usar MediaWiki a menos que esta opción sea desactivada.",
        "config-db-host": "Servidor de la base de datos:",
        "config-db-host-help": "Si tu servidor de base de datos está en otro servidor, escribe el nombre del equipo o su dirección IP aquí.\n\nSi estás utilizando alojamiento web compartido, tu proveedor debería darte el nombre correcto del servidor en su documentación.\n\nSi vas a instalar en un servidor Windows y a utilizar MySQL, el uso de \"localhost\" como nombre del servidor puede no funcionar. Si es así, intenta poner \"127.0.0.1\" como dirección IP local.\n\nSi utilizas PostgreSQL, deja este campo vacío para conectarse a través de un socket de Unix.",
        "config-db-host-oracle": "TNS de la base de datos:",
-       "config-db-host-oracle-help": "Introduzca un [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm nombre de conexión local] válido; un archivo tnsnames.ora debe ser visible para esta instalación.<br />Si está utilizando bibliotecas de cliente 10g o más recientes también puede utilizar el método de asignación de nombres [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
+       "config-db-host-oracle-help": "Escribe un [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm nombre de conexión local] válido; un archivo tnsnames.ora debe ser visible para esta instalación.<br />Si estás utilizando bibliotecas de cliente 10g o más recientes también puedes utilizar el método de asignación de nombres [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Identifica este wiki",
        "config-db-name": "Nombre de la base de datos:",
        "config-db-name-help": "Elige un nombre que identifique tu wiki.\nNo debe contener espacios.\n\nSi estás utilizando alojamiento web compartido, tu proveedor te dará un nombre específico de base de datos para que lo utilices, o bien te permitirá crear bases de datos a través de un panel de control.",
        "config-db-install-account": "Cuenta de usuario para instalación",
        "config-db-username": "Nombre de usuario de la base de datos:",
        "config-db-password": "Contraseña de la base de datos:",
-       "config-db-password-empty": "Escribe una contraseña para el nuevo usuario de base de datos: $1.\nAunque es posible crear usuarios sin contraseña, esto no es seguro.",
-       "config-db-username-empty": "Debes introducir un valor para \"{{int:config-db-username}}\"",
        "config-db-install-username": "Escribe el nombre de usuario que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nEste no es el nombre de usuario de la cuenta de MediaWiki, sino el nombre de usuario para la base de datos.",
        "config-db-install-password": "Escribe la contraseña que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nEsta no es la contraseña para la cuenta de MediaWiki, sino la contraseña para la base de datos.",
        "config-db-install-help": "Escribe el nombre de usuario y la contraseña que se utilizarán para conectarse a la base de datos durante el proceso de instalación.",
        "config-dbsupport-postgres": "[{{int:version-db-postgres-url}} PostgreSQL] es un sistema de base de datos popular de código abierto, alternativa a MySQL. Pueden haber algunos fallos menores destacables, y no es recomendable para su uso en un entorno de producción. ([http://www.php.net/manual/es/pgsql.installation.php Cómo compilar PHP con compatibilidad PostgreSQL]).",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] es un sistema de base de datos ligero con gran compatibilidad con MediaWiki. ([http://www.php.net/manual/es/pdo.installation.php Cómo compilar PHP con compatibilidad SQLite], usando PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] es una base de datos comercial a nivel empresarial. ([http://www.php.net/manual/es/oci8.installation.php Cómo compilar PHP con compatibilidad con OCI8])",
-       "config-dbsupport-mssql": "* [{{int:version-db-oracle-url}} Oracle] es una base de datos comercial a nivel empresarial. ([http://www.php.net/manual/es/oci8.installation.php Cómo compilar PHP con compatibilidad con OCI8])",
+       "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] es una base de datos comercial a nivel empresarial para Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Cómo compilar PHP con soporte para SQLSRV])",
        "config-header-mysql": "Configuración de MySQL",
        "config-header-postgres": "Configuración de PostgreSQL",
        "config-header-sqlite": "Configuración de SQLite",
        "config-mysql-charset-help": "En '''modo binario''', MediaWiki almacena texto UTF-8 para la base de datos en campos binarios.\nEsto es más eficiente que el modo UTF-8 de MySQL y le permite utilizar la gama completa de caracteres Unicode.\n\nEn '''modo UTF-8''', MySQL sabrá qué conjunto de caracteres emplean sus datos y puede presentarlos y convertirlos adecuadamente, pero no le permitirá almacenar caracteres por encima del [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plano multilingüe básico].",
        "config-mssql-auth": "Tipo de autenticación:",
        "config-mssql-install-auth": "Seleccione el tipo de autenticación que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nSi selecciona \"{{int:config-mssql-windowsauth}}\", las credenciales de cualquier usuario de el servidor web que se está ejecutando van a ser utilizadas.",
-       "config-mssql-web-auth": "Seleccione el tipo de autenticación que utilizará el servidor web para conectarse al servidor de base de datos, durante el funcionamiento normal de la wiki.\nSi selecciona \"{{int:config-mssql-windowsauth}}\", las credenciales del usuario que sea cual sea el servidor Web se ejecuta como será utilizado.",
+       "config-mssql-web-auth": "Selecciona el tipo de autenticación que utilizará el servidor web para conectarse al servidor de base de datos, durante el funcionamiento normal de la wiki.\nSi seleccionas \"{{int:config-mssql-windowsauth}}\", se usarán las credenciales del usuario con el cual se ejecuta el servidor web.",
        "config-mssql-sqlauth": "Autenticación de SQL Server",
        "config-mssql-windowsauth": "Autentificación de Windows",
        "config-site-name": "Nombre del wiki:",
        "config-email-auth": "Activar autenticación del correo electrónico",
        "config-email-auth-help": "Si esta opción está habilitada, los usuarios tienen que confirmar su dirección de correo electrónico mediante un enlace que se les envía a ellos cuando éstos lo establecen o lo cambian.\nSolo las direcciones de correo electrónico autenticadas pueden recibir correos electrónicos de otros usuarios o correos electrónicos de notificación de cambios.\nEsta opción está '''recomendada''' para wikis públicos debido a posibles abusos de las características del correo electrónico.",
        "config-email-sender": "Dirección de correo electrónico de retorno:",
-       "config-email-sender-help": "Introduce la dirección de correo electrónico que será usada como dirección de retorno en los mensajes electrónicos de salida.\nAquí llegarán los correos electrónicos que no lleguen a su destino.\nMuchos servidores de correo electrónico exigen que por lo menos la parte del nombre del dominio sea válida.",
+       "config-email-sender-help": "Escribe la dirección de correo electrónico que se usará como dirección de retorno en los mensajes electrónicos de salida.\nAquí llegarán los correos electrónicos que no lleguen a su destino.\nMuchos servidores de correo electrónico exigen que por lo menos la parte del nombre del dominio sea válida.",
        "config-upload-settings": "Cargas de imágenes y archivos",
        "config-upload-enable": "Habilitar la subida de archivos",
        "config-upload-help": "La carga de archivos expone potencialmente su servidor a riesgos de seguridad.\nPara obtener más información, lea la [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security sección de seguridad] en el manual.\n\nPara habilitar la carga de archivos, cambie el modo en el subdirectorio <code>images</code> bajo el directorio raíz de MediaWiki para que el servidor web pueda escribir en él.\nA continuación, habilite esta opción.",
index 849a517..544b852 100644 (file)
@@ -13,7 +13,7 @@
        "config-localsettings-upgrade": "Detectouse un ficheiro <code>LocalSettings.php</code>.\nPara actualizar esta instalación, introduza o valor de <code>$wgUpgradeKey</code> na caixa.\nPode atopalo en <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "Detectouse un ficheiro <code>LocalSettings.php</code>.\nPara actualizar esta instalación, execute <code>update.php</code>",
        "config-localsettings-key": "Clave de actualización:",
-       "config-localsettings-badkey": "A clave dada é incorrecta",
+       "config-localsettings-badkey": "A clave dada é incorrecta.",
        "config-upgrade-key-missing": "Detectouse unha instalación existente de MediaWiki.\nPara actualizar esta instalación, inclúa esta liña ao final do ficheiro <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "Semella que o ficheiro <code>LocalSettings.php</code> existente está incompleto.\nA variable $1 non está establecida.\nModifique o ficheiro <code>LocalSettings.php</code> de xeito que a variable quede establecida e prema en \"{{int:Config-continue}}\".",
        "config-localsettings-connection-error": "Atopouse un erro ao conectar coa base de datos empregando a configuración especificada no ficheiro <code>LocalSettings.php</code>. Corrixa esta configuración e inténteo de novo.\n\n$1",
        "config-db-install-account": "Conta de usuario para a instalación",
        "config-db-username": "Nome de usuario da base de datos:",
        "config-db-password": "Contrasinal da base de datos:",
-       "config-db-password-empty": "Introduza un contrasinal para o novo usuario da base de datos: $1.\nMalia que é posible crear usuarios sen contrasinal, esta práctica non é segura.",
-       "config-db-username-empty": "Debe introducir un valor para \"{{int:config-db-username}}\"",
        "config-db-install-username": "Escriba o nome de usuario que empregará para conectarse á base de datos durante o proceso de instalación. Este non é o nome de usuario da conta de MediaWiki, trátase do nome de usuario para a súa base de datos.",
        "config-db-install-password": "Escriba o contrasinal que empregará para conectarse á base de datos durante o proceso de instalación. Este non é o contrasinal da conta de MediaWiki, trátase do contrasinal para a súa base de datos.",
        "config-db-install-help": "Introduza o nome de usuario e contrasinal que se usará para conectar á base de datos durante o proceso de instalación.",
index 7617942..a1f9154 100644 (file)
@@ -1,5 +1,38 @@
 {
-       "@metadata": [],
+       "@metadata": {
+               "authors": [
+                       "Vahe Gharakhanyan"
+               ]
+       },
+       "config-title": "ՄեդիաՎիքի $1-ի տեղադրում",
+       "config-information": "Տեղեկատվություն",
+       "config-localsettings-key": "Թարմացման բանալի`",
+       "config-your-language": "Ձեր լեզուն`",
+       "config-wiki-language": "Վիքի լեզու`",
+       "config-back": "← Վերադառնալ",
+       "config-continue": "Շարունակել →",
+       "config-page-language": "Լեզու",
+       "config-page-welcome": "Բարի գալուստ ՄեդիաՎիքի:",
+       "config-page-dbconnect": "Միացում տվյալների բազային",
+       "config-page-name": "Անվանում",
+       "config-page-options": "Ընտրանքներ",
+       "config-page-install": "Տեղադրում",
+       "config-page-complete": "Պատրաստ է:",
+       "config-page-readme": "Կարդա ինձ",
+       "config-page-releasenotes": "Տեղեկություն տարբերակի մասին",
+       "config-page-existingwiki": "Գոյություն ունեցող վիքի",
+       "config-restart": "Այո, նորից սկսել",
+       "config-admin-password": "Գաղտնաբառ՝",
+       "config-admin-password-confirm": "Գաղտնաբառը կրկին`",
+       "config-admin-email": "Էլ-փոստի հասցեն՝",
+       "config-license": "Հեղինակային իրավունք և արտոնագիր`",
+       "config-license-cc-by-sa": "Creative Commons Attribution-ShareAlike",
+       "config-license-cc-by": "Creative Commons Attribution",
+       "config-license-cc-by-nc-sa": "Creative Commons Attribution-NonCommercial-ShareAlike",
+       "config-license-cc-0": "Creative Commons Zero (հանրային սեփականություն)",
+       "config-license-gfdl": "GNU Free Documentation License 1.3 կամ ավելի ուշ",
+       "config-license-pd": "Հանրային սեփականություն",
+       "config-help": "օգնություն",
        "mainpagetext": "'''«MediaWiki» ծրագիրը հաջողությամբ տեղադրվեց։'''",
        "mainpagedocfooter": "Այցելեք [//meta.wikimedia.org/wiki/Help:Contents User's Guide]՝ վիքի ծրագրային ապահովման օգտագործման մասին տեղեկությունների համար։\n\n== Որոշ օգտակար ռեսուրսներ ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
 }
index b9aab3a..cbe64d6 100644 (file)
                        "Ontsed",
                        "Seb35",
                        "Nemo bis",
-                       "Ricordisamoa"
+                       "Ricordisamoa",
+                       "Fpugliajno",
+                       "The Polish"
                ]
        },
        "config-desc": "Il programma di installazione per MediaWiki",
-       "config-title": "Installazione MediaWiki $1",
+       "config-title": "Installazione di MediaWiki $1",
        "config-information": "Informazioni",
        "config-localsettings-upgrade": "È stato rilevato un file <code>LocalSettings.php</code>.\nPer aggiornare questa installazione, si prega di inserire il valore di <code>$wgUpgradeKey</code> nella casella qui sotto.\nLo potete trovare in <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "È stato rilevato un file <code>LocalSettings.php</code>.\nPer aggiornare questa installazione, eseguire <code>update.php</code>",
@@ -57,7 +59,6 @@
        "config-env-bad": "L'ambiente è stato controllato.\nNon è possibile installare MediaWiki.",
        "config-env-php": "PHP $1 è installato.",
        "config-env-hhvm": "HHVM $1 è installato.",
-       "config-unicode-using-utf8": "Usa Brion Vibber's utf8_normalize.so per la normalizzazione Unicode.",
        "config-unicode-using-intl": "Usa [http://pecl.php.net/intl l'estensione PECL intl] per la normalizzazione Unicode.",
        "config-unicode-pure-php-warning": "'''Attenzione:''' [http://pecl.php.net/intl l'estensione PECL intl] non è disponibile per gestire la normalizzazione Unicode, così si usa la lenta implementazione in puro PHP.\nSe esegui un sito ad alto traffico, dovresti leggere alcune considerazioni sulla [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizzazione Unicode].",
        "config-unicode-update-warning": "'''Attenzione:''' La versione installata del gestore per la normalizzazione Unicode usa una vecchia versione della libreria [http://site.icu-project.org/ del progetto ICU].\nDovresti [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations aggiornare] se ti interessa usare l'Unicode.",
@@ -70,7 +71,7 @@
        "config-magic-quotes-sybase": "'''Errore: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] è attivato!''' Questa opzione interferisce in modo imprevedibile con l'inserimento dei dati. Non è possibile installare o utilizzare MediaWiki a meno che questa opzione non sia disabilitata.",
        "config-mbstring": "'''Errore: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] è attivato!''' Questa opzione causa errori e può interferire in modo imprevedibile coi dati. Non è possibile installare o utilizzare MediaWiki a meno che questa opzione non sia disabilitata.",
        "config-safe-mode": "'''Attenzione:''' [http://www.php.net/features.safe-mode safe mode] è attivato!\nQuesta opzione potrebbe causare problemi, in particolare nel caricamento di documenti e nel supporto delle funzioni <code>math</code>.",
-       "config-xml-bad": "Il modulo XML di PHP è mancante.\nMediaWIki necessita di funzioni presenti in questo modulo e non funzionerà con la configurazione corrente.\nSe si sta eseguendo Mandrake, installare il paccketto php-xml.",
+       "config-xml-bad": "Manca il modulo XML di PHP.\nMediaWIki ha bisogno di funzionalità presenti in questo modulo e non funzionerà con la configurazione corrente.\nSe stai eseguendo Mandrake, installa il paccketto php-xml.",
        "config-pcre-old": "<strong>Errore fatale:</strong> si richiede PCRE  $1 o successivo.\nIl tuo file binario PHP è collegato con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Maggiori informazioni su PCRE].",
        "config-pcre-no-utf8": "'''Errore''': Il modulo PCRE di PHP sembra essere stato compilato senza il supporto PCRE_UTF8, ma MediaWiki lo richiede per funzionare correttamente.",
        "config-memory-raised": "Il valore <code>memory_limit</code> di PHP è $1, aumentato a $2.",
        "config-db-install-account": "Account utente per l'installazione",
        "config-db-username": "Nome utente del database:",
        "config-db-password": "Password del database:",
-       "config-db-password-empty": "Inserire una password per il nuovo utente del database: $1.\nAnche se può essere possibile creare utenti senza password, questo non è sicuro.",
-       "config-db-username-empty": "È necessario immettere un valore per \"{{int:config-db-username}}\"",
        "config-db-install-username": "Inserisci il nome utente che verrà utilizzato per connettersi al database durante il processo di installazione.\nQuesto non è il nome utente dell'account MediaWiki; ma quello per il tuo database.",
        "config-db-install-password": "Inserisci la password che verrà utilizzato per connettersi al database durante il processo di installazione.\nQuesta non è la password dell'account MediaWiki; ma quella per il tuo database.",
        "config-db-install-help": "Inserire il nome utente e la password che verranno usate per la connessione al database durante il processo d'installazione.",
index 79e6a0a..6020bdc 100644 (file)
        "config-db-install-account": "インストールで使用する利用者アカウント",
        "config-db-username": "データベースのユーザー名:",
        "config-db-password": "データベースのパスワード:",
-       "config-db-password-empty": "新しいデータベースの利用者名 $1 のパスワードを入力してください。\nパスワードを設定せずにユーザーを作成できる場合もありますが、安全ではありません。",
-       "config-db-username-empty": "「{{int:config-db-username}}」を入力してください。",
        "config-db-install-username": "インストール中にデータベースへの接続で使用するユーザー名を入力してください。\nこれは MediaWiki アカウントの利用者名のことではありません。あなたのデータベースでのユーザー名です。",
        "config-db-install-password": "インストール中にデータベースへの接続で使用するパスワードを入力してください。\nこれは MediaWiki アカウントのパスワードのことではありません。あなたのデータベースでのパスワードです。",
        "config-db-install-help": "インストール作業中にデータベースに接続するための利用者名とパスワードを入力してください。",
        "config-install-keys": "秘密鍵の生成",
        "config-insecure-keys": "<strong>警告:</strong> インストール中に生成されたセキュアキー ($1) は完璧に安全ではありません。手動で変更することを検討してください。",
        "config-install-updates": "不要な更新を実行するのを防ぐ",
+       "config-install-updates-failed": "<strong>エラー:</strong> 更新キーをテーブルに挿入する際に失敗しました。以下のエラーが起こっています: $1",
        "config-install-sysop": "管理者のアカウントの作成",
        "config-install-subscribe-fail": "mediawiki-announce を購読できませんでした: $1",
        "config-install-subscribe-notpossible": "cURL がインストールされていないため、<code>allow_url_fopen</code> を利用できません。",
index 8990b8a..15debcb 100644 (file)
        "config-db-install-account": "Der Zohjang för en Enreeschte",
        "config-db-username": "Dä Name vun däm Aanwender för dä Zohjref op de Daatebangk:",
        "config-db-password": "Et Paßwoot vun däm Aanwender för dä Zohjref op de Daatebangk:",
-       "config-db-password-empty": "Jiv e Paßwoot aan, för dä neue Aanwender för dä Zohjref op de Daatebangk, $1.\nEd es zwa müjjelesch, Aanwender för dä Zohjref op de Daatebangk der ohne e Paßwoot aanzelääje,\nävver dat wöhr en schwere Jevah för de Sescherheit vum Wiki.",
-       "config-db-username-empty": "Do moß jäd aanjävve för \"{{int:config-db-username}}\".",
-       "config-db-install-username": "Jiv ene Name aan för dä Aanwender för dä Zohjref op de Daatebangk beim Enshtalleere.\nDat es keine Metmaacher_Name em Wiki — heh dä Name es alleins en der Daatebangk bikannt.",
+       "config-db-install-username": "Jiv ene Nahme aan för dä Aanwender för dä Zohjref op de Datebangk beim Enshtallehre.\nDat es keine Metmaacher_Nahme em Wikki — heh dä Nahme es alleins en der Dahtebangk bikannt.",
        "config-db-install-password": "Jiv e Paßwoot aan för dä Aanwender för dä Zohjref op de Daatebangk beim Enshtalleere.\nDat es kei Paßwoot för ene Metmaacher em Wiki — et es alleins en der Daatebangk bikannt.",
        "config-db-install-help": "Donn dä Name un et Paßwoot vun däm Aanwänder för der Zohjreff op de Daatebangk jäz för et Enreeshte aanjävve.",
        "config-db-account-lock": "Donn dersälve Name un et sälve Paßwoot för der nomaale Bedrief vum Wiki bruche",
        "config-ns-invalid": "Dat aanjejovve Appachtemang „<nowiki>$1</nowiki>“ es nit jöltesch.\nNemm ene andere Name för däm Wiki sing eije Appachtemang.",
        "config-ns-conflict": "Dat aanjejovve Appachtemang „<nowiki>$1</nowiki>“ kütt ald als Standatt-Appachtemang em MediaWiki vör.\nNemm ene andere Name för däm Wiki sing eije Appachtemang.",
        "config-admin-box": "Der Zohjang för der eezte Wiki_Köbes",
-       "config-admin-name": "Dinge Metmaacher_Name:",
+       "config-admin-name": "Dinge Metmaacher_Nahme:",
        "config-admin-password": "Et Paßwoot:",
        "config-admin-password-confirm": "Norrens dat Paßwoot:",
        "config-admin-help": "Jif Dinge leevste Name als Metmaacher för Desch aan, för e Beishpell „Schmitzens Pitter“\n— Dat weed dä Name wääde, met dämm De Desch enlogge deihs.",
-       "config-admin-name-blank": "Jiv ene Metmaacher_Name en för dä Wiki-Köbes.",
-       "config-admin-name-invalid": "„<nowiki>$1</nowiki>“ es keine jöltijje Metmaacher_Name.\nJiv ene joode Name en!",
+       "config-admin-name-blank": "Jiv ene Metmaacher_Nahme en för dä Wikki-Köhbes.",
+       "config-admin-name-invalid": "„<nowiki>$1</nowiki>“ es keine jöltijje Metmaacher_Nahme.\nJiv ene johde Nahme en!",
        "config-admin-password-blank": "Do mos_e Paßwoot för dä Wiki_Köbes aanjävve!",
        "config-admin-password-mismatch": "Di Paßwööter sin ongerscheidlesh!",
        "config-admin-email": "Addräß för de <i lang=\"en\">e-mail</i>:",
index fbc2bbc..70addf9 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Ianbu"
+                       "Ianbu",
+                       "唐吉訶德的侍從"
                ]
        },
        "config-desc": "MediaWiki的安裝程式",
@@ -9,8 +10,8 @@
        "config-information": "資訊",
        "config-localsettings-upgrade": "有一个<code>LocalSettings.php</code>檔案佇咧。若欲升級,請佇下面的框內底拍<code>$wgUpgradeKey</code>的內容。你會使佇<code>LocalSettings.php</code>內底揣著彼項。",
        "config-localsettings-cli-upgrade": "有一个<code>LocalSettings.php</code>檔案。若欲升級,請直接執行<code>update.php</code>。",
-       "config-localsettings-key": "升級的密碼:",
-       "config-localsettings-badkey": "你提供的密碼無正確。",
+       "config-localsettings-key": "Seng-kip--ê bi̍t-bé:",
+       "config-localsettings-badkey": "Lí phah--ê bi̍t-bé bô chèng-khak.",
        "config-upgrade-key-missing": "已經有一个MediaWiki矣。若要升級,請共下面這逝加去<code>LocalSettings.php</code>的下跤:\n\n$1",
        "config-localsettings-incomplete": "這馬的<code>LocalSettings.php</code>可能無齊全,因為無設變量$1。請佇<code>LocalSettings.php</code>設彼个變量,並且揤「{{int:Config-continue}}」。",
        "config-localsettings-connection-error": "An error was encountered when connecting to the database 用<code>LocalSettings.php</code>的設定去連接資料庫的時陣有一个錯誤發生,請改遮的設定了,才閣試。\n\n$1",
@@ -28,7 +29,7 @@
        "config-page-dbconnect": "連接去資料庫",
        "config-page-upgrade": "共這馬的安裝升級",
        "config-page-dbsettings": "資料庫的設定",
-       "config-page-name": "名稱",
+       "config-page-name": "Miâ",
        "config-page-options": "選項",
        "config-page-install": "安裝",
        "config-page-complete": "完成",
@@ -46,8 +47,6 @@
        "config-env-good": "環境檢查已完成。\n你會當安裝 MediaWiki。",
        "config-env-bad": "環境檢查已完成。\n你無法度安裝 MediaWiki。",
        "config-env-php": "PHP $1 已經安裝。",
-       "config-env-php-toolow": "已經安裝 PHP $1。\n但是 MediaWiki 愛 PHP $2 抑較新的版本。",
-       "config-unicode-using-utf8": "用 Brion Vibber 的 utf8_normalize.so 做 Unicode 正規化。",
        "config-unicode-using-intl": "用 [http://pecl.php.net/intl intl PECL 擴充套件] 做 Unicode 正規化。",
        "config-unicode-pure-php-warning": "<strong>警告:</strong> 無法度用 [http://pecl.php.net/intl intl PECL 擴充套件] 處理 Unicode 正規化,所以退回用純 PHP 實作的正規化程式,這種方式處理速度較慢。\n\n若你的網站瀏覽人數誠濟,你應該先看 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/zh Unicode 正規化]。",
        "config-unicode-update-warning": "<strong>警告</strong>:這馬安裝的 Unicode 正規化包裝程式用舊版 [http://site.icu-project.org/ ICU 計劃] 的程式庫。\n若你需要用 Unicode,你應該先進行 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 升級]。",
index e7d2388..6615026 100644 (file)
        "config-db-install-account": "Konto użytkownika dla instalatora",
        "config-db-username": "Nazwa użytkownika bazy danych:",
        "config-db-password": "Hasło bazy danych:",
-       "config-db-password-empty": "Wprowadź hasło dla nowego użytkownika bazy danych: $1.\nChoć istnieje możliwość tworzenia użytkowników bez hasła, nie jest to bezpieczne.",
-       "config-db-username-empty": "Należy podać wartość parametru \"{{int:config-db-username}}\".",
        "config-db-install-username": "Wprowadź nazwę użytkownika, który będzie używany do łączenia się z bazą danych podczas procesu instalacji.\nNie jest to nazwa konta MediaWiki, a użytkownika bazy danych.",
        "config-db-install-password": "Wprowadź hasło, które będzie wykorzystywane do łączenia się z bazą danych w procesie instalacji.\nTo nie jest hasło konta MediaWiki, lecz hasło do bazy danych.",
        "config-db-install-help": "Podaj nazwę użytkownika i jego hasło, które zostaną użyte do połączenia z bazą danych w czasie procesu instalacji.",
index 795bacd..8f2a0fd 100644 (file)
        "config-db-name": "د توکبنسټ نوم:",
        "config-db-username": "د توکبنسټ کارن-نوم:",
        "config-db-password": "د توکبنسټ پټنوم:",
+       "config-charset-mysql5-binary": "مای اس کيو ال 4.1/5.0 دوييز",
+       "config-charset-mysql5": "مای اس کيو ال 4.1/5.0 يو ټي اف-8",
+       "config-db-port": "د توکبنسټ ور:",
+       "config-db-schema": "د مېډياويکي طرحه:",
        "config-type-mssql": "مايکروسافټ SQL پالنگر",
        "config-header-mysql": "د MySQL امستنې",
        "config-header-postgres": "د PostgreSQL امستنې",
        "config-header-mssql": "د مايکروسافټ SQL پالنگر امستنې",
        "config-sqlite-readonly": "د <code>$1</code> دوتنه د ليکلو وړ نه ده.",
        "config-sqlite-cant-create-db": "د توکبنسټ دوتنه <code>$1</code> جوړه نه شوه.",
+       "config-mysql-binary": "دوه ايز",
        "config-mysql-utf8": "UTF-8",
        "config-site-name": "د ويکي نوم:",
        "config-site-name-blank": "د وېبځي نوم وليکۍ.",
        "config-project-namespace": "د پروژې نوم-تشيال:",
        "config-ns-generic": "پروژه",
+       "config-ns-site-name": "ويکي نوم ته ورته: $1",
        "config-ns-other": "بل (ځانگړی کړئ)",
        "config-ns-other-default": "زما ويکي",
        "config-admin-box": "د پازوال گڼون",
index fba5165..89f2dd9 100644 (file)
        "config-db-name-oracle": "Field label in the MediaWiki installer where an Oracle database schema can be specified.",
        "config-db-account-oracle-warn": "A \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.",
        "config-db-install-account": "Legend in the MediaWiki installer for the section where database username and password have to be provided.",
-       "config-db-username": "Used as label.\n\nAlso used in {{msg-mw|Config-db-username-empty}}.",
+       "config-db-username": "Used as label.",
        "config-db-password": "Field label in the MediaWiki installer where database password has to be provided.",
-       "config-db-password-empty": "Used as error message. Parameters:\n* $1 - database username",
-       "config-db-username-empty": "Used as error message. Shown when the database username is not entered by the user.\n\nRefers to {{msg-mw|Config-db-username}}.",
        "config-db-install-username": "Help box text in the MediaWiki installer clarifying the requirement for database username.",
        "config-db-install-password": "Help box text in the MediaWiki installer clarifying the requirement for database password.",
        "config-db-install-help": "Help text in MediaWiki installer.",
index 87ac7a5..68b2695 100644 (file)
@@ -54,7 +54,6 @@
        "config-env-bad": "Miljön har kontrollerats.\nDu kan inte installera MediaWiki.",
        "config-env-php": "PHP $1 är installerat.",
        "config-env-hhvm": "HHVM $1 är installerat.",
-       "config-unicode-using-utf8": "Använder Brion Vibbers utf8_normalize.so för Unicode-normalisering.",
        "config-unicode-using-intl": "Använder [http://pecl.php.net/intl intl PECL-tillägget] för Unicode-normalisering.",
        "config-unicode-pure-php-warning": "'''Varning:''' [http://pecl.php.net/intl intl PECL-tillägget] är inte tillgängligt för att hantera Unicode-normalisering, faller tillbaka till en långsamt implementering i ren PHP.\nOm du driver en högtrafikerad webbplats bör du läsa lite om [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-normalisering].",
        "config-unicode-update-warning": "'''Varning:''' Den installerade versionen av Unicode-normaliserings \"wrappern\" använder en äldre version av [http://site.icu-project.org/ ICU projektets] bibliotek.\nDu bör [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations uppgradera] om är intresserad av att använda Unicode.",
@@ -67,7 +66,7 @@
        "config-magic-quotes-sybase": "'''Kritiskt: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] är aktiv!'''\nDetta alternativ korrumperar inmatad data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.",
        "config-mbstring": "'''Kritiskt: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] är aktiv!'''\nDetta alternativ orsakar fel och kan korrumpera data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.",
        "config-safe-mode": "''' Varning:''' PHP:s [http://www.php.net/features.safe-mode felsäkra läge] är aktivt.\nDet kan orsaka problem, särskilt om du använder filuppladdningar och <code>math</code>-stöd.",
-       "config-xml-bad": "PHP:s XML-modul saknas.\nMediaWiki kräver funktioner i denna modul och kommer inte att fungera i den här konfigurationen.\nOm du kör Mandrake, installera php-xml-paketet.",
+       "config-xml-bad": "PHP:s XML-modul saknas.\nMediaWiki kräver funktioner i denna modul och kommer inte att fungera i den här konfigurationen.\nDu kan behöva installera RPM-paketet för php-xml.",
        "config-pcre-old": "'''Kritiskt:''' PCRE $1 eller senare krävs.\nDin PHP-binär är länkad till PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mer information].",
        "config-pcre-no-utf8": "'''Kritiskt:''' PHP:s PCRE-modul verkar vara kompilerat utan PCRE_UTF8-stöd.\nMediaWiki kräver stöd för UTF-8 för att fungera korrekt.",
        "config-memory-raised": "PHPs <code>memory_limit</code> är $1, ökad till $2.",
        "config-db-install-account": "Användarkonto för installation",
        "config-db-username": "Databas-användarnamn:",
        "config-db-password": "Databas-lösenord:",
-       "config-db-password-empty": "Ange ett lösenord för den nya databasanvändaren: $1.\nÄven om det kan vara möjligt att skapa användare utan lösenord är det inte säkert.",
-       "config-db-username-empty": "Du måste ange ett värde för \"{{int:config-db-username}}\"",
        "config-db-install-username": "Ange det användarnamn som ska används för att ansluta till databasen under installationsprocessen.\nDetta är inte användarnamnet för ditt MediaWiki-konto; detta är användarnamnet för din databas.",
        "config-db-install-password": "Ange det lösenord som ska användas för att ansluta till databasen under installationsprocessen.\nDetta är inte lösenordet för ditt MediaWiki-konto; detta är lösenordet för din databas.",
        "config-db-install-help": "Ange användarnamnet och lösenordet som kommer att användas för att ansluta till databasen under installationsprocessen.",
index bf3636b..3923f7e 100644 (file)
@@ -62,7 +62,7 @@
        "config-magic-quotes-sybase": "<strong>Lỗi chí tử: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] đang hoạt động!</strong>\nTùy chọn này sẽ làm hỏng dữ liệu nhập một cách không thể đoán trước.\nBạn không thể cài đặt hoặc sử dụng MediaWiki trừ phi tùy chọn này bị vô hiệu.",
        "config-mbstring": "<strong>Lỗi chí tử: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] được kích hoạt!</strong>\nTùy chọn này gây lỗi và có thể làm hỏng dữ liệu một cách không thể đoán trước.\nBạn không thể cài đặt hoặc sử dụng MediaWiki trừ phi tùy chọn này bị vô hiệu.",
        "config-safe-mode": "<strong>Cảnh báo:</strong> [http://www.php.net/features.safe-mode Chế độ an toàn] của PHP đang được kích hoạt.\nNó có thể gây vấn đề, nhất là nếu dùng các chức năng tải lên tập tin và <code>math</code>.",
-       "config-xml-bad": "Mô đun XML của PHP đang bị thiếu.\nMediaWiki yêu cầu các hàm trong mô đun này và sẽ không hoạt động trong cấu hình này.\nNếu bạn đang chạy Mandrake, hãy cài đặt gói php-xml.",
+       "config-xml-bad": "Mô đun XML của PHP đang bị thiếu.\nMediaWiki yêu cầu các hàm trong mô đun này và sẽ không hoạt động trong cấu hình này.\nBạn có thể cần cài đặt gói RPM php-xml.",
        "config-pcre-old": "<strong>Lỗi chí tử:</strong> PCRE $1 trở lên được yêu cầu phải có.\nBản nhị phân PHP của bạn dang được liên kết với PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Thông tin bổ sung].",
        "config-pcre-no-utf8": "<strong>Lỗi chí tử:</strong> Mô đun PCRE của PHP dường như được biên dịch mà không có hỗ trợ PCRE_UTF8.\nMediaWiki yêu cầu phải có hỗ trợ UTF-8 để hoạt động chính xác.",
        "config-memory-raised": "<code>memory_limit</code> của PHP là $1, tăng lên $2.",
        "config-db-install-account": "Tài khoản người dùng để cài đặt",
        "config-db-username": "Tên người dùng cơ sở dữ liệu:",
        "config-db-password": "Mật khẩu cơ sở dữ liệu:",
-       "config-db-password-empty": "Xin nhập vào một mật khẩu cho người dùng cơ sở dữ liệu mới: $1. Tuy bạn có thể tạo một tài khoản người dùng mà không cần mật khẩu, nhưng khi đó sẽ không đảm bảo tính bảo mật cho bạn.",
-       "config-db-username-empty": "Bạn phải nhập một giá trị cho “{{int:config-db-username}}”",
        "config-db-install-username": "Nhập tên người dùng để kết nối với cơ sở dữ liệu trong quá trình cài đặt.\nĐây không phải là tên người dùng của tài khoản MediaWiki; đây là tên người dùng cho cơ sở dữ liệu của bạn.",
        "config-db-install-password": "Nhập mật khẩu để kết nối với cơ sở dữ liệu trong quá trình cài đặt.\nĐây không phải là mật khẩu của tài khoản MediaWiki; đây là mật khẩu cho cơ sở dữ liệu của bạn.",
        "config-db-install-help": "Nhập tên người dùng và mật khẩu sẽ được sử dụng để kết nối với cơ sở dữ liệu trong quá trình cài đặt.",
index d1db005..5dbe66e 100644 (file)
@@ -93,7 +93,7 @@
        "config-no-uri": "<strong>錯誤:</strong>無法辨識目前的 URI 位置。\n安裝已中止。",
        "config-no-cli-uri": "<strong>警告:</strong>:未指定 <code>--scriptpath</code> 指令參數,使用預設值:<code>$1</code>。",
        "config-using-server": "使用伺服器名稱 \"<nowiki>$1</nowiki>\"。",
-       "config-using-uri": "使用伺服器 URL 位置 \"<nowiki>$1$2</nowiki>\"。",
+       "config-using-uri": "使用伺服器 URL  \"<nowiki>$1$2</nowiki>\"。",
        "config-uploads-not-safe": "<strong>警告:</strong>您預設的上傳目錄 <code>$1</code> 有可被任意執行 Script 的漏洞。\n雖然 MediaWiki 會對所有上傳的檔案進行安全檢查,但我們仍強烈建議您在開啟上傳功能前了解如何 [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security 關閉此安全漏洞]。",
        "config-no-cli-uploads-check": "<strong>警告:</strong>透過指令介面安不會檢查您預設的上傳目錄 (<code>$1</code>) 是否有可任意執行 Script 的安全性漏洞。",
        "config-brokenlibxml": "您的系統使用了可能造成 MediaWiki 或其他網頁應用程式資料損毀問題的 PHP 與 limbxml2 版本。\n請升級 libxml2 2.7.3 或更新的版本 ([https://bugs.php.net/bug.php?id=45996 PHP 問題報告])。\n安裝已中止。",
        "config-db-install-account": "安裝程式使用的使用者帳號",
        "config-db-username": "資料庫使用者名稱:",
        "config-db-password": "資料庫密碼:",
-       "config-db-password-empty": "請輸入新增資料庫使用者 $1 的密碼。\n雖然您可以不設定任何密碼,但這樣做並不安全。",
-       "config-db-username-empty": "您必須輸入 \"{{int:config-db-username}}\" 欄位的內容。",
        "config-db-install-username": "請輸入在安裝過程中用來連線資料庫的使用者名稱。\n請注意,這不是 MediaWiki 帳號的使用者名稱,這是您資料庫的使用者名稱。",
        "config-db-install-password": "請輸入在安裝過程中用來連線資料庫的密碼。\n請注意,這不是 MediaWiki 帳號的密碼,這是您資料庫的密碼。",
        "config-db-install-help": "請輸入在安裝過程中用來連線資料庫的使用者名稱及密碼。",
        "config-upload-help": "檔案上傳功能會讓您的伺服器暴露在潛藏的安全性風險之下。\n要取得更多相關的資訊,請參考 [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security 安全性章節]。\n\n要開啟檔案上傳需要將 MediaWiki 根目錄底下的 <code>images</code> 目錄開啟網頁伺服器的寫入權,\n然後再啟動選項。",
        "config-upload-deleted": "已刪除檔案的目錄:",
        "config-upload-deleted-help": "請選擇用來存放已刪除檔案的目錄。\n理想情況下,此目錄不可被網頁直接存取。",
-       "config-logo": "標誌 URL 位置:",
+       "config-logo": "Logo 網址:",
        "config-logo-help": "在 MediaWiki 的預設介面,側欄選單上方有一塊 135x160 像素用來放置標誌的區域。\n請上傳合適大小的圖片並在此輸入 URL 網址。\n\n您可以透過 <code>$wgStylePath</code> 或者 <code>$wgScriptPath</code> 來表示您的圖片與這些路徑的相對位置。\n\n如果您不想使用標誌,可略過此欄位。",
        "config-instantcommons": "開啟即時共享資源",
        "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons 即時共享資源] 是允許 Wiki 使用來自 [//commons.wikimedia.org/ Wikimedia Commons] 網站上的圖片、聲音以及其他媒體的一項功能。\n若要開啟此功能,您的 MediaWiki 必須能夠連線網際網路。\n更多有關此功能的訊息,包含如何存除了 Wikimedia Commons 之外其他網站的說明,請參考 \n[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos 操作手冊]。",
        "config-memcached-servers": "Memcached 伺服器:",
        "config-memcached-help": "請列出 Memcached 伺服器的 IP 位址。\n每一行只指定一個位置並且要註明使用的埠號,例如:\n 127.0.0.1:11211\n 192.168.1.25:1234",
        "config-memcache-needservers": "您的快取類型選擇使用 Memcached,但並未設定任何的伺服器。",
-       "config-memcache-badip": "您輸入了一筆無效的 Memcached IP 位:$1。",
+       "config-memcache-badip": "您輸入了一筆無效的 Memcached IP 位:$1。",
        "config-memcache-noport": "您沒有輸入 Memcached 伺服器的埠號:$1。\n如果您不曉得埠號為多少,預設為 11211。",
        "config-memcache-badport": "Memcached 埠號應介於 $1 到 $2 之間。",
        "config-extensions": "擴充套件",
index 913aea0..69a3def 100644 (file)
@@ -94,7 +94,7 @@ abstract class JobQueue {
         *                  This might be useful for improving concurrency for job acquisition.
         *   - claimTTL   : If supported, the queue will recycle jobs that have been popped
         *                  but not acknowledged as completed after this many seconds. Recycling
-        *                  of jobs simple means re-inserting them into the queue. Jobs can be
+        *                  of jobs simply means re-inserting them into the queue. Jobs can be
         *                  attempted up to three times before being discarded.
         *
         * Queue classes should throw an exception if they do not support the options given.
index 68e96fc..beeb067 100644 (file)
@@ -38,7 +38,7 @@ class EmaillingJob extends Job {
                        $this->params['from'],
                        $this->params['subj'],
                        $this->params['body'],
-                       $this->params['replyto']
+                       array( 'replyTo' => $this->params['replyto'] )
                );
 
                return $status->isOK();
index e86d914..d6fa26b 100644 (file)
@@ -75,11 +75,13 @@ class RecentChangesUpdateJob extends Job {
                $lockKey = wfWikiID() . ':recentchanges-prune';
 
                $dbw = wfGetDB( DB_MASTER );
-               if ( !$dbw->lock( $lockKey, __METHOD__, 1 ) ) {
+               if ( !$dbw->lockIsFree( $lockKey, __METHOD__ )
+                       || !$dbw->lock( $lockKey, __METHOD__, 1 )
+               ) {
                        return; // already in progress
                }
-               $batchSize = 100; // Avoid slave lag
 
+               $batchSize = 100; // avoid slave lag
                $cutoff = $dbw->timestamp( time() - $wgRCMaxAge );
                do {
                        $rcIds = $dbw->selectFieldValues( 'recentchanges',
index 0caf90b..3d7fad5 100644 (file)
@@ -39,11 +39,28 @@ class BufferingStatsdDataFactory extends StatsdDataFactory {
                $this->prefix = $prefix;
        }
 
+       /**
+        * Normalize a metric key for StatsD
+        *
+        * Replace occurences of '::' with dots and any other non-alphanumeric
+        * characters with underscores. Combine runs of dots or underscores.
+        * Then trim leading or trailing dots or underscores.
+        *
+        * @param string $key
+        * @since 1.26
+        */
+       private static function normalizeMetricKey( $key ) {
+               $key = preg_replace( '/[:.]+/', '.', $key );
+               $key = preg_replace( '/[^a-z0-9.]+/i', '_', $key );
+               $key = trim( $key, '_.' );
+               return str_replace( array( '._', '_.' ), '.', $key );
+       }
+
        public function produceStatsdData( $key, $value = 1, $metric = StatsdDataInterface::STATSD_METRIC_COUNT ) {
                $entity = $this->produceStatsdDataEntity();
                if ( $key !== null ) {
-                       $prefixedKey = ltrim( $this->prefix . '.' . $key, '.' );
-                       $entity->setKey( $prefixedKey );
+                       $key = self::normalizeMetricKey( "{$this->prefix}.{$key}" );
+                       $entity->setKey( $key );
                }
                if ( $value !== null ) {
                        $entity->setValue( $value );
index f5d5229..2e7ef88 100644 (file)
@@ -189,6 +189,7 @@ class MultiHttpClient {
 
                // @TODO: use a per-host rolling handle window (e.g. CURLMOPT_MAX_HOST_CONNECTIONS)
                $batches = array_chunk( $indexes, $this->maxConnsPerHost );
+               $infos = array();
 
                foreach ( $batches as $batch ) {
                        // Attach all cURL handles for this batch
@@ -201,6 +202,10 @@ class MultiHttpClient {
                                // Do any available work...
                                do {
                                        $mrc = curl_multi_exec( $chm, $active );
+                                       $info = curl_multi_info_read( $chm );
+                                       if ( $info !== false ) {
+                                               $infos[(int)$info['handle']] = $info;
+                                       }
                                } while ( $mrc == CURLM_CALL_MULTI_PERFORM );
                                // Wait (if possible) for available work...
                                if ( $active > 0 && $mrc == CURLM_OK ) {
@@ -216,10 +221,18 @@ class MultiHttpClient {
                foreach ( $reqs as $index => &$req ) {
                        $ch = $handles[$index];
                        curl_multi_remove_handle( $chm, $ch );
-                       if ( curl_errno( $ch ) !== 0 ) {
-                               $req['response']['error'] = "(curl error: " .
-                                       curl_errno( $ch ) . ") " . curl_error( $ch );
+
+                       $info = $infos[(int)$ch];
+
+                       $errno = $info['result'];
+                       if ( $errno !== 0 ) {
+                               $req['response']['error'] = "(curl error: $errno)";
+
+                               if ( function_exists( 'curl_strerror' ) ) {
+                                       $req['response']['error'] .= " " . curl_strerror( $errno );
+                               }
                        }
+
                        // For convenience with the list() operator
                        $req['response'][0] = $req['response']['code'];
                        $req['response'][1] = $req['response']['reason'];
index eaf1155..cc54fe7 100644 (file)
  * @ingroup Cache
  */
 class APCBagOStuff extends BagOStuff {
+
+       /**
+        * @var string String to append to each APC key. This may be changed
+        *  whenever the handling of values is changed, to prevent existing code
+        *  from encountering older values which it cannot handle.
+        **/
+       const KEY_SUFFIX = ':1';
+
        public function get( $key, &$casToken = null ) {
-               $val = apc_fetch( $key );
+               $val = apc_fetch( $key . self::KEY_SUFFIX );
 
                $casToken = $val;
 
-               if ( is_string( $val ) ) {
-                       if ( $this->isInteger( $val ) ) {
-                               $val = intval( $val );
-                       } else {
-                               $val = unserialize( $val );
-                       }
-               }
-
                return $val;
        }
 
        public function set( $key, $value, $exptime = 0 ) {
-               if ( !$this->isInteger( $value ) ) {
-                       $value = serialize( $value );
-               }
-
-               apc_store( $key, $value, $exptime );
+               apc_store( $key . self::KEY_SUFFIX, $value, $exptime );
 
                return true;
        }
 
        public function delete( $key ) {
-               apc_delete( $key );
+               apc_delete( $key . self::KEY_SUFFIX );
 
                return true;
        }
 
        public function incr( $key, $value = 1 ) {
-               return apc_inc( $key, $value );
+               return apc_inc( $key . self::KEY_SUFFIX, $value );
        }
 
        public function decr( $key, $value = 1 ) {
-               return apc_dec( $key, $value );
+               return apc_dec( $key . self::KEY_SUFFIX, $value );
        }
 }
index c32efb9..e8837b3 100644 (file)
@@ -300,8 +300,10 @@ class WANObjectCache {
 
                $time = self::parsePurgeValue( $this->cache->get( $key ) );
                if ( $time === false ) {
-                       $time = microtime( true );
+                       // Casting assures identical floats for the next getCheckKeyTime() calls
+                       $time = (string)microtime( true );
                        $this->cache->add( $key, self::PURGE_VAL_PREFIX . $time, self::CHECK_KEY_TTL );
+                       $time = (float)$time;
                }
 
                return $time;
@@ -320,6 +322,13 @@ class WANObjectCache {
         * avoid race conditions where dependent keys get updated with a
         * stale value (e.g. from a DB slave).
         *
+        * This is typically useful for keys with static names or some cases
+        * dynamically generated names where a low number of combinations exist.
+        * When a few important keys get a large number of hits, a high cache
+        * time is usually desired as well as lockTSE logic. The resetCheckKey()
+        * method is less appropriate in such cases since the "time since expiry"
+        * cannot be inferred.
+        *
         * Note that "check" keys won't collide with other regular keys
         *
         * @see WANObjectCache::get()
@@ -336,6 +345,39 @@ class WANObjectCache {
                return $this->relayPurge( $key, self::CHECK_KEY_TTL ) && $ok;
        }
 
+       /**
+        * Delete a "check" key from all clusters, invalidating keys that use it
+        *
+        * This is similar to touchCheckKey() in that keys using it via
+        * getWithSetCallback() will be invalidated. The differences are:
+        *   a) The timestamp will be deleted from all caches and lazily
+        *      re-initialized when accessed (rather than set everywhere)
+        *   b) Thus, dependent keys will be known to be invalid, but not
+        *      for how long (they are treated as "just" purged), which
+        *      effects any lockTSE logic in getWithSetCallback()
+        * The advantage is that this does not place high TTL keys on every cache
+        * server, making it better for code that will cache many different keys
+        * and either does not use lockTSE or uses a low enough TTL anyway.
+        *
+        * This is typically useful for keys with dynamically generated names
+        * where a high number of combinations exist.
+        *
+        * Note that "check" keys won't collide with other regular keys
+        *
+        * @see WANObjectCache::touchCheckKey()
+        * @see WANObjectCache::get()
+        *
+        * @param string $key Cache key
+        * @return bool True if the item was purged or not found, false on failure
+        */
+       final public function resetCheckKey( $key ) {
+               $key = self::TIME_KEY_PREFIX . $key;
+               // Update the local cluster immediately
+               $ok = $this->cache->delete( $key );
+               // Publish the purge to all clusters
+               return $this->relayDelete( $key ) && $ok;
+       }
+
        /**
         * Method to fetch/regenerate cache keys
         *
@@ -545,6 +587,26 @@ class WANObjectCache {
                return $ok;
        }
 
+       /**
+        * Do the actual async bus delete of a key
+        *
+        * @param string $key Cache key
+        * @return bool Success
+        */
+       protected function relayDelete( $key ) {
+               $event = $this->cache->modifySimpleRelayEvent( array(
+                       'cmd' => 'delete',
+                       'key' => $key,
+               ) );
+
+               $ok = $this->relayer->notify( "{$this->pool}:purge", $event );
+               if ( !$ok ) {
+                       $this->lastRelayError = self::ERR_RELAY;
+               }
+
+               return $ok;
+       }
+
        /**
         * Check if a key should be regenerated (using random probability)
         *
index c359659..0eed450 100644 (file)
@@ -135,7 +135,9 @@ class EmailNotification {
 
                $sendEmail = true;
                // If nobody is watching the page, and there are no users notified on all changes
-               // don't bother creating a job/trying to send emails
+               // don't bother creating a job/trying to send emails, unless it's a
+               // talk page with an applicable notification.
+               //
                // $watchers deals with $wgEnotifWatchlist
                if ( !count( $watchers ) && !count( $wgUsersNotifiedOnAllChanges ) ) {
                        $sendEmail = false;
@@ -476,7 +478,9 @@ class EmailNotification {
                                $wgContLang->userTime( $this->timestamp, $watchingUser ) ),
                        $this->body );
 
-               return UserMailer::send( $to, $this->from, $this->subject, $body, $this->replyto );
+               return UserMailer::send( $to, $this->from, $this->subject, $body, array(
+                       'replyTo' => $this->replyto,
+               ) );
        }
 
        /**
@@ -501,7 +505,9 @@ class EmailNotification {
                                $wgContLang->time( $this->timestamp, false, false ) ),
                        $this->body );
 
-               return UserMailer::send( $addresses, $this->from, $this->subject, $body, $this->replyto );
+               return UserMailer::send( $addresses, $this->from, $this->subject, $body, array(
+                       'replyTo' => $this->replyto,
+               ) );
        }
 
 }
index 546cc8c..d83ae93 100644 (file)
@@ -102,16 +102,32 @@ class UserMailer {
         * @param MailAddress $from Sender's email
         * @param string $subject Email's subject.
         * @param string $body Email's text or Array of two strings to be the text and html bodies
-        * @param MailAddress $replyto Optional reply-to email (default: null).
-        * @param string $contentType Optional custom Content-Type (default: text/plain; charset=UTF-8)
+        * @param array $options:
+        *              'replyTo' MailAddress
+        *              'contentType' string default 'text/plain; charset=UTF-8'
+        *
+        * Previous versions of this function had $replyto as the 5th argument and $contentType
+        * as the 6th. These are still supported for backwards compatability, but deprecated.
+        *
         * @throws MWException
         * @throws Exception
         * @return Status
         */
-       public static function send( $to, $from, $subject, $body, $replyto = null,
-               $contentType = 'text/plain; charset=UTF-8'
-       ) {
+       public static function send( $to, $from, $subject, $body, $options = array() ) {
                global $wgSMTP, $wgEnotifMaxRecips, $wgAdditionalMailParams, $wgAllowHTMLEmail;
+               $contentType = 'text/plain; charset=UTF-8';
+               if ( is_array( $options ) ) {
+                       $replyto = isset( $options['replyTo'] ) ? $options['replyTo'] : null;
+                       $contentType = isset( $options['contentType'] ) ? $options['contentType'] : $contentType;
+               } else {
+                       // Old calling style
+                       wfDeprecated( __METHOD__ . ' with $replyto as 5th parameter', '1.26' );
+                       $replyto = $options;
+                       if ( func_num_args() === 6 ) {
+                               $contentType = func_get_arg( 5 );
+                       }
+               }
+
                $mime = null;
                if ( !is_array( $to ) ) {
                        $to = array( $to );
index 4377f75..1118598 100644 (file)
@@ -205,6 +205,7 @@ class SvgHandler extends ImageHandler {
                $tmpDir = wfTempDir() . '/svg_' . wfRandomString( 24 );
                $lnPath = "$tmpDir/" . basename( $srcPath );
                $ok = mkdir( $tmpDir, 0771 ) && symlink( $srcPath, $lnPath );
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $cleaner = new ScopedCallback( function () use ( $tmpDir, $lnPath ) {
                        MediaWiki\suppressWarnings();
                        unlink( $lnPath );
index a838355..12550a5 100644 (file)
@@ -525,6 +525,7 @@ class XMPReader implements LoggerAwareInterface {
                );
 
                $oldDisable = libxml_disable_entity_loader( true );
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $reset = new ScopedCallback(
                        'libxml_disable_entity_loader',
                        array( $oldDisable )
index 6912864..5010b89 100644 (file)
@@ -94,6 +94,11 @@ class MWMemcached {
         */
        const COMPRESSED = 2;
 
+       /**
+        * Flag: indicates data is an integer
+        */
+       const INTVAL = 4;
+
        // }}}
 
        /**
@@ -979,6 +984,8 @@ class MWMemcached {
                                         */
                                        if ( $flags & self::SERIALIZED ) {
                                                $ret[$rkey] = unserialize( $ret[$rkey] );
+                                       } elseif ( $flags & self::INTVAL ) {
+                                               $ret[$rkey] = intval( $ret[$rkey] );
                                        }
                                }
 
@@ -1027,7 +1034,9 @@ class MWMemcached {
 
                $flags = 0;
 
-               if ( !is_scalar( $val ) ) {
+               if ( is_int( $val ) ) {
+                       $flags |= self::INTVAL;
+               } elseif ( !is_scalar( $val ) ) {
                        $val = serialize( $val );
                        $flags |= self::SERIALIZED;
                        if ( $this->_debug ) {
index ed0aaa2..b8a0dd5 100644 (file)
@@ -374,10 +374,32 @@ class RedisBagOStuff extends BagOStuff {
 
                foreach ( $candidates as $tag ) {
                        $server = $this->serverTagMap[$tag];
+
                        $conn = $this->redisPool->getConnection( $server );
-                       if ( $conn ) {
-                               return array( $server, $conn );
+                       if ( !$conn ) {
+                               continue;
+                       }
+
+                       try {
+                               $info = $conn->info();
+                               // Check if this server has an unreachable redis master
+                               if ( $info['role'] === 'slave'
+                                       && $info['master_link_status'] === 'down'
+                                       && $this->automaticFailover
+                               ) {
+                                       // If the master cannot be reached, fail-over to the next server.
+                                       // If masters are in data-center A, and slaves in data-center B,
+                                       // this helps avoid the case were fail-over happens in A but not
+                                       // to the corresponding server in B (e.g. read/write mismatch).
+                                       continue;
+                               }
+                       } catch ( RedisException $e ) {
+                               // Server is not accepting commands
+                               $this->handleException( $conn, $e );
+                               continue;
                        }
+
+                       return array( $server, $conn );
                }
 
                $this->setLastError( BagOStuff::ERR_UNREACHABLE );
index f213f6a..e58ffc8 100644 (file)
@@ -1256,7 +1256,7 @@ class Article implements Page {
 
                # Show error message
                $oldid = $this->getOldID();
-               if ( !$oldid && $title->getNamespace() === NS_MEDIAWIKI ) {
+               if ( !$oldid && $title->getNamespace() === NS_MEDIAWIKI && $title->hasSourceText() ) {
                        $outputPage->addParserOutput( $this->getContentObject()->getParserOutput( $title ) );
                } else {
                        if ( $oldid ) {
index 7ea4ed7..4ec377a 100644 (file)
@@ -296,7 +296,7 @@ class ImagePage extends Article {
        }
 
        protected function openShowImage() {
-               global $wgEnableUploads, $wgSend404Code;
+               global $wgEnableUploads, $wgSend404Code, $wgSVGMaxSize;
 
                $this->loadFile();
                $out = $this->getContext()->getOutput();
@@ -351,7 +351,7 @@ class ImagePage extends Article {
                                        );
                                        $linktext = $this->getContext()->msg( 'show-big-image' )->escaped();
 
-                                       $thumbSizes = $this->getThumbSizes( $width, $height, $width_orig, $height_orig );
+                                       $thumbSizes = $this->getThumbSizes( $width_orig, $height_orig );
                                        # Generate thumbnails or thumbnail links as needed...
                                        $otherSizes = array();
                                        foreach ( $thumbSizes as $size ) {
@@ -361,10 +361,12 @@ class ImagePage extends Article {
                                                // the current thumbnail's size ($width/$height)
                                                // since that is added to the message separately, so
                                                // it can be denoted as the current size being shown.
-                                               // Vectorized images are "infinitely" big, so all thumb
-                                               // sizes are shown.
+                                               // Vectorized images are limited by $wgSVGMaxSize big,
+                                               // so all thumbs less than or equal that are shown.
                                                if ( ( ( $size[0] <= $width_orig && $size[1] <= $height_orig )
-                                                               || $this->displayImg->isVectorized() )
+                                                               || ( $this->displayImg->isVectorized()
+                                                                       && max( $size[0], $size[1] ) <= $wgSVGMaxSize )
+                                                       )
                                                        && $size[0] != $width && $size[1] != $height
                                                ) {
                                                        $sizeLink = $this->makeSizeLink( $params, $size[0], $size[1] );
index cf8cd41..8a30ad1 100644 (file)
@@ -178,7 +178,9 @@ class CoreParserFunctions {
                        default:
                                $func = 'urlencode';
                }
-               return $parser->markerSkipCallback( $s, $func );
+               // See T105242, where the choice to kill markers and various
+               // other options were discussed.
+               return $func( $parser->killMarkers( $s ) );
        }
 
        public static function lcfirst( $parser, $s = '' ) {
index 1603fc6..65d8182 100644 (file)
@@ -1023,9 +1023,10 @@ class Parser {
                        }
 
                        $first_character = $line[0];
+                       $first_two = substr( $line, 0, 2 );
                        $matches = array();
 
-                       if ( preg_match( '/^(:*)\{\|(.*)$/', $line, $matches ) ) {
+                       if ( preg_match( '/^(:*)\s*\{\|(.*)$/', $line, $matches ) ) {
                                # First check if we are starting a new table
                                $indent_level = strlen( $matches[1] );
 
@@ -1042,7 +1043,7 @@ class Parser {
                                # Don't do any of the following
                                $out .= $outLine . "\n";
                                continue;
-                       } elseif ( substr( $line, 0, 2 ) === '|}' ) {
+                       } elseif ( $first_two === '|}' ) {
                                # We are ending a table
                                $line = '</table>' . substr( $line, 2 );
                                $last_tag = array_pop( $last_tag_history );
@@ -1060,7 +1061,7 @@ class Parser {
                                }
                                array_pop( $tr_attributes );
                                $outLine = $line . str_repeat( '</dd></dl>', $indent_level );
-                       } elseif ( substr( $line, 0, 2 ) === '|-' ) {
+                       } elseif ( $first_two === '|-' ) {
                                # Now we have a table row
                                $line = preg_replace( '#^\|-+#', '', $line );
 
@@ -1089,16 +1090,16 @@ class Parser {
                                array_push( $last_tag_history, '' );
                        } elseif ( $first_character === '|'
                                || $first_character === '!'
-                               || substr( $line, 0, 2 ) === '|+'
+                               || $first_two === '|+'
                        ) {
                                # This might be cell elements, td, th or captions
-                               if ( substr( $line, 0, 2 ) === '|+' ) {
+                               if ( $first_two === '|+' ) {
                                        $first_character = '+';
+                                       $line = substr( $line, 2 );
+                               } else {
                                        $line = substr( $line, 1 );
                                }
 
-                               $line = substr( $line, 1 );
-
                                if ( $first_character === '!' ) {
                                        $line = str_replace( '!!', '||', $line );
                                }
@@ -2146,7 +2147,8 @@ class Parser {
                                $link = substr( $link, 1 );
                        }
 
-                       $nt = Title::newFromText( $this->mStripState->unstripNoWiki( $link ) );
+                       $unstrip = $this->mStripState->unstripNoWiki( $link );
+                       $nt = is_string( $unstrip ) ? Title::newFromText( $unstrip ) : null;
                        if ( $nt === null ) {
                                $s .= $prefix . '[[' . $line;
                                continue;
@@ -4554,6 +4556,12 @@ class Parser {
                                array( '', '<$1>' ),
                                $safeHeadline
                        );
+
+                       # Strip '<span></span>', which is the result from the above if
+                       # <span id="foo"></span> is used to produce an additional anchor
+                       # for a section.
+                       $tocline = str_replace( '<span></span>', '', $tocline );
+
                        $tocline = trim( $tocline );
 
                        # For the anchor, strip out HTML-y stuff period
index cdad9ba..80dc669 100644 (file)
@@ -67,27 +67,59 @@ class UserPasswordPolicy {
         * Check if a passwords meets the effective password policy for a User.
         * @param User $user who's policy we are checking
         * @param string $password the password to check
+        * @param string $purpose one of 'login', 'create', 'reset'
         * @return Status error to indicate the password didn't meet the policy, or fatal to
         *      indicate the user shouldn't be allowed to login.
         */
-       public function checkUserPassword( User $user, $password ) {
-               $effectivePolicy = $this->getPoliciesForUser( $user );
-               $status = Status::newGood();
+       public function checkUserPassword( User $user, $password, $purpose = 'login' ) {
+               $effectivePolicy = $this->getPoliciesForUser( $user, $purpose );
+               return $this->checkPolicies(
+                       $user,
+                       $password,
+                       $effectivePolicy,
+                       $this->policyCheckFunctions
+               );
+       }
+
+       /**
+        * Check if a passwords meets the effective password policy for a User, using a set
+        * of groups they may or may not belong to. This function does not use the DB, so can
+        * be used in the installer.
+        * @param User $user who's policy we are checking
+        * @param string $password the password to check
+        * @param array $groups list of groups to which we assume the user belongs
+        * @return Status error to indicate the password didn't meet the policy, or fatal to
+        *      indicate the user shouldn't be allowed to login.
+        */
+       public function checkUserPasswordForGroups( User $user, $password, array $groups ) {
+               $effectivePolicy = self::getPoliciesForGroups(
+                       $this->policies,
+                       $groups,
+                       $this->policies['default']
+               );
+               return $this->checkPolicies(
+                       $user,
+                       $password,
+                       $effectivePolicy,
+                       $this->policyCheckFunctions
+               );
+       }
 
-               foreach ( $effectivePolicy as $policy => $value ) {
-                       if ( !isset( $this->policyCheckFunctions[$policy] ) ) {
+       private function checkPolicies( User $user, $password, $policies, $policyCheckFunctions ) {
+               $status = Status::newGood();
+               foreach ( $policies as $policy => $value ) {
+                       if ( !isset( $policyCheckFunctions[$policy] ) ) {
                                throw new DomainException( 'Invalid password policy config' );
                        }
                        $status->merge(
                                call_user_func(
-                                       $this->policyCheckFunctions[$policy],
+                                       $policyCheckFunctions[$policy],
                                        $value,
                                        $user,
                                        $password
                                )
                        );
                }
-
                return $status;
        }
 
@@ -95,16 +127,20 @@ class UserPasswordPolicy {
         * Get the policy for a user, based on their group membership. Public so
         * UI elements can access and inform the user.
         * @param User $user
+        * @param string $purpose one of 'login', 'create', 'reset'
         * @return array the effective policy for $user
         */
-       public function getPoliciesForUser( User $user ) {
-               $effectivePolicy = self::getPoliciesForGroups(
-                       $this->policies,
-                       $user->getEffectiveGroups(),
-                       $this->policies['default']
-               );
+       public function getPoliciesForUser( User $user, $purpose = 'login' ) {
+               $effectivePolicy = $this->policies['default'];
+               if ( $purpose !== 'create' ) {
+                       $effectivePolicy = self::getPoliciesForGroups(
+                               $this->policies,
+                               $user->getEffectiveGroups(),
+                               $this->policies['default']
+                       );
+               }
 
-               Hooks::run( 'PasswordPoliciesForUser', array( $user, &$effectivePolicy ) );
+               Hooks::run( 'PasswordPoliciesForUser', array( $user, &$effectivePolicy, $purpose ) );
 
                return $effectivePolicy;
        }
index d816a01..52aa54a 100644 (file)
  */
 class ProfilerOutputStats extends ProfilerOutput {
 
-       /**
-        * Normalize a metric key for StatsD
-        *
-        * Replace occurences of '::' with dots and any other non-alphabetic
-        * characters with underscores. Combine runs of dots or underscores.
-        * Then trim leading or trailing dots or underscores.
-        *
-        * @param string $key
-        * @since 1.26
-        */
-       private static function normalizeMetricKey( $key ) {
-               $key = preg_replace( '/[:.]+/', '.', $key );
-               $key = preg_replace( '/[^a-z.]+/i', '_', $key );
-               $key = trim( $key, '_.' );
-               return str_replace( array( '._', '_.' ), '.', $key );
-       }
-
        /**
         * Flush profiling data to the current profiling context's stats buffer.
         *
         * @param array $stats
         */
        public function log( array $stats ) {
-               if ( isset( $this->params['prefix'] ) ) {
-                       $prefix = self::normalizeMetricKey( $this->params['prefix'] );
-               } else {
-                       $prefix = '';
-               }
-
+               $prefix = isset( $this->params['prefix'] ) ? $this->params['prefix'] : '';
                $contextStats = $this->collector->getContext()->getStats();
 
                foreach ( $stats as $stat ) {
-                       $key = self::normalizeMetricKey( "{$prefix}.{$stat['name']}" );
+                       $key = "{$prefix}.{$stat['name']}";
 
                        // Convert fractional seconds to whole milliseconds
                        $cpu = round( $stat['cpu'] * 1000 );
index 5d0ed3c..508be2f 100644 (file)
@@ -224,7 +224,8 @@ class ResourceLoader implements LoggerAwareInterface {
                                if ( $options['cacheReport'] ) {
                                        $result .= "\n/* cache key: $key */";
                                }
-                               $cache->set( $key, $result );
+                               // Set a TTL since HHVM's APC doesn't have any limitation or eviction logic.
+                               $cache->set( $key, $result, 24 * 3600 );
                        } catch ( Exception $e ) {
                                MWExceptionHandler::logException( $e );
                                $this->logger->warning( 'Minification failed: {exception}', array(
@@ -813,6 +814,11 @@ class ResourceLoader implements LoggerAwareInterface {
                        $exp = min( $maxage, $smaxage );
                        header( 'Expires: ' . wfTimestamp( TS_RFC2822, $exp + time() ) );
                }
+
+               // Send the current time expressed as fractional seconds since epoch,
+               // with microsecond precision. This helps distinguish hits from misses
+               // in edge caches.
+               header( 'MediaWiki-Timestamp: ' . microtime( true ) );
        }
 
        /**
index d159284..f9dfbdc 100644 (file)
@@ -48,6 +48,15 @@ class ResourceLoaderJqueryMsgModule extends ResourceLoaderFileModule {
                return $fileScript . $dataScript;
        }
 
+       /**
+       * @param ResourceLoaderContext $context
+       * @return array
+       */
+       public function getScriptURLsForDebug( ResourceLoaderContext $context ) {
+               // Bypass file module urls
+               return ResourceLoaderModule::getScriptURLsForDebug( $context );
+       }
+
        /**
         * @return bool
         */
index 94edb36..46b786d 100644 (file)
@@ -571,7 +571,7 @@ abstract class ResourceLoaderModule {
                }
 
                $statTiming = microtime( true ) - $statStart;
-               $statName = str_replace( '.', '_', $this->getName() );
+               $statName = strtr( $this->getName(), '.', '_' );
                $stats->timing( "resourceloader_build.all", $statTiming );
                $stats->timing( "resourceloader_build.$statName", $statTiming );
 
index a4d94f8..0023de2 100644 (file)
@@ -149,7 +149,7 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
         */
        protected function getContent( $titleText ) {
                $title = Title::newFromText( $titleText );
-               if ( !$title || $title->isRedirect() ) {
+               if ( !$title ) {
                        return null;
                }
 
index fa2423b..246f115 100644 (file)
@@ -439,7 +439,7 @@ class SearchMySQL extends SearchDatabase {
                        $sql = "SHOW GLOBAL VARIABLES LIKE 'ft\\_min\\_word\\_len'";
 
                        $dbr = wfGetDB( DB_SLAVE );
-                       $result = $dbr->query( $sql );
+                       $result = $dbr->query( $sql, __METHOD__ );
                        $row = $result->fetchObject();
                        $result->free();
 
index bda10b0..71e3b63 100644 (file)
@@ -186,7 +186,7 @@ class SearchPostgres extends SearchDatabase {
        function update( $pageid, $title, $text ) {
                ## We don't want to index older revisions
                $sql = "UPDATE pagecontent SET textvector = NULL WHERE textvector IS NOT NULL and old_id IN " .
-                               "(SELECT rev_text_id FROM revision WHERE rev_page = " . intval( $pageid ) .
+                               "(SELECT DISTINCT rev_text_id FROM revision WHERE rev_page = " . intval( $pageid ) .
                                " ORDER BY rev_text_id DESC OFFSET 1)";
                $this->db->query( $sql );
                return true;
index d77f07b..e3230ff 100644 (file)
@@ -41,7 +41,7 @@ class SiteSQLStore extends CachingSiteStore {
         */
        public static function newInstance( ORMTable $sitesTable = null, BagOStuff $cache = null ) {
                if ( $cache === null ) {
-                       $cache = wfGetMainCache();
+                       $cache = wfGetCache( wfIsHHVM() ? CACHE_ACCEL : CACHE_ANYTHING );
                }
 
                $siteStore = new DBSiteStore();
index 9056761..42c5980 100644 (file)
@@ -96,7 +96,11 @@ abstract class FormSpecialPage extends SpecialPage {
                        $this->getMessagePrefix()
                );
                $form->setSubmitCallback( array( $this, 'onSubmit' ) );
-               $form->setWrapperLegendMsg( $this->getMessagePrefix() . '-legend' );
+               if ( $this->getDisplayFormat() !== 'ooui' ) {
+                       // No legend and wrapper by default in OOUI forms, but can be set manually
+                       // from alterForm()
+                       $form->setWrapperLegendMsg( $this->getMessagePrefix() . '-legend' );
+               }
 
                $headerMsg = $this->msg( $this->getMessagePrefix() . '-text' );
                if ( !$headerMsg->isDisabled() ) {
index 69e1d8c..3c8b742 100644 (file)
@@ -141,7 +141,7 @@ abstract class QueryPage extends SpecialPage {
         * @return array
         * @since 1.18
         */
-       function getQueryInfo() {
+       public function getQueryInfo() {
                return null;
        }
 
@@ -178,7 +178,7 @@ abstract class QueryPage extends SpecialPage {
         * @return bool
         * @since 1.18
         */
-       function usesTimestamps() {
+       public function usesTimestamps() {
                return false;
        }
 
@@ -198,7 +198,7 @@ abstract class QueryPage extends SpecialPage {
         *
         * @return bool
         */
-       function isExpensive() {
+       public function isExpensive() {
                return $this->getConfig()->get( 'DisableQueryPages' );
        }
 
@@ -219,7 +219,7 @@ abstract class QueryPage extends SpecialPage {
         *
         * @return bool
         */
-       function isCached() {
+       public function isCached() {
                return $this->isExpensive() && $this->getConfig()->get( 'MiserMode' );
        }
 
@@ -294,7 +294,7 @@ abstract class QueryPage extends SpecialPage {
         * @throws DBError|Exception
         * @return bool|int
         */
-       function recache( $limit, $ignoreErrors = true ) {
+       public function recache( $limit, $ignoreErrors = true ) {
                if ( !$this->isCacheable() ) {
                        return 0;
                }
@@ -370,7 +370,7 @@ abstract class QueryPage extends SpecialPage {
         * @return ResultWrapper
         * @since 1.18
         */
-       function reallyDoQuery( $limit, $offset = false ) {
+       public function reallyDoQuery( $limit, $offset = false ) {
                $fname = get_class( $this ) . "::reallyDoQuery";
                $dbr = $this->getRecacheDB();
                $query = $this->getQueryInfo();
@@ -421,7 +421,7 @@ abstract class QueryPage extends SpecialPage {
         * @param int|bool $limit
         * @return ResultWrapper
         */
-       function doQuery( $offset = false, $limit = false ) {
+       public function doQuery( $offset = false, $limit = false ) {
                if ( $this->isCached() && $this->isCacheable() ) {
                        return $this->fetchFromCache( $limit, $offset );
                } else {
@@ -436,7 +436,7 @@ abstract class QueryPage extends SpecialPage {
         * @return ResultWrapper
         * @since 1.18
         */
-       function fetchFromCache( $limit, $offset = false ) {
+       public function fetchFromCache( $limit, $offset = false ) {
                $dbr = wfGetDB( DB_SLAVE );
                $options = array();
                if ( $limit !== false ) {
@@ -487,7 +487,7 @@ abstract class QueryPage extends SpecialPage {
         * real, honest-to-gosh query page.
         * @param string $par
         */
-       function execute( $par ) {
+       public function execute( $par ) {
                $user = $this->getUser();
                if ( !$this->userCanExecute( $user ) ) {
                        $this->displayRestrictionError();
index 41c2f93..e5c5aa4 100644 (file)
@@ -445,7 +445,7 @@ class AllMessagesTablePager extends TablePager {
                } elseif ( $field === 'am_title' ) {
                        return array( 'class' => $field );
                } else {
-                       return array( 'lang' => $this->langcode, 'dir' => $this->lang->getDir(), 'class' => $field );
+                       return array( 'lang' => wfBCP47( $this->langcode ), 'dir' => $this->lang->getDir(), 'class' => $field );
                }
        }
 
index 8a9aefd..ebc02a5 100644 (file)
@@ -77,11 +77,11 @@ class SpecialBlockList extends SpecialPage {
                        ),
                        'Options' => array(
                                'type' => 'multiselect',
-                               'options' => array(
-                                       $this->msg( 'blocklist-userblocks' )->text() => 'userblocks',
-                                       $this->msg( 'blocklist-tempblocks' )->text() => 'tempblocks',
-                                       $this->msg( 'blocklist-addressblocks' )->text() => 'addressblocks',
-                                       $this->msg( 'blocklist-rangeblocks' )->text() => 'rangeblocks',
+                               'options-messages' => array(
+                                       'blocklist-userblocks' => 'userblocks',
+                                       'blocklist-tempblocks' => 'tempblocks',
+                                       'blocklist-addressblocks' => 'addressblocks',
+                                       'blocklist-rangeblocks' => 'rangeblocks',
                                ),
                                'flatlist' => true,
                        ),
@@ -249,7 +249,7 @@ class BlockListPager extends TablePager {
        function formatValue( $name, $value ) {
                static $msg = null;
                if ( $msg === null ) {
-                       $msg = array(
+                       $keys = array(
                                'anononlyblock',
                                'createaccountblock',
                                'noautoblockblock',
@@ -258,17 +258,22 @@ class BlockListPager extends TablePager {
                                'unblocklink',
                                'change-blocklink',
                        );
-                       $msg = array_combine( $msg, array_map( array( $this, 'msg' ), $msg ) );
+
+                       foreach ( $keys as $key ) {
+                               $msg[$key] = $this->msg( $key )->escaped();
+                       }
                }
 
                /** @var $row object */
                $row = $this->mCurrentRow;
 
+               $language = $this->getLanguage();
+
                $formatted = '';
 
                switch ( $name ) {
                        case 'ipb_timestamp':
-                               $formatted = $this->getLanguage()->userTimeAndDate( $value, $this->getUser() );
+                               $formatted = htmlspecialchars( $language->userTimeAndDate( $value, $this->getUser() ) );
                                break;
 
                        case 'ipb_target':
@@ -294,7 +299,10 @@ class BlockListPager extends TablePager {
                                break;
 
                        case 'ipb_expiry':
-                               $formatted = $this->getLanguage()->formatExpiry( $value, /* User preference timezone */true );
+                               $formatted = htmlspecialchars( $language->formatExpiry(
+                                       $value,
+                                       /* User preference timezone */true
+                               ) );
                                if ( $this->getUser()->isAllowed( 'block' ) ) {
                                        if ( $row->ipb_auto ) {
                                                $links[] = Linker::linkKnown(
@@ -317,7 +325,7 @@ class BlockListPager extends TablePager {
                                                'span',
                                                array( 'class' => 'mw-blocklist-actions' ),
                                                $this->msg( 'parentheses' )->rawParams(
-                                                       $this->getLanguage()->pipeList( $links ) )->escaped()
+                                                       $language->pipeList( $links ) )->escaped()
                                        );
                                }
                                break;
@@ -355,7 +363,7 @@ class BlockListPager extends TablePager {
                                        $properties[] = $msg['blocklist-nousertalk'];
                                }
 
-                               $formatted = $this->getLanguage()->commaList( $properties );
+                               $formatted = $language->commaList( $properties );
                                break;
 
                        default:
index c55fa94..1754471 100644 (file)
@@ -356,7 +356,9 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        $replyTo = null;
                }
 
-               $status = UserMailer::send( $to, $mailFrom, $subject, $text, $replyTo );
+               $status = UserMailer::send( $to, $mailFrom, $subject, $text, array(
+                       'replyTo' => $replyTo,
+               ) );
 
                if ( !$status->isGood() ) {
                        return $status;
index d330b0e..4c73f16 100644 (file)
@@ -44,6 +44,11 @@ class SpecialJavaScriptTest extends SpecialPage {
 
                if ( $par === null ) {
                        // No framework specified
+                       // If only one framework is configured, redirect to it. Otherwise display a list.
+                       if ( count( self::$frameworks ) === 1 ) {
+                               $out->redirect( $this->getPageTitle( self::$frameworks[0] . '/plain' )->getLocalURL() );
+                               return;
+                       }
                        $out->setStatusCode( 404 );
                        $out->setPageTitle( $this->msg( 'javascripttest' ) );
                        $out->addHTML(
@@ -74,10 +79,14 @@ class SpecialJavaScriptTest extends SpecialPage {
                // no sensitive data. In order to allow TestSwarm to embed it into a test client window,
                // we need to allow iframing of this page.
                $out->allowClickjacking();
-               $out->setSubtitle(
-                       $this->msg( 'javascripttest-backlink' )
-                               ->rawParams( Linker::linkKnown( $this->getPageTitle() ) )
-               );
+               if ( count( self::$frameworks ) !== 1 ) {
+                       // If there's only one framework, don't set the subtitle since it
+                       // is going to redirect back to this page
+                       $out->setSubtitle(
+                               $this->msg( 'javascripttest-backlink' )
+                                       ->rawParams( Linker::linkKnown( $this->getPageTitle() ) )
+                       );
+               }
 
                // Custom actions
                if ( isset( $pars[1] ) ) {
@@ -134,13 +143,15 @@ class SpecialJavaScriptTest extends SpecialPage {
        }
 
        /**
-        * Wrap HTML contents in a summary container.
+        * Get summary text wrapped in a container
         *
-        * @param string $html HTML contents to be wrapped
         * @return string HTML
         */
-       private function wrapSummaryHtml( $html ) {
-               return "<div id=\"mw-javascripttest-summary\">$html</div>";
+       private function getSummaryHtml() {
+               $summary = $this->msg( 'javascripttest-qunit-intro' )
+                       ->params( 'https://www.mediawiki.org/wiki/Manual:JavaScript_unit_testing' )
+                       ->parseAsBlock();
+               return "<div id=\"mw-javascripttest-summary\">$summary</div>";
        }
 
        /**
@@ -153,17 +164,13 @@ class SpecialJavaScriptTest extends SpecialPage {
 
                $modules = $out->getResourceLoader()->getTestModuleNames( 'qunit' );
 
-               $summary = $this->msg( 'javascripttest-qunit-intro' )
-                       ->params( 'https://www.mediawiki.org/wiki/Manual:JavaScript_unit_testing' )
-                       ->parseAsBlock();
-
                $baseHtml = <<<HTML
 <div class="mw-content-ltr">
 <div id="qunit"></div>
 </div>
 HTML;
 
-               $out->addHtml( $this->wrapSummaryHtml( $summary ) . $baseHtml );
+               $out->addHtml( $this->getSummaryHtml() . $baseHtml );
 
                // The testrunner configures QUnit and essentially depends on it. However, test suites
                // are reusable in environments that preload QUnit (or a compatibility interface to
@@ -249,10 +256,12 @@ HTML;
                );
 
                $head = trim( $styles['html'] . $scripts['html'] );
+               $summary = $this->getSummaryHtml();
                $html = <<<HTML
 <!DOCTYPE html>
 <title>QUnit</title>
 $head
+$summary
 <div id="qunit"></div>
 HTML;
                $html .= "\n" . Html::linkedScript( $url );
index 7ffaf48..67683f2 100644 (file)
@@ -135,7 +135,7 @@ class LinkSearchPage extends QueryPage {
                if ( !$this->getConfig()->get( 'MiserMode' ) ) {
                        $fields += array(
                                'namespace' => array(
-                                       'class' => 'HTMLSelectNamespace',
+                                       'type' => 'namespaceselect',
                                        'name' => 'namespace',
                                        'label-message' => 'linksearch-ns',
                                        'default' => $namespace,
@@ -148,7 +148,7 @@ class LinkSearchPage extends QueryPage {
                $hiddenFields = array(
                        'title' => $this->getPageTitle()->getPrefixedDBkey(),
                );
-               $htmlForm = HTMLForm::factory( 'inline', $fields, $this->getContext() );
+               $htmlForm = HTMLForm::factory( 'ooui', $fields, $this->getContext() );
                $htmlForm->addHiddenFields( $hiddenFields );
                $htmlForm->setSubmitTextMsg( 'linksearch-ok' );
                $htmlForm->setWrapperLegendMsg( 'linksearch' );
index ae1fefe..5682657 100644 (file)
@@ -28,7 +28,7 @@
  */
 class MovePageForm extends UnlistedSpecialPage {
        /** @var Title */
-       protected $oldTitle;
+       protected $oldTitle = null;
 
        /** @var Title */
        protected $newTitle;
@@ -75,9 +75,12 @@ class MovePageForm extends UnlistedSpecialPage {
                // Yes, the use of getVal() and getText() is wanted, see bug 20365
 
                $oldTitleText = $request->getVal( 'wpOldTitle', $target );
-               $this->oldTitle = Title::newFromText( $oldTitleText );
+               if ( is_string( $oldTitleText ) ) {
+                       $this->oldTitle = Title::newFromText( $oldTitleText );
+               }
 
-               if ( is_null( $this->oldTitle ) ) {
+               if ( $this->oldTitle === null ) {
+                       // Either oldTitle wasn't passed, or newFromText returned null
                        throw new ErrorPageError( 'notargettitle', 'notargettext' );
                }
                if ( !$this->oldTitle->exists() ) {
index 5732ef9..d7e75bc 100644 (file)
@@ -149,7 +149,8 @@ class PageArchive {
                        $fields,
                        $conds,
                        $join_conds,
-                       $options
+                       $options,
+                       ''
                );
 
                return $dbr->select( $tables,
index 472fdb7..8491f89 100644 (file)
@@ -529,9 +529,9 @@ class LoginForm extends SpecialPage {
 
                # Now create a dummy user ($u) and check if it is valid
                $u = User::newFromName( $this->mUsername, 'creatable' );
-               if ( !is_object( $u ) ) {
+               if ( !$u ) {
                        return Status::newFatal( 'noname' );
-               } elseif ( 0 != $u->idForName() ) {
+               } elseif ( 0 != $u->idForName( User::READ_LOCKING ) ) {
                        return Status::newFatal( 'userexists' );
                }
 
@@ -545,7 +545,7 @@ class LoginForm extends SpecialPage {
                        }
 
                        # check for password validity, return a fatal Status if invalid
-                       $validity = $u->checkPasswordValidity( $this->mPassword );
+                       $validity = $u->checkPasswordValidity( $this->mPassword, 'create' );
                        if ( !$validity->isGood() ) {
                                $validity->ok = false; // make sure this Status is fatal
                                return $validity;
@@ -948,7 +948,10 @@ class LoginForm extends SpecialPage {
                                        } elseif ( $wgInvalidPasswordReset
                                                && !$user->isValidPassword( $this->mPassword )
                                        ) {
-                                               $status = $user->checkPasswordValidity( $this->mPassword );
+                                               $status = $user->checkPasswordValidity(
+                                                       $this->mPassword,
+                                                       'login'
+                                               );
                                                $this->resetLoginForm(
                                                        $status->getMessage( 'resetpass-validity-soft' )
                                                );
@@ -1387,6 +1390,7 @@ class LoginForm extends SpecialPage {
                        : is_array( $wgPasswordResetRoutes ) && in_array( true, array_values( $wgPasswordResetRoutes ) );
 
                $template->set( 'header', '' );
+               $template->set( 'formheader', '' );
                $template->set( 'skin', $this->getSkin() );
                $template->set( 'name', $this->mUsername );
                $template->set( 'password', $this->mPassword );
index 0a91957..4fb6772 100644 (file)
@@ -575,7 +575,10 @@ class SpecialVersion extends SpecialPage {
                if ( count( $tags ) ) {
                        $out = Html::rawElement(
                                'h2',
-                               array( 'class' => 'mw-headline plainlinks' ),
+                               array(
+                                       'class' => 'mw-headline plainlinks',
+                                       'id' => 'mw-version-parser-extensiontags',
+                               ),
                                Linker::makeExternalLink(
                                        '//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Tag_extensions',
                                        $this->msg( 'version-parser-extensiontags' )->parse(),
@@ -615,7 +618,10 @@ class SpecialVersion extends SpecialPage {
                if ( count( $fhooks ) ) {
                        $out = Html::rawElement(
                                'h2',
-                               array( 'class' => 'mw-headline plainlinks' ),
+                               array(
+                                       'class' => 'mw-headline plainlinks',
+                                       'id' => 'mw-version-parser-function-hooks',
+                               ),
                                Linker::makeExternalLink(
                                        '//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Parser_functions',
                                        $this->msg( 'version-parser-function-hooks' )->parse(),
index be77e62..69a8074 100644 (file)
@@ -314,7 +314,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                static $msgcache = null;
                if ( $msgcache === null ) {
                        static $msgs = array( 'isredirect', 'istemplate', 'semicolon-separator',
-                               'whatlinkshere-links', 'isimage' );
+                               'whatlinkshere-links', 'isimage', 'edit' );
                        $msgcache = array();
                        foreach ( $msgs as $msg ) {
                                $msgcache[$msg] = $this->msg( $msg )->escaped();
@@ -355,7 +355,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                }
 
                # Space for utilities links, with a what-links-here link provided
-               $wlhLink = $this->wlhLink( $nt, $msgcache['whatlinkshere-links'] );
+               $wlhLink = $this->wlhLink( $nt, $msgcache['whatlinkshere-links'], $msgcache['edit'] );
                $wlh = Xml::wrapClass(
                        $this->msg( 'parentheses' )->rawParams( $wlhLink )->escaped(),
                        'mw-whatlinkshere-tools'
@@ -370,18 +370,29 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                return Xml::closeElement( 'ul' );
        }
 
-       protected function wlhLink( Title $target, $text ) {
+       protected function wlhLink( Title $target, $text, $editText ) {
                static $title = null;
                if ( $title === null ) {
                        $title = $this->getPageTitle();
                }
 
+               $editLink = '';
+               if ( $this->getUser()->isAllowed( 'edit' ) ) {
+                       $editLink = $this->msg( 'pipe-separator' )->escaped() .
+                               Linker::linkKnown(
+                                       $target,
+                                       $editText,
+                                       array(),
+                                       array( 'action' => 'edit' )
+                               );
+               }
+
                return Linker::linkKnown(
                        $title,
                        $text,
                        array(),
                        array( 'target' => $target->getPrefixedText() )
-               );
+               ) . $editLink;
        }
 
        function makeSelfLink( $text, $query ) {
index f09b6bb..c17d575 100644 (file)
@@ -73,6 +73,12 @@ class UsercreateTemplate extends BaseTemplate {
                        <?php } ?>
                        </div>
 
+                       <?php if ( $this->data['formheader'] ) { ?>
+                               <div class="mw-form-formheader">
+                                       <?php $this->html( 'formheader' ); /* extensions such as MobileFrontend add html here */ ?>
+                               </div>
+                       <?php } ?>
+
                        <div class="mw-ui-vform-field">
                                <label for='wpName2'>
                                        <?php $this->msg( 'userlogin-yourname' ); ?>
index 345bb71..4a0b413 100644 (file)
@@ -56,6 +56,11 @@ class UserloginTemplate extends BaseTemplate {
                                </div>
                        <?php } ?>
 
+                       <?php if ( $this->data['formheader'] ) { ?>
+                               <div class="mw-form-formheader">
+                                       <?php $this->html( 'formheader' ); /* extensions such as MobileFrontend add html here */ ?>
+                               </div>
+                       <?php } ?>
                        <div class="mw-ui-vform-field">
                                <label for='wpName1'>
                                        <?php
index 426c752..493df2e 100644 (file)
@@ -1935,7 +1935,7 @@ abstract class UploadBase {
        public static function getSessionStatus( User $user, $statusKey ) {
                $key = wfMemcKey( 'uploadstatus', $user->getId() ?: md5( $user->getName() ), $statusKey );
 
-               return wfGetCache( CACHE_ANYTHING )->get( $key );
+               return ObjectCache::getMainStashInstance()->get( $key );
        }
 
        /**
@@ -1951,7 +1951,7 @@ abstract class UploadBase {
        public static function setSessionStatus( User $user, $statusKey, $value ) {
                $key = wfMemcKey( 'uploadstatus', $user->getId() ?: md5( $user->getName() ), $statusKey );
 
-               $cache = wfGetCache( CACHE_ANYTHING );
+               $cache = ObjectCache::getMainStashInstance();
                if ( $value === false ) {
                        $cache->delete( $key );
                } else {
index 4c099b3..f578745 100644 (file)
@@ -195,7 +195,7 @@ class UploadFromUrl extends UploadBase {
         */
        public function fetchFile( $httpOptions = array() ) {
                if ( !Http::isValidURI( $this->mUrl ) ) {
-                       return Status::newFatal( 'http-invalid-url' );
+                       return Status::newFatal( 'http-invalid-url', $this->mUrl );
                }
 
                if ( !self::isAllowedHost( $this->mUrl ) ) {
index 10064b2..a0d7703 100644 (file)
@@ -3,6 +3,7 @@ Authors (alphabetically)
 Alex Monk <krenair@wikimedia.org>
 Bartosz Dziewoński <bdziewonski@wikimedia.org>
 Ed Sanders <esanders@wikimedia.org>
+Florian Schmidt <florian.schmidt.welzow@t-online.de>
 James D. Forrester <jforrester@wikimedia.org>
 Roan Kattouw <roan@wikimedia.org>
 Sucheta Ghoshal <sghoshal@wikimedia.org>
diff --git a/includes/widget/NamespaceInputWidget.php b/includes/widget/NamespaceInputWidget.php
new file mode 100644 (file)
index 0000000..2d69ed7
--- /dev/null
@@ -0,0 +1,127 @@
+<?php
+/**
+ * MediaWiki Widgets – NamespaceInputWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+namespace MediaWiki\Widget;
+
+/**
+ * Namespace input widget. Displays a dropdown box with the choice of available namespaces, plus two
+ * checkboxes to include associated namespace or to invert selection.
+ */
+class NamespaceInputWidget extends \OOUI\Widget {
+
+       protected $namespace = null;
+       protected $associated = null;
+       protected $invert = null;
+       protected $allValue = null;
+
+       /**
+        * @param array $config Configuration options
+        * @param string $config['nameNamespace'] HTML input name for the namespace dropdown box (default:
+        *     'namespace')
+        * @param string $config['nameInvert'] HTML input name for the "invert selection" checkbox. If
+        *     null, the checkbox will not be generated. (default: 'invert')
+        * @param string $config['nameAssociated'] HTML input name for the "include associated namespace"
+        *     checkbox. If null, the checkbox will not be generated. (default: 'associated')
+        * @param string $config['includeAllValue'] If specified, add a "all namespaces" option to the
+        *     namespace dropdown, and use this as the input value for it
+        * @param int|string $config['valueNamespace'] Input value of the namespace dropdown box. May be a
+        *     string only if 'includeAllValue' is set.
+        * @param boolean $config['valueInvert'] Input value of the "invert selection" checkbox (default:
+        *     false)
+        * @param boolean $config['valueAssociated'] Input value of the "include associated namespace"
+        *     checkbox (default: false)
+        * @param string $config['labelInvert'] Text of label to use for "invert selection" checkbox
+        * @param string $config['labelAssociated'] Text of label to use for "include associated
+        *     namespace" checkbox
+        */
+       public function __construct( array $config = array() ) {
+               // Configuration initialization
+               $config = array_merge(
+                       array(
+                               'nameNamespace' => 'namespace',
+                               'nameInvert' => 'invert',
+                               'nameAssociated' => 'associated',
+                               // Choose first available: either main namespace or the "all namespaces" option
+                               'valueNamespace' => null,
+                               'valueInvert' => false,
+                               'valueAssociated' => false,
+                       ),
+                       $config
+               );
+
+               // Parent constructor
+               parent::__construct( $config );
+
+               // Properties
+               $this->allValue = isset( $config['includeAllValue'] ) ? $config['includeAllValue'] : null;
+               $this->namespace = new \OOUI\DropdownInputWidget( array(
+                       'name' => $config['nameNamespace'],
+                       'value' => $config['valueNamespace'],
+                       'options' => $this->getNamespaceDropdownOptions( $config ),
+               ) );
+               if ( $config['nameAssociated'] !== null ) {
+                       // FIXME Should use a LabelWidget? But they don't work like HTML <label>s yet
+                       $this->associated = new \OOUI\FieldLayout(
+                               new \OOUI\CheckboxInputWidget( array(
+                                       'name' => $config['nameAssociated'],
+                                       'selected' => $config['valueAssociated'],
+                                       'value' => '1',
+                               ) ),
+                               array(
+                                       'align' => 'inline',
+                                       'label' => $config['labelAssociated'],
+                               )
+                       );
+               }
+               if ( $config['nameInvert'] !== null ) {
+                       $this->invert = new \OOUI\FieldLayout(
+                               new \OOUI\CheckboxInputWidget( array(
+                                       'name' => $config['nameInvert'],
+                                       'selected' => $config['valueInvert'],
+                                       'value' => '1',
+                               ) ),
+                               array(
+                                       'align' => 'inline',
+                                       'label' => $config['labelInvert'],
+                               )
+                       );
+               }
+
+               // Initialization
+               $this
+                       ->addClasses( array( 'mw-widget-namespaceInputWidget' ) )
+                       ->appendContent( $this->namespace, $this->associated, $this->invert );
+       }
+
+       protected function getNamespaceDropdownOptions( array $config ) {
+               $namespaceOptionsParams = isset( $config['includeAllValue'] ) ?
+                       array( 'all' => $config['includeAllValue'] ) : array();
+               $namespaceOptions = \Html::namespaceSelectorOptions( $namespaceOptionsParams );
+
+               $options = array();
+               foreach( $namespaceOptions as $id => $name ) {
+                       $options[] = array(
+                               'data' => (string)$id,
+                               'label' => $name,
+                       );
+               }
+
+               return $options;
+       }
+
+       protected function getJavaScriptClassName() {
+               return 'mw.widgets.NamespaceInputWidget';
+       }
+
+       public function getConfig( &$config ) {
+               $config['namespace'] = $this->namespace;
+               $config['associated'] = $this->associated;
+               $config['invert'] = $this->invert;
+               $config['allValue'] = $this->allValue;
+               return parent::getConfig( $config );
+       }
+}
index 173dbb0..d3e2851 100644 (file)
@@ -7,37 +7,47 @@
  */
 namespace MediaWiki\Widget;
 
-use OOUI\TextInputWidget;
-
 /**
  * Title input widget.
  */
-class TitleInputWidget extends TextInputWidget {
+class TitleInputWidget extends \OOUI\TextInputWidget {
 
        protected $namespace = null;
+       protected $relative = null;
 
        /**
         * @param array $config Configuration options
-        * @param number|null $config['namespace'] Namespace to prepend to queries
+        * @param int|null $config['namespace'] Namespace to prepend to queries
+        * @param bool|null $config['relative'] If a namespace is set, return a title relative to it (default: true)
         */
        public function __construct( array $config = array() ) {
                // Parent constructor
                parent::__construct( array_merge( $config, array( 'infusable' => true ) ) );
 
-               // Properties
+               // Properties, which are ignored in PHP and just shipped back to JS
                if ( isset( $config['namespace'] ) ) {
-                       // Actually ignored in PHP, we just ship it back to JS
                        $this->namespace = $config['namespace'];
                }
 
+               if ( isset( $config['relative'] ) ) {
+                       $this->relative = $config['relative'];
+               }
+
                // Initialization
-               $this->addClasses( array( 'mw-widget-TitleInputWidget' ) );
+               $this->addClasses( array( 'mw-widget-titleInputWidget' ) );
+       }
+
+       protected function getJavaScriptClassName() {
+               return 'mw.widgets.TitleInputWidget';
        }
 
        public function getConfig( &$config ) {
                if ( $this->namespace !== null ) {
                        $config['namespace'] = $this->namespace;
                }
+               if ( $this->relative !== null ) {
+                       $config['relative'] = $this->relative;
+               }
                return parent::getConfig( $config );
        }
 }
diff --git a/includes/widget/UserInputWidget.php b/includes/widget/UserInputWidget.php
new file mode 100644 (file)
index 0000000..e5663c3
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+/**
+ * MediaWiki Widgets – UserInputWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+namespace MediaWiki\Widget;
+
+/**
+ * User input widget.
+ */
+class UserInputWidget extends \OOUI\TextInputWidget {
+
+       /**
+        * @param array $config Configuration options
+        */
+       public function __construct( array $config = array() ) {
+               // Parent constructor
+               parent::__construct( array_merge( $config, array( 'infusable' => true ) ) );
+
+               // Initialization
+               $this->addClasses( array( 'mw-widget-userInputWidget' ) );
+       }
+
+       protected function getJavaScriptClassName() {
+               return 'mw.widgets.UserInputWidget';
+       }
+}
index 58d1ee6..5dd4977 100644 (file)
@@ -7,7 +7,7 @@
        "--builtin-classes": true,
        "--processes": "0",
        "--warnings-exit-nonzero": true,
-       "--external": "HTMLElement,HTMLDocument,Window,File,MouseEvent,KeyboardEvent",
+       "--external": "HTMLElement,HTMLDocument,Window,File,MouseEvent,KeyboardEvent,HTMLIframeElement,HTMLInputElement,XMLDocument",
        "--output": "docs/js",
        "--": [
                "maintenance/jsduck/external.js",
index fe0bd7e..b698beb 100644 (file)
@@ -254,10 +254,16 @@ class Language {
         * @since 1.21
         */
        public static function isSupportedLanguage( $code ) {
-               return self::isValidBuiltInCode( $code )
-                       && ( is_readable( self::getMessagesFileName( $code ) )
-                               || is_readable( self::getJsonMessagesFileName( $code ) )
-               );
+               if ( !self::isValidBuiltInCode( $code ) ) {
+                       return false;
+               }
+
+               if ( $code === 'qqq' ) {
+                       return false;
+               }
+
+               return is_readable( self::getMessagesFileName( $code ) ) ||
+                       is_readable( self::getJsonMessagesFileName( $code ) );
        }
 
        /**
@@ -547,10 +553,8 @@ class Language {
        }
 
        /**
-        * A convenience function that returns the same thing as
-        * getNamespaces() except with the array values changed to ' '
-        * where it found '_', useful for producing output to be displayed
-        * e.g. in <select> forms.
+        * A convenience function that returns getNamespaces() with spaces instead of underscores
+        * in values. Useful for producing output to be displayed e.g. in `<select>` forms.
         *
         * @return array
         */
@@ -564,6 +568,7 @@ class Language {
 
        /**
         * Get a namespace value by key
+        *
         * <code>
         * $mw_ns = $wgContLang->getNsText( NS_MEDIAWIKI );
         * echo $mw_ns; // prints 'MediaWiki'
@@ -574,7 +579,6 @@ class Language {
         */
        function getNsText( $index ) {
                $ns = $this->getNamespaces();
-
                return isset( $ns[$index] ) ? $ns[$index] : false;
        }
 
@@ -593,7 +597,6 @@ class Language {
         */
        function getFormattedNsText( $index ) {
                $ns = $this->getNsText( $index );
-
                return strtr( $ns, '_', ' ' );
        }
 
index 6d537d3..d44e68f 100644 (file)
        'bat-smg' => 'žemaitėška', # Samogitian (deprecated code, 'sgs' in ISO 693-3 since 2010-06-30 )
        'bbc' => 'Batak Toba', # Batak Toba (falls back to bbc-latn)
        'bbc-latn' => 'Batak Toba', # Batak Toba
-       'bcc' => 'بÙ\84Ù\88Ú\86Û\8c Ù\85کراÙ\86Û\8c', # Southern Balochi
+       'bcc' => 'جÙ\87Ù\84سرÛ\8c Ø¨Ù\84Ù\88Ú\86Û\8c', # Southern Balochi
        'bcl' => 'Bikol Central', # Bikol: Central Bicolano language
        'be' => 'беларуская', #  Belarusian normative
        'be-tarask' => "беларуская (тарашкевіца)\xE2\x80\x8E",     # Belarusian in Taraskievica orthography
        'be-x-old' => "беларуская (тарашкевіца)\xE2\x80\x8E",      # (be-tarask compat)
        'bg' => 'български',   # Bulgarian
-       'bgn' => 'بÙ\84Ù\88Ú\86Û\8c Ø±Ø®Ø´Ø§Ù\86Û\8c', # Western Balochi
+       'bgn' => 'رÙ\88Ú\86 Ú©Ù¾ØªÛ\8cÙ\86 Ø¨Ù\84Ù\88Ú\86Û\8c', # Western Balochi
        'bh' => 'भोजपुरी',        # Bihari macro language. Falls back to Bhojpuri (bho)
        'bho' => 'भोजपुरी',       # Bhojpuri
        'bi' => 'Bislama',              # Bislama
        'lt' => 'lietuvių',    # Lithuanian
        'ltg' => 'latgaļu',    # Latgalian
        'lus' => 'Mizo ţawng', # Mizo/Lushai
+       'luz' => 'لئری جئنوٙڤی', # Southern Luri
        'lv' => 'latviešu',    # Latvian
        'lzh' => '文言',      # Literary Chinese, bug 8217
        'lzz' => 'Lazuri',      # Laz
index f11d703..923e65e 100644 (file)
@@ -21,7 +21,8 @@
                        "පසිඳු කාවින්ද",
                        "아라",
                        "Macofe",
-                       "Fwolff"
+                       "Fwolff",
+                       "Oesjaar"
                ]
        },
        "tog-underline": "Onderstreep skakels.",
        "passwordreset": "Herstel wagwoord",
        "passwordreset-text-one": "Voltooi hierdie vorm om u wagwoord te herstel.",
        "passwordreset-text-many": "{{PLURAL:$1|Vul een van die velde in om 'n tydelike wagwoord per e-pos te ontvang.}}",
-       "passwordreset-legend": "Kry nuwe wagwoord",
        "passwordreset-disabled": "Die herskik van U wagwoord is gedeaktiveer op hierdie wiki.",
        "passwordreset-emaildisabled": "E-posfunksies is afgeskakel op hierdie wiki.",
        "passwordreset-username": "Gebruiker:",
        "randomincategory-invalidcategory": "\"$1\" is nie 'n geldige kategorienaam nie.",
        "randomincategory-nopages": "Daar is geen bladsye in kategorie [[:Category:$1|$1]].",
        "randomincategory-category": "Kategorie:",
+       "randomincategory-submit": "Laat waai",
        "randomredirect": "Lukrake aanstuur",
        "randomredirect-nopages": "Daar is geen aansture in naamruimte \"$1\" nie.",
        "statistics": "Statistieke",
        "nmembers": "$1 {{PLURAL:$1|lid|lede}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|lid|lede}}",
        "nrevisions": "$1 {{PLURAL:$1|weergawe|weergawes}}",
-       "nviews": "$1 {{PLURAL:$1|keer|kere}} aangevra",
        "nimagelinks": "Gebruik op {{PLURAL:$1|een bladsy|$1 bladsye}}",
        "ntransclusions": "gebruik op {{PLURAL:$1|een bladsy|$1 bladsye}}",
        "specialpage-empty": "Die verslag lewer geen resultate nie.",
        "linksearch-pat": "Soekpatroon:",
        "linksearch-ns": "Naamruimte:",
        "linksearch-ok": "Soek",
-       "linksearch-text": "Patrone soos \"*.wikipedia.org\" kan gebruik word.<br />\nBenodig ten minste een topvlakdomein, soos byvoorbeeld \"*.org\".<br />\n{{PLURAL:$2|Ondersteunde protokol|Ondersteunde protokolle}}: <code>$1</code> (http:// word gebruik as niks gespesifiseer is nie)",
+       "linksearch-text": "Patrone soos \"*.wikipedia.org\" kan gebruik word.<br />\nBenodig ten minste een topvlakdomein, soos byvoorbeeld \"*.org\".<br />\n{{PLURAL:$2|Ondersteunde protokol|Ondersteunde protokolle}}: $1 (http:// word gebruik as niks gespesifiseer is nie)",
        "linksearch-line": "$1 geskakel vanaf $2",
        "linksearch-error": "Patrone kan slegs aan die begin van die rekenaarnaam geplaas word.",
        "listusersfrom": "Wys gebruikers, beginnende by:",
        "htmlform-cloner-create": "Meer meer by",
        "htmlform-cloner-delete": "Verwyder",
        "htmlform-cloner-required": "Ten minste één waarde verwag.",
+       "htmlform-title-badnamespace": "[[:$1]] is nie in die \"{{ns:$2}}\" naamspasie nie.",
+       "htmlform-title-not-creatable": "\"$1\" is nie 'n aanvaarbare blad titel nie",
+       "htmlform-title-not-exists": "[[:$1]] bestaan nie.",
        "sqlite-has-fts": "Weergawe $1 met ondersteuning vir vol-teks soektogte (\"full-text search\")",
        "sqlite-no-fts": "Weergawe $1 sonder ondersteuning vir vol-teks soektogte (\"full-text search\")",
        "logentry-delete-delete": "$1 {{GENDER:$2|het}} bladsy $3 verwyder",
index e88507f..79d4200 100644 (file)
        "resetpass-wrong-oldpass": "A clau actual u temporal no ye conforme.\nTalment ya ha cambiato a suya clau u ha demandato una nueva clau temporal.",
        "resetpass-temp-password": "Clau temporal:",
        "passwordreset": "Restablir a clau d'acceso",
-       "passwordreset-legend": "Restablir a clau d'acceso",
        "passwordreset-disabled": "S'ha desactivau o restablimiento de claus en ista wiki.",
        "passwordreset-username": "Nombre d'usuario:",
        "passwordreset-domain": "Dominio:",
        "nlinks": "$1 {{PLURAL:$1|vinclo|vinclos}}",
        "nmembers": "$1 {{PLURAL:$1|miembro|miembros}}",
        "nrevisions": "$1 {{PLURAL:$1|versión|versions}}",
-       "nviews": "$1 {{PLURAL:$1|vesita|vesitas}}",
        "nimagelinks": "S'emplega en $1 {{PLURAL:$1|pachina|pachinas}}",
        "ntransclusions": "s'emplega en $1 {{PLURAL:$1|pachina|pachinas}}",
        "specialpage-empty": "Ista pachina ye bueda.",
        "linksearch-pat": "Mirar patrón:",
        "linksearch-ns": "Espacio de nombres:",
        "linksearch-ok": "Mirar",
-       "linksearch-text": "Pueden usar-se carácters comodín como \"*.wikipedia.org\".\nA lo menos aprecisa un dominio de maximo libel, como \"*.org\".<br />\nProtocolos suportados: <code>$1</code> (no los adhiba en a suya busca).",
+       "linksearch-text": "Pueden usar-se carácters comodín como \"*.wikipedia.org\".\nA lo menos aprecisa un dominio de maximo libel, como \"*.org\".<br />\nProtocolos suportados: $1 (no los adhiba en a suya busca).",
        "linksearch-line": "$1 tiene un vinclo dende $2",
        "linksearch-error": "Os carácters comodín nomás pueden apareixer en o prencipio d'o nombre d'o sitio.",
        "listusersfrom": "Amostrar usuarios que o nombre suyo prencipie por:",
index c8667e9..aa9f7ac 100644 (file)
@@ -51,7 +51,8 @@
                        "Khaled",
                        "Emara",
                        "Macofe",
-                       "Yahya Sakhnini"
+                       "Yahya Sakhnini",
+                       "Mervat Salman"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "badtitle": "عنوان سيء",
        "badtitletext": "عنوان الصفحة المطلوب إما غير صحيح أو فارغ، وربما الرابط بين اللغات أو بين المشاريع خاطئ.\nربما يحوي محارف لا تصلح للاستخدام في العناوين.",
        "title-invalid-empty": "عنوان الصفحة المطلوبة فارغ أو يحتوي اسم النطاق فقط.",
+       "title-invalid-utf8": "عنوان الصفحة المطلوب يحتوي سلسلة محارف UTF-8 غير صالحة.",
        "title-invalid-interwiki": "عنوان الصفحة المطلوب يتضمن وصلة لحلقة لغة وهو ما لا يمكن استخدامه في العناوين.",
        "title-invalid-talk-namespace": "عنوان الصفحة المطلوبة يشير إلى صفحة نقاش غير موجودة.",
        "title-invalid-characters": "عنوان الصفحة المطلوب يتضمن محارف غير صالحة: \"$1\"",
        "linksearch-pat": "نمط البحث:",
        "linksearch-ns": "النطاق:",
        "linksearch-ok": "بحث",
-       "linksearch-text": "Wildcards مثل \"*.wikipedia.org\" يمكن استخدامها.\nتحتاج على الأقل إلى نطاق ذو مستوى أعلى، كمثال \"*.org\".<br />\n{{PLURAL:$2|البروتوكول المدعوم|البروتوكولان المدعومان|البروتوكولات المدعومة}}: <code>$1</code> (تتم إضافة http:// تلقائيا عند عدم تحديد أي بروتوكول).",
+       "linksearch-text": "Wildcards مثل \"*.wikipedia.org\" يمكن استخدامها.\nتحتاج على الأقل إلى نطاق ذو مستوى أعلى، كمثال \"*.org\".<br />\n{{PLURAL:$2|البروتوكول المدعوم|البروتوكولان المدعومان|البروتوكولات المدعومة}}: $1 (تتم إضافة http:// تلقائيا عند عدم تحديد أي بروتوكول).",
        "linksearch-line": "$1 موصولة من $2",
        "linksearch-error": "الكروت الخاصة يمكن أن تظهر فقط في بداية اسم المضيف.",
        "listusersfrom": "اعرض المستخدمين ابتداء من:",
        "tags-activate-not-found": "الوسم \"$1\" غير موجود.",
        "tags-activate-submit": "تفعيل",
        "tags-deactivate-title": "عطل الوسم",
+       "tags-deactivate-question": "أنت على وشك تعطيل الوسم \"$1\".",
        "tags-deactivate-reason": "سبب",
        "tags-deactivate-not-allowed": "من غير الممكن تعطيل الوسم \"$1\".",
        "tags-deactivate-submit": "عطل",
        "htmlform-cloner-create": "إضافة المزيد",
        "htmlform-cloner-delete": "إزالة",
        "htmlform-cloner-required": "مطلوب قيمة واحدة على الأقل.",
+       "htmlform-user-not-exists": "<strong>$1</strong> غير موجود",
+       "htmlform-user-not-valid": "اسم المستخدم <strong>$1</strong> غير صالح.",
        "sqlite-has-fts": "$1 بدعم البحث في كامل النص",
        "sqlite-no-fts": "$1 بدون دعم البحث في كامل النص",
        "logentry-delete-delete": "{{GENDER:$2|حذف|حذفت}} $1 صفحة $3",
index 5e55cf6..36e80bf 100644 (file)
@@ -97,6 +97,7 @@
        "actions": "Femün",
        "namespaces": "Üytun ñi wellin",
        "variants": "Kaleyelu",
+       "navigation-heading": "Chewngen",
        "errorpagetitle": "Welulkan",
        "returnto": "Amutun $1 püle.",
        "tagline": "{{SITENAME}} mew",
        "articlepage": "Adkintun trokiñdungu wülngiñ",
        "talk": "Nütramkawün",
        "views": "Adngelün",
-       "toolbox": "Küdawpeyüm",
+       "toolbox": "Küdzawpeyüm",
        "userpage": "Adkintun kellufe ñi wülngiñ",
        "projectpage": "Adkintun zeumanzugu wülngiñ",
        "imagepage": "Adkintun ad wülngiñ",
        "createaccountreason": "Dungu:",
        "mailmypassword": "Amulün we nülawe werküwe mew",
        "loginlanguagelabel": "Cezugun: $1",
+       "pt-login": "Konkülen",
        "resetpass-submit-cancel": "Katrüntukun",
        "bold_sample": "Kurükünualu wirin",
        "bold_tip": "Kurükünualu wirin",
        "withoutinterwiki-submit": "Pegelpe",
        "nbytes": "$1 {{PLURAL:$1 byte}}",
        "nmembers": "$1 {{PLURAL:$1|koneltulu}}",
-       "nviews": "$1 {{PLURAL:$1|pen|pen}}",
        "prefixindex": "Kom wülngiñ engu wüne konkülelu nemül",
        "shortpages": "Pichi pakina",
        "usercreated": "{{GENDER:$3|Dewmangey}} $1, $2 mew",
        "tooltip-pt-login": "Feypingey tami Konküleal, welu mülelay mi femael",
        "tooltip-pt-logout": "Tripan",
        "tooltip-ca-talk": "Ngütramkawün wülgiñ ñi zungu mew",
-       "tooltip-ca-edit": "Kümeelaymi tüfachi wülngiñ. Elmekeaymi wüne pen petu eltukawam.",
+       "tooltip-ca-edit": "Elkünufinge tüfachi dungun.",
        "tooltip-ca-addsection": "Llitun we trokiñ",
        "tooltip-ca-viewsource": "Nürüfkünungey tüfachi wülngiñ. Kimaymi chew küpan chi wirin",
        "tooltip-ca-history": "Tüfachi wülngiñ ñi rupachi malün",
        "tag-filter": "[[Special:Tags|Tag]] ñi chaytuwe:",
        "tags-edit": "Wirin",
        "htmlform-selectorother-other": "Kakelu",
-       "rightsnone": "chemnorume"
+       "rightsnone": "chemnorume",
+       "searchsuggest-search": "Kintun"
 }
index 709e4c6..1c23594 100644 (file)
        "unusedtemplateswlh": "وصلات  تانيه",
        "randompage": "صفحة عشوائيه",
        "randompage-nopages": "مافيش صفحات فى النطاق {{PLURAL:$2|namespace|namespaces}}: $1.",
+       "randomincategory-submit": "اذهب",
        "randomredirect": "تحويله عشوائيه",
        "randomredirect-nopages": "مافيش تحويلات فى النطاق\"$1\".",
        "statistics": "احصائيات",
        "nlinks": "{{PLURAL:$1|وصله واحده|وصلتين|$1 وصلات|$1 وصله}}",
        "nmembers": "$1 {{PLURAL:$1|عضو|اعضاء}}",
        "nrevisions": "{{PLURAL:$1|تعديل وحيد|تعديلين|$1 تعديلات|$1 تعديل|$1}}",
-       "nviews": "{{PLURAL:$1|مشاهدة واحدة|مشاهدتين|$1 مشاهدات|$1 مشاهدة}}",
        "specialpage-empty": "مافيش نتايج للتقرير دا.",
        "lonelypages": "صفحات يتيمه",
        "lonelypagestext": "الصفحات دى ماعندهاش لينكات أو تضمينات من الصفحات التانية فى {{SITENAME}}.",
        "linksearch-pat": "نظام التدوير:",
        "linksearch-ns": "النطاق:",
        "linksearch-ok": "تدوير",
-       "linksearch-text": "الكروت الخاصه زى \"*.wikipedia.org\" ممكن تستخدم.\nمحتاجه على الاقل لدومين مستوى أعلى، زى \"*.org\".<br />\n{{PLURAL:$2|البروتوكول المدعوم|البروتوكولات المدعومه}}: <code>$1</code> (الافتراضى http:// لو ما اتحددش بروتوكول).",
+       "linksearch-text": "الكروت الخاصه زى \"*.wikipedia.org\" ممكن تستخدم.\nمحتاجه على الاقل لدومين مستوى أعلى، زى \"*.org\".<br />\n{{PLURAL:$2|البروتوكول المدعوم|البروتوكولات المدعومه}}: $1 (الافتراضى http:// لو ما اتحددش بروتوكول).",
        "linksearch-line": "$1 موصوله من $2",
        "linksearch-error": "الكروت الخاصة ممكن تبان بس  فى بداية اسم المضيف",
        "listusersfrom": "عرض اليوزرز من أول:",
index cac1671..bf23b71 100644 (file)
@@ -87,8 +87,8 @@
        "march": "মাৰ্চ",
        "april": "এপ্ৰিল",
        "may_long": "মে'",
-       "june": "জুন",
-       "july": "জুলাই",
+       "june": "june",
+       "july": "july",
        "august": "আগষ্ট",
        "september": "ছেপ্টেম্বৰ",
        "october": "অক্টোবৰ",
        "april-gen": "এপ্ৰিল",
        "may-gen": "মে’",
        "june-gen": "জুন",
-       "july-gen": "জুলাই",
+       "july-gen": "july",
        "august-gen": "আগষ্ট",
        "september-gen": "ছেপ্টেম্বৰ",
        "october-gen": "অক্টোবৰ",
        "newarticle": "(নতুন)",
        "newarticletext": "আপুনি বিচৰা প্ৰবন্ধটো বিচাৰি পোৱা নগ'ল।\n\nইচ্ছা কৰিলে আপুনিয়েই এই প্ৰবন্ধটো লিখা আৰম্ভ কৰিব পাৰে। [$1 ইয়াত] সহায় পাব।\n\nআপুনি যদি ইয়ালৈ ভুলতে আহিছে, তেনেহলে আপোনাৰ ব্ৰাওজাৰৰ '''BACK''' বুটামত টিপা মাৰক।",
        "anontalkpagetext": "----''এইখন আলোচনা পৃষ্ঠা বেনামী সদস্যৰ বাবে, যিয়ে নিজা একাউণ্ট  সৃষ্টি কৰা নাই বা যিয়ে সেই একাউণ্ট ব্যৱহাৰ নকৰে।\nএতেকে আমি তেখেতসকলক আই-পি ঠিকনাৰে চিনাক্ত কৰিবলৈ বাধ্য।\nসেই একেই আই-পি ঠিকনা অনেকেই ব্যৱহাৰ কৰিব পাৰে।\nআপুনি যদি এজন বেনামী সদস্য আৰু যদি আপুনি অনুভৱ কৰে যে আপোনাৰ প্ৰতি অপ্ৰাসঙ্গিক মন্তব্য কৰা হৈছে, তেনেহলে আন বেনামী সদস্যৰ পৰা পৃথক কৰিবলৈ \n[[Special:UserLogin/signup|একাউন্ট সৃষ্টি কৰক]] বা [[Special:UserLogin|প্ৰৱেশ কৰক]] ।''",
-       "noarticletext": "à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাত à¦¬à§°à§\8dতমান à¦\95à§\8bনà§\8b à¦ªà¦¾à¦ à§\8dয à¦¨à¦¾à¦\87 à¥¤\nà¦\86পà§\81নি à¦\86ন à¦ªà§\83ষà§\8dঠাত [[Special:Search/{{PAGENAME}}| à¦\8fà¦\87 à¦¶à¦¿à§°à§\8bনামা à¦\85নà§\81সনà§\8dধান à¦\95ৰিব à¦ªà¦¾à§°à§\87]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} à¦¸à¦®à§\8dপৰà§\8dà¦\95à§\80য় à¦\85ভিলà§\87à¦\96 à¦\85নà§\81সন্ধান কৰিব পাৰে],\nবা [{{fullurl:{{FULLPAGENAME}}|action=edit}} এই পৃষ্ঠা সম্পাদনা কৰিব পাৰে]</span>",
-       "noarticletext-nopermission": "à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাত à¦¬à§°à§\8dতমান à¦\95à§\8bনà§\8b à¦ªà¦¾à¦ à§\8dয à¦¨à¦¾à¦\87।\nà¦\86পà§\81নি à¦\86ন à¦ªà§\83ষà§\8dঠাত [[Special:Search/{{PAGENAME}}|à¦\8fà¦\87 à¦¶à¦¿à§°à§\8bনামা à¦\85নà§\81সনà§\8dধান à¦\95ৰিব à¦ªà¦¾à§°à§\87]],\nবা <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} à¦¸à¦®à§\8dপৰà§\8dà¦\95à§\80য় à¦\85ভিলà§\87à¦\96 à¦\85নà§\81সন্ধান কৰিব পাৰে]</span>, কিন্তু এই পৃষ্ঠা সৃষ্টি কৰিবলৈ আপোনাৰ অনুমতি নাই।",
+       "noarticletext": "à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাত à¦¬à§°à§\8dতমান à¦\95à§\8bনà§\8b à¦ªà¦¾à¦ à§\8dয à¦¨à¦¾à¦\87 à¥¤\nà¦\86পà§\81নি à¦\86ন à¦ªà§\83ষà§\8dঠাত [[Special:Search/{{PAGENAME}}| à¦\8fà¦\87 à¦¶à¦¿à§°à§\8bনামা à¦¸à¦¨à§\8dধান à¦\95ৰিব à¦ªà¦¾à§°à§\87]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} à¦¸à¦®à§\8dপৰà§\8dà¦\95à§\80য় à¦\85ভিলà§\87à¦\96 সন্ধান কৰিব পাৰে],\nবা [{{fullurl:{{FULLPAGENAME}}|action=edit}} এই পৃষ্ঠা সম্পাদনা কৰিব পাৰে]</span>",
+       "noarticletext-nopermission": "à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাত à¦¬à§°à§\8dতমান à¦\95à§\8bনà§\8b à¦ªà¦¾à¦ à§\8dয à¦¨à¦¾à¦\87।\nà¦\86পà§\81নি à¦\86ন à¦ªà§\83ষà§\8dঠাত [[Special:Search/{{PAGENAME}}|à¦\8fà¦\87 à¦¶à¦¿à§°à§\8bনামা à¦¸à¦¨à§\8dধান à¦\95ৰিব à¦ªà¦¾à§°à§\87]],\nবা <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} à¦¸à¦®à§\8dপৰà§\8dà¦\95à§\80য় à¦\85ভিলà§\87à¦\96 সন্ধান কৰিব পাৰে]</span>, কিন্তু এই পৃষ্ঠা সৃষ্টি কৰিবলৈ আপোনাৰ অনুমতি নাই।",
        "missing-revision": "\"{{FULLPAGENAME}}\" নামৰ পৃষ্ঠাৰ #$1 সংশোধনৰ অস্তিত্ব নাই।\n\nসাধাৰণতে বিলোপ কৰা এখন পৃষ্ঠাৰ পুৰণা ইতিহাস লিংক অনুসৰণ কৰিলে এনে হয়।\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} বিলোপন ল'গ]ত অধিক তথ্য পাব।",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" নামৰ সদস্য একাউন্ট নিবন্ধিত নহয় ।\nঅনুগ্ৰহ কৰি চাওক আপুনি এই পৃষ্ঠা সৃষ্টি/সম্পাদনা কৰিব বিচাৰিছে নেকি ।",
        "userpage-userdoesnotexist-view": "সদস্য একাউন্ট ''$1'' পঞ্জীভূত নহয়",
        "searchprofile-advanced": "উচ্চতৰ",
        "searchprofile-articles-tooltip": "$1-ত অনুসন্ধান কৰক",
        "searchprofile-images-tooltip": "ফাইলৰ বাবে অনুসন্ধান",
-       "searchprofile-everything-tooltip": "সà¦\95লà§\8b à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦\85নà§\81সনà§\8dধান à¦\95ৰà¦\95 (à¦\95থা-বতৰা পৃষ্ঠা সহ)",
+       "searchprofile-everything-tooltip": "সà¦\95লà§\8b à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦¸à¦¨à§\8dধান à¦\95ৰà¦\95 (à¦\86লà§\8bà¦\9aনা পৃষ্ঠা সহ)",
        "searchprofile-advanced-tooltip": "স্বনিৰ্ধাৰিত নামস্থানত অনুসন্ধান কৰক",
        "search-result-size": "$1 ({{PLURAL:$2|1 শব্দ|$2 শব্দসমূহ}})",
        "search-result-category-size": "{{PLURAL:$1|১ জন সদস্য|$1 জন সদস্য}} ({{PLURAL:$2|এটা উপশ্ৰেণী|$2 টা উপশ্ৰেণী}}, {{PLURAL:$3|এটা ফাইল|$3 টা ফাইল}})",
        "powersearch-togglenone": "একো নাই",
        "powersearch-remember": "ভৱিষ্যতৰ সন্ধানৰ বাবে বাছনি মনত ৰাখক।",
        "search-external": "বাহ্যিক সন্ধান",
-       "searchdisabled": "{{SITENAME}} à¦¤ à¦\85নà§\81সনà§\8dধান à¦\95ৰা à¦¸à¦¾à¦®à¦¯à¦¼à¦¿à¦\95 à¦­à¦¾à¦¬à§\87 à¦¨à¦¿à¦·à§\8dà¦\95à§\8dৰিয় à¦\95ৰা à¦¹à§\88à¦\9bà§\87।\nতà§\87তিয়ালà§\88à¦\95à§\87 à¦\97à§\81à¦\97লত à¦\85নà§\81সন্ধান কৰক।\nমনত ৰাখিব যে তেঁওলোকৰ {{SITENAME}}ৰ ইণ্ডেক্স পুৰণি হব পাৰে।",
+       "searchdisabled": "{{SITENAME}} à¦¤ à¦¸à¦¨à§\8dধান à¦\95ৰা à¦¸à¦¾à¦®à¦¯à¦¼à¦¿à¦\95 à¦­à¦¾à¦¬à§\87 à¦¨à¦¿à¦·à§\8dà¦\95à§\8dৰিয় à¦\95ৰা à¦¹à§\88à¦\9bà§\87।\nতà§\87তিয়ালà§\88à¦\95à§\87 à¦\97à§\81à¦\97লত সন্ধান কৰক।\nমনত ৰাখিব যে তেঁওলোকৰ {{SITENAME}}ৰ ইণ্ডেক্স পুৰণি হব পাৰে।",
        "search-error": "অনুসন্ধানৰ সময়ত এটা ত্ৰুটি হৈছে: $1",
        "preferences": "পছন্দসমূহ",
        "mypreferences": "পছন্দসমূহ",
        "prefs-editing": "সম্পাদন",
        "rows": "পথালী শাৰী:",
        "columns": "ঠিয় শাৰী:",
-       "searchresultshead": "à¦\85নà§\81সনà§\8dধান",
+       "searchresultshead": "সনà§\8dধান à¦\95ৰà¦\95",
        "stub-threshold": "<a href=\"#\" class=\"stub\">আধাৰ সংযোগ</a> ৰ সৰ্বোচ্চ আকাৰ (বাইটত):",
        "stub-threshold-disabled": "নিষ্ক্ৰিয়",
        "recentchangesdays": "শেহতীয়া সাল-সলনিত দেখুৱাব লগা দিন:",
        "upload_directory_read_only": "আপল’ড ডিৰেক্টৰি ($1) ৱেবচাৰ্ভাৰৰ দ্বাৰা লিখনযোগ্য নহয় ।",
        "uploaderror": "আপল’ডত সমস্যা হৈছে",
        "upload-recreate-warning": "'''সতৰ্কবাণী: এই নামৰ এটা ফাইল বিলোপ বা স্থানান্তৰ কৰা হৈছে । '''\n\nএই পৃষ্ঠাৰ অৱলুপ্তি ল’গ আৰু স্থানান্তৰ ল’গ আপোনাৰ সুবিধাৰ্থে তলত দিয়া হ’ল:",
-       "uploadtext": "ফাà¦\87ল à¦\86পলâ\80\99ড à¦\95ৰাৰ à¦¬à¦¾à¦¬à§\87 à¦¤à¦²à§° à¦ªà§\8dৰপতà§\8dৰ à¦¬à§\8dযৱহাৰ à¦\95ৰà¦\95। à¦ªà§\82ৰà§\8dবà§\87 à¦\86পলâ\80\99ড à¦\95ৰা à¦«à¦¾à¦\87ল à¦\9aাবলà§\88 à¦¬à¦¾ à¦\85নà§\81সনà§\8dধান à¦\95ৰিবলà§\88 [[Special:FileList|à¦\86পলâ\80\99ড à¦\95ৰা à¦«à¦¾à¦\87লৰ à¦¤à¦¾à¦²à¦¿à¦\95া]] à¦²à§\88 à¦¯à¦¾à¦\93à¦\95 à¥¤ (পà§\81নà¦\83) à¦\86পলâ\80\99ড à¦\95ৰা à¦«à¦¾à¦\87লৰ à¦¨à¦¾à¦® [[Special:Log/upload|à¦\86পলâ\80\99ড à¦\85ভিলà§\87à¦\96ত]] à¦­à§°à§\8dতি à¦¹à¦¯à¦¼, à¦¬à¦¿à¦²à§\8bপ à¦\95ৰা à¦«à¦¾à¦\87লৰ à¦¨à¦¾à¦® [[Special:Log/delete|à¦\85ৱলà§\81পà§\8dতি à¦\85ভিলà§\87à¦\96ত]] à¦ªà¦¾à¦¬ à¥¤\n\nà¦\95à§\8bনà§\8b à¦ªà§\83ষà§\8dঠাত à¦\9aিতà§\8dৰ à¦¬à¦¾ à¦«à¦¾à¦\87ল à¦¸à¦¨à§\8dনিবিষà§\8dà¦\9f à¦\95ৰিবৰ à¦¬à¦¾à¦¬à§\87 à¦¤à¦²à§° à¦ªà§\8dৰপতà§\8dৰসমà§\82হত à¦¥à¦\95া à¦¸à¦\82যà§\8bà¦\97 à¦¬à§\8dযৱহাৰ à¦\95ৰà¦\95: \n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''',\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' à¦\85থবা\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''",
+       "uploadtext": "ফাইল আপল’ড কৰাৰ বাবে তলৰ প্ৰপত্ৰ ব্যৱহাৰ কৰক। পূৰ্বে আপল’ড কৰা ফাইল চাবলৈ বা সন্ধান কৰিবলৈ [[Special:FileList|আপল’ড কৰা ফাইলৰ তালিকা]] লৈ যাওক । (পুনঃ) আপল’ড কৰা ফাইলৰ নাম [[Special:Log/upload|আপল’ড অভিলেখত]] ভৰ্তি হয়, বিলোপ কৰা ফাইলৰ নাম [[Special:Log/delete|অৱলুপ্তি অভিলেখত]] পাব ।\n\nকোনো পৃষ্ঠাত চিত্ৰ বা ফাইল সন্নিবিষ্ট কৰিবৰ বাবে তলৰ প্ৰপত্ৰসমূহত থকা সংযোগ ব্যৱহাৰ কৰক: \n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''',\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' অথবা\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''",
        "upload-permitted": "অনুমোদিত ফাইল ধৰণ: $1",
        "upload-preferred": "বাঞ্ছিত ফাইল ধৰণ: $1",
        "upload-prohibited": "বঞ্চিত ফাইল ধৰণ: $1",
        "upload_source_file": "(আপোনাৰ কম্পিউটাৰৰ এটা ফাইল)",
        "listfiles-delete": "বিলোপ কৰক",
        "listfiles-summary": "এই বিশেষ পৃষ্ঠাত সকলো আপল’ড হোৱা ফাইল দেখা পাব।",
-       "listfiles_search_for": "মিডিয়াৰ à¦¨à¦¾à¦® à¦\85নà§\81সনà§\8dধান:",
+       "listfiles_search_for": "মিডিয়াৰ নাম সন্ধান:",
        "imgfile": "ফাইল",
        "listfiles": "ফাইলৰ তালিকা",
        "listfiles_thumb": "ক্ষুদ্ৰ প্ৰতিকৃতি",
        "filedelete-edit-reasonlist": "বিলোপৰ কাৰণ সম্পাদনা",
        "filedelete-maintenance": "চোৱা-চিতাৰ সময়ত ফাইলৰ বিলুপ্তি আৰু পুনৰুদ্ধাৰ সাময়িকভাৱে নিষ্ক্ৰিয় কৰা হৈছে ।",
        "filedelete-maintenance-title": "ফাইল বিলোপ কৰিব নোৱাৰি",
-       "mimesearch": "MIME à¦\85নà§\81সনà§\8dধান",
+       "mimesearch": "MIME সন্ধান",
        "mimesearch-summary": "এই পৃষ্ঠাৰ জৰিয়তে ফাইলসমূহক MIME প্ৰকাৰ অনুসৰি চেকিব পৰা যায় ।\nইনপুট: contenttype/subtype, যেনে- <code>image/jpeg</code> ।",
        "mimetype": "MIME প্ৰকাৰ:",
        "download": "ডাউনল’ড কৰক",
        "suppress": "অমনোযোগ",
        "querypage-disabled": "কাৰ্য্যগত কাৰণত এই বিশেষ পৃষ্ঠাটো নিষ্ক্ৰিয় কৰা হৈছে।",
        "booksources": "গ্ৰন্থৰ উৎস সমূহ",
-       "booksources-search-legend": "à¦\97à§\8dৰনà§\8dথ à¦\89à§\8eস à¦\85নà§\81সনà§\8dধান",
+       "booksources-search-legend": "গ্ৰন্থ উৎস সন্ধান",
        "booksources-search": "সন্ধান",
        "booksources-text": "নতুন আৰু পুৰণি কিতাপ বেচা চাইটসমূহৰ সংযোগ তলত দিয়া হৈছে, তাত আপুনি বিচৰা কিতাপসমূহৰ বিষয়ে অধিক তথ্যও পাব পাৰে:",
        "booksources-invalid-isbn": "আপুনি দিয়া ISBN সম্ভৱতঃ অবৈধ; মূল উৎসৰ পৰা তুলি লওঁতে হ’ব পৰা ভুলৰ বাবে পৰীক্ষা কৰক ।",
        "deletedcontributions": "ৰদ কৰা সদস্যৰ বৰঙণিসমূহ",
        "deletedcontributions-title": "ৰদ কৰা সদস্যৰ বৰঙণিসমূহ",
        "sp-deletedcontributions-contribs": "বৰঙণিসমূহ",
-       "linksearch": "বাহà§\8dযিà¦\95 à¦¸à¦\82যà§\8bà¦\97 à¦\85নà§\81সনà§\8dধান",
-       "linksearch-pat": "à¦\85নà§\81সনà§\8dধান à¦\86ৰà§\8dহি:",
+       "linksearch": "বাহ্যিক সংযোগ সন্ধান",
+       "linksearch-pat": "সন্ধান আৰ্হি:",
        "linksearch-ns": "নামস্থান:",
-       "linksearch-ok": "à¦\85নà§\81সনà§\8dধান",
-       "linksearch-text": "ৱাইল্ডকাৰ্ডসমূহ যেনে \"*.wikipedia.org\" ব্যৱহাৰ কৰিব পাৰি।\nঅন্তত এটা উচ্চ-স্তৰৰ ডমেইনৰ প্ৰয়োজন, উদাহৰণস্বৰূপ \"*.org\"। <br />\nসমৰ্থিত {{PLURAL:$2|প্ৰ'ট'ক'ল|প্ৰ'ট'ক'লসমূহ}} : <code>$1</code> (কোনো প্ৰ'ট'ক'ল নিৰ্দিষ্ট নকৰিলে http:// সূচাব)।",
+       "linksearch-ok": "সনà§\8dধান à¦\95ৰà¦\95",
+       "linksearch-text": "ৱাইল্ডকাৰ্ডসমূহ যেনে \"*.wikipedia.org\" ব্যৱহাৰ কৰিব পাৰি।\nঅন্তত এটা উচ্চ-স্তৰৰ ডমেইনৰ প্ৰয়োজন, উদাহৰণস্বৰূপ \"*.org\"। <br />\nসমৰ্থিত {{PLURAL:$2|প্ৰ'ট'ক'ল|প্ৰ'ট'ক'লসমূহ}} : $1 (কোনো প্ৰ'ট'ক'ল নিৰ্দিষ্ট নকৰিলে http:// সূচাব)।",
        "linksearch-line": "$2 পৰা $1 সংযোগ কৰা হৈছে",
        "linksearch-error": "ৱাইল্ডকাৰ্ড কেৱল হ'ষ্টনামৰ আৰম্ভণিতহে দেখা যাব ।",
        "listusersfrom": "ইয়াৰে আৰম্ভ হোৱা ব্যৱহাৰকাৰী সকল দেখুৱাওক:",
        "sp-contributions-userrights": "সদস্যৰ অধিকাৰ ব্যৱস্থাপনা",
        "sp-contributions-blocked-notice": "এই সদস্যজনক সদ্যহতে বাৰণ কৰা হৈছে ।\nআপোনাৰ সুবিধাৰ্থে শেহতীয়া প্ৰতিবন্ধক অভিলেখ ভৰ্তি তলত দিয়া হ’ল:",
        "sp-contributions-blocked-notice-anon": "এই আই.পি. ঠিকনা সদ্যহতে বাৰণ কৰা হৈছে ।\nআপোনাৰ সুবিধাৰ্থে শেহতীয়া প্ৰতিবন্ধক অভিলেখ ভৰ্তি তলত দিয়া হ’ল:",
-       "sp-contributions-search": "বৰà¦\99ণিসমà§\82হৰ à¦\95াৰণà§\87 à¦\85নà§\81সনà§\8dধান à¦\95ৰà¦\95",
+       "sp-contributions-search": "বৰঙণিসমূহৰ কাৰণে সন্ধান কৰক",
        "sp-contributions-username": "আই.পি. ঠিকনা অথবা ব্যৱহাৰকৰ্তাৰ নাম:",
        "sp-contributions-toponly": "কেৱল সাম্প্ৰতিক সংস্কৰণৰ অন্তৰ্গত সম্পাদনাসমূহ দেখুৱাওক",
        "sp-contributions-submit": "সন্ধান কৰক",
        "blocklist-by": "প্ৰশাসকক বাধাপ্ৰদান",
        "blocklist-params": "অৱৰোধ পাৰামিটাৰসমূহ",
        "blocklist-reason": "কাৰণ:",
-       "ipblocklist-submit": "à¦\85নà§\81সনà§\8dধান",
+       "ipblocklist-submit": "সনà§\8dধান à¦\95ৰà¦\95",
        "ipblocklist-localblock": "স্থানীয় বাৰণ",
        "ipblocklist-otherblocks": "অন্যান্য {{PLURAL:$1|বাৰণ|বাৰণসমূহ}}",
        "infiniteblock": "অসীম",
        "dberr-again": "অলপ সময় অপেক্ষা কৰি পুনৰ আপল'ডৰ চেষ্টা কৰক ।",
        "dberr-info": "(তথ্যকোষৰ চাৰ্ভাৰৰ লগত যোগাযোগ কৰিব নোৱাৰি: $1)",
        "dberr-info-hidden": "(তথ্যকোষৰ চাৰ্ভাৰৰ লগত যোগাযোগ কৰিব নোৱাৰি)",
-       "dberr-usegoogle": "à¦\8fà¦\87 à¦ªà§°à¦¿à¦¸à§\8dথিতিত à¦\86পà§\81নি à¦\97à§\81à¦\97লৰ à¦®à¦¾à¦§à§\8dযমà§\87ৰà§\87 à¦\85নà§\81সনà§\8dধান à¦\95ৰিব à¦ªà¦¾à§°à§\87 ।",
+       "dberr-usegoogle": "à¦\8fà¦\87 à¦ªà§°à¦¿à¦¸à§\8dথিতিত à¦\86পà§\81নি à¦\97à§\81à¦\97লৰ à¦®à¦¾à¦§à§\8dযমà§\87ৰà§\87 à¦¸à¦¨à§\8dধান à¦\95ৰিব à¦ªà¦¾à§°à§\87।",
        "dberr-outofdate": "মন কৰক যে, আমাৰ বিষয়বস্তু সম্পৰ্কে তেওঁলোকৰ সূচী পুৰণা হ'ব পাৰে ।",
        "dberr-cachederror": "এইখন অনুৰোধ কৰা পৃষ্ঠাৰ কেচ্‌ড লিপি, যিখন নবীকৰণ নকৰাও হ'ব পাৰে ।",
        "htmlform-invalid-input": "আপোনাৰ কিছুমান অন্তৰ্ভুক্তিত সমস্যা হৈছে",
        "htmlform-cloner-create": "আৰু যোগ কৰক",
        "htmlform-cloner-delete": "আঁতৰাওক",
        "sqlite-has-fts": "$1 সম্পূৰ্ণ-পাঠ অনুসন্ধান সমৰ্থন সহ",
-       "sqlite-no-fts": "$1 à¦¸à¦®à§\8dপà§\82ৰà§\8dণ-পাঠ à¦\85নà§\81সনà§\8dধান à¦¸à¦®à§°à§\8dথন à¦\85বিহনà§\87",
+       "sqlite-no-fts": "$1 সম্পূৰ্ণ-পাঠ সন্ধান সমৰ্থন অবিহনে",
        "logentry-delete-delete": "$3 পৃষ্ঠাটো $1ৰদ্বাৰা {{GENDER:$2|বিলোপ কৰা হ'ল}}",
        "logentry-delete-restore": "$1-এ $3 পৃষ্ঠাটো {{GENDER:$2|পুনৰ্সংৰক্ষণ কৰিলে}}",
        "logentry-delete-event": "$3: $4 -ত {{PLURAL:$5|এটা লগ ঘটনা|$5 লগ ঘটনাসমূহ}} -ৰ $1 পৰিৱৰ্তন কৰা দৃশ্যমানতা",
index 79b1fca..a6b5c69 100644 (file)
        "protectedinterface": "Esta páxina proporciona'l testu de la interfaz del software d'esta wiki, y ta candada pa torgar abusos.\nP'amestar o cambiar les traducciones de toles wikis, por favor usa [//translatewiki.net/translatewiki.net], el proyeutu de llocalización de MediaWiki.",
        "editinginterface": "<strong>Avisu:</strong> Tas editando una páxina que s'usa pa proporcionar el testu de la interfaz del programa.\nLos cambeos nesta páxina afeutarán al aspeutu de la interfaz pa otros usuarios d'esta wiki.",
        "translateinterface": "P'amestar o camudar les traducciones pa toles wikis, usa [//translatewiki.net/ translatewiki.net], el proyeutu de traducción de MediaWiki.",
-       "cascadeprotected": "Esta páxina ta protexida d'ediciones porque ta inxerta {{PLURAL:$1|na siguiente páxina, protexida|nes siguientes páxines, protexíes}} cola opción «en cascada» activada:\n$2",
+       "cascadeprotected": "Esta páxina ta protexida d'ediciones porque ta trescluída {{PLURAL:$1|na siguiente páxina, protexida|nes siguientes páxines, protexíes}} cola opción «en cascada» activada:\n$2",
        "namespaceprotected": "Nun tienes permisu pa editar páxines nel espaciu de nomes '''$1'''.",
        "customcssprotected": "Nun tienes permisu pa editar esta páxina CSS porque contien preferencies personales d'otru usuariu.",
        "customjsprotected": "Nun tienes permisu pa editar esta páxina de JavaScript porque contien preferencies personales d'otru usuariu.",
        "readonlywarning": "'''Avisu: La base de datos ta candada por mantenimientu, polo que nun vas poder guardar les tos ediciones nestos momentos.'''\nSeique habríes copiar y apegar el testu nun ficheru de testu y guardalu pa intentalo más sero.\n\nL'alministrador que la candó dio esta esplicación: $1",
        "protectedpagewarning": "'''Avisu: Esta páxina ta candada pa que sólo los alministradores puean editala.'''\nLa cabera entrada del rexistru s'ufre darréu pa referencia:",
        "semiprotectedpagewarning": "'''Nota:''' Esta páxina ta candada pa que nun puean editala namái que los usuarios rexistraos.\nLa cabera entrada del rexistru s'ufre darréu pa referencia:",
-       "cascadeprotectedwarning": "'''Avisu:''' Esta páxina ta candada pa que namái los alministradores puedan editala porque ta incluída {{PLURAL:$1|na siguiente páxina protexida|nes siguientes páxines protexíes}} en cascada:",
+       "cascadeprotectedwarning": "<strong>Avisu:</strong> Esta páxina ta candada pa que namái los alministradores puedan editala porque ta trescluída {{PLURAL:$1|na siguiente páxina protexida|nes siguientes páxines protexíes}} en cascada:",
        "titleprotectedwarning": "'''Avisu: Esta páxina ta candada pa que necesite [[Special:ListGroupRights|permisos especiales]] pa creala.'''\nLa cabera entrada del rexistru s'ufre darréu pa referencia:",
        "templatesused": "{{PLURAL:$1|Plantía usada|Plantíes usaes}} nesta páxina:",
        "templatesusedpreview": "{{PLURAL:$1|Plantía usada|Plantíes usaes}} nesta vista previa:",
        "linksearch-pat": "Patrón de busca:",
        "linksearch-ns": "Espaciu de nomes:",
        "linksearch-ok": "Buscar",
-       "linksearch-text": "Se puen usar comodinos como \"*.wikipedia.org\".\nNecesita polo menos un dominiu de primer nivel, como \"*.org\".<br />\n{{PLURAL:$2|Protocolu almitíu|Protocolos almitíos}}: <code>$1</code> (el predetermináu ye http:// si nun se conseña dengún protocolu).",
+       "linksearch-text": "Se puen usar comodinos como \"*.wikipedia.org\".\nNecesita polo menos un dominiu de primer nivel, como \"*.org\".<br />\n{{PLURAL:$2|Protocolu almitíu|Protocolos almitíos}}: $1 (el predetermináu ye http:// si nun se conseña dengún protocolu).",
        "linksearch-line": "$1 enllaciáu dende $2",
        "linksearch-error": "Los comodinos namái puen apaecer al entamu del nome del güéspede.",
        "listusersfrom": "Amosar usuarios emprimando dende:",
        "protect-locked-blocked": "Nun pues camudar los niveles de proteición mentes teas bloquiáu. Esta\nye la configuración actual de la páxina '''$1''':",
        "protect-locked-dblock": "Los niveles de proteición nun puen ser camudaos pol mor d'un candáu activu de\nla base de datos. Esta ye la configuración actual de la páxina '''$1''':",
        "protect-locked-access": "La to cuenta nun tien permisu pa camudar los niveles de proteición de páxina.\nEsta ye la configuración actual pa la páxina '''$1''':",
-       "protect-cascadeon": "Esta páxina ta protexida nestos momentos porque ta incluída {{PLURAL:$1|na siguiente páxina, que tien|nes siguientes páxines, que tienen}} activada la proteición en cascada.\nLos cambios nel nivel de proteición d'esta páxina nun afeutarán a la proteición en cascada.",
+       "protect-cascadeon": "Esta páxina ta protexida nestos momentos porque ta trescluída {{PLURAL:$1|na siguiente páxina, que tien|nes siguientes páxines, que tienen}} activada la proteición en cascada.\nLos cambios nel nivel de proteición d'esta páxina nun afeutarán a la proteición en cascada.",
        "protect-default": "Permitir tolos usuarios",
        "protect-fallback": "Permitir namái usuarios con permisu \"$1\"",
        "protect-level-autoconfirmed": "Permitir namái usuarios autoconfirmaos",
        "htmlform-cloner-create": "Amestar más",
        "htmlform-cloner-delete": "Desaniciar",
        "htmlform-cloner-required": "Necesítase polo menos un valor.",
+       "htmlform-title-badnamespace": "[[:$1]] nun ta nel espaciu de nomes \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "«$1» nun ye un títulu de páxina que pueda crease",
+       "htmlform-title-not-exists": "[[:$1]] nun esiste.",
+       "htmlform-user-not-exists": "<strong>$1</strong> nun esiste.",
+       "htmlform-user-not-valid": "<strong>$1</strong> nun ye un nome d'usuariu válidu.",
        "sqlite-has-fts": "$1 con sofitu pa busca de testu completu",
        "sqlite-no-fts": "$1 ensin sofitu pa busca de testu completu",
        "logentry-delete-delete": "$1 {{GENDER:$2|desanició}} la páxina $3",
index d5fe7a2..e00af38 100644 (file)
        "linksearch-pat": "खोजय खर्तीन पाठ:",
        "linksearch-ns": "नामस्थान:",
        "linksearch-ok": "खोजा जाय",
-       "linksearch-text": "\"*.wikipedia.org\" जैसन वाईल्ड-कार्ड्स प्रयोग कै सका जात है।\nकम-से-कम \".org\" जैसन कवनो top-level डोमेन कय आवश्यकता है।<br />\nस्वीकार्य {{PLURAL:$2|प्रोटोकॉल}}: <code>$1</code> (यदि कवनो प्रोटोकॉल ना दै जाए तव http:// कय प्रयोग कै सका जात है)",
+       "linksearch-text": "\"*.wikipedia.org\" जैसन वाईल्ड-कार्ड्स प्रयोग कै सका जात है।\nकम-से-कम \".org\" जैसन कवनो top-level डोमेन कय आवश्यकता है।<br />\nस्वीकार्य {{PLURAL:$2|प्रोटोकॉल}}: $1 (यदि कवनो प्रोटोकॉल ना दै जाए तव http:// कय प्रयोग कै सका जात है)",
        "linksearch-line": "$2 में से $1 जोडान है",
        "linksearch-error": "वाईल्डकार्ड्स होस्टनाम कय खालि शुरू में आइ सकत है।",
        "listusersfrom": "इ अक्षर से शुरु होय वाले सदस्य देखावा जाय:",
index 6fcdcba..9b63b13 100644 (file)
        "talk": "دانیشیق",
        "views": "گؤرونوشلر",
        "toolbox": "آراجلار",
-       "userpage": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c ØµØ­Û\8cÙ\81ه‌‌سینه باخ",
+       "userpage": "اÛ\8cØ´Ù\84دÙ\86 ØµÙ\81Ø­ه‌‌سینه باخ",
        "projectpage": "پروژه صحیفه‌سینه باخ",
        "imagepage": "فایل صحیفه‌سینه باخ",
        "mediawikipage": "مئساژ صحیفه‌سینه باخ",
        "redirectto": "مسیزپرین دَییشیب:",
        "lastmodifiedat": "بۇ صفحه‌‌ سوْن کز $1، $2 چاغیندا دَییشیلمیش‌دیر.",
        "viewcount": "بۇ صحیفه {{PLURAL:$1|بیر|$1}} دفعه گؤرولوبدور.",
-       "protectedpage": "قوْرونموش صحیفه",
+       "protectedpage": "قوْرونموش صفحه",
        "jumpto": "آتیل:",
        "jumptonavigation": "دوْلانماق",
        "jumptosearch": "آختار",
        "passwordreset": "رمزی یئنی‌له",
        "passwordreset-text-one": "رمزینیزی صیفیرلاماق اوچون بو فورمو باشا چاتدیرین.",
        "passwordreset-text-many": "{{PLURAL:$1|رمزینیزی صیفیرلاماق اوچون، بیرینی دولدورون.}}",
-       "passwordreset-legend": "رمزی یئنی‌له",
        "passwordreset-disabled": "بو ویکی‌ده رمزی یئنی‌له‌مک باغلانیب‌دیر.",
        "passwordreset-emaildisabled": "ایمیل اؤزل‌لیکلری بو ویکی‌ده باغلانیب‌دیر.",
-       "passwordreset-username": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c آدی:",
+       "passwordreset-username": "اÛ\8cØ´Ù\84دÙ\86 آدی:",
        "passwordreset-domain": "دامنه:",
        "passwordreset-capture": "سون نتیجه ایمیل گؤستریلسین؟",
        "passwordreset-capture-help": "بو قوطویا علامت قویساز، (گئچیجی رمزی اولان) ایمیل ایستیفاده‌چی‌یه گؤندریلن کیمی بوردا سیزه گؤستریله‌جکدیر.",
        "changeemail-throttled": "سیز دفعه لرجه گیریش اوچون چالیشیب سیز.\nلوطفا یئنی دن چالیشمامیشدان اونجه $1 دوزوم ائدین.",
        "resettokens": "نیشانلی لاری یئنیلمه",
        "resettokens-no-tokens": "هئچ بیر نیشانلی یئنیلنمک اوچون یوخدور.",
-       "resettokens-legend": "نیشانلی لاری یئنیلمه",
        "resettokens-tokens": "نیشانلی:",
        "resettokens-token-label": "$1 (ایندیکی میقداری: $2)",
        "resettokens-watchlist-token": "نیشانلامیش یئمک وپی [[Special:Watchlist|ایزلنمیش سون دییشیک اولان صفحه لر]](اتم/آراس‌اس)",
        "history-feed-item-nocomment": "$2-ده $1",
        "history-feed-empty": "ایسته‌دیگینیز صحیفه یوخدور.\nاولا بیلر کی بو ویکی‌دن سیلینیب یوخسا آدی دَییشیلیب‌دیر.\nایلگیلی یئنی صحیفه‌لری تاپماق اوچون [[Special:Search|بو ویکی‌ده آختارماغا چالیشین]].",
        "rev-deleted-comment": "(دَییشدیرمک قیساسی سیلیندی)",
-       "rev-deleted-user": "(اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c آدی سیلیندی)",
+       "rev-deleted-user": "(اÛ\8cØ´Ù\84دÙ\86 آدی سیلیندی)",
        "rev-deleted-event": "(قئيد سیلیندی)",
        "rev-deleted-user-contribs": "[ایستیفاده‌چی آدی و يا ای-پی اونوانی سیلیندی - ديَیشیکلیک چالیشمالاردان چیخاریلدی]",
        "rev-deleted-text-permission": "بو ديَیشیکلیک بو صحیفه‌دن '''سیلینیب دیر.'''",
        "datedefault": "سئچیم‌سیز",
        "prefs-labs": "آزماییشی اؤزل‌لیکلر",
        "prefs-user-pages": "ایستیفاده‌چی صحیفه‌لری",
-       "prefs-personal": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c Ù¾Ø±Ù\88Ù\81اÛ\8cÙ\84ی",
+       "prefs-personal": "اÛ\8cØ´Ù\84دÙ\86 Ù\88ئرÛ\8câ\80\8cÙ\84ری",
        "prefs-rc": "سون دَییشیکلیکلر",
        "prefs-watchlist": "ایزله‌دیکلر",
        "prefs-editwatchlist": "ایزله‌دیگیم صحیفه‌‌لری دَییشدیر",
        "prefs-reset-intro": "ترجیحلرینیزی سایتین ایلک فرض ائدیلنلرینه دؤندرمک اوچون، بو صحیفه‌دن ایستیفاده ائده بیلرسینیز.\nبو ایش قایتاریلا بیلمز.",
        "prefs-emailconfirm-label": "ایمیل دوغرولاماسی:",
        "youremail": "ایمیل:",
-       "username": "{{GENDER:$1|اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c آدی}}:",
+       "username": "{{GENDER:$1|اÛ\8cØ´Ù\84دÙ\86 آدی}}:",
        "prefs-memberingroups": "{{PLURAL:$1|بیر|$1}} قروپ {{GENDER:$2|عوضو}}و:",
-       "prefs-registration": "یازیلماق واختی:",
+       "prefs-registration": "یازیلماق تاریخی:",
        "yourrealname": "دوغرو آد:",
        "yourlanguage": "دیل:",
        "yourvariant": "دیل واریانتی:",
        "prefs-help-email": "ایمیل آدرسی ایستگه باغلی‌دیر، آنجاق رمزینیزی اونوتدوغونوز واخت، سیزه يئنی رمز گؤندرمگه گرکلی‌دیر.",
        "prefs-help-email-others": "سیز هم‌ده آیری ایستیفاده‌چیلره ایجازه وئره بیلرسیز، سیزین ایستیفاده‌چی یا دانیشیق صحیفه‌نیزده بیر باغلانتی ایله، سیزله ایلگی قورسونلار.\nآیری ایستیفاده‌چیلر سیزینله ایلگی قوراندا، سیزین ایمیل آدرسیز گؤستریلمه‌یه‌جک‌دیر.",
        "prefs-help-email-required": "ایمیل آدرس گرکلی‌دیر.",
-       "prefs-info": "اساس Ø¨Û\8cÙ\84Ú¯Û\8cÙ\84ر",
+       "prefs-info": "کؤک Ø¨Û\8cÙ\84Ú¯Û\8câ\80\8cÙ\84ر",
        "prefs-i18n": "اولوسلارآراسی‌لاشدیرما",
        "prefs-signature": "ایمضا",
        "prefs-dateformat": "تاریخ فورمتی",
        "rightslogtext": "بو، ایستیفاده‌چی حاقلارینا اولان دَییشیکلیکلر سیاهی‌سی‌دیر.",
        "action-read": "بو صحیفه‌نی اوخو",
        "action-edit": "بو صحیفه‌نی دَییشدیر",
-       "action-createpage": "صحیفه یارات",
+       "action-createpage": "صفحه یارات",
        "action-createtalk": "دانیشیق صحیفه‌سی یاراد",
        "action-createaccount": "بو ایستیفاده‌چی حسابینی یاراد",
        "action-history": "بو صفحه نین گئچمیشین گور",
        "listfiles_thumb": "کیچیک شکیل",
        "listfiles_date": "تاریخ",
        "listfiles_name": "آد",
-       "listfiles_user": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c",
+       "listfiles_user": "اÛ\8cØ´Ù\84دÙ\86",
        "listfiles_size": "اؤلچو",
        "listfiles_description": "شرح",
        "listfiles_count": "نوسخه‌لر",
        "imagelinks": "فايل ایشلدمه‌سی",
        "linkstoimage": "آشاغیداکی {{PLURAL:$1|صحیفه|$1 صحیفه‌لر}} بو فایلا {{PLURAL:$1|باغلانیر|باغلانیرلار}}",
        "linkstoimage-more": "بو فایلا {{PLURAL:$1|بیر|$1}}-دن چوخ صحیفه باغلانتی‌سی واردیر.\nآشاغیداکی لیست بو فایلا یالنیز ایلک $1 صحیفه باغلانتیسینی گؤستریر.\nبیر [[Special:WhatLinksHere/$2|بوتون لیست]] ده واردیر.",
-       "nolinkstoimage": "بو فایلا هئچ بیر صحیفه باغلانماییب.",
+       "nolinkstoimage": "بو فایلا هئچ بیر صفحه‌یه باغلانماییب.",
        "morelinkstoimage": "بو فایلا [[Special:WhatLinksHere/$1| داها چوخ علاقه‌لری]] باخ.",
        "linkstoimage-redirect": "$1 (فایل ایستیقامتلندیریلیر) $2",
        "duplicatesoffile": "بو {{PLURAL:$1 | فایل | $1 فایل}}، بو فایلین صورتی ([[Special:FileDuplicateSearch/$2|داها چوخ دئتال]]):",
        "statistics": "آمارلار",
        "statistics-header-pages": "صحیفه آمارلاری",
        "statistics-header-edits": "دَییشمه آمارلاری",
-       "statistics-header-users": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c Ø¢Ù\85ارلاری",
+       "statistics-header-users": "اÛ\8cØ´Ù\84دÙ\86â\80\8cÙ\84ر Ø³Ø§Û\8cÛ\8cÙ\85â\80\8cلاری",
        "statistics-header-hooks": "باشقا آمارلار",
        "statistics-articles": "مقاله‌لر",
        "statistics-pages": "صحیفه‌لر:",
        "nmembers": "{{PLURAL:$1|بیر|$1}} عوضو",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|عۆضو}}",
        "nrevisions": "{{PLURAL:$1|بیر|$1}} نوسخه",
-       "nviews": "{{PLURAL:$1|بیر|$1}} گؤرونوش",
        "nimagelinks": "$1 ده{{PLURAL:$1|صحیفه‌ده}}ایستیفاده اولونمور",
        "ntransclusions": "$1 ده{{PLURAL:$1|صحیفه‌ده}}ایستیفاده اولونور",
        "specialpage-empty": "بو صحیفه بوشدور",
        "protectedpages-noredirect": "یوْل‌لاندیرمالاری گیزلت",
        "protectedpagesempty": "حال-حاضردا بو پارامئتره اویغون هئچ بیر محافظه‌لی صحیفه یوخ‌دور",
        "protectedpages-timestamp": "واخت دامغاسی",
-       "protectedpages-page": "صحیفه",
+       "protectedpages-page": "صفحه",
        "protectedpages-expiry": "بیتمک تاریخی",
        "protectedpages-performer": "قوْرویان ایستیفاده‌چی",
        "protectedpages-params": "قوْروماق پارامئترلری",
        "protectedtitles": "محافظه‌لی باش‌لیق‌لار",
        "protectedtitles-summary": "بۇ صحیفه، ایندیکی یارانماق‌دان قوْرونان باشلیقلاری لیست ائدیر. ایندیکی قوْرونان موْجود اوْلان صحیفه‌لرین لیستینی گؤرمک اۆچون، [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]-ه باخین.",
        "protectedtitlesempty": "حال-حاضردا، بو پارامئترلری قورونان هئچ بیر موضوع یوخ‌دور.",
-       "listusers": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c Ø³Û\8cÙ\8aاÙ\87Û\8cسی",
+       "listusers": "اÛ\8cØ´Ù\84دÙ\86 Ù\84Û\8cستی",
        "listusers-editsonly": "يالنیز دَییشدیرمه ائدن ایستیفاده‌چیلری گؤستر",
        "listusers-creationsort": "يارانما تاریخینه گؤره سیرالا",
        "listusers-desc": "آزالان سیرادا سیرالا",
        "usereditcount": "$1 {{PLURAL:$1|دَییشدیرمه}}",
        "usercreated": "$1 تاریخینده، ساعات $2-ده {{GENDER:$3|یارانیب‌دیر}}",
        "newpages": "يئنی صفحه‌لر",
-       "newpages-username": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c آدی:",
+       "newpages-username": "اÛ\8cØ´Ù\84دÙ\86 آدی:",
        "ancientpages": "ان اسکی صحیفه‌لر",
        "move": "آدینی دَییشدیر",
        "movethispage": "بو صحیفه‌‌نین آدینی ديَیشدیر",
        "linksearch-pat": "آختاریش اولگوسو:",
        "linksearch-ns": "آد فضاسی:",
        "linksearch-ok": "آختار",
-       "linksearch-text": "«*.wikipedia.org» کیمی نیشانلاری ایشلده بیلرسینیز.\nآزی بیر دنه «*.org» کیمی یوخاری دامنه لازیم‌دیر.<br />\nدستلکلنمیش {{PLURAL:$2|پروتوکول|پروتوکول‌لار}}: <code>$1</code> (بوش بیراخیلسا، http:// نظرده آلیناجاقدیر).",
+       "linksearch-text": "«*.wikipedia.org» کیمی نیشانلاری ایشلده بیلرسینیز.\nآزی بیر دنه «*.org» کیمی یوخاری دامنه لازیم‌دیر.<br />\nدستلکلنمیش {{PLURAL:$2|پروتوکول|پروتوکول‌لار}}: $1 (بوش بیراخیلسا، http:// نظرده آلیناجاقدیر).",
        "linksearch-line": "$1، $2-دن باغلانیب‌دیر",
        "linksearch-error": "نیشانلار یالنیز آدی اولینده گله بیلرلر.",
        "listusersfrom": "بوندان باشلایاراق ایستیفاده‌چیلری گؤستر:",
        "activeusers-from": "بوندان باشلایاراق ایستیفاده‌چیلری گؤستر:",
        "activeusers-hidebots": "بوتلاری گیزلت",
        "activeusers-hidesysops": "ایداره‌چیلری گیزلت",
-       "activeusers-noresult": "Ù\87ئÚ\86 Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c تاپیلمادی.",
+       "activeusers-noresult": "Ù\87ئÚ\86 Ø§Û\8cØ´Ù\84دÙ\86 تاپیلمادی.",
        "listgrouprights": "ایستیفاده‌چی قروپ حاقلاری",
        "listgrouprights-summary": "آشاغیدا، بو ویکی‌ده تانیلان ایستیفاده‌چی گروپلاری و اونلارین حاقلاری گؤستریلیر.\nتک حاقلار اوچون ده، [[{{MediaWiki:Listgrouprights-helppage}}|آرتیق بیلگیلر]] اولا بیلر.",
        "listgrouprights-key": "یوْل گؤستری:\n* <span class=\"listgrouprights-granted\">وئریلمیش حاق</span>\n* <span class=\"listgrouprights-revoked\">قایتاریلمیش حاق</span>",
        "emailuser": "بو ایستیفاده‌چی‌یه ایمیل گؤندر",
        "emailuser-title-target": "بو {{GENDER:$1|ایستیفاده‌چی}}‌یه ایمیل گؤندر",
        "emailuser-title-notarget": "ایستیفاده‌چی‌یه ایمیل گؤندر",
-       "emailpage": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8câ\80\8cÛ\8cه ایمیل گؤندر",
+       "emailpage": "اÛ\8cØ´Ù\84دÙ\86ه ایمیل گؤندر",
        "emailpagetext": "آشغیداکی فورم‌دان، بو {{GENDER:$1|ایستیفاده‌چی}}‌یه ایمیل گؤندرمک اوچون ایستیفاده ائده بیلرسینیز.\n[[Special:Preferences|اؤز ترجیحلرینیز]]ده وئرن ایمیل آدرسی، بو ایمیلین \"From\" یئرینده گؤستریله‌جک‌دیر و بونا گؤره ایمیلی آلان سیزه موستقیم جاواب گؤندره بیلر.",
        "defemailsubject": "«$1» آدلی ایستیفاده‌چی‌دن، {{SITENAME}} ایمیلی",
        "usermaildisabled": "ایستیفاده‌چی ایمیلی باغلی‌دیر",
        "rollback-success": "$1 طرفین‌دن ائدیلمیش دییشدیر‌لر گئری قایتاریلدی؛ $2 طرفین‌دن یارادیلمیش سون وئرسیا برپا اولوندو.",
        "sessionfailure-title": "گیریش خطاسی",
        "sessionfailure": "گیریش اوتورومونوزلا ایلگی‌لی بیر سورون وار گیبی گؤرونویور؛\nبو ائیلئم، اوتوروم گاسپینا کارشی اؤنلئم اولاراک ایپتال ائدیلدی.\nلوتفن \"گئری\" گیدین و گئلدیغینیز سایفایی یئنی‌دئن یوکلئیین، سونرا تئکرار دئنئیین.",
+       "changecontentmodel-title-label": "صحیفه باشلیقی",
+       "changecontentmodel-reason-label": "ندن:",
+       "logentry-contentmodel-change-revertlink": "قایتار",
+       "logentry-contentmodel-change-revert": "قایتار",
        "protectlogpage": "قوروما قئیدلری",
        "protectlogtext": "آشاغی‌داکی، صحیفه قوروما‌لارینا دییشیک‌لیک‌لرین بیر سیاهی‌سی‌دیر.\nحال-حاضردا تطبیق اولونان صحیفه قوروما‌لاری اوچون [[Special:ProtectedPages| قوروما آلتینا آلینمیش صحیفه‌لر سیاهی‌سینا]] باخا بیلرسینیز.",
        "protectedarticle": "«[[$1]]» قوروندو",
        "namespace_association": "ایلگیلی آدفضاسی",
        "tooltip-namespace_association": "بو قوتونو علامت له ین یالنیز آد بحث فضاسی یا مرتبط اولان آد فضاسی ایله انتخاب اولا",
        "blanknamespace": "(آنا)",
-       "contributions": "{{GENDER:$1|اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c}} چالیشمالاری",
-       "contributions-title": "$1 Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c چالیشمالاری",
+       "contributions": "{{GENDER:$1|اÛ\8cØ´Ù\84دÙ\86}} چالیشمالاری",
+       "contributions-title": "$1 Ø§Û\8cØ´Ù\84دÙ\86 چالیشمالاری",
        "mycontris": "چالیشمالار",
        "contribsub2": "{{GENDER:$3|$1}} اوچون ($2)",
        "contributions-userdoesnotexist": "«$1» ایشلدن حسابی ثبت اولونماییب‌دیر.",
        "sp-contributions-newbies-title": "یئنی حساب‌لار اوچون ایستیفاده‌چی فالیت‌لری",
        "sp-contributions-blocklog": "باغلاما قئیدلری",
        "sp-contributions-suppresslog": "باسدیریلمیش ایشلدن فعالیت‌لری",
-       "sp-contributions-deleted": "سÛ\8cÙ\84Û\8cÙ\86Ù\85Û\8cØ´ Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c چالیشمالاری",
+       "sp-contributions-deleted": "سÛ\8cÙ\84Û\8cÙ\86Ù\85Û\8cØ´ Ø§Û\8cØ´Ù\84دÙ\86 چالیشمالاری",
        "sp-contributions-uploads": "یوکله‌نَنلر",
        "sp-contributions-logs": "قئیدلر",
        "sp-contributions-talk": "دانیشیق",
        "ipbcreateaccount": "حساب آچمانی محدودلاش‌دیر",
        "ipbemailban": "ایستیفاده‌چی‌نین ایمیل گؤندرمه‌سینه مانع اول",
        "ipbenableautoblock": "مؤوجود اولان مانعه تؤرتمه‌لری گؤستر...",
-       "ipbsubmit": "بÙ\88 Ø§Û\8cستÛ\8cÙ\81ادÙ\87 Ú\86Û\8c نی باغلا",
+       "ipbsubmit": "بÙ\88 Ø§Û\8cØ´Ù\84دنی باغلا",
        "ipbother": "باشقا واخت",
        "ipboptions": "2 ساعت:2 hours,1 گون:1 day,3 گونلر:3 days,1 هفته:1 week,2 هفته‌لر:2 weeks,1 آی:1 month,3 آیلار:3 months,6 آیلار:6 months,1 ایل:1 year,مدتسیز:infinite",
        "ipbhidename": "ایستیفاده‌چی آدینی دییشدیر‌لرده و سیاهی‌لاردا گیزلت",
        "ipb-unblock-addr": "$1 آچیلدی",
        "ipb-unblock": "ایستیفاده چی نین یا دا آی پی نین آچیلماسی",
        "ipb-blocklist": "مؤوجود بلوکلاری گؤستر",
-       "ipb-blocklist-contribs": "{{GENDER:$1|$1}} Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c Ù\81عاÙ\84Û\8cتÙ\84ری",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}} Ø§Û\8cØ´Ù\84دÙ\86 Ú\86اÙ\84Û\8cØ´Ù\85اÙ\84اری",
        "unblockip": "ایستیفاده‌چی‌نین باغلانماسین گؤتور",
        "unblockiptext": "اولجه‌دن باغلانمیش بیر ای پی عنوانینا و یا ایستیفاده‌چی آدینا یازما گئری وئرمک اوچون آشاغی‌داکی فورمادا ایستیفاده ائدین.",
        "ipusubmit": "بو بلوکو گؤتور",
        "tooltip-t-print": "بو صفحه‌‌نین چاپ ائدیلن سۆرومو",
        "tooltip-t-permalink": "صفحه‌نین بو سۆرومونه دَییشیلمز باغلانتی",
        "tooltip-ca-nstab-main": "مقاله‌یه باخین",
-       "tooltip-ca-nstab-user": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c صفحه‌سینه باخ",
+       "tooltip-ca-nstab-user": "اÛ\8cØ´Ù\84دÙ\86 صفحه‌سینه باخ",
        "tooltip-ca-nstab-media": "مئدیا-فايل",
        "tooltip-ca-nstab-special": "بو بیر اؤزل صفحه‌دیر، سیز اونو دَییشدیره بیلمزسیز",
        "tooltip-ca-nstab-project": "پروژه صحیفه‌سینه باخ",
        "redirect-submit": "گئت",
        "redirect-lookup": "آختار:",
        "redirect-value": "دَگَر:",
-       "redirect-user": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c ID",
+       "redirect-user": "اÛ\8cØ´Ù\84دÙ\86 ID",
        "redirect-page": "صفحه کیملیگی",
        "redirect-revision": "صحیفه نوسخه‌سی",
        "redirect-file": "فایل آدی",
        "specialpages-group-wiki": "بیلگیلر و آلتلر",
        "specialpages-group-redirects": "خصوصی ایستیقامتلندیرمه صحیفه‌لری",
        "specialpages-group-spam": "هرزه یازماق آلت‌لری",
-       "blankpage": "بوش صحیفه",
+       "blankpage": "بوش صفحه",
        "intentionallyblankpage": "بو صحیفه خصوصیله بوش‌دور.",
        "external_image_whitelist": " #بو سطری اولدوغو کیمی بوراخین <pre>\n#دوزگون ایفاده (رِقولار اِکسپرِشِن) پارچالارینی (یالنیز // آراسیندا اولان قیسمی) آشاغی‌يا قویون\n#بونلار ائشیک‌ده‌کی عکسلرین آدرسلریله تطبیق اولاجاقلار\n#تطبیق اولانلار، عکس کیمی گؤستریله‌جکلر، اولمایانلارا یالنیز بیر باغلانتی گؤستریله‌جکدیر\n#بو # نیشانی ایله باشلایان سطرلر، شرح کیمی نظرده توتولاجاقلار\n#بو حرفلرین کیچیک/بؤیوک اولماغینا حساس دئییل\n\n#بوتون دوزگون ایفاده پارچالارینی، بو سطرین اوستونه قویون. بو سطری اولدوغو کیمی بوراخین</pre>",
        "tags": "مومکون دییشیک‌لیک ائتیکئت‌لری",
        "tags-edit-reason": "ندن:",
        "tags-edit-nooldid-title": "گئچرسیز هدف نوسخه",
        "comparepages": "صحیفه‌لری قارشی‌لاش‌دیر",
-       "compare-page1": "صحیفه 1",
+       "compare-page1": "صفحه 1",
        "compare-page2": "صحیفه 2",
        "compare-rev1": "نوسخه ۱",
        "compare-rev2": "نوسخه ۲",
index 1a73a3b..d2f7c5b 100644 (file)
        "passwordreset": "Серһүҙҙе ташлатыу",
        "passwordreset-text-one": "Серһүҙегеҙҙе ташлар өсөн ош ҡалыпты тултырығыҙ.",
        "passwordreset-text-many": "{{PLURAL:$1|Серһүҙҙе ташлар өсөн яландарҙың береһен тултырығыҙ.}}",
-       "passwordreset-legend": "Серһүҙҙе ташлатыу",
        "passwordreset-disabled": "Был викила серһүҙҙе ташлатыу ғәмәлдә түгел",
        "passwordreset-emaildisabled": "Был викиҙа электрон почта функцияһы һүндерелгән.",
        "passwordreset-username": "Ҡулланыусы исеме:",
        "resettokens": "Токендарҙы ташларға",
        "resettokens-text": "Иҫәп яҙмағыҙ менән бәйләнгән ҡайһы бер шәхси мәғлүмәттәрегеҙгә инеүгә юл асыусы токендарҙы ташлай алаһығыҙ.\n\nЯңылыштан уларҙы берәйһе менән уртаҡлашҡан  йәки аккаунтығыҙ ваттырылған осраҡта быны эшләү мотлаҡ.",
        "resettokens-no-tokens": "Ташлар өсөн токендар юҡ.",
-       "resettokens-legend": "Токендарҙы ташларға",
        "resettokens-tokens": "Токендар:",
        "resettokens-token-label": "$1 (ағымдағы мәғәнә: $2)",
        "resettokens-watchlist-token": " [[Special:Watchlist|күҙәтеүҙәрегеҙ исемлегендә биттәрҙең үҙгәрештәре]] веб-каналы өсөн токен(Atom/RSS)",
        "nmembers": "$1 {{PLURAL:$1|объект}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|объект}}",
        "nrevisions": "$1 {{PLURAL:$1|1=өлгө|өлгө}}",
-       "nviews": "$1 {{PLURAL:$1|ҡарап сығыу}}",
        "nimagelinks": "$1 {{PLURAL:$1|биттә}} ҡулланыла",
        "ntransclusions": "$1 {{PLURAL:$1|биттә}} ҡулланыла",
        "specialpage-empty": "Был һорау өсөн һөҙөмтәләр юҡ.",
        "linksearch-pat": "Эҙләү өсөн ҡалып",
        "linksearch-ns": "Исемдәр арауығы:",
        "linksearch-ok": "Эҙләү",
-       "linksearch-text": "<code>*.wikipedia.org</code> һымаҡ төркөм билдәләрен ҡулланырға була.\nКәмендә өҫкө кимәл домен кәрәк, мәҫәлән, <code>*.org</code><br />\nМөмкин булған{{PLURAL:$2|1=протокол|протоколдар}}: <code>$1</code> (башҡа протокол өҫтәлмәһә, алдан бирелгәне индерелә http://).",
+       "linksearch-text": "<code>*.wikipedia.org</code> һымаҡ төркөм билдәләрен ҡулланырға була.\nКәмендә өҫкө кимәл домен кәрәк, мәҫәлән, <code>*.org</code><br />\nМөмкин булған{{PLURAL:$2|1=протокол|протоколдар}}: $1 (башҡа протокол өҫтәлмәһә, алдан бирелгәне индерелә http://).",
        "linksearch-line": "$1 адресына $2 битенән һылтанма яһалған",
        "linksearch-error": "Төркөм билдәләре URL адрестың башында ғына ҡулланыла ала.",
        "listusersfrom": "Ошондай хәрефтәрҙән башланған ҡатнашыусыларҙы күрһәтергә:",
index 8bfc90e..e86ae79 100644 (file)
        "nlinks": "{{PLURAL:$1|a Link|$1 Links}}",
        "nmembers": "{{PLURAL:$1|1 Eindrog|$1 Eindreg}}",
        "nrevisions": "{{PLURAL:$1|oah Beorwatung|$1 Beorwatungen}}",
-       "nviews": "{{PLURAL:$1|1 Åbfråg|$1 Åbfrång}}",
        "uncategorizedpages": "Néd kategorisirde Seiten",
        "uncategorizedcategories": "Néd kategorisirde Kategorien",
        "uncategorizedimages": "Néd kategorisirde Daatein",
        "linksearch-pat": "Suachmuster:",
        "linksearch-ns": "Nåmensraum:",
        "linksearch-ok": "Suacher",
-       "linksearch-text": "Dé Speziaalseiten do daméglicht d' Suach noch Seiten, in dénen bstimmte Weblinks enthoiden san. Dodabei kennern Blootzhoiter wia beispüsweis  <code>*.beispü.at</code> hergnummer wern. Es muass mindastens a Top-Level-Domain, z. Bsp. „*.org“. auhgeem wern. <br />Unterstytzde Protokói: <code>$1</code> (Dé bittscheh bei da Suachauhgob auhgeem.)",
+       "linksearch-text": "Dé Speziaalseiten do daméglicht d' Suach noch Seiten, in dénen bstimmte Weblinks enthoiden san. Dodabei kennern Blootzhoiter wia beispüsweis  <code>*.beispü.at</code> hergnummer wern. Es muass mindastens a Top-Level-Domain, z. Bsp. „*.org“. auhgeem wern. <br />Unterstytzde Protokói: $1 (Dé bittscheh bei da Suachauhgob auhgeem.)",
        "linksearch-line": "$1 is valinkt vo $2",
        "listusers-submit": "Zoag",
        "listusers-noresult": "Koane Benutzer gfunden.",
index 82a3c73..b280c97 100644 (file)
        "passwordreset": "نوکین پسوردء بلوٹ",
        "passwordreset-text-one": "پر وتی پسوردء واترء ائ فرمء پکا کن ات.",
        "passwordreset-text-many": "{{PLURAL:$1|اگان لوٹت ایمیلء گون موکتین پسوردء پر شما راهیگ ببیت، یکئ چه ائ جاگاهانء پر بکن ات.}}",
-       "passwordreset-legend": "نوکین پسوردء بلوٹ",
        "passwordreset-disabled": "پسوردء واتر کتن مان ائ ویکیء نافعال بیتگ انت.",
        "passwordreset-emaildisabled": "ایمیلء حالتان مان ائ ویکیء نافعال بیتگ انت.",
        "passwordreset-username": "کار زوروکی نام:",
        "resettokens": "پجاروکان(tokens)ی واتر",
        "resettokens-text": "شما توان ات پجاروکان(tokens) که دزرسیء اجازت پر شمئی وتیگین دیتا همگرنچ گون شمئی اکانتء دینت، واتر بکن ات.\nهما درگتء ائ کار بیت کنت که نامالومین شهسء شمئی اکانتء لاگین کتگ انت.",
        "resettokens-no-tokens": "هچ پجاروکء پر واترء ودی نبوت.",
-       "resettokens-legend": "پجاروکان(tokens)ی واتر",
        "resettokens-tokens": "پجاروکان(tokens):",
        "resettokens-token-label": "$1 (انیگین اندازگ: $2)",
        "resettokens-watchlist-token": "ویب فیدء پجاروک [[Special:Watchlist|پیجانی تغییرات که آهانء رهگر کن ات]] (اتم/آراس‌اس)",
        "linksearch-pat": "گردگ الگو:",
        "linksearch-ns": "نام فضا:",
        "linksearch-ok": "گردگ",
-       "linksearch-text": "تقریبانی په داب \"*.wikipedia.org\" شاید استفاده بیت.<br />\nداشتگین پروتوکل: <code>$1</code>",
+       "linksearch-text": "تقریبانی په داب \"*.wikipedia.org\" شاید استفاده بیت.<br />\nداشتگین پروتوکل: $1",
        "linksearch-line": "$1 لینک بوتت چه $2",
        "linksearch-error": "تقریبیان شاید فقط ته اول نام هاست جاه کاینت.",
        "listusersfrom": "پیشدار کابرانی که شروع بنت گون:",
index 4864fe5..010629d 100644 (file)
        "viewyourtext": "Saimong mahihiling asin makokopya an gikanan kan '''saimong mga pinagriliwat''' sa pahinang ini:",
        "protectedinterface": "An pahinang ini nagtatao nin panlaog-olay para sa software, asin protektado tangaring malikayan an abuso.\nSa pagdagdag or pagliwat nin mga dakit-taramon para sa bilog na wiki, gamita tabi an [//translatewiki.net/translatewiki.net], an MediaWiki sa proyektong lokalisasyon.",
        "editinginterface": "'''Patanid:''' Ika nagliliwat kan pahina na ginagamit sa pagtao nin pantahaw-olay na teksto para sa software.\nAn mga pagbabago kaining pahina makaka-apekto sa hitsura kan pantahaw-olay nin paragamit para sa iba man na paragamit.\nPara sa mga pagdadakit-taramon, pakikonsidera man tabi an paggagamit kan [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], an MediaWiking lokalisasyon kan proyekto.",
-       "cascadeprotected": "Ining pahina pinagprotehiran gikan sa pagliliwat nin huli ta ini pinagbale sa minasunod na {{PLURAL:$1|pahina, na iyo ngani an|mga pahina, na iyo ngani an mga}} protektado kan pinagbukasang opsyon na \"pasurunod-sunudan\":\n$2",
+       "cascadeprotected": "Ining pahina pinagprotehiran gikan sa pagliliwat nin huli ta kabaling pinagbalyo sa minasunod na {{PLURAL:$1|pahina, na iyo ngani an|mga pahina, na iyo ngani an mga}} protektado na igwa nin \"pasurunod\" na opsyong pinagbuksan:\n$2",
        "namespaceprotected": "Ika mayong permiso sa pagliwat nin mga pahina sa <strong>$1</strong> na ngarang-espasyo.",
        "customcssprotected": "Ika mayong permiso sa pagliwat kaining pahinang CSS, nin huli ta ini naglalaman kan personal na panuytoy (settings) kan ibang paragamit.",
        "customjsprotected": "Ika mayong permiso sa pagliwat kaining pahinang JavaScript, nin huli ta ini naglalaman kan personal na panuytoy (settings) kan ibang paragamit.",
        "passwordreset": "Pakibago kan sekretong panlaog",
        "passwordreset-text-one": "Kumpletuhon ining porma sa pagliwat otro kan saimong pasa-taramon.",
        "passwordreset-text-many": "{{PLURAL:$1|Kaagi an saro sa mga kaaganan tanganing makaresibe nin sarong temporaryong pasa-taramon sa paagi kan e-surat.}}",
-       "passwordreset-legend": "Pakibago kan sekretong panlaog",
        "passwordreset-disabled": "An pagbago kan sekretong panlaog pinagpundo sa wiking ini.",
        "passwordreset-emaildisabled": "E-surat na mga estima pinag-uruntok sa wiking ini.",
        "passwordreset-username": "Paragamit-ngaran:",
        "resettokens": "Pakibaguha an mga paduos",
        "resettokens-text": "Ika makakapagbago kan ma paduos na magtutugot nin kalangkayan pasiring sa siyertong datos na pribado na asosyado sa saimong panindog digde.\n\nGibohon mo ini kun aksidente mong naipagheras sinda sa kiisay man o kun an saimong panindog kompromitido na.",
        "resettokens-no-tokens": "Mayo nin mga paduos na babaguhon.",
-       "resettokens-legend": "Pakibaguha an mga paduos",
        "resettokens-tokens": "Mga Paduos:",
        "resettokens-token-label": "$1 (na ngunyan na halaga: $2)",
        "resettokens-watchlist-token": "Paduos para sa hungitan nin web (Atom/RSS) kan [[Special:Watchlist|mga kaliwatan sa mga pahina nin saimong bantay-listahan]]",
        "readonlywarning": "'''Patanid tabi: An datos-sarayan nakakandado para sa maintenance, kaya ika dae makakapagtagama kan saimong mga pinagriliwat sa ngunyan.'''\nIka mapuwedeng makakopya asin idukot an saimong teksto pasiring sa sarong sagunson kan teksto asin itagama ini sa bandang huri.\n\nAn administrador na iyo an nagkandado kaini naghayag kaining kapaliwanagan: $1",
        "protectedpagewarning": "'''Patanid tabi: Ining pahina pinagprotektaran tanganing an mga paragamit sana na igwang pribilihiyo bilang administrador an makakapagliwat kaini.'''\nAn pinakahuring entrada sa talaan pinaghaya sa ibaba bilang reperensiya:",
        "semiprotectedpagewarning": "'''Note:''' Ining pahina pinagprotektaran na tanganing an mga rehistradong mga paragamit sana an mapuwedeng makapagliwat kaini.\nAn pinakahuring entrada sa talaan pinaghaya sa ibaba bilang reperensiya:",
-       "cascadeprotectedwarning": "'''Patanid:''' Nakakandado an pahinang ini tangarig an mga parágamit na igwang pribilehyo nin sysop sana an pwedeng maghirá kaini, huli ta kabali ini sa mga kataratang protektado na {{PLURAL:$1|pahina|mga pahina}}:",
+       "cascadeprotectedwarning": "<strong>Patanid:</strong> Ining pahina pinagprotehiran na tanganing an mga paragamit na igwa nin pan-administrador na mga pribilihiyo an makakaliwat kaini nin huli ta ini kabaling pinagbalyo sa minasunod na protektadong pasurunod na {{PLURAL:$1|pahina|mga pahina}}:",
        "titleprotectedwarning": "'''Patanid tabi: Ining pahina pinagprotektaran na tanganing [[Special:ListGroupRights|espesipikong karapatan]] minakaipo tanganing magmukna kaini.'''\nAn pinakahuring entrada sa talaan pinaghaya sa ibaba bilang reperensiya:",
        "templatesused": "{{PLURAL:$1|Template|Mga Panguyog}} na pinaggamit kaining pahina:",
        "templatesusedpreview": "{{PLURAL:$1|Template|Mga Panguyog}} na pinaggamit kaining patanaw:",
        "nmembers": "$1 {{PLURAL:$1|miyembro|mga miyembro}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|miyembro|mga miyembro}}",
        "nrevisions": "$1 {{PLURAL:$1|pagpakarhay|mga pagpakarhay}}",
-       "nviews": "$1 {{PLURAL:$1|hiling|mga hiling}}",
        "nimagelinks": "Ginamit sa $1 {{PLURAL:$1|pahina|mga pahina}}",
        "ntransclusions": "ginamit sa $1 {{PLURAL:$1|pahina|mga pahina}}",
        "specialpage-empty": "Mayong mga resulta para sa report na ini.",
        "linksearch-pat": "Pangarugan sa paghahanap:",
        "linksearch-ns": "Espasyong-ngaran:",
        "linksearch-ok": "Hanápon",
-       "linksearch-text": "Mga tsambang baraha arog baka kan \"*.wikipedia.org\" na puwedeng paggamiton.\nMinakaipo kisera halangkaw na kamugtakan nin kinasakupan, halimbawa \"*.org\".<br />\nSuportadong {{PLURAL:$2|protokol|mga protokol}}: <code>$1</code> (defaults to http:// kun mayong protokol na pinagkaag).",
+       "linksearch-text": "Mga tsambang baraha arog baka kan \"*.wikipedia.org\" na puwedeng paggamiton.\nMinakaipo nin kisera halangkaw na kamugtakan nin kinasakupan, halimbawa \"*.org\".<br />\nSuportadong {{PLURAL:$2|protokol|mga protokol}}: $1 (defaults to http:// kun mayong protokol na pinagkaag).",
        "linksearch-line": "$1 isinugpon gikan sa $2",
        "linksearch-error": "Mga pantsambang baraha mapuwedeng magluwas sana sa poon kan hostname.",
        "listusersfrom": "Ipahiling an mga paragamit poon sa:",
        "protect-locked-blocked": "Dai mo pwedeng bâgohon an mga tangga kan proteksyon mientras na ika nababágat. Ini an mga presenteng pwesto kan páhina '''$1''':",
        "protect-locked-dblock": "Dai puedeng ibalyo an mga nibel kan proteksión ta may actibong kandado sa base nin datos.\nIni an mga puesta sa ngunyan kaining páhina '''$1''':",
        "protect-locked-access": "Mayong permiso an account mo na magbàgo kan tangga nin proteksyon.\nUya an ngonyan na mga pwesto kan pahinang '''$1''':",
-       "protect-cascadeon": "Pigproprotektaran ining pahina sa ngonyan ta sabay ini sa mga nasunod na {{PLURAL:$1|pahina, na may|mga pahina, na may}} proteksyong katarata na nakaandar. Pwede mong bàgohon an tangga nin proteksyon kaining pahina, pero mayò ning epekto sa proteksyong katarata.",
+       "protect-cascadeon": "Ining pahina presenteng pinagprotehiran nin huli ta kabaling pinagbalyo sa minasunod na {{PLURAL:$1|pahina, na iyo ngani an|mga pahina, na iyo ngani an mga}} protektado na igwa nin \"pasurunod\" na opsyong pinagbuksan.\nAn mga kaliwatan sa lebel kan proteksyon kaining pahina dae makapag-apektar sa pasurunod na proteksyon.",
        "protect-default": "Tuguti an gabos na mga paragamit",
        "protect-fallback": "Minatugot sana sa mga paragamit na igwang \"$1\" na permiso",
        "protect-level-autoconfirmed": "Minatugot sana sa awtokumpirmadong mga paragamit",
        "htmlform-no": "Habó",
        "htmlform-yes": "Iyo",
        "htmlform-chosen-placeholder": "Magpili nin sarong opsyon",
+       "htmlform-title-not-creatable": "\"$1\" bako sarong maimumuknang titulo kan pahina",
+       "htmlform-title-not-exists": "[[:$1]] bakong eksistido.",
        "sqlite-has-fts": "$1 na igwang suporta sa kabilogang-teksto nin paghahanap",
        "sqlite-no-fts": "$1 na mayong suporta sa kabilogang-teksto nin paghahanap",
        "logentry-delete-delete": "$1 {{GENDER:$2|pinagpura na}} pahina $3",
index 42419d5..fda2f23 100644 (file)
        "linksearch-pat": "Узор для пошуку:",
        "linksearch-ns": "Прастора назваў:",
        "linksearch-ok": "Шукаць",
-       "linksearch-text": "Можна ўжываць сымбалі падстаноўкі, напрыклад, «*.wikipedia.org».\nНеабходны дамэн першага ўзроўню, напрыклад, «*.org».<br />\n{{PLURAL:$2|1=Пратакол, які падтрымліваецца|Пратаколы, якія падтрымліваюцца}}: <code>$1</code> (дапомна http://, калі пратакол не пазначаны).",
+       "linksearch-text": "Можна ўжываць сымбалі падстаноўкі, напрыклад, «*.wikipedia.org».\nНеабходны дамэн першага ўзроўню, напрыклад, «*.org».<br />\n{{PLURAL:$2|1=Пратакол, які падтрымліваецца|Пратаколы, якія падтрымліваюцца}}: $1 (дапомна http://, калі пратакол не пазначаны).",
        "linksearch-line": "Спасылка на $1 з $2",
        "linksearch-error": "Сымбалі падстаноўкі могуць ужывацца толькі ў пачатку адрасоў.",
        "listusersfrom": "Паказаць удзельнікаў, пачынаючы з:",
        "sessionfailure": "Магчыма ўзьніклі праблемы ў Вашым цяперашнім сэансе працы;\nгэта дзеяньне было скасавана для прадухіленьня перахопу сэансу.\nКалі ласка, націсьніце «назад» і перазагрузіце старонку, зь якой Вы прыйшлі, і паспрабуйце ізноў.",
        "changecontentmodel": "Зьмена мадэлі зьместу старонкі",
        "changecontentmodel-legend": "Зьмена мадэлі зьместу",
+       "changecontentmodel-title-label": "Назва старонкі",
+       "changecontentmodel-model-label": "Новая мадэль зьместу",
+       "changecontentmodel-reason-label": "Прычына:",
+       "changecontentmodel-success-title": "Мадэль зьместу была зьмененая",
+       "changecontentmodel-success-text": "Тып зьместу [[:$1]] быў зьменены.",
+       "changecontentmodel-cannot-convert": "Зьмест [[:$1]] ня можа быць ператвораны ў тып $2.",
+       "changecontentmodel-title-cantexist": "Немагчыма мець старонку ў $1.",
+       "changecontentmodel-nodirectediting": "Мадэль зьместу $1 не падтрымлівае наўпроставае рэдагаваньне",
+       "log-name-contentmodel": "Журнал зьменаў мадэляў зьместу",
+       "log-description-contentmodel": "Падзеі, зьвязаныя з мадэлямі зьместу старонак",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} мадэль зьместу старонкі $3 з «$4» на «$5»",
+       "logentry-contentmodel-change-revertlink": "адкаціць",
+       "logentry-contentmodel-change-revert": "адкат",
        "protectlogpage": "Журнал абаронаў",
        "protectlogtext": "Ніжэй пададзены сьпіс зьменаў абароны старонкі.\nГлядзіце [[Special:ProtectedPages|сьпіс абароненых старонак на цяперашні момант]].",
        "protectedarticle": "абароненая «[[$1]]»",
        "tooltip-watchlistedit-raw-submit": "Абнавіць сьпіс назіраньня",
        "tooltip-recreate": "Аднавіць старонку, ня гледзячы на тое, што яна была выдаленая",
        "tooltip-upload": "Пачаць загрузку",
-       "tooltip-rollback": "«Ð\90дкаÑ\82» Ð²Ñ\8fÑ\80Ñ\82ае Ñ\80Ñ\8dдагаванÑ\8cнÑ\96 Ð¿Ð°Ð¿Ñ\8fÑ\80Ñ\8dднÑ\8fга Ñ\9eдзелÑ\8cнÑ\96ка Ð°Ð´Ð½Ñ\8bм ÐºÐ»Ñ\96кам.",
+       "tooltip-rollback": "«Ð\90дкаÑ\82» Ð¿Ñ\80Ñ\8bбÑ\96Ñ\80ае Ñ\80Ñ\8dдагаванÑ\8cнÑ\96 Ð°Ð¿Ð¾Ñ\88нÑ\8fга Ñ\9eдзелÑ\8cнÑ\96ка Ð°Ð´Ð½Ñ\8bм Ð½Ð°Ñ\86Ñ\96Ñ\81канÑ\8cнем",
        "tooltip-undo": "«Скасаваць» — скасоўвае гэтае рэдагаваньне і адкрывае акно рэдагаваньня ў рэжыме прагляду.\nДазваляе дадаваць прычыну адкату ў апісаньне зьменаў.",
        "tooltip-preferences-save": "Захаваць налады",
        "tooltip-summary": "Увядзіце кароткае апісаньне",
        "pageinfo-robot-index": "Дазволеная",
        "pageinfo-robot-noindex": "Не дазволеная",
        "pageinfo-watchers": "Колькасьць назіральнікаў і назіральніц",
+       "pageinfo-visiting-watchers": "Колькасьць удзельнікаў, якія назіраюць за старонкай і бачылі апошнія зьмены",
        "pageinfo-few-watchers": "Менш за $1 {{PLURAL:$1|назіральніка|назіральнікі|назіральнікаў}}",
+       "pageinfo-few-visiting-watchers": "Могуць быць, а могуць ня быць удзельнікі, якія назіраюць за старонкай і бачылі апошнія зьмены",
        "pageinfo-redirects-name": "Перанакіраваньняў на гэтую старонку",
        "pageinfo-subpages-name": "Колькасьць падстаронак",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|перанакіраваньне|перанакіраваньні|перанакіраваньняў}}; $3 {{PLURAL:$3|звычайная|звычайныя|звычайных}})",
        "metadata-help": "Гэты файл утрымлівае дадатковую інфармацыю, хутчэй за ўсё дададзеную зь лічбавай фотакамэры ці сканэра.\nКалі файл рэдагаваўся пасьля стварэньня, то частка зьвестак можа не адпавядаць зьмененаму файлу.",
        "metadata-expand": "Паказаць падрабязнасьці",
        "metadata-collapse": "Схаваць падрабязнасьці",
-       "metadata-fields": "Палі мэта-зьвестак выявы з гэтага сьпісу будуць паказаныя на старонцы выявы, калі табліца мэта-зьвестак будзе згорнутая.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-fields": "Палі мэта-зьвестак выявы з гэтага сьпісу будуць паказаныя на старонцы выявы, калі табліца мэта-зьвестак будзе згорнутая. Іншыя будуць схаваныя па змоўчаньні.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "Шырыня",
        "exif-imagelength": "Вышыня",
        "exif-bitspersample": "Глыбіня колеру",
        "tags-delete-too-many-uses": "Метка «$1» выкарыстаная ў больш чым $2 {{PLURAL:$2|вэрсіі|вэрсіях}}, адпаведна, яна ня можа быць выдаленая.",
        "tags-delete-warnings-after-delete": "Метка «$1» была пасьпяхова выдаленая, але {{PLURAL:$2|1=атрыманае наступнае папярэджаньне|атрыманыя наступныя папярэджаньні}}:",
        "tags-activate-title": "Актываваць метку",
+       "tags-activate-question": "Вы зьбіраецеся актываваць метку «$1».",
+       "tags-activate-reason": "Прычына:",
+       "tags-activate-not-allowed": "Немагчыма актываваць метку «$1».",
+       "tags-activate-not-found": "Метка «$1» не існуе.",
+       "tags-activate-submit": "Актываваць",
+       "tags-deactivate-title": "Дэактываваць метку",
+       "tags-deactivate-question": "Вы зьбіраецеся дэактываваць метку «$1».",
+       "tags-deactivate-reason": "Прычына:",
+       "tags-deactivate-not-allowed": "Немагчыма дэактываваць метку «$1».",
+       "tags-deactivate-submit": "Адключыць",
+       "tags-apply-no-permission": "Вы ня маеце права прымяняць меткі да вашых рэдагаваньняў.",
+       "tags-edit-title": "Рэдагаваньне метак",
+       "tags-edit-manage-link": "Кіраваньне меткамі",
+       "tags-edit-revision-selected": "{{PLURAL:$1|1=Абраная вэрсія|Абраныя вэрсіі}} [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|1=Абраны запіс|Абраныя запісы}} журнала:",
+       "tags-edit-revision-legend": "Дадаць ці прыбраць меткі з {{PLURAL:$1|1=гэтай вэрсіі|усіх $1 вэрсіяў}}",
+       "tags-edit-logentry-legend": "Дадаць ці прыбраць меткі з {{PLURAL:$1|1=гэтага запісу|усіх $1 запісаў}} журналу",
+       "tags-edit-existing-tags": "Наяўныя меткі:",
+       "tags-edit-existing-tags-none": "«Няма»",
+       "tags-edit-new-tags": "Новыя меткі:",
+       "tags-edit-add": "Дадаць гэтыя меткі:",
+       "tags-edit-remove": "Выдаліць гэтыя меткі:",
+       "tags-edit-remove-all-tags": "(выдаліць усе меткі)",
+       "tags-edit-chosen-placeholder": "Абярыце меткі",
        "comparepages": "Параўнаньне старонак",
        "compare-page1": "Старонка 1",
        "compare-page2": "Старонка 2",
        "htmlform-cloner-create": "Дадаць больш",
        "htmlform-cloner-delete": "Выдаліць",
        "htmlform-cloner-required": "Патрабуецца як мінімум яшчэ адно значэньне.",
+       "htmlform-user-not-exists": "<strong>$1</strong> не існуе.",
+       "htmlform-user-not-valid": "<strong>$1</strong> — некарэктнае імя карыстальніка.",
        "sqlite-has-fts": "$1 з падтрымкай поўнатэкстнага пошуку",
        "sqlite-no-fts": "$1 без падтрымкі поўнатэкстнага пошуку",
        "logentry-delete-delete": "$1 {{GENDER:$2|выдаліў|выдаліла}} старонку $3",
        "revdelete-uname-unhid": "імя ўдзельніка адкрытае",
        "revdelete-restricted": "ужыць абмежаваньні для адміністратараў",
        "revdelete-unrestricted": "зьнятыя абмежаваньні для адміністратараў",
+       "logentry-block-block": "$1 {{GENDER:$2|заблякаваў|заблякавала}} {{GENDER:$4|$3}} на тэрмін $5 $6",
+       "logentry-block-unblock": "$1 {{GENDER:$2|разблякаваў|разблякавала}} {{GENDER:$4|$3}}",
+       "logentry-suppress-block": "$1 {{GENDER:$2|заблякаваў|заблякавала}} {{GENDER:$4|$3}} на тэрмін $5 $6",
        "logentry-merge-merge": "$1 {{GENDER:$2|аб’яднаў|аб’яднала}} $3 у $4 (вэрсіі да $5)",
        "logentry-move-move": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4 без пакінутага перанакіраваньня",
index 59edae7..f1c9dc3 100644 (file)
        "passwordreset": "Выслаць мне новы пароль",
        "passwordreset-text-one": "Запоўніце гэту форму, каб атрымаць часовы пароль па эл.пошце.",
        "passwordreset-text-many": "{{PLURAL:$1|Запоўніце адно з палёў, каб атрымаць тымчасовы пароль па электроннай пошце.}}",
-       "passwordreset-legend": "Пераўстанавіць пароль",
        "passwordreset-disabled": "Функцыя пераўсталёўкі пароля адключаная на гэтай вікі.",
        "passwordreset-emaildisabled": "Функцыі эл.пошты адключаны на гэтай Вікі.",
        "passwordreset-username": "Імя ўдзельніка:",
        "resettokens": "Скінуць токены",
        "resettokens-text": "Вы можаце пераўстанавіць токены, якія дазваляюць атрымліваць доступ да пэўных прыватных звестак, звязаных з вашым уліковым запісам.\n\nВы мусіце скінуць токены, калі выпадкова падзяліліся імі з кім-небудзь, ці ваш уліковы запіс быў скампраметаваны.",
        "resettokens-no-tokens": "Няма чаго скідваць.",
-       "resettokens-legend": "Скідванне токенаў",
        "resettokens-tokens": "Токены:",
        "resettokens-token-label": "$1 (актуальнае значэнне: $2)",
        "resettokens-watchlist-token": "Токен струменя (Atom/RSS) [[Special:Watchlist|зменаў старонак у вашым спісе назірання]]",
        "nmembers": "$1 {{PLURAL:$1|складнік|складнікі|складнікаў}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|складнік|складнікі|складнік}}",
        "nrevisions": "$1 {{PLURAL:$1|версія|версіі|версій}}",
-       "nviews": "$1 {{PLURAL:$1|паказ|паказаў}}",
        "nimagelinks": "Выкарыстоўваецца на $1 {{PLURAL:$1|старонцы|старонках|старонках}}",
        "ntransclusions": "выкарыстоўваецца на $1 {{PLURAL:$1|старонцы|старонках|старонках}}",
        "specialpage-empty": "Няма вынікаў для гэтай справаздачы.",
        "linksearch-pat": "Што шукаецца:",
        "linksearch-ns": "Прастора назваў:",
        "linksearch-ok": "Знайсці",
-       "linksearch-text": "Можна выкарыстоўваць падстаноўныя сімвалы, напрыклад, <code>*.wikipedia.org</code>.\nНеабходзен прынамсі дамен верхняга ўзроўню, напрыклад <code>*.org</code><br />\n{{PLURAL:$2|Пратакол|Пратаколы}}, якія падтрымліваюцца: <code>$1</code> (прадвызначаны http:// калі пратакол не ўказаны)",
+       "linksearch-text": "Можна выкарыстоўваць падстаноўныя сімвалы, напрыклад, <code>*.wikipedia.org</code>.\nНеабходзен прынамсі дамен верхняга ўзроўню, напрыклад <code>*.org</code><br />\n{{PLURAL:$2|Пратакол|Пратаколы}}, якія падтрымліваюцца: $1 (прадвызначаны http:// калі пратакол не ўказаны)",
        "linksearch-line": "$1, на які спасылаецца $2",
        "linksearch-error": "Узоры можна ставіць толькі ў пачатак адрасу.",
        "listusersfrom": "Паказаць удзельнікаў, пачаўшы з:",
index a3d77f7..e931c0d 100644 (file)
        "passwordreset": "Възстановяване на парола",
        "passwordreset-text-one": "Попълването на формуляра ще доведе до възстановяване на паролата.",
        "passwordreset-text-many": "{{PLURAL:$1|За получаване на временна парола по електронна поща е необходимо да попълните едно от полетата.}}",
-       "passwordreset-legend": "Възстановяване на парола",
        "passwordreset-disabled": "Възстановяването на паролата е изключено в това уики.",
        "passwordreset-emaildisabled": "Функцията за електронна поща е изключена в това уики.",
        "passwordreset-username": "Потребителско име:",
        "changeemail-throttled": "Направили сте твърде много опити за влизане в системата. \nМоля, изчакайте $1 преди следващия опит.",
        "resettokens": "Изчистване на маркерите",
        "resettokens-no-tokens": "Няма маркери за изчистване.",
-       "resettokens-legend": "Изчистване на маркерите",
        "resettokens-tokens": "Маркери:",
        "resettokens-token-label": "$1 (текуща стойност: $2)",
        "resettokens-watchlist-token": "Маркер за уеб хранилка (Atom/RSS) на [[Special:Watchlist|промени на страници от списъка Ви за наблюдение]]",
        "randomincategory-nopages": "В категория [[:Category:$1|$1]] няма страници.",
        "randomincategory-category": "Категория:",
        "randomincategory-legend": "Случайна страница от категорията",
+       "randomincategory-submit": "Отваряне",
        "randomredirect": "Случайно пренасочване",
        "randomredirect-nopages": "В именно пространство „$1“ няма пренасочвания.",
        "statistics": "Статистика",
        "nmembers": "$1 {{PLURAL:$1|член|члена}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|член|члена}}",
        "nrevisions": "$1 {{PLURAL:$1|версия|версии}}",
-       "nviews": "$1 {{PLURAL:$1|преглед|прегледа}}",
        "nimagelinks": "Използва се в $1 {{PLURAL:$1|страница|страници}}",
        "ntransclusions": "използва се в $1 {{PLURAL:$1|страница|страници}}",
        "specialpage-empty": "Страницата е празна.",
        "linksearch-pat": "Търсене по:",
        "linksearch-ns": "Именно пространство:",
        "linksearch-ok": "Търсене",
-       "linksearch-text": "Възможна е употребата на заместващи знаци като: „*.wikipedia.org“.\nНеобходим е поне домейн от най-високо ниво, например „*.org“.<br />\n{{PLURAL:$2|Поддържан протокол|Поддържани протоколи}}: <code>$1</code> (ако не е посочено, по подразбиране се използва http:// ).",
+       "linksearch-text": "Възможна е употребата на заместващи знаци като: „*.wikipedia.org“.\nНеобходим е поне домейн от най-високо ниво, например „*.org“.<br />\n{{PLURAL:$2|Поддържан протокол|Поддържани протоколи}}: $1 (ако не е посочено, по подразбиране се използва http:// ).",
        "linksearch-line": "$1 с препратка от $2",
        "linksearch-error": "Заместващите знаци могат да стоят само в началото на името на хоста.",
        "listusersfrom": "Показване на потребителите, започвайки от:",
index 8dc411f..6e2d5bd 100644 (file)
        "categorypage": "دیستین تهری تاکدیمی",
        "viewtalkpage": "گپ تاکدیمی نشان داتین",
        "otherlanguages": "بی دیگه زبانانی تا",
-       "redirectedfrom": "(تغییرمسیر داتین شه $1)",
+       "redirectedfrom": "(گردینته بوته شه $1 ئا)",
        "redirectpagesub": "تاکدیمی تغییرمسیر داتین",
-       "redirectto": "تغییر مسیر بی:",
+       "redirectto": "گردینتین په:",
        "lastmodifiedat": "ای تاکدیم آخرین‌ وارا بی $1 سائت $2 تا تغییر بوته.",
        "viewcount": "شه ای تاکدیما کسی {{PLURAL:$1|یکوار|$1ور}} دیدن کورته.",
        "protectedpage": "قُلپ بوتگین تاکدیم",
        "passwordreset": "پاک کورتین پاسوردئ",
        "passwordreset-text-one": "په پدا نادینتین ایمیلی پاسوردی خاتیرا ای فرم ئا پر کنیت.",
        "passwordreset-text-many": "{{PLURAL:$1|په موقتی ئین چیهرگال ئی گیپتین شه ایمیلئ راه ئا، یکی شه زمینه‌هان ئا پر کنیت.}}",
-       "passwordreset-legend": "پاک کورتین پاسوردئ",
        "passwordreset-disabled": "ای ویکی ئی تا پاسورد یا چیهرگالی پدا بیئر گردینتین غیر پئال اینت.",
        "passwordreset-emaildisabled": "ایمیلی گزینه بی ای یکی ئی تا پئال نه ونت.",
        "passwordreset-username": "کار زوروکین نام:",
        "changeemail-throttled": "شما بیخی باز وار په لوگین بوتینا کوشش کورته ایت.\nمهربانئ بکنیت دیم شه آیی که پدا کوشش بکنیت $1 صبر کنیت.",
        "resettokens": "بیئر گردینتین نشانگ ئانی",
        "resettokens-no-tokens": "هیچ نشانگ ئی په ریست کورتین ئا وجود نداریت.",
-       "resettokens-legend": "بیئر گردینتین نشانگ ئانی",
        "resettokens-tokens": "نشانگان:",
        "resettokens-token-label": "$1 (انونین اندازه گ: $2)",
        "resettokens-done": "بیئر گردینتین نشانگ ئان.",
        "note": "'''نکته:'''",
        "previewnote": "'''بئ هوش ئا داشته بیئت که ای په قت دیم اینت.'''\nشمی تغیرات تا انون زه خیره نه بوته انت!",
        "continue-editing": "شوتین بی ایڈ\tیٹ\tی نیمگا",
-       "editing": "بی ایڈ\tیٹ\t کورتینی حالا $1",
-       "creating": "بی جوڑ کورتینی حالا $1",
-       "editingsection": "بئ $1 ئی ایڈیٹ کورتینئ حالا (بخش)",
+       "editing": "به $1 ئی دستکاری کورتینێ حالا",
+       "creating": "$1 جۆڑ ئه بيت",
+       "editingsection": "به $1 ئی دستکاری کورتینێ حالا (چونڑ)",
        "editingcomment": "بئ $1 ئی ایڈیٹ کورتینئ حالا (نوکین بخش)",
        "editconflict": "هجومین ایڈیٹ: $1",
+       "explainconflict": "شه وختی که شما ای دیمێ دستکاری ئا شرو کورتێت یک دیگه نپری آیرا ٹگل دات.\nبُرزگین متنین جاگه شامل ئه بیت شه اي دیمێ رقم، به انونین حالتێ تا.\nشمێ ٹگل به متنێ جهلگا نشان داته بوته انت.\nشما باید وتي ٹگل ئانه گۆ انونین متنا لۆڑ کنیت.\nگو \"{{int:savearticle}}\" کيلی ئی پرنچیتین ئا <strong>تانا</strong> بُرزگین متني ئین متنێ جاگه ذخیره ئه بیت.",
        "yourtext": "شمی متن",
        "storedversion": "ذخیره بوته ئین نخسه",
+       "editingold": "'''توجه: شما به ای تاکدیمێ کهنگین نخسه ئی جۆڑ کورتينێ حالا هستیت.'''\nاگه ایشیرا ذخیره‌بکنیت ، هر تغییری که پدا شه ای نخسه ئا بوته انت شه بێن ئه رونت.",
        "yourdiff": "تفاوت‌هان",
        "templatesused": "{{PLURAL:$1|تراشوان|تراشوانان}} استفاده بوته انت بی ای تاکدیمئ تا:",
        "templatesusedpreview": "ای دیم دیست ئی تا استفاده بوته ئین {{PLURAL:$1|تراشوان|تراشوانان}} :",
        "searchprofile-everything-tooltip": "گشتین په موچین محتوا ئان (شاملئ گپ ئی تاکدیمان)",
        "searchprofile-advanced-tooltip": "گشتین بی فضای نام دلخواه",
        "search-result-size": "$1 ({{PLURAL:$2|یک کلیمه|$2 کلیمه}})",
-       "search-redirect": "(تغییرمسیر $1)",
+       "search-redirect": "($1 یي گردینتین)",
        "search-section": "(بخش $1)",
        "search-category": "(تهر  $1)",
        "search-file-match": "(فایلی محتوایی یکرنگی)",
        "right-createtalk": "گپ ئی تاکدیمی جوڑ\t کورتین",
        "right-createaccount": "کار زوروکئ حسابئ جوڑ\t کورتین",
        "right-minoredit": "نشانی کورتین ایڈیٹانی بئ ئنوان کم ئین",
-       "right-move": "تاکدیمی انتقال",
-       "right-move-subpages": "تاکدÛ\8cÙ\85اÙ\86ئ Ø§Ù\86تÙ\82اÙ\84 Ú¯Ù\88 Ø¢Ù\88اÙ\86 Ú¯Ù\88Ù\86Ú\88دÛ\8cÙ\85 Ø¦ان",
+       "right-move": "تاکدیمئ جابجا کورتین",
+       "right-move-subpages": "تاکدÛ\8cÙ\85اÙ\86ئ Ø¬Ø§Ø¨Ø¬Ø§Û\8cÙ\8a Ú¯Û\86 Ø¢Ù\88اÙ\86Ù\8a Ú¯Û\86Ù\86Ú\88دÛ\8cÙ\85ان",
        "right-move-rootuserpages": "کار زوروکین سرشاخه ئین تاکدیمانئ انتقال",
        "right-move-categorypages": "تهر تاکدیمئ انتکال",
        "right-movefile": "فایلی انتقال",
-       "right-suppressredirect": "تاکدÛ\8cÙ\85ئ Ø§Ù\86تÙ\82اÙ\84 Ø¨Û\8cدÙ\88Ù\86 Ø´Ù\87 Ø¯Û\8cÙ\85Û\8cÙ\86 Ù\86اÙ\85Û\8c ØªØºÛ\8cرÙ\85سÛ\8cر Ø¦Û\8c Ø¬Ù\88Ú\91 Ú©Ù\88رتÛ\8cÙ\86",
+       "right-suppressredirect": "تاکدÛ\8cÙ\85ئ Ø¬Ø§Ø¨Ø¬Ø§ Ú©Ù\88رتÛ\8cÙ\86 ØºÛ\8cر Ø´Ù\87 Ø¯Û\8cÙ\85Û\8cÙ\86 Ù\86اÙ\85ئ Ú¯Ø±Ø¯Û\8cÙ\86تÛ\8cÙ\86ا",
        "right-upload": "فایلی بُرز کورتین",
        "right-reupload": "پدا نیویشتین موجودین فایلئ",
        "right-reupload-own": "آ فایلی پدا بُرز کورتین که دیمتیرا هم شه هما کار زوروکی نیمگا یک وار بُرز بوتت",
        "upload-proto-error-text": "بُرز کورتین شه دوردستا به ادرس ئان که گو <code dir=ltr>http://</code> یا <code dir=ltr>ftp://</code>  ئی شرو بیئنت ضرورت داریت .",
        "upload-file-error": "داخلین خطا",
        "upload-misc-error": "نامئلومین خطا بی بُرزکورتینئ تا",
-       "upload-too-many-redirects": "انترنیتی ادرس به شه اندازه ئا تغیرمسیر داریت",
+       "upload-too-many-redirects": "ای انترنیتین ادرس شه اندازه ئا گیشتیر گردینته بوته ئین دیم داریت",
        "upload-http-error": "یک  اچ‌تی‌تی‌پی خطا رخ داته: $1",
        "upload-copy-upload-invalid-domain": "بُرز بوته فایلانی کاپی کورتین شه ای ڈومین ئا امکان نداریت.",
        "backend-fail-stream": "نه توانن $1 ئی فایلا دیم دهین.",
        "mimetype": "MIME ئی رکم:",
        "download": "ائیر کورتین",
        "unwatchedpages": "دیسته نه یوته ئین تاکدیمان",
-       "listredirects": "تغیرمسیر ئی تاکدیمانی لڑ",
+       "listredirects": "گردینته بوته ئین تاکدیمانی لڑلیست",
        "listduplicatedfiles": "موچین فایل ئانی لڑ ، لۆڑ گۆ تکراری ئان",
        "listduplicatedfiles-entry": "[[:File:$1|$1]][[$3|{{PLURAL:$2|یک تکرار|$2 تکرار}}]] داریت.",
        "unusedtemplates": "استفاده نه بوته ئین تراشوانان",
        "randomincategory-nopages": "هیچ تاکدیمی بئ  [[:Category:$1|$1]] ئی تهری تا موجود نه اینت.",
        "randomincategory-category": "تهر:",
        "randomincategory-legend": "تصادفین تاکدیم بئ تهرئی تا",
-       "randomredirect": "تغÛ\8cÛ\8cرÙ\85سÛ\8cر ØªØµØ§Ø¯Ù\81Û\8c",
+       "randomredirect": "بÛ\8e Ù\82ستÛ\8cÙ\86 Ú¯Ø±Ø¯Û\8cÙ\86تÛ\8cÙ\86",
        "randomredirect-nopages": "هیج تغیر مسیر بئ  «$1» ئی نامی فضای تا موجود نه اینت.",
        "statistics": "ارقام",
        "statistics-header-pages": "ای تاکدیمئ ارقام",
        "pageswithprop-submit": "برا",
        "pageswithprop-prophidden-long": "($1) ئی تچکین متنی چیهرین جزییات",
        "pageswithprop-prophidden-binary": "($1) ئی باینری چیهرین اندازگ ئی جزییات",
-       "doubleredirects": "دوتائین تغیرمسیرئان",
+       "doubleredirects": "ڈبل گردینتێن",
        "double-redirect-fixer": "تغیرمسیرئانی تئمیرکار",
        "brokenredirects": "خرابین تغیرمسیر",
        "brokenredirectstext": "جهلگین تغییرمسیرئان بئ یک ناموجودین دیمی لینک دارنت:",
        "newpages": "نوکین تاکدیم",
        "newpages-username": "کار زوروکین نام:",
        "ancientpages": "کهنگین تاکدیمان",
-       "move": "اÙ\86تÙ\82اÙ\84",
+       "move": "جابجاÛ\8cÙ\8a",
        "movethispage": "ای تاکدیمی انتقال",
        "notargettitle": "بی شه هدفا",
        "nopagetitle": "ایرنگی تاکدیمئ وجود نداریت",
        "table_pager_empty": "هیچ نتیجه",
        "autosumm-blank": "تاکدیما خالی کورت",
        "autosumm-replace": "تاکدیمی جابجایی گۆ '$1'",
-       "autoredircomment": "جÙ\87ت Û\8cÛ\8c ØªØºÛ\8cر Ø¨Ø¦ [[$1]]",
+       "autoredircomment": "اÛ\8c ØªØ§Ú©Ø¯Û\8cÙ\85 Ø¨Ù\87 [[$1]] Ø¦Ø§ Ú¯Ø±Ø¯Û\8cÙ\86تÙ\87 Ø¨Ù\88ت",
        "autosumm-new": "نوکین دیمی گۆ «$1» ئا جۆڑ کورت",
        "autosumm-newblank": "خالی ئین دیمی جۆڑ بوت",
        "watchlistedit-normal-title": "دیدارلیست ئی ایڈیٹ کورتین",
        "version-libraries": "نصب بوته ئین کتابخانه",
        "version-libraries-library": "کتابجاه",
        "version-libraries-version": "نخسه",
-       "redirect-legend": "جابجا په یک پایل یا دیم ئی",
+       "redirect-legend": "گردینتین په یک پایل یا تاکدیمئ",
        "redirect-submit": "برا",
        "redirect-lookup": "گشتین:",
        "redirect-value": "اندازه گ:",
        "specialpages-group-pages": "تاکدیمانی لڑ\t لیست",
        "specialpages-group-pagetools": "تاکدیمانئ وسایلان",
        "specialpages-group-wiki": "دتا و وسایلان",
-       "specialpages-group-redirects": "مسیر ئی تغیری خاسین تاکدیمان",
+       "specialpages-group-redirects": "گردینۆکین خاسین تاکدیمان",
        "specialpages-group-spam": "سپم ئی وسایلان",
        "specialpages-group-developer": "توسه ئه دهوکین وسایلان",
        "blankpage": "خالی ئین دیم",
        "special-characters-group-khmer": "خمر",
        "special-characters-title-endash": "پاسیله خت",
        "special-characters-title-emdash": "تچکین پاسیله خت",
-       "special-characters-title-minus": "منپی نشانگ"
+       "special-characters-title-minus": "منپی نشانگ",
+       "mw-widgets-titleinput-description-redirect": "گردینتین به $1 یی تا"
 }
index f5189a1..b0a7ed1 100644 (file)
        "category-file-count-limited": "वर्तमान में निम्नलिखित {{PLURAL:$1|पन्ना|$1 पन्नां}} इ श्रेणीं में बाड़े।",
        "listingcontinuesabbrev": "जारी...",
        "index-category": "सूचीबद्ध पृष्ठ",
-       "noindex-category": "à¤\85सà¥\82à¤\9aà¥\80बदà¥\8dध à¤ªà¥\83षà¥\8dठ",
+       "noindex-category": "बिना à¤¸à¥\82à¤\9aà¥\80बदà¥\8dध à¤ªà¤¨à¥\8dना",
        "broken-file-category": "टूटल फ़ाइल कड़ियन वाला पन्ना",
        "about": "बारे में",
        "article": "सामग्री पन्ना",
        "nstab-project": "प्रोजेक्ट पन्ना",
        "nstab-image": "फाइल",
        "nstab-mediawiki": "सन्देश",
-       "nstab-template": "साà¤\81à¤\9aा",
+       "nstab-template": "à¤\9fà¥\87मà¥\8dपलà¥\87à¤\9f",
        "nstab-help": "मदद पन्ना",
        "nstab-category": "श्रेणी",
        "nosuchaction": "अईसन कौनो कार्रवाई नाहि",
        "passwordreset": "गुप्तशब्द (पासवर्ड) रिसेट करीं",
        "passwordreset-text-one": "आपन गुप्तशब्द के पुनर्स्थापित करे खातिर इ फॉर्म भरीं।",
        "passwordreset-text-many": "{{PLURAL:$1|ईमेल द्वारा अस्थाई पासवर्ड पावे खातिर निम्न में से कउनो एगो स्थान भरीं।}}",
-       "passwordreset-legend": "गुप्तशब्द रिसेट करीं",
        "passwordreset-disabled": "इ विकी पर पासवर्ड पुनर्स्थापन अक्षम बा।",
        "passwordreset-emaildisabled": "इ विकि पर ई-मेल सुविधा अक्षम कर दिहल गईल बा।",
        "passwordreset-username": "प्रयोगकर्ता नाम",
        "resettokens": "टोकन रीसेट करीं",
        "resettokens-text": "जौन टोकन राउर खाता से सम्बद्ध कुछ विशिष्ट व्यक्तिगत जानकारी प्रदान करेला, आप उ के अहिजा रीसेट कर सकत बानी।\n\nयदि रउआ ई के गलती से केहू के दिखा देले बानी या फिर राउर खाता हैक हो गईल बा त रउआ ई के रीसेट कर देवे के चाहीं।",
        "resettokens-no-tokens": "रीसेट करे खातिर कउनो टोकन नइखे।",
-       "resettokens-legend": "टोकन रीसेट करीं",
        "resettokens-tokens": "टोकन:",
        "resettokens-token-label": "$1 (वर्तमान मूल्य: $2)",
        "resettokens-watchlist-token": "[[Special:Watchlist|आपके ध्यानसूची के पन्नन में बदलावसभ]] के वेब फ़ीड (Atom/RSS) हेतु टोकन",
        "yourtext": "राउर पाठ्य",
        "storedversion": "सुरक्षित करल गईल संशोधन",
        "yourdiff": "अंतर",
-       "templatesused": "ए पन्ना पर इस्तेमाल {{PLURAL:$1|साँचा|साँचा कुल}}:",
-       "templatesusedpreview": "इ पुर्वावलोकन में प्रयुक्त {{PLURAL:$1|खाँचा|खाँचा कुल}}:",
+       "templatesused": "ए पन्ना पर इस्तेमाल {{PLURAL:$1|टेम्पलेट|टेम्पलेट कुल}}:",
+       "templatesusedpreview": "इ पुर्वावलोकन में प्रयुक्त {{PLURAL:$1|टेम्पलेट|टेम्पलेट कुल}}:",
+       "templatesusedsection": "एह खण्ड में इस्तेमाल {{PLURAL:$1|टेम्पलेट|कुल}}:",
        "template-protected": "(सुरक्षित)",
        "template-semiprotected": "(कुछ-सुरक्षित)",
        "hiddencategories": "ई पन्ना {{PLURAL:$1|1 छिपल श्रेणी|$1 छिपल श्रेणीसभ}} के सदस्य बा:",
        "listfiles_thumb": "चिप्पी",
        "listfiles_date": "तिथि",
        "listfiles_name": "नाँव",
+       "listfiles_user": "सदस्य",
+       "listfiles_description": "विवरण",
+       "listfiles_count": "संस्करण",
+       "listfiles-latestversion": "वर्तमान संस्करण",
        "file-anchor-link": "फाइल",
        "filehist": "पन्ना के इतिहास",
        "filehist-help": "ओ समय ई फाइल कइसन लउके ई देखे खातिर कौनों तारीख/समय पर क्लिक करीं।",
        "randompage": "बेतरतीब पन्ना",
        "randomincategory": "श्रेणी में अनियमित पन्ना",
        "randomincategory-nopages": "[[:Category:$1|$1]] श्रेणी में कउनो पन्ना नइखे।",
+       "randomincategory-category": "श्रेणी:",
        "randomincategory-legend": "श्रेणी में अनियमित पन्ना",
-       "statistics": "तथ्यांकसभ",
-       "statistics-header-edits": "तथ्यांक सम्पादन",
-       "statistics-header-hooks": "अन्य तथ्यांक",
+       "randomincategory-submit": "जाईं",
+       "statistics": "सांख्यिकी",
+       "statistics-header-pages": "पन्ना सांख्यिकी",
+       "statistics-header-edits": "संपादन सांख्यिकी",
+       "statistics-header-users": "सदस्य सांख्यिकी",
+       "statistics-header-hooks": "अन्य सांख्यिकी",
+       "statistics-articles": "सामग्री पन्ना",
+       "statistics-pages": "पन्ना सभ",
+       "statistics-pages-desc": "विकि पर सगरी पन्ना, वार्ता पन्ना, अनुप्रेषण इत्यादि समेत।",
+       "statistics-files": "अपलोड कइल फाइल सभ",
+       "statistics-edits": "{{SITENAME}} सेट अप की बाद पन्ना संपादन संख्या",
+       "statistics-edits-average": "प्रति पन्ना औसत संपादन",
+       "statistics-users": "रजिस्टर्ड [[Special:ListUsers|सदस्य]]",
+       "statistics-users-active": "सक्रिय सदस्य",
+       "statistics-users-active-desc": "सदस्य लोग जे पछिला {{PLURAL:$1|दिन|$1 दिन}} में कौनों काम कइले बाटे",
        "pageswithprop": "पन्ना-गुण वाला पन्नासभ",
+       "pageswithprop-legend": "पन्ना प्रापर्टी वाला पन्ना सभ",
+       "pageswithprop-prop": "प्रापर्टी नाँव:",
+       "pageswithprop-submit": "जाईं",
        "doubleredirects": "दोहरा पुननिर्देशित पन्ना",
        "brokenredirects": "टूटल पुनर्निर्देशन पन्ना",
+       "brokenredirects-edit": "संपादन",
+       "brokenredirects-delete": "मिटाईं",
        "withoutinterwiki": "बिना अंतरविकि जोड़ वाला पन्ना",
+       "withoutinterwiki-summary": "ई पन्ना सभ कौनों दुसरा भाषा की वर्जन से नइखे जुड़ल।",
+       "withoutinterwiki-legend": "उपसर्ग",
+       "withoutinterwiki-submit": "देखाईं",
        "fewestrevisions": "सबसे कम संशोधन वाला पन्ना",
        "nbytes": "$1 {{PLURAL:$1|बाइट|बाइट्स}}",
        "ncategories": "{{PLURAL:$1|श्रेणी|श्रेणीसभ}}",
+       "ninterwikis": "$1 {{PLURAL:$1|इंटरविकि|इंटरविकि सभ}}",
+       "nlinks": "$1 {{PLURAL:$1|कड़ी|कड़ी सभ}}",
+       "nmembers": "$1 {{PLURAL:$1|मेंबर|मेंबर सभ}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|मेंबर|मेंबर सभ}}",
+       "nrevisions": "$1 {{PLURAL:$1|रिवीजन|रिवीजन सभ}}",
+       "nimagelinks": "Used on $1 {{PLURAL:$1|पन्ना|पन्ना सभ}}",
+       "ntransclusions": "used on $1 {{PLURAL:$1|पन्ना|पन्ना सभ}}",
+       "specialpage-empty": "एह रिपोर्ट खातिर कौनों रिजल्ट नइखे",
        "lonelypages": "अनाथ पन्ना",
        "lonelypagestext": "ई पन्ना कुल कौनों दूसर पन्ना से नइखें जुड़ल न कौनों में ट्रांसक्लूड बाड़ें",
        "uncategorizedpages": "बिना श्रेणी के पन्ना",
        "wantedcategories": "श्रेणी चाहत बा",
        "wantedpages": "पन्ना चाहत बा",
        "wantedfiles": "जरुरत के फाईलसभ",
+       "wantedfiletext-nocat-noforeign": "ई फाइल सभ इस्तेमाल में बाटे बाकी मौजूद नइखे।",
        "wantedtemplates": "जरुरत के खाँचा",
+       "mostlinked": "सबसे ढेर पन्ना-जोड़ वाला",
        "mostlinkedcategories": "सबसे अधिक से जुड़ल श्रेणीसभ",
+       "mostlinkedtemplates": "सभसे ढेर ट्रांसक्लूजन वाला पन्ना",
        "mostcategories": "सबसे अधिक श्रेणी वाला पन्नाकुल",
+       "mostimages": "सभसे ढेर फाइल-जोड़ वाला",
+       "mostinterwikis": "सभसे ढेर इंटरविकि वाला पन्ना",
+       "mostrevisions": "सभसे ढेर रिवीजन वाला पन्ना सभ",
        "prefixindex": "उपसर्ग अनुसार पन्ना",
        "shortpages": "छोट पन्नासभ",
        "longpages": "लमहर पन्ना",
        "deadendpages": "मरल-खपल पन्ना",
        "protectedpages": "सुरक्षित पन्ना",
+       "protectedpages-noredirect": "अनुप्रेषण छिपाईं",
+       "protectedpagesempty": "कौनों पन्ना के सुरक्षा ए पैमान पर नइखे",
+       "protectedpages-timestamp": "टाइममोहर",
+       "protectedpages-page": "पन्ना",
+       "protectedpages-expiry": "एक्सपायर हो जाई",
+       "protectedpages-performer": "सदस्य सुरक्षा",
+       "protectedpages-params": "सुरक्षा पैमाना",
+       "protectedpages-reason": "कारण",
+       "protectedpages-unknown-timestamp": "नामालूम",
+       "protectedpages-unknown-performer": "नामालूम सदस्य",
        "protectedtitles": "सुरक्षित शीर्षक",
+       "protectedtitlesempty": "कौनों टाइटिल के सुरक्षा एह पैमान पर नइखे।",
        "listusers": "सदस्यसूची",
+       "listusers-editsonly": "उहे सदस्य देखाईं जे संपादन कइले होखे",
+       "listusers-creationsort": "बनवले की तारीख की हिसाब से सरियाईं",
+       "listusers-desc": "घटत क्रम से सरियाईं",
+       "usereditcount": "$1 {{PLURAL:$1|संपादन|संपादन सभ}}",
        "newpages": "नया पन्ना",
+       "newpages-username": "सदस्यनाँव:",
        "ancientpages": "सभन से पुरान पन्नासभ",
        "move": "स्थान्तरण",
        "movethispage": "ई पन्ना के स्थांतरण करीं",
+       "suppress": "ओवरसाइटर",
+       "apihelp": "एपीआइ (API) मदद",
        "apihelp-no-such-module": "मॉड्युल $1 ना मिलल।",
        "booksources": "किताबी स्रोत",
        "booksources-search-legend": "किताबी स्रोत के खोज",
        "booksources-search": "खोज",
        "log": "सगरी लॉग",
+       "allpages": "सगरी पन्ना",
+       "nextpage": "अगिला पन्ना ($1)",
+       "prevpage": "पछिला पन्ना ($1)",
+       "allpagesfrom": "पन्ना देखाई जे शुरू होत बा:",
+       "allpagesto": "पन्ना देखाईं जे खतम होत बा:",
        "allarticles": "सगरी पन्ना",
+       "allinnamespace": "सगरी पन्ना ($1 namespace)",
        "allpagessubmit": "जाईं",
        "allpagesprefix": "उपसर्ग के साथे पन्ना प्रदर्शन:",
+       "allpages-bad-ns": "{{SITENAME}} पर \"$1\" नामस्थान नइखे।",
+       "allpages-hide-redirects": "अनुप्रेषण छिपाईं",
+       "cachedspecial-viewing-cached-ttl": "आप कैश कइल वर्जन देखत बानी जेवन $1 ले पुरान हो सकत बा।",
+       "cachedspecial-refresh-now": "सभसे नया देखाईं।",
        "categories": "श्रेणीसभ",
        "activeusers": "सक्रिय सदस्यन के सूची",
        "listgrouprights": "सदस्य समूह अधिकारसभ",
        "trackingcategories": "नजर रखे वाला श्रेणीसभ",
+       "trackingcategories-msg": "निगरानी श्रेणी",
+       "trackingcategories-name": "संदेस नाँव",
        "emailuser": "ई प्रयोगकर्ता के ईमेल करीं",
        "watchlist": "ध्यानसूची",
        "mywatchlist": "धियानसूची",
        "rollbacklinkcount": "रोलबैक $1 {{PLURAL:$1|संपादन|संपादन सब}}",
        "protectlogpage": "सुरक्षा लॉग",
        "protectlogtext": "नीचे पन्ना सुरक्षा में भइल बदलावकुल के सूची बा।\nहाल में सुरक्षित पन्नन के सूची खातिर [[Special:ProtectedPages|सुरक्षित पन्नन के सूची]] देखीं।",
+       "restriction-move": "स्थानांतरण",
+       "restriction-create": "बनावे पर",
+       "restriction-upload": "अपलोड",
+       "restriction-level-sysop": "पुरा सुरक्षित",
+       "restriction-level-autoconfirmed": "आधा सुरक्षित",
+       "restriction-level-all": "कौनों लेवल",
+       "undelete": "हटावल पन्ना देखीं",
+       "undeletepage": "हटावल पन्ना देखीं आ वापिस ले आईं",
        "undeletelink": "देखीं/बहाल करीं",
        "namespace": "नामस्थान:",
        "invert": "चुनाव पलटीं",
index fd06461..863182a 100644 (file)
        "resetpass-wrong-oldpass": "Katasunduk samantara atawa wayah ni kada sah.\nPian pinanya sudah barhasil maubah katasunduk Pian atawa maminta sabuting katasunduk samantara hanyar.",
        "resetpass-temp-password": "Katasunduk samantara:",
        "passwordreset": "Bulikakan setelan katasunduk",
-       "passwordreset-legend": "Bulikakan setelan katasunduk",
        "passwordreset-disabled": "Mambulikakan setelan katasunduk dipajahakan hagan wiki ngini.",
        "passwordreset-username": "Ngaran pamakai:",
        "passwordreset-domain": "Dumain:",
        "nlinks": "$1 {{PLURAL:$1|tautan|tautan}}",
        "nmembers": "$1 {{PLURAL:$1|angguta|angguta}}",
        "nrevisions": "$1 {{PLURAL:$1|ralatan|raralatan}}",
-       "nviews": "dilihat $1 {{PLURAL:$1|kali|kali}}",
        "nimagelinks": "Diguna'akan pada $1 {{PLURAL:$1|tungkaran|tutungkaran}}",
        "ntransclusions": "dipuruk pada $1 {{PLURAL:$1|tungkaran|tutungkaran}}",
        "specialpage-empty": "Kadada kulihan gasan lapuran ngini.",
        "linksearch-pat": "Gagai bapola:",
        "linksearch-ns": "Ruang-ngaran:",
        "linksearch-ok": "Gagai",
-       "linksearch-text": "Kartu liar nangkaya \"*.wikipedia.org\" hingkat diguna'akan.\nMamarlukan sadikitnya asa ranah tingkat atas, misalnya \"*.org\".<br />\nProtokol nang didukung: <code>$1</code> (jangan tambahakan dalam panggagaian Pian)",
+       "linksearch-text": "Kartu liar nangkaya \"*.wikipedia.org\" hingkat diguna'akan.\nMamarlukan sadikitnya asa ranah tingkat atas, misalnya \"*.org\".<br />\nProtokol nang didukung: $1 (jangan tambahakan dalam panggagaian Pian)",
        "linksearch-line": "$1 ditautakan matan $2",
        "linksearch-error": "Kartu-liar mancungul pintang awalan matan ngaranhost.",
        "listusersfrom": "Manampaiakan papamuruk mulai matan:",
index 242bfa7..0bb94da 100644 (file)
        "protectedinterface": "এই পাতার বিষয়বস্তু এই উইকি সফটওয়্যারের একটি ইন্টারফেস বার্তা প্রদান করে, তাই এটিকে সুরক্ষিত করে রাখা হয়েছে।\nসকল উইকির অনুবাদে কোনো ধরনের সংযোজন বা পরিবর্তন করতে, অনুগ্রহ করে মিডিয়াউইকি স্থানীয়করন প্রকল্প [//translatewiki.net/ translatewiki.net] ব্যবহার করুন।",
        "editinginterface": "<strong>সতর্কীকরণ:</strong> আপনি এমন একটি পাতা সম্পাদনা করছেন যা সফটওয়্যারের জন্য ইন্টারফেস টেক্সট প্রদান করে।\nএই পাতাতে সংঘটিত পরিবর্তন এই উইকির ব্যবহারকারীদের ইন্টারফেসে প্রভাব ফেলবে, যা অন্য ব্যবহারকারীরা দেখতে পাবেন।",
        "translateinterface": "সকল উইকির জন্য অনুবাদ যোগ বা পরিবর্তন করতে, দয়া করে [//translatewiki.net/ translatewiki.net], মিডিয়াউইকি স্থানীয়করণ প্রকল্প ব্যবহার করুন।",
-       "cascadeprotected": "এই পাতাটি সম্পাদনা থেকে সুরক্ষিত, কারণ পাতাটি নিচের {{PLURAL:$1|টি পাতার|টি পাতার}} অন্তর্গত, যে পাতা(গুলি) \"প্রপাতাকার\" (cascading) বৈশিষ্ট্য সহযোগে সুরক্ষিত করা হয়েছে:\n$2",
+       "cascadeprotected": "এই পাতাটি সম্পাদনা থেকে সুরক্ষিত কারণ এটি নিম্নোক্ত {{PLURAL:$1|পাতায়|পাতাসমূহে}} অন্তর্ভুক্ত, যা \"প্রপাতাকার\" বৈশিষ্ট্য সহযোগে সুরক্ষিত করা আছে:\n$2",
        "namespaceprotected": "'''$1''' নামস্থানে কোন পাতা আপনার সম্পাদনা করার অনুমতি নেই।",
        "customcssprotected": "আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
        "customjsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
        "readonlywarning": "'''সতর্কীকরণ: রক্ষণাবেক্ষণের জন্য ডাটাবেজ অবরুদ্ধ রাখা হয়েছে, তাই এই মুহূর্তে আপনার সম্পাদনা সংরক্ষণ করতে পারবেন না।'''\nআপনি চাইলে লেখাটি কাট এবং পেষ্ট করে ভবিষ্যতের জন্য কোন টেক্সট ফাইলে সংরক্ষণ করতে পারেন।\n\nযে প্রশাসক এই ডাটাবেজটি অবরুদ্ধ করেছেন তিনি যা ব্যাখ্যা দিয়েছেন: $1",
        "protectedpagewarning": "'''সতর্কীকরণ: এই পাতাটি বন্ধ করা হয়েছে; কেবলমাত্র প্রশাসক মর্যাদার ব্যবহারকারীরাই এটি সম্পাদনা করতে পারবেন।'''\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
        "semiprotectedpagewarning": "'''নোট:''' এই পাতাটির ব্যবহার নিয়ন্ত্রণ করা হয়েছে তাই নিবন্ধনকৃত ব্যবহারকারী এটি সম্পাদনা করতে পারবেন।\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
-       "cascadeprotectedwarning": "'''সতর্কীকরণ:''' এই পাতাটি বন্ধ করা হয়েছে, যাতে কেবল প্রশাসকের ক্ষমতাবিশিষ্ট ব্যবহারকারীরা এটি সম্পাদনা করতে পারেন, কারণ এই পাতাটি নিচের প্রপাতাকারে সুরক্ষিত (cascade-protected) {{PLURAL:$1|টি পাতায়|টি পাতায়}} অন্তর্ভুক্ত আছে:",
+       "cascadeprotectedwarning": "<strong>সতর্কীকরণ:</strong> এই পাতাটি সুরক্ষিত, ফলে এটি শুধুমাত্র প্রশাসক অধিকারপ্রাপ্ত ব্যবহারকারীগণ সম্পাদনা করতে পারেন, কারণ এটি নিচের প্রপাতাকার-সুরক্ষিত {{PLURAL:$1|পাতায়|পাতাসমূহে}} অন্তর্ভুক্ত আছে:",
        "titleprotectedwarning": "'''সতর্কীকরণ: এই পাতাটির ব্যবহার সীমিত করা হয়েছে, যাতে কেবলমাত্র [[Special:ListGroupRights|এই নির্দিষ্ট অনুমতিপ্রাপ্ত]] ব্যবহারকারী এটি তৈরি করতে পারেন।'''\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
        "templatesused": "এই পাতায় ব্যবহৃত {{PLURAL:$1|টেমপ্লেট|টেমপ্লেটসমূহ}}:",
        "templatesusedpreview": "এই প্রাকদর্শনে ব্যবহৃত {{PLURAL:$1|টেমপ্লেট|টেমপ্লেটসমূহ}}:",
        "uploaddisabledtext": "ফাইল আপলোড নিষ্ক্রিয়।",
        "php-uploaddisabledtext": "পিএইপি -এ ফাইল আপলোড নিস্ক্রিয় রয়েছে।\nঅনুগ্রহ করে file_uploads সেটিং পরীক্ষা করুন।",
        "uploadscripted": "এই ফাইলে এমন HTML বা স্ক্রিপ্ট কোড আছে যা একটি ওয়েব ব্রাউজার ভুল বুঝতে পারে।",
+       "uploaded-script-svg": "আপলোডকৃত SVG ফাইলে স্ক্রিপ্টযোগ্য উপাদান \"$1\" পাওয়া গেছে।",
        "uploaded-hostile-svg": "আপলোড করা SVG ফাইলের শৈলী উপাদানে অনিরাপদ সিএসএস পাওয়া গেছে।",
        "uploadscriptednamespace": "এই SVG ফাইলে অবৈধ নামস্থান \"$1\" রয়েছে",
        "uploadinvalidxml": "আপলোডকৃত ফাইলে XML পার্স করা যাবে না।",
        "linksearch-pat": "অনুসন্ধান প্যাটার্ন:",
        "linksearch-ns": "নামস্থান:",
        "linksearch-ok": "অনুসন্ধান",
-       "linksearch-text": "\"*.wikipedia.org\" এর মত ওয়াইল্ড কার্ড ব্যবহার করা যেতে পারে।\nনূন্যতম একটি টপ লেভেল ডোমেইন প্রয়োজন, যেমন \"*.org\".<br />\nযে সকল {{PLURAL:$2|প্রোটোকল|প্রোটোকলসমূহ}} সমর্থন করে: <code>$1</code> (প্রোটকল উল্লেখ করা না হলে http:// ডিফল্ট হিসাবে ব্যবহৃত হবে)।",
+       "linksearch-text": "\"*.wikipedia.org\" এর মত ওয়াইল্ড কার্ড ব্যবহার করা যেতে পারে।\nনূন্যতম একটি টপ লেভেল ডোমেইন প্রয়োজন, যেমন \"*.org\"।<br />\nযে সকল {{PLURAL:$2|প্রোটোকল|প্রোটোকলসমূহ}} সমর্থন করে: $1 (প্রোটোকল উল্লেখ করা না হলে http:// ডিফল্ট হিসাবে ব্যবহৃত হবে)।",
        "linksearch-line": "$2 থেকে $1 এ লিংক করা হয়েছে",
        "linksearch-error": "হোস্ট নামের শুরুতে কেবলমাত্র ওয়াইল্ডকার্ড ব্যবহার করা যায়।",
        "listusersfrom": "সেই সব ব্যবহারকারী দেখাও যাদের নাম এই অক্ষর দিয়ে শুরু:",
        "rollback-success": "$1-এর সম্পাদনাগুলি পূর্বাবস্থায় ফিরিয়ে নেওয়া হয়েছে; $2-এর করা শেষ সংস্করণে পাতাটি ফেরত নেওয়া হয়েছে।",
        "sessionfailure-title": "সেশন পরিত্যক্ত",
        "sessionfailure": "আপনার লগ ইন সেশনে একটি সমস্যা হয়েছে বলে মনে হচ্ছে;\nসেশন হাইজ্যাক প্রতিরোধের উপায় হিসেবে এই কাজটি বাতিল করা হয়েছে।\nঅনুগ্রহ ব্রাউজারের \"back\" বোতাম চাপুন এবং যে পাতা থেকে এসেছিলেন, তা রিলোড করুন এবং আবার চেষ্টা করুন।",
+       "changecontentmodel-title-label": "পাতার শিরোনাম",
+       "changecontentmodel-model-label": "পাতার বিষয়বস্তুর প্রতিরূপ",
+       "changecontentmodel-reason-label": "কারণ:",
+       "changecontentmodel-success-title": "বিষয়বস্তুর প্রতিরূপ পরিবর্তিত হয়েছিলো",
+       "changecontentmodel-success-text": "[[:$1]]-এর বিষয়বস্তুর ধরণ পরিবর্তন হয়েছে।",
        "logentry-contentmodel-change": "$1 $3 পাতার বিষয়বস্তুর মডেল \"$4\" থেকে \"$5\"-এ {{GENDER:$2|পরিবর্তন করেছেন}}",
+       "logentry-contentmodel-change-revertlink": "প্রত্যাবর্তন",
+       "logentry-contentmodel-change-revert": "প্রত্যাবর্তন",
        "protectlogpage": "সুরক্ষা লগ",
        "protectlogtext": "নিচে সুরক্ষিত পাতার  একটি তালিকা দেয়া হল। \nবর্তমানে সক্রিয় পাতার সুরক্ষাগুলির তালিকা দেখতে [[Special:ProtectedPages|সুরক্ষিত পাতার তালিকা]] দেখুন।",
        "protectedarticle": "সুরক্ষিত \"[[$1]]\"",
        "namespace": "নামস্থান:",
        "invert": "বিপরীতক্রমে নির্বাচন",
        "tooltip-invert": "যে সকল নামস্থানের পাতাগুলোর পরিবর্তনসমূহর দেখতে চাচ্ছেন না সেগুলোর নামের পাশে টিক দিন",
+       "tooltip-whatlinkshere-invert": "নির্বাচিত নামস্থানের পাতা থেকে লিঙ্ক আড়াল করতে এই বাক্সে টিক দিন।",
        "namespace_association": "সংশ্লিষ্ট নামস্থান",
        "tooltip-namespace_association": "এখানে টিক দেয়ার মাধ্যমে সংশ্লিষ্ট নামস্থান এবং আলাপপাতাসমূহ অন্তর্ভুক্ত করছেন",
        "blanknamespace": "(প্রধান)",
        "whatlinkshere-next": "{{PLURAL:$1|পরবর্তী|পরবর্তী $1টি}}",
        "whatlinkshere-links": "← সংযোগগুলি",
        "whatlinkshere-hideredirs": "পুননির্দেশনা $1",
-       "whatlinkshere-hidetrans": "à¦\9fà§\8dরানà§\8dসà¦\95à§\8dলà§\81শন $1",
+       "whatlinkshere-hidetrans": "à¦\85নà§\8dতরà§\8dভà§\81à¦\95à§\8dতà¦\95রণ $1",
        "whatlinkshere-hidelinks": "সংযোগ $1",
        "whatlinkshere-hideimages": "$1 ফাইল সংযোগ",
        "whatlinkshere-filters": "ছাকনী",
        "tooltip-pt-logout": "প্রস্থান",
        "tooltip-pt-createaccount": "আপনাকে একটি অ্যাকাউন্ট তৈরি করে প্রবেশ করার পরামর্শ দেওয়া হচ্ছে; তবে এটা বাধ্যতামূলক নয়",
        "tooltip-ca-talk": "বিষয়বস্তু পাতা সম্পর্কে আলোচনা",
-       "tooltip-ca-edit": "à¦\86পনি à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾ à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন। à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦¸à¦\82রà¦\95à§\8dষণà§\87র à¦\86à¦\97à§\87 à¦ªà§\8dরাà¦\95দরà§\8dশন à¦\95রà§\81ন।",
+       "tooltip-ca-edit": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à¦®à§\8dপাদনা à¦\95রà§\81ন",
        "tooltip-ca-addsection": "নতুন অনুচ্ছেদ শুরু করুন",
        "tooltip-ca-viewsource": "এই পাতাটি সুরক্ষিত। আপনি পাতাটির উৎস দেখতে পারেন।",
        "tooltip-ca-history": "এই পাতার পুরনো সংস্করণগুলি",
        "pageinfo-robot-index": "অনুমোদিত",
        "pageinfo-robot-noindex": "অনুনমোদিন",
        "pageinfo-watchers": "পাতাটি প্রদর্শনের সংখ্যা",
+       "pageinfo-visiting-watchers": "পাতা পর্যবেক্ষকদের সংখ্যা যারা সাম্প্রতিক সম্পাদনাগুলি পরিদর্শন করেছেন",
        "pageinfo-few-watchers": "$1 জন {{PLURAL:$1|নজরকারীও}} কম",
+       "pageinfo-few-visiting-watchers": "সাম্প্রতিক সম্পাদনাগুলি সম্ভবত একজন নজরকারী পর্যবেক্ষক করেছেন বা করেনি",
        "pageinfo-redirects-name": "এই পাতায় পুননির্দেশনাসমূহের সংখ্যা",
        "pageinfo-subpages-name": "এই পাতার উপপাতাসমূহ",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|পুনর্নির্দেশ|পুনর্নির্দেশসমূহ}}; $3 {{PLURAL:$3|পুনর্নির্দেশ নেই|পুনর্নির্দেশ নেই}})",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|আলাপ]])",
        "timezone-utc": "ইউটিসি",
        "duplicate-defaultsort": "' ' ' সাবধান: ' ' '  ডিফল্ট সাজানোর কীঃ \"$2\" পূর্বে ডিফল্ট সাজানোর কীঃ \"$1\" কে অগ্রাহ্য করে।",
+       "duplicate-displaytitle": "<strong>সতর্কীকরণ:</strong> প্রদর্শন শিরোনাম \"$2\" আগের প্রদর্শন শিরোনাম \"$1\" অগ্রাহ্য করবে।",
        "invalid-indicator-name": "<strong>ত্রুটি:</strong> পাতার অবস্থা নির্দেশক <code>name</code> অ্যাট্রিবিউট খালি হতে পারবে না।",
        "version": "সংস্করণ",
        "version-extensions": "ইন্সটলকৃত এক্সটেনশনসমূহ",
        "version-libraries": "ইনস্টল লাইব্রেরি",
        "version-libraries-library": "লাইব্রেরী",
        "version-libraries-version": "সংস্করণ",
+       "version-libraries-license": "লাইসেন্স",
+       "version-libraries-description": "বিবরণ",
+       "version-libraries-authors": "লেখক",
        "redirect": "পাতা, ফাইল, ব্যবহারকরী, অথবা সংশোধন আইডি দ্বারা পুনঃনির্দেশ করা হয়েছে",
        "redirect-legend": "একটি ফাইল অথবা পাতায় পুনঃনির্দেশ করা হয়েছে",
        "redirect-summary": "এই বিশেষ পাতাটি একটি ফাইলে (ফাইলের নাম), একটি পাতায় (সংস্করণ আইডি বা পাতা আইডি), অথবা একটি ব্যবহারকরী পাতায় (সংখ্যায় লেখা ব্যবহারকারী আইডি) পুনঃনির্দেশিত হয়েছে। ব্যবহার:  [[{{#Special:Redirect}}/file/উদাহরণ.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], অথবা [[{{#Special:Redirect}}/user/101]]।",
        "tags-hitcount": "$1টি {{PLURAL:$1|পরিবর্তন}}",
        "tags-manage-no-permission": "আপনার ট্যাগ পরিবর্তন পরিচালনা করার অনুমতি নেই।",
        "tags-create-heading": "নতুন ট্যাগ তৈরি করুন",
+       "tags-create-explanation": "পূর্বনির্ধারিতরূপে, নব নির্মিত ট্যাগ ব্যবহারকারী এবং বট দ্বারা ব্যবহারের জন্য উপলব্ধ করা হবে।",
        "tags-create-tag-name": "ট্যাগের নাম:",
        "tags-create-reason": "কারণ:",
        "tags-create-submit": "তৈরি করুন",
        "feedback-close": "সম্পন্ন",
        "feedback-external-bug-report-button": "প্রযুক্তিগত কাজ ফাইল করুন",
        "feedback-dialog-title": "প্রতিক্রিয়া জমা দিন",
+       "feedback-dialog-intro": "আপনি আপনার প্রতিক্রিয়া জানাতে নীচের সহজ ফরম ব্যবহার করতে পারেন। আপনার মন্তব্য আপনার ব্যবহারকারী নামসহ, \"$1\" পাতায় যোগ করা হবে।",
        "feedback-error-title": "ত্রুটি",
        "feedback-error1": "ত্রুটি: এপিআই হতে অজানা ফলাফল এসেছে",
        "feedback-error2": "ত্রুটি: সম্পাদনা ব্যর্থ",
        "feedback-error3": "ত্রুটি: এপিআই হতে কোন সাড়া নেই",
+       "feedback-error4": "ত্রুটি: প্রতিক্রিয়ায় দেয়া শিরোনামে প্রকাশ অক্ষম",
        "feedback-message": "বার্তা:",
        "feedback-subject": "বিষয়:",
        "feedback-submit": "জমা দাও",
+       "feedback-terms": "আমি বুঝেছি যে আমার প্রতিক্রিয়ার পাশাপাশি আমার যথাযথ ব্রাউজার এবং অপারেটিং সিস্টেম সংস্করণের তথ্যসহ ব্যবহারকারী এজেন্ট সর্বজনীনভাবে ভাগ করা হবে।",
+       "feedback-termsofuse": "আমি ব্যবহারের শর্তাবলী অনুসারে প্রতিক্রিয়া জানাতে সম্মত।",
        "feedback-thanks": "ধন্যবাদ! আপনার প্রতিক্রিয়া \"[$2 $1]\" পাতায় পোস্ট করা হয়েছে।",
        "feedback-thanks-title": "আপনাকে ধন্যবাদ!",
        "feedback-useragent": "ব্যবহারকারী এজেন্ট:",
index c9da4e7..50a8f7f 100644 (file)
        "unprotectthispage": "Cheñch live gwareziñ ar bajenn-mañ",
        "newpage": "Pajenn nevez",
        "talkpage": "Pajenn gaozeal",
-       "talkpagelinktext": "Kaozeal",
+       "talkpagelinktext": "kaozeal",
        "specialpage": "Pajenn dibar",
        "personaltools": "Ostilhoù personel",
        "articlepage": "Sellet ouzh ar pennad",
        "rcshowhideminor": "$1 ar c'hemmoù dister",
        "rcshowhideminor-show": "Diskouez",
        "rcshowhideminor-hide": "Kuzhat",
-       "rcshowhidebots": "$1 ar robotoù",
+       "rcshowhidebots": "$1 ar botoù",
        "rcshowhidebots-show": "Diskouez",
        "rcshowhidebots-hide": "Kuzhat",
        "rcshowhideliu": "$1 an implijerien enrollet",
        "linksearch-pat": "Klask an droienn :",
        "linksearch-ns": "Esaouenn anv :",
        "linksearch-ok": "Klask",
-       "linksearch-text": "Gallout a reer implijout arouezennoù \"joker\" evel, da skouer, \"*.wikipedia.org\".\nRekis eo dezho un domani a-us da nebeutañ evel, da skouer, \"*.org\".<br />\n{{PLURAL:$2|Protokol|Protokoloù}} skoret : <code>$1</code> (defaults to http:// na lakait hini ebet eus ar re-se en ho klask).",
+       "linksearch-text": "Gallout a reer implijout arouezennoù \"joker\" evel, da skouer, \"*.wikipedia.org\".\nRekis eo dezho un domani a-us da nebeutañ evel, da skouer, \"*.org\".<br />\n{{PLURAL:$2|Protokol|Protokoloù}} skoret : $1 (defaults to http:// na lakait hini ebet eus ar re-se en ho klask).",
        "linksearch-line": "$1 gant ul liamm adal $2",
        "linksearch-error": "N'hall an arouezennoù joker bezañ implijet nemet e deroù anv domani an ostiz.",
        "listusersfrom": "Diskouez anv an implijerien adal :",
        "activeusers-intro": "Setu aze ur roll eus an implijerien zo bet oberiant mui pe vui e-pad an $1 {{PLURAL:$1|deiz|deiz}} diwezhañ.",
        "activeusers-count": "$1 {{PLURAL:$1|oberiadenn}} abaoe an {{PLURAL:$3|deiz|$3 deiz}} diwezhañ",
        "activeusers-from": "Diskouez an implijerien adal :",
-       "activeusers-hidebots": "Kuzhat ar robotoù",
+       "activeusers-hidebots": "Kuzhat ar botoù",
        "activeusers-hidesysops": "Kuzhat ar verourien",
        "activeusers-noresult": "N'eus bet kavet implijer ebet.",
        "listgrouprights": "Gwirioù ar strolladoù implijer",
        "namespace": "Esaouenn anv :",
        "invert": "Eilpennañ an dibab",
        "tooltip-invert": "Askañ ar voest-mañ da guzhat ar c'hemmoù er pajennoù stag ouzh an esaouenn anv diuzet (hag an esaouenn anv stag, m'emañ asket)",
-       "namespace_association": "Esaouennoù anv all da ouzhpennañ",
+       "namespace_association": "Esaouennoù anv liammet",
        "tooltip-namespace_association": "Askañ ar voest-mañ da lakaat ivez e-barzh ar gaozeadenn pe danvez an esaouenn anv liammet ouzh an esaouenn anv diuzet",
        "blanknamespace": "(Pennañ)",
        "contributions": "Degasadennoù an {{GENDER:$1|implijer|implijerez}}",
index 27466d1..ab02ac4 100644 (file)
                        "Milicevic01",
                        "Macofe",
                        "Emir Mujadzic",
-                       "Srdjan m"
+                       "Srdjan m",
+                       "Semso98"
                ]
        },
        "tog-underline": "Podvuci veze:",
-       "tog-hideminor": "Sakrij male izmjene u spisku nedavnih izmjena",
+       "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",
        "tog-extendwatchlist": "Proširi spisak praćenja za pogled svih izmjena, ne samo nedavnih",
        "tog-usenewrc": "Grupiraj izmjene po stranicama sa nedavnih izmjena i praćenih članaka",
        "tog-numberheadings": "Automatski numeriši podnaslove",
        "tog-showtoolbar": "Prikaži traku s alatkama za uređivanje",
-       "tog-editondblclick": "Izmijeni stranice dvostrukim klikom",
-       "tog-editsectiononrightclick": "Uključite uređivanje odjeljka sa pritiskom na desno dugme miša u naslovu odjeljka",
+       "tog-editondblclick": "Uredi stranice dvostrukim klikom",
+       "tog-editsectiononrightclick": "Uključi uređivanje odjeljka sa pritiskom na desno dugme miša u naslovu odjeljka",
        "tog-watchcreations": "Dodaj stranice i datoteke koje napravim na moj spisak praćenih članaka",
        "tog-watchdefault": "Dodaj stranice i datoteke koje uređujem na moj spisak praćenih članaka",
        "tog-watchmoves": "Dodaj stranice i datoteke koje premjestim na moj spisak praćenih članaka",
        "tog-watchdeletion": "Dodaj stranice i datoteke koje izbrišem na moj spisak praćenih članaka",
        "tog-watchrollback": "Sve stranice za koje sam izvršio povrat izmjena stavi na spisak praćenja",
-       "tog-minordefault": "Označi sve izmjene malim isprva",
-       "tog-previewontop": "Prikaži pretpregled prije polja za izmjenu a ne poslije",
+       "tog-minordefault": "Označi sve izmjene manjim isprva",
+       "tog-previewontop": "Prikaži pregled iznad okvira za uređivanje",
        "tog-previewonfirst": "Prikaži izgled pri prvoj izmjeni",
-       "tog-enotifwatchlistpages": "Pošalji mi e-mail kada se promijeni stranica ili datoteka sa mog spiska praćenih članaka",
+       "tog-enotifwatchlistpages": "Pošalji mi e-poštu kada se promijeni stranica ili datoteka sa mog spiska praćenih članaka",
        "tog-enotifusertalkpages": "Pošalji mi e-poštu kad se promijeni moja korisnička stranica za razgovor",
        "tog-enotifminoredits": "Također mi pošalji e-poštu za male izmjene na stranicama i datotekama",
        "tog-enotifrevealaddr": "Otkrij adresu moje e-pošte u porukama obavještenja",
        "tog-shownumberswatching": "Prikaži broj korisnika koji prate",
        "tog-oldsig": "Postojeći potpis:",
        "tog-fancysig": "Smatraj potpis kao wikitekst (bez automatskog linka)",
-       "tog-uselivepreview": "Koristite pregled uživo",
+       "tog-uselivepreview": "Koristi pregled uživo",
        "tog-forceeditsummary": "Opomeni me pri unosu praznog sažetka",
        "tog-watchlisthideown": "Sakrij moje izmjene sa spiska praćenih članaka",
        "tog-watchlisthidebots": "Sakrij izmjene botova sa spiska praćenih članaka",
-       "tog-watchlisthideminor": "Sakrij zanemarljive izmjene sa spiska mojih praćenja",
-       "tog-watchlisthideliu": "Sakrij promjene prijavljenih korisnika sa liste praćenja",
-       "tog-watchlisthideanons": "Sakrij promjene anonimnih korisnika sa liste praćenja",
+       "tog-watchlisthideminor": "Sakrij manje izmjene sa spiska praćenih članaka",
+       "tog-watchlisthideliu": "Sakrij izmjene prijavljenih korisnika sa spiska praćenih članaka",
+       "tog-watchlisthideanons": "Sakrij izmjene anonimnih korisnika sa spiska praćenih članaka",
        "tog-watchlisthidepatrolled": "Sakrij patrolirane izmjene sa spiska praćenja",
        "tog-ccmeonemails": "Pošalji mi kopije e-pošte koju pošaljem drugim korisnicima",
-       "tog-diffonly": "Ne prikazuj sadržaj stranice ispod prikaza razlika",
+       "tog-diffonly": "Ne prikazuj sadržaj stranice ispod razlika",
        "tog-showhiddencats": "Prikaži skrivene kategorije",
-       "tog-norollbackdiff": "Nakon vraćanja zanemari prikaz razlika",
-       "tog-useeditwarning": "Upozori me kada napustim stranicu za izmjene bez spašenih promjena",
+       "tog-norollbackdiff": "Izostavi razliku nakon vraćanja",
+       "tog-useeditwarning": "Upozori me kad napuštam stranicu za izmjene bez sačuvanih promjena",
        "tog-prefershttps": "Uvijek koristi sigurnu konekciju kada sam prijavljen.",
        "underline-always": "Uvijek",
        "underline-never": "Nikad",
        "underline-default": "Po standardu izgleda ili preglednika",
-       "editfont-style": "Stil slova područja uređivanja:",
+       "editfont-style": "Stil fonta u okviru za uređivanje:",
        "editfont-default": "Po postavkama preglednika",
        "editfont-monospace": "Slova sa jednostrukim razmakom",
        "editfont-sansserif": "Beserifni font",
        "about": "O",
        "article": "Članak",
        "newwindow": "(otvara se u novom prozoru)",
-       "cancel": "Poništite",
+       "cancel": "Odustani",
        "moredotdotdot": "Više...",
        "morenotlisted": "Ovaj spisak nije potpun.",
        "mypage": "Korisnička stranica",
        "history": "Historija stranice",
        "history_short": "Historija",
        "updatedmarker": "promjene od moje posljednje posjete",
-       "printableversion": "Prilagođeno štampanju",
+       "printableversion": "Za štampanje",
        "permalink": "Trajni link",
        "print": "Štampa",
        "view": "Pogled",
        "readonly_lag": "Baza podataka je zaključana dok se sekundarne baze podataka na serveru ne sastave sa glavnom.",
        "internalerror": "Unutrašnja greška",
        "internalerror_info": "Interna greška: $1",
+       "internalerror-fatal-exception": "Fatalna greška tipa \"$1\"",
        "filecopyerror": "Ne može se kopirati \"$1\" na \"$2\".",
        "filerenameerror": "Ne može se promjeniti ime datoteke \"$1\" u \"$2\".",
        "filedeleteerror": "Ne može se izbrisati datoteka \"$1\".",
        "title-invalid-interwiki": "Traženi naslov stranice sadrži interwiki link koji ne može biti korišten u naslovima.",
        "title-invalid-talk-namespace": "Vaš zatraženi naslov stranice se odnosi na stranicu za razgovor koja ne može postojati.",
        "title-invalid-characters": "Vaš zatraženi naslov stranice sadrži nevažeće znakove: \"$1\".",
+       "title-invalid-relative": "Naslov ima relativnu putanja. Relativni naslovi stranica (./, ../) nisu važeći jer će često biti nedostupni u pregledniku korisnika.",
+       "title-invalid-magic-tilde": "Zatraženi naslov stranice sadrži nevažeći slijed magičknog znaka tilda (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Zatraženi naziv stranice je predugačak. Ne smije biti duži od {{PLURAL:$1|bajta|bajtova}} u UTF-8 kodiranju.",
        "title-invalid-leading-colon": "Zahtjevani naslov stranice sadrži nevažeću dvotačku na početku.",
        "perfcached": "Sljedeći podaci su keširani i možda neće biti u potpunosti ažurirani. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata}}.",
        "perfcachedts": "Sljedeći podaci nalaze se u memoriji i posljednji put ažurirani su $1. Keš sadrži najviše {{PLURAL:$4|jedan rezultat|$4 rezultata}}.",
        "protectedinterface": "Ova stranica sadrži tekst korisničkog okruženja za softver na ovom wikiju i zaštićena je radi sprečavanja zloupotrebe.\nDa biste dodali ili izmjenili prijevode svih wikija, posjetite [//translatewiki.net/  translatewiki.net], projekat za lokalizaciju Mediawikija.",
        "editinginterface": "<strong>Upozorenje:</strong> Mijenjate stranicu koja sadrži aktivan tekst programa.\nPromjene na ovoj stranici dovode i do promjena za druge korisnike ovog wikija.\nZa dodavanje ili promjene prijevoda za sve wikije, molimo Vas koristite [//translatewiki.net/ translatewiki.net], projekt prijevoda za MediaWiki.",
        "translateinterface": "Za dodavanje ili promjenu prijevoda za sve wikije koristite [//translatewiki.net/ translatewiki.net], projekt za lokalizaciju MediaWikija.",
-       "cascadeprotected": "Uređivanje ove stranice zabranjeno je jer sadrži {{PLURAL:$1|stranicu zaštićenu|stranice zaštićene}} od uređivanja iz razloga:\n$2",
+       "cascadeprotected": "Uređivanje ove stranice zabranjeno je jer se koristi u {{PLURAL:$1|sljedećoj stranici, koja je zaštićena|sljedećim stranicama, koje su zaštićene}} prenosivom zaštitom:\n$2",
        "namespaceprotected": "Vi nemate dozvulu da mijenjate stranicu '''$1'''.",
        "customcssprotected": "Nemate dozvolu za mijenjanje ove CSS stranice jer sadrži osobne postavke nekog drugog korisnika.",
        "customjsprotected": "Nemate dozvolu za mijenjanje ove JavaScript stranice jer sadrži osobne postavke nekog drugog korisnika.",
        "wrongpassword": "Unijeli ste neispravnu šifru.\nMolimo Vas da pokušate ponovno.",
        "wrongpasswordempty": "Šifra je bila prazna.\nMolimo Vas da pokušate ponovno.",
        "passwordtooshort": "Šifra mora imati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}.",
+       "passwordtoolong": "Šifre ne mogu biti duže od {{PLURAL:$1|jednog znaka|$1 znaka|$1 znakova}}.",
        "password-name-match": "Vaša šifra mora biti različita od Vašeg korisničkog imena.",
        "password-login-forbidden": "Korištenje ovih korisničkih imena i šifara je zabranjeo.",
        "mailmypassword": "Poništi lozinku",
        "hr_tip": "Horizontalna linija (koristite oskudno)",
        "summary": "Sažetak:",
        "subject": "Tema/naslov:",
-       "minoredit": "Ovo je mala izmjena",
+       "minoredit": "Ovo je manja izmjena",
        "watchthis": "Prati ovu stranicu",
        "savearticle": "Sačuvaj",
        "preview": "Pregled stranice",
        "creating": "Pravljenje stranice $1",
        "editingsection": "Uređujete $1 (dio)",
        "editingcomment": "Uređujete $1 (nova sekcija)",
-       "editconflict": "Vaše izmjene se nisu mogle sačuvati zbog sukoba uređivanja. Da li bi ste sukob {{GENDER:|mogli}} razriješiti ručno?",
+       "editconflict": "Sukob izmjena: $1",
        "explainconflict": "Neko drugi je promijenio ovu stranicu otkad ste je Vi počeli mijenjati.\nGornje tekstualno polje sadrži tekst stranice koji trenutno postoji.\nVaše izmjene prikazane su u donjem tekstu.\nMorat ćete unijeti svoje promjene u postojeći tekst.\n'''Samo''' tekst u gornjem tekstualnom polju bit će sačuvan kad\nkliknete \"{{int:savearticle}}\".",
        "yourtext": "Vaš tekst",
        "storedversion": "Uskladištena verzija",
        "yourdiff": "Razlike",
        "copyrightwarning": "Za sve priloge poslane na projekt {{SITENAME}} smatramo da su objavljeni pod $2 (konsultirajte $1 za detalje).\nAko ne želite da vaši članci budu podložni izmjenama i slobodnoj distribuciji i objavljivanju,\nnemojte ih slati ovdje. Također, slanje članka podrazumijeva i Vašu izjavu da ste ga napisali sami ili da ste ga kopirali iz izvora u javnom domenu ili sličnog slobodnog izvora.\n\n'''NEMOJTE SLATI RAD ZAŠTIĆEN AUTORSKIM PRAVIMA BEZ DOZVOLE AUTORA!'''",
        "copyrightwarning2": "Zapamtite da svi doprinosi na stranici {{SITENAME}} može biti izmijenjen, promijenjen ili uklonjen od strane ostalih korisnika. Ako ne želite da ovo desi sa Vašim tekstom, onda ga nemojte slati ovdje.<br />\nTakođer nam garantujete da ste ovo Vi napisali, ili da ste ga kopirali iz javne domene ili sličnog slobodnog izvora informacija (pogledajte $1 za više detalja).\n'''NE ŠALJITE AUTORSKIM PRAVOM ZAŠTIĆENE TEKSTOVE BEZ DOZVOLE!'''",
+       "editpage-cannot-use-custom-model": "Model sadržaja ove stranice se ne može promijeniti.",
        "longpageerror": "'''Greška: Tekst, koji ste poslali, je dug {{PLURAL:$1|jedan kilobajt|$1 kilobajta}}, što je veće od maksimuma, koji iznosi {{PLURAL:$2|jedan kilobajt|$2 kilobajta}}.'''\nStranica ne može biti sačuvana.",
        "readonlywarning": "'''PAŽNJA: Baza je zaključana zbog održavanja, tako da nećete moći da sačuvate svoje izmjene za sada.'''\nMožda želite da kopirate i nalijepite tekst u tekst editor i sačuvate ga za kasnije.\n\nAdministrator koji je zaključao bazu je naveo slijedeće objašnjenje: $1",
        "protectedpagewarning": "'''PAŽNJA: Ova stranica je zaključana tako da samo korisnici sa administratorskim privilegijama mogu da je mijenjaju.'''\nPosljednja stavka u zapisniku je prikazana ispod kao referenca:",
        "semiprotectedpagewarning": "'''Pažnja:''' Ova stranica je zaključana tako da je samo registrovani korisnici mogu uređivati.\nPosljednja stavka zapisnika je prikazana ispod kao referenca:",
-       "cascadeprotectedwarning": "'''Upozorenje:''' Ova stranica je zaključana tako da je samo administratori mogu mijenjati, jer je ona uključena u {{PLURAL:$1|ovu, lančanu povezanu, zaštićenu stranicu|sljedeće, lančano povezane, zaštićene stranice}}:",
+       "cascadeprotectedwarning": "<strong>Upozorenje:</strong> Ova stranica je zaključana tako da je samo administratori mogu mijenjati, jer je ona uključena u {{PLURAL:$1|ovu, lančanu povezanu, zaštićenu stranicu|sljedeće, prenosivo povezane, zaštićene stranice}}:",
        "titleprotectedwarning": "'''UPOZORENJE: Ova stranica je zaključana tako da su potrebna [[Special:ListGroupRights|posebna prava]] da se ona napravi.'''\nPosljednja stavka zapisnika je prikazana ispod kao referenca:",
        "templatesused": "{{PLURAL:$1|Šablon|Šabloni}} koji su upotrebljeni na ovoj stranici:",
        "templatesusedpreview": "{{PLURAL:$1|Šablon|Šabloni}} prikazani u ovom pregledu:",
        "rev-showdeleted": "Pokaži",
        "revisiondelete": "Obriši/vrati revizije",
        "revdelete-nooldid-title": "Nije unesena tačna revizija",
-       "revdelete-nooldid-text": "Niste precizno odredili odredišnu reviziju/revizije da se izvrši ova funkcija, ili ta revizija nepostoji, ili pokušavate sakriti trenutnu reviziju.",
+       "revdelete-nooldid-text": "Niste odredili odredišnu verziju da se izvrši ova funkcija, ili ta verzija ne postoji, ili pokušavate sakriti trenutnu verziju.",
        "revdelete-no-file": "Navedena datoteka ne postoji.",
        "revdelete-show-file-confirm": "Da li ste sigurni da želite pogledati obrisanu reviziju datoteke \"<nowiki>$1</nowiki>\" od $2 u $3?",
        "revdelete-show-file-submit": "Da",
        "editundo": "ukloni ovu izmjenu",
        "diff-empty": "(Nema razlike)",
        "diff-multi-sameuser": "({{PLURAL:$1|Nije prikazana jedna međurevizija|Nisu prikazane $1 međurevizije}} istog korisnika)",
+       "diff-multi-otherusers": "(Nije prikazana {{PLURAL:$1|jedna međuverzija|$1 međuverzija}} {{PLURAL:$2|drugog 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}}.\n\nOvo se obično dešava kada pratite zastarjelu vezu na stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokol brisanja].",
        "searchresults": "Rezultati pretrage",
        "powersearch-togglelabel": "Označi:",
        "powersearch-toggleall": "Sve",
        "powersearch-togglenone": "Ništa",
+       "powersearch-remember": "Zapamti izbor za buduće pretrage",
        "search-external": "Vanjska pretraga",
        "searchdisabled": "<p>Izvinjavamo se!  Puno pretraga teksta je privremeno onemogućena.  U međuvremenu, možete koristiti Google za pretragu.  Indeks može biti stariji.",
        "search-error": "Desila se greška prilikom pretraživanja: $1",
        "preferences": "Postavke",
        "mypreferences": "Postavke",
        "prefs-edits": "Broj izmjena:",
-       "prefs-skin": "Koža",
+       "prefsnologintext2": "Prijavite se da biste sačuvali postavke.",
+       "prefs-skin": "Tema",
        "skin-preview": "Pregled",
        "datedefault": "Nije bitno",
        "prefs-labs": "Eksperimentalne mogućnosti",
        "prefs-user-pages": "Korisničke stranice",
-       "prefs-personal": "Korisnički podaci",
-       "prefs-rc": "Podešavanja nedavnih izmjena",
-       "prefs-watchlist": "Moji praćeni članci",
+       "prefs-personal": "Korisnički profil",
+       "prefs-rc": "Nedavne izmjene",
+       "prefs-watchlist": "Praćeni članci",
        "prefs-editwatchlist": "Uredi spisak praćenja",
        "prefs-editwatchlist-label": "Uredi unose na spisku praćenja:",
        "prefs-editwatchlist-edit": "Pregledaj i ukloni članke sa spiska praćenja",
        "prefs-editwatchlist-raw": "Napredno uređivanje spiska praćenja",
        "prefs-editwatchlist-clear": "Očisti spisak praćenja",
        "prefs-watchlist-days": "Broj dana za prikaz u spisku praćenja:",
-       "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|dan|dana}}",
+       "prefs-watchlist-days-max": "Najviše $1 {{PLURAL:$1|dan|dana}}",
        "prefs-watchlist-edits": "Najveći broj izmjena za prikaz u proširenom spisku praćenja:",
        "prefs-watchlist-edits-max": "Najveći broj: 1000",
-       "prefs-watchlist-token": "Token spiska za praćenje:",
+       "prefs-watchlist-token": "Žeton praćenih članaka:",
        "prefs-misc": "Ostala podešavanja",
        "prefs-resetpass": "Promijeni šifru",
-       "prefs-changeemail": "Promijeni e-mail adresu",
+       "prefs-changeemail": "Promijeni adresu e-pošte",
        "prefs-setemail": "Postavite e-mail adresu",
-       "prefs-email": "E-mail opcije",
+       "prefs-email": "Opcije e-pošte",
        "prefs-rendering": "Izgled",
        "saveprefs": "Sačuvaj",
-       "restoreprefs": "Vrati sve pretpostavljene postavke (u svim sekcijama)",
-       "prefs-editing": "Veličine tekstualnog polja",
-       "rows": "Redova",
-       "columns": "Kolona",
+       "restoreprefs": "Vrati sve postavke na podrazumijevane (u svim odjeljcima)",
+       "prefs-editing": "Uređivanje",
+       "rows": "Redova:",
+       "columns": "Kolona:",
        "searchresultshead": "Podešavanja rezultata pretrage",
        "stub-threshold": "Formatiranje <a href=\"#\" class=\"stub\">linkova stranica u začetku</a> (bajtova):",
-       "stub-threshold-disabled": "Isključen/a",
+       "stub-threshold-disabled": "Isključeno",
        "recentchangesdays": "Broj dana za prikaz u nedavnim izmjenama:",
-       "recentchangesdays-max": "(najviše $1 {{PLURAL:$1|dan|dana}})",
-       "recentchangescount": "Broj uređivanja za prikaz po pretpostavkama:",
-       "prefs-help-recentchangescount": "Ovo uključuje nedavne izmjene, historije stranice i zapise.",
+       "recentchangesdays-max": "Najviše $1 {{PLURAL:$1|dan|dana}}",
+       "recentchangescount": "Broj izmjena na nedavnim izmjenama:",
+       "prefs-help-recentchangescount": "Ovo uključuje nedavne izmjene, historije stranice i zapisnike.",
        "prefs-help-watchlist-token2": "Ovo je tajni ključ sažetka vašeg spiska izmjena. Ko god da ga zna, moći će ga čitati. Ne dijelite ga ni s kim. Ako je potrebno, [[Special:ResetTokens|možete ga ponovo postaviti]].",
        "savedprefs": "Vaše postavke su sačuvane.",
        "timezonelegend": "Vremenska zona:",
        "prefs-files": "Datoteke",
        "prefs-custom-css": "Prilagođeni CSS",
        "prefs-custom-js": "Prilagođeni JavaScript",
-       "prefs-common-css-js": "Dijeljeni CSS/JS za sve kože:",
+       "prefs-common-css-js": "Dijeljeni CSS/JavaScript za sve teme:",
        "prefs-reset-intro": "Možete koristiti ovu stranicu da poništite Vaše postavke na ovom sajtu na pretpostavljene vrijednosti.\nOvo se ne može vratiti unazad.",
-       "prefs-emailconfirm-label": "E-mail potvrda:",
-       "youremail": "E-mail:",
+       "prefs-emailconfirm-label": "Potvrda e-pošte:",
+       "youremail": "Adresa e-pošte:",
        "username": "{{GENDER:$1|Korisničko}} ime:",
        "prefs-memberingroups": "{{GENDER:$2|Korisnik|Korisnica}} je član {{PLURAL:$1|grupe|grupâ}}:",
        "prefs-registration": "Vrijeme registracije:",
        "badsig": "Loš sirovi potpis.\nProvjerite HTML tagove.",
        "badsiglength": "Vaš potpis je predug.\nMora biti manji od $1 {{PLURAL:$1|znaka|znaka|znakova}}.",
        "yourgender": "Kako želite da se predstavite?",
-       "gender-unknown": "Ne previše detaljno",
+       "gender-unknown": "Kad vas spominje, softver će pokušati koristiti srednji rod kad god je to moguće",
        "gender-male": "On uređuje wiki stranice",
        "gender-female": "Ona uređuje wiki stranice",
-       "prefs-help-gender": "Postavljanje ovih podešavanja je optionalno: Softver koristi ove vrijednosti za vaše naslovljanje i ispravke gramatičkog roda u porukama softvera. Ova informacija bit će javna.",
+       "prefs-help-gender": "Postavljanje ovih podešavanja nije obavezno.\nSoftver koristi ove vrijednosti za vaše naslovljanje i ispravke gramatičkog roda u porukama softvera. Ova će informacija biti javna.",
        "email": "E-mail",
        "prefs-help-realname": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje vašem radu.",
-       "prefs-help-email": "E-mail adresa je opcionalna, ali je potrebna jer omogućava da Vam se pošalje nova šifra u slučaju da je izgubite ili zaboravite.",
-       "prefs-help-email-others": "Također možete da odaberete da vas drugi kontaktiraju putem vaše korisničke stranice ili stranice za razgovor bez otkrivanja vašeg identiteta.",
+       "prefs-help-email": "Adresa e-pošte nije obavezna, ali je potrebna u slučaju ponovnog postavljanja šifre, ako je zaboravite.",
+       "prefs-help-email-others": "Također možete dopustiti drugim korisnicima da vas kontaktiraju preko linka na lijevoj strani vaše stranice ili stranice za razgovor.\nVaša adresa e-pošte neće biti prikazana drugim korisnicima koji vas kontaktiraju.",
        "prefs-help-email-required": "Neophodno je navesti e-mail adresu.",
        "prefs-info": "Osnovne informacije",
-       "prefs-i18n": "Internacionalizacije",
+       "prefs-i18n": "Internacionalizacija",
        "prefs-signature": "Potpis",
        "prefs-dateformat": "Format datuma",
        "prefs-timeoffset": "Vremenska razlika",
        "prefs-advancedediting": "Opće opcije",
-       "prefs-editor": "Urednik",
-       "prefs-preview": "Prethodni pregled",
+       "prefs-editor": "Uređivač",
+       "prefs-preview": "Pregled",
        "prefs-advancedrc": "Napredne opcije",
        "prefs-advancedrendering": "Napredne opcije",
        "prefs-advancedsearchoptions": "Napredne opcije",
        "prefs-diffs": "Razlike",
        "prefs-help-prefershttps": "Ova podešavanja će stupiti na snagu pri sljedećoj prijavi.",
        "prefswarning-warning": "Napravili ste promjene u vašim postavkama koje još uvijek nisu sačuvane. Ako napustite ovu stranicu bez da pritisnete na \"$1\", postavke neće biti ažurirane.",
+       "prefs-tabs-navigation-hint": "Savjet: Možete koristiti tipke sa lijevom i desnom strelicom za kretanje kroz kartice.",
        "email-address-validity-valid": "Izgleda valjano",
        "email-address-validity-invalid": "Neophodna valjana adresa!",
        "userrights": "Postavke korisničkih prava",
        "right-protect": "Promjena nivoa zaštite i uređivanje kaskadno zaštićenih stranica",
        "right-editprotected": "Uređivanje stranice zaštićenih kao \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Uređivanje stranica zaštićenih kao  \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Uređivanje modela sadržaja stranice",
        "right-editinterface": "Uređivanje korisničkog interfejsa",
        "right-editusercssjs": "Uređivanje CSS i JS datoteka drugih korisnika",
        "right-editusercss": "Uređivanje CSS datoteka drugih korisnika",
        "right-passwordreset": "Pogledaj e-mailove za obnavljanje šifre",
        "right-managechangetags": "Napravi i briši [[Special:Tags|oznake]] iz baze podataka",
        "right-applychangetags": "Primijeni [[Special:Tags|oznake]] na nečije izmjene",
+       "right-changetags": "Dodavanje ili uklanjanje raznih [[Special:Tags|oznaka]] na pojedinačnim verzijama i unosima zapisnika",
        "newuserlogpage": "Zapisnik novih korisnika",
        "newuserlogpagetext": "Ovo je zapis o registraciji novih korisnika.",
        "rightslog": "Zapisnik korisničkih prava",
        "action-viewmywatchlist": "pogledajte svoj spisak praćenih stranica",
        "action-viewmyprivateinfo": "pogledajte svoje privatne informacije",
        "action-editmyprivateinfo": "uredite svoje privatne podatke",
+       "action-editcontentmodel": "uredi model sadržaja stranice",
        "action-managechangetags": "napravite i uklonite oznake iz baze podataka",
+       "action-applychangetags": "dodate oznake uz vaše izmjene",
+       "action-changetags": "dodate ili uklonite razne oznake na pojedinačnim verzijama i unosima u zapisnicima",
        "nchanges": "$1 {{PLURAL:$1|promjena|promjene|promjena}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|izmjena od Vaše posljedne posjete}}",
        "enhancedrc-history": "historija",
        "recentchanges-summary": "Na ovoj stranici možete pratiti nedavne izmjene.",
        "recentchanges-noresult": "U zadanom vremenu nema promjena za zadane kriterije.",
        "recentchanges-feed-description": "Na ovoj stranici možete pratiti nedavne izmjene.",
-       "recentchanges-label-newpage": "Ovom izmjenom pravi se nova stranica",
-       "recentchanges-label-minor": "Ovo je mala izmjena",
-       "recentchanges-label-bot": "Ovu izmjenu napravio je bot",
+       "recentchanges-label-newpage": "Nova stranica",
+       "recentchanges-label-minor": "Manja izmjena",
+       "recentchanges-label-bot": "Izmjenu napravio bot",
        "recentchanges-label-unpatrolled": "Ova izmjena još nije patrolirana",
-       "recentchanges-label-plusminus": "Veličina stranice promijenila se za ovoliko bajtova",
+       "recentchanges-label-plusminus": "Promjena veličine stranice u bajtovima",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (također pogledajte [[Special:NewPages|spisak novih stranica]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|spisak novih stranica]])",
        "rcnotefrom": "Ispod {{PLURAL:$5|je izmjena|su izmjene}} od <strong>$3, $4</strong> (do <strong>$1</strong> prikazano).",
        "rclistfrom": "Prikaži nove izmjene počev od $3 $2",
        "rcshowhideminor": "$1 male izmjene",
        "rcshowhidebots": "$1 botove",
        "rcshowhidebots-show": "Pokaži",
        "rcshowhidebots-hide": "Sakrij",
-       "rcshowhideliu": "$1 registrovanih korisnika",
+       "rcshowhideliu": "$1 registrovane korisnike",
        "rcshowhideliu-show": "Pokaži",
        "rcshowhideliu-hide": "Sakrij",
        "rcshowhideanons": "$1 anonimne korisnike",
        "uploaderror": "Greška pri slanju",
        "upload-recreate-warning": "<strong>Upozorenje: Datoteka s tim imenom je obrisana ili premještena.</strong>\nZapisnik brisanja i premještanja za ovu stranicu dostupan je ovdje:",
        "uploadtext": "Koristite formu ispod za postavljanje datoteka.\nDa bi ste vidjeli ili pretražili ranije postavljene datoteke, pogledajte [[Special:FileList|spisak postavljenih datoteka]], ponovna postavljanja su također zapisana u [[Special:Log/upload|zapisnik postavljanja]], a brisanja u [[Special:Log/delete|zapisnik brisanja]].\n\nDa bi ste prikazali datoteku na stranici, koristite link na jedan od slijedećih načina:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg]]</nowiki></code>''' da upotrijebite potpunu veziju datoteke\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.png|200px|thumb|lijevo|opis slike]]</nowiki></code>''' da upotrijebite smanjeni prikaz širine 200 piksela unutar okvira, s lijevim poravnanjem i ''opisom slike''.\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datoteka.ogg]]</nowiki></code>''' za direkno povezivanje datoteke bez njenog prikazivanja",
-       "upload-permitted": "Podržane vrste datoteka: $1.",
-       "upload-preferred": "Preferirane vrste datoteka: $1.",
-       "upload-prohibited": "Zabranjene vrste datoteka: $1.",
+       "upload-permitted": "{{PLURAL:$2|Podržana vrsta|Podržane vrste}} datoteka: $1.",
+       "upload-preferred": "{{PLURAL:$2|Preferirana vrsta|Preferirane vrste}} datoteka: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Zabranjena vrsta|Zabranjene vrste}} datoteka: $1.",
        "uploadlogpage": "Zapisnik postavljanja",
        "uploadlogpagetext": "Ispod je spisak nedavno postavljenih datoteka.\nZa vizualni pregled datoteka, [[Special:NewFiles|pogledajte galeriju novih slika]].",
        "filename": "Ime datoteke",
        "fileexists-shared-forbidden": "Datoteka s ovim imenom već postoji u zajedničkoj ostavi. Molimo Vas da se vratite i pošaljete ovu datoteku pod novim imenom. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Ova datoteka je dvojnik {{PLURAL:$1|slijedećoj datoteci|slijedećim datotekama}}:",
        "file-deleted-duplicate": "Datoteka koje je identična ovoj datoteci ([[:$1]]) je ranije bila obrisana. Trebate provjeriti historiju brisanja te datoteke prije nego što nastavite sa njenim ponovnim postavljanjem.",
+       "file-deleted-duplicate-notitle": "Datoteka identična ovoj prethodno je obrisana i ime joj je sakriveno.\nTrebali biste pitati nekog ko može vidjeti podatke skrivenih datoteka da pregleda situaciju prije nego što ponovo postavite datoteku.",
        "uploadwarning": "Upozorenje pri slanju",
        "uploadwarning-text": "Molimo izmijeniti opis datoteke ispod i pokušajte kasnije.",
        "savefile": "Sačuvaj datoteku",
        "uploaddisabledtext": "Postavljanje datoteka je onemogućeno.",
        "php-uploaddisabledtext": "Postavljanje datoteka preko PHP je onemogućeno. Molimo provjerite postavku file_uploads.",
        "uploadscripted": "Ova datoteka sadrži HTML ili skriptni kod koji može izazvati grešku kod internet preglednika.",
+       "upload-scripted-pi-callback": "Datoteka koja sadrži instrukcije za obradu XML stilskog oblika se ne može postaviti.",
+       "uploaded-script-svg": "Pronađen skriptni element \"$1\" u postavljenoj SVG datoteci.",
+       "uploaded-hostile-svg": "Pronađen nesiguran CSS u stilskom elementu postavljene SVG datoteke.",
+       "uploaded-event-handler-on-svg": "Nije dozvoljeno postavljanje atributa koji kontroliraju događaje <code>$1=\"$2\"</code> u SVG datotekama.",
+       "uploaded-href-attribute-svg": "href atributi <code>&lt;$1 $2=\"$3\"&gt;</code> sa nelokalnom metom (npr. http://, javascript:, etc) nisu dozvoljeni u SVG datotekama.",
+       "uploaded-href-unsafe-target-svg": "Pronađen href sa nesigurnom metom <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-animate-svg": "Pronađena \"animate\" oznaka koja možda mijenja href koristeći se \"from\" atributom <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-setting-event-handler-svg": "Postavljanje kontrole događaja je blokirano, pronađeno <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-setting-href-svg": "Blokirano je korištenje \"set\" oznake kako bi se dodao \"href\" atribut glavnom elementu.",
+       "uploaded-wrong-setting-svg": "Blokirano je korištenje oznake \"set\" kako bi se dodao atribut udaljenoj/podatkovnoj/skriptnoj meti. Pronađeno <code>&lt;set to=\"$1\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-setting-handler-svg": "SVG datoteka koja koristi atribut \"handler\" sa udaljenom/podatkovnoj/skriptnom vrijednosti je blokirana. Pronađeno <code>$1=\"$2\"</code> u postavljenoj SVG datoteci.",
+       "uploaded-remote-url-svg": "SVG datoteka koja postavlja stilski atribut koristeći se vanjskim linkom je blokiranja. Pronađeno <code>$1=\"$2\"</code> u postavljenoj SVG datoteci.",
+       "uploaded-image-filter-svg": "Pronađen slikovni filter sa URLom: <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor \"$1\".",
+       "uploadinvalidxml": "Nije moguće raščlaniti XML postavljene datoteke.",
        "uploadvirus": "Datoteka sadrži virus!  Detalji:  $1",
        "uploadjava": "Datoteka je ZIP datoteka koja sadrži Java .class datoteku.\nPostavljanje Java datoteka nije dopušteno, jer one mogu prouzrokovati da se zaobiđu sigurnosne zabrane.",
        "upload-source": "Izvorna datoteka",
        "backend-fail-notsame": "Već postoji različita datoteka $1.",
        "backend-fail-invalidpath": "$1 nije valjana putanja za skladištenje.",
        "backend-fail-delete": "Ne može se izbrisati datoteka $1.",
+       "backend-fail-describe": "Ne mogu promijeniti metapodatke za datoteku \"$1\".",
        "backend-fail-alreadyexists": "Datoteka $1 već postoji.",
        "backend-fail-store": "Ne može se spremiti datoteka $1 na $2.",
        "backend-fail-copy": "Nije uspjelo kopiranje datoteke \"$1\" u \"$2\".",
        "backend-fail-closetemp": "Ne mogu zatvoriti privremenu datoteku.",
        "backend-fail-read": "Ne mogu čitati datoteku $1.",
        "backend-fail-create": "Ne mogu napraviti datoteku $1.",
+       "backend-fail-maxsize": "Ne mogu zapisati datoteku \"$1\" jer je veća od {{PLURAL:$2|$2 bajta|$2 bajta|$2 bajtova}}.",
        "backend-fail-readonly": "Skladišna osnova \"$1\" je trenutno samo za čitanje. Navedeni razlog je: \"$2\"",
        "backend-fail-synced": "Datoteka \"$1\" je u nekonzistentnom stanju u internom skladištu",
        "backend-fail-connect": "Ne mogu se povezati sa pozadinskim spremištem \"$1\".",
        "backend-fail-internal": "Došlo je do nepoznate greške u skladišnoj osnovi \"$1\".",
        "backend-fail-contenttype": "Ne mogu da utvrdim kakav sadržaj ima datoteka koju treba da smjestim u \"$1\".",
        "backend-fail-batchsize": "Skladišna osnova je dobila blokadu od $1 {{PLURAL:$1|datotečne operacije|datotečne operacije|datotečnih operacija}}; ograničenje je $2 {{PLURAL:$2|operacija|operacije|operacija}}.",
+       "backend-fail-usable": "Ne mogu pročitati ili zapisati datoteku \"$1\" jer nemate odgovarajuća prava ili folderi/sadržioci ne postoje.",
+       "filejournal-fail-dbconnect": "Ne mogu se povezati s novinarskom bazom podataka za skladišnu osnovu \"$1\".",
+       "filejournal-fail-dbquery": "Ne mogu ažurirati novinarsku bazu za skladišnu osnovu \"$1\".",
        "lockmanager-notlocked": "Ne mogu otključati \"$1\"; nije zaključan.",
        "lockmanager-fail-closelock": "Ne mogu zatvoriti \"lock\"-datoteku za \"$1\".",
        "lockmanager-fail-deletelock": "Ne mogu obrisati \"lock\"-datoteku za \"$1\".",
        "lockmanager-fail-releaselock": "Ne mogu osloboditi katanac za „$1“.",
        "lockmanager-fail-db-bucket": "Ne mogu da kontaktiram s dovoljno \"lock\"-baza u kanti $1.",
        "lockmanager-fail-db-release": "Ne mogu osloboditi katance u bazi $1.",
+       "lockmanager-fail-svr-acquire": "Ne mogu dobiti katance na serveru $1.",
        "lockmanager-fail-svr-release": "Ne mogu se otključati katanci na serveru file $1.",
        "zip-file-open-error": "Desila se greška pri otvaranju datoteke za provjere ZIP-a.",
        "zip-wrong-format": "Navedena datoteka nije bila ZIP datoteka.",
        "listfiles_size": "Veličina",
        "listfiles_description": "Opis",
        "listfiles_count": "Verzije",
+       "listfiles-show-all": "Obuhvati stare verzije slika",
        "listfiles-latestversion": "Trenutna verzija",
        "listfiles-latestversion-yes": "Da",
        "listfiles-latestversion-no": "Ne",
        "download": "učitaj",
        "unwatchedpages": "Nepraćene stranice",
        "listredirects": "Spisak preusmjerenja",
+       "listduplicatedfiles": "Spisak duplih datoteka",
+       "listduplicatedfiles-summary": "Ovo je spisak datoteka koje su duplikat nekih drugih datoteka. Prikazane su samo lokalne datoteke.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] ima [[$3|{{PLURAL:$2|jedan duplikat|$2 duplikata}}]].",
        "unusedtemplates": "Nekorišteni šabloni",
        "unusedtemplatestext": "Ova stranica prikazuje sve stranice u imenskom prostoru {{ns:template}} koji se ne koriste.\nPrije brisanja provjerite da li druge stranice vode na te šablone.",
        "unusedtemplateswlh": "ostali linkovi",
        "pageswithprop-text": "Ova stranica prikazuje stranice koje imaju određeno svojstvo.",
        "pageswithprop-prop": "Naziv svojstva:",
        "pageswithprop-submit": "Idi",
+       "pageswithprop-prophidden-long": "sakriveno dugo tekstualno svojstvo ($1)",
+       "pageswithprop-prophidden-binary": "sakriveno dugo binarno svojstvo ($1)",
        "doubleredirects": "Dvostruka preusmjerenja",
        "doubleredirectstext": "Ova stranica prikazuje stranice koje preusmjeravaju na druga preusmjerenja.\nSvaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju teksta drugog preusmjerenja, što obično daje \"pravi\" ciljni članak, na koji bi prvo preusmjerenje i trebalo da pokazuje.\n<del>Precrtane</del> stavke su riješene.",
        "double-redirect-fixed-move": "[[$1]] je premješten.\nAutomatski je ažuriran i sada preusmjerava na [[$2]].",
        "ninterwikis": "$1 {{PLURAL:$1|međujezična veza|međujezične veze}}",
        "nlinks": "$1 {{PLURAL:$1|veza|veze}}",
        "nmembers": "$1 {{PLURAL:$1|član|članova}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|član|člana|članova}}",
        "nrevisions": "$1 {{PLURAL:$1|revizija|revizije|revizija}}",
        "nimagelinks": "Koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}",
        "ntransclusions": "koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}",
        "unusedimages": "Neupotrebljene slike",
        "wantedcategories": "Tražene kategorije",
        "wantedpages": "Tražene stranice",
+       "wantedpages-summary": "Spisak nepostojećih stranica sa najviše veza ka njima. Na spisku se ne nalaze stranice do kojih vode preusmjerenja. Za spisak nepostojećih stranica na koje su povezana preumsjerenja, pogledajte [[{{#special:BrokenRedirects}}|spisak pokvarenih preusmerenja]].",
        "wantedpages-badtitle": "Nevaljan naslov u setu rezultata: $1",
        "wantedfiles": "Tražene datoteke",
        "wantedfiletext-cat": "Sljedeće datoteke se koriste, ali ne postoje. Datoteke iz drugih baza mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbrisane</del> sa spiska. Pored toga, stranice koje sadrže nepostojeće datoteke se nalaze u [[:$1]].",
+       "wantedfiletext-cat-noforeign": "Sljedeće datoteke se koriste, ali ne postoje. Dodatno, stranice koje ugrađuju datoteke koje ne postoje prikazane su u [[:$1]].",
        "wantedfiletext-nocat": "Sljedeće datoteke se koriste, ali ne postoje. Datoteke iz drugih baza mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbrisane</del> sa spiska.",
+       "wantedfiletext-nocat-noforeign": "Sljedeće datoteke se koriste, ali ne postoje.",
        "wantedtemplates": "Potrebni šabloni",
        "mostlinked": "Članci sa najviše linkova",
        "mostlinkedcategories": "Kategorije sa najviše linkova",
        "mostlinkedtemplates": "Najviše uključene stranice",
        "mostcategories": "Članci sa najviše kategorija",
        "mostimages": "Najviše linkovane slike",
+       "mostinterwikis": "Stranice sa najviše međuwikija",
        "mostrevisions": "Članci sa najviše izmjena",
        "prefixindex": "Sve stranice sa prefiksom",
        "prefixindex-namespace": "Sve stranice s predmetkom (imenski prostor $1)",
+       "prefixindex-strip": "Sakrij prefiks u spisku",
        "shortpages": "Kratke stranice",
        "longpages": "Dugačke stranice",
        "deadendpages": "Stranice bez internih veza",
        "deadendpagestext": "Slijedeće stranice nisu povezane s drugim stranicama na {{SITENAME}}.",
        "protectedpages": "Zaštićene stranice",
        "protectedpages-indef": "Samo neograničena zaštićenja",
+       "protectedpages-summary": "Na ovoj stranici se nalazi spisak trenutno zaštićenih stranica. Za spisak zaštićenih naslova vidi [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Samo prenosive zaštite",
        "protectedpages-noredirect": "Sakrij preusmjerenja",
        "protectedpagesempty": "Trenutno nijedna stranica nije zaštićena ovim parametrima.",
        "logempty": "Nema zatraženih članaka u zapisniku.",
        "log-title-wildcard": "Traži naslove koji počinju ovim tekstom",
        "showhideselectedlogentries": "Pokaži/sakrij izabrane zapise u evidenciji",
+       "log-edit-tags": "Uredi oznake izabranih zapisničkih unosa",
        "allpages": "Sve stranice",
        "nextpage": "Sljedeća strana ($1)",
        "prevpage": "Prethodna stranica ($1)",
        "linksearch-pat": "Šema traženja:",
        "linksearch-ns": "Imenski prostor:",
        "linksearch-ok": "Traži",
-       "linksearch-text": "Mogu se koristiti općeniti izrazi poput \"*.wikipedia.org\".\nPotrebna je najmanje osnovna domena, naprimjer \"*.org.\"<br />\nPodržani {{PLURAL:$2|protokol|protokoli}}: <code>$1</code> (default je http:// ako nijedan protokol nije naveden).",
+       "linksearch-text": "Mogu se koristiti općeniti izrazi poput \"*.wikipedia.org\".\nPotrebna je najmanje osnovna domena, naprimjer \"*.org.\"<br />\nPodržani {{PLURAL:$2|protokol|protokoli}}: $1 (default je http:// ako nijedan protokol nije naveden).",
        "linksearch-line": "$1 je povezan od $2",
        "linksearch-error": "Džokeri se mogu pojavljivati samo na početku naziva servera.",
        "listusersfrom": "Prikaži korisnike koji počinju sa:",
        "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
        "listgrouprights-namespaceprotection-restrictedto": "Prava kojima se dozvoljava korisniku da uređuje",
        "trackingcategories": "Praćenje kategorija",
+       "trackingcategories-summary": "Ova stranica prikazuje prateće kategorije koje MediaWiki softver automatski popunjava. Njihovi nazivi se mogu promijeniti izmjenom odgovarajućih sistemskih poruka u imenskom prostoru {{ns:8}}.",
        "trackingcategories-msg": "Praćenje kategorije",
        "trackingcategories-name": "Ime poruke",
        "trackingcategories-desc": "Kriterij uključenja kategorije",
+       "noindex-category-desc": "Roboti ne indeksiraju stranicu jer u sebi ima magičnu riječ <code><nowiki>__NOINDEX__</nowiki></code>, te je u imenskom prostoru u kome ta oznaka nije dozvoljena.",
+       "index-category-desc": "Stranica ima u sebi <code><nowiki>__INDEX__</nowiki></code> (te se nalazi u imenskom prostoru gdje je ta oznaka dozvoljena) pa je, samim tim, roboti indeksiraju.",
+       "post-expand-template-inclusion-category-desc": "Veličina stranice prelazi <code>$wgMaxArticleSize</code> nakon proširenja svih šablona, te zbog toga neki šabloni nisu prošireni.",
+       "post-expand-template-argument-category-desc": "Veličina stranice prelazi <code>$wgMaxArticleSize</code> nakon proširenja defincije šablona (nešto što je u trima vitičastim zagradama, poput <code>{{{Foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "Stranica koristi previše ekspenzivnih parserskih funkcija (poput <code>#ifexist</code>). Pogledajte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Stranica sadrži pokvareni link ka datoteci (link koji se nadovezuje na nepostojeću datoteku).",
+       "hidden-category-category-desc": "Kategorija u sebi sadrži <code><nowiki>__HIDDENCAT__</nowiki></code> te se samim tim ne prikazuju u odjeljku za kategoriju na stranicama.",
        "trackingcategories-nodesc": "Opis nije dostupan.",
        "trackingcategories-disabled": "Kategorija je onemogućena",
        "mailnologin": "Nema adrese za slanje",
        "mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]]\ni imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]]\nda biste slali e-poštu drugim korisnicima.",
-       "emailuser": "Pošalji e-poštu ovom korisniku",
+       "emailuser": "Pošalji e-poštu",
        "emailuser-title-target": "Pošalji e-poruku {{GENDER:$1|korisniku|korisnici|korisniku}}",
        "emailuser-title-notarget": "Pošalji e-mail korisniku",
        "emailpage": "Pošalji e-mail korisniku",
        "emailccsubject": "Kopiraj Vašu poruku za $1: $2",
        "emailsent": "Poruka poslata",
        "emailsenttext": "Vaša poruka je poslata e-poštom.",
-       "emailuserfooter": "Ovaj e-mail je poslao $1 korisniku $2 putem funkcije \"Pošalji e-mail korisniku\" sa {{SITENAME}}.",
+       "emailuserfooter": "Ovaj e-mail je poslao $1 korisniku $2 putem funkcije \"{{int:emailpage}}\" sa {{SITENAME}}.",
        "usermessage-summary": "Ostavljanje sistemske poruke.",
        "usermessage-editor": "Sistem za poruke",
        "watchlist": "Praćeni članci",
        "rollback-success": "Poništene izmjene korisnika $1;\nvraćeno na posljednju verziju koju je sačuvao $2.",
        "sessionfailure-title": "Greška u sesiji",
        "sessionfailure": "Izgleda da postoji problem sa vašom sesijom; ova akcija je otkazana kao prevencija protiv napadanja sesija. Kliknite \"back\" (''nazad'') i osvježite stranicu sa koje ste došli, i opet pokušajte.",
+       "changecontentmodel": "Promijeni model sadržaja stranice",
+       "changecontentmodel-legend": "Promijeni model sadržaja",
+       "changecontentmodel-title-label": "Naslov stranice",
+       "changecontentmodel-model-label": "Novi model sadržaja",
+       "changecontentmodel-reason-label": "Razlog:",
+       "changecontentmodel-success-title": "Model sadržaja je promijenjen",
+       "changecontentmodel-success-text": "Model sadržaja stranice [[:$1]] je promijenjen.",
+       "changecontentmodel-cannot-convert": "Model sadržaja stranice [[:$1]] se ne može pretvoriti u vrstu $2.",
+       "changecontentmodel-title-cantexist": "Ne može postojati stranica na $1.",
+       "changecontentmodel-nodirectediting": "Model sadržaja $1 ne podržava izravno uređivanje",
+       "log-name-contentmodel": "Zapisnik promjene modela sadržaja",
+       "log-description-contentmodel": "Događaji koji su povezani s modelom sadržaja stranice",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|promijenio|promijenila}} je model sadržaja stranice $3 iz \"$4\" u \"$5\"",
+       "logentry-contentmodel-change-revertlink": "vrati",
+       "logentry-contentmodel-change-revert": "vrati",
        "protectlogpage": "Zapisnik zaključavanja",
        "protectlogtext": "Ispod je spisak promjena zaštićenja stranice.\nPogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za pregled trenutno operativnih zaštita stranica.",
        "protectedarticle": "stranica \"[[$1]]\" je zaštićena",
        "protect-locked-blocked": "Ne možete promijeniti nivo zaštite dok ste blokirani.\nOvo su trenutne postavke za stranicu '''$1''':",
        "protect-locked-dblock": "Nivoi zaštite ne mogu se mijenjati jer je aktivna baza podataka zaključana.\nTrenutna postavka za stranicu '''$1''' jest:",
        "protect-locked-access": "Nemate ovlasti za mijenjanje stepena zaštite.\nSlijede trenutne postavke stranice '''$1''':",
-       "protect-cascadeon": "Ova stranica je trenutno zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju|stranice, koje imaju}} uključenu prenosnu zaštitu.\nPromijene stepena zaštite ove stranice neće uticati na prenosnu zaštitu.",
+       "protect-cascadeon": "Ova stranica je trenutno zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju}} uključenu prenosivu zaštitu.\nPromjene stepena zaštite ove stranice neće utjecati na prenosnu zaštitu.",
        "protect-default": "Dopusti svim korisnicima",
        "protect-fallback": "Dozvolite samo korisnicima sa \"$1\" ovlastima/privilegijama",
        "protect-level-autoconfirmed": "Dopustite samo automatski potvrđenim korisnicima",
        "protect-othertime": "Ostali period:",
        "protect-othertime-op": "ostali period",
        "protect-existing-expiry": "Postojeće vrijeme isticanja: $3, $2",
+       "protect-existing-expiry-infinity": "Postojeće vrijeme isteka: trajno",
        "protect-otherreason": "Ostali/dodatni razlozi:",
        "protect-otherreason-op": "Ostali razlozi",
        "protect-dropdown": "*Uobičajeni razlozi zaštite\n** Prekomjerni vandalizam\n** Prekomjerno spamovanje\n** Ne produktivni rat izmjena\n** Stranica velikog prometa",
        "namespace": "Vrsta članka:",
        "invert": "Sve osim odabranog",
        "tooltip-invert": "Označite ovu kutiju za sakrivanje promjena na stranicama u odabranom imenskom prostoru (i povezanim imenskim prostorima ako je označeno)",
+       "tooltip-whatlinkshere-invert": "Označite ovu kutiju za sakrivanje linkova sa stranica u izabranom imenskom prostoru.",
        "namespace_association": "Povezan imenski prostor",
        "tooltip-namespace_association": "Označite ovu kutiju da također uključite razgovor ili imenski prostor teme koja je povezana sa odabranim imenskim prostorom",
        "blanknamespace": "(Glavno)",
        "sp-contributions-newbies": "Prikaži samo doprinose novih korisnika",
        "sp-contributions-newbies-sub": "Za nove korisnike",
        "sp-contributions-newbies-title": "Doprinosi novih korisnika",
-       "sp-contributions-blocklog": "Evidencija blokiranja",
+       "sp-contributions-blocklog": "zapisnik blokiranja",
+       "sp-contributions-suppresslog": "obrisani doprinosi korisnika",
        "sp-contributions-deleted": "obrisani doprinosi korisnika",
        "sp-contributions-uploads": "postavljanja",
        "sp-contributions-logs": "zapisnici",
        "sp-contributions-search": "Pretraga doprinosa",
        "sp-contributions-username": "IP adresa ili korisničko ime:",
        "sp-contributions-toponly": "Prikaži samo izmjene koje su posljednje revizije",
+       "sp-contributions-newonly": "Prikaži samo izmjene kojima su napravljene nove stranice",
        "sp-contributions-submit": "Traži",
-       "whatlinkshere": "Šta je povezano ovdje",
+       "whatlinkshere": "Šta vodi ovamo",
        "whatlinkshere-title": "Stranice koje vode na \"$1\"",
        "whatlinkshere-page": "Stranica:",
        "linkshere": "Sljedeći članci vode na '''[[:$1]]''':",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] je {{GENDER:$1|blokiran|blokirana|blokiran}}.<br />\nPogledajte [[Special:BlockList|spisak blokiranja]] za pregled blokiranja.",
        "ipb-blockingself": "Ovom akcijom ćete blokirati sebe! Da li ste sigurni da to želite?",
        "ipb-confirmhideuser": "Upravo ćete blokirati korisnika s uključenom opcijom \"Sakrij korisnika\". Ovim će korisničko ime biti sakriveno u svim spiskovima i stavkama zapisnika. Jeste li sigurni da to želite?",
+       "ipb-confirmaction": "Ako ste sigurni da želite nastaviti, kliknite na \"{{int:ipb-confirm}}\" polje na dnu stranice.",
        "ipb-edit-dropdown": "Uredi razloge blokiranja",
        "ipb-unblock-addr": "Deblokiraj $1",
        "ipb-unblock": "Deblokiraj korisničko ime ili IP adresu",
        "unblocked": "[[User:$1|$1]] je deblokiran",
        "unblocked-range": "$1 je deblokiran",
        "unblocked-id": "Blokada ID oznake $1 je uklonjena",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] je deblokiran.",
        "blocklist": "Blokirani korisnici",
        "ipblocklist": "Blokirani korisnici",
        "ipblocklist-legend": "Traži blokiranog korisnika",
        "blocklog-showsuppresslog": "Ovaj korisnik je ranije blokiran i sakriven. Zapisnik sakrivanja je prikazan ispod kao referenca:",
        "blocklogentry": "je blokirao [[$1]] sa vremenom isticanja blokade od $2 $3",
        "reblock-logentry": "promjena postavki blokiranja za [[$1]] sa vremenom isteka u $2 $3",
-       "blocklogtext": "Ovo je historija akcija blokiranja i deblokiranja korisnika.\nAutomatski blokirane IP adrese nisu navedene ovdje.\nPogledajte [[Special:BlockList|spisak blokiranja]] za spisak trenutnih zabrana i blokiranja.",
+       "blocklogtext": "Ispod je spisak blokiranja i deblokiranja korisnika.\nAutomatski blokirane IP adrese nisu ispisane ispod.\nPogledajte [[Special:BlockList|spisak blokiranja]] za spisak trenutnih zabrana i blokiranja.",
        "unblocklogentry": "deblokiran $1",
        "block-log-flags-anononly": "samo anonimni korisnici",
        "block-log-flags-nocreate": "pravljenje računa onemogućeno",
        "proxyblockreason": "Vaša IP adresa je blokirana jer je ona otvoreni proksi.  Molimo vas da kontaktirate vašeg davatelja internetskih usluga (Internet Service Provider-a) ili tehničku podršku i obavijestite ih o ovom ozbiljnom sigurnosnom problemu.",
        "sorbsreason": "Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL koji koristi {{SITENAME}}.",
        "sorbs_create_account_reason": "Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL korišten od {{SITENAME}}.\nNe možete napraviti račun",
+       "xffblockreason": "Blokirana je vaša ili IP adresa proxy servera koga koristite, koja se nalazi u zaglavlju X-Forwarded-For. Razlog za blokiranje je bio: $1",
        "cant-see-hidden-user": "Korisnik kojeg pokušavate blokirati je već blokiran i sakriven. Pošto nemate prava hideuser (sakrivanje korisnika), ne možete vidjeti ni urediti korisnikovu blokadu.",
        "ipbblocked": "Ne možete blokirati ili deblokirati druge korisnike, jer ste i sami blokirani",
        "ipbnounblockself": "Nije Vam dopušteno da deblokirate samog sebe",
        "movepagetalktext": "Odgovarajuća stranica za razgovor, ako postoji, automatski će biti premještena istovremeno '''osim ako:'''\n*premještate stranicu preko imenskih prostora\n*neprazna stranica za razgovor već postoji pod novim imenom\n*odčekirate donju kutiju.\n\nU tim slučajevima morat ćete ručno premjestiti ili prekopirati stranicu ako to želite.",
        "movearticle": "Premjesti stranicu:",
        "moveuserpage-warning": "'''Upozorenje:''' Premještate korisničku stranicu. Molimo da zapamtite da će se samo stranica premjestiti a korisnik se ''neće'' preimenovati.",
+       "movecategorypage-warning": "<strong>Upozorenje:</strong> Premještate stranicu kategorije. Imajte na umu da će samo stranica biti premještena i da sve stranice u staroj kategoriji <em>neće</em> biti ponovo kategorirane u novu kategoriju.",
        "movenologintext": "Morate biti registrovani korisnik i [[Special:UserLogin|prijavljeni]] da biste premjestili stranicu.",
        "movenotallowed": "Nemate dopuštenje za premještanje stranica.",
        "movenotallowedfile": "Nemate dopuštenja da premještanje datoteke.",
        "cant-move-user-page": "Nemate dopuštenje da premještate korisničke stranice (bez podstranica).",
        "cant-move-to-user-page": "Nemate dopuštenje da premjestite stranicu na korisničku stranicu (osim na korisničku podstranicu).",
+       "cant-move-category-page": "Nemate dopuštene da premještate stranice kategorija.",
+       "cant-move-to-category-page": "Nemate dopuštenje da premjestite stranicu na stranicu kategorije.",
        "newtitle": "Novi naslov",
        "move-watch": "Prati ovu stranicu",
        "movepagebtn": "Premjesti stranicu",
        "immobile-target-namespace-iw": "Međuwiki link nije ispravno odredište premještanja stranice.",
        "immobile-source-page": "Ova stranica se ne može premještati.",
        "immobile-target-page": "Ne može se premjestiti na taj odredišni naslov.",
+       "bad-target-model": "Željeno odredište koristi drugačiji model sadržaja. Ne mogu pretvoriti iz $1 u $2.",
        "imagenocrossnamespace": "Ne može se premjestiti datoteka u nedatotečni imenski prostor",
        "nonfile-cannot-move-to-file": "Ne mogu se premjestiti podaci u datotečni imenski prostor",
        "imagetypemismatch": "Ekstenzija nove datoteke ne odgovara njenom tipu",
        "thumbnail-temp-create": "Ne mogu da napravim privremenu smanjenu sliku",
        "thumbnail-dest-create": "Ne mogu da sačuvam smanjenu sliku (\"thumbnail\") na destinaciju",
        "thumbnail_invalid_params": "Pogrešne postavke smanjenog prikaza",
+       "thumbnail_toobigimagearea": "Datoteka sa dimenzijama većim od $1",
        "thumbnail_dest_directory": "Ne može se napraviti odredišni folder",
        "thumbnail_image-type": "Tip slike nije podržan",
        "thumbnail_gd-library": "Nekompletna konfiguracija GD biblioteke: nedostaje funkcija $1",
        "thumbnail_image-missing": "Datoteka ne dostaje: $1",
+       "thumbnail_image-failure-limit": "Bilo je previše nedavnih greška ($1 ili više) pri pravljenju umanjene slike. Ponovo pokušajte kasnije.",
        "import": "Uvoz stranica",
        "importinterwiki": "Uvezeno sa druge wiki",
-       "import-interwiki-text": "Izaberi wiki i naslov stranice za uvoz.\nDatumi revizija i imena autora će biti sačuvani.\nSve akcije pri međuwiki uvozu će biti zapisane u [[Special:Log/import|zapisu uvoza]].",
+       "import-interwiki-text": "Izaberi wiki i naslov stranice za uvoz.\nDatumi i imena autora verzija će biti sačuvani.\nSve akcije pri međuwiki uvozu će biti zapisane u [[Special:Log/import|zapisniku uvoza]].",
+       "import-interwiki-sourcewiki": "Izvorna wiki:",
+       "import-interwiki-sourcepage": "Izvorna stranica:",
        "import-interwiki-history": "Kopiraj sve verzije historije za ovu stranicu",
        "import-interwiki-templates": "Uključi sve šablone",
        "import-interwiki-submit": "Uvoz",
+       "import-mapping-default": "Uvezi u predodređena mjesta",
+       "import-mapping-namespace": "Uvezi u imenski prostor:",
+       "import-mapping-subpage": "Uvezi kao podstranice sljedeće stranice:",
        "import-upload-filename": "Naziv datoteke:",
        "import-comment": "Komentar:",
        "importtext": "Molimo Vas da izvezete datoteku iz izvornog wikija koristeći [[Special:Export|alat za izvoz]].\nSačuvajte je na Vašem računaru i pošaljite ovdje.",
        "importcantopen": "Ne može se otvoriti uvozna datoteka",
        "importbadinterwiki": "Loš interwiki link",
        "importsuccess": "Uspješno ste uvezli stranicu!",
-       "importnosources": "Nije definisan međuwiki izvor za uvoz i direktna postavljanja historije su onemogućena.",
+       "importnosources": "Nije definisan međuwiki izvor za uvoz i direktna postavljanja historije su isključena.",
        "importnofile": "Uvozna datoteka nije postavljena.",
        "importuploaderrorsize": "Postavljanje uvozne datoteke nije uspjelo.\nDatoteka je veća nego što je dopušteno.",
        "importuploaderrorpartial": "Postavljanje uvozne datoteke nije uspjelo.\nDatoteka je samo djelimično postavljena.",
        "import-error-interwiki": "Stranica \"$1\" nije uvezena jer je njen naziv rezerviran za vanjsko povezivanje (interwiki).",
        "import-error-special": "Stranica \"$1\" nije uvezena jer pripada posebnom imenskom prostoru koje ne prihvata stranice.",
        "import-error-invalid": "Stranica \"$1\" nije uvezena jer je naziv pod kojim treba biti uvezena nije valjan na ovoj wiki.",
+       "import-error-unserialize": "Verzija $2 stranice $1 ne može biti pročitana, odnosno uvezena. Zapisano je da verzija koristi $3 tip sadržaja u $4 formatu.",
+       "import-error-bad-location": "Verzija $2 koja koristi model sadržaja $3 ne može se postaviti na stranicu \"$1\" ovog wikija, jer taj model sadržaja nije podržan na toj stranici.",
        "import-options-wrong": "{{PLURAL:$2|Pogrešna opcija|Pogrešne opcije}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Navedena osnovna stranica ima neispravan naslov.",
        "import-rootpage-nosubpage": "Imenski prostor \"$1\" osnovne stranice ne dozvoljava podstranice.",
        "javascripttest": "Testiranje JavaScript-e",
        "javascripttest-pagetext-noframework": "Ova stranica je određena za pokretanje JavaScript testova.",
        "javascripttest-pagetext-unknownframework": "Nepoznat radni okvir testiranja\"$1\".",
+       "javascripttest-pagetext-unknownaction": "Nepoznata radnja \"$1\".",
        "javascripttest-pagetext-frameworks": "Molimo Vas izaberite jednu od sljedećih testnih okvira: $1",
        "javascripttest-pagetext-skins": "Izaberite s kojom temom želite da pokrenete probu:",
        "javascripttest-qunit-intro": "Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.",
        "pageinfo-robot-index": "Dozvoljeno",
        "pageinfo-robot-noindex": "Nije dozvoljeno",
        "pageinfo-watchers": "Broj pratitelja stranice",
+       "pageinfo-visiting-watchers": "Broj korisnika koji prate ovu stranica i koji su je posjetili zbog najnovijih izmjena",
        "pageinfo-few-watchers": "Manje od $1 {{PLURAL:$1|pratioca|pratilaca}}",
+       "pageinfo-few-visiting-watchers": "Moguće je da postoji korisnik koji prati i posjećuje nedavne izmjene",
        "pageinfo-redirects-name": "Broj preusmjeravanja na ovu stranicu",
        "pageinfo-subpages-name": "Podstranice ove stranice",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|preusmjerenje|preusmjerenja}}; $3 {{PLURAL:$3|nepreusmjerenje|nepreusmjerenja}})",
        "pageinfo-redirectsto-info": "Informacije",
        "pageinfo-contentpage": "Broji se kao stranica sa sadržajem",
        "pageinfo-contentpage-yes": "Da",
+       "pageinfo-protect-cascading": "Prenosiva zaštita počinje od ove stranice",
        "pageinfo-protect-cascading-yes": "Da",
+       "pageinfo-protect-cascading-from": "Prenosiva zaštita počinje od",
        "pageinfo-category-info": "Informacije o kategoriji",
        "pageinfo-category-total": "Ukupan broj članova",
        "pageinfo-category-pages": "Broj stranica",
        "patrol-log-page": "Zapisnik patroliranja",
        "patrol-log-header": "Ovdje se nalazi zapis patroliranih revizija.",
        "log-show-hide-patrol": "$1 zapis patroliranja",
+       "log-show-hide-tag": "$1 zapisnik oznaka",
        "deletedrevision": "Obrisana stara revizija $1",
        "filedeleteerror-short": "Greška pri brisanju datoteke: $1",
        "filedeleteerror-long": "Desile su se greške pri brisanju datoteke:\n\n$1",
        "watchlistedit-clear-titles": "Naslovi:",
        "watchlistedit-clear-submit": "Isprazni spisak nadgledanja (Ovo je trajno!)",
        "watchlistedit-clear-done": "Vaš spisak praćenja je očišćen.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 naslov je uklonjen|$1 naslova su uklonjena|$1 naslova je uklonjeno}}:",
+       "watchlistedit-too-many": "Ima previše stranica za prikaz ovdje.",
        "watchlisttools-clear": "Očisti spisak nadgledanja",
        "watchlisttools-view": "Pogledaj srodne izmjene",
        "watchlisttools-edit": "Pogledaj i uredi spisak praćenja",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|razgovor]])",
        "timezone-utc": "KSV",
        "duplicate-defaultsort": "Upozorenje: Postavljeni ključ sortiranja \"$2\" zamjenjuje raniji ključ \"$1\".",
+       "duplicate-displaytitle": "<strong>Upozorenje:</strong> Prikazivani naslov \"$2\" poništava prethodni naslov \"$1\".",
+       "invalid-indicator-name": "<strong>Greška:</strong> <code>Imena</code> pokazatelja stanja strance ne smiju biti prazna.",
        "version": "Verzija",
        "version-extensions": "Instalirana proširenja (ekstenzije)",
        "version-skins": "Instalirane kože",
        "version-license": "Licenca",
        "version-ext-license": "Licenca",
        "version-ext-colheader-name": "Proširenje",
-       "version-skin-colheader-name": "Izgled",
+       "version-skin-colheader-name": "Tema",
        "version-ext-colheader-version": "Verzija",
        "version-ext-colheader-license": "Licenca",
        "version-ext-colheader-description": "Opis",
        "version-ext-colheader-credits": "Autori",
        "version-license-title": "Licenca za $1",
+       "version-license-not-found": "Za ovo proširenje nije pronađena informacija o licenci.",
+       "version-credits-title": "Zasluge za $1",
+       "version-credits-not-found": "Za ovo proširenje nisu pronađene informacije o zaslugama.",
        "version-poweredby-credits": "Ova wiki je zasnovana na '''[https://www.mediawiki.org/ MediaWiki]''', autorska prava zadržana © 2001-$1 $2.",
        "version-poweredby-others": "ostali",
+       "version-poweredby-translators": "translatewiki.net prevodioci",
        "version-credits-summary": "Željeli bismo se zahvaliti sljedećim ljudima na njihovom doprinosu [[Special:Version|MediaWikiju]].",
        "version-license-info": "Mediawiki je slobodni softver; možete ga redistribuirati i(li) mijenjati pod uvjetima opće javne GNU licence kao što je objavljeno od strane \"Free Software Foundationa\", bilo u verziji 2 licence ili (po Vašoj volji) nekoj od kasnijih verzija.\n\nMediawiki se distribuira u nadi da će biti korisna, ali BEZ IKAKVIH GARANCIJA, čak i bez ikakvih posrednih garancija o KOMERCIJALNOSTI ili DOSTUPNOSTI ZA ODREĐENU SVRHU. Pogledajte opću javnu GNU licencu za više detalja.\n\nTrebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU opće javne GNU licence] zajedno s ovim programom. Ako niste, pišite \"Free Software Foundationu\" na adresu: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ili je pročitajte [//www.gnu.org/licenses/old-licenses/gpl-2.0.html ovdje].",
        "version-software": "Instalirani softver",
        "version-entrypoints": "URL Adrese ulazne tačke",
        "version-entrypoints-header-entrypoint": "Ulazna tačka",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Instalirane biblioteke",
+       "version-libraries-library": "Biblioteka",
        "version-libraries-version": "Verzija",
+       "version-libraries-license": "Licenca",
+       "version-libraries-description": "Opis",
+       "version-libraries-authors": "Autori",
+       "redirect": "Preusmjerenje na datoteku, korisnika, stranicu ili oznaku izmjene",
+       "redirect-legend": "Preusmjeri na datoteku ili stranicu",
+       "redirect-summary": "Ova posebna stranica preusmjerava na datoteku (datog imena), stranicu (date oznake izmjene) ili korisničku stranicu (datog numeričkog identifikatora korisnika). Oznake se koriste na sljedeći način: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] ili [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Idi",
+       "redirect-lookup": "Tip vrijednosti:",
        "redirect-value": "Vrijednost:",
        "redirect-user": "Korisnički ID",
        "redirect-page": "ID stranice",
        "tags-source-header": "Izvor",
        "tags-active-header": "Aktivna?",
        "tags-hitcount-header": "Označene izmjene",
+       "tags-actions-header": "Radnje",
        "tags-active-yes": "Da",
        "tags-active-no": "Ne",
        "tags-source-extension": "Definirano preko proširenja",
+       "tags-source-manual": "Ručno postavili korisnici ili botovi",
        "tags-source-none": "Više se ne koristi",
        "tags-edit": "uređivanje",
        "tags-delete": "izbriši",
        "tags-hitcount": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}",
        "tags-manage-no-permission": "Nemate pravo upravljati promjenama oznaka.",
        "tags-create-heading": "Napravi novu oznaku",
+       "tags-create-explanation": "Predoređeno je da će korisnici i botovi moći koristiti novonapravljene oznake.",
        "tags-create-tag-name": "Naziv oznake:",
        "tags-create-reason": "Razlog:",
        "tags-create-submit": "Napravi",
        "tags-create-no-name": "Morate navesti ime oznake.",
+       "tags-create-invalid-chars": "Nazivi oznaka ne smiju sadržavati zareze (<code>,</code>) ni kose crte (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Nazivi oznaka ne smiju sadržavati znakove koje se ne mogu koristiti u naslovima stranica.",
        "tags-create-already-exists": "Oznaka \"$1\" već postoji.",
+       "tags-create-warnings-above": "{{PLURAL:$2|Dogodila se sljedeća greška|Dogodile su se sljedeće greške}} pri stvaranju oznake \"$1\":",
+       "tags-create-warnings-below": "Želite li nastaviti stvaranje oznake?",
        "tags-delete-title": "Izbriši oznaku",
+       "tags-delete-explanation-initial": "Brišete oznaku \"$1\" iz baze podataka.",
+       "tags-delete-explanation-in-use": "Bit će obrisana sa {{PLURAL:$2|$2 verzije ili unosa u zapisniku|svih $2 verzija i/ili unosa u zapisniku}} na kojima se trenutno koristi.",
+       "tags-delete-explanation-warning": "Ova radnja se <strong>ne može povratiti</strong> te se <strong>ne može poništiti</strong>. Ovo ne mogu uraditi čak ni administratori baze podataka. Budite sigurni da je ovo oznaka koju želite obrisati.",
+       "tags-delete-explanation-active": "<strong>Oznaka \"$1\" je i dalje aktivna te će se nastaviti primjenjivati u budućnosti.</strong> Kako biste ovo spriječili, otiđite na mjesto (ili mjesta) na kojima je postavljeno da se oznaka postavlja, te je tamo isključite.",
        "tags-delete-reason": "Razlog:",
+       "tags-delete-submit": "Nepovratno obriši ovu oznaku",
+       "tags-delete-not-allowed": "Oznake koje su definirane proširenjem se ne mogu obrisati ukoliko to proširenje isključivo ne dopušta.",
        "tags-delete-not-found": "Oznaka \"$1\" ne postoji.",
+       "tags-delete-too-many-uses": "Oznaka \"$1\" je primjenjena na više od {{PLURAL:$2|revizija|revizijǎ}}, što znači da se ne može obrisati.",
+       "tags-delete-warnings-after-delete": "Oznaka \"$1\" uspješno je obrisana. Međutim, došlo je do {{PLURAL:$2|sljedećeg upozorenja|sljedećih upozorenja}}:",
+       "tags-activate-title": "Aktiviraj oznaku",
+       "tags-activate-question": "Aktivirate oznaku \"$1\".",
        "tags-activate-reason": "Razlog:",
+       "tags-activate-not-allowed": "Nije moguće aktivirati oznaku \"$1\".",
        "tags-activate-not-found": "Oznaka \"$1\" ne postoji.",
+       "tags-activate-submit": "Aktiviraj",
+       "tags-deactivate-title": "Deaktiviraj oznaku",
+       "tags-deactivate-question": "Deaktivirate oznaku \"$1\".",
+       "tags-deactivate-reason": "Razlog:",
+       "tags-deactivate-not-allowed": "Nije moguće deaktivirati oznaku \"$1\".",
+       "tags-deactivate-submit": "Deaktiviraj",
+       "tags-apply-no-permission": "Nemate dopuštenja da dodate izmjenske oznake zajedno s vašim promjenama.",
+       "tags-apply-not-allowed-one": "Oznaka \"$1\" se ne može ručno dodati.",
+       "tags-apply-not-allowed-multi": "{{PLURAL:$2|Sljedeća oznaka ne dozvoljava da se ručno doda|Sljedeće oznake ne dozvoljavaju da se ručno dodaju}}: $1",
+       "tags-update-no-permission": "Nemate dopuštenje da dodate ili uklonite izmjenske oznake sa zasebnih verzija ili zapisničkih unosa.",
+       "tags-update-add-not-allowed-one": "Oznaka \"$1\" se ne može ručno dodati.",
+       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Sljedeća oznaka ne dozvoljava da se ručno doda|Sljedeće oznake ne dozvoljavaju da se ručno dodaju}}: $1",
+       "tags-update-remove-not-allowed-one": "Oznaka \"$1\" se ne može ručno ukloniti.",
+       "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|Sljedeća oznaka ne dozvoljava da se ručno ukloni|Sljedeće oznake ne dozvoljavaju da se ručno uklone}}: $1",
+       "tags-edit-title": "Uredi oznake",
+       "tags-edit-manage-link": "Upravljaj oznakama",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Izabrana verzija|Izabrane verzije}} od [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Izabran unos zapisnika|Izabrani unosi zapisnika}}:",
+       "tags-edit-revision-legend": "Dodaj ili ukloni oznake sa {{PLURAL:$1|ove verzije|svih $1 verzija}}",
+       "tags-edit-logentry-legend": "Dodaj ili ukloni oznake sa {{PLURAL:$1|ove zapisničke stavke|svih $1 zapisničkih stavki}}",
+       "tags-edit-existing-tags": "Postojeće oznake:",
+       "tags-edit-existing-tags-none": "\"Nema\"",
+       "tags-edit-new-tags": "Nove oznake:",
+       "tags-edit-add": "Dodaj ove oznake:",
+       "tags-edit-remove": "Ukloni ove oznake:",
+       "tags-edit-remove-all-tags": "(ukloni sve oznake)",
+       "tags-edit-chosen-placeholder": "Izaberi neke oznake",
+       "tags-edit-chosen-no-results": "Odgovarajuće oznake nisu pronađene",
+       "tags-edit-reason": "Razlog:",
+       "tags-edit-revision-submit": "Primijeni izmjene {{PLURAL:$1|ovoj verziji|svim $1 verzijama}}",
+       "tags-edit-logentry-submit": "Primijeni izmjene {{PLURAL:$1|ovom zapisničkom unosu|svim $1 zapisničkim unosima}}",
+       "tags-edit-success": "Izmjene su uspješno primijenjene.",
+       "tags-edit-failure": "Nije bilo moguće primijeniti izmjene:\n$1",
+       "tags-edit-nooldid-title": "Neispravna odredišna verzija",
+       "tags-edit-nooldid-text": "Niste izabrali odredišnu verziju na koju treba primijeniti ovu funkciju, ili odredišna verzija na postoji.",
+       "tags-edit-none-selected": "Izaberite bar jednu oznaku koju treba dodati ili ukloniti.",
        "comparepages": "Usporedi stranice",
        "compare-page1": "Stranica 1",
        "compare-page2": "Stranica 2",
        "compare-revision-not-exists": "Izmjena koji ste naveli ne postoji.",
        "dberr-problems": "Žao nam je! Ova stranica ima određene tehničke poteškoće.",
        "dberr-again": "Pokušajte pričekati par minuta i zatim osvježiti.",
-       "dberr-info": "(ne može se spojiti server baze podataka: $1)",
+       "dberr-info": "(ne može se pristupiti bazi podataka: $1)",
+       "dberr-info-hidden": "(Ne mogu pristupiti bazi podataka)",
        "dberr-usegoogle": "U međuvremenu, možete pokušati pretraživanje putem Google.",
        "dberr-outofdate": "Zapamtite da njihovi indeksi našeg sadržaja ne moraju uvijek biti ažurni.",
        "dberr-cachederror": "Sljedeći tekst je keširana kopija zahtijevane stranice, koja možda nije potpuno ažurirana.",
        "htmlform-chosen-placeholder": "Izaberite opciju",
        "htmlform-cloner-create": "Dodaj još",
        "htmlform-cloner-delete": "Ukloni",
+       "htmlform-cloner-required": "Potrebna je barem jedna vrijednost.",
+       "htmlform-title-badnamespace": "[[:$1]] nije u imenskom prostoru \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "Stranica \"$1\" se ne može napraviti",
+       "htmlform-title-not-exists": "[[:$1]] ne postoji.",
+       "htmlform-user-not-exists": "<strong>$1</strong> ne postoji.",
+       "htmlform-user-not-valid": "<strong>$1</strong> nije ispravno korisničko ime.",
        "sqlite-has-fts": "$1 sa podrškom pretrage cijelog teksta",
        "sqlite-no-fts": "$1 bez podrške pretrage cijelog teksta",
        "logentry-delete-delete": "$1 {{GENDER:$2|obrisao|obrisala}} je stranicu $3",
        "revdelete-restricted": "primijenjena ograničenja za administratore",
        "revdelete-unrestricted": "uklonjena ograničenja za administratore",
        "logentry-block-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} sa vremenom isticanja blokade od $5 $6",
+       "logentry-block-unblock": "$1 {{GENDER:$2|deblokirao|deblokirala}} je {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "$1 {{GENDER:$2|promijenio|promijenila}} je postavke za blokiranje {{GENDER:$4|korisnika|korisnice}} {{GENDER:$4|$3}} u trajanju od $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} sa vremenom isticanja blokade od $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|promijenio|promijenila}} je postavke za blokiranje {{GENDER:$4|korisnika|korisnice}} {{GENDER:$4|$3}} u trajanju od $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|uvezao|uvezla}} je $3 postavljanjem datoteke",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|uvezao|uvezla}} je $3 s drugog wikija",
+       "logentry-merge-merge": "$1 {{GENDER:$2|spojio|spojila}} je $3 u $4 (sve do izmjene $5)",
        "logentry-move-move": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4 bez ostavljanja preusmjerenja",
        "logentry-move-move_redir": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4 preko preusmjeravanja",
        "logentry-rights-autopromote": "$1 {{GENDER:$1|je automatski promijenjeno članstvo|su automatski promijenjena članstva}} iz $4 u $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|postavio|postavila}} je $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|postavio|postavila}} је novu verziju $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|postavio|postavila}} је $3",
        "log-name-managetags": "Zapisnik upravljanja oznaka",
+       "log-description-managetags": "Ovaj zapisnik sadrži spisak izmjena u vezi [[Special:Tags|oznaka]]. Zapisnik sadrži samo radnje izvršene od strane administratora; unosi za oznake napravljene ili obrisane od strane wiki softvera se ne nalaze u ovom zapisniku.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|napravio|napravila}} je oznaku \"$4\"",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|obrisao|obrisala}} je oznaku \"$4\" (uklonjena je iz $5 {{PLURAL:$5|izmjene ili zapisnika|izmjena i/ili zapisnikǎ}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|aktivirao|aktivirala}} je oznaku \"$4\" za upotrebu od strane korisnika i botova",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|deaktivirao|deaktivirala}} je oznaku \"$4\" za upotrebu od strane korisnika i botova",
        "log-name-tag": "Zapisnik oznaka",
+       "log-description-tag": "Ova stranica prikazaju kad su korisnici dodali ili ukonili [[Special:Tags|oznake]] s pojedinih verzija ili zapisničkih unosa. Zapisnik ne prikazuje označavačke radnje ako su se dogodile prilikom uređivanja, brisanja ili slične radnje.",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|dodao|dodala}} je {{PLURAL:$7|oznaku|oznaka}} $6 verziji $4 stranice $3",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|dodao|dodala}} je {{PLURAL:$7|oznaku|oznaka}} $6 verziji $5 zapisničkog unosa $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|uklonio|uklonila}} je {{PLURAL:$9|oznaku|oznake}} $8 sa verzije $4 stranice $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|uklonio|uklonila}} je {{PLURAL:$9|oznaku|oznake}} $8 sa zapisničkog unosa $5 stranice $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|ažurirao|ažurirala}} je oznake na verziji $4 strane $3 ({{PLURAL:$7|dodano}} $6; {{PLURAL:$9|uklonjeno}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|ažurirao|ažurirala}} je oznake na zapisničkom unosu $5 strane $3 ({{PLURAL:$7|dodano}} $6; {{PLURAL:$9|uklonjeno}} $8)",
        "rightsnone": "(nema)",
        "revdelete-summary": "sažetak",
        "feedback-adding": "Dodajem povratne informacije na stranicu...",
        "feedback-bugornote": "Ako ste spremni detaljno opisati tehnički problem, molimo [$1 prijavite \"bug\" (grešku)].\nInače, možete ispuniti jednostavan obrazac ispod. Vaš komentar bit će dodan na stranicu \"[$3 $2]\" zajedno s Vašim korisničkim imenom.",
        "feedback-cancel": "Odustani",
        "feedback-close": "Završeno",
+       "feedback-external-bug-report-button": "Podnesi tehnički zadatak",
        "feedback-dialog-title": "Pošalji povratne informacije",
+       "feedback-dialog-intro": "Možete koristiti jednostavni formular ispod kako biste poslali povratne informacije. Vaš komentar će biti dodan stranici \"$1\" zajedno s vašim korisničkim imenom.",
        "feedback-error-title": "Greška",
        "feedback-error1": "Greška: Neprepoznati rezultat od API",
        "feedback-error2": "Greška: Uređivanje nije uspjelo",
        "feedback-error3": "Greška: Nema odgovora od API",
+       "feedback-error4": "Greška: Ne može se postaviti na dati naslov",
        "feedback-message": "Poruka:",
        "feedback-subject": "Tema:",
        "feedback-submit": "Pošalji",
+       "feedback-terms": "Shvatam da moje korisničko agentske informacije sadrže tačne informacije o pregledniku i verziji operativnog sistema i da će javno biti podijeljene zajedno s mojim povratnim informacijama.",
+       "feedback-termsofuse": "Slažem se da ću pružati povratne informacije u skladu s Uslovima korištenja.",
        "feedback-thanks": "Hvala! Vaša povratna informacija postavljena je na stranicu \"[$2 $1]\".",
        "feedback-thanks-title": "Hvala!",
+       "feedback-useragent": "Korisnički agent:",
        "searchsuggest-search": "Traži",
        "searchsuggest-containing": "sadrži...",
        "api-error-badaccess-groups": "Nemate ovlasti da postavljate datoteke na ovoj wiki.",
        "api-error-overwrite": "Pisanje preko postojeće datoteke nije dopušteno.",
        "api-error-stashfailed": "Unutrašnja greška: server nije mogao da spremi privremenu datoteku.",
        "api-error-publishfailed": "Unutrašnja greška: Server nije uspio objaviti privremenu datoteku.",
+       "api-error-stasherror": "Dogodila se greška pri postavljaju datoteke u skladište.",
+       "api-error-stashedfilenotfound": "Skladištena datoteka nije pronađena pri pokušaju postavljanja iste iz skladišta.",
+       "api-error-stashpathinvalid": "Putanja na kojoj je trebala biti skladištena datoteka je neispravna.",
+       "api-error-stashfilestorage": "Dogodila se greška pri postavljaju datoteke u skladište.",
+       "api-error-stashzerolength": "Server nije mogao skladištiti datoteku jer joj je veličina iznosila 0.",
+       "api-error-stashnotloggedin": "Morate biti prijavljeni kako biste sačuvali datoteke u skladište postavljanja.",
+       "api-error-stashwrongowner": "Datoteka kojoj ste pokušali pristupiti u skladištu ne pripada vama.",
+       "api-error-stashnosuchfilekey": "Datotečni ključ kome ste pokušali pristupiti u skladištu ne pripada vama.",
        "api-error-timeout": "Server nije odgovorio unutar očekivanog vremena.",
        "api-error-unclassified": "Desila se nepoznata greška",
        "api-error-unknown-code": "Nepoznata greška: \"$1\"",
        "duration-centuries": "$1 {{PLURAL:$1|vijek|vijeka|vijekova}}",
        "duration-millennia": "$1 {{PLURAL:$1|milenij|milenija}}",
        "rotate-comment": "Slika rotirana za $1 {{PLURAL:$1|stepen|stepeni}} u smjeru kazaljke na satu",
+       "limitreport-title": "Podaci profiliranja analizatora:",
        "limitreport-cputime": "Vrijeme korištenja CPU",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|sekunda|sekunde|sekundi}}",
        "limitreport-walltime": "Korištenje u realnom vremenu",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|sekunda|sekunde|sekundi}}",
+       "limitreport-ppvisitednodes": "Broj predprocesiranih posjećenih nodova",
+       "limitreport-ppgeneratednodes": "Broj predprocesiranih generiranih nodova",
+       "limitreport-postexpandincludesize": "Nakon proširenja navedi i veličinu",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
+       "limitreport-templateargumentsize": "Veličina stavke šablona",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
+       "limitreport-expansiondepth": "Najveća dubina proširenja",
+       "limitreport-expensivefunctioncount": "Broj funkcije ekspenzivnog analizatora",
        "expandtemplates": "Proširi šablone",
        "expand_templates_intro": "Ova posebna stranica uzima neki tekst i proširuje sve šablone u njemu rekurzivno.\nOna također proširuje parserske funkcije poput\n<code><nowiki>{{</nowiki>#language:…}}</code> i varijable poput\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>. U principu proširuje gotovo sve između dvostrukih zagrada.",
        "expand_templates_title": "Naslov konteksta, za {{FULLPAGENAME}} itd.:",
        "expand_templates_input": "Tekst unosa:",
        "expand_templates_output": "Rezultat",
        "expand_templates_xml_output": "XML izlaz",
+       "expand_templates_html_output": "Sirov HTML prikaz",
        "expand_templates_ok": "U redu",
        "expand_templates_remove_comments": "Ukloni komentare",
        "expand_templates_remove_nowiki": "Onemogući oznake <nowiki> u rezultatima",
        "expand_templates_generate_xml": "Prikaži XML stablo parsera",
        "expand_templates_generate_rawhtml": "Pokaži izvorni HTML",
        "expand_templates_preview": "Pregled",
+       "expand_templates_preview_fail_html": "<em>Pošto stranica {{SITENAME}} ima uključen sirov HTML prikaz, te je bilo gubitka u podacima sesije, pregled je sakriven kao mjera predostrožnosti protiv JavaScript napada.</em>\n\n<strong>Ako je ovo ispravan pokušaj pretpregleda, molim da ponovo pokušate.</strong>\nAko i dalje ne bude radilo, pokušajte se [[Special:UserLogout|odjaviti]], pa ponovo prijaviti.",
+       "expand_templates_preview_fail_html_anon": "<em>Pošto stranica {{SITENAME}} ima uključen sirov HTML prikaz, a vi se niste prijavili, pregled je sakriven kao mjera predostrožnosti protiv JavaScript napada.</em>\n\n<strong>Ako je ovo ispravan pokušaj pretpregleda, molim da se [[Special:UserLogin|prijavite]] i pokušate ponovo.</strong>",
+       "pagelanguage": "Odabir jezika stranice",
        "pagelang-name": "Stranica",
        "pagelang-language": "Jezik",
        "pagelang-use-default": "Koristi podrazumijevani jezik",
        "pagelang-select-lang": "Izaberi jezik",
+       "right-pagelang": "promjena jezika stranice",
+       "action-pagelang": "promijenite jezik stranice",
        "log-name-pagelang": "Zapisnik promjene jezika",
+       "log-description-pagelang": "Ovo je zapisnik promjena jezika stranica.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|promijenio|promijenila}} je jezik stranice $3 iz $4 u $5.",
+       "default-skin-not-found": "Ups! Nije dostupna predodređena tema vašeg wikija, koja je definirana u <code dir=\"ltr\">$wgDefaultSkin</code> kao <code>$1</code>.\n\nVaša instalacija sadrži {{PLURAL:$4|sljedeću temu|sljedeće teme}}. Pogledajte [https://www.mediawiki.org/wiki/Manual:Skin_configuration Priručnik: Podešavanje tema] za više informacija o tome kako {{PLURAL:$4|je uključiti|ih uključiti i izabrati predodređenu}}.\n\n$2\n\n; Ako ste upravo instalirali MediaWiki:\n: Vjerovatno ste je instalirali sa gita ili sa izvornog koda koristeći se nekom drugom metodom. Ovo je za očekivati. Pokušajte instalirati neku temu sa [https://www.mediawiki.org/wiki/Category:All_skins kataloga tema] tako što ćete:\n:* Preuzeti [https://www.mediawiki.org/wiki/Download tarball instalacijsku datoteku] koji sadrži nekoliko tema i proširenja. Možete prekopirati folder <code>skins/</code> iz nje.\n:* Preuzeti zasebne instalacijske tarball datoteke sa stranice [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]. \n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Koristiti Git kako biste preuzeli teme].\n: Ako ste MediaWiki razvijatelj, ovo ne bi trebalo utjecati na vaše git skladište.\n\n; Ako ste upravo nadogradili MediaWiki:\n: MediaWiki 1.24 i više verzije više ne automatski uključuju instalirane teme (pogledajte [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Priručni: Automatski traženje tema]). Možete prekopirati {{PLURAL:$5|sljedeći red kǒda|sljedeće redove kǒda}} u datoteku <code>LocalSettings.php</code> kako biste uključili {{PLURAL:$5|odgovarajuću instaliranu temu|sve instalirane teme}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Ako ste upravo promijenili datoteku <code>LocalSettings.php</code>:\n: Provjerite jeste li napravili grešku pri unosu naziva tema.",
+       "default-skin-not-found-no-skins": "Ups! Nije dostupna predodređena tema vašeg wikija, koja je definirana u <code dir=\"ltr\">$wgDefaultSkin</code> kao <code>$1</code>.\n\nNemate instaliranih tema.\n\n; Ako ste upravo nadogradili MediaWiki:\n: Vjerovatno ste je instalirali sa gita ili sa izvornog koda koristeći se nekom drugom metodom. Ovo je za očekivati. MediaWiki 1.24 i više ne sadržavaju teme u glavnom skladištu. Pokušajte instalirati neku temu sa [https://www.mediawiki.org/wiki/Category:All_skins kataloga tema] tako što ćete:\n:* Preuzeti [https://www.mediawiki.org/wiki/Download tarball instalacijsku datoteku] koji sadrži nekoliko tema i proširenja. Možete prekopirati folder <code>skins/</code> iz nje.\n:* Preuzeti zasebne instalacijske tarball datoteke sa stranice [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]. \n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Koristiti Git kako biste preuzeli teme].\n: Ako ste MediaWiki razvijatelj, ovo ne bi trebalo utjecati na vaše git skladište.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (uključena)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (isključena)",
+       "mediastatistics": "Statistika datoteka",
+       "mediastatistics-summary": "Statistike o tipovima poslanih datoteka. Ovdje su uračunate samo najnovije verzije datoteka. Stare ili obrisane verzije nisu uračunate.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 bajt|$1 bajt|$1 bajtova}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME tip",
+       "mediastatistics-table-extensions": "Moguća proširenja",
        "mediastatistics-table-count": "Broj datoteka",
        "mediastatistics-table-totalbytes": "Kombinirana veličina",
        "mediastatistics-header-unknown": "Nepoznato",
+       "mediastatistics-header-bitmap": "Bitmap slike",
        "mediastatistics-header-drawing": "Crteži (vektorske slike)",
        "mediastatistics-header-audio": "Zvuk",
        "mediastatistics-header-video": "Videa",
        "mediastatistics-header-text": "Tekstualno",
        "mediastatistics-header-executable": "Izvršni",
        "mediastatistics-header-archive": "Kompresovani formati",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|prateća tačka uklonjena je|pratećih tački uklonjeno je}} iz JSON-a",
+       "json-error-unknown": "Dogodio se problem s JSON-om. Greška: $1",
+       "json-error-depth": "Prekoračena je maksimalna dubina",
+       "json-error-state-mismatch": "Nevažeći ili pokvareni JSON",
+       "json-error-ctrl-char": "Greška kontrolnog simbola, moguće je da je neispravno enkodiran",
        "json-error-syntax": "Sintaksna greška",
+       "json-error-utf8": "Pokvareni UTF-8 znaci, moguće je da su neispravno enkodirani",
+       "json-error-recursion": "Jedna ili više rekurzivnih referenci u iznosu koga treba enkodirati",
+       "json-error-inf-or-nan": "Jedna ili više NAN ili INF vrijednosti u iznosu koga treba enkodirati",
+       "json-error-unsupported-type": "Data je vrijednost vrste koja se ne može enkodirati",
+       "headline-anchor-title": "Veza do ovog odjeljka",
        "special-characters-group-latin": "Latinica",
        "special-characters-group-latinextended": "Prošireni latinski",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-greek": "Grčki",
        "special-characters-group-cyrillic": "Ćirilica",
        "special-characters-group-arabic": "Arapski",
+       "special-characters-group-arabicextended": "Prošireni arapski",
        "special-characters-group-persian": "Perzijski",
        "special-characters-group-hebrew": "Hebrejski",
        "special-characters-group-bangla": "Bangladeški",
+       "special-characters-group-tamil": "Tamilski",
        "special-characters-group-telugu": "Telugu",
        "special-characters-group-sinhala": "Sinhala",
        "special-characters-group-gujarati": "Gujarati",
+       "special-characters-group-devanagari": "Devanagari",
        "special-characters-group-thai": "Tajlandski",
        "special-characters-group-lao": "Laoški",
-       "special-characters-group-khmer": "Kmerski"
+       "special-characters-group-khmer": "Kmerski",
+       "special-characters-title-endash": "crtica",
+       "special-characters-title-emdash": "duga crta",
+       "special-characters-title-minus": "minus",
+       "mw-widgets-titleinput-description-new-page": "stranica još ne postoji",
+       "mw-widgets-titleinput-description-redirect": "preusmjerava na $1"
 }
index bb14cfc..511d8af 100644 (file)
@@ -48,7 +48,8 @@
                        "Macofe",
                        "Gerardduenas",
                        "Medol",
-                       "Xavier Dengra"
+                       "Xavier Dengra",
+                       "Pginer"
                ]
        },
        "tog-underline": "Subratlla els enllaços:",
        "badtitletext": "El títol de la pàgina que heu introduït no és correcte, és en blanc o conté un enllaç trencat amb un altre projecte. També podria contenir algun caràcter no acceptat als títols de pàgina.",
        "title-invalid-empty": "El títol de la pàgina sol·licitada és buit o només conté el nom d’un espai de noms.",
        "title-invalid-utf8": "El títol de la pàgina sol·licitada conté una seqüència UTF-8 no vàlida.",
-       "title-invalid-interwiki": "El títol conté un enllaç interwiki",
+       "title-invalid-interwiki": "El títol de la pàgina sol·licitada conté un enllaç interwiki que no pot ser utilitzat en títols.",
        "title-invalid-talk-namespace": "El títol de la pàgina sol·licitada fa referència a una pàgina de discussió impossible.",
        "title-invalid-characters": "El títol de la pàgina sol·licitada conté caràcters no vàlids: «$1».",
        "title-invalid-relative": "El títol conté un camí relatiu. Els títols relatius (./, ../) no són vàlids perquè els navegadors web sovint no poden arribar-hi.",
        "yourdiff": "Diferències",
        "copyrightwarning": "Si us plau, tingueu en compte que totes les contribucions per al projecte {{SITENAME}} es consideren com a publicades sota els termes de la llicència $2 (vegeu-ne més detalls a $1). Si no desitgeu la modificació i distribució lliure dels vostres escrits sense el vostre consentiment, no els poseu ací.<br />\nA més a més, en enviar el vostre text, doneu fe que és vostra l'autoria, o bé de fonts en el domini públic o recursos lliures similars. Heu de saber que aquest '''no''' és el cas de la majoria de pàgines que hi ha a Internet.\n'''No feu servir textos amb drets d'autor sense permís!'''",
        "copyrightwarning2": "Si us plau, tingueu en compte que totes les contribucions al projecte {{SITENAME}} poden ser corregides, alterades o esborrades per altres usuaris. Si no desitgeu la modificació i distribució lliure dels vostres escrits sense el vostre consentiment, no els poseu ací.<br />\nA més a més, en enviar el vostre text, doneu fe que és vostra l'autoria, o bé de fonts en el domini públic o altres recursos lliures similars (consulteu $1 per a més detalls).\n'''No feu servir textos amb drets d'autor sense permís!'''",
+       "editpage-cannot-use-custom-model": "El model de contingut d'aquesta pàgina no pot ser canviat.",
        "longpageerror": "'''Error: El text que heu introduït és {{PLURAL:$1|d'un kilobyte|de $1 kilobytes}} i sobrepassa el màxim permès de {{PLURAL:$2|one kilobyte|$2 kilobytes}}.'''\nNo es pot desar.",
        "readonlywarning": "'''Avís: La base de dades està tancada per manteniment, de manera que no podreu desar els canvis ara mateix.'''\nÉs possible que vulgueu copiar i enganxar el text en un arxiu de text i desar-ho més tard.\n\nL'administrador que l'ha bloquejada ha donat la següent explicació: $1",
        "protectedpagewarning": "'''ATENCIÓ: Aquesta pàgina està bloquejada i només els usuaris amb drets d'administrador la poden modificar.\nA continuació es mostra la darrera entrada del registre com a referència:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objecte buit",
        "content-json-empty-array": "Matriu buida",
+       "duplicate-args-warning": "<strong>Avís:</strong> [[:$1]] crida [[:$2]] amb més d'un valor pel paràmetre «$3». Només s'utilitzarà el darrer valor proporcionat.",
        "duplicate-args-category": "Pàgines amb arguments duplicats en utilització de plantilles",
        "duplicate-args-category-desc": "La pàgina conté crides a plantilles que fan servir duplicats d'arguments, com ara <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Atenció: Aquesta pàgina conté massa crides a funcions parserfunction complexes.\n\nActualment n'hi ha {{PLURAL:$1|$1|$1}} i, com a molt, {{PLURAL:$2|hauria|haurien}} de ser $2.",
        "badsig": "La signatura que heu inserit no és vàlida; verifiqueu les etiquetes HTML que heu emprat.",
        "badsiglength": "La signatura és massa llarga.\nHa de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.",
        "yourgender": "Sexe:",
-       "gender-unknown": "No especificat",
+       "gender-unknown": "En esmentar-vos, el software utilitzarà paraules de gènere neutre, sempre que sigui possible",
        "gender-male": "Masculí",
        "gender-female": "Femení",
        "prefs-help-gender": "Opcional: s'usa perquè el programari se us adreci amb missatges amb el gènere adient. Aquesta informació serà pública.",
        "userrights-lookup-user": "Gestiona els grups d'usuari",
        "userrights-user-editname": "Introduïu un nom d'usuari:",
        "editusergroup": "Edita els grups d'usuaris",
-       "editinguser": "Modificació dels permisos de {{GENDER:$1|l’usuari|la usuària}} '''[[User:$1|$1]]''' $2",
+       "editinguser": "Modificació dels permisos de {{GENDER:$1|l'usuari|la usuària}} <strong>[[User:$1|$1]]</strong>$2",
        "userrights-editusergroup": "Edita els grups d'usuaris",
        "saveusergroups": "Desa els grups d'usuari",
        "userrights-groupsmember": "Membre de:",
        "uploaddisabledtext": "S'ha inhabilitat la càrrega de fitxers.",
        "php-uploaddisabledtext": "La càrrega de fitxer està desactivada al PHP. Comproveu les opcions del fitxer file_uploads.",
        "uploadscripted": "Aquest fitxer conté codi HTML o de seqüències que pot ser interpretat equivocadament per un navegador.",
+       "upload-scripted-pi-callback": "No es poden carregar arxius que continguin instruccions de processament de pàgines d'estil XML",
        "uploadscriptednamespace": "Aquest fitxer SVG conté un espai de noms \"$1\" no autoritzat",
        "uploadinvalidxml": "No s'ha pogut analitzar l'XML del fitxer carregat.",
        "uploadvirus": "El fitxer conté un virus! Detalls: $1",
        "linksearch-pat": "Patró de cerca:",
        "linksearch-ns": "Espai de noms:",
        "linksearch-ok": "Cerca",
-       "linksearch-text": "Es poden utilitzar caràcters comodí com \"*.wikipedia.org\".\nEs necessita com a mínim un domini de primer nivell, per exemple \"*.org\".<br />\n{{PLURAL:$2|Protocol admès|Protocols admesos}}: <code>$1</code> (http:// per defecte si no se n'especifica cap).",
+       "linksearch-text": "Es poden utilitzar caràcters comodí com \"*.wikipedia.org\".\nEs necessita com a mínim un domini de primer nivell, per exemple \"*.org\".<br />\n{{PLURAL:$2|Protocol admès|Protocols admesos}}: $1 (http:// per defecte si no se n'especifica cap).",
        "linksearch-line": "$1 enllaçat a $2",
        "linksearch-error": "Els caràcters comodí només poden aparèixer a l'inici de l'url.",
        "listusersfrom": "Mostra usuaris començant per:",
        "rollback-success": "Edicions revertides de $1; s'ha canviat a la darrera versió de $2.",
        "sessionfailure-title": "Error de sessió",
        "sessionfailure": "S'ha produït un error amb la vostra sessió. S'ha anul·lat aquesta acció en prevenció de pirateig de sessió. Premeu «Torna», recarregueu la pàgina des d'on veniu i torneu-ho a intentar.",
+       "changecontentmodel-title-label": "Títol de la pàgina",
+       "changecontentmodel-model-label": "Nou model de contingut",
+       "changecontentmodel-reason-label": "Motiu:",
+       "logentry-contentmodel-change-revertlink": "reverteix",
+       "logentry-contentmodel-change-revert": "reverteix",
        "protectlogpage": "Registre de protecció",
        "protectlogtext": "A continuació es mostra un registre amb els canvis de protecció de pàgines.\nVegeu la [[Special:ProtectedPages|llista de pàgines protegides]] per a la llista de les pàgines que actualment tenen alguna protecció.",
        "protectedarticle": "ha protegit «[[$1]]»",
        "tooltip-pt-logout": "Finalitza la sessió d'usuari",
        "tooltip-pt-createaccount": "Us animem a què creeu un compte i inicieu sessió, encara que no és obligatori",
        "tooltip-ca-talk": "Discussió sobre el contingut d'aquesta pàgina",
-       "tooltip-ca-edit": "Podeu modificar aquesta pàgina. Si us plau, previsualitzeu-la abans de desar-la",
+       "tooltip-ca-edit": "Modifica aquesta pàgina",
        "tooltip-ca-addsection": "Comença una nova secció",
        "tooltip-ca-viewsource": "Aquesta pàgina està protegida.\nPodeu veure'n el codi font.",
        "tooltip-ca-history": "Versions antigues d'aquesta pàgina",
        "pageinfo-robot-index": "Permès",
        "pageinfo-robot-noindex": "No permès",
        "pageinfo-watchers": "Número d'usuaris que vigilen la pàgina",
+       "pageinfo-visiting-watchers": "Nombre de vigilants de la pàgina que han visitat els canvis recents",
        "pageinfo-few-watchers": "Menys de $1 {{PLURAL:$1|observador|observadors}}",
        "pageinfo-redirects-name": "Nombre de redireccions a aquesta pàgina",
        "pageinfo-redirects-value": "$1",
        "htmlform-cloner-create": "Afegeix més",
        "htmlform-cloner-delete": "Suprimeix",
        "htmlform-cloner-required": "Cal com a mínim un valor.",
+       "htmlform-title-badnamespace": "[[:$1]] no es troba en l'espai de noms \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "\"$1\" és un títol de pàgina no editable",
+       "htmlform-title-not-exists": "[[:$1]] no existeix.",
        "sqlite-has-fts": "$1, amb suport de búsqueda de text íntegre",
        "sqlite-no-fts": "$1, sense supor de búsqueda de text íntegre",
        "logentry-delete-delete": "$1 {{GENDER:$2|ha esborrat}} la pàgina $3",
index b7c7ca6..e35509e 100644 (file)
        "gotaccount": "已經有賬戶了?'''$1'''。",
        "gotaccountlink": "躒入",
        "userlogin-resetlink": "躒入其資料𣍐記去是伓是?",
-       "userlogin-resetpassword-link": "å¯\86ç \81𣍐記?",
+       "userlogin-resetpassword-link": "å¯\86碼𣍐記?",
        "userlogin-helplink2": "對手汝躒入",
        "userlogin-loggedin": "汝已經使$1躒入過了。\n儷是卜想挈其他用戶來躒入,起動汝使下底其表格來躒入。",
        "userlogin-createanother": "新建另外蜀萆賬號",
        "resetpass-temp-password": "臨時密碼:",
        "passwordreset": "重置密碼",
        "passwordreset-text-one": "完成茲隻表單,通過電批寄臨時密碼其方法來重新設定汝其密碼。",
-       "passwordreset-legend": "重置密碼",
        "passwordreset-username": "用戶名:",
        "passwordreset-domain": "域名:",
        "passwordreset-email": "電批地址:",
        "deletedcontributions-title": "乞刪唻其用戶貢獻",
        "linksearch-ok": "尋討",
        "linksearch-line": "$1是趁$2𡅏鏈接過其",
-       "emailuser": "寄電子郵件乞茲隻用戶",
+       "emailuser": "寄電乞茲隻用戶",
        "emailpage": "寄電子郵件乞用戶",
        "defemailsubject": "{{SITENAME}}其用戶「$1」寄來其批",
        "noemailtitle": "無電批地址",
        "invert": "反選",
        "blanknamespace": "(主要)",
        "contributions": "{{GENDER:$1|User}}用戶貢獻",
-       "contributions-title": "ç\94¨æ\88¶å°\8d$1å\85¶è²¢ç\8d»",
+       "contributions-title": "$1å\85¶ç\94¨æ\88¶è²¢ç\8d»",
        "mycontris": "我其貢獻",
        "uctop": "(當前)",
        "month": "趁月(共更早):",
index 37bf386..0759943 100644 (file)
@@ -15,7 +15,7 @@
        "tog-hideminor": "Къайладаха кигийра нисдарш оц могӀама керла хийцамехь",
        "tog-hidepatrolled": "Къайладаха гӀаролладина нисдарш оц могӀама керла нисдаршкахь",
        "tog-newpageshidepatrolled": "Къайлаяха гӀароллайина агӀонаш оьцу могӀама керла агӀонашкахь",
-       "tog-extendwatchlist": "Шорбина тӀехьажарна могӀам, ша беригге а хийцамаш чубогӀуш, тӀехьаббина боцурш а",
+       "tog-extendwatchlist": "Шорбина тӀехьажарна могӀам, ша беригге а, хийцамаш чубогӀуш, тӀехьаббина боцурш а",
        "tog-usenewrc": "Лелабе дика могӀам керла чу хийцамашна (оьшу JavaScript)",
        "tog-numberheadings": "Ша шех хlитто терахь корташна",
        "tog-showtoolbar": "Гайта лакхара гӀирсийн панель тадарш дечу хенахь",
        "undeletethispage": "ХӀара агӀо меттахӀоттор",
        "undelete_short": "МеттахӀоттайé $1 {{PLURAL:$1|нисйинарг|нисйинарш}}",
        "viewdeleted_short": "{{PLURAL:$1|$1 ДӀадаьккхина нийсдаре|$1 ДӀадаьхна нийсдарше}} хьажар",
-       "protect": "Ð\93lаÑ\80олла Ð´Ã©",
+       "protect": "Ð\9bаÑ\80Ñ\8aÑ\8fÑ\80",
        "protect_change": "хийца",
-       "protectthispage": "Ð\93lаÑ\80олла Ð´Ã© Ñ\85lокÑ\85Ñ\83 Ð°Ð³lон",
+       "protectthispage": "Ð\9bаÑ\80Ñ\8aе Ñ\85Ó\80аÑ\80а Ð°Ð³Ó\80о",
        "unprotect": "ГӀароллех къаста",
        "unprotectthispage": "ГӀароллех къаста",
        "newpage": "Керла агӀо",
        "laggedslavemode": "Тергам бе: агӀона чохь керла йаьхинарш ца хила мега.",
        "readonly": "Блоктоьхна дӀайаздар хаамийн бухе",
        "enterlockreason": "Билгалде блоктохаран бахьана а, и чекх йолу хан а.",
-       "readonlytext": "АгӀонаш тӀетохар а кхин хийцамаш барна а блоктоьхна:\nБлокоьхначо биттина хаам: $1.",
+       "readonlytext": "АгӀонаш тӀетохар а, кхин хийцамаш барна а блоктоьхна:\nБлокоьхначо биттина хаам: $1.",
        "missing-article": "ХӀокху чохь кароезаш йолу хьан дехарца йозан агӀонаш цакарийна «$1» $2.\n\nИштнарг наггахь хуьлу хьажорг дӀаяьккхина елахь я хийцам бина тиша хьажоргца дехьа гӀо гӀоьртича.\n\nНагахьсан гӀулкх цуьнах доьзна дацахь, хьуна карийна гӀирс латточехь гӀалат.\nДехар до, хаам бе оцуьнах [[Special:ListUsers/sysop|куьйгалхога]], гойтуш URL.",
        "missingarticle-rev": "(верси № $1)",
        "missingarticle-diff": "(башхалла: $1, $2)",
        "actionthrottledtext": "Спам цахилийта хӀара дешдерг кӀезиг хенахь дукху ца дайта дихкина ду. Дехар до массийта минот яьлча гӀорта.",
        "protectedpagetext": "ХӀара агӀо дӀакъоьвлина ю тадарш ца дайта.",
        "viewsourcetext": "Хьоьга далундерг хьажар а дезахь хlокху агlон чура йоза хьаэцар:",
-       "viewyourtext": "Хьан йиш ю '''хьой нисдинчу''' дӀадолалун йозе хьажа а цуна копи ян а:",
+       "viewyourtext": "Хьан йиш ю '''хьой нисдинчу''' дӀадолалун йозе хьажа а, цуна копи ян а:",
        "protectedinterface": "ХӀокху агӀона чохь интерфейсан программа латторан хаам бу. Зулам ца дайта цуна хийцам бан куьйгалхошна бен цало.\nХӀокху хааман гоч тӀетоха я хийца лелае локализацин сайт MediaWiki [//translatewiki.net/ translatewiki.net]",
        "editinginterface": "<strong>Тергам бе:</strong> Ахьа таеш ю интерфейсан йоза долу агӀо программин латторан.\nЦуна бина хийцам хьокху Википедин кхечу декъашхошна гур бу.",
        "translateinterface": "ХӀокху хааман гоч тӀетоха я хийца дехар до лелае локализацин сайт MediaWiki [//translatewiki.net/ translatewiki.net].",
-       "cascadeprotected": "Ð\90гÓ\80о Ñ\85ийÑ\86ам Ñ\86а Ð±Ð°Ð¹Ñ\82а Ð³Ó\80оÑ\80алла Ð´ина ю {{PLURAL:$1|хӀокху агӀона|хӀокху агӀонийн}} юкъа йогӀуш хилар бахьнехь:\n$2",
+       "cascadeprotected": "Ð\90гÓ\80о Ñ\85ийÑ\86ам Ñ\86а Ð±Ð°Ð¹Ñ\82а Ð»Ð°Ñ\80йина ю {{PLURAL:$1|хӀокху агӀона|хӀокху агӀонийн}} юкъа йогӀуш хилар бахьнехь:\n$2",
        "namespaceprotected": "ХӀан бакъо яц анна цӀерш чохь тадарш да «$1».",
        "customcssprotected": "Хьан бакъо яц хӀара CSS-агӀо тая, иза кхечу декъашхочун гӀерс болу дера.",
        "customjsprotected": "Хьан бакъо яц хӀара JavaScript-агӀо тая, иза кхечу декъашхочун гӀерс болу дера.",
        "wrongpasswordempty": "Дехар до, язъе еса йоцу пароль.",
        "passwordtooshort": "Пароль хилла еза $1 {{PLURAL:$1|символ|символаш}} йолуш.",
        "password-name-match": "Язъен пароль декъашхочун дӀаяздарал башха хила еза.",
-       "password-login-forbidden": "Иштта декъашхочун цӀе а пароль а лелаян цамаго.",
+       "password-login-forbidden": "Иштта декъашхочун цӀе а, пароль а лелаян цамаго.",
        "mailmypassword": "Пароль кхоссар",
        "passwordremindertitle": "Декъашхочун {{grammar:genitive|{{SITENAME}}}}  пароль дагайаийтар",
        "passwordremindertext": "Цхьам (ахь хила мега IP-адрес $1 тӀера) керла пароль кхоллар дехна {{grammar:genitive|{{SITENAME}}}} ($4) чохь. Декъашхочун $2\nкхоьллина керла хана пароль: $3. Иза дехар ахь динехь,\nсистемин чугӀой хийца пароль.\nХьан керла пароль белх беш хира ю $5 {{PLURAL:$5|дийнахь}}.\n\nХьой дехар дийна дацахь хӀума маде Ӏад бита хӀара хаам.",
        "yourdiff": "Башхаллаш",
        "copyrightwarning": "Тергаме хьажа, массо яззаман чутухуш долу йозан хийцам хьажарехь бу, арахоьцушсанна оцу лицензи хьоляхь $2 (хьаж. $1).\nНагахь хьо лууш вацахь хьай йозанаш маьрша даржа а кхечаьрга хийцам байта, мадаха уьш кху чу.<br />\nИшта чӀагӀо йой ахьа, айхьа далош долучуьн хьо куьг да ву аьлла, я хьаэцна цхьан\nхьостера, хийцам ба а дӀаса даржада а чулацам болуш.<br />\n'''МАТОХИЙШ БАКЪО ЙОЦУ ГӀИРСАШ КХУ ЧУ, КУЬГ ДЕ БАКЪО ЛАР ЙЕШ ЙОЛУ!'''",
        "readonlywarning": "'''ДӀАХЬЕДО. ГӀирса бух блоктоьхна оьшуш долучу хьаштан, цундера хӀинц хьоьга дӀа ца йазло хийцам.\nХила мега, ахьа Ӏалаш дан дезаш хьайн йоза, юха тӀаьхьо леладан иза йоза.'''\n\nКуьйгалхочо блоктоьхна гӀирса бух, цо битина кхетош хӀара хаам: $1",
-       "protectedpagewarning": "'''Ð\94Ó\80аÑ\85Ñ\8cедаÑ\80. Ð¥Ó\80аÑ\80а Ð°Ð³Ó\80о Ð³Ó\80аÑ\80олла Ð´ина ю хийцам цабайта, иза хийца я нисъян а бакъо йолуш куьйгалла лелош болу декъашхой бе бац.'''\nЛахахьа гойту хаамаш тӀаьххьара бина болу хийцамна тептар чура:",
-       "semiprotectedpagewarning": "'''Ð\94Ó\80аÑ\85Ñ\8cедо.''' Ð¥Ó\80аÑ\80а Ð°Ð³Ó\80о Ð³Ó\80аÑ\80олла Ð¹Ð¸Ð½Ð° Ñ\8e; Ð´Ó\80абазбинаÑ\87Ñ\83 Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\88ка Ð±Ðµ Ñ\86Ó\80е Ñ\85ийÑ\86алÑ\83Ñ\88 Ñ\8fÑ\86.\nÐ\9bаÑ\85аÑ\85Ñ\8cа Ñ\82епÑ\82аÑ\80о Ð±Ð°Ð»Ð¸Ð¹Ð½Ð° Ñ\82Ó\80аÑ\8cхьаралера дӀаязбина хаам:",
+       "protectedpagewarning": "'''Ð\94Ó\80аÑ\85Ñ\8cедаÑ\80. Ð¥Ó\80аÑ\80а Ð°Ð³Ó\80о Ð»Ð°Ñ\80йина ю хийцам цабайта, иза хийца я нисъян а бакъо йолуш куьйгалла лелош болу декъашхой бе бац.'''\nЛахахьа гойту хаамаш тӀаьххьара бина болу хийцамна тептар чура:",
+       "semiprotectedpagewarning": "'''Ð\94Ó\80аÑ\85Ñ\8cедо.''' Ð¥Ó\80аÑ\80а Ð°Ð³Ó\80о Ð»Ð°Ñ\80йина Ñ\8e; Ð´Ó\80абазбинаÑ\87Ñ\83 Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\88ка Ð±Ðµ Ñ\86Ó\80е Ñ\85ийÑ\86алÑ\83Ñ\88 Ñ\8fÑ\86.\nÐ\9bаÑ\85аÑ\85Ñ\8cа Ñ\82епÑ\82аÑ\80о Ð±Ð°Ð»Ð¸Ð¹Ð½Ð° Ñ\82Ó\80аÑ\8cÑ\85хьаралера дӀаязбина хаам:",
        "cascadeprotectedwarning": "<div id=\"cascadeprotectedwarning\" style=\"border:1px solid #ee0; padding:10px; background:#ffa; margin-bottom:1em\">[[file:Padlock.svg|left|25px|ДовгӀа|link=]]\nХӀара агӀо тада бакъо йолуш [[Project:Куьйгалхой|куьйгалхой]] бу, хӀунда аьлча и агӀо латийна кхечу агӀонашца хӀоттделлачу гӀаролле:</div>",
        "templatesused": "{{PLURAL:$1|1=Кеп, лелош ю|Кепаш, лелош ю}} хӀокху агӀон башхонца:",
        "templatesusedpreview": "{{PLURAL:$1|1=Кеп, лелошдолу|Кепаш, лелойлу}} оцу хьалх хьожучу агӀонца:",
        "templatesusedsection": "ХӀокху декъан чохь {{PLURAL:$1|1=лелош йолу кеп|лелош йолу кепаш}}:",
        "template-protected": "(гlароллийца)",
-       "template-semiprotected": "(дÑ\83Ñ\8cззина Ð´Ð¾Ñ\86Ñ\83Ñ\88 Ð³lаÑ\80олла)",
+       "template-semiprotected": "(дÑ\83Ñ\8cззина Ð´Ð¾Ñ\86Ñ\83Ñ\88 Ð»Ð°Ñ\80Ñ\8aÑ\8fÑ\80)",
        "hiddencategories": "ХӀара агӀо чуйогӀуш ю оцу $1 {{PLURAL:$1|1=къайлаха категори чу|къайлаха категореш чу}}:",
        "edittools": "<!-- Кхузе буха диллина йоза гуш хир ду редоккхуче бухахь а хlума чуйоккхуче бухахь. -->",
        "nocreate-loggedin": "Хьан бакъо яц керла агӀонаш кхолла.",
        "mergehistory-submit": "Цхьаьнатоха нисдарш",
        "mergehistory-empty": "Цхьаьнатоха нисдарш цакарий.",
        "mergehistory-success": "$3 {{PLURAL:$3|нисдар|нисдарш}} [[:$1]] чура кхиамца {{PLURAL:$3|дехьа даьккхина|дехьа дехна}} [[:$2]] чу.",
-       "mergehistory-fail": "АгӀонийн истореш вовшахтоха цаделира, дехар до агӀона параметаршка а хене а хьажа.",
+       "mergehistory-fail": "АгӀонийн истореш вовшахтоха цаделира, дехар до агӀона параметаршка а, хене а хьажа.",
        "mergehistory-no-source": "Коьрта агӀо «$1» яц.",
        "mergehistory-no-destination": "Ӏалашон агӀо «$1» яц.",
        "mergehistory-invalid-source": "Хьостан нийса корта хила еза.",
        "yourlanguage": "Мотт:",
        "yourvariant": "Метта башхо:",
        "yournick": "Керла куьгтаӀор:",
-       "prefs-help-signature": "Дийцаре агӀонаш чохь къуьгтаӀо деза символшца «<nowiki>~~~~</nowiki>», цара гойтур ду хьан къуьгтаӀор а хан а.",
+       "prefs-help-signature": "Дийцаре агӀонаш чохь къуьгтаӀо деза символшца «<nowiki>~~~~</nowiki>», цара гойтур ду хьан къуьгтаӀор а, хан а.",
        "badsiglength": "ТӀех деха куьг.\nКуьйган $1 {{PLURAL:$1|символ}} дукха хила цамега.",
        "yourgender": "Стен-боьршалла",
        "gender-unknown": "хӀоттийна яц",
        "right-writeapi": "дӀаяздеш лелойо API",
        "right-delete": "агӀонаш дӀаяхар",
        "right-bigdelete": "еха хийцаман истори йолу агӀонаш дӀаяхар",
-       "right-deletelogentry": "тептар чура билгала дӀаяздарш дӀадахар а меттахӀиттадар а.",
-       "right-deleterevision": "агӀонийн билгала версеш дӀаяхар а меттахӀиттаяр а",
+       "right-deletelogentry": "тептар чура билгала дӀаяздарш дӀадахар а, меттахӀиттадар а.",
+       "right-deleterevision": "агӀонийн билгала версеш дӀаяхар а, меттахӀиттаяр а",
        "right-deletedhistory": "дӀаяьхна агӀонийн исторега хьажар дӀадаьккхина йоза тӀекхочехь доцуш",
-       "right-deletedtext": "дӀадаьккхина йозане а хийцамашка а хьажар агӀонийн дӀаяьхна версин юккъахь",
+       "right-deletedtext": "дӀадаьккхина йозане а, хийцамашка а хьажар агӀонийн дӀаяьхна версин юккъахь",
        "right-browsearchive": "дӀаяхна агӀонаш лахар",
        "right-undelete": "АгӀонаш меттахӀоттор",
        "right-suppressrevision": "куьйгалхойх хьулйина йолу агӀонийн версеш меттахӀиттаяр а хьажар а",
        "right-suppressionlog": "долара тептаршка хьажар",
        "right-block": "кхечу декъашхошка тадарш ца дайта дехкар хӀоттор",
        "right-blockemail": "Цамагдо декъашхошка хааман кехаташ кхехьийта",
-       "right-hideuser": "декъашхочун цӀе а и лечкъо а цамагор",
-       "right-ipblock-exempt": "IP блоктохаршна чекхбовлар, диапазонийн шаблоктохаршна а блоктохаршна а",
+       "right-hideuser": "декъашхочун цӀе а, и лечкъо а цамагор",
+       "right-ipblock-exempt": "IP блоктохаршна чекхбовлар, диапазонийн шаблоктохаршна а, блоктохаршна а",
        "right-proxyunbannable": "проксен автоматически блоктохаран чекхбовлар",
        "right-unblockself": "ша шин блокдӀаяккхар",
-       "right-protect": "АгӀона гӀоралла хийцар а гӀоралла дина агӀо нисяр а",
-       "right-editprotected": "«{{int:protect-level-sysop}}» Ð±Ð°Ñ\85Ñ\8cанÑ\86а Ð³Ó\80оÑ\80алла Ð´Ð¸Ð½Ð° Ð°Ð³Ó\80онаÑ\88 Ð½Ð¸Ñ\81яр",
-       "right-editsemiprotected": "«{{int:protect-level-autoconfirmed}}» Ð±Ð°Ñ\85Ñ\8cанÑ\86а Ð³Ó\80оÑ\80алла Ð´Ð¸Ð½Ð° Ð°Ð³Ó\80онаÑ\88 Ð½Ð¸Ñ\81яр",
+       "right-protect": "АгӀо ларъяран хийцар а, ларйина агӀо нисяр а",
+       "right-editprotected": "«{{int:protect-level-sysop}}» Ð±Ð°Ñ\85Ñ\8cанÑ\86а Ð»Ð°Ñ\80йина Ð°Ð³Ó\80онаÑ\88 Ð½Ð¸Ñ\81Ñ\8aяр",
+       "right-editsemiprotected": "«{{int:protect-level-autoconfirmed}}» Ð±Ð°Ñ\85Ñ\8cанÑ\86а Ð»Ð°Ñ\80йина Ð°Ð³Ó\80онаÑ\88 Ð½Ð¸Ñ\81Ñ\8aяр",
        "right-editinterface": "лелош йолу интерфейсан хийцам бар",
-       "right-editusercssjs": "кхечу декъашхойн CSS- а JS- а файлаш нисяр",
+       "right-editusercssjs": "кхечу декъашхойн CSS- а, JS- а файлаш нисяр",
        "right-editusercss": "кхечу декъашхойн CSS-файлаш нсяр",
        "right-edituserjs": "кхечу декъашхойн JavaScript-файлаш нисяр",
        "right-editmyusercss": "Декъашхочун CSS файлаш таяр",
        "right-mergehistory": "агӀонаш вовшахтохар",
        "right-userrights": "декъашхойн массо бакъонаш хийцар",
        "right-userrights-interwiki": "кхечу вики сайташкара декъашхойн бакъонаш хийцар",
-       "right-siteadmin": "хаамийн гуламан блоктохар а блокдӀаяккхар а",
+       "right-siteadmin": "хаамийн гуламан блоктохар а, блокдӀаяккхар а",
        "right-override-export-depth": "агӀонаш экспорт ян, 5 кхаччалц къорга агӀонаш цхьан",
        "right-sendemail": "кхечу декъашхошка электронан хаамаш кхехьийта",
        "right-passwordreset": "пароль хийцарца электроннан хаамашка хьажар",
-       "right-managechangetags": "Хаамийн базан чохь [[Special:Tags|билгалонаш]] кхолла а дӀаяха а",
+       "right-managechangetags": "Хаамийн базан чохь [[Special:Tags|билгалонаш]] кхолла а, дӀаяха а",
        "newuserlogpage": "Декъашхой дӀабазбина тептар",
        "newuserlogpagetext": "Дукху хан йоцуш дӀабазбелла декъашхойн могӀам",
        "rightslog": "Декъашхочун бакъона тéптар",
        "action-deletedhistory": "хӀокху агӀона дӀаяккхинцу исторега хьажар",
        "action-browsearchive": "ДӀаяхна агӀонаш лахар",
        "action-undelete": "хӀара агӀо меттахӀоттор",
-       "action-suppressrevision": "хӀокху къайлаха йолу агӀон версеш хьажар а меттахӀоттор а",
+       "action-suppressrevision": "хӀокху къайлаха йолу агӀон версеш хьажар а, меттахӀоттор а",
        "action-suppressionlog": "хӀокху долара тептаре хьажар",
        "action-block": "хӀокху декъашхошка тадарш ца дайта дехкар хӀоттор",
        "action-protect": "хӀокху агӀона гӀоралин хьал хийцар",
        "action-viewmywatchlist": "шен тергаме могӀане хьажар",
        "action-viewmyprivateinfo": "хьан долара хааме хьажар",
        "action-editmyprivateinfo": "хьан долара хаам табар",
-       "action-managechangetags": "хаамийн базан чохь билгалонаш кхоллар а дӀаяхар а",
+       "action-managechangetags": "хаамийн базан чохь билгалонаш кхоллар а, дӀаяхар а",
        "nchanges": "$1 {{PLURAL:$1|хийцам}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|тӀеххьара чудаларца}}",
        "enhancedrc-history": "истори",
        "file-exists-duplicate": "ХӀара файл лахарчу {{PLURAL:$1|1=файлан|файлийн}} дубликат ю:",
        "file-deleted-duplicate": "Иштта файл ([[:$1]]) хӀинцале дӀаяьккхина хилла. Дехар до, юху файл чуяккхале файл дӀаяккхаран историга хьажа.",
        "uploadwarning": "ДӀахьедар",
-       "uploadwarning-text": "Дехар до, лахара файлах лаьцнарг хийца а дай юху а гӀорта файл чуяккха.",
+       "uploadwarning-text": "Дехар до, лахара файлах лаьцнарг хийца а, дай юху а гӀорта файл чуяккха.",
        "savefile": "ДӀаязъе файл",
        "uploaddisabled": "Чуяккхар магийна дац",
        "copyuploaddisabled": "URL тӀера чуяккхар дӀадайина ду.",
        "shortpages": "Боца яззамаш",
        "longpages": "Беха яззамаш",
        "deadendpages": "Дика йоцу агӀонаш",
-       "protectedpages": "ГIаролла дина агӀонаш",
-       "protectedpages-indef": "Хан йоцуш гӀоралла динарш бен",
-       "protectedpages-cascade": "Чахчарин гӀоралла бен",
+       "protectedpages": "Ларйина агӀонаш",
+       "protectedpages-indef": "Хан йоцуш ларйинарш бен",
+       "protectedpages-summary": "ХӀокху агӀонгахь гойтуш ю йолуш йолу ларйина агӀонаш. ЦӀерш ларйина агӀонашка хьажа [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
+       "protectedpages-cascade": "Чахчарин ларъяр бен",
        "protectedpages-noredirect": "Къайлаяха дӀасахьажийнарш",
        "protectedpages-timestamp": "Терахь/хан",
        "protectedpages-page": "АгӀо",
        "protectedpages-reason": "Бахьана",
        "protectedpages-unknown-timestamp": "Хууш дац",
        "protectedpages-unknown-performer": "Хууш доцу декъашхо",
-       "protectedtitles": "ГӀаролла дина цӀерш",
+       "protectedtitles": "Ларйина цӀерш",
+       "protectedtitles-summary": "ХӀокху агӀонгахь гойтуш ю ца кхоллийта ларйина цӀерш. ХӀинца ларйина агӀонашка хьажа [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "listusers": "Декъашхойн могӀам",
        "listusers-editsonly": "Цхаъ мукъане а хийцам бина декъашхой гайта",
        "listusers-creationsort": "Кхоьллина хене хьаьжжина нисъяр",
        "linksearch-pat": "Лехарна кеп:",
        "linksearch-ns": "ЦӀерийн ана:",
        "linksearch-ok": "Лахар",
-       "linksearch-text": "Лело мега хӀоттош йолу символаш, масала, <code>*.wikipedia.org</code>.\nЛакхара даржан домен мукъа хила еза , масала<code>*.org</code><br />\nЛовш йолу {{PLURAL:$2|1=протокол|протоколаш}}: <code>$1</code> (Iад йитарца http://, протокол бакъалла язъен яцахь).",
+       "linksearch-text": "Лело мега хӀоттош йолу символаш, масала, <code>*.wikipedia.org</code>.\nЛакхара даржан домен мукъа хила еза , масала<code>*.org</code><br />\nЛовш йолу {{PLURAL:$2|1=протокол|протоколаш}}: $1 (Iад йитарца http://, протокол бакъалла язъен яцахь).",
        "linksearch-line": "$2 — хьажорг кху $1",
        "listusersfrom": "Гучé баха декъашхой, болалуш болу тӀера:",
        "listusers-submit": "Гайта",
        "changecontentmodel-reason-label": "Бахьана:",
        "logentry-contentmodel-change-revertlink": "юхаяккха",
        "logentry-contentmodel-change-revert": "Юхаяккха",
-       "protectlogpage": "Ð\93lаÑ\80олли тептар",
-       "protectlogtext": "Лахахь гойту агӀона гӀоралла дарна бина хийцамаш чохь болу тептар.\nХьа кхин йиш ю [[Special:ProtectedPages|хӀинца гӀоралла дина йолу агӀонийн могӀаме хьажа]].",
-       "protectedarticle": "гlаÑ\80олла Ð´Ð¸Ð½Ð° Ð°Ð³lо «[[$1]]»",
-       "modifiedarticleprotection": "агlонан гlаролли локхалла хийцина «[[$1]]»",
+       "protectlogpage": "Ð\9bаÑ\80Ñ\8fÑ\80ан тептар",
+       "protectlogtext": "Лахахь гойту агӀо лаъръяран хийцамаш чохь болу тептар.\nХьа кхин йиш ю [[Special:ProtectedPages|хӀинца ларйина йолу агӀонийн могӀаме хьажа]].",
+       "protectedarticle": "Ð\9bаÑ\80йина Ð°Ð³Ó\80о «[[$1]]»",
+       "modifiedarticleprotection": "агӀонан ларяран локхалла хийцина «[[$1]]»",
        "unprotectedarticle": "ГӀоролла дӀадаьстина «[[$1]]»",
-       "movedarticleprotection": "«[[$2]]» Ð°Ð³Ó\80она Ñ\82Ó\80еÑ\80а Ð³Ó\80аÑ\80олла «[[$1]]» агӀона тӀе даьккхина",
-       "protect-title": "Ð\93Ó\80оÑ\80алла Ñ\85Ó\80оÑ\82Ñ\82ор: «$1»",
+       "movedarticleprotection": "«[[$2]]» Ð°Ð³Ó\80она Ñ\82Ó\80еÑ\80а Ð»Ð°Ñ\80Ñ\8aÑ\8fÑ\80 «[[$1]]» агӀона тӀе даьккхина",
+       "protect-title": "Ð\9bаÑ\80Ñ\8aÑ\8fр: «$1»",
        "protect-title-notallowed": "ГӀораллин бараме хьажар «$1»",
        "prot_1movedto2": "«[[$1]]» цӀе хийцина → «[[$2]]»",
        "protect-badnamespace-title": "ГӀораладан цалуш йолу цӀерийн ана",
        "protect-badnamespace-text": "ХӀокху цӀерийн меттигехь йолу агӀонашна гӀараладан цало.",
        "protect-norestrictiontypes-title": "ГӀараладан цалуш йолу агӀо",
-       "protect-legend": "Ð\91акÑ\8aде Ð³Ó\80оÑ\80алла Ð´Ð°р",
+       "protect-legend": "Ð\91акÑ\8aде Ð°Ð³Ó\80о Ð»Ð°Ñ\80Ñ\8aÑ\8fр",
        "protectcomment": "Бахьана:",
        "protectexpiry": "Чекхйолу:",
-       "protect_expiry_invalid": "Ð\9dийÑ\81а Ð¹Ð¾Ñ\86Ñ\83 Ñ\85ан Ð³lаÑ\80олла Ð´lайаларехь.",
+       "protect_expiry_invalid": "Ð\9dийÑ\81а Ð¹Ð¾Ñ\86Ñ\83 Ñ\85ан Ð»Ð°Ñ\80Ñ\8aÑ\8fÑ\80 Ð´Ó\80айаларехь.",
        "protect_expiry_old": "Хан чаккхе — хьалхалера.",
-       "protect-unchain-permissions": "СÑ\85Ñ\8cабелла ÐºÑ\85ин Ð³Ó\80оÑ\80Ñ\80алин гӀирс",
+       "protect-unchain-permissions": "СÑ\85Ñ\8cабелла ÐºÑ\85ин Ð»Ð°Ñ\8aÑ\80Ñ\8aÑ\8fÑ\80ан гӀирс",
        "protect-text": "Кхузéхь хьо хьажало хийцалуш гӀароллин локхалла оцу агӀонашна '''$1'''.",
        "protect-locked-access": "Хьан дӀаяздаран тоъал бакъо яц гӀароллийн локхаллéхь агӀон хийцам бá. ДӀадоьлху хӀоттийнарш агӀонна '''$1''':",
-       "protect-cascadeon": "Хlара агlо гlароллийца ю, хlунд аьлча иза латийна {{PLURAL:$1|1=лахахьа гойтучу агlонца, цуьнца хlоттийна|лахахьа гойтучу агlоншца, цаьрца хlоттийна}} чахчарийца гlаролла. Хьога хийцалур ю гlаролли локхалла хlокху агlон, амма оцо хийцам бийра бац чахчарехь йолучу гlароллийна.",
-       "protect-default": "Ð\93lаÑ\80олла Ð¹оцуш",
+       "protect-cascadeon": "ХӀара агӀо хӀинца ларйина ю, хӀунда аьлча иза латийна {{PLURAL:$1|1=лахахьа гойтучу агӀонца, цуьнца хӀоттийна|лахахьа гойтучу агӀоншца, цаьрца хӀоттийна}} чахчарийца ларяър. Хьога хийцалур ду ларяран локхалла хӀокху агӀон, амма оцо хийцам бийра бац чахчарехь йолучу ларярна.",
+       "protect-default": "Ð\9bаÑ\80Ñ\8aÑ\8fÑ\80 Ð´оцуш",
        "protect-fallback": "Бакъо оьшу «$1»",
-       "protect-level-autoconfirmed": "Ð\93lаÑ\80олла Ð´Ã© Ð¾Ñ\86Ñ\83 ÐºÐµÑ\80ла Ð° Ð´lабазбина Ð±Ð¾Ñ\86Ñ\83Ñ\87Ñ\83 Ð´ÐµÐºÑ\8aаÑ\88Ñ\85ойÑ\85",
-       "protect-level-sysop": "Ð\9aÑ\83Ñ\8cйгалÑ\85оÑ\88на Ð±Ã© Ñ\86амагдо",
+       "protect-level-autoconfirmed": "Ð\9cагийна Ð°Ð²Ñ\82о-Ñ\82Ó\80елаÑ\8cÑ\86на Ð±Ð¾Ð»Ñ\83 Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\88на",
+       "protect-level-sysop": "Ð\9cагийна ÐºÑ\83Ñ\8cйгалÑ\85оÑ\88на",
        "protect-summary-cascade": "чахчареца",
        "protect-expiring": "чакхйолу $1 (UTC)",
        "protect-expiring-local": "чекхйолу $1",
        "protect-expiry-indefinite": "хан чаккхе йоцуш",
-       "protect-cascade": "Ð\93Ó\80аÑ\80олла Ð¹Ã© Ð°Ð³Ó\80онаÑ\88, Ñ\85Ó\80окÑ\85Ñ\83 Ð°Ð³Ó\80онÑ\86а Ñ\85Ó\80оÑ\82Ñ\82айеллаÑ\80Ñ\88 (Ñ\87аÑ\85Ñ\87аÑ\80é Ð³Ó\80аÑ\80олла)",
+       "protect-cascade": "Ð\9bаÑ\80Ñ\8aе Ð°Ð³Ó\80онаÑ\88, Ñ\85Ó\80окÑ\85Ñ\83 Ð°Ð³Ó\80онÑ\86а Ñ\85Ó\80оÑ\82Ñ\82айеллаÑ\80Ñ\88 (Ñ\87аÑ\85Ñ\87аÑ\80é Ð»Ð°Ñ\80Ñ\8fÑ\8aÑ\80)",
        "protect-cantedit": "Хьéга хийцам цабало хӀокху агӀон гlаролли локхалан, хӀуд аьлча хьан бакъо яц оцунна тадар дан.",
        "protect-othertime": "Кхин хан:",
        "protect-othertime-op": "кхин хан",
        "protect-existing-expiry-infinity": "Карара чекхйолу хан: чаккхе йоцу",
        "protect-otherreason": "Кхин бахьана/тӀетохар:",
        "protect-otherreason-op": "Кхин бахьана",
-       "protect-dropdown": "* Ð\93Ó\80оÑ\80алла Ð´Ð°Ñ\80на баьхьаш \n** сих-сиха зулам дар \n** дуккха спам хилар\n** нисдарийн тӀом \n** гӀараялл агӀо",
+       "protect-dropdown": "* Ð\9bаÑ\8aÑ\80Ñ\8aÑ\8fÑ\80ан баьхьаш \n** сих-сиха зулам дар \n** дуккха спам хилар\n** нисдарийн тӀом \n** гӀараялл агӀо",
        "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,цlкъа:infinite",
        "restriction-type": "Бакъонаш:",
        "restriction-move": "ЦӀе хийцар",
        "restriction-create": "Кхоллар",
        "restriction-upload": "Чуйолуш",
-       "restriction-level-sysop": "дуьззина гӀоралла",
-       "restriction-level-autoconfirmed": "дÑ\83Ñ\8cззина Ð´Ð¾Ñ\86Ñ\83Ñ\88 Ð³Ó\80аÑ\80олла",
+       "restriction-level-sysop": "юьззина ларъяр",
+       "restriction-level-autoconfirmed": "дÑ\83Ñ\8cззина Ð´Ð¾Ñ\86Ñ\83Ñ\88 Ð»Ð°Ñ\80даÑ\80",
        "restriction-level-all": "массо барам",
        "undelete": "ДӀаяьхна агӀонашка хьажар",
-       "undeletepage": "ДӀаяьхна агӀонашка хьажар а меттахӀоттор а",
+       "undeletepage": "ДӀаяьхна агӀонашка хьажар а, меттахӀоттор а",
        "undeletepagetitle": "'''Лахахь гайтина хӀокху [[:$1]] агӀона дӀаяхина версеш'''.",
        "viewdeletedpage": "ДӀаяьхна йолу агӀонашка хьажар",
        "undelete-fieldset-title": "МеттахӀоттае версеш",
        "undeleteinvert": "Къастае массо",
        "undeletecomment": "Бахьана:",
        "undeletedrevisions": "{{PLURAL:$1|меттахӀоьттина}} $1 {{PLURAL:$1|хийцам}}",
-       "undeletedrevisions-files": "меттахӀоьттина $1 {{PLURAL:$1|верси}} а $2 {{PLURAL:$2|файл}} а",
+       "undeletedrevisions-files": "меттахӀоьттина $1 {{PLURAL:$1|верси}} а, $2 {{PLURAL:$2|файл}} а",
        "undeletedfiles": "$1 {{PLURAL:$1|файл меттахӀоттайина|файлаш меттахӀоттайина}}",
        "cannotundelete": "ГӀалат меттахӀоттайина:\n$1",
        "undeletedpage": "'''МеттахӀоттайина агӀо «$1».'''\n\nДӀадяхнарш долу могӀане [[Special:Log/delete|тéптаре хьажа]].",
        "ipbsubmit": "Блоктоха хӀокху декъашхочун/адресна",
        "ipbother": "Кхин хан:",
        "ipboptions": "2 сахьат:2 hours,1 де:1 day,3 де:3 days,1 кlиран:1 week,2 кlиран:2 weeks,1 бутт:1 month,3 бутт:3 months,6 бутт:6 months,1 шо:1 year,цӀкъа:infinite",
-       "ipbhidename": "Нисдарийн а могӀаман а чура декъашхочун цӀе хьул йе",
-       "ipbwatchuser": "ТӀетоха тергаме могӀам юкъа цуьнан долахь йолу агӀо а цуьнан дийцаре агӀо а",
+       "ipbhidename": "Нисдарийн а, могӀаман а чура декъашхочун цӀе хьул йе",
+       "ipbwatchuser": "ТӀетоха тергаме могӀам юкъа цуьнан долахь йолу агӀо а, цуьнан дийцаре агӀо а",
        "ipb-disableusertalk": "Цамагдо шин дийцаре агӀо та я блоктоьхна хан чекхъяллалц",
        "ipb-change-block": "Юхаблоктоха декъашхочун оьцу хийцамашца",
        "ipb-confirm": "Бакъде блоктохар",
        "articleexists": "ХӀарасанна цӀе йолу агӀо йолуш ю йа ахьа гойтуш йолу цӀе магош яц.\nДехар до, харжа кхин цӀе.",
        "movetalk": "Цуьнца йогӀуш йолу дийцаре агӀон цӀе хийцар",
        "move-subpages": "ЦӀерш хийца бухара агӀонийн ($1 кхаччалц)",
-       "move-talk-subpages": "ЦӀе хийца бухара агӀонийн а агӀонийн дийцаре а ($1  кхаччалц)",
+       "move-talk-subpages": "ЦӀе хийца бухара агӀонийн а, агӀонийн дийцаре а ($1  кхаччалц)",
        "movepage-page-exists": "Агӏо $1 йолуш ю цундела и ша юху дӏаязъян йиш яц.",
        "movepage-page-moved": "АгӀона $1 цӀе хийцина → $2.",
        "movelogpage": "ЦӀерш хийцаран тептар",
        "imageinvalidfilename": "Файлан цӀе гӀалате ю",
        "fix-double-redirects": "Хьалхара цӀе йолу дӀасахьажорг нисъян",
        "move-leave-redirect": "Ӏадйита дӀасахьажораг",
-       "protectedpagemovewarning": "'''Ð\94Ó\80аÑ\85Ñ\8cедаÑ\80.''' Ð¥Ó\80аÑ\80а Ð°Ð³Ó\80о Ð³Ó\80аÑ\80олла Ð¹Ð¸Ð½Ð° Ñ\8e; Ñ\86Ó\80е Ñ\85ийÑ\86а Ñ\8f Ð½Ð¸Ñ\81йа а бакъо йолуш куьйгалхой бе бац.\nЛахахьа тептаро балийна тӀаьхьаралера дӀаязбина хаам:",
-       "semiprotectedpagemovewarning": "'''Ð\94Ó\80аÑ\85Ñ\8cедо.''' Ð¥Ó\80аÑ\80а Ð°Ð³Ó\80о Ð³Ó\80аÑ\80олла Ð¹Ð¸Ð½Ð° Ñ\8e; Ð´Ó\80абазбинаÑ\87Ñ\83 Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\88ка Ð±Ðµ Ñ\86Ó\80е Ñ\85ийÑ\86алÑ\83Ñ\88 Ñ\8fÑ\86.\nÐ\9bаÑ\85аÑ\85Ñ\8cа Ñ\82епÑ\82аÑ\80о Ð±Ð°Ð»Ð¸Ð¹Ð½Ð° Ñ\82Ó\80аÑ\8cхьаралера дӀаязбина хаам:",
+       "protectedpagemovewarning": "'''Ð\94Ó\80аÑ\85Ñ\8cедаÑ\80.''' Ð¥Ó\80аÑ\80а Ð°Ð³Ó\80о Ð»Ð°Ñ\80йина Ñ\8e; Ñ\86Ó\80е Ñ\85ийÑ\86а Ñ\8f Ð½Ð¸Ñ\81Ñ\8aÑ\8fн а бакъо йолуш куьйгалхой бе бац.\nЛахахьа тептаро балийна тӀаьхьаралера дӀаязбина хаам:",
+       "semiprotectedpagemovewarning": "'''Ð\94Ó\80аÑ\85Ñ\8cедо.''' Ð¥Ó\80аÑ\80а Ð°Ð³Ó\80о Ð»Ð°Ñ\80йина Ñ\8e; Ð´Ó\80абазбинаÑ\87Ñ\83 Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\88ка Ð±Ðµ Ñ\86Ó\80е Ñ\85ийÑ\86алÑ\83Ñ\88 Ñ\8fÑ\86.\nÐ\9bаÑ\85аÑ\85Ñ\8cа Ñ\82епÑ\82аÑ\80о Ð±Ð°Ð»Ð¸Ð¹Ð½Ð° Ñ\82Ó\80аÑ\8cÑ\85хьаралера дӀаязбина хаам:",
        "move-over-sharedrepo": "== Файл йолуш ю ==\nВикигулам чохь йолуш ю [[:$1]]. ХӀокху файлан цӀе хийцича Викигулам чуьраниг дӀакъовлу.",
        "export": "АгӀонаш араяхар",
        "exporttext": "Шуьга далур ду кхечу меттера чудахарш, йоза а хийцаме тептарш билгалла йолу агӀонаш я гулдина йолу агӀонаш хӀокху XML барамца, юха тӀаьхьа чура [[Special:Import|хьаэцалурдолш]] кхечу вики-хьалхен, болх беш йолу хӀокху MediaWiki гӀирсаца.\n\nКхечу меттера яззамаш чуяха, чу язъе цӀе тадечу метте, цхьа могӀан цӀе могӀаршкахь, юха харжа лаьий шуна кхечу меттигера чуяха массо яззамашна истори хийцамбарш я тӀаьххьарлера яззаман верси.\n\nШуьга кхи далундерг, лелаеш йолу адресан хьажорг кхечу меттера чудаха тӀаьххьарлерачу версин яззамаш. Масала оцу яззаман [[{{MediaWiki:Mainpage}}]] хӀара хира ю хьажорг [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].",
        "tooltip-ca-addsection": "Кхолла керла дакъа",
        "tooltip-ca-viewsource": "Хlара агlо хийцам цабайта гароллехь ю, хьоьга далундерг хьажар а дезахь чура йоза хьаэцар",
        "tooltip-ca-history": "Хlокху агlон хийцамаш болу тептар",
-       "tooltip-ca-protect": "Ð\93lаÑ\80олла Ð´Ã© Ñ\85lокÑ\85Ñ\83 Ð°Ð³lон Ñ\85ийÑ\86ам цабайта",
+       "tooltip-ca-protect": "Ð\9bаÑ\80Ñ\8aе Ð°Ð³Ó\80о Ñ\85ийÑ\86амаÑ\88 цабайта",
        "tooltip-ca-unprotect": "Дlадаккха хlокху агlонна долу гаролла",
        "tooltip-ca-delete": "ДӀаяккха хӀара агӀо",
        "tooltip-ca-move": "АгӀон цӀе хийца",
        "pageinfo-not-current": "Шира версийн оьцу хааме хьажа таро яц.",
        "pageinfo-header-basic": "Коьрта хаам",
        "pageinfo-header-edits": "Хийцаман истори",
-       "pageinfo-header-restrictions": "Ð\90гÓ\80она Ð³Ó\80оÑ\80алла Ð´Ð°р",
+       "pageinfo-header-restrictions": "Ð\90гÓ\80она Ð»Ð°Ñ\80Ñ\8aÑ\8fр",
        "pageinfo-header-properties": "АгӀона билгало",
        "pageinfo-display-title": "Гушболу корта",
        "pageinfo-default-sort": "Къасторан догӀа Ӏад йитарца",
        "pageinfo-redirectsto-info": "Хаам",
        "pageinfo-contentpage": "Лорурго чулацаме гойту агӀо",
        "pageinfo-contentpage-yes": "ХӀаъ",
-       "pageinfo-protect-cascading": "ЧаÑ\85Ñ\87аÑ\80ин Ð³Ó\80оÑ\80алла кхузара",
+       "pageinfo-protect-cascading": "ЧаÑ\85Ñ\87аÑ\80ин Ð»Ð°Ñ\80Ñ\8aÑ\8fÑ\80 кхузара",
        "pageinfo-protect-cascading-yes": "ХӀаъ",
-       "pageinfo-protect-cascading-from": "ЧаÑ\85Ñ\87аÑ\80ин Ð³Ó\80оÑ\80алла тӀера",
+       "pageinfo-protect-cascading-from": "ЧаÑ\85Ñ\87аÑ\80ин Ð»Ð°Ñ\80Ñ\8aÑ\8fÑ\80 тӀера",
        "pageinfo-category-info": "Категорех лаьцна хаам",
        "pageinfo-category-pages": "АгӀонийн дукхалла",
        "pageinfo-category-subcats": "Бухара категорийн дукхалла",
        "exif-orientation": "Суьртан хьал",
        "exif-samplesperpixel": "Беснийн компонентийн дукхалла",
        "exif-planarconfiguration": "Организацин хаамийн некъ",
-       "exif-ycbcrsubsampling": "Барамийн компонент Y а C а",
-       "exif-ycbcrpositioning": "Y а C а компонентин листаран кеп",
+       "exif-ycbcrsubsampling": "Барамийн компонент Y а, C а",
+       "exif-ycbcrpositioning": "Y а, C а компонентин листаран кеп",
        "exif-xresolution": "Шоралла",
        "exif-yresolution": "Локхалла",
        "exif-stripoffsets": "Суьртийн хаамаш болу меттиг",
        "exif-jpeginterchangeformatlength": "Сизан хааман барам preview",
        "exif-whitepoint": "Къайн тӀадаман бос",
        "exif-primarychromaticities": "Коьрта беснийн бос",
-       "exif-referenceblackwhite": "Ӏаьржа а къай а тӀадамийн меттиг",
+       "exif-referenceblackwhite": "Ӏаьржа а, къай а тӀадамийн меттиг",
        "exif-datetime": "Файлан хийцам бина терахь а, хан а",
        "exif-imagedescription": "Суьртан цӏе",
        "exif-make": "Камера арахоьцург",
        "exif-usercomment": "Кхин тӀе къамел",
        "exif-relatedsoundfile": "Къамелан аьзнийн файл",
        "exif-datetimeoriginal": "Дуьххьарлера терахь а хан",
-       "exif-datetimedigitized": "Оцифровк йина терахь а хан а",
+       "exif-datetimedigitized": "Оцифровк йина терахь а, хан а",
        "exif-subsectime": "Файлан хийцам баран хан секундашкахь",
        "exif-subsectimeoriginal": "Оригинал хенан секундан дакъа",
        "exif-subsectimedigitized": "Терахьийн хенан секундан дакъа",
        "exif-gpsdop-poor": "Во ($1)",
        "exif-objectcycle-a": "Ӏуьранна бен",
        "exif-objectcycle-p": "Суьйранна бен",
-       "exif-objectcycle-b": "Ӏуьранна а суьйранна а",
+       "exif-objectcycle-b": "Ӏуьранна а, суьйранна а",
        "exif-gpsdirection-t": "бакъалла",
        "exif-gpsdirection-m": "магнитан",
        "exif-ycbcrpositioning-1": "Юкъйина",
        "exif-dc-type": "Медиан тайп",
        "exif-rating-rejected": "ДӀайайина",
        "exif-isospeedratings-overflow": "65535 дукха",
-       "exif-iimcategory-ace": "Исбаьхьалла, культура а синкъерам а",
-       "exif-iimcategory-clj": "Зулам дар а Ӏедал а",
-       "exif-iimcategory-dis": "Ирча бохам а авари а",
-       "exif-iimcategory-fin": "Экономика а бизнес а",
+       "exif-iimcategory-ace": "Исбаьхьалла, культура а, синкъерам а",
+       "exif-iimcategory-clj": "Зулам дар а, Ӏедал а",
+       "exif-iimcategory-dis": "Ирча бохам а, авари а",
+       "exif-iimcategory-fin": "Экономика а, бизнес а",
        "exif-iimcategory-edu": "Дешна хилар",
        "exif-iimcategory-lab": "Къинхьегам",
-       "exif-iimcategory-rel": "Дин а тешар а",
-       "exif-iimcategory-sci": "Ӏилма а техника а",
+       "exif-iimcategory-rel": "Дин а, тешар а",
+       "exif-iimcategory-sci": "Ӏилма а, техника а",
        "exif-iimcategory-soi": "Социалан хаттарш",
        "exif-iimcategory-wea": "Хенан хӀоттам",
        "exif-urgency-normal": "Диканиг ($1)",
        "specialpages-group-highuse": "Уггаре дукха лелайо агӀонаш",
        "specialpages-group-pages": "АгӀонийн могӀанаш",
        "specialpages-group-pagetools": "ГӀирсаш агӀонашна",
-       "specialpages-group-wiki": "Хаамаш а гӀирсаш а",
+       "specialpages-group-wiki": "Хаамаш а, гӀирсаш а",
        "specialpages-group-redirects": "ДӀасахьажош йолу белхан агӀонаш",
        "specialpages-group-spam": "Спаман дуьхьала гӀирсаш",
        "blankpage": "Еса агӀо",
        "tags-deactivate": "дӀаяйа",
        "tags-hitcount": "$1 {{PLURAL:$1|хийцам}}",
        "tags-create-heading": "Кхолла керла билгало",
-       "tags-create-explanation": "Юха кхоьллина билгалонаш декъашхошна а боташна а Ӏад йтарца тӀекхочуш хира ю.",
+       "tags-create-explanation": "Юха кхоьллина билгалонаш декъашхошна а, боташна а Ӏад йтарца тӀекхочуш хира ю.",
        "tags-create-tag-name": "Билгалонна цӀе:",
        "tags-create-reason": "Бахьана:",
        "tags-create-submit": "Кхолла",
index d7b6e7a..bc238c4 100644 (file)
@@ -15,7 +15,8 @@
                        "아라",
                        "Serwan",
                        "Ebraminio",
-                       "Macofe"
+                       "Macofe",
+                       "Pirehelokan"
                ]
        },
        "tog-underline": "ھێڵ ھێنان بەژێر بەستەرەکان:",
        "view-pool-error": "ببورە، لەم کاتەدا ڕاژەکارەکان زیادەباریان لە سەرە.\nژمارەیەکی زۆر لە بەکارھێنەران ھاوکات ھەوڵی دیتنی ئەم پەڕەیان داوە.\nتکایە پێش ھەوڵی دووبارە بۆ دیتنی ئەم پەڕە، نەختێک بوەستە.\n\n$1",
        "pool-timeout": "لەکات دەرچوون ڕوویدا لەکاتی چاوەڕوانکردنی داخستندا",
        "pool-errorunknown": "هەڵەی نەزانراو",
-       "aboutsite": "سÛ\95بارÛ\95ت Ø¨Û\95 {{SITENAME}}",
+       "aboutsite": "دÛ\95ربارÛ\95Û\8c {{SITENAME}}",
        "aboutpage": "Project:سەبارەت",
        "copyright": "ناوەرۆک لە ژێر $1 لەبەردەستدایە، مەگەر بێجگە لەمە وترابێ.",
        "copyrightpage": "{{ns:project}}:مافەکانی لەبەرگرتنەوە",
        "resetpass-wrong-oldpass": "تێپەڕوشەی ھەنووکەیی یان تێپەڕوشەی کاتی ھەڵەیە.\nوا دیارە تێپەڕوشەکەت بە سەرکەوتوویی گۆڕدراوە یان داوای تێپەڕوشەیەکی نوێت کردووە.",
        "resetpass-temp-password": "تێپەڕوشەی کاتی:",
        "passwordreset": "ڕێکخستنەوەی تێپەڕوشە",
-       "passwordreset-legend": "دووبارە ڕێکخستنەوەی تێپەڕوشە",
        "passwordreset-username": "ناوی بەکارھێنەری:",
        "passwordreset-domain": "پاوان:",
        "passwordreset-capture": "بینینی ئیمەیڵی ئەنجام؟",
        "notextmatches": "لە دەقی نووسراوەکان دا نەبینرا",
        "prevn": "{{PLURAL:$1|$1}}ی پێشوو",
        "nextn": "{{PLURAL:$1|$1}}ی دواتر",
+       "prev-page": "پەڕەی پێشوو",
+       "next-page": "پەڕەی دواتر",
        "prevn-title": "$1 {{PLURAL:$1|ئەنجامی|ئەنجامی}} پێشو",
        "nextn-title": "$1 {{PLURAL:$1|ئەنجامی|ئەنجامی}} دواتر",
        "shown-title": "لە هەر پەڕەیەک $1 {{PLURAL:$1|ئەنجام|ئەنجام}} نیشان‌ بدە",
        "prefs-personal": "پرۆفایلی بەکارھێنەر",
        "prefs-rc": "دوایین گۆڕانکارییەکان",
        "prefs-watchlist": "پێرستی چاودێری",
+       "prefs-editwatchlist": "دە‌ستکاری لیستی چاودێری",
+       "prefs-editwatchlist-label": "دەستکاری لیستی چاودێرییەکەت بکە",
+       "prefs-editwatchlist-edit": "ناونیشانەکانی نێو لیستی چاودێرییەکەت ببینە و بسڕەوە",
+       "prefs-editwatchlist-clear": "لیستی چاودێرییەکەت پاک بکەرەوە",
        "prefs-watchlist-days": "ژمارەی ڕۆژەکان بۆ نیشاندان لە لیستی چاودێری:",
        "prefs-watchlist-days-max": "ئەوپەڕی $1 {{PLURAL:$1|ڕۆژە|ڕۆژە}}",
        "prefs-watchlist-edits": "ئەوپەڕی ژمارەی گۆڕانکارییەکان بۆ نیشاندان لە لیستی چاودێریی پەرەپێدراو:",
        "prefs-displaywatchlist": "ھەڵبژاردەکانی نیشاندان",
        "prefs-tokenwatchlist": "نیشانە",
        "prefs-diffs": "جیاوازییەکان",
+       "prefs-help-prefershttps": "بەکارخستنی ئەم تایبەتمەندییە کاریگەری لەسەر چوونەژوورەوەی داھاتووت دروست دەکات",
        "email-address-validity-valid": "ناونیشانی ئیمەیل دروست وە بەر چاو دێت",
        "email-address-validity-invalid": "ناونیشانێکی دروستی ئیمەیل بنووسە",
        "userrights": "بەڕێوەبردنی مافەکانی بەکارھێنەر",
        "userrights-lookup-user": "بەڕێوەبردنی گرووپەکانی بەکارھێنەر",
        "userrights-user-editname": "ناوی بەکارهێنەرێک بنووسە:",
        "editusergroup": "گرووپەکانی بەکارھێنەر دەستکاری بکە",
-       "editinguser": "گۆڕینی مافەکانی بەکارهێنەر '''[[User:$1|$1]]''' $2",
+       "editinguser": "گۆڕینی مافەکانی بەکارهێنەر {{GENDER:$1|بەکارھێنەر}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "دەستکاریی گرووپەکانی بەکارهێنەر",
        "saveusergroups": "گرووپەکانی بەکارھێنەر پاشەکەوت بکە",
        "userrights-groupsmember": "ئەندامە لە:",
        "right-browsearchive": "گەڕانی پەڕە سڕاوەکان",
        "right-undelete": "ھێنانەوەی پەڕەیەک",
        "right-suppressrevision": "بینین، شاردنەوە و ھێنانەوەی پێداچوونەوە تایبەتەکانی پەڕەکان لە لایەن ھەر بەکارھێنەرێکەوە",
+       "right-viewsuppressed": "پێداچوونەوە شاراوەکانی ھەر بەکارھێنەرێک پیشانبدە",
        "right-suppressionlog": "دیتنی لۆگە نھێنییەکان",
        "right-block": "بەربەستنی بەکارھێنەرانی تر لە دەستکاریکردن",
        "right-blockemail": "بەربەستنی بەکارھێنەرێک لە ناردنی ئیمەیل",
        "action-createpage": "دروستکردنی پەڕەکان",
        "action-createtalk": "دروستکردنی پەڕەکانی وتووێژ",
        "action-createaccount": "درووست‌کردنی هەژمارەی ئەم بەکارهێنەرە",
+       "action-history": "مێژووی ئەم پەڕەیە ببینە",
        "action-minoredit": "نیشان‌کردنی ئەم دەستکاریە وەک بچووک",
        "action-move": "گواستنەوەی ئەم پەڕەیە",
        "action-move-subpages": "گواستنەوەی ئەم پەڕەیە و ژێرپەڕەکانی",
        "action-move-rootuserpages": "گواستنەوەی بنەرەتی پەڕەکانی بەکارھێنەر",
+       "action-move-categorypages": "پەڕەکانی پۆل بگوازەرەوە",
        "action-movefile": "ئەم پەڕگەیە بگوازەوە",
        "action-upload": "ئەم پەڕەیە بار بکە",
        "action-reupload": "سەرنووسینی ئەم پەڕگە وا هەیە",
        "action-sendemail": "ناردنی ئیمەیلەکان",
        "action-editmywatchlist": "دیتنی پێرستی چاودێریت",
        "action-viewmywatchlist": "دیتنی پێرستی چاودێریت",
+       "action-viewmyprivateinfo": "زانیارییە تایبەتییەکانت ببینە",
+       "action-editmyprivateinfo": "دەستکاری زانیارییە تایبەتییەکانت بکە",
        "nchanges": "$1 {{PLURAL:$1|گۆڕانکاری}}",
        "enhancedrc-history": "مێژوو",
        "recentchanges": "دوایین گۆڕانکارییەکان",
        "uploaderror": "ھەڵە لە بارکردن دا",
        "upload-recreate-warning": "'''ھۆشیار بە: پەرگەیەک بەو ناوەوە سڕاوەتەوە یان گوێزاوەتەوە.'''\n\nلۆگی سڕینەوە یان گواستنەوەی ئەم پەڕە لێرە لەبەردەستدایە:",
        "uploadtext": "فۆرمی خوارەوە بەکاربێنە بۆ بارکردنی پەڕگەکان.\nبۆ بینینی و گەڕان لەو پەڕگانەی پێشتر بار کراون، بڕۆ بۆ [[Special:FileList|لیستی پەڕگە بارکراوەکان]]، ھەروەھا [[Special:Log/upload|ڕەشنووسی بارکردنەکان]] و [[Special:Log/delete|ڕەشنووسی سڕینەوەکان]].\n\nبۆ بەکارھێنانی پەڕگەیەک لە پەڕەیەکدا، بەستەرێک بە یەکێک لەم شێوازانەی خوارەوە بە کار بێنە:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' بۆ بەکارهێنانی وەشانی تەواوی پەڕگە\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|دەقی جێگر]]</nowiki></code>''' بۆ بەکارهێنانی نمایشێکی بە پانتایی ٢٠٠ پیکسەڵ لە چوارچێوەیەک لە لای چەپەوە بە «دەقی جێگر» وەک شرۆڤە\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' بۆ بەستەرپێدان بە پەڕگەکە بێ نیشاندانی خودی پەڕگەکە",
-       "upload-permitted": "جۆرە پەڕگە ڕێگەپێدراوەکان: $1.",
+       "upload-permitted": "جۆرە پەڕگە ڕێگەپێدراوەکان {{PLURAL:$2|type|types}}: $1.",
        "upload-preferred": "جۆرە پەڕگانەی بە باشتر دەزانرێن: $1.",
        "upload-prohibited": "جۆرە پەڕگانەی قەدەغە کراون: $1.",
        "uploadlogpage": "لۆگی بارکردن",
        "listfiles_size": "قەبارە",
        "listfiles_description": "وەسف",
        "listfiles_count": "وەشانەکان",
+       "listfiles-latestversion": "وەشانی ئێستا",
+       "listfiles-latestversion-yes": "بەڵێ",
+       "listfiles-latestversion-no": "نەخێر",
        "file-anchor-link": "پەڕگە",
        "filehist": "مێژووی پەڕگە",
        "filehist-help": "کرتە بکە لەسەر یەکێک لە ڕێکەوت/کاتەکان بۆ بینینی پەڕگەکە بەو شێوەی لەو کاتەدا بووە.",
        "randompage": "پەڕەی ھەڕەمەکی",
        "randompage-nopages": "هیچ لاپەڕەیەک لەم {{PLURAL:$2|ناوبۆشاییەدا|ناوبۆشاییانەدا}} نیە: $1.",
        "randomincategory": "پەڕەیەک بە ھەڵکەوت لە پۆلدا",
+       "randomincategory-submit": "بڕۆ",
        "randomredirect": "ڕەوانەکەری ھەڕەمەکی",
        "randomredirect-nopages": "لە ناوبۆشایی \"$1\" هیچ ڕەوانکەرێک نییە.",
        "statistics": "ئامارەکان",
        "nlinks": "$1 {{PLURAL:$1|بەستەر|بەستەر}}",
        "nmembers": "$1 {{PLURAL:$1|ئەندام|ئەندام}}",
        "nrevisions": "$1 {{PLURAL:$1|پیاچوونەوە|پیاچوونەوە}}",
-       "nviews": "$1 جار {{PLURAL:$1|بینراو|بینراو}}",
        "specialpage-empty": "ئەنجامێک بۆ ئەم ڕاپۆرتە نییە.",
        "lonelypages": "پەڕە ھەتیوەکان",
        "lonelypagestext": "پەڕەکانی خوارەوە لە پەڕەکانی تری {{SITENAME}}ەوە لینکیان بۆ نەدراوە و نەھێنراونەتە نێو ھیچ پەڕەیەکی تر.",
        "linksearch-pat": "گەڕان بۆ نواندن:",
        "linksearch-ns": "بۆشاییی ناو:",
        "linksearch-ok": "گەڕان",
-       "linksearch-text": "Wildcardی وەک \"*.wikipedia.org\" بەکاردێت.\nلانی کەم پێویستی بە پاوانێکی ئاست-بان ھەیە، بۆ نموونە «*.org» .<br />\nپرۆتۆکۆلە پشتیوانی لێکراوەکان: <code>$1</code> (ھیچ کام لەمانە بە گەڕانەکەت زێدە مەکە).",
+       "linksearch-text": "Wildcardی وەک \"*.wikipedia.org\" بەکاردێت.\nلانی کەم پێویستی بە پاوانێکی ئاست-بان ھەیە، بۆ نموونە «*.org» .<br />\nپرۆتۆکۆلە پشتیوانی لێکراوەکان: $1 (ھیچ کام لەمانە بە گەڕانەکەت زێدە مەکە).",
        "linksearch-line": "$1 بەستەرپێ‌دراو لە $2",
        "listusersfrom": "نیشاندانی بەکارھێنەران بە دەستپێکردن لە:",
        "listusers-submit": "نیشانیبدە",
        "revertpage-nouser": "دەستکارییەکانی بەکارھێنەرێکی شاڕدراوە بۆ دوایین پێداچوونەوەی {{GENDER:$1|[[User:$1|$1]]}} گەڕێنرایەوە.",
        "rollback-success": "دەستکارییەکانی $1 وەرگێرایەوە؛<br />\nگۆڕدرا بۆ دوایین پێداچوونەوەی $2.",
        "sessionfailure": "لەوەدەچی کێشەیەک لە دانیشتنی چوونەژوورەوەت (login session)دا ببێت.\nئەم کردەوە هەڵوەشێندرایەوە بۆ بەرگری لە دزینی دراوەکانی دانیشتن.\nتکایە بگەڕێوە بۆ پەڕەی پێشوو و نوێی بکەوە، ئینجا دیسان تاقیی بکەوە.",
+       "changecontentmodel-title-label": "سەردێڕی پەڕە",
+       "changecontentmodel-reason-label": "هۆکار:",
        "protectlogpage": "لۆگی پاراستن",
        "protectlogtext": "لە ژێرەوە پێرستێک لە گۆڕانکارییەکانی پەڕە پارێزراوەکان دەبینی.\nبۆ پێرستی ئەو پەڕانەی ئێستا پاراستنیان لە ئارادایە بڕوانە [[Special:ProtectedPages|پێرستی پەڕە پارێزراوەکان]].",
        "protectedarticle": "«[[$1]]»ی پاراست",
        "tooltip-pt-login": "پێشنیارت پێدەکرێ بچیتە ژوورەوە؛ ھەرچەندە زۆرت لێناکرێ",
        "tooltip-pt-logout": "دەرچوون",
        "tooltip-ca-talk": "لێدوان دەربارەی ناوەڕۆکی پەرە",
-       "tooltip-ca-edit": "دÛ\95تÙ\88اÙ\86Û\8c Ø¯Û\95ستکارÛ\8cÛ\8c Ø¦Û\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 Ø¨Ú©Û\95Û\8cت. ØªÚ©Ø§Û\8cÛ\95 Ù¾Û\8eØ´ Ù¾Ø§Ø´Û\95Ú©Û\95Ù\88تکردÙ\86 Ø¯Ù\88Ú¯Ù\85Û\95Û\8c Ù¾Û\8eشبÛ\8cÙ\86Û\8cÙ\86 Ø¨Û\95کاربÛ\8eÙ\86Û\95.",
+       "tooltip-ca-edit": "دÛ\95ستکارÛ\8c Ø¦Û\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 Ø¨Ú©Û\95â\80\8c",
        "tooltip-ca-addsection": "بەشێکی نوێ دەست پێ بکە",
        "tooltip-ca-viewsource": "ئەم پەڕەیە پارێزراوە.\nئەتوانی سەرچاوەکەی ببینیت",
        "tooltip-ca-history": "وەشانەکانی پێشووی ئەم پەڕەیە",
        "pageinfo-robot-index": "ڕێ پێدراو",
        "pageinfo-robot-noindex": "ڕێ پێنەدراوه",
        "pageinfo-watchers": "ژمارەی چاودێرانی پەڕە",
+       "pageinfo-visiting-watchers": "ژمارەی ئەو بینەرانە کە دوایین دەستکارییەکانیان چاو پێکەوتووە.",
        "pageinfo-few-watchers": "کەمتر لە $1 {{PLURAL:$1|چاودێر}}",
        "pageinfo-redirects-name": "ژمارەی ڕەوانەکەرەکان بۆ ئەم پەڕەیە",
        "pageinfo-subpages-name": "ژێرپەڕەکانی ئەم پەڕەیە",
        "version-software-product": "بەرهەم",
        "version-software-version": "وەشان",
        "version-entrypoints-header-url": "ناونیشانی ئینتەرنێتی",
+       "version-libraries-license": "مۆڵەت",
+       "version-libraries-description": "وەسف",
+       "version-libraries-authors": "نووسەر",
        "redirect": "ڕەوانەکەر بە پێی پەڕگە، بەکارھێنەر، پەڕە یان پێناسەی پێداچوونەوە",
        "redirect-legend": "ڕەوانەکەر بۆ پەڕگە یان پەڕەیەک",
        "redirect-summary": "ئەم پەڕە تایبەتە ڕەوانە دەکرێ بۆ پەڕگەیەک (ناوی پەڕگەکە)، پەڕەیەک (پێناسەی پێداچوونەوەیەک یان پێناسەی پەڕە) یان پەڕەیەکی بەکارھێنەر (پێناسەیەکی  ژمارەیی بەکارھێنەر). بەکارھێنان: [[{{#Special:Redirect}}/file/Example.jpg]]، [[{{#Special:Redirect}}/page/64308]]، [[{{#Special:Redirect}}/revision/328429]] یان [[{{#Special:Redirect}}/user/101]].",
        "htmlform-selectorother-other": "دیکە",
        "htmlform-no": "نا",
        "htmlform-yes": "بەڵێ",
+       "htmlform-title-not-creatable": "پەڕە بە سەردێڕی \"$1\" دروست ناکرێت",
+       "htmlform-title-not-exists": "[[$1]] بوونی نیە.",
        "logentry-delete-delete": "$1 پەڕەی $3ی {{GENDER:$2|سڕییەوە}}",
        "logentry-delete-restore": "$1 پەڕەی $3ی {{GENDER:$2|ھێنایەوە}}",
        "logentry-delete-revision": "$1 دەرکەوتنی {{PLURAL:$5|پێداچوونەوەیەکی|$5 پێداچوونەوەی}} پەڕەی $3ی {{GENDER:$2|گۆڕیی}}: $4",
index 2c88d50..e20c3eb 100644 (file)
        "protectedinterface": "Tato stránka obsahuje text softwarového rozhraní a je zamčena kvůli prevenci zneužití.\nPro přidávání a změny překladů pro všechny wiki použijte [//translatewiki.net/ translatewiki.net], projekt pro lokalizaci MediaWiki.",
        "editinginterface": "<strong>Upozornění:</strong> Editujete stránku, která definuje texty rozhraní.\nZměny této stránky ovlivní vzhled uživatelského rozhraní všem uživatelům této wiki.",
        "translateinterface": "Pro přidávání a změny překladů pro všechny wiki použijte [//translatewiki.net/ translatewiki.net], projekt pro lokalizaci MediaWiki.",
-       "cascadeprotected": "Tato stránka je zamčena, neboť je vložena do {{PLURAL:$1|následující stránky, zamčené|následujících stránek, zamčených|následujících stránek, zamčených}} kaskádovým zámkem:\n$2",
+       "cascadeprotected": "Tato stránka je zamčena, neboť je vložena na {{PLURAL:$1|následující stránku, zamčenou|následující stránky, zamčené}} kaskádovým zámkem:\n$2",
        "namespaceprotected": "Nemáte povoleno editovat stránky ve jmenném prostoru '''$1'''.",
        "customcssprotected": "Nemáte povoleno editovat tuto stránku s CSS, protože obsahuje osobní nastavení jiného uživatele.",
        "customjsprotected": "Nemáte povoleno editovat tuto stránku s JavaScriptem, protože obsahuje osobní nastavení jiného uživatele.",
        "readonlywarning": "<strong>Varování: Databáze byla uzamčena kvůli údržbě, takže momentálně nebudete moci uložit své změny.</strong>\nMůžete si okopírovat text do souboru a uložit si ho na později.\n\nSprávce serveru, který databázi zamkl, poskytl toto zdůvodnění: $1",
        "protectedpagewarning": "'''Varování: Tato stránka byla zamčena, takže ji mohou editovat pouze správci.'''\nNíže je pro přehled zobrazen nejnovější protokolovací záznam:",
        "semiprotectedpagewarning": "'''Poznámka:''' Tato stránka byla zamčena, takže ji mohou editovat pouze registrovaní uživatelé.\nNíže je pro přehled zobrazen nejnovější protokolovací záznam:",
-       "cascadeprotectedwarning": "'''Varování:''' Tato stránka byla zamčena, takže ji mohou editovat pouze správci. Je vložena na následující, kaskádním zámkem  {{PLURAL:$1|zamčenou, stránku|zamčené, stránky|zamčené, stránky}}:",
+       "cascadeprotectedwarning": "<strong>Varování:</strong> Tato stránka byla zamčena, takže ji mohou editovat pouze správci, protože je vložena na následující, kaskádovým zámkem {{PLURAL:$1|zamčenou, stránku|zamčené, stránky}}:",
        "titleprotectedwarning": "'''Varování: Tato stránka byla uzamčena, takže k jejímu založení jsou potřeba [[Special:ListGroupRights|zvláštní oprávnění]].'''\nNíže je pro přehled zobrazen nejnovější protokolovací záznam:",
        "templatesused": "{{PLURAL:$1|Šablona použitá|Šablony použité}} na této stránce:",
        "templatesusedpreview": "{{PLURAL:$1|Šablona použitá|Šablony použité}} v tomto náhledu:",
        "linksearch-pat": "Vyhledávací vzor:",
        "linksearch-ns": "Jmenný prostor:",
        "linksearch-ok": "Hledat",
-       "linksearch-text": "Lze používat zástupné znaky, např. „*.wikipedia.org“.\nPovinná je přinejmenším doména nejvyššího řádu, např. „*.org“.<br />\n{{PLURAL:$2|Podporovaný protokol|Podporované protokoly}}: <code>$1</code> (pokud není protokol uveden, použije se http://).",
+       "linksearch-text": "Lze používat zástupné znaky, např. „*.wikipedia.org“.\nPovinná je přinejmenším doména nejvyššího řádu, např. „*.org“.<br />\n{{PLURAL:$2|Podporovaný protokol|Podporované protokoly}}: $1 (pokud není protokol uveden, použije se http://).",
        "linksearch-line": "$2 odkazuje na $1",
        "linksearch-error": "Zástupné znaky lze použít jen na začátku doménového jména.",
        "listusersfrom": "Zobrazit uživatele počínaje od:",
        "htmlform-cloner-create": "Přidat další",
        "htmlform-cloner-delete": "Odstranit",
        "htmlform-cloner-required": "Je povinná nejméně jedna hodnota.",
+       "htmlform-title-badnamespace": "Stránka [[:$1]] není ve jmenném prostoru „{{ns:$2}}“.",
+       "htmlform-title-not-creatable": "Pod názvem „$1“ nelze vytvořit stránku",
+       "htmlform-title-not-exists": "Stránka [[:$1]] neexistuje.",
+       "htmlform-user-not-exists": "Uživatel <strong>$1</strong> neexistuje.",
+       "htmlform-user-not-valid": "<strong>$1</strong> není platné uživatelské jméno.",
        "sqlite-has-fts": "$1 s podporou plnotextového vyhledávání",
        "sqlite-no-fts": "$1 bez podpory plnotextového vyhledávání",
        "logentry-delete-delete": "$1 {{GENDER:$2|smazal|smazala}} stránku $3",
index 8f3d87b..3c0a78e 100644 (file)
        "emailccme": "Çыру копине ман пата ямалла",
        "emailsent": "Çырăва леçрĕмĕр",
        "emailsenttext": "Сирĕн электронлă çырăва леçрĕмĕр.",
-       "watchlist": "Ð\9fÄ\83Ñ\85Ñ\81а Ñ\82Ä\83Ñ\80акан Ñ\81Ñ\82Ñ\80аниÑ\86Ä\83Ñ\81ем Ñ\8fÑ\82-йÑ\8bÑ\88ĕ",
+       "watchlist": "Ð\9fÄ\83Ñ\85Ñ\81а Ñ\82Ä\83Ñ\80акан Ñ\81Ñ\82Ñ\80аниÑ\86Ä\83Ñ\81ен Ñ\81пиÑ\81окĕ",
        "mywatchlist": "Сăнаса тăракан списокĕ",
        "watchlistfor2": "$1 валли $2",
        "nowatchlist": "Эсир пăхса тăракан страницăсен списокĕ пушă.",
        "blanknamespace": "(Тĕп)",
        "contributions": "{{GENDER:$1|Усă куракан}} ӳсĕмĕсем",
        "contributions-title": "Усă куракан $1 хушни",
-       "mycontris": "Ӳсĕм",
+       "mycontris": "Хушни",
        "contribsub2": "{{GENDER:$3|$1}} валли ($2)",
        "uctop": "(хальхи)",
        "month": "Уйăхран (тата маларах):",
        "specialpages-group-media": "Медиа-материалсемпе тултарăшсем",
        "specialpages-group-users": "Хутшăнакансем тата правасем",
        "specialpages-group-highuse": "Нумай усă куракан страницăсем",
+       "compare-submit": "Танлаштар",
        "htmlform-selectorother-other": "Урăххи",
        "htmlform-no": "Çук",
        "logentry-move-move": "$1 страницă {{GENDER:$2|ятне улăштарчĕ}} $3 - $4",
index 0ee2be7..b67d4a6 100644 (file)
        "linksearch-pat": "Patrwm chwilio:",
        "linksearch-ns": "Parth:",
        "linksearch-ok": "Chwilio",
-       "linksearch-text": "Gellir defnyddio cardiau gwyllt megis \"*.wikipedia.org\".\nMae angen parth lefel-uchaf o leiaf, er enghraifft \"*.org\".<br />\n{{PLURAL:$2|Protocol|Protocol|Protocoliau}} sy'n cael eu cynnal: <code>$1</code> (yn neidio i http:// os na roddir protocol o gwbl).",
+       "linksearch-text": "Gellir defnyddio cardiau gwyllt megis \"*.wikipedia.org\".\nMae angen parth lefel-uchaf o leiaf, er enghraifft \"*.org\".<br />\n{{PLURAL:$2|Protocol|Protocol|Protocoliau}} sy'n cael eu cynnal: $1 (yn neidio i http:// os na roddir protocol o gwbl).",
        "linksearch-line": "Mae cysylltiad i gael i $1 oddi wrth $2",
        "linksearch-error": "Dim ond ar ddechrau enw'r gwesteiwr y gallwch osod cardiau gwyllt.",
        "listusersfrom": "Dangos y defnyddwyr gan ddechrau â:",
index cc2c9a5..0f8b6ce 100644 (file)
        "passwordreset": "Nulstil adgangskode",
        "passwordreset-text-one": "Udfyld denne formular for at nulstille din adgangskode.",
        "passwordreset-text-many": "{{PLURAL:$1|Udfyld et af felterne for at modtage en midlertidig adgangskode via e-mail.}}",
-       "passwordreset-legend": "Nulstil adgangskode",
        "passwordreset-disabled": "Nulstilling af adgangskode er slået fra på denne wiki.",
        "passwordreset-emaildisabled": "E-mailfunktioner er slået fra på denne wiki.",
        "passwordreset-username": "Brugernavn:",
        "resettokens": "Nulstil nøgler",
        "resettokens-text": "Du kan nulstille nøgler, som giver adgang til visse private data i forbindelse med din konto her.\n\nDu bør gøre det, hvis du ved et uheld deler dem med nogen, eller hvis din konto er blevet kompromitteret.",
        "resettokens-no-tokens": "Der er ingen nøgler at nulstille.",
-       "resettokens-legend": "Nulstil nøgler",
        "resettokens-tokens": "Nøgler:",
        "resettokens-token-label": "$1 (aktuel værdi: $2)",
        "resettokens-watchlist-token": "Nøgle for web-feed (Atom/RSS) af [[Special:Watchlist|ændringer af sider på din overvågningsliste]]",
        "randomincategory-nopages": "Der er ingen sider i [[:Category:$1]].",
        "randomincategory-category": "Kategori:",
        "randomincategory-legend": "Tilfældig side i en given kategori",
+       "randomincategory-submit": "Udfør",
        "randomredirect": "Tilfældige henvisninger",
        "randomredirect-nopages": "Der er ingen omdirigeringer i navnerummet $1.",
        "statistics": "Statistik",
        "nmembers": "$1 {{PLURAL:$1|medlem|medlemmer}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|medlem|medlemmer}}",
        "nrevisions": "{{PLURAL:$1|1 ændring|$1 ændringer}}",
-       "nviews": "{{PLURAL:$1|1 visning|$1 visninger}}",
        "nimagelinks": "Brugt på $1 {{PLURAL:$1|side|sider}}",
        "ntransclusions": "brugt på $1 {{PLURAL:$1|side|sider}}",
        "specialpage-empty": "Der er ingen resultater at vise.",
        "linksearch-pat": "Søg efter links til:",
        "linksearch-ns": "Navnerum:",
        "linksearch-ok": "Søg",
-       "linksearch-text": "Wildcards som \"*.wikipedia.org\" kan benyttes.\nDer skal som minimum angives et topniveau-domæne som f. eks. \"*.org\".<br />\n{{PLURAL:$2|Understøttet protokol|Understøttede protokoller}}: <code>$1</code> (bruger automatisk http:// hvis der ikke er angivet nogen protokol).",
+       "linksearch-text": "Wildcards som \"*.wikipedia.org\" kan benyttes.\nDer skal som minimum angives et topniveau-domæne som f. eks. \"*.org\".<br />\n{{PLURAL:$2|Understøttet protokol|Understøttede protokoller}}: $1 (bruger automatisk http:// hvis der ikke er angivet nogen protokol).",
        "linksearch-line": "$2 linker til $1",
        "linksearch-error": "Wildcards må kun benyttes i starten af hostnavnet.",
        "listusersfrom": "Vis brugere fra:",
index eb9d933..9b744ee 100644 (file)
@@ -85,7 +85,7 @@
        "tog-hideminor": "Kleine Änderungen in den „Letzten Änderungen“ ausblenden",
        "tog-hidepatrolled": "Kontrollierte Änderungen in den „Letzten Änderungen“ ausblenden",
        "tog-newpageshidepatrolled": "Kontrollierte Seiten bei den „Neuen Seiten“ ausblenden",
-       "tog-extendwatchlist": "In der Beobachtungsliste alle Änderungen anzeigen, nicht nur die aktuellsten",
+       "tog-extendwatchlist": "In der Beobachtungsliste alle und nicht nur die aktuellsten Änderungen anzeigen",
        "tog-usenewrc": "Änderungen auf „Letzte Änderungen“ und der Beobachtungsliste nach Seite gruppieren",
        "tog-numberheadings": "Überschriften automatisch nummerieren",
        "tog-showtoolbar": "Bearbeiten-Werkzeugleiste anzeigen",
        "readonlywarning": "'''Achtung: Die Datenbank wurde für Wartungsarbeiten gesperrt, so dass deine Änderungen derzeit nicht gespeichert werden können.\nSichere den Text bitte lokal auf deinem Computer und versuche zu einem späteren Zeitpunkt, die Änderungen zu übertragen.'''\n\nGrund für die Sperre: $1",
        "protectedpagewarning": "'''Achtung: Diese Seite wurde geschützt. Nur Benutzer mit Administratorrechten können die Seite bearbeiten.'''\nZur Information folgt der aktuelle Logbucheintrag:",
        "semiprotectedpagewarning": "'''Halbsperrung:''' Die Seite wurde so geschützt, dass nur registrierte Benutzer diese ändern können.\nZur Information folgt der aktuelle Logbucheintrag:",
-       "cascadeprotectedwarning": "'''Achtung:''' Diese Seite wurde so geschützt, dass sie nur durch Benutzer mit Administratorrechten bearbeitet werden kann. Sie ist in die {{PLURAL:$1|folgende Seite|folgenden Seiten}} eingebunden, die mittels der Kaskadensperroption geschützt {{PLURAL:$1|ist|sind}}:",
+       "cascadeprotectedwarning": "<strong>Achtung:</strong> Diese Seite wurde so geschützt, dass sie nur durch Benutzer mit Administratorrechten bearbeitet werden kann. Sie ist in die {{PLURAL:$1|folgende Seite|folgenden Seiten}} eingebunden, die mittels der Kaskadensperroption geschützt {{PLURAL:$1|ist|sind}}:",
        "titleprotectedwarning": "'''Achtung: Die Seitenerstellung wurde so geschützt, dass nur Benutzer mit [[Special:ListGroupRights|speziellen Rechten]] diese Seite erstellen können.'''\nZur Information folgt der aktuelle Logbucheintrag:",
        "templatesused": "{{PLURAL:$1|Die folgende Vorlage wird|Folgende Vorlagen werden}} auf dieser Seite verwendet:",
        "templatesusedpreview": "{{PLURAL:$1|Die folgende Vorlage wird|Folgende Vorlagen werden}} von dieser Seitenvorschau verwendet:",
        "badsig": "Die Syntax der Signatur ist ungültig; bitte HTML überprüfen.",
        "badsiglength": "Die Signatur darf maximal $1 {{PLURAL:$1|Zeichen}} lang sein.",
        "yourgender": "Welches Geschlecht hast du?",
-       "gender-unknown": "Beim Erwähnen deiner Person verwendet die Software geschlechtsneutrale Wörter, sofern möglich",
+       "gender-unknown": "Ich möchte hierzu keine Angabe machen – geschlechtsneutrale Anrede.",
        "gender-male": "Ich bin männlich",
        "gender-female": "Ich bin weiblich",
-       "prefs-help-gender": "Dies ist eine freiwillige Angabe.\nDie Software nutzt sie, um dich anzureden sowie als Hinweis für andere durch Verwendung des zutreffenden grammatikalischen Geschlechts.\nDiese Information ist öffentlich.",
+       "prefs-help-gender": "Dies ist eine freiwillige Angabe.\nDie Software nutzt sie, um dich anzureden sowie als Hinweis für andere durch Verwendung des zutreffenden grammatikalischen Geschlechts.\nDiese Information ist öffentlich zugänglich.",
        "email": "E-Mail",
        "prefs-help-realname": "Der bürgerliche Name ist optional.\nFalls angegeben, kann er verwendet werden, um dir eine Zuordnung für deine Beiträge zu geben.",
        "prefs-help-email": "Die Angabe einer E-Mail-Adresse ist optional, ermöglicht aber die Zusendung eines Ersatzpasswortes, sofern du dein Passwort vergessen hast.",
        "linksearch-pat": "Suchmuster:",
        "linksearch-ns": "Namensraum:",
        "linksearch-ok": "Suchen",
-       "linksearch-text": "Diese Spezialseite ermöglicht die Suche nach Seiten, in denen bestimmte Weblinks enthalten sind. Dabei können Platzhalter wie beispielsweise <code>*.beispiel.de</code> benutzt werden. Es muss mindestens eine Top-Level-Domain, z. B. „*.org“. angegeben werden. <br />{{PLURAL:$2|Unterstütztes Protokoll|Unterstützte Protokolle}}: <code>$1</code> (Standard ist http, falls kein Protokoll angegeben ist.)",
+       "linksearch-text": "Diese Spezialseite ermöglicht die Suche nach Seiten, in denen bestimmte Weblinks enthalten sind. Dabei können Platzhalter wie beispielsweise <code>*.beispiel.de</code> benutzt werden. Es muss mindestens eine Top-Level-Domain, z. B. „*.org“. angegeben werden. <br />{{PLURAL:$2|Unterstütztes Protokoll|Unterstützte Protokolle}}: $1 (Standard ist http, falls kein Protokoll angegeben ist.)",
        "linksearch-line": "$1 ist verlinkt von $2",
        "linksearch-error": "Wildcards können nur am Anfang der URL verwendet werden.",
        "listusersfrom": "Zeige Benutzer ab:",
        "tooltip-pt-anonuserpage": "Benutzerseite der IP-Adresse von der aus du Änderungen durchführst",
        "tooltip-pt-mytalk": "Deine Diskussionsseite",
        "tooltip-pt-anontalk": "Diskussion über Änderungen von dieser IP-Adresse",
-       "tooltip-pt-preferences": "Eigene Einstellungen",
-       "tooltip-pt-watchlist": "Liste der beobachteten Seiten",
+       "tooltip-pt-preferences": "Deine Einstellungen",
+       "tooltip-pt-watchlist": "Liste der von dir beobachteten Seiten",
        "tooltip-pt-mycontris": "Liste eigener Beiträge",
        "tooltip-pt-login": "Sich anzumelden wird gerne gesehen, ist jedoch nicht zwingend erforderlich.",
        "tooltip-pt-logout": "Abmelden",
        "specialpages-group-spam": "Spam-Werkzeuge",
        "specialpages-group-developer": "Entwicklerwerkzeuge",
        "blankpage": "Leere Seite",
-       "intentionallyblankpage": "Diese Seite ist absichtlich ohne Inhalt. Sie wird für Benchmarks verwendet.",
+       "intentionallyblankpage": "Diese Seite enthält absichtlich keinen Inhalt.",
        "external_image_whitelist": " #Diese Zeile nicht verändern.<pre>\n#Untenstehend können Fragmente regulärer Ausdrücke (der Teil zwischen den //) eingegeben werden.\n#Diese werden mit den URLs von Bildern aus externen Quellen verglichen.\n#Ein positiver Vergleich führt zur Anzeige des Bildes, andernfalls wird das Bild nur als Link angezeigt.\n#Zeilen, die mit einem # beginnen, werden als Kommentar behandelt.\n#Es wird nicht zwischen Groß- und Kleinschreibung unterschieden.\n\n#Fragmente regulärer Ausdrücke nach dieser Zeile eintragen. Diese Zeile nicht verändern.</pre>",
        "tags": "Gültige Änderungsmarkierungen",
        "tag-filter": "[[Special:Tags|Markierungs]]-Filter:",
        "htmlform-cloner-create": "Weitere hinzufügen",
        "htmlform-cloner-delete": "Entfernen",
        "htmlform-cloner-required": "Es ist mindestens ein Wert erforderlich.",
+       "htmlform-title-badnamespace": "[[:$1]] ist nicht im Namensraum „{{ns:$2}}“.",
+       "htmlform-title-not-creatable": "„$1“ ist kein erstellbarer Seitentitel",
+       "htmlform-title-not-exists": "[[:$1]] ist nicht vorhanden.",
+       "htmlform-user-not-exists": "<strong>$1</strong> ist nicht vorhanden.",
+       "htmlform-user-not-valid": "<strong>$1</strong> ist kein gültiger Benutzername.",
        "sqlite-has-fts": "Version $1 mit Unterstützung für die Volltextsuche",
        "sqlite-no-fts": "Version $1 ohne Unterstützung für die Volltextsuche",
        "logentry-delete-delete": "$1 {{GENDER:$2|löschte}} Seite $3",
index fc0c9ec..5db0c35 100644 (file)
        "passwordreset": "Parola reset ke",
        "passwordreset-text-one": "Na form de parola reset kerdış temamiye",
        "passwordreset-text-many": "{{PLURAL:$1|Qande parola yana e-posta reset kerdışi cayanra taynın pırkeri.}}",
-       "passwordreset-legend": "Parola reset ke",
        "passwordreset-disabled": "Parola reset kerdış ena viki sera qefılneyayo.",
        "passwordreset-emaildisabled": "Na wikid hısusiyeté e-posta dewera vıcyayé",
        "passwordreset-username": "Nameyê karberi:",
        "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ê.\n\nŞı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:",
        "resettokens-token-label": "$1 (weziyeto nıkaên: $2)",
        "resettokens-watchlist-token": "Web Feed rê nışan (Atom/RSS)ê [[Special:Watchlist|vêreno perranê lista şımawa seyrkerdışi]]",
        "randomincategory": "Ğoseri pera kategoriya",
        "randomincategory-invalidcategory": "\"$1\" yew nameyê kategoriya vêrdiye niyo.",
        "randomincategory-nopages": "Kategori da [[:Category:$1|$1]] de qet  per çıniya.",
+       "randomincategory-submit": "Şo",
        "randomredirect": "Serçarnayışo rastameye",
        "randomredirect-nopages": "Cayê nameyê \"$1\" de serşıkıtışi çıniyê.",
        "statistics": "İstatistiki",
        "nmembers": "$1 {{PLURAL:$1|eza|ezayan}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$1|eza|ezayan}}",
        "nrevisions": "$1 {{PLURAL:$1|vurnayış|vurnayışi}}",
-       "nviews": "$1 {{PLURAL:$1|vênayış|vênayışi}}",
        "nimagelinks": "$1 {{PLURAL:$1|pele de|pelan de}} gureyeno",
        "ntransclusions": "$1 {{PLURAL:$1|pele de|pelan de}} gureyeno",
        "specialpage-empty": "Seba na rapore netice çıniyo.",
        "linksearch-pat": "bıgêr motif:",
        "linksearch-ns": "Heruna namey:",
        "linksearch-ok": "Cı geyre",
-       "linksearch-text": "Jokeri ê zey \"*.wikipedia.org\"i benê ke bıgureniyê.\nTewr senık yew sewiya serêna cayê tesiri lazıma, mesela \"*.org\".<br />\nQeydeyê {{PLURAL:$2|protoqol|protoqoli}}:destegbiyayey: <code>$1</code> (qet yew qeydeyo hesabiyaye http:// ke name nêbiyo).",
+       "linksearch-text": "Jokeri ê zey \"*.wikipedia.org\"i benê ke bıgureniyê.\nTewr senık yew sewiya serêna cayê tesiri lazıma, mesela \"*.org\".<br />\nQeydeyê {{PLURAL:$2|protoqol|protoqoli}}:destegbiyayey: $1 (qet yew qeydeyo hesabiyaye http:// ke name nêbiyo).",
        "linksearch-line": "$1, $2 ra link biya",
        "linksearch-error": "jokeri têna nameyê makina ya serekini de aseni/eseni.",
        "listusersfrom": "karber ê ke pey ıney detpêkeni ramocın:",
index feab412..b7b1cb8 100644 (file)
        "passwordreset": "Gronidło slědk stajiś",
        "passwordreset-text-one": "Wupołni toś ten formular, aby swójo gronidło anulěrował.",
        "passwordreset-text-many": "{{PLURAL:$1|Wupołni jadne z pólow, aby nachylne gronidło pśez e-mail dostał.}}",
-       "passwordreset-legend": "Gronidło slědk stajiś",
        "passwordreset-disabled": "Slědkstajenja gronidłow su se znjemóžnili na toś tom wikiju.",
        "passwordreset-emaildisabled": "E-mailowe funkcije su se na toś tom wikiju znjemóžnili.",
        "passwordreset-username": "Wužywarske mě:",
        "resettokens": "Tokeny slědk stajiś",
        "resettokens-text": "Móžoš tokeny slědk stajiś, kótarež dowóluju pśistup na wěste priwatne daty, kótarež su z twójim kontom zwězane.\n\nTy by dejał to cyniś, jolic sy je zmylnje z někim źělił abo jolic twóje konto jo se nadpadało.",
        "resettokens-no-tokens": "Tokeny za slědkstajenje njejsu.",
-       "resettokens-legend": "Tokeny slědk stajiś",
        "resettokens-tokens": "Tokeny:",
        "resettokens-token-label": "$1 (aktualna gódnota: $2)",
        "resettokens-watchlist-token": "Token za webkanal (Atom/RSS) [[Special:Watchlist|změnow na bokach w twójich woglědowankach]]",
        "randomincategory": "Pśipadny bok w kategoriji",
        "randomincategory-invalidcategory": "\"$1\" njejo płaśiwe kategorijowe mě.",
        "randomincategory-nopages": "W kategoriji [[:Category:$1|$1]] žedne boki njejsu.",
+       "randomincategory-submit": "W pórěźe",
        "randomredirect": "Pśipadne dalejpósrědnjenje",
        "randomredirect-nopages": "W mjenjowem rumje \"$1\" njejsu dalejpósrědnjenja.",
        "statistics": "Statistika",
        "nmembers": "$1 {{PLURAL:$1|zapis|zapisa|zapise}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|cłon|cłonka|cłonki|cłonkow}}",
        "nrevisions": "$1 {{PLURAL:$1|wobźěłanje|wobźěłani|wobźěłanja}}",
-       "nviews": "$1 {{PLURAL:$1|wótpšašanje|wótpšašani|wótpšašanja}}",
        "nimagelinks": "Wužywa se na $1 {{PLURAL:$1|boku|bokoma|bokach|bokach}}",
        "ntransclusions": "wužywa se na $1 {{PLURAL:$1|boku|bokoma|bokach|bokach}}",
        "specialpage-empty": "Toś ten bok njewopśimjejo tuchylu žedne zapise.",
        "linksearch-pat": "Pytański muster:",
        "linksearch-ns": "Mjenjowy rum:",
        "linksearch-ok": "Pytaś",
-       "linksearch-text": "Jo móžno zastupne znamuška kaž \"*.wikipedia.org\" wužywaś. \nJo nanejmjenjej głowna domena trěbna, na pśikład \"*.org\"<br />\n{{PLURAL:$2|Pódpěrany protokol|Pódpěranej protokola|Pódpěrane protokole}}: <code>$1</code> (standard jo http://, jolic žeden protokol njejo pódany).",
+       "linksearch-text": "Jo móžno zastupne znamuška kaž \"*.wikipedia.org\" wužywaś. \nJo nanejmjenjej głowna domena trěbna, na pśikład \"*.org\"<br />\n{{PLURAL:$2|Pódpěrany protokol|Pódpěranej protokola|Pódpěrane protokole}}: $1 (standard jo http://, jolic žeden protokol njejo pódany).",
        "linksearch-line": "$1 wótkazany z $2",
        "linksearch-error": "Zasupne znamješko daju se jano na zachopjeńku URL wužywaś.",
        "listusersfrom": "Pokaž wužywarjow wót:",
index b7fb79a..d317838 100644 (file)
@@ -41,7 +41,8 @@
                        "Auslaender",
                        "Milicevic01",
                        "Ah3kal",
-                       "Macofe"
+                       "Macofe",
+                       "Stam.nikos"
                ]
        },
        "tog-underline": "Υπογράμμιση συνδέσμων:",
        "protectedinterface": "Αυτή η σελίδα παρέχει κείμενο διεπαφής για το λογισμικό σε αυτό το wiki, και έχει κλειδωθεί για την πρόληψη κατάχρησης.\n\nΓια να προσθέσετε ή να αλλάξετε τις μεταφράσεις για όλα τα wiki, παρακαλούμε χρησιμοποιήστε το [//translatewiki.net/ translatewiki.net], το εγχείρημα τοπικής προσαρμογής της γλώσσας του MediaWiki.",
        "editinginterface": "<strong>Προειδοποίηση:</strong> Επεξεργάζεστε μια σελίδα η οποία χρησιμοποιείται για να παρέχει κείμενο διεπαφής για το λογισμικό. Αλλαγές σε αυτήν τη σελίδα θα επηρεάσουν την εμφάνιση της διεπαφής χρήστη για άλλους χρήστες αυτού του wiki.",
        "translateinterface": "Για να προσθέσετε ή να αλλάξετε τις μεταφράσεις για όλα τα wiki, παρακαλούμε χρησιμοποιήστε το [//translatewiki.net/ translatewiki.net], το έργο τοπικοποίησης του MediaWiki.",
-       "cascadeprotected": "Αυτή η σελίδα έχει προστατευθεί από επεξεργασία, επειδή περιλαμβάνεται {{PLURAL:$1|στην ακόλουθη σελίδα, που είναι προστατευμένη|στις ακόλουθες σελίδες, που είναι προστατευμένες}} με ενεργοποιημένη τη «διαδοχική» προστασία στο:\n$2",
+       "cascadeprotected": "Αυτή η σελίδα έχει προστατευθεί από επεξεργασία, επειδή ενσωματώνεται {{PLURAL:$1|στην ακόλουθη σελίδα, που είναι προστατευμένη|στις ακόλουθες σελίδες, που είναι προστατευμένες}} με ενεργοποιημένη τη «διαδοχική» προστασία στο:\n$2",
        "namespaceprotected": "Δεν έχετε άδεια να επεξεργάζεστε σελίδες στον τομέα '''$1'''.",
        "customcssprotected": "Δεν έχετε δικαιώματα για να επεξεργαστείτε αυτή τη σελίδα CSS, επειδή περιέχει προσωπικές ρυθμίσεις άλλου χρήστη.",
        "customjsprotected": "Δεν έχετε δικαιώματα για να επεξεργαστείτε αυτή τη σελίδα JavaScript, επειδή περιέχει προσωπικές ρυθμίσεις άλλου χρήστη.",
        "creating": "Δημιουργία: $1",
        "editingsection": "Επεξεργασία $1 (ενότητα)",
        "editingcomment": "Επεξεργασία $1 (νέο τμήμα)",
-       "editconflict": "Î\9fι Î±Î»Î»Î±Î³Î­Ï\82 Ï\83αÏ\82 Î´ÎµÎ½ Î±Ï\80οθηκεÏ\8dÏ\84ηκαν Î»Ï\8cγÏ\89 Ï\83Ï\8dγκÏ\81οÏ\85Ï\83ηÏ\82 ÎµÏ\80εξεÏ\81γαÏ\83ίαÏ\82. Î\98α {{GENDER:|θέλαÏ\84ε}}  Î½Î± ÎµÏ\80ιλÏ\8dÏ\83εÏ\84ε Ï\84ην Ï\83Ï\8dγκÏ\81οÏ\85Ï\83η Ï\87ειÏ\81οκίνηÏ\84α;",
+       "editconflict": "ΣÏ\8dγκÏ\81οÏ\85Ï\83η ÎµÏ\80εξεÏ\81γαÏ\83ίαÏ\82: $1",
        "explainconflict": "Κάποιος άλλος χρήστης έχει αλλάξει αυτή τη σελίδα από τότε που αρχίσατε να την επεξεργάζεστε.\nΣτο επάνω τμήμα βρίσκεται το τρέχον κείμενο της σελίδας.\nΟι δικές σας αλλαγές εμφανίζονται στο κάτω τμήμα.\nΘα πρέπει να ενσωματώσετε τις αλλαγές σας στο τρέχον κείμενο.\n'''Μόνο''' το επάνω τμήμα θα αποθηκευθεί όταν πατήσετε \"{{int:savearticle}}\".",
        "yourtext": "Το κείμενό σας",
        "storedversion": "Αποθηκευμένη έκδοση",
        "content-model-css": "CSS",
        "content-json-empty-object": "Κενό αντικείμενο",
        "content-json-empty-array": "Κενός πίνακα",
+       "duplicate-args-warning": "<strong>Προειδοποίηση:</strong> Η σελίδα [[:$1]] καλεί το πρότυπο [[:$2]] με περισσότερες από μία τιμές για την παράμετρο \"$3\". Μόνο η τελευταία παρεχόμενη τιμή θα χρησιμοποιηθεί.",
        "duplicate-args-category": "Σελίδες που χρησιμοποιούν διπλές παραμέτρους σε κλήσεις προτύπων",
        "duplicate-args-category-desc": "Η σελίδα περιέχει κλήσεις πρότυπων που χρησιμοποιούν διπλές παραμέτρους, όπως <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Προειδοποίηση: Αυτή η σελίδα περιέχει πάρα πολύ ακριβό αναλυτή λειτουργικών κλήσεων.\n\nΠρέπει να περιέχει λιγότερες από $2 {{PLURAL:$2|κλήση|κλήσεις}}, τώρα {{PLURAL:$1|υπάρχει $1 κλήση|υπάρχουν $1 κλήσεις}}.",
        "upload-scripted-pi-callback": "Δεν είναι δυνατό να ανεβάσετε αρχείο που περιέχει οδηγία επεξεργασίας φύλλου στυλ XML.",
        "uploaded-script-svg": "Βρέθηκε στοιχείο με δυνατότητα δημιουργίας δέσμης ενεργειών «$1» στο ανεβασμένο αρχείο SVG.",
        "uploaded-hostile-svg": "Βρέθηκε μη ασφαλές CSS στο στοιχείο στυλ του ανεβασμένου αρχείου SVG.",
+       "uploaded-event-handler-on-svg": "Δεν επιτρέπεται ο ορισμός ιδιοτήτων χειρισμού συμβάντων <code>$1=\"$2\"</code> σε αρχεία SVG.",
+       "uploaded-href-attribute-svg": "Δεν επιτρέπονται οι ιδιότητες href <code>&lt;$1 $2=\"$3\"&gt;</code> με μη τοπικό προορισμό (π.χ. http://, javascript:, κ.τ.λ.) σε αρχεία SVG.",
+       "uploaded-href-unsafe-target-svg": "Βρέθηκε href προς έναν μη ασφαλή προορισμό <code>&lt;$1 $2=\"$3\"&gt;</code> στο ανεβασμένο αρχείο SVG.",
        "uploaded-setting-href-svg": "Η χρήση της ετικέτας «set» για την προσθήκη του χαρακτηριστικού «href» στο γονικό στοιχείο είναι αποκλεισμένη.",
        "uploaded-wrong-setting-svg": "Η χρήση της ετικέτας «set» για την προσθήκη απομακρυσμένου προορισμού/προορισμού δεδομένων/προορισμού δέσμης ενεργειών είναι αποκλεισμένη. Βρέθηκε <code>&lt;set to=\"$1\"&gt;</code> στο ανεβασμένο αρχείο SVG.",
        "uploaded-setting-handler-svg": "Κάθε SVG που θέτει το χαρακτηριστικό «χειρισμού» με απομακρυσμένο προορισμό/προορισμό δεδομένων/προορισμό δέσμης ενεργειών είναι αποκλεισμένο. Βρέθηκε <code>$1=\"$2\"</code> στο ανεβασμένο αρχείο SVG.",
        "linksearch-pat": "Μοτίβο αναζήτησης:",
        "linksearch-ns": "Περιοχή:",
        "linksearch-ok": "Αναζήτηση",
-       "linksearch-text": "Μπορούν να χρησιμοποιηθούν χαρακτήρες μπαλαντέρ όπως \"*.wikipedia.org\". \nΧρειάζεται τουλάχιστον μια κατάληξη ανωτάτου επιπέδου, για παράδειγμα \"*.org\".<br />\n{{PLURAL:$2|Υποστηριζόμενο πρωτόκολλο|Υποστηριζόμενα πρωτόκολλα}}: <code>$1</code> (αν δεν οριστεί πρωτόκολλο η προεπιλογή είναι http://).",
+       "linksearch-text": "Μπορούν να χρησιμοποιηθούν χαρακτήρες μπαλαντέρ όπως \"*.wikipedia.org\". \nΧρειάζεται τουλάχιστον μια κατάληξη ανωτάτου επιπέδου, για παράδειγμα \"*.org\".<br />\n{{PLURAL:$2|Υποστηριζόμενο πρωτόκολλο|Υποστηριζόμενα πρωτόκολλα}}: $1 (αν δεν οριστεί πρωτόκολλο η προεπιλογή είναι http://).",
        "linksearch-line": "Η σελίδα $1 συνδέεται από την $2",
        "linksearch-error": "Λέξεις-μπαλαντέρ μπορεί να εμφανιστούν μόνο στην αρχή τού ονόματος ιστοτόπου (hostname).",
        "listusersfrom": "Προβολή χρηστών ξεκινώντας από:",
        "tooltip-pt-logout": "Έξοδος",
        "tooltip-pt-createaccount": "Σας ενθαρρύνουμε να δημιουργήσετε ένα λογαριασμό και να συνδεθείτε· ωστόσο, δεν είναι υποχρεωτικό",
        "tooltip-ca-talk": "Συζήτηση για τη σελίδα περιεχομένου",
-       "tooltip-ca-edit": "Î\9cÏ\80οÏ\81είÏ\84ε Î½Î± ÎµÏ\80εξεÏ\81γαÏ\83Ï\84είÏ\84ε Î±Ï\85Ï\84ή Ï\84η Ï\83ελίδα. Î Î±Ï\81ακαλοÏ\8dμε Ï\87Ï\81ηÏ\83ιμοÏ\80οιήÏ\83Ï\84ε Ï\84ο ÎºÎ¿Ï\85μÏ\80ί Ï\80Ï\81οεÏ\80ιÏ\83κÏ\8cÏ\80ηÏ\83ηÏ\82 Ï\80Ï\81ιν Ï\84ην Î±Ï\80οθήκεÏ\85Ï\83η.",
+       "tooltip-ca-edit": "Î\95Ï\80εξεÏ\81γαÏ\83ία Î±Ï\85Ï\84ήÏ\82 Ï\84ηÏ\82 Ï\83ελίδαÏ\82",
        "tooltip-ca-addsection": "Ξεκίνημα νέας ενότητας",
        "tooltip-ca-viewsource": "Αυτή η σελίδα είναι προστατευμένη.\nΜπορείτε να προβάλετε τον πηγαίο της κώδικα.",
        "tooltip-ca-history": "Παλιές αναθεωρήσεις του άρθρου.",
index 3a47bce..1fdd75d 100644 (file)
        "protectedinterface": "This page provides interface text for the software on this wiki, and is protected to prevent abuse.\nTo add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
        "editinginterface": "<strong>Warning:</strong> You are editing a page that is used to provide interface text for the software.\nChanges to this page will affect the appearance of the user interface for other users on this wiki.",
        "translateinterface": "To add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
-       "cascadeprotected": "This page has been protected from editing because it is included in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the \"cascading\" option turned on:\n$2",
+       "cascadeprotected": "This page has been protected from editing because it is transcluded in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the \"cascading\" option turned on:\n$2",
        "namespaceprotected": "You do not have permission to edit pages in the <strong>$1</strong> namespace.",
        "customcssprotected": "You do not have permission to edit this CSS page because it contains another user's personal settings.",
        "customjsprotected": "You do not have permission to edit this JavaScript page because it contains another user's personal settings.",
        "readonlywarning": "<strong>Warning: The database has been locked for maintenance, so you will not be able to save your edits right now.</strong>\nYou may wish to copy and paste your text into a text file and save it for later.\n\nThe administrator who locked it offered this explanation: $1",
        "protectedpagewarning": "<strong>Warning: This page has been protected so that only users with administrator privileges can edit it.</strong>\nThe latest log entry is provided below for reference:",
        "semiprotectedpagewarning": "<strong>Note:</strong> This page has been protected so that only registered users can edit it.\nThe latest log entry is provided below for reference:",
-       "cascadeprotectedwarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can edit it because it is included in the following cascade-protected {{PLURAL:$1|page|pages}}:",
+       "cascadeprotectedwarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can edit it because it is transcluded in the following cascade-protected {{PLURAL:$1|page|pages}}:",
        "titleprotectedwarning": "<strong>Warning: This page has been protected so that [[Special:ListGroupRights|specific rights]] are needed to create it.</strong>\nThe latest log entry is provided below for reference:",
        "templatesused": "{{PLURAL:$1|Template|Templates}} used on this page:",
        "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} used in this preview:",
        "linksearch-pat": "Search pattern:",
        "linksearch-ns": "Namespace:",
        "linksearch-ok": "Search",
-       "linksearch-text": "Wildcards such as \"*.wikipedia.org\" may be used.\nNeeds at least a top-level domain, for example \"*.org\".<br />\nSupported {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (defaults to http:// if no protocol is specified).",
+       "linksearch-text": "Wildcards such as \"*.wikipedia.org\" may be used.\nNeeds at least a top-level domain, for example \"*.org\".<br />\nSupported {{PLURAL:$2|protocol|protocols}}: $1 (defaults to http:// if no protocol is specified).",
        "linksearch-line": "$1 is linked from $2",
        "linksearch-error": "Wildcards may appear only at the start of the hostname.",
        "listusersfrom": "Display users starting at:",
        "protect-locked-blocked": "You cannot change protection levels while blocked.\nHere are the current settings for the page <strong>$1</strong>:",
        "protect-locked-dblock": "Protection levels cannot be changed due to an active database lock.\nHere are the current settings for the page <strong>$1</strong>:",
        "protect-locked-access": "Your account does not have permission to change page protection levels.\nHere are the current settings for the page <strong>$1</strong>:",
-       "protect-cascadeon": "This page is currently protected because it is included in the following {{PLURAL:$1|page, which has|pages, which have}} cascading protection turned on.\nChanges to this page's protection level will not affect the cascading protection.",
+       "protect-cascadeon": "This page is currently protected because it is transcluded in the following {{PLURAL:$1|page, which has|pages, which have}} cascading protection turned on.\nChanges to this page's protection level will not affect the cascading protection.",
        "protect-default": "Allow all users",
        "protect-fallback": "Allow only users with \"$1\" permission",
        "protect-level-autoconfirmed": "Allow only autoconfirmed users",
        "pageinfo-robot-index": "Allowed",
        "pageinfo-robot-noindex": "Disallowed",
        "pageinfo-watchers": "Number of page watchers",
-       "pageinfo-visiting-watchers": "Number of page watchers visiting recent edits",
+       "pageinfo-visiting-watchers": "Number of page watchers who visited recent edits",
        "pageinfo-few-watchers": "Fewer than $1 {{PLURAL:$1|watcher|watchers}}",
        "pageinfo-few-visiting-watchers": "There may or may not be a watching user visiting recent edits",
        "pageinfo-redirects-name": "Number of redirects to this page",
        "htmlform-cloner-create": "Add more",
        "htmlform-cloner-delete": "Remove",
        "htmlform-cloner-required": "At least one value is required.",
+       "htmlform-title-badnamespace": "[[:$1]] is not in the \"{{ns:$2}}\" namespace.",
+       "htmlform-title-not-creatable": "\"$1\" is not a creatable page title",
+       "htmlform-title-not-exists": "[[:$1]] does not exist.",
+       "htmlform-user-not-exists": "<strong>$1</strong> does not exist.",
+       "htmlform-user-not-valid": "<strong>$1</strong> isn't a valid username.",
        "sqlite-has-fts": "$1 with full-text search support",
        "sqlite-no-fts": "$1 without full-text search support",
        "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} page $3",
index 3e900cc..ccc1532 100644 (file)
        "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:",
        "resettokens": "Renovigi ŝlosilojn",
        "resettokens-text": "Vi povas rekomencigi ĵetonojn, kiuj ebligas aliron al certaj privataj datumoj, kiuj estas ligataj kun via konto de uzanto ĉi tie.\n\nVi faru tion, se vi akcidente kunhavigis ilin kun iu aŭ se via konto estis malkonfidencigita.",
        "resettokens-no-tokens": "Ne estas ŝlosiloj renovigeblaj.",
-       "resettokens-legend": "Renovigi ŝlosilojn",
        "resettokens-tokens": "Ŝlosiloj:",
        "resettokens-token-label": "$1 (nuna valoro: $2)",
        "resettokens-watchlist-token": "Ĵetono por la retfluo (Atom/RSS) de [[Special:Watchlist|ŝanĝoj je paĝoj sur via atentaro]]",
        "randomincategory-nopages": "Ne estas paĝoj en la kategorio [[:Category:$1|$1]].",
        "randomincategory-category": "Kategorio:",
        "randomincategory-legend": "Hazarda paĝo en kategorio",
+       "randomincategory-submit": "Ek!",
        "randomredirect": "Hazarda alidirekto",
        "randomredirect-nopages": "Estas neniuj alidirektiloj en la nomspaco \"$1\".",
        "statistics": "Statistiko",
        "nmembers": "{{PLURAL:$1|unu membro|$1 membroj}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|membro|membroj}}",
        "nrevisions": "$1 {{PLURAL:$1|versio|versioj}}",
-       "nviews": "{{PLURAL:$1|unufoje|$1 fojojn}}",
        "nimagelinks": "Uzita en $1 {{PLURAL:$1|paĝo|paĝoj}}",
        "ntransclusions": "uzita en $1 {{PLURAL:$1|paĝo|paĝoj}}",
        "specialpage-empty": "Ne estas rezultoj por ĉi tiu raporto.",
        "linksearch-pat": "Serĉesprimo:",
        "linksearch-ns": "Nomspaco:",
        "linksearch-ok": "Serĉi",
-       "linksearch-text": "Regulesprimoj kiel \"*.wikipedia.org\" povas esti uzataj. Nepre havi almenaŭ plej altan domajnon, ekz-e \"*.org\".<br />\nSubtenataj {{PLURAL:$2|protokolo|protokoloj}}:: <code>$1</code> (ne aldonu ĉi tiujn ajn en via serĉo-mendo).",
+       "linksearch-text": "Regulesprimoj kiel \"*.wikipedia.org\" povas esti uzataj. Nepre havi almenaŭ plej altan domajnon, ekz-e \"*.org\".<br />\nSubtenataj {{PLURAL:$2|protokolo|protokoloj}}:: $1 (ne aldonu ĉi tiujn ajn en via serĉo-mendo).",
        "linksearch-line": "$1 ligita de $2",
        "linksearch-error": "Regulesprimoj povas aperi nur ĉe la komenco de la retnoda nomo.",
        "listusersfrom": "Montri uzantojn ekde:",
index 5f5be28..d6520d6 100644 (file)
        "tog-oldsig": "Firma actual:",
        "tog-fancysig": "Tratar la firma como wikitexto (sin un enlace automático)",
        "tog-uselivepreview": "Usar previsualización dinámica",
-       "tog-forceeditsummary": "Avisarme cuando grabe la página sin introducir un resumen de edición",
+       "tog-forceeditsummary": "Avisarme cuando grabe la página sin escribir un resumen de edición",
        "tog-watchlisthideown": "Ocultar mis ediciones en la lista de seguimiento",
        "tog-watchlisthidebots": "Ocultar las ediciones de bots en la lista de seguimiento",
        "tog-watchlisthideminor": "Ocultar las ediciones menores en la lista de seguimiento",
        "protectedinterface": "Esta página proporciona el texto de la interfaz del software en este wiki, y está protegida para prevenir el abuso.\nPara agregar o cambiar las traducciones para todos los wikis, por favor, usa [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
        "editinginterface": "<strong>Advertencia:</strong> Estás editando una página usada para proporcionar texto de la interfaz al software. \nLos cambios en esta página afectarán la apariencia de la interfaz de los demás usuarios de este wiki.",
        "translateinterface": "Para añadir o cambiar traducciones para todos los wikis, usa [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
-       "cascadeprotected": "Esta página ha sido protegida contra edición, al estar incluida en {{PLURAL:$1|la siguiente página protegida|las siguientes páginas protegidas}} con la opción de «cascada» activa:\n$2",
+       "cascadeprotected": "Esta página ha sido protegida contra edición porque está transcluida en {{PLURAL:$1|la siguiente página protegida|las siguientes páginas protegidas}} con la opción de «cascada» activa:\n$2",
        "namespaceprotected": "No tienes permiso para editar las páginas del espacio de nombres <strong>$1</strong>.",
        "customcssprotected": "No tienes permiso para editar esta página CSS, porque contiene configuraciones personales de otro usuario.",
        "customjsprotected": "No tienes permiso para editar esta página JavaScript, porque contiene configuraciones personales de otro usuario.",
        "passwordreset-emailsent-capture": "Se ha enviado un correo para el restablecimiento de la contraseña, el cual se muestra a continuación.",
        "passwordreset-emailerror-capture": "Se ha generado un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero ha fallado el envío {{GENDER:$2|al usuario|a la usuaria}}: $1",
        "changeemail": "Cambiar la dirección de correo electrónico",
-       "changeemail-text": "Rellena este formulario para cambiar tu dirección de correo electrónico. Debes introducir tu contraseña para confirmar este cambio.",
+       "changeemail-text": "Rellena este formulario para cambiar tu dirección de correo electrónico. Debes escribir tu contraseña para confirmar este cambio.",
        "changeemail-no-info": "Debes iniciar sesión para acceder directamente a esta página.",
        "changeemail-oldemail": "Dirección de correo electrónico actual:",
        "changeemail-newemail": "Dirección de correo electrónico nueva:",
        "subject-preview": "Previsualización del asunto/encabezado:",
        "previewerrortext": "Se ha producido un error al intentar la vista previa de los cambios.",
        "blockedtitle": "El usuario está bloqueado",
-       "blockedtext": "<strong>Tu nombre de usuario o dirección IP ha sido bloqueada.</strong>\n\nEl bloqueo fue hecho por $1.\nLa razón dada es <em>$2</em>.\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar a $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\nNo puedes utilizar la función «enviar correo electrónico a este usuario»  a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y que el bloqueo no haya inhabilitado esta función.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es #$5.\nPor favor incluye todos los datos aquí mostrados en cualquier consulta que hagas.",
-       "autoblockedtext": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por otro usuario, que resultó bloqueado por $1.\n\nEl motivo dado es el siguiente:\n\n:<em>$2</em>\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\n\nTen en cuenta que no podrás utilizar la herramienta de «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y la función no haya sido también bloqueada.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es #$5.\nPor favor, incluye todos los datos aquí mostrados en cualquier consulta que hagas al respecto.",
+       "blockedtext": "<strong>Tu nombre de usuario o dirección IP ha sido bloqueada.</strong>\n\nEl bloqueo lo hizo $1.\nLa razón dada es <em>$2</em>.\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar a $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\nNo puedes utilizar la función «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y la función no haya sido también bloqueada.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es #$5.\nIncluye todos los datos aquí mostrados en cualquier consulta que hagas.",
+       "autoblockedtext": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por otro usuario, que resultó bloqueado por $1.\nEl motivo dado es el siguiente:\n\n:<em>$2</em>\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\n\nTen en cuenta que no puedes utilizar la función «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y la función no haya sido también bloqueada.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es #$5.\nIncluye todos los datos aquí mostrados en cualquier consulta que hagas.",
        "blockednoreason": "no se ha especificado el motivo",
-       "whitelistedittext": "Tienes que $1 para editar artículos.",
+       "whitelistedittext": "Tienes que $1 para editar páginas.",
        "confirmedittext": "Debes confirmar tu dirección de correo electrónico antes de poder editar páginas. Por favor, configura y confirma tu dirección de correo a través de tus [[Special:Preferences|preferencias de usuario]].",
        "nosuchsectiontitle": "Sección no encontrada",
        "nosuchsectiontext": "Has intentado editar una sección que no existe.\nQuizá ha sido movida o borrada mientras visitabas la página.",
        "creating": "Creación de «$1»",
        "editingsection": "Edición de «$1» (sección)",
        "editingcomment": "Edición de «$1» (sección nueva)",
-       "editconflict": "No se pudieron guardar tus cambios debido a un conflicto de edición. {{GENDER:|¿Deseas}} resolver el conflicto manualmente?",
+       "editconflict": "Conflicto de edición: $1",
        "explainconflict": "Alguien ha realizado cambios en esta página desde que empezaste a editarla.\nEl cuadro de texto superior contiene el texto de la página tal como está guardado en este momento.\nTus cambios sobre la versión que editaste se muestran en el cuadro de texto inferior.\nSi quieres guardar tus cambios, has de trasladarlos al cuadro superior.\nAl pulsar «{{int:savearticle}}», se guardará <strong>solo</strong> el texto del cuadro superior.",
        "yourtext": "Tu texto",
        "storedversion": "Versión guardada",
        "readonlywarning": "<strong>Advertencia: La base de datos ha sido bloqueada por labores de mantenimiento, así que en este momento no puedes guardar tus ediciones.</strong>\nQuizás quieras copiar y pegar tu texto en un archivo de texto y guardarlo para después.\n\nEl administrador que la bloqueó ha dado esta explicación: $1",
        "protectedpagewarning": "<strong>Advertencia: Esta página ha sido protegida para que solo puedan editarla los usuarios con permisos de administrador.</strong>\nA continuación se muestra la última entrada de registro para más información:",
        "semiprotectedpagewarning": "<strong>Nota:</strong> Esta página ha sido protegida para que solo puedan editarla los usuarios registrados.\nA continuación se muestra la última entrada de registro para más información:",
-       "cascadeprotectedwarning": "<strong>Aviso:</strong> esta página está protegida y solo los administradores pueden editarla porque está incluida en {{PLURAL:$1|la siguiente página protegida|las siguientes páginas protegidas}} en cascada:",
+       "cascadeprotectedwarning": "<strong>Aviso:</strong> esta página está protegida y solo los administradores pueden editarla porque está transcluida en {{PLURAL:$1|la siguiente página protegida|las siguientes páginas protegidas}} en cascada:",
        "titleprotectedwarning": "<strong>Aviso: esta página está protegida de modo que se necesitan [[Special:ListGroupRights|permisos específicos]] para crearla.</strong>\nA continuación se muestra la última entrada del registro como referencia:",
        "templatesused": "{{PLURAL:$1|Plantilla usada|Plantillas usadas}} en esta página:",
        "templatesusedpreview": "{{PLURAL:$1|Plantilla usada|Plantillas usadas}} en esta previsualización:",
        "largefileserver": "El tamaño de este archivo es mayor del que este servidor admite por configuración.",
        "emptyfile": "El archivo que has intentado subir parece estar vacío; por favor, verifica que realmente se trate del archivo que intentabas subir.",
        "windows-nonascii-filename": "Este wiki no admite nombres de archivo con caracteres especiales.",
-       "fileexists": "Ya existe un archivo con este nombre, por favor comprueba <strong>[[:$1]]</strong> si {{GENDER:|tú}} no estás seguro de querer cambiarlo.\n[[$1|thumb]]",
-       "filepageexists": "La página de descripción de este archivo ya ha sido creada en <strong>[[:$1]]</strong>, pero no existe actualmente ningún fichero con este nombre.\nEl resumen que ha ingresado no aparecerá en la página de descripción. Para que el sumario aparezca, deberá editarlo manualmente.\n[[$1|thumb]]",
+       "fileexists": "Ya existe un archivo con este nombre. Comprueba <strong>[[:$1]]</strong> si {{GENDER:|tú}} no estás seguro de querer cambiarlo.\n[[$1|thumb]]",
+       "filepageexists": "La página de descripción de este archivo ya ha sido creada en <strong>[[:$1]]</strong>, pero no existe actualmente ningún archivo con este nombre.\nEl resumen que has escrito no aparecerá en la página de descripción.\nPara que el resumen aparezca, deberás editarlo manualmente.\n[[$1|thumb]]",
        "fileexists-extension": "Existe un archivo con un nombre similar: [[$2|thumb]]\n* Nombre del archivo que se está subiendo: <strong>[[:$1]]</strong>\n* Nombre del archivo ya existente: <strong>[[:$2]]</strong>\n¿Quieres cambiar el nombre para que sea más distintivo?",
        "fileexists-thumbnail-yes": "El archivo parece ser una imagen de tamaño reducido ''(thumbnail)''. [[$1|thumb]]\nPor favor comprueba el archivo <strong>[[:$1]]</strong>.\nSi el archivo comprobado es la misma imagen a tamaño original no es necesario subir un thumbnail más.",
        "file-thumbnail-no": "El nombre del archivo comienza con <strong>$1</strong>.\nParece ser una imagen de tamaño reducido ''(thumbnail)''.\nSi tiene esta imagen a toda resolución súbala, si no, por favor cambie el nombre del archivo.",
        "uploaded-setting-handler-svg": "Están bloqueados los archivos SVG que configuran el atributo \"handler\" con remote/data/script. Se encontró <code>$1=\"$2\"</code> en el archivo SVG cargado.",
        "uploaded-remote-url-svg": "Se bloquean los SVG que contienen URL de estilo externas. El archivo SVG cargado contiene <code>$1=\"$2\"</code>.",
        "uploaded-image-filter-svg": "Se encontró un filtro de imagen con URL: <code>&lt;$1 $2=\"$3\"&gt;</code> en el archivo SVG cargado.",
-       "uploadscriptednamespace": "Este archivo SVG contiene un espacio de nombre no permitido '$1'",
+       "uploadscriptednamespace": "Este archivo SVG contiene un espacio de nombres no permitido: \"$1\".",
        "uploadinvalidxml": "No se pudo analizar el XML del archivo cargado.",
        "uploadvirus": "¡El archivo contiene un virus!\nDetalles: $1",
        "uploadjava": "El archivo es un ZIP que contiene un archivo .class de Java.\nNo se permite subir archivos Java, porque pueden causar que se puedan saltar restricciones de seguridad.",
        "backend-fail-stream": "No se pudo transmitir el archivo «$1».",
        "backend-fail-backup": "No pudo hacer copia de seguridad del archivo «$1».",
        "backend-fail-notexists": "El archivo  $1  no existe.",
-       "backend-fail-hashes": "No se pudieron obtener los hashes de los ficheros para compararlos.",
-       "backend-fail-notsame": "Ya existe un fichero distinto en $1.",
+       "backend-fail-hashes": "No se pudieron obtener los \"hashes\" de los archivos para compararlos.",
+       "backend-fail-notsame": "Ya existe un archivo distinto en \"$1\".",
        "backend-fail-invalidpath": "$1 no es una ruta de almacenamiento válida",
        "backend-fail-delete": "No se pudo borrar el archivo «$1».",
        "backend-fail-describe": "No pudieron cambiar los metadatos del archivo \"$1\".",
        "zip-bad": "El archivo es un ZIP dañado o que no se puede leer.\nNo se puede comprobar su seguridad.",
        "zip-unsupported": "El archivo es un archivo que utiliza características ZIP no compatibles con MediaWiki.\nNo puede comprobarse adecuadamente su seguridad.",
        "uploadstash": "Ficheros escondidos",
-       "uploadstash-summary": "Esta página da acceso a los ficheros enviados (o que están en el proceso de envío) pero que aún no han sido publicados en la wiki. Estos ficheros no son visibles para nadie, excepto para el usuario que los envió.",
+       "uploadstash-summary": "Esta página da acceso a los archivos subidos (o que están por subirse), pero que aún no han sido publicados en el wiki. Estos archivos no son visibles para nadie, excepto para el usuario que los subió.",
        "uploadstash-clear": "Borrar los ficheros escondidos",
        "uploadstash-nofiles": "No tienes archivos escondidos.",
        "uploadstash-badtoken": "No se pudo realizar la acción. Es posible que haya finalizado el tiempo de espera de la sesión. Inténtalo de nuevo.",
        "filerevert-defaultcomment": "Revertido a la versión subida el $1 a las $2",
        "filerevert-submit": "Revertir",
        "filerevert-success": "'''[[Media:$1|$1]]''' ha sido revertido a la [$4 versión del $2 a las $3].",
-       "filerevert-badversion": "No existe version local previa de este archivo con esa marca de tiempo.",
+       "filerevert-badversion": "No existe versión local previa de este archivo con esa marca de tiempo.",
        "filedelete": "Borrar $1",
        "filedelete-legend": "Borrar archivo",
        "filedelete-intro": "Estás borrando el archivo '''[[Media:$1|$1]]''' así como todo su historial.",
        "filedelete-comment": "Motivo:",
        "filedelete-submit": "Eliminar",
        "filedelete-success": "'''$1''' ha sido borrado.",
-       "filedelete-success-old": "La version de '''[[Media:$1|$1]]''' del $2 a las $3 ha sido borrada.",
+       "filedelete-success-old": "La versión de <strong>[[Media:$1|$1]]</strong> del $2 a las $3 ha sido borrada.",
        "filedelete-nofile": "'''$1''' no existe.",
        "filedelete-nofile-old": "No existe una versión guardada de '''$1''' con los atributos especificados.",
        "filedelete-otherreason": "Otra razón:",
        "filedelete-maintenance": "Borrado y restauración de archivos temporalmente deshabilitados durante el mantenimiento.",
        "filedelete-maintenance-title": "No se puede eliminar el archivo",
        "mimesearch": "Búsqueda por MIME",
-       "mimesearch-summary": "Esta página permite el filtrado de ficheros por su tipo MIME.\nEntrada: tipo/subtipo o tipo/*, p. ej. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Esta página permite el filtrado de archivos por su tipo MIME.\nEntrada: tipo/subtipo o tipo/*, p. ej. <code>image/jpeg</code>.",
        "mimetype": "Tipo MIME:",
        "download": "descargar",
        "unwatchedpages": "Páginas no vigiladas",
        "pageswithprop": "Páginas con una propiedad de página",
        "pageswithprop-legend": "Páginas con una propiedad de página",
        "pageswithprop-text": "Esta página muestra las páginas que usan la propiedad de una página en particular",
-       "pageswithprop-prop": "Nombre de la propiedad",
+       "pageswithprop-prop": "Nombre de la propiedad:",
        "pageswithprop-submit": "Ir",
        "pageswithprop-prophidden-long": "hay un largo valor en la propiedad texto oculta ($1)",
        "pageswithprop-prophidden-binary": "valor de la propiedad binaria oculta ($1)",
        "wantedpages": "Páginas requeridas",
        "wantedpages-summary": "Lista de páginas inexistentes con el mayor número de enlaces a ellas, excluyendo páginas que son solo redirecciones a ellas. Para ver una lista de páginas inexistentes con redirecciones apuntando a ellas, consulta [[{{#special:BrokenRedirects}}|la lista de redirecciones rotas]].",
        "wantedpages-badtitle": "Título inválido en conjunto de resultados: $1",
-       "wantedfiles": "Ficheros requeridos",
+       "wantedfiles": "Archivos requeridos",
        "wantedfiletext-cat": "Los siguientes archivos están en uso, pero no existen. Es posible que algunos de ellos estén almacenados en repositorios externos y se hayan incluido aquí por error; dichas entradas aparecen <del>tachadas</del>. De igual manera, las páginas que incluyen archivos inexistentes se enumeran en [[:$1]].",
        "wantedfiletext-cat-noforeign": "Los siguientes archivos están en uso, pero no existen. Además, las páginas con archivos que no existen están listadas en [[:$1]].",
        "wantedfiletext-nocat": "Los siguientes archivos están en uso, pero no existen. Es posible que algunos de ellos estén almacenados en repositorios externos y se hayan incluido aquí por error; dichas entradas aparecen <del>tachadas</del>.",
        "sp-deletedcontributions-contribs": "contribuciones",
        "linksearch": "Enlaces externos",
        "linksearch-pat": "Patrón de búsqueda:",
-       "linksearch-ns": "Espacio de nombre:",
+       "linksearch-ns": "Espacio de nombres:",
        "linksearch-ok": "Buscar",
-       "linksearch-text": "Se pueden usar caracteres comodín como \"*.wikipedia.org\".\nEs necesario, por lo menos, un dominio de alto nivel, por ejemplo \"*.org\".<br />\n{{PLURAL:$2|Protocolo soportado|Protocolos soportados}}: <code>$1</code> (si no se especifica ninguno, el predeterminado es http://).",
+       "linksearch-text": "Se pueden usar caracteres comodín como \"*.wikipedia.org\".\nEs necesario, por lo menos, un dominio de alto nivel, por ejemplo \"*.org\".<br />\n{{PLURAL:$2|Protocolo soportado|Protocolos soportados}}: $1 (si no se especifica ninguno, el predeterminado es http://).",
        "linksearch-line": "$1 enlazado desde $2",
        "linksearch-error": "Los comodines sólo pueden aparecer al principio del nombre de sitio.",
        "listusersfrom": "Mostrar usuarios que empiecen por:",
        "listgrouprights-removegroup-self": "Eliminar {{PLURAL:$2|grupo|grupos}} de tu propia cuenta: $1",
        "listgrouprights-addgroup-self-all": "Agregar todos los grupos a tu propia cuenta",
        "listgrouprights-removegroup-self-all": "Eliminar todos los grupos de tu propia cuenta",
-       "listgrouprights-namespaceprotection-header": "Restricciones del espacio de nombre",
-       "listgrouprights-namespaceprotection-namespace": "Espacio de nombre",
+       "listgrouprights-namespaceprotection-header": "Restricciones del espacio de nombres",
+       "listgrouprights-namespaceprotection-namespace": "Espacio de nombres",
        "listgrouprights-namespaceprotection-restrictedto": "Derechos de usuario para editar",
        "trackingcategories": "Categorías de seguimiento",
        "trackingcategories-summary": "Esta página lista categorías de seguimiento que han sido generadas automáticamente por el software MediaWiki. Sus nombres pueden cambiarse editando su mensaje correspondiente en el espacio de nombres {{ns:8}}.",
        "noemailtext": "Este usuario no ha especificado una dirección de correo electrónico válida.",
        "nowikiemailtext": "Este usuario ha elegido no recibir correos electrónicos de otros usuarios.",
        "emailnotarget": "Nombre de usuario no existente o no válido para el destinatario.",
-       "emailtarget": "Introduce el nombre de usuario del destinatario",
+       "emailtarget": "Escribe el nombre de usuario del destinatario",
        "emailusername": "Nombre de usuario:",
        "emailusernamesubmit": "Enviar",
        "email-legend": "Enviar un correo electrónico a otro usuario de {{SITENAME}}",
        "notvisiblerev": "La última revisión de un usuario diferente ha sido borrada",
        "watchlist-details": "{{PLURAL:$1|$1 página|$1 páginas}} en tu lista de seguimiento, sin contar las de discusión.",
        "wlheader-enotif": "La notificación por correo está activada.",
-       "wlheader-showupdated": "Las páginas modificadas desde su última visita aparecen en '''negrita'''.",
+       "wlheader-showupdated": "Las páginas modificadas desde tu última visita aparecen en <strong>negrita</strong>.",
        "wlnote": "A continuación {{PLURAL:$1|se muestra el último cambio|se muestran los últimos '''$1''' cambios}} en {{PLURAL:$2|la última hora|las últimas '''$2''' horas}} a fecha de $4 $3.",
        "wlshowlast": "Ver los cambios de las últimas $1 horas, $2 días",
        "watchlist-options": "Opciones de la lista de seguimiento",
        "protect-locked-blocked": "No puedes cambiar los niveles de protección estando bloqueado.\nA continuación se muestran las opciones actuales de la página <strong>$1</strong>:",
        "protect-locked-dblock": "Los niveles de protección no se pueden cambiar debido a un bloqueo activo de la base de datos.\nA continuación se muestran las opciones actuales de la página '''$1''':",
        "protect-locked-access": "Tu cuenta no tiene permiso para cambiar los niveles de protección de una página.\nA continuación se muestran las opciones actuales de la página <strong>$1</strong>:",
-       "protect-cascadeon": "Actualmente esta página está protegida porque está incluida en {{PLURAL:$1|la siguiente página|las siguientes páginas}}, que tienen activada la opción de protección en cascada. Puedes cambiar el nivel de protección de esta página, pero no afectará a la protección en cascada.",
+       "protect-cascadeon": "Actualmente esta página está protegida porque está transcluida en {{PLURAL:$1|la siguiente página, que tiene|las siguientes páginas, que tienen}} activada la opción de protección de cascada.\nPuedes cambiar el nivel de protección de esta página, pero no afectará a la protección de cascada.",
        "protect-default": "Permitir todos los usuarios",
        "protect-fallback": "Solo permitir usuarios con el permiso «$1»",
        "protect-level-autoconfirmed": "Solo permitir usuarios autoconfirmados",
        "protect-expiring-local": "caduca el $1",
        "protect-expiry-indefinite": "indefinido",
        "protect-cascade": "Protección en cascada - proteger todas las páginas incluidas en ésta.",
-       "protect-cantedit": "No puedes cambiar el nivel de protección porque no tienes permiso para hacer ediciones.",
+       "protect-cantedit": "No puedes cambiar el nivel de protección de esta página porque no tienes permiso para editarla.",
        "protect-othertime": "Especificar caducidad:",
        "protect-othertime-op": "otra (especificar)",
        "protect-existing-expiry": "Fecha de caducidad actual: $2 a las $3",
        "undelete-search-prefix": "Mostrar páginas que empiecen por:",
        "undelete-search-submit": "Buscar",
        "undelete-no-results": "No se encontraron páginas borradas para ese criterio de búsqueda.",
-       "undelete-filename-mismatch": "No se puede restaurar la versión con marca de tiempo $1: No concuerda el nombre de fichero",
-       "undelete-bad-store-key": "No se puede restaurar la versión con marca de tiempo $1: el fichero fue omitido antes del borrado.",
+       "undelete-filename-mismatch": "No se puede restaurar la revisión con marca de tiempo $1: no concuerda el nombre del archivo.",
+       "undelete-bad-store-key": "No se puede restaurar la revisión con marca de tiempo $1: el archivo fue omitido antes del borrado.",
        "undelete-cleanup-error": "Error al borrar el archivo no utilizado \"$1\".",
        "undelete-missing-filearchive": "No se ha podido restaurar el archivo de ID $1 debido a que no está en la base de datos.\nPuede que ya haya sido restaurado.",
        "undelete-error": "Error restaurando la página",
        "ipb-hardblock": "Impedir que los usuarios identificados editen desde esta dirección IP",
        "ipbcreateaccount": "Prevenir la creación de cuentas de usuario",
        "ipbemailban": "Prevenir que el usuario envíe correo electrónico",
-       "ipbenableautoblock": "Bloquear automáticamente la dirección IP usada por este usuario y cualquier IP posterior desde la cual intente editar",
+       "ipbenableautoblock": "Bloquear automáticamente la última dirección IP usada por este usuario y cualquier IP posterior desde la cual intente editar",
        "ipbsubmit": "Bloquear a este usuario",
        "ipbother": "Especificar caducidad",
        "ipboptions": "2 horas: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",
        "immobile-source-page": "Esta página no se puede renombrar.",
        "immobile-target-page": "No se puede trasladar a ese título.",
        "bad-target-model": "El destino deseado utiliza un modelo diferente de contenido. No se puede realizar la conversión de $1 a $2.",
-       "imagenocrossnamespace": "No se puede trasladar el fichero a otro espacio de nombres",
-       "nonfile-cannot-move-to-file": "No es posible trasladar lo que no es un archivo al espacio de nombres de archivo",
+       "imagenocrossnamespace": "No se puede trasladar el archivo a un espacio de nombres que no es para archivos.",
+       "nonfile-cannot-move-to-file": "No es posible trasladar lo que no es un archivo al espacio de nombres de archivos.",
        "imagetypemismatch": "La nueva extensión de archivo no corresponde con su tipo",
-       "imageinvalidfilename": "El nombre del fichero de destino no es válido",
+       "imageinvalidfilename": "El nombre del archivo de destino no es válido.",
        "fix-double-redirects": "Actualizar las redirecciones que apuntan al título original",
        "move-leave-redirect": "Dejar una redirección",
        "protectedpagemovewarning": "'''Advertencia:''' Esta página ha sido bloqueada de tal manera que solamente usuarios con privilegios de administrador puedan trasladarla.\nA continuación se muestra la última entrada de registro para referencia:",
        "thumbnail_dest_directory": "Incapaz de crear el directorio de destino",
        "thumbnail_image-type": "Tipo de imagen no contemplado",
        "thumbnail_gd-library": "Configuración de la librería GD incompleta: falta la función $1",
-       "thumbnail_image-missing": "El fichero parece no existir: $1",
+       "thumbnail_image-missing": "El archivo parece no existir: $1",
        "thumbnail_image-failure-limit": "Ha habido muchos intentos recientes ($1 o más) para representar esta miniatura. Inténtalo de nuevo más tarde.",
        "import": "Importar páginas",
        "importinterwiki": "Importar desde otro wiki",
        "importnosources": "No se definieron wikis de los cuales importar y no está permitido subir directamente el historial.",
        "importnofile": "No se subieron archivos de importación.",
        "importuploaderrorsize": "Falló la carga del archivo de importaciones.\nSu tamaño es superior al máximo permitido.",
-       "importuploaderrorpartial": "Falló la subida del fichero de importación.\nSe subió sólo parcialmente.",
-       "importuploaderrortemp": "Falló la subida del fichero de importación.\nNo hay un directorio temporal.",
+       "importuploaderrorpartial": "Falló la subida del archivo de importación.\nSe subió sólo parcialmente.",
+       "importuploaderrortemp": "Falló la subida del archivo de importación.\nNo hay un directorio temporal.",
        "import-parse-failure": "Error de lectura al importar XML",
        "import-noarticle": "¡No hay páginas para importar!",
        "import-nonewrevisions": "Ninguna revisión fue importada (todas ya estaban presentes o fueron omitido debido a errores).",
        "javascripttest-pagetext-unknownframework": "Marco de pruebas desconocido \"$1\".",
        "javascripttest-pagetext-unknownaction": "La acción «$1» es desconocida.",
        "javascripttest-pagetext-frameworks": "Por favor, seleccione uno de los marcos de pruebas siguientes: $1",
-       "javascripttest-pagetext-skins": "Elija un aspecto (skin) para ejecutar las pruebas:",
-       "javascripttest-qunit-intro": "Consulte la [$1 documentación sobre las pruebas] en mediawiki.org.",
+       "javascripttest-pagetext-skins": "Elige una apariencia con la que ejecutar las pruebas:",
+       "javascripttest-qunit-intro": "Consulta la [$1 documentación sobre las pruebas] en mediawiki.org.",
        "tooltip-pt-userpage": "Tu página de {{gender:|usuario|usuaria}}",
        "tooltip-pt-anonuserpage": "La página de usuario de la IP desde la que editas",
        "tooltip-pt-mytalk": "Tu página de discusión",
        "pageinfo-robot-index": "Permitido",
        "pageinfo-robot-noindex": "No permitido",
        "pageinfo-watchers": "Número de usuarios que vigilan la página",
-       "pageinfo-visiting-watchers": "Número de vigiladores de la página visitando las ediciones recientes",
+       "pageinfo-visiting-watchers": "Número de seguidores de la página que visitaron las ediciones recientes",
        "pageinfo-few-watchers": "Menos de $1 {{PLURAL:$1|vigilante|vigilantes}}",
        "pageinfo-few-visiting-watchers": "Puede o no haber seguidores visitando las ediciones recientes",
        "pageinfo-redirects-name": "Número de redirecciones a esta página",
        "filedelete-archive-read-only": "El servidor web no logra escribir en el directorio archivo \"$1\".",
        "previousdiff": "← Edición anterior",
        "nextdiff": "Edición siguiente →",
-       "mediawarning": "'''Atención''': Este fichero puede contener código malicioso.\nEjecutarlo podría comprometer la seguridad de su equipo.",
+       "mediawarning": "<strong>Advertencia:</strong> este archivo puede contener código malicioso.\nEjecutarlo podría comprometer la seguridad de tu equipo.",
        "imagemaxsize": "Límite de tamaño de imagen:<br />''(para páginas de descripción de archivo)''",
        "thumbsize": "Tamaño de las vistas en miniatura:",
        "widthheight": "$1 × $2",
        "file-no-thumb-animation": "'''Nota: debido a limitaciones técnicas, las miniaturas de este archivo no están animadas.'''",
        "file-no-thumb-animation-gif": "'''Nota: Debido a limitaciones técnicas, las miniaturas de imágenes GIF de alta resolución como esta no están animadas.'''",
        "newimages": "Galería de imágenes nuevas",
-       "imagelisttext": "Debajo hay una lista de '''$1''' {{PLURAL:$1|imagen|imágenes}} ordenadas $2.",
+       "imagelisttext": "Debajo hay una lista de <strong>$1</strong> {{PLURAL:$1|archivo ordenado|archivos ordenados}} $2.",
        "newimages-summary": "Esta página especial muestra una galería de los últimos archivos subidos.",
-       "newimages-legend": "Nombre del fichero",
-       "newimages-label": "Nombre del fichero (o una parte):",
+       "newimages-legend": "Filtro",
+       "newimages-label": "Nombre del archivo (o una parte):",
        "newimages-showbots": "Mostrar cargas de bots",
        "noimages": "No hay nada que ver.",
        "ilsubmit": "Buscar",
        "bydate": "por fecha",
-       "sp-newimages-showfrom": "Mostrar nuevas imágenes empezando por $2, $1",
+       "sp-newimages-showfrom": "Mostrar archivos nuevos empezando desde $2, $1",
        "seconds-abbrev": "$1s",
        "minutes-abbrev": "$1m",
        "hours-abbrev": "$1h",
        "exif-gpsspeed": "Velocidad del receptor GPS",
        "exif-gpstrackref": "Referencia para la dirección del movimiento",
        "exif-gpstrack": "Dirección del movimiento",
-       "exif-gpsimgdirectionref": "Referencia de la dirección de imágen",
+       "exif-gpsimgdirectionref": "Referencia para la dirección de la imagen",
        "exif-gpsimgdirection": "Dirección de imagen",
        "exif-gpsmapdatum": "Utilizados datos de medición geodésica",
        "exif-gpsdestlatituderef": "Referencia para la latitud del destino",
        "deletedwhileediting": "<strong>Aviso</strong>: se borró esta página después de que empezaras a editarla.",
        "confirmrecreate": "El usuario [[User:$1|$1]] ([[User talk:$1|disc.]]) borró esta página después de que comenzaras a editarla, por este motivo:\n: ''$2''\nConfirma que realmente quieres volver a crear esta página.",
        "confirmrecreate-noreason": "El usuario [[User:$1|$1]] ([[User talk:$1|discusión]]) borró esta página después de que comenzaras a editarla. Por favor confirma que realmente quieres recrear esta página.",
-       "recreate": "La página fue borrada después de que comenzaste a editarla. Pulsa en «$1» para crearla de nuevo.",
+       "recreate": "Recrear",
        "confirm_purge_button": "Aceptar",
        "confirm-purge-top": "¿Limpiar la caché de esta página?",
        "confirm-purge-bottom": "Purgar una página limpia la caché y fuerza a que aparezca la versión más actual.",
        "version-license": "Licencia de MediaWiki",
        "version-ext-license": "Licencia",
        "version-ext-colheader-name": "Extensión",
-       "version-skin-colheader-name": "Tema",
+       "version-skin-colheader-name": "Apariencia",
        "version-ext-colheader-version": "Versión",
        "version-ext-colheader-license": "Licencia",
        "version-ext-colheader-description": "Descripción",
        "version-libraries-authors": "Autores",
        "redirect": "Redirigir por archivo, usuario, página o ID de revisión",
        "redirect-legend": "Redirigir a un archivo o página",
-       "redirect-summary": "Esta página especial redirige a un fichero (dado un nombre de fichero), a una página (dado un identificador de revisión o de página) o a una página de usuario (dado un identificador numérico de usuario). Uso: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
+       "redirect-summary": "Esta página especial redirige a un archivo (dado un nombre), a una página (dado un identificador de revisión o de página) o a una página de usuario (dado un identificador numérico de usuario). Uso: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] o [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Ir",
        "redirect-lookup": "Buscar:",
        "redirect-value": "Valor:",
        "redirect-user": "Id. del usuario",
        "redirect-page": "Identificador de la página",
        "redirect-revision": "Revisión de página",
-       "redirect-file": "Nombre de fichero",
+       "redirect-file": "Nombre de archivo",
        "redirect-not-exists": "No se encontró el valor",
        "fileduplicatesearch": "Búsqueda de archivos duplicados",
        "fileduplicatesearch-summary": "Búsqueda de archivos duplicados en base a su valor hash.",
        "fileduplicatesearch-legend": "Busca duplicados",
-       "fileduplicatesearch-filename": "Nombre del fichero:",
+       "fileduplicatesearch-filename": "Nombre de archivo:",
        "fileduplicatesearch-submit": "Buscar",
        "fileduplicatesearch-info": "$1 × $2 píxeles<br />Tamaño: $3<br />Tipo MIME: $4",
        "fileduplicatesearch-result-1": "El archivo «$1» no tiene duplicados idénticos.",
        "specialpages-group-spam": "Herramientas anti-SPAM",
        "specialpages-group-developer": "Herramientas para desarrolladores",
        "blankpage": "Página vacía",
-       "intentionallyblankpage": "Esta pagina está en blanco de manera intencionada.",
+       "intentionallyblankpage": "Esta página está en blanco de manera intencionada.",
        "external_image_whitelist": " #Deja esta línea exactamente como está<pre>\n#Colocar fragmentos de expresiones regulares (sólo la parte que va entre los //) debajo\n#Estos coincidirán con los URLs de las imágenes externas (hotlinked)\n#Aquellos que coincidan serán mostrados como imágenes, de lo contrario solamente un vínculo a la imagen será mostrada\n#Las líneas que empiezan por «#» se consideran comentarios\n#Esta es insensible a las mayúsculas\n\n#Colocar todos los fragmentos regex arriba de esta línea. Deja esta línea exactamente como está</pre>",
        "tags": "Etiquetas de cambios",
        "tag-filter": "Filtro de [[Special:Tags|etiquetas]]:",
        "htmlform-cloner-create": "Añadir más",
        "htmlform-cloner-delete": "Eliminar",
        "htmlform-cloner-required": "Se requiere al menos un valor",
+       "htmlform-title-badnamespace": "[[:$1]] no está en el espacio de nombres \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "\"$1\" no es un título de página que se pueda crear",
+       "htmlform-title-not-exists": "[[:$1]] no existe.",
+       "htmlform-user-not-exists": "<strong>$1</strong> no existe.",
+       "htmlform-user-not-valid": "<strong>$1</strong> no es un nombre de usuario válido.",
        "sqlite-has-fts": "$1 con soporte para búsqueda de texto completo",
        "sqlite-no-fts": "$1 sin soporte para búsqueda de texto completo",
        "logentry-delete-delete": "$1 {{GENDER:$2|borró}} la página «$3»",
        "duration-decades": "$1 {{PLURAL:$1|década|décadas}}",
        "duration-centuries": "$1 {{PLURAL:$1|siglo|siglos}}",
        "duration-millennia": "$1 {{PLURAL:$1|milenio|milenios}}",
-       "rotate-comment": "Imagen girada por $1 {{PLURAL:$1|grado|grados}} en el sentido de las agujas del reloj",
+       "rotate-comment": "Imagen girada $1 {{PLURAL:$1|grado|grados}} en sentido horario",
        "limitreport-title": "Datos de perfilado del analizador:",
        "limitreport-cputime": "Tiempo de uso de CPU",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|segundo|segundos}}",
index c0f3da4..ff936ad 100644 (file)
        "readonlywarning": "'''Hoiatus: Andmebaas on lukustatud hooldustöödeks, nii et praegu ei saa parandusi salvestada.'''\nVõid teksti hilisemaks kasutamiseks alles hoida tekstifailina.\n\nAdministraator, kes andmebaasi lukustas, andis järgmise selgituse: $1",
        "protectedpagewarning": "'''Hoiatus: See lehekülg on lukustatud, nii et ainult administraatori õigustega kasutajad saavad seda redigeerida.'''\nAllpool on toodud uusim logisissekanne:",
        "semiprotectedpagewarning": "'''Märkus:''' See lehekülg on lukustatud, nii et üksnes registreeritud kasutajad saavad seda muuta.\nAllpool on toodud uusim logisissekanne:",
-       "cascadeprotectedwarning": "'''Hoiatus:''' See lehekülg on nii lukustatud, et ainult administraatori õigustega kasutajad saavad seda redigeerida, sest lehekülg on osa {{PLURAL:$1|järgmisest|järgmisest}} kaskaadkaitsega {{PLURAL:$1|leheküljest|lehekülgedest}}:",
+       "cascadeprotectedwarning": "<strong>Hoiatus:</strong> See lehekülg on nii lukustatud, et ainult administraatori õigustega kasutajad saavad seda redigeerida, sest lehekülg on osa {{PLURAL:$1|järgmisest|järgmistest}} kaskaadkaitsega {{PLURAL:$1|leheküljest|lehekülgedest}}:",
        "titleprotectedwarning": "'''Hoiatus: See lehekülg on nii lukustatud, et selle loomiseks on tarvis [[Special:ListGroupRights|eriõigusi]].'''\nAllpool on toodud uusim logisissekanne:",
        "templatesused": "Sellel leheküljel on kasutusel {{PLURAL:$1|järgmine mall|järgmised mallid}}:",
        "templatesusedpreview": "Eelvaates {{PLURAL:$1|kasutatav mall|kasutatavad mallid}}:",
        "linksearch-pat": "Otsimisvorm:",
        "linksearch-ns": "Nimeruum:",
        "linksearch-ok": "Otsi",
-       "linksearch-text": "Metamärgina võib kasutada tärni, näiteks \"*.wikipedia.org\".\nOtsingus peab olema vähemalt tipptaseme domeen, näiteks \"*.org\".<br />\nToetatud {{PLURAL:$2|protokoll|protokollid}}: <code>$1</code> (määramata protokolli korral vaikimisi http://).",
+       "linksearch-text": "Metamärgina võib kasutada tärni, näiteks \"*.wikipedia.org\".\nOtsingus peab olema vähemalt tipptaseme domeen, näiteks \"*.org\".<br />\nToetatud {{PLURAL:$2|protokoll|protokollid}}: $1 (määramata protokolli korral vaikimisi http://).",
        "linksearch-line": "$1 on lingitud leheküljelt $2",
        "linksearch-error": "Metamärk võib olla ainult internetiaadressi alguses.",
        "listusersfrom": "Näita kasutajaid alates:",
        "rollback-success": "Tühistati muudatused, mille tegi $1;\npöörduti tagasi viimasele muudatusele, mille tegi $2.",
        "sessionfailure-title": "Seansiviga",
        "sessionfailure": "Sinu sisselogimisseansiga näib probleem olevat.\nSee toiming on seansiärandamise vastase ettevaatusabinõuna tühistatud.\nMine tagasi eelmisele leheküljele ja taaslaadi see, seejärel proovi uuesti.",
+       "changecontentmodel": "Lehekülje sisumudeli muutmine",
+       "changecontentmodel-legend": "Sisumudeli muutmine",
+       "changecontentmodel-title-label": "Lehekülje pealkiri",
+       "changecontentmodel-model-label": "Uus sisumudel",
+       "changecontentmodel-reason-label": "Põhjus:",
+       "changecontentmodel-success-title": "Sisumudel on muudetud",
+       "changecontentmodel-success-text": "Lehekülje [[:$1]] sisumudel on muudetud.",
+       "changecontentmodel-cannot-convert": "Lehekülje [[:$1]] sisumudelit ei saa teisendada tüübiks $2.",
+       "changecontentmodel-title-cantexist": "Lehekülg ei saa olla pealkirja \"$1\" all.",
+       "changecontentmodel-nodirectediting": "Sisumudel $1 ei võimalda otseredigeerimist.",
+       "log-name-contentmodel": "Sisumudeli muutmislogi",
+       "log-description-contentmodel": "Lehekülje sisumudelite muutmisega seotud sündmused",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|muutis}} lehekülje \"$3\" sisumudeli: \"$4\" → \"$5\"",
+       "logentry-contentmodel-change-revertlink": "võta tagasi",
+       "logentry-contentmodel-change-revert": "tagasi võetud",
        "protectlogpage": "Kaitsmislogi",
        "protectlogtext": "Allpool on loetletud lehekülgede kaitsetasemete muutmised. Praegu kaitstud lehekülgi vaata [[Special:ProtectedPages|kaitstud lehtede loetelust]].",
        "protectedarticle": "kaitses lehekülje \"[[$1]]\"",
        "tooltip-pt-logout": "Logi välja",
        "tooltip-pt-createaccount": "See pole küll kohustuslik, aga sul tasub konto luua ja sisse logida.",
        "tooltip-ca-talk": "Arutelu selle lehekülje sisu kohta",
-       "tooltip-ca-edit": "Sa saad seda lehekülge muuta. Palun kasuta enne salvestamist eelvaadet.",
+       "tooltip-ca-edit": "Muuda seda lehekülge",
        "tooltip-ca-addsection": "Lisa uus alaosa",
        "tooltip-ca-viewsource": "See lehekülg on kaitstud.\nSaad vaadata selle lähteteksti.",
        "tooltip-ca-history": "Selle lehekülje varasemad redaktsioonid",
        "pageinfo-robot-index": "Lubatud",
        "pageinfo-robot-noindex": "Keelatud",
        "pageinfo-watchers": "Lehekülje jälgijate arv",
+       "pageinfo-visiting-watchers": "Viimaseid muudatusi külastanud jälgijate arv",
        "pageinfo-few-watchers": "Alla {{PLURAL:$1|ühe jälgija|$1 jälgija}}",
+       "pageinfo-few-visiting-watchers": "Pole kindel, kas jälgijatest keegi külastab viimaseid muudatusi.",
        "pageinfo-redirects-name": "Sellele leheküljele suunatud lehekülgi",
        "pageinfo-subpages-name": "Selle lehekülje alamlehekülgi",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|ümbersuunamine|ümbersuunamist}}; $3 {{PLURAL:$3|mitteümbersuunamine|mitteümbersuunamist}})",
        "htmlform-cloner-create": "Lisa veel",
        "htmlform-cloner-delete": "Eemalda",
        "htmlform-cloner-required": "Vähemalt üks väärtus on nõutav.",
+       "htmlform-title-badnamespace": "[[:$1]] pole nimeruumis \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "Pealkirja \"$1\" all ei saa lehekülge alustada.",
+       "htmlform-title-not-exists": "Lehekülge [[:$1]] pole olemas.",
+       "htmlform-user-not-exists": "Kasutajat <strong>$1</strong> pole olemas.",
+       "htmlform-user-not-valid": "<strong>$1</strong> pole sobiv kasutajanimi.",
        "sqlite-has-fts": "$1 koos täistekstiotsingu toega",
        "sqlite-no-fts": "$1 ilma täistekstiotsingu toeta",
        "logentry-delete-delete": "$1 {{GENDER:$2|kustutas}} lehekülje $3",
index 0a74c8f..12bc1d8 100644 (file)
        "prefs-rc": "Azken aldaketak",
        "prefs-watchlist": "Jarraipen zerrenda",
        "prefs-editwatchlist": "Aldatu jarraipen-zerrenda",
+       "prefs-editwatchlist-label": "Editatu sarrerak zure jarraipen zerrendan:",
+       "prefs-editwatchlist-edit": "Zure jarraipen zerrendako tituluak ikusi eta kendu",
        "prefs-editwatchlist-clear": "Garbitu zure jarraipen-zerrenda",
        "prefs-watchlist-days": "Jarraipen zerrendan erakutsi beharreko egun kopurua:",
        "prefs-watchlist-days-max": "Gehienez $1 {{PLURAL:$1|egun|egun}}",
        "action-viewmywatchlist": "zure jarraipen zerrenda ikusi",
        "action-viewmyprivateinfo": "zure informazio pribatua ikusi",
        "action-editmyprivateinfo": "zure informazio pribatua aldatu",
+       "action-managechangetags": "Etiketak sortu eta ezabatu datu basean",
        "nchanges": "{{PLURAL:$1|aldaketa 1|$1 aldaketa}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|azkeneko bisitatik}}",
        "enhancedrc-history": "historia",
        "randomincategory-invalidcategory": "\"$1\" ez da kategoria izen baliagarri bat.",
        "randomincategory-nopages": "Ez dago orrialderik [[:Category:$1|$1]] kategorian.",
        "randomincategory-category": "Kategoria:",
+       "randomincategory-legend": "Kategoriako ausazko orrialdea",
        "randomincategory-submit": "Joan",
        "randomredirect": "Ausazko birbideratzea",
        "randomredirect-nopages": "Ez dago birzuzenketarik \"$1\" izen-tartean.",
        "linksearch-pat": "Bilaketa katea:",
        "linksearch-ns": "Izen-tartea:",
        "linksearch-ok": "Bilatu",
-       "linksearch-text": "\"*.wikipedia.org\" bezalako izartxoak erabil daitezke.\nGutxienez goi mailako domeinua behar du, adibidez \"*.org\".<br />\nBaimendutako {{PLURAL:$2|protokoloa|protokoloak}}: <code>$1</code> (protokoloa zehazten ez bada http:// hartzen da lehenetsitzat).",
+       "linksearch-text": "\"*.wikipedia.org\" bezalako izartxoak erabil daitezke.\nGutxienez goi mailako domeinua behar du, adibidez \"*.org\".<br />\nBaimendutako {{PLURAL:$2|protokoloa|protokoloak}}: $1 (protokoloa zehazten ez bada http:// hartzen da lehenetsitzat).",
        "linksearch-line": "$1, $2(e)tik lotuta",
        "linksearch-error": "Komodinak izenaren hasieran bakarrik agertu beharko lirateke.",
        "listusersfrom": "Honela hasten diren erabiltzaileak bistaratu:",
        "listgrouprights-removegroup-all": "Talde guztiak kendu daitezke",
        "listgrouprights-addgroup-self-all": "Talde guztiak norbere kontura gehitu",
        "listgrouprights-removegroup-self-all": "Talde guztiak norbere kontutik ezabatu",
+       "listgrouprights-namespaceprotection-namespace": "Izen-tartea",
+       "trackingcategories-disabled": "Kategoria desgaitua dago",
        "mailnologin": "Bidalketa helbiderik ez",
        "mailnologintext": "Beste erabiltzaileei e-posta mezuak bidaltzeko [[Special:UserLogin|saioa hasi]] eta baliozko e-posta helbidea behar duzu izan zure [[Special:Preferences|hobespenetan]].",
        "emailuser": "Erabiltzaile honi e-posta bidali",
        "emailccsubject": "Zure mezuaren kopia $1(r)i: $2",
        "emailsent": "Mezua bidali egin da",
        "emailsenttext": "Zure e-posta mezua bidali egin da.",
-       "emailuserfooter": "E-posta hau $1(e)k bidali dio $2(r)i {{SITENAME}}ko \"E-posta bidali\" funtzioa erabiliz.",
+       "emailuserfooter": "E-posta hau $1(e)k bidali dio $2(r)i {{SITENAME}}ko \"{{int:emailpage}}\" funtzioa erabiliz.",
        "usermessage-summary": "Sistema mezua uzten.",
        "usermessage-editor": "Sistemako mezularia",
        "watchlist": "Jarraipen zerrenda",
        "mywatchlist": "Jarraipen zerrenda",
        "watchlistfor2": "$1 ($2)",
        "nowatchlist": "Zure jarraipen zerrenda hutsik dago.",
-       "watchlistanontext": "Mesedez $1 zure jarraipen zerrendako orrialdeak ikusi eta aldatu ahal izateko.",
+       "watchlistanontext": "Mesedez saioa hasi zure jarraipen zerrendako orrialdeak ikusi eta aldatu ahal izateko.",
        "watchnologin": "Saioa hasi gabe",
        "addwatch": "Jarraipen zerrendara gehitu",
        "addedwatchtext": "«[[:$1]]» orria zure [[Special:Watchlist|jarraipen zerrendara]] erantsi da. \n\nOrri honetan aurrerantzean egindako aldaketak zerrenda horretan agertuko dira.",
+       "addedwatchtext-short": "$1 orria zure jarraipen zerrendara gehitu da.",
        "removewatch": "Kendu zure jarraipen zerrendatik",
        "removedwatchtext": "\"[[:$1]]\" orrialdea zure [[Special:Watchlist|jarraipen zerrendatik]] kendu da.",
+       "removedwatchtext-short": "$1 orria zure jarraipen zerrendatik ezabatu da.",
        "watch": "Jarraitu",
        "watchthispage": "Orrialde hau jarraitu",
        "unwatch": "Ez jarraitu",
        "sessionfailure-title": "Saio-akatsa",
        "sessionfailure": "Badirudi saioarekin arazoren bat dagoela; bandalismoak saihesteko ekintza hau ezeztatu egin da. Mesedez, nabigatzaileko \"atzera\" botoian klik egin, hona ekarri zaituen orrialde hori berriz kargatu, eta saiatu berriz.",
        "changecontentmodel-title-label": "Orriaren izenburua",
+       "logentry-contentmodel-change-revertlink": "desegin",
+       "logentry-contentmodel-change-revert": "desegin",
        "protectlogpage": "Babes erregistroa",
        "protectlogtext": "Orri-babesteen zerrenda ageri da jarraian.\nIkus [[Special:ProtectedPages|orri babestuen zerrenda]], orain indarrean dauden orri babesen zerrenda ikusteko.",
        "protectedarticle": "\"[[$1]]\" babestu da\"",
        "redirect-lookup": "Ikuskatu:",
        "redirect-value": "Balioa:",
        "redirect-user": "Erabiltzailearen identifikazioa (ID):",
+       "redirect-page": "Orriaren IDa",
        "redirect-revision": "Orrialdearen berrikuspena",
        "redirect-file": "Fitxategiaren izena",
        "redirect-not-exists": "Ez da baliorik aurkitu",
        "tags-tag": "Etiketaren izena",
        "tags-display-header": "Aldaketa zerrenden itxura",
        "tags-description-header": "Esanahiaren deskribapen osoa",
+       "tags-source-header": "Iturria",
        "tags-active-header": "Aktiboa?",
        "tags-hitcount-header": "Etiketatutako aldaketak",
        "tags-actions-header": "Ekintzak",
        "tags-edit": "aldatu",
        "tags-delete": "ezabatu",
        "tags-activate": "aktibatu",
+       "tags-deactivate": "desaktibatu",
        "tags-hitcount": "$1 {{PLURAL:$1|aldaketa|aldaketa}}",
+       "tags-create-heading": "Etiketa berria sortu",
+       "tags-create-tag-name": "Etiketaren izena:",
        "tags-create-reason": "Arrazoia:",
        "tags-create-submit": "Sortu",
+       "tags-delete-title": "Etiketa ezabatu",
        "tags-delete-reason": "Arrazoia:",
        "tags-activate-reason": "Arrazoia:",
        "tags-activate-submit": "Aktibatu",
        "tags-deactivate-reason": "Arrazoia:",
+       "tags-deactivate-submit": "Desaktibatu",
        "tags-edit-new-tags": "Etiketa berriak:",
        "tags-edit-add": "Gehitu etiketa hauek:",
        "tags-edit-remove": "Kendu etiketa hauek:",
        "rightsnone": "(bat ere ez)",
        "revdelete-summary": "aldaketaren laburpena",
        "feedback-adding": "Orriari feedbacka gehitzen...",
+       "feedback-back": "Atzera",
        "feedback-bugnew": "Txekeatu dut. Bug berria bidaliko",
        "feedback-cancel": "Utzi",
        "feedback-close": "Egina",
+       "feedback-error-title": "Errorea",
        "feedback-error1": "Akatsa: APIaren emaitza ez ezagunak",
        "feedback-error2": "Akatsa: Aldaketa ez da egin",
        "feedback-error3": "Akatsa: APIaren erantzunik gabe",
        "feedback-message": "Mezua:",
        "feedback-subject": "Gaia:",
        "feedback-submit": "Bidali",
+       "feedback-thanks-title": "Eskerrik asko!",
        "searchsuggest-search": "Bilatu",
        "searchsuggest-containing": "edukian...",
        "api-error-badaccess-groups": "Ez duzu baimendik fitxategi hauek wiki honetara igotzeko.",
        "expand_templates_remove_nowiki": "Ezabatu <nowiki> etiketen emaitzak",
        "expand_templates_generate_xml": "Erakutsi XML parse zuhaitza",
        "expand_templates_preview": "Aurreikusi",
+       "pagelanguage": "Orriaren hizkuntza aukeratu",
        "pagelang-language": "Hizkuntza",
+       "pagelang-use-default": "Hizkuntza lehenetsia erabili",
        "pagelang-select-lang": "Hizkuntza aukeratu",
        "right-pagelang": "Aldatu orrialdearen hizkuntza",
        "action-pagelang": "orrialdearen hizkuntza aldatu",
index 97dc38f..5afd8b3 100644 (file)
@@ -46,7 +46,8 @@
                        "Arash.pt",
                        "Signal89",
                        "Macofe",
-                       "Danialbehzadi"
+                       "Danialbehzadi",
+                       "MRG90"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
        "creating": "ایجاد $1",
        "editingsection": "در حال ویرایش $1 (بخش)",
        "editingcomment": "در حال ویرایش $1 (بخش تازه)",
-       "editconflict": "اÙ\85کاÙ\86 Ø°Ø®Û\8cرÙ\87â\80\8cسازÛ\8c ØªØºÛ\8cÛ\8cرات {{GENDER:|Ø´Ù\85ا}} Ù\86بÙ\88د Ø²Û\8cرا ØªØ¹Ø§Ø±Ø¶ Ù\88Û\8cراÛ\8cØ´Û\8c Ø±Ø® Ø¯Ø§Ø¯. Ø¢Û\8cا Ù\85Û\8câ\80\8cØ®Ù\88اÙ\87Û\8cد ØªØ¹Ø§Ø±Ø¶ Ø±Ø§ Ø¨Ù\87 ØµÙ\88رت Ø¯Ø³ØªÛ\8c Ø­Ù\84 Ú©Ù\86Û\8cدØ\9f",
+       "editconflict": "تعارض Ù\88Û\8cراÛ\8cØ´Û\8c: $1",
        "explainconflict": "از وقتی ویرایش این صفحه را آغاز کرده‌اید شخص دیگری آن را تغییر داده است.\nناحیهٔ متنی بالایی شامل متن صفحه به شکل کنونی آن است.\nتغییرات شما در ناحیهٔ متنی پایینی نشان داده شده‌است.\nشما باید تغییراتتان را با متن کنونی ترکیب کنید.\nبا فشردن دکمهٔ «{{int:savearticle}}» <strong>فقط</strong> متن ناحیهٔ متنی بالایی ذخیره خواهد شد.",
        "yourtext": "متن شما",
        "storedversion": "نسخهٔ ذخیره شده",
        "readonlywarning": "'''هشدار: پایگاه داده برای نگهداری قفل شده‌است، به همین علت هم‌اکنون نمی‌توانید ویرایش‌هایتان را ذخیره کنید.'''\nاگر می‌خواهید متن را در یک پروندهٔ متنی کپی کنید و برای آینده ذخیره‌اش کنید.\n\nمدیری که آن را قفل کرده این توضیح را ارائه کرده‌است: $1",
        "protectedpagewarning": "'''هشدار: این صفحه قفل شده‌است تا فقط کاربران با دسترسی مدیریت بتوانند ویرایشش کنند.'''\nآخرین موارد سیاهه در زیر آمده‌است:",
        "semiprotectedpagewarning": "'''توجه:''' این صفحه قفل شده‌است تا تنها کاربران ثبت‌نام‌کرده قادر به ویرایش آن باشند.\nآخرین موارد سیاهه در زیر آمده‌است:",
-       "cascadeprotectedwarning": "'''هشدار:''' این صفحه به علت قرارگرفتن در {{PLURAL:$1|صفحهٔ|صفحه‌های}} آبشاری-محافظت‌شدهٔ زیر قفل شده‌است تا فقط مدیران بتوانند ویرایشش کنند.",
+       "cascadeprotectedwarning": "<strong>هشدار:</strong> این صفحه به علت قرارگرفتن در {{PLURAL:$1|صفحهٔ|صفحه‌های}} آبشاری-محافظت‌شدهٔ زیر قفل شده‌است تا فقط مدیران بتوانند ویرایشش کنند.",
        "titleprotectedwarning": "'''هشدار: این صفحه به شکلی قفل شده‌است که برای ایجاد آن [[Special:ListGroupRights|اختیارات خاصی]] لازم است.'''\nآخرین موارد سیاهه در زیر آمده است:",
        "templatesused": "{{PLURAL:$1|الگوی|الگوهای}} به‌کاررفته در این صفحه:",
        "templatesusedpreview": "{{PLURAL:$1|الگوی|الگوهای}} استفاده شده در این پیش‌نمایش:",
        "rclistfrom": "نمایش تغییرات تازه با شروع از $3 $2",
        "rcshowhideminor": "$1 ویرایش‌های جزئی",
        "rcshowhideminor-show": "نمایش",
-       "rcshowhideminor-hide": "Ù¾Ù\86Ù\87اÙ\86 Ú©Ø±Ø¯ن",
+       "rcshowhideminor-hide": "Ù\86Ù\87Ù\81تن",
        "rcshowhidebots": "$1 ربات‌ها",
        "rcshowhidebots-show": "نمایش",
-       "rcshowhidebots-hide": "Ù¾Ù\86Ù\87اÙ\86 Ú©Ø±Ø¯ن",
+       "rcshowhidebots-hide": "Ù\86Ù\87Ù\81تن",
        "rcshowhideliu": "$1 کاربران ثبت‌نام‌کردە",
        "rcshowhideliu-show": "نمایش",
-       "rcshowhideliu-hide": "Ù¾Ù\86Ù\87اÙ\86 Ú©Ø±Ø¯ن",
+       "rcshowhideliu-hide": "Ù\86Ù\87Ù\81تن",
        "rcshowhideanons": "$1 کاربران ناشناس",
        "rcshowhideanons-show": "نمایش",
-       "rcshowhideanons-hide": "Ù¾Ù\86Ù\87اÙ\86 Ú©Ø±Ø¯ن",
+       "rcshowhideanons-hide": "Ù\86Ù\87Ù\81تن",
        "rcshowhidepatr": "$1 ویرایش‌های گشت‌خورده",
        "rcshowhidepatr-show": "نمایش",
-       "rcshowhidepatr-hide": "Ù¾Ù\86Ù\87اÙ\86 Ú©Ø±Ø¯ن",
+       "rcshowhidepatr-hide": "Ù\86Ù\87Ù\81تن",
        "rcshowhidemine": "$1 ویرایش‌های من",
        "rcshowhidemine-show": "نمایش",
-       "rcshowhidemine-hide": "Ù¾Ù\86Ù\87اÙ\86 Ú©Ø±Ø¯ن",
+       "rcshowhidemine-hide": "Ù\86Ù\87Ù\81تن",
        "rclinks": "نمایش آخرین $1 تغییر در $2 روز اخیر<br />$3",
        "diff": "تفاوت",
        "hist": "تاریخچه",
        "uploaded-hostile-svg": "سی‌اس‌اس نا امن در عنصر سبک پروندهٔ بارگذاری شدهٔ اس‌وی‌جی یافت شد.",
        "uploaded-event-handler-on-svg": "قرار دادن ویژگی‌های مدیریت رویداد <code>$1=\"$2\"</code> در پرونده‌های اس‌وی‌جی مجاز نیست.",
        "uploaded-href-attribute-svg": "ویژگی‌های href <code>&lt;$1 $2=\"$3\"&gt;</code> با هدف غیر محلی (برای نمونه، http://, javascript:, etc) در پرونده‌های اس‌وی‌جی مجاز نیست.",
+       "uploaded-href-unsafe-target-svg": "در پرونده SVG بارگذاری‌شده برای هدف نادرست <code>&lt;$1 $2=\"$3\"&gt;</code> برچسب href یافت شد.",
+       "uploaded-animate-svg": "برچسب  \"animate\" یافت شده ممکن است herf را تغییر دهد. از مشخصه \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> در پرونده SVG بارگذاری‌شده استفاده کنید.",
+       "uploaded-setting-event-handler-svg": "تنظیمات مشخصه گرداننده رویداد بسته شده‌است. کد <code>&lt;$1 $2=\"$3\"&gt;</code>  در پرونده بارگذاری‌شده یافت شد.",
+       "uploaded-setting-href-svg": "استفاده از برچسب \"set\" برای افزودن مشخصهٔ \"href\" به عنصر والد بسته شده",
+       "uploaded-wrong-setting-svg": "استفاده از برچسب \"set\" برای افزودن remote/data/script هدف برای هر مشخصهٔ بسته شده در پرونده SVG بارگذاری شده <code>&lt;set to=\"$1\"&gt;</code> یافت شد.",
+       "uploaded-setting-handler-svg": "پرونده SVG تنظیم شده با مشخصهٔ \"handler\"  با remote/data/script بسته شده‌است. در پروندهٔ بارگذاری‌شده <code>$1=\"$2\"</code> یافت شد.",
+       "uploaded-remote-url-svg": "پرونده SVG تنظیم شده با remote URL بسته شده‌است. در پروندهٔ بارگذاری‌شده <code>$1=\"$2\"</code> یافت شد.",
+       "uploaded-image-filter-svg": "پالایه پرونده در نشانی:<code>&lt;$1 $2=\"$3\"&gt;</code>  در پرونده SVG بارگذاری‌شده یافت شد.",
        "uploadscriptednamespace": "این پوشه اس‌وی‌جی شامل فضای نام غیرقانونی '$1' است",
        "uploadinvalidxml": "XML در پروندهٔ بارگذاری‌شده نمی‌تواند تجزیه شود.",
        "uploadvirus": "این پرونده ویروس دارد!\nجزئیات : $1",
        "linksearch-pat": "الگوی جستجو:",
        "linksearch-ns": "فضای نام:",
        "linksearch-ok": "جستجو",
-       "linksearch-text": "نشانه‌هایی مانند «‎*.wikipedia.org» را می‌توان استفاده کرد.\nحداقل یک دامنه سطح بالا ، به عنوان مثال \"*.org\" نیاز دارد.<br />\n{{PLURAL:$2|پروتکل|پروتکل‌های}} پشتیبانی‌شده: <code>$1</code> (پیش‌فرض برای http:// در صورت مشخص نشدن پروتکل تنظیم شده‌است).",
+       "linksearch-text": "نشانه‌هایی مانند «‎*.wikipedia.org» را می‌توان استفاده کرد.\nحداقل یک دامنه سطح بالا ، به عنوان مثال \"*.org\" نیاز دارد.<br />\n{{PLURAL:$2|پروتکل|پروتکل‌های}} پشتیبانی‌شده: $1 (پیش‌فرض برای http:// در صورت مشخص نشدن پروتکل تنظیم شده‌است).",
        "linksearch-line": "$1 از $2 پیوند دارد",
        "linksearch-error": "نشانه‌ها فقط در ابتدای نام میزبان اینترنتی می‌توانند استفاده شوند.",
        "listusersfrom": "نمایش کاربران با شروع از:",
        "rollback-success": "ویرایش‌های $1 واگردانی شد؛\nصفحه به آخرین ویرایش $2 برگردانده شد.",
        "sessionfailure-title": "خطای نشست کاربری",
        "sessionfailure": "به نظر می‌رسد مشکلی در مورد نشست کاربری شما وجود دارد؛\nعمل درخواست شده در اقدامی پیشگیرانه در برابر ربوده‌شدن اطلاعات نشست کاربری، لغو شد.\nلطفاً دکمهٔ «بازگشت» را در مرورگر خود بفشارید و صفحه‌ای که از آن به اینجا رسیده‌اید را دوباره فراخوانی کنید، سپس مجدداً سعی کنید.",
+       "changecontentmodel": "ویرایش نمونه محتوای یک صفحه",
+       "changecontentmodel-legend": "تغییر نوع محتوی",
+       "changecontentmodel-title-label": "عنوان صفحه",
+       "changecontentmodel-model-label": "نمونه محتوای جدید",
+       "changecontentmodel-reason-label": "دلیل:",
+       "changecontentmodel-success-title": "نمونه محتوی تغییر یافت",
+       "changecontentmodel-success-text": "نوع محتوی [[:$1]]  تغییر یافت",
+       "changecontentmodel-cannot-convert": "محتوی در [[:$1]] نمی‌تواند به گونه‌ای از $2 تبدیل شود.",
+       "changecontentmodel-title-cantexist": "امکان داشتن صفحه در $1 نیست.",
+       "changecontentmodel-nodirectediting": "نمونه محتوی $1 امکان ویرایش مستقیم را پشتیبانی نمی‌کند",
+       "log-name-contentmodel": "سیاهه تغییر نمونه محتوی",
+       "log-description-contentmodel": "رویدادهای مرتبط با نمونه محتوی‌های یک صفحه",
+       "logentry-contentmodel-change": "نمونه محتوای صفحهٔ $3 از \"$4\" به \"$5\" توسط $1 {{GENDER:$2|تغییر داده شد}}",
+       "logentry-contentmodel-change-revertlink": "واگردانی",
+       "logentry-contentmodel-change-revert": "واگردانی",
        "protectlogpage": "سیاههٔ محافظت",
        "protectlogtext": "در زیر فهرستی از تغییرات سطح محافظت صفحه‌ها آمده‌است.\n[[Special:ProtectedPages|فهرست صفحه‌های محافظت‌شده]] را برای دیدن فهرست محافظت‌های مؤثر صفحه‌ها ببینید.",
        "protectedarticle": "«[[$1]]» را محافظت کرد",
        "protect-locked-blocked": "شما در مدتی که دسترسی‌تان قطع است نمی‌توانید سطح محافظت صفحات را تغییر دهید.\nتنظیمات فعلی صفحهٔ '''$1''' از این قرار است:",
        "protect-locked-dblock": "به دلیل قفل شدن پایگاه داده، امکان تغییر سطح محافظت صفحه وجود ندارد.\nتنظیمات فعلی صفحهٔ '''$1''' به این قرار است:",
        "protect-locked-access": "حساب کاربری شما اجازهٔ تغییر سطح محافظت صفحه را ندارد.\nتنظیمات فعلی صفحهٔ '''$1''' به این قرار است:",
-       "protect-cascadeon": "این صفحه  در حال حاضر محافظت شده‌است زیرا در {{PLURAL:$1|صفحهٔ|صفحه‌های}} زیر که گزینهٔ محافظت آبشاری {{PLURAL:$1|آن|آن‌ها}} فعال است، گنجانده شده است.\nتغییراتی به سطح محافظت این صفحه به محافظت ابشاری تأثیر نخواهد گذاشت.",
+       "protect-cascadeon": "این صفحه در حال حاضر محافظت شده‌است زیرا در {{PLURAL:$1|صفحهٔ|صفحه‌های}} زیر که گزینهٔ محافظت آبشاری {{PLURAL:$1|آن|آن‌ها}} فعال است، گنجانده شده است.\nتغییراتی به سطح محافظت این صفحه به محافظت ابشاری تأثیر نخواهد گذاشت.",
        "protect-default": "همهٔ کاربرها",
        "protect-fallback": "فقط به کاربرهایی که دسترسی «$1» دارند، اجازه داده می‌شود",
        "protect-level-autoconfirmed": "تنها کاربران تأییدشده",
        "tooltip-pt-logout": "خروج از سامانه",
        "tooltip-pt-createaccount": "از شما دعوت می‌شود که حساب کاربری بسازید و به سامانه وارد شوید؛ هرچند که ساخت حساب کاربری اختیاری است.",
        "tooltip-ca-talk": "گفتگو پیرامون محتوای صفحه",
-       "tooltip-ca-edit": "شما می‌توانید این صفحه را ویرایش کنید. لطفاً پیش از ذخیره از دکمهٔ پیش‌نمایش استفاده کنید.",
+       "tooltip-ca-edit": "ویرایش این صفجه با استفاده از ویکی‌متن",
        "tooltip-ca-addsection": "بخشی جدید ایجاد کنید",
        "tooltip-ca-viewsource": "این صفحه محافظت‌شده‌است.\nمی‌توانید متن مبدأ آن را ببینید",
        "tooltip-ca-history": "نسخه‌های پیشین این صفحه",
        "pageinfo-robot-index": "مجاز",
        "pageinfo-robot-noindex": "نامجاز",
        "pageinfo-watchers": "شمار پی‌گیری‌کنندگان صفحه",
+       "pageinfo-visiting-watchers": "تعداد پیگیری‌کنندگان صفحه که تغییرات اخیر را بازبینی کرده‌اند",
        "pageinfo-few-watchers": "کمتر از  $1 {{PLURAL:$1| پی‌گیر|پی‌گیر}}",
+       "pageinfo-few-visiting-watchers": "امکان دارد یا ندارد که کاربری ویرایش‌های اخیر را بازبینی کرده باشد",
        "pageinfo-redirects-name": "تعداد تغییرمسیرها به این صفحه",
        "pageinfo-subpages-name": "زیرصفحه‌های این صفحه",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|تغییرمسیر|تغییرمسیر}}; $3 {{PLURAL:$3|غیرتغییرمسیر|غیرتغییرمسیر}})",
        "deletedwhileediting": "'''هشدار''': این صفحه پس از اینکه شما آغاز به ویرایش آن کرده‌اید، حذف شده است!",
        "confirmrecreate": "کاربر [[User:$1|$1]] ([[User talk:$1|بحث]]) این مقاله را پس از اینکه شما آغاز به ویرایش آن نموده‌اید به دلیل زیر حذف کرده است :\n: ''$2''\nلطفاً تأیید کنید که مجدداً می‌خواهید این مقاله را بسازید.",
        "confirmrecreate-noreason": "کاربر [[User:$1|$1]] ([[User talk:$1|بحث]]) این صفحه را پس از شروع ویرایش‌تان پاک کرده‌است.  لطفاً تأیید کنید که شما واقعاً می‌خواهید آن را دوباره ایجاد کنید.",
-       "recreate": "صÙ\81Ø­Ù\87 Ø§Ø² Ø²Ù\85اÙ\86Û\8c Ú©Ù\87 Ø´Ù\85ا Ù\85شغÙ\88Ù\84 Ù\88Û\8cراÛ\8cØ´ Ø´Ø¯Û\8cد Ø­Ø°Ù\81 Ø´Ø¯. Ø¨Ø±Ø§Û\8c Ø³Ø§Ø®Øª Ù\85جدد ØµÙ\81Ø­Ù\87 \"$1\" Ø±Ø§ Ù\81شار Ø¯Ù\87Û\8cد.",
+       "recreate": "باز Ø§Û\8cجاد",
        "confirm_purge_button": "تأیید",
        "confirm-purge-top": "پاک‌کردن نسخهٔ حافظهٔ نهانی (Cache) این صفحه را تأیید می‌کنید؟",
        "confirm-purge-bottom": "خالی کردن میانگیر یک صفحه باعث می‌شود که آخرین نسخهٔ آن نمایش یابد.",
        "htmlform-cloner-create": "افزودن بیشتر",
        "htmlform-cloner-delete": "حذف",
        "htmlform-cloner-required": "حداقل یک مقدار مورد نیاز است.",
+       "htmlform-title-badnamespace": "[[:$1]] در فضای نام \"{{ns:$2}}\"  موجود نیست.",
+       "htmlform-title-not-creatable": "\"$1\" عنوان قابل ایجاد نیست",
+       "htmlform-title-not-exists": "[[:$1]] وجود ندارد.",
+       "htmlform-user-not-exists": "<strong>$1</strong> وجود ندارد.",
+       "htmlform-user-not-valid": "حساب کاربری <strong>$1</strong> معتبر نیست.",
        "sqlite-has-fts": "$1 با پشتیبانی از جستجو در متن کامل",
        "sqlite-no-fts": "$1 بدون پشتیبانی از جستجو در متن کامل",
        "logentry-delete-delete": "$1 صفحهٔ $3 را {{GENDER:$2|حذف کرد}}",
index a76cdcd..ac78994 100644 (file)
@@ -44,7 +44,8 @@
                        "SMAUG",
                        "SuperPete",
                        "McSalama",
-                       "Macofe"
+                       "Macofe",
+                       "Beluga"
                ]
        },
        "tog-underline": "Linkkien alleviivaus:",
        "searchrelated": "samankaltainen",
        "searchall": "kaikki",
        "showingresults": "Alla on vain {{PLURAL:$1|<strong>1</strong> hakutulos|<strong>$1</strong> hakutulosta}} alkaen tuloksesta nro <strong>$2</strong>.",
-       "showingresultsinrange": "Alla näytetään {{PLURAL:$1|<strong>1</strong> tulos|<strong>$1</strong> tulosta}} väliltä <strong>$2</strong> – <strong>$3</strong>.",
+       "showingresultsinrange": "Alla näytetään {{PLURAL:$1|<strong>1</strong> tulos|<strong>$1</strong> tulosta}} väliltä <strong>$2</strong><strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Tulos <strong>$1</strong> enimmäismäärästä <strong>$3</strong>|Tulokset <strong>$1 – $2</strong> enimmäismäärästä <strong>$3</strong>}}",
        "search-nonefound": "Hakusi ei tuottanut tulosta.",
        "powersearch-legend": "Laajennettu haku",
        "linksearch-pat": "Hakuehto:",
        "linksearch-ns": "Nimiavaruus:",
        "linksearch-ok": "Etsi",
-       "linksearch-text": "Jokerimerkkejä, kuten \"*.wikipedia.org\", voidaan käyttää.\nVaaditaan vähintään ylätason verkkotunnus, esimerkiksi \"*.org\".<br />\n{{PLURAL:$2|Tuettu protokolla|Tuetut protokollat}}: <code>$1</code> (oletuksena on <code>http://</code>, jos protokollaa ei määritetä).",
+       "linksearch-text": "Jokerimerkkejä, kuten \"*.wikipedia.org\", voidaan käyttää.\nVaaditaan vähintään ylätason verkkotunnus, esimerkiksi \"*.org\".<br />\n{{PLURAL:$2|Tuettu protokolla|Tuetut protokollat}}: $1 (oletuksena on <code>http://</code>, jos protokollaa ei määritetä).",
        "linksearch-line": "$1 on linkitetty sivulta $2",
        "linksearch-error": "Jokerimerkkiä voi käyttää ainoastaan osoitteen alussa.",
        "listusersfrom": "Käyttäjien tunnukset alkavat kirjaimilla:",
        "changecontentmodel-reason-label": "Syy:",
        "changecontentmodel-success-title": "Sisältömallia on muutettu",
        "changecontentmodel-success-text": "Sisältötyyppiä kohteessa [[:$1]] on muutettu.",
+       "changecontentmodel-cannot-convert": "Sisältöä sivulla [[:$1]] ei voida muuntaa tyypiksi $2.",
        "changecontentmodel-title-cantexist": "Ei ole mahdollista, että kohteessa $1 on sivua.",
        "changecontentmodel-nodirectediting": "Sisältömalli $1 ei tue suoraa muokkaamista",
        "log-name-contentmodel": "Sisältömallin muutosloki",
        "log-description-contentmodel": "Tapahtumat, jotka liittyvät sivun sisältömalleihin",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|muutti}} sivun $3 sisältömallia muodosta \"$4\" muotoon \"$5\"",
        "logentry-contentmodel-change-revertlink": "kumoa",
        "logentry-contentmodel-change-revert": "kumottu",
        "protectlogpage": "Suojausloki",
        "pageinfo-length": "Sivun pituus (tavuina)",
        "pageinfo-article-id": "Sivun tunnistenumero",
        "pageinfo-language": "Sivun sisällön kieli",
-       "pageinfo-content-model": "Sivun sisällön muoto",
+       "pageinfo-content-model": "Sivun sisältömalli",
        "pageinfo-robot-policy": "Hakukonemerkinnät",
        "pageinfo-robot-index": "Indeksoitava",
        "pageinfo-robot-noindex": "Ei indeksoitava",
        "htmlform-cloner-create": "Lisää enemmän",
        "htmlform-cloner-delete": "Poista",
        "htmlform-cloner-required": "Vähintään yksi arvo on pakollinen.",
+       "htmlform-title-badnamespace": "Sivu [[:$1]] ei ole nimiavaruudessa ”{{ns:$2}}”.",
+       "htmlform-title-not-creatable": "”$1” ei kelpaa sivun nimeksi.",
+       "htmlform-title-not-exists": "Sivua [[:$1]] ei ole olemassa.",
+       "htmlform-user-not-valid": "<strong>$1</strong> ei ole kelvollinen käyttäjänimi.",
        "sqlite-has-fts": "$1, jossa on tuki kokotekstihaulle",
        "sqlite-no-fts": "$1, jossa ei ole tukea kokotekstihaulle",
        "logentry-delete-delete": "$1 {{GENDER:$2|poisti}} sivun $3",
index 696ed8e..d6ab4d8 100644 (file)
                        "Chlomoh",
                        "Wladek92",
                        "Framafan",
-                       "Lucky"
+                       "Lucky",
+                       "TomT0m"
                ]
        },
-       "tog-underline": "Souligner les liens :",
+       "tog-underline": "Soulignement des liens :",
        "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",
        "tog-numberheadings": "Numéroter automatiquement les titres de section",
        "tog-showtoolbar": "Afficher la barre d'outils de modification",
        "tog-editondblclick": "Modifier des pages sur double-clic",
-       "tog-editsectiononrightclick": "Activer la modification de sections par clic droit sur les titres",
-       "tog-watchcreations": "Ajouter les pages que je crée et les fichiers que j'importe à ma liste de suivi",
+       "tog-editsectiononrightclick": "Activer la modification des sections par un clic droit sur les titres de section",
+       "tog-watchcreations": "Ajouter à ma liste de suivi les pages que je crée et les fichiers que j'importe",
        "tog-watchdefault": "Ajouter les pages et les fichiers que je modifie à ma liste de suivi",
        "tog-watchmoves": "Ajouter les pages et les fichiers que je renomme à ma liste de suivi",
-       "tog-watchdeletion": "Ajouter les pages et les fichiers que je supprime à ma liste de suivi",
+       "tog-watchdeletion": "Ajouter à ma liste de suivi les pages et les fichiers que je supprime",
        "tog-watchrollback": "Ajouter à ma liste de suivi les pages sur lesquelles j’ai effectué une révocation",
        "tog-minordefault": "Marquer toutes mes modifications comme mineures par défaut",
        "tog-previewontop": "Afficher la prévisualisation au-dessus de la zone de modification",
        "tog-showhiddencats": "Afficher les catégories cachées",
        "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é",
+       "tog-prefershttps": "Toujours utiliser une connexion sécurisée en étant connecté(e)",
        "underline-always": "Toujours",
        "underline-never": "Jamais",
        "underline-default": "Valeur par défaut du navigateur ou du thème",
        "protectedinterface": "Cette page fournit du texte d'interface pour le logiciel sur ce wiki, et est protégée pour éviter les abus.\nPour ajouter ou modifier des traductions sur tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet de localisation de MediaWiki.",
        "editinginterface": "<strong>Attention :</strong> vous êtes en train de modifier une page utilisée pour créer le texte de l’interface du logiciel.\nLes changements sur cette page se répercuteront sur l’apparence de l’interface utilisateur pour les autres utilisateurs de ce wiki.",
        "translateinterface": "Pour ajouter ou modifier des traductions pour tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet de localisation de MédiaWiki.",
-       "cascadeprotected": "Cette page est protégée car elle est incluse par {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l’option « protection en cascade » activée :\n$2",
+       "cascadeprotected": "Cette page est protégée contre les modifications car elle est transcluse par {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l’option « protection en cascade » activée :\n$2",
        "namespaceprotected": "Vous n'avez pas la permission de modifier les pages de l'espace de noms « '''$1''' ».",
        "customcssprotected": "Vous n'avez pas la permission de modifier cette page de CSS, car elle contient les paramètres personnels d'un autre utilisateur.",
        "customjsprotected": "Vous n'avez pas la permission de modifier cette page de JavaScript, car elle contient les paramètres personnels d'un autre utilisateur.",
        "readonlywarning": "'''AVERTISSEMENT : la base de données a été verrouillée pour des opérations de maintenance. Vous ne pouvez donc pas publier vos modifications pour l’instant.'''\nVous pouvez copier et coller votre texte dans un fichier texte et l’enregistrer pour plus tard.\n\nL’administrateur ayant verrouillé la base de données a donné l’explication suivante : $1",
        "protectedpagewarning": "'''AVERTISSEMENT : cette page est protégée. Seuls les utilisateurs ayant le statut d'administrateur peuvent la modifier.'''<br />\nLa dernière entrée du journal est affichée ci-dessous pour référence :",
        "semiprotectedpagewarning": "'''Note :''' Cette page a été protégée de telle façon que seuls les contributeurs enregistrés puissent la modifier. La dernière entrée du journal est affichée ci-dessous pour référence :",
-       "cascadeprotectedwarning": "'''ATTENTION :''' Cette page a été protégée de manière à ce que seuls les administrateurs puissent la modifier. Cette protection est héritée par son inclusion par {{PLURAL:$1|la page protégée suivante, qui a|les pages protégées suivantes, qui ont}} la « protection en cascade » activée :",
+       "cascadeprotectedwarning": "'''ATTENTION :''' Cette page a été protégée de manière à ce que seuls les administrateurs puissent la modifier car elle est transcluse dans {{PLURAL:$1|la page protégée suivante, qui a|les pages protégées suivantes, qui ont}} la « protection en cascade » activée :",
        "titleprotectedwarning": "'''ATTENTION : Cette page a été protégée de telle manière que des [[Special:ListGroupRights|droits spécifiques]] sont requis pour pouvoir la créer.''' La dernière entrée du journal est affichée ci-dessous pour référence :",
        "templatesused": "{{PLURAL:$1|Modèle utilisé|Modèles utilisés}} par cette page :",
        "templatesusedpreview": "{{PLURAL:$1|Modèle utilisé|Modèles utilisés}} dans cette prévisualisation :",
        "linksearch-pat": "Expression recherchée :",
        "linksearch-ns": "Espace de noms :",
        "linksearch-ok": "Rechercher",
-       "linksearch-text": "Des caractères jokers comme « *.wikipedia.org » peuvent être utilisés.\nIls nécessitent au moins un domaine de niveau supérieur, par exemple « *.org ».<br />\n{{PLURAL:$2|Protocole reconnu|Protocoles reconnus}}: <code>$1</code> (http:// par défaut si aucun protocole n'est indiqué).",
+       "linksearch-text": "Des caractères jokers comme « *.wikipedia.org » peuvent être utilisés.\nIls nécessitent au moins un domaine de niveau supérieur, par exemple « *.org ».<br />\n{{PLURAL:$2|Protocole reconnu|Protocoles reconnus}}: $1 (http:// par défaut si aucun protocole n'est indiqué).",
        "linksearch-line": "$1 est lié depuis $2",
        "linksearch-error": "Les caractères jokers ne peuvent être utilisés qu'au début du nom de domaine de l'hôte.",
        "listusersfrom": "Afficher les utilisateurs à partir de :",
        "watcherrortext": "Une erreur s'est produite lors de la modification des paramètres de votre liste de suivi pour « $1 ».",
        "enotif_reset": "Marquer toutes les pages comme visitées",
        "enotif_impersonal_salutation": "Utilisateur de {{SITENAME}}",
-       "enotif_subject_deleted": "La page $1 sur {{SITENAME}} a été supprimée par {{GENDER:$2|$2}}",
-       "enotif_subject_created": "La page $1 sur {{SITENAME}} a été créée par {{GENDER:$2|$2}}",
-       "enotif_subject_moved": "La page $1 sur {{SITENAME}} a été renommée par {{GENDER:$2|$2}}",
-       "enotif_subject_restored": "La page $1 sur {{SITENAME}} a été restaurée par {{GENDER:$2|$2}}",
-       "enotif_subject_changed": "La page $1 sur {{SITENAME}} a été modifiée par {{GENDER:$2|$2}}",
+       "enotif_subject_deleted": "La page $1 sur {{SITENAME}} a été {{GENDER:$2|supprimée}} par $2",
+       "enotif_subject_created": "La page $1 sur {{SITENAME}} a été {{GENDER:$2|crée}} par $2",
+       "enotif_subject_moved": "La page $1 sur {{SITENAME}} a été {{GENDER:$2|renommée}} par $2",
+       "enotif_subject_restored": "La page $1 sur {{SITENAME}} a été {{GENDER:$2|restaurée}} par $2",
+       "enotif_subject_changed": "La page $1 sur {{SITENAME}} a été {{GENDER:$2|modifiée}} par $2",
        "enotif_body_intro_deleted": "La page $1 sur {{SITENAME}} a été effacée le $PAGEEDITDATE par {{gender:$2|$2}}, voir $3 pour la révision actuelle.",
        "enotif_body_intro_created": "La page $1 sur {{SITENAME}} a été créée le $PAGEEDITDATE par {{GENDER:$2|$2}}, voir $3 pour la révision actuelle.",
-       "enotif_body_intro_moved": "La page $1 sur {{SITENAME}} a été renommée le $PAGEEDITDATE par {{GENDER:$2|$2}}, voir $3 pour la révision actuelle.",
+       "enotif_body_intro_moved": "La page $1 sur {{SITENAME}} a été {{GENDER:$2|renommée}} le $PAGEEDITDATE par $2, voir $3 pour la révision actuelle.",
        "enotif_body_intro_restored": "La page $1 sur {{SITENAME}} a été restaurée le $PAGEEDITDATE par {{GENDER:$2|$2}}, voir $3 pour la révision actuelle.",
-       "enotif_body_intro_changed": "La page $1 sur {{SITENAME}} a été modifiée le $PAGEEDITDATE par {{GENDER:$2|$2}}, voir $3 pour la révision actuelle.",
+       "enotif_body_intro_changed": "La page $1 sur {{SITENAME}} a été {{GENDER:$2|modifiée}} le $PAGEEDITDATE par $2, voir $3 pour la révision actuelle.",
        "enotif_lastvisited": "Voyez $1 pour tous les changements depuis votre dernière visite.",
        "enotif_lastdiff": "Voyez $1 pour visualiser ces changements.",
        "enotif_anon_editor": "utilisateur non-enregistré $1",
        "protect-locked-blocked": "Vous ne pouvez pas modifier les niveaux de protection durant votre blocage.\nVoici les réglages actuels de la page '''$1''' :",
        "protect-locked-dblock": "Le niveau de protection ne peut pas être modifié car la base de données est verrouillée.\nVoici les réglages actuels de la page '''$1''' :",
        "protect-locked-access": "Vous n'avez pas les droits nécessaires pour modifier les niveaux de protection de pages.\nVoici les réglages actuels de la page '''$1''' :",
-       "protect-cascadeon": "Cette page est protégée car incluse dans {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l'option « protection en cascade » activée. Vous pouvez changer le niveau de protection de cette page sans que cela n'affecte la protection en cascade.",
+       "protect-cascadeon": "Cette page est protégée car elle est transcluse dans {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l'option « protection en cascade » activée.\nLa modification du niveau de protection de cette page n'affectera pas la protection en cascade.",
        "protect-default": "Autoriser tous les utilisateurs",
        "protect-fallback": "Autoriser uniquement les utilisateurs avec le droit « $1 »",
        "protect-level-autoconfirmed": "Autoriser uniquement les utilisateurs auto-confirmés",
        "pageinfo-robot-index": "Autorisée",
        "pageinfo-robot-noindex": "Interdite",
        "pageinfo-watchers": "Nombre de contributeurs ayant la page dans leur liste de suivi",
-       "pageinfo-visiting-watchers": "Nombre d’observateurs de page ayant visité les modifications récentes",
+       "pageinfo-visiting-watchers": "Nombre d’observateurs de la page ayant consulté les modifications récentes de la page",
        "pageinfo-few-watchers": "Moins de $1 {{PLURAL:$1|observateur|observateurs}}",
        "pageinfo-few-visiting-watchers": "Il peut ou non y avoir un observateur regardant les modifications récentes",
        "pageinfo-redirects-name": "Nombre de redirections vers cette page",
        "htmlform-cloner-create": "Ajouter encore",
        "htmlform-cloner-delete": "Supprimer",
        "htmlform-cloner-required": "Une valeur au moins est obligatoire.",
+       "htmlform-title-badnamespace": "[[:$1]] n'est pas dans l'espace de noms \"{{ns:$2}}\" .",
+       "htmlform-title-not-creatable": "\"$1\" n'est pas un titre de page réalisable",
+       "htmlform-title-not-exists": "[[:$1]] n’existe pas",
+       "htmlform-user-not-exists": "<strong>$1</strong> n’existe pas.",
+       "htmlform-user-not-valid": "<strong>$1</strong> n’est pas un nom d’utilisateur valide.",
        "sqlite-has-fts": "$1 avec recherche en texte intégral supportée",
        "sqlite-no-fts": "$1 sans recherche en texte intégral supportée",
        "logentry-delete-delete": "$1 {{GENDER:$2|a supprimé}} la page $3",
index b33ee71..2c94b47 100644 (file)
        "passwordreset": "Remês’a zérô du contresegno",
        "passwordreset-text-one": "Rempléd ceti formulèro por rebetar a zérô voutron contresegno.",
        "passwordreset-text-many": "{{PLURAL:$1|Rempléd yon des champs por rebetar a zérô voutron contresegno.}}",
-       "passwordreset-legend": "Rebetar a zérô lo contresegno",
        "passwordreset-disabled": "La remês’a zérô des contresegnos est étâye dèsactivâye sur ceti vouiqui.",
        "passwordreset-emaildisabled": "Les fonccionalitâts de mèssageria èlèctronica sont étâyes dèsactivâyes sur ceti vouiqui.",
        "passwordreset-username": "Nom d’utilisator :",
        "unusedtemplateswlh": "ôtros lims",
        "randompage": "Pâge per hasârd",
        "randompage-nopages": "Y at gins de pâge dedens {{PLURAL:$2|cet’èspâço|cetos èspâços}} de noms : $1.",
+       "randomincategory-submit": "Emmodar",
        "randomredirect": "Redirèccion per hasârd",
        "randomredirect-nopages": "Y at gins de pâge de redirèccion dedens l’èspâço de noms « $1 ».",
        "statistics": "Statistiques",
        "nlinks": "$1 lim{{PLURAL:$1||s}}",
        "nmembers": "$1 membro{{PLURAL:$1||s}}",
        "nrevisions": "$1 vèrsion{{PLURAL:$1||s}}",
-       "nviews": "$1 vu{{PLURAL:$1|a|es}}",
        "nimagelinks": "Empleyê dessus $1 pâge{{PLURAL:$1||s}}",
        "ntransclusions": "empleyê dessus $1 pâge{{PLURAL:$1||s}}",
        "specialpage-empty": "Y at gins de rèsultat a fâre vêre.",
        "linksearch-pat": "Modèlo de rechèrche :",
        "linksearch-ns": "Èspâço de noms :",
        "linksearch-ok": "Rechèrchiér",
-       "linksearch-text": "Des caractèros j·oquères coment « *.wikipedia.org » pôvont étre empleyês.\nIls ant fôta de por lo muens un domêno de nivél de dessus, per ègzemplo « *.org ».<br />\n{{PLURAL:$2|Protocolo recognu|Protocolos recognus}} : <code>$1</code> (http:// per dèfôt se nion protocolo est spècifiâ).",
+       "linksearch-text": "Des caractèros j·oquères coment « *.wikipedia.org » pôvont étre empleyês.\nIls ant fôta de por lo muens un domêno de nivél de dessus, per ègzemplo « *.org ».<br />\n{{PLURAL:$2|Protocolo recognu|Protocolos recognus}} : $1 (http:// per dèfôt se nion protocolo est spècifiâ).",
        "linksearch-line": "$1 est liyê dês $2",
        "linksearch-error": "Los caractèros j·oquères pôvont étre empleyês ren qu’u comencement du nom de domêno de l’hôto.",
        "listusersfrom": "Fâre vêre los utilisators dês :",
index 31e7e3e..b445673 100644 (file)
        "pt-userlogout": "Ufmelde",
        "php-mail-error-unknown": "Ünbekäänd feeler mä det funktjuun mail() faan PHP.",
        "user-mail-no-addy": "Küd nian e-mail schüür saner e-mail-adres.",
-       "user-mail-no-body": "Dü wulst en e-mail saner tekst wechsjüür.",
+       "user-mail-no-body": "Dü wulst en e-mail saner tekst wechschüür.",
        "changepassword": "Paaswurd feranre",
        "resetpass_announce": "Am det uunmeldin uftuslütjen, skel dü en nei paaswurd iindu.",
        "resetpass_header": "Paaswurd feranre",
        "passwordreset": "Paaswurd turagsaat",
        "passwordreset-text-one": "Fal detheer formulaar ütj, am din paaswurd turag tu saaten.",
        "passwordreset-text-many": "{{PLURAL:$1|Fal ian faan jodiat fialen ütj, am en tidjwiis paaswurd tuschüürd tu fun.}}",
-       "passwordreset-legend": "Paaswurd turagsaat",
        "passwordreset-disabled": "Dü könst din paaswurd uun detdiar wiki ei turagsaat.",
        "passwordreset-emaildisabled": "E-mail as üüb detheer Wiki ufknipset wurden.",
        "passwordreset-username": "Brükernööm:",
        "resettokens": "Tokens turagsaat",
        "resettokens-text": "Dü könst 'tokens' turagsaat, am priwoot dooten tu bewerkin, diar mä din brükerkonto ferbünjen san.",
        "resettokens-no-tokens": "Diar san nian tokens turagtusaaten.",
-       "resettokens-legend": "Tokens turagsaat",
        "resettokens-tokens": "Tokens:",
        "resettokens-token-label": "$1 (aktuel wäärs: $2)",
        "resettokens-watchlist-token": "Token för webfeed (Atom/RSS) mä [[Special:Watchlist|feranrangen faan sidjen, diar dü uun't uug behual wel]]",
        "nmembers": "{{PLURAL:$1|1 iindrach|$1 iindracher}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|lasmoot|lasmooten}}",
        "nrevisions": "$1 {{PLURAL:$1|feranrang|feranrangen}}",
-       "nviews": "$1 {{PLURAL:$1|klik|kliks}}",
        "nimagelinks": "Brükt üüb $1 {{PLURAL:$1|sidj|sidjen}}",
        "ntransclusions": "brükt üüb $1 {{PLURAL:$1|sidj|sidjen}}",
        "specialpage-empty": "Diar san tu tidj nian iindracher.",
        "linksearch-pat": "Schükmünster:",
        "linksearch-ns": "Nöömrüm:",
        "linksearch-ok": "Schük",
-       "linksearch-text": "Diar kön wariaabeln üs t.b. \"*.bispal.de\" brükt wurd. Tumanst ian TLD üs t.b. \"*.org\" skal uunden wurd.<br />{{PLURAL:$2|Protokol|Protokolen}}: <code>$1</code> (Diar woort http nimen, wan niks ööders uunden as.)",
+       "linksearch-text": "Diar kön wariaabeln üs t.b. \"*.bispal.de\" brükt wurd. Tumanst ian TLD üs t.b. \"*.org\" skal uunden wurd.<br />{{PLURAL:$2|Protokol|Protokolen}}: $1 (Diar woort http nimen, wan niks ööders uunden as.)",
        "linksearch-line": "$2 ferwiset üüb $1",
        "linksearch-error": "Wariaabeln (\"*\") mut bluas bi a began faan en URL uunden wurd.",
        "listusersfrom": "Wise brükern mä began üüb:",
        "emailccme": "Schüür mi en kopii faan det e-mail.",
        "emailccsubject": "Kopii faan din mädialang tu $1: $2",
        "emailsent": "E-mail as wechschüürd wurden",
-       "emailsenttext": "Din e-mail as wechsjüürd wurden.",
+       "emailsenttext": "Din e-mail as wechschüürd wurden.",
        "emailuserfooter": "Detdiar e-mail as faan „$1“ tu „$2“ auer det funktjuun „{{int:emailpage}}“ bi {{SITENAME}} schüürd wurden.",
        "usermessage-summary": "Süsteemnooracht seekert.",
        "usermessage-editor": "Süsteemnoorachten siinst",
        "tooltip-pt-logout": "Ufmelde",
        "tooltip-pt-createaccount": "Wees so gud an racht en brükerkonto iin an melde di uun. Dü säärst det oober ei.",
        "tooltip-ca-talk": "Diskuschuun auer di artiikel",
-       "tooltip-ca-edit": "Sidj bewerke. Luke di det iarst ans uun, iar dü det seekerst.",
+       "tooltip-ca-edit": "Detdiar sidj bewerke.",
        "tooltip-ca-addsection": "Nei kirew began",
        "tooltip-ca-viewsource": "Detdiar sidj as seekert wurden.\nDü könst di kweltekst uunluke.",
        "tooltip-ca-history": "Ääler werjuunen faan detdiar sidj",
index 3a5af21..adaefd8 100644 (file)
        "resetpass-wrong-oldpass": "It momintele of tydlike wachtwurd is ûnjildich.\nMûglik hawwe Jo Jo wachtwurd al feroare of in nij tydlik wachtwurd oanfrege.",
        "resetpass-temp-password": "Tydlik wachtwurd:",
        "passwordreset": "Wachtwurd ferfarskje",
-       "passwordreset-legend": "Wachtwurd weromsette",
        "passwordreset-username": "Brûkersnamme:",
        "passwordreset-domain": "Domein:",
        "passwordreset-email": "E-mailadres:",
        "changeemail-password": "Jo wachtwurd foar {{SITENAME}}:",
        "changeemail-submit": "E-mailadres wizigje",
        "resettokens": "Kaaien ferfarskje",
-       "resettokens-legend": "Kaaien ferfarskje",
        "resettokens-tokens": "Kaaien:",
        "resettokens-token-label": "$1 (hjoeddeistige wearde: $2)",
        "resettokens-resetbutton": "Selektearre kaaien ferfarskje",
        "nlinks": "$1 {{PLURAL:$1|keppeling|keppelings}}",
        "nmembers": "$1 {{PLURAL:$1|lid|lea}}",
        "nrevisions": "$1 {{PLURAL:$1|ferzje|ferzjes}}",
-       "nviews": "{{PLURAL:$1|1 kear|$1 kear}} sjoen",
        "specialpage-empty": "Gjin resultaten foar dit rapport.",
        "lonelypages": "Lossteande siden",
        "lonelypagestext": "Nei de ûndersteande siden wurdt út {{SITENAME}} wei net ferwiisd.\nDe siden binne ek net as sjabloan opnommen.",
        "linksearch-pat": "Sykpatroan:",
        "linksearch-ns": "Nammeromte:",
        "linksearch-ok": "Sykje",
-       "linksearch-text": "Wildcards lykas \"*.wikipedia.org\" of \"*.org\" binne tastien.<br />\nStipe protokollen: <code>$1</code>",
+       "linksearch-text": "Wildcards lykas \"*.wikipedia.org\" of \"*.org\" binne tastien.<br />\nStipe protokollen: $1",
        "linksearch-line": "$1 hat in ferwizing yn $2",
        "linksearch-error": "Wildcards binne allinne tastien oan it begjin fan in hostnamme.",
        "listusersfrom": "Lit meidoggers sjen fanôf:",
index e82593c..72c82c2 100644 (file)
        "passwordreset": "Ath-shuidhich am facal-faire",
        "passwordreset-text-one": "Lìon am foirm seo gus am facal-faire agad ath-shuidheachadh.",
        "passwordreset-text-many": "Lìon {{PLURAL:$1|an raon|aon dhe na raointean}} gus facal-faire sealach fhaighinn air a' phost-d.",
-       "passwordreset-legend": "Ath-shuidhich am facal-faire",
        "passwordreset-disabled": "Chaidh ath-shuidheachadh nam faclan-faire a chur à comas air an uicidh seo.",
        "passwordreset-emaildisabled": "Chaidh feartan a' phuist-d a chur à comas san uicidh seo.",
        "passwordreset-username": "Ainm-cleachdaiche:",
        "resettokens": "Ath-shuidhich na tòcanan",
        "resettokens-text": "'S urrainn dhut tòcanan ath-shuidheachadh a bheir cothrom dhut air cuid a dhàta prìobhaideach a tha co-cheangailte ris a' chunntas agad.\n\nBu chòir dhut seo a dhèanamh ma thug thu do chuideigin e air mhearachd no ma bhris cuideigin a-steach air a' chunntas agad.",
        "resettokens-no-tokens": "Chan eil tòcan ann a ghabhas ath-shuidheachadh.",
-       "resettokens-legend": "Ath-shuidhich na tòcanan",
        "resettokens-tokens": "Tòcanan:",
        "resettokens-token-label": "$1 ('s e $2 an luach làithreach)",
        "resettokens-watchlist-token": "Tòcan airson an inbhir-lìn (Atom/RSS) a sheallas dhut [[Special:Watchlist|atharraichean air duilleagan a tha air a' chlàr-fhaire agad]]",
        "nmembers": "$1 {{PLURAL:$1|bhall|bhall|buill|ball}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|bhall|bhall|buill|ball}}",
        "nrevisions": "$1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}",
-       "nviews": "$1 {{PLURAL:$1|sealladh|shealladh|seallaidhean|sealladh}}",
        "nimagelinks": "'Ga chleachdadh air $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}}",
        "ntransclusions": "'ga chleachdadh air $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}}",
        "specialpage-empty": "Chan eil toradh ann airson na h-aithris seo.",
        "linksearch-pat": "Pàtran an luirg:",
        "linksearch-ns": "Ainm-spàs:",
        "linksearch-ok": "Lorg",
-       "linksearch-text": "'S urrainn dhut saoragan mar \"*.wikipedia.org\" a chleachdadh.\nBidh feum air air co-dhiù aon àrainn aig ìre as àirde, can \"*.org\".<br />\n{{PLURAL:$2|pròtacal|pròtacalan}} ris an cuirear taic: <code>$1</code> (http:// a ghnáth mur dèid pròtacal a shònrachadh).",
+       "linksearch-text": "'S urrainn dhut saoragan mar \"*.wikipedia.org\" a chleachdadh.\nBidh feum air air co-dhiù aon àrainn aig ìre as àirde, can \"*.org\".<br />\n{{PLURAL:$2|pròtacal|pròtacalan}} ris an cuirear taic: $1 (http:// a ghnáth mur dèid pròtacal a shònrachadh).",
        "linksearch-line": "Tha $1 a' ceangal an-seo o $2",
        "linksearch-error": "Chan fhaod saorag nochdadh ach aig toiseach ainm an òstair.",
        "listusersfrom": "Seall cleachdaichean o seo a-mach:",
index 7e1e4d4..377f1f2 100644 (file)
        "protectedinterface": "Esta páxina fornece o texto da interface do software e está protexida para evitar o seu abuso.\nPara engadir ou modificar as traducións en todos os wikis utilice [//translatewiki.net/wiki/Main_Page?setlang=gl translatewiki.net], o proxecto de localización de MediaWiki.",
        "editinginterface": "<strong>Aviso:</strong> Está editando unha páxina usada para fornecer o texto da interface do software.\nOs cambios feitos nesta páxina afectarán á aparencia da interface dos outros usuarios do wiki.",
        "translateinterface": "Para engadir ou modificar as traducións en todos os wikis utilice [//translatewiki.net/wiki/Special:MainPage?setlang=gl translatewiki.net], o proxecto de localización de MediaWiki.",
-       "cascadeprotected": "Esta páxina foi protexida fronte á edición debido a que está incluída {{PLURAL:$1|na seguinte páxina protexida, que ten|nas seguintes páxinas protexidas, que teñen}} a \"protección en serie\" activada:\n$2",
+       "cascadeprotected": "Esta páxina foi protexida fronte á edición debido a que está transcluída {{PLURAL:$1|na seguinte páxina protexida, que ten|nas seguintes páxinas protexidas, que teñen}} a \"protección en serie\" activada:\n$2",
        "namespaceprotected": "Non ten os permisos necesarios para modificar páxinas no espazo de nomes '''$1'''.",
        "customcssprotected": "Non ten os permisos necesarios para modificar esta páxina de CSS, dado que contén a configuración persoal doutro usuario.",
        "customjsprotected": "Non ten os permisos necesarios para modificar esta páxina de JavaScript, dado que contén a configuración persoal doutro usuario.",
        "readonlywarning": "'''Atención: A base de datos foi pechada para facer mantemento, polo que non vai poder gardar as súas edicións polo de agora.'''\nSe cadra, pode cortar e pegar o texto nun ficheiro de texto e gardalo para despois.\n\nO administrador que a pechou deu esta explicación: $1",
        "protectedpagewarning": "'''Aviso: Esta páxina foi protexida de xeito que só os usuarios con privilexios de administrador a poidan editar.'''\nVelaquí está a última entrada no rexistro, por se quere consultala:",
        "semiprotectedpagewarning": "'''Nota:''' Esta páxina foi protexida de xeito que só os usuarios rexistrados a poidan editar.\nVelaquí está a última entrada no rexistro, por se quere consultala:",
-       "cascadeprotectedwarning": "'''Aviso:''' Esta páxina foi protexida de xeito que só a poden editar os usuarios con privilexios de administrador debido a que está incluída {{PLURAL:$1|na seguinte páxina protexida|nas seguintes páxinas protexidas}} coa opción \"protección en serie\" activada:",
+       "cascadeprotectedwarning": "<strong>Aviso:</strong> Esta páxina foi protexida de xeito que só a poden editar os usuarios con privilexios de administrador debido a que está transcluída {{PLURAL:$1|na seguinte páxina protexida|nas seguintes páxinas protexidas}} coa opción \"protección en serie\" activada:",
        "titleprotectedwarning": "'''Aviso: Esta páxina foi protexida de xeito que [[Special:ListGroupRights|só algúns usuarios]] a poidan crear.'''\nVelaquí está a última entrada no rexistro, por se quere consultala:",
        "templatesused": "{{PLURAL:$1|Modelo usado|Modelos usados}} nesta páxina:",
        "templatesusedpreview": "{{PLURAL:$1|Modelo usado|Modelos usados}} nesta vista previa:",
        "linksearch-pat": "Patrón de procura:",
        "linksearch-ns": "Espazo de nomes:",
        "linksearch-ok": "Procurar",
-       "linksearch-text": "Pódense usar caracteres comodín como \"*.wikipedia.org\".\nCómpre, polo menos, un dominio de nivel superior; por exemplo, \"*.org\".<br />\n{{PLURAL:$2|Protocolo soportado|Protocolos soportados}}: <code>$1</code> (úsase http:// como predeterminado se non se especifica ningún protocolo).",
+       "linksearch-text": "Pódense usar caracteres comodín como \"*.wikipedia.org\".\nCómpre, polo menos, un dominio de nivel superior; por exemplo, \"*.org\".<br />\n{{PLURAL:$2|Protocolo soportado|Protocolos soportados}}: $1 (úsase http:// como predeterminado se non se especifica ningún protocolo).",
        "linksearch-line": "$1 está ligado desde a páxina \"$2\"",
        "linksearch-error": "Os caracteres comodín só poden aparecer ao principio do nome do servidor.",
        "listusersfrom": "Mostrar os usuarios que comecen por:",
        "protect-locked-blocked": "Non pode modificar os niveis de protección mentres exista un bloqueo. Velaquí a configuración actual da páxina  '''$1''':",
        "protect-locked-dblock": "Os niveis de protección non se poden modificar debido a un bloqueo da base de datos activa.\nVelaquí a configuración actual da páxina '''$1''':",
        "protect-locked-access": "A súa conta non dispón de permisos para mudar os niveis de protección.\nVelaquí a configuración actual da páxina '''$1''':",
-       "protect-cascadeon": "Esta páxina está protexida actualmente porque está incluída {{PLURAL:$1|na seguinte páxina, que foi protexida|nas seguintes páxinas, que foron protexidas}} coa opción \"protección en serie\" activada.\nOs cambios no nivel de protección desta páxina non afectarán á protección en serie.",
+       "protect-cascadeon": "Esta páxina está protexida actualmente porque está transcluída {{PLURAL:$1|na seguinte páxina, que foi protexida|nas seguintes páxinas, que foron protexidas}} coa opción \"protección en serie\" activada.\nOs cambios no nivel de protección desta páxina non afectarán á protección en serie.",
        "protect-default": "Permitir a todos os usuarios",
        "protect-fallback": "Permitir só aos usuarios con permisos de \"$1\"",
        "protect-level-autoconfirmed": "Permitir só aos usuarios autoconfirmados",
        "pageinfo-robot-index": "Permitida",
        "pageinfo-robot-noindex": "Non permitida",
        "pageinfo-watchers": "Número de vixiantes da páxina",
-       "pageinfo-visiting-watchers": "Número de usuarios vixiando a páxina visitando as edicións recentes",
+       "pageinfo-visiting-watchers": "Número de usuarios vixiando a páxina que visitaron as edicións recentes",
        "pageinfo-few-watchers": "Menos de $1 {{PLURAL:$1|vixiante|vixiantes}}",
        "pageinfo-few-visiting-watchers": "Pode haber, ou non, un usuario que vixía páxinas visitando as edicións recentes",
        "pageinfo-redirects-name": "Número de redireccións cara a esta páxina",
        "htmlform-cloner-create": "Engadir máis",
        "htmlform-cloner-delete": "Eliminar",
        "htmlform-cloner-required": "Necesítase, polo menos, un valor.",
+       "htmlform-title-badnamespace": "[[:$1]] non está no espazo de nomes \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "\"$1\" non é un título de páxina que se poida crear",
+       "htmlform-title-not-exists": "[[:$1]] non existe.",
        "sqlite-has-fts": "$1 con soporte para procuras de texto completo",
        "sqlite-no-fts": "$1 sen soporte para procuras de texto completo",
        "logentry-delete-delete": "$1 {{GENDER:$2|borrou}} a páxina \"$3\"",
index 9c9287e..eb78841 100644 (file)
@@ -15,7 +15,7 @@
                ]
        },
        "tog-hideminor": "हालींच बदल केल्ल्यांतले बारीक संपादन लिपय",
-       "tog-numberheadings": "शà¥\80रà¥\8dषà¤\95 स्वंय क्रमांकित कर",
+       "tog-numberheadings": "माथाळà¥\87 स्वंय क्रमांकित कर",
        "tog-showtoolbar": "संपादन उपकरणाची पट्टी दाखय",
        "tog-editondblclick": "दोट्टी क्लिकाचेर पानां संपादीत कर",
        "tog-watchdefault": "हांवें संपादीत केल्लीं पानां आनी फायल म्हजे ध्यानसूचीक जोड",
@@ -25,7 +25,7 @@
        "tog-oldsig": "सद्याची निशाणी",
        "tog-uselivepreview": "लायव पुर्वनियाळाचो उपेग कर",
        "tog-watchlisthideown": "ध्यानसुचीतलें म्हजे संपादन लिपय",
-       "tog-watchlisthidebots": "ध्यानसुचीतले बोट संपादन लिपय",
+       "tog-watchlisthidebots": "धà¥\8dयानसà¥\81à¤\9aà¥\80तलà¥\87 à¤°à¥\8bबà¥\8bà¤\9f à¤¸à¤\82पादन à¤²à¤¿à¤ªà¤¯",
        "tog-watchlisthideminor": "ध्यानसुचीतले ल्हान संपादन लिपय",
        "tog-showhiddencats": "लिपोवन दवरिल्ले विभाग दाखय",
        "underline-always": "सदा (केधन्नय) (केन्नय)",
        "qbpageoptions": "हें पान",
        "qbmyoptions": "म्हजी पानां",
        "faq": "परत परत विचारिल्ले प्रस्न",
-       "faqpage": "सदांच विचारील्ले प्रस्न",
+       "faqpage": "Project:सदांच विचारील्ले प्रस्न",
        "actions": "क्रिया",
        "namespaces": "नांवथलां",
        "variants": "वेगवेगळें",
        "jumpto": "हुपून वचात:",
        "jumptonavigation": "दिशा-नियंत्रण",
        "jumptosearch": "सोद",
-       "pool-queuefull": "पà¥\82ल वळ भरिल्ली आसा",
+       "pool-queuefull": "तळà¥\8dयà¥\87à¤\9aà¥\87à¤\82 वळ भरिल्ली आसा",
        "pool-errorunknown": "खबर नाशिल्ली चूक",
        "poolcounter-usage-error": "उपयोगी त्रुटि: $1",
        "aboutsite": "{{SITENAME}}विशीं",
        "dellogpage": "काडून उडयिल्ल्यांची वळेरी",
        "rollbacklink": "फाटीं घेयात",
        "rollbacklinkcount": "$1 {{PLURAL:$1|संपादन}} फाटीं घेयात",
+       "changecontentmodel-title-label": "पानाचो माथाळो",
+       "changecontentmodel-reason-label": "Reason:कारण",
        "protectlogpage": "सुरक्षितेचें सोत्र",
        "protectedarticle": "राखिल्ले\"[[$1]]\"",
        "restriction-edit": "संस्करण",
        "blocklogpage": "कार्यवळेरी आडायात",
        "blocklogentry": "$2 $3 हो सोंपपी वेळ आशिल्लो $1 बंद दवरल्ला",
        "block-log-flags-nocreate": "खातें निर्माण जावूंक ना",
-       "movepagebtn": "पान à¤°à¤¾à¤\96à¥\82न à¤¦à¤µà¤°à¤¾à¤¤",
+       "movepagebtn": "पान à¤¹à¤¾à¤²à¤¯",
        "movelogpage": "पान हालोवण्यांचो सोत्र",
        "revertmove": "मूळ पदार व्हरप",
        "export": "पानां निर्यात कर",
        "specialpages": "खाशेलीं पानां",
        "tag-filter": "[[Special:Tags|कुर्वेचीट]] गाळणो:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|कुरवेचीट|कुरवेचीटी}}]]: $2)",
+       "htmlform-title-not-exists": "[[:$1]] अस्तित्वांत ना.",
        "logentry-delete-delete": "$1 {{GENDER:$2|काडून उडयल्ले पान}} $3",
        "logentry-move-move": "$1 न $3 पानाचेर $4 {{GENDER:$2|हालयला}}",
        "logentry-newusers-create": "उपयोगकत्याचें $1 {{GENDER:$2|तयार केलें}}",
index 431ac79..df19fa8 100644 (file)
@@ -7,8 +7,25 @@
                        "아라"
                ]
        },
+       "tog-underline": "Zoddnienche adhorekhan",
+       "tog-hideminor": "Halinch bodol kel'leantle dhakte bodol lipoi",
+       "tog-numberheadings": "Mathalle sway kromankit kor",
+       "tog-showtoolbar": "Bodolache hathiar-potti dakhoi",
+       "tog-editondblclick": "Dotti klickacher pananche sonskoron kor",
+       "tog-watchdefault": "Hanv bodolta tim panam moji sadurvollerint zod",
+       "tog-previewontop": "Sonskoron petie mukhar zolok dakhoi",
+       "tog-previewonfirst": "Poileach bodolacher zolok dakhoi",
+       "tog-shownumberswatching": "Nodor dovorpi vangdianche sonkhya dakhoi",
+       "tog-oldsig": "Sodheachi soy:",
+       "tog-uselivepreview": "Boroitastana zolok dahkoi",
+       "tog-watchlisthideown": "Sadurvollerint mhojeo bodlopam lipoi",
+       "tog-watchlisthidebots": "Sadurvollerint robotani kel'lim bodlopam lipoi",
+       "tog-watchlisthideminor": "Sadurvollerint daktim bodlopam lipoi",
+       "tog-showhiddencats": "Lipoiloleo vorg dakhoi",
        "underline-always": "Soddankal",
        "underline-never": "Kednach na",
+       "underline-default": "Skin vo browsera pormonnem",
+       "editfont-default": "Browsera pormonnem",
        "sunday": "Aitar",
        "monday": "Somar",
        "tuesday": "Munglar",
@@ -77,6 +94,7 @@
        "category-media-header": "\"$1\" hea vorgan madheom'ma",
        "category-empty": "''Hea vorgan sodhea ekui pan vo madheom na''",
        "hidden-categories": "{{PLURAL:$1|Lipoilolo vorg|Lipoilole vorg}}",
+       "hidden-category-category": "Lipoiloleo vorg",
        "category-subcat-count": "{{PLURAL:$2|Hea vorgan fokot hi ek upvorg asa.|Hea vorgan {{PLURAL:$1|hi upvorg asa|heo $1 upvorg asat}}, beriz $2 upvorga modem.}}",
        "category-article-count": "{{PLURAL:$2|Hea vorgan fokot hi ek pan asa.|Hea vorgan {{PLURAL:$1|hi pan asa|him $1 panam asat}} beriz $2 panam modem.}}",
        "category-file-count": "{{PLURAL:$2|Hea vorgan fokot hi ek fail asa.|Hea vorgan {{PLURAL:$1|hi fail asa|heo $1 faili asat}}, beriz $2 faili modem.}}",
        "article": "Vixoi sombondhi pan",
        "newwindow": "(novea zonelant uktem zata)",
        "cancel": "Rod'd kor",
+       "moredotdotdot": "Anik...",
+       "morenotlisted": "Hi suchi purn na",
+       "mypage": "Pan",
        "mytalk": "Bhasabhas",
        "navigation": "Dixa-niontronn",
        "and": "&#32;ani",
        "qbfind": "Sod",
+       "qbbrowse": "Bhovndi mar",
        "qbedit": "Bodol",
-       "faq": "Choddxe vicharlole prosn",
+       "qbpageoptions": "Hem pan",
+       "qbmyoptions": "Mhoji panam",
+       "faq": "Porot porot vicharlele prosn",
+       "faqpage": "Project:Porot porot vicharlele prosn",
        "actions": "Karvaio",
        "namespaces": "Nanvthollam",
        "variants": "Dusre",
        "view": "Poloi",
        "view-foreign": "$1-hacher polloi",
        "edit": "Bodol",
+       "edit-local": "Thollavem vornon bodol",
        "create": "Roch",
        "create-local": "Thollavem vornon zod",
        "editthispage": "Hem pan bodol",
        "create-this-page": "Ho pan roch",
        "delete": "Vogllai",
        "deletethispage": "Hem pan kad",
+       "undeletethispage": "Hem pan punorsthapit kor",
+       "undelete_short": "{{PLURAL:$1|Ek kadun udoil'lo bodol|$1 kadun udoil'le bodlopam}} portun had",
+       "viewdeleted_short": "{{PLURAL:$1|Ek kadun udoil'lo bodol|$1 kadun udoil'le bodlopam}} dakhoi",
        "protect": "Rakh",
        "protect_change": "bodol",
        "protectthispage": "Hem pan rakh",
+       "unprotect": "Surokxechem sthor bodol",
+       "unprotectthispage": "Hem panachem surokxechem sthor bodol",
        "newpage": "Novem pan",
        "talkpage": "Hea panachem bhasabhas kor",
        "talkpagelinktext": "Bhasabhas",
        "views": "Drishya",
        "toolbox": "Avtam",
        "userpage": "Vangddiacho pan poloi",
+       "projectpage": "Prokolpachem pan poloi",
        "imagepage": "Imazichem pan poloi",
+       "mediawikipage": "Sondexachem pan polloi",
+       "templatepage": "Sanchechem pan polloi",
        "viewhelppage": "Adar pan poloi",
        "categorypage": "Vorgachem pan poloi",
+       "viewtalkpage": "Bhasabhas polloi",
        "otherlanguages": "Her bhasanim",
        "redirectedfrom": "($1 savn porot dixent)",
        "redirectpagesub": "Punornirdexan pan",
        "redirectto": "Hanga ponornirdeshit kor:",
        "lastmodifiedat": "Hem pan xevtim $1 disa, $2 vazta bodolelem.",
+       "protectedpage": "Rakhun dovorl'lem pan",
        "jumpto": "Hupun voch",
        "jumptonavigation": "dixa-niontronn",
        "jumptosearch": "sod",
+       "pool-queuefull": "Tolliechem voll bhorlolem asa",
+       "pool-errorunknown": "Khobor nasleli chuk",
+       "poolcounter-usage-error": "Upyogachi chuk: $1",
        "aboutsite": "{{SITENAME}} babtint",
        "aboutpage": "Project:Vixoiavixim",
        "copyrightpage": "{{ns:project}}:Prat-hokk",
        "disclaimers": "Nhoikarnio",
        "disclaimerpage": "Project:Sadeo nhoikarni",
        "edithelp": "Bodlunk adar",
+       "helppage-top-gethelp": "Adar",
        "mainpage": "Mukhel Pan",
        "mainpage-description": "Mukhel pan",
        "portal": "Somudaik proves-dar",
        "ok": "Zait",
        "retrievedfrom": "\"$1\" savn prapt kelam",
        "youhavenewmessages": "Tumkam $1 ($2) asat.",
+       "youhavenewmessagesmulti": "$1 cher tuka noveo sondex asat",
        "editsection": "bodol",
        "editold": "bodol",
        "viewsourceold": "mull poloi",
        "allarticles": "Sogllim panam",
        "allpagessubmit": "Voch",
        "categories": "Vorg",
+       "linksearch-ns": "Nanv-tholl:",
+       "linksearch-ok": "Sod",
        "linksearch-line": "$1 $2 savn zoddlelem asa",
+       "listusers-submit": "Dakhoi",
        "listgrouprights-members": "(vapuddpeanchi suchi)",
        "emailuser": "Email dhadd",
+       "emailusername": "Vapurpeachem nanv:",
        "watchlist": "Sadurachi volleri",
        "mywatchlist": "Sadurachi volleri",
        "watchlistfor2": "$1 hache khatir $2",
        "watchlist-options": "Sadurvollericheo poryay",
        "watching": "Disht dovortanv...",
        "unwatching": "Disht kaddthanv...",
+       "delete-legend": "Kadun udoi",
        "actioncomplete": "Karvai sompurnn",
        "actionfailed": "Karvai oiesiesvi",
        "dellogpage": "Vogllaoneche sotr",
        "protectedarticle": "rakhlelem \"[[$1]]\"",
        "protect-otherreason": "Dusrem/aniki karon:",
        "protect-otherreason-op": "Dusrem karon",
+       "restriction-edit": "Bodol",
+       "restriction-move": "Haloi",
+       "restriction-create": "Roch",
        "undeletelink": "polloi/adlea zagear hadd",
        "undeleteviewlink": "polloi",
        "namespace": "Nanv-tholl",
        "blocklogentry": "[[$1]] addailelem $2 asun vellacho ont: $3",
        "block-log-flags-nocreate": "Khatem rochop opatr kelam",
        "move-watch": "Hea panar disht dovor",
+       "movepagebtn": "Pan haloi",
        "movelogpage": "Pan halovneancho sotr",
        "movereason": "Karonn:",
        "revertmove": "porti",
index 431432b..a8aa335 100644 (file)
        "unusedtemplateswlh": "οἱ σύνδεσμοι οἱ ἄλλοι",
        "randompage": "Δέλτος τυχοῦσα",
        "randompage-nopages": "Οὐδεμία δέλτος ἐν {{PLURAL:$2|τῷ ὀνοματείῳ|τοῖς ὀνοματείοις}} \"$1\".",
+       "randomincategory-submit": "Ἱέναι",
        "randomredirect": "Τυχαία ἀναδιεύθυνσις",
        "randomredirect-nopages": "Οὐδεμία ἀναδιεύθυνσις ἐν τῷ ὀνοματείῳ \"$1\".",
        "statistics": "Τὰ περὶ τῶν δεδομένων",
        "nlinks": "$1 {{PLURAL:$1|σύνδεσμος|σύνδεσμοι}}",
        "nmembers": "$1 {{PLURAL:$1|μέλος|μέλη}}",
        "nrevisions": "$1 {{PLURAL:$1|ἀναθεώρησις|ἀναθεωρήσεις}}",
-       "nviews": "$1 {{PLURAL:$1|βλέψις|βλέψεις}}",
        "specialpage-empty": "Οὐδὲν ἀποτέλεσμα ἐν τῇδε τῇ ἀναφορᾷ.",
        "lonelypages": "Δέλτοι ὀρφαναί",
        "lonelypagestext": "Aἱ ἀκόλουθοι δέλτοι μὴ συνδεδεμέναι μετὰ δέλτων τινῶν ἢ μὴ ὑπερκλῃσμέναι εἰς ἑτέρας δέλτους τινὰς ἐν τῷ {{SITENAME}} εἰσίν.",
        "linksearch-pat": "Θέμα ζητήσεως:",
        "linksearch-ns": "Ὀνοματεῖον:",
        "linksearch-ok": "Ζητεῖν",
-       "linksearch-text": "Ἔξεστί σοι χρῆσθαι ὑποκαταστασίμοις φράσεσιν ὅπως \"*.wikipedia.org\".<br />\nὙποστηριζόμενα πρωτόκολλα: <code>$1</code>",
+       "linksearch-text": "Ἔξεστί σοι χρῆσθαι ὑποκαταστασίμοις φράσεσιν ὅπως \"*.wikipedia.org\".<br />\nὙποστηριζόμενα πρωτόκολλα: $1",
        "linksearch-line": "$1 συνδεόμενον τῷ $2",
        "listusersfrom": "Δεικνύναι χρωμένους (γραμμαὶ ἐκκινουμέναι ἐκ/ἐξ):",
        "listusers-submit": "Ἐμφανίζειν",
index d5f0037..f87ed52 100644 (file)
        "passwordreset": "Passwort zruggsetze",
        "passwordreset-text-one": "Fill des Formular uus go Dy Passwort zrucksetze.",
        "passwordreset-text-many": "{{PLURAL:$1|Fill eis vu dr Fälder uus go Dy Passwort zrucksetze.}}",
-       "passwordreset-legend": "Passwort zrucksetze",
        "passwordreset-disabled": "S Zrucksetze vu Passwerter isch in däm Wiki deaktiviert wore.",
        "passwordreset-emaildisabled": "D E-Mail-Funktione sin uf däm Wiki deaktiviert wore.",
        "passwordreset-username": "Benutzername:",
        "resettokens": "Token zrucksetze",
        "resettokens-text": "Du chasch Token zrucksetze, wu Dir dr Zuegriff uf bstimmti privati Date megli mache, wu mit Dym Benutzerkonto do verchnipft sin.\n\nDes sottsch nume mache, wänn Du d Token us Versää mit eberem teilt hesch oder Dy Konto gfehrdet isch.",
        "resettokens-no-tokens": "S git kei Token zum Zrucksetze.",
-       "resettokens-legend": "Token zrucksetze",
        "resettokens-tokens": "Token:",
        "resettokens-token-label": "$1 (aktuälle Wärt: $2)",
        "resettokens-watchlist-token": "Token fir dr Webfeed (Atom/RSS) vu dr [[Special:Watchlist|Änderigen an Syten uf Dyre Beobachtuislischt]]",
        "unusedtemplateswlh": "Anderi Link",
        "randompage": "Zuefalls-Artikel",
        "randompage-nopages": "S het kei Syte in {{PLURAL:$2|däm Namensruum|däne Namensryym}}:  $1.",
+       "randomincategory-submit": "Gang",
        "randomredirect": "Zuefälligi Wyterleitig",
        "randomredirect-nopages": "Im Namensruum „$1“ sin kei Wyterleitige vorhande.",
        "statistics": "Statistik",
        "nlinks": "$1 {{PLURAL:$1|Link|Links}}",
        "nmembers": "$1 {{PLURAL:$1|Syte|Sytene}}",
        "nrevisions": "$1 {{PLURAL:$1|Revision|Revisione}}",
-       "nviews": "$1 {{PLURAL:$1|Betrachtig|Betrachtige}}",
        "nimagelinks": "Brucht uf $1 {{PLURAL:$1|Syte|Syte}}",
        "ntransclusions": "brucht uf $1 {{PLURAL:$1|Syte|Syte}}",
        "specialpage-empty": "In dr Syte het s no kei aktuälli Yytreg.",
        "linksearch-pat": "Suechmuschter:",
        "linksearch-ns": "Namensruum:",
        "linksearch-ok": "Sueche",
-       "linksearch-text": "Die Spezialsyte macht d Suechi no Syte megli, wu s bstimmti Weblink din het. Doderby chenne Platzhalter wie zem Byschpel <code>*.byschpel.de</code> brucht wäre. S mueß zmindecht ei Top-Level-Domain, z. B. „*.org“. aagee wäre. <br />{{PLURAL:$2|Unterstitzt Protokoll|Unterstitzti Protokoll}}: <code>$1</code> (Standard isch http, wänn kei Protokoll aagee isch.)",
+       "linksearch-text": "Die Spezialsyte macht d Suechi no Syte megli, wu s bstimmti Weblink din het. Doderby chenne Platzhalter wie zem Byschpel <code>*.byschpel.de</code> brucht wäre. S mueß zmindecht ei Top-Level-Domain, z. B. „*.org“. aagee wäre. <br />{{PLURAL:$2|Unterstitzt Protokoll|Unterstitzti Protokoll}}: $1 (Standard isch http, wänn kei Protokoll aagee isch.)",
        "linksearch-line": "$1 isch vo $2 verknüpft",
        "linksearch-error": "Platzhalter chönne numme am Aafang verwändet werre.",
        "listusersfrom": "Zeig Benutzer ab:",
index 55a6083..62c4fff 100644 (file)
        "navigation-heading": "દિશાશોધન મેનુ",
        "errorpagetitle": "ત્રુટિ",
        "returnto": "$1 પર પાછા જાઓ.",
-       "tagline": "{{SITENAME}}થી",
+       "tagline": "{{SITENAME}}માàª\82થà«\80",
        "help": "મદદ",
        "search": "શોધો",
        "searchbutton": "શોધો",
        "linksearch-pat": "શોધ આલેખ",
        "linksearch-ns": "નામાવકાશ:",
        "linksearch-ok": "શોધ",
-       "linksearch-text": "વાઇલ્ડ કાર્ડ જેવા કે \"*.wikipedia.org\" અહીં વપરાયા હોઈ શકે છે.\nઓછામાં ઓછું ઉચ્ચસ્તરનું ડોમેઇન જરૂરી છે, દા.ત. ''*.org\".<br />\nમાન્ય {{PLURAL:$2|પ્રોટોકોલ|પ્રોટોકોલ્સ}}: <code>$1</code> (જો કોઇ પ્રોટોકોલ આપેલ નહી હોય તો http:// એ મૂળભૂત ગણાશે).",
+       "linksearch-text": "વાઇલ્ડ કાર્ડ જેવા કે \"*.wikipedia.org\" અહીં વપરાયા હોઈ શકે છે.\nઓછામાં ઓછું ઉચ્ચસ્તરનું ડોમેઇન જરૂરી છે, દા.ત. ''*.org\".<br />\nમાન્ય {{PLURAL:$2|પ્રોટોકોલ|પ્રોટોકોલ્સ}}: $1 (જો કોઇ પ્રોટોકોલ આપેલ નહી હોય તો http:// એ મૂળભૂત ગણાશે).",
        "linksearch-line": "$1 એ $2થી જોડાયેલ છે",
        "linksearch-error": "યજમાન નામની શરૂઆતમાં જ વાઈલ્ડકાર્ડ પ્રકટ થશે",
        "listusersfrom": "આનાથી શરૂ થતા સભ્યો દર્શાવો:",
index 8bc83be..1093f27 100644 (file)
        "readonlywarning": "'''אזהרה: בסיס הנתונים ננעל לצורך תחזוקה. בזמן זה לא ניתן לשמור את הטקסט הערוך.'''\nבאפשרותך להעתיק ולהדביק את הטקסט לתוך קובץ טקסט ולשמור אותו למאוחר יותר.\n\nמפעיל המערכת שנעל את בסיס הנתונים סיפק את ההסבר הבא: $1",
        "protectedpagewarning": "'''אזהרה: דף זה מוגן כך שרק מפעילי מערכת יכולים לערוך אותו.'''\nפעולת היומן האחרונה מוצגת להלן:",
        "semiprotectedpagewarning": "'''הערה:''' דף זה מוגן כך שרק משתמשים רשומים יכולים לערוך אותו.\nפעולת היומן האחרונה מוצגת להלן:",
-       "cascadeprotectedwarning": "'''אזהרה:''' דף זה מוגן כך שרק מפעילי מערכת יכולים לערוך אותו, כי הוא מוכלל {{PLURAL:$1|בדף הבא, שמופעלת עליו|בדפים הבאים, שמופעלת עליהם}} הגנה מדורגת:",
+       "cascadeprotectedwarning": "<strong>אזהרה:</strong> דף זה מוגן כך שרק מפעילי מערכת יכולים לערוך אותו, כי הוא מוכלל {{PLURAL:$1|בדף הבא, שמופעלת עליו|בדפים הבאים, שמופעלת עליהם}} הגנה מדורגת:",
        "titleprotectedwarning": "'''אזהרה: דף זה מוגן כך שדרושות [[Special:ListGroupRights|הרשאות מסוימות]] כדי ליצור אותו.'''\nפעולת היומן האחרונה מוצגת להלן:",
        "templatesused": "{{PLURAL:$1|תבנית המופיעה|תבניות המופיעות}} בדף זה:",
        "templatesusedpreview": "{{PLURAL:$1|תבנית המופיעה|תבניות המופיעות}} בתצוגה המקדימה הזאת:",
        "pageinfo-robot-index": "מותר",
        "pageinfo-robot-noindex": "אסור",
        "pageinfo-watchers": "מספר העוקבים אחר הדף",
-       "pageinfo-visiting-watchers": "×\9eספר ×\94×¢×\95ק×\91×\99×\9d ×\90×\97ר ×\94×\93×£ ×©×\9e×\91קר×\99×\9d בעריכות האחרונות",
+       "pageinfo-visiting-watchers": "×\9eספר ×\94×¢×\95ק×\91×\99×\9d ×\90×\97ר ×\94×\93×£ ×©×\91×\99קר×\95 בעריכות האחרונות",
        "pageinfo-few-watchers": "פחות מ{{PLURAL:$1|עוקב אחד|־$1 עוקבים}}",
        "pageinfo-few-visiting-watchers": "ייתכן שיש וייתכן שאין משתמש שעוקב אחר הדף ומבקר בעריכות האחרונות",
        "pageinfo-redirects-name": "מספר ההפניות לדף זה",
        "htmlform-cloner-create": "הוספה",
        "htmlform-cloner-delete": "הסרה",
        "htmlform-cloner-required": "דרוש לפחות ערך אחד.",
+       "htmlform-title-badnamespace": "[[:$1]] אינו במרחב השם \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "\"$1\" אינו שם של דף שאפשר ליצור",
+       "htmlform-title-not-exists": "[[:$1]] אינו קיים.",
+       "htmlform-user-not-exists": "<strong>$1</strong> אינו קיים.",
+       "htmlform-user-not-valid": "<strong>$1</strong> אינו שם משתמש תקין.",
        "sqlite-has-fts": "$1 עם תמיכה בחיפוש בטקסט מלא",
        "sqlite-no-fts": "$1 ללא תמיכה בחיפוש בטקסט מלא",
        "logentry-delete-delete": "$1 {{GENDER:$2|מחק|מחקה}} את הדף $3&rlm;",
index 69c694f..404823a 100644 (file)
@@ -63,7 +63,8 @@
                        "Ankita-ks",
                        "Sahilrathod",
                        "Hindustanilanguage",
-                       "राम प्रसाद जोशी"
+                       "राम प्रसाद जोशी",
+                       "ShrUtiable"
                ]
        },
        "tog-underline": "कड़ियाँ अधोरेखन:",
        "linksearch-pat": "खोजने के लिये पाठ:",
        "linksearch-ns": "नामस्थान:",
        "linksearch-ok": "खोजें",
-       "linksearch-text": "\"*.wikipedia.org\" जैसे वाईल्ड-कार्ड्स प्रयोग किये जा सकते हैं।\nकम-से-कम \".org\" जैसे किसी top-level डोमेन की आवश्यकता है।<br />\nस्वीकार्य {{PLURAL:$2|प्रोटोकॉल}}: <code>$1</code> (यदि कोई प्रोटोकॉल ना दिया जाए तो http:// का प्रयोग किया जाता है)",
+       "linksearch-text": "\"*.wikipedia.org\" जैसे वाईल्ड-कार्ड्स प्रयोग किये जा सकते हैं।\nकम-से-कम \".org\" जैसे किसी top-level डोमेन की आवश्यकता है।<br />\nस्वीकार्य {{PLURAL:$2|प्रोटोकॉल}}: $1 (यदि कोई प्रोटोकॉल ना दिया जाए तो http:// का प्रयोग किया जाता है)",
        "linksearch-line": "$2 में से $1 जुडा हुआ हैं",
        "linksearch-error": "वाईल्डकार्ड्स होस्टनाम के सिर्फ शुरू में आ सकते हैं।",
        "listusersfrom": "इस अक्षर से शुरू होने वाले सदस्य दर्शाएँ:",
        "rollback-success": "$1 के संपादन हटाए;\n$2 द्वारा संपादित अन्तिम अवतरण को पुनर्स्थापित किया।",
        "sessionfailure-title": "सत्र विफलता",
        "sessionfailure": "ऐसा प्रतीत होता है कि आपके लॉगिन सत्र के साथ कोई समस्या है।\nसत्र अपहरण से बचाने के लिए सावधानी के तौर पर आपका यह क्रियाकलाप रद्द कर दिया गया है।\nकृपया पीछे जाएँ और पृष्ठ को पुनः लोड करें, तब दुबारा कोशिश करें।",
+       "changecontentmodel": "पेज कि सामगरिि मोदल को बदलिये",
+       "changecontentmodel-legend": "पृष्ठ सामग्री का नमूना",
+       "changecontentmodel-title-label": "पृष्ठ शीर्षक",
+       "changecontentmodel-model-label": "नयि सामग्री का नमूना",
+       "changecontentmodel-reason-label": "कारण:",
+       "changecontentmodel-success-title": "सामगरि का नामुने मे बदलाव हुुुाा हेेे",
        "protectlogpage": "सुरक्षा लॉग",
        "protectlogtext": "नीचे पृष्ठ सुरक्षा में हुए बदलावों की सूची है।\nवर्तमान सुरक्षित पृष्ठों की सूची के लिए [[Special:ProtectedPages|सुरक्षित पृष्ठों की सूची]] देखें।",
        "protectedarticle": "\"[[$1]]\" सुरक्षित कर दिया",
index 098f974..6291572 100644 (file)
        "passwordreset": "Password ke badlo",
        "passwordreset-text-one": "Aapan password ke reset kare ke khatir ii form ke bharo.",
        "passwordreset-text-many": "{{PLURAL:$1|Temporary password ke email se le ke khatir ek field me likho}}",
-       "passwordreset-legend": "Password ke badlo",
        "passwordreset-disabled": "II wiki me password ke badle ke ijaajat nai hae.",
        "passwordreset-emaildisabled": "Ii wiki me email ke band kar dewa gais hae.",
        "passwordreset-username": "Sadasya ke naam:",
        "resettokens": "Token ke reset karo",
        "resettokens-text": "Aap aapan private data pe access roke ke khatir token ke reset kare saktaa hae.\n\nAap ke ii kare ke chaahi agar aap galti se ii jaankari ke aur koi ke de diya hae nai to aap ke account ke bare me aur koi ke pataa hae.",
        "resettokens-no-tokens": "Reset kare ke jhatir koi token nai hae.",
-       "resettokens-legend": "Token ke reset karo",
        "resettokens-tokens": "Chinh (token)",
        "resettokens-token-label": "$1 (abhi ke value: $2)",
        "resettokens-watchlist-token": "Dhyan suchi ke web feed token (Atom/RSS) of [[Special:Watchlist|changes to pages on your watchlist]]",
        "nmembers": "$1 {{PLURAL:$1|sadasya|sadasya}}",
        "nmemberschanged": "$1 → $2{{PLURAL:$2|sadasya|sadasya}}",
        "nrevisions": "$1 {{PLURAL:$1|badlao|badlao}}",
-       "nviews": "$1 {{PLURAL:$1|dafe dekha gais hai|dafe dekha gais hai}}",
        "nimagelinks": "$1 {{PLURAL:$1|panna|panna}} me kaam me lawa gais hae",
        "ntransclusions": "$1 {{PLURAL:$1|panna|panna}} me kaam me lawa gais hae",
        "specialpage-empty": "Ii report khatir koi results nai hai.",
        "linksearch-pat": "Khoje ke pattern:",
        "linksearch-ns": "Namespace:",
        "linksearch-ok": "Khojo",
-       "linksearch-text": "Wildcard jaise ki \"*.wikipedia.org\" ke kaam me lawa jaae sake hae.\nIske khatir ek top-level domain, jaise ki \"*.org\" ke jaruri hae.<br /> \nSupport karaa gais {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (defaults to http:// if no protocol is specified).",
+       "linksearch-text": "Wildcard jaise ki \"*.wikipedia.org\" ke kaam me lawa jaae sake hae.\nIske khatir ek top-level domain, jaise ki \"*.org\" ke jaruri hae.<br /> \nSupport karaa gais {{PLURAL:$2|protocol|protocols}}: $1 (defaults to http:// if no protocol is specified).",
        "linksearch-line": "$1, $2 se jurraa hai",
        "linksearch-error": "Wildcards khaali hostname ke suruu me hoe ke chaahi.",
        "listusersfrom": "Sadasya jon ki hian se suruu hoe hai ke dekhao:",
index 714a33f..8a0887e 100644 (file)
        "createaccount-title": "Otvaranje suradničkog računa za {{SITENAME}}",
        "createaccount-text": "Netko je stvorio suradnički račun s Vašom adresom elektronske pošte na {{SITENAME}} ($4) nazvan \"$2\", s lozinkom \"$3\". Trebali biste se prijaviti i odmah promijeniti lozinku.\n\nMožete zanemariti ovu poruku ako je suradnički račun stvoren nenamjerno.",
        "login-throttled": "Nedavno ste se previše puta pokušali prijaviti.\nMolimo Vas pričekajte $1 prije nego što pokušate ponovno.",
-       "login-abort-generic": "Vaša prijava bila je neuspješna - Prekinuto",
-       "login-migrated-generic": "Vaš se suradnički račun preselio, i Vaše suradničko ime više ne postoji u ovom wikiju.",
+       "login-abort-generic": "Vaša je prijava bila neuspješna te je stoga prekinuta.",
+       "login-migrated-generic": "Vaš se suradnički račun preselio, te Vaše suradničko ime više ne postoji u ovom wikiju.",
        "loginlanguagelabel": "Jezik: $1",
        "suspicious-userlogout": "Vaš zahtjev za odjavu je odbijen jer to izgleda kao da je poslan preko pokvarenog preglednika ili keširanog posrednika (proxyja).",
        "createacct-another-realname-tip": "Pravo ime nije obvezno. \nAko ga navedete, bit će korišteno za pripisivanje Vaših doprinosa.",
        "protectedtitles": "Zaštićeni naslovi",
        "protectedtitlesempty": "Nijedan naslov nije trenutačno zaštićen s tim parametrima.",
        "listusers": "Popis suradnika",
-       "listusers-editsonly": "Pokaži samo suradnike s uređivanjem",
+       "listusers-editsonly": "Prikaži samo suradnike s uređivanjem",
        "listusers-creationsort": "Razvrstaj po datumu stvaranja",
        "listusers-desc": "Sortiraj obrnutim redoslijedom",
        "usereditcount": "$1 {{PLURAL:$1|uređivanje|uređivanja|uređivanja}}",
        "linksearch-pat": "Uzorak traženja:",
        "linksearch-ns": "Imenski prostor:",
        "linksearch-ok": "Traži",
-       "linksearch-text": "Možete koristiti džoker znakove poput \"*.wikipedia.org\".\nPotrebno je navesti osnovnu domenu (TLD), npr. \"*.org\".<br />\nPodržani {{PLURAL:$2|protokol|protokoli}}: <code>$1</code> (default je http:// ako nijedan protokol nije naveden).",
+       "linksearch-text": "Možete koristiti džoker znakove poput \"*.wikipedia.org\".\nPotrebno je navesti osnovnu domenu (TLD), npr. \"*.org\".<br />\nPodržani {{PLURAL:$2|protokol|protokoli}}: $1 (default je http:// ako nijedan protokol nije naveden).",
        "linksearch-line": "$1 poveznica s članka $2",
        "linksearch-error": "Džoker znakovi se mogu rabiti samo na početku imena poslužitelja.",
        "listusersfrom": "Prikaži suradnike počevši od:",
        "listgrouprights-removegroup-self-all": "Uklonite sve skupine iz vlastitog računa",
        "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
        "trackingcategories-nodesc": "Opis nije dostupan.",
-       "mailnologin": "Nema adrese pošiljaoca",
+       "mailnologin": "Nema adrese pošiljatelja",
        "mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]]\ni imati valjanu adresu e-pošte u svojim [[Special:Preferences|postavkama]]\nda bi mogli slati poštu drugim suradnicima.",
        "emailuser": "Pošalji mu e-poruku",
        "emailuser-title-target": "Pošalji poruku {{GENDER:$1|suradniku|suradnici|suradniku}}",
        "compare-rev1": "Izmjena 1",
        "compare-rev2": "Izmjena 2",
        "compare-submit": "Usporedite",
-       "compare-invalid-title": "Naslov koji ste naveli je nevažeći.",
+       "compare-invalid-title": "Naslov koji ste naveli nije valjan.",
        "compare-title-not-exists": "Naslov koji ste naveli ne postoji.",
        "compare-revision-not-exists": "Navedena izmjena stranice ne postoji.",
        "dberr-problems": "Ispričavamo se! Ova stranica ima tehničkih poteškoća.",
        "special-characters-group-greek": "grčki",
        "special-characters-group-cyrillic": "ćirilica",
        "special-characters-group-arabic": "arapski",
-       "special-characters-group-persian": "Perzijski",
+       "special-characters-group-persian": "perzijski",
        "special-characters-group-hebrew": "hebrejski",
        "special-characters-group-bangla": "Bangla znakovi",
        "special-characters-group-telugu": "telugu",
        "special-characters-group-sinhala": "Sinhaleški znakovi",
        "special-characters-group-gujarati": "Gudžaratski znakovi",
        "special-characters-group-thai": "Tajlandski (tajski) znakovi",
-       "special-characters-group-lao": "Laoski znakovi",
+       "special-characters-group-lao": "laoski znakovi",
        "special-characters-group-khmer": "kmerski",
        "mw-widgets-titleinput-description-redirect": "preusmjeravanje na $1"
 }
index 64acf51..5a2d9f3 100644 (file)
        "linksearch-pat": "Suchmuster:",
        "linksearch-ns": "Noomeraum:",
        "linksearch-ok": "Suche",
-       "linksearch-text": "Die Spezialseit ermöchlicht die Such noh Seite, in dene bestimmte Weblinks enthalt sind. Dabei könne Platzhalter wie beispielsweis <code>*.beispiel.de</code> benutzt sin. Es muss minnschtens en Top-Level-Domain, z. B. \"*.org\". ppngeb sin. <br />{{PLURAL:$2|Unnergeschtütztes Protokoll|Unnergestützte Protokolle}}: <code>$1</code> (Standard ist http, falls ken Protokoll angeb ist.)",
+       "linksearch-text": "Die Spezialseit ermöchlicht die Such noh Seite, in dene bestimmte Weblinks enthalt sind. Dabei könne Platzhalter wie beispielsweis <code>*.beispiel.de</code> benutzt sin. Es muss minnschtens en Top-Level-Domain, z. B. \"*.org\". ppngeb sin. <br />{{PLURAL:$2|Unnergeschtütztes Protokoll|Unnergestützte Protokolle}}: $1 (Standard ist http, falls ken Protokoll angeb ist.)",
        "linksearch-line": "$1 ist verlinkt von $2",
        "linksearch-error": "Wildcards könne nuar am Oonfang von der URL verwendt sin.",
        "listusersfrom": "Zeich Benutzer ab:",
index 012a86f..38b4f8d 100644 (file)
        "passwordreset": "Hesło wróćo stajić",
        "passwordreset-text-one": "Wupjelń tutón formular, zo by swoje hesło anulował.",
        "passwordreset-text-many": "{{PLURAL:$1|Wupjelń jedne z polow, zo by nachwilne hesło přez e-mejl dóstał.}}",
-       "passwordreset-legend": "Hesło wróćo stajić",
        "passwordreset-disabled": "Wróćostajenje hesłow je so na  tutym wikiju znjemóžniło.",
        "passwordreset-emaildisabled": "E-mejlowe funkcije su so na tutym wikiju znjemóžnili.",
        "passwordreset-username": "Wužiwarske mjeno:",
        "resettokens": "Tokeny wróćo stajić",
        "resettokens-text": "Móžeš tokeny wróćo stajić, kotrež přistup na wěste priwatne daty dowoleja, kotrež su z twojim kontom zwjazane.\n\nTy dyrbjał zo činić, jeli sy je zmylnje z někim dźělił abo jelic twoje konto je so napadało.",
        "resettokens-no-tokens": "Tokeny za wróćostajenje njejsu.",
-       "resettokens-legend": "Tokeny wróćo stajić",
        "resettokens-tokens": "Tokeny:",
        "resettokens-token-label": "$1 (aktualna hódnota: $2)",
        "resettokens-watchlist-token": "Token za webkanal (Atom/RSS) [[Special:Watchlist|změnow na stronach w twojich wobkedźbowankach]]",
        "randomincategory-nopages": "W kategoriji [[:Category:$1|$1]] žane strony njejsu.",
        "randomincategory-category": "Kategorija:",
        "randomincategory-legend": "Připadna strona w kategoriji",
+       "randomincategory-submit": "W porjadku",
        "randomredirect": "Připadne daleposrědkowanje",
        "randomredirect-nopages": "Žane daleposrědkowanja w mjenowym rumje \"$1\".",
        "statistics": "Statistika",
        "nmembers": "{{PLURAL:$1|$1 čłon|$1 čłonaj|$1 čłony|$1 čłonow}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|čłon|čłonaj|čłonojo|čłonow}}",
        "nrevisions": "$1 {{PLURAL:$1|wobdźěłanje|wobdźěłani|wobdźěłanja|wobdźěłanjow}}",
-       "nviews": "$1 {{PLURAL:$1|jedyn wopyt|wopytaj|wopyty|wopytow}}",
        "nimagelinks": "Wužiwa so na $1 {{PLURAL:$1|stronje|stronomaj|stronach|stronach}}",
        "ntransclusions": "wužiwa so na $1 {{PLURAL:$1|stronje|stronomaj|stronach|stronach}}",
        "specialpage-empty": "Tuchwilu žane zapiski.",
        "linksearch-pat": "Pytanski muster:",
        "linksearch-ns": "Mjenowy rum:",
        "linksearch-ok": "Pytać",
-       "linksearch-text": "Zastupniske znamješka kaž \"*.wikipedia.org\" móža so wužiwać.\nZnajmjeńša hłowna domena je trěbna, na přikład \"*.org\".<br />\n{{PLURAL:$2|Podpěrowany protokol|Podpěrowanej protokolej|Podpěrowane protokole}}: <code>$1</code> (standard je http://, jeli žadyn protokol njeje podaty).",
+       "linksearch-text": "Zastupniske znamješka kaž \"*.wikipedia.org\" móža so wužiwać.\nZnajmjeńša hłowna domena je trěbna, na přikład \"*.org\".<br />\n{{PLURAL:$2|Podpěrowany protokol|Podpěrowanej protokolej|Podpěrowane protokole}}: $1 (standard je http://, jeli žadyn protokol njeje podaty).",
        "linksearch-line": "$1 je z $2 wotkazany.",
        "linksearch-error": "Zastupniske znamjenja dadźa so jenož na spočatku URL wužiwać.",
        "listusersfrom": "Započinajo z:",
index 17ba6f4..2bd0d3f 100644 (file)
@@ -7,7 +7,8 @@
                        "Masterches",
                        "Urhixidur",
                        "아라",
-                       "Tisave"
+                       "Tisave",
+                       "Bfpage"
                ]
        },
        "tog-underline": "Souliyen lyen yo :",
        "yourdiff": "Diferans",
        "copyrightwarning": "Tanpri sonje tout piblikasyon ki fèt nan {{SITENAME}} piblye anba kontra $2 an (wè $1 pou konnen plis). Si ou pa vle sa ou ekri pataje oubyen modifye, ou pa dwe soumèt yo isit.<br />\nW ap pwomèt tou ke sa w ap ekri a se ou menm menm ki ekri li oubyen ke ou kopye li de yon sous ki nan domèn piblik, ou byen you sous ki lib. '''PA ITILIZE TRAVAY KI ANBA DWA DOTÈ SI OTÈ PA T BAY OTORIZASYON LI TOUTBON !'''",
        "copyrightwarning2": "Tanpri, konnen ke tout kontribisyon yo nan {{SITENAME}} kapab modifye, change oubyen retire pa lòt itilizatè yo.\nSi ou pa vle pou sa ou ekri pataje oubyen modifye, ou pa dwe soumèt li isit.<br />\nW ap pwomèt tou ke sa w ap ekri a se ou menm menm ki ekri li oubyen ke ou kopye li de yon sous ki nan domèn piblik, ou byen you sous ki lib (gade $1 pou konnen pi plis).\n'''PA ITILIZE TRAVAY KI ANBA DWA DOTÈ SI OTÈ PA T BAY OTORIZASYON LI TOUTBON !'''",
+       "editpage-cannot-use-custom-model": "Modèl la kontni nan paj sa a pa ka chanje.",
        "longpageerror": "'''ERÈ : Tèks ou anrejistre a ap fè $1 Ko, tay sa a depase kapasite limit nou kapab aksepte kounye a: $2 Ko. Nou pa kapab anrejistre tèks sa. Eseye ritounen nan paj ou te ye anvan pou kopye modifikasyon ou yo.'''",
        "readonlywarning": "'''Atansyon: Bazdone a bare pou fè travay sou li, kidonk ou pap kapab anrejistre modifikasyon ou yo kounye a.'''\nPetèt ou ta renmen kopye-kole teks sa a nan yon fichye teks epi anrejistre l pou pita.\n\nAdministratè ki te bare bazdone a te bay rezon sa a: $1",
        "protectedpagewarning": "'''Pote atansyon : paj sa a pwoteje. Se sèl itilizatè yo ki genyen estati administratè ki kapab modifye l.'''\nDènye jounal la parèt anba kòm referans.",
        "deleteotherreason": "Rezon an plis :",
        "deletereasonotherlist": "Lòt rezon",
        "rollbacklink": "revoke",
+       "changecontentmodel-title-label": "Paj Tit",
        "protectlogpage": "Jounal pwoteksyon yo",
        "protectedarticle": "pwoteje « [[$1]] »",
        "modifiedarticleprotection": "te modifye nivo pwoteksyon pou « [[$1]] »",
index b67c507..449f8a5 100644 (file)
        "headline_sample": "Alfejezet címe",
        "headline_tip": "Alfejezetcím",
        "nowiki_sample": "Ide írd a formázatlan szöveget",
-       "nowiki_tip": "Wiki formázás kikapcsolása",
+       "nowiki_tip": "Wikiformázás kikapcsolása",
        "image_sample": "Pelda.jpg",
        "image_tip": "Fájl (pl. kép) beszúrása",
        "media_sample": "Peldaegyketto.ogg",
        "linksearch-pat": "Keresett minta:",
        "linksearch-ns": "Névtér:",
        "linksearch-ok": "keresés",
-       "linksearch-text": "Helyettesítő karaktereket is lehet használni, például \"*.wikipedia.org\".\nLegalább egy felső szintű tartománynak lennie kell, például \"*.org\"<br />\nTámogatott {{PLURAL:$2|protokoll|protokollok}}: <code>$1</code> (http:// az alapértelmezett, ha nincs protokoll megadva).",
+       "linksearch-text": "Helyettesítő karaktereket is lehet használni, például \"*.wikipedia.org\".\nLegalább egy felső szintű tartománynak lennie kell, például \"*.org\"<br />\nTámogatott {{PLURAL:$2|protokoll|protokollok}}: $1 (http:// az alapértelmezett, ha nincs protokoll megadva).",
        "linksearch-line": "$1 hivatkozva innen: $2",
        "linksearch-error": "Helyettesítő karakterek csak a cím elején szerepelhetnek.",
        "listusersfrom": "Szerkesztők listázása a következő névtől kezdve:",
index b38aa5f..bb5dc9b 100644 (file)
@@ -22,7 +22,8 @@
                        "Աշոտ1997",
                        "GeoO",
                        "Դավիթ Սարոյան",
-                       "Beko"
+                       "Beko",
+                       "Vahe Gharakhanyan"
                ]
        },
        "tog-underline": "ընդգծել հղումները՝",
        "disclaimers": "Ազատում պատասխանատվությունից",
        "disclaimerpage": "Project:Ազատում պատասխանատվությունից",
        "edithelp": "Խմբագրման ուղեցույց",
+       "helppage-top-gethelp": "Օգնություն",
        "mainpage": "Գլխավոր էջ",
        "mainpage-description": "Գլխավոր էջ",
        "policy-url": "Project:Կանոնակարգ",
        "resetpass-wrong-oldpass": "Սխալ ժամանակավոր կամ ընթացիկ գաղտնաբառ։\nՀնարավոր է, որ դուք արդեն բարեհաջող փոխել եք գաղտնաբարը կամ հայցել եք նոր ժամանակավոր գաղտնաբառ։",
        "resetpass-temp-password": "Ժամանակավոր գաղտնաբառ.",
        "passwordreset": "Վերականգնել գաղտնաբառը",
-       "passwordreset-legend": "Վերականգնել գաղտնաբառը",
        "passwordreset-disabled": "Գաղտնաբառի վերականգնումը այս վիքիում թույլատրված չէ։",
        "passwordreset-username": "Մասնակցի անուն՝",
        "passwordreset-domain": "Դոմեն՝",
        "showhideselectedversions": "Ցուցադրել/թաքցնել ընտրված խմբագրումները",
        "editundo": "հետ շրջել",
        "diff-empty": "(Տարբերություն չկա)",
+       "diff-multi-sameuser": "(Միևնույն մասնակցի {{PLURAL:$1|մեկ միջանկյալ տարբերակ|$1 միջանկյալ տարբերակներ}} թաքցրված է)",
        "searchresults": "Որոնման արդյունքներ",
        "searchresults-title": "«$1»-ի որոնման արդյունքներ",
        "titlematches": "Համընկած հոդվածների անվանումներ",
        "right-suppressredirect": "Էջը վերանավանելիս վերահղում չթողնել",
        "right-upload": "Նիշքերի բեռնում",
        "right-upload_by_url": "Բեռնել նիշքեր ինտերնետային հասցեից",
+       "right-writeapi": "API գրի օգտագործումը",
        "right-delete": "Էջերի ջնջում",
        "right-rollback": "Արագ հետ գլորել տվյալ էջը վերջին անգամ խմբագրած մասնակցի խմբագրումները",
        "newuserlogpage": "Մասնակիցների գրանցման տեղեկամատյան",
        "unusedtemplateswlh": "այլ հղումներ",
        "randompage": "Պատահական էջ",
        "randompage-nopages": "Այս անվանատարածքում էջեր չկան։",
+       "randomincategory-submit": "Անցնել",
        "randomredirect": "Պատահական վերահղում",
        "randomredirect-nopages": "Այս անվանատարածքում վերահղումներ չկան։",
        "statistics": "Վիճակագրություն",
        "ncategories": "$1 {{PLURAL:$1|կատեգորիա|կատեգորիաներ}}",
        "ninterwikis": "$1 {{PLURAL:$1|ինտերվիքի|ինտերվիքիներ}}",
        "nlinks": "$1 {{PLURAL:$1|հղում|հղումներ}}",
-       "nmembers": "$1 {{PLURAL:$1|անդամ|անդամ}}",
+       "nmembers": "$1 {{PLURAL:$1|անդամ|անդամներ}}",
        "nrevisions": "$1 {{PLURAL:$1|տարբերակ|տարբերակներ}}",
-       "nviews": "$1 {{PLURAL:$1|դիտում|դիտումներ}}",
        "nimagelinks": "օգտագործվում է $1 {{PLURAL:$1|էջ|էջեր}}",
        "ntransclusions": "օգտագործվում է $1 {{PLURAL:$1|էջ|էջեր}}",
        "specialpage-empty": "Հայցումը արդյունքներ չվերադարձրեց։",
        "logentry-newusers-newusers": "$1 մասնակիցը ստեղծեց նոր հաշիվ",
        "logentry-newusers-create": "Ստեղծվեց $1 մասնակցի հաշիվ",
        "logentry-newusers-create2": "$1 Ստեղծեց նոր հաշիվ $3",
+       "logentry-upload-upload": "$1 {{GENDER:$2|ներբեռնել է}} $3",
        "rightsnone": "(ոչ մի)",
        "feedback-cancel": "Բեկանել",
        "feedback-close": "Արված է",
index 8a542a4..d00739c 100644 (file)
        "title-invalid-utf8": "Le titulo de pagina requestate contine un sequentia UTF-8 invalide.",
        "title-invalid-interwiki": "Le titulo de pagina requestate contine un ligamine interwiki que non pote esser usate in titulos.",
        "title-invalid-talk-namespace": "Le titulo de pagina requestate refere a un pagina de discussion que non pote exister.",
+       "title-invalid-characters": "Le titulo de pagina requestate contine characteres invalide: \"$1\".",
+       "title-invalid-relative": "Le titulo ha un cammino relative. Titulos de pagina relative (./, ../) non es valide, perque illos es sovente inattingibile a partir del navigator de un usator.",
+       "title-invalid-magic-tilde": "Le titulo de pagina requestate contine un sequentia de tildes non valide (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Le titulo de pagina requestate es troppo longe. Illo non debe haber plus de $1 {{PLURAL:$1|byte|bytes}} in codification UTF-8.",
+       "title-invalid-leading-colon": "Le titulo de pagina requestate contine un signo de duo punctos (:) al initio, lo que non es permittite.",
        "perfcached": "Le sequente datos esseva recuperate del cache e possibilemente non es actual. Un maximo de {{PLURAL:$1|un resultato|$1 resultatos}} es disponibile in le cache.",
        "perfcachedts": "Le sequente datos esseva recuperate del cache e ha essite actualisate le $3 a $4. Un maximo de {{PLURAL:$4|un resultato|$4 resultatos}} es disponibile in le cache.",
        "querypage-no-updates": "Le actualisationes pro iste pagina es disactivate. Pro le momento, le datos hic non se cambiara.",
        "protectedinterface": "Iste pagina contine texto pro le interfacie del software de iste wiki, e es protegite pro impedir le abuso. Pro adder o modificar traductiones pro tote le wikis, per favor usa [//translatewiki.net/ translatewiki.net], le projecto de traduction de MediaWiki.",
        "editinginterface": "<strong>Attention:</strong> Le texto de iste pagina face parte del interfacie pro le software.\nOmne modification apportate a iste pagina cambiara le apparentia del interfacie pro altere usatores de iste wiki.",
        "translateinterface": "Pro adder o modificar traductiones pro tote le wikis, per favor usa [//translatewiki.net/ translatewiki.net], le projecto de localisation de MediaWiki.",
-       "cascadeprotected": "Iste pagina ha essite protegite contra modificationes, proque illo es includite in le sequente {{PLURAL:$1|pagina, le qual|paginas, le quales}} es protegite usante le option \"cascada\":\n$2",
+       "cascadeprotected": "Iste pagina ha essite protegite contra modificationes perque illo es transcludite in le sequente {{PLURAL:$1|pagina, le qual|paginas, le quales}} es protegite usante le option \"cascada\":\n$2",
        "namespaceprotected": "Tu non ha le permission de modificar paginas in le spatio de nomines '''$1'''.",
        "customcssprotected": "Tu non ha le permission de modificar iste pagina de CSS perque illo contine le configuration personal de un altere usator.",
        "customjsprotected": "Tu non ha le permission de modificar iste pagina de JavaScript perque illo contine le configuration personal de un altere usator.",
        "yourdiff": "Differentias",
        "copyrightwarning": "Nota ben que tote le contributiones a {{SITENAME}} se considera publicate sub le $2 (vide plus detalios in $1).\nSi tu non vole que tu scripto sia modificate impietosemente e redistribuite a voluntate, alora non lo submitte hic.<br />\nIn addition, tu nos garanti que tu es le autor de isto, o que tu lo ha copiate de un ressource a dominio public o alteremente libere de derectos.\n'''Non submitte material subjecte a copyright sin autorisation expresse!'''",
        "copyrightwarning2": "Nota ben que tote le contributiones a {{SITENAME}} pote esser redigite, alterate, o eliminate per altere contributores.\nSi tu non vole que tu scripto sia modificate impietosemente, alora non lo submitte hic.<br />\nIn addition, tu nos garanti que tu es le autor de isto, o que tu lo ha copiate de un ressource a dominio public o alteremente libere de derectos (vide $1 pro detalios).\n'''Non submitte material subjecte a copyright sin autorisation expresse!'''",
+       "editpage-cannot-use-custom-model": "Le modello de contento de iste pagina non pote esser cambiate.",
        "longpageerror": "'''Error: Le texto que tu submitteva occupa {{PLURAL:$1|un kilobyte|$1 kilobytes}}, excedente le maximo de {{PLURAL:$2|un kilobyte|$2 kilobytes}}.'''\nIllo non pote esser salveguardate.",
        "readonlywarning": "'''Attention: Le base de datos ha essite blocate pro mantenentia. Tu non pote salveguardar tu modificationes in iste momento.'''\nNos recommenda copiar-e-collar le texto in un file e salveguardar lo pro plus tarde.\n\nLe administrator qui ha blocate le base de datos ha fornite iste explication: $1",
        "protectedpagewarning": "'''Attention:  Iste pagina ha essite protegite de sorta que solmente usatores con privilegios de administrator pote modificar lo.''' Le ultime entrata del registro es fornite hic infra pro referentia:",
        "semiprotectedpagewarning": "'''Nota:''' Iste pagina ha essite protegite de maniera que solmente usatores registrate pote modificar lo. Le ultime entrata del registro es fornite hic infra pro referentia:",
-       "cascadeprotectedwarning": "'''Attention:''' Iste pagina ha essite protegite de maniera que solmente administratores pote modificar lo, proque illo es includite in le protection in cascada del sequente {{PLURAL:$1|pagina|paginas}}:",
+       "cascadeprotectedwarning": "<strong>Attention:</strong> Iste pagina ha essite protegite de maniera que solmente usatores con privilegios de administrator pote modificar lo, perque illo es transcludite in le sequente {{PLURAL:$1|pagina|paginas}} protegite in cascada:",
        "titleprotectedwarning": "'''Attention:  Iste pagina ha essite protegite de maniera que [[Special:ListGroupRights|permissiones specific]] es requirite pro crear lo.''' Le ultime entrata del registro es fornite hic infra pro referentia:",
        "templatesused": "{{PLURAL:$1|Patrono|Patronos}} usate in iste pagina:",
        "templatesusedpreview": "{{PLURAL:$1|Patrono|Patronos}} usate in iste previsualisation:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objecto vacue",
        "content-json-empty-array": "Array vacue",
+       "duplicate-args-warning": "<strong>Attention:</strong> [[:$1]] appella [[:$2]] con plure valores pro le parametro \"$3\". Solmente le ultime valor fornite essera usate.",
        "duplicate-args-category": "Paginas que usa parametros duplicate in appellos de patrono",
        "duplicate-args-category-desc": "Le pagina contine appellos de patrono que usa duplicatos de parametros, como per exemplo <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Attention: Iste pagina contine troppo de appellos costose al functiones del analysator syntactic.\n\nIllo debe haber minus de $2 {{PLURAL:$2|appello|appellos}}, sed al momento ha $1 {{PLURAL:$1|appello|appellos}}.",
        "history-feed-description": "Historia del versiones de iste pagina in le wiki",
        "history-feed-item-nocomment": "$1 a $2",
        "history-feed-empty": "Le pagina que tu requestava non existe.\nEs possibile que illo esseva delite del wiki, o renominate.\nProva [[Special:Search|cercar nove paginas relevante]] in le wiki.",
+       "history-edit-tags": "Modificar etiquettas del versiones seligite",
        "rev-deleted-comment": "(summario del modification removite)",
        "rev-deleted-user": "(nomine de usator eliminate)",
        "rev-deleted-event": "(detalios de registro removite)",
        "rev-showdeleted": "monstrar",
        "revisiondelete": "Deler/restaurar versiones",
        "revdelete-nooldid-title": "Le version de destination es invalide",
-       "revdelete-nooldid-text": "O tu non ha specificate alcun version(es) de destination pro executar iste\nfunction, o le version specificate non existe, o tu essaya celar le version actual.",
+       "revdelete-nooldid-text": "Tu non ha specificate un version de destination pro executar iste function, o le version specificate non existe, o tu essaya celar le version actual.",
        "revdelete-no-file": "Le file specificate non existe.",
        "revdelete-show-file-confirm": "Es tu secur de voler vider un version delite del file  \"<nowiki>$1</nowiki>\" del $2 a $3?",
        "revdelete-show-file-submit": "Si",
        "badsig": "Signatura crude invalide; verificar le etiquettas HTML.",
        "badsiglength": "Tu signatura es troppo longe.\nIllo debe haber minus de $1 {{PLURAL:$1|character|characteres}}.",
        "yourgender": "Como prefere tu esser describite?",
-       "gender-unknown": "Io prefere non specificar",
+       "gender-unknown": "In mentionar te, le programma usara pronomines de genere neutre quando possibile",
        "gender-male": "Ille modifica paginas wiki",
        "gender-female": "Illa modifica paginas wiki",
        "prefs-help-gender": "Definir iste preferentia es optional.\nLe software lo usa pro adressar e mentionar te correctemente con le genere appropriate.\nIste information es public.",
        "userrights-lookup-user": "Gerer gruppos de usatores",
        "userrights-user-editname": "Entra un nomine de usator:",
        "editusergroup": "Modificar gruppos de usatores",
-       "editinguser": "Cambia le derectos del usator '''[[User:$1|$1]]''' $2",
+       "editinguser": "Cambia le derectos del {{GENDER:$1|usator}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Modificar gruppos de usatores",
        "saveusergroups": "Salveguardar gruppos de usatores",
        "userrights-groupsmember": "Membro de:",
        "right-sendemail": "Inviar e-mail a altere usatores",
        "right-passwordreset": "Vider le e-mails pro reinitialisar le contrasigno",
        "right-managechangetags": "Crear e deler [[Special:Tags|etiquettas]] in le base de datos",
+       "right-applychangetags": "Applicar [[Special:Tags|etiquettas]] al proprie modificationes",
+       "right-changetags": "Adder e remover qualcunque [[Special:Tags|etiquettas]] sur individual versiones e entratas de registro",
        "newuserlogpage": "Registro de creation de usatores",
        "newuserlogpagetext": "Isto es un registro de creation de usatores.",
        "rightslog": "Registro de derectos de usator",
        "action-editmyprivateinfo": "modificar le proprie information private",
        "action-editcontentmodel": "modificar le modello de contento de un pagina",
        "action-managechangetags": "crear e deler etiquettas in le base de datos",
+       "action-applychangetags": "applicar etiquettas al proprie modificationes",
+       "action-changetags": "adder e remover qualcunque etiquettas sur individual versiones e entratas de registro",
        "nchanges": "$1 {{PLURAL:$1|modification|modificationes}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde le ultime visita}}",
        "enhancedrc-history": "historia",
        "randomincategory-nopages": "Il non ha paginas in [[:Category:$1]].",
        "randomincategory-category": "Categoria:",
        "randomincategory-legend": "Pagina aleatori in categoria",
+       "randomincategory-submit": "Va",
        "randomredirect": "Redirection aleatori",
        "randomredirect-nopages": "Il non ha redirectiones in le spatio de nomines \"$1\".",
        "statistics": "Statisticas",
        "linksearch-pat": "Patrono a cercar:",
        "linksearch-ns": "Spatio de nomines:",
        "linksearch-ok": "Cercar",
-       "linksearch-text": "Es possibile usar metacharacteres como in \"*.wikipedia.org\".\nIsto necessita specificar al minus le dominio de nivello superior, per exemplo \"*.org\".<br />\n{{PLURAL:$2|Le protocollo|Protocollos}} supportate: <code>$1</code> (http:// es assumite si nulle protocollo es specificate).",
+       "linksearch-text": "Es possibile usar metacharacteres como in \"*.wikipedia.org\".\nIsto necessita specificar al minus le dominio de nivello superior, per exemplo \"*.org\".<br />\n{{PLURAL:$2|Le protocollo|Protocollos}} supportate: $1 (http:// es assumite si nulle protocollo es specificate).",
        "linksearch-line": "$1 ligate ab $2",
        "linksearch-error": "Le metacharacteres pote apparer solmente al initio del nomine de host.",
        "listusersfrom": "Monstrar usatores a partir de:",
        "tooltip-pt-logout": "Clauder session",
        "tooltip-pt-createaccount": "Tu es incoragiate a crear un conto e aperir session; totevia, non es obligatori",
        "tooltip-ca-talk": "Discussiones a proposito del pagina de contento",
-       "tooltip-ca-edit": "Tu pote modificar iste pagina.\nPer favor usa le previsualisation ante de publicar.",
+       "tooltip-ca-edit": "Modificar iste pagina",
        "tooltip-ca-addsection": "Initiar un nove section",
        "tooltip-ca-viewsource": "Iste pagina es protegite. Tu pote vider su codice fonte.",
        "tooltip-ca-history": "Versiones anterior de iste pagina",
        "version-libraries": "Bibliothecas installate",
        "version-libraries-library": "Bibliotheca",
        "version-libraries-version": "Version",
+       "version-libraries-license": "Licentia",
+       "version-libraries-description": "Description",
+       "version-libraries-authors": "Autores",
        "redirect": "Rediriger per nomine de file, ID de usator, ID de pagina o ID de version",
        "redirect-legend": "Rediriger a un file o pagina",
        "redirect-summary": "Iste pagina special redirige a un file (si es date le nomine de un file), a un pagina (si es date un ID de version o ID de pagina) o a un pagina de usator (si es date un ID de usator numeric). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] o [[{{#Special:Redirect}}/user/101]].",
        "tags-tag": "Nomine del etiquetta",
        "tags-display-header": "Apparentia in listas de modificationes",
        "tags-description-header": "Description complete del significato",
+       "tags-source-header": "Fonte",
        "tags-active-header": "Active?",
        "tags-hitcount-header": "Modificationes etiquettate",
+       "tags-actions-header": "Actiones",
        "tags-active-yes": "Si",
        "tags-active-no": "No",
+       "tags-source-extension": "Definite per un extension",
+       "tags-source-manual": "Applicate manualmente per usatores e robots",
+       "tags-source-none": "Non plus in uso",
        "tags-edit": "modificar",
+       "tags-delete": "deler",
+       "tags-activate": "activar",
+       "tags-deactivate": "disactivar",
        "tags-hitcount": "$1 {{PLURAL:$1|modification|modificationes}}",
+       "tags-create-reason": "Motivo:",
+       "tags-create-submit": "Crear",
+       "tags-delete-title": "Deler etiquetta",
+       "tags-delete-reason": "Motivo:",
        "comparepages": "Comparar paginas",
        "compare-page1": "Pagina 1",
        "compare-page2": "Pagina 2",
index 77914a0..84e543b 100644 (file)
        "linksearch-pat": "Pola pencarian:",
        "linksearch-ns": "Ruang nama:",
        "linksearch-ok": "Cari",
-       "linksearch-text": "Tanda bintang seperti \"*.wikipedia.org\" dapat digunakan.\nPerlu sedikitnya satu domain tingkat atas, misalnya \"*.org\".<br />\n{{PLURAL:$2|Protokol|Protokol}} yang didukung: <code>$1</code> (menggunakan http:// bila protokol tidak ditentukan)",
+       "linksearch-text": "Tanda bintang seperti \"*.wikipedia.org\" dapat digunakan.\nPerlu sedikitnya satu domain tingkat atas, misalnya \"*.org\".<br />\n{{PLURAL:$2|Protokol|Protokol}} yang didukung: $1 (menggunakan http:// bila protokol tidak ditentukan)",
        "linksearch-line": "$1 memiliki pranala dari $2",
        "linksearch-error": "''Wildcards'' hanya dapat digunakan di bagian awal dari nama host.",
        "listusersfrom": "Tampilkan pengguna mulai dari:",
index 215c489..8c07242 100644 (file)
@@ -11,7 +11,8 @@
                        "Renan",
                        "Valodnieks",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Srdjan m"
                ]
        },
        "tog-underline": "Ultracatenun:",
        "timezoneregion-europe": "Europe",
        "timezoneregion-indian": "Ocean Indian",
        "timezoneregion-pacific": "Ocean Pacific",
-       "youremail": "E-mail:",
+       "youremail": "Adresa e-pošte:",
        "username": "Nómine de usator:",
        "yourrealname": "Nómine real:",
        "yourlanguage": "Lingue:",
index a31224a..18d6d60 100644 (file)
        "protectedinterface": "Daytoy a panid ket mangited iti testo ti interface para iti sopwer iti daytoy a wiki, ken nasalakniban tapno mapawilan ti panag-abuso.\nTi aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
        "editinginterface": "<strong>Ballaag:</strong> Ur-urnosem ti maysa a panid a maar-aramat a mangted iti testo ti interface para iti sopwer.\nDagiti panagsukat iti daytoy a panid ket maarigan ti langa ti interface ti agar-aramat para kadagiti sabali nga agar-aramat iti daytoy a wiki.",
        "translateinterface": "Ti aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
-       "cascadeprotected": "Daytoy a panid ket nasalaknibanen para iti panag-urnos ngamin ket nairaman kadagiti sumaganad {{PLURAL:$1|a panid, a|a pampanid, a}} nasalakniban iti nalukatan a pagpilian ti \"sariap\":\n$2",
+       "cascadeprotected": "Daytoy a panid ket nasalaknibanen manipud iti panagurnos gapu ta nailak-am {{PLURAL:$1|iti sumaganad a panid|kadagiti sumaganad a panid}} a nasalakniban iti nalukatan a pagpilian ti \"sariap\":\n$2",
        "namespaceprotected": "Awan ti pammalubosmo nga agurnos kadagiti panid iti nagan ti espasio ti <strong>$1</strong>.",
        "customcssprotected": "Awan ti pammalubosmo nga agurnos iti daytoy panid ti CSS, ngamin ket naglaon ti personal a pannakaisaad iti sabali agar-aramat.",
        "customjsprotected": "Awan ti pammalubosmo nga agurnos iti daytoy a panid ti JavaScript, ngamin ket naglaon ti personal a pannakaisaad iti sabali agar-aramat.",
        "readonlywarning": "<strong>Ballaag: Narikepan ti database tapno mataripato, isu a saanmo a mabalin nga idulin dagita inurnosmo tattan.</strong>\nMabalinmo ti agkopia ken agipegket ti testom iti papeles ti testo ken idulinmo daytoy intono madamdama.\n\nTi administrador a nangrikep ket nangited iti daytoy a palawag: $1",
        "protectedpagewarning": "<strong>Ballaag: Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos ditoy.</strong>\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "semiprotectedpagewarning": "<strong>Nota:</strong> Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaurnos ditoy.\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
-       "cascadeprotectedwarning": "<strong>Ballaag:</strong> Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos ngamin ket nairaman kadagiti sumaganad a nasalakniban iti sariap\n{{PLURAL:$1|a panid|a pampanid}}:",
+       "cascadeprotectedwarning": "<strong>Ballaag:</strong> Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos gapu ta nailak-am {{PLURAL:$1|iti sumaganad a panid|kadagiti sumaganad a panid}} a nasalakniban iti sariap:",
        "titleprotectedwarning": "<strong>Ballaag:  Nasalakniban daytoy a panid tapno [[Special:ListGroupRights|dagiti naisangayan ti karbengan]] ket nasken a makapartuat iti daytoy.</strong>\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "templatesused": "{{PLURAL:$1|Ti plantilia|Dagiti plantilia}} a naaramat iti daytoy a panid:",
        "templatesusedpreview": "{{PLURAL:$1|Ti plantilia|Dagiti plantilia}} a naaramat iti daytoy a panagpadas:",
        "linksearch-pat": "Tabas ti panagbiruk:",
        "linksearch-ns": "Nagan ti espasio:",
        "linksearch-ok": "Biruken",
-       "linksearch-text": "Dagiti naatap a tarheta a kas ti \"*.wikipedia.org\" ket mabalin nga usaren.\nMasapul ti saan a basbassit ngem kangatuan a dominio, kas pagarigan \"*.org\".<br />\n{{PLURAL:$2|Ti protokol|Dagiti protokol}} a nasuportaran: <code>$1</code> (kasisigud iti http:// no awan ti nainaganan a protokol).",
+       "linksearch-text": "Dagiti naatap a tarheta a kas ti \"*.wikipedia.org\" ket mabalin nga usaren.\nMasapul ti saan a basbassit ngem kangatuan a dominio, kas pagarigan \"*.org\".<br />\n{{PLURAL:$2|Ti protokol|Dagiti protokol}} a nasuportaran: $1 (kasisigud iti http:// no awan ti nainaganan a protokol).",
        "linksearch-line": "Ti $1 ket naisilpo manipud ti $2",
        "linksearch-error": "Ti naatap a tarheta ket mabalin nga agparang laeng iti rugi ti nagan ti agsangaili.",
        "listusersfrom": "Iparang dagiti agar-aramat a mangrugi iti:",
        "rollback-success": "Naibabawi dagiti panagurnos babaen ni $1;\nnaisubli manen ti naudi a rebision babaen ni $2.",
        "sessionfailure-title": "Napaay ti sesion",
        "sessionfailure": "Adda parikut ti sesion ti panagserrekmo;\ndaytoy nga aramid ket naibabawi a kas pagpawilan ti panaghijack ti sesion.\nAgsublika iti naggapuam a panid, ikargam manen ti panid ken padasen manen.",
+       "changecontentmodel": "Baliwan ti modelo ti linaon ti panid",
+       "changecontentmodel-legend": "Baliwan ti modelo ti linaon ti panid",
+       "changecontentmodel-title-label": "Titulo ti panid",
+       "changecontentmodel-model-label": "Baro a modelo ti linaon",
+       "changecontentmodel-reason-label": "Rason:",
+       "changecontentmodel-success-title": "Nabaliwan ti modelo ti linaon",
+       "changecontentmodel-success-text": "Nabaliwanen ti kita ti linaon ti [[:$1]].",
+       "changecontentmodel-cannot-convert": "Ti linaon iti [[:$1]] ket saan a mabaliwan iti kita ti $2.",
+       "changecontentmodel-title-cantexist": "Saan a mabalin nga addaan iti panid iti $1.",
+       "changecontentmodel-nodirectediting": "Ti modelo ti linaon ti $1 ket saan a mangsuporta ti dagus a panagurnos",
+       "log-name-contentmodel": "Listaan ti panagbaliw ti modelo ti linaon",
+       "log-description-contentmodel": "Dagiti pasamak a mainaig kadagiti modelo ti linaon ti panid",
+       "logentry-contentmodel-change": "{{GENDER:$2|Binaliwan}} ni $1 ti modelo ti panid ti $3 manipud ti \"$4\" iti \"$5\"",
+       "logentry-contentmodel-change-revertlink": "isubli",
+       "logentry-contentmodel-change-revert": "isubli",
        "protectlogpage": "Listaan ti panagsalaknib",
        "protectlogtext": "Dita baba ket adda listaan dagiti sinukatan a salaknib ti panid.\nKitaen ti [[Special:ProtectedPages|listaan kadagiti nasalakniban a panid]] ti listaan kadagiti agdama a panagpataray a panagsalaknib ti panid.",
        "protectedarticle": "nasalakniban ti \"[[$1]]\"",
        "protect-locked-blocked": "Saanmo a mabalin a sukatan dagiti kita ti salaknib no naserraanka.\nAdda ditoy kadagiti agdama a kasasaad ti panid ti <strong>$1</strong>:",
        "protect-locked-dblock": "Ti kita ti salaknib ket saan a masukatan gapu ti agdama a kandado ti database.\nAdda ditoy kadagiti agdama a kasasaad ti panid ti <strong>$1</strong>:",
        "protect-locked-access": "Ti pakabilangam ket awan pammalubosna a mangsukat kadagiti agpang ti salaknib ti panid.\nDagitoy ti agdama a pannakaisaad para iti panid ti <strong>$1</strong>:",
-       "protect-cascadeon": "Daytoy a panid ket agdama a nasalakniban gapu ta nairaman kadagiti sumaganad a {{PLURAL:$1|panid, nga addaan|pampanid, nga addaan}} iti nalukatan a salaknib ti sariap.\nDagiti panagbaliw iti agpang ti salaknib iti daytoy a panid ket saan a mabanagan ti salaknib ti sariap.",
+       "protect-cascadeon": "Daytoy a panid ket agdama a nasalakniban gapu ta nailak-am {{PLURAL:$1|iti sumaganad a panid|kadagiti sumaganad a panid}} nga addaan iti nalukatan a salaknib ti sariap.\nDagiti panagbaliw iti agpang ti salaknib iti daytoy a panid ket saan a mabanagan ti salaknib ti sariap.",
        "protect-default": "Palubosan amin nga agar-aramat",
        "protect-fallback": "Palubosan laeng dagiti agar-aramat nga adda iti \"$1\" a pammalubos",
        "protect-level-autoconfirmed": "Palubosan laeng dagiti automatiko a napasingkedan nga agar-aramat",
        "tooltip-pt-logout": "Rummuar",
        "tooltip-pt-createaccount": "Maaw-awis nga agpartuatka iti pakabilangan ken sumrek; nupay kasta, daytoy ket saan a nasken",
        "tooltip-ca-talk": "Pagtungtungan a maipapan ti linaon ti panid",
-       "tooltip-ca-edit": "Mabalinmo nga urnosen daytoy a panid. Pangngaasi nga aramatem ti buton ti panagipadas sakbay nga agidulin",
+       "tooltip-ca-edit": "Urnosen daytoy a panid",
        "tooltip-ca-addsection": "Mangirugi ti baro a paset",
        "tooltip-ca-viewsource": "Nasalakniban daytoy a panid.\nMabalinmo a kitaen ti taudanna.",
        "tooltip-ca-history": "Dagiti napalabas a rebision iti daytoy a panid.",
        "pageinfo-robot-index": "Maipalubos",
        "pageinfo-robot-noindex": "Saan a maipalubos",
        "pageinfo-watchers": "Bilang dagiti agbuybuya ti panid",
+       "pageinfo-visiting-watchers": "Bilang dagiti agbuybuya ti panid a nangsarungkar kadagiti kaudian a balbaliw",
        "pageinfo-few-watchers": "Basbassit ngem $1 {{PLURAL:$1|ti agbuybuya|dagiti agbuybuya}}",
+       "pageinfo-few-visiting-watchers": "Mabalin nga adda wenno awan ti agbuybuya nga agar-aramat a nangsarungkar kadagiti kaudian a balbaliw",
        "pageinfo-redirects-name": "Bilang dagiti baw-ing iti daytoy a panid",
        "pageinfo-subpages-name": "Bilang dagiti subpanid iti daytoy a panid",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|baw-ing|bawbaw-ing}}; $3 {{PLURAL:$3|saan a baw-ing|saan a bawbaw-ing}})",
        "tag-filter-submit": "Sagat",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etiketa|Et-etiketa}}]]: $2)",
        "tags-title": "Dagiti etiketa",
-       "tags-intro": "Daytoy a panid ket ilistana dagiti etiketa a mablin nga usaren ti sopwer a mangmarka iti urnos, ken dagiti kaibuksilanda.",
+       "tags-intro": "Daytoy a panid ket ilistana dagiti etiketa a mablin nga usaren ti sopwer a mangmarka iti inurnos, ken dagiti kaibuksilanda.",
        "tags-tag": "Nagan ti etiketa",
        "tags-display-header": "Tabas dagiti listaan ti panagsukat",
        "tags-description-header": "Napno a deskripsion ti kaibuksilan.",
        "htmlform-cloner-create": "Agnayon pay ti adu",
        "htmlform-cloner-delete": "Ikkaten",
        "htmlform-cloner-required": "Saan a basbassit ngem maysa a pateg ti masapul.",
+       "htmlform-title-not-exists": "Awan ti [[:$1]].",
+       "htmlform-user-not-exists": "Awan ti <strong>$1</strong>.",
+       "htmlform-user-not-valid": "Saan nga umiso a nagan ti agar-aramat ti <strong>$1</strong>.",
        "sqlite-has-fts": "Ti $1 nga addaan iti suporta ti panagbiruk ti napno a testo",
        "sqlite-no-fts": "Ti $1 nga awan iti suporta ti panagbiruk ti napno a testo",
        "logentry-delete-delete": "{{GENDER:$2|Inikkat}} ni $1 ti panid ti $3",
index b9dbc03..f7facdf 100644 (file)
        "linksearch-pat": "Leitarmynstur:",
        "linksearch-ns": "Nafnrými:",
        "linksearch-ok": "Leita",
-       "linksearch-text": "Algildisleit eins og \"*.wikipedia.org\" er leyfð.<br />\nLeitin þarf að minnsta kosti að innihalda rótarlén, eins og \"*.org\"\n{{PLURAL:$2|Studd samskiptaregla|Studdar samskiptareglur}}: <code>$1</code> (http:// sjálfgefið ef engin regla er valin).",
+       "linksearch-text": "Algildisleit eins og \"*.wikipedia.org\" er leyfð.<br />\nLeitin þarf að minnsta kosti að innihalda rótarlén, eins og \"*.org\"\n{{PLURAL:$2|Studd samskiptaregla|Studdar samskiptareglur}}: $1 (http:// sjálfgefið ef engin regla er valin).",
        "linksearch-line": "Tengt er í $1 á síðunni $2",
        "linksearch-error": "Algildistafir mega engöngu birtast í upphafi vefslóðarinnar.",
        "listusersfrom": "Sýna notendur sem byrja á:",
index 3870cd1..ff8a901 100644 (file)
                        "Purodha",
                        "TecnoMaster",
                        "Alexmar983",
-                       "Federico Mugnaini"
+                       "Federico Mugnaini",
+                       "Fpugliajno",
+                       "Fringio",
+                       "Aquatech"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "protectedinterface": "Questa pagina contiene un elemento che fa parte dell'interfaccia utente del software di questo sito ed è protetta per evitare possibili abusi.\nPer aggiungere o modificare le traduzioni valide su tutti i wiki, usa [//translatewiki.net/ translatewiki.net], il progetto di localizzazione di MediaWiki.",
        "editinginterface": "<strong>Attenzione:</strong> il testo di questa pagina fa parte dell'interfaccia utente del software di questo sito. Tutte le modifiche apportate a questa pagina si riflettono sui messaggi visualizzati per tutti gli utenti su questo wiki.",
        "translateinterface": "Per aggiungere o modificare le traduzioni valide su tutti i wiki, usa [//translatewiki.net/ translatewiki.net], il progetto MediaWiki per la localizzazione.",
-       "cascadeprotected": "Su questa pagina non è possibile effettuare modifiche perché è stata inclusa {{PLURAL:$1|nella pagina indicata di seguito, che è stata protetta|nelle pagine indicate di seguito, che sono state protette}} selezionando la protezione \"ricorsiva\":\n$2",
+       "cascadeprotected": "Su questa pagina non è possibile effettuare modifiche perché è inclusa {{PLURAL:$1|nella pagina indicata di seguito, che è stata protetta|nelle pagine indicate di seguito, che sono state protette}} selezionando la protezione \"ricorsiva\":\n$2",
        "namespaceprotected": "Non si dispone dei permessi necessari per modificare le pagine del namespace '''$1'''.",
        "customcssprotected": "Non si dispone dei permessi necessari alla modifica di questa pagina CSS, in quanto contiene le impostazioni personali di un altro utente.",
        "customjsprotected": "Non si dispone dei permessi necessari alla modifica di questa pagina JavaScript, in quanto contiene le impostazioni personali di un altro utente.",
        "readonlywarning": "<strong>ATTENZIONE</strong>: il database è bloccato per manutenzione, non è momentaneamente possibile salvare le modifiche effettuate.\nPer non perderle, copiale in un file di testo e salvalo in attesa dello sblocco del database.\n\nL'amministratore che impostato il blocco ha fornito questa spiegazione: $1.",
        "protectedpagewarning": "'''Attenzione: questa pagina è stata bloccata in modo che solo gli utenti con privilegi di amministratore possano modificarla.'''\nL'ultimo elemento del registro è riportato di seguito per informazione:",
        "semiprotectedpagewarning": "'''Nota:''' Questa pagina è stata bloccata in modo che solo gli utenti registrati possano modificarla.\nL'ultimo elemento del registro è riportato di seguito per informazione:",
-       "cascadeprotectedwarning": "'''Attenzione:''' Questa pagina è stata bloccata in modo che solo gli utenti con privilegi di amministratore possano modificarla. Ciò avviene perché la pagina è inclusa {{PLURAL:$1|nella pagina indicata di seguito, che è stata protetta|nelle pagine indicate di seguito, che sono state protette}} selezionando la protezione \"ricorsiva\":",
+       "cascadeprotectedwarning": "<strong>Attenzione:</strong> Questa pagina è stata bloccata in modo che solo gli utenti con privilegi di amministratore possano modificarla poiché è inclusa selezionando la protezione \"ricorsiva\" {{PLURAL:$1|nella pagina|nelle pagine}}:",
        "titleprotectedwarning": "'''Attenzione: questa pagina è stata bloccata in modo che siano necessari [[Special:ListGroupRights|diritti specifici]] per crearla.'''\nL'ultimo elemento del registro è riportato di seguito per informazione:",
        "templatesused": "{{PLURAL:$1|Template utilizzato|Template utilizzati}} in questa pagina:",
        "templatesusedpreview": "{{PLURAL:$1|Template utilizzato|Template utilizzati}} in questa anteprima:",
        "history-feed-description": "Cronologia della pagina su questo sito",
        "history-feed-item-nocomment": "$1 il $2",
        "history-feed-empty": "La pagina richiesta non esiste; potrebbe essere stata cancellata dal sito o rinominata. Verificare con la [[Special:Search|pagina di ricerca]] se vi sono nuove pagine.",
-       "history-edit-tags": "Modifica le etichette delle versioni selezioniate",
+       "history-edit-tags": "Modifica le etichette delle versioni selezionate",
        "rev-deleted-comment": "(Oggetto della modifica rimosso)",
        "rev-deleted-user": "(nome utente rimosso)",
        "rev-deleted-event": "(dettagli del registro rimossi)",
        "uploaddisabledtext": "Il caricamento dei file non è attivo.",
        "php-uploaddisabledtext": "Il caricamento di file tramite PHP è disabilitato. Controlla la configurazione di file_uploads.",
        "uploadscripted": "Questo file contiene codice HTML o di script, che potrebbe essere interpretato erroneamente da un browser web.",
+       "upload-scripted-pi-callback": "Impossibile caricare un file che contiene istruzione di elaborazione in XML-stylesheet.",
        "uploaded-script-svg": "Trovato elemento di script \"$1\" nel file caricato in formato SVG.",
        "uploaded-hostile-svg": "Trovato CSS non sicuro nell'elemento di stile del file in formato SVG caricato.",
        "uploaded-event-handler-on-svg": "Impostazione gestione eventi ed attributi <code>$1=\"$2\"</code> non è consentito in file SGV",
        "uploaded-href-attribute-svg": "Attributi href <code>&lt;$1 $2=\"$3\"&gt;</code> com un bersaglio non locale (e.g. http://, javascript:, etc) non sono permessi file SGV",
        "uploaded-href-unsafe-target-svg": "Trovati href ad un bersaglio non sicuro <code>&lt;$1 $2=\"$3\"&gt;</code> caricato nel file SVG",
+       "uploaded-animate-svg": "Trovato il tag \"animate\" che potrebbe cambiare href, usando l'attributo \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> nel file SVG caricato.",
+       "uploaded-setting-href-svg": "Utilizzare il tag \"set\" per aggiungere l'attributo \"href\" all'elemento parentale è bloccato.",
        "uploaded-image-filter-svg": "Trovato filtro immagine con URL: <code>&lt;$1 $2=\"$3\"&gt;</code> nel file in formato SVG caricato.",
        "uploadscriptednamespace": "Questo file SVG contiene un namespace '$1' non consentito",
        "uploadinvalidxml": "Il codice XML nel file caricato non può essere elaborato.",
        "linksearch-pat": "Pattern di ricerca:",
        "linksearch-ns": "Namespace:",
        "linksearch-ok": "Cerca",
-       "linksearch-text": "È possibile fare uso di metacaratteri, ad esempio \"*.wikipedia.org\".\nÈ necessario almeno un dominio di primo livello, ad esempio \"*.org\".<br />\n{{PLURAL:$2|Protocollo supportato|Protocolli supportati}}: <code>$1</code> (predefinito http:// se nessun protocollo è specificato).",
+       "linksearch-text": "È possibile fare uso di metacaratteri, ad esempio \"*.wikipedia.org\".\nÈ necessario almeno un dominio di primo livello, ad esempio \"*.org\".<br />\n{{PLURAL:$2|Protocollo supportato|Protocolli supportati}}: $1 (predefinito http:// se nessun protocollo è specificato).",
        "linksearch-line": "$1 presente nella pagina $2",
        "linksearch-error": "I metacaratteri possono essere usati solo all'inizio dell'indirizzo.",
        "listusersfrom": "Mostra gli utenti a partire da:",
        "changecontentmodel-success-title": "Il modello di contenuto è stato modificato",
        "changecontentmodel-success-text": "Il tipo di contenuto di [[:$1]] è stato modificato.",
        "changecontentmodel-cannot-convert": "Il contenuto di [[:$1]] non può essere convertito in tipo $2.",
+       "changecontentmodel-title-cantexist": "Non è possibile avere una pagina in $1.",
+       "changecontentmodel-nodirectediting": "Il modello di contenuto $1 non supporta la modifica diretta",
+       "log-name-contentmodel": "Registro delle modifiche del modello contenuti",
        "log-description-contentmodel": "Eventi relativi al modello di contenuto di una pagina",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|ha modificato}} il modello di contenuto della pagina $3 da \"$4\" a \"$5\"",
        "logentry-contentmodel-change-revertlink": "ripristina",
        "protect-locked-blocked": "Non è possibile modificare i livelli di protezione quando è attivo un blocco. Le impostazioni correnti per la pagina sono '''$1''':",
        "protect-locked-dblock": "Impossibile modificare i livelli di protezione durante un blocco del database.\nLe impostazioni correnti per la pagina sono '''$1''':",
        "protect-locked-access": "Non si dispone dei permessi necessari per modificare i livelli di protezione della pagina.\nLe impostazioni correnti per la pagina sono '''$1''':",
-       "protect-cascadeon": "Al momento questa pagina è bloccata perché viene inclusa {{PLURAL:$1|nella pagina indicata di seguito, per la quale|nelle pagine indicate di seguito, per le quali}} è attiva la protezione ricorsiva.\nLe modifiche al livello di protezione individuale della pagina, non avranno effetto sulle impostazioni derivanti dalla protezione ricorsiva.",
+       "protect-cascadeon": "Al momento questa pagina è bloccata perché inclusa {{PLURAL:$1|nella pagina indicata di seguito, per la quale|nelle pagine indicate di seguito, per le quali}} è attiva la protezione ricorsiva.\nLe modifiche al livello di protezione individuale della pagina, non avranno effetto sulle impostazioni derivanti dalla protezione ricorsiva.",
        "protect-default": "Autorizza tutti gli utenti",
        "protect-fallback": "Consentito solo agli utenti con permesso \"$1\"",
        "protect-level-autoconfirmed": "Consentito solo agli utenti autoconvalidati",
        "pageinfo-robot-index": "Consentito",
        "pageinfo-robot-noindex": "Non consentito",
        "pageinfo-watchers": "Numero di utenti che hanno la pagina nei loro osservati speciali",
+       "pageinfo-visiting-watchers": "Numero degli osservatori della pagina che hanno visitato le modifiche recenti",
        "pageinfo-few-watchers": "Meno di $1 {{PLURAL:$1|osservatore|osservatori}}",
+       "pageinfo-few-visiting-watchers": "Ci potrebbero essere o non essere utenti che hanno visualizzato le modifiche recenti",
        "pageinfo-redirects-name": "Numero di redirect a questa pagina",
        "pageinfo-subpages-name": "Sottopagine di questa pagina",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect}}; $3 {{PLURAL:$3|non redirect}})",
        "htmlform-cloner-create": "Aggiungi altro",
        "htmlform-cloner-delete": "Rimuovi",
        "htmlform-cloner-required": "È necessario almeno un valore.",
+       "htmlform-title-badnamespace": "[[:$1]] non si trova nel namespace \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "\"$1\" è il titolo di una pagina non creabile",
+       "htmlform-title-not-exists": "[[:$1]] non esiste.",
+       "htmlform-user-not-exists": "<strong>$1</strong> non esiste.",
+       "htmlform-user-not-valid": "<strong>$1</strong> non è un nome utente valido.",
        "sqlite-has-fts": "$1 con la possibilità di ricerca completa nel testo",
        "sqlite-no-fts": "$1 senza la possibilità di ricerca completa nel testo",
        "logentry-delete-delete": "$1 {{GENDER:$2|ha cancellato}} la pagina $3",
index b77811c..55188ea 100644 (file)
        "title-invalid-interwiki": "指定されたページ名がページ名として使用できないウィキ間リンクを含んでいます。",
        "title-invalid-talk-namespace": "指定されたページは存在し得ないトークページです。",
        "title-invalid-characters": "指定されたページ名が無効な文字 \"$1\" を含んでいます。",
+       "title-invalid-relative": "タイトルは相対パスを持っています。相対ページタイトル(./, ../)は無効であり、なぜならば利用者のブラウザでは多くの場合に到達不能だからです。",
        "title-invalid-magic-tilde": "指定されたページ名は無効なチルダ文字列 (<nowiki>~~~</nowiki>) を含んでいます。",
        "title-invalid-too-long": "指定されたページ名が長すぎます。UTF-8エンコードで $1 バイト以下でなければなりません。",
        "title-invalid-leading-colon": "指定されたページ名の先頭に無効なコロンが含まれています。",
        "protectedinterface": "このページにはこのウィキのソフトウェアのインターフェイスに使用されるテキストが保存されており、いたずらなどの防止のために保護されています。\nすべてのウィキに対して翻訳を追加/変更する場合は、MediaWiki の地域化プロジェクト [//translatewiki.net/wiki/Main_Page?setlang=ja translatewiki.net] を使用してください。",
        "editinginterface": "<strong>警告:</strong> ソフトウェアのインターフェイスに使用されるテキストのページを編集しています。\nこのページを変更すると、このウィキの他の利用者のユーザーインターフェイスの外観に影響します。",
        "translateinterface": "すべてのウィキに対して翻訳を追加/変更する場合は、MediaWiki の地域化プロジェクト [//translatewiki.net/wiki/Main_Page?setlang=ja translatewiki.net] を使用してください。",
-       "cascadeprotected": "このページは、「カスケード保護」が指定された状態で保護されている以下の{{PLURAL:$1|ページ|ページ群}}で読み込まれているため、編集できないように保護されています:\n$2",
+       "cascadeprotected": "このページは、「カスケード保護」が指定された状態で保護されている以下の{{PLURAL:$1|ページ|ページ群}}でトランスクルードのため読み込まれているので、編集できないように保護されています:\n$2",
        "namespaceprotected": "<strong>$1</strong>名前空間にあるページを編集する権限がありません。",
        "customcssprotected": "この CSS ページは他の利用者の個人設定を含んでいるため、あなたには編集する権限がありません。",
        "customjsprotected": "この JavaScript ページは他の利用者の個人設定を含んでいるため、あなたには編集する権限がありません。",
        "yourdiff": "差分",
        "copyrightwarning": "{{SITENAME}}への投稿はすべて、$2 (詳細は$1を参照)のもとで公開したと見なされることにご注意ください。\n自分が書いたものが他の人に容赦なく編集され、自由に配布されるのを望まない場合は、ここに投稿しないでください。<br />\nまた、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください。\n<strong>著作権保護されている作品は、許諾なしに投稿しないでください!</strong>",
        "copyrightwarning2": "{{SITENAME}}への投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。\n自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。<br />\nまた、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は$1を参照)。\n<strong>著作権保護されている作品は、許諾なしに投稿しないでください!</strong>",
+       "editpage-cannot-use-custom-model": "このページのコンテント・モデル(content model)を変更することは、できません。",
        "longpageerror": "<strong>エラー: 投稿された文章は {{PLURAL:$1|$1 KB}} の長さがあります。これは投稿できる最大の長さ {{PLURAL:$2|$2 KB}} を超えています。</strong>\nこの編集内容は保存できません。",
        "readonlywarning": "<strong>警告: データベースがメンテナンスのためロックされており、現在は編集内容を保存できません。</strong>\n必要であれば文章をコピー&amp;ペーストしてテキストファイルとして保存し、後ほど保存をやり直してください。\n\nデータベースをロックした管理者による説明は以下の通りです: $1",
        "protectedpagewarning": "<strong>警告: このページは保護されているため、管理者権限を持つ利用者のみが編集できます。</strong>\n参考として以下に最後の記録を表示します:",
        "semiprotectedpagewarning": "<strong>注意:</strong> このページは保護されているため、登録利用者のみが編集できます。\n参考として以下に最後の記録を表示します:",
-       "cascadeprotectedwarning": "<strong>警告:</strong> このページはカスケード保護されている以下の{{PLURAL:$1|ページ|ページ群}}から読み込まれているため、管理者権限を持つ利用者のみが編集できるように保護されています:",
+       "cascadeprotectedwarning": "<strong>警告:</strong> このページはカスケード保護されている以下の{{PLURAL:$1|ページ|ページ群}}からトランスクルードのため読み込まれているので、管理者権限を持つ利用者のみが編集できるように保護されています:",
        "titleprotectedwarning": "<strong>警告: このページは保護されているため、作成には[[Special:ListGroupRights|特定の権限]]が必要です。</strong>\n参考として以下に最後の記録を表示します:",
        "templatesused": "このページで使用されている{{PLURAL:$1|テンプレート}}:",
        "templatesusedpreview": "このプレビューで使用されている{{PLURAL:$1|テンプレート}}:",
        "right-sendemail": "他の利用者にメールを送信",
        "right-passwordreset": "パスワード再設定メールを閲覧",
        "right-managechangetags": "[[Special:Tags|タグ]]のデータベースにおける作成および削除",
+       "right-applychangetags": "その変化に伴って[[Special:Tags|タグ]]を適用",
        "right-changetags": "個々の版とログエントリの任意の[[Special:Tags|タグ]]の追加と削除",
        "newuserlogpage": "アカウント作成記録",
        "newuserlogpagetext": "以下はアカウント作成の記録です。",
        "action-editcontentmodel": "ページのコンテンツモデルを編集",
        "action-managechangetags": "タグのデータベースにおける作成および削除",
        "action-applychangetags": "自分の編集にタグを適用する",
+       "action-changetags": "個々のリビジョン上およびログエントリ上での任意のタグについての追加と除去",
        "nchanges": "$1 {{PLURAL:$1|回の変更}}",
        "enhancedrc-since-last-visit": "最終閲覧以降 $1 {{PLURAL:$1|件}}",
        "enhancedrc-history": "履歴",
        "uploaddisabledtext": "ファイルのアップロードは、無効になっています。",
        "php-uploaddisabledtext": "ファイルのアップロードがPHPで無効化されています。\nfile_uploadsの設定を確認してください。",
        "uploadscripted": "このファイルは、ウェブブラウザーが誤って解釈してしまうおそれがあるHTMLまたはスクリプトコードを含んでいます。",
+       "upload-scripted-pi-callback": "XMLスタイルシート処理命令を含むファイルをアップロードできません。",
        "uploaded-script-svg": "アップロードされたSVGファイルにスクリプト可能な要素「$1」が見つかりました。",
        "uploaded-hostile-svg": "アップロードされたSVGファイルのスタイル要素に安全ではないCSSが見つかりました。",
+       "uploaded-event-handler-on-svg": "イベントハンドラをセットする属性 <code>$1=\"$2\"</code> は、SVGファイルを許可されていません。",
        "uploadscriptednamespace": "この SVG ファイルは無効な名前空間「$1」を含んでいます。",
        "uploadinvalidxml": "アップロードされたファイルに含まれる XML が構文解析できませんでした。",
        "uploadvirus": "このファイルはウイルスを含んでいます!\n詳細: $1",
        "linksearch-pat": "検索パターン:",
        "linksearch-ns": "名前空間:",
        "linksearch-ok": "検索",
-       "linksearch-text": "「*.wikipedia.org」のようにワイルドカードを使用できます。\n少なくとも「*.org」のようなトップレベルドメインが必要です。<br />\n対応{{PLURAL:$2|プロトコル}}: <code>$1</code> (プロトコルを省略した場合の既定値は http:// )。",
+       "linksearch-text": "「*.wikipedia.org」のようにワイルドカードを使用できます。\n少なくとも「*.org」のようなトップレベルドメインが必要です。<br />\n対応{{PLURAL:$2|プロトコル}}: $1 (プロトコルを省略した場合の既定値は http:// )。",
        "linksearch-line": "$1 が $2 からリンクされています",
        "linksearch-error": "ワイルドカードはホスト名の先頭でのみ使用できます。",
        "listusersfrom": "最初に表示する利用者:",
        "rollback-success": "$1による編集を差し戻しました。\n$2による直前の版へ変更されました。",
        "sessionfailure-title": "セッションの失敗",
        "sessionfailure": "ログインのセッションに問題が発生しました。\nセッション乗っ取りを防ぐため、操作を取り消しました。\n前のページへ戻って再度読み込んだ後に、もう一度試してください。",
+       "changecontentmodel": "ページのコンテント・モデルの変更",
        "changecontentmodel-title-label": "ページ タイトル",
        "changecontentmodel-model-label": "新しい コンテンツ モデル",
        "changecontentmodel-reason-label": "理由:",
+       "changecontentmodel-success-title": "コンテント・モデルは変更されました",
+       "changecontentmodel-success-text": "[[:$1]]のコンテント・タイプは変更されています。",
+       "changecontentmodel-cannot-convert": "[[:$1]]上のコンテントは$2の型には変換できません。",
+       "changecontentmodel-title-cantexist": "$1 でページを持つことは不可能です。",
+       "changecontentmodel-nodirectediting": "$1 コンテント・モデルは、ダイレクト編集をサポートしていません。",
+       "log-name-contentmodel": "コンテント・モデル変更ログ",
+       "log-description-contentmodel": "ページのコンテント・モデルに関連するイベント",
+       "logentry-contentmodel-change": "$1 がページ $3 のコンテント・モデルを \"$4\" から \"$5\" に{{GENDER:$2|変更しました}}",
+       "logentry-contentmodel-change-revertlink": "差し戻し",
+       "logentry-contentmodel-change-revert": "差し戻し",
        "protectlogpage": "保護記録",
        "protectlogtext": "以下はページ保護に対する変更の記録です。\n現在、保護レベルを変更できるページについては[[Special:ProtectedPages|保護ページ一覧]]を参照してください。",
        "protectedarticle": "「[[$1]]」を保護しました",
        "protect-locked-blocked": "ブロックされている間は、保護レベルを変更できません。\nページ <strong>$1</strong> の現在の状態は以下の通りです:",
        "protect-locked-dblock": "データベースのロックが有効なため、保護レベルを変更できません。\nページ <strong>$1</strong> の現在の状態は以下の通りです:",
        "protect-locked-access": "アカウントに、ページの保護レベルを変更する権限がありません。\nページ <strong>$1</strong> の現在の状態は以下の通りです:",
-       "protect-cascadeon": "このページは現在、カスケード保護が有効になっている以下の{{PLURAL:$1|ページ|ページ群}}から読み込まれているため、保護されています。\nこのページの保護レベルの変更は、カスケード保護には影響しません。",
+       "protect-cascadeon": "このページは現在、カスケード保護が有効になっている以下の{{PLURAL:$1|ページ|ページ群}}からトランスクルードのため読み込まれているので、保護されています。\nこのページの保護レベルの変更は、カスケード保護には影響しません。",
        "protect-default": "すべての利用者に許可",
        "protect-fallback": "「$1」権限を持つ利用者のみに許可",
        "protect-level-autoconfirmed": "自動承認された利用者のみに許可",
        "pageinfo-robot-index": "許可",
        "pageinfo-robot-noindex": "不許可",
        "pageinfo-watchers": "ページをウォッチリストに入れている人数",
+       "pageinfo-visiting-watchers": "ページをウォッチリストに入れていて最近の編集を訪問した人数",
        "pageinfo-few-watchers": "ウォッチしている利用者 $1 {{PLURAL:$1|人未満}}",
+       "pageinfo-few-visiting-watchers": "最近の編集を見に来ている人は、いないかもしれません。",
        "pageinfo-redirects-name": "このページへのリダイレクトの数",
        "pageinfo-redirects-value": "$1",
        "pageinfo-subpages-name": "このページの下位ページの数",
        "tags-edit-manage-link": "タグを管理",
        "tags-edit-revision-selected": "[[:$2]] の{{PLURAL:$1|選択された版}}:",
        "tags-edit-logentry-selected": "{{PLURAL:$1|選択された記録項目}}:",
+       "tags-edit-revision-legend": "{{PLURAL:$1|この版|すべての $1 版}}から、タグを追加または除去",
+       "tags-edit-logentry-legend": "{{PLURAL:$1|この記録項目|すべての $1 記録項目}}から、タグを追加または除去",
        "tags-edit-existing-tags": "既存のタグ:",
        "tags-edit-existing-tags-none": "(なし)",
        "tags-edit-new-tags": "新しいタグ:",
        "htmlform-cloner-create": "さらに追加",
        "htmlform-cloner-delete": "除去",
        "htmlform-cloner-required": "少なくとも 1 つの値が必要です。",
+       "htmlform-title-badnamespace": "[[:$1]]は、\"{{ns:$2}}\"名前空間にありません。",
+       "htmlform-title-not-creatable": "\"$1\" は、作成可能なページ名では、ありません。",
+       "htmlform-title-not-exists": "[[:$1]] は存在しません。",
        "sqlite-has-fts": "$1 (全文検索あり)",
        "sqlite-no-fts": "$1 (全文検索なし)",
        "logentry-delete-delete": "$1 がページ「$3」を{{GENDER:$2|削除しました}}",
        "log-name-managetags": "タグ管理記録",
        "log-description-managetags": "このページは[[Special:Tags|タグ]]に関係する管理タスクをリストアップしています。ログには管理者によって手動で実行された操作の記録しか記載されていません。ウィキ・ソフトウェアによって、ログを残さずにタグが作成・削除されている場合があります。",
        "logentry-managetags-create": "$1 がタグ「$4」を{{GENDER:$2|作成しました}}",
+       "logentry-managetags-delete": "$1 がタグ \"$4\" を{{GENDER:$2|削除しました}}  ( $5 {{PLURAL:$5|版 または 記録項目|版 および/または 記録項目}} からの除去)",
+       "logentry-managetags-activate": "$1 がタグ \"$4\" の利用者およびボットによる使用を{{GENDER:$2|有効化しました}}。",
+       "logentry-managetags-deactivate": "$1 がタグ \"$4\" の利用者およびボットによる使用を{{GENDER:$2|無効化しました}}。",
        "log-name-tag": "タグ記録",
        "logentry-tag-update-add-revision": "$1 がページ $3 の版 $4 に{{PLURAL:$7|タグ}} $6 を{{GENDER:$2|追加しました}}",
        "logentry-tag-update-add-logentry": "$1 がページ $3 の記録項目 $5 に{{PLURAL:$7|タグ}} $6 を{{GENDER:$2|追加しました}}",
        "feedback-bugornote": "技術的な問題の詳細を説明する準備ができている場合は、[$1 バグ報告]をお願いします。\n準備ができていない場合は、下の簡易フォームを使用してください。あなたのコメントと利用者名が、ページ「[$3 $2]」に追加されます。",
        "feedback-cancel": "キャンセル",
        "feedback-close": "完了",
+       "feedback-external-bug-report-button": "技術的タスクをファイル",
        "feedback-dialog-title": "フィードバックの送信",
+       "feedback-dialog-intro": "以下のフォームでフィードバックを簡単に提出できます。あなたのコメントは利用者名と共に、ページ \"$1\" に追加されるでしょう。",
        "feedback-error-title": "エラー",
        "feedback-error1": "エラー: 認識できない結果を API が返しました",
        "feedback-error2": "エラー: 編集に失敗しました",
index 082db55..bc12e9a 100644 (file)
        "passwordreset": "Balèni setèl tembung sandhi",
        "passwordreset-text-one": "Lengkapana formulir iki kanggo nampa tembung sandhi sementara lewat layang elektronik.",
        "passwordreset-text-many": "{{PLURAL:$1|Isinen salah sijine kotak ing ngisor iki kanggo nampa tembung sandhi sementara lewat layang elektronik.}}",
-       "passwordreset-legend": "Balèni setèl tembung sandhi",
        "passwordreset-disabled": "Piranti kanggo mbalèni nyetèl tembung sandhi dipatèni nèng wiki iki.",
        "passwordreset-emaildisabled": "Fitur layang elektronik wis dipateni ing wiki iki.",
        "passwordreset-username": "Jeneng panganggo:",
        "resettokens": "Reset token",
        "resettokens-text": "Anda dapat me-reset Token yang memungkinkan akses ke data pribadi tertentu yang terkait dengan akun Anda di sini.\n\nAnda harus melakukannya jika Anda secara tidak sengaja berbagi dengan seseorang atau jika akun Anda telah disusupi.",
        "resettokens-no-tokens": "Ora ana token sing bisa direset.",
-       "resettokens-legend": "Reset token",
        "resettokens-tokens": "Token:",
        "resettokens-token-label": "$1 (nilai saiki: $2)",
        "resettokens-watchlist-token": "Token kangge sindikasi web (Atom/RSS) saking [[Special:Watchlist|pangowahan ing daptar pangawasan sampeyan]]",
        "randomincategory": "Sembarang kaca ing kategori",
        "randomincategory-invalidcategory": "\"$1\" dudu jeneng kategori sing apik.",
        "randomincategory-nopages": "Ora ana kaca ing kategori [[:Category:$1|$1]].",
+       "randomincategory-submit": "Tumuju",
        "randomredirect": "Pangalihan sembarang",
        "randomredirect-nopages": "Ora ana pangalihan ing bilik jeneng \"$1\".",
        "statistics": "Statistik",
        "nmembers": "$1 {{PLURAL:$1|anggota|anggota}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|anggota|anggota}}",
        "nrevisions": "$1 {{PLURAL:$1|revisi|revisi}}",
-       "nviews": "Wis kaping $1 {{PLURAL:$1|dituduhaké|dituduhaké}}",
        "nimagelinks": "Kanggo nèng {{PLURAL:$1|kaca|kaca}}",
        "ntransclusions": "kanggo nèng $1 {{PLURAL:$1|kaca|kaca}}",
        "specialpage-empty": "Ora ana sing perlu dilaporaké.",
        "linksearch-pat": "Pola panggolèkan:",
        "linksearch-ns": "Bilik nama:",
        "linksearch-ok": "Golèk",
-       "linksearch-text": "Tanda bintang seperti \"*.wikipedia.org\" dapat digunakan.\nPerlu sedikitnya satu domain tingkat atas, misalnya \"*.org\".<br />\n{{PLURAL:$2|Protokol|Protokol}} yang didukung: <code>$1</code> (menggunakan http:// bila protokol tidak ditentukan)",
+       "linksearch-text": "Tanda bintang seperti \"*.wikipedia.org\" dapat digunakan.\nPerlu sedikitnya satu domain tingkat atas, misalnya \"*.org\".<br />\n{{PLURAL:$2|Protokol|Protokol}} yang didukung: $1 (menggunakan http:// bila protokol tidak ditentukan)",
        "linksearch-line": "$1 disambung saka $2",
        "linksearch-error": "''Wildcards'' namung bisa dienggo ing bagéyan awal saka jeneng host.",
        "listusersfrom": "Tuduhna panganggo sing diawali karo:",
index b376f83..a8c052b 100644 (file)
        "passwordreset": "პაროლის აღდგენა",
        "passwordreset-text-one": "შეავსეთ ეს ფორმა, რათა კვლავ დააყენოთ თქვენი პაროლი.",
        "passwordreset-text-many": "{{PLURAL:$1|ელ.ფოსტაზე დროებითი პაროლის მისაღებად შეავსეთ ერთ-ერთი ველი.}}",
-       "passwordreset-legend": "პაროლის აღდგენა",
        "passwordreset-disabled": "ამ ვიკიში პაროლის კვლავ დაყენების ფუნქცია გამორთულია.",
        "passwordreset-emaildisabled": "ამ ვიკიში ელ.ფოსტის ფუნქციები გამორთულია.",
        "passwordreset-username": "მომხმარებლის სახელი:",
        "resettokens": "ტოკენების ჩამოყრა",
        "resettokens-text": "თქვენ შეგიძლიათ ჩამოყაროთ ტოკენები, რომლებიც შესაძლებლობას იძლევიან შესვლას განსაზღვრულ პირად მონაცემებში, დაკავშირებულს თქვენ ანგარიშთან აქ. \n\nთქვენ ეს აუცილებლად უნდა გააკეთოთ, თუ თქვენ ის შემთხვევით გააცანით სხვას ან თუკი თქვენი ანგარიში იქნა გატეხილი.",
        "resettokens-no-tokens": "არ არის ტოკენები ჩამოსაყრელად",
-       "resettokens-legend": "ტოკენების ჩამოყრა",
        "resettokens-tokens": "ჟეტონები:",
        "resettokens-token-label": "$1 (მიმდინარე მნიშვნელობა: $2)",
        "resettokens-watchlist-token": "ტოკენი ვებ-არხისთვის (Atom/RSS) [[Special:Watchlist|გვერდების ცვლილებები თქვენი კონტროლის სიაში]]",
        "randomincategory-nopages": "კატეგორიაში [[:კატეგორია:$1|$1]] გვერდები არაა.",
        "randomincategory-category": "კატეგორია:",
        "randomincategory-legend": "შემთხვევითი გვერდი კატეგორიაში",
+       "randomincategory-submit": "მიდი",
        "randomredirect": "ნებისმიერი გადამისამართება",
        "randomredirect-nopages": "სახელთა სივრცეში „$1“ არ არის გადამისამართებები.",
        "statistics": "სტატისტიკა",
        "linksearch-pat": "ძიების თარგი:",
        "linksearch-ns": "სახელთა სივრცე:",
        "linksearch-ok": "ძიება",
-       "linksearch-text": "შესაძლებელია გამოიყენოთ ქვეხაზოვანი სიმბოლოები, მაგალითად, \"*.wikipedia.org\".\nუკიდურეს შემთხვევაში საჭიროა ზედა დონის დომენი, მაგალითად \"*.org\"<br />\nმხარდამჭერი {{PLURAL:$2|პროტოკოლი|პროტოკოლები}}: <code>$1</code> (სტანდარტულად http:// თუკი პროტოკოლი არ არის მითითებული)",
+       "linksearch-text": "შესაძლებელია გამოიყენოთ ქვეხაზოვანი სიმბოლოები, მაგალითად, \"*.wikipedia.org\".\nუკიდურეს შემთხვევაში საჭიროა ზედა დონის დომენი, მაგალითად \"*.org\"<br />\nმხარდამჭერი {{PLURAL:$2|პროტოკოლი|პროტოკოლები}}: $1 (სტანდარტულად http:// თუკი პროტოკოლი არ არის მითითებული)",
        "linksearch-line": "ბმულები $1-ზე  $2-დან",
        "linksearch-error": "წარმოდგენილი სიმბოლოების გამოყენება შესაძლებელია მხოლოდ მისამართის დასაწყისში.",
        "listusersfrom": "აჩვენეთ მომხმარებლები, რომლებიც იწყებიან:",
index bc86057..011a9fb 100644 (file)
        "passwordreset": "Awennez tikkelt nniḍen n awal uɛaddi",
        "passwordreset-text-one": "Ččur tiferkit agi iwakken ad wennezeḍ awal-ik/im n uɛaddi.",
        "passwordreset-text-many": "{{PLURAL:$1|Čcur yiwet n tiɣwezza iwakken ad rmeseḍ awal n uɛaddi uɛḍil deg tirawt.}}",
-       "passwordreset-legend": "Awennez tikkelt nniḍen n awal uɛaddi",
        "passwordreset-disabled": "Awennez n awal uɛaddi yensa deg uwiki agi.",
        "passwordreset-emaildisabled": "Tiseɣnin email nsant ɣef wiki agi.",
        "passwordreset-username": "Isem n useqdac",
        "resettokens": "Wennez tiddas",
        "resettokens-text": "D-agi tzemreḍ ad twennezeḍ tiddas i ɛemmeden ad kecmeḍ ar isefka usligen i qqenen ar amiḍan inek/inem.\n\nIlaq ad twennezeḍ tiddas ma tferqeḍ-ten s tuccḍa s umseqdac nniḍen neɣ ma amiḍan inek/inem yexṣer.",
        "resettokens-no-tokens": "Ulac tiddas an wennez.",
-       "resettokens-legend": "Wennez tiddas",
        "resettokens-tokens": "Tiddas :",
        "resettokens-token-label": "$1 (azal amiran : $2)",
        "resettokens-watchlist-token": "Tiddest i usuddem (Atom/RSS) web n [[Special:Watchlist|ibeddilen n isebtar n umuɣ inek/inem n uḍfar]]",
        "nmembers": "$1 {{PLURAL:$1|amaslad|imasladen}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|amaslad|imasladen}}",
        "nrevisions": "$1 {{PLURAL:$1|tasiwelt|tisiwal}}",
-       "nviews": "$1 {{PLURAL:$1|timeẓriwt|tuẓrin}}",
        "nimagelinks": "Yetseqdec ɣef $1 {{PLURAL:$1|asebter|isebtar}}",
        "ntransclusions": "yetseqdec ɣef $1 {{PLURAL:$1|asebter|isebtar}}",
        "specialpage-empty": "Asebter-agi d ilem.",
        "linksearch-pat": "Anadi n tanfalit :",
        "linksearch-ns": "Talluntin n isemawen :",
        "linksearch-ok": "Nadi",
-       "linksearch-text": "Isekkilen imeẓliyen am « *.wikipedia.org » zemren ad wetseqdecen.\nIlaq-asen deg udday taɣult n uswir imineg, am amedya « *.org ».<br />\n{{PLURAL:$2|Aneggaf yettwaɛqelen|Ineggafen yettwaɛqelen}}: <code>$1</code> (http:// s lexṣas ma ulac aneggaf).",
+       "linksearch-text": "Isekkilen imeẓliyen am « *.wikipedia.org » zemren ad wetseqdecen.\nIlaq-asen deg udday taɣult n uswir imineg, am amedya « *.org ».<br />\n{{PLURAL:$2|Aneggaf yettwaɛqelen|Ineggafen yettwaɛqelen}}: $1 (http:// s lexṣas ma ulac aneggaf).",
        "linksearch-line": "$1 yeqqen seg $2",
        "linksearch-error": "Tzemreḍ ad seqdeceḍ isekkilen usligen ala deg tazzwara n taɣult uselkim.",
        "listusersfrom": "Ssken imseqdacen seg:",
index 5e56faf..25e29e2 100644 (file)
        "passwordreset": "Құпия сөзді қайтару",
        "passwordreset-text-one": "Уақытша құпия сөзіңізді электрон пошта арқылы қабылдау үшін бұл пішінді толтырыңыз.",
        "passwordreset-text-many": "{{PLURAL:$1|Е-пошта арқылы уақытша құпия сөзді қабылдау үшін жолақтардың бірін толтырыңыз.}}",
-       "passwordreset-legend": "Құпия сөзді қайтару",
        "passwordreset-disabled": "Бұл уикиде құпия сөзді қайтару ажыратылған.",
        "passwordreset-emaildisabled": "E-mail мүмкіндігі бұл уикиде өшірілген.",
        "passwordreset-username": "Қатысушы аты:",
        "resettokens": "Байрақшаны ысыру",
        "resettokens-text": "Мұнда сіз құпия дерекке қатысты тіркелгіңізге қатынауға рұқсат ететін байрақшаны ысыра аласыз.\n\nЕгер сіздің тіркелгіңіз бұзылған болса, егер сіз абайсызда қандай да біреумен бөліссеңіз, сіз мұны істеуіңіз керек.",
        "resettokens-no-tokens": "Мұнда ысыруға байрақша жоқ.",
-       "resettokens-legend": "Байрақшаны ысыру",
        "resettokens-tokens": "Байрақша",
        "resettokens-token-label": "$1 (қазіргі мәні : $2)",
        "resettokens-watchlist-token": "(Atom/RSS) [[Special:Watchlist|сіздің бақылау тізіміңіздегі беттердегі өзгерістер]]дегі уеб тізбегі (Atom/RSS) үшін токен",
        "randomincategory-nopages": "Бұлар [[:Category:$1]] беттері мес.",
        "randomincategory-category": "Санат:",
        "randomincategory-legend": "Санаттағы кездейсоқ бет",
+       "randomincategory-submit": "Өту",
        "randomredirect": "Кездейсоқ айдағыш",
        "randomredirect-nopages": "Бұл есім аясында еш айдағыш жоқ \"$1\".",
        "statistics": "Санақ",
        "nmembers": "$1 {{PLURAL:$1|мүше|мүше}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|мүше|мүше}}",
        "nrevisions": "$1 {{PLURAL:$1|түзету|түзету}}",
-       "nviews": "$1 {{PLURAL:$1|қаралу|қаралу}}",
        "nimagelinks": "$1 {{PLURAL:$1|бетте|бетте}} қолданылады",
        "ntransclusions": "$1 {{PLURAL:$1|бетте|бетте}} қолданылады",
        "specialpage-empty": "Бұл сұраныс бойынша нәтиже жоқ.",
        "rollback-success": "$1 өңдемелерінен қайтарды;\n$2 соңғы нұсқасына қайта өзгертті.",
        "sessionfailure-title": "Сеанс сәтсіз болды",
        "sessionfailure": "Кіру сессиясында шатақ болған сияқты;\nсессияға шабуылдаудардан қорғану үшін, осы әрекет тоқтатылды.\n«Артқа» дегенді басыңыз, және бетті қайта жүктеңіз де, қайта байқап көріңіз.",
+       "changecontentmodel-title-label": "Бет атауы",
+       "changecontentmodel-model-label": "Жаңа мағлұмат қалпы",
+       "changecontentmodel-reason-label": "Себебі:",
+       "logentry-contentmodel-change-revertlink": "қайтару",
+       "logentry-contentmodel-change-revert": "қайтару",
        "protectlogpage": "Қорғау журналы",
        "protectlogtext": "Төменде беттердің қорғау/қорғамау тізімі берілген.\nАғымдағы қорғау әректтер бар беттер үшін [[Special:ProtectedPages|қорғалған беттер тізімін]] қараңыз.",
        "protectedarticle": "«[[$1]]» бетін қорғады",
        "tooltip-pt-logout": "Шығу",
        "tooltip-pt-createaccount": "Біз сізге есептік жазба бастауды және кіруді ұсынамыз,ол міндетті емес.",
        "tooltip-ca-talk": "Мағлұмат бетті талқылау",
-       "tooltip-ca-edit": "Бұл бетті өңдей аласыз. Сақтаудың алдында «Қарап шығу» батырмасын нұқыңыз.",
+       "tooltip-ca-edit": "Бұл бетті өңдеу",
        "tooltip-ca-addsection": "Жаңа бөлім бастау",
        "tooltip-ca-viewsource": "Бұл бет қорғалған. Қайнарын қарай аласыз.",
        "tooltip-ca-history": "Бұл беттін соңғы нұсқалары.",
        "pageinfo-robot-index": "рұқсат берілген",
        "pageinfo-robot-noindex": "рұқсат етілмеген",
        "pageinfo-watchers": "Бетті қараушылар саны",
+       "pageinfo-visiting-watchers": "Соңғы өңдемеден кейінгі бетті қараушылар саны",
        "pageinfo-few-watchers": "$1 азырақ {{PLURAL:$1|қараушы|қараушы}}",
        "pageinfo-redirects-name": "Бұл бетке бағытталғандар саны",
        "pageinfo-subpages-name": "Бұл беттің төменгі беттер саны",
        "version-libraries": "Орнатылған кітапхана",
        "version-libraries-library": "Кітапхана",
        "version-libraries-version": "Нұсқасы",
+       "version-libraries-license": "Лицензиясы",
+       "version-libraries-description": "Сипаттамасы",
+       "version-libraries-authors": "Автор(лары)",
        "redirect": "Файл, қатысушы, бет немесе нұсқа ID-і бойынша бағыттаулар",
        "redirect-legend": "Файл немесе бетке айдатулар",
        "redirect-summary": "Бұл арнайы бет файлға (файл атауы берілген), бетке (нұсқа ID-і немесе бет ID-і берілген), не қатысушы бетіне бағыттайды (қатысушы сандық ID-і берілген). Қолданылуы: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], немесе [[{{#Special:Redirect}}/user/101]].",
        "logentry-suppress-event-legacy": "$1 $3 бетіндегі журнал оқиғаларының көрінулігін құпия түрде {{GENDER:$2|өзгертті}}",
        "logentry-suppress-revision-legacy": "$1 $3 бетіндегі нұсқалардың көрінулігін құпия түрде {{GENDER:$2|өзгертті}}",
        "revdelete-content-hid": "мағлұматын жасырыды",
-       "revdelete-summary-hid": "өңдеу түйіндемесі жасырылған",
-       "revdelete-uname-hid": "қатысушы есімі жасырылған",
+       "revdelete-summary-hid": "өңдеу түйіндемесін жасырды",
+       "revdelete-uname-hid": "қатысушы есімін жасырды",
        "revdelete-content-unhid": "мағлұматы жасырылмаған",
        "revdelete-summary-unhid": "өңдеу түйіндемесі жасырылмаған",
        "revdelete-uname-unhid": "қатысушы есімі жасырылмаған",
        "special-characters-group-khmer": "Кхмер",
        "special-characters-title-endash": "дефис",
        "special-characters-title-emdash": "сызықша",
-       "special-characters-title-minus": "минус белгісі"
+       "special-characters-title-minus": "минус белгісі",
+       "mw-widgets-titleinput-description-new-page": "бет жоқ екен",
+       "mw-widgets-titleinput-description-redirect": "$1 дегенге бағыттату"
 }
index 5b18c9b..d8eda8d 100644 (file)
        "randomincategory-nopages": "គ្មានទំព័រណាមួយក្នុងចំណាត់ថ្នាក់ក្រុម [[:Category:$1|$1]] ទេ។",
        "randomincategory-category": "ចំណាត់ថ្នាក់ក្រុម៖",
        "randomincategory-legend": "ទំព័រចៃដន្យក្នុងចំណាត់ថ្នាក់ក្រុម",
+       "randomincategory-submit": "ទៅ",
        "randomredirect": "ទំព័របញ្ជូនបន្តចៃដន្យ",
        "randomredirect-nopages": "គ្មានទំព័របញ្ជូនបន្តណាមួយនៅក្នុងប្រភេទ \"$1\" ទេ។",
        "statistics": "ស្ថិតិ",
        "linksearch-pat": "ស្វែងរកគំរូ៖",
        "linksearch-ns": "លំហឈ្មោះ៖",
        "linksearch-ok": "ស្វែងរក",
-       "linksearch-text": "Wildcards ដូចជា \"*.wikipedia.org\" អាចប្រើបាន។\nតំរូវអោយមានយ៉ាងហោចណាស់អោយមានដូម៉ែនកំរិតលើគេ ឧទាហរណ៍ \"*.org\"។<br />\n{{PLURAL:$2ប្រូតូខូល|ប្រូតូខូល}}ប្រើបាន៖ <code>$1</code>  (តាមលំនាំដើមជា http:// ប្រសិនបើគ្មានបញ្ជាក់ប្រូតូខូល)។",
+       "linksearch-text": "Wildcards ដូចជា \"*.wikipedia.org\" អាចប្រើបាន។\nតំរូវអោយមានយ៉ាងហោចណាស់អោយមានដូម៉ែនកំរិតលើគេ ឧទាហរណ៍ \"*.org\"។<br />\n{{PLURAL:$2ប្រូតូខូល|ប្រូតូខូល}}ប្រើបាន៖ $1  (តាមលំនាំដើមជា http:// ប្រសិនបើគ្មានបញ្ជាក់ប្រូតូខូល)។",
        "linksearch-line": "$1បានតភ្ជាប់ពី$2",
        "listusersfrom": "បង្ហាញអ្នកប្រើប្រាស់ចាប់ផ្តើមពី៖",
        "listusers-submit": "បង្ហាញ",
index df4881f..d4d1ce9 100644 (file)
@@ -23,7 +23,8 @@
                        "VASANTH S.N.",
                        "לערי ריינהארט",
                        "아라",
-                       "Pavanaja"
+                       "Pavanaja",
+                       "Ananth subray"
                ]
        },
        "tog-underline": "ಕೊಂಡಿಗಳ ಕೆಳಗೆ ಗೆರೆ ತೋರಿಸಿ",
        "changeemail-newemail": "ಹೊಸ  ಇ-ಅಂಚೆ ವಿಳಾಸ:",
        "changeemail-none": "(ಯಾವೂ ಇಲ್ಲ)",
        "changeemail-submit": "ಇಮೇಲ್ ಬದಲಾಯಿಸಿ",
+       "resettokens-tokens": "ಸಂಕೇತಗಳು:",
+       "resettokens-token-label": "$1(ಪ್ರಸ್ತುತ ಮೌಲ್ಯ:$2)",
        "bold_sample": "ದಪ್ಪಗಿನ ಅಚ್ಚು",
        "bold_tip": "ದಪ್ಪಗಿನ ಅಚ್ಚು",
        "italic_sample": "ಓರೆ ಅಕ್ಷರಗಳು",
        "hiddencategories": "ಈ ಪುಟವು {{PLURAL:$1|೧ ಗುಪ್ತ ವರ್ಗಕ್ಕೆ|$1 ಗುಪ್ತ ವರ್ಗಗಳಿಗೆ}} ಸೇರಿದೆ:",
        "nocreatetext": "{{SITENAME}} ಅಲ್ಲಿ ಹೊಸ ಪುಟಗಳನ್ನು ಸೃಷ್ಟಿಸಲು ಕೆಲವು ನಿಬಂಧನೆಗಳಿವೆ.\nನೀವು ಹಿಂದಿರುಗಿ ಆಗಲೇ ಅಸ್ಥಿತ್ವದಲ್ಲಿರುವ ಪುಟವೊಂದನ್ನು ಸಂಪಾದಿಸಿ, ಅಥವ [[Special:UserLogin|ಲಾಗ್ ಇನ್ ಆಗಿ ಅಥವ ಹೊಸ ಸದಸ್ಯರಾಗಿ]].",
        "nocreate-loggedin": "ಹೊಸ ಪುಟಗಳನ್ನು ಸೃಷ್ಟಿಸಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ.",
+       "sectioneditnotsupported-title": "ವಿಭಾಗ ಸಂಪಾದನೆಗೆ ಬೆಂಬಲವಿಲ್ಲ",
+       "sectioneditnotsupported-text": "ಈ ಪುಟದಲ್ಲಿ ವಿಭಾಗ ಸಂಪಾದನೆಗೆ ಬೆಂಬಲವಿಲ್ಲ.",
        "permissionserrors": "ಅನುಮತಿ ದೋಷ",
        "permissionserrorstext": "ನಿಮಗೆ ಅದನ್ನು ಮಾಡಲು ಅನುಮತಿ ಇಲ್ಲ, ಅದಕ್ಕೆ {{PLURAL:$1|ಕಾರಣ|ಕಾರಣಗಳು}}:",
        "permissionserrorstext-withaction": "$2 ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ, ಅದಕ್ಕೆ {{PLURAL:$1|ಕಾರಣ|ಕಾರಣಗಳು}}:",
        "recreate-moveddeleted-warn": "'''ಎಚ್ಚರಿಕೆ: ಹಿಂದೆ ಅಳಿಸಲಾದ ಪುಟವನ್ನು ನೀವು ಮತ್ತೆ ಸೃಷ್ಟಿಸುತ್ತಿರುವಿರಿ.'''\n\nಈ ಪುಟವನ್ನು ಸಂಪಾದಿಸಲು ಸಮರ್ಪಕ ಕಾರಣವಿದೆಯೆ ಎಂದು ದಯವಿಟ್ಟು ಆಲೋಚಿಸಿ.\nಪುಟದ ಅಳಿಸುವಿಕೆ ದಿನಚರಿಯನ್ನು ಈ ಕೆಳಗೆ ನೀಡಲಾಗಿದೆ:",
        "moveddeleted-notice": "ಈ ಪುಟವು ಅಳಿಸಲ್ಪಟ್ಟಿದೆ.\nಈ ಪುಟದ ಅಳಿಸುವಿಕೆಯ ದಾಖಲೆಯನ್ನು ಕೆಳಗೆ ತೋರಿಸಲಾಗಿದೆ.",
+       "log-fulllog": "ಪೂರ್ಣ ದಾಖಲೆ ವೀಕ್ಷಿಸಿ",
+       "edit-hook-aborted": "ಕೊಕ್ಕೆ ಸ್ಥಗಿತಗೊಳಿಸಲಾಗಿದೆ ಸಂಪಾದಿಸಿ .\nಇದು ಯಾವುದೇ ವಿವರಣೆ ನೀಡಿದರು .",
        "edit-gone-missing": "ಪುಟವನ್ನು ಪ್ರಸ್ತುತಗೊಳಿಸಲು ಸಾದ್ಯವಿಲ್ಲ, ಪುಟವು ಬಹುಶ: ಅಳಿಸಲ್ಪಟ್ಟಿರಬಹುದು",
        "edit-conflict": "ಸಂಪಾದನಾ ಘರ್ಷಣೆ.",
        "edit-no-change": "ನಿಮ್ಮ ಸಂಪಾದನೆಯನ್ನು ಕಡೆಗಣಿಸಲಾಗಿದೆ ಏಕೆಂದರೆ ಪಠ್ಯದಲ್ಲಿ ಯಾವುದೇ ಬದಲಾವಣೆ ಮಾಡಲಾಗಿಲ್ಲ್ಲ",
+       "postedit-confirmation-created": "ಈ ಪುಟ ಸೃಷ್ಟಿಸಲಾಗಿದೆ.",
+       "postedit-confirmation-restored": "ಪುಟವನ್ನು ಪುನಃಸ್ಥಾಪಿಸಲಾಗಿದೆ.",
        "postedit-confirmation-saved": "ನಿಮ್ಮ ಸಂಪಾದನೆಯನ್ನು ಉಳಿಸಲಾಗಿದೆ.",
        "edit-already-exists": "ಹೊಸ ಪುಟವನ್ನು ಸೃಷ್ಟಿಸಲಾಗಲಿಲ್ಲ.\nಅದು ಆಗಲೆ ಅಸ್ಥಿತ್ವದಲ್ಲಿದೆ.",
+       "content-model-wikitext": "ವಿಕಿ ಪಠ್ಯ",
+       "content-model-text": "ಸರಳ ಪಠ್ಯ",
        "content-model-javascript": "ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್",
        "content-model-css": "ಸಿಎಸ್‍ಎಸ್",
+       "content-json-empty-object": "ಖಾಲಿ ವಿಷಯ",
+       "content-json-empty-array": "ಖಾಲಿ ರಚನೆ",
        "expensive-parserfunction-warning": "ಎಚ್ಚರಿಕೆ: ಈ ಪುಟದಲ್ಲಿ ಬಹುತೇಕ ದುಬಾರಿ parser function ಕರೆಗಳಿವೆ.\n\nಈಗ {{PLURAL:$1|$1 ಕರೆ|$1 ಕರೆಗಳು}} ಇದ್ದು, $2 {{PLURAL:$2|ಕರೆಗಿಂತ|ಕರೆಗಳಿಗಿಂತ}} ಕಡಿಮೆ ಇರಬೇಕು.",
        "expensive-parserfunction-category": "ಬಹುತೇಕ ದುಬಾರಿ parser function ಕರೆಗಳಿರುವ ಪುಟಗಳು",
        "post-expand-template-inclusion-warning": "' ' 'ಎಚ್ಚರಿಕೆ:' ' ' ಪುಟದಲ್ಲಿ ಹಕುವ ಛಿತ್ರ ಥೊದಥು. \nಕೆಲವು ಟೆಂಪ್ಲೇಟುಗಳು ಹಕಲಗುದಿಲ್ಲ.",
        "histlegend": "ವ್ಯತ್ಯಾಸಗಳ ಆಯ್ಕೆ: ಹೋಲಿಕೆ ಮಾಡಬೇಕು ಎಂದಿರುವ ಎರಡು ಆವೃತ್ತಿಗಳ ಪಕ್ಕದಲ್ಲಿ ಇರುವ ಗುಂಡಿಗಳನ್ನು ಗುರುತು ಮಾಡಿ. ನಂತರ enter ಅನ್ನು ಒತ್ತಿ ಅಥವ ಪಟ್ಟಿಯ ಅಂತ್ಯದಲ್ಲಿರುವ ಗುಂಡಿಯನ್ನು ಒತ್ತಿ.<br />\nಆಖ್ಯಾನ: (ಈಗಿನ) = ಪ್ರಸಕ್ತ ಆವೃತ್ತಿಯೊಂದಿಗೆ ವ್ಯತ್ಯಾಸಗಳು,\n(ಕೊನೆಯ) = ಹಿಂದಿನ ಆವೃತ್ತಿಯೊಂದಿಗೆ ವ್ಯತ್ಯಾಸಗಳು, ಚು = ಚುಟುಕಾದ ಬದಲಾವಣೆ.",
        "history-fieldset-title": "ಇತಿಹಾಸವನ್ನು ವಿಹರಿಸಿ",
        "history-show-deleted": "ಅಳಿಸಿದ್ದು ಮಾತ್ರ",
-       "histfirst": "à²\85ತà³\8dಯà²\82ತ à²®à³\81à²\82à²\9aಿನ",
-       "histlast": "à²\85ತà³\8dಯà²\82ತ à²\87ತà³\8dತà³\80à²\9aಿನ",
+       "histfirst": "ಹಳà³\86ಯ",
+       "histlast": "ಹà³\8aಸ",
        "historysize": "({{PLURAL:$1|೧ ಬೈಟ್|$1 ಬೈಟ್‍ಗಳು}})",
        "historyempty": "(ಖಾಲಿ)",
        "history-feed-title": "ಬದಲಾವಣೆಗಳ ಇತಿಹಾಸ",
        "history-feed-description": "ವಿಕಿಯ ಈ ಪುಟದ ಬದಲಾವಣೆಗಳ ಇತಿಹಾಸ",
        "history-feed-item-nocomment": "$1 $2 ಅಲ್ಲಿ",
        "history-feed-empty": "ನೀವು ಕೋರಿರುವ ಪುಟ ಅಸ್ಥಿತ್ವದಲ್ಲಿ ಇಲ್ಲ.\nಅದು ವಿಕಿಯಿಂದ ಅಳಿಸಲ್ಪಟ್ಟಿರಬಹುದು ಅಥವ ಪುನರ್ನಾಮಕಾರಣಗೊಂಡಿರಬಹುದು.\nಸಂಬಂಧಿತ ಹೊಸ ಪುಟಗಳನ್ನು [[Special:Search|ಹುಡುಕಲು ಪ್ರಯತ್ನಿಸಿ]].",
-       "rev-deleted-comment": "(ಕಮೆ೦ಟ್ ತೆಗೆದು ಹಾಕಲಾಗಿದೆ)",
+       "rev-deleted-comment": "ಬದಲಾಯಿಸಿದ ಸಾರಾಂಶ ತೆಗೆದುಹಾಕಲಾಗಿದೆ",
        "rev-deleted-user": "(ಬಳಕೆದಾರ ಹೆಸರು ತಗೆಯಲ್ಪಟ್ಟಿದೆ)",
        "rev-deleted-event": "(ದಾಖಲೆ ಕ್ರಿಯೆ ತೆಗೆಯಲಾಯಿತು)",
        "rev-delundel": "ತೋರಿಸು/ಅಡಗಿಸು",
        "rev-showdeleted": "ತೋರಿಸು",
        "revdelete-show-file-submit": "ಹೌದು",
        "revdelete-legend": "ಕಾಣಿಸುವಿಕೆಯ ನಿಬಂಧನೆಗಳನ್ನು ನಿಶ್ಚಯಿಸು",
-       "revdelete-hide-text": "ಬದಲಾವಣà³\86ಯ à²ªà² à³\8dಯವನà³\8dನà³\81 à²\85ಡà²\97ಿಸà³\81",
+       "revdelete-hide-text": "ಪರಿಷà³\8dà²\95ರಣà³\86 à²ªà² à³\8dಯ",
        "revdelete-hide-image": "ಫೈಲಿನಲ್ಲಿರುವ ಮಾಹಿತಿಯನ್ನು ಅಡಗಿಸು",
        "revdelete-hide-name": "ಕಾರ್ಯ ಮತ್ತು ಗುರಿಗಳನ್ನು ಅಡಗಿಸು",
-       "revdelete-hide-comment": "ಸà²\82ಪಾದನà³\86 à²µà²¿à²µà²°à²£à³\86 à²\85ಡà²\97ಿಸà³\81",
-       "revdelete-hide-user": "ಸà²\82ಪಾದà²\95ರ à²¬à²³à²\95à³\86ಯ à²¹à³\86ಸರà³\81/IP à²\85ಡà²\97ಿಸà³\81",
-       "revdelete-hide-restricted": "à²\88 à²¨à²¿à²¬à²\82ಧನà³\86à²\97ಳನà³\8dನà³\81 à²¨à²¿à²°à³\8dವಾಹà²\95ರಿà²\97à³\82 à²\85ನà³\8dವಯಿಸà³\81 à²®à²¤à³\8dತà³\81 à²\88 interface à²\97à³\86 à²¬à³\80à²\97 à²¹à²¾à²\95ು",
+       "revdelete-hide-comment": "ಸಾರಾà²\82ಶವನà³\81 à²¬à²¦à²²à²¾à²¯à²¿à²¸à²¿",
+       "revdelete-hide-user": "ಸà²\82ಪಾದà²\95ರ à²¬à²³à²\95à³\86ಯ à²¹à³\86ಸರà³\81/IP à²µà²¿à²³à²¾à²¸",
+       "revdelete-hide-restricted": "ನಿರà³\8dವಾಹà²\95ರಿà²\82ದ à²®à²¤à³\8dತಿತರರಿà²\82ದ à²¬à²\82ದ à²®à²¾à²¹à²¿à²¤à²¿à²¯à²¨à³\8dನà³\81 à²\85ಡà²\97ಿಸು",
        "revdelete-radio-same": "(ಬದಲಾಯಿಸಬೇಡಿ)",
        "revdelete-radio-set": "ಅಡಗಿದ",
-       "revdelete-radio-unset": "à²\87ಲà³\8dಲ",
+       "revdelete-radio-unset": "à²\97à³\8bà²\9aರ",
        "revdelete-suppress": "ನಿರ್ವಾಹಕರಿಂದ ಮತ್ತಿತರರಿಂದ ಬಂದ ಮಾಹಿತಿಯನ್ನು ಅಡಗಿಸು",
        "revdelete-unsuppress": "ಪುನಃ ಸ್ಥಾಪಿಸಿದ ಬದಲಾವಣೆಗಳ ಮೇಲಿನ ನಿಬಂಧನೆಗಳನ್ನು ತೆಗೆ",
        "revdelete-log": "ಕಾರಣ:",
-       "revdelete-submit": "ಆಯ್ಕೆ ಮಾಡಿದ ಬದಲಾವಣೆಗೆ ಅನ್ವಯಿಸು",
+       "revdelete-submit": "ಆಯ್ಕೆ ಮಾಡಿದ ಬದಲಾವಣೆಗೆ ಅನ್ವಯಿಸು{{PLURAL:$1|revision|revisions}}",
        "revdel-restore": "ಕಾಣಿಸುವಿಕೆಯನ್ನು ಬದಲಾಯಿಸು",
        "pagehist": "ಪುಟದ ಇತಿಹಾಸ",
        "deletedhist": "ಅಳಿಸಲ್ಪಟ್ಟ ಇತಿಹಾಸ",
        "compareselectedversions": "ಆಯ್ಕೆ ಮಾಡಿದ ಆವೃತ್ತಿಗಳನ್ನು ಹೊಂದಾಣಿಕೆ ಮಾಡಿ ನೋಡಿ",
        "showhideselectedversions": "ಆಯ್ದ ಆವೃತ್ತಿಗಳನ್ನು ತೋರಿಸು/ಅಡಗಿಸು",
        "editundo": "ಹಿಂದಿನಂತೆ",
+       "diff-empty": "( ಯಾವುದೇ ವ್ಯತ್ಯಾಸವಿಲ್ಲ )",
        "searchresults": "ಶೋಧನೆಯ ಫಲಿತಾಂಶಗಳು",
        "searchresults-title": "\"$1\" ಅನ್ನು ಹುಡುಕಿದ ಫಲಿತಾಂಶಗಳು",
        "titlematches": "ಹೊಂದಿಕೆಯಿರುವ ಪುಟ ಶೀರ್ಷಿಕೆಗಳು",
        "notextmatches": "ಯಾವ ಪುಟದ ಪಠ್ಯದಲ್ಲೂ ಹೋಲಿಕೆಗಳಿಲ್ಲ",
        "prevn": "ಹಿಂದಿನ {{PLURAL:$1|$1}}",
        "nextn": "ಮುಂದಿನ {{PLURAL:$1|$1}}",
+       "prev-page": "ಹಿಂದಿನ ಪುಟ",
+       "next-page": "ಮುಂದಿನ ಪುಟ",
        "prevn-title": "ಹಿಂದಿನ $1 {{PLURAL:$1|ಫಲಿತಾಂಶ|ಫಲಿತಾಂಶಗಳು}}",
        "nextn-title": "ಮುಂದಿನ $1 {{PLURAL:$1|ಫಲಿತಾಂಶ|ಫಲಿತಾಂಶಗಳು}}",
        "shown-title": "ಪ್ರತಿ ಪುಟದಲ್ಲಿಯೂ $1 {{PLURAL:$1|result|results}} ತೋರಿಸು",
        "search-section": "(ವಿಭಾಗ $1)",
        "search-suggest": "ನೀವು ಇದನ್ನು ಹುಡುಕುತ್ತಿರುವಿರೆ: $1",
        "search-interwiki-caption": "ಬಳಗದ ಇತರ ಯೋಜನೆಗಳು",
-       "search-interwiki-default": "$1 ಫಲಿತಾಂಶಗಳು:",
+       "search-interwiki-default": "ಫಲಿತಾಂಶಗಳು $1:",
        "search-interwiki-more": "(ಹೆಚ್ಚು)",
        "search-relatedarticle": "ಸಂಬಂಧಿತ",
        "searchrelated": "ಸಂಬಂಧಿತ",
        "prefs-skin": "ಚರ್ಮ",
        "skin-preview": "ಮುನ್ನೋಟ",
        "datedefault": "ಯಾವುದೇ ಪ್ರಾಶಸ್ತ್ಯ ಇಲ್ಲ",
+       "prefs-labs": "ಲ್ಯಾಬ್ಸ್ ವೈಶಿಷ್ಟ್ಯಗಳು",
        "prefs-user-pages": "ಸದಸ್ಯರ ಪುಟಗಳು",
        "prefs-personal": "ಬಳಕೆದಾರರ ಬಗ್ಗೆ",
        "prefs-rc": "ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳು",
        "prefs-watchlist": "ವೀಕ್ಷಣಾಪಟ್ಟಿ",
+       "prefs-editwatchlist": "ವೀಕ್ಷಣಾಪಟ್ಟಿಯನ್ನು ಸಂಪಾದಿಸು",
        "prefs-watchlist-days": "ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ ತೋರಿಸಲಾಗುವ ದಿನಗಳು:",
        "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}",
        "prefs-watchlist-edits": "ವಿಸ್ತೃತ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ ತೋರಿಸಬೇಕಾದ ಗರಿಷ್ಠ ಬದಲಾವಣೆಗಳು:",
        "prefs-changeemail": "ಮಿಂಚಂಚೆ ವಿಳಾಸವನ್ನು ಬದಲಾಯಿಸಿ",
        "prefs-setemail": "ಇ-ಅಂಚೆ ವಿಳಾಸವನ್ನು ಸ್ಥಾಪಿಸಿ",
        "prefs-email": "ಇ-ಅಂಚೆ ಇಚ್ಛೆಗಳು",
+       "prefs-rendering": "ಗೋಚರ",
        "saveprefs": "ಉಳಿಸಿ",
        "prefs-editing": "ಸಂಪಾದನೆ",
        "rows": "ಸಾಲುಗಳು:",
        "savedprefs": "ನಿಮ್ಮ ಇಚ್ಛೆಗಳನ್ನು ಉಳಿಸಲಾಯಿತು.",
        "timezonelegend": "ಸಮಯ ವಲಯ:",
        "localtime": "ಸ್ಥಳೀಯ ಸಮಯ:",
-       "servertime": "ಸರ್ವರ್ ಕಾಲ",
+       "servertime": "ಸರ್ವರ್ ಕಾಲ:",
        "guesstimezone": "ಬ್ರೌಸರ್ ಇಂದ ತುಂಬು",
        "timezoneregion-africa": "ಆಫ್ರಿಕ",
        "timezoneregion-america": "ಅಮೇರಿಕ",
        "prefs-namespaces": "ನಾಮವರ್ಗಗಳು",
        "default": "ಮೂಲಸ್ಥಿತಿ",
        "prefs-files": "ಫೈಲುಗಳು",
+       "prefs-custom-css": "ಕಸ್ಟಮ್ ಸಿಎಸ್ಎಸ್",
+       "prefs-custom-js": "ಕಸ್ಟಮ್ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್",
+       "prefs-emailconfirm-label": "ಮಿಂಚಂಚೆ ದೃಢೀಕರಣ",
        "youremail": "ಇ-ಅಂಚೆ:",
-       "username": "ಸದಸ್ಯತ್ವದ ಹೆಸರು:",
+       "username": "{{ಲಿಂಗ:$1|ಸದಸ್ಯತ್ವದ ಹೆಸರು}}:",
        "prefs-memberingroups": "ಈ {{PLURAL:$1|ಗುಂಪಿನ|ಗುಂಪುಗಳ}} ಸದಸ್ಯ:",
+       "prefs-registration": "ನೋಂದಣಿ ಸಮಯ:",
        "yourrealname": "ನಿಜ ಹೆಸರು:",
        "yourlanguage": "ಭಾಷೆ:",
        "yournick": "ಸಹಿ:",
        "prefs-i18n": "ಅಂತರರಾಷ್ಟ್ರೀಕರಣ",
        "prefs-signature": "ಸಹಿ",
        "prefs-dateformat": "ದಿನಾಂಕ ಶೈಲಿ",
-       "prefs-advancedediting": "ಪರಿಣತ à²\87à²\9aà³\8dà²\9bೆಗಳು",
+       "prefs-advancedediting": "ಸಾಮಾನà³\8dಯ à²\86ಯà³\8dà²\95ೆಗಳು",
        "prefs-editor": "ಸಂಪಾದಕ",
        "prefs-preview": "ಮುನ್ನೋಟ",
        "prefs-advancedrc": "ಪರಿಣತ ಇಚ್ಛೆಗಳು",
        "group-all": "(ಎಲ್ಲವೂ)",
        "group-user-member": "ಬಳಕೆದಾರ",
        "group-autoconfirmed-member": "ಸ್ವಧೃಡೀಕೃತ ಬಳಕೆದಾರ",
-       "group-bot-member": "ಬಾಟ್",
-       "group-sysop-member": "ನಿರ್ವಾಹಕ",
+       "group-bot-member": "{{ಲಿಂಗ:$1|ಬೋಟ್}}",
+       "group-sysop-member": "{{ಲಿಂಗ:$1|ಮಾಜಿ ಆಡಳಿತಗಾರ}}",
        "group-bureaucrat-member": "ಮೇಲ್ವಿಚಾರಕ",
        "group-suppress-member": "ನಿಗ ಇಡುವವ",
        "grouppage-user": "{{ns:project}}:ಬಳಕೆದಾರರು",
        "right-deletedtext": "ಆಳಿಸಿದ ಪಠ್ಯ ಮತ್ತು ಅಳಿಸಿದ ಆವೃತ್ತಿಗಳ ನಡುವಿನ ಬದಲಾವಣೆಗಳನ್ನು ನೋಡಿ",
        "right-browsearchive": "ಅಳಿಸಲಾಗಿರುವ ಪುಟಗಳನ್ನು ಹುಡುಕಿ",
        "right-undelete": "ಆಳಿಸಿದ ಪುಟವನ್ನು ಉಳಿಸಿ",
+       "right-suppressionlog": "ಖಾಸಗಿ ದಾಖಲೆಗಳು ವೀಕ್ಷಿಸಿ",
        "right-block": "ಬೇರೆ ಬಳಕೆದಾರರು ಸಂಪಾದಿಸದಂತೆ ನಿರ್ಬಂಧಿಸು",
        "right-blockemail": "ಬಳಕೆದಾರನು ಇ-ಅಂಚೆ ಕಳುಹಿಸುವುದನ್ನು ತಡೆಗಟ್ಟು",
+       "right-editmyoptions": "ನಿಮ್ಮ ಆದ್ಯತೆಗಳನ್ನು ಸಂಪಾದಿಸಿ",
        "right-import": "ಬೇರೆ ವಿಕಿಗಳಿಂದ ಪುಟಗಳನ್ನು ಆಮದು ಮಾಡು",
        "right-unwatchedpages": "ಪಹರೆಯಿಲ್ಲದ ಪುಟಗಳ ಪಟ್ಟಿಯನ್ನು ವೀಕ್ಷಿಸಿ",
        "right-mergehistory": "ಪುಟಗಳು ಇತಿಹಾಸದಲ್ಲಿ ವಿಲೀನಗೊಳಿಸಿ",
        "action-createpage": "ಪುಟಗಳನ್ನು ಸೃಷ್ಟಿಸು",
        "action-createtalk": "ಚರ್ಚಾ ಪುಟಗಳನ್ನು ಸೃಷ್ಟಿಸು",
        "action-createaccount": "ಈ ಬಳಕೆದಾರ ಖಾತೆಯನ್ನು ರಚಿಸಿ",
+       "action-history": "ಈ ಪುಟದ ಇತಿಹಾಸವನ್ನು ವೀಕ್ಷಿಸಿ",
        "action-minoredit": "ಈ ತಿದ್ದುಪಡಿಯನ್ನು ಚಿಕ್ಕದೆಂದು ಗುರುತಿಸಿ",
        "action-move": "ಈ ಪುಟವನ್ನು ಸ್ಥಳಾಂತರಿಸಿ",
        "action-move-subpages": "ಈ ಪುಟವನ್ನು ಮತ್ತು ಅದರ ಉಪಪುಟಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸಿ",
        "action-deleterevision": "ಈ ಆವೃತ್ತಿಯನ್ನು ಅಳಿಸು",
        "action-browsearchive": "ಅಳಿಸಲಾಗಿರುವ ಪುಟಗಳನ್ನು ಹುಡುಕು",
        "action-undelete": "ಈ ಪುಟವನ್ನು ಅಳಿಸಬೇಡ",
+       "action-suppressionlog": "ಖಾಸಗಿ ದಾಖಲೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ",
        "action-block": "ಈ ಸದಸ್ಯರನ್ನು ಸಂಪಾದಿಸಲು ಆಗದಂತೆ ನಿರ್ಭಂಧಿಸಿ",
        "action-protect": "ಈ ಪುಟದ ಸಂರಕ್ಷಣೆ ಮಟ್ಟಗಳನ್ನು ಬದಲಾಯಿಸಲು",
        "action-import": "ಇನ್ನೊಂದು ವಿಕಿಯಿಂದ ಪುಟಗಳನ್ನು ಆಮದು ಮಾಡು",
        "rc_categories_any": "ಯಾವುದೇ",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ಬದಲಾವಣೆಯ ನಂತರ",
        "newsectionsummary": "/* $1 */ ಹೊಸ ವಿಭಾಗ",
-       "rc-enhanced-expand": "ವಿವರಗಳನ್ನು ತೋರಿಸು (JavaScript ಬೇಕಾಗುತ್ತದೆ)",
+       "rc-enhanced-expand": "ವಿವರಗಳನ್ನು ತೋರಿಸು",
        "rc-enhanced-hide": "ವಿವರಗಳನ್ನು ಅಡಗಿಸು",
        "recentchangeslinked": "ಸಂಬಂಧಪಟ್ಟ ಬದಲಾವಣೆಗಳು",
        "recentchangeslinked-feed": "ಸಂಬಂಧಪಟ್ಟ ಬದಲಾವಣೆಗಳು",
        "sourcefilename": "ಮೂಲ ಫೈಲಿನ ಹೆಸರು:",
        "upload-maxfilesize": "ಗರಿಷ್ಠ ಫೈಲು ಗಾತ್ರ: $1",
        "upload-description": "ಕಡತ ವಿವರಣೆ",
+       "upload-options": "ಅಪ್ಲೋಡ್ ಆಯ್ಕೆಗಳು",
        "watchthisupload": "ಈ ಪುಟವನ್ನು ವೀಕ್ಷಿಸಿ",
        "filewasdeleted": "ಈ ಹೆಸರಿನ ಫೈಲು ಮುಂಚೆ ಅಪ್ಲೋಡ್ ಮಾಡಲಾಗಿ ಅದನ್ನು ಆನಂತರ ಅಳಿಸಲಾಗಿತ್ತು.\nಇದನ್ನು ಮತ್ತೊಮ್ಮೆ ಅಪ್ಲೋಡ್ ಮಾಡುವ ಮುನ್ನ ನೀವು $1 ಅನ್ನು ಪರೀಕ್ಷಿಸಬೇಕು.",
        "upload-success-subj": "ಯಶಸ್ವಿ ಅಪ್ಲೋಡ್",
+       "upload-failure-subj": "ಅಪ್ಲೋಡ್ ಸಮಸ್ಯೆ",
        "upload-warning-subj": "ಅಪ್ಲೋಡ್ ಎಚ್ಚರಿಕೆ",
        "upload-file-error": "ಆಂತರಿಕ ದೋಷ",
        "upload-file-error-text": "ಸರ್ವರ್‍ನಲ್ಲಿ ತಾತ್ಕಾಲಿಕ ಫೈಲನ್ನು ಸೃಷ್ಟಿಸುವಲ್ಲಿ ಒಂದು ಆಂತರಿಕ ದೋಷವಾಯಿತು.\nದಯವಿಟ್ಟು ವ್ಯವಸ್ಥಾಪಕರೊಬ್ಬರನ್ನು ಸಂಪರ್ಕಿಸಿ.",
        "uploadstash-refresh": "ಕಡತಗಳ ಪಟ್ಟಿಯನ್ನು ಪುನಃ ಭಾರಹೇರಿಸಿ",
        "img-auth-accessdenied": "ಅನುಮತಿ ನಿರಾಕರಿಸಲಾಗಿದೆ",
        "img-auth-nofile": "ಕಡತ \"$1\" ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ.",
+       "img-auth-streaming": "ಸ್ಟ್ರೀಮಿಂಗ್ \"$1\".",
        "upload-curl-error6": "URL ಅನ್ನು ತಲುಪಲು ಆಗಲಿಲ್ಲ",
        "upload-curl-error6-text": "ನೀಡಲ್ಪಟ್ಟ URL ಅನ್ನು ತಲುಪಲು ಆಗಲಿಲ್ಲ.\nಈ URL ಸರಿಯಿದೆ ಮತ್ತು ಆ ತಾಣ ಕಾರ್ಯ ಮಾಡುತ್ತಿದೆ ಎಂದು ಮತ್ತೊಮ್ಮೆ ಪರೀಕ್ಷಿಸಿ.",
        "upload-curl-error28": "ಅಪ್ಲೋಡ್ ಕಾಲಾವಧಿ ಮೀರಿದೆ",
        "license": "ಪರವಾನಗಿ:",
        "license-header": "ಪರವಾನಗಿ",
        "nolicense": "ಆಯ್ಕೆ ಇಲ್ಲ",
+       "licenses-edit": "ಪರವಾನಗಿ ಆಯ್ಕೆಗಳನ್ನು ಸಂಪಾದಿಸಿ",
        "license-nopreview": "(ಪೂರ್ವವೀಕ್ಷಣೆ ಲಭ್ಯವಿಲ್ಲ)",
        "upload_source_url": " (ಒಂದು ಮನ್ನಿತ, ಸಾರ್ವಜನಿಕವಾಗಿ ಎಟಕುವ URL)",
        "upload_source_file": " (ನಿಮ್ಮ ಗಣಕಯಂತ್ರದಲ್ಲಿರುವ ಒಂದು ಫೈಲು)",
-       "listfiles-summary": "ಈ ವಿಶೇಷ ಪುಟವು ಎಲ್ಲಾ ಅಪ್ಲೋಡ್ ಆಗಿರುವ ಫೈಲುಗಳನ್ನು ತೋರುತ್ತದೆ.\nವಸ್ತುಸ್ಥಿತಿಯಲ್ಲಿ, ಕೊನೆಯದಾಗಿ ಅಪ್ಲೋಡ್ ಆಗಿರುವ ಫೈಲುಗಳು ಪಟ್ಟಿಯ ಪ್ರಾರಂಭದಲ್ಲಿ ಕಾಣುತ್ತವೆ.\nಪಟ್ಟಿಯ ವಿಭಾಗದ ತಲೆಬರಹವನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿದರೆ ಪಟ್ಟಿಯ ರಚನೆ ಬದಲಾಗುತ್ತದೆ.",
+       "listfiles-delete": "ಅಳಿಸು",
+       "listfiles-summary": "ಈ ವಿಶೇಷ ಪುಟದಲ್ಲಿ ಎಲ್ಲಾ ಅಪ್ಲೋಡ್ ಆಗಿರುವ ಫೈಲುಗಳನ್ನು ತೋರುತ್ತದೆ .",
+       "listfiles_search_for": "ಮಾಧ್ಯಮ ಹೆಸರು ಹುಡುಕಿ",
        "imgfile": "ಫೈಲು",
        "listfiles": "ಚಿತ್ರಗಳ ಪಟ್ಟಿ",
        "listfiles_thumb": "ಕಿರುನೋಟ",
        "filepage-nofile": "ಈ ಹೆಸರಿನ ಫೈಲ್ ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ",
        "filepage-nofile-link": "ಈ ಹೆಸರಿನ ಫೈಲ್ ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ ಆದರೆ ನೀವು ಇದನ್ನು [$1 ನಕಲೆರಿಸಬಹುದು ]",
        "uploadnewversion-linktext": "ಈ ಫೈಲಿನ ಹೊಸ ಆವೃತ್ತಿಯನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಿ",
+       "shared-repo-from": "ರಿಂದ $1",
        "upload-disallowed-here": "ನೀವು ಈ ಕಡತವನ್ನು ಪುನರ್ಲೇಖಿಸಲು ಸಾದ್ಯವಿಲ್ಲ.",
        "filerevert": "$1 ಹಿಂದಿನಂತಾಗಿಸು",
        "filerevert-comment": "ಕಾರಣ:",
        "unusedtemplateswlh": "ಇತರ ಕೊಂಡಿಗಳು",
        "randompage": "ಯಾದೃಚ್ಛಿಕ ಪುಟ",
        "randompage-nopages": "ಈ ಪುಟಪ್ರಬೇಧದಲ್ಲಿ ಯಾವ ಪುಟವೂ ಇಲ್ಲ.",
+       "randomincategory-category": "ವರ್ಗ:",
        "randomincategory-submit": "ಹೋಗು",
        "randomredirect": "ಯದೃಚ್ಛಿಕ ಪುನರ್ನಿರ್ದೇಶಿತ ಪುಟ",
        "randomredirect-nopages": "ಈ ಪುಟಪ್ರಬೇಧದಲ್ಲಿ ಯಾವ ಪುನರ್ನಿರ್ದೇಶನಗಳೂ ಇಲ್ಲ.",
        "statistics-files": "ಅಪ್ಲೋಡ್ ಆಗಿರುವ ಫೈಲುಗಳು",
        "statistics-edits-average": "ಪುಟದ ಸರಾಸರಿ ಮಾರ್ಪಡಿಕೆಗಳು",
        "statistics-users-active": "ಸಕ್ರಿಯ ಬಳಕೆದಾರರು",
+       "pageswithprop-prop": "ಆಸ್ತಿಯ ಹೆಸರು:",
        "pageswithprop-submit": "ಹೋಗು",
        "doubleredirects": "ಮರುಕಳಿಸಿದ ಪುನರ್ನಿರ್ದೇಶನಗಳು",
        "brokenredirects": "ಮುರಿದ ರಿಡೈರೆಕ್ಟ್‌ಗಳು",
        "brokenredirects-delete": "ಅಳಿಸಿ",
        "withoutinterwiki": "ಬೇರೆ ಭಾಷೆಗಳಿಗೆ ಸಂಪರ್ಕ ಹೊಂದಿರದ ಪುಟಗಳು",
        "withoutinterwiki-summary": "ಈ ಕೆಳಗಿನ ಪುಟಗಳು ಅವುಗಳ ಇತರ ಭಾಷೆಯಲ್ಲಿರುವ ಪುಟಗಳಿಗೆ ಕೊಂಡಿಯನ್ನು ಹೊಂದಿಲ್ಲ:",
+       "withoutinterwiki-legend": "ಪೂರ್ವಪ್ರತ್ಯಯಗಳು",
        "withoutinterwiki-submit": "ತೋರಿಸು",
        "fewestrevisions": "ಅತ್ಯಂತ ಕಡಿಮೆ ಬದಲಾವಣೆಗಳನ್ನು ಹೊಂದಿರುವ ಪುಟಗಳು",
        "nbytes": "$1 {{PLURAL:$1|ಬೈಟ್|ಬೈಟ್‍ಗಳು}}",
        "protectedpages-noredirect": "ಪುನರ್ನಿದೇಶನಗಳನ್ನು ಅಡಗಿಸಿ",
        "protectedpagesempty": "ಈ ನಿಯಮಾವಳಿಗಳಲ್ಲಿ ಯಾವ ಪುಟವೂ ಸಂರಕ್ಷಿತವಾಗಿಲ್ಲ.",
        "protectedpages-page": "ಪುಟ",
+       "protectedpages-expiry": "ಮುಕ್ತಾಯ",
+       "protectedpages-performer": "ರಕ್ಷಿಸುವ ಬಳಕೆದಾರ",
+       "protectedpages-params": "ರಕ್ಷಣೆ ನಿಯತಾಂಕಗಳು",
        "protectedpages-reason": "ಕಾರಣ",
        "protectedpages-unknown-timestamp": "ಅಜ್ಞಾತ",
        "protectedpages-unknown-performer": "ಅಜ್ಞಾತ ಬಳಕೆದಾರ",
        "move": "ಸ್ಥಳಾಂತರಿಸಿ",
        "movethispage": "ಈ ಪುಟವನ್ನು ಸ್ಥಳಾಂತರಿಸಿ",
        "unusedcategoriestext": "ಈ ಕೆಳಗಿನ ವರ್ಗ ಪುಟಗಳು ಅಸ್ಥಿತ್ವದಲ್ಲಿ ಇದ್ದರೂ ಬೇರೆ ಯಾವ ಪುಟವಾಗಲಿ ಅಥವ ವರ್ಗವಾಗಲಿ ಅವನ್ನು ಉಪಯೋಗಿಸುತ್ತಿಲ್ಲ.",
+       "notargettitle": "ಯಾವುದೇ ಗುರಿಯಿಲ್ಲ",
        "pager-newer-n": "{{PLURAL:$1|ಹೊಸ ೧|ಹೊಸ $1}}",
        "pager-older-n": "{{PLURAL:$1|ಹಳೆ ೧|ಹಳೆ $1}}",
        "suppress": "ನಿಗಾ ಇಡುವವ",
        "booksources": "ಪುಸ್ತಕದ ಮೂಲಗಳು",
        "booksources-search-legend": "ಪುಸ್ತಕ ಮೂಲಗಳಿಗೆ ಹುಡುಕು",
        "booksources-search": "ಹುಡುಕು",
-       "specialloguserlabel": "ಸದಸà³\8dಯ:",
-       "speciallogtitlelabel": "ಶೀರ್ಷಿಕೆ:",
+       "specialloguserlabel": "ಸಾಧà²\95 :",
+       "speciallogtitlelabel": "ಶೀರ್ಷಿಕೆ (ಶೀರ್ಷಿಕೆ ಅಥವಾ ಬಳಕೆದಾರ ):",
        "log": "ದಾಖಲೆಗಳು",
-       "all-logs-page": "à²\8eಲà³\8dಲಾ à²¦à²¾à²\96ಲà³\86à²\97ಳà³\81",
+       "all-logs-page": "à²\8eಲà³\8dಲಾ à²¸à²¾à²°à³\8dವà²\9cನಿà²\95 à²¦à²¾à²\96ಲà³\86",
        "logempty": "ದಾಖಲೆಗಳಲ್ಲಿ ಇದಕ್ಕೆ ಹೋಲುವ ಯಾವ ವಸ್ತುವೂ ಇಲ್ಲ.",
        "log-title-wildcard": "ಈ ಪದಗಳಿಂದ ಪ್ರಾರಂಭವಾಗುವ ಶೀರ್ಷಿಕೆಗಳನ್ನು ಹುಡುಕು",
        "allpages": "ಎಲ್ಲ ಪುಟಗಳು",
        "allpagesbadtitle": "ನೀವು ಕೋರಿದ ಪುಟದ ಶೀರ್ಷಿಕೆ ಸಿಂಧುವಲ್ಲದ್ದು ಅಥವ ಖಾಲಿ ಅಥವ ಸರಿಯಾದ ಕೊಂಡಿಯಲ್ಲದ ಅಂತರ-ಭಾಷೆ/ಅಂತರ-ವಿಕಿ ಸಂಪರ್ಕವಾಗಿದೆ.\nಅದರಲ್ಲಿ ಒಂದು ಅಥವ ಹೆಚ್ಚು ಶೀರ್ಷಿಕೆಯಲ್ಲಿ ಬಳಸಲು ನಿಷಿದ್ಧವಾಗಿರುವ ಅಕ್ಷರಗಳು ಇರಬಹುದು.",
        "allpages-bad-ns": "{{SITENAME}} ಅಲ್ಲಿ \"$1\" ಪುಟಪ್ರಬೇಧ ಇಲ್ಲ.",
        "allpages-hide-redirects": "ಪುನರ್ನಿದೇಶನಗಳನ್ನು ಅಡಗಿಸಿ",
+       "cachedspecial-refresh-now": "ಇತ್ತೀಚಿನ ವೀಕ್ಷಿಸಿ",
        "categories": "ವರ್ಗಗಳು",
        "categoriespagetext": "ಈ ಕೆಳಗಿನ ವರ್ಗಗಳು ಪುಟಗಳನ್ನು ಅಥವ ಮೀಡಿಯಗಳನ್ನು ಹೊಂದಿವೆ.\n[[Special:UnusedCategories|ಅನುಪಯೋಗಿತ ವರ್ಗಗಳು]] ಇಲ್ಲಿ ತೋರಲಾಗಿಲ್ಲ.\nಇದನ್ನೂ ನೋಡಿ: [[Special:WantedCategories|ಬೇಕಾಗಿರುವ ವರ್ಗಗಳು]].",
        "categoriesfrom": "ಇದರಿಂದ ಪ್ರಾರಂಭವಾಗುವ ವರ್ಗಗಳನ್ನು ತೋರಿಸು:",
        "special-categories-sort-count": "ಎಣಿಕೆಯ ಪ್ರಕಾರ ಜೋಡಿಸು",
        "special-categories-sort-abc": "ಅಕ್ಷರಮಾಲೆಯ ಪ್ರಕಾರ ಜೋಡಿಸು",
+       "deletedcontributions": "ಅಳಿಸಲಾಗಿದೆ ಕಾಣಿಕೆಗಳನ್ನು",
        "sp-deletedcontributions-contribs": "ಕಾಣಿಕೆಗಳು",
        "linksearch": "ಹೊರಗಿನ ಸಂಪರ್ಕಗಳು",
        "linksearch-ns": "ನಾಮವರ್ಗ:",
        "listusersfrom": "ಇದರಿಂದ ಪ್ರಾರಂಭವಾಗುವ ಬಳಕೆದಾರರನ್ನು ತೋರಿಸು:",
        "listusers-submit": "ತೋರು",
        "listusers-noresult": "ಯಾವ ಬಳಕೆದಾರರೂ ಸಿಗಲಿಲ್ಲ.",
+       "listusers-blocked": "(ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ)",
        "activeusers": "ಸಕ್ರಿಯ ಸದಸ್ಯರ ಪಟ್ಟಿ",
        "activeusers-noresult": "ಯಾವ ಬಳಕೆದಾರರೂ ಸಿಗಲಿಲ್ಲ.",
        "listgrouprights": "ಬಳಕೆದಾರ ಗುಂಪು ಹಕ್ಕುಗಳು",
        "listgrouprights-helppage": "Help:ಗುಂಪು ಹಕ್ಕುಗಳು",
        "listgrouprights-members": "(ಸದಸ್ಯರ ಪಟ್ಟಿ)",
        "listgrouprights-addgroup-all": "ಎಲ್ಲಾ ಗುಂಪುಗಳನ್ನು ಸೇರಿಸಿ",
+       "listgrouprights-removegroup-all": "ಎಲ್ಲಾ ಗುಂಪುಗಳನ್ನು ತೆಗೆದುಹಾಕಿ",
        "listgrouprights-namespaceprotection-namespace": "ನಾಮವರ್ಗ",
        "trackingcategories-name": "ಸಂದೇಶದ ಹೆಸರು",
        "trackingcategories-nodesc": "ಯಾವುದೇ ವಿವರಣೆಯಿಲ್ಲ.",
        "deletereason-dropdown": "*ಸಾಮಾನ್ಯ ಅಳಿಸುವಿಕೆಯ ಕಾರಣಗಳು\n** ಸಂಪಾದಕರ ಕೋರಿಕೆ\n** ಕೃತಿಸ್ವಾಮ್ಯತೆಯ ಉಲ್ಲಂಘನೆ\n** Vandalism",
        "delete-edit-reasonlist": "ಅಳಿಸುವಿಕೆ ಕಾರಣಗಳನ್ನು ಸಂಪಾದಿಸು",
        "rollbacklink": "ತೊಡೆದುಹಾಕು",
+       "changecontentmodel": "ಪುಟದ ವಿಷಯ ಮಾದರಿಯನ್ನು ಬದಲಾಯಿಸಿ",
+       "changecontentmodel-legend": "ವಿಷಯ ಮಾದರಿಯನ್ನು ಬದಲಾಯಿಸಿ",
+       "changecontentmodel-title-label": "ಪುಟ ಶೀರ್ಷಿಕೆ",
+       "changecontentmodel-model-label": "ಹೊಸ ವಿಷಯ ಮಾದರಿ",
+       "changecontentmodel-reason-label": "ಕಾರಣ:",
+       "changecontentmodel-success-title": "ವಿಷಯ ಮಾದರಿಯನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ",
+       "logentry-contentmodel-change-revertlink": "ಹಿಂದಿನಂತಾಗಿಸು",
+       "logentry-contentmodel-change-revert": "ಹಿಂದಿನಂತಾಗಿಸು",
        "protectlogpage": "ಸಂರಕ್ಷಣೆ ದಿನಚರಿ",
        "protectedarticle": "\"[[$1]]\" ಸಂರಕ್ಷಿಸಲಾಗಿದೆ.",
        "modifiedarticleprotection": "\"[[$1]]\" ಪುಟದ ಸಂರಕ್ಷಣೆ ಮಟ್ಟವನ್ನು ಬದಲಾಯಿಸಲಾಯಿತು",
        "undelete-search-prefix": "ಇದರಿಂದ ಪ್ರಾರಂಭವಾಗುವ ಪುಟಗಳನ್ನು ತೋರು:",
        "undelete-search-submit": "ಹುಡುಕು",
        "undelete-no-results": "ಅಳಿಸುವಿಕೆ ದಾಖಲೆಯಲ್ಲಿ ಹೋಲುವ ಯಾವ ಪುಟಗಳೂ ದೊರಕಲಿಲ್ಲ.",
+       "undelete-show-file-submit": "ಹೌದು",
        "namespace": "ಹೆಸರಿನ ಬಗೆ:",
        "invert": "ಆಯ್ಕೆಯನ್ನು ತಿರುಗಿಸು",
        "blanknamespace": "(ಮುಖ್ಯ)",
        "contributions-title": "$1 ಸದಸ್ಯರ ಕಾಣಿಕೆಗಳು",
        "mycontris": "ಕಾಣಿಕೆಗಳು",
        "contribsub2": "$1 ($2) ಗೆ",
-       "uctop": " (ಮೇಲಕ್ಕೆ)",
+       "uctop": "(ಪ್ರಸಕ್ತ)",
        "month": "ಈ ತಿಂಗಳಿಂದ (ಮತ್ತು ಮುಂಚಿನ):",
        "year": "ಈ ವರ್ಷದಿಂದ (ಮತ್ತು ಮುಂಚಿನ):",
        "sp-contributions-newbies": "ಹೊಸ ಖಾತೆಗಳ ಕಾಣಿಕೆಗಳನ್ನು ಮಾತ್ರ ತೋರಿಸು",
        "blocklist": "ನಿರ್ಬಂಧಿಸಲಾಗಿರುವ ಸದಸ್ಯರು",
        "ipblocklist": "ನಿರ್ಬಂಧಿಸಲಾಗಿರುವ ಸದಸ್ಯರು",
        "ipblocklist-legend": "ತಡೆಹಿಡಿಯಲಾದ ಬಳಕೆದಾರನನ್ನು ಹುಡುಕು",
+       "blocklist-target": "ಗುರಿ",
+       "blocklist-expiry": "ಮುಕ್ತಾಯ",
        "blocklist-reason": "ಕಾರಣ",
        "ipblocklist-submit": "ಹುಡುಕು",
        "infiniteblock": "ಅನಂತ",
        "block-log-flags-nocreate": "ಖಾತೆ ಸೃಷ್ಟಿ ತಡೆಹಿಡಿಯಲಾಗಿದೆ",
        "block-log-flags-noemail": "ಇ-ಅಂಚೆ ತಡೆಹಿಡಿಯಲಾಗಿದೆ",
        "ipb_already_blocked": "\"$1\" ಆಗಲೆ ತಡೆ ಹಿಡಿಯಲಾಗಿದೆ",
+       "proxyblocker": "ಪ್ರಾಕ್ಸಿ ಬ್ಲಾಕರ್",
        "lockdb": "ಡೇಟಾಬೇಸ್ ಅನ್ನು ಮುಚ್ಚು",
        "unlockdb": "ಡೇಟಾಬೇಸ್ ಅನ್ನು ತೆಗೆ",
        "lockdbtext": "ಡೇಟಾಬೇಸ್ ಅನ್ನು ಮುಚ್ಚುವುದರಿಂದ ಎಲ್ಲಾ ಬಳಕೆದಾರರೂ ಪುಟಗಳ ಸಂಪಾದನೆ, ತಮ್ಮ ಪ್ರಾಶಸ್ತ್ಯಗಳ ಬದಲಾವಣೆ, ವೀಕ್ಷಣಾ ಪಟ್ಟಿಗಳ ಸಂಪಾದನೆ, ಮತ್ತು ಇತರ ಡೇಟಾಬೇಸ್‍ನಲ್ಲಿ ಬದಲಾವಣೆಗಳು ಬೇಕಾಗುವ ಕಾರ್ಯಗಳನ್ನು ಮಾಡಲು ಆಗದಂತಾಗುತ್ತದೆ.\nದಯವಿಟ್ಟು ಇದನ್ನು ನೀವು ಮಾಡಬಯಸುವಿರಿ, ಮತ್ತು ಡೇಟಾಬೇಸ್ ಮೇಲಿನ ನಿಮ್ಮ ಕಾರ್ಯಗಳು ಮುಗಿದ ಮೇಲೆ ಅದನ್ನು ಮತ್ತೆ ತೆಗೆಯುವಿರಿ ಎಂದು ಖಾತ್ರಿ ಮಾಡಿ.",
        "thumbnail_error": "ಮುನ್ನೋಟ ಚಿತ್ರವನ್ನು ಸೃಷ್ಟಿಸುವಲ್ಲಿ ದೋಷ: $1",
        "import": "ಪುಟಗಳನ್ನು ಅಮದು ಮಾಡಿ",
        "import-interwiki-submit": "ಆಮದು",
+       "import-upload-filename": "ಕಡತದ ಹೆಸರು",
        "import-comment": "ಟಿಪ್ಪಣಿ :",
        "importstart": "ಪುಟಗಳು ಆಮದಾಗುತ್ತಿದೆ...",
        "import-revision-count": "$1 {{PLURAL:$1|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಗಳು}}",
        "import-nonewrevisions": "ಎಲ್ಲಾ ಬದಲಾವಣೆಗಳನ್ನೂ ಮುಂಚೆಯೆ ಆಮದು ಮಾಡಲಾಗಿದೆ.",
        "importlogpage": "ಆಮದುಗಳ ದಾಖಲೆ",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಗಳು}}",
+       "javascripttest-pagetext-unknownaction": "ಅಪರಿಚಿತ ಕ್ರಮ \"$1\"",
        "tooltip-pt-userpage": "ನಿಮ್ಮ ಸದಸ್ಯ ಪುಟ",
        "tooltip-pt-anonuserpage": "ನೀವು ಸಂಪಾದನೆ ಮಾಡುತ್ತಿರುವ ipಯ ಬಳಕೆದಾರ ಪುಟ",
        "tooltip-pt-mytalk": "ನಿಮ್ಮ ಚರ್ಚೆ ಪುಟ",
        "tooltip-pt-logout": "ಲಾಗ್ ಔಟ್",
        "tooltip-pt-createaccount": "ನೀವು ಹೊಸ ಖಾತೆಯನ್ನು ತೆರೆದು ಲಾಗಿನ್ ಆಗುವುದನ್ನು ಹುರಿದುಂಬಿಸುತ್ತೇವೆ; ಆದಾಗ್ಯೂ, ಇದು ಅವಶ್ಯವೇನಲ್ಲ",
        "tooltip-ca-talk": "ಮಾಹಿತಿ ಪುಟದ ಬಗ್ಗೆ ಚರ್ಚೆ",
-       "tooltip-ca-edit": "à²\88 à²ªà³\81à²\9fವನà³\8dನà³\81 à²¨à³\80ವà³\81 à²¸à²\82ಪಾದಿಸಬಹà³\81ದà³\81. à²\89ಳಿಸà³\81ವ à²®à³\81ನà³\8dನ à²®à³\81ನà³\8dನà³\8bà²\9fವನà³\8dನà³\81 à²\89ಪಯà³\8bà²\97ಿಸಿ.",
+       "tooltip-ca-edit": "à²\88 à²ªà³\81à²\9fವನà³\8dನà³\81 à²¬à²¦à²²à²¾à²¯à²¿à²¸à²¿",
        "tooltip-ca-addsection": "ಹೊಸ ವಿಭಾಗವನ್ನು ಪ್ರಾರಂಭಿಸಿ",
        "tooltip-ca-viewsource": "ಈ ಪುಟ ಸಂರಕ್ಷಿತವಾಗಿದೆ. ಅದರ ಮೂಲವನ್ನು ನೀವು ವೀಕ್ಷಿಸಬಹುದು.",
        "tooltip-ca-history": "ಈ ಪುಟದ ಹಳೆಯ ಆವೃತ್ತಿಗಳು.",
        "tooltip-ca-protect": "ಈ ಪುಟವನ್ನು ಸಂರಕ್ಷಿಸು",
+       "tooltip-ca-unprotect": "ಈ ಪುಟದ ರಕ್ಷಣೆಯನ್ನು ಬದಲಾಯಿಸಲು",
        "tooltip-ca-delete": "ಈ ಪುಟವನ್ನು ಅಳಿಸು",
        "tooltip-ca-move": "ಈ ಪುಟವನ್ನು ಸ್ಥಳಾಂತರಿಸು",
        "tooltip-ca-watch": "ಈ ಪುಟವನ್ನು ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರಿಸಿ",
        "tooltip-t-permalink": "ಪುಟದ ಈ ಆವೃತ್ತಿಗೆ ಶಾಶ್ವತ ಕೊಂಡಿ",
        "tooltip-ca-nstab-main": "ಮಾಹಿತಿ ಪುಟವನ್ನು ನೋಡಿ",
        "tooltip-ca-nstab-user": "ಸದಸ್ಯರ ಪುಟವನ್ನು ವೀಕ್ಷಿಸು",
+       "tooltip-ca-nstab-media": "ಮಾಧ್ಯಮ ಪುಟವನ್ನು ವೀಕ್ಷಿಸು",
        "tooltip-ca-nstab-special": "ಇದೊಂದು ವಿಶೇಷ ಪುಟ, ಇದನ್ನು ಯಾರೂ ಸಂಪಾದಿಸಲು ಬರುವುದಿಲ್ಲ",
        "tooltip-ca-nstab-project": "ಯೋಜನೆಯ ಪುಟವನ್ನು ನೋಡಿ",
        "tooltip-ca-nstab-image": "ಕಡತದ ಪುಟ ವೀಕ್ಷಿಸಿ",
        "tooltip-diff": "ನೀವು ಮಾಡಿದ ಬದಲಾವಣೆಗಳನ್ನು ತೋರುತ್ತದೆ.",
        "tooltip-compareselectedversions": "ಆರಿಸಿದ ಎರಡು ಆವೃತ್ತಿಗಳ ಮಧ್ಯದ ವ್ಯತ್ಯಾಸಗಳನ್ನು ನೋಡು.",
        "tooltip-watch": "ಈ ಪುಟವನ್ನು ನಿಮ್ಮ ವೀಕ್ಷಣಾ ಪಟ್ಟಿಗೆ ಸೇರಿಸು",
+       "tooltip-watchlistedit-normal-submit": "ಶೀರ್ಷಿಕೆಗಳನ್ನು ತೆಗೆ",
+       "tooltip-watchlistedit-raw-submit": "ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರಿಸಿ",
        "tooltip-upload": "ಅಪ್ಲೋಡ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸು",
        "tooltip-rollback": "ಕೊನೆ ಸಂಪಾದಕರ ಎಲ್ಲಾ ಸಂಪಾದನೆಗಳನ್ನು ಅಳಿಸುಹಾಕುತ್ತದೆ",
        "tooltip-undo": "\"ವಜಾ ಮಾಡಿ\" ಈ ಸಂಪಾದನೆಯನ್ನು ನಿಷ್ಕ್ರಿಯ ಗೊಳಿಸಿ ಸಂಪಾದನಾ ಪುಟವನ್ನು ಮುನ್ನೋಟದೊಂದಿಗೆ ತೆರೆಯುತ್ತದೆ.\nಇಲ್ಲಿ ಸಾರಾಂಶದಲ್ಲಿ ಕಾರಣವನ್ನು ಸೇರಿಸುವ ಅನುಮತಿ ಇದೆ.",
+       "tooltip-preferences-save": "ಆಯ್ಕೆಗಳು ಉಳಿಸಿ",
        "tooltip-summary": "ಚಿಕ್ಕ ಸಾರಾಂಶ ಒಂದನ್ನು ಸೇರಿಸಿ",
        "anonymous": "{{SITENAME}} ತಾಣದ ಅನಾಮಧೇಯ {{PLURAL:$1|ಬಳಕೆದಾರ|ಬಳಕೆದಾರರು}}",
        "siteuser": "{{SITENAME}} ಬಳಕೆದಾರ $1",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|ಸದಸ್ಯ|ಸದಸ್ಯರು}} $1",
        "creditspage": "ಪುಟದ ಗೌರವಗಳು",
        "simpleantispam-label": "ಆಂಟಿ-ಸ್ಪ್ಯಾಮ್ ಪರೀಕ್ಷೆ.\nಇದನ್ನು ತುಂಬ <strong>ಬೇಡಿ</strong>!",
+       "pageinfo-title": "ಮಹಿತಿ \"$1\"",
+       "pageinfo-header-basic": "ಮೂಲಭೂತ ಮಾಹಿತಿ",
+       "pageinfo-header-edits": "ಇತಿಹಾಸ ಸಂಪಾದಿಸಿ",
+       "pageinfo-header-restrictions": "ಪುಟ ರಕ್ಷಣೆ",
+       "pageinfo-display-title": "ತಲೆಬರಹ ಪ್ರದರ್ಶಿಸು",
+       "pageinfo-article-id": "ಪುಟದ ID",
+       "pageinfo-robot-index": "ಅನುಮತಿಸು",
+       "pageinfo-robot-noindex": "ಅನುಮತಿಸಲಾಗಿಲ್ಲ",
+       "pageinfo-firstuser": "ಪುಟ ಸೃಷ್ಟಿಕರ್ತ",
+       "pageinfo-firsttime": "ಪುಟ ಸೃಷ್ಟಿಯ ದಿನಾಂಕ",
+       "pageinfo-lastuser": "ಇತ್ತೀಚಿನ ಸಂಪಾದಕ",
+       "pageinfo-lasttime": "ಇತ್ತೀಚಿಗೆ ಬದಲಾಯಿಸಿ ದಿನಾಂಕ",
+       "pageinfo-edits": "ಒಟ್ಟು ಸಂಪಾದನೆಗಳ ಸಂಖ್ಯೆ",
        "pageinfo-toolboxlink": "ಪುಟದ ಮಾಹಿತಿ",
        "pageinfo-redirectsto": "ಪುನರ್ನಿರ್ದೇಶನ:",
+       "pageinfo-redirectsto-info": "ಮಾಹಿತಿಯನ್ನು",
+       "pageinfo-contentpage-yes": "ಹೌದು",
+       "pageinfo-protect-cascading-yes": "ಹೌದು",
+       "pageinfo-category-pages": "ಪುಟಗಳ ಸಂಖ್ಯೆ",
+       "pageinfo-category-subcats": "ಉಪವರ್ಗಗಳು ಸಂಖ್ಯೆ",
+       "pageinfo-category-files": "ಕಡತಗಳ ಸಂಖ್ಯೆ",
        "deletedrevision": "ಹಳೆ ಆವೃತ್ತಿ $1 ಅನ್ನು ಅಳಿಸಲಾಗಿದೆ",
        "filedeleteerror-short": "ಈ ಫೈಲನ್ನು ಅಳಿಸುವುದರಲ್ಲಿ ದೋಷ: $1",
        "filedeleteerror-long": "ಫೈಲನ್ನು ಅಳಿಸುವಾಗ ಉಂಟಾದ ದೋಷಗಳು:\n\n$1",
        "svg-long-desc": "SVG ಫೈಲು, ಸುಮಾರಾಗಿ $1 × $2 ಚಿತ್ರಬಿಂದುಗಳು, ಫೈಲಿನ ಗಾತ್ರ: $3",
        "show-big-image": "ಮೂಲ ಕಡತ",
        "show-big-image-size": "$1 × $2 ಪಿಕ್ಸೆಲ್‌ಗಳು",
+       "file-info-gif-looped": "ಲೂಪ್",
+       "file-info-png-looped": "ಲೂಪ್",
        "newimages": "ಹೊಸ ಫೈಲುಗಳ ಪ್ರದರ್ಶನ",
        "imagelisttext": "ಕೆಳಗೆ ಇರುವುದು '''$1''' {{PLURAL:$1|ಫೈಲಿನ|ಫೈಲುಗಳ}} ಪಟ್ಟಿ, $2 ಏರ್ಪಾಟಾಗಿದೆ.",
        "newimages-summary": "ಈ ವಿಶೇಷ ಪುಟವು ಕೊನೆಯದಾಗಿ ಅಪ್ಲೋಡ್ ಆಗಿರುವ ಫೈಲುಗಳನ್ನು ತೋರುತ್ತದೆ",
        "ilsubmit": "ಹುಡುಕು",
        "bydate": "ದಿನಾಂಕಕ್ಕನುಗುಣವಾಗಿ",
        "sp-newimages-showfrom": "$2, $1 ಇಂದ ಪ್ರಾರಂಭಿಸಿ ಹೊಸ ಫೈಲುಗಳನ್ನು ತೋರು",
+       "just-now": "ಇದೀಗ",
+       "monday-at": "ಸೋಮವಾರ $1",
+       "tuesday-at": "ಮಂಗಳವಾರ $1",
+       "wednesday-at": "ಬುಧವಾರ $1",
+       "thursday-at": "ಗುರುವಾರ $1",
+       "friday-at": "ಶುಕ್ರವಾರ $1",
+       "saturday-at": "ಶನಿವಾರ $1",
+       "sunday-at": "ರವಿವಾರ $1",
+       "yesterday-at": "ನಿನ್ನೆ $1",
        "bad_image_list": "ವ್ಯವಸ್ಥೆಯ ಆಕಾರ ಈ ರೀತಿ:\n\nಪಟ್ಟಿಯಲ್ಲಿರುವ ದಾಖಲೆಗಳನ್ನು (* ಇಂದ ಪ್ರಾರಂಭವಾಗುವ ಸಾಲುಗಳು) ಮಾತ್ರ ಪರಿಗಣಿಸಲಾಗುತ್ತದೆ.\nಪ್ರತಿ ಸಾಲಿನ ಮೊದಲ ಕೊಂಡಿಯು ಒಂದು ದೋಷಯುಕ್ತ ಫೈಲಿಗೆ ಕೊಂಡಿಯಾಗಿರಬೇಕು.\nಅದೇ ಸಾಲಿನ ಮುಂದಿನ ಎಲ್ಲಾ ಕೊಂಡಿಗಳನ್ನು ಪರಿಗಣನೆಯಿಂದ ವಿನಾಯತಿ ಮಾಡಲಾಗುತ್ತದೆ, ಅಂದರೆ ಎಲ್ಲಿ ಪುಟಗಳ ಒಳಗೆ ಫೈಲು ಇರುತ್ತದೆಯೊ ಅಲ್ಲಿ.",
        "metadata": "ಮೇಲ್ದರ್ಜೆ ಮಾಹಿತಿ",
        "metadata-help": "ಈ ಫೈಲಿನಲ್ಲಿ ಹೆಚ್ಚಿನ ಮಾಹಿತಿ ಇದೆ. ಪ್ರಾಯಶಃ ಫೈಲನ್ನು ಸೃಷ್ಟಿಸಲು ಉಪಯೋಗಿಸಲಾದ ಡಿಜಿಟಲ್ ಕ್ಯಾಮೆರದಿಂದ ಅಥವ ಸ್ಕ್ಯಾನರ್ ಇಂದ ಈ ಮಾಹಿತಿ ಸೇರಿಸಲ್ಪಟ್ಟಿದೆ.\nಮೂಲಪ್ರತಿಯಿಂದ ಈ ಫೈಲು ಮಾರ್ಪಾಟಾಗಿದ್ದಲ್ಲಿ, ಈ ಮಾಹಿತಿ ಮಾರ್ಪಟ್ಟ ಫೈಲಿನ ವಿವರಗಳಿಗೆ ಸರಿಯಾಗಿ ಹೊಂದದೆ ಇರಬಹುದು.",
        "exif-artist": "ಕರ್ತೃ",
        "exif-copyright": "ಕೃತಿಸ್ವಾಮ್ಯತೆಯನ್ನು ಹೊಂದಿರುವವರು",
        "exif-exifversion": "Exif ಆವೃತ್ತಿ",
-       "exif-pixelydimension": "ಸಿà²\82ಧà³\81ವಾದ ಚಿತ್ರದ ಅಗಲ",
-       "exif-pixelxdimension": "ಸಿà²\82ಧà³\81ವಾದ ಚಿತ್ರದ ಎತ್ತರ",
+       "exif-pixelydimension": "ಭಾವಚಿತ್ರದ ಅಗಲ",
+       "exif-pixelxdimension": "ಭಾವಚಿತ್ರದ ಎತ್ತರ",
        "exif-usercomment": "ಬಳಕೆದಾರನ ಟಿಪ್ಪಣಿ",
        "exif-relatedsoundfile": "ಸಂಬಂಧಿತ ಧ್ವನಿ ಫೈಲು",
        "exif-datetimeoriginal": "ಮಾಹಿತಿ ಸೃಷ್ಟಿಯಾದ ದಿನಾಂಕ ಮತ್ತು ಕಾಲ",
        "exif-gpsspeedref": "ವೇಗದ ಘಟಕ",
        "exif-gpsareainformation": "GPS ಪ್ರದೇಶದ ಹೆಸರು",
        "exif-gpsdatestamp": "GPS ದಿನಾಂಕ",
+       "exif-keywords": "ಪ್ರಮುಖ ಪದಗಳು",
+       "exif-source": "ಆಕರ",
+       "exif-languagecode": "ಭಾಷೆ",
        "exif-iimcategory": "ವರ್ಗ",
        "exif-label": "ಗುರುತು ಪಟ್ಟಿ",
        "exif-copyrighted": "ಕೃತಿಸ್ವಾಮ್ಯತೆಯ ಸ್ಥಿತಿ",
        "exif-componentsconfiguration-0": "ಅಸ್ಥಿತ್ವದಲ್ಲಿ ಇಲ್ಲ",
        "exif-meteringmode-0": "ತಿಳಿದಿಲ್ಲ",
        "exif-meteringmode-1": "ಸರಾಸರಿ",
+       "exif-meteringmode-5": "ವಿನ್ಯಾಸ",
        "exif-meteringmode-255": "ಇತರ",
        "exif-lightsource-0": "ತಿಳಿದಿಲ್ಲ",
        "exif-lightsource-1": "ದಿನದ ಬೆಳಕು",
        "htmlform-selectorother-other": "ಇತರ",
        "htmlform-no": "ಇಲ್ಲ",
        "htmlform-yes": "ಹೌದು",
+       "htmlform-title-not-exists": "[[:$1]] ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ.",
        "logentry-delete-delete": "$1 {{GENDER:$2|ಅಳಿಸಲಾಯಿತು}} ಪುಟ $3",
        "revdelete-restricted": "ನಿರ್ವಾಹಕರಿಗೆ ನಿಬಂಧನೆಗಳನ್ನು ಅನ್ವಯಿಸಲಾಯಿತು",
        "revdelete-unrestricted": "ನಿರ್ವಾಹಕರ ನಿಬಂಧನೆಗಳನ್ನು ತೆಗೆಯಲಾಯಿತು",
index 8d8ac37..a4db1fb 100644 (file)
        "broken-file-category": "깨진 파일 링크가 포함된 문서",
        "about": "소개",
        "article": "본문",
-       "newwindow": "(ì\83\88 ì°½ì\9c¼ë¡\9c ì\97´ë¦¼)",
+       "newwindow": "(ì\83\88 ì°½ì\97\90ì\84\9c ì\97´ë¦¼)",
        "cancel": "취소",
        "moredotdotdot": "더 보기...",
        "morenotlisted": "이 목록은 완성되지 않았습니다.",
        "right-edit": "문서 편집",
        "right-createpage": "문서 만들기 (토론 문서 제외)",
        "right-createtalk": "토론 문서 만들기",
-       "right-createaccount": "새 계정 만들기",
+       "right-createaccount": "새 사용자 계정 만들기",
        "right-minoredit": "사소한 편집으로 표시",
        "right-move": "문서 옮기기",
        "right-move-subpages": "문서와 하위 문서 옮기기",
        "linksearch-pat": "검색 패턴:",
        "linksearch-ns": "이름공간:",
        "linksearch-ok": "검색",
-       "linksearch-text": "\"*.wikipedia.org\"와 같이 와일드 카드를 사용할 수 있습니다.\n적어도 \"*.org\"와 같이 최상위 도메인을 입력해야 합니다.<br />\n지원하는 {{PLURAL:$2|프로토콜}}: <code>$1</code> (프로토콜을 지정하지 않을 때 기본값은 http://)",
+       "linksearch-text": "\"*.wikipedia.org\"와 같이 와일드 카드를 사용할 수 있습니다.\n적어도 \"*.org\"와 같이 최상위 도메인을 입력해야 합니다.<br />\n지원하는 {{PLURAL:$2|프로토콜}}: $1 (프로토콜을 지정하지 않을 때 기본값은 http://)",
        "linksearch-line": "$2에서 $1 을 링크하고 있습니다.",
        "linksearch-error": "와일드카드는 주소의 처음 부분에만 사용될 수 있습니다.",
        "listusersfrom": "다음으로 시작하는 사용자 보기:",
        "pageinfo-robot-index": "허용됨",
        "pageinfo-robot-noindex": "불허됨",
        "pageinfo-watchers": "문서를 주시하는 사용자 수",
-       "pageinfo-few-watchers": "{{PLURAL:$1|주시하는 사용자}} $1명 ë¯¸ë§\8c",
+       "pageinfo-few-watchers": "{{PLURAL:$1|주시하는 사용자}} $1명ë³´ë\8b¤ ì \81ì\9d\8c",
        "pageinfo-redirects-name": "이 문서의 넘겨주기 수",
        "pageinfo-redirects-value": "$1개",
        "pageinfo-subpages-name": "이 문서의 하위 문서 수",
        "tags-delete-not-found": "\"$1\" 태그가 존재하지 않습니다.",
        "tags-activate-reason": "이유:",
        "tags-activate-not-found": "\"$1\" 태그가 존재하지 않습니다.",
+       "tags-activate-submit": "활성화",
        "tags-deactivate-reason": "이유:",
        "tags-deactivate-submit": "비활성화",
        "tags-update-remove-not-allowed-one": "\"$1\" 태그를 제거하는 것은 허용되지 않습니다.",
        "special-characters-group-khmer": "크메르어",
        "special-characters-title-endash": "en 대시",
        "special-characters-title-emdash": "em 대시",
-       "special-characters-title-minus": "빼기 기호"
+       "special-characters-title-minus": "빼기 기호",
+       "mw-widgets-titleinput-description-new-page": "문서가 존재하지 않습니다",
+       "mw-widgets-titleinput-description-redirect": "$1 문서로 넘겨주기"
 }
index 453d189..955b4bc 100644 (file)
        "linksearch-pat": "Излеуге шаблон:",
        "linksearch-ns": "Ат алам:",
        "linksearch-ok": "Таб",
-       "linksearch-text": "\"*.wikipedia.org\" кибик символлла хайырландырыргъа боллукъдула.\nЭм азы бла огъары дараджаны домени керекди, юлгюге: \"*.org\".<br />\nДагъан болгъан протоколла: <code>$1</code> (протокол белгиленмеген эсе, тынгылау бла http:// боллукъду)",
+       "linksearch-text": "\"*.wikipedia.org\" кибик символлла хайырландырыргъа боллукъдула.\nЭм азы бла огъары дараджаны домени керекди, юлгюге: \"*.org\".<br />\nДагъан болгъан протоколла: $1 (протокол белгиленмеген эсе, тынгылау бла http:// боллукъду)",
        "linksearch-line": "$1-ге  $2-ден джибериу берилгенди",
        "linksearch-error": "Джокерле къуру адреслени аллында хайырланыргъа боллукъдула.",
        "listusersfrom": "Бу бла башланнган къошулуучуланы кёргюз:",
index db00820..515895a 100644 (file)
        "welcomeuser": "Wellkumme $1!",
        "welcomecreation-msg": "Dinge Zohjang es enjerescht.\nWann De wells, künnts De Ding [[Special:Preferences|Enschtällonge aanpaße]].",
        "yourname": "Metmaacher_Naame:",
-       "userlogin-yourname": "Der Metmaacher_Name",
-       "userlogin-yourname-ph": "Donn Dinge Metmaachername aanjevve",
+       "userlogin-yourname": "Der Metmaacher_Nahme",
+       "userlogin-yourname-ph": "Donn Dinge Metmaachernahme aanjävve",
        "createacct-another-username-ph": "Jivv ene Metmaacher_Nahme aan",
        "yourpassword": "Paßwoot:",
        "userlogin-yourpassword": "Et Paßwoot",
        "user-mail-no-addy": "Do häs versöhg en <i lang=\"en\">e-mail</i> der ohne en Adräß ze verschecke",
        "user-mail-no-body": "En dä <i lang=\"en\">e-mail</i> schteiht nix udder zoh winnisch dren.",
        "changepassword": "Passwood *",
-       "resetpass_announce": "Do moß jäz e neu Paßwoot för op Duur aanjevve.",
+       "resetpass_announce": "Do moß jäz e neu Paßwoot för op Duur aanjävve.",
        "resetpass_text": "<!-- Donn der Täx hee dobei -->",
        "resetpass_header": "Neu Passwood faßlääje",
        "oldpassword": "Et ahle Passwood:",
        "resetpass-submit-cancel": "Nix donn!",
        "resetpass-wrong-oldpass": "Dat Zweschepaßwood udder dat aktoälle Paßwood stemmp nit.\nMöjjelesch, Do häs Ding Paßwood ald jetuusch, künnt och sin,\nDo häs Der enzwesche e neu Zweschepaßwood jehollt.",
        "resetpass-recycled": "Donn för Ding neu Paßwoot jät anders aanjävve, wi Ding Paßwoot vun jäz.",
-       "resetpass-temp-emailed": "Do beß jez enjelogg med ennem Zweschepasswoot, wat De övver e-mail krääje häs. Dat kanns De nit einfar_esu behallde. Alsu donn jetz e neu Passwoot för op Duur aanjevve.",
+       "resetpass-temp-emailed": "Do beß jez enjelogg med ennem Zweschepasswoot, wat De övver e-mail krääje häs. Dat kanns De nit einfar_esu behallde. Alsu donn jetz e neu Passwoot för op Duur aanjävve.",
        "resetpass-temp-password": "Zweschepasswood:",
        "resetpass-abort-generic": "E Zohsazprojramm häd_et nit zohjelohße, et Paßwoot ze ändere.",
        "resetpass-expired": "Di Paßwood es afjeloufe. Donn jetz e neu Passwoot för et Enlogg faßlääje.",
        "readonlywarning": "'''Opjepass:'''\nDe Daatebank es jesperrt woode, wo Do ald am Ändere wohs.\nDä.\nJetz kanns De Ding Änderunge nit mieh faßhallde lohße.\nDun se bei Dir om Rechner faßhalde un versöhg et schpäder noch ens.\n\nNävvebei, dä Datenbank-Köbes hät för et Sperre och ene Jrund aanjejovve: $1",
        "protectedpagewarning": "<strong>Opjepass: Di Sigg heh es jähje Veränderonge jeschöz. Blohß de Wikki-Köbeße künne se änndere.</strong>\nHeh kütt der neuste Enndraach em Logbohch för di Sigg:",
        "semiprotectedpagewarning": "<strong>Opjepass:</strong> Di Sigg heh es halv jeschpächt, wi mer sage, dat heiß, Do muss aanjemeldt un enjelogg sin, wann De dran ändere wells.\nHeh kütt der neuste Enndrach em Logbohch doh drövver:",
-       "cascadeprotectedwarning": "<strong>Opjepaß:</strong> Di Sigg es jeschöz, un nur de Wikki_Köhbeße künne se änndere. Se es en en Schotz-Kaskahd enjebonge, zosamme met dä {{PLURAL:$1|Sigg|Sigge}}:",
+       "cascadeprotectedwarning": "<strong>Opjepaß:</strong> Di Sigg es jeschöz, un nur de Wikki_Köhbeße künne se änndere. Dat es, weil se angeschwoh ennjeföhsch weed. Se es en en Schotz-Kaskahd enjebonge, zosamme met dä {{PLURAL:$1|Sigg|Sigge}}:",
        "titleprotectedwarning": "<span style=\"text-transform:uppercase\"> Opjepaß! </span> Di Sigg heh is jesperrt woode. Bloß [[Special:ListGroupRights|bestemmpte]] Metmaacher dörve di Sigg neu aanläje.'''\nHeh kütt der neuste Enndrach em Logbooch doh drövver:",
        "templatesused": "{{PLURAL:$1|De Schablohn|De $1 Schablohne|Kein Schablohn}}, di en dä Sigg heh jebruch {{PLURAL:$1|weed|wähde|weed}}, sinn:",
        "templatesusedpreview": "{{PLURAL:$1|De Schablohn|Schablohne|-nix-}} en dä Vör_Aanseesch heh:",
        "prefs-help-realname": "Dinge rechteje Nahme kanns De fott lohße.\nWann De en ävver nenne wells, dann kann dä jebruch weede, öm Ding Beidrähch domet ze schmöcke.",
        "prefs-help-email": "Ding <i lang=\"en\">e-mail</i> Adress - kanns De fottlooße, un se es för Andre nit ze sinn - mäht et ävver müjjelich, Der e neu Passwoot ze schecke, wann De et ens verjäße häß.",
        "prefs-help-email-others": "Do kannß och zohlohße, dat mer Der domet övver Ding Metmaacherklaafsigg en <i lang=\"en\">e-mail</i> schecke kann. Esu künne ander Metmaacher met Der en Kontak kumme, ohne dat se Dinge Name oder Ding <i lang=\"en\">e-Mail</i> Adress kenne mööte.",
-       "prefs-help-email-required": "Do moß en <i lang=\"en>e-mail</i>-Addräß aanjevve.",
+       "prefs-help-email-required": "Do moß en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß aanjävve.",
        "prefs-info": "Jrundlare",
        "prefs-i18n": "Schprohche-Enschtällonge",
        "prefs-signature": "Ongerschreff",
        "filedelete-maintenance": "Datteie Fottschmiiße un widder zerök Holle jeiht jez jrad nit, mer hann Waadong.",
        "filedelete-maintenance-title": "Di Dattei künne mer nit fottschmiiße",
        "mimesearch": "Dateije övver dänne ehre <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Multi-Purpose Internet Mail Extensions\">MIME</i>-Zoot söhke",
-       "mimesearch-summary": "Op hee dä {{int:nstab-special}} könne de Dateie noh de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Multi-Purpose Internet Mail Extensions\">MIME</i>-Zoot ußjesöhk wähde.\nMer moß der Medijetüp un der Ongertüp aanjevve mem scheive Schtresch derzwesche, zem Bejschpell: <code xml:lang=\"en\" lang=\"en\">image/jpeg</code> udder <code xml:lang=\"en\" lang=\"en\">text/*</code> udder esu.",
+       "mimesearch-summary": "Op hee dä {{int:nstab-special}} könne de Dateie noh de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Multi-Purpose Internet Mail Extensions\">MIME</i>-Zoot ußjesöhk wähde.\nMer moß de Zoot Medije un de Ongerzppd aanjävve mem scheive Schtresch derzwesche, zem Bejschpell: <code xml:lang=\"en\" lang=\"en\">image/jpeg</code> udder <code xml:lang=\"en\" lang=\"en\">text/*</code> udder esu.",
        "mimetype": "<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Multi-Purpose Internet Mail Extensions\">MIME</i>-Zoot:",
        "download": "eronger laade",
        "unwatchedpages": "Sigge, wo keiner drop oppass",
        "linksearch-pat": "Sök noh:",
        "linksearch-ns": "Appachtemang:",
        "linksearch-ok": "Söhke",
-       "linksearch-text": "Beim Söke künnd_Er Schtäänsche aanjevve för e Schtöcksche fun ennem Nahme, wo mer nit jenou weiß, wi et heiß udder wat me nit kenne deit, zem Beischpöll esu: <code>http://*.example.com</code> un ene bövverschte Name för en Domain moß aanjejovve sin, zem Beishpöll esu: <code>http://*.org</code> \n\n{{PLURAL:$2|Dat Brauserprotokoll, wat|De Brauserprotokolle, di|Kein Brauserprotokolle, di}} mer beim Söhke aanjävve kann, sin: <code>$1</code>, un der Schtandatt es <code>http://</code> wann nix aanjejovve es.",
+       "linksearch-text": "Beim Söke künnd_Er Schtähnsche aanjävve för e Schtöcksche fun ennem Nahme, wo mer nit jenou weiß, wi et heiß udder wat me nit kenne deit, zem Beischpöll esu: <code>http://*.example.com</code> un ene bövverschte Name för en Domain moß aanjejovve sin, zem Beishpöll esu: <code>http://*.org</code> \n\n{{PLURAL:$2|Dat Brauserprotokoll, wat|De Brauserprotokolle, di|Kein Brauserprotokolle, di}} mer beim Söhke aanjävve kann, sin: $1, un der Schtandatt es <code>http://</code> wann nix aanjejovve es.",
        "linksearch-line": "„$2“ hät ene Link op $1",
        "linksearch-error": "Shternshe kam_mer nor aam Aanfang fum Domain-Name bruche.",
        "listusersfrom": "Zeich de Metmaacher vun:",
        "sessionfailure": "Et jov wall e täschnesch Problehm met Dingem Login. Dröm ham_mer dat us Vörseesch jäz nix jemaht, domet mer nit velleich Ding Änderong däm verkihrte Metmaacher ongerjubele. Jangk zeröck un versöhk et noch ens.",
        "changecontentmodel-title-label": "Dä Sigg ier Övverschreff",
        "changecontentmodel-reason-label": "Der Jrond:",
+       "changecontentmodel-title-cantexist": "Mer kann kein  Sigge en $1 aanlähje.",
        "logentry-contentmodel-change-revertlink": "retuhr_nämme",
        "logentry-contentmodel-change-revert": "retuhr_nämme",
        "protectlogpage": "Logbohch vum Sigge Schötze",
        "pageinfo-robot-index": "zohjelohße",
        "pageinfo-robot-noindex": "verbodde",
        "pageinfo-watchers": "De Aanzahl Oppaßßer för di Sigg",
+       "pageinfo-visiting-watchers": "De Aanzahl Metmaacher, di op heh di Sigg oppaße un och de {{lcfirst:{{int:recentchanges}}}} belohrt han",
        "pageinfo-few-watchers": "Et jidd_er winnijer wi {{PLURAL:$1|eine|$1|keine}} Oppaßer.",
+       "pageinfo-few-visiting-watchers": "Et künnd ene Metmaacher javve, dä op heh di Sigg oppaß un och de {{lcfirst:{{int:recentchanges}}}} belohrt — udder och nit.",
        "pageinfo-redirects-name": "Ömleidonge op heh di Sigg",
        "pageinfo-subpages-name": "Ongersigge vun heh dä Sigg",
        "pageinfo-subpages-value": "$1 (dovun {{PLURAL:$2|ein Ömleidong|$2 Ömleidonge|kein Ömleidong}} un {{PLURAL:$3|ein nomahle Sigg|$3 nomahle Sigge|kein nomahle Sigg}})",
        "htmlform-cloner-create": "Mih derbei donn",
        "htmlform-cloner-delete": "Fottnämme",
        "htmlform-cloner-required": "Winnischsdens eine Wääd es nühdesch.",
+       "htmlform-title-badnamespace": "[[:$1]] es nit em Appachetmang „{{ns:$2}}“.",
+       "htmlform-title-not-creatable": "„$1“ en kein Övverschreff, för di me en Sigg aanlähje künnt",
+       "htmlform-title-not-exists": "[[:$1]] jidd_et nit.",
        "sqlite-has-fts": "Version $1 (un kann en janze Täxte söhke)",
        "sqlite-no-fts": "Version $1 (kann ävver nit en janze Täxte söhke)",
        "logentry-delete-delete": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Sigg „$3“ fottjeschmeße.",
index 3683d61..d63b44b 100644 (file)
        "note": "<strong>Nîşe:</strong>",
        "previewnote": "'''Ji bîr neke ku ev tenê pêşdîtinek e.'''\nGuhertinên te hê nehatine tomarkirin!",
        "continue-editing": "Here qada sazandinê",
-       "editing": "$1 te guherandin",
+       "editing": "$1 tê guherandin",
        "creating": "$1 tê çêkirin",
        "editingsection": "Tê guherandin: $1 (beş)",
        "editingcomment": "$1 (beşek nû) tê guherandin.",
index 0a78ffd..23461ec 100644 (file)
@@ -14,7 +14,8 @@
                        "Викиней",
                        "아라",
                        "Askar Nazyrov",
-                       "Macofe"
+                       "Macofe",
+                       "Janatkg"
                ]
        },
        "tog-underline": "Шилтемелердин алдын сызуу:",
@@ -71,8 +72,8 @@
        "saturday": "Ишемби",
        "sun": "Жк",
        "mon": "Дш",
-       "tue": "Ше",
-       "wed": "Ша",
+       "tue": "Шей",
+       "wed": "Шар",
        "thu": "Бш",
        "fri": "Жм",
        "sat": "Иш",
        "category-subcat-count-limited": "Бул категорияда {{PLURAL:$1|$1|$1|$1}} ички категория бар.",
        "category-article-count": "{{PLURAL:$2|Бул категория төмөнкү баракты камтыйт.|Бул категорияда жалпы $2, төмөнкү {{PLURAL:$1|барак|$1 барак}} бар.}}",
        "category-article-count-limited": "Бул категорияда {{PLURAL:$1|$1 барак}} бар.",
-       "category-file-count": "{{PLURAL:$2|Бул категория төмөнкү файлды камтыйт.|Бул категорияда жалпы $2, төмөнкү {{PLURAL:$1|файл|$1 файл}} бар.}}",
+       "category-file-count": "{{PLURAL:$2|Ð\91Ñ\83л ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\82өмөнкү Ñ\84айлдÑ\8b Ð³Ð°Ð½Ð° ÐºÐ°Ð¼Ñ\82Ñ\8bйÑ\82.|Ð\91Ñ\83л ÐºÐ°Ñ\82егоÑ\80иÑ\8fда Ð¶Ð°Ð»Ð¿Ñ\8b $2, Ñ\82өмөнкү {{PLURAL:$1|Ñ\84айл|$1 Ñ\84айл}} Ð±Ð°Ñ\80.}}",
        "category-file-count-limited": "Бул категорияда {{PLURAL:$1|$1|$1|$1}} файл бар.",
        "listingcontinuesabbrev": "уланд.",
        "index-category": "Индекстелген барактар",
        "search": "Издөө",
        "searchbutton": "Издөө",
        "go": "Өтүү",
-       "searcharticle": "Ð\90лга",
+       "searcharticle": "Ð\91аÑ\88Ñ\82а",
        "history": "Барактын тарыхы",
        "history_short": "Тарыхы",
        "updatedmarker": "менин акыркы жолу кирүүмдөн кийин жаңыртылган",
        "personaltools": "Жеке аспаптар",
        "articlepage": "Макаланы кароо",
        "talk": "Талкуу",
-       "views": "Көрсөтүүлөр",
+       "views": "Кароолор",
        "toolbox": "Аспаптар",
        "userpage": "Катышуучунун барагын кароо",
        "projectpage": "Долбоор барагын кароо",
        "viewhelppage": "Жардам алуу",
        "categorypage": "Категория барагын кароо",
        "viewtalkpage": "Талкууну кароо",
-       "otherlanguages": "Ð\91ашка тилдерде",
+       "otherlanguages": "башка тилдерде",
        "redirectedfrom": "($1 барагынан багытталды)",
        "redirectpagesub": "Багыттама барак",
        "lastmodifiedat": "Бул барак соңку жолу $1, $2 өзгөртүлгөн.",
        "disclaimers": "Жоопкерчиликтен баш тартуу",
        "disclaimerpage": "Project:Жоопкерчиликтен баш тартуу",
        "edithelp": "Оңдоп-түзөөгө жардам",
-       "mainpage": "Баш барак",
-       "mainpage-description": "Баш барак",
+       "helppage-top-gethelp": "Жардам",
+       "mainpage": "Башбарак",
+       "mainpage-description": "Башбарак",
        "policy-url": "Project:Эрежелер",
        "portal": "Жамаат порталы",
        "portal-url": "Project:Жамаат порталы",
        "hidetoc": "жашыруу",
        "collapsible-collapse": "Түрүү",
        "collapsible-expand": "жаюу",
+       "confirmable-yes": "Ооба",
+       "confirmable-no": "Жок",
        "thisisdeleted": "$1 көрүү же калыбына келтирүү?",
        "viewdeleted": "Көрүү $1?",
        "restorelink": "{{PLURAL:$1|$1 өчүрүлгөн оңдоо}}",
        "site-rss-feed": "$1 RSS тилкеси",
        "site-atom-feed": "$1 Atom агымы",
        "page-rss-feed": "«$1» — RSS-лента",
-       "page-atom-feed": "«$1» — Atom-лента",
+       "page-atom-feed": "«$1» — Atom-тасмасы",
        "red-link-title": "$1 (мындай барак жок)",
        "sort-descending": "Кемүү боюнча иргөө",
        "sort-ascending": "Өсүү боюнча иргөө",
        "yourname": "Колдонуучу аты:",
        "userlogin-yourname": "Колдонуучунун аты",
        "userlogin-yourname-ph": "Колдонуучу атыңызды териңиз",
+       "createacct-another-username-ph": "Колдонуучу атыңызды териңиз",
        "yourpassword": "Сырсөз:",
        "userlogin-yourpassword": "Сырсөз",
        "userlogin-yourpassword-ph": "Сырсөзүңүздү териңиз",
        "createacct-yourpassword-ph": "Сырсөздү териңиз",
        "yourpasswordagain": "Сырсөздү кайра терүү:",
        "createacct-yourpasswordagain": "Сырсөздү тастыктаңыз",
-       "createacct-yourpasswordagain-ph": "Сырсөздү кайра киргизиңиз",
+       "createacct-yourpasswordagain-ph": "Сырсөздү кайрадан териңиз",
        "remembermypassword": "Бул браузерде колдонуучу атымды ($1 {{PLURAL:$1|күнгө}} чейин сактоо)",
        "userlogin-remembermypassword": "Мени системге кирген боюнча калтыр",
        "userlogin-signwithsecure": "Коопсуз байланышты колдонуу",
        "gotaccount": "Катталгансызбы? '''$1'''.",
        "gotaccountlink": "Кирүү",
        "userlogin-resetlink": "Кирүүчү маалыматарыңызды эсиңизден чыгардыңызбы?",
-       "userlogin-resetpassword-link": "Сырсөздү алмаштыруу",
+       "userlogin-resetpassword-link": "Сырсөздү унуттуңузбу?",
        "userlogin-loggedin": "Сиз эчак эле {{GENDER:$1|$1}} деп киргенсиз.\nБашка колдонуучунун атынан кириш үчүн асытдагы форманы колдонуңуз.",
        "createacct-emailrequired": "Эмейл дарек",
-       "createacct-emailoptional": "Эмейл дарек (милдеттүү эмес)",
-       "createacct-email-ph": "Эмейл дарегиңизди киргизиңиз",
+       "createacct-emailoptional": "Email дарек (милдеттүү эмес)",
+       "createacct-email-ph": "Email дарегиңизди жазыңыз",
+       "createacct-another-email-ph": "E-mail дарек териңиз",
        "createaccountmail": "Убактылуу түзүлгөн сырсөздү колдон жана аны көрсөтүлгөн эмейл дарекке жөнөт",
        "createacct-realname": "Чыныгы ысымы (милдеттүү эмес)",
        "createaccountreason": "Себеби:",
        "createacct-captcha": "Коопсуздук текшерүүсү",
        "createacct-imgcaptcha-ph": "Жогорудагы текстти териңиз",
        "createacct-submit": "Катталыңыз",
-       "createacct-benefit-heading": "{{SITENAME}} Ñ\81из Ñ\81Ñ\8bÑ\8fкÑ\82Ñ\83Ñ\83 ÐºÐ¸Ñ\88илер тарабынан түзүлгөн.",
+       "createacct-benefit-heading": "{{SITENAME}} Ñ\81из Ñ\81Ñ\8bÑ\8fкÑ\82Ñ\83Ñ\83 Ð°Ð´Ð°Ð¼Ð´Ð°р тарабынан түзүлгөн.",
        "createacct-benefit-body1": "{{PLURAL:$1|оңдоо|оңдоолор}}",
        "createacct-benefit-body2": "{{PLURAL:$1|барак|барактар}}",
-       "createacct-benefit-body3": "акыркы {{PLURAL:$1|салым|салымдар}}",
+       "createacct-benefit-body3": "соңку {{PLURAL:$1|салым|салымдар}}",
        "badretype": "Сиз терген сырсөздөр дал келишпейт",
        "userexists": "Сиз тандаган колдонуучу ат бош эмес.\nСураныч, башка атты тандаңыз.",
        "loginerror": "Кирүү катасы",
        "loginlanguagelabel": "Тили: $1",
        "suspicious-userlogout": "Сиздин чыгуу талабыңыз сиздин браузериңиздин туура эмес аткарылышынан же прокси кеширлөөсүнөн улам аткарылган жок.",
        "pt-login": "Кирүү",
+       "pt-login-button": "Кирүү",
+       "pt-createaccount": "Катталуу",
        "pt-userlogout": "Чыгуу",
        "php-mail-error-unknown": "PHP'нин mail() функциясындагы белгисиз ката.",
        "changepassword": "Сырсөздү өзгөртүү",
        "resetpass-submit-cancel": "Жокко чыгаруу",
        "resetpass-temp-password": "Убактылуу сырсөз:",
        "resetpass-expired": "Сиздин сырсөзүңүз эскирген. Сураныч жаңы сырсөзүңүз менен кириңиз.",
-       "passwordreset": "Сырсөздү түшүрүү",
+       "passwordreset": "Сырсөздү жоюу",
        "passwordreset-text-one": "Сырсөздү алмаштыруу үчүн бул үлгүнү толтуруңуз.",
-       "passwordreset-legend": "Сырсөздү түшүрүү",
        "passwordreset-disabled": "Бул уикиде сырсөздү түшүрүү мүмкүнчүлүгү өчүрүлгөн.",
        "passwordreset-username": "Колдонуучу аты:",
        "passwordreset-domain": "Домен:",
        "nowiki_sample": "Форматталбаган текстти бул жерге киргизиңиз",
        "nowiki_tip": "Уики-форматтоого көңүл бурбоо",
        "image_tip": "Кыстарылган файл",
-       "media_tip": "Файлга шилтеме",
+       "media_tip": "Файл шилтемеси",
        "sig_tip": "Кол тамгаңыз жана убакыт мөөрү",
        "hr_tip": "Туура сызык (жыш колдонбоңуз)",
        "summary": "Жыйынтыгы:",
        "accmailtitle": "Сырсөз жөнөтүлдү.",
        "accmailtext": " [[User talk:$1|$1]] үчүн сырсөз $2 ге жөнөтүлдү.",
        "newarticle": "(Жаңы)",
-       "newarticletext": "Сиз ачыла элек баракка шилтемени бастыңыз.\nБул баракты түзүү үчүн, ылдый жактагы терезеге жаза баштаңыз (кошумча маалымат алуу үчүн [$1 жардам барагын] караңыз).\nЭгерде Сиз бул жерге жаңылыштык менен кирип калган болсоңуз, анда браузериңиздеги '''артка''' баскычын басыңыз.",
+       "newarticletext": "Сиз али түзүлө элек баракка шилтемени бастыңыз.\nБул баракты түзүү үчүн, ылдый жактагы терезеге жаза баштаңыз (кошумча маалымат алуу үчүн [$1 жардам барагын] караңыз).\nЭгерде Сиз бул жерге жаңылыштык менен кирип калган болсоңуз, анда браузериңиздеги '''артка''' баскычын басыңыз.",
        "noarticletext": "Азыр бул баракта текст жок.\nСиз [[Special:Search/{{PAGENAME}}|ушул аталыш менен баракты изде]] башка барактарда \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тийиштүү жазууларды таба аласыз],\nже '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} ошондой аталыш менен барак ача аласыз]'''</span>.",
-       "noarticletext-nopermission": "Ð\90зÑ\8bÑ\80 Ð±Ñ\83л Ð±Ð°Ñ\80акÑ\82а Ñ\82екÑ\81Ñ\82 Ð¶Ð¾Ðº.\nСиз [[Special:Search/{{PAGENAME}}|бÑ\83л Ð°Ñ\82 Ð¶Ó©Ð½Ò¯Ð½Ð´Ó© Ñ\8dÑ\81кеÑ\80Ñ\82үүлөÑ\80дү]] Ð±Ð°Ñ\88ка Ð±Ð°Ñ\80акÑ\82аÑ\80дан Ñ\82аба Ð°Ð»Ð°Ñ\81Ñ\8bз, Ð¶Ðµ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ñ\82ийиÑ\88Ñ\82Ò¯Ò¯ Ð¶Ñ\83Ñ\80налдаÑ\80дÑ\8bн Ð¶Ð°Ð·Ñ\83Ñ\83лаÑ\80Ñ\8bн Ñ\82аба Ð°Ð»Ð°Ñ\81Ñ\8bз]</span>. Ð\91Ñ\83л Ð±Ð°Ñ\80акÑ\82Ñ\8b Ð¶Ð°Ñ\80аÑ\82Ñ\83Ñ\83га Ñ\83кÑ\83кÑ\82аÑ\80Ñ\8bÒ£Ñ\8bз жок.",
+       "noarticletext-nopermission": "Ð\90зÑ\8bÑ\80 Ð±Ñ\83л Ð±Ð°Ñ\80акÑ\82а Ñ\82екÑ\81Ñ\82 Ð¶Ð¾Ðº.\nСиз [[Special:Search/{{PAGENAME}}|бÑ\83л Ð°Ñ\82 Ð¶Ó©Ð½Ò¯Ð½Ð´Ó© Ñ\8dÑ\81кеÑ\80Ñ\82үүлөÑ\80дү]] Ð±Ð°Ñ\88ка Ð±Ð°Ñ\80акÑ\82аÑ\80дан Ñ\82аба Ð°Ð»Ð°Ñ\81Ñ\8bз, Ð¶Ðµ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ñ\82ийиÑ\88Ñ\82Ò¯Ò¯ Ð¶Ñ\83Ñ\80налдаÑ\80дÑ\8bн Ð¶Ð°Ð·Ñ\83Ñ\83лаÑ\80Ñ\8bн Ñ\82аба Ð°Ð»Ð°Ñ\81Ñ\8bз]</span>. Ð\91Ñ\83л Ð±Ð°Ñ\80акÑ\82Ñ\8b Ð¶Ð°Ñ\80аÑ\82Ñ\83Ñ\83га Ñ\83кÑ\83гÑ\83Ò£Ñ\83з жок.",
        "userpage-userdoesnotexist": "\"$1\" Мындай колдонуучу катталган эмес. Сураныч, ушул баракты түзүүнү же оңдогонду каалганыңыз анык болсун",
        "updated": "(Жаңыртылды)",
        "note": "'''Эскертме:'''",
        "moveddeleted-notice": "Бул барак өчүрүлгөн.\nМаалымат үчүн төмөндө өчүрүүлөрдүн жана өзгөртүүлөрдүн тизмеси берилген.",
        "log-fulllog": "Журналды бүтүн бойдон көрүү",
        "edit-conflict": "Оңдоолор конфликти",
+       "postedit-confirmation-created": "Барак түзүлдү.",
        "postedit-confirmation-saved": "Оңдооңуз сакталды",
        "edit-already-exists": "Жаңы барак түзүү мүмкүн эмес. Мындай барак бар",
        "defaultmessagetext": "Жарыяланбасча текст",
        "post-expand-template-argument-category": "Калыптардын аттатылган жүйөлөрүн камтыган барактар",
        "parser-template-loop-warning": "Калыптарда илмек бар:[[$1]]",
        "cantcreateaccounttitle": "Эсеп жазуусун түзүү мүмкүн эмес",
-       "viewpagelogs": "Бул барактын журналдарын көрсөтүү",
+       "viewpagelogs": "Бул барактын журналдарын көрүү",
        "nohistory": "Бул барактын өзгөртүүлөр тарыхы жок",
        "currentrev": "Соңку версиясы",
        "currentrev-asof": "$1 -га соңку версиясы",
        "revisionasof": "$1 -деги абалы",
-       "revision-info": "$1 карата $2 тарабынан жасалган версия",
+       "revision-info": "$1 карата  {{GENDER:$6|$2}}$7 тарабынан жасалган версия",
        "previousrevision": "← Мурунку версиясы",
        "nextrevision": "Жаңыраак версиясы →",
        "currentrevisionlink": "Соңку версиясы",
        "revdelete-hide-comment": "Оңдоо баяндамасын жашыруу",
        "revdelete-hide-user": "Редактордун катышуучу атын/IP-дарегин жашыруу",
        "revdelete-radio-same": "(өзгөртпөө)",
-       "revdelete-radio-set": "Ð\9eоба",
-       "revdelete-radio-unset": "Ð\96ок",
+       "revdelete-radio-set": "Ð\96аÑ\88Ñ\8bÑ\80Ñ\83Ñ\83н",
+       "revdelete-radio-unset": "Ð\90Ñ\88кеÑ\80е",
        "revdelete-log": "Себеби:",
        "revdel-restore": "көрүнүшүн өзгөртүү",
        "pagehist": "Барактын тарыхы",
        "mergehistory-from": "Баштапкы барак:",
        "mergehistory-into": "Максаттык барак:",
        "mergehistory-submit": "Версияларды бириктирүү",
+       "mergehistory-no-source": "$1 барагынын булагы жок.",
        "mergehistory-invalid-source": "Баштапкы барагынын башжазуусу туура болушу керек.",
        "mergehistory-invalid-destination": "Максаттык барагынын башжазуусуу туура бар болуш керек.",
        "mergehistory-same-destination": "Баштапкы жана максаттык барактары окшош эмес болуш керек",
        "compareselectedversions": "Тандалган версияларды салыштыруу",
        "showhideselectedversions": "Тандалган версияларды көрсөтүү/жашыруу",
        "editundo": "жокко чыгаруу",
-       "searchresults": "Издөө жыйынтыктары",
-       "searchresults-title": "\"$1\" үчүн издөө жыйынтыктары",
+       "diff-empty": "(Айырма жок)",
+       "searchresults": "Издөө жыйынтыгы",
+       "searchresults-title": "\"$1\" үчүн издөө жыйынтыгы",
        "prevn": "абалкы {{PLURAL:$1|$1}}",
        "nextn": "соңку {{PLURAL:$1|$1}}",
+       "next-page": "кийинки барак",
        "prevn-title": "Абалкы $1 {{PLURAL:$1|жыйынтык}}",
        "nextn-title": "Кийинки $1 {{PLURAL:$1|жыйынтык}}",
        "shown-title": "Барактан $1 {{PLURAL:$1|жыйынтыкты}} көрсөтүү",
        "searchmenu-exists": "'''Бул Уикиде \"[[:$1]]\" деп аталган барак бар.'''",
        "searchmenu-new": "'''Бул Уикиде \"[[:$1]]\" барагын түз!'''",
        "searchprofile-articles": "Негизги барактар",
-       "searchprofile-images": "Мултимедиа",
-       "searchprofile-everything": "Баары",
+       "searchprofile-images": "Ð\9cÑ\83лÑ\8cÑ\82имедиа",
+       "searchprofile-everything": "Баардыгы",
        "searchprofile-advanced": "Кеңейтилген",
-       "searchprofile-articles-tooltip": "$1 -де издөө",
+       "searchprofile-articles-tooltip": "$1 -ден издөө",
        "searchprofile-images-tooltip": "Файлдарды издөө",
        "searchprofile-everything-tooltip": "Баардык барактардан (талкуу барактарды кошо) издөө",
-       "searchprofile-advanced-tooltip": "Ð\91елгиленген Ð°Ñ\82алÑ\8bÑ\88 Ð¼ÐµÐ¹ÐºÐ¸Ð½Ð´Ð¸ÐºÑ\82еÑ\80инде издөө",
+       "searchprofile-advanced-tooltip": "Ð\91елгиленген Ð°Ñ\82алÑ\8bÑ\88 Ð¼ÐµÐ¹ÐºÐ¸Ð½Ð´Ð¸ÐºÑ\82еÑ\80инен издөө",
        "search-result-size": "$1 ({{PLURAL:$2|1 сөз|$2 сөздөр}})",
        "search-result-category-size": "{{PLURAL:$1|1 мүчө|$1 мүчөлөр}} ({{PLURAL:$2|1 ички категория|$2 ички категориялар}}, {{PLURAL:$3|1 файл|$3 файлдар}})",
        "search-redirect": "($1 багыттама)",
        "search-section": "($1 бөлүмү)",
+       "search-category": "($1 категория)",
        "search-suggest": "Балким, издегениңиз бул: $1",
        "search-interwiki-caption": "Тектеш долбоорлор",
        "search-interwiki-default": "$1 жыйын.:",
        "search-interwiki-more": "(көбүрөөк)",
        "search-relatedarticle": "Байланыштуу",
        "searchrelated": "байланыштуу",
-       "searchall": "бааÑ\80ы",
+       "searchall": "жалпÑ\8bÑ\81ы",
        "search-nonefound": "Талапка төп маалымат табылган жок.",
        "powersearch-legend": "Кеңейтилген издөө",
        "powersearch-ns": "Аталыш мейкиндиктеринен издөө:",
        "action-userrights": "бүткүл колдонуучулардын укуктарын оңдоо",
        "action-sendemail": "электрондук каттарды жөнөтүү",
        "nchanges": "$1 {{PLURAL:$1|өзгөрүү|өзгөрүүлөр}}",
+       "enhancedrc-history": "тарыхы",
        "recentchanges": "Соңку өзгөрүүлөр",
        "recentchanges-legend": "Соңку өзгөртүүлөрдүн ырастоолору",
        "recentchanges-summary": "Уикидеги соңку өзгөрүүлөрдү ушул барактан көзөмөлдө.",
        "rcnotefrom": "'''$2''' -тан өзгөрүүлөр ылдый жакта ('''$1''' чейин көрсөтүлдү).",
        "rclistfrom": "$3 $2 күнүнөн баштап жаңы өзгөртүүлөрдү көрсөтүү",
        "rcshowhideminor": "Майда оңдоолорду $1",
+       "rcshowhideminor-show": "Көрсөтүү",
+       "rcshowhideminor-hide": "Жашыруу",
        "rcshowhidebots": "ботторду $1",
+       "rcshowhidebots-show": "Көрсөтүү",
+       "rcshowhidebots-hide": "Жашыруу",
        "rcshowhideliu": "$1 катталган колдонуучу",
+       "rcshowhideliu-hide": "Жашыруу",
        "rcshowhideanons": "$1 жашыруун колдонуучу",
+       "rcshowhideanons-show": "Көрсөтүү",
+       "rcshowhideanons-hide": "Жашыруу",
        "rcshowhidepatr": "Күзөттөө алдындагы оңдоолорду $1",
        "rcshowhidemine": "Оңдоолорумду $1",
+       "rcshowhidemine-show": "Көрсөтүү",
+       "rcshowhidemine-hide": "Жашыруу",
        "rclinks": "Соңку $2 күндө жасалган акыркы $1 өзгөртүүлөрдү көрсөтүү<br />$3",
        "diff": "айырма",
        "hist": "тарыхы",
        "filehist-user": "Колдонуучу",
        "filehist-dimensions": "Өлчөмдөр",
        "filehist-filesize": "Файл өлчөмү",
-       "filehist-comment": "Ð\9aомменÑ\82аÑ\80ий",
+       "filehist-comment": "Ð\96оÑ\80Ñ\83м",
        "imagelinks": "Файлды колдонуу",
        "linkstoimage": "Бул файлга болгон {{PLURAL:$1|шилтеме|$1 шилтемелер}} :",
        "nolinkstoimage": "Бул файлга шилтеме берген барак жок.",
        "movethispage": "Бул барактын атын өзгөртүү",
        "pager-newer-n": "{{PLURAL:$1|жаңыраак 1|жаңыраак $1}}",
        "pager-older-n": "{{PLURAL:$1|эскирээк 1|эскирээк $1}}",
-       "booksources": "Китеп тууралуу маалыматтар",
+       "booksources": "Китеп булактары",
        "booksources-search-legend": "Китеп тууралуу маалыматтарды издөө",
+       "booksources-search": "Издөө",
        "specialloguserlabel": "Аткаруучу:",
        "speciallogtitlelabel": "Максаты (аталышы же колдонуучу):",
        "log": "Журналдар",
        "whatlinkshere-page": "Барак:",
        "linkshere": "'''[[:$1]]''' барагына шилтеме берген барактар:",
        "nolinkshere": "'''[[:$1]]''' барагына шилтеме берген барак жок.",
-       "isredirect": "Ð\91агыттама барак",
+       "isredirect": "багыттама барак",
        "istemplate": "бириктирүү",
        "isimage": "файл шилтемеси",
        "whatlinkshere-prev": "{{PLURAL:$1|мурунку}}",
        "whatlinkshere-hidetrans": "$1 бириктирүүлөр",
        "whatlinkshere-hidelinks": "Шилтемелерди $1",
        "whatlinkshere-hideimages": "$1 файл шилтемелери",
-       "whatlinkshere-filters": "ЧÑ\8bпкалар",
+       "whatlinkshere-filters": "ЭлекÑ\82ер",
        "block": "Колдонуучуну бөгөттөө",
        "blockip": "Колдонуучуну бөгөттөө",
        "blockip-legend": "Колдонуучуну бөгөттөө",
        "movepagebtn": "Барактын атын өзгөртүү",
        "pagemovedsub": "Барактын аты өзгөртүлдү",
        "movepage-moved-redirect": "Багыттама түзүлдү.",
-       "movelogpage": "Аталыштарды өзгөртүү тарыхы",
+       "movelogpage": "Аталыштарды өзгөртүү журналы",
        "movereason": "Себеп:",
        "revertmove": "кайтаруу",
        "delete_and_move": "Өчүрүү же атын өзгөртүү",
        "tooltip-ca-watch": "Бул баракты көзөмөл тизмеңизге кошуңуз",
        "tooltip-ca-unwatch": "Бул баракты көзөмөл тизмеңизден алып салыңыз",
        "tooltip-search": "{{SITENAME}} издөө",
-       "tooltip-search-go": "Так Ñ\83Ñ\88Ñ\83ндай Ð°Ñ\82алÑ\8bÑ\88Ñ\82агÑ\8b Ð±Ð°Ñ\80акÑ\82Ñ\8b ÐºÓ©Ñ\80Ñ\81өтүү",
-       "tooltip-search-fulltext": "УÑ\88Ñ\83л Ñ\82екÑ\81Ñ\82 Ð±Ð°Ñ\80 барактарды издөө",
+       "tooltip-search-go": "ЭгеÑ\80де Ð±Ð°Ñ\80 Ð±Ð¾Ð»Ñ\81о, Ñ\82ак Ñ\83Ñ\88Ñ\83ндай Ð°Ñ\82алÑ\8bÑ\88Ñ\82агÑ\8b Ð±Ð°Ñ\80акка өтүү",
+       "tooltip-search-fulltext": "УÑ\88Ñ\83л Ñ\82екÑ\81Ñ\82 ÐºÐ°Ñ\82Ñ\8bÑ\88кан барактарды издөө",
        "tooltip-p-logo": "Башбаракка өтүү",
        "tooltip-n-mainpage": "Башбаракка өтүү",
        "tooltip-n-mainpage-description": "Башбаракка өтүү",
        "tooltip-n-portal": "Долбоор тууралуу, эмне жасай аласыз, кайдан тапса болот",
        "tooltip-n-currentevents": "Учурдагы окуялар тууралуу кошумча маалымат табуу",
-       "tooltip-n-recentchanges": "уикидеги соңку өзгөртүүлөрдүн тизмеси",
+       "tooltip-n-recentchanges": "Уикидеги соңку өзгөртүүлөрдүн тизмеси",
        "tooltip-n-randompage": "Тушкелди баракты ачып кара",
        "tooltip-n-help": "Маалымат алуу үчүн",
-       "tooltip-t-whatlinkshere": "Ушул жерге шилтемеси бар бардык уики барактардын тизмеси",
+       "tooltip-t-whatlinkshere": "Ушул жерге шилтемеленген бардык уики барактардын тизмеси",
        "tooltip-t-recentchangeslinked": "Бул барактан шилтеме берилген барактардагы соңку өзгөрүүлөр",
-       "tooltip-feed-atom": "Бул барак үчүн Atom агымы",
+       "tooltip-feed-atom": "Бул барак үчүн Atom тасмасы",
        "tooltip-t-contributions": "Бул колдонуучунун салымдарынын тизмеси",
        "tooltip-t-emailuser": "Бул колдонуучуга кат жиберүү",
        "tooltip-t-upload": "Файлдарды жүктөө",
-       "tooltip-t-specialpages": "Ð\91аÑ\80дÑ\8bк ÐºÑ\8bзмаÑ\82Ñ\82Ñ\8bк Ð±Ð°Ñ\80акÑ\82аÑ\80дÑ\8bн тизмеги",
-       "tooltip-t-print": "Бул барактын басып чыгарууга ылайыктуу түрү",
+       "tooltip-t-specialpages": "Ð\9aÑ\8bзмаÑ\82Ñ\82Ñ\8bк Ð±Ð°Ñ\80акÑ\82аÑ\80дÑ\8bн Ð¶Ð°Ð»Ð¿Ñ\8b тизмеги",
+       "tooltip-t-print": "Бул барактын басма түрү",
        "tooltip-t-permalink": "Барактын бул версиясына туруктуу шилтеме",
        "tooltip-ca-nstab-main": "Барактын мазмунун кароо",
        "tooltip-ca-nstab-user": "Колдонуучунун барагын көрсөтүү",
        "tooltip-ca-nstab-media": "Медиа барагын көрүү",
        "tooltip-ca-nstab-special": "Бул кызматтык барак, сиз аны оңдой албайсыз",
-       "tooltip-ca-nstab-project": "Долбоор барагы",
+       "tooltip-ca-nstab-project": "Долбоор барагын көрүү",
        "tooltip-ca-nstab-image": "Файл барагын кароо",
        "tooltip-ca-nstab-mediawiki": "Системалык билдирүүсүн кароо",
-       "tooltip-ca-nstab-template": "Ð\9aалÑ\8bпÑ\82Ñ\8b ÐºÐ°Ñ\80оо",
+       "tooltip-ca-nstab-template": "Ð\9aалÑ\8bбÑ\8bн ÐºÓ©Ñ\80Ò¯Ò¯",
        "tooltip-ca-nstab-help": "Жардам барагын кароо",
        "tooltip-ca-nstab-category": "Категория барагын кароо",
        "tooltip-minoredit": "Муну майда оңдоо деп белгилөө",
        "pageinfo-protect-cascading-yes": "Ооба",
        "patrol-log-page": "Күзөттөө журналы",
        "previousdiff": "← Эскирээк оңдоо",
-       "nextdiff": "Жаңыраак оңдоо →",
+       "nextdiff": "Жаңы оңдоо →",
        "file-info-size": "$1 × $2 пиксель, файлдын көлөмү: $3, MIME түрү: $4",
        "file-nohires": "Мындан чоңураак чечим жок.",
        "svg-long-desc": "SVG файл, шарттуу түрдө $1 × $2 пиксел, файлдын көлөмү: $3",
        "svg-long-error": "туура эмес SVG-файл: $1",
        "show-big-image": "Толук чечими",
+       "show-big-image-size": "$1 × $2 пиксел",
        "newimages": "Жаңы файлдардын галереясы",
        "newimages-legend": "Чыпка",
        "newimages-label": "Файл аты (же анын жартысы):",
        "exif-iimcategory-soi": "Социалдык маселелер",
        "exif-iimcategory-spo": "Спорт",
        "exif-iimcategory-wea": "Аба-ырайы",
-       "namespacesall": "бааÑ\80ы",
-       "monthsall": "бааÑ\80ы",
+       "namespacesall": "жалпÑ\8bÑ\81ы",
+       "monthsall": "жалпÑ\8bÑ\81ы",
        "confirmemail": "Электрондук даректи аныктоо",
        "confirmemail_loggedin": "Электрондук дарегиңиз аныкталды.",
        "recreate": "Кайрадан түзүү",
        "watchlisttools-view": "Тийиштүү өзгөрүүлөрдү кароо",
        "watchlisttools-edit": "Көзөмөл тизмесин кароо жана оңдоо",
        "watchlisttools-raw": "Жетиле элек көзөмөл тизмени оңдоо",
+       "signature": "[[{{ns:колдонуучу}}:$1|$2]] ([[{{ns:колдонуучу_баарлашуу}}:$1|баарлашуу]])",
        "duplicate-defaultsort": "'''Эскертүү:''' \"$2\" белгиленген ылгоочу ачкыч \"$1\" мурунку белгиленген ылгоочу ачкычты жокко чыгарат.",
        "version": "Версия",
        "version-extensions": "Орнотулган кеңейтүүлөр",
        "htmlform-submit": "Жөнөтүү",
        "htmlform-reset": "Өзгөртүүлөрдү жокко чыгаруу",
        "htmlform-selectorother-other": "Башка",
-       "logentry-delete-delete": "$1 колдонуучу $3 барагын өчүрдү",
+       "logentry-delete-delete": "$1 $3 барагын {{GENDER:$2|өчүрдү}}",
        "revdelete-content-hid": "мазмун жашырылган",
        "revdelete-summary-hid": "оңдоонун баяндамасы жашырылган",
        "revdelete-uname-hid": "катышуучу аты жашырылган",
        "logentry-newusers-create": "$1 эсеп жазуусу түзүлдү",
        "logentry-newusers-create2": "$1 эсеп жазуусун түздү",
        "logentry-newusers-autocreate": "Автоматтуу түрдө $1 эсеп жазуусу түзүлдү",
+       "logentry-upload-upload": "$1 $3 жактан {{GENDER:$2|жүктөлдү}}",
        "rightsnone": "(жок)",
        "feedback-adding": "Баракка пикирди кошуу…",
        "feedback-bugnew": "Мен текшердим. Жаңы ката жөнүндө маалымдоо",
index dd301a3..ebb128f 100644 (file)
        "readonlywarning": "'''OPGEPASST: D'Datebank gouf wéinst Maintenanceaarbechte gespaart, dofir kënnt Dir Är Ännerungen den Ament net ofspäicheren.'''\nDir kënnt den Text kopéieren an an een Textfichier drasetzen an deen ofspäicheren fir méi spéit.\n\nDen Administrateur den d'Datebank gespaart huet, huet dës Erklärung ginn: $1",
        "protectedpagewarning": "'''OPGEPASST: Dës Säit gouf gespaart a kann nëmme vun engem Administrateur geännert ginn.''' Déi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
        "semiprotectedpagewarning": "'''Bemierkung:''' Dës Säit gouf sou gespaart, datt nëmme ugemellt Benotzer s'ännere kënnen. Déi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
-       "cascadeprotectedwarning": "'''Opgepasst:''' Dës Säit gouf gespaart a kann nëmme vu Benotzer mat Administreursrechter geännert ginn. Si ass an dës {{PLURAL:$1|Säit|Säiten}} agebonnen, déi duerch Cascadespäroptioun gespaart {{PLURAL:$1|ass|sinn}}:'''",
+       "cascadeprotectedwarning": "<strong>Opgepasst:</strong> Dës Säit gouf gespaart a kann nëmme vu Benotzer mat Administrateursrechter geännert ginn. Si ass an dës {{PLURAL:$1|Säit|Säiten}} agebonnen, déi duerch Cascadespäroptioun gespaart {{PLURAL:$1|ass|sinn}}:'''",
        "titleprotectedwarning": "'''OPGEPASST: Dës Säit gouf gespaart sou datt [[Special:ListGroupRights|spezifesch Rechter]] gebraucht gi fir se uleeën ze kënnen.''' Déi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
        "templatesused": "{{PLURAL:$1|Schabloun|Schablounen}} déi op dëser Säit am Gebrauch sinn:",
        "templatesusedpreview": "{{PLURAL:$1|Schabloun|Schablounen}} déi an dëser nach net gespäicherter Versioun benotzt {{PLURAL:$1|gëtt|ginn}}:",
        "linksearch-pat": "Sich-Critère:",
        "linksearch-ns": "Nummraum:",
        "linksearch-ok": "Sichen",
-       "linksearch-text": "\"Wildcards\" wéi zum Beispill \"*.example.com\" kënne benotzt ginn.\nEt muss mindestens en Top-Level-Domaine ugi ginn, wéi z. Bsp. \".org\".<br />\nËnnerstëtzte {{PLURAL:$2|Protokoll|Protekoller}}: <code>$1</code> (http:// gëtt benotzt wann näischt spezifizéiert gëtt).",
+       "linksearch-text": "\"Wildcards\" wéi zum Beispill \"*.example.com\" kënne benotzt ginn.\nEt muss mindestens en Top-Level-Domaine ugi ginn, wéi z. Bsp. \".org\".<br />\nËnnerstëtzte {{PLURAL:$2|Protokoll|Protekoller}}: $1 (http:// gëtt benotzt wann näischt spezifizéiert gëtt).",
        "linksearch-line": "$1 verlinkt vun $2",
        "linksearch-error": "Wildcards (*,?) kënnen nëmmen am Ufank vum Host-Numm benotzt ginn.",
        "listusersfrom": "D'Benotzer weisen, ugefaange bei:",
        "rollback-success": "D'Ännerunge vum $1 goufen zréckgesat op déi lescht Versioun vum $2.",
        "sessionfailure-title": "Setzungsfeeler",
        "sessionfailure": "Et schéngt e Problem mat Ärer Loginseance ze ginn;\nDës Aktioun gouf aus Sécherheetsgrënn ofgebrach, fir ze verhënneren datt Är Seance piratéiert ka ginn.\nKlickt w.e.g. op \"Zréck\" a luet déi Säit vun där Dir komm sidd nei, a versicht et dann nach eng Kéier.",
+       "changecontentmodel": "De Modell vum Inhalt vun enger Säit änneren",
        "changecontentmodel-legend": "Modell vun enger Säit mat Inhalt änneren",
        "changecontentmodel-title-label": "Titel vun der Säit",
        "changecontentmodel-model-label": "Neie Modell vun enger Säit mat Inhalt",
        "changecontentmodel-reason-label": "Grond:",
+       "changecontentmodel-success-title": "De Modell vum Inhalt gouf geännert",
        "changecontentmodel-success-text": "Den Typ vum Inhalt vu(n) [[:$1]] gouf geännert.",
        "changecontentmodel-title-cantexist": "Et ass net méiglech enger Säit den Numm $1 ze ginn.",
+       "logentry-contentmodel-change-revertlink": "zrécksetzen",
+       "logentry-contentmodel-change-revert": "zrécksetzen",
        "protectlogpage": "Protektiounslogbuch",
        "protectlogtext": "Dëst ass d'Lëscht vun de Säitespären.\nKuckt d'[[Special:ProtectedPages|Lëscht vun de gespaarte Säite]] fir eng Lëscht vun den aktuelle Säitespären.",
        "protectedarticle": "huet \"[[$1]]\" gespaart",
        "ip_range_invalid": "Ongëltegen IP Block.",
        "ip_range_toolarge": "Späre vu Beräicher déi méi grouss wéi /$1 si sinn net erlaabt.",
        "proxyblocker": "Proxy blocker",
-       "proxyblockreason": "Ã\84r IP-Adress gouf gespaart, well si een oppene Proxy ass. Kontaktéiert w.e.g. Ã¤ren Internet-Provider oder Ã¤rs Systemadministrateuren und informéiert si iiwwer dëses méigleche Sécherheetsprobleem.",
+       "proxyblockreason": "Ã\84r IP-Adress gouf gespaart, well si een oppene Proxy ass. Kontaktéiert w.e.g. Ã¤ren Internet-Provider oder Ã\84r Systemadministrateuren an informéiert si iwwer dëse méigleche Sécherheetsproblem.",
        "sorbsreason": "Är IP Adress steet als oppene Proxy an der schwaarzer Lëscht (DNSBL) déi vu {{SITENAME}} benotzt gëtt.",
        "sorbs_create_account_reason": "Är IP-Adress steet als oppene Proxy an der schwaarzer Lëscht déi op {{SITENAME}} benotzt gëtt. DIr kënnt keen neie Benotzerkont opmaachen.",
        "xffblockreason": "Eng IP-Adress am X-Forwarded-For-Header gouf gespaart, entweder Är oder déi vum Proxyserver deen Dir benotzt. De Grond vun der Spär war: $1",
        "tags-create-reason": "Grond:",
        "tags-create-submit": "Uleeën",
        "tags-create-no-name": "Dir musst den Numm vun enger Markéierung (tag) uginn.",
+       "tags-create-invalid-chars": "An den Nimm vun de Markéierungen däerfe keng Kommaen (<code>,</code>) oder schif Strécher (<code>/</code>) sinn.",
        "tags-create-already-exists": "D'Markéierung (tag) ''$1'' gëtt et schonn.",
        "tags-create-warnings-above": "Dës {{PLURAL:$2|Warnung ass|Warnunge si}} beim Versuch d'Markéierung (tag) \"$1\" unzeleeën.",
        "tags-delete-title": "Markéierung (tag) läSchen",
        "htmlform-cloner-create": "Méi derbäisetzen",
        "htmlform-cloner-delete": "Ewechhuelen",
        "htmlform-cloner-required": "Mindestens ee Wäert ass obligatoresch.",
+       "htmlform-title-badnamespace": "[[:$1]] ass net am Nummraum \"{{ns:$2}}\".",
+       "htmlform-title-not-exists": "[[:$1]] gëtt et net.",
+       "htmlform-user-not-exists": "<strong>$1</strong> gëtt et net.",
+       "htmlform-user-not-valid": "<strong>$1</strong> ass kee valabele Benotzernumm.",
        "sqlite-has-fts": "$1 ënnerstëtzt d'Volltextsich",
        "sqlite-no-fts": "$1 ënnerstëtzt d'Volltextsich net",
        "logentry-delete-delete": "$1 {{GENDER:$2|huet}} d'Säit $3 geläscht",
index 8372a30..6fd2b5e 100644 (file)
        "resetpass-wrong-oldpass": "'t Hujig of tiedelik wachwaord is ongeljig.\nMeugelik höbs doe dien wachwaord al gewiezig of 'n nuuj tiedelik wachwaord aangevraog.",
        "resetpass-temp-password": "Tiedelik wachwaord:",
        "passwordreset": "Wachwaord obbenuuts insjtèlle",
-       "passwordreset-legend": "Wachwaord obbenuuts insjtèlle",
        "passwordreset-disabled": "'t Is hie neet meugelik óm die wachwaord óbbenuits in te sjtelle.",
        "passwordreset-username": "Gebroekersnaam:",
        "passwordreset-domain": "Domein:",
        "nlinks": "$1 {{PLURAL:$1|verwiezing|verwiezinge}}",
        "nmembers": "$1 {{PLURAL:$1|lid|lede}}",
        "nrevisions": "$1 {{PLURAL:$1|herzening|herzeninge}}",
-       "nviews": "{{PLURAL:$1|eine kieër|$1 kieër}} bekeke",
        "nimagelinks": "Gebroek op $1 {{PLURAL:$1|pagina|pagina's}}",
        "ntransclusions": "Gebroek op $1 {{PLURAL:$1|pagina|pagina's}}",
        "specialpage-empty": "Deze pagina is laeg.",
        "linksearch-pat": "Zeukpatroon:",
        "linksearch-ns": "Naamruumde:",
        "linksearch-ok": "Zeuk",
-       "linksearch-text": "Wildcards wie \"*.wikipedia.org\" of \"*.org\" zeen toegestaon.\nHaet mèndestes e toepleveldomein, wie beveurbeildj \"*.org\".<br />\nÓngerstäönendje protocolle: <code>$1</code> (veug dees neet tou in dien zeukópdrach).",
+       "linksearch-text": "Wildcards wie \"*.wikipedia.org\" of \"*.org\" zeen toegestaon.\nHaet mèndestes e toepleveldomein, wie beveurbeildj \"*.org\".<br />\nÓngerstäönendje protocolle: $1 (veug dees neet tou in dien zeukópdrach).",
        "linksearch-line": "$1 gelink vanaaf $2",
        "linksearch-error": "Wildcards zijn alleen toegestaan aan het begin van een hostnaam.",
        "listusersfrom": "Tuin gebroekers vanaaf:",
index 339c21d..acdbcad 100644 (file)
        "userloginnocreate": "ڤامین ئوٙمائن",
        "logout": "د ساموٙنە دئرئوٙمائن",
        "userlogout": "د ساموٙنە دئرئوٙمائن",
-       "notloggedin": "Ù\86بÙ\88Ù\99Û\95 Ø¨Û\8cاÛ\8cیت ڤامین",
+       "notloggedin": "Ù\86أبÙ\88Ù\99Ø£ Ø¨Û\8cائیت ڤامین",
        "userlogin-noaccount": "یئ گئل حئساڤ ناریت؟",
        "userlogin-joinproject": "ڤأصل بوٙییت {{SITENAME}}",
        "nologin": "یئ گئل حئساڤ کاریاری ناريت؟$1",
        "userexists": "نوم کاریاری دە بییە ئیسئنی ڤئ کار گئرئتە بییە.\nلوطف بأکیت یئ گئل نوم هأنی نە ڤئرداریت.",
        "loginerror": "خأطا ڤامین ئوٙمائن",
        "createacct-error": "خأطا راس کئردئن حئساڤ",
-       "createaccounterror": "Ù\86بÙ\88ئÙ\87 Ø­Ø³Ø§Ù\88 Ø±Ø§Ø³ Ø¨Ù\83Ù\8aد:$1",
-       "nocookiesnew": "حساÙ\88 Ú©Ø§Ø±Û\8cارÛ\8c Ø±Ø§Ø³ Ø¨Û\8cØ\8cاÙ\85ا Ø´Ù\85ا Ù\88اÙ\85ئÙ\86 Ù\86Û\8cاÙ\85اÛ\8cئتÙ\87.{{Ù\86Ù\88Ù\85 Ù\85اÙ\84Ú¯Ù\87}} Ø¯ Ú©Ù\88Ú©Û\8cا Ø³Û\8c Ø§Ù\88Ù\85ائÙ\86 Ø¯ Ø³Û\8cستÙ\85 Ú©Ø§Ø±Û\8cارÛ\8cا Ù\88Ù\87 Ú©Ø§Ø± Ù\85Û\8cئرÙ\87 .Ú©Ù\88Ú©Û\8cا Ø´Ù\85ا Ø¯ Ú©Ø§Ø± Ø§Ù\81تائÙ\87\84Ø·Ù\81Ù\86 Ù\88ا Ú©Ø§Ø±Ø´Ù\88 Ø¨Ù\88Ù\86Û\8cتØ\8c Ø§Ù\88سÙ\87 Ù\88ا Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c ØªØ§Ø²Ù\87 Ù\88 Ø±Ø§Ø²Û\8cÙ\86Ù\87 Ú¯Ù\88اردÙ\86 Ù\87Ù\86Û\8c Ø¨Û\8cاÛ\8cت Ù\88ا Ù\85ئن.",
-       "nocookieslogin": "{{نوم مالگه}} د کوکیا سی وامئن اومائن کاریاریا وه کار میئره. کوکیا شما د کار افتائه.\nلطف بکید د کارشو بونیت و دوواره تلاش بکید.",
-       "nocookiesfornew": "حساÙ\88 Ú©Ø§Ø±Û\8cارÛ\8c Ø±Ø§Ø³ Ù\86بÛ\8cÙ\87Ø\8c Ø³Û\8c Û\8cÙ\87 Ø§Û\8cÙ\85ا Ù\86تÙ\88Ù\86Û\8cÙ\85 Ø³Ø±Ú\86Ø´Ù\85Ù\87 Ù\88Ù\86Ù\87 Ù\85ئکÙ\85 Ø¨Ú©Û\8cÙ\85.\nÙ\85Ø·Ù\85ئÙ\86 Ø¨Ù\88ئÛ\8cت Ú©Ù\87 Ú©Ù\88Ú©Û\8cا Ú©Ù\86شتگر Ø¨Û\8cÙ\86Ù\87Ø\8c Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\87 Ø¯ Ù\86Ù\88 Ø³Ù\88ار Ø¨Ú©Û\8cد Ù\88 Ø¯ Ù\86Ù\88 ØªÙ\84اش Ø¨Ú©Û\8cد.",
+       "createaccounterror": "Ù\86أبÙ\88Ù\99Û\95 Ø­Ø¦Ø³Ø§Ú¤ Ú©Ø§Ø±Û\8cارÛ\8c Ø±Ø§Ø³ Ø¨Ø£Ú©Û\8cت:$1",
+       "nocookiesnew": "حئساڤ Ú©Ø§Ø±Û\8cارÛ\8c Ø±Ø§Ø³Øª Ø¨Û\8cØ\8c Ú¤Ø£Ù\84Û\8c Ø´Ù\88Ù\85ا Ù\86Û\8cÙ\88Ù\99Ù\85اÛ\8cتÛ\95 Ú¤Ø§Ù\85Û\8cÙ\86.کارÛ\8cارÛ\8c Ø±Ø§Ø³ Ø¨Û\8cØ\8cاÙ\85ا Ø´Ù\85ا Ù\88اÙ\85ئÙ\86 Ù\86Û\8cاÙ\85اÛ\8cئتÙ\87.{{SITENAME}} Ú©Ù\88Ù\99Ú©Û\8cا Ù\86Û\95 Ø³Û\8c Ø¦Ù\88Ù\99Ù\85ائÙ\86 Ø¯ Ø³Ø§Ù\85Ù\88Ù\99Ù\86Û\95 Ú©Ø§Ø±Û\8cارÛ\8cاڤئ Ú©Ø§Ø± Ù\85ئÛ\8cرÛ\95.\nÚ©Ù\88Ù\99Ú©Û\8cا Ø´Ù\88Ù\85ا Ù\86اکÙ\88Ù\99Ù\86ئشتگأر Ø¨Û\8cÙ\86Û\95.\nÙ\84Ù\88Ø·Ù\81 Ø¨Ø£Ú©Û\8cت Ú¤Ø¦Ù\86Ù\88Ù\99Ù\86Û\95 Ú©Ù\88Ù\86ئشتگأر Ø¨Ø£Ú©Û\8cتØ\8c Ø¦Ù\88Ù\99سئ Ú¤Ø§ Û\8cئ Ú¯Ø¦Ù\84 Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c Ù\88 Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ù\87Ø£Ù\86Û\8c Ø¨Û\8cاÛ\8cÛ\8cت Ú¤Ø§Ù\85Û\8cن.",
+       "nocookieslogin": "{{SITENAME}} کوٙکیا نە سی ئوٙمائن د ساموٙنە کاریاریاڤئ کار مئیرە.\nکوٙکیا شوما ناکوٙنئشتگأر بینە.\nلوطف بأکیت ڤئنوٙنە کونئشتگأر بأکیت و د نۊ تئلاش بأکیت.",
+       "nocookiesfornew": "حئساڤ Ú©Ø§Ø±Û\8cارÛ\8c Ø±Ø§Ø³ Ù\86أبÛ\8cÛ\95Ø\8c Ø³Û\8c Û\8cÛ\95 Ù\86Û\95 Ú©Ø¦ Ø¦Û\8cÙ\85ا Ù\86ئÙ\85Û\8c ØªÙ\88Ù\99Ù\86Û\8cÙ\85 Ø³Ø£Ø±Ú\86ئشÙ\85Û\95 Ú¤Ø¦Ù\86Û\95 Ù¾Ù\88شت Ø±Ø§Ø³ Ú©Ø§Ø±Û\8c Ø¨Ø£Ú©Û\8cÙ\85.\nÙ\85Ù\88Ø·Ù\85أئÙ\86 Ø¨Ù\88Ù\99Û\8cÛ\8cت Ú©Ø¦ Ú©Ù\88Ù\99Ú©Û\8cا Ú©Ù\88Ù\86ئشتگأر Ø¨Û\8cÙ\86Û\95Ø\8c Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\95 Ø¯ Ù\86Ù\88Ù\99 Ø³Ù\88Ù\99ڤار Ø¨Ø£Ú©Û\8cت Ù\88 Ù\87Ø£Ù\86Û\8c ØªØ¦Ù\84اش Ø¨Ø£Ú©Û\8cت.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
-       "noname": "Ø´Ù\85ا Û\8cÙ\87 Ú¯Ù\84 Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c Ø®Ù\88 Ù\86ارÛ\8cت",
-       "loginsuccesstitle": "اÙ\88Ù\85ائÙ\86 Ø¯ Ø³Ø§Ù\85Ù\88Ù\86Ù\87 Ù\85Ù\88Ù\81Ù\82 بی",
-       "loginsuccess": "Ø´Ù\85ا Ø§Û\8cسÙ\87 Ù\88ارد Ø¨Û\8cتÙ\87 {{SITENAME}} د چی\"$1\".'",
-       "nosuchuser": "چنی کاریاری و نوم  \"$1\" نئیش.\nنوم کاریاری وه حرفیا حساس هئ.\nروشت نیسنن تونه وارسی بکید،یا [[ویجه:وامین اومائن کاریار/ثوت نام کردن|یه گل حساو تازه راس بکید]].",
-       "nosuchusershort": "چنو کاریاری وا ای نوم $1 نی ئیش.\nنیسنن تونه دوواره نئری بکیتو",
-       "nouserspecified": "Ø´Ù\85ا Ø¨Ø§Û\8cد Û\8cÙ\87 Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c ØªÛ\8cارÛ\8c Ø¨Ú©Û\8cت",
-       "login-userblocked": "کاریار قلف بیه.وامین اومائن اجازه نی ئن",
-       "wrongpassword": "رازینه گواردن غلط وارد بیه.\nهنی تلاش بکید",
-       "wrongpasswordempty": "رازینه گواردنی که دئیت حالیه.د نؤ تلاش بکیت",
-       "passwordtooshort": "رازینه گواردن با حداقل  {{PLURAL:$1|1 character|$1 characters}}          با",
-       "passwordtoolong": "رازینه گواردن نواس بیشتر د {{PLURAL:$1|1 character|$1 characters}} با.",
-       "password-name-match": "رازینه گواردنتو با د نوم کاریاری فرخ داشتوه",
-       "password-login-forbidden": "وه کار گرتن ای پاسوردو نوم کاریاری قدقن بیه.",
-       "mailmypassword": "د Ù\86Û\88 Ù\88ارد Ù\83ردÙ\86 Ø±Ø§Ø²Û\8cÙ\86Ù\87 Ú¯Ù\88اردن",
-       "passwordremindertitle": "رازینه گواردن موقت تازه سی {{SITENAME}}",
-       "passwordremindertext": "یه نفر(شات خوتو،د تیرنشون آی پی $1) یه گل رازینه گواردن هنی سی {{نوم دیارگه}}($4) حاسته.یه گل رازینه گواردن موقتی سی کاریاری\"$2\" دروس بیه و د \"$3\" جاگر بیه. ار قصدتو یه بیه،شما واس ایسه روئیت وامین و یه گل رازینه گواردن هنی انتخاو بکید.\nرازینه گورادن موقتی د  {{PLURAL:$5|یه رو|$5 رو}}  تموم بوئه.\n\nار یه نفر هنی یه حاست داشتوئه،یا ار رازینه گورادن تونه د ویرتو اوما، و ار نحاستیت ونه آلشت بکیت، شما شایت د ای پیغوم تیه پوش بکیت و بحایت د وه کار بسن رازینه گواردن دماترتو دماداری بکیت.",
-       "noemail": "Ù\87Û\8cÚ\86 ØªÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ø§Û\8c Ø³Û\8c Ú©Ø§Ø±Û\8cار $1 Ø¶Ù\81Ø· Ù\86بÛ\8cÙ\87.",
-       "noemailcreate": "Ø´Ù\85ا Ø¨Ø§Û\8cد Û\8cÙ\87 ØªÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ø®Ù\88 Ù\81راÙ\87Ù\85 Ø¨Ú©Û\8cد",
-       "passwordsent": "یه گل رازینه گواردن هنی سی تیرنشون انجومانامه ای که \"$1\" واش ثوت نام کرده بی کل بیه.\nخواهش میکیم هنی رویئت وامین و اوسه بئریتش.",
-       "blocked-mailpassword": "نها آی پی شما سی ویرایشت گرته بیه، و",
-       "eauthentsent": "یه گل انجومانامه پشت راس کردنی د یه گل تیرنشون ویجه کل بیه.\nدما یه که یه گل انجومانامه هنی د حساو کل بوئه، شما واس دما رئنمونی نه د انجومانامه بئریت، سی یه که حساو شما راستکی پشت راست بوئه.",
-       "throttled-mailpassword": "یه گل رازینه گواردن دواره زنه بیه ایسه کل بیه، د آخری {{PLURAL:$1|ساعت|$1 ساعتیا}}.\nسی نهاگری د اذیت دئن،فقط یه گل رازینه گواردن د انجومانامه دواره زنه بیه د هر {{PLURAL:$1|ساعت|$1 ساعتیا}} کل بیه.",
-       "mailerror": "خطا Ø¯Ø§Ø±Ù\87 Ú©Ù\84 Ù\85Ù\88ئÙ\87:$1",
-       "acct_creation_throttle_hit": "سیل کریا ای ویکی تیرنشون آی پی شما وه کار گرتنه د روز دمایی {{PLURAL:$1|1 حساو|$1 حساویا}} نه دروس کردنه، و وه د بیشترونه صلا دئن د ای دوره گاتی انجوم بیه.\nد نتیجه، سیل کریایی که د ای تیرنشون آی پی وه کار گرتنه نمی تونن  حساویا بیشتری د ای گات دروس بکن.",
-       "emailauthenticated": "تÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 ØªÙ\88Ù\86Ù\87 Ø¯ $2 Ø³Û\8c 3$ Ù\85ئکÙ\85 Ø¨Û\8cÙ\87.",
-       "emailnotauthenticated": "تÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ø´Ù\85ا ØªØ§ Ø§Û\8cسÙ\87 Ù¾Ø´Øª Ø±Ø§Ø³Ú¯Ø±Û\8c Ù\86بÛ\8cÙ\87.\nÙ\87Ù\86Û\8c Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ø§Û\8c Ø³Û\8c Ú\86Û\8cا Ø±Û\8c Ø¨Ù\87 Ù\86Ù\87ا Ú©Ù\84 Ù\86بÛ\8cÙ\87.",
-       "noemailprefs": "یه گل تیرنشون انجومانامه د الویتیاتو سی یه که ای ویجه گیا کار بکن انتخاو بکیت.",
-       "emailconfirmlink": "پشت راس کردن تیرنشون انجومانامه",
-       "invalidemailaddress": "تÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ø­Ø§Ø³ØªÙ\86Û\8c Ù\86ئ Ø´Ú©Ù\84 Ù\88Ù\87 Ú\86Ù\88ئÙ\87 Ø®Ù\88ئÛ\8c Ù\86ارÙ\87.\nÙ\84Ø·Ù\81Ù\86 Û\8cÙ\87 Ú¯Ù\84 ØªÛ\8cرÙ\86Ø´Ù\88Ù\86 Ú\86Ù\88ئÙ\87 Ø¯Ø§Ø± Ù\88ارد Ø¨Ú©Û\8cت Û\8cا Ø§Û\8c Ø±Ø´Ù\86Ù\87 Ú¯Ù\87 Ù\86Ù\87 Ø­Ø§Ù\84Û\8c Ø¨نیت.",
-       "cannotchangeemail": "تÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ø­Ø³Ø§Ù\88 Ù\86تÙ\88Ù\86Ù\87 Ø¯ Ø§Û\8c Ù\88Û\8cÚ©Û\8c Ø¢Ù\84شت Ø¨Ù\88ئÙ\87.",
-       "emaildisabled": "اÛ\8c Ù\85اÙ\84Ú¯Ù\87 Ù\86تÙ\88Ù\86Ù\87 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ú©Ù\84 Ù\86Ù\85Û\8c Ú©Ù\87",
-       "accountcreated": "حساÙ\88 راس بی",
-       "accountcreatedtext": "حساÙ\88 Ú©Ø§Ø±Û\8cارÛ\8c Ø³Û\8c [[{{ns:کارÛ\8cار}}:$1|$1]] ([[{{ns:کارÛ\8cار Ú\86Ú© Ú\86Ù\86Ù\87}}:$1|Ú\86Ú© Ú\86Ù\86Ù\87]]) Ø¯Ø±Ù\88س Ø¨Û\8cÙ\87.",
-       "createaccount-title": "حساÙ\88 Ø±Ø§Ø³ Ú©Ø±Ø¯Ù\87 Ø³Û\8c  {{SITENAME}}",
-       "createaccount-text": "یه نفر وا تیرنشون انجونامه تو یه گل حساو راس کرده{{نوم دیارگه}} ($4) نومشه نیائه\"$2\", با پاسورد \"$3\".\nشما همی ایسه باید روئیت وامین و رازینه گواردتونه آلشت بکیت.\n\nار شما ای پیغوم نه وش التفات نکیت، د راس بیین ای حساو خطا دروس موئه.",
-       "login-throttled": "Ø´Ù\85ا Ø§Û\8cسÙ\86Û\8c Ù\81رÙ\87 Ø³Û\8c Ù\88اÙ\85Û\8cÙ\86 Ø§Ù\88Ù\85ائÙ\86 ØªÙ\84اش Ú©Ø±Ø¯Û\8cتÙ\87.\n$1 Ù\84Ø·Ù\81Ù\86 Ø³Û\8c ØªÙ\84اش Ù\87Ù\86Û\8c ØµØ¨Ø± Ø¨Ú©Û\8cد",
-       "login-abort-generic": "اومائن وامین تو شکست حرد-شکست حرده",
-       "login-migrated-generic": "حساÙ\88 Ú©Ø§Ø±Û\8cارÛ\8c Ø´Ù\85ا Ø¬Ø§ Ù\88Ù\87 Ø¬Ø§ Ø¨Û\8cÙ\87Ø\8c Ù\88 Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c Ø´Ù\85ا Ø¯Û\8cÙ\87 Ø¯ Ø§Û\8c Ù\88یکی نیئش.",
+       "noname": "Ø´Ù\88Ù\99Ù\85ا Û\8cئ Ú¯Ø¦Ù\84 Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c Ø®Ù\88Ù\99 ØªÛ\8cار Ù\86أکئردÛ\8cتÛ\95.",
+       "loginsuccesstitle": "ئÙ\88Ù\99Ù\85ائÙ\86 Ú¤Ø§Ù\85Û\8cÙ\86 Ø®Ù\88Ù\99 بی",
+       "loginsuccess": "Ø´Ù\88Ù\99Ù\85ا Ø¦Û\8cسئ Ø¦Ù\88Ù\99Ù\85اÛ\8cتÛ\95 Ú¤Ø§Ù\85Û\8cÙ\86 {{SITENAME}} د چی\"$1\".'",
+       "nosuchuser": "چئنی کاریاری ڤا نوم\"$1\" نیئش.\nنوم کاریاری ڤئ حأرفیا حأساسە.\nرأڤئشت نیسأنئن توٙنە ڤارئسی بأکست،یا [[Special:ڤامین ئوٙمائن کاریار/ثأڤت نام کئردئن|یئ گئل حئساڤ تازه راس بأکیت]].",
+       "nosuchusershort": "چئنی کاریاری ڤا نوم $1 نی.\nنیسأنئن خوتوٙنە ڤارئسی بأکیت.",
+       "nouserspecified": "Ø´Ù\88Ù\85ا Ú¤Ø§Ø³ Û\8cئ Ú¯Ø¦Ù\84 Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c ØªÛ\8cار Ø¨Ø£Ú©Û\8cت.",
+       "login-userblocked": "کاریا قولف بییە . شوما صئلا ڤامین ئوٙمائن ناریت.",
+       "wrongpassword": "رازینە گوڤاردئنئتوٙ نە ئشتئڤا دأییتە.\nد نۊ تئلاش بأکیت.",
+       "wrongpasswordempty": "رازینە گوڤاردئنئتوٙ نە حالی دأییتە.\nد نۊ تئلاش بأکیت.",
+       "passwordtooshort": "رازینە گوڤاردئنئتوٙ با کأمتروٙنە {{PLURAL:$1|1 کاراکتئر|$1 کاراکتئریا}} با",
+       "passwordtoolong": "رازینە گوڤاردئنئتوٙ نە ڤاس بیشتئر د {{PLURAL:$1|1 کاراکتئر|$1 کاراکتئریا}} با",
+       "password-name-match": "رازینە گوڤاردئنئتوٙ بایأد ڤا نوم کاریاریتوٙ فأرخ داشتوٙە.",
+       "password-login-forbidden": "ڤئ کارگئرئتئن ئی نوم کاریاری و رازینە گوڤاردئن قأدئقأن بییە.",
+       "mailmypassword": "د Ù\86Û\8a Ø¯Ø£Ø¦Ù\86 Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئن",
+       "passwordremindertitle": "رازینە گوڤاردئن موڤأتی تازه سی {{SITENAME}}",
+       "passwordremindertext": "یئ نأفأر (گاسی خوتوٙ،د تیرنئشوٙن آی پی $1) یئ گئل رازینە گوڤاردئن هأنی سی {{SITENAME}}($4) حاستە.یئ گئل رازینە گوڤاردئن موڤأقأتی سی کاریاری\"$2\" رأڤأندیاری بیە و د \"$3\" جاگئر بییە. أر یە نە حاستیتە،شما بایأد ئیسئ روٙییت ڤامین و یئ گئل رازینە گوڤاردئن هأنی نە ئنتئخاڤ بأکیت.\nرازینە گوڤاردئن موڤأقأتی د {{PLURAL:$5|یئ روٙ|$5 روٙزیا}}  تأموٙم بوٙە.\n\nأر یئ نأفأر هأنی ئی حاست نە داشتوٙە، یا أر رازینە گوڤاردئن توٙنە د ڤیرتوٙ ئوٙما، و أر حاستیت ڤئنە آلئشت کاری بأکیت، گاسی شوما د ئی پئیغوم تیە پوٙشی بأکیت و بئحایت ڤئ کار گئرئتئن رازینە گوڤاردئن دئماتریتوٙ نە دئماداری بأکیت.",
+       "noemail": "Ù\87Û\8cÚ\86 ØªÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Û\8cÛ\8c Ø³Û\8c Ú©Ø§Ø±Û\8cار $1 Ø¶Ø£Ù\81Ø· Ù\86أبÛ\8cÛ\95.",
+       "noemailcreate": "Ø´Ù\88Ù\85ا Ø¨Ø§Û\8cأد Û\8cئ Ú¯Ø¦Ù\84 ØªÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86Û\95 Ø¬Ø§Ø¯Û\8cار Ø³Û\8c Ø®Ù\88تÙ\88Ù\99 Ø¯Ø§Ø´ØªÙ\88Ù\99Û\8cÛ\8cت.",
+       "passwordsent": "یئ گئل رازینە گوڤاردئن هأنی کئل بییە سی تیرنئشوٙن أنجومانامە یی کئ \"$1\" ڤاش ثأڤت نام کئردە.\nخاهئشت می کیم هأنی روٙییت ڤامین و ئوٙسئ بئریتئش.",
+       "blocked-mailpassword": "نئها آی پی شوما سی ڤیرایئشت کاری گئرئتە بییە، هأنی صئلا یە نە نارە کئ د رازینە گوڤاردئن د نۊ کئل بییە سی نئهاگئری د گأن کاری نارە.",
+       "eauthentsent": "یئ گئل أنجومانامە پوشت راست کئردئنی د یئ گئلٛ تیرنئشوٙن ڤیجە کئل بییە.\nدئما یە کئ یئ گئل أنجومانامە هأنی د حئساڤ کئل بوٙأ، شوما ڤاس دئما رأدیارکونی نە د أنجومانامە بئیریت، سی یە کئ حئساڤ شوما راستأکی پوشت راست بوٙأ.",
+       "throttled-mailpassword": "یئ گئل رازینە گوڤاردئن د نۊ زئنە بییە و ئیسئ کئل بییە، د آخئری {{PLURAL:$1|ساعأت|$1 ساعأتیا}}.\nسی نئهاگئری د أذیأت بییئن، فأقأط یئ گئل رازینە گوڤاردئن د أنجومانامە د نۊ زئنە بییە د هأر {{PLURAL:$1|ساعأت|$1 ساعأتیا}} کئل بییە.",
+       "mailerror": "خأطا Ø¯ Ú©Ø¦Ù\84 Ø¨Û\8cÛ\8cئÙ\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95:$1",
+       "acct_creation_throttle_hit": "سئل کاریا ئی ڤیکی تیرنئشوٙن آی پی شوما نە ڤئ کار گئرئتئنە د روٙز دئمایی {{PLURAL:$1|1 حئساڤ|$1 حئساڤیا}} نە رأڤأندیاری کئردئنە، و ڤئ د بیشتأروٙنە صئلا دأئنە د ئی دورە گاتی أنجوم بییە.\nد نأتیجە، سئل کاریایی کئ د ئی تیرنئشوٙن آی پی ڤئ کار گئرئتئنە نئمی توٙنئن حئساڤیا بیشتأری نە د ئی گات دوروس بأکأن.",
+       "emailauthenticated": "تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 ØªÙ\88Ù\99 Ø¯ $2 Ø³Û\8c 3$ Ù¾Ù\88شت Ø±Ø§Ø³Ú©Ø§Ø±Û\8c Ø¨Û\8cÛ\8cÛ\95.",
+       "emailnotauthenticated": "تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ø´Ù\88Ù\85ا ØªØ§ Ø¦Û\8cسئ Ù¾Ù\88شت Ø±Ø§Ø³ Ú©Ø§Ø±Û\8c Ù\86أبÛ\8cÛ\8cÛ\95.\nÙ\87Ø£Ù\86Û\8c Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Û\8cÛ\8c Ø³Û\8c Ø¦Û\8c Ú\86Û\8cا Ú©Ø¦ Ù\87اÙ\86 Ø±Û\8c Ù\86ئÙ\87ا Ú©Ø¦Ù\84 Ù\86أبÛ\8cÛ\8cÛ\95.",
+       "noemailprefs": "یئ گئل تیرنئشوٙن أنجومانامە د چیا نازار شوما سی یە کئ ئی خوصوٙصیأتیا کار بأکأن ئنتئخاڤ بأکیت.",
+       "emailconfirmlink": "تیرنئشوٙن أنجومانامە توٙنە پوشت راسکاری بأکیت",
+       "invalidemailaddress": "تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ù\82Ø£Ú¤Ù\88Ù\99Ù\84 Ø¨Û\8cئÙ\86Û\8c Ù\86Û\8c Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ú\86Û\8c Ø¯ Ú¤Û\8cر Ù\88 Ø¨Ø§Ú¤Ø£Ø± Ù\85Û\8cا Ú©Ø¦ Ú¤Ø¦ Ø´Û\8cÚ¤Û\95 Ø®Ù\88Ù\99Û\8cÛ\8c Ù\86ارÛ\95.\nÙ\84Ù\88Ø·Ù\81 Ø¨Ø£Ú©Û\8cت Û\8cئ Ú¯Ø¦Ù\84 ØªÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ú\86Ù\88Ù\99Ø£ Ø¯Ø§Ø± Ù\86Û\95 Ø¨Ø£Ø²Ø£Ù\86Û\8cت Û\8cا Ø¦Û\8c Ø¬Ø§Ú¯Û\95 Ù\86Û\95 Ø­Ø§Ù\84Û\8c Ø¨Ø£نیت.",
+       "cannotchangeemail": "تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ø­Ø¦Ø³Ø§Ú¤ Ø¯ Ø¦Û\8c Ú¤Û\8cÚ©Û\8c Ø¢Ù\84ئشت Ú©Ø§Ø±Û\8c Ù\86أبÙ\88Ù\99Ø£.",
+       "emaildisabled": "ئÛ\8c Ø¯Û\8cارگÛ\95 Ù\86ئÙ\85Û\8c ØªÙ\88Ù\99Ù\86Û\95 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ú©Ø¦Ù\84 Ø¨Ø£Ú©Û\95.",
+       "accountcreated": "حئساڤ راس بی",
+       "accountcreatedtext": "حئساڤ Ú©Ø§Ø±Û\8cارÛ\8c Ø³Û\8c [[{{ns:کارÛ\8cار}}:$1|$1]] ([[{{ns:کارÛ\8cار Ú\86Ø£Ú© Ú\86ئÙ\86Û\95}}:$1|Ú\86Ø£Ú© Ú\86ئÙ\86Û\95]]) Ø¯Ù\88رÙ\88س Ø¨Û\8cÛ\8cÛ\95.",
+       "createaccount-title": "حئساڤ Ø³Û\8c {{SITENAME}} Ø±Ø§Ø³ Ø¨Û\8c",
+       "createaccount-text": "یئ نأفأر ڤا تیرنئشوٙن أنجومانامە توٙ یئ گئل حساڤ راس کئردە {{SITENAME}} ($4) و ئوسئ نومئشە نیاە \"$2\"، ڤا رازینە گوڤاردئن \"$3\".\nشوما هأمی ئیسئ بایأد روییت ڤامین و ر ازینە گوڤاردئن خوتوٙنە آلئش کاری بأکیت.\n\nأر شوما د ئی پئیغوم ئلتئفات نأکیت، د گات رأڤأندیاری ئی حئساڤ خأطا پیش میا.",
+       "login-throttled": "Ø´Ù\88Ù\85ا ØªØ§ Ø¦Û\8cسئ Ø³Û\8c Ú¤Ø§Ù\85Û\8cÙ\86 Ø¦Ù\88Ù\99Ù\85ائÙ\86 Ù\81ئرÛ\95 ØªØ¦Ù\84اش Ú©Ø¦Ø±Ø¯Û\8cتÛ\95.\n$1 Ù\84Ù\88Ø·Ù\81 Ø¨Ø£Ú©Û\8cت Ø³Û\8c ØªØ¦Ù\84اش Ù\87Ø£Ù\86Û\8c Ú¯Ù\88رÛ\8c Ø¨Ø¦Ø³Û\8cت.",
+       "login-abort-generic": "ڤامین ئوٙمائن توٙ ناخوش سأرنجوم بی- گأن بی",
+       "login-migrated-generic": "حئساڤ Ú©Ø§Ø±Û\8cارÛ\8c Ø´Ù\88Ù\85ا Ø¬Ø§ Ú¤Ø¦ Ø¬Ø§ Ø¨Û\8cÛ\8cÛ\95Ø\8c Ù\88 Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c Ø´Ù\88Ù\85ا Ø¯Û\95 Ø¯ Ø¦Û\8c Ú¤یکی نیئش.",
        "loginlanguagelabel": "زوٙن:$1",
-       "suspicious-userlogout": "درحاست وه در رئتن شما انکار بیه سی یه کل وه نظر میا که د یه گل دووارته نیئر گن یا یه گل پروکسی که ها د ویرگه نهو کل بیه",
-       "createacct-another-realname-tip": "نوم راستکی دل به حائه.\nار شما وه نه نهااماییه بکیت، یه سی هوم نسبت دئن وه کاریار   سی کاریاش وه کار گرته بوئه.",
+       "suspicious-userlogout": "د حاست ڤئ دأر رأتئن شوما تیە پوشی بییە سی یە کئ ڤئ نأظأر یما کئ ڤئ سی یئ گئل دوڤارتە نیأر گأن یا یئ گئل پوروکسی کئ ها د ڤیرگە کأش کئل بییە.",
+       "createacct-another-realname-tip": "نوم راستأکی دئل ڤئ حاییە.\nأر شوما ڤئنە نئها ئمایە بأکیت، یە سی هوم نئسبأت دأئن کاریاری سی کاریاش ڤئ کار گئرئتئ بوٙە.",
        "pt-login": "ڤامین ئوٙمائن",
        "pt-login-button": "ڤامین ئوٙمائن",
-       "pt-createaccount": "يه گل حساو راس بكيد",
-       "pt-userlogout": "د Ø³Ø§Ù\85Ù\88Ù\86Ù\87 Ø¯Ø±Ø§Ù\88مائن",
-       "php-mail-error-unknown": "خطا Ù\86ادÛ\8cار Ù\85Û\8cÙ\86 Ø¢Ù\84شت Ù\88Ù\86 PHP's mail()",
-       "user-mail-no-addy": "سی کل کردن انجومانامه د یه گل انجومانامه بی تیرنشون کنشتگری بیه",
-       "user-mail-no-body": "سی کل کردن انجومانامه وا مینونه حالی یا کؤچک بیئن سی دلیل غیر علقمنی تلاش بکید.",
-       "changepassword": "رازÛ\8cÙ\86Ù\87 Ú¯Ù\88اردÙ\86 Ù\86Ù\87 Ø¢Ù\84شت Ø¨Ù\83Ù\8aت",
-       "resetpass_announce": "سی تموم کردن وا مین اومائن، شما باید یه گل رازینه گواردن هنی وارد بکیتو.",
+       "pt-createaccount": "حئساڤ راس بأکیت",
+       "pt-userlogout": "د Ø³Ø§Ù\85Ù\88Ù\99Ù\86Û\95 Ø¯Ø¦Ø±Ø¦Ù\88Ù\99مائن",
+       "php-mail-error-unknown": "خأطا Ù\86ادÛ\8cار Ø¯ Ø¢Ù\84ئشتگئر PHP's mail()",
+       "user-mail-no-addy": "سی کئل کئردئن أنجومانامە د یئ گئل أنجومانامە بی تیرنئشوٙن أنجومانامه تئلاش بییە.",
+       "user-mail-no-body": "سی کئل کئردئن أنجومانامە ڤا مینوٙنە حالی یا کوچئک بییئن سی دألیل یا غئر مأنطئقی بییئن ڤئ تئلاش بأکیت.",
+       "changepassword": "رارÛ\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ù\86Û\95 Ø¢Ù\84ئشت Ø¨Ø£Ú©Û\8cت",
+       "resetpass_announce": "سی تأموم کئردئن ڤامین ئوٙمائن، شوما بایأد یئ گئل رازینە گوڤاردئن هأنی نە بأزئنیت.",
        "resetpass_text": "<!-- یه گل نیسسه ایچه اضاف بکیت -->",
-       "resetpass_header": "رازینه گواردن حساوتونه آلشت بکید",
-       "oldpassword": "رازینه گواردن قدیمی:",
-       "newpassword": "رازینه گواردن تازه:",
-       "retypenew": "رازینه گواردن تازه نه دوواره انجومیارنیسی :",
-       "resetpass_submit": "رازینه گواردن بنیت و وامین بیایت",
-       "changepassword-success": "رازینه گواردن شما د خوئی آلشت بی",
-       "changepassword-throttled": "Ø´Ù\85ا Ø§Û\8cسÙ\86Û\8c Ù\81رÙ\87 Ø³Û\8c Ù\88اÙ\85Û\8cÙ\86 Ø§Ù\88Ù\85ائÙ\86 ØªÙ\84اش Ú©Ø±Ø¯Û\8cتÙ\87.\n$1 Ù\84Ø·Ù\81Ù\86 Ø³Û\8c ØªÙ\84اش Ù\87Ù\86Û\8c ØµØ¨Ø± Ø¨Ú©Û\8cد",
-       "resetpass_forbidden": "رازینه گواردناتون نتونن آلشت بوئن",
-       "resetpass-no-info": "Ø´Ù\85ا Ø¨Ø§ Ø¨Û\8cاÛ\8cت Ø¯ Ø³Ø§Ù\85Ù\88Ù\86Ù\87 ØªØ§ Ø¯ Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ø¯Ø³Ø±Ø³Û\8c Ø¯Ø§Ø´ØªÙ\88Û\8cت",
-       "resetpass-submit-loggedin": "رازÛ\8cÙ\86Ù\87 Ú¯Ù\88اردÙ\86 Ù\86Ù\87 Ø¢Ù\84شت Ø¨Ù\83Ù\8aت",
+       "resetpass_header": "رازینە گوڤاردئن حئساڤئ توٙنە آلئشت بأکیت",
+       "oldpassword": "رازینە گوڤاردئن دئمایی:",
+       "newpassword": "رازینە گوڤاردئن تازە:",
+       "retypenew": "رازینە گوڤاردئن تازە نئ د نۊ أنجومیارنیسی بأکیت:",
+       "resetpass_submit": "رازینە گوڤاردئن نە بأزئنیت و بیاییت ڤامین",
+       "changepassword-success": "رازینە گوڤاردئن شوما ڤا خوٙیی آلئشت کاری بی!",
+       "changepassword-throttled": "Ø´Ù\88Ù\85ا ØªØ§ Ø¦Û\8cسئ Ø³Û\8c Ú¤Ø§Ù\85Û\8cÙ\86 Ø¦Ù\88Ù\99Ù\85ائÙ\86 Ù\81ئرÛ\95 ØªØ¦Ù\84اش Ú©Ø¦Ø±Ø¯Û\8cتÛ\95.\n$1 Ù\84Ù\88Ø·Ù\81 Ø¨Ø£Ú©Û\8cت Ø³Û\8c ØªØ¦Ù\84اش Ù\87Ø£Ù\86Û\8c Ú¯Ù\88رÛ\8c Ø¨Ø¦Ø³Û\8cت.",
+       "resetpass_forbidden": "نأبوٙە رازینە گوڤاردنیانە آلئشتکاری بأکیت",
+       "resetpass-no-info": "Ø´Ù\88Ù\85ا Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ø¯ Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø¯Ø£Ø³Ø±Ø¦Ø³Û\8c Ø¯Ø§Ø´ØªÙ\88Ù\99Û\8cÛ\8cت Ø¨Ø§Ø³ Ø¨Û\8cاÛ\8cÛ\8cت Ú¤Ø§Ù\85Û\8cÙ\86.",
+       "resetpass-submit-loggedin": "رارÛ\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ù\86Û\95 Ø¢Ù\84ئشت Ø¨Ø£Ú©Û\8cت",
        "resetpass-submit-cancel": "أنجوم شیڤئستئن",
-       "resetpass-wrong-oldpass": "رازینه گواردن تازه یا موقتی نامعتور.\nشات شما ایسنی یا رازینه گواردن خوتونه د خوئی آلشت دئیته یا یه گل رازینه گواردن موقت هنی درحاست دئیته.",
-       "resetpass-recycled": "لطفن رازینه گواردن خوتونه سی چیا تر د رازینه گواردن ایسنی د نو زنه بکیت",
-       "resetpass-temp-emailed": "Ø´Ù\85ا Ù\88ا Û\8cÙ\87 Ú¯Ù\84 Ø±Ø§Ø²Û\8cÙ\86Ù\87 Ù\85Ù\88Ù\82تÛ\8c Ú©Ù\87 Ø§Ù\86جÙ\88Ù\85ا Ú¯Ø± Ø¨Û\8cÙ\87  Ø§Ù\88Ù\85اÛ\8cتÙ\87 Ù\88اÙ\85Û\8cÙ\86.\nسÛ\8c ØªÙ\85Ù\88Ù\85 Ú©Ø±Ø¯Ù\86 Ø§Ù\88Ù\85ائÙ\86 Ù\88اÙ\85Û\8cÙ\86Ø\8c Û\8cÙ\87 Ú¯Ù\84 Ø±Ø§Ø²Û\8cÙ\86Ù\87 Ú¯Ù\88اردÙ\86 Ù\87Ù\86Û\8c Ø¯ Ø§Û\8cÚ\86Ù\87  Ø¬Ø§Ú¯Ø± Ø¨کیت.",
-       "resetpass-temp-password": "رازینه گواردن موقت:",
-       "resetpass-abort-generic": "Ø¢Ù\84شت Ø¯Ø¦Ù\86 Ø±Ø§Ø²Û\8cÙ\86Ù\87 Ú¯Ù\88اردÙ\86 Ù\88ا Û\8cÙ\87 Ú¯Ù\84 Ù\81رÙ\87 Ù¾Ù\88Ø´ Ø®Ø±Ù\88 Ø¨Û\8cÙ\87.",
-       "resetpass-expired": "رازینه گواردن شما منقضی بیه. لطفن یه گل رازینه گواردن هنی سی وامین اومائن جاگری بکیت.",
-       "resetpass-expired-soft": "رازینه گواردن شما منقضی بیه و واس د نو زنه با. لطفن یه گل رازینه هنی انتخاو بکیت، یا سی د نو زنه کردن د نهاتر د ایچه \"{{int:resetpass-submit-cancel}}\" بپورنیت.",
-       "resetpass-validity-soft": "رازینه گواردتون تو معتور نئ:$1\n\nلطفن یه گل رازینه گواردن هنی انتخاو بکیت، یا ری ایچه \"{{int:resetpass-submit-cancel}}\" سی د نو زنه کردن وه د نهاتر بپورنیت.",
-       "passwordreset": "د Ù\86Û\88 Ù\88ارد Ù\83ردÙ\86 Ø±Ø§Ø²Û\8cÙ\86Ù\87 Ú¯Ù\88اردن",
-       "passwordreset-text-one": "اÛ\8c Ù\86Ù\88Ù\85 Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\87 Ø³Û\8c Ú¯Ø±ØªÙ\86 Û\8cÙ\87 Ú¯Ù\84 Ø±Ø§Ø²Û\8cÙ\86Ù\87 Ú¯Ù\88اردÙ\86 Ù\85Ù\88Ù\82تÛ\8c Ù\88ا Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ù¾Ø± Ø¨کیت.",
-       "passwordreset-text-many": "{{PLURAL:$1|یه گل د رشنه گه یا نه سی یه که رازینه گواردن موقتی وا انجومانامه گرته بوئه پر بکیت}}",
-       "passwordreset-disabled": "نو کرد رازینه گواردن د ای ویکی ناکشتگر بیه.",
-       "passwordreset-emaildisabled": "چی یا هنی انجومانامه د ای ویکی ناکشتگر بیه.",
+       "resetpass-wrong-oldpass": "رازینە گوڤاردئن تازە یا موڤأقأتی نادیارە.\nگاسی شوما ئیسئنی یا یا رازینە گوڤاردئن خوتوٙنە د خوٙیی آلئشت دأئیتە یا یئ گئل رازینە گوڤاردئن موڤأقأت هأنی حاستیتە.",
+       "resetpass-recycled": "لوطف بأکیت رازینە گوڤاردئن خوتوٙنە سی چیا هأنی د رازینە گوڤاردئن ئیسئنی د نۊ زئنە بأکیت.",
+       "resetpass-temp-emailed": "Ø´Ù\88Ù\85ا Ú¤Ø§ Û\8cئ Ú¯Ø¦Ù\84 Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ù\85Ù\88ڤأÙ\82أتÛ\8c Ø¦Ù\88Ù\99Ù\85اÛ\8cتÛ\95 Ú¤Ø§Ù\85Û\8cÙ\86.\nسÛ\8c Ø¦Ù\88Ù\99Ù\85ائÙ\86 Ú¤Ø¦ Ø¯Ø£Ø±Ø\8c Û\8cئ Ú¯Ø¦Ù\84 Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ù\87Ø£Ù\86Û\8c Ù\86Û\95 Ø¦Û\8cÚ\86ئ Ø¬Ø§Ú¯Ø¦Ø±(Ù\85Û\8cزÙ\88Ù\99Ù\86کارÛ\8c) Ø¨Ø£کیت.",
+       "resetpass-temp-password": "رازینە گوڤاردئن موڤأقأت:",
+       "resetpass-abort-generic": "Ø¢Ù\84ئشت Ø¯Ø£Ø¦Ù\86 Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ú¤Ø§ Û\8cئ Ú¯Ø¦Ù\84 Ø¯Ø¦Ù\85ادÛ\8cس Ø®Ø¦Ø±Ø§Ú¤ Ø¨Û\8cÛ\8cÛ\95.",
+       "resetpass-expired": "گات دیاری رازینە گوڤاردئن شوما تأموم بییە. لوطف بأکیت یئ گئل رازینە گوڤاردئن هأنی نە سی ڤامین ئوٙمائن میزوٙنکاری بأکیت.",
+       "resetpass-expired-soft": "گات دیاری رازینە گوڤاردئن شوما تأموم بییە و باس د نۊ زئنە با. لوطف بأکیت یئ گئل رازینە گوڤاردئن هأنی نە ئنتئخاڤ بأکیت، یا سی د نۊ زئنە کئردئن د نئهاتئر د ئیچئ \"{{int:resetpass-submit-cancel}}\" بأپوٙرنیت.",
+       "resetpass-validity-soft": "رازینە گوڤاردئن توٙ نادیاره:$1\n\n لوطف بأکیت یئ گئل رازینە گوڤاردئن هأنی نە ئنتئخاڤ بأکیت، یا سی د نۊ زئنە کئردئن د نئهاتئر د ئیچئ \"{{int:resetpass-submit-cancel}}\" بأپوٙرنیت.",
+       "passwordreset": "د Ù\86Û\8a Ø¯Ø£Ø¦Ù\86 Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئن",
+       "passwordreset-text-one": "ئÛ\8c Ù\86Ù\88Ù\85 Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\95 Ø³Û\8c Ú¯Ø¦Ø±Ø¦ØªØ¦Ù\86 Û\8cئ Ú¯Ø¦Ù\84 Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ù\85Ù\88ڤأÙ\82أت Ú¤Ø§ Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 ØªÙ\88Ù\99 Ù¾Ù\88ر Ø¨Ø£کیت.",
+       "passwordreset-text-many": "{{PLURAL:$1|یئ گئل د جاگە یا نە سی گئرئتئن رازینە گوڤاردئن موڤأقأتی نە ڤا أنجومانامە گئرئتە بوٙأ پور بأکیت.}}",
+       "passwordreset-disabled": "نۊ کئردئن رازینە گوڤاردئن د ئی ڤیکی ناکونئشگأر بییە.",
+       "passwordreset-emaildisabled": "چیا هأنی کئ هان د أنجومانامە د ئی ڤیکی ناکونئشتگأر بینە.",
        "passwordreset-username": "نوم کاریاری:",
        "passwordreset-domain": "پوشگئر",
-       "passwordreset-capture": "اÙ\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ù\86تÛ\8cجÙ\87 Ù\86Ù\87 Ø¨Ù\88Û\8cÙ\86Û\8cتÙ\88؟",
-       "passwordreset-capture-help": "ار Ø´Ù\85ا Ø§Û\8c Ø¬Ø¹Ù\88Ù\87 Ù\86Ù\87 Ù\88ارسÛ\8c Ø¨Ú©Û\8cد. Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ù\88 Ø®Ù\88ئÛ\8c Ø§Ù\88سÙ\87 Ú©Ù\87 Ø³Û\8c Ú©Ø§Ø±Û\8cار Ú©Ù\84 Ø¨Û\8cÙ\87 Ø¨Ù\88ئÙ\87 Ø¨Ù\88Û\8cÙ\86Û\8cتش.",
-       "passwordreset-email": "تÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87",
-       "passwordreset-emailtitle": "جزئیات حساو ها د {{نوم مالگه}}",
+       "passwordreset-capture": "Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ù\86أتÛ\8cجÛ\95 Ù\86Û\95 Ø³Ø¦Ù\84 Ø¨Ø£Ú©Û\8cت؟",
+       "passwordreset-capture-help": "أر Ø´Ù\88Ù\85ا Ø¦Û\8c Ø¬Ø£Ú¤Û\95 Ù\86ئ Ú¤Ø§Ø±Ø¦Ø³Û\8c Ø¨Ø£Ú©Û\8cت.Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 (ڤا Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ù\85Ù\88ڤأÙ\82أتÛ\8c) Ø¬Ù\88Ù\99رÛ\8c Ú©Ø¦ Ø³Û\8c Ú©Ø§Ø±Û\8cارÛ\8cا Ù\87Ø£Ù\86Û\8c Ú©Ø¦Ù\84 Ø¨Û\8cÛ\8cÛ\95 Ø¯Û\8cارÛ\8c Ù\85Û\8cÚ©Û\95.",
+       "passwordreset-email": "تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95",
+       "passwordreset-emailtitle": "جوزئیات حئساڤ ها د {{نوم مالگە}}",
        "passwordreset-emailtext-ip": "یه کسی(شات خوتو، وا تیرنشون آی پی $1) سی د نو زنه کردن رازینه گواردن تو د {{SITENAME}}  درحاست کرده($4).\nسی کاریار «$2» یه گل رازینه گواردن موقتی دروس بیه و و هؤمبراور «$3» ئه.\nار تمارزو تو یه بیه ایسه باید بیایت وامین سامونه و یه گل رازینه گواردن هنی بهاییت\nرازینه گواردن شما د طیل {{PLURAL:$5|یه رو|$5 رو}} باطل بوئه.\n\nار کس هنی چنی درحاستی کرده یا یه که شما رازینه گواردن دمایی خوتونه د ویر اوردیت و تر نمیهایت ونه آلشت بیئت، می تونیت د ای پیغوم تیه پوشی بکیت و همو رازینه گواردن دمایی نه وه کار به ونیت.",
        "passwordreset-emailtext-user": "کاریار $1 د {{SITENAME}} د نو زنه کردن رازینه گواردن شمانه د{{SITENAME}} ($4) کرده. {{PLURAL:$3|حساو|حساویا}} کاریاری که هان د هار د وا ای تیرنشون انجومانامه ها د ارتواط:\n\n$2\n\n{{PLURAL:$3|ای رازینه گواردن موقت|ای رازینه گواردنیا موقت}} تا {{PLURAL:$5|یه رو|$5 رو}} باطل بوئه.\nار کس هنی چنی درحاستی کرده یا یه که شما رازینه گواردن دمایی خوتونه د ویر اوردیت و تر نمیهایت ونه آلشت بیئت، می تونیت د ای پیغوم تیه پوشی بکیت و همو رازینه گواردن دمایی نه وه کار به ونیت.",
        "passwordreset-emailelement": "نوم کاریاری: $1\nرازینه گواردن موقتی: $2",
        "resettokens": "تازه کردن نشونه یا",
        "resettokens-text": "شما سی صلا دئن دسرسی وه رسینه یا خصوصی که ها د حساو ایچنی تو می تونیت دیارگریا نه د نو زنه بکیت.\n\nشما اوسنی واس ای کار بکیت که رسینه یا شما سی یه کسی تر بئر بیه یا د حساو شما چل بیه.",
        "resettokens-no-tokens": "هیژ نشونه ای سی تازه کردن نئ.",
-       "resettokens-tokens": "Ù\86Ø´Ù\88Ù\86Ù\87 یا:",
-       "resettokens-token-label": "$1 (ارزشت ØªØ§Ø²Ù\87: $2)",
+       "resettokens-tokens": "Ù\86ئشÙ\88Ù\99Ù\86Û\95 یا:",
+       "resettokens-token-label": "$1 (أرزاÛ\8cئشت ØªØ§Ø²Û\95: $2)",
        "resettokens-watchlist-token": "دیارگر سی حردنی تورگه(اتم/آر اس اس) سی [[ویجه:سیل برگ|آلشت دئن بلگه یا د سیل برگتو]]",
        "resettokens-done": "نشونه یا تازه بیه.",
        "resettokens-resetbutton": "نشونه یا انتخاو بیه تازه بوئن",
        "bold_tip": "نیسسه توپر بيه",
        "italic_sample": "نیسسه كج كوله",
        "italic_tip": "نیسسه كج كوله",
-       "link_sample": "داسÙ\88Ù\86 Ù\87Ù\88Ù\85 Ù¾Û\8cÙ\88ند",
-       "link_tip": "هوم پیوند مینجایی",
+       "link_sample": "داسÙ\88Ù\99Ù\86 Ù\87Ù\88Ù\85 Ù¾Ø¦Û\8cڤأند",
+       "link_tip": "هوم پئیڤأند مینجایی",
        "extlink_sample": "http://www.example.com داسون هوم پیوند",
        "extlink_tip": "هوم پیوند خارجی(د ویر داشتو)",
        "headline_sample": "سرخط نیسسه",
        "nowiki_sample": "د ایچه یه گل نیسسه بی شلک وارد بکید",
        "nowiki_tip": "شلک ویکی نه ندید بگر",
        "image_sample": "Example.jpg",
-       "image_tip": "جاÙ\86Û\8cا Ú\86ار Ù\82ر Ú¯Ø±ØªÙ\87",
+       "image_tip": "جاÙ\86Û\8cا Ú\86ار Ù\82ئر Ú¯Ø¦Ø±Ø¦ØªÛ\95",
        "media_sample": "Example.ogg",
-       "media_tip": "جانیا هوم پیوند",
-       "sig_tip": "اÙ\85ضا Ø´Ù\85ا Ù\88ا گاتدیس",
-       "hr_tip": "خط Ø¢Ø³Ù\88 Ù\88Ù\86Ù\87(سÙ\88ا Ø³Ù\88ا Ù\88Ù\87 Ú©Ø§Ø± Ø¨Û\8cئرشÙ\88)",
-       "summary": "چكسته",
-       "subject": "موضو/سر خط:",
-       "minoredit": "يه ويرايشت كؤچكيه",
-       "watchthis": "ديئن ای بلگه",
-       "savearticle": "اÙ\85اÛ\8cÛ\8cÙ\87 Ú©Ø±Ø¯Ù\86 Ø¨Ù\84Ú¯Ù\87",
-       "preview": "پيش سيل",
-       "showpreview": "Ù¾Ù\8aØ´ Ø³Û\8cÙ\84 Ù\86Ø´Ù\88Ù\86 Ø¨Ù\8aئÙ\87",
-       "showdiff": "آلشتيانه نشون بيئه",
+       "media_tip": "جانیا هوم پئیڤأند",
+       "sig_tip": "ئÙ\85ضا Ø´Ù\88Ù\85ا Ú¤ا گاتدیس",
+       "hr_tip": "خأط Ø¢Ø³Ù\88Ù\99 Ú¤Ø£Ù\86Û\95(جئگا Ø¬Ø¦Ú¯Ø§ Ú¤Ø¦ Ú©Ø§Ø± Ú¯Ø¦Ø±Ø¦ØªØ¦Ù\86)",
+       "summary": "چئکئسە",
+       "subject": "ذاسوٙن/سأرتال:",
+       "minoredit": "یە یئ گئل ڤیرایئشت کوچئکە",
+       "watchthis": "دیئن ئی بألگە",
+       "savearticle": "ئÙ\85اÛ\8cÛ\95 Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Ø¨Ø£Ù\84Ú¯Û\95",
+       "preview": "پيش سئيل",
+       "showpreview": "Ù\86ئشÙ\88Ù\99 Ø¯Ø£Ø¦Ù\86 Ù¾Û\8cØ´ Ø³Ø¦Û\8cÙ\84",
+       "showdiff": "نئشوٙ دأئن آلئشت کاریا",
        "blankarticle": "<strong>زنئار:</strong> بلگه ای که شما دروس کردیته حالیه.\nار شما د نو ری \"{{int:savearticle}}\" بپورنیت, بلگه وه شکل که هیچ مینونه ای دش نبا دروس بوئه.",
        "anoneditwarning": "<strong>زئنار:</strong> شما هنی نیوماته وامین. تیرنشون آی پی شما هر گاتی که آلشتی راس بکیت سی کل خلک دیاره. ار <strong>[$1 روئیت وامین]</strong> یا <strong>[$2 یه گل حساو کاریاری راس بکیت]</strong>، ویرایشتیا شما وه نوم کاریاری خوتون دیاری می که، و وا چیا بیتر هنی.",
        "anonpreviewwarning": "<em>شما نیومائته وامین. تیرنشون آی پی شما د ویرگار ویرایشت ای بلگه اماییه بوئه.</em>",
        "selfredirect": "<strong>هشدار:</strong> شما د حال و بار آلشت دئن لا بلگه وه خوش هیئن.\nشایت دال اشتوایی سی آلشت دئن لا نه انتخاو کردیته، یا شایت بلگه نه اشتوایی ویرایشت می کیت.\n\nار ری \"{{int:savearticle}}\" دوبار بپورنیت، آلشت دئن لا دروس بوئه.",
        "missingcommenttext": "لطفن د ایچه ویر و باور بیئتو",
        "missingcommentheader": "<strong>د ویر ونا:</strong> شما هنی یه گل موضوع/سرخط سی ای ویر و باور نها اماییه نکردیته.\nار شما د نو د ری\"{{int:savearticle}}\" بپورنیت, ویرایشت شما حالی اماییه بوئه.",
-       "summary-preview": "چکسته پیش سیل:",
+       "summary-preview": "چئکئسە پیش سئیل:",
        "subject-preview": "پیش سیل موضو سرخط",
        "previewerrortext": "یه گل خطا د گاتی که شما میهاستیت یه گل پیش سیل د آلشتیاتو داشتوین پیش اومائه.",
        "blockedtitle": "کاریار نهاگری بیه",
        "confirmedittext": "شما واس دما ویرایشت کردن بلگه یا تیرنشون انجومانامه تونه پشت راس بکیت.\nلطفا یه گل تیرنشون خو سی [[Special:اولویتیا|اولویتیا کاریار]] بنیت.",
        "nosuchsectiontitle": "نبوئه بشخ پیدا بوئه",
        "nosuchsectiontext": "شما سی ویرایشت کردن جایی که وجود ناره تلاش کردیته.\nشات وه اوسه که شما بلگه نه می دیئته جا وه جا بیه یا پاکسا بیه.",
-       "loginreqtitle": "وامین اومائن لازمه",
-       "loginreqlink": "وا مین اومائن",
+       "loginreqtitle": "ڤامین ئوٙمائن لازئمە",
+       "loginreqlink": "ڤامین ئوٙمائن",
        "loginreqpagetext": "$1 لطف بکید بلگه یا هنی نه بوینیت",
-       "accmailtitle": "رازینه گواردن کل بی",
+       "accmailtitle": "رازینە گوڤاردئن کئل بی",
        "accmailtext": "یه گل رازینه گواردن شامسکی سی[[چک چنه کاریار:$1|$1]] سی $2 کل بیه.بوئه وه نه د گات وه کار بستن بلگه اومائن وامین د <em>[[Special:آلشت دئن رازینه گواردن|آلشت دئن رازینه گواردن]]</em>  آلشت دئه بوئه.",
-       "newarticle": "تازه",
+       "newarticle": "تازە",
        "newarticletext": "شما وادما هوم پیوندی هئیت که وجود ناره.\nسی راس کردن بلگه.شرو د نیسنن مئن جعوه هاری بکید(سیل[$1 ] سی دونسمنی بیشتر بکید).\nار شما سی اشتوا کردن هایئن ایچه، دگمه وادما رئتن دوارته نیئر تونه بپورنیت.",
        "anontalkpagetext": "----",
        "noarticletext": "د تازه یا د ای بلگه نیسسه نی.\nشما می تونیت د[[Special:Search/{{PAGENAME}}|بگردید]] د ای بلگه یا د بلگیا هنی یا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} د هنی پی جوری بوئه]</span>، <span class=\"plainlinks\">[{{fullurl:{{FULLPAGENAME}}|action=edit}} یای ای بلگه نه ویرایشت بکید]</span>.",
        "sitejspreview": "<strong>د ویر داشتوئیت که شما فقط می تونیت ای ای جاوا اسکریپت نه فقط پیش سیل بکیت. وه د ایسنی هنی اماییه نبیه!</strong>",
        "userinvalidcssjstitle": "<strong>زئنار:</strong> پوسه \"$1\" نیئش.\nسی اس اس جاونه و بلگه یا جاوا اسکریپت  سرون وا حرف کؤچک نه وه کار بسته، همچنو{{ns:کاریار}}:فو/وکتور.سی اس اس چی د ضد{{ns:کاریار}}:فو/وکتور. سی اس اسه.",
        "updated": "(تازه بيه)",
-       "note": "'''نيسنن:'''",
+       "note": "'''نیسأنئن:'''",
        "previewnote": "فقط ای پیش سیل د ویرتو با.\nآلشتیاتو هنی اماییه نبیه.",
        "continue-editing": "رو د راساگه ویرایشت",
        "previewconflict": "ورگشت پیش سیل د نیسسه د راساگه وارو ویرایشت چی شکل دیار بیین بوئه ار شما وه نه سی اماییه کردن انتخاو بکیت.",
        "session_fail_preview_html": "<strong>د بدبختی ما سی یه که رسینه یا جلسه مونه د دس دئیمه نمی تونیم کار پردازشت ویرایشت شمانه انجوم بیئمو.</strong>\nلطفن هنی تلاش بکیت.\n\n<em>سی یه که {{نوم دیارگه}} یه گل ردیف اچ تی ام ال کنشتگر بیه داره، پیش سیل سی یه که د دس حمله یا جاوا اسکریپ د امون با قام کرده بیه..</em>\n\n<strong>ار وه گات قانونی تلاش سی ویرایشته،لطفا د نو تلاش بکیت.</strong>\nار هنی کار وه دروس کار نکرد،[[Special:UserLogout|اومائن وه در]] نه ازمایشت بکیت و د نو بیایت وامین.",
        "token_suffix_mismatch": "<strong>ویرایشتیا شما سی یه که دووارته نئر شما نیسسه یا نقطه نیائن نه د رازینه امنیتی ویرایشت د یک تیچسه.</strong>\nویرایشت سی یه که د خراو بیئن نیسسه بلگه نهاگری با رد بیه.\nای رخ ون د گاتیایی پیش میا که شما د یه گل رسینه جا پروکسی استفاده می کیت.",
        "edit_form_incomplete": "<strong>پاره ای د ویرایشتا وه رسینه جا نمی رسن، هنی وارسی بکیت سی یه که بوینیت ویرایشتیا شما خوئه و هنی تلاش بکیت .</strong>",
-       "editing": "د حال و بال ويرايشت$1",
-       "creating": "راس كردن $1",
-       "editingsection": "د حال و بال ویرایشت$1(بشخ)",
-       "editingcomment": "د حال و بال ویرایشت$1(بهرجا تازه)",
-       "editconflict": "تضاد Ø¯ Ù\88Û\8cراÛ\8cشت:$1",
+       "editing": "د حال و بال ڤیرایئشت $1",
+       "creating": "راس کئردئن $1",
+       "editingsection": "د حال و بال ڤیرایئشت $1 (بأرجا$1)",
+       "editingcomment": "د حال و بال ڤیرایئشت $1 (بأرجا تازە)",
+       "editconflict": "رÛ\8c Ú¤Ø¦ Ø±Û\8c Ú©Ø§Ø±Û\8c Ø¯ Ú¤Û\8cراÛ\8cئشت: $1",
        "explainconflict": "داوسه که شما شرو د ویرایشت ای بلگه کردیته، یه نفر هنی ای بلگه نه آلشت دئه.\nراساگه وارو نیسسه بلگه نیسسه نه چی یه که وجود داشتوه د ور میئره.\nآلشتیا شما د نیسسه هاری نشو دئه هئ.\nشما با آلشتیاتونه د نیسسه که هئش یکی بکید.\nفقط متنی که ها د رو د گاتی که شما\"{{رقم:اماییه کاری گوتار}}\" نه گزارشت می کید اماییه بوئه",
-       "yourtext": "Ù\86Û\8cسسÙ\87 Ø´ما",
-       "storedversion": "دوواره دیئن انبار بیه.",
+       "yourtext": "Ù\86Û\8cسئسÛ\95 Ø´Ù\88ما",
+       "storedversion": "ڤانئیأری ئمایە بییە",
        "nonunicodebrowser": "<strong>زئنار:دووارته نئر شما وا نیسسه یا یونیکد سازگاری ناره.</strong>\nیه گل راحل وه کار گرته بیه سی یه که شما بلگه یا نه وا امنیت ویرایشت بکیت:\nنیسه یا غیر-ASCII  د پایه رازینه یا 16 تایی دتو نشو دئه بوئه.",
        "editingold": "<strong>زئنار:شما داریت یه گل وانئری نا به هنگوم بیه نه سی ای بلگه ویرایشت می کید</strong>\nار شما ونه اماییه بکیت،هر آلشتی که د اول سی ای وانئری انجوم بیه گم بوئه.",
-       "yourdiff": "Ù\81رخÙ\8aا",
+       "yourdiff": "Ù\81أرخÛ\8cا",
        "copyrightwarning": "لطفن د ویرتو با که ایچه فرض بوئه که همه هومیاریا شما وا{{SITENAME}} د شکل «$2» درتیچ بوئن(سی چیا تر روئیت وه $1).\nار نمیهایت که که نیسسه یاتو که فره ویرایشت بینه و دلحا درتیچ بان، د ایچه کلشو نکیت.<br />\nهمچنو شما داریت وه ایما قول میئیت که خوتو ونونن نویسنیته، یا ونه د یه گل سرچشمه آزاد وا بئرکرد همگونی یا چی وه ؤرداشتیته.\n'''کاریایی که حق درتیچسن (copyright) دارن بی صلا کل نکیت!'''",
        "copyrightwarning2": "لطفن د ویرتو با که ایچه فرض بوئه که همه هومیاریا شما وا{{SITENAME}} د شکل «$2» درتیچ بوئن(سی چیا تر روئیت وه $1).\nار نمیهایت که که نیسسه یاتو که فره ویرایشت بینه و دلحا درتیچ بان، د ایچه کلشو نکیت.<br />\nهمچنو شما داریت وه ایما قول میئیت که خوتو ونونن نویسنیته، یا ونه د یه گل سرچشمه آزاد وا بئرکرد همگونی یا چی وه ؤرداشتیته.\n'''کاریایی که حق درتیچسن (copyright) دارن بی صلا کل نکیت!'''",
        "longpageerror": "<strong>خطا:نیسسه شما  {{PLURAL:$1|یه کلوبایت|$1 کلوبایت}}  درازی نه دئه، که ونو د بیشرونه انازه{{PLURAL:$2|یه کلوبایت|$2 کلوبایت}} گپترن.</strong>\nنبوئه وه اماییه با.",
        "templatesused": "{{PLURAL:$1|چوئه|چوئه یا}} د ای بلگه وه کار گرته بیه:",
        "templatesusedpreview": "{{PLURAL:$1|چوئه|چوئه یا}}استفاده بیه د ای پیش سیل:",
        "templatesusedsection": "{{PLURAL:$1|چوئه|چوئه یا}} وه کار گرته بیه د ای بخش:",
-       "template-protected": "(پر Ù\88 Ù¾Û\8cÙ\85 Ø¨Ù\8aÙ\87)",
-       "template-semiprotected": "نصم و نیمه پر و پیم بیه",
+       "template-protected": "(پأر Ù\88 Ù¾Û\8cÙ\85 Ø¨Û\8cÛ\8cÛ\95)",
+       "template-semiprotected": "(نئصم و نیمە پأر و پیم بییە)",
        "hiddencategories": "ای بلگه يه اندوم د{{PLURAL:$1|1 hidden category|$1 hidden categories}}: هئ",
        "edittools-upload": "-",
        "nocreatetext": "{{نوم مالگه}} سی راس کردن بلگه یا تازه محدود بیه.\nشما تونید روئیت وادما و بلگه ای که هئیش ویرایشت بکید ، یا [[ویجه:وامین اومائن کاریار|بیایت وامین یا یه گل حساو بسازیت]].",
-       "nocreate-loggedin": "Ø´Ù\85ا Ø­Ù\82 Ù\86ارÛ\8cت  Ú©Ù\87 Ø¨Ù\84Ú¯Ù\87 Û\8cا ØªØ§Ø²Ù\87 Ù\86Ù\87 Ø±Ø§Ø³ Ø¨Ú©Û\8cد.",
+       "nocreate-loggedin": "Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Ø±Ø§Ø³ Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 ØªØ§Ø²Û\95 Ù\86Û\95 Ù\86ارÛ\8cت.",
        "sectioneditnotsupported-title": "ویرایشت بهرجا حامین داری نبوئه",
-       "sectioneditnotsupported-text": "ویرایشت بهرجایی د ای بلگه نئیش.",
+       "sectioneditnotsupported-text": "ڤیرایئشت بأرجایی د ئی بألگە نیئش.",
        "permissionserrors": "خطا اجازه دئین",
        "permissionserrorstext": "شما حق ناریت ونه انجوم بیئت, سی{{PLURAL:$1|دلیل|دلیلیا}} نهایی:",
        "permissionserrorstext-withaction": "شما سی $2 اجازه ناریت\nسی نهاگری {{PLURAL:$1|دلیل|دلیلیا}}:",
        "recreate-moveddeleted-warn": "'''زنهار شما بلگه ای که وادما پاکسا بیه هنی راس کردیته'''\nشما باید دونسه بایت که آیا هنی سی نها گرتن ویرایشت ای بلگه خوئه.\nپاکسا بیئن و جمشت سی ای بلگه سی فراغتتو آماده بیه:",
        "moveddeleted-notice": "ای بلگه پاکسا بیه.\nپاکسا بین و جمشت ای بلگه سی سرچشمه دئین آماده بیه",
-       "log-fulllog": "دیئن همه پهرستنومه یا",
+       "log-fulllog": "دیئن هأمە پئهئرستنوٙمە یا",
        "edit-hook-aborted": "ویرایشت وا قلاو نهاگری بیه.\nهیچ توضیئ سیش نئ.",
        "edit-gone-missing": "نبوئه ای بلگه نه وه هنگوم بکیت.\nوه نظر میا که وه پاکسا بیه.",
-       "edit-conflict": "مخالفت نه ویرایشت بکید",
+       "edit-conflict": "ری ڤئ ری کاری د ڤیرایئشت.",
        "edit-no-change": "سی یه که آلشتیا د یه گل نیسسه دروس بیه د ویرایشت شما تیه پوشی بیه.",
-       "postedit-confirmation-created": "بلگه دروس بیه.",
-       "postedit-confirmation-restored": "بلگه د نو اماییه بیه.",
-       "postedit-confirmation-saved": "ویرایشتتو اماییه بی",
+       "postedit-confirmation-created": "بألگە دوروس بییە.",
+       "postedit-confirmation-restored": "بألگە د نۊ ئمایە بییە.",
+       "postedit-confirmation-saved": "ڤیرایئشتئتوٙ ئمایە بی.",
        "edit-already-exists": "نبوئه یه گل بلگه تازه راس بکید.\nوه هئیش.",
        "defaultmessagetext": "نیسسه پیغوم پیش فرض",
        "content-failed-to-parse": "د یک تیچیسن چیا مئن $2 د مدل $1:$3",
        "currentrev-asof": "آخري وانئری چی $1",
        "revisionasof": "دوواره ديئن $1",
        "revision-info": "دوواره سیل بیه چی $1 وا $2",
-       "previousrevision": "اصلاح دمايی",
-       "nextrevision": "تازه تری وانئری",
-       "currentrevisionlink": "آخرÛ\8c Ù\88اÙ\86ئری",
-       "cur": "تازه باو",
-       "next": "نيایی",
-       "last": "دمايی",
-       "page_first": "اÙ\88لی",
-       "page_last": "آخر",
+       "previousrevision": "ڤانئیأری دئمایی←",
+       "nextrevision": "ڤانئیأری تازە تئر",
+       "currentrevisionlink": "آخئرÛ\8c Ú¤Ø§Ù\86ئÛ\8cØ£ری",
+       "cur": "تازە باڤ",
+       "next": "نئهایی",
+       "last": "دئمایی",
+       "page_first": "أڤئلی",
+       "page_last": "آخئر",
        "histlegend": "انتخاو فرخدار:جعویا رادیو نه سی دوواره دیئن و وارسی نشو دار بکید و یا ری رئتن کلیک بکید .<br />\nشرح نوشته: '''({{int:cur}})''' = وا آخری دوواره دیئن فرخ داره '''({{ int:last}})'''= وا دواره دیئن انجوم دئنی فرخ داره  '''{{int:minoreditletter}}''' =ویرایشت کؤچک.",
        "history-fieldset-title": "ویرگار دوارته نیئری",
        "history-show-deleted": "فقط پاكسا بيه",
        "rev-deleted-diff-view": "وانئری ای بلگه <strong>پاکسا بیه</strong>.\nجزئیات هان د  [{{fullurl:{{#Special:Log}}/پاکسا کردن|بلگه={{نوم کامل بلگه}}}} پهرستنومه پاکساکردن].",
        "rev-suppressed-diff-view": "وانئری بلگه <strong>پاکساگری</strong>.\nجزئیات هان د  [{{fullurl:{{#Special:Log}}/پاکساگری کردن|بلگه={{نوم کامل بلگه}}}} پهرستنومه پاکساگری کردن].",
        "rev-delundel": "آلشت حال و بال ديئن",
-       "rev-showdeleted": "Ù\86Ø´Ù\88 Ø¯ئن",
+       "rev-showdeleted": "Ù\86ئشÙ\88Ù\99 Ø¯Ø£ئن",
        "revisiondelete": "پاکسا کردن/زنه کردن وانئریا",
        "revdelete-nooldid-title": "وانیری تمارزی بیه نامعتوره",
        "revdelete-nooldid-text": "شما وانئریا حاسنی نه سی انجوم دئن ای کار ره ون تیاری نکردیته، یا وانئریا تیارگر بیه وجود نارن، یا یه که شما میهایت وانئری ایسنی نه قام بکیت.",
        "revdelete-no-file": "جانیا تیار بیه وجود ناره.",
        "revdelete-show-file-confirm": "شما د دل میهایت که وانئری پاکسا بیه ای جانیا نه بونیت \"<nowiki>$1</nowiki>\" د $2 تا $3؟",
-       "revdelete-show-file-submit": "هری",
+       "revdelete-show-file-submit": "Ù\87أرÛ\8c",
        "revdelete-selected-text": "{{PLURAL:$1|وانیری گل گر بیه|وانیری گل گر بیه}} د [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|وانیری گل گر بیه|وانیری گل گر بیه}} د [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|پهرستنومه رخ ونیا انتخاو بیه|پهرستنومه رخ ونیا انتخاو بیه}}:",
        "revdelete-radio-unset": "دیینی",
        "revdelete-suppress": "پاکساگری کردن رسینه یا سی دیوونداریا و کسونا تر",
        "revdelete-unsuppress": "محدودیتیانه د وانیریا امباربیه جا وه جا بکید",
-       "revdelete-log": "دلیل:",
+       "revdelete-log": "دألیل:",
        "revdelete-submit": "سی {{PLURAL:$1|وانیری|وانیریا}} انتخاو بیه وه کار بوریتو",
        "revdelete-success": "'''دیئن وانیری وه خوئی وه هنگوم بی.'''",
        "revdelete-failure": "'''دیئن وانیری وه خوئی وه هنگوم نبی:'''$1",
        "logdelete-success": "پهرستنومه دیار بیین د خوئی میزونکاری بی.",
        "logdelete-failure": "پهرستنومه دیار بیین نبوئه میزونکاری با. $1",
        "revdel-restore": "آلشت حال و بال ديئن",
-       "pagehist": "ويرگار بلگه",
-       "deletedhist": "ویرگار پاکسا بیه",
+       "pagehist": "ڤیرگار بألگە",
+       "deletedhist": "ڤیرگار پاکسا بییە",
        "revdelete-hide-current": "خطا د قام کردن چی که ها د ویرگار $2 ساعت $1: ای نسقه، نسقه ایسنی یه و نبوئه نهوش بکیت.",
        "revdelete-show-no-access": "خطا د قام کردن چیی که ها د ویرگار $2 ساعت $1: ای نسقه نشون «مئن تنگلا بیئن» داره و شما نمی تونیت وه ش دسرسی داشتویت.",
        "revdelete-modify-no-access": "خطا د قام کردن چیی که ها د ویرگار $2 ساعت $1: ای نسقه نشون «مئن تنگلا بیئن» داره و شما نمی تونیت وه ش دسرسی داشتویت.",
        "mergehistory-autocomment": " [[:$1]]وا[[:$2]] یکی بیه",
        "mergehistory-comment": " [[:$1]]وا[[:$2]] یکی بیه:$3",
        "mergehistory-same-destination": "سرچشمه و بلگه یا مقصد نبوئه یکی بوئن",
-       "mergehistory-reason": "دليل:",
+       "mergehistory-reason": "دأليل:",
        "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
        "mergelog": "سریک سازی پهرستنومه",
        "revertmerge": "بی لوئه",
        "prefs-edits": "شماره ویرایشتا:",
        "prefsnologintext2": "لطف بکیت بیایت وامین و ترجیحات خوتونه آلشت بئیت.",
        "prefs-skin": "پوس",
-       "skin-preview": "پیش سیل",
+       "skin-preview": "پیش سئیل",
        "datedefault": "هیچ ترجیحات دش نئ",
        "prefs-labs": "گزینشتیا ازماشتی",
-       "prefs-user-pages": "بلگه یا کاریار",
-       "prefs-personal": "پروفایل کاریار",
-       "prefs-rc": "Ø¢Ù\84شتÛ\8cا ØªØ§Ø²Ù\87 Ø¨Ø§Ù\88",
-       "prefs-watchlist": "سیل برگ",
-       "prefs-editwatchlist": "ویرایشت سیل برگ",
+       "prefs-user-pages": "بألگە کاریار",
+       "prefs-personal": "پوروفایل کاریار",
+       "prefs-rc": "Ø¢Ù\84ئشتÛ\8cا Ø¦Û\8cسئÙ\86Û\8c",
+       "prefs-watchlist": "سئیل بأرگ",
+       "prefs-editwatchlist": "ڤیرایئشت سئیل بأرگ",
        "prefs-editwatchlist-label": "داده یا نه د سیل برگ خوتو ویرایشت بکیت:",
        "prefs-editwatchlist-edit": "داسونانه سیل بکیت و ونونه د سیل برگ خوتو ورداریت",
        "prefs-editwatchlist-raw": "ویرایشت ردیفی سیل برگ",
        "prefs-rendering": "شلک و ری",
        "saveprefs": "اماییه كردن",
        "restoreprefs": "د نو زنه کردن همه میزونکاریا پیش فرض(د همه جایا)",
-       "prefs-editing": "د حال و بال ویرایشت",
+       "prefs-editing": "د حال و بال ڤیرایئشت",
        "rows": "رديفيا:",
        "columns": "ستينا:",
        "searchresultshead": "پی جوری",
        "timezoneregion-indian": "جهوناو هند",
        "timezoneregion-pacific": "جهوناو آروم",
        "allowemail": "انجومانامه نه سی کاریاریا هنی کنشتگر کو",
-       "prefs-searchoptions": "پی جوری",
+       "prefs-searchoptions": "پئی جوٙری",
        "prefs-namespaces": "نوم جایا",
        "default": "پيش فرض",
        "prefs-files": "جانیایا",
        "prefs-common-css-js": " سی اس اس/جاوا اسکریپت بهر بیه سی همه پوسه یا:",
        "prefs-reset-intro": "شما می تونیت ای بلگه سی د نو زنه کردن ترجیحات خوت وه شکل تیارگه پیش فرض وه کار بوونیت.\nیه ورئشت پذیر نئ.",
        "prefs-emailconfirm-label": "پش راست کردن انجومانامه:",
-       "youremail": "اÙ\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87:",
+       "youremail": "Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95:",
        "username": "{{GENDER:$1|نوم کاریاری}}:",
        "prefs-memberingroups": "{{GENDER:$2|اندوم}}  {{PLURAL:$1|گرویا|گرویا}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "گات ثوت نام:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "نوم راستكی:",
-       "yourlanguage": "زون:",
+       "yourlanguage": "زÙ\88Ù\99Ù\86:",
        "yourvariant": "مینونه آلشتگر زون:",
        "prefs-help-variant": "قسه وری انتخاوی شما سی نمائشت مینونه بلگه یا د ای ویکی.",
        "yournick": "امضا تازه:",
        "gender-male": "وه(پیا) بلگه یا ویکی نه ویرایشت می که",
        "gender-female": "وه(زئنه)بلگه یا ویکی نه ویرایشت می که",
        "prefs-help-gender": "انجوم دئن ای میزونکاری دل به هاییه.\nنرم افزار سی هشاره درست وه جنسیت و گوتن شما سی کسونا تر د شکل درست وه کار بسن یه گل دستور زون یه نه وه کار می بنه.\nای دونسمنیا سی کل خلک دیارن.",
-       "email": "اÙ\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87",
+       "email": "Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95",
        "prefs-help-realname": "نوم راستکی دل به حائه.\nار شما ونه وارد بکیت د گات واگردونی وه آرنگیاتو و نسوت دئن ونو وه خوتو نوم راستکی وه کار گرته بوئه.",
        "prefs-help-email": "تیرنشون ایمیل دل بهاییه.اما سی وایافت رازینه گواردن دش میهایتش.شما باید رازینه گواردنتونه د ویر بوریت",
        "prefs-help-email-others": "شما می تونید سی پیوند گرتن تو وا نهایین انجومانامه مین یه هوم پیوند د بلگه کاریاری یا بلگه چک چنه تو انتخاو بکید.تیرنشون انجومانامه تونه د گاتی که کاریاریا هنی وا تو پیوند می گرن دیار نی.",
        "prefs-help-email-required": "تیرنشون انجومانامه واس با.",
        "prefs-info": "دونسمنیا اولیه",
        "prefs-i18n": "جهون ولاتمنی",
-       "prefs-signature": "امضا",
+       "prefs-signature": "ئمضا",
        "prefs-dateformat": "شلک گات",
        "prefs-timeoffset": "جا وه جایی گاتی",
        "prefs-advancedediting": "گزینه یا خلکمنی",
        "prefs-editor": "ويرايشتگر",
-       "prefs-preview": "پیش سیل",
+       "prefs-preview": "پیش سئیل",
        "prefs-advancedrc": "گزینه یا پیشکرده",
        "prefs-advancedrendering": "گزینه یا پیشکرده",
        "prefs-advancedsearchoptions": "گزینه یا پیشکرده",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "تعارض دسرسیا کاریاری! لطف بکیت یه گل وارسی انجوم بئیت و آلشتانه پشت راس بکیت.",
        "userrights-removed-self": "شما د خوئی حقوق خوتونه ؤرداشتیته، چی یه که مثلا شما تر نمی تونیت وه ای بلگه دسرسی داشتویت.",
-       "group": "گرو",
+       "group": "جأرغە",
        "group-user": "کاریاریا",
-       "group-autoconfirmed": "کاریاریا خود پش راست بیه",
-       "group-bot": "بتیا",
-       "group-sysop": "دÛ\8cÙ\88Ù\88Ù\86داریا",
+       "group-autoconfirmed": "کاریاریا خود پوشت راس بییە",
+       "group-bot": "بوتیا",
+       "group-sysop": "سأردÛ\8cÚ¤Ù\88Ù\99Ù\86Ú©اریا",
        "group-bureaucrat": "بروکراتیا",
-       "group-suppress": "تیه پایا",
-       "group-all": "(همه)",
+       "group-suppress": "تیە پایا",
+       "group-all": "(هأمە)",
        "group-user-member": "{{GENDER:$1|کاریار}}",
        "group-autoconfirmed-member": "{{GENDER:$1|کاریار خودانجومکار}}",
        "group-bot-member": "{{حنس:$1|بوت}}",
        "linksearch-pat": "سازه یار پی جوری:",
        "linksearch-ns": "نوم جا:",
        "linksearch-ok": "پی جوری",
-       "linksearch-text": "نشونه یا چی «‎*.wikipedia.org» نم بوئه وه کار گرت.\nد کمترونه یه گل پوشگر ریتراز وارو، .\"*.org\" میها.<br />\n{{PLURAL:$2|پروتکل|پروتکل یا}} بی حامین: <code>$1</code> (پیش حاست سی http:// د حال وباری که پروتکل میزوکاری نبیه با).",
+       "linksearch-text": "نشونه یا چی «‎*.wikipedia.org» نم بوئه وه کار گرت.\nد کمترونه یه گل پوشگر ریتراز وارو، .\"*.org\" میها.<br />\n{{PLURAL:$2|پروتکل|پروتکل یا}} بی حامین: $1 (پیش حاست سی http:// د حال وباری که پروتکل میزوکاری نبیه با).",
        "linksearch-line": "$1 داره د $2 هوم پیوند بوئه",
        "linksearch-error": "نشونه یا فقط د اول نوم مئموندار اینترنتی می تونن وه کار گرته بان.",
        "listusersfrom": "کاریاریایی که د شرو بینه نشو بیه:",
index 9c6bc6f..ad82920 100644 (file)
        "protectedinterface": "Šiame puslapyje yra apsaugotas nuo piktnaudžiavimo programinės įrangos sąsajos tekstas. Norėdami pridėti ar pakeisti vertimus visose wiki, naudokite [//translatewiki.net/ translatewiki.net] MediaWiki vertimų projektą.",
        "editinginterface": "'''Dėmesio:''' Jūs redaguojate puslapį, kuris yra naudojamas programinės įrangos sąsajos tekste. Pakeitimai šiame puslapyje taip pat pakeis naudotojo sąsajos išvaizdą ir kitiems naudotojams šiame wiki.",
        "translateinterface": "Kad pridėtumėte vertimus visoms wiki, naudokitės  [//translatewiki.net/ translatewiki.net] – projektu, skirtu MediaWiki vertimams į vietines kalbas.",
-       "cascadeprotected": "Šis puslapis buvo apsaugotas nuo redagavimo, kadangi jis yra įtrauktas į {{PLURAL:$1|šį puslapį, apsaugotą|šiuos puslapius, apsaugotus}} „pakopinės apsaugos“ pasirinktimi:\n$2",
+       "cascadeprotected": "Šis puslapis buvo apsaugotas nuo redagavimo, kadangi jis yra įtrauktas į {{PLURAL:$1|šį puslapį, kuris yra apsaugotas|šiuos puslapius, kurie yra apsaugoti}} su „pakopinės apsaugos“ parinktimi:\n$2",
        "namespaceprotected": "Jūs neturite teisės redaguoti puslapių '''$1''' srityje.",
        "customcssprotected": "Jūs neturite teisės keisti šį CSS puslapį, nes jame yra kito naudotojo asmeniniai nustatymai.",
        "customjsprotected": "Jūs neturite teisės keisti šį JavaScript puslapį, nes jame yra kito naudotojo asmeniniai nustatymai.",
        "creating": "Kuriama $1",
        "editingsection": "Taisomas $1 (skyrelis)",
        "editingcomment": "Taisomas $1 (naujas skyrius)",
-       "editconflict": "Jūsų pakeitimai negali būti įrašyti dėl redagavimo konflikto. Ar norite išspręsti konfliktą rankiniu būdu?",
+       "editconflict": "Redaguoti konfliktą: $1",
        "explainconflict": "Kažkas kitas jau pakeitė puslapį nuo tada, kai jūs pradėjote jį redaguoti.\nViršutiniame tekstiniame lauke pateikta šiuo metu esanti puslapio versija.\nJūsų keitimai pateikti žemiau esančiame lauke.\nJums reikia sujungti jūsų pakeitimus su esančia versija.\nKai paspausite „{{int:savearticle}}“, bus įrašytas '''tik''' tekstas viršutiniame tekstiniame lauke.",
        "yourtext": "Jūsų tekstas",
        "storedversion": "Išsaugota versija",
        "readonlywarning": "'''Įspėjimas: Duomenų bazė buvo užrakinta techninei profilaktikai, todėl šiuo metu negalėsite išsaugoti savo pakeitimų. Siūlome nusikopijuoti tekstą į tekstinį failą ir vėliau jį čia išsaugoti.'''\n\nJą užrakinusio administratoriaus paaiškinimas: $1",
        "protectedpagewarning": "'''Dėmesio: Šis puslapis yra užrakintas taip, kad jį redaguoti gali tik administratoriaus teises turintys naudotojai.'''\nNaujausias įrašas žurnale yra pateiktas žemiau:",
        "semiprotectedpagewarning": "'''Pastaba:''' Šis puslapis buvo užrakintas, jį gali redaguoti tik registruoti naudotojai.\nNaujausias įrašas žurnale yra pateiktas žemiau:",
-       "cascadeprotectedwarning": "'''Dėmesio''': Šis puslapis buvo užrakintas taip, kad tik naudotojai su administratoriaus teisėmis galėtų jį redaguoti, nes jis yra įtrauktas į {{PLURAL:$1|šį puslapį, apsaugotą|šiuos puslapius, apsaugotus}} „pakopinės apsaugos“ pasirinktimi:",
+       "cascadeprotectedwarning": "<strong>Dėmesio:</strong> Šis puslapis buvo užrakintas taip, kad tik naudotojai su administratoriaus teisėmis galėtų jį redaguoti, nes jis yra įtrauktas į {{PLURAL:$1|šį puslapį, apsaugotą|šiuos puslapius, apsaugotus}} „pakopinės apsaugos“ pasirinktimi:",
        "titleprotectedwarning": "'''Dėmesio: Šis puslapis buvo užrakintas taip, kad tik [[Special:ListGroupRights|kai kurie naudotojai]] galėtų jį sukurti.'''\nNaujausias įrašas žurnale yra pateiktas žemiau:",
        "templatesused": "{{PLURAL:$1|Šablonas|Šablonai}}, naudojami puslapyje:",
        "templatesusedpreview": "{{PLURAL:$1|Šablonas|Šablonai}}, naudoti šioje peržiūroje:",
        "linksearch-pat": "Ieškoti modulio:",
        "linksearch-ns": "Vardų sritis:",
        "linksearch-ok": "Ieškoti",
-       "linksearch-text": "Galima naudoti žvaigždutes, pvz., „*.wikipedia.org“.<br />\nYra būtinas bent jau aukščiausio lygio domenas, pvz., „*.org“.<br />\n{{PLURAL:$2|Palaikomas protokolas|Palaikomi protokolai|Palaikomų protokolų}}: <code>$1</code> (numato į http://, jei nenurodytas joks protokolas).",
+       "linksearch-text": "Galima naudoti žvaigždutes, pvz., „*.wikipedia.org“.<br />\nYra būtinas bent jau aukščiausio lygio domenas, pvz., „*.org“.<br />\n{{PLURAL:$2|Palaikomas protokolas|Palaikomi protokolai|Palaikomų protokolų}}: $1 (numato į http://, jei nenurodytas joks protokolas).",
        "linksearch-line": "$1 yra susietas iš $2",
        "linksearch-error": "Žvaigždutės gali būti tik adreso pradžioje.",
        "listusersfrom": "Rodyti naudotojus pradedant nuo:",
        "changecontentmodel-nodirectediting": "$1 turinio modelis nepalaiko tiesioginio redagavimo",
        "log-name-contentmodel": "Turinio modelio kaitos istorija",
        "log-description-contentmodel": "Įvykiai susiję su puslapio turinio modeliu",
-       "logentry-contentmodel-change": "$1 atnaujino puslapio $3 turinio modelį iš $4 į $5",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|atnaujino}} puslapio $3 turinio modelį iš $4 į $5",
        "logentry-contentmodel-change-revertlink": "atšaukti",
        "logentry-contentmodel-change-revert": "atšaukti",
        "protectlogpage": "Rakinimų sąrašas",
        "protect-locked-blocked": "Jūs negalite keisti apsaugos lygių, kol esate užbluokuotas.\nČia yra dabartiniai nustatymai puslapiui '''$1''':",
        "protect-locked-dblock": "Apsaugos lygiai negali būti pakeisti dėl duomenų bazės užrakinimo.\nČia yra dabartiniai nustatymai puslapiui '''$1''':",
        "protect-locked-access": "Jūsų paskyra neturi teisių keisti puslapių apsaugos lygių.\nČia yra dabartiniai nustatymai puslapiui '''$1''':",
-       "protect-cascadeon": "Šis puslapis dabar yra apsaugotas, nes jis yra įtrauktas į {{PLURAL:$1|šį puslapį, apsaugotą|šiuos puslapius, apsaugotus}} „pakopinės apsaugos“ pasirinktimi. Jūs galite pakeisti šio puslapio apsaugos lygį, bet tai nepaveiks pakopinės apsaugos.",
+       "protect-cascadeon": "Šis puslapis dabar yra apsaugotas, nes jis yra įtrauktas į {{PLURAL:$1|šį puslapį, apsaugotą|šiuos puslapius, apsaugotus}} „pakopinės apsaugos“ parinktimi.\nPuslapio apsaugos lygių pakeitimai neturės poveikio pakopinei apsaugai.",
        "protect-default": "Leisti visiems naudotojams",
        "protect-fallback": "Reikalauti „$1“ teisės",
        "protect-level-autoconfirmed": "Blokuoti naujai prisiregistravusius ir neregistruotus naudotojus",
        "pageinfo-robot-index": "Leidžiama",
        "pageinfo-robot-noindex": "Neleidžiama",
        "pageinfo-watchers": "Puslapio stebėtojų skaičius",
-       "pageinfo-visiting-watchers": "Skaičius puslapio stebėtojų, lankančių pastaruosius pakeitimus",
+       "pageinfo-visiting-watchers": "Skaičius puslapio stebėtojų, kurie aplankė pastaruosius pakeitimus",
        "pageinfo-few-watchers": "Mažiau nei $1 {{PLURAL:$1|stebėtojas|stebėtojų}}",
        "pageinfo-few-visiting-watchers": "Gali būti arba nebūti stebėtojų, lankančių pastaruosius pakeitimus",
        "pageinfo-redirects-name": "Nukreipimai į šį puslapį",
        "htmlform-cloner-create": "Pridėti dar",
        "htmlform-cloner-delete": "Pašalinti",
        "htmlform-cloner-required": "Bent viena reikšmė būtina.",
+       "htmlform-title-badnamespace": "[[:$1]] nėra \"{{ns:$2}}\" vardų srityje.",
+       "htmlform-title-not-creatable": "\"$1\" nėra tinkamas sukūrimui puslapio pavadinimas",
+       "htmlform-title-not-exists": "[[:$1]] neegzistuoja.",
+       "htmlform-user-not-exists": "<strong>$1</strong> neegzistuoja.",
+       "htmlform-user-not-valid": "<strong>$1</strong> nėra tinkamas naudotojo vardas.",
        "sqlite-has-fts": "$1 su visatekstės paieškos palaikymu",
        "sqlite-no-fts": "$1 be visatekstės paieškos palaikymo",
        "logentry-delete-delete": "$1 {{GENDER:$2|ištrynė}} puslapį $3",
        "logentry-merge-merge": "$1 {{GENDER:$2|sujungė}} $3 į $4 (versijas iki $5)",
        "logentry-move-move": "$1 pervadino puslapį $3 į $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|perkėlė}} puslapį $3 į $4 be nukreipimo",
-       "logentry-move-move_redir": "$1 {{GENDER:$2|perkėlė}} puslapį $3 į $4 per nukreipimą",
-       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|perkėlė}} puslapį $3 į $4 per nukreipimą be paliko nukreipimo",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|perkėlė}} puslapį $3 į $4 (anksčiau buvo nukreipiamasis)",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|pervadino}} puslapį $3 į $4, nesukurdamas nukreipimo",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|payžėmjo}} versiją $4 puslapio $3 kaip patruliuojama",
        "logentry-patrol-patrol-auto": "$1 automatiškai {{GENDER:$2|pažymėjo}} versiją $4 puslapio $3 kaip patruliuojama",
        "logentry-newusers-newusers": "Vartotojo paskyra $1 buvo {{GENDER:$2|sukurta}}",
index 7a0c7ae..546bd0e 100644 (file)
        "editfont-monospace": "فونت هم عرض",
        "editfont-sansserif": "فونت بدون سریف",
        "editfont-serif": "فونت سریف",
-       "sunday": "یه شمه",
-       "monday": "دۉشمه",
-       "tuesday": "سه‌شمه",
+       "sunday": "یە شأمە",
+       "monday": "دوٙشمە",
+       "tuesday": "سەشمە",
        "wednesday": "چار شمه",
-       "thursday": "پشÙ\85Ù\87",
-       "friday": "جۉمَ",
-       "saturday": "شَمه",
+       "thursday": "پأشأÙ\85Û\95",
+       "friday": "جوٙمَ",
+       "saturday": "شأمە",
        "sun": "یه شمه",
-       "mon": "دوشمه",
-       "tue": "سه‌شمه",
+       "mon": "دوٙشأمأھ",
+       "tue": "سەشأمە",
        "wed": "چارشمه",
        "thu": "پشمه",
        "fri": "جومَ",
        "sat": "شمه",
-       "january": "اÛ\89Ù\84 Ù\82Ù\87ارھ",
-       "february": "لرشگۉن",
-       "march": "ئنهزنۉن",
-       "april": "نۉرۉزماھ",
-       "may_long": "گلبارماھ",
-       "june": "جۉرش",
-       "july": "میۉھ رسۉن",
-       "august": "مه گرمه",
-       "september": "شنیارۉن",
-       "october": "Ù\85اÙ\84بارکÙ\86Û\89ن",
-       "november": "ئا Ø³Ø±Ø¯Ú©Ù\86Û\89ن",
-       "december": "ئا رجکنۉن",
+       "january": "أڤأÙ\84 Ù\82Ø£Ú¾ارھ",
+       "february": "لیریشگوٙن",
+       "march": "ئنهزینوٙن",
+       "april": "نۉروٙزماھ",
+       "may_long": "گۉلبارماھ",
+       "june": "جۉریش",
+       "july": "میڤە رأسوٙن",
+       "august": "مە گأرمە",
+       "september": "شینیاروٙن",
+       "october": "Ù\85اÙ\84بارکÙ\88Ù\99Ù\86Ù\88Ù\99ن",
+       "november": "ئا Ø³Ø£Ø±Ø¯Ú©Ù\88Ù\99Ù\86Ù\88Ù\99ن",
+       "december": "ئا ریجیکنوٙن",
        "january-gen": "اول قهارھ",
-       "february-gen": "لرشگون",
+       "february-gen": "لیریشگوٙن",
        "march-gen": "ئنهزنۉن",
        "april-gen": "نۉرۉزماھ",
        "may-gen": "گلبارماھ",
        "october-gen": "مالبارکنۉن",
        "november-gen": "ئا سردکنۉن",
        "december-gen": "ئا رجکنۉن",
-       "jan": "اÛ\89Ù\84 Ù\82ھارھ",
-       "feb": "لرشگۉن",
-       "mar": "ئنهزنۉن",
-       "apr": "نۉرۉزماھ",
-       "may": "گلبار ماھ",
-       "jun": "جۉرش",
-       "jul": "میۉھ رسۉن",
-       "aug": "مه گرمه",
-       "sep": "شنیارۉن",
-       "oct": "Ù\85اÙ\84بارکÙ\86Û\89ن",
-       "nov": "ئا Ø³Ø±Ø¯Ú©Ù\86Û\89ن",
-       "dec": "ئا رجکنۉن",
+       "jan": "أڤأÙ\84 Ù\82Ø£ھارھ",
+       "feb": "لیریشگوٙن",
+       "mar": "ئنهزینوٙن",
+       "apr": "نۉروٙزماھ",
+       "may": "Ú¯Ù\88Ù\99Ù\84بار Ù\85اھ",
+       "jun": "جوٙریش",
+       "jul": "میڤە رأسوٙن",
+       "aug": "مە گأرمە",
+       "sep": "شینیاروٙن",
+       "oct": "Ù\85اÙ\84بارکÙ\88Ù\99Ù\86Ù\88Ù\99ن",
+       "nov": "ئا Ø³Ø£Ø±Ø¯Ú©Ù\88Ù\99Ù\86Ù\88Ù\99ن",
+       "dec": "ئا ریجکنوٙن",
        "january-date": "ژانویه $1",
        "february-date": "فوریه $1",
        "march-date": "مارس $1",
        "october-date": "اکتبر $1",
        "november-date": "نوامبر $1",
        "december-date": "دسامبر $1",
-       "pagecategories": "{{PLURAL:$1|دسه|دسه یل}}",
+       "pagecategories": "{{PLURAL:$1|دسە|دسە یل}}",
        "category_header": "بلگه یل مئن دسه \"$1\"",
        "subcategories": "دسه یل فرعی",
        "category-media-header": "مدیا مئن دسه \"$1\"",
        "category-empty": "ای دسه الآن هیچ بلگه یا مدیا ناره",
-       "hidden-categories": "{{PLURAL:$1|دسه قائم|دسه یل قائم}}",
+       "hidden-categories": "{{PLURAL:$1|دسە قائم|دسە یل قائم}}",
        "hidden-category-category": "دسه بنی یل قائم",
-       "category-subcat-count": "{{PLURAL:$2|ای دسه فقط دسه یل فرعی دۉمنه دارھ.|ای دسه چیه یل دۉمنه دارھ {{PLURAL:$1|دسه فرعی|$1 دسه یل فرعی}}, بیشتر زھ $2 کل.}}",
+       "category-subcat-count": "{{PLURAL:$2|ائی دسە فأقأط دسە یل فأرعی دوٙمنە دارھ.|ئی دسە چیأئل دوٙمنە دارھ {{PLURAL:$1|دسە فأرعی|$1 دسە یل فأرعی}}, بیشتأر زھ $2 کل.}}",
        "category-subcat-count-limited": "ای دسه چیه یل دومنه داره {{PLURAL:$1|دسه فرعی|$1 دسه یل فرعی}}.",
-       "category-article-count": "{{PLURAL:$2|اÛ\8c Ø¯Ø³Ù\87 Ù\81Ù\82Ø·  Ø¨Ù\84Ú¯Ù\87 Û\8cÙ\84 Ø¯Û\89Ù\85Ù\86Ù\87 Ø¯Ø§Ø±Ù\87 .|دÛ\89Ù\85Ù\86 Ø§Ù\84ذکر{{PLURAL:$1|بÙ\84Ú¯Ù\87 Ù\87س|$1 Ø¨Ù\84Ú¯Ù\87 Ù\87سÙ\86}} Ù\85ئÙ\86 Ø§Û\8c Ø¯Ø³Ù\87, Ø¨Û\8cشتر زھ$2 کل.}}",
+       "category-article-count": "{{PLURAL:$2|ئÛ\8c Ø¯Ø³Û\95 Ù\81Ø£Ù\82أط  Ø¨Ø£Ù\84Ú¯Û\95Ù\84 Ø¯Ù\88Ù\99Ù\85Ù\86Û\95 Ø¯Ø§Ø±Ú¾ .|دÙ\88Ù\99Ù\85Ù\86 Ø§Ù\84ذکر{{PLURAL:$1|بأÙ\84Ú¯Û\95 Ù\87أس|$1 Ø¨Ø£Ù\84Ú¯Û\95 Ù\87أسÛ\8cÙ\86}} Ù\85ئÙ\86 Ø¦Û\8c Ø¯Ø³Û\95, Ø¨Û\8cشتأر زھ$2 کل.}}",
        "category-article-count-limited": "دومن الذکر {{PLURAL:$1|بلگه هس|$1 بلگه هسن}} د او دسه جریانی.",
        "category-file-count": "{{PLURAL:$2|ای دسه فقط فایلل دۉمنه دارھ.|دۉمن الذکر{{PLURAL:$1|فایل هس|$1 فایلل هسن}} د ای دسه, بیشتر زھ$2 کل.}}",
        "category-file-count-limited": "دومن الذکر {{PLURAL:$1|فایل هس|$1 فایلل هسن}} د او دسه جریانی.",
        "mytalk": "گپ",
        "anontalk": "سی ای آدرس آی پی گپ بزه",
        "navigation": "هدایت کردن",
-       "and": "&#32;ۉ",
+       "and": "&#32;ڤ",
        "qbfind": "سیل کردن",
        "qbbrowse": "نوم بلگه",
        "qbedit": "اصلاح",
        "faq": "اف آی کیو \" سوالل متداول \"",
        "faqpage": "Project:اف آی کیو \" سوالل متداول \"",
        "actions": "عملیه یل",
-       "namespaces": "همدرنگل",
-       "variants": "انۉاع",
-       "navigation-heading": "منۉ ناۉ ۉری",
+       "namespaces": "هۉمدیرأنگل",
+       "variants": "Ø£نۉاع",
+       "navigation-heading": "مأنۉ ناۉ ۉری",
        "errorpagetitle": "خطا",
        "returnto": "بازگشت وھ $1.",
-       "tagline": "ز {{SITENAME}}",
-       "help": "هومیاری",
-       "search": "جستن",
-       "searchbutton": "جستن",
+       "tagline": "زھ {{SITENAME}}",
+       "help": "Ù\87Ù\88Ù\99Ù\85Û\8cارÛ\8c",
+       "search": "جۉستأن",
+       "searchbutton": "جۉستأن",
        "go": "رو",
        "searcharticle": "رۉ",
-       "history": "تاریخچھ بلگه",
-       "history_short": "تاریخچه",
+       "history": "ڤیرگار ھ بألگە",
+       "history_short": "ڤیرگار",
        "updatedmarker": "بروز وابی تا موقع آخرین سیل کردن مو",
-       "printableversion": "ۉرژن سی چاپ",
+       "printableversion": "ڤیرژین سی چاپ",
        "permalink": "لینکل دائمی",
        "print": "چاپ",
        "view": "نما",
        "view-foreign": "نما مئن  $1",
-       "edit": "اصلاح",
+       "edit": "ئÛ\8cصلاح",
        "edit-local": "اصلاح توضیحتل محلی",
        "create": "درست کردن",
        "create-local": "ۉندن تۉضیحتل محلی",
        "unprotectthispage": "تغییر دائن حالت حفاظت ای بلگه",
        "newpage": "بلگه نۉ",
        "talkpage": "گپ زئن ای بلگه",
-       "talkpagelinktext": "گپ",
+       "talkpagelinktext": "گأپ",
        "specialpage": "بلگه مخصوص",
-       "personaltools": "اÛ\89زارگل سی خۉتی",
+       "personaltools": "ئÙ\88زارگل سی خۉتی",
        "articlepage": "سل کردن محتوا ای بلگه",
-       "talk": "قسه",
+       "talk": "قسە",
        "views": "نمایل",
-       "toolbox": "اÛ\89زارگÙ\87",
+       "toolbox": "ئÙ\88زارگÛ\95",
        "userpage": "دیئن بلگه کارور",
        "projectpage": "دیئن بلگه پروجه",
        "imagepage": "دیئن بلگه فایل",
        "viewhelppage": "دیئن بلگه هومیاری",
        "categorypage": "دیئن بلگه دسه بنی",
        "viewtalkpage": "دیئن گپل",
-       "otherlanguages": "مئن زۉۉنل دیھ",
+       "otherlanguages": "مئن زۉۉنل دیە",
        "redirectedfrom": "(تصحیح مجدد زھ $1)",
        "redirectpagesub": "بلگه تصحیح و هدایت زه مجدد",
        "redirectto": "تغییر دائن مسیر ۉھ:",
-       "lastmodifiedat": "اÛ\8c Ø¨Ù\84Ú¯Ù\87 Ø§Ø®Û\8cرا ØªØºÛ\8cÛ\8cر Û\89اصÙ\84اح Û\89ابÛ\8cÙ\87 Ù\85ئÙ\86Ù\87 $1, Ù\85ئÙ\86Ù\87 $2.",
+       "lastmodifiedat": "ئÛ\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø§Ø®Û\8cرا ØªØ£ØºÛ\8cÛ\8cر Ú¤ Ø¦Û\8cصÙ\84اح Ú¤Ø§Ø¨Û\8cÛ\95 Ù\85أئÙ\86Û\95 $1, Ù\85أئÙ\86Û\95 $2.",
        "viewcount": "ای بلگه قابل دسترسی وابیه {{PLURAL:$1|یه بار|$1 مدتل}}.",
        "protectedpage": "بلگه حفاظت وابیه",
-       "jumpto": "پریدن ۉھ:",
+       "jumpto": "پریدن ڤھ:",
        "jumptonavigation": "هدایت کردن",
-       "jumptosearch": "جستن",
+       "jumptosearch": "جۉستأن",
        "view-pool-error": "وبشید ، سرور بیش زه حد بارگیری وابیه .\nکارورل زیادی ایخن ای بلگنه سل کنن.\nلطفا یه لحظه واسیت قبلیکه به خیت ای بلگنه مجددا سل کیت.\n$1",
        "generic-pool-error": "وبشید ، سرور بیش زه حد بارگیری وابیه .\nکارورل زیادی ایخن ای منوبنه سل کنن.\nلطفا یه لحظه واسیت قبلیکه به خیت ای منوبنه مجددا سل کیت.",
        "pool-timeout": "پایان زمون اتنظار سی قفل",
        "pool-queuefull": "صف استخر پر هسی",
        "pool-errorunknown": "خطا ناشناخته",
        "pool-servererror": "شمارنده سرویس استخر ور تیه نی ($1).",
-       "aboutsite": "پرۉجھ : دربارھ",
-       "aboutpage": "Project:دربارھ",
+       "aboutsite": "پۉرۉجھ : دأربارھ",
+       "aboutpage": "Project:دأربارھ",
        "copyright": "مطلب دومن $ 1 هس نکه خلاف هونو ذکر وابی.",
        "copyrightpage": "{{ns:project}}:کپی رایت",
        "currentevents": "اتفاقل جاری",
        "currentevents-url": "Project:اتفاقل جاری",
-       "disclaimers": "انکار کنندھ یل",
-       "disclaimerpage": "Project:اÙ\86کار Ú©Ø§Ø±Û\89ران",
+       "disclaimers": "ئÛ\8cنکار کنندھ یل",
+       "disclaimerpage": "Project:ئÛ\8cÙ\86کار Ú©Ø§Ø±Û\89Ø£ران",
        "edithelp": "هۉمیاری سی اصلاح",
-       "mainpage": "بلگھ اصلی",
-       "mainpage-description": "بلگھ اصلی",
+       "mainpage": "بألگە أصلی",
+       "mainpage-description": "بألگە أصلی",
        "policy-url": "Project:خط مشی",
-       "portal": "درگاھ Ú©Ø§Ø±Û\89راÙ\86",
-       "portal-url": "Project:درگاھ Ú©Ø§Ø±Û\89راÙ\86",
-       "privacy": "خط مشی رازداری",
-       "privacypage": "Project:خط مشی رازداری",
+       "portal": "دأرگاھ Ú©Ø§Ø±Ú¤Ø£Ø±Ù\84",
+       "portal-url": "Project:دأرگاھ Ú©Ø§Ø±Ú¤Ø£Ø±Ù\84",
+       "privacy": "خط Ù\85أشÛ\8c Ø±Ø§Ø²Ø¯Ø§Ø±Û\8c",
+       "privacypage": "Project:خط Ù\85أشÛ\8c Ø±Ø§Ø²Ø¯Ø§Ø±Û\8c",
        "badaccess": "خطا دسترسی",
        "badaccess-group0": "ایسا اجازه انجام کاری که ایخستیده ندارین",
        "badaccess-groups": "او کاری که ایسا درخواست کردین فقط سی کارورانیه که مئنه ای  گروهن  {{PLURAL:$2|آن گروه|یکی زه گروه یل}}: $1.",
        "versionrequired": "یه نسخه زه نیازمندی یل ویکی مدیا\n$1",
        "versionrequiredtext": "یه نسخه زه ویکی مدیا($1) نیازمند ه وه استفاده زه ای بلگه\nبویین :[[مخصوص:نسخه|نسخه مخصوص]].",
        "ok": "خووه",
-       "retrievedfrom": "بازیافت ز\"$1\"",
+       "retrievedfrom": "بازیافت زھ \"$1\"",
        "youhavenewmessages": "پیوم نو داری $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|ایشا داریت}} $1 زه {{PLURAL:$3|یه کارور دیه|$3 کارورل}} ($2).",
        "youhavenewmessagesmanyusers": "ایشا $1 زه کارورل دیه داریت ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|یه پیوم نو|999=پیومل نو}}",
        "newmessagesdifflinkplural": "آخر {{PLURAL:$1|تغییر|999=تغییرل}}",
        "youhavenewmessagesmulti": "ایشا پیوم نو داریت مئنه\n$1",
-       "editsection": "اصلاح",
+       "editsection": "ئÛ\8cصلاح",
        "editold": "اصلاح",
        "viewsourceold": "دیئن منبع",
-       "editlink": "اصلاح",
-       "viewsourcelink": "دÛ\8cئÙ\86 Ø³Ø±Ú\86Ø´Ù\85Ú¾",
-       "editsectionhint": "اصÙ\84اح Û\89Ú¾ Ù\82سÙ\85ت: $1",
-       "toc": "محتوا یل",
+       "editlink": "ئÛ\8cصلاح",
+       "viewsourcelink": "دÛ\8cئÙ\86 Ø³Ø£Ø±Ú\86Û\8cØ´Ù\85Û\95",
+       "editsectionhint": "ئÛ\8cصÙ\84اح Ø¦Û\8c Ø¨Ø£Ø®Ø´: $1",
+       "toc": "مۉحتڤا یل",
        "showtoc": "نمایش",
        "hidetoc": "قائم",
        "collapsible-collapse": "سقوط",
        "feed-invalid": "اشتراک  زه راه  تایپ باطله",
        "feed-unavailable": "فید پیوند ور تیه نی",
        "site-rss-feed": "خبرخو RSS سی $1",
-       "site-atom-feed": "خبرخۉ Atom سی $1",
+       "site-atom-feed": "خأھ Ú¤Ø£Ø± خۉ Atom سی $1",
        "page-rss-feed": "خبرخو RSS سی «$1»",
-       "page-atom-feed": "خبرخۉ Atom سی «$1»",
-       "red-link-title": "(بلگھ ۉجود نارھ) $1",
+       "page-atom-feed": "خیڤأر Atom سی «$1»",
+       "red-link-title": "(بألگە ۉجوٙد نارھ) $1",
        "sort-descending": "مرتب سازی وا صعودی",
        "sort-ascending": "مرتب سازی وا صعودی",
-       "nstab-main": "بلگھ",
+       "nstab-main": "بألگە",
        "nstab-user": "بلگه کارۉر",
        "nstab-media": "بلگه مدیا",
-       "nstab-special": "بلگھ یل ۉیجھ",
+       "nstab-special": "بألگە یل ڤیجە",
        "nstab-project": "بلگه پرۉجه",
        "nstab-image": "فایل",
        "nstab-mediawiki": "پیوم",
        "nstab-template": "الگۉ",
        "nstab-help": "بلگه هومیاری",
-       "nstab-category": "دسه",
+       "nstab-category": "دسە",
        "nosuchaction": "چنی دستوری موجود نی",
        "nosuchspecialpage": "چنو بلگه مخصوصی نی",
        "error": "خطا",
        "createaccount-title": "اکانت سازی سی {{SITENAME}}",
        "login-abort-generic": "ورود ایشا ناموفق وابی - سقط وابی",
        "loginlanguagelabel": "زۉۉن:$1",
-       "pt-login": "ئۉیدن ۉھ سیستم",
+       "pt-login": "ئۉیدأن ڤھ سیستم",
        "pt-login-button": "ئۉیدن ۉھ سیستم",
        "pt-createaccount": "راس کردن حسآۉ",
        "pt-userlogout": "رتن زھ سیستم",
        "anoneditwarning": "<strong>هشدار:</strong> ایشا نۉایته مئنه سیستم. آی پی ایشا سی عۉمۉم قابل رۉیت هی ار اصلاحی بکنیت. ار ایشا <strong>[$1 ورود]</strong> یا <strong>[$2 راس کردن یه حسآۉ]</strong>, اصلاحل ایشا به حسآۉ کارۉری ایشا ھشتھ ایۉان ۉا منفعل حسآۉل دیه..",
        "loginreqlink": "ئۉیدن ۉھ سیستم",
        "newarticletext": "ایشا یه لینک ۉھ یه بلگنه که هنی ۉجود نارنه دنبال کردیته.\nسی راس کردن ای بلگه،نوشتنه مئنه جعبه زیر شرۉع کنیت(بینیتۉ [$1 help page] سی اصلاعات اضافی).\nار ایشا ۉا خطا ایچه هیسیت، ری <strong>back</strong> button مرۉرگر ایشا کلیژ کیت.",
-       "noarticletext": "د Ø­Ø§Ù\84 Ø¬Ø§Ø±Û\8c Ù\85تÙ\86Û\8c Ù\85ئÙ\86Ù\87 Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ù\86Û\8cسس.\nاÛ\8cشا Ø§Û\8cترÛ\8cد [[Special:Search/{{PAGENAME}}|جستÙ\86 Ø³Û\8c Ø¹Ù\86Ù\88اÙ\86 Ø§Û\8c Ø¨Ù\84Ú¯Ù\87]] Ù\85ئÙ\86Ù\87 Ø¨Ù\84Ú¯Ù\87 Û\8cÙ\84 Ø¯Û\8cÙ\87.\n<span class=\"plainlinks\">[{{fullurl:{{#Ù\85خصÛ\89ص:Ù\86Ù\85اÛ\8cÙ\87 Û\8cÙ\84}}|بÙ\84Ú¯Ù\87={{FULLPAGENAMEE}}}} Ø¬Ø³ØªÙ\86 Ø³Û\8c Ù\86Ù\85اÛ\8cÙ\84 Ù\85ربÙ\88Ø·], Û\8cا [{{fullurl:{{FULLPAGENAME}}|اÙ\82داÙ\85=اصÙ\84اح}} Ø§ØµÙ\84اح Ú©Û\89 Ø§Û\8c Ø¨Ù\84Ú¯Ù\86Ù\87]</span>.",
+       "noarticletext": "Ø£Ù\84اÙ\86 Ù\85أتÙ\86Û\8c Ù\85ئÙ\86Û\95 Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\8c.\nئÛ\8cشا Ø¦Û\8cتأرÛ\8cد [[Special:Search/{{PAGENAME}}|جÛ\89ستأÙ\86 Ø³Û\8c Ø¹Û\89Ù\86ڤاÙ\86 Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95]] Ù\85ئÙ\86Û\95 Ø¨Ø£Ù\84Ú¯Û\95 Û\8cÙ\84Û\95 Ø¯Û\8cÛ\95.\n<span class=\"plainlinks\">[{{fullurl:{{#Ù\85أخصÙ\88Ù\99ص:Ù\86Û\8cÙ\85اÛ\8cÙ\84}}|بأÙ\84Ú¯Û\95={{FULLPAGENAMEE}}}} Ø¬Û\89ستأÙ\86 Ø³Û\8c Ù\86Û\8cÙ\85اÛ\8cÙ\84 Ù\85أربÙ\88Ù\99Ø·], Û\8cا [{{fullurl:{{FULLPAGENAME}}|ئÛ\8cÙ\82داÙ\85=ئÛ\8cصÙ\84اح}} Ø¦Û\8cصÙ\84اح Ú©Û\89 Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Ù\86Û\95]</span>.",
        "noarticletext-nopermission": "د حال جاری متنی مئنه ای بلگه نیسس.\nایشا ایترید [[Special:Search/{{PAGENAME}}|search for this page title]] مئنه بلگل دیه، یا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>، ۉلی ایشا نیترید ای بلگنه راس بکنیت.",
        "editing": "درحال اصلاح $1",
        "creating": "راس کردن $1",
        "editingsection": "درحال اصلاح $1 (قسمت)",
        "templatesused": "{{PLURAL:$1|قالب|قالبل}} اسفادھ بیه مئنه ای بلگه:",
-       "template-protected": "(تحت حمایت)",
+       "template-protected": "(تأحت Ø­Ù\85اÛ\8cت)",
        "template-semiprotected": "(نیمه حمایت ۉابیدھ)",
        "hiddencategories": "ای بلگه عضۉ {{PLURAL:$1|1 دسه بنی قائم|$1 دسه بنی یل قائم}} هیسس :",
        "permissionserrorstext-withaction": "ایشا اجازھ ناریت که $2, سی ای {{PLURAL:$1|دلیل|دلیلل}}:",
        "moveddeleted-notice": "ای بلگه حذف ۉابیدھ.\nحذف ۉ انتقال سیاهه ای بلگه فراهم ۉابیدھ دۉمن سرچشمه.",
        "viewpagelogs": "نشۉدائن نمایه ها سی ای بلگه",
        "currentrev-asof": "آخرین ۉرژن تا $1",
-       "revisionasof": "اصلاح $1",
+       "revisionasof": "ئÛ\8cصلاح $1",
        "revision-info": "ۉرژن $1 تۉسط {{GENDER:$6|$2}}$7",
-       "previousrevision": "â\86\90 Ø§ØµÙ\84اح Ù\82بلی",
+       "previousrevision": "â\86\90 Ø¦Û\8cصÙ\84اح Ù\82Ø£بلی",
        "nextrevision": "ۉرژن نۉتر →",
        "currentrevisionlink": "آخرین ۉرژن",
        "cur": "فعلی",
        "rev-delundel": "قابلیت تغییر دائن",
        "history-title": "تاریخچه اصلاحل $1",
        "difference-title": "فرخ ۉا بین تجدید نطرل \"$1\"",
-       "lineno": "سطر $1:",
-       "editundo": "Ù\84غÙ\88",
+       "lineno": "سأطر $1:",
+       "editundo": "Ù\84أغڤ",
        "diff-multi-sameuser": "({{PLURAL:$1|یه ۉرزن متۉسط|$1 ۉرژنل متۉسط}} تۉسط کارۉر مشابه نشۉ نۉابیه)",
-       "searchresults": "Ù\86تÛ\8cجÙ\84 Ø¬Ø³Øªن",
-       "searchresults-title": "Ù\86تÛ\8cجÙ\84 Ø¬Ø³Øªن سی \"$1\"",
+       "searchresults": "Ù\86أتÛ\8cجÙ\84 Ø¬Û\89ستأن",
+       "searchresults-title": "Ù\86أتÛ\8cجÙ\84 Ø¬Û\89ستأن سی \"$1\"",
        "prevn": "قبلی {{PLURAL:$1|$1}}",
        "nextn": "بعدی {{PLURAL:$1|$1}}",
        "nextn-title": "بعدی $1 {{PLURAL:$1|نتیجه|نتیجل}}",
-       "shown-title": "نشۉ دائن $1 {{PLURAL:$1|نتیجه|نتیجل}} د هر بلگه",
+       "shown-title": "نیشۉ دائن $1 {{PLURAL:$1|نأتیجە|نأتیجل}} د هر بألگە",
        "viewprevnext": "مشاهدھ ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-new": "<strong>درست کۉ ای بلگنه \"[[:$1]]\" مئنه ای ۉیکی!</strong> {{PLURAL:$2|0=|همچنین سل کۉ بلگه ای که ۉا جستن پیداش کردیه.|همچنین سل کۉ نتیجل جستنه.}}",
-       "searchprofile-articles": "بلگه محتۉا",
-       "searchprofile-images": "چندرسانه ای",
-       "searchprofile-everything": "همه چیا",
-       "searchprofile-advanced": "پیشرفته",
-       "searchprofile-articles-tooltip": "جستن مئنه $1",
-       "searchprofile-images-tooltip": "جستن سی فایلل",
-       "searchprofile-everything-tooltip": "جستن سی محتۉا(شامل بلگل گپ)",
-       "searchprofile-advanced-tooltip": "جستن مئنه همدرنگل سفارشی",
-       "search-result-size": "$1 ({{PLURAL:$2|1 کلمه|$2 کلمل}})",
+       "searchprofile-articles": "بألگە مۉحتڤا",
+       "searchprofile-images": "چأندرسانە ئی",
+       "searchprofile-everything": "همە چیا",
+       "searchprofile-advanced": "پیشرأفتە",
+       "searchprofile-articles-tooltip": "جۉستأن مأئنە $1",
+       "searchprofile-images-tooltip": "جۉستأن سی فایلل",
+       "searchprofile-everything-tooltip": "جۉستأن سی مۉحتڤا(شامل بألگل گأپ)",
+       "searchprofile-advanced-tooltip": "جۉستأن مأئنە هۉمدیرأنگل سفارشی",
+       "search-result-size": "$1 ({{PLURAL:$2|1 کألمە|$2 کألمل}})",
        "search-redirect": "(تغییر مسیر $1)",
        "search-section": "(قسمت $1)",
        "search-suggest": "آیا منطۉر ایشا ای بی:$1",
        "search-showingresults": "{{PLURAL:$4|نتیجه <strong>$1</strong> ز <strong>$3</strong>|نتیجل <strong>$1 - $2</strong> ز <strong>$3</strong>}}",
        "search-nonefound": "نتیجه ای مرتبط ۉا هۉنی که در خۉاست دیته نی.",
        "mypreferences": "تنظیمل",
-       "right-writeapi": "استÙ\81ادھ Ø¯ Ù\86Ù\88شتÙ\86 Û\89Ú¾ ØµÛ\89رت API",
-       "newuserlogpage": "سیاهه راس کردن حسآۉ",
+       "right-writeapi": "ئÛ\8cستÙ\81ادھ Ø¯ Ù\86ڤشتÙ\86 Ú¤Û\95 ØµÙ\88Ù\99رأت API",
+       "newuserlogpage": "سیاهە راس کردن حسآۉ",
        "enhancedrc-history": "تاریخچھ",
-       "recentchanges": "تغییرل نۉ",
+       "recentchanges": "تأغÛ\8cÛ\8cرÙ\84 Ù\86Û\89",
        "recentchanges-legend": "گزینه یل تغییرل اخیر",
        "recentchanges-summary": "شیار تغییرل اخیر مئنه ای بلگه ۉھ ۉیکی .",
-       "recentchanges-label-newpage": "اÛ\8c Ø§ØµÙ\84اح Û\8cÙ\87 Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\88 Ø§یسازھ",
-       "recentchanges-label-minor": "اÛ\8c Û\8cÙ\87 Ø§ØµÙ\84اح Ú©Ú\86Ú© Û\89ابی",
-       "recentchanges-label-bot": "اÛ\8c Ø§ØµÙ\84اح ØªÛ\89سط Û\8cÙ\87 Ø±Û\89بات Ø§Ù\86جاÙ\85 Û\89ابÛ\8cÙ\87",
+       "recentchanges-label-newpage": "ئÛ\8c Ø¦Û\8cصÙ\84اح Û\8cÛ\95 Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Ù\88Ù\99 Ø¦یسازھ",
+       "recentchanges-label-minor": "ئÛ\8c Û\8cÛ\95 Ø¦Û\8cصÙ\84اح Ú©Ù\88Ù\99Ú\86Û\8cر Ú¤ابی",
+       "recentchanges-label-bot": "ئÛ\8c Ø¦Û\8cصÙ\84اح ØªØ£Ú¤Ø£Ø³Û\89Ø· Û\8cÛ\95 Ø±Ù\88Ù\99بات Ø§Ù\86جاÙ\85 Ú¤Ø§Ø¨Û\8cÛ\95",
        "recentchanges-label-unpatrolled": "ای اصلاح هۉنۉ گشت نۉابیدھ",
        "recentchanges-label-plusminus": "اندازھ بلگه ۉا ای تعداد بایت تغییر دادھ بیه",
        "recentchanges-legend-heading": "'''آلشتیا ئیھ سنی :'''",
        "rcshowhidemine-show": "نشۉ دائن",
        "rcshowhidemine-hide": "قائم کردن",
        "rclinks": "نشودائن ئاخرین $1 تغییر مئن $2 روز اخیر؛ $3",
-       "diff": "فرخ",
-       "hist": "گزارش",
+       "diff": "Ù\81أرخ",
+       "hist": "گۉزاریش",
        "hide": "قائم کردن",
        "show": "نشۉ دائن",
        "minoreditletter": "رز",
        "newpageletter": "تا",
        "boteditletter": "ر",
-       "rc-change-size-new": "$1 {{PLURAL:$1|باÛ\8cت|باÛ\8cتÙ\84}} Ø¨Ø¹Ø¯ Øªغییر",
+       "rc-change-size-new": "$1 {{PLURAL:$1|باÛ\8cت|باÛ\8cتÙ\84}} Ø¨Ø£Ø¹Ø¯ ØªØ£غییر",
        "recentchangeslinked": "تغییرل مربۉط",
-       "recentchangeslinked-toolbox": "تغÛ\8cÛ\8cرÙ\84 Ù\85ربÙ\88ط",
+       "recentchangeslinked-toolbox": "تأغÛ\8cÛ\8cرÙ\84 Ù\85أربÙ\88Ù\99ط",
        "recentchangeslinked-title": "تغییرل مرتبط ۉا $1",
-       "recentchangeslinked-summary": "اÛ\8c Ø¨Ù\84Ú¯Ù\87 Ø®Ø§Øµ ØªØºÛ\8cÛ\8cرÙ\84 Ø§Ø®Û\8cر Ù\85ئÙ\86Ù\87 Ø¨Ù\84Ú¯Ù\84 Ù\84Û\8cÙ\86Ú© Û\89ابÛ\8cدھ Û\89Ú¾ Ø§Û\8c Ø¨Ù\84Ú¯Ù\86Ù\87 Ù\86Ø´Û\89 Ø§Ø¯Ú¾.\nبÙ\84Ú¯Ù\84Û\8c Ú©Ù\87 Ù\85ئÙ\86Ù\87 [[Special:Watchlist|Ù\84Û\8cست Ù¾Û\8cÚ¯Û\8cرÛ\8c Û\8cÙ\84]] Ø§Û\8cشا Ù\87Û\8cسÙ\86 Ø¨Ù\87 Ø´Ú©Ù\84 '''سÛ\8cاھ''' Ù\86شۉ دادھ ابۉن.",
+       "recentchangeslinked-summary": "ئÛ\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø®Ø§Øµ ØªØ£ØºÛ\8cÛ\8cرÙ\84 Ø§Ø®Û\8cر Ù\85أئÙ\86Û\95 Ø¨Ø£Ù\84Ú¯Ù\84 Ù\84Û\8cÙ\86Ú© Ú¤Ø§Ø¨Û\8cدھ Ú¤Û\95 Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Ù\86Û\95 Ù\86Û\8cØ´Û\89 Ø§Ø¯Ú¾.\nبأÙ\84Ú¯Ù\84Û\8c Ú©Û\95 Ù\85أئÙ\86Û\95 [[Special:Watchlist|Ù\84Û\8cست Ù¾Û\8cÚ¯Û\8cرÛ\8c Û\8cÙ\84]] Ø¦Û\8cشا Ù\87Û\8cسÙ\86 Ø¨Û\95 Ø´Ú©Ù\84 '''سÛ\8cاھ''' Ù\86Û\8cشۉ دادھ ابۉن.",
        "recentchangeslinked-page": "نۉم بلگه:",
        "recentchangeslinked-to": "نشۉ دائن تغییرل بلگلی که ۉ بلگه دادھ بیه لینک دادھ شدنه به جای",
        "upload": "بلم گیر کردن فایل",
        "license-header": "صدۉر مجۉز",
        "imgfile": "فایل",
        "file-anchor-link": "فایل",
-       "filehist": "تاریخچه فایل",
-       "filehist-help": "رو تاریخ‌ها کلیک کنیت تا نسخه مرتبط را بینیت.",
+       "filehist": "ڤیرگار فایل",
+       "filehist-help": "رۉ تاریخ‌/زمان کلیژ کنیت تا ڤیرژن مۉرتبط رنە بینیت.",
        "filehist-current": "جاری",
        "filehist-datetime": "تاریخ/زمان",
-       "filehist-thumb": "کچک",
-       "filehist-thumbtext": "کچک سی ۉرژن از تا $1",
-       "filehist-user": "کارۉر",
+       "filehist-thumb": "بأند أنگۉشتی",
+       "filehist-thumbtext": "کوٙچیر سی ۉیرژن از تا $1",
+       "filehist-user": "کارڤأر",
        "filehist-dimensions": "ابعاد",
-       "filehist-comment": "توضیح",
-       "imagelinks": "استÙ\81ادÙ\87 د فایل",
-       "linkstoimage": "Ø°Û\8cÙ\84 Ø§Ù\84ذکر {{PLURAL:$1|Ù\84Û\8cÙ\86Ú©Ù\84 Ø¨Ù\84Ú¯Ù\87|$1 Ù\84Û\8cÙ\86Ú© Ø¨Ù\84Ú¯Ù\84}} Ø¨Ù\87 Ø§ی فایل:",
+       "filehist-comment": "توٙضیح",
+       "imagelinks": "ئÛ\8cستÙ\81ادھ د فایل",
+       "linkstoimage": "دÙ\88Ù\99Ù\85Û\8cÙ\86 Ø§Ù\84ذکر {{PLURAL:$1|Ù\84Û\8cÙ\86Ú©Ù\84 Ø¨Ø£Ù\84Ú¯Û\95|$1 Ù\84Û\8cÙ\86Ú© Ø¨Ø£Ù\84Ú¯Ù\84}} Ø¨Û\95 Ø¦ی فایل:",
        "nolinkstoimage": "بلگه یلی که ۉھ ای فایل لینک دائنه نی.",
-       "sharedupload-desc-here": "اÛ\8c Ù\81اÛ\8cÙ\84 Ø² $1 Ø§Û\89Ù\85ائÙ\87 Û\89 Ø´Ø§Û\8cد Ø¯ Ù¾Ø±Û\89جÙ\87 Û\8cÙ\84 Ø¯Û\8cÙ\87 Ù\85Ù\88رد Ø§Ø³ØªÙ\81ادھ Û\89ابÛ\8cÙ\86.\nتÛ\89ضÛ\8cحتÙ\84 Ø±Û\8c [$2 Ø¨Ù\84Ú¯Ù\87 ØªÛ\89ضÛ\8cØ­ Ù\81اÛ\8cÙ\84] Ø¯Û\89Ù\85Ù\86 Ù\86Ø´Û\89 Û\89ابÛ\8cÙ\87 .",
+       "sharedupload-desc-here": "ئÛ\8c Ù\81اÛ\8cÙ\84 Ø² $1 Ø¦Ù\88Ù\99Ù\85ائÛ\95 Ú¤ Ø´Ø§Û\8cد Ø¯ Ù¾Û\89رÛ\89جÛ\95 Û\8cÙ\84 Ø¯Û\8cÛ\95 Ù\85Ù\88رد Ø¦Û\8cستÙ\81ادھ Ú¤Ø§Ø¨Û\8cÙ\86.\nتÙ\88Ù\99ضÛ\8cحتÙ\84 Ø±Û\8c [$2 Ø¨Ø£Ù\84Ú¯Û\95 ØªÛ\89ضÛ\8cØ­ Ù\81اÛ\8cÙ\84] Ø¯Ù\88Ù\99Ù\85Û\8cÙ\86 Ù\86Û\8cØ´Û\89 Ú¤Ø§Ø¨Û\8cÛ\95 .",
        "upload-disallowed-here": "ایشا نیترید ای فایلنه بنۉیسید",
-       "randompage": "بلگھ بختھ کی",
+       "randompage": "بألگە بأختە کی",
        "nbytes": "$1 {{PLURAL:$1|بایت|بایتل}}",
        "nmembers": "$1 {{PLURAL:$1|عضۉ|اعضۉل}}",
-       "newpages": "بلگھ یل نۉ",
+       "newpages": "بألگە یل نوٙ",
        "pager-older-n": "{{PLURAL:$1|قدیمی تر 1|قدیمی تر $1}}",
        "booksources": "سرچشمل کتآۉ",
        "booksources-search-legend": "جستن سی سرچشمل کتآۉ",
        "mywatchlist": "فهرست پیگیری یل",
        "watch": "پی‌گیری",
        "dellogpage": "نمایه حذف",
-       "rollbacklink": "عقب گرد",
+       "rollbacklink": "عأقأب گرد",
        "rollbacklinkcount": "ۉرگرد $1 {{PLURAL:$1|اصلاح|اصلاحل}}",
        "protectlogpage": "نمایه حفاظت ۉحمایت",
-       "namespace": "همدرنگل:",
-       "invert": "اÙ\86تخاب Ø¨Ø±Ø¹کس بوھ",
-       "tooltip-invert": "اÙ\86تخاب Ú©Û\89 Ø§Û\8c Ø¬Ø¹Ø¨Ù\86Ù\87 Ø³Û\8c Ù\82ائÙ\85 Ú©Ø±Ø¯Ù\86 ØªØºÛ\8cÛ\8cرÙ\84 Ø¨Ù\84Ú¯Ù\84Û\8c Ú©Ù\87 Ù\87Ù\85درÙ\86Ú¯Ù\84Ø´Û\89 Ø§Ù\86تخاب Û\89ابÛ\8cÙ\86\89 Ù\87Ù\85درÙ\86Ú¯Ù\84 Ù\85رتبط Ø§Ø± Ø§Ù\86تخاب Û\89ابین)",
-       "namespace_association": "همدرنگل مرتبط",
-       "tooltip-namespace_association": "اÙ\86تخاب Ú©Ù\88 Ø§Û\8c Ø¬Ø¹Ø¨Ù\86Ù\87 Ø³Û\8cÚ©Ù\87 Ú¯Ù¾ Û\8cا Ù\85Û\89ضÛ\89ع Ù\87Ù\85درÙ\86Ú¯ Ù\85رتبط Û\89ا Ù\87Ù\85درÙ\86Ú¯Ù\84 Ø§Ù\86تخاب Û\89ابÛ\8cÙ\86Ù\87 Ù\82رار Ø¨نی.",
-       "blanknamespace": "(اصلی)",
+       "namespace": "هۉمدیرأنگل:",
+       "invert": "ئÛ\8cÙ\86تخاب Ø¨Ø£Ø±Ø¹Ø£کس بوھ",
+       "tooltip-invert": "ئÛ\8cÙ\86تخاب Ú©Û\89 Ø¦Û\8c Ø¬Ø£Ú¤Ø£Ù\86Û\95 Ø³Û\8c Ù\82ائÙ\85 Ú©Ø±Ø¯Ù\86 ØªØ£ØºÛ\8cÛ\8cرÙ\84 Ø¨Ù\84Ú¯Ù\84Û\8c Ú©Û\95 Ù\87Ù\85درأÙ\86Ú¯Ù\84Ø´Û\89 Ø¦Û\8cÙ\86تخاب Ú¤Ø§Ø¨Û\8cÙ\86(Ú¤ Ù\87Ù\85دأرÙ\86Ú¯Ù\84 Ù\85Û\89رتأبط Ø§Ø± Ø¦Û\8cÙ\86تخاب Ú¤ابین)",
+       "namespace_association": "هۉمدرأنگل مۉرتأبط",
+       "tooltip-namespace_association": "ئÛ\8cÙ\86تخاب Ú©Û\89 Ø¦Û\8c Ø¬Ø£Ú¤Ø£Ù\86Û\95 Ø³Û\8cÚ©Û\95 Ú¯Ø£Ù¾ Û\8cا Ù\85Û\89ضÙ\88Ù\99ع Ù\87Û\89Ù\85درأÙ\86Ú¯ Ù\85Û\89رتأبط Ú¤Ø§ Ù\87Û\89Ù\85درأÙ\86Ú¯Ù\84 Ø¦Û\8cÙ\86تخاب Ú¤Ø§Ø¨Û\8cÙ\86Û\95 Ù\82رار Ø¨Ø¦نی.",
+       "blanknamespace": "(Ø£صلی)",
        "contributions": "{{GENDER:$1|سھمل}} کارۉر",
        "mycontris": "سھمل",
        "month": "مئنھ ای ماھ (ۉ قبل زھ ھۉ):",
        "year": "مئنھ ای سال (ۉ قبل زھ ھۉ):",
-       "whatlinkshere": "Ù\84Û\8cÙ\86Ú©Ù\84 Ø§Û\8c Ø¨Ù\84Ú¯Ù\87",
+       "whatlinkshere": "Ù\84Û\8cÙ\86Ú©Ù\84 Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95",
        "whatlinkshere-title": "بلگل که لینک دائنه ۉھ \"$1\"",
        "whatlinkshere-page": "بلگه",
        "linkshere": "لینک بلگل دۉمن الذکر ۉھ '''[[:$1]]''':",
        "whatlinkshere-hidetrans": "$1 تراگنجایش",
        "whatlinkshere-hidelinks": "$1 لینکل",
        "whatlinkshere-filters": "فیلترل",
-       "blocklink": "بسه بۉھ",
-       "contribslink": "شراکتل",
+       "blocklink": "بسە بۉھ",
+       "contribslink": "شۉراکأتل",
        "movelogpage": "نمایه جابجایی",
        "export": "بلگل صادرھ",
-       "thumbnail-more": "گپ کردن",
+       "thumbnail-more": "گأپ کردن",
        "tooltip-pt-userpage": "حسآۉ کارۉری ایشا",
        "tooltip-pt-mytalk": "بلگه گپ ایشا",
        "tooltip-pt-preferences": "اۉلۉیتل مۉ",
        "tooltip-pt-watchlist": "لیست بلگلی که ایشا تغییرل هۉنۉنه  دنبال اکنین",
        "tooltip-pt-mycontris": "لیست سھمل ایشا",
-       "tooltip-pt-login": "تۉصیه ۉابۉھ که ۉھ سیستم داخل بۉین. اما اجباری نیسس",
+       "tooltip-pt-login": "توٙصیە ڤابوٙھ کە ڤە سیستم داخل بوٙین. أما ئیجباری نیسس",
        "tooltip-pt-logout": "رتن زھ سیستم",
-       "tooltip-pt-createaccount": "تۉصیه ۉابۉھ که حسآۉ کارۉری راس بکنیت یا ۉارد بۉین. اما اجباری نیسس",
-       "tooltip-ca-talk": "قسھ د بلگه محتۉا",
+       "tooltip-pt-createaccount": "توٙصیە ڤابوٙھ کە حسآڤ کارڤأری راس بکنیت یا ڤە سیستم داخل بوٙین. اما ئیجباری نیسس",
+       "tooltip-ca-talk": "قسە د بألگە مۉحتڤا",
        "tooltip-ca-edit": "ایسھ ترین ای بلگھ نھ اصلاح کنیت.لطفا قبل اصلاح ای بلگھ ز دۉکمه پیش نمایش استفاده کنیت",
-       "tooltip-ca-addsection": "آغاز Ú©Ø±Ø¯Ù\86 Û\8cÙ\87 Ù\82سÙ\85ت Ù\86Û\89",
+       "tooltip-ca-addsection": "ئاغاز Ú©Ø±Ø¯Ù\86 Û\8cÛ\95 Ù\82سÙ\85ت Ù\86Ù\88Ù\99",
        "tooltip-ca-viewsource": "ای بلگه  دۉمن حمایته. \nایشا ترین سرچشمھ سھ بۉینین",
-       "tooltip-ca-history": "ۉیرگار",
+       "tooltip-ca-history": "ڤیرگار",
        "tooltip-ca-move": "جابجاکردن ای بلگه",
-       "tooltip-ca-watch": "اضاÙ\81 Ú©Ø±Ø¯Ù\86 Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Û\89Ú¾ Ù\84Û\8cست Ù¾Û\8cÚ¯Û\8cرÛ\8c Û\8cÙ\84 Ø§یشا",
-       "tooltip-search": "جستن {{SITENAME}}",
-       "tooltip-search-go": "رÛ\89 Ù\85ئÙ\86Ù\87 Ø¨Ù\84Ú¯Ù\87 Ø§Û\8c Û\89ا Ø§Û\8c Ù\86Û\89Ù\85 Ø§ر هیسس",
-       "tooltip-search-fulltext": "جستن بلگھ یل  سی ای متن",
-       "tooltip-p-logo": "رۉ د بلگھ اصلی",
-       "tooltip-n-mainpage": "رۉ د بلگھ اصلی",
-       "tooltip-n-mainpage-description": "رۉ د بلگھ اصلی",
-       "tooltip-n-portal": "درباره پرۉجه ، کارینه کھ تری بکنی ، ینه جا سی جستن چیزل",
-       "tooltip-n-currentevents": "سیل کردن اطلاعات زمینه یاسابقه اطلاعات مئن اتفاقل جاری",
-       "tooltip-n-recentchanges": "سÛ\8cائÙ\84 ØªØºÛ\8cÛ\8cرÙ\84 Ø¢Ø®Ø± Ù\85ئÙ\86 Ø§Û\8c Û\89یکی",
-       "tooltip-n-randompage": "سوار کردن یه بلگھ بختھ کی",
-       "tooltip-n-help": "ینه جا سی سیل کردن",
-       "tooltip-t-whatlinkshere": "فهرست همه بلگه یل ۉیکی که ایچۉ لینک دارن",
-       "tooltip-t-recentchangeslinked": "تغÛ\8cÛ\8cرÙ\84 Ø¢Ø®Ø± Ù\85ئÙ\86 Ø¨Ù\84Ú¯Ú¾ Ú©Ú¾ Ù\84Û\8cÙ\86Ú© Ø¯Ø§Ù\86Ù\87 Ù\88Ú¾ Ø§Û\8c Ø¨Ù\84Ú¯Ú¾",
+       "tooltip-ca-watch": "ئÛ\8cضاÙ\81 Ú©Ø±Ø¯Ù\86 Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ú¤Û\95 Ù\84Û\8cست Ù¾Û\8cÚ¯Û\8cرÛ\8c Û\8cÙ\84 Ø¦یشا",
+       "tooltip-search": "جۉستأن {{SITENAME}}",
+       "tooltip-search-go": "رÛ\89 Ù\85أئÙ\86Ù\87 Ø¨Ø£Ù\84Ú¯Û\95 Ø¦Û\8c Ú¤Ø§ Ø¦Û\8c Ù\86Û\89Ù\85 Ø£ر هیسس",
+       "tooltip-search-fulltext": "جۉستأن بألگە یل سی ئی مأتن",
+       "tooltip-p-logo": "رۉ د بألگە أصلی",
+       "tooltip-n-mainpage": "رۉ د بألگە أصلی",
+       "tooltip-n-mainpage-description": "رۉ د بألگە أصلی",
+       "tooltip-n-portal": "دربارھ پۉرۉجە ، کارینە کە تأری بکنی ، ینە جا سی جۉستأن چیزل",
+       "tooltip-n-currentevents": "سیل کردن اطلاعات زأمینە یا سابقە اطلاعات مئن اتفاقل جاری",
+       "tooltip-n-recentchanges": "سÛ\8cائÙ\84 ØªØ£ØºÛ\8cÛ\8cرÙ\84 Ø¢Ø®Ø± Ù\85ئÙ\86 Ø¦Û\8c Ú¤یکی",
+       "tooltip-n-randompage": "سڤار کردن یە بألگە بأختە کی",
+       "tooltip-n-help": "ینە جا سی سیل کردن",
+       "tooltip-t-whatlinkshere": "فهرست همە بألگە یل ڤیکی کە ئیچوٙ لینک دارن",
+       "tooltip-t-recentchangeslinked": "تأغÛ\8cÛ\8cرÙ\84 Ø¢Ø®Ø± Ù\85ئÙ\86 Ø¨Ø£Ù\84Ú¯Û\95 Ú©Û\95 Ù\84Û\8cÙ\86Ú© Ø¯Ø§Ù\86Û\95 Ú¤Û\95 Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95",
        "tooltip-feed-atom": "تغذیه کچک ترین جزء  ای بلگه",
        "tooltip-t-contributions": "یه لیست ز مشارکت کنندھ یل ۉ مقاله دهندھ یل ای بلگه",
        "tooltip-t-upload": "بلم گیر کردن فایلل",
-       "tooltip-t-specialpages": "بلگھ یل ۉیجه",
-       "tooltip-t-print": "ورژن سی چاپ ای بلگھ",
-       "tooltip-t-permalink": "لینکل دائمی ۉھ ای ۉرژن ای بلگھ",
-       "tooltip-ca-nstab-main": "دیئن بلگھ محتۉا",
+       "tooltip-t-specialpages": "بألگە یل ڤیجە",
+       "tooltip-t-print": "ویرژن سی چاپ ئی بألگە",
+       "tooltip-t-permalink": "لینکل دائمی ڤە ئی ۉیرژن ئی بألگە",
+       "tooltip-ca-nstab-main": "دیئن بألگە مۉحتڤا",
        "tooltip-ca-nstab-user": "دیئن بلگه کارۉر",
-       "tooltip-ca-nstab-special": "اÛ\8c Ø¨Ù\84Ú¯Ù\87 Ú¾Ø§ Û\89Û\8cجھ Ù\88 Ø§Û\8cشا Ù\86Û\8cترÛ\8cÙ\86 Ø®Ù\88د Ø§Û\8c Ø¨Ù\84Ú¯Ù\86Ù\87 Ø§صلاح کنیت",
+       "tooltip-ca-nstab-special": "ئÛ\8c Ø¨Ø£Ù\84Ú¯Û\95 Ú¾Ø§ Ú¤Û\8cجÛ\95 Ú¤ Ø¦Û\8cشا Ù\86Û\8cتأرÛ\8cÙ\86 Ø®Û\89د Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Ù\86Û\95 Ø¦Û\8cصلاح کنیت",
        "tooltip-ca-nstab-project": "دیئن بلگه پرۉجه",
-       "tooltip-ca-nstab-image": "دیئن بلگه فایل",
+       "tooltip-ca-nstab-image": "دیئن بألگە فایل",
        "tooltip-ca-nstab-template": "دیئن قالب",
-       "tooltip-ca-nstab-category": "دیئن بلگه دسه بنی",
+       "tooltip-ca-nstab-category": "دیئن بألگە دسە بأنی",
        "tooltip-save": "ضبط کردن تغییرل ایشا",
        "tooltip-preview": " دیئن تغییرل ، لطفا قبل ضبط کردن د ای خدمت استفادھ کنیت!",
        "tooltip-diff": "دیئن تغییرلی که ایشا مئن ای متن انجام دادینه",
-       "tooltip-rollback": "\"اعادھ\" ۉرگردۉندن به وضع اولیه سی ای بلگه که سی مشارکت  آخر اصلاح ۉابیدھ ۉا یھ کلیک",
+       "tooltip-rollback": "\"اعادە\" ۉرگأردوٙندأن بە ڤأضع أڤألیە سی ئی بألگە کە سی مۉشارکأت  ئاخر ئیصلاح ڤابیدھ ڤا یە کلیک",
        "tooltip-undo": "\"لغو\"ۉرگشت ای اصلاح ۉ ۉا ۉیدن فرم اصلاح مئنه پیش نمایش.اجازھ ایدھ که یه دلیل ۉھ خلاصه اضافه بکنی.",
        "tooltip-summary": "یه خلاصه کچکی بنویسیت",
        "simpleantispam-label": "انتخاب آنتی-اسپم\nپر <strong>نکنیت</strong> اینه مئن!",
-       "pageinfo-toolboxlink": "اطلاعات بلگه",
+       "pageinfo-toolboxlink": "اطلاعات بألگە",
        "previousdiff": "← اصلاح قدیمی",
        "nextdiff": "اصلاح نۉتر→",
        "file-info-size": "$1 × $2 پیکسل, اندازھ فایل: $3, MIME نۉع: $4",
        "file-nohires": "قابلیت تفکیک بالاتری در دسترس نی.",
        "svg-long-desc": "SVG فایل, تقریبا$1 × $2 پیکسل, اندازھ فایل: $3",
-       "show-big-image": "اÙ\86دازھ Ø§صلی",
-       "show-big-image-preview": "اÙ\86دازھ Ø§ی پیش نمایش:$1.",
-       "show-big-image-other": "دیه {{PLURAL:$2|تفکیک پذیری|تفکیک پذیری یل}}: $1.",
+       "show-big-image": "اÙ\86دازھ Ø£صلی",
+       "show-big-image-preview": "اÙ\86دازھ Ø¦ی پیش نمایش:$1.",
+       "show-big-image-other": "دیە {{PLURAL:$2|تأفکیک پأذیری|تأفکیک پأذیری یل}}: $1.",
        "show-big-image-size": "$1 × $2 پیکسلل",
        "metadata": "فرادادھ",
        "metadata-help": " ای فایل دارای اطلاعات اضافه‌ای هی که احتمالاً ۉا دۉربین دیجیتالی‌ یا پۉیشگری که سی ایجاد یا دیجیتالی‌کردن هۉ ۉھ کار رهدھ اضاف ۉابیدھ . ایر فایل زھ ۉضعیت اۉلیه اس تغییر دادھ ۉابیدھ بوھ ممکنه همه توضیحات مۉجود اطلاعات عیس رنھ منعکس نکنه.",
-       "metadata-fields": "زمینه یل عیس فرادادھ که مئنه ای پیۉم لیس ۉابینه ، قرار ۉابی گرتن ری بلگه نۉمایش عیس ۉقتی که جدۉل فرادادھ فرۉریخت.\nبقیه قائم میشن ۉھ صۉرت پیش فرض.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-fields": "زأمینە یل عأیس فرادادھ کە مأئنە ئی پیوٙم لیس ڤابینە ، قرار ڤابی گرتن ری بألگە نوٙمایش عأیس ۉقتی کە جدڤل فرادادھ فروٙریخت.\nبقیە قائم میشن ڤە صوٙرت پیش فأرض.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-orientation": "گرایش",
        "exif-xresolution": "تفکیک پذیری افقی",
        "exif-yresolution": "تفکیک پذیری عمۉدی",
        "exif-datetimeoriginal": "تاریخ ۉ زمان تۉلید دادھ یل",
        "exif-datetimedigitized": "تاریخ ۉ زمان دیجیتالی ۉابیدن",
        "exif-orientation-1": "عادی",
-       "namespacesall": "همه",
+       "namespacesall": "همە",
        "monthsall": "همه",
        "semicolon-separator": "؛&#32;",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|گپ]])",
-       "specialpages": "بلگھ یل ۉیجھ",
-       "tag-filter": "[[Special:Tags|برÚ\86سب]] فیلتر:",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|برÚ\86سب|برچسبل}}]]: $2)",
+       "specialpages": "بألگە یل ڤیجە",
+       "tag-filter": "[[Special:Tags|بأرÚ\86Ø£سب]] فیلتر:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|بأرÚ\86سب|بأرچسبل}}]]: $2)",
        "logentry-delete-delete": "$1 {{GENDER:$2|حذف ۉابیدھ}} بلگه $3",
        "logentry-move-move": "$1 {{GENDER:$2|انتقال دادھ بیه}} بلگه $3 ۉھ $4",
-       "logentry-newusers-create": "حسآۉ کارۉر $1 ۉابیه {{GENDER:$2|راس ۉیدھ }}",
+       "logentry-newusers-create": "حسآۉ کارڤأر $1 ڤابیە {{GENDER:$2|راس ڤیدھ }}",
        "logentry-upload-upload": "$1 {{GENDER:$2|بلم گیر کردھ ۉابی}} $3",
-       "searchsuggest-search": "جستن"
+       "searchsuggest-search": "جۉستأن"
 }
index 09d4ecd..72af342 100644 (file)
        "linksearch-pat": "Meklēt:",
        "linksearch-ns": "Vārdtelpas:",
        "linksearch-ok": "Meklēt",
-       "linksearch-text": "Atbalstītie protokoli: <code>$1</code>",
+       "linksearch-text": "Atbalstītie protokoli: $1",
        "linksearch-line": "$1 ir izveidota saite no $2",
        "listusersfrom": "Parādīt lietotājus sākot ar:",
        "listusers-submit": "Parādīt",
index 46c4e7f..6d892f1 100644 (file)
        "resetpass-abort-generic": "符節不可更",
        "passwordreset": "重設符節",
        "passwordreset-text-one": "慾更符節,填此佇列",
-       "passwordreset-legend": "重設符節",
        "passwordreset-username": "簿名:",
        "passwordreset-domain": "域:",
        "passwordreset-email": "電郵址",
        "nlinks": "$1鏈",
        "nmembers": "$1戶",
        "nrevisions": "$1審",
-       "nviews": "$1閱",
        "nimagelinks": "用以頁有$1",
        "ntransclusions": "用以頁有$1",
        "lonelypages": "孤寡",
        "linksearch-pat": "尋址:",
        "linksearch-ns": "名集:",
        "linksearch-ok": "尋",
-       "linksearch-text": "用似\"*.wikipedia.org\"之萬字。<br />\n援之議:<code>$1</code>",
+       "linksearch-text": "用似\"*.wikipedia.org\"之萬字。<br />\n援之議:$1",
        "linksearch-line": "$1連$2",
        "linksearch-error": "萬字僅用於機之始也。",
        "listusersfrom": "始簿:",
index 7ea0395..6802243 100644 (file)
        "passwordreset": "कूटशब्द फेरसँ बनाउ",
        "passwordreset-text-one": "अपन कूटशब्द रीसेट करवाक लेल इ फारम भरु ।",
        "passwordreset-text-many": "{{PLURAL:$1|ई-पत्रके माध्यमसऽ एकटा अस्थायी कूटशब्द पावैलेल कोनो एकटा डिब्बा भरु ।}}",
-       "passwordreset-legend": "कूटशब्द फेरसँ बनाउ",
        "passwordreset-disabled": "कूटशब्द फेरसँ बनाएब ऐ विकीपर अक्षम कएल अछि।",
        "passwordreset-emaildisabled": "कूटशब्द फेरसँ बनाएब ऐ विकीपर अक्षम कएल अछि।",
        "passwordreset-username": "प्रयोक्तानाम",
        "resettokens": "टोकन रीसेट करी",
        "resettokens-text": "जे स्तोक अहाँके खाता सँ सम्बद्ध किछु विशिष्ट व्यक्तिगत जानकारी प्रदान करएत अछि, अहाँ वोकरा एतए सँ रिसेट कऽ सकएत छी।\n\nयदि अहाँ एकरा गलती सँ केकरो देखा देनए छी वा अहाँ के खाता ह्याक भ गेल अछि तहन अहाँके एकरा रिसेट कऽ देना चाही।",
        "resettokens-no-tokens": "रीसेट करवाक लेल कोनो टोकन नै अछि।",
-       "resettokens-legend": "टोकन रीसेट करी",
        "resettokens-tokens": "टोकन:",
        "resettokens-token-label": "$1 (वर्तमान मूल्य: $2)",
        "resettokens-watchlist-token": "[[Special:Watchlist|अहाँके साकांक्षसूची के पृष्ठसभ में परिवर्तन सभ]] के वेब फिट (Atom/RSS) लेल स्तोक",
        "nmembers": "$1 {{PLURAL:$1|सदस्य|सदस्य सभ}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|प्रयोक्ता|प्रयोक्ता सभ}}",
        "nrevisions": "$1{{PLURAL:$1|संशोधन|संशोधन सभ}}",
-       "nviews": "$1 {{PLURAL:$1|दृश्य|दृश्य सभ}}",
        "nimagelinks": "$1पर प्रयुक्त {{PLURAL:$1|पन्ना|पन्ना सभ}}",
        "ntransclusions": "$1पर प्रयुक्त {{PLURAL:$1|पन्ना|पन्ना सभ}}",
        "specialpage-empty": "ऐ पन्ना लेल कोनो परिणाम नै अछि।",
        "linksearch-pat": "खोज तरीका:",
        "linksearch-ns": "नामस्थान :",
        "linksearch-ok": "ताकू",
-       "linksearch-text": "ब्रह्मास्त्र जेना \"*.wikipedia.org\" प्रयोग कएल जा सकैए।\nसहायक संविद:<code>$1</code> (खोजमे ऐमेसँ कोनो नै जोड़ू)।",
+       "linksearch-text": "ब्रह्मास्त्र जेना \"*.wikipedia.org\" प्रयोग कएल जा सकैए।\nसहायक संविद:$1 (खोजमे ऐमेसँ कोनो नै जोड़ू)।",
        "linksearch-line": "$2 सँ $1 क लागि अछि।",
        "linksearch-error": "निमंत्रकनामक प्रारम्भमे ब्रह्मास्त्र आबि सकैए।",
        "listusersfrom": "प्रयोक्ता प्रदर्शन प्रारम्भ भेल:",
index 2e0ae65..c7740ce 100644 (file)
        "resetpass-wrong-oldpass": "Аф виде ёткопингонь эли тяниень сувама валсь.\nУлема тон полафтыть сувама валце ни эли кучеть вешфкс од ёткопингонь сувама вал кундаманкса.",
        "resetpass-temp-password": "Пингонь сувама валсь:",
        "passwordreset": "Полафтомс сувама валцень",
-       "passwordreset-legend": "Полафтомс сувама валцень",
        "passwordreset-disabled": "Сувама валсь аф полафтови тя викить эса.",
        "passwordreset-username": "Тиить лемоц",
        "passwordreset-domain": "Домен:",
        "nlinks": "$1 {{PLURAL:$1|сюлмафкс|сюлмафкст}}",
        "nmembers": "$1 {{PLURAL:$1|сувси|сувсихть}}",
        "nrevisions": "$1 {{PLURAL:$1|верзие|верзиет}}",
-       "nviews": "$1 {{PLURAL:$1|няфтема|няфтемат}}",
        "specialpage-empty": "Тя информациень коряс мезеге изь мув.",
        "lonelypages": "Уроз лопат",
        "lonelypagestext": "Ся лопатне афи сюлмафт афи сотфт иля лопатнень мархта {{SITENAME}}са.",
        "linksearch-pat": "Вешендема кепотькс:",
        "linksearch-ns": "Лемботмоц:",
        "linksearch-ok": "Вешендемс",
-       "linksearch-text": "Сембекондясти лепне \"*.wikipedia.org\" кондяма ули кода нолдамс тевс.<br />\nКирдеви протоколхне: <code>$1</code>",
+       "linksearch-text": "Сембекондясти лепне \"*.wikipedia.org\" кондяма ули кода нолдамс тевс.<br />\nКирдеви протоколхне: $1",
        "linksearch-line": "$1 сюлмаф $2ста",
        "linksearch-error": "Сембекондясти лепненди ули кода тихтедемс аньцек интернет сюлма лемть ушетксонза.",
        "listusersfrom": "Няфтемс тиихть ушедомс:",
index 1d8ee1f..c9a50df 100644 (file)
        "passwordreset": "Famafana ary famerenana ny tenimiafina",
        "passwordreset-text-one": "Fenoy ity fôrmiolera ity mba hamerenana ny tenimiafinao",
        "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.",
        "passwordreset-username": "Anaram-pikambana :",
        "resettokens": "Hamerina ny token",
        "resettokens-text": "Azonao averina eto ny token izay hahafahana mitsidika ny fampahalalana tsy sarababem-bahoaka ao amin'ny kaontinao. Tokony ataonao izany raha voazara tsy fanahy iniana na raha nisy nangalatra ny kaontinao.",
        "resettokens-no-tokens": "Tsy misy token ho averina",
-       "resettokens-legend": "Famerenana ny token",
        "resettokens-tokens": "Token:",
        "resettokens-token-label": "$1 (sanda ankehitriny: $2)",
        "resettokens-watchlist-token": "Token ho an'ny fahna web (Atom/RSS) ho an'ny  [[Special:Watchlist|fanovana ny pejy ao amin'ny lisitry ny pejy arahanao]]",
        "nlinks": "{{PLURAL:$1|rohy|rohy}} $1",
        "nmembers": "{{PLURAL:$1|mpikambana|mpikambana}} $1",
        "nrevisions": "{{PLURAL:$1|fanovana|fanovana}} $1",
-       "nviews": "{{PLURAL:}}Tsidika $1",
        "nimagelinks": "Ampiasain'ny pejy miisa{{PLURAL:}} $1",
        "ntransclusions": "Ampiasaina eo amin'ny pejy miisa $1 {{PLURAL:}}",
        "specialpage-empty": "Tsy misy valiny ho aseho.",
        "linksearch-pat": "Volana tadiavina :",
        "linksearch-ns": "Anaran-tsehatra :",
        "linksearch-ok": "Fikarohana",
-       "linksearch-text": "Azo ampiasaina ny soratra joker toa i « *.wikipedia.org ».\nMila top-level domain ambonimbony kokoa izy ireo, sahala « *.org » <br />\nProtokoly zaka <code>$1</code> aza ampiana ao amin'ny karokao izy ireo.",
+       "linksearch-text": "Azo ampiasaina ny soratra joker toa i « *.wikipedia.org ».\nMila top-level domain ambonimbony kokoa izy ireo, sahala « *.org » <br />\nProtokoly zaka $1 aza ampiana ao amin'ny karokao izy ireo.",
        "linksearch-line": "$1 dia voarohy amin'ny $2",
        "linksearch-error": "Ny soratra joker dia ampiasaina anatin'ny fanombohan'ny anaran-tsehatry ny milina hôte ihany.",
        "listusersfrom": "Haneho ny mpikambana manomboka amin'ny :",
        "tooltip-pt-logout": "Hidio",
        "tooltip-pt-createaccount": "Amporisihana mafy ianao hanokatra kaonty ary miditra; na dia izany aza, tsy voatery atao izany.",
        "tooltip-ca-talk": "resaka momba io takelaka io",
-       "tooltip-ca-edit": "Azonao atao no manova n'ity pejy ity.\nAmpesao ny topi-maso aloha no mihatiry.",
+       "tooltip-ca-edit": "Hanova ity pejy ity",
        "tooltip-ca-addsection": "hanomboka fizaràna vaovao",
        "tooltip-ca-viewsource": "Voaaro ilay pejy. Fa afaka itanao ny voatotiny.",
        "tooltip-ca-history": "Ny revision natao tamin'ity pejy ity",
        "watchlisttools-view": "pejy arahako maso",
        "watchlisttools-edit": "Jereo sy ovao ny lisitra ny pejy fanaraha-maso",
        "watchlisttools-raw": "Ovay ilay pejy arahako maso amizao",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|resaka]])",
        "duplicate-defaultsort": "'''Tandremo''' : manitsaka ny sort key taloha \"$1\" ilay sort key ankehitriny \"$2\".",
        "version": "Versiona",
        "version-extensions": "Fanitarana nampidirina",
index 5629515..c8dec2a 100644 (file)
        "protectedinterface": "Оваа страница содржи текст од посредникот на програмот на ова вики и е превентивно заштитена поради можна злоупотреба.\nЗа да додавате или менувате преводи на сите викија, појдете на [//translatewiki.net/wiki/Main_Page?uselang=mk translatewiki.net] — проектот за преведување на МедијаВики.",
        "editinginterface": "<strong>Предупредување:</strong> Уредувате страница која е дел од корисничкиот посредник на програмот МедијаВики.\nПромените на оваа страница ќе предизвикаат промени во корисничкиот посредник кај другите корисници на ова вики.",
        "translateinterface": "За да додадете или измените превод на сите викија, појдете на [//translatewiki.net/wiki/Main_Page?setlang=mk translatewiki.net] — проектот за преведување на МедијаВики.",
-       "cascadeprotected": "Ð\9eваа Ñ\81Ñ\82Ñ\80аниÑ\86а Ðµ Ð·Ð°Ñ\88Ñ\82иÑ\82ена Ð¾Ð´ Ñ\83Ñ\80едÑ\83ваÑ\9aа Ð±Ð¸Ð´ÐµÑ\98Ñ\9cи Ðµ Ð²ÐºÐ»Ñ\83Ñ\87ена во {{PLURAL:$1|следнава страница, којашто е заштитена|следниве страници, коишто се заштитени}} со можноста „каскадна заштита“:\n$2",
+       "cascadeprotected": "Ð\9eваа Ñ\81Ñ\82Ñ\80аниÑ\86а Ðµ Ð·Ð°Ñ\88Ñ\82иÑ\82ена Ð¾Ð´ Ñ\83Ñ\80едÑ\83ваÑ\9aа Ð±Ð¸Ð´ÐµÑ\98Ñ\9cи Ðµ Ð¿Ñ\80евмеÑ\82наÑ\82а во {{PLURAL:$1|следнава страница, којашто е заштитена|следниве страници, коишто се заштитени}} со можноста „каскадна заштита“:\n$2",
        "namespaceprotected": "Немате дозвола за уредување страници во именскиот простор '''$1'''.",
        "customcssprotected": "Немате дозвола да ја менувате оваа страница со CSS бидејќи содржи туѓи лични нагодувања.",
        "customjsprotected": "Немате дозвола да ја менувате оваа страница со JavaScript  бидејќи содржи туѓи лични нагодувања.",
        "readonlywarning": "'''ПРЕДУПРЕДУВАЊЕ: Базата на податоци е заклучена заради одржување, па нема да можете да ги зачувате промените сега.\n\nВи препорачуваме да го прекопирате текстот на текстуална податотека за да го зачувате за подоцна.'''\n\nАдминистраторот кој ја заклучил базата на податоци го дал следново објаснување: $1",
        "protectedpagewarning": "'''Предупредување:  Оваа страница е заклучена, така што само корисници со администраторски привилегии можат да ја уредуваат.'''\nЗа ваша информација, последната ставка во дневникот на промени е прикажана подолу:",
        "semiprotectedpagewarning": "'''Предупредување:'''  Оваа страница е заштитена, така што може да ја уредуваат само регистрирани корисници.'''\nЗа ваша информација, подолу е прикажана последната ставка во дневникот на измени:",
-       "cascadeprotectedwarning": "'''Предупредување:''' Оваа страница е заклучена, така што можат да ја уредуваат само корисници со администраторски привилегии, бидејќи е вклучена во {{PLURAL:$1|следнава „преносно-заштитена“ страница|следниве „преносно-заштитени“ страници}}:",
+       "cascadeprotectedwarning": "<strong>Предупредување:</strong> Оваа страница е заклучена, така што можат да ја уредуваат само корисници со администраторски привилегии, бидејќи е вклучена во {{PLURAL:$1|следнава „преносно-заштитена“ страница|следниве „преносно-заштитени“ страници}}:",
        "titleprotectedwarning": "'''Предупредување:'''  Оваа страница е заклучена, така што се потребни [[Special:ListGroupRights|посебни права]] за да се создаде.''''\nЗа ваша информација, последната ставка во дневникот на промени е прикажана подолу:",
        "templatesused": "{{PLURAL:$1|Шаблон|Шаблони}} на страницава:",
        "templatesusedpreview": "{{PLURAL:$1|Шаблон|Шаблони}} на прегледуваната страница:",
        "linksearch-pat": "Услов за пребарување:",
        "linksearch-ns": "Именски простор:",
        "linksearch-ok": "Барај",
-       "linksearch-text": "Може да се користат џокери, како на „*.wikipedia.org“.\nБара барем највисок домен, како на пр. „*.org“.<br />\n{{PLURAL:$2|Поддржан протокол|Поддржани протоколи}}: <code>$1</code> (задава http:// ако не укажете протокол).",
+       "linksearch-text": "Може да се користат џокери, како на „*.wikipedia.org“.\nБара барем највисок домен, како на пр. „*.org“.<br />\n{{PLURAL:$2|Поддржан протокол|Поддржани протоколи}}: $1 (задава http:// ако не укажете протокол).",
        "linksearch-line": "$1 врска во $2",
        "linksearch-error": "Џокер-знаците може да се користат само на почетокот во името на домаќинот.",
        "listusersfrom": "Прикажи корисници почнувајќи од:",
        "protect-locked-blocked": "Не можете да ја менувате заштитата додека сте блокирани. Овде се\nдадени актуелните нагодувања за страницата '''$1''':",
        "protect-locked-dblock": "Степенот на заштита не може да се измени бидејќи базата на податоци е заклучена.\nОвде се дадени тековните нагодувања на страницата '''$1''':",
        "protect-locked-access": "Вашата корисничка сметка нема дозвола за менување на степенот на заштита.\nОвде се дадени тековните нагодувања за оваа страница '''$1''':",
-       "protect-cascadeon": "Ð\9eваа Ñ\81Ñ\82Ñ\80аниÑ\86а Ðµ Ð¼Ð¾Ð¼ÐµÐ½Ñ\82ално Ð·Ð°Ñ\88Ñ\82иÑ\82ена Ð±Ð¸Ð´ÐµÑ\98Ñ\9cи Ðµ Ð²ÐºÐ»Ñ\83Ñ\87ена во {{PLURAL:$1|следнава страница, за која е|следниве страници, за кои се}} под каскадна заштита.\nИзмените во степенот на заштита на страницава нема да влијаат на каскадната заштита.",
+       "protect-cascadeon": "Ð\9eваа Ñ\81Ñ\82Ñ\80аниÑ\86а Ðµ Ð¼Ð¾Ð¼ÐµÐ½Ñ\82ално Ð·Ð°Ñ\88Ñ\82иÑ\82ена Ð±Ð¸Ð´ÐµÑ\98Ñ\9cи Ðµ Ð¿Ñ\80евемÑ\82наÑ\82а во {{PLURAL:$1|следнава страница, за која е|следниве страници, за кои се}} под каскадна заштита.\nИзмените во степенот на заштита на страницава нема да влијаат на каскадната заштита.",
        "protect-default": "Допуштено за сите корисници",
        "protect-fallback": "Допуштај само корисници со дозвола „$1“",
        "protect-level-autoconfirmed": "Допуштај само автопотврдени корисници",
        "pageinfo-robot-index": "Дозволено",
        "pageinfo-robot-noindex": "Недозволено",
        "pageinfo-watchers": "Број на набљудувачи",
-       "pageinfo-visiting-watchers": "Број на набљудувачи на страницата што ги посетуваат скорешните уредувања",
+       "pageinfo-visiting-watchers": "Број на набљудувачи на страницата што ги посетиле скорешните уредувања",
        "pageinfo-few-watchers": "Помалку од $1 {{PLURAL:$1|набљудувач|набљудувачи}}",
        "pageinfo-few-visiting-watchers": "Не се знае дали има набљудувач што ги посетува скорешните уредувања",
        "pageinfo-redirects-name": "Пренасочувања кон страницата",
        "htmlform-cloner-create": "Додај уште",
        "htmlform-cloner-delete": "Отстрани",
        "htmlform-cloner-required": "Се бара барем една вредност.",
+       "htmlform-title-badnamespace": "[[:$1]] не се наоѓа во именскиот простор „{{ns:$2}}“.",
+       "htmlform-title-not-creatable": "Насловот „$1“ не може да се создава",
+       "htmlform-title-not-exists": "[[:$1]] не постои.",
+       "htmlform-user-not-exists": "<strong>$1</strong> не постои.",
+       "htmlform-user-not-valid": "<strong>$1</strong> не претставува важечко корисничко име.",
        "sqlite-has-fts": "$1 со поддршка за пребарување по цели текстови",
        "sqlite-no-fts": "$1 без поддршка за пребарување по цели текстови",
        "logentry-delete-delete": "$1 {{GENDER:$2|ја избриша}} страницата $3",
index 610119b..ef2c4a0 100644 (file)
        "protectedinterface": "ഈ താൾ ഈ വിക്കിയുടെ സോഫ്റ്റ്‌വെയറിന്റെ സമ്പർക്കമുഖ എഴുത്തുകൾ നൽകുന്നു, അതുകൊണ്ട് ദുരുപയോഗം തടയാൻ ബന്ധിക്കപ്പെട്ടിരിക്കുന്നു. എല്ലാ വിക്കികൾക്കുമായി പരിഭാഷ കൂട്ടിച്ചേർക്കാനോ, പരിഭാഷയിൽ മാറ്റം വരുത്താനോ, ദയവായി മീഡിയവിക്കി പ്രാദേശീകരണ പദ്ധതിയായ [//translatewiki.net/ translatewiki.net] ഉപയോഗിക്കുക.",
        "editinginterface": "<strong>മുന്നറിയിപ്പ്:<strong> സോഫ്റ്റ്‌വെയറിൽ സമ്പർക്കമുഖം നിലനിർത്തുന്ന താളാണു താങ്കൾ തിരുത്തുവാൻ പോകുന്നത്.\nഈ താളിൽ താങ്കൾ വരുത്തുന്ന മാറ്റങ്ങൾ ഉപയോക്താക്കൾ വിക്കി കാണുന്ന വിധത്തെ മാറ്റിമറിച്ചേക്കാം.",
        "translateinterface": "എല്ലാ വിക്കികൾക്കും ഉപയോഗിക്കാനാവുംവിധം പരിഭാഷകൾ കൂട്ടിച്ചേർക്കാനും മാറ്റംവരുത്താനും മീഡിയവിക്കി സന്ദേശങ്ങളുടെ പ്രാദേശികവത്കരണ പദ്ധതിയായ [//translatewiki.net/ translatewiki.net] ഉപയോഗിക്കുവാൻ താല്പര്യപ്പെടുന്നു.",
-       "cascadeprotected": "നിർഝരിത (cascading) സൗകര്യം ഉപയോഗിച്ച് തിരുത്തൽ നടത്തുന്നതിനു സം‌രക്ഷണം ഏർപ്പെടുത്തിയിട്ടുള്ള {{PLURAL:$1|താഴെ കൊടുത്തിട്ടുള്ള താളിന്റെ|താഴെ കൊടുത്തിട്ടുള്ള താളുകളുടെ}} ഭാഗമാണ്‌ ഈ താൾ. അതിനാൽ ഈ താൾ തിരുത്താൻ സാധിക്കില്ല:\n$2",
+       "cascadeprotected": "\"നിർഝരിത\" (cascading) സൗകര്യം ഉപയോഗിച്ച് തിരുത്തൽ നടത്തുന്നതിനു സം‌രക്ഷണം ഏർപ്പെടുത്തിയിട്ടുള്ള {{PLURAL:$1|താഴെ കൊടുത്തിട്ടുള്ള താളിന്റെ|താഴെ കൊടുത്തിട്ടുള്ള താളുകളുടെ}} ഭാഗമാണ്‌ ഈ താൾ. അതിനാൽ ഈ താൾ തിരുത്താൻ സാധിക്കില്ല:\n$2",
        "namespaceprotected": "'''$1''' നാമമേഖലയിലുള്ള താളുകൾ തിരുത്താൻ താങ്കൾക്ക് അനുവാദമില്ല.",
        "customcssprotected": "ഈ സി.എസ്.എസ്. താളിൽ മറ്റൊരു ഉപയോക്താവിന്റെ സ്വകാര്യസജ്ജീകരണങ്ങൾ ഉൾക്കൊള്ളുന്നു, അതിനാൽ താങ്കൾക്ക് ഈ താൾ തിരുത്താൻ അനുവാദമില്ല.",
        "customjsprotected": "ഈ ജാവാസ്ക്രിപ്റ്റ് താളിൽ മറ്റൊരു ഉപയോക്താവിന്റെ സ്വകാര്യസജ്ജീകരണങ്ങൾ ഉൾക്കൊള്ളുന്നു, അതിനാൽ താങ്കൾക്ക് ഈ താൾ തിരുത്താൻ അനുവാദമില്ല.",
        "creating": "$1 സൃഷ്ടിക്കുന്നു",
        "editingsection": "തിരുത്തുന്ന താൾ:- $1 (ഉപവിഭാഗം)",
        "editingcomment": "തിരുത്തുന്ന താൾ:- $1 (പുതിയ ഉപവിഭാഗം)",
-       "editconflict": "താà´\99àµ\8dà´\95ൾ à´µà´°àµ\81à´¤àµ\8dതിയ à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99ൾ à´\87à´\9fà´¯àµ\8dà´\95àµ\8dà´\95àµ\8d à´®à´±àµ\8dറാരàµ\8b à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99ൾ à´µà´°àµ\81à´¤àµ\8dതിയതിനാൽ à´¸àµ\87à´µàµ\8d à´\9aàµ\86à´¯àµ\8dയാൻ à´\95ഴിയിലàµ\8dà´². à´¤à´¿à´°àµ\81à´¤àµ\8dതലàµ\81à´\95ൾ à´\92à´¤àµ\8dà´¤àµ\81à´\9aàµ\87രാതàµ\8dതതàµ\8d à´¤à´¾à´\99àµ\8dà´\95ൾ à´¤à´¨àµ\8dà´¨àµ\86 à´ªà´°à´¿à´¹à´°à´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\8b?",
+       "editconflict": "തിരàµ\81à´¤àµ\8dതൽ à´¸à´®à´°à´¸à´ªàµ\8dà´ªàµ\86à´\9fായàµ\8dà´\95: $1",
        "explainconflict": "താങ്കൾ തിരുത്താൻ തുടങ്ങിയതിനു ശേഷം ഈ താൾ മറ്റാരോ തിരുത്തി സേവ് ചെയ്തിരിക്കുന്നു.\nമുകളിലുള്ള ടെക്സ്റ്റ് ഏരിയയിൽ നിലവിലുള്ള ഉള്ളടക്കം കാണിക്കുന്നു.\nതാങ്കൾ ഉള്ളടക്കത്തിൽ വരുത്തിയ മാറ്റങ്ങൾ താഴെയുള്ള ടെക്സ്റ്റ് ഏരിയയിൽ കാണിക്കുന്നു.\nതാങ്കളുടെ മാറ്റങ്ങൾ മുകളിലെ ടെക്സ്റ്റ് ഏരിയയിലേക്ക് സം‌യോജിപ്പിക്കുക.\nതാങ്കൾ '''സേവ് ചെയ്യുക''' എന്ന ബട്ടൺ അമർത്തുമ്പോൾ '''മുകളിലെ ടെക്സ്റ്റ് ഏരിയയിലുള്ള എഴുത്തുകൾ മാത്രമേ''' സേവ് ആവുകയുള്ളൂ.",
        "yourtext": "താങ്കൾ എഴുതി ചേർത്തത്",
        "storedversion": "മുമ്പേയുള്ള നാൾപതിപ്പ്",
        "readonlywarning": "'''മുന്നറിയിപ്പ്: ഡേറ്റാബേസ് പരിപാലനത്തിനു വേണ്ടി ബന്ധിച്ചിരിക്കുന്നു, അതുകൊണ്ട് താങ്കളിപ്പോൾ വരുത്തിയ മാറ്റങ്ങൾ സേവ് ചെയ്യാൻ സാദ്ധ്യമല്ല.''' താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ ഒരു ടെക്സ്റ്റ് ഫയലിലേക്ക് പകർത്തി (കോപ്പി & പേസ്റ്റ്) പിന്നീടുപയോഗിക്കുന്നതിനായി കരുതിവക്കാൻ താല്പര്യപ്പെടുന്നു. ഡേറ്റാബേസ് ബന്ധിച്ച അഡ്മിനിസ്ട്രേറ്റർ നൽകിയ വിശദീകരണം: $1",
        "protectedpagewarning": "'''മുന്നറിയിപ്പ്:  ഈ താൾ കാര്യനിർവാഹക പദവിയുള്ളവർക്കു മാത്രം തിരുത്താൻ സാധിക്കാവുന്ന തരത്തിൽ സം‌രക്ഷിക്കപ്പെട്ടിരിക്കുന്നു.''' അവലംബമായി രേഖകളിൽ ലഭ്യമായ ഏറ്റവും പുതിയ വിവരം താഴെ നൽകിയിരിക്കുന്നു:",
        "semiprotectedpagewarning": "'''ശ്രദ്ധിക്കുക:'''അംഗത്വമെടുത്തിട്ടുള്ളവർക്കുമാത്രം തിരുത്താൻ സാധിക്കുന്ന വിധത്തിൽ ഈ താൾ സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്നു. അവലംബമായി രേഖകളിലെ ഏറ്റവും പുതിയ വിവരം താഴെ കൊടുത്തിരിക്കുന്നു:",
-       "cascadeprotectedwarning": "'''മുന്നറിയിപ്പ്:''' ഈ താൾ കാര്യനിർവാഹക അവകാശമുള്ളവർക്കു മാത്രം തിരുത്തുവാൻ സാധിക്കുന്ന വിധത്തിൽ സം‌രക്ഷിക്കപ്പെട്ടിട്ടുള്ളതാണ്‌. {{PLURAL:$1|താൾ|താളുകൾ}} കാസ്കേഡ് സം‌രക്ഷണം ചെയ്തപ്പോൾ അതിന്റെ ഭാഗമായി സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ളതാണ്‌ ഈ താൾ.",
+       "cascadeprotectedwarning": "<strong>മുന്നറിയിപ്പ്:</strong> ഈ താൾ കാര്യനിർവാഹക അവകാശമുള്ളവർക്കു മാത്രം തിരുത്തുവാൻ സാധിക്കുന്ന വിധത്തിൽ സം‌രക്ഷിക്കപ്പെട്ടിട്ടുള്ളതാണ്‌. ഇനിക്കൊടുക്കുന്ന {{PLURAL:$1|താൾ|താളുകൾ}} നിർഝരിത(cascade) സം‌രക്ഷണം ചെയ്തപ്പോൾ അതിന്റെ ഭാഗമായി സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ളതാണ്‌ ഈ താൾ:",
        "titleprotectedwarning": "'''മുന്നറിയിപ്പ്: [[Special:ListGroupRights|പ്രത്യേക അവകാശമുള്ള]] ഉപയോക്താക്കൾക്ക് മാത്രം സൃഷ്ടിക്കാൻ സാധിക്കുന്ന വിധത്തിൽ ഈ താൾ സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്നു.''' അവലംബമായി രേഖകളിൽ ലഭ്യമായ ഏറ്റവും പുതിയ വിവരം താഴെ നൽകിയിരിക്കുന്നു:",
        "templatesused": "ഈ താളിൽ ഉപയോഗിച്ചിരിക്കുന്ന {{PLURAL:$1|ഫലകം|ഫലകങ്ങൾ}}:",
        "templatesusedpreview": "ഈ പ്രിവ്യൂവിൽ ഉപയോഗിച്ചിരിക്കുന്ന {{PLURAL:$1|ഫലകം|ഫലകങ്ങൾ}}:",
        "content-model-text": "വെറും എഴുത്ത്",
        "content-model-javascript": "ജാവാസ്ക്രിപ്റ്റ്",
        "content-model-css": "സി.എസ്.എസ്.",
+       "duplicate-args-warning": "<strong>മുന്നറിയിപ്പ്:</strong> [[:$1]], [[:$2]] എന്നതിനെ വിളിക്കുമ്പോൾ \"$3\" എന്ന ചരത്തിന് ഒന്നിലധികം വിലകൾ നൽകിയിട്ടുണ്ട്. നൽകിയ വിലകളിൽ അവസാനത്തേതുമാത്രം ഉപയോഗിക്കുന്നതാണ്.",
        "duplicate-args-category": "ഫലകങ്ങൾ വിളിക്കുമ്പോൾ ചരങ്ങൾ ആവർത്തിച്ചുപയോഗിക്കുന്ന താളുകൾ",
        "duplicate-args-category-desc": "താളിൽ ഫലകങ്ങൾ വിളിക്കുമ്പോൾ ചരങ്ങൾ അതായത് <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> അല്ലെങ്കിൽ <code><nowiki>{{foo|bar|1=baz}}</nowiki></code> എന്ന രീതിയിൽ.",
        "expensive-parserfunction-warning": "'''മുന്നറിയിപ്പ്:''' ഈ താളിൽ വളരെക്കൂടുതൽ പാഴ്സർ ഫങ്ഷനുകൾ വിളിച്ചിരിക്കുന്നു.\n\n{{PLURAL:$2|ഒരു വിളി|$2 വിളികൾ}} മാത്രമുണ്ടാകേണ്ടയിടത്ത്, ഇപ്പോൾ {{PLURAL:$1|ഒരു വിളി|$1 വിളികൾ}} ഉണ്ട്.",
        "uploaddisabledtext": "പ്രമാണം അപ്‌ലോഡ് ചെയ്യുന്നതു സാദ്ധ്യമല്ലാതാക്കിയിരിക്കുന്നു.",
        "php-uploaddisabledtext": "പി.എച്ച്.പി.യിൽ പ്രമാണ അപ്‌‌ലോഡുകൾ സാദ്ധ്യമല്ലാതാക്കിയിരിക്കുന്നു.\nദയവായി file_uploads ക്രമീകരണങ്ങൾ പരിശോധിക്കുക.",
        "uploadscripted": "ഈ പ്രമാണത്തിൽ വെബ് ബ്രൗസർ തെറ്റായി വ്യാഖ്യാനിച്ചേക്കാവുന്ന എച്ച്.റ്റി.എം.എൽ. അല്ലെങ്കിൽ സ്ക്രിപ്റ്റ് കോഡ് ഉണ്ട്.",
+       "upload-scripted-pi-callback": "എക്സ്.എം.എൽ.-സ്റ്റൈൽഷീറ്റ് പ്രോസസിങ് നിർദ്ദേശങ്ങളുള്ള പ്രമാണം അപ്‌ലോഡ് ചെയ്യാനാവില്ല.",
        "uploaded-script-svg": "അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. പ്രമാണത്തിൽ സ്ക്രിപ്റ്റ് ചെയ്യാവുന്ന ഭാഗമായ \"$1\" കണ്ടെത്തി.",
        "uploaded-hostile-svg": "അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. പ്രമാണത്തിൽ സുരക്ഷിതമല്ലാത്ത സി.എസ്.എസ്. സ്റ്റൈൽ ഭാഗം കണ്ടെത്താനായി.",
+       "uploaded-event-handler-on-svg": "എസ്.വി.ജി. പ്രമാണങ്ങളിൽ എവന്റ്-ഹാൻഡ്‌ലർ ആട്രിബ്യൂട്ടുകൾ <code>$1=\"$2\"</code>  എന്ന് സജ്ജീകരിച്ചിരിക്കുന്നവ അനുവദിച്ചിട്ടില്ല.",
+       "uploaded-href-attribute-svg": "എസ്.വി.ജി. പ്രമാണങ്ങളിൽ എച്ച്റെഫ് (href) ആട്രിബ്യൂട്ടുകൾ പ്രാദേശികമല്ലാത്ത ലക്ഷ്യങ്ങളിലേക്ക് <code>&lt;$1 $2=\"$3\"&gt;</code> എന്നുള്ളവ (ഉദാ: http://, javascript:, തുടങ്ങിയവ) അനുവദിച്ചിട്ടില്ല.",
        "uploaded-image-filter-svg": "യു.ആർ.എൽ. ഉൾപ്പെടെയുള്ള ചിത്ര അരിപ്പ : <code>&lt;$1 $2=\"$3\"&gt;</code>, അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. ചിത്രത്തിൽ കണ്ടെത്തി.",
        "uploadscriptednamespace": "ഈ എസ്.വി.ജി. പ്രമാണത്തിൽ ഉപയോഗിക്കാൻ പാടില്ലാത്ത നാമമേഖലയായ \"$1\" ഉണ്ട്",
        "uploadinvalidxml": "അപ്‌ലോഡ് ചെയ്ത പ്രമാണത്തിലെ എക്സ്.എം.എൽ. പാഴ്സ് ചെയ്യാൻ കഴിയില്ല.",
        "linksearch-pat": "തിരച്ചിലിന്റെ മാതൃക:",
        "linksearch-ns": "നാമമേഖല:",
        "linksearch-ok": "തിരയൂ",
-       "linksearch-text": "\"*.wikipedia.org\" പോലുള്ള വൈൽഡ് കാർഡുകൾ ഉപയോഗിക്കാവുന്നതാണ്‌.\nകുറഞ്ഞത് \"*.org\" പോലുള്ള ഒരു ടോപ്-ലെവൽ ഡൊമൈൻ എങ്കിലും ഉണ്ടായിരിക്കണം.<br />\nപിന്തുണയുള്ള {{PLURAL:$2|പ്രോട്ടോക്കോൾ|പ്രോട്ടോക്കോളുകൾ}}: <code>$1</code> (ഒന്നും നൽകിയില്ലെങ്കിൽ സ്വതേയുള്ള http:// ഉപയോഗിക്കുന്നതാണ്).",
+       "linksearch-text": "\"*.wikipedia.org\" പോലുള്ള വൈൽഡ് കാർഡുകൾ ഉപയോഗിക്കാവുന്നതാണ്‌.\nകുറഞ്ഞത് \"*.org\" പോലുള്ള ഒരു ടോപ്-ലെവൽ ഡൊമൈൻ എങ്കിലും ഉണ്ടായിരിക്കണം.<br />\nപിന്തുണയുള്ള {{PLURAL:$2|പ്രോട്ടോക്കോൾ|പ്രോട്ടോക്കോളുകൾ}}: $1 (ഒന്നും നൽകിയില്ലെങ്കിൽ സ്വതേയുള്ള http:// ഉപയോഗിക്കുന്നതാണ്).",
        "linksearch-line": "$1,  $2ൽ നിന്നു കണ്ണി ചേർക്കപ്പെട്ടിരിക്കുന്നു.",
        "linksearch-error": "ഹോസ്റ്റ്നെയിമിന്റെ തുടക്കത്തിൽ മാത്രമേ വൈൽഡ് കാർഡുകൾ വരാവൂ.",
        "listusersfrom": "ഇങ്ങനെ തുടങ്ങുന്ന ഉപയോക്താക്കളെ പ്രദർശിപ്പിക്കുക:",
        "htmlform-cloner-create": "കൂടുതൽ ചേർക്കുക",
        "htmlform-cloner-delete": "നീക്കം ചെയ്യുക",
        "htmlform-cloner-required": "കുറഞ്ഞത് ഒരു വിലയെങ്കിലും നൽകിയിരിക്കണം.",
+       "htmlform-title-badnamespace": "[[:$1]] ഉള്ളത് \"{{ns:$2}}\" നാമമേഖലയിലല്ല.",
+       "htmlform-title-not-creatable": "\"$1\" സൃഷ്ടിക്കാനാവുന്ന തലക്കെട്ടല്ല.",
+       "htmlform-title-not-exists": "[[:$1]] നിലവിലില്ല.",
+       "htmlform-user-not-exists": "<strong>$1</strong> നിലവിലില്ല.",
+       "htmlform-user-not-valid": "<strong>$1</strong> സാധുതയുള്ള ഉപയോക്തൃനാമമല്ല.",
        "sqlite-has-fts": "പൂർണ്ണ-എഴുത്ത് തിരച്ചിൽ പിന്തുണയുള്ള $1",
        "sqlite-no-fts": "പൂർണ്ണ-എഴുത്ത് തിരച്ചിൽ പിന്തുണയില്ലാത്ത $1",
        "logentry-delete-delete": "$3 എന്ന താൾ $1 {{GENDER:$2|മായ്ച്ചിരിക്കുന്നു}}",
index 82d1415..60f05c0 100644 (file)
        "passwordreset": "Нууц үгийг сэргээх",
        "passwordreset-text-one": "Энэ формыг бөглөснөөр түр ашиглах нууц үгийг емайлруу илгээнэ.",
        "passwordreset-text-many": "{{PLURAL:$1|Энэ талбарыг бөглөж түр ашиглах нууц үгээ емайлээр авна.}}",
-       "passwordreset-legend": "Нууц үгээ сэргээх",
        "passwordreset-disabled": "Энэ вики-д нууц үгийг сэргээх боломжгүй байна.",
        "passwordreset-emaildisabled": "Энэ викид емайл ашиглах боломжгүй.",
        "passwordreset-username": "Хэрэглэгчийн нэр:",
        "changeemail-throttled": "Дэндүү олон амжилтгүй нэвтрэх оролдлого хийсэн байна.\n$1 хүлээгээ ахин үзнэ үү.",
        "resettokens": "Токен ресет хийх",
        "resettokens-no-tokens": "Ресет хийх токен ална.",
-       "resettokens-legend": "Токен ресет хийх",
        "resettokens-tokens": "Токен:",
        "resettokens-token-label": "$1 (одоогийн утга: $2)",
        "resettokens-done": "Токен ресет хийлээ.",
        "randompage-nopages": "Дараах {{PLURAL:$2|нэрний зайнд|нэрний зайнд}} хуудас байхгүй байна : $1. \\",
        "randomincategory-category": "Ангилал:",
        "randomincategory-legend": "Ангилалд багтсан дурын хуудас",
+       "randomincategory-submit": "Явах",
        "randomredirect": "Санамсаргүй чиглүүлэгч",
        "randomredirect-nopages": "\"$1\" нэрний зайд чиглүүлэгч байхгүй байна.",
        "statistics": "Статистик мэдээлэл",
        "linksearch-pat": "Хэв маягийг хайх:",
        "linksearch-ns": "Хуудсын төрөл:",
        "linksearch-ok": "Хайх",
-       "linksearch-text": "\"*.wikipedia.org\" зэрэг орлуулагч тэмдэгт хэрэглэх боломжтой.<br />\nДор хаяж дээд түвшиний домайн хэрэгтэй байна, жишээ нь \"*.org\".<br />\nДэмжигдэх протоколууд : <code>$1</code> (эдгээрээс алийг нь ч хайлтад бүү оруул).",
+       "linksearch-text": "\"*.wikipedia.org\" зэрэг орлуулагч тэмдэгт хэрэглэх боломжтой.<br />\nДор хаяж дээд түвшиний домайн хэрэгтэй байна, жишээ нь \"*.org\".<br />\nДэмжигдэх протоколууд : $1 (эдгээрээс алийг нь ч хайлтад бүү оруул).",
        "linksearch-line": "$1 нь $2-с холбогдсон",
        "linksearch-error": "Орлуулагч тэмдэгт хост нэрийн эхлэлд л гарах боломжтой.",
        "listusersfrom": "Хамгийн эхэлж харуулах хэрэглэгч:",
index 0572e0d..a2691a9 100644 (file)
        "disclaimers": "उत्तरदायित्वास नकार",
        "disclaimerpage": "Project: सर्वसाधारण उत्तरदायकत्वास नकार",
        "edithelp": "संपादन साहाय्य",
+       "helppage-top-gethelp": "मदत",
        "mainpage": "मुखपृष्ठ",
        "mainpage-description": "मुखपृष्ठ",
        "policy-url": "Project:नीती",
        "edit-gone-missing": "नविन पृष्ठ अद्यतन करता आले नाही. ते वगळले असण्याची शक्यता आहे.",
        "edit-conflict": "वादग्रस्त संपादन",
        "edit-no-change": "तुमचे संपादन दुर्लक्षित करण्यात आले आहे, कारण मजकूरात काहीही बदल झालेला नाही.",
+       "postedit-confirmation-created": "पान निर्मित केले",
        "postedit-confirmation-saved": "आपले संपादन जतन करण्यात आले आहे.",
        "edit-already-exists": "नवीन पान तयार करता येऊ शकले नाही.\nया नावाचे पान पूर्वीच अस्तित्वात आहे.",
        "defaultmessagetext": "अविचल संदेश मजकूर",
        "rev-deleted-event": "(क्रिया नोंद वगळली)",
        "rev-deleted-user-contribs": "[सदस्यनाव / अंकपत्ता वगळला - योगदानातुन संपादन लपविले]",
        "rev-deleted-text-permission": "या पानाची आवृत्ती सार्वजनिक विदागारातून '''वगळण्यात आली आहे'''.\n\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळल्याच्या नोंदीत] अधिक तपशील असण्याची शक्यता आहे.",
+       "rev-suppressed-text-permission": "या पानाची आवृत्ती '''दडपली'''.\nआपण ती बघू शकता; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} दडपलेल्यांचा क्रमलेख] येथे त्याची विस्तृत माहिती सापडेल.",
        "rev-deleted-text-unhide": "या पानाचे संस्करण '''वगळले'''.\n [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी] येथे याची माहिती मिळेल.\nजर आपणास पुढे जावयाचे असल्यास, अजूनही [$1 हे संस्करण बघू शकता].",
        "rev-suppressed-text-unhide": "या पानाचे संस्करण '''दडपले'''.\n [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} दडपलेले क्रमलेख] येथे याची माहिती मिळेल.\nजर आपणास पुढे जावयाचे असल्यास, अजूनही [$1 हे संस्करण बघू शकता].",
        "rev-deleted-text-view": "या पानाची आवृत्ती '''वगळण्यात आली आहे'''.\nती तुम्ही बघू शकता; अधिक तपशील  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळल्याच्या नोंदी] येथे मिळेल.",
        "notextmatches": "कोणत्याही पानातील मजकुराशी जुळत नाही",
        "prevn": "मागील {{PLURAL:$1|$1}}",
        "nextn": "पुढील {{PLURAL:$1|$1}}",
+       "prev-page": "मागील पान",
+       "next-page": "पुढील पान",
        "prevn-title": "मागील $1 {{PLURAL:$1|निकाल}}",
        "nextn-title": "पुढील $1 {{PLURAL:$1|निकाल}}",
        "shown-title": "$1 {{PLURAL:$1|निकाल}} प्रतिपान पहा",
        "linksearch-pat": "शोधण्याचा मजकूर:",
        "linksearch-ns": "नामविश्व:",
        "linksearch-ok": "शोध",
-       "linksearch-text": "\"*.wikipedia.org\" सारखी वाईल्डकार्ड्स वापरायला परवानगी आहे.\nकिमान एक उच्च-स्तरिय डोमेन,उदा.- \"*.org\".<br />गरजेचे आहे.\nसहाय्याचे प्रोटोकॉल्स {{PLURAL:$2|protocol|protocols}}:  \n <code>$1</code>(जर कोणतेही प्रोटोकॉल्स नमूद केल्या गेले नसतील तर http://)हा डिफॉल्ट आहे.",
+       "linksearch-text": "\"*.wikipedia.org\" सारखी वाईल्डकार्ड्स वापरायला परवानगी आहे.\nकिमान एक उच्च-स्तरिय डोमेन,उदा.- \"*.org\".<br />गरजेचे आहे.\nसहाय्याचे प्रोटोकॉल्स {{PLURAL:$2|protocol|protocols}}:  \n $1(जर कोणतेही प्रोटोकॉल्स नमूद केल्या गेले नसतील तर http://)हा डिफॉल्ट आहे.",
        "linksearch-line": "$2 मधून $1 जोडलेले आहे",
        "linksearch-error": "वाईल्डकार्ड्स होस्ट नावाच्या फक्त सुरवातीलाच येऊ शकतात.",
        "listusersfrom": "पुढील शब्दापासून सुरू होणारे सदस्य दाखवा:",
index d208e07..19d1089 100644 (file)
        "passwordreset": "Set semula kata laluan",
        "passwordreset-text-one": "Lengkapkan borang ini untuk mengeset semula kata laluan anda.",
        "passwordreset-text-many": "{{PLURAL:$1|Isi salah satu ruangan berikut untuk menerima kata laluan sementara melalui e-mel.}}",
-       "passwordreset-legend": "Set semula kata laluan",
        "passwordreset-disabled": "Ciri set semula kata laluan telah dimatikan di wiki ini.",
        "passwordreset-emaildisabled": "Ciri-ciri e-mel telah dipadamkan di wiki ini.",
        "passwordreset-username": "Nama pengguna:",
        "resettokens": "Set semula token",
        "resettokens-text": "Anda boleh mengeset semula token yang membolehkan akses kepada data peribadi tertentu yang berkaitan dengan akaun anda di sini.\n\nAnda harus melakukannya jika anda tanpa sengaja mengongsinya dengan sesiapa ataupun akaun anda telah dikompromi.",
        "resettokens-no-tokens": "Tiada token untuk diset semula.",
-       "resettokens-legend": "Set semula token",
        "resettokens-tokens": "Token:",
        "resettokens-token-label": "$1 (nilai semasa: $2)",
        "resettokens-watchlist-token": "Token untuk suapan sesawang (Atom/RSS) bagi [[Special:Watchlist|perubahan pada halaman dalam senarai pantau anda]]",
        "randomincategory-nopages": "Tiada halaman di [[:Category:$1]].",
        "randomincategory-category": "Kategori:",
        "randomincategory-legend": "Laman rawak dalam kategori",
+       "randomincategory-submit": "Pergi",
        "randomredirect": "Lencongan rawak",
        "randomredirect-nopages": "Tiada lencongan dalam ruang nama \"$1\".",
        "statistics": "Statistik",
        "nmembers": "$1 ahli",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|ahli}}",
        "nrevisions": "$1 semakan",
-       "nviews": "Dilihat $1 kali",
        "nimagelinks": "Digunakan pada {{PLURAL:$1|sebuah|$1 buah}} laman",
        "ntransclusions": "digunakan pada {{PLURAL:$1|sebuah|$1 buah}} laman",
        "specialpage-empty": "Tiada keputusan bagi laporan ini.",
        "linksearch-pat": "Corak carian:",
        "linksearch-ns": "Ruang nama:",
        "linksearch-ok": "Cari",
-       "linksearch-text": "Kad bebas seperti \"*.wikipedia.org\" dibenarkan.<br />\nMemerlukan sekurang-kurangnya satu domain peringkat tinggi, cth. \"*.org\".<br />\n{{PLURAL:$2|Protokol|Protokol-protokol}} yang disokong: <code>$1</code> (menjadi http:// jika tiada protokol dinyatakan).",
+       "linksearch-text": "Kad bebas seperti \"*.wikipedia.org\" dibenarkan.<br />\nMemerlukan sekurang-kurangnya satu domain peringkat tinggi, cth. \"*.org\".<br />\n{{PLURAL:$2|Protokol|Protokol-protokol}} yang disokong: $1 (menjadi http:// jika tiada protokol dinyatakan).",
        "linksearch-line": "$1 dipaut dari $2",
        "linksearch-error": "Kad bebas hanya boleh digunakan pada permulaan nama hos.",
        "listusersfrom": "Tunjukkan pengguna bermula pada:",
        "tooltip-pt-logout": "Log keluar",
        "tooltip-pt-createaccount": "Anda digalakkan untuk membuka akaun dan log masuk; namun begitu ianya tidak diwajibkan",
        "tooltip-ca-talk": "Perbincangan mengenai laman kandungan",
-       "tooltip-ca-edit": "Anda boleh menyunting laman ini. Sila tekan butang 'pralihat' terlebih dahulu sebelum menyimpan.",
+       "tooltip-ca-edit": "Sunting laman ini",
        "tooltip-ca-addsection": "Buka bahagian baru",
        "tooltip-ca-viewsource": "Laman ini dilindungi. Anda boleh melihat sumbernya.",
        "tooltip-ca-history": "Versi-versi terdahulu bagi laman ini.",
index 28c3fe8..3264963 100644 (file)
        "passwordreset": "Irrisettja l-password",
        "passwordreset-text-one": "Imla din il-formola sabiex tirrisettja l-password.",
        "passwordreset-text-many": "{{PLURAL:$1|Imla wieħed mill-oqsma biex tirċievi password temporanja permezz ta' ittra elettronika.}}",
-       "passwordreset-legend": "Irrisettja l-password",
        "passwordreset-disabled": "L-irrisettjar tal-password fuq din il-wiki ġie diżattivat.",
        "passwordreset-emaildisabled": "Karatteristiċi tal-posta elettronika ġew diżattivati fuq din il-wiki.",
        "passwordreset-username": "Isem l-utent:",
        "changeemail-throttled": "Ippruvajt tidħol wisq drabi.\nJekk jogħġbok stenna $1 qabel ma terġa' tipprova.",
        "resettokens": "Irrisettja t-tokens",
        "resettokens-no-tokens": "M'hemm l-ebda ''token'' biex jerġa' jiġi ssettjat.",
-       "resettokens-legend": "Irrisettja t-''tokens''",
        "resettokens-tokens": "''Tokens'':",
        "resettokens-token-label": "$1 (valur attwali: $2)",
        "bold_sample": "Tipa ħoxna",
        "randomincategory-nopages": "M'hemm l-ebda paġna fil-kategorija [[:Category:$1|$1]].",
        "randomincategory-category": "Kategorija:",
        "randomincategory-legend": "Paġna kwalunkwe fil-kategorija",
+       "randomincategory-submit": "Mur",
        "randomredirect": "Rindirizz kwalunkwe",
        "randomredirect-nopages": "M'hawnx riindirizzi fl-ispazju tal-isem \"$1\".",
        "statistics": "Statistika",
        "nlinks": "{{PLURAL:$1|link|$1 links}}",
        "nmembers": "$1 {{PLURAL:$1|membru|membri}}",
        "nrevisions": "{{PLURAL:$1|reviżjoni|$1 reviżjonijiet}}",
-       "nviews": "{{PLURAL:$1|visita|$1 visiti}}",
        "nimagelinks": "Użat fuq $1 {{PLURAL:$1|paġna|paġni}}",
        "ntransclusions": "użat fuq $1 {{PLURAL:$1|paġna|paġni}}",
        "specialpage-empty": "Dan ir-rapport ma fih l-ebda riżultat.",
        "linksearch-pat": "Mudell ta' tfittxija:",
        "linksearch-ns": "Spazju tal-ismijiet:",
        "linksearch-ok": "Fittex",
-       "linksearch-text": "Tista' tagħmel użu minn metakarattri, per eżempju \"*.wikipedia.org\".<br />\nHuwa neċessarju minn tal-inqas dominju tal-ewwel livell, per eżempju \"*.org\".<br />\nProtokolli aċċettati: <code>$1</code> (jekk ma jiġi speċifikat l-ebda protokol, dan jiġi awtomatikament definit bħala http://).",
+       "linksearch-text": "Tista' tagħmel użu minn metakarattri, per eżempju \"*.wikipedia.org\".<br />\nHuwa neċessarju minn tal-inqas dominju tal-ewwel livell, per eżempju \"*.org\".<br />\nProtokolli aċċettati: $1 (jekk ma jiġi speċifikat l-ebda protokol, dan jiġi awtomatikament definit bħala http://).",
        "linksearch-line": "$1 hija marbuta mill-paġna $2",
        "linksearch-error": "Il-metakarattri jistgħu jintużaw biss fil-bidu tal-indirizz.",
        "listusersfrom": "Uri utenti li jibdew minn:",
index 5708727..e625bfc 100644 (file)
        "otherlanguages": "بقیه زوون‌ئون",
        "redirectedfrom": "($1 جه بموئه)",
        "redirectpagesub": "گجگی‌بَیتـِن",
+       "redirectto": "دکشی‌بیّه به:",
        "lastmodifiedat": "این صفحه ره آخرین بار این گادر دچینه:\n$2، $1",
        "viewcount": "این صفحه {{PLURAL:$1|ات|$1}} بار بدی‌یه بیّه",
        "protectedpage": "صفحه محافظت‌بَیی",
        "userlogin-yourname-ph": "شه کاروری نوم ره بنویسین",
        "yourpassword": "شمه پسورد",
        "userlogin-yourpassword": "رمز",
+       "userlogin-yourpassword-ph": "اتا پسورد باوّین",
+       "createacct-yourpassword-ph": "اتا پسورد باوّین",
        "yourpasswordagain": "پسورد ره دِباره بنویس",
+       "createacct-yourpasswordagain": "پسورد ره دِباره باوّین",
+       "createacct-yourpasswordagain-ph": "پسورد ره دِباره باوّین",
        "remembermypassword": "مه رمز ره (تا حداکثر $1 {{PLURAL:$1|روز|روز}}) این مرورگر سر یاد نکان",
+       "userlogin-remembermypassword": "مه ره سایت دله دار",
        "yourdomainname": "شمه کاروری نوم",
        "login": "دله بوردن",
        "nav-login-createaccount": "دله بوردن / عضو بیّن",
        "logout": "دربوردن",
        "userlogout": "دربوردن",
        "notloggedin": "سیستم ره دله نیه مونی",
+       "userlogin-noaccount": "عضو نی؟",
+       "userlogin-joinproject": "{{SITENAME}} دله ثبت‌نوم هاکنین!",
        "nologin": "عضو نی؟ $1.",
        "nologinlink": "عضو بواشین",
        "createaccount": "ترنه حساب وا هکاردن",
        "gotaccount": "عضو هسنی؟ $1.",
        "gotaccountlink": "بورین دله",
        "userlogin-resetlink": "دله بموئن ِجزئیات ره یاد هاکردی؟",
+       "userlogin-resetpassword-link": "شه پسوُرد ره یاد بکاردنی؟",
+       "userlogin-helplink2": "لاگین وسّه کومِک بَییتن",
+       "createacct-emailoptional": "ایمیل (اختیاری)",
+       "createacct-email-ph": "شه ایمیل ره باوّین",
        "createaccountmail": "ایمیل جه",
        "createaccountreason": "دلیل:",
+       "createacct-captcha": "امنیتی چک",
+       "createacct-imgcaptcha-ph": "این بنویشته‌یی که بالا وینّی ره بنویسین",
+       "createacct-submit": "شه اکانت ره بسازین",
+       "createacct-benefit-heading": "{{SITENAME}} ره شِمه واری آدِمون بِساتنه",
+       "createacct-benefit-body1": "{{PLURAL:$1|دچی‌ین}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|صفحه}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|کارور}} اخیر",
        "badretype": "دِتا پسوردی که بنویشتی اتجور نینه",
        "userexists": "کاروری نومی که بخاستنی وجود داشته.\nخواهشأ ات نوم دیگه انتخاب هاکنین.",
        "loginerror": "دله نشی‌یه",
        "accountcreatedtext": "کاروری نوم، $1 بساته بیّه.",
        "loginlanguagelabel": "زوون: $1",
        "pt-login": "دله بموئن",
+       "pt-login-button": "دله بموئن",
        "pt-createaccount": "عضو بواشین",
        "pt-userlogout": "دربوردن",
        "newpassword": "نو پسورد:",
+       "passwordreset": "پسورد ِتغییر",
        "passwordreset-username": "کاروری نوم:",
        "passwordreset-domain": "دامنه:",
        "passwordreset-capture": "گت ایمیل سِراق هدائه بَواشه؟",
        "accmailtitle": "پسورد ره برسِنیمی.",
        "accmailtext": "اتا تصادفی پسور بساته بیّه [[User talk:$1|$1]] وسّه $2 سَر برسِنی‌یه بیّه.\n\nاین ترنه کاروری حساب ِپسور، سامانه دله بموئن په، ''[[Special:ChangePassword|ات‌تی]]'' بتونده عوض بوو.",
        "newarticle": "(ترنه)",
+       "newarticletext": "شما اتا لینک ره دمبال هاکردنی و اتا صفحه جه برسینی که هنتا وجود ندانه.\nصفحه ره بساتن وسّه، این کادر دله بنویسین. (ویشته دونستن وسه [$1 راهنما صفحه] ره هارشین)\nاگه اشتباهی این صفحه جه سَر دَربیاردنی، «back» دُکمه ره جِِق هادین.",
        "noarticletext": "این صفحه اسا هیچ بنویشته‌یی ندانّه.\nشما بتونّی دیگه صفحه‌ئون دله [[Special:Search/{{PAGENAME}}|این صفحه ره چرخه‌تو هاکنین]]،\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌ئون ره چرخه‌تو هاکردن]،\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} این صفحه ره دَچینین]</span>.",
        "noarticletext-nopermission": "این صفحه اسا هیچ بنویشته‌یی ندانّه.\nشما بتونّی دیگه صفحه‌ئون دله [[Special:Search/{{PAGENAME}}|این صفحه ره چرخه‌تو هاکنی]]،\nیا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌ئون ره چرخه‌تو هاکنی]</span> ولی اجازه ندانّی صفحه ره بسازی.",
        "blocked-notice-logextract": "دسترسی اینتا کارور الآن دوستوئه.\nآخرین مورد سیاهه قطع دسترسی زیر بموئه:",
        "previewnote": "شِمه یاد بوئه که اینتا اتا پیش‌نمایِش هسه. \n شِمه دگاردسته‌ئون جانـَکِته که و‌نه، ونه اِسا ذخیره‌بیّـِن دوکمه ره بَزنین!",
        "editing": "درحال  $1 ره دچی‌ین",
+       "creating": "$1 ِبساتن",
        "editingsection": "دچی‌ین $1 (تیکه)",
        "editingcomment": "$1 دچی‌ین(نو تیکه)",
        "yourtext": "شمه بنویشته",
        "templatesusedpreview": "{{PLURAL:$1|شابلون|شابلونای}} استفاده بَیی این پیش‌نمایش دله:",
        "template-protected": "(زلفِن بزوئه)",
        "template-semiprotected": "(پچوک زلفن بزه)",
+       "hiddencategories": "این صفحه {{PLURAL:$1|اتا مخفی رج|$1تا مخفی رج}} دله دره:",
        "permissionserrorstext-withaction": "ته اجازهٔ $2 ره به {{PLURAL:$1|دلیل|دلایل}} رو به رو ندانی:",
        "recreate-moveddeleted-warn": "'''هشدار: ته دری اتا صفحه ره نویسنی که قبلا پاک بیّه.'''\n\nشه فکر هاکن که اینتا کار که دری کانده درسته یا نا؟\nاینجه توندی پاک بیی صفحه ره هارشی:",
        "moveddeleted-notice": "اینتا صفحه پاک بی بی‌یه\nاینجه بتوندی قبلی صفحه که پاک بیّه ره هارشی",
        "log-fulllog": "بدی‌ین سیاهه کامل",
        "edit-gone-missing": ".شما نتوندی صفحه ره دباره هارشی\nاحتمالا صفحه پاک بیه.",
        "edit-conflict": "دِ نفر با هم درنه نویسنه.\nاتا ته هستی.",
+       "currentrev-asof": "اِسایی نسخه تا $1",
        "revisionasof": "دچی‌یه‌ئونی که $1 جا دکتنه",
        "previousrevision": "→ پیشی دگاردسته‌ئون",
+       "nextrevision": "جدیدته نسخه ←",
+       "currentrevisionlink": "اِسایی نسخه ره هارشی‌ین",
        "cur": "إسا",
        "last": "تاریخچه",
        "histfirst": "کـوهـنـه تـریـن",
        "revdel-restore": "دیاری تغییر هدائن",
        "mergehistory": "صفحه‌ئون تاریخچه ره اتا هاکردن",
        "revertmerge": "سِوا هاکردن",
+       "difference-title": "$1: نسخه‌ئون ِفرق",
        "lineno": "بند  $1:",
        "editundo": "واچی‌ین",
+       "diff-multi-sameuser": "({{PLURAL:$1|اتا میونی نسخه|$1تا میونی نسخه}}ِ همین کارور جه سِراق هِدا نیّه.)",
        "searchresults": "بچرخستن ِجوابون",
        "searchresults-title": "چرخه‌ئوی نتیجه «$1» وسّه",
        "prevn": "پـیـشـیـن {{PLURAL:$1|$1}}",
        "minoreditletter": "جز",
        "newpageletter": "نو",
        "boteditletter": "ربات",
+       "rc-change-size-new": "$1 {{PLURAL:$1|بایت}} پس از تغییر",
        "newsectionsummary": "/* $1 */ نو تیکه",
        "recentchangeslinked": "واری دأچیـه‌ن‌ئون",
        "recentchangeslinked-feed": "واری دچی‌یه‌ئون",
        "move": "دکش هاکردن",
        "pager-newer-n": "{{PLURAL:$1|أتـا نـه‌ته‌ر|$1 تـا نـه‌ته‌ر}}",
        "pager-older-n": "{{PLURAL:$1|أتـا کـوهـنـه‌ته‌ر|$1 تـا کوهـنـه‌ته‌ر}}",
+       "booksources": "کتابی منابع",
        "booksources-search-legend": "بگردستن منابع کتاب",
+       "booksources-search": "چرخه‌تو",
        "booksources-text": "زیر فهرستی از لینکا به وبگاه‌ئون دیگه دره که کتاب‌ئون نو و دست دوم روشنّه و ممکنه اطلاعات ویشتری راجع به کتاب مورد نظر دارِن:",
        "specialloguserlabel": "کارور:",
        "log": "سیاهه‌ها",
        "mycontris": "مه کایری‌ئون",
        "contribsub2": "$1 ($2) وه‌سه",
        "uctop": "(سر)",
+       "month": "این ماه (و پیش از اون) دله:",
+       "year": "این سال (و پیش از اون) دله:",
        "sp-contributions-newbies": "نـه وا بـأیـه ئـه‌کـانـت‌ئون دأچـیـه‌ن‌ئون ره نـه‌شـون هـاده",
        "sp-contributions-talk": "گپ",
        "sp-contributions-username": "IP نـه‌شـونـی یا کـاروری‌نوم",
        "whatlinkshere-title": "وألـگ‌ئونی که \"$1\" ره لـیـنک هه‌دانه",
        "whatlinkshere-page": "صفحه:",
        "linkshere": "اینان صفحه‌ئون به '''[[:$1]]''' لینک هدانه:",
+       "isredirect": "دکشی‌ین صفحه",
+       "istemplate": "$1 تراگنجانشون",
+       "isimage": "فایل ِلینک",
        "whatlinkshere-prev": "{{PLURAL:$1|پـیـشـیـن|$1 تـای پـیـشـیـن}}",
        "whatlinkshere-next": "{{PLURAL:$1|پَس|$1 تا پَس‌تر}}",
        "whatlinkshere-links": "← لـیـنـک‌ئون",
        "newtitle": "ترنه نوم:",
        "movepage-moved": "'''ای «$1» ولـگ،  بورده «$2» ره.'''",
        "movetalk": "«گپ» صفحه هم، اگه وانه، بوره.",
+       "movelogpage": "دکشی‌ین ِسیاهه",
        "revertmove": "واچـیـه‌ن",
        "delete_and_move_confirm": "أره، پاک هاکه‌ن وه ره",
        "export": "دأیابأبه‌رده‌ن ولـگ‌ئون",
        "tooltip-ca-viewsource": "این صفحه ره نتوندی دَچینی.\nشِما بِتوندی ونه منبع ره هارشی.",
        "tooltip-ca-history": "کهنه دگاردسته‌ئونی که این صفحه دله دکته",
        "tooltip-ca-delete": "این صفحه ره پاک هاکردن",
+       "tooltip-ca-move": "دکشی‌ین اینتا صفحه",
        "tooltip-ca-watch": "این صفحه ره شه دمبال‌هاکردن لیست دله بی‌یشتن",
        "tooltip-search": "{{SITENAME}} ره چرخه‌تو",
        "tooltip-search-go": "بـور اتـا ولـگـی کـه وه‌نـه نـوم هـأمـیـنـتـا بـوئـه",
        "tooltip-ca-nstab-user": "کاروری صفحه ره بَدی‌ین",
        "tooltip-ca-nstab-media": "مدیا صفحه هارشی‌ین",
        "tooltip-ca-nstab-special": "اینتا اتا شا صفحه هسته که شِما نتوندی وه ره دچینی",
+       "tooltip-ca-nstab-project": "پروژه‌ی ِصفحه ره بدی‌ین",
        "tooltip-ca-nstab-image": "عکس ِصفحه ره بدی‌ین",
        "tooltip-ca-nstab-template": "شـابـلـون بـأویـنـه‌ن",
        "tooltip-ca-nstab-category": "رج ره بدی‌ین",
        "nextdiff": "ته‌رنه دأچیه‌ن ←",
        "thumbsize": "أنـگـوسـی گأتی:",
        "file-info-size": "$1 × $2 پـیـکـسه‌ل, فـایـل گـأتـی: $3, MIME مـونـد: $4",
+       "file-nohires": "ویشته رزولیشن ندانه.",
+       "svg-long-desc": "اس‌وی‌جی ِپرونده، ابعاد <span dir=\"ltr\">$1 × $2</span> پیکسل جه، پرونده قایده: $3",
        "show-big-image": "اصلی پرونده",
        "show-big-image-preview": "این پیش‌-پیش سِراق هدائن ِقایده: $1.",
        "show-big-image-other": "دیگه {{PLURAL:$2|کیفیت|کیفیتون}}: $1.",
        "video-dims": "$1, $2×$3",
        "metadata": "متادیتا",
        "metadata-help": "این پرونده اتسری اضافه اطلاعات دانه که احتمالاً دیجیتال دوربین یا دیگه تغییرکَرون اضافه هاکردنه. اگه پرونده اولیه حالت جه تغییر هاکرد بائه، ممکن هسته که توضیحات تکمیل نَی‌بائِن.",
+       "metadata-fields": "متادیتا همیشه سِراق هِدا وانه ولی دیگه اطلاعات وقتی جدول وا بائه، سِراق هِدا وانّه.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-orientation": "جهت",
        "exif-xresolution": "افقی رزولویشن",
        "exif-yresolution": "عمودی رزولویشن",
        "tag-filter": "[[Special:Tags|برچسبون]] ِفیلتر:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|برچسب|برچسبون}}]]: $2)",
        "logentry-delete-delete": "$1 صفحهٔ $3 ره {{GENDER:$2|حذف هاکرده}}",
+       "logentry-move-move": "کارور $1، $3 ِصفحه ره {{GENDER:$2|دَکشی‌یه}} $4 دله",
        "logentry-move-move_redir-noredirect": "$1 ، $3 ره بدون اینکه مسیر تغییری درس بوه به $4 که مسیر تغییر بیه منتقل هاکرده",
        "logentry-newusers-newusers": "$1  بساتن اتا حساب کاروری",
        "logentry-newusers-create": "$1 کاروری حساب {{GENDER:$2|بساته بیّه}}",
index 3235617..e5efedb 100644 (file)
@@ -5,7 +5,8 @@
                        "Ianbu",
                        "Kaihsu",
                        "아라",
-                       "唐吉訶德的侍從"
+                       "唐吉訶德的侍從",
+                       "Luuva"
                ]
        },
        "tog-underline": "Liân-kiat oē té-sûn:",
        "permalink": "Éng-kiú liân-kiat",
        "print": "Ìn-soat",
        "view": "Khoàⁿ",
-       "view-foreign": "佇$1遐看",
+       "view-foreign": "tī $1 hiah khoàⁿ",
        "edit": "Siu-kái",
        "edit-local": "改這位的說明",
        "create": "Khai-sí siá",
-       "create-local": "加這搭的說明",
+       "create-local": "ka chhit-tah--ê soat-bêng",
        "editthispage": "Siu-kái chit ia̍h",
        "create-this-page": "Khai-sí siá chit ia̍h",
        "delete": "Thâi",
        "welcomecreation-msg": "你的口座以經開好矣,\n你若有需要,會使去改你佇{{SITENAME}}的設定。",
        "yourname": "Lí ê iōng-chiá miâ-chheng:",
        "userlogin-yourname": "Iōng-chiá miâ-chheng",
-       "userlogin-yourname-ph": "拍你的用者名稱",
-       "createacct-another-username-ph": "拍你的用者名稱",
+       "userlogin-yourname-ph": "Phah lí--ê iōng-chiá-miâ",
+       "createacct-another-username-ph": "Phah lí--ê iōng-chiá-miâ",
        "yourpassword": "Lí ê bi̍t-bé:",
        "userlogin-yourpassword": "Bi̍t-bé",
-       "userlogin-yourpassword-ph": "拍密碼",
-       "createacct-yourpassword-ph": "拍密碼",
+       "userlogin-yourpassword-ph": "Phah bi̍t-bé",
+       "createacct-yourpassword-ph": "Phah bi̍t-bé",
        "yourpasswordagain": "Têng phah bi̍t-bé:",
-       "createacct-yourpasswordagain": "確認密碼",
-       "createacct-yourpasswordagain-ph": "閣拍一擺密碼",
+       "createacct-yourpasswordagain": "Khak-jīn bi̍t-bé",
+       "createacct-yourpasswordagain-ph": "Koh phah chi̍t-pái bi̍t-bé",
        "remembermypassword": "Tī chit ê liû-lám-khì kì góa ê teng-ji̍p chu-liāu.(siōng chē kì $1 {{PLURAL:$1|kang|kang}})",
-       "userlogin-remembermypassword": "我登入的資料記起來",
+       "userlogin-remembermypassword": "Kì-lo̍k goá teng-ji̍p--ê chu-liāu",
        "userlogin-signwithsecure": "用安全連線",
        "yourdomainname": "你的網域:",
-       "password-change-forbidden": "佇這个維基,你袂當改密碼。",
+       "password-change-forbidden": "Tī chit--ê wiki, lí boē-tàng kái bi̍t-bé.",
        "externaldberror": "這可能是資料庫驗證錯誤,抑是無允准你改外部的口座。",
        "login": "Teng-ji̍p",
        "nav-login-createaccount": "Teng-ji̍p / khui sin kháu-chō",
        "logout": "Teng-chhut",
        "userlogout": "Teng-chhut",
        "notloggedin": "Bô teng-ji̍p",
-       "userlogin-noaccount": "敢無口座?",
-       "userlogin-joinproject": "加入 {{SITENAME}}",
+       "userlogin-noaccount": "Káⁿ bô kháu-chō?",
+       "userlogin-joinproject": "Ka-ji̍p {{SITENAME}}",
        "nologin": "Bô kháu-chō thang teng-ji̍p? $1",
        "nologinlink": "Khui 1 ê kháu-chō",
        "createaccount": "Khui sin kháu-chō",
        "gotaccount": "Í-keng ū kháu-chō? '''$1'''.",
        "gotaccountlink": "Teng-ji̍p",
        "userlogin-resetlink": "你敢袂記得你登入的資料?",
-       "userlogin-resetpassword-link": "袂記得你的密碼?",
-       "userlogin-helplink2": "協助你登入",
+       "userlogin-resetpassword-link": "Bi̍t-bé boē-kì-tit?",
+       "userlogin-helplink2": "Pang-chān goá teng-ji̍p",
        "userlogin-loggedin": "你已經用{{GENDER:$1|$1}}登入,用下跤的表,登入別个名。",
        "userlogin-createanother": "開另外一个口座",
-       "createacct-emailrequired": "電子批地址",
-       "createacct-emailoptional": "電子批地址(無一定愛寫)",
-       "createacct-email-ph": "拍你的電子批地址",
-       "createacct-another-email-ph": "拍你的電子批地址",
+       "createacct-emailrequired": "Tiān-chú-phoe tē-chí",
+       "createacct-emailoptional": "Tiān-chú-phoe tē-chí (bô-it-tēng ài siá)",
+       "createacct-email-ph": "Phah lí--ê tiān-chú-phoe tē-chí",
+       "createacct-another-email-ph": "Phah lí--ê tiān-chú-phoe tē-chí",
        "createaccountmail": "Iōng chi̍t-ê lîm-sî loān-sò͘ sán-seng ê bi̍t-bé , kià khì goá chí-tēng ê tiān-chú-phoe tē-chí.",
        "createacct-realname": "真正的名",
        "createaccountreason": "Lí-iû:",
        "createacct-reason": "理由:",
        "createacct-reason-ph": "為啥物你欲開一另外一个口座?",
-       "createacct-captcha": "安全檢驗",
-       "createacct-imgcaptcha-ph": "共下跤你看著的字拍入來",
-       "createacct-submit": "開你的口座",
+       "createacct-captcha": "An-choân kiám-cha",
+       "createacct-imgcaptcha-ph": "Kā ē-kha lí khoàⁿ tio̍h--ê bûn-jī phah ji̍p lâi",
+       "createacct-submit": "Khui lí--ê kháu-chō",
        "createacct-another-submit": "開另外一个口座",
-       "createacct-benefit-heading": "{{SITENAME}}是為著親像你的儂,才來建立。",
-       "createacct-benefit-body1": "改{{PLURAL:$1|擺|擺}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|頁|頁}}",
-       "createacct-benefit-body3": "最近{{PLURAL:$1|个儂有貢獻|个儂有貢獻}}",
+       "createacct-benefit-heading": "{{SITENAME}} sī uī tio̍h chhin-chhiūⁿ lí--ê lâng chiah lâi kiàn-li̍p--ê.",
+       "createacct-benefit-body1": "kái {{PLURAL:$1|pái|pái}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|ia̍h|ia̍h}}",
+       "createacct-benefit-body3": "choè-kīn {{PLURAL:$1|ê lâng ū kòng-hiàn|ê lâng ū kòng-hiàn}}",
        "badretype": "Lí su-ji̍p ê 2-cho· bi̍t-bé bô tùi.",
        "userexists": "Lí phah ê iōng-chiá miâ-chheng í-keng ū lâng iōng. Chhiáⁿ lí iōng pa̍t-ê miâ.",
        "loginerror": "Teng-ji̍p chhò-gō·",
        "createacct-error": "開口座無成功",
        "createaccounterror": "Bô hoat-tō͘ khui kháu-chō: $1",
-       "nocookiesnew": "你的用者口座已經開好矣,毋過你猶未登入,{{SITENAME}}有用Cookies做記錄登入的用者,你無允准用Cookies,請先共阻擋提掉,才閣用你的用者名稱佮密碼登入。",
+       "nocookiesnew": "Lí--ê iōng-chiá kháu-chō í-keng khui hó--ah, m̄-koh lí iáu-boē teng-ji̍p.\n{{SITENAME}} ū sái Cookies choè kì-lio̍k teng-ji̍p--ê iōng-chiá.\nLí bô ín-chún iōng Cookies, chhiáⁿ lí seng kā chó͘-tòng the̍h tiāu, chiah koh iōng lí--ê iōng-chiá-miâ kap bi̍t-bé teng-ji̍p.",
        "nocookieslogin": "{{SITENAME}}有用cookies做記錄用者,毋過你無允準用cookies,等你改做會當了後,才閣試。",
        "nocookiesfornew": "因為不明的原因,阮無法度建立用者的口座。\n請先確定你的cookie會使用,閣重進入這頁,閣試一擺。",
-       "noname": "你提供的用者名稱袂使用。",
+       "noname": "Lí phah--ê iōng-chiá-miâ boē-sái.",
        "loginsuccesstitle": "Teng-ji̍p sêng-kong",
        "loginsuccess": "Lí hiān-chhú-sî í-keng teng-ji̍p {{SITENAME}} chò \"$1\".",
        "nosuchuser": "Chia bô iōng-chiá hō-chò \"$1\".\nIiōng-chiá hō-chò ū hun toā-jī sè-jī.\nChhiáⁿ kiám-cha lí ê phèng-im, a̍h-sī  [[Special:UserLogin/signup|khui sin iōng-chiá ê kháu-chō.]]",
        "wrongpassword": "Lí su-ji̍p ê bi̍t-bé ū têng-tâⁿ. Chhiáⁿ têng chhì.",
        "wrongpasswordempty": "Bi̍t-bé keh-á khang-khang. Chhiáⁿ têng chhì.",
        "passwordtooshort": "密碼上少愛{{PLURAL:$1|1字|$1字}}",
-       "password-name-match": "你的密碼愛佮你的用者名稱無仝。",
+       "password-name-match": "Lí--ê bi̍t-bé ài kap lí--ê iōng-chiá-miâ bô kāng.",
        "password-login-forbidden": "這个用者名稱佮密碼已經禁止用。",
        "mailmypassword": "Têng siat bi̍t-bé",
        "passwordremindertitle": "{{SITENAME}} the-chheN li e bit-be",
        "noemailprefs": "Tī lí ê siat-piān chí-tēng chi̍t ê tiān-chú-phoe tē-chí thang hō͘ chia ê kong-lêng ē-tàng ēng.",
        "emailconfirmlink": "Chhiáⁿ khak-jīn lí ê e-mail chū-chí ū-hāu",
        "pt-login": "Teng-ji̍p",
+       "pt-login-button": "Teng-ji̍p",
        "pt-createaccount": "Khui sin kháu-chō",
        "pt-userlogout": "Teng-chhut",
        "user-mail-no-addy": "Siūⁿ beh kià tiān-chú-phoe, m̄-koh bô siá tē-chí.",
        "nohistory": "Chit ia̍h bô pian-chi̍p-sú.",
        "currentrev": "Hiān-chú-sî ê siu-tēng-pún",
        "revisionasof": "$1 ê siu-tēng-pún",
-       "previousrevision": "←Khah kū ê siu-tēng-pún",
-       "nextrevision": "Khah sin ê siu-tēng-pún→",
+       "previousrevision": "←Khah-kū ê siu-tēng-pún",
+       "nextrevision": "Khah-sin ê siu-tēng-pún→",
        "currentrevisionlink": "khoàⁿ siōng sin ê siu-tēng-pún",
        "cur": "taⁿ",
        "next": "下一个",
        "history-feed-item-nocomment": "$1 tī $2",
        "revdel-restore": "改會當看無",
        "revertmerge": "取消合併",
-       "history-title": "\"$1\"的歷史版本",
+       "history-title": "\"$1\"--ê le̍k-sú pán-pún",
+       "difference-title": "\"$1\" pán-pún chi-kan bô-kāng--ê tē-hng",
        "lineno": "Tē $1 chōa:",
        "compareselectedversions": "Pí-phēng soán-te̍k ê pán-pún",
        "editundo": "chhú-siau",
        "yournick": "Lí ê sió-miâ (chhiam-miâ iōng):",
        "prefs-help-email": "Tiān-chú-phoe ê chū-chí m̄-sī it-tēng ài, m̄-koh tī lí bē-kì bi̍t-bé beh tîng siat-tīng tō ài.",
        "prefs-help-email-others": "Lí ē-sái thàu--koè lí ê ia̍h , thó-lūn-ia̍h ê liân kiat hō͘ lâng ēng e-mail kah lí liân-lo̍k.\nTī pat-lâng liân-lo̍k lí ê sî-chūn bē kā e-mail tsū-tsí siá chhut--lâi.",
+       "group-bot": "Ke-khì-lâng",
+       "group-sysop": "koán-lí jîn-oân",
+       "group-bureaucrat": "Koaⁿ-liâu",
+       "group-bot-member": "{{GENDER:$1|Ke-khì-lâng}}",
+       "group-sysop-member": "{{GENDER:$1|goán-lí jîn-oân}}",
+       "group-bureaucrat-member": "{{GENDER:$1|Koaⁿ-liâu}}",
        "grouppage-sysop": "{{ns:project}}:Hêng-chèng jîn-oân",
+       "grouppage-bureaucrat": "{{ns:project}}:Koaⁿ-liâu",
        "right-writeapi": "用API寫",
        "newuserlogpage": "開賬戶日誌",
        "rightslogtext": "Chit-ê log lia̍t-chhut kái-piàn iōng-chiá koân-lī ê tōng-chok.",
        "listfiles_count": "版本",
        "file-anchor-link": "Tóng-àn",
        "filehist": "Tóng-àn ê le̍k-sú",
-       "filehist-help": "揤 日期/時間;看彼時陣的檔案",
+       "filehist-help": "Chhi̍h ji̍t-kî/sî-kan, khoàⁿ hit sî-chūn--ê tóng-àn.",
        "filehist-current": "hiān-chāi",
        "filehist-datetime": "Ji̍t-kî/ Sî-kan",
        "filehist-thumb": "細張圖",
        "imagelinks": "tóng-àn sù-iōng ê chōng-hòng",
        "linkstoimage": "ē-kha {{PLURAL:$1|ê ia̍h}} ū iōng tio̍h chit ê iáⁿ-siōng:",
        "nolinkstoimage": "Bô poàⁿ ia̍h liân kàu chit tiuⁿ iáⁿ-siōng.",
-       "sharedupload-desc-here": "這个$1的檔案有可能予其他專案用著。\n下跤是這个檔案伊的[$2檔案說明]。",
+       "sharedupload-desc-here": "Chit--ê $1--ê tóng-àn ū khó-lêng hō͘ kî-thaⁿ--ê choan-àn ēng tio̍h.\nChia sī chit--ê tóng-àn i--ê [$2 soat-bêng].",
        "mimesearch": "MIME chhiau-chhoē",
        "unwatchedpages": "Bô lâng kàm-sī ê ia̍h",
        "listredirects": "Lia̍t-chhut choán-ia̍h",
        "movethispage": "Sóa chit ia̍h",
        "unusedimagestext": "<p>Chhiáⁿ chù-ì: kî-thaⁿ ê bāng-chām ū khó-lêng iōng URL ti̍t-chiap liân kàu iáⁿ-siōng, só·-í sui-jiân chhiâng-chāi teh iōng, mā sī ē lia̍t tī chia.</p>",
        "unusedcategoriestext": "Ū ē-kha chiah-ê lūi-pia̍t-ia̍h, m̄-koh bô kî-thaⁿ ê bûn-chiuⁿ a̍h-sī lūi-pia̍t lī-iōng.",
+       "pager-newer-n": "khah sin ê $1 hāng",
+       "pager-older-n": "khah kū ê $1 hāng",
        "booksources": "Tô͘-su chu-liāu",
        "specialloguserlabel": "做的人:",
        "speciallogtitlelabel": "目地(標題抑是用者)",
        "tooltip-namespace_association": "勾起來的框;相關的討論抑物件空間會包括入來",
        "blanknamespace": "(Thâu-ia̍h)",
        "contributions": "{{GENDER:$1|Iōng-chiá}} ê kòng-hiàn",
+       "contributions-title": "Iōng-chiá $1--ê kòng-hiàn",
        "mycontris": "Góa ê kòng-hiàn",
        "nocontribs": "Chhōe bô tiâu-kiāⁿ ū-tùi ê hāng-bo̍k.",
        "uctop": "(siōng 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-logout": "Teng-chhut",
-       "tooltip-pt-createaccount": "Kiàn-gī lí seng khai chi̍t-ê kháu-chō (bô-it-tēng ài); chiah koh teng-ji̍p.",
+       "tooltip-pt-createaccount": "Kiàn-gī lí seng khui chi̍t-ê kháu-chō (bô-it-tēng ài); chiah koh teng-ji̍p.",
        "tooltip-ca-talk": "Loē-iông ê thó-lūn",
        "tooltip-ca-edit": "Kái chit-ia̍h",
        "tooltip-ca-addsection": "加新的一段",
        "tooltip-ca-watch": "共這頁加入去你的監視單",
        "tooltip-ca-unwatch": "Lí ê kàm-sī-toaⁿ soá tiàu chit ia̍h.",
        "tooltip-search": "Chhoé {{SITENAME}}",
-       "tooltip-search-go": "若有仝名的,就去彼頁。",
+       "tooltip-search-go": "Nā ū kāng-miâ--ê, tō khì hit-ia̍h.",
        "tooltip-search-fulltext": "Chhoé ū chia-ê jī ê ia̍h",
        "tooltip-p-logo": "Khì thâu-ia̍h",
        "tooltip-n-mainpage": "Khì thâu-ia̍h",
        "markaspatrolleddiff": "Phiau-sī sûn--kòe",
        "markedaspatrolledtext": "Í-keng phiau-sī chit ê siu-tēng-pún ū lâng sûn--kòe.",
        "deletedrevision": "Kū siu-tēng-pún $1 thâi-tiāu ā.",
-       "previousdiff": "← 進前改的",
-       "nextdiff": "新改的 →",
+       "previousdiff": "← Chìn-chêng kái--ê",
+       "nextdiff": "Sin kái--ê →",
        "imagemaxsize": "Iáⁿ-siōng biô-su̍t-ia̍h ê tô· ke̍k-ke hián-sī jōa tōa tiuⁿ:",
        "thumbsize": "Sok-tô· (thumbnail) jōa tōa tiuⁿ:",
-       "file-info-size": "$1 × $2 像素,檔案佔量:$3,MIME 類型:$4",
+       "file-info-size": "$1 × $2 siōng-sò͘ , tóng-àn chiàm-liōng: $3, MIME luī-hêng: $4",
        "file-nohires": "Bô khah koân ê kái-sek-tō͘.",
        "show-big-image": "原本的檔案",
-       "show-big-image-preview": "先看佔量:$1。",
-       "show-big-image-other": "其他{{PLURAL:$2|解析度}}:$1。",
-       "show-big-image-size": "$1 × $2 像素",
+       "show-big-image-preview": "Seng khoàⁿ chiàm-liōng: $1.",
+       "show-big-image-other": "Kî-thaⁿ--ê {{PLURAL:$2|kái-sek-tō͘ }}: $1.",
+       "show-big-image-size": "$1 × $2 siōng-sò͘",
        "newimages": "Sin iáⁿ-siōng oē-lóng",
        "imagelisttext": "Í-hā sī '''$1''' tiuⁿ iáⁿ-siōng ê lia̍t-toaⁿ, $2 pâi-lia̍t.",
        "ilsubmit": "Kiám-sek",
        "duplicate-defaultsort": "'''Thê-chhíⁿ lí:'''Siat-piān ê pâi-lia̍t hong-sek \"$2\" thè-oāⁿ chìn-chêng ê siat-piān ê pâi-lia̍t hong-sek \"$1\".",
        "version": "Pán-pún",
        "specialpages": "Te̍k-sû-ia̍h",
-       "tag-filter": "[[Special:Tags|標籤]]揣物:",
+       "tag-filter": "[[Special:Tags|Piau-chhiam]] chhoē mi̍h:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|个標籤}}]]:$2)",
+       "logentry-move-move": "$1 {{GENDER:$2|sóa}} $3 chit ia̍h khì $4",
        "logentry-newusers-create": "已經{{GENDER:$2|開好}}用者口座 $1",
        "searchsuggest-search": "Chhiau",
        "expandtemplates": "Khok-chhiong pang-bô͘",
index 295f11f..90d1f90 100644 (file)
        "protectedinterface": "Sta paggena nce appruviggióna 'e n'interfaccia testo p' 'o software dint'a sta wiki, e s'è prutetta pe' nce scanzà 'e cocch'abbuso.\nSi se buò azzeccà o cagnà traduzzione ncopp'a tutte 'e wiki, pe piacere ausate [//translatewiki.net/ translatewiki.net], 'o pruggetto Mediawiki p'a localizzaziona dint'a l'ate llengue",
        "editinginterface": "<strong>Attenziò:</strong>  'O testo 'e sta paggena ffà parte 'e ll'interfaccia utente d' 'o sito.\nTutt' 'e cagnamiénte fatte a sta paggena cumpareno dint' 'e mmasciate 'e ll'interfaccia veduta 'a tutte ll'utente dint'a sta wiki.",
        "translateinterface": "Si se buò azzeccà o cagnà traduzzione ncopp'a tutte 'e wiki, pe piacere ausate [//translatewiki.net/ translatewiki.net], 'o pruggetto Mediawiki p'a localizzaziona dint'a l'ate llengue",
-       "cascadeprotected": "Sta paggena è stata prutetta 'a 'o cangamento pecché sta dint'a {{PLURAL:$1|sta paggena, che è prutetta|sti paggene, che songo prutette}} quann' 'a l'ozione \"ricurziva\" è attiva:\n$2",
+       "cascadeprotected": "Sta paggena è stata prutetta 'a 'o cangamento pecché trascluse int'a {{PLURAL:$1|sta paggena, che è prutetta|sti paggene, che songo prutette}} quann' 'a l'ozione \"ricurziva\" è attiva:\n$2",
        "namespaceprotected": "Nun avite permesso a cagnà 'e paggene dint'a stu namespace '''$1'''.",
        "customcssprotected": "Nun v'è permesso 'a cagnà sta paggena CSS, pecché cuntene 'e mpustaziune perzunale 'e n'at'utente.",
        "customjsprotected": "Nun v'è permesso 'a cagnà sta paggena JavaScript, pecché cuntene 'e mpustaziune perzunale 'e n'at'utente.",
        "randomincategory-nopages": "Non ce stanno pàggene dint' 'a [[:Category:$1]].",
        "randomincategory-category": "Categurìa:",
        "randomincategory-legend": "Paggena a uocchio dint' 'a categurìa",
+       "randomincategory-submit": "Vàje",
        "randomredirect": "Redirezionamiento a uocchio",
        "randomredirect-nopages": "Nun ce stanno redirezionamiente int' 'o namespace \"$1\".",
        "statistics": "Statistiche",
        "linksearch-pat": "Ascìa pe' mudello 'e ricerca:",
        "linksearch-ns": "Namespace:",
        "linksearch-ok": "Truova",
-       "linksearch-text": "'E wildcard cumm'a \"*.wikipedia.org\" ponno essere ausate.<br />\nCe vulesse minimo nu dominio d'auto livello, p'esempio \"*.org\". <br />\n{{PLURAL:$2|Prutucolle}} suppurtate: <code>$1</code> ('o valore 'e bbase è http:// si 'o protocollo nun è stato specificato).",
+       "linksearch-text": "'E wildcard cumm'a \"*.wikipedia.org\" ponno essere ausate.<br />\nCe vulesse minimo nu dominio d'auto livello, p'esempio \"*.org\". <br />\n{{PLURAL:$2|Prutucolle}} suppurtate: $1 ('o valore 'e bbase è http:// si 'o protocollo nun è stato specificato).",
        "linksearch-line": "$1 presente dint'â paggena $2",
        "linksearch-error": "'E wildcard ponno essere ausate sulamente a l'inizio d' 'o hostname.",
        "listusersfrom": "Fà vedè l'utente partenno 'a:",
        "htmlform-cloner-create": "Azzecca 'e cchiù",
        "htmlform-cloner-delete": "Lèva",
        "htmlform-cloner-required": "Servesse al minimo nu valore.",
+       "htmlform-title-badnamespace": "[[:$1]] nun è dint'a lu namespace \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "\"$1\" nun è nu titolo criabbele 'e paggena",
+       "htmlform-title-not-exists": "[[:$1]] nun esiste.",
+       "htmlform-user-not-exists": "<strong>$1</strong> nun esiste.",
+       "htmlform-user-not-valid": "<strong>$1</strong> nun è nu nomme buono.",
        "sqlite-has-fts": "$1 cu supporto 'e ricerche full-text",
        "sqlite-no-fts": "$1 senza supporto 'e ricerche full-text",
        "logentry-delete-delete": "$1 {{GENDER:$2|scancellaje}} 'a paggena $3",
index 9543827..0f1aad0 100644 (file)
        "badtitletext": "Den ønskede tittelen var ugyldig, tom eller feilaktig lenket fra en annen wiki.\nDen inneholder kanskje ett eller flere tegn som ikke kan brukes i titler.",
        "title-invalid-empty": "Den forespurte sidetittelen er tom eller inneholder bare navnet til et navnerom.",
        "title-invalid-utf8": "Den forespurte sidetittelen inneholder en ugyldig UTF-8-sekvens.",
-       "title-invalid-interwiki": "Tittel inneholder en interwiki-lenke",
+       "title-invalid-interwiki": "Den ønskede sidetittel inneholder en interwiki-link som ikke kan brukes i titler.",
        "title-invalid-talk-namespace": "Den forespurte sidetittelen refererer til en diskusjonsside som ikke kan eksistere.",
        "title-invalid-characters": "Den forespurte sidetittelen inneholder ugyldige tegn: «$1».",
        "title-invalid-relative": "Tittel har relativ sti. Relative sidetitler (./, ../) er ugyldige fordi de ofte vil være unåelige når de blir håndtert av brukerens nettleser.",
        "title-invalid-magic-tilde": "Den ønskede sidetittelen inneholder en ugyldig magisk tildesekvens (<nowiki>~~~</nowiki>).",
-       "title-invalid-too-long": "Den ønskede sidetittelen er for lang. Den kan ikke være lengre enn $1 bytes i UTF-8-koding.",
+       "title-invalid-too-long": "Den ønskede sidetittelen er for lang. Den kan ikke være lengre enn $1 {{PLURAL:$1|byte|bytes}} med UTF-8-koding.",
        "title-invalid-leading-colon": "Den ønskede sidetittelen inneholder et ugyldig kolon i starten.",
        "perfcached": "Følgende data er en tidligere kopi og ikke nødvendigvis den siste versjonen i databasen. Maksimalt {{PLURAL:$1|ett resultat|$1 resultater}} er {{PLURAL:$1|tilgjengelig|tilgjengelige}} som tidligere kopier.",
        "perfcachedts": "Listen ble sist oppdatert $1. Maksimalt {{PLURAL:$4|ett resultat|$4 resultater}} vises.",
        "creating": "Oppretter $1",
        "editingsection": "Redigerer $1 (avsnitt)",
        "editingcomment": "Redigerer $1 (ny seksjon)",
-       "editconflict": "Endringene dine kunne ikke lagres på grunn av en redigeringskonflikt. Vil {{GENDER:|du}} løse konflikten manuelt?",
+       "editconflict": "Redigeringkonflikt: $1",
        "explainconflict": "Noen andre har endret teksten siden du begynte å redigere.\nDen øverste boksen inneholder den nåværende teksten.\nDine endringer vises i den nederste boksen.\nDu er nødt til å flette dine endringer sammen med den nåværende teksten.\n'''Kun''' teksten i den øverste tekstboksen blir lagret når du trykker «{{int:savearticle}}».",
        "yourtext": "Din tekst",
        "storedversion": "Den lagrede versjonen",
        "yourdiff": "Forskjeller",
        "copyrightwarning": "Merk at alle bidrag til {{SITENAME}} anses som frigitt under $2 (se $1 for detaljer).\nOm du ikke vil at ditt materiale skal kunne redigeres og distribueres fritt må du ikke lagre det her.<br />\nDu lover oss også at du har skrevet teksten selv, eller kopiert den fra en kilde i offentlig eie eller en annen fri ressurs.\n'''Ikke lagre opphavsrettsbeskyttet materiale uten tillatelse!'''",
        "copyrightwarning2": "Vennligst merk at alle bidrag til {{SITENAME}} kan bli redigert, endret eller fjernet av andre bidragsytere.\nOm du ikke vil at dine bidrag skal kunne redigeres fritt, ikke legg det til her.<br />\nDu lover også at du har skrevet dette selv, eller kopiert det fra en ressurs som er i offentlig eie eller en lignende fri ressurs (se $1 for detaljer).\n'''Ikke legg til opphavsrettsbeskyttet materiale uten tillatelse!'''",
+       "editpage-cannot-use-custom-model": "Innholdsmodellen for denne siden kan ikke endres.",
        "longpageerror": "'''Feil: Teksten du ønsker å lagre er {{PLURAL:$1|én kilobyte|$1 kilobyte}} stor. Dette er større enn det tillatte maksimum på {{PLURAL:$2|én kilobyte|$2 kilobyte}}.'''\nDen kan ikke lagres.",
        "readonlywarning": "'''ADVARSEL: Databasen er låst på grunn av vedlikehold,\nså du kan ikke lagre dine endringer akkurat nå. Det kan være en god idé å\nkopiere teksten din til en tekstfil, så du kan lagre den til senere.'''\n\nSystemadministratoren som låste databasen oppga følgende årsak: $1",
        "protectedpagewarning": "'''Advarsel: Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan redigere den.'''\nDet siste loggelementet er oppgitt under som referanse:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Tomt objekt",
        "content-json-empty-array": "Tom matrise",
+       "duplicate-args-warning": "<strong>Advarsel:</strong> [[:$1]] kaller [[:$2]] med flere enn en verdi for \"$3\"-parameteren. Bare den sist angitte verdien vil brukes.",
        "duplicate-args-category": "Sider med like argumenter i malkall",
        "duplicate-args-category-desc": "Denne siden inneholder malkall med duplikate parametre, slik som <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> eller <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Advarsel: Denne siden inneholder for mange prosesskrevende parserfunksjoner.\n\nDet burde være mindre enn {{PLURAL:$2|$2|$2}}, men er nå {{PLURAL:$1|$1|$1}}..",
        "badsig": "Ugyldig råsignatur; sjekk HTML-elementer.",
        "badsiglength": "Signaturen er for lang.\nDen kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.",
        "yourgender": "Hvordan ønsker du å bli omtalt?",
-       "gender-unknown": "Jeg ønsker ikke å spesifisere",
+       "gender-unknown": "Når du omtales, vil programvaren bruke kjønnsnøytrale ord så ofte som mulig.",
        "gender-male": "Han redigerer wikisider",
        "gender-female": "Hun redigerer wikisider",
        "prefs-help-gender": "Det er valgfritt å angi dette.\nProgramvaren bruker verdien for å anvende riktig grammatikalsk kjønn ved henvendelser til deg og i omtale av deg for andre brukere.\nInformasjonen vil være offentlig.",
        "userrights-lookup-user": "Ordne brukergrupper",
        "userrights-user-editname": "Skriv inn et brukernavn:",
        "editusergroup": "Endre brukergrupper",
-       "editinguser": "Endrer brukerrettighetene til '''[[User:$1|$1]]''' $2",
+       "editinguser": "Endrer brukerrettighetene for {{GENDER:$1|bruker}} <strong>[[Bruker:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Rediger brukergrupper",
        "saveusergroups": "Lagre brukergrupper",
        "userrights-groupsmember": "Medlem av:",
        "uploaddisabledtext": "Opplasting er slått av.",
        "php-uploaddisabledtext": "PHP-filopplasting er deaktivert. Sjekk innstillingen for file_uploads.",
        "uploadscripted": "Denne filen inneholder HTML eller skripting som kan feiltolkes av en nettleser.",
+       "upload-scripted-pi-callback": "Det er ikke tillatt å laste opp en fil som inneholder et kjørbart XML-stilark.",
+       "uploaded-script-svg": "Fant et skriptelement \"$1\" i den opplastede SVG-koden.",
        "uploadscriptednamespace": "Denne SVG-filen inneholder et ulovlig navnerom \"$1\"",
        "uploadinvalidxml": "XML-en i den opplastede filen kunne ikke tolkes.",
        "uploadvirus": "Denne filen inneholder virus! Detaljer: $1",
        "linksearch-pat": "Søkemønster:",
        "linksearch-ns": "Navnerom:",
        "linksearch-ok": "Søk",
-       "linksearch-text": "Jokertegn slik som i «*.wikipedia.org» kan brukes.\nDet kreves at det oppgis minst et toppnivådomene, for eksempel «*.org».<br />\n{{PLURAL:$2|Støttede protokoller}}: <code>$1</code> (ikke legg til noen av disse i søket ditt).",
+       "linksearch-text": "Jokertegn slik som i «*.wikipedia.org» kan brukes.\nDet kreves at det oppgis minst et toppnivådomene, for eksempel «*.org».<br />\n{{PLURAL:$2|Støttede protokoller}}: $1 (ikke legg til noen av disse i søket ditt).",
        "linksearch-line": "$1 lenkes fra $2",
        "linksearch-error": "Jokertegn kan kun brukes foran tjenernavnet.",
        "listusersfrom": "Vis brukere fra og med:",
        "htmlform-cloner-create": "Legg til mer",
        "htmlform-cloner-delete": "Fjern",
        "htmlform-cloner-required": "Minst én verdi kreves.",
+       "htmlform-title-not-exists": "[[:$1]] forefinnes ikke.",
        "sqlite-has-fts": "$1 med støtte for fulltekstsøk",
        "sqlite-no-fts": "$1 uten støtte for fulltekstsøk",
        "logentry-delete-delete": "$1 {{GENDER:$2|slettet}} siden $3",
index c36843a..e5cdad2 100644 (file)
        "passwordreset": "Wachtwoord opniej instellen",
        "passwordreset-text-one": "Vul dit formulier in um joew wachtwoord opniej in te stellen.",
        "passwordreset-text-many": "{{PLURAL:$1|Vul een van de gegevensvelden in um per netpost n tiejelik wachtwoord te ontvangen.}}",
-       "passwordreset-legend": "Wachtwoord opniej instellen",
        "passwordreset-disabled": "Je kunnen op disse wiki joew wachtwoord niet opniej instellen.",
        "passwordreset-emaildisabled": "Netpostmeugelikhejen bin uutezet op disse wiki.",
        "passwordreset-username": "Gebruker:",
        "resettokens": "Tokens ongedaonmaken",
        "resettokens-text": "Je kunnen hier tokens opniej instellen die toegang geven tot bepaolde persoonlike gegevens die ekoppeld bin an joew gebruker.\n\nDo dit a'j ze per ongelok mit ene edeeld hebben of as onbevoegden toegang ekregen hebben tot joew gebruker.",
        "resettokens-no-tokens": "Der bin gien tokens um ongedaon te maken.",
-       "resettokens-legend": "Tokens ongedaonmaken",
        "resettokens-tokens": "Tokens:",
        "resettokens-token-label": "$1 (aktuele weerde: $2)",
        "resettokens-watchlist-token": "Token veur webvoer (Atom/RSS) van [[Special:Watchlist|wiezigingen van ziejen die joew volglieste staon]]",
        "nlinks": "$1 {{PLURAL:$1|verwiezing|verwiezingen}}",
        "nmembers": "$1 {{PLURAL:$1|onderwarp|onderwarpen}}",
        "nrevisions": "$1 {{PLURAL:$1|versie|versies}}",
-       "nviews": "{{PLURAL:$1|1 keer|$1 keer}} bekeken",
        "nimagelinks": "Wörden op {{PLURAL:$1|één zied|$1 ziejen}} gebruukt",
        "ntransclusions": "wörden op {{PLURAL:$1|één zied|$1 ziejen}} gebruukt",
        "specialpage-empty": "Disse zied is leeg.",
        "linksearch-pat": "Zeukpetroon:",
        "linksearch-ns": "Naamruumte:",
        "linksearch-ok": "Zeuken",
-       "linksearch-text": "Jokers zo as \"*.wikipedia.org\" of \"*.org\" bin toe-estaon.\nHef tenminsten n topdomein, zo as \"*.org\".<br />\n{{PLURAL:$2|Ondersteund protokol|Ondersteunde protokollen}}: <code>$1</code> (wörden \"http://\" as der gien protokol op-egeven wörden).",
+       "linksearch-text": "Jokers zo as \"*.wikipedia.org\" of \"*.org\" bin toe-estaon.\nHef tenminsten n topdomein, zo as \"*.org\".<br />\n{{PLURAL:$2|Ondersteund protokol|Ondersteunde protokollen}}: $1 (wörden \"http://\" as der gien protokol op-egeven wörden).",
        "linksearch-line": "$1 hef n verwiezing in $2",
        "linksearch-error": "Jokers bin allinnig toe-estaon an t begin van n webadres.",
        "listusersfrom": "Laot gebrukers zien vanaof:",
index 675cbaa..3f685db 100644 (file)
        "resetpass-wrong-oldpass": "Dat Passwoord (temporär oder aktuell) gellt nich.\nVillicht hest du dien Passwoord al ännert oder noch wedder en nee temporär Passwoord anfeddert.",
        "resetpass-temp-password": "Temporär Passwoord:",
        "passwordreset": "Passwoord torüchsetten",
-       "passwordreset-legend": "Passwoord torüchsetten",
        "passwordreset-username": "Brukernaam:",
        "passwordreset-domain": "Domään",
        "passwordreset-email": "E-Mail-Adress:",
        "nlinks": "$1 {{PLURAL:$1|Verwies|Verwiesen}}",
        "nmembers": "$1 {{PLURAL:$1|Maat|Maten}}",
        "nrevisions": "{{PLURAL:$1|1 Version|$1 Versionen}}",
-       "nviews": "$1 {{PLURAL:$1|Affraag|Affragen}}",
        "specialpage-empty": "Disse Siet is leddig.",
        "lonelypages": "Weetsieden",
        "lonelypagestext": "Op disse Sieden wiest kene annern Sieden vun {{SITENAME}} un se sünd ok narms inbunnen.",
        "linksearch-pat": "Söökmunster:",
        "linksearch-ns": "Naamruum:",
        "linksearch-ok": "Söken",
-       "linksearch-text": "Wildcards as to’n Bispeel <code>*.wikipedia.org</code> köönt bruukt warrn.<br />\nÜnnerstütt Protokollen: <code>$1</code>",
+       "linksearch-text": "Wildcards as to’n Bispeel <code>*.wikipedia.org</code> köönt bruukt warrn.<br />\nÜnnerstütt Protokollen: $1",
        "linksearch-line": "$1 hett en Lenk vun $2",
        "linksearch-error": "Wildcards dröfft blot an’n Anfang vun de URL stahn.",
        "listusersfrom": "Wies de Brukers, de anfangt mit:",
index 8d2ef07..c4278b4 100644 (file)
        "linksearch-pat": "खोज्ने नमूना:",
        "linksearch-ns": "नेमस्पेस:",
        "linksearch-ok": "खोज्नुहोस्",
-       "linksearch-text": "\"*.wikipedia.org\" वाइल्डकार्डको रुपमा प्रयोग गर्न सकिने।\nकम्तिमा \".org\" जस्तो कुनै उच्च-स्तरीय डोमेनको आवश्यकता छ।<br />\nसमर्थित प्रोटोकल:<code>$1</code> (यदि कुनै {{PLURAL:$2|प्रोटोकल|प्रोटोकलहरू}} दिइएको छैन भने http:// को प्रयोग गर्न सकिन्छ)",
+       "linksearch-text": "\"*.wikipedia.org\" वाइल्डकार्डको रुपमा प्रयोग गर्न सकिने।\nकम्तिमा \".org\" जस्तो कुनै उच्च-स्तरीय डोमेनको आवश्यकता छ।<br />\nसमर्थित प्रोटोकल:$1 (यदि कुनै {{PLURAL:$2|प्रोटोकल|प्रोटोकलहरू}} दिइएको छैन भने http:// को प्रयोग गर्न सकिन्छ)",
        "linksearch-line": "$1 $2सित जोड़िएको छ।",
        "linksearch-error": "मूलनामको सुरुमा मात्र वाइल्डकार्ड देखापर्न सक्छ।",
        "listusersfrom": "प्रयोगहरु देखाउन शुरु हुने यहाँ:",
index bd4fce5..1fdbd17 100644 (file)
@@ -68,7 +68,8 @@
                        "Robin0van0der0vliet",
                        "Kthoelen",
                        "Mbch331",
-                       "Esketti"
+                       "Esketti",
+                       "M!dgard"
                ]
        },
        "tog-underline": "Koppelingen onderstrepen:",
        "creating": "Bezig met het aanmaken van $1",
        "editingsection": "Bezig met bewerken van $1 (deelpagina)",
        "editingcomment": "Bezig met bewerken van $1 (nieuw kopje)",
-       "editconflict": "Uw wijzigingen konden niet opgeslagen worden vanwege een bewerkingsconflict. Wilt {{GENDER:|u}} het conflict handmatig oplossen?",
+       "editconflict": "Bewerkingsconflict: $1",
        "explainconflict": "Een andere gebruiker heeft deze pagina bewerkt sinds u met uw bewerking bent begonnen.\nIn het bovenste deel van het venster staat de tekst van de huidige pagina.\nUw bewerking staat in het onderste gedeelte.\nU dient uw bewerkingen in te voegen in de bestaande tekst.\n'''Alleen''' de tekst in het bovenste gedeelte wordt opgeslagen als u op \"{{int:savearticle}}\" klikt.",
        "yourtext": "Uw tekst",
        "storedversion": "Opgeslagen versie",
        "yourdiff": "Wijzigingen",
        "copyrightwarning": "Let op: alle bijdragen aan {{SITENAME}} worden geacht te zijn vrijgegeven onder de $2 (zie $1 voor details).\nAls u niet wilt dat uw tekst door anderen naar believen bewerkt en verspreid kan worden, kies dan niet voor \"Pagina opslaan\".<br />\nHierbij belooft u ons tevens dat u deze tekst zelf hebt geschreven of overgenomen uit een vrije, openbare bron.<br />\n'''Gebruik geen materiaal dat beschermd wordt door auteursrecht, tenzij u daarvoor toestemming hebt!'''",
        "copyrightwarning2": "Al uw bijdragen aan {{SITENAME}} kunnen bewerkt, gewijzigd of verwijderd worden door andere gebruikers.\nAls u niet wilt dat uw teksten rigoureus aangepast worden door anderen, plaats ze hier dan niet.<br />\nU belooft ook dat u de oorspronkelijke auteur bent van dit materiaal of dat u het hebt gekopieerd uit een bron in het publieke domein of een soortgelijke vrije bron (zie $1 voor details).\n'''Gebruik geen materiaal dat beschermd wordt door auteursrecht, tenzij u daarvoor toestemming hebt!'''",
+       "editpage-cannot-use-custom-model": "Het inhoudsmodel van deze pagina kan niet worden veranderd.",
        "longpageerror": "'''Fout: de tekst die u hebt toegevoegd is {{PLURAL:$1|één kilobyte|$1 kilobyte}} groot, wat groter is dan het maximum van {{PLURAL:$2|één kilobyte|$2 kilobyte}}.'''\nOpslaan is niet mogelijk.",
        "readonlywarning": "'''Waarschuwing: u kunt deze bewerking nu niet opslaan omdat de database is geblokkeerd voor bewerkingen wegens onderhoudswerkzaamheden.'''\nHet is misschien verstandig om uw tekst tijdelijk in een tekstbestand op te slaan om dit te bewaren voor wanneer de blokkering van de database opgeheven is.\n\nEen beheerder heeft de database geblokkeerd om de volgende reden: $1",
        "protectedpagewarning": "'''Waarschuwing: deze beveiligde pagina kan alleen door gebruikers met beheerdersrechten bewerkt worden.'''\nDe laatste logboekregel staat hieronder:",
        "badsig": "Ongeldige ondertekening; controleer de HTML-tags.",
        "badsiglength": "Uw ondertekening is te lang.\nDeze moet minder dan $1 {{PLURAL:$1|teken|tekens}} bevatten.",
        "yourgender": "Hoe wilt u beschreven worden?",
-       "gender-unknown": "Ik wil dit niet opgeven",
+       "gender-unknown": "De software zal waar mogelijk geslachtsneutrale woorden gebruiken als het over jou gaat",
        "gender-male": "Hij bewerkt pagina's",
        "gender-female": "Zij bewerkt pagina's",
        "prefs-help-gender": "Deze voorkeur instellen is optioneel.\n\nDe software gebruikt deze waarde om u aan te spreken en u te vermelden aan andere gebruikers door middel van het juiste grammaticale geslacht.\n\nDeze informatie is openbaar en zichtbaar voor andere gebruikers.",
        "uploaddisabledtext": "Het uploaden van bestanden is uitgeschakeld.",
        "php-uploaddisabledtext": "Het uploaden van bestanden is uitgeschakeld in PHP.\nControleer de instelling \"file_uploads\".",
        "uploadscripted": "Dit bestand bevat HTML- of scriptcode die foutief door uw browser kan worden weergegeven.",
-       "upload-scripted-pi-callback": "Kan niet een bestand met de xml-stylesheet uploaden.",
+       "upload-scripted-pi-callback": "Kan geen bestand met XML-stylesheet-processing-instructies uploaden.",
        "uploaded-script-svg": "Gevonden scriptable element \"$1\" in het geüploade SVG-bestand.",
        "uploaded-hostile-svg": "Gevonden onveilige CSS in de stijl element van het geüploade SVG-bestand .",
        "uploaded-event-handler-on-svg": "Het instellen van de event-handler attributen <code>$1=\"$2\"</code> is niet toegestaan in SVG-bestanden.",
-       "uploaded-href-attribute-svg": "Href kenmerken <code><$1 $2=\"$3\"></code> met niet-lokale doel (bijv. http:// javascript:, enz.) zijn niet toegestaan in SVG-bestanden.",
+       "uploaded-href-attribute-svg": "href-attributen <code>&lt;$1 $2=\"$3\"&gt;</code> met niet-lokaal doel (bv. http://, javascript:, enz.) zijn niet toegestaan in SVG-bestanden.",
        "uploaded-href-unsafe-target-svg": "Gevonden href tot onveilige doel <code><$1 $2=\"$3\"></code> in het geüploade SVG-bestand .",
        "uploaded-animate-svg": "Gevonden \"animeren\" tag die kan veranderen href behulp van de \"uit\" - attribuut <code><$1 $2=\"$3\"></code> in het geüploade svg-bestand.",
        "uploaded-setting-event-handler-svg": "Het instellen van de event-handler attributen is geblokkeerd, gevonden <code><$1 $2=\"$3\"></code> in het geüploade SVG-bestand.",
        "linksearch-pat": "Zoekpatroon:",
        "linksearch-ns": "Naamruimte:",
        "linksearch-ok": "Zoeken",
-       "linksearch-text": "Het jokerteken gebruiken, zoals \"*.wikipedia.org\" of \"*.org\" is toegestaan.\nHeeft tenminste een topleveldomein nodig, zoals bijvoorbeeld \"*.org\".<br />\n{{PLURAL:$2|Ondersteund protocol|Ondersteunde protocollen}}: <code>$1</code> (wordt \"http://\" als er geen protocol wordt opgegeven).",
+       "linksearch-text": "Het jokerteken gebruiken, zoals \"*.wikipedia.org\" of \"*.org\" is toegestaan.\nHeeft tenminste een topleveldomein nodig, zoals bijvoorbeeld \"*.org\".<br />\n{{PLURAL:$2|Ondersteund protocol|Ondersteunde protocollen}}: $1 (wordt \"http://\" als er geen protocol wordt opgegeven).",
        "linksearch-line": "$1 heeft een koppeling in $2",
        "linksearch-error": "Wildcards zijn alleen toegestaan aan het begin van een hostnaam.",
        "listusersfrom": "Gebruikers bekijken vanaf:",
        "rollback-success": "De wijzigingen door $1 zijn teruggedraaid.\nDe laatste versie van $2 is hersteld.",
        "sessionfailure-title": "Sessiefout",
        "sessionfailure": "Er lijkt een probleem te zijn met uw aanmeldsessie.\nUw handeling is gestopt uit voorzorg tegen een beveiligingsrisico (dat bestaat uit mogelijke \"hijacking\" van deze sessie).\nGa een pagina terug, laad die pagina opnieuw en probeer het nog eens.",
+       "changecontentmodel": "Inhoudsmodel van pagina bewerken",
+       "changecontentmodel-legend": "Inhoudsmodel veranderen",
+       "changecontentmodel-title-label": "Paginatitel",
+       "changecontentmodel-model-label": "Nieuw inhoudsmodel",
+       "changecontentmodel-reason-label": "Reden:",
+       "changecontentmodel-success-title": "Het inhoudsmodel is veranderd",
+       "changecontentmodel-success-text": "Het inhoudstype van [[:$1]] is veranderd.",
+       "changecontentmodel-cannot-convert": "De inhoud van [[:$1]] kan niet worden omgezet in een type $2.",
+       "changecontentmodel-title-cantexist": "Geen pagina mogelijk op $1.",
+       "changecontentmodel-nodirectediting": "Het inhoudsmodel $1 ondersteunt direct bewerken niet",
+       "log-name-contentmodel": "Veranderingenlogboek van inhoudsmodel",
+       "log-description-contentmodel": "Gebeurtenissen rond het inhoudsmodel van een pagina",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|veranderde}} het inhoudsmodel van pagina $3 van \"$4\" in \"$5\"",
+       "logentry-contentmodel-change-revertlink": "terugdraaien",
+       "logentry-contentmodel-change-revert": "terugdraaien",
        "protectlogpage": "Beveiligingslogboek",
        "protectlogtext": "Hieronder staan pagina's waarvan de beveiliging recentelijk gewijzigd is.\nZie de [[Special:ProtectedPages|lijst met beveiligde pagina's]] voor alle beveiligde pagina's.",
        "protectedarticle": "heeft \"[[$1]]\" beveiligd",
        "tooltip-pt-logout": "Afmelden",
        "tooltip-pt-createaccount": "Registreer u vooral en meld u aan. Dit is echter niet vereist.",
        "tooltip-ca-talk": "Overleg over deze pagina",
-       "tooltip-ca-edit": "U kunt deze pagina bewerken. Gebruik de knop voor het maken van een voorbeeld voordat u de pagina opslaat",
+       "tooltip-ca-edit": "Deze pagina bewerken",
        "tooltip-ca-addsection": "Nieuw kopje toevoegen",
        "tooltip-ca-viewsource": "Deze pagina is beveiligd.\nU kunt wel de broncode bekijken.",
        "tooltip-ca-history": "Eerdere versies van deze pagina",
        "pageinfo-robot-index": "Toegestaan",
        "pageinfo-robot-noindex": "Niet toegestaan",
        "pageinfo-watchers": "Aantal paginavolgers",
+       "pageinfo-visiting-watchers": "Aantal volgers die recente bewerkingen hebben bekeken",
        "pageinfo-few-watchers": "Minder dan  {{PLURAL:$1|één volger|$1 volgers}}",
+       "pageinfo-few-visiting-watchers": "Er kan wel of niet een volger zijn die de laatste bewerkingen hier bezoekt",
        "pageinfo-redirects-name": "Aantal doorverwijzingen naar deze pagina",
        "pageinfo-subpages-name": "Subpagina's van deze pagina",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|doorverwijzing|doorverwijzingen}}; $3 {{PLURAL:$3|niet-doorverwijzing|niet-doorverwijzingen}})",
        "deletedwhileediting": "'''Let op''': deze pagina is verwijderd terwijl u bezig was met uw bewerking!",
        "confirmrecreate": "Nadat u begonnen bent met uw wijziging heeft [[User:$1|$1]] ([[User talk:$1|overleg]]) deze pagina verwijderd met opgave van de volgende reden:\n: ''$2''\nBevestig dat u de pagina opnieuw wilt aanmaken.",
        "confirmrecreate-noreason": "Nadat u begonnen bent met uw wijziging heeft [[User:$1|$1]] ([[User talk:$1|overleg]]) deze pagina verwijderd.\nBevestig dat u de pagina opnieuw wilt aanmaken.",
-       "recreate": "De pagina is verwijderd sinds je begon te bewerken. Klik op \"$1\" om de pagina opnieuw aan te maken.",
+       "recreate": "Opnieuw aanmaken",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "De cache van deze pagina legen?",
        "confirm-purge-bottom": "Het opschonen van de cache zorgt ervoor dat de meest recente versie van een pagina wordt weergegeven.",
        "version-libraries": "Geïnstalleerde bibliotheken",
        "version-libraries-library": "Bibliotheek",
        "version-libraries-version": "Versie",
+       "version-libraries-license": "Licentie",
+       "version-libraries-description": "Beschrijving",
+       "version-libraries-authors": "Auteurs",
        "redirect": "Doorverwijzen op bestandsnaam, gebruikersnummer, paginanummer, of versienummer",
        "redirect-legend": "Doorverwijzen naar een bestand of pagina",
        "redirect-summary": "Deze speciale pagina verwijst door naar een bestand (als een bestandsnaam wordt opgegeven), een pagina (als een paginanummer of versienummer wordt opgegeven) of een gebruikerspagina (als een gebruikersnummer wordt opgegeven). Gebruik: [[{{#Special:Redirect}}/file/Voorbeeld.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] of [[{{#Special:Redirect}}/user/101]].",
index bcb4256..fe0345f 100644 (file)
        "filehist-help": "Klikk på dato/klokkeslett for å sjå fila slik ho var på det tidspunktet.",
        "filehist-deleteall": "slett alle",
        "filehist-deleteone": "slett",
-       "filehist-revert": "rulla attende",
+       "filehist-revert": "rull attende",
        "filehist-current": "gjeldande",
        "filehist-datetime": "Dato/klokkeslett",
        "filehist-thumb": "Miniatyrbilete",
        "linksearch-pat": "Søkjemønster:",
        "linksearch-ns": "Namnerom:",
        "linksearch-ok": "Søk",
-       "linksearch-text": "Jokerteikn som «*.wikipedia.org» kan nyttast.\nDet er påkravt med eit toppnivådomene, til dømes «*.org».<br />\n{{PLURAL:$2|Stødd protokoll|Stødde protokollar}}: <code>$1</code> (nyttar http:// som standard om ingen protokoll er oppgjeven)",
+       "linksearch-text": "Jokerteikn som «*.wikipedia.org» kan nyttast.\nDet er påkravt med eit toppnivådomene, til dømes «*.org».<br />\n{{PLURAL:$2|Stødd protokoll|Stødde protokollar}}: $1 (nyttar http:// som standard om ingen protokoll er oppgjeven)",
        "linksearch-line": "$2 lenkjer til $1",
        "linksearch-error": "Jokerteikn kan berre nyttast føre tenarnamnet.",
        "listusersfrom": "Vis brukarnamna frå og med:",
index cad960e..12bf5df 100644 (file)
        "passwordreset": "Remesa a zèro del senhal",
        "passwordreset-text-one": "Emplenatz aqueste formulari per reïnicializar vòstre senhal.",
        "passwordreset-text-many": "{{PLURAL:$1|Completatz un d'aqueles camps per recebre un senhal temporari per corrièr electronic.}}",
-       "passwordreset-legend": "Reïnicializar lo senhal",
        "passwordreset-disabled": "La reïnicializacion dels senhals es estada desactivada sus aqueste wiki.",
        "passwordreset-emaildisabled": "Las foncionalitats e-mail son estadas desactivadas sus aqueste wiki.",
        "passwordreset-username": "Nom d'utilizaire :",
        "resettokens": "Reïnicializar los getons",
        "resettokens-text": "Aici, podètz reïnicializar los getons que permeton d’accedir a d'unas donadas privadas associadas a vòstre compte.\n\nLo vos caldriá far se las avètz partejats accidentalament amb qualqu'un o se vòstre compte es estat compromés.",
        "resettokens-no-tokens": "I a pas cap de geton de reïnicializar.",
-       "resettokens-legend": "Reïnicializar los getons",
        "resettokens-tokens": "Getons :",
        "resettokens-token-label": "$1 (valor actuala : $2)",
        "resettokens-watchlist-token": "Geton pel flux (Atom/RSS) web de [[Special:Watchlist|modificacions de paginas de vòstra lista de seguiment]]",
        "right-override-export-depth": "Exportar las paginas en incluent las paginas ligadas fins a una prigondor de 5 nivèls",
        "right-sendemail": "Mandar un corrièl als autres utilizaires",
        "right-passwordreset": "Veire los corrièrs electronics de reïnicializacion dels senhals",
+       "right-applychangetags": "Aplicar [[Special:Tags|las balisas]] amb sas pròprias modificacions",
        "newuserlogpage": "Istoric de las creacions de comptes",
        "newuserlogpagetext": "Jornal de las creacions de comptes d'utilizaires.",
        "rightslog": "Istoric de las modificacions d'estatut",
        "randomincategory-nopages": "I a pas cap de pagina dins [[:Category:$1]].",
        "randomincategory-category": "Categoria :",
        "randomincategory-legend": "Pagina a l'azard dins la categoria",
+       "randomincategory-submit": "Amodar",
        "randomredirect": "Una pagina de redireccion a l'azard",
        "randomredirect-nopages": "I a pas cap de redireccion dins l'espaci de nom « $1 ».",
        "statistics": "Estatisticas",
        "nmembers": "$1 {{PLURAL:$1|membre|membres}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|membre|membres}}",
        "nrevisions": "$1 {{PLURAL:$1|revision|revisions}}",
-       "nviews": "$1 {{PLURAL:$1|consultacion|consultacions}}",
        "nimagelinks": "Utilizat sus $1 {{PLURAL:$1|pagina|paginas}}",
        "ntransclusions": "Utilizat sus $1 {{PLURAL:$1|pagina|paginas}}",
        "specialpage-empty": "Aquesta pagina es voida.",
        "linksearch-pat": "Recercar l’expression :",
        "linksearch-ns": "Espacis de noms :",
        "linksearch-ok": "Recercar",
-       "linksearch-text": "De caractèrs jokers coma « *.wikipedia.org » pòdon èsser utilizats.\nNecessitan al mens un domeni de nivèl superior, per exemple « *.org ».<br />\n{{PLURAL:$2|Protocòl reconegut|Protocòls reconeguts}}: <code>$1</code> (http:// per defaut se cap de protocòl es pas indicat).",
+       "linksearch-text": "De caractèrs jokers coma « *.wikipedia.org » pòdon èsser utilizats.\nNecessitan al mens un domeni de nivèl superior, per exemple « *.org ».<br />\n{{PLURAL:$2|Protocòl reconegut|Protocòls reconeguts}}: $1 (http:// per defaut se cap de protocòl es pas indicat).",
        "linksearch-line": "$1 amb un ligam a partir de $2",
        "linksearch-error": "Los caractèrs « joker » pòdon pas èsser utilizats qu’al començament del nom de domeni.",
        "listusersfrom": "Afichar los utilizaires a partir de :",
        "rollback-success": "Anullacion de las modificacions de $1 ; retorn a la version de $2.",
        "sessionfailure-title": "La sesilha a fracassat",
        "sessionfailure": "Vòstra sesilha de connexion sembla aver de problèmas ;\naquesta accion es estada anullada en prevencion d’un piratatge de sesilha.\nClicatz sus « Precedent » e tornatz cargar la pagina d’ont venètz, puèi ensajatz tornarmai.",
+       "changecontentmodel-title-label": "Títol de la pagina",
+       "changecontentmodel-model-label": "Novèl modèl de contengut",
+       "changecontentmodel-reason-label": "Motiu :",
+       "logentry-contentmodel-change-revertlink": "restablir",
+       "logentry-contentmodel-change-revert": "restablir",
        "protectlogpage": "Istoric de las proteccions",
        "protectlogtext": "Aquí una lista de las modificacions de las proteccions de paginas.\nConsultatz la [[Special:ProtectedPages|lista de las paginas protegidas]] per la lista de las proteccions actualament operacionalas.",
        "protectedarticle": "a protegit « [[$1]] »",
        "import-interwiki-history": "Copiar totas las versions de l'istoric d'aquesta pagina",
        "import-interwiki-templates": "Enclure totes los modèls",
        "import-interwiki-submit": "Importar",
+       "import-mapping-default": "Importar als emplaçaments per defaut",
+       "import-mapping-namespace": "Importar cap a un espaci de noms :",
        "import-upload-filename": "Nom del fichièr :",
        "import-comment": "Comentari :",
        "importtext": "Exportatz lo fichièr dempuèi lo wiki d’origina en utilizant [[Special:Export|aisina d'exportacion]].\nSalvatz-lo sus vòstre disc dur puèi importatz-lo aicí.",
        "tooltip-pt-logout": "Se desconnectar",
        "tooltip-pt-createaccount": "Vos es conselhat de crear un compte e de vos connectar ; pasmens, es pas obligatòri",
        "tooltip-ca-talk": "Discussion a prepaus d'aquesta pagina",
-       "tooltip-ca-edit": "Podètz modificar aquesta pagina. Mercé de previsualizar abans d’enregistrar.",
+       "tooltip-ca-edit": "Modificar aquesta pagina",
        "tooltip-ca-addsection": "Començar una seccion novèla",
        "tooltip-ca-viewsource": "Aquesta pagina es protegida. Çaquelà, ne podètz veire lo contengut.",
        "tooltip-ca-history": "Los autors e versions precedentas d'aquesta pagina.",
        "patrol-log-page": "Istoric de las versions patrolhadas",
        "patrol-log-header": "Vaquí un jornal de las versions patrolhadas.",
        "log-show-hide-patrol": "$1 l'istoric de las relecturas",
+       "log-show-hide-tag": "$1 lo jornal de las balisas",
        "deletedrevision": "La version anciana $1 es estada suprimida.",
        "filedeleteerror-short": "Error al moment de la supression del fichièr : $1",
        "filedeleteerror-long": "D'errors son estadas rencontradas al moment de la supression del fichièr :\n\n$1",
        "version-libraries": "Bibliotècas installadas",
        "version-libraries-library": "Bibliotèca",
        "version-libraries-version": "Version",
+       "version-libraries-license": "Licéncia",
+       "version-libraries-description": "Descripcion",
+       "version-libraries-authors": "Autors",
        "redirect": "Redirigit per fichièr, utilizaire, pagina o ID de revision.",
        "redirect-legend": "Redirigir cap a una pagina o un fichièr",
        "redirect-submit": "Validar",
        "tags-deactivate-title": "Desactivar la balisa",
        "tags-deactivate-reason": "Motiu :",
        "tags-deactivate-submit": "Desactivar",
+       "tags-edit-title": "Modificar las balisas",
        "tags-edit-manage-link": "Gerir las balisas",
+       "tags-edit-existing-tags": "Balisas existentas :",
        "tags-edit-existing-tags-none": "\"Pas cap\"",
+       "tags-edit-new-tags": "Balisas novèlas :",
+       "tags-edit-add": "Apondre aquestas balisas :",
+       "tags-edit-remove": "Suprimir aquestas balisas :",
+       "tags-edit-remove-all-tags": "(suprimir totas las balisas)",
+       "tags-edit-chosen-placeholder": "Seleccionar certanas balisas",
+       "tags-edit-reason": "Motiu :",
        "comparepages": "Comparar de paginas",
        "compare-page1": "Pagina 1",
        "compare-page2": "Pagina 2",
        "logentry-managetags-delete": "$1 {{GENDER:$2|a suprimit}} la balisa « $4 » (levada {{PLURAL:$5|d'una revision o entrada de jornal|de $5 revisions o entradas de jornal}})",
        "logentry-managetags-activate": "$1 {{GENDER:$2|a activat}} la balisa \"$4\" per l’usatge dels utilizaires e dels robòts",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|a desactivat}} la balisa « $4 » per l’usatge dels utilizaires e dels robòts",
+       "log-name-tag": "Jornal de las balisas",
        "rightsnone": "(cap)",
        "revdelete-summary": "modificar lo somari",
        "feedback-adding": "Apondon de vòstres comentaris a la pagina...",
index 758f34b..cc106dc 100644 (file)
        "linksearch-pat": "ଖୋଜା ପ୍ରଣାଳୀ:",
        "linksearch-ns": "ନେମସ୍ପେସ:",
        "linksearch-ok": "ଖୋଜନ୍ତୁ",
-       "linksearch-text": "\"*.wikipedia.org\" ପରି ୱାଇଲ୍ଡକାର୍ଡ଼ର ବ୍ୟବହାର କରାଯାଇଥାଇ ପାରେ ।\nଏକ ଉଚ୍ଚକୋଟୀର ଡୋମେନ ଲୋଡ଼ା, ଯଥା \"*.org\".<br />\nଅନୁମୋଦିତ {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (ଯଦି କୌଣସି ପ୍ରୋଟୋକଲ ଦିଆଯାଇନଥାଏ ତେବେ ଆପେ ଆପେ http:// ହୋଇଯାଇଥାଏ) ।",
+       "linksearch-text": "\"*.wikipedia.org\" ପରି ୱାଇଲ୍ଡକାର୍ଡ଼ର ବ୍ୟବହାର କରାଯାଇଥାଇ ପାରେ ।\nଏକ ଉଚ୍ଚକୋଟୀର ଡୋମେନ ଲୋଡ଼ା, ଯଥା \"*.org\".<br />\nଅନୁମୋଦିତ {{PLURAL:$2|protocol|protocols}}: $1 (ଯଦି କୌଣସି ପ୍ରୋଟୋକଲ ଦିଆଯାଇନଥାଏ ତେବେ ଆପେ ଆପେ http:// ହୋଇଯାଇଥାଏ) ।",
        "linksearch-line": "$1 ଟି $2ରୁ ଯୋଡ଼ାଯାଇଅଛି ।",
        "linksearch-error": "କେବଳ ହୋଷ୍ଟ ନାମର ଆରମ୍ଭରେ ୱାଇଲ୍ଡକାର୍ଡ଼ ଦେଖାଯିବ ।",
        "listusersfrom": "ଏହି ନାମରେ ସଭ୍ୟ ଜଙ୍କ ନାମ ଦେଖାଇବେ:",
index 75cd3d9..ea09944 100644 (file)
@@ -7,7 +7,8 @@
                        "Urhixidur",
                        "Val2397",
                        "아라",
-                       "Leeheonjin"
+                       "Leeheonjin",
+                       "TTO"
                ]
        },
        "tog-underline": "Gulisan lang panglalam deng suglung:",
        "otherlanguages": "Kareng aliwang amanu",
        "redirectedfrom": "(Miyalis direksiun manibat king $1)",
        "redirectpagesub": "Bulung ning pamanaliling direksiun (redirect)",
+       "redirectto": "I-redirekta king:",
        "lastmodifiedat": "Tauli yang miyalilan ining bulung anyang $2, $1.",
        "viewcount": "Ining bulung linawe da neng {{PLURAL:$1|misan|$1 besis/ukdu}}.",
        "protectedpage": "Bulung a protektadu/makakambil",
        "toc": "Kalamnan",
        "showtoc": "pakit",
        "hidetoc": "isalikut",
+       "confirmable-yes": "Wa",
+       "confirmable-no": "Ali",
        "thisisdeleted": "Lawen o ibalik $1?",
        "viewdeleted": "Lon ya ing $1?",
        "restorelink": "{{PLURAL:$1|metung a edit a mebura|$1 edit a mebura}}",
        "tooltip-pt-login": "Agkat da kang mag login, 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.",
-       "tooltip-ca-addsection": "Mangibili kang bayung dake o ''section''.",
+       "tooltip-ca-edit": "I-edit/alilan ya ing bulung a ini",
+       "tooltip-ca-addsection": "Mangibili kang bayung dake o \"section\".",
        "tooltip-ca-viewsource": "Protektadu/makakambil ya ing bulung a ini. Malyari meng lon ing kayang pikuanan (source).",
        "tooltip-ca-history": "Deng milabas a bersion ning bulung a ini.",
        "tooltip-ca-protect": "Protektan/kambilan ya ing bulung a ini",
        "version-license": "Lisensia",
        "version-software-product": "Produktu",
        "version-software-version": "Bersion",
+       "version-libraries-license": "Lisensya",
        "fileduplicatesearch": "Maintun simpan (file) a kapareu",
        "fileduplicatesearch-legend": "Maintun kapareu",
        "fileduplicatesearch-filename": "Lagyungsimpan (filename):",
index cd315c6..970497a 100644 (file)
        "creating": "Tworzenie $1",
        "editingsection": "Edytujesz $1 (sekcja)",
        "editingcomment": "Edytujesz $1 (nowa sekcja)",
-       "editconflict": "Twoje zmiany nie mogły zostać zapisane z powodu wystąpienia konfliktu edycji. Czy {{GENDER:|chcesz}} rozwiązać go ręcznie?",
+       "editconflict": "Konflikt edycji: $1",
        "explainconflict": "Ktoś zmienił treść strony w trakcie Twojej edycji.\nGórne pole zawiera tekst strony aktualnie zapisany w bazie danych.\nTwoje zmiany znajdują się w dolnym polu.\nBy wprowadzić swoje zmiany, musisz zmodyfikować tekst z górnego pola.\n'''Tylko''' tekst z górnego pola zostanie zapisany w bazie, gdy wciśniesz „{{int:savearticle}}”.",
        "yourtext": "Twój tekst",
        "storedversion": "Zapisana wersja",
        "yourdiff": "Różnice",
        "copyrightwarning": "Wkład na {{SITENAME}} jest udostępniany na licencji $2 (szczegóły w $1). Jeśli nie chcesz, żeby Twój tekst był dowolnie zmieniany przez każdego i rozpowszechniany bez ograniczeń, nie umieszczaj go tutaj.<br />\nZapisując swoją edycję, oświadczasz, że ten tekst jest Twoim dziełem lub pochodzi z materiałów dostępnych na warunkach ''domeny publicznej'' lub kompatybilnych.\n'''PROSZĘ NIE WPROWADZAĆ MATERIAŁÓW CHRONIONYCH PRAWEM AUTORSKIM BEZ POZWOLENIA WŁAŚCICIELA!'''",
        "copyrightwarning2": "Wszelki wkład na {{SITENAME}} może być edytowany, zmieniany lub usunięty przez innych użytkowników.\nJeśli nie chcesz, żeby Twój tekst był dowolnie zmieniany przez każdego i rozpowszechniany bez ograniczeń, nie umieszczaj go tutaj.<br />\nZapisując swoją edycję, oświadczasz, że ten tekst jest Twoim dziełem lub pochodzi z materiałów dostępnych na warunkach ''domeny publicznej'' lub kompatybilnych (zobacz także $1).\n'''PROSZĘ NIE WPROWADZAĆ MATERIAŁÓW CHRONIONYCH PRAWEM AUTORSKIM BEZ POZWOLENIA WŁAŚCICIELA!'''",
+       "editpage-cannot-use-custom-model": "Model zawartości tej strony nie może być zmieniony.",
        "longpageerror": "'''Błąd! Wprowadzony przez Ciebie tekst ma {{PLURAL:$1|1 kilobajt|$1 kilobajty|$1 kilobajtów}}. Długość tekstu nie może przekraczać {{PLURAL:$2|1 kilobajt|$2 kilobajty|$2 kilobajtów}}. Tekst nie może być zapisany.'''",
        "readonlywarning": "'''Uwaga! Baza danych została zablokowana do celów administracyjnych. W tej chwili nie można zapisać nowej wersji strony. Jeśli chcesz, może skopiować ją do pliku, aby móc zapisać ją później.'''\n\nAdministrator, który zablokował bazę, podał następujące wyjaśnienie: $1",
        "protectedpagewarning": "'''Uwaga! Możliwość modyfikacji tej strony została zabezpieczona. Mogą ją edytować jedynie użytkownicy z uprawnieniami administratora.'''\nOstatni wpis z rejestru jest pokazany poniżej.",
        "semiprotectedpagewarning": "'''Uwaga!''' Ta strona została zabezpieczona i tylko zarejestrowani użytkownicy mogą ją edytować.\nOstatni wpis z rejestru jest pokazany poniżej.",
-       "cascadeprotectedwarning": "'''Uwaga!''' Ta strona została zabezpieczona i tylko użytkownicy z uprawnieniami administratora mogą ją edytować. Strona ta jest zawarta na {{PLURAL:$1|następującej stronie, która została zabezpieczona|następujących stronach, które zostały zabezpieczone}} z włączoną opcją dziedziczenia:",
+       "cascadeprotectedwarning": "<strong>Uwaga:<strong> Ta strona została zabezpieczona i tylko użytkownicy z uprawnieniami administratora mogą ją edytować. Została ona osadzona w {{PLURAL:$1|następującej stronie, która została zabezpieczona|następujących stronach, które zostały zabezpieczone}} z włączoną opcją dziedziczenia:",
        "titleprotectedwarning": "'''Uwaga! Utworzenie strony o tej nazwie zostało zabezpieczone. Do jej utworzenia wymagane są [[Special:ListGroupRights|specyficzne uprawnienia]].'''\nOstatni wpis z rejestru jest pokazany poniżej.",
        "templatesused": "{{PLURAL:$1|Szablon użyty|Szablony użyte}} w tym artykule:",
        "templatesusedpreview": "{{PLURAL:$1|Szablon użyty|Szablony użyte}} w tym podglądzie:",
        "unusedimages": "Nieużywane pliki",
        "wantedcategories": "Brakujące kategorie",
        "wantedpages": "Najpotrzebniejsze strony",
-       "wantedpages-summary": "Najczęściej linkowane nieistniejące strony, z wyłączeniem stron, do których linkują wyłącznie przekierowania. Lista nieistniejących stron, do których linkują przekierowania, znajduje się na [[{{#special:BrokenRedirects}}]].",
+       "wantedpages-summary": "Lista najczęściej linkowanych, nieistniejących stron, z wyłączeniem stron, do których linkują wyłącznie przekierowania. By zobaczyć listę nieistniejących stron, do których linkują przekierowania, zobacz [[{{#special:BrokenRedirects}}|listę zerwanych przekierowań]].",
        "wantedpages-badtitle": "Nieprawidłowy tytuł wśród wyników – $1",
        "wantedfiles": "Potrzebne pliki",
        "wantedfiletext-cat": "Następujące pliki są używane, ale nie istnieją. Pliki z obcych repozytoriów mogą być wymienione pomimo istnienia. Takie fałszywe wyniki zostaną <del>przekreślone</del>. Ponadto strony, które osadzają pliki, które nie istnieją, są wymienione w [[:$1]].",
        "linksearch-pat": "Wzorzec wyszukiwania",
        "linksearch-ns": "Przestrzeń nazw:",
        "linksearch-ok": "Szukaj",
-       "linksearch-text": "Można użyć symboli wieloznacznych jak „*.wikipedia.org”.\nWymaga podania co najmniej domeny najwyższego poziomu np. „*.org”.<br />\n{{PLURAL:$2|Obsługiwany protokół|Obsługiwane protokoły}}: <code>$1</code> (jeśli nie podano, domyślny to http://).",
+       "linksearch-text": "Można użyć symboli wieloznacznych, takich jak „*.wikipedia.org”.\nWymaganie jest podanie co najmniej domeny najwyższego poziomu np. „*.org”.<br />\n{{PLURAL:$2|Obsługiwany protokół|Obsługiwane protokoły}}: $1 (jeśli nie podano, domyślny to http://).",
        "linksearch-line": "$1 link na stronie $2",
        "linksearch-error": "Symbolu wieloznacznego można użyć wyłącznie na początku nazwy hosta.",
        "listusersfrom": "Pokaż użytkowników zaczynając od",
        "sessionfailure": "Wystąpił problem z weryfikacją zalogowania.\nPolecenie zostało anulowane, aby uniknąć przechwycenia sesji.\nNaciśnij „wstecz” w przeglądarce, przeładuj stronę, po czym ponownie wydaj polecenie.",
        "changecontentmodel": "Edycja modelu zawartości strony",
        "changecontentmodel-title-label": "Tytuł strony",
+       "changecontentmodel-model-label": "Nowy model zawartości",
        "changecontentmodel-reason-label": "Powód:",
+       "changecontentmodel-success-title": "Model zawartości został zmieniony",
+       "changecontentmodel-success-text": "Typ zawartości [[:$1]] został zmieniony.",
+       "changecontentmodel-cannot-convert": "Zawartość [[:$1]] nie może być przekształcona do typu $2.",
+       "changecontentmodel-nodirectediting": "Model zawartości $1 nie obsługuje bezpośredniego edytowania",
+       "log-name-contentmodel": "Rejestr zmian modelu zawartości",
        "logentry-contentmodel-change-revertlink": "Przywróć",
        "logentry-contentmodel-change-revert": "Przywróć",
        "protectlogpage": "Zabezpieczone",
        "protect-locked-blocked": "Nie możesz zmienić poziomów zabezpieczenia, ponieważ jesteś zablokowany.\nObecne ustawienia dla strony '''$1''' to:",
        "protect-locked-dblock": "Nie można zmienić poziomu zabezpieczenia z powodu działającej blokady bazy danych. Obecne ustawienia dla strony '''$1''' to:",
        "protect-locked-access": "Nie masz uprawnień do zmiany poziomu zabezpieczenia strony. Obecne ustawienia dla strony '''$1''' to:",
-       "protect-cascadeon": "Ta strona jest zabezpieczona przed edycją, ponieważ jest używana przez {{PLURAL:$1|następującą stronę, która została zabezpieczona|następujące strony, które zostały zabezpieczone}} z włączoną opcją dziedziczenia. Zmiany stopnia zabezpieczenia tej strony nie wpłyną na dziedziczenie zabezpieczenia.",
+       "protect-cascadeon": "Ta strona jest zabezpieczona przed edycją, ponieważ jest osadzona w {{PLURAL:$1|następującej stronie, która została zabezpieczona|następujących stronach, które zostały zabezpieczone}} z włączoną opcją dziedziczenia. Zmiany stopnia zabezpieczenia tej strony nie wpłyną na dziedziczenie zabezpieczenia.",
        "protect-default": "Dostęp mają wszyscy użytkownicy",
        "protect-fallback": "Wymaga uprawnień „$1”",
        "protect-level-autoconfirmed": "Dozwolone tylko dla użytkowników automatycznie zatwierdzonych",
        "tooltip-pt-logout": "Wyloguj",
        "tooltip-pt-createaccount": "Zachęcamy do stworzenia konta i zalogowania, ale nie jest to konieczne.",
        "tooltip-ca-talk": "Dyskusja o zawartości tej strony",
-       "tooltip-ca-edit": "Edytuj tę stronę.",
+       "tooltip-ca-edit": "Edytuj tę stronę",
        "tooltip-ca-addsection": "Dodaj nowy wątek.",
        "tooltip-ca-viewsource": "Ta strona jest zabezpieczona. Możesz zobaczyć tekst źródłowy.",
        "tooltip-ca-history": "Starsze wersje tej strony.",
        "deletedwhileediting": "'''Uwaga!''' Ta strona została usunięta po tym, jak rozpoczął{{GENDER:|eś|aś|eś(‐aś)}} jej edycję!",
        "confirmrecreate": "[[User:$1|$1]] ([[User talk:$1|dyskusja]]) usun{{GENDER:$1|ął|ęła|ął(‐ęła)}} tę stronę po tym, jak rozpoczął{{GENDER:|eś|aś|eś(‐aś)}} jego edycję, podając jako powód usunięcia:\n: ''$2''\nCzy na pewno chcesz ją ponownie utworzyć?",
        "confirmrecreate-noreason": "Użytkownik [[User:$1|$1]] ([[User talk:$1|dyskusja]]) usunął tę stronę po rozpoczęciu przez Ciebie edycji. Potwierdź, czy naprawdę chcesz, ponownie utworzyć tę stronę.",
-       "recreate": "Strona została usunięta od czasu rozpoczęcia twojej edycji. Naciśnij „$1”, aby ją powtórnie utworzyć.",
+       "recreate": "Utwórz powtórnie",
        "confirm_purge_button": "Wyczyść",
        "confirm-purge-top": "Wyczyścić pamięć podręczną dla tej strony?",
        "confirm-purge-bottom": "Odświeżenie strony wyczyści pamięć podręczną i wymusi pokazanie jej aktualnej wersji.",
        "htmlform-cloner-create": "Dodaj więcej",
        "htmlform-cloner-delete": "Usuń",
        "htmlform-cloner-required": "Wymagana jest co najmniej jedna wartość.",
+       "htmlform-title-badnamespace": "[[:$1]] nie znajduje się w przestrzeni nazw „{{ns:$2}}”.",
+       "htmlform-title-not-creatable": "Nie można użyć „$1” do utworzenia tytułu strony",
+       "htmlform-title-not-exists": "[[:$1]] nie istnieje.",
+       "htmlform-user-not-exists": "<strong>$1</strong> nie istnieje.",
+       "htmlform-user-not-valid": "<strong>$1</strong> nie jest prawidłową nazwą użytkownika.",
        "sqlite-has-fts": "$1 z obsługą pełnotekstowego wyszukiwania",
        "sqlite-no-fts": "$1 bez obsługi pełnotekstowego wyszukiwania",
        "logentry-delete-delete": "$1 {{GENDER:$2|usunął|usunęła}} stronę $3",
index 046dc83..b207f10 100644 (file)
        "passwordreset": "Ri-inissialisassion ëd la ciav",
        "passwordreset-text-one": "Ch'a completa 's formolari për reimposté soa ciav.",
        "passwordreset-text-many": "{{PLURAL:$1|Ch'a compila un dij camp për arsèive na ciav provisòria për pòsta eletrònica.}}",
-       "passwordreset-legend": "Riampostassion ëd la ciav",
        "passwordreset-disabled": "La reinissialisassion ëd le ciav a l'é stàita disabilità su sta wiki.",
        "passwordreset-emaildisabled": "Le fonsionalità ëd pòsta eletrònica a son ëstàite disativà su sta wiki.",
        "passwordreset-username": "Stranòm:",
        "resettokens": "Riamposté ij geton",
        "resettokens-text": "Ambelessì a peul riamposté ij geton ch'a permëtto d'acede a chèich dàit privà associà a sò cont.\n\nA dovrìa felo si për asar chiel a l'ha partagiaje con cheidun o si sò cont a l'é stàit compromëttù.",
        "resettokens-no-tokens": "A-i é gnun geton da riamposté.",
-       "resettokens-legend": "Riamposté ij geton.",
        "resettokens-tokens": "Geton:",
        "resettokens-token-label": "$1 (valor atual: $2)",
        "resettokens-watchlist-token": "Geton për ël fluss an sl'aragnà (Atom/RSS) ëd [[Special:Watchlist|modìfiche a le pàgine che as ten sot-euj]]",
        "yourdiff": "Diferense",
        "copyrightwarning": "Che a ten-a për piasì da ment che tute le contribussion a {{SITENAME}} as consìdero dàite sota a na licensa ëd la sòrt $2 (che a varda $1 për avèj pì 'd detaj).\nSe a veul nen che sò test a peula esse modificà e distribuì da qualsëssìa përson-a sensa gnun-a limitassion ëd gnun-a sòrt, che a lo buta pa ambelessì.<br />\nËn mandand ës test-sì chiel as fa garant sota soa responsabilità che ël test a l'ha scrivusslo despërchiel, ò pura che a l'ha tracopialo da na sorgiss ëd pùblich domini, ò da n'àutra sorgiss dla midema sòrt.\n'''Anserì mai dël material coatà da drit d'autor sensa avèj n'autorisassion për felo!'''",
        "copyrightwarning2": "Për piasì, che a ten-a da ment che tute le contribussion a {{SITENAME}} a peulo esse modificà ò scancelà da d'àutri contributor. Se a veul nen che lòn che a scriv a ven-a modificà sensa limitassion ëd gnun-a sòrt, che a lo manda nen ambelessì.<br />\nAnt l'istess temp, ën mandand dël material un as pija la responsabilità dë dì che a l'ha scrivusslo daspërchiel, ò pura che a l'ha copialo da na sorgiss ëd domini pùblich, ò pura da 'nt n'àutra sorgiss dla midema sòrt (che a varda $1 për avèj pì d'anformassion).\n'''Che a manda pa dël material coata da drit d'autor sensa avèj avù ël përmess ëd felo!'''",
+       "editpage-cannot-use-custom-model": "Ël model ëd contnù ëd sa pàgina a peul nen esse modificà.",
        "longpageerror": "'''EROR: Ël test che a l'ha mandà a l'é longh {{PLURAL:$1|un kilobyte|$1 kilobytes}}, che a resta pì che ël lìmit màssim {{PLURAL:$2|d'un kilobyte|ëd $2 kilobyte}}.''' Parèj as peul pa salvesse.",
        "readonlywarning": "'''Avis: La base ëd dat a l'é stàita blocà për manutension, e donca a podrà pa salvesse soe modìfiche tut sùbit.'''\nA peul esse che a-j ven-a còmod copiesse via sò test e ancoless-lo an n'archivi ëd test e goernelo për pi tard.\n\nL'aministrator che a l'ha fàit ël blocagi a l'ha dàit costa spiegassion: $1",
        "protectedpagewarning": "'''Avis: costa pàgina-sì a l'é stàita protegiùa an manera che mach j'utent con la qualìfica da aministrator a peulo feje dle modìfiche.'''\nL'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:",
        "semiprotectedpagewarning": "'''Nòta:''' Costa pàgina-sì a l'é stàita blocà an manera che mach j'utent registrà a peulo modifichela.\nL'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:",
-       "cascadeprotectedwarning": "'''Tension:''' Sta pàgina a l'é stàita blocà an manera che mach j'utent con la qualìfica da aministrator a peulo modifichela, për via che a l'é comprèisa an {{PLURAL:$1|costa pàgina-sì|an coste pàgine-sì}} ch'a l'han ël sistema ëd protession a cascada:",
+       "cascadeprotectedwarning": "<strong>Tension:</strong> Sta pàgina a l'é stàita blocà an manera che mach j'utent con la qualìfica da aministrator a peulo modifichela, për via che a l'é comprèisa an {{PLURAL:$1|costa pàgina-sì|an coste pàgine-sì}} ch'a l'han ël sistema ëd protession a cascada:",
        "titleprotectedwarning": "'''Avis: sta pàgina-sì a l'é stàita blocà an manera che a-i é dabzògn ëd [[Special:ListGroupRights|drit specìfich]] për creela.'''\nL'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:",
        "templatesused": "{{PLURAL:$1|Stamp}} dovrà da costa pàgina-sì:",
        "templatesusedpreview": "{{PLURAL:$1|Stamp}} dovrà an costa preuva:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Oget veuid",
        "content-json-empty-array": "Tàula veuida",
+       "duplicate-args-warning": "<strong>Atension:</strong> [[:$1]] a arciama [[:$2]] con pe che un valor për ël paràmeter \"$3\". Mach l'ùltim valor fornì a sarà dovrà.",
        "duplicate-args-category": "Pàgine ch'a deuvro d'argoment dobi ant j'arceste dë stamp",
        "duplicate-args-category-desc": "La pàgina a conten cj'arceste dë stamp che deuvro ëd duplicà d'argoment, tanme <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Atension:''' Costa pàgina a l'ha tròpe ciamà costose a le fonsions d'anàlisi sintàtica.\n\nA dovrìa essnie men che {{PLURAL:$2|$2}}, adess a-i na j'é {{PLURAL:$1|$1}}.",
        "badsig": "Soa firma a l'é nen giusta, che a controla j'istrussion HTML.",
        "badsiglength": "Sò stranòm a l'é tròp longh.\nA deuv nen esse pì longh che $1 {{PLURAL:$1|caràter|caràter}}.",
        "yourgender": "'Me ch'a preferiss esse descrivù?",
-       "gender-unknown": "I preferisso nen dilo",
+       "gender-unknown": "Cand a parlërà ëd chiel, ël programa a dovrërà dle paròle ëd géner neutral, s'a l'é possìbil",
        "gender-male": "Chiel a modìfica dle pàgine dla wiki",
        "gender-female": "Chila a modìfica dle pàgine dla wiki",
        "prefs-help-gender": "Definì coste preferense a l'é opsional.\nËl programa a deuvra sò valor për adressesse a chiel e massionelo a j'àutri an dovrand ël géner gramatical giust.\nCosta anformassion a sarà pùblica.",
        "uploaddisabledtext": "La possibilità ëd carié dj'archivi a l'é staita disabilità.",
        "php-uploaddisabledtext": "Ij cariament d'archivi a son disabilità an PHP.\nPër piasì, ch'a controla l'ampostassion file_uploads.",
        "uploadscripted": "St'archivi-sì a l'ha andrinta chèich-còs (dël còdes HTML ò pura un senari) che a podrìa esse travajà mal da chèich programa ëd navigassion.",
+       "upload-scripted-pi-callback": "Impossìbil carié n'archivi ch'a conten d'anstrussion ëd tratament ëd feuj dë stil XML.",
+       "uploaded-script-svg": "Element ëscrivìbil «$1» trovà ant l'archivi SVG carià.",
+       "uploaded-hostile-svg": "CSS nen sigur trovà ant l'element dë stil ëd n'archivi SVG carià.",
+       "uploaded-event-handler-on-svg": "Fissé dj'atribù ëd gestion d'eveniment <code>$1=\"$2\"</code> a l'é nen përmëttù ant j'archivi SVG.",
+       "uploaded-href-attribute-svg": "J'atribù <code>&lt;$1 $2=\"$3\"&gt;</code> con un bërsaj nen local (për esempi http://, javascript:, e via fòrt) a son nen përmëttù ant j'archivi SVG.",
+       "uploaded-href-unsafe-target-svg": "href ver un bërsaj nen sigur <code>&lt;$1 $2=\"$3\"&gt;</code> trovà ant l'archivi SVG carià.",
+       "uploaded-animate-svg": "Trovà na tichëtta «animate», ch'a podrìa modifiché ël href an dovrand l'atribù «from» <code>&lt;$1 $2=\"$3\"&gt;</code> ant l'archivi SVG carià.",
        "uploadscriptednamespace": "S'archivi SVG a conten në spassi nominal «$1» nen autorisà",
        "uploadinvalidxml": "L'XML ant l'archivi carià a l'ha nen podù esse analisà.",
        "uploadvirus": "St'archivi-sì a l'han andrinta un '''vìrus!''' Detaj: $1",
        "randomincategory-nopages": "A-i é gnun-e pàgine ant la categorìa [[:Category:$1|$1]].",
        "randomincategory-category": "Categorìa:",
        "randomincategory-legend": "Pàgina a l'ancàpit ant la categorìa",
+       "randomincategory-submit": "Va",
        "randomredirect": "Na ridiression qualsëssìa",
        "randomredirect-nopages": "A-i é pa gnun-a ridiression ant lë spassi nominal \"$1\".",
        "statistics": "Statìstiche",
        "nmembers": "$1 {{PLURAL:$1|element|element}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|mèmber}}",
        "nrevisions": "{{PLURAL:$1|na revision|$1 revision}}",
-       "nviews": "{{PLURAL:$1|na consultassion|$1 consultassion}}",
        "nimagelinks": "Dovrà dzora a $1 {{PLURAL:$1|pàgina|pàgine}}",
        "ntransclusions": "dovrà dzora a $1 {{PLURAL:$1|pàgina|pàgine}}",
        "specialpage-empty": "Pàgina veujda.",
        "linksearch-pat": "Schema d'arsërca:",
        "linksearch-ns": "Spassi nominal:",
        "linksearch-ok": "Sërché",
-       "linksearch-text": "As peulo dovresse dij ciapatut com \"*.wikipedia.org\".\nA-i é dabzògn almanch d'un domini a livel pi àut, për esempi \"*.org\".<br />\n{{PLURAL:$2|Protocòl|Protocòj}} ch'as peulo dovresse: <code>$1</code> (predefinì http:// se gnun protocòl a l'é specificà).",
+       "linksearch-text": "As peulo dovresse dij ciapatut com \"*.wikipedia.org\".\nA-i é dabzògn almanch d'un domini a livel pi àut, për esempi \"*.org\".<br />\n{{PLURAL:$2|Protocòl|Protocòj}} ch'as peulo dovresse: $1 (predefinì http:// se gnun protocòl a l'é specificà).",
        "linksearch-line": "$1 a l'ha n'anliura ch'a-j riva dzora da $2",
        "linksearch-error": "Ij ciapatut as peulo butesse mach an prinsipi dël nòm dël sërvent.",
        "listusersfrom": "Smon-me j'utent a parte da:",
index 472daa4..c7fab64 100644 (file)
        "resetpass-wrong-oldpass": "غلط عارضی یا ہلے دی کنجی۔\nتساں نے شاید اپنی کنجی بدل لئی ہوۓ یا عارضی کنجی دی درخواست کیتی ہوۓ۔",
        "resetpass-temp-password": "عارضی کنجی:",
        "passwordreset": "کنجی واپس لیاؤ",
-       "passwordreset-legend": "کنجی واپس لیاؤ",
        "passwordreset-disabled": "اس وکی تے کنجی واپس نئیں لیائی جاسکدی۔",
        "passwordreset-username": "ورتن ناں:",
        "passwordreset-domain": "ڈومین",
        "nlinks": "$1 {{PLURAL:$1|link|جوڑ}}",
        "nmembers": "$1 {{PLURAL:$1|member|ممبران}}",
        "nrevisions": "$1 {{PLURAL:$1|ریوین|ریویناں}}",
-       "nviews": "$1 {{PLURAL:$1|وکھالہ|وکھالے}}",
        "nimagelinks": "تے ورتیا $1 {{PLURAL:$1|صفہ|صفے}}",
        "ntransclusions": "$1 تے ورتے  {{PLURAL:$1|صفہ|صفے}}",
        "specialpage-empty": "ایس رپورٹ دے کوئی نتیجے نئیں۔",
        "linksearch-pat": "کھوج راہ:",
        "linksearch-ns": "ناں دی جگہ:",
        "linksearch-ok": "کھوج",
-       "linksearch-text": "وائلڈکارڈز جیویں کہ \"*.wikipedia.org\" ورتے جاسکدے نیں۔\n\"*.org\".<br /> دی لوڑ\nمنے گۓ پروٹوکول: <code>$1</code>",
+       "linksearch-text": "وائلڈکارڈز جیویں کہ \"*.wikipedia.org\" ورتے جاسکدے نیں۔\n\"*.org\".<br /> دی لوڑ\nمنے گۓ پروٹوکول: $1",
        "linksearch-line": "$1 نوں $2 نال جوڑیا",
        "linksearch-error": "وکیکارڈو میزبان دے ناں دے شروع چ دس سکدے نیں۔",
        "listusersfrom": "ورتن والے ایس توں شروع ہون والے دسو:",
        "tooltip-invert": "ایس ڈبے نوں ویکھو تبدیلیاں چھپان لئی چونویں ناںتھاں تے (تے رلدے ناںتھاں اگر چیک کیتے جان)",
        "namespace_association": "رلدے ناں تھاں",
        "tooltip-namespace_association": "ایس ڈبے نون وی ویکھو گل بات یا ناںتھاں  چونویں ناںتھاں نال رلدا۔",
-       "blanknamespace": "(خاص)",
+       "blanknamespace": "(مکھ)",
        "contributions": "ورتن آلے دا حصہ",
        "contributions-title": "$1 دے کم",
        "mycontris": "میرے کم",
index 56e3151..e67d487 100644 (file)
        "nlinks": "$1 {{PLURAL:$1|autengīnsenis|autengīnsenei}}",
        "nmembers": "$1 {{PLURAL:$1|streīpstus|streīpstai}}",
        "nrevisions": "$1 {{PLURAL:$1|wersiōni|wersiōnis}}",
-       "nviews": "$1 {{PLURAL:$1|kāimalukisenis|kāimalukisenei}}",
        "specialpage-empty": "Ni ast rezultātai per šin repōrtan.",
        "lonelypages": "Ainaseīlingis pāusai",
        "lonelypagestext": "Prēi zemmaisins pāusans ni autenginna niaīnan kittan pāusan anga tenēi ni autenginna prei niaīnan kittan pāusan en {{SITENAME}}.",
        "linksearch-pat": "Laukīsnas šablōni:",
        "linksearch-ns": "Emninplattibi:",
        "linksearch-ok": "Laukīs",
-       "linksearch-text": "Mazīngi tērpautun tulapresliskan simbōlin \"*\"  - perwaidīnsnai „*.wikipedia.org”<br />\nEbšlūzitai prōtokulai: <code>$1</code>",
+       "linksearch-text": "Mazīngi tērpautun tulapresliskan simbōlin \"*\"  - perwaidīnsnai „*.wikipedia.org”<br />\nEbšlūzitai prōtokulai: $1",
        "linksearch-line": "Prei $1 autenginna $2",
        "linksearch-error": "Mazīngi tērpautun tulapresliskan simbōlin \"*\" tēr en hostas pabilīsnas pagaūseņu.",
        "listusersfrom": "Waidinnais tērpautajans pagaūnintei ezze:",
index bc9d391..30be292 100644 (file)
@@ -24,8 +24,8 @@
        "tog-watchdeletion": "زما کتنلړ کې دې هغه مخونه او دوتنې ورگډې شي چې زه يې ړنگوم",
        "tog-watchrollback": "هغه مخونه چې ما پکې پر شاتمبونې ترسره کړي زما کتنلړ کې ورگډول",
        "tog-minordefault": "په تلواليزه توگه ټول سمونونه واړه په نخښه کول",
-       "tog-previewontop": "د سمون بکس نه دمخه مخکتنه ښکاره کول",
-       "tog-previewonfirst": "په لومړي سمون کې مخکتنه ښکاره کول",
+       "tog-previewontop": "د سمون بکس څخه مخکې مخليدنه ښکاره کول",
+       "tog-previewonfirst": "په لومړي سمون کې مخليدنه ښکاره کول",
        "tog-enotifwatchlistpages": "کله چې زما د کتنلړ په يوې دوتنې يا يو مخ کې بدلون راځي نو ما ته دې د بدلون په اړه برېښليک راشي",
        "tog-enotifusertalkpages": "کله چې زما د خبرو اترو په مخ کې بدلون پېښېږي نو ما ته دې يو برېښليک ولېږلی شي.",
        "tog-enotifminoredits": "کله چې په مخونو او دوتنو کې وړې سمونې کېږي نو ماته دې د بدلون په اړه برېښليک راشي",
        "anonpreviewwarning": "''تاسې غونډال ته نه ياست ننوتي. خوندي کولو سره به ستاسې IP پته به د دې مخ د سمونونو په پېښليک کې ثبت شي.''",
        "missingcommenttext": "لطفاً تبصره لاندې وليکۍ.",
        "summary-preview": "د لنډيز مخليدنه:",
-       "subject-preview": "سکالو/سرليک مخکتنه:",
+       "subject-preview": "سکالو/سرليک مخليدنه:",
        "previewerrortext": "د بدلونونو د مخليدنو په وخت کې مو يوه ستونزه رامېنځ ته شوه.",
        "blockedtitle": "پر کارن بنديز لگېدلی",
        "blockedtext": "'''ستاسې د کارن-نوم يا آی پي پتې مخنيوی شوی.'''\n\nهمدا بنديز د $1 له خوا پر تاسې لږېدلی. او د همدې کړنې سبب ''$2'' دی.\n\n* د بنديز د پېل نېټه: $8\n* د بنديز د پای نېټه: $6\n* بنديزونه دي پر: $7\n\nتاسې کولای شی چې د $1 او يا هم د يو بل [[{{MediaWiki:Grouppage-sysop}}|پازوال]] سره اړيکې ټينگې کړی او د بنديز ستونزې مو هوارې کړی.\nتاسې نه شی کولای چې د 'کارن ته برېښلک لېږل' کړنې نه گټه پورته کړی تر څو چې تاسې د خپل گڼون په [[Special:Preferences|غوره توبونو]] کې يوه کره برېښليک پته نه وي ځانگړې کړې او تر دې بريده چې پر تاسې د هغې د کارولو بنديز نه وي لگېدلی.\nستاسې د دم مهال آی پي پته $3 ده، او ستاسې د بنديز پېژند #$5 دی. مهرباني وکړۍ د خپلې يادونې پر مهال د دغو دوو څخه د يوه او يا هم د دواړو ورکول مه هېروۍ.",
        "prefs-edits": "د سمونو شمېر:",
        "prefsnologintext2": "د غوره توبونو بدلولو لپاره مو غونډال ته ننوځئ.",
        "prefs-skin": "پوښۍ",
-       "skin-preview": "مخکتنه",
+       "skin-preview": "مخليدنه",
        "datedefault": "هېڅ نه ټاکل",
        "prefs-labs": "د آزمېښتون ځانگړنې",
        "prefs-user-pages": "کارن مخونه",
        "right-importupload": "د يوې پورته شوې دوتنې څخه مخونه راغوښتل",
        "right-patrol": "د نورو سمونونه څارل شوي په نښه کول",
        "right-unwatchedpages": "د ناکتلو مخونو يو لړليک کتل",
+       "right-mergehistory": "د مخونو پېښليک سره اخږل",
        "right-userrights": "د کارن ټولې رښتې سمول",
        "right-userrights-interwiki": "په نورو ويکي گانو د نورو کارنانو  کارن-رښتې سمول",
+       "right-siteadmin": "توکبنسټ کولپول او پرانيستل",
        "right-sendemail": "نورو کارنانو ته برېښليک لېږل",
        "newuserlogpage": "د کارن-نوم د جوړېدو يادښت",
        "newuserlogpagetext": "دا د کارن-نوم د جوړېدو يادښت دی",
        "enhancedrc-history": "پېښليک",
        "recentchanges": "وروستي بدلونونه",
        "recentchanges-legend": "د ورستي بدلونو خوښنې",
-       "recentchanges-summary": "په دې مخ د ويکي ترټولو تازه وروستي بدلونونه وڅارۍ.",
+       "recentchanges-summary": "په دې مخ د ويکي تر ټولو تازه بدلونونه څارلی شی.",
        "recentchanges-noresult": "د ټاکلې مودې بدلونونه کې يو يې هم د دغو معيارونو سره همغاړي نه دي.",
        "recentchanges-feed-description": "همدلته د ويکي ترټولو تازه وروستي بدلونونه وڅارۍ او وگورۍ چې څه پېښ شوي.",
        "recentchanges-label-newpage": "دغه سمون يو نوی مخ جوړ کړی",
        "filetype-banned": "په دې ډول دوتنې بنديز دی.",
        "verification-error": "دا دوتنه د دوتنې تاييدېدنې څخه بريالۍ و نه وتله.",
        "illegal-filename": "د دوتنې نوم نه دی پرېښل شوی.",
-       "unknown-error": "Ù\8aÙ\88Ù\87 Ù\86اÚ\85رګنده تېروتنه رامېنځته شوه.",
+       "unknown-error": "Ù\8aÙ\88Ù\87 Ù\86اÚ\85رگنده تېروتنه رامېنځته شوه.",
        "tmp-create-error": "لنډمهاله دوتنه جوړېدای نه شي",
        "fileexists": "د پخوا څخه پدې نوم يوه دوتنه شته، که {{GENDER:|تاسې}} پرې ډاډمن نه ياست چې بدلون پکې راولۍ، نو لطفاً <strong>[[:$1]]</strong> وگورئ.\n[[$1|بټنوک]]",
        "fileexists-extension": "په دې نوم يوه بله دوتنه د پخوا څخه شته: [[$2|بټنوک]]\n* د پورته کېدونکې دوتنې نوم: <strong>[[:$1]]</strong>\n* د پخوانۍ موجودې دوتنې نوم: <strong>[[:$2]]</strong>\nآيا تاسې غواړۍ چې يو داسې بېل نوم ټاکۍ چې د پخوانۍ دوتنې سره توپير ولري؟",
        "delete-edit-reasonlist": "د ړنگولو سببونه سمول",
        "rollbacklink": "په شابېول",
        "rollbacklinkcount": "$1 {{PLURAL:$1|سمون|سمونونه}} پرشابېول",
+       "editcomment": "د سمون لنډيز دا و: \"''$1''\".",
        "changecontentmodel-title-label": "مخ سرليک",
        "changecontentmodel-reason-label": "سبب:",
        "protectlogpage": "د ژغورنې يادښت",
        "ipusubmit": "دا بنديز ليرې کول",
        "unblocked": "له [[User:$1|$1]] بنديز ليري شو",
        "unblocked-range": "له $1 بنديز ليرې شو",
+       "unblocked-ip": "له [[Special:Contributions/$1|$1]] څخه بنديز ليرې شو.",
        "blocklist": "بنديز لگېدلي کارنان",
        "ipblocklist": "بنديز لگېدلي کارنان",
        "ipblocklist-legend": "يو بنديز شوی کارن موندل",
        "exif-lightsource-255": "د رڼا بله سرچينه",
        "exif-flash-fired-0": "فلش و نه ځلېده",
        "exif-focalplaneresolutionunit-2": "انچه",
-       "exif-sensingmethod-1": "Ù\86اÚ\85رګنده",
+       "exif-sensingmethod-1": "Ù\86اÚ\85رگنده",
        "exif-filesource-3": "گڼياليزه ولاړه کامره",
        "exif-customrendered-0": "نورماله بهير",
        "exif-scenecapturetype-0": "معيار",
        "api-error-filetype-missing": "دوتنې نوم يو شاتاړی نه لري.",
        "api-error-illegal-filename": "د دوتنې نوم نه دی پرېښل شوی.",
        "api-error-mustbeloggedin": "د دوتنو د پورته کولو لپاره بايد تاسې غونډال کې ننوتلی اوسۍ.",
-       "api-error-unclassified": "Ù\8aÙ\88Ù\87 Ù\86اÚ\85رګنده تېروتنه رامېنځته شوه.",
-       "api-error-unknown-code": "Ù\86اÚ\85رګنده تېروتنه: \"$1\"",
+       "api-error-unclassified": "Ù\8aÙ\88Ù\87 Ù\86اÚ\85رگنده تېروتنه رامېنځته شوه.",
+       "api-error-unknown-code": "Ù\86اÚ\85رگنده تېروتنه: \"$1\"",
        "api-error-unknown-warning": "ناڅرگنده گواښنه: \"$1\".",
-       "api-error-unknownerror": "Ù\86اÚ\85رګنده تېروتنه: \"$1\".",
+       "api-error-unknownerror": "Ù\86اÚ\85رگنده تېروتنه: \"$1\".",
        "api-error-uploaddisabled": "په دې ويکي باندې پورته کېدنې ناچارنې شوي.",
        "api-error-verification-error": "کېدای شي دا دوتنه خرابه وي او يا هم ناسم شاتاړی ولري.",
        "duration-seconds": "$1 {{PLURAL:$1|ثانيه|ثانيې}}",
        "expand_templates_remove_comments": "تبصرې غورځول",
        "expand_templates_remove_nowiki": "په پايلو کې د <nowiki> نښلنونه ځپل",
        "expand_templates_generate_rawhtml": "خام HTML ښکاره کول",
-       "expand_templates_preview": "مخکتنه",
+       "expand_templates_preview": "مخليدنه",
        "pagelanguage": "د مخ ژبټاکونکی",
        "pagelang-name": "مخ",
        "pagelang-language": "ژبه",
        "special-characters-group-arabicextended": "غځېدلې عربي",
        "special-characters-group-persian": "پارسي",
        "special-characters-group-hebrew": "عبراني",
-       "special-characters-group-bangla": "بÙ\86Ú«الي",
+       "special-characters-group-bangla": "بÙ\86Ú¯الي",
        "special-characters-group-tamil": "تاميلي",
        "special-characters-group-telugu": "تېلوګو",
        "special-characters-group-sinhala": "سېنهالي",
-       "special-characters-group-gujarati": "Ú«جراتي",
-       "special-characters-group-devanagari": "دېوانګري",
+       "special-characters-group-gujarati": "Ú¯Ù\88جراتي",
+       "special-characters-group-devanagari": "دېواناگري",
        "special-characters-group-thai": "تايلنډي",
        "special-characters-group-lao": "لاوي",
        "special-characters-group-khmer": "خمري",
index 053ee0d..ec3c55a 100644 (file)
        "badtitletext": "O título de página solicitado era inválido, vazio, ou um link interlínguas ou interwikis incorreto.\nTalvez contenha um ou mais caracteres que não podem ser usados em títulos.",
        "title-invalid-empty": "O título da página solicitada está vazio ou contém somente o nome do espaço de nomes.",
        "title-invalid-utf8": "O título da página solicitada contém uma sequência UTF-8 inválida.",
-       "title-invalid-interwiki": "O título contém um link interwiki",
+       "title-invalid-interwiki": "O título da página solicitado contém um link interwiki que não pode ser usado em títulos.",
        "title-invalid-talk-namespace": "O título da página solicitada refere-se a uma página de discussão que pode não existir.",
        "title-invalid-characters": "O título da página solicitada contém caracteres inválidos: \"$1\".",
        "title-invalid-relative": "O título tem um caminho relativo.Títulos de página relativos (./, ../) são inválidos, porque muitas vezes estarão inacessíveis quando consultados pelo navegador do usuário.",
        "badsig": "Assinatura inválida; verifique o código HTML utilizado.",
        "badsiglength": "A sua assinatura é muito longa.\nEla deve ter menos de $1 {{PLURAL:$1|caractere|caracteres}}.",
        "yourgender": "Como você prefere ser descrito(a)?",
-       "gender-unknown": "Prefiro não dizer",
+       "gender-unknown": "Ao mencionar você, o software usará palavras do gênero neutro sempre que possível",
        "gender-male": "Ele edita páginas wiki",
        "gender-female": "Ela edita páginas wiki",
        "prefs-help-gender": "A configuração desta preferência é opcional.\nO software utiliza seu valor para tratá-lo(a) e mencioná-lo(a) a outros usando o gênero gramatical adequado.\nEsta informação será pública.",
        "userrights-lookup-user": "Administrar grupos de usuários",
        "userrights-user-editname": "Forneça um nome de usuário:",
        "editusergroup": "Editar grupos de usuários",
-       "editinguser": "Modificando privilégios d{{GENDER:$1|o usuário|a usuária|o(a) usuário(a)}} '''[[User:$1|$1]]''' $2",
+       "editinguser": "Modificando privilégios d{{GENDER:$1|o usuário|a usuária|o(a) usuário(a)}} <strong>[[User:$1|$1]]</Strong> $2",
        "userrights-editusergroup": "Editar grupos do usuário",
        "saveusergroups": "Salvar grupos do usuário",
        "userrights-groupsmember": "Membro de:",
        "linksearch-pat": "Procurar padrão:",
        "linksearch-ns": "Espaço nominal:",
        "linksearch-ok": "Pesquisar",
-       "linksearch-text": "É possível usar caracteres coringa, como \"*.wikipedia.org\".\nNecessário no mínimo um domínio de nível superior, por exemplo \"*.org\".<br />\n{{PLURAL:$2|Protocolo suportado|Protocolos suportados}}: <code>$1</code> (caso nenhum seja especificado, o protocolo http:// será selecionado automaticamente).",
+       "linksearch-text": "É possível usar caracteres coringa, como \"*.wikipedia.org\".\nNecessário no mínimo um domínio de nível superior, por exemplo \"*.org\".<br />\n{{PLURAL:$2|Protocolo suportado|Protocolos suportados}}: $1 (caso nenhum seja especificado, o protocolo http:// será selecionado automaticamente).",
        "linksearch-line": "$2 possui links para $1",
        "linksearch-error": "\"Caracteres mágicos\" (''wildcards'') só podem ser usados no início do endereço.",
        "listusersfrom": "Mostrar usuários começando em:",
        "rollback-success": "Foram revertidas as edições de $1, com o conteúdo passando a estar como na última edição de $2.",
        "sessionfailure-title": "Erro de sessão",
        "sessionfailure": "Foram detetados problemas com a sua sessão;\nEsta ação foi cancelada como medida de proteção contra a intercepção de sessões.\nExperimente usar o botão \"Voltar\" e atualizar a página de onde veio e tente novamente.",
+       "changecontentmodel-title-label": "Título da página",
+       "changecontentmodel-reason-label": "Motivo:",
+       "logentry-contentmodel-change-revertlink": "reverter",
        "protectlogpage": "Registro de proteção",
        "protectlogtext": "Encontra-se abaixo o registro de proteção e desproteção de páginas.\nConsulte a [[Special:ProtectedPages|lista de páginas protegidas]] para ver as páginas que se encontram protegidas neste momento.",
        "protectedarticle": "protegeu \"[[$1]]\"",
        "tooltip-pt-logout": "Sair",
        "tooltip-pt-createaccount": "É recomendado que você crie uma conta e inicie uma seção; todavia, isto não é obrigatório",
        "tooltip-ca-talk": "Discussão sobre o conteúdo da página",
-       "tooltip-ca-edit": "Você pode editar esta página. Use o botão \"Mostrar previsão\" antes de salvar.",
+       "tooltip-ca-edit": "Editar esta página",
        "tooltip-ca-addsection": "Iniciar uma nova seção",
        "tooltip-ca-viewsource": "Esta página está protegida.\nVocê pode, no entanto, visualiar seu código-fonte.",
        "tooltip-ca-history": "Edições anteriores desta página.",
        "version-libraries": "Bibliotecas instaladas",
        "version-libraries-library": "Biblioteca",
        "version-libraries-version": "Versão",
+       "version-libraries-license": "Licença",
+       "version-libraries-description": "Descrição",
+       "version-libraries-authors": "Autores",
        "redirect": "Redirecionar por arquivo, usuário ou ID de revisão",
        "redirect-legend": "Redirecionar para um arquivo ou página",
        "redirect-summary": "Esta página especial redireciona a um arquivo (dado o nome do arquivo), a uma página (dado um ID de revisão ou ID da página) ou a uma página de usuário (dado o ID do usuário). Uso: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
        "log-name-pagelang": "Mudar idioma do log",
        "log-description-pagelang": "Este é um registro de alterações aos idiomas das páginas.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|alterou}} o idioma da página $3 de $4 para $5.",
-       "default-skin-not-found": "Ops! A aparência padrão para sua wiki, definida em <code dir=\"ltr\">$wgDefaultSkin</code> como <code>$1</code>, não está disponível.\n\nSua instalação parece incluir a(s) seguinte(s) {{PLURAL:$4|aparência|aparências}}. Veja [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Configuração de aparência] para informações sobre como  {{PLURAL:$4|habilitá-la|habilitá-las e escolha a padrão}}.\n\n$2\n\n; Se você já instalou o MediaWiki:\n: Você provavelmente instalou do git, ou diretamente do código fonte usando usando algum outro método. Isto é esperado. Tente instalar algumas aparências do [https://www.mediawiki.org/wiki/Category:All_skins diretório de aparências do mediawiki.org]:\n:* Baixando o [https://www.mediawiki.org/wiki/Download instalador tarball], que vem com várias aparências e extensões. Você pode copiar e colar o diretório <code>skins/</code> dele.\n:* Baixando tarballs individuais de aparência de [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonando um dos repositórios <code>mediawiki/skins/*</code> via git no diretório <code dir=\"ltr\">skins/</code> de sua instalação MediaWiki.\n: Fazer isso não deve interferir no seu repositório git se você é um desenvolvedor MediaWiki.\n\n; Se você já atualizou o MediaWiki:\n: O MediaWiki 1.24 e os mais recentes não permitem mais aparências instaladas automaticamente (veja [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Você pode colar {{PLURAL:$5|a seguinte linha|as seguintes linhas}} em <code>LocalSettings.php</code> para habilitar {{PLURAL:$5|a|todas as}} {{PLURAL:$5|aparência instalada atualmente|aparências instaladas atualmente}} :\n\n<pre dir=\"ltr\">$3</pre>\n\n; Se você já modificou <code>LocalSettings.php</code>:\n: Verifique cuidadosamente se não há erros de digitação nos nomes das aparências.",
+       "default-skin-not-found": "Ops! A aparência padrão para sua wiki, definida em <code dir=\"ltr\">$wgDefaultSkin</code> como <code>$1</code>, não está disponível.\n\nSua instalação parece incluir a(s) seguinte(s) {{PLURAL:$4|aparência|aparências}}. Veja [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Configuração de aparência] para informações sobre como  {{PLURAL:$4|habilitá-la|habilitá-las e escolha a padrão}}.\n\n$2\n\n; Se você já instalou o MediaWiki:\n: Você provavelmente instalou do git, ou diretamente do código fonte usando usando algum outro método. Isto é esperado. Tente instalar algumas aparências do [https://www.mediawiki.org/wiki/Category:All_skins diretório de aparências do mediawiki.org]:\n:* Baixando o [https://www.mediawiki.org/wiki/Download instalador tarball], que vem com várias aparências e extensões. Você pode copiar e colar o diretório <code>skins/</code> dele.\n:* Baixando tarballs individuais de aparência de [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git/pt-br#Usando_o_Git_para_baixar_extensões_do_MediaWiki Usando o Git para baixar aparências].\n: Fazer isso não deve interferir no seu repositório git se você é um desenvolvedor MediaWiki.\n\n; Se você já atualizou o MediaWiki:\n: O MediaWiki 1.24 e os mais recentes não permitem mais aparências instaladas automaticamente (veja [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Você pode colar {{PLURAL:$5|a seguinte linha|as seguintes linhas}} em <code>LocalSettings.php</code> para habilitar {{PLURAL:$5|a|todas as}} {{PLURAL:$5|aparência instalada|aparências instaladas}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Se você já modificou <code>LocalSettings.php</code>:\n: Verifique cuidadosamente se não há erros de digitação nos nomes das aparências.",
        "default-skin-not-found-no-skins": "Ops! A aparência padrão para sua wiki, definida em <code>$wgDefaultSkin</code> como <code>$1</code>, não está disponível.\n\nVocê não tem aparências instaladas.\n\n; Se você já instalou ou atualizou o MediaWiki:\n: Você provavelmente instalou do git, ou diretamente do código fonte usando usando algum outro método. Isto é esperado. O MediaWiki 1.24 e mais recentes não incluem todas as aparências no repositório principal.Tente instalar algumas aparências do [https://www.mediawiki.org/wiki/Category:All_skins diretório de aparências do mediawiki.org]:\n:* Baixando o [https://www.mediawiki.org/wiki/Download instalador tarball], que vem com várias aparências e extensões. Você pode copiar e colar o diretório <code>skins/</code> dele.\n:* Baixando tarballs individuais de aparência de [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonando um dos repositórios <code>mediawiki/skins/*</code> via git no diretório <code dir=\"ltr\">skins/</code> de sua instalação MediaWiki.\n: Fazer isso não deve interferir no seu repositório git se você é um desenvolvedor MediaWiki.Veja [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] para informações sobre como habilitar aparências e escolhar a padrão.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (habilitado)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desabilitado''')",
index e1c80b8..6681d50 100644 (file)
        "protectedinterface": "Esta página fornece o texto da interface ao software, e está protegida para prevenir abusos.",
        "editinginterface": "<strong>Aviso:</strong> Está a editar uma página usada para fornecer texto de interface ao software. Alterações a esta página afetarão a aparência da interface de utilizador para os outros utilizadores.",
        "translateinterface": "Para traduções, considere utilizar a [//translatewiki.net/wiki/Main_Page?setlang=pt translatewiki.net], um projeto destinado à tradução do MediaWiki.",
-       "cascadeprotected": "Esta página foi protegida contra edições por estar incluída {{PLURAL:$1|na página listada|nas páginas listadas}} a seguir, ({{PLURAL:$1|página essa que está protegida|páginas essas que estão protegidas}} com a opção de proteção \"em cascata\" ativada):\n$2",
+       "cascadeprotected": "Esta página foi protegida contra edições por estar transcluída {{PLURAL:$1|na página listada|nas páginas listadas}} a seguir, ({{PLURAL:$1|página essa que está protegida|páginas essas que estão protegidas}} com a opção de proteção \"em cascata\" ativada):\n$2",
        "namespaceprotected": "Não tem permissão para editar páginas no domínio '''$1'''.",
        "customcssprotected": "Não tem permissão para editar esta página de CSS porque esta contém as configurações pessoais de outro utilizador.",
        "customjsprotected": "Não tem permissão para editar esta página de JavaScript porque esta contém as configurações pessoais de outro utilizador.",
        "readonlywarning": "'''Aviso: A base de dados foi bloqueada para manutenção, pelo que não poderá gravar a sua edição neste momento.'''\nPode, no entanto, copiar e colar o seu texto num ficheiro de texto e guardá-lo para mais tarde.\n\nO administrador que bloqueou a base de dados forneceu a seguinte explicação: $1",
        "protectedpagewarning": "'''Aviso: Esta página foi protegida para só poder ser editada por administradores.'''\nO último registo é apresentado abaixo para referência:",
        "semiprotectedpagewarning": "'''Nota:''' Esta página foi protegida de modo a que apenas utilizadores registados a possam editar.\nA última entrada no histórico é fornecida abaixo como referência.",
-       "cascadeprotectedwarning": "'''Aviso:''' Esta página está protegida de forma que apenas os administradores possam editá-la, porque se encontra incluída {{PLURAL:$1|na seguinte página protegida|nas seguintes páginas protegidas}} em cascata:",
+       "cascadeprotectedwarning": "<strong>Aviso:</strong> Esta página está protegida de forma que apenas os administradores possam editá-la, porque se encontra transcluída {{PLURAL:$1|na seguinte página protegida|nas seguintes páginas protegidas}} em cascata:",
        "titleprotectedwarning": "'''Aviso: Esta página foi protegida de forma a que [[Special:ListGroupRights|privilégios específicos]] sejam necessários para criá-la.'''\nPara referência, é apresentada abaixo a última entrada do registo:",
        "templatesused": "{{PLURAL:$1|Predefinição utilizada|Predefinições utilizadas}} nesta página:",
        "templatesusedpreview": "{{PLURAL:$1|Predefinição utilizada|Predefinições utilizadas}} nesta antevisão:",
        "linksearch-pat": "Padrão de pesquisa:",
        "linksearch-ns": "Domínio:",
        "linksearch-ok": "Pesquisar",
-       "linksearch-text": "É possível usar caracteres de substituição ''(wildcards)'', tais como \"*.wikipedia.org\".\nÉ necessário, pelo menos, um domínio de topo, por exemplo \"*.org\".<br />\n{{PLURAL:$2|Protocolo suportado|Protocolos suportados}}: <code>$1</code> (será utilizado http:// se não for especificado um protocolo).",
+       "linksearch-text": "É possível usar caracteres de substituição ''(wildcards)'', tais como \"*.wikipedia.org\".\nÉ necessário, pelo menos, um domínio de topo, por exemplo \"*.org\".<br />\n{{PLURAL:$2|Protocolo suportado|Protocolos suportados}}: $1 (será utilizado http:// se não for especificado um protocolo).",
        "linksearch-line": "Ligação para $1 na página $2",
        "linksearch-error": "Caracteres de substituição ''(wildcards)'' só podem ser usados no início do endereço.",
        "listusersfrom": "Mostrar utilizadores começados por:",
        "rollback-success": "Foram revertidas as edições de $1, com o conteúdo passando a estar como na última edição de $2.",
        "sessionfailure-title": "Erro de sessão",
        "sessionfailure": "Foram detectados problemas com a sua sessão;\na operação foi cancelada como medida de proteção contra a interceptação de sessões.\nVolte à página anterior, recarregue-a e tente novamente.",
+       "changecontentmodel-title-label": "Título da página",
        "changecontentmodel-reason-label": "Motivo:",
+       "logentry-contentmodel-change-revertlink": "reverter",
+       "logentry-contentmodel-change-revert": "reverter",
        "protectlogpage": "Registo de proteção",
        "protectlogtext": "Encontra abaixo o registo de proteção e desproteção de páginas.\nConsulte a [[Special:ProtectedPages|lista de páginas protegidas]] para ver as páginas que se encontram protegidas neste momento.",
        "protectedarticle": "protegeu \"[[$1]]\"",
        "protect-locked-blocked": "Não pode alterar níveis de proteção enquanto estiver bloqueado.\nEsta é a configuração presente para a página '''$1''':",
        "protect-locked-dblock": "Não é possível alterar os níveis de proteção, porque a base de dados está bloqueada.\nEsta é a configuração atual para a página '''$1''':",
        "protect-locked-access": "A sua conta não tem permissões para alterar os níveis de proteção de uma página.\nEsta é a configuração atual da página '''$1''':",
-       "protect-cascadeon": "Esta página está atualmente protegida porque está incluída {{PLURAL:$1|na página listada a seguir, a qual|nas páginas listadas a seguir, as quais}} têm a proteção em cascata ativada.\nAlterações feitas ao nível de proteção desta página não afetarão a proteção em cascata.",
+       "protect-cascadeon": "Esta página está atualmente protegida porque está transcluída {{PLURAL:$1|na página listada a seguir, a qual|nas páginas listadas a seguir, as quais}} têm a proteção em cascata ativada.\nAlterações feitas ao nível de proteção desta página não afetarão a proteção em cascata.",
        "protect-default": "Permitir todos os utilizadores",
        "protect-fallback": "Permitir apenas utilizadores com o privilégio de \"$1\"",
        "protect-level-autoconfirmed": "Permitir apenas utilizadores autoconfirmados",
        "htmlform-cloner-create": "Adicionar mais",
        "htmlform-cloner-delete": "Remover",
        "htmlform-cloner-required": "Pelo menos um valor é necessário.",
+       "htmlform-title-badnamespace": "[[:$1]] não se encontra no domínio \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "\"$1\" não é um título que possa ser atribuído a uma página",
+       "htmlform-title-not-exists": "[[:$1]] não existe.",
        "sqlite-has-fts": "$1 com suporte de pesquisa de texto completo",
        "sqlite-no-fts": "$1 sem suporte de pesquisa de texto completo",
        "logentry-delete-delete": "$1 apagou a página $3",
index 915e175..872a89f 100644 (file)
                        "Totosunarto",
                        "Macofe",
                        "FRacco",
-                       "Robin0van0der0vliet"
+                       "Robin0van0der0vliet",
+                       "TTO"
                ]
        },
        "sidebar": "{{notranslate}}",
        "mergehistory-reason": "{{Identical|Reason}}",
        "mergehistory-revisionrow": "{{Optional}}\nA revision row in the merge history page. Parameters:\n* $1 - a radio button to indicate a merge point\n* $2 - a link to the last revision of a page ({{msg-mw|Last}})\n* $3 - a page link\n* $4 - a user link\n* $5 - a revision size\n* $6 - a revision comment",
        "mergelog": "{{doc-logpage}}\n\nThis is the name of a log of merge actions done on [[Special:MergeHistory]]. This special page and this log is not enabled by default.",
-       "pagemerge-logentry": "{{ignored}}This is ''logentry'' message only used on IRC.\n\nParameters:\n* $1 - the page name of the source of the content to be merged\n* $2 - the page into which the content is merged\n* $3 - a timestamp of limit\n\nThe log and its associated special page 'MergeHistory' is not enabled by default.\n\nPlease note that the parameters in a log entry will appear in the log only in the default language of the wiki. View [[Special:Log]] for examples on translatewiki.net with English default language.",
+       "pagemerge-logentry": "{{ignored}}This is ''logentry'' message only used on IRC.\n\nParameters:\n* $1 - the page name of the source of the content to be merged\n* $2 - the page into which the content is merged\n* $3 - a timestamp of limit\n\nThe log and its associated special page 'MergeHistory' is not enabled by default.\n\nPlease note that the parameters in a log entry will appear in the log only in the default language of the wiki. View [[Special:Log]] for examples on translatewiki.net with English default language.",
        "revertmerge": "Used as link text",
        "mergelogpagetext": "Description of the [{{canonicalurl:Special:Log|type=merge&user=&page=&year=&month=-1}} merge log], on the log. The associated [[Special:MergeHistory|Merge]] special page is not enabled by default.",
        "history-title": "Displayed as page title when you click on the \"history\" tab. Parameters:\n* $1 - the normal page title",
        "uploadwarning": "Used as section header in [[Special:Upload]].",
        "uploadwarning-text": "Used in [[Special:Upload]].",
        "savefile": "When uploading a file",
-       "uploadedimage": "{{ignored}}This is ''logentry'' message only used on IRC. $1 is the name of the file uploaded.",
-       "overwroteimage": "{{ignored}}This is ''logentry'' message only used on IRC. $1 is the name of the file uploaded.",
+       "uploadedimage": "{{ignored}}This is ''logentry'' message only used on IRC. $1 is the name of the file uploaded.",
+       "overwroteimage": "{{ignored}}This is ''logentry'' message only used on IRC. $1 is the name of the file uploaded.",
        "uploaddisabled": "Title of the [[Special:Upload]] page when upload is disabled.\n\nSee also:\n* {{msg-mw|Copyuploaddisabled}}",
        "copyuploaddisabled": "See also:\n* {{msg-mw|Uploaddisabled}}",
        "uploaddisabledtext": "Parameters:\n* $1 - (Optional) the name of the target file. See r22243 and [[bugzilla:8818|bug 8818]].",
        "changecontentmodel-success-title": "Title of the success page of the change content model special page",
        "changecontentmodel-success-text": "Message telling user that their change has been successfully done.\n* $1 - Target page title",
        "changecontentmodel-cannot-convert": "Error message shown if the content model cannot be changed to the specified type. $1 is the page title, $2 is the localized content model name.",
-       "changecontentmodel-title-cantexist": "Error message shown if the page the user provided is a special page",
+       "changecontentmodel-title-cantexist": "Error message shown if the page the user provided is a special page.\n\nParameters:\n* $1 - the page title which cannot exist",
        "changecontentmodel-nodirectediting": "Error message shown if the content model does not allow for direct editing. $1 is the localized name of the content model.",
        "log-name-contentmodel": "{{doc-logpage}}\n\nTitle of [[Special:Log/contentmodel]].",
        "log-description-contentmodel": "Text in [[Special:Log/contentmodel]].",
        "blocklogpage": "{{doc-logpage}}\n\nThe page name of [[Special:Log/block]]. Also appears in the drop down menu of [[Special:Log]] pages and in the action links of Special:Contributions/''Username'' pages (e.g. \"For Somebody (talk | block log | logs)\").\n\n{{Identical|Block log}}",
        "blocklog-showlog": "Parameters:\n* $1 - (Optional) the blocked user. Can be used for GENDER\nSee also:\n* {{msg-mw|Blocklog-showsuppresslog}}\n* {{msg-mw|Globalblocking-showlog}}",
        "blocklog-showsuppresslog": "Parameters:\n* $1 - (Optional) the blocked user. Can be used for GENDER",
-       "blocklogentry": "This is ''logentry'' message only used on IRC.\n* $1 - the blocked user or IP (with link to contributions and talk)\n* $2 - the duration of the block (hours, days etc.) or the specified expiry date\n* $3 - contains \"(details) (''reason'')\", or empty string\nSee also:\n* {{msg-mw|Unblocklogentry}}\n* {{msg-mw|Reblock-logentry}}",
-       "reblock-logentry": "This is ''logentry'' message only used on IRC.\n\nParameters:\n* $1 - the user being reblocked\n* $2 - the expiry time of the block\n* $3 - extra parameters like \"account creation blocked\" (they are automatically between brackets)",
+       "blocklogentry": "This is ''logentry'' message only used on IRC.\n* $1 - the blocked user or IP (with link to contributions and talk)\n* $2 - the duration of the block (hours, days etc.) or the specified expiry date\n* $3 - contains \"(details) (''reason'')\", or empty string\nSee also:\n* {{msg-mw|Unblocklogentry}}\n* {{msg-mw|Reblock-logentry}}",
+       "reblock-logentry": "This is ''logentry'' message only used on IRC.\n\nParameters:\n* $1 - the user being reblocked\n* $2 - the expiry time of the block\n* $3 - extra parameters like \"account creation blocked\" (they are automatically between brackets)",
        "blocklogtext": "Appears on top of [[Special:Log/block]].",
-       "unblocklogentry": "This is ''logentry'' message only used on IRC.\n* $1 is the user being unblocked",
+       "unblocklogentry": "This is ''logentry'' message only used on IRC.\n* $1 is the user being unblocked",
        "block-log-flags-anononly": "Used as a block log flag in [[Special:Log/block]] and in [[Special:Block]].\n\nSee also:\n* {{msg-mw|Anononlyblock}}\n{{Related|Block-log-flags}}",
        "block-log-flags-nocreate": "Used as a block log flag in [[Special:Log/block]] and in [[Special:Block]].\n\nSee also:\n* {{msg-mw|Createaccountblock}}\n{{Related|Block-log-flags}}",
        "block-log-flags-noautoblock": "Used as a block log flag in [[Special:Log/block]] and in [[Special:Block]].\n{{Related|Block-log-flags}}\n{{Identical|Autoblock disabled}}",
        "import-rootpage-nosubpage": "Used on [[Special:Import]], when the import namespace does not support subpages. Parameters:\n* $1 is a namespace name.",
        "importlogpage": "{{doc-logpage}}",
        "importlogpagetext": "This text appears at the top of the [{{canonicalurl:Special:Log|type=import}} import log] special page.",
-       "import-logentry-upload": "{{ignored}}This is ''logentry'' message only used on IRC.\n* $1 is the name of the imported file",
+       "import-logentry-upload": "{{ignored}}This is ''logentry'' message only used on IRC.\n* $1 is the name of the imported file",
        "import-logentry-upload-detail": "Used as success message and log entry. Parameters:\n* $1 - number of succeeded revisions\nSee also:\n* {{msg-mw|Import-logentry-interwiki-detail}}",
-       "import-logentry-interwiki": "{{ignored}}This is ''logentry'' message only used on IRC. Parameters:\n* $1 - page title",
+       "import-logentry-interwiki": "{{ignored}}This is ''logentry'' message only used on IRC. Parameters:\n* $1 - page title",
        "import-logentry-interwiki-detail": "Used as success message and log entry. Parameters:\n* $1 - number of succeeded revisions\n* $2 - interwiki name\nSee also:\n* {{msg-mw|Import-logentry-upload-detail}}",
        "javascripttest": "Title of the special page [[Special:JavaScriptTest]].\n\nSee also:\n* {{msg-mw|Javascripttest|title}}\n* {{msg-mw|Javascripttest-pagetext-noframework|summary}}\n* {{msg-mw|Javascripttest-pagetext-unknownframework|error message}}",
        "javascripttest-backlink": "{{optional}}\nUsed as subtitle in [[Special:JavaScriptTest]]. Parameters:\n* $1 - page title",
        "htmlform-cloner-create": "Used as the text for the button that adds a row to a multi-input HTML form element.\n\nSee also:\n* {{msg-mw|htmlform-cloner-delete}}\n* {{msg-mw|htmlform-cloner-required}}",
        "htmlform-cloner-delete": "Used as the text for the button that removes a row from a multi-input HTML form element\n\nSee also:\n* {{msg-mw|htmlform-cloner-create}}\n* {{msg-mw|htmlform-cloner-required}}\n{{Identical|Remove}}",
        "htmlform-cloner-required": "Used as an error message in HTML forms.\n\nSee also:\n* {{msg-mw|htmlform-required}}\n* {{msg-mw|htmlform-cloner-create}}\n* {{msg-mw|htmlform-cloner-delete}}",
+       "htmlform-title-badnamespace": "Error message shown if the page title provided by the user is not in the required namespace. $1 is the page, $2 is the numerical namespace index.",
+       "htmlform-title-not-creatable": "Error message shown if the page title provided by the user is not creatable (a special page). $1 is the page title.",
+       "htmlform-title-not-exists": "Error message shown if the page title provided by the user does not exist. $1 is the page title.",
+       "htmlform-user-not-exists": "Error message shown if a user with the name provided by the user does not exist. $1 is the username.",
+       "htmlform-user-not-valid": "Error message shown if the name provided by the user isn't a valid username. $1 is the username.",
        "sqlite-has-fts": "Shown on [[Special:Version]].\nParameters:\n* $1 - version",
        "sqlite-no-fts": "Shown on [[Special:Version]].\nParameters:\n* $1 - version",
        "logentry-delete-delete": "{{Logentry|[[Special:Log/delete]]}}",
        "patrol-log-line": "Text of notes on entries in the [{{FULLURL:Special:Log|type=patrol}} patrol log].\nParameters:\n* $1 - the link whose text is {{msg-mw|patrol-log-diff}}\n* $2 - the name of the page\n* $3 - appears to be {{msg-mw|Patrol-log-auto}} (at least sometimes)\n\nThe message appears after the name of the patroller.",
        "patrol-log-auto": "Automated edit summary when patrolling.\n\n{{Identical|Automatic}}",
        "patrol-log-diff": "The text of the diff link in {{msg-mw|Patrol-log-line}} (inside <code>$1</code> there).\n\nParameters:\n* $1 - revision ID\n{{Identical|Revision}}",
-       "1movedto2": "{{ignored}}This is ''logentry'' message only used on IRC. Parameters:\n* $1 - the original page name\n* $2 - the destination page name\nSee also:\n* {{msg-mw|1movedto2 redir}}",
-       "1movedto2_redir": "{{ignored}}This is ''logentry'' message only used on IRC. Parameters:\n* $1 - the original page name\n* $2 - the destination page name\nSee also:\n* {{msg-mw|1movedto2}}",
+       "1movedto2": "{{ignored}}This is ''logentry'' message only used on IRC. Parameters:\n* $1 - the original page name\n* $2 - the destination page name\nSee also:\n* {{msg-mw|1movedto2 redir}}",
+       "1movedto2_redir": "{{ignored}}This is ''logentry'' message only used on IRC. Parameters:\n* $1 - the original page name\n* $2 - the destination page name\nSee also:\n* {{msg-mw|1movedto2}}",
        "move-redirect-suppressed": "{{ignored}}Message unused?",
        "newuserlog-create-entry": "Part of the \"Newuserlog\" extension. It is the summary in the [[Special:RecentChanges|recent changes]] and on [[Special:Log/newusers]].",
        "newuserlog-create2-entry": "Part of the \"Newuserlog\" extension.\n\nIt is the summary in the [[Special:RecentChanges|recent changes]] and on [[Special:Log/newusers]] when creating an account for someone else (\"$1\").\n\nPreceded by the name of the user doing this task.\n\nParameters:\n* $1 - username",
index fdb1d76..7ec0ccb 100644 (file)
        "disclaimers": "Chiqakunamanta rikuchiy",
        "disclaimerpage": "Project:Sapsilla saywachasqa paqtachiy",
        "edithelp": "Llamk'ana yanapay",
+       "helppage-top-gethelp": "Yanapa",
        "mainpage": "Qhapaq p'anqa",
        "mainpage-description": "Qhapaq p'anqa",
        "policy-url": "Project:Kawpay",
        "passwordreset": "Yaykuna rimata kutichiy",
        "passwordreset-text-one": "Kay hunt'ana p'anqata hunt'ay, yaykuna rimaykita kutichinaykipaq.",
        "passwordreset-text-many": "{{PLURAL:$1|Kay k'itichakunamanta hukta hunt'achiy, yaykuna rimaykita kutichinaykipaq.}}",
-       "passwordreset-legend": "Yaykuna rimata kutichiy",
        "passwordreset-disabled": "Kay wikipiqa yaykuna rimata manam kutichiyta atinkichu.",
        "passwordreset-emaildisabled": "Kay wikipiqa e-chaski llamk'anakunaman ama nisqam.",
        "passwordreset-username": "Ruraqpa sutin:",
        "changeemail-throttled": "Nisyu kutiñam yaykuykacharqunki.\nAma hina kaspa, $1 suyay manaraq musuqmanta yaykuykachaspayki.",
        "resettokens": "Llawikunata kutichiy",
        "resettokens-no-tokens": "Manam kanchu kutichina llawikuna.",
-       "resettokens-legend": "Llawikunata kutichiy",
        "resettokens-tokens": "Llawikuna:",
        "resettokens-token-label": "$1 (kunan chani: $2)",
        "resettokens-done": "Llawikunaqa kutichimusqañam.",
        "nmembers": "$1 {{PLURAL:$1|qillqa|qillqakuna}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|wankurisqa|wankurisqakuna}}",
        "nrevisions": "$1 {{PLURAL:$1|llamk'apusqa|llamk'apusqakuna}}",
-       "nviews": "$1 {{PLURAL:$1|rikuy|rikuykuna}}",
        "nimagelinks": "$1 {{PLURAL:$1|p'anqapi|p'anqakunapi}} llamk'achisqa",
        "ntransclusions": "$1 {{PLURAL:$1|p'anqapi|p'anqakunapi}} llamk'achisqa",
        "specialpage-empty": "Kay p'anqaqa ch'usaqmi.",
        "pager-older-n": "{{PLURAL:$1|aswan mawk'a 1|aswan mawk'a $1}}",
        "suppress": "Rikurpariy",
        "querypage-disabled": "Kay sapaq p'anqamanqa ama nisqam allinta llamk'anapaq.",
+       "apihelp": "API yanapa",
        "booksources": "Liwrukunapi pukyukuna",
        "booksources-search-legend": "Liwrukunapi pukyukunata maskay",
        "booksources-search": "Maskay",
        "linksearch-pat": "Kay qatinallakama maskay:",
        "linksearch-ns": "Suti k'iti:",
        "linksearch-ok": "Maskay",
-       "linksearch-text": "Ima rantipas sananchawanpas maskayta saqillasunkim, ahinataq \"*.wikipedia.org\".\nHawa kaq duminyullapas kanam, ahinataq \"*.org\".<br />\nQ'imichisqa tantari {{PLURAL:$2|qillqa|qillqakuna}}: <code>$1</code> (mana mayqintapas akllaptiykiqa, http:// nisqam kanqa).",
+       "linksearch-text": "Ima rantipas sananchawanpas maskayta saqillasunkim, ahinataq \"*.wikipedia.org\".\nHawa kaq duminyullapas kanam, ahinataq \"*.org\".<br />\nQ'imichisqa tantari {{PLURAL:$2|qillqa|qillqakuna}}: $1 (mana mayqintapas akllaptiykiqa, http:// nisqam kanqa).",
        "linksearch-line": "$1-man $2-manta t'inkimusqa",
        "linksearch-error": "Ima rantipas sananchaqa (* ?) tiyaypa qallariyninpim kanman chaylla.",
        "listusersfrom": "Kaywan qallariq ruraqkunata rikuchiy:",
        "tooltip-pt-logout": "Llamk'apuy tiyaymanta lluqsiy",
        "tooltip-pt-createaccount": "Rakiquna kamarispayki yaykunaykiqa allinchá kanman, hinaspapas ruranayki manam tiyanchu.",
        "tooltip-ca-talk": "Qillqasqap samiqninmanta rimanakuna p'anqa",
-       "tooltip-ca-edit": "Kay p'anqata llamk'apuytam atinki. Ama hina kaspa, manaraq waqaychaspa ñawpaqta qhawarillay.",
+       "tooltip-ca-edit": "Kay p'anqata llamk'apuy",
        "tooltip-ca-addsection": "Musuq rakita qallariy",
        "tooltip-ca-viewsource": "Kay p'anqaqa amachasqam. Qallariy qillqataqa qhawallaytam atinki, mana hukchaspa.",
        "tooltip-ca-history": "Kay p'anqapaq ñawpaq llamk'apusqakuna llamk'apuqkunapas",
index 2034bab..3ae9792 100644 (file)
        "resetpass-wrong-oldpass": "Fauss pled-clav temporar u actual.\nEventualmain has ti gia midà cun success tes pled-clav u dumandà per in nov pled-clav temporar.",
        "resetpass-temp-password": "Pled-clav temporar:",
        "passwordreset": "Redefinir il pled-clav",
-       "passwordreset-legend": "Redefinir il pled-clav",
        "passwordreset-disabled": "La pussaivladad da redefinir il pled-clav è vegnida deactivada sin questa wiki.",
        "passwordreset-username": "Num d'utilisader:",
        "passwordreset-domain": "Domain:",
        "nlinks": "$1 {{PLURAL:$1|colliaziun|colliaziuns}}",
        "nmembers": "$1 {{PLURAL:$1|commember|commembers}}",
        "nrevisions": "{{PLURAL:$1|Ina versiun|$1 versiuns}}",
-       "nviews": "Contemplà $1 {{PLURAL:$1|giada|giadas}}",
        "nimagelinks": "Utilisà sin $1 {{PLURAL:$1|pagina|paginas}}",
        "ntransclusions": "utilisà sin $1 {{PLURAL:$1|pagina|paginas}}",
        "specialpage-empty": "Questa pagina cuntegna actualmain naginas endataziuns.",
        "linksearch-pat": "Muster da tschertgar:",
        "linksearch-ns": "Tip da pagina:",
        "linksearch-ok": "Tschertgar",
-       "linksearch-text": "Tegnaplazzas sco \"*.wikipedia.org\" pon vegnir utilisads.\nDovra almain ina top-level domain, per exempel \"*.org\".<br />\n{{PLURAL:$2|Protocol sustegnì|Protocols sustegnids}}: <code>$1</code> (standard è http:// sche nagin protocol è specifitgà).",
+       "linksearch-text": "Tegnaplazzas sco \"*.wikipedia.org\" pon vegnir utilisads.\nDovra almain ina top-level domain, per exempel \"*.org\".<br />\n{{PLURAL:$2|Protocol sustegnì|Protocols sustegnids}}: $1 (standard è http:// sche nagin protocol è specifitgà).",
        "linksearch-line": "$1 è collià davent da la pagina $2",
        "linksearch-error": "Wildcards pon esser be a l'entschatta dal num da host.",
        "listusersfrom": "Mussar utilisaders davent da:",
index 555e802..c5e723b 100644 (file)
        "linksearch-pat": "De căutat:",
        "linksearch-ns": "Spațiu de nume:",
        "linksearch-ok": "Caută",
-       "linksearch-text": "Pot fi folosite metacaractere precum „*.wikipedia.org”.\nNecesită cel puțin un domeniu de nivel superior, cum ar fi „*.org”.<br />\n{{PLURAL:$2|Protocol suportat|Protocoale suportate}}: <code>$1</code> (se trece implicit la http:// dacă nu este specificat niciun protocol).",
+       "linksearch-text": "Pot fi folosite metacaractere precum „*.wikipedia.org”.\nNecesită cel puțin un domeniu de nivel superior, cum ar fi „*.org”.<br />\n{{PLURAL:$2|Protocol suportat|Protocoale suportate}}: $1 (se trece implicit la http:// dacă nu este specificat niciun protocol).",
        "linksearch-line": "$1 este legat de $2",
        "linksearch-error": "Metacaracterele pot să apară doar la începutul hostname-ului.",
        "listusersfrom": "Afișează utilizatori începând cu:",
index 54c4084..df1ee67 100644 (file)
        "linksearch-pat": "Cirche le cambiune:",
        "linksearch-ns": "Neimspeise:",
        "linksearch-ok": "Cirche",
-       "linksearch-text": "Le wildcard cumme a \"*.wikipedia.org\" ponne essere ausate.<br />\nOnne abbesogne almene de 'nu dominie de levèlle ierte, pe esembie \"*.org\". <br />\n{{PLURAL:$2|Protocolle}} supportate: <code>$1</code> ('u valore de base jè http:// ce 'u protocolle non g'è specificate).",
+       "linksearch-text": "Le wildcard cumme a \"*.wikipedia.org\" ponne essere ausate.<br />\nOnne abbesogne almene de 'nu dominie de levèlle ierte, pe esembie \"*.org\". <br />\n{{PLURAL:$2|Protocolle}} supportate: $1 ('u valore de base jè http:// ce 'u protocolle non g'è specificate).",
        "linksearch-line": "$1 jè pundete da $2",
        "linksearch-error": "Le wildcard ponne essere ausate sulamende a l'inzie de l'hostname.",
        "listusersfrom": "Fà vedè l'utinde partenne da:",
index 5183fdc..256c3ba 100644 (file)
        "protectedinterface": "Эта страница содержит интерфейсное сообщение программного обеспечения. Во избежание вандализма её изменение запрещено.\nЧтобы добавить или изменить перевод этого сообщения во всех вики, пожалуйста, используйте сайт локализации MediaWiki [//translatewiki.net/ translatewiki.net]",
        "editinginterface": "<strong>Внимание:</strong> Вы редактируете страницу, содержащую текст интерфейса программного обеспечения.\nЕё изменение повлияет на внешний вид интерфейса для других пользователей этой вики.",
        "translateinterface": "Чтобы добавить или изменить перевод этого сообщения, пожалуйста, используйте сайт локализации MediaWiki [//translatewiki.net/ translatewiki.net].",
-       "cascadeprotected": "Страница защищена от изменений, поскольку она включена в {{PLURAL:$1|1=следующую страницу, для которой|следующие страницы, для которых}} включена каскадная защита:\n$2",
+       "cascadeprotected": "Ð\94аннаÑ\8f Ñ\81траница защищена от изменений, поскольку она включена в {{PLURAL:$1|1=следующую страницу, для которой|следующие страницы, для которых}} включена каскадная защита:\n$2",
        "namespaceprotected": "У вас нет разрешения редактировать страницы в пространстве имён «$1».",
        "customcssprotected": "У вас нет разрешения редактировать эту CSS-страницу, так как она содержит личные настройки другого участника.",
        "customjsprotected": "У вас нет разрешения редактировать эту JavaScript-страницу, так как она содержит личные настройки другого участника.",
        "readonlywarning": "'''Предупреждение. База данных заблокирована в связи с процедурами обслуживания, поэтому вы не можете записать ваши изменения прямо сейчас.'''\nВозможно, вам следует скопировать этот текст в текстовый файл, чтобы сохранить его на будущее.\n\nАдминистратор, заблокировавший базу данных, оставил следующее объяснение: $1",
        "protectedpagewarning": "'''Предупреждение. Эта страница защищена от изменений, её могут редактировать только участники с полномочиями администраторов.'''\nНиже для справки приведена последняя запись журнала:",
        "semiprotectedpagewarning": "'''Замечание.''' Эта страница была защищена; редактировать её могут только зарегистрированные участники.\nНиже для справки приведена последняя запись журнала:",
-       "cascadeprotectedwarning": "'''Предупреждение:''' Данную страницу могут редактировать только участники с административными правами, поскольку она включена {{PLURAL:$1|1=в следующую страницу, для которой|в следующие страницы, для которых}} включена каскадная защита:",
+       "cascadeprotectedwarning": "<strong>Предупреждение:</strong> Данную страницу могут редактировать только участники с административными правами, поскольку она включена {{PLURAL:$1|1=в следующую страницу, для которой|в следующие страницы, для которых}} включена каскадная защита:",
        "titleprotectedwarning": "'''Предупреждение.  Это название защищено. Создать эту страницу могут только участники с [[Special:ListGroupRights|соответствующими правами]].'''\nНиже для справки приведена последняя запись журнала:",
        "templatesused": "{{PLURAL:$1|1=Шаблон, используемый|Шаблоны, используемые}} на этой странице:",
        "templatesusedpreview": "{{PLURAL:$1|1=Шаблон, используемый|Шаблоны, используемые}} в режиме предпросмотра:",
        "linksearch-pat": "Шаблон для поиска:",
        "linksearch-ns": "Пространство имён:",
        "linksearch-ok": "Найти",
-       "linksearch-text": "Можно использовать подстановочные символы, например, <code>*.wikipedia.org</code>.\nНеобходимо указать по крайней мере домен верхнего уровня, например <code>*.org</code><br />\n{{PLURAL:$2|1=Поддерживаемый протокол|Поддерживаемые протоколы}}: <code>$1</code> (если протокол явно не задан, по умолчанию подставляется http://).",
+       "linksearch-text": "Можно использовать подстановочные символы, например, <code>*.wikipedia.org</code>.\nНеобходимо указать по крайней мере домен верхнего уровня, например <code>*.org</code><br />\n{{PLURAL:$2|1=Поддерживаемый протокол|Поддерживаемые протоколы}}: $1 (если протокол явно не задан, по умолчанию подставляется http://).",
        "linksearch-line": "Ссылка на $1 из $2",
        "linksearch-error": "Подстановочные символы могут использоваться только в начале адресов.",
        "listusersfrom": "Показать участников, начиная с:",
        "protect-locked-blocked": "Вы не можете изменять уровень защиты страницы, пока ваша учётная запись заблокирована.\nТекущие установки для страницы '''$1''':",
        "protect-locked-dblock": "Уровень защиты не может быть изменён, так как основная база данных временно заблокирована.\nТекущие установки для страницы '''$1''':",
        "protect-locked-access": "У вашей учётной записи недостаточно прав для изменения уровня защиты страницы. Текущие установки для страницы '''$1''':",
-       "protect-cascadeon": "ЭÑ\82а страница сейчас защищена в связи с тем, что она включена в {{PLURAL:$1|1=указанную ниже страницу, для которой|нижеследующие страницы, для которых}} установлена каскадная защита. Изменения уровня защиты этой страницы не повлияет на каскадную защиту.",
+       "protect-cascadeon": "Ð\94аннаÑ\8f страница сейчас защищена в связи с тем, что она включена в {{PLURAL:$1|1=указанную ниже страницу, для которой|нижеследующие страницы, для которых}} установлена каскадная защита. Изменения уровня защиты этой страницы не повлияет на каскадную защиту.",
        "protect-default": "Без защиты",
        "protect-fallback": "Разрешено только участникам с правами «$1»",
        "protect-level-autoconfirmed": "Разрешено только автоподтверждённым участникам",
        "htmlform-cloner-create": "Добавить ещё",
        "htmlform-cloner-delete": "Удалить",
        "htmlform-cloner-required": "Требуется по крайней мере одно значение.",
+       "htmlform-title-badnamespace": "[[:$1]] находится не в пространстве имён «{{ns:$2}}».",
+       "htmlform-title-not-creatable": "«$1» не является создаваемым заголовком страницы",
+       "htmlform-title-not-exists": "[[:$1]] не существует.",
        "sqlite-has-fts": "$1 с поддержкой полнотекстового поиска",
        "sqlite-no-fts": "$1 без поддержки полнотекстового поиска",
        "logentry-delete-delete": "$1 {{GENDER:$2|удалил|удалила}} страницу $3",
index 984516f..98ffb27 100644 (file)
        "passwordreset": "Ресет гесла",
        "passwordreset-text-one": "Выпиште тот формуларь, жебы сьте могли здобыти нове гесло",
        "passwordreset-text-many": "{{PLURAL:$1|На здобытя нового гесла доповньте єдно з даных.}}",
-       "passwordreset-legend": "Знову наставити гесло",
        "passwordreset-disabled": "Зновунаставлїня гесла є на тій вікі заказане",
        "passwordreset-emaildisabled": "Функції електронічной пошты были выпнуы на тій вікі.",
        "passwordreset-username": "Мено хоснователя:",
        "resettokens": "Реініціалізація клічів",
        "resettokens-text": "На тій сторінцї можете реініціалізовати клічі, якы уможнюють приступ к даякым пріватным даным звязаным з вашым контом.\n\n{{GENDER:|Мав|Мала|Мали}} бы сьте то учінити тогды, колы сьте помылково дакому {{GENDER:|прозрадив|прозрадила|прозрадили}}, або ваше конто было зрушене.",
        "resettokens-no-tokens": "Не є ниякых клічів на реініціалізацію.",
-       "resettokens-legend": "Реініціалізація клічів",
        "resettokens-tokens": "Клічі:",
        "resettokens-token-label": "$1 (актуалне значіня: $2)",
        "resettokens-watchlist-token": "Кліч до вебового канала (Atom/RSS) [[Special:Watchlist|змін слїдованых сторінок]]",
        "nlinks": "$1 {{PLURAL:$1|одказ|одказы|одказів}}",
        "nmembers": "$1 {{PLURAL:$1|обєкт|обєкты|обєктів}}",
        "nrevisions": "$1 {{PLURAL:$1|ревізія|ревізії|ревізій}}",
-       "nviews": "$1 {{PLURAL:$1|навщіва|навщівы|навщів}}",
        "nimagelinks": "Хоснованый ня $1 {{PLURAL:$1|сторінка|сторінкы|сторінках}}",
        "ntransclusions": "хоснованый ня $1 {{PLURAL:$1|сторінка|сторінкы|сторінках}}",
        "specialpage-empty": "Той пожадавцї не одповідають жадны записы.",
        "linksearch-pat": "Шаблона про ґлядяня:",
        "linksearch-ns": "Простор назв:",
        "linksearch-ok": "Глядати",
-       "linksearch-text": "Може хосновати заступны сімболы, наприклад „*.wikipedia.org“.<br />\nПовиннов є передовшыткым домена найвысшой уровни, напр. „*.org“.<br />\n{{PLURAL:$2|Підпорованый протокол|Підпорованы протоколы}}: <code>$1</code> (кідь не є шпеціфікованый та http://).",
+       "linksearch-text": "Може хосновати заступны сімболы, наприклад „*.wikipedia.org“.<br />\nПовиннов є передовшыткым домена найвысшой уровни, напр. „*.org“.<br />\n{{PLURAL:$2|Підпорованый протокол|Підпорованы протоколы}}: $1 (кідь не є шпеціфікованый та http://).",
        "linksearch-line": "$2 одказує на $1",
        "linksearch-error": "Заступны сімболы може хосновати лем на початку доменового мена.",
        "listusersfrom": "Вказати хоснователїв, што ся зачінають на:",
index fa51788..113e060 100644 (file)
        "passwordreset": "कूटशब्दः परिवर्त्यताम्",
        "passwordreset-text-one": "वि-पत्रमाध्यमेन अल्पकालीनकूटशब्दं प्राप्तुम् अधस्तनं प्रपत्रं पूरयतु ।",
        "passwordreset-text-many": "{{PLURAL:$1|वि-पत्रमाध्यमेन अल्पकालीनकूटशब्दं प्राप्तुम् अधस्तनां कामपि एकां पेटिकां पूरयतु ।}}",
-       "passwordreset-legend": "कूटशब्दः परिवर्त्यताम्",
        "passwordreset-disabled": "अस्मिन् विकि-जालस्थाने कूटशब्दं परिर्तितुं निषेधः अस्ति ।",
        "passwordreset-emaildisabled": "अस्मिन् विकि-जालस्थाने वि-पत्रसम्बद्धाः सेवाः असमर्थिताः सन्ति ।",
        "passwordreset-username": "योजकनाम:",
        "resettokens": "चिह्नानि (tokens) परिवर्त्यताम्",
        "resettokens-text": "भवतः/भवत्याः सदस्यतया सह सल्लग्नानि चिह्नानि () उपयोक्तुं शक्यन्ते । येन अनया सदस्यतया सह सल्लग्नाः काश्चन गुप्तसूचनाः ज्ञातुं शक्यन्ते ।",
        "resettokens-no-tokens": "परिवर्तनार्थं न किमपि चिह्नं तत्र विद्यते ।",
-       "resettokens-legend": "चिह्नानि (tokens) परिवर्त्यताम्",
        "resettokens-tokens": "चिह्नानि :",
        "resettokens-token-label": "$1 (वर्तमानमूल्यम् : $2)",
        "resettokens-watchlist-token": "[[Special:Watchlist|भवतः/भवत्याः ध्यानसूच्याः परिवर्तनस्य]] जालपूर्तेः (Atom/RSS) चिह्नं",
        "linksearch-pat": "अन्वेषणस्य क्रमः ।",
        "linksearch-ns": "नामस्थानम् :",
        "linksearch-ok": "अन्वेषणम्",
-       "linksearch-text": "\"*.wikipedia.org\" सदृशानि वन्यपत्राणि योजयितुं शक्यते । \nन्यूनातिन्यूनं \".org\" सदृशः अत्युन्नतस्तरस्य डोमेन आवश्यकम् अस्ति <br />\nअनुमोदितक्रमागतिः {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (http:// एतेषु कतममपि अन्वेषणे न योजयतु )",
+       "linksearch-text": "\"*.wikipedia.org\" सदृशानि वन्यपत्राणि योजयितुं शक्यते । \nन्यूनातिन्यूनं \".org\" सदृशः अत्युन्नतस्तरस्य डोमेन आवश्यकम् अस्ति <br />\nअनुमोदितक्रमागतिः {{PLURAL:$2|protocol|protocols}}: $1 (http:// एतेषु कतममपि अन्वेषणे न योजयतु )",
        "linksearch-line": " $1 इति $2 इत्यस्मात् परिसन्धितमस्ति",
        "linksearch-error": "वन्यपत्राणि आतिथेयस्य नाम्ना समं केवलं प्रभान्ति ।",
        "listusersfrom": "एतस्मात् आरभमाणान् योजकान् दर्शयतु ।",
        "special-characters-group-khmer": "खमेर",
        "special-characters-title-endash": "en dash",
        "special-characters-title-emdash": "em dash",
-       "special-characters-title-minus": "minus sign"
+       "special-characters-title-minus": "minus sign",
+       "mw-widgets-titleinput-description-new-page": "पृष्ठं न विद्यते"
 }
index 1148f68..5bb3512 100644 (file)
        "passwordreset": "Киирии тылы саҥаттан",
        "passwordreset-text-one": "Урукку киирии тылы уларытарга бу форманы толор.",
        "passwordreset-text-many": "{{PLURAL:$1|Быстах киирии тылы электрон почтаҕар ыыттарарга түннүктэртэн биирдэстэрин толор.}}",
-       "passwordreset-legend": "Киирии тылы саҥаттан",
        "passwordreset-disabled": "Бу биикигэ киирии тылы саҥардыы бобуллубут.",
        "passwordreset-emaildisabled": "Бу биикигэ эл. почтаны туттуу араарыллыбыт",
        "passwordreset-username": "Кыттааччы:",
        "resettokens": "Токеннары бырах",
        "resettokens-text": "Бу ситим-сиргэ бэлиэтэммит ааккын кытта ситимнээх токеннары сотуоххун сөп.\n\nАлҕас кимиэхэ эрэ биэрэн кэбиспит буоллаххына эбэтэр ким эрэ эн ааккынан алдьатан киирбит буоллаҕына маны туһаныахха сөп.",
        "resettokens-no-tokens": "Сотуллар токен суох эбит.",
-       "resettokens-legend": "Токеннары бырах",
        "resettokens-tokens": "Токеннар:",
        "resettokens-token-label": "$1 (билиҥҥитэ: $2)",
        "resettokens-watchlist-token": "[[Special:Watchlist|Кэтиир сирэйдэриҥ уларыйыыларын]] ситим-ханаалын (Atom/RSS) токена",
        "yourdiff": "Уратылар",
        "copyrightwarning": "Болҕой, манна оҥоһуллубут эбиилэр уонна уларытыылар $2 лицензиялаахтар (сиһ. маны көр $1). Өскө эн ыстатыйаларыҥ көҥүл тарҕаналларын уонна туһаныллалларын баҕарбат буоллаххына манна суруйума.<br />\nЭбиитин манна суруйар матырыйаалгын эбэтэр бэйэҥ суруйуохтааххын, эбэтэр көҥүл туһаныллары уонна көҥүл уларытары көҥүллүүр сиртэн ылбыт буолуохтааххын.\n'''КИМ ЭРЭ БАС БИЛЭР МАТЫРЫЙААЛЫН КИНИТТЭН КӨҤҮЛЭ СУОХ МАННА УГУМА!'''",
        "copyrightwarning2": "Болҕой, эн суруйбут матырыйаалгын ким баҕарар уларытар уонна суох гынар бырааптаах. Суруйбуккун уларыталларын сөбүлээбэт буоллаххына манна суруйума.<br />\nЭбиитин манна суруйдаххына, уларытыы ааптара мин буолабын, эбэтэр көҥүл туһанары уонна уларытары көҥүллүүр сиртэн ыллым диэн бигэргэтэҕин (маны көр $1).<br /> '''КИМ ЭРЭ БАС БИЛИИТИН МАННА КИНИТТЭН КӨҤҮЛЭ СУОХ УГУМА!'''",
+       "editpage-cannot-use-custom-model": "Бу сирэй иһинээҕитин тутула уларыйар кыаҕа суох.",
        "longpageerror": "'''Алҕас: Суруйар кэрчиккит {{PLURAL:$1|биир килобаайт|$1 килобаайт}} ыйааһыннаах, онтуккут көҥүллэммит {{PLURAL:$2|биир килобаайты|$2 килобайты}} килобаайты куоһарар. Онон сирэй бигэргэтиллэр кыаҕа суох.'''",
        "readonlywarning": "'''Сэрэтии: Сиэрбэргэ техническай үлэ бара турар, онон киллэрбит уларытыыларыҥ тута бигэргэнэр кыахтара суох.'''\nОнон уларытыыгын тиэкистээх билэҕэ уган баран, кэлин манна киллэриэххин сөп.\n\nХааччаҕы туруорбут дьаһабыл маннык быһаарыыны хаалларбыт: $1",
        "protectedpagewarning": "'''Сэрэтии:  Бу сирэй хатанан турар, администратор бырааптаах эрэ кыттааччылар уларытар кыахтаахтар.'''\nАллара сурунаал бүтэһик суруга көрдөрүлүннэ:",
        "badsig": "Сыыһа илии баттааһын; HTML тиэгтэрин көр.",
        "badsiglength": "Наһаа уһун илии баттааһын.\n$1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}} ордук буолуо суохтаах.",
        "yourgender": "Хайата Эйиэхэ сөп түбэһэрий?",
-       "gender-unknown": "ЫйбаÑ\82 Ð¸Ð½Ð¸Ð±Ð¸Ð½",
+       "gender-unknown": "Эн Ñ\82Ñ\83Ñ\81кÑ\83нан Ñ\81Ñ\83Ñ\80Ñ\83йаÑ\80Ñ\8bгаÑ\80, Ð±Ð°Ð°Ð¹Ñ\8bм Ñ\8dÑ\80гин Ð±Ð¸Ð¸Ñ\82Ñ\8dÑ\80 Ð´Ñ\8cаÑ\85Ñ\82аÑ\80гÑ\8bн Ð°Ñ\80ааÑ\80Ñ\8bа Ñ\81Ñ\83оÒ\95а",
        "gender-male": "Кини биики сирэйдэри уларытар",
        "gender-female": "Кини биики сирэйдэри уларытар",
        "prefs-help-gender": "Маны туруорар булгуччута суох. \nБырагыраамма сорох дьоҥҥо туһаайыллыбыт биллэриилэригэр эбэтэр кинилэргэ сыһыаннаах этиилэригэр кытааччы дьахтарыттан эбэтэр эр киһититтэн көрөн этии тутулун уларытан биэриэн сөп. \nТуора дьоҥҥо көстөр бэлиэтээһин.",
        "right-passwordreset": "Киирии тылы почта нөҥүө уларытыыны көрүү",
        "right-managechangetags": "[[Special:Tags|Бэлиэлэри]] билии олоҕуттан ылыы уонна сотуу",
        "right-applychangetags": "Улартыыларгын кытта [[Special:Tags|тиэктэри]] тутун",
+       "right-changetags": "Ханнык баҕарар [[Special:Tags|тиэктэри]] биирдиилээн уларытыыларга уонна сурунаал суруйууларыгар эбэри уонна сотору көҥүллээ",
        "newuserlogpage": "Кыттааччылары бэлиэтиир сурунаал",
        "newuserlogpagetext": "Соторутааҕыта бэлиэтэммит кыттааччылар.",
        "rightslog": "Кыттаачы бырааптарын сурунаала",
        "action-editmyprivateinfo": "бэйэҥ тускунан суруллубуту уларыт",
        "action-editcontentmodel": "сирэй ис тутулун уларытыы",
        "action-managechangetags": "билии олоҕор бэлиэлэри оҥоруу уонна сотуу",
+       "action-applychangetags": "тиэктэри Эн уларытыыларгын кытта туһанары көҥүллээ",
+       "action-changetags": "ханнык баҕарар тиэктэри сурунаал биирдиилээн уларытыыларыгар уонна суруктарыгар эбэри уонна сотору көҥүллээ",
        "nchanges": "$1 {{PLURAL:$1|уларытыы|уларытыылар}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|тиһэх сылдьыыгыттан}}",
        "enhancedrc-history": "устуоруйата",
        "uploadscripted": "Бу билэ HTML эбэтэр скрипт куодтаах эбит. Интэриниэт көрдөрөр бырагыраамма ону сыыһа ааҕыан сөп.",
        "upload-scripted-pi-callback": "XML истиилин табылыыссатын таҥастыыр туһунан ыйыылаах-кэрдиилээх билэни хачайдыыр табыллыбата.",
        "uploaded-script-svg": "Хачайдаммыт SVG-билэҕэ сценарийы өйүүр куттааллаах «$1» элэмиэн көһүннэ.",
+       "uploaded-hostile-svg": "Хачайдаммыт SVG-билэ истиилин элэмиэнигэр кутталлаах CSS-куод көһүннэ.",
+       "uploaded-event-handler-on-svg": "SVG-билэлэргэ <code>$1=\"$2\"</code> сабыытыйаны таҥастааччы атрибууттарын туруоруу көҥүллэммэт.",
+       "uploaded-href-attribute-svg": "SVG-билэлэргэ олохтоох соруга суох href-атрибууттар <code>&lt;$1 $2=\"$3\"&gt;</code> бобуллаллар (а.э. http://, javascript:, уо.д.а.).",
+       "uploaded-href-unsafe-target-svg": "Хачайдаммыт SVG-билэҕэ кутталлаах сигэ көһүннэ <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-animate-svg": "«Animate» тиэк көһүннэ, кини «from»-атрибут көмөтүнэн  <code>&lt;$1 $2=\"$3\"&gt;</code> хачайдаммыт SVG-билэҕэ сигэни уларытыан сөп.",
        "uploaded-image-filter-svg": "Хачайдаммыт SVG-билэҕэ маннык URL-аадырыстаах ойуу сиидэтэ көстүбүт <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploadscriptednamespace": "Бу SVG-билэ алҕастаах аат даллаах эбит: '$1'",
        "uploadinvalidxml": "Хачайдаммит билэҕэ XML анаалыстанар кыаҕа суох.",
        "linksearch-pat": "Көрдөөһүн халыыба:",
        "linksearch-ns": "Аат хочото (namespace):",
        "linksearch-ok": "Бул",
-       "linksearch-text": "Туруоран биэрэр бэлиэлэри туһаныахха сөп, холобур,  <code>*.wikipedia.org</code>.\nҮрдүкү таһымнаах домен буолуохтаах, холобур <code>*.org</code>.<br />\nӨйөнөр {{PLURAL:$2|боротокуол|боротокуоллар}}: <code>$1</code> (көрдүүргэр ханнык да боротокуолу талбатаххына http:// туруоруллуо)",
+       "linksearch-text": "Туруоран биэрэр бэлиэлэри туһаныахха сөп, холобур,  <code>*.wikipedia.org</code>.\nҮрдүкү таһымнаах домен буолуохтаах, холобур <code>*.org</code>.<br />\nӨйөнөр {{PLURAL:$2|боротокуол|боротокуоллар}}: $1 (көрдүүргэр ханнык да боротокуолу талбатаххына http:// туруоруллуо)",
        "linksearch-line": "Мантан $2 манна $1 ыйынньык",
        "linksearch-error": "Туруоран биэрэр бэлиэлэри аадырыс/hostname саҕаланыытыгар эрэ туттуохха сөп.",
        "listusersfrom": "Мантан саҕалаан кыттааччылары көрдөр:",
        "tooltip-pt-logout": "Тахсыы",
        "tooltip-pt-createaccount": "Манна киирэргэ бэлиэтэнэр уонна куруук ол аатынан киирэр ордук; ол булгуччута суох",
        "tooltip-ca-talk": "Ыстатыйаны ырытыы",
-       "tooltip-ca-edit": "Бу сирэйи уларытыахха сөп. Бука диэн бастаан хайдах буоларын көрөн баран уларыт.",
+       "tooltip-ca-edit": "Бу сирэйи уларыт",
        "tooltip-ca-addsection": "Саҥа салааны саҕалааһын",
        "tooltip-ca-viewsource": "Бу сирэй улартыллыбат. Ол гынан баран тутулун көрүөххүн уонна устан ылыаххын сөп.",
        "tooltip-ca-history": "Бу сирэй урукку торумнара.",
index 5eca1c4..cfc3ad5 100644 (file)
        "protectedinterface": "Sta pàggina cunteni un elementu ca fà parti dâ nterfaccia utenti dû software eggh'è  prutetta p'evitari pussìbbili abbusi. Pi jùnciri o canciari li traduzzioni pi tutti li wiki usari [//translatewiki.net/translatewiki.net] lu pruggettu di lucalizzazzioni di Mediawiki.",
        "editinginterface": "<strong>Accura:</strong> Lu testu di sta pàggina fà parti di l'interfaccia utenti dû situ.\nTutti li canciamenti appurtati a sta pàggina si riflèttinu supra li missaggi visualizzati pi tutti l'utenti di sta wiki.",
        "translateinterface": "Pi' agghiunciri o canciari traduzzioni pi' tutti i wiki, pi' favuri adupirati [//translatewiki.net/ translatewiki.net], lu pruggettu di lucalizzazzioni di MediaWiki.",
-       "cascadeprotected": "Supra sta pàggina nun è pussìbbili effittuari canciamenti pirchì veni nclusa nt{{PLURAL:$1|â pàggina siquenti, ca fu prutetta|ê pàggini siquenti, ca foru prutetti}} silizziunannu la prutizzioni \"ricursiva\":\n$2",
+       "cascadeprotected": "Sta pàggina è prutetta dî canciamenti pirchì veni trasclusa {{PLURAL:$1|ntâ pàggina siquenti, ca fu' prutiggiuta|ntê pàggini siquenti, ca foru prutiggiuti}} cu' l'opzioni «a' cascata»:\n$2",
        "namespaceprotected": "Nun hai lu pirmissu pi canciari li pàggini ntô namespace '''$1'''.",
        "customcssprotected": "Nun hai lu pirmissu pi' canciari sta pàggina CSS picchì cunteni i mpustazzioni pirsunali di n'autru utenti.",
        "customjsprotected": "Nun hai lu pirmissu pi' canciari sta pàggina JavaScript picchì cunteni i mpustazzioni pirsunali di n'autru utenti.",
        "readonlywarning": "<strong>Accura: Lu database è fermu pi manutinzioni, pirciò nun poi sarvari li tò canciamenti nta stu mumentu.</strong>\nLa cosa megghia è fari un copia e ncodda dû testu nta n'àutru prugramma e sarvàrilu pi quannu lu database torna accissìbbili.\n\nL'amministraturi ca bluccau lu database desi sta spiegazzioni: $1",
        "protectedpagewarning": "<strong>Accura: Sta pàggina fu' prutetta a' manera chi' sulu l'utenti cu' privileggi d'amministraturi a ponnu canciari.</strong>\nPi' rifirimentu, ccassutta è ripurtata l'ultima vuci dû riggistru:",
        "semiprotectedpagewarning": "<strong>Nota:</strong> Sta pàggina fu' prutetta a' manera chi' sulu l'utenti riggistrati la ponnu canciari.\nPi' rifirimentu, ccassutta è ripurtata l'ultima vuci dû riggistru:",
-       "cascadeprotectedwarning": "<strong>Accura:</strong> Sta pàggina havi statu bluccata di manera ca sulu l'utenti cu' privileggi di amministraturi la ponnu canciari, pirchì veni nclusa {{PLURAL:$1|nta siquente pàggina ca havi statu prutiggiuta|ntê siquenti pàggini ca hannu statu prutiggiuti}} a' cascata:",
+       "cascadeprotectedwarning": "<strong>Accura:</strong> Sta pàggina fu' bluccata di manera ca sulu l'utenti cu' privileggi di amministraturi la ponnu canciari, pirchì veni trasclusa {{PLURAL:$1|nta siquenti pàggina ca è prutiggiuta|ntê siquenti pàggini ca sunnu prutiggiuti}} a' cascata:",
        "titleprotectedwarning": "<strong>Accura: Sta pàggina fu' prutetta a' manera chi' giuvunu [[Special:ListGroupRights|privileggi spicìfici]] pi' criàrila.</strong>\nPi' rifirimentu, ccassutta è ripurtata l'ultima vuci dû riggistru:",
        "templatesused": "{{PLURAL:$1|Template adupiratu|Template adupirati}} nta sta pàggina:",
        "templatesusedpreview": "{{PLURAL:$1|Template adupiratu|Template adupirati}} nta st'antiprima:",
        "randomincategory-nopages": "Nun cci su' pàggini ntâ catigurìa [[:Category:$1|$1]].",
        "randomincategory-category": "Catigurìa:",
        "randomincategory-legend": "Pàggina a' muzzu nta na catigurìa",
+       "randomincategory-submit": "Vai",
        "randomredirect": "Nu rimannu a' muzzu",
        "randomredirect-nopages": "Nun cc'è nuddu rimannu ntô namespace \"$1\".",
        "statistics": "Statìstichi",
        "linksearch-pat": "Esprissioni di risciduta:",
        "linksearch-ns": "Namespace:",
        "linksearch-ok": "Arriscedi",
-       "linksearch-text": "Si ponnu adupirari li caràttiri matta, ad esempiu \"*.wikipedia.org\".\nCci voli almenu nu duminiu di primu liveddu, ad esempiu \"*.org\".<br />\n{{PLURAL:$2|Protucollu suppurtatu|Protucolli suppurtati}}: <code>$1</code> (è pridifinutu http:// si' nun si nni spicìfica)",
+       "linksearch-text": "Si ponnu adupirari li caràttiri matta, ad esempiu \"*.wikipedia.org\".\nCci voli almenu nu duminiu di primu liveddu, ad esempiu \"*.org\".<br />\n{{PLURAL:$2|Protucollu suppurtatu|Protucolli suppurtati}}: $1 (è pridifinutu http:// si' nun si nni spicìfica)",
        "linksearch-line": "$1 è culligatu dâ pàggina $2",
        "linksearch-error": "Li caràttiri matta ponnu appariri sulu ô principiu dû nomu host.",
        "listusersfrom": "Ammustra l'utenti a' pàrtiri di:",
        "protect-locked-blocked": "Nun si ponnu canciari li livedda di prutizzioni quannu unu è bluccatu.\nCca cci su' li mpustazzioni attuali dâ pàggina <strong>$1</strong>:",
        "protect-locked-dblock": "Nun si ponnu canciari li livedda di prutizzioni picchì cc'è attivatu un bloccu dâ basi di dati.\nCca cci su' li mpustazzioni attuali dâ pàggina <strong>$1</strong>:",
        "protect-locked-access": "Lu to cuntu nun havi lu pirmissu di canciari li livedda di prutizzioni.\nCca cci su' li mpustazzioni attuali dâ pàggina <strong>$1</strong>:",
-       "protect-cascadeon": "Com'ad ora sta pàggina è prutetta picchi' veni nclusa {{PLURAL:$1|ntâ pàggina innicata di sèquitu, supra â quali|ntê pàggini innicati di sèquitu, supra ê quali}} è attivata la prutizzioni a' cascata.\nI canciamenti fatti ô liveddu di prutizzioni di sta pàggina nun vannu a' canciari la prutizzioni a' cascata.",
+       "protect-cascadeon": "Com'ad ora sta pàggina è prutetta picchì veni trasclusa {{PLURAL:$1|ntâ siquenti pàggina, ca havi|ntê siquenti pàggini, ca hannu}} la prutizzioni a' cascata attivata.\nLi canciamenti ca si fannu ô liveddu di prutizzioni di sta pàggina nun vannu a' canciari la prutizzioni a' cascata.",
        "protect-default": "Cunsenti a' tutti l'utenti",
        "protect-fallback": "Cunsenti sulu a' l'utenti cû pirmissu \"$1\"",
        "protect-level-autoconfirmed": "Cunsenti sulu a' l'utenti autu-cunfirmati",
        "pageinfo-robot-index": "Cunsintuta",
        "pageinfo-robot-noindex": "Pruibbuta",
        "pageinfo-watchers": "Quanti talìunu sta pàggina",
-       "pageinfo-visiting-watchers": "Nùmmiru d’utenti ntirissati a’ sta pàggina ca talìunu li canciamenti cchiu’ ricenti",
+       "pageinfo-visiting-watchers": "Nùmmiru d’utenti ntirissati a’ sta pàggina ca hannu taliatu li canciamenti cchiu’ ricenti",
        "pageinfo-few-watchers": "Cchiu' picca di $1 {{PLURAL:$1|taliaturi|taliatura}}",
        "pageinfo-few-visiting-watchers": "Forsi cc’è quarchi utenti ntirissatu ca talìa li canciamenti ricenti, forsi no",
        "pageinfo-redirects-name": "Nùmmiru di rimanni a' sta pàggina",
        "htmlform-cloner-create": "Agghiunci autru",
        "htmlform-cloner-delete": "Leva",
        "htmlform-cloner-required": "Cci voli almenu nu valuri.",
+       "htmlform-title-badnamespace": "[[:$1]] nun sta ntô namespace «{{ns:$2}}».",
+       "htmlform-title-not-creatable": "«$1» nun è tìtulu di na pàggina ca si po’ criari",
+       "htmlform-title-not-exists": "[[:$1]] nun esisti.",
+       "htmlform-user-not-exists": "<strong>$1</strong> nun esisti.",
+       "htmlform-user-not-valid": "<strong>$1</strong> nun è vàlidu comu nomu utenti.",
        "sqlite-has-fts": "$1 cu' capacità di risciduta a' tuttu testu",
        "sqlite-no-fts": "$1 senza capacità di risciduta a' tuttu testu",
        "logentry-delete-delete": "$1 {{GENDER:$2|cancillau}} la pàggina $3",
index 6735a93..37e3344 100644 (file)
        "passwordreset": "Reset passwaird",
        "passwordreset-text-one": "Compleate this form tae receive ae temperie passwaird via wab-mail.",
        "passwordreset-text-many": "{{PLURAL:$1|Fill in yin o the fields tae receive ae temperie passwaird via wab-mail.}}",
-       "passwordreset-legend": "Reset passwaird",
        "passwordreset-disabled": "Passwaird resets hae been disabled oan this wiki.",
        "passwordreset-emaildisabled": "Wab-mail features hae been disabled oan this wiki.",
        "passwordreset-username": "Uisername:",
        "resettokens": "Reset tokens.",
        "resettokens-text": "Ye can reset tokens that permit ye access til certain private data associated wi yer accoont here.\n\nYe shid dae it gif ye accidentally shaired theim wi somebodie or gif yer accoont haes been compromised.",
        "resettokens-no-tokens": "Thaur ar nae tokens tae reset.",
-       "resettokens-legend": "Reset tokens.",
        "resettokens-tokens": "Tokens':",
        "resettokens-token-label": "$1 (value the nou: $2)",
        "resettokens-watchlist-token": "Token fer the wab feed (Atom/RSS) o [[Special:Watchlist|chynges til pages oan yer watchleet]]",
        "nmembers": "$1 {{PLURAL:$1|memmer|memmers}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|memmer|memmers}}",
        "nrevisions": "$1 {{PLURAL:$1|reveesion|reveesions}}",
-       "nviews": "$1 {{PLURAL:$1|luik|luiks}}",
        "nimagelinks": "Uised oan $1 {{PLURAL:$1|page|pages}}",
        "ntransclusions": "uised oan $1 {{PLURAL:$1|page|pages}}",
        "specialpage-empty": "Thaur's naw ootcomes fer this report.",
        "linksearch-pat": "Rake pattern:",
        "linksearch-ns": "Namespace:",
        "linksearch-ok": "Rake",
-       "linksearch-text": "Wildcairds like \"*.wikipedia.org\" can be uised.\nNeeds at least ae top-level domain, fer example \"*.org\".<br />\nSupported {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (defaults to http:// gif naw protocol is speceefied).",
+       "linksearch-text": "Wildcairds like \"*.wikipedia.org\" can be uised.\nNeeds at least ae top-level domain, fer example \"*.org\".<br />\nSupported {{PLURAL:$2|protocol|protocols}}: $1 (defaults to http:// gif naw protocol is speceefied).",
        "linksearch-line": "$1 is airtit fae $2",
        "linksearch-error": "Wildcards micht appear yinlie at the stairt o the hoastname.",
        "listusersfrom": "Displey uisers stairtin at:",
index abe5406..e4a0b4e 100644 (file)
        "passwordreset": "Šennikufal yeeti",
        "passwordreset-text-one": "Takaddaa woo timmandi ka duu šiiyan šennikufal bataga ra.",
        "passwordreset-text-many": "{{PLURAL:$1|Faari foo toonandi ka duu šiiyan šennikufal foo bataga ra.}}",
-       "passwordreset-legend": "Šennikufal yeeti",
        "passwordreset-disabled": "Šennikufal yeetiyan n' ka kaŋ wikiyoo woo se.",
        "passwordreset-emaildisabled": "Bataga alhaaley n' ka kaŋ wikiyoo ga.",
        "passwordreset-username": "Goykaw maa:",
        "resettokens": "Tammaasawey yeeti",
        "resettokens-text": "War ga hin ka tammaasawey yeeti kaŋ ga too war ma hin ka dii sutura bayhaya tanayaŋ nda war kontoo ne.\n|nWar ga hima k'a tte nda war dere k'i noo boro waani se wala nda war ga šikka kaŋ boro waani n' ka huru kontoo ra.",
        "resettokens-no-tokens": "Tammaasa kul šii yeetiyan se.",
-       "resettokens-legend": "Tammaasawey yeeti",
        "resettokens-tokens": "Tammaasawey:",
        "resettokens-token-label": "$1 (sohõda hinna: $2)",
        "resettokens-watchlist-token": "Tammaasa interneti toonandiyanoo se (Atom/RSS) [[Special:Hawgayhayey|barmawey war hawgayhayey maašeedaa ga]]",
        "nmembers": "{{PLURAL:$1|kondayze}} $1",
        "nmemberschanged": "{{PLURAL:$2|kondayze}} $1 → $2 \\",
        "nrevisions": "{{PLURAL:$1|filla}} $1",
-       "nviews": "{{PLURAL:$1|gunari}} $1 \\",
        "nimagelinks": "Goyandi {{PLURAL:$1|moo}} ga",
        "ntransclusions": "goyandi {{PLURAL:$1|moo}} 1",
        "specialpage-empty": "Hunyan kulyaŋ ši bayrandiroo woo se.",
        "linksearch-pat": "Noone ceeci:",
        "linksearch-ns": "Maafarru:",
        "linksearch-ok": "Ceeci",
-       "linksearch-text": "Baytal tammaasawey sanda \"*.wikipedia.org\" ga hin ka goyandi.\nMa bara nda, nd'a jaase, beene-alkadar nungu, sanda \"*.org\".<br />\n{{PLURAL:$2|fondo|fondawey}}: <code>$1</code> (tilasu ra bere http:// ga nda fondo kul mana tabatandi).",
+       "linksearch-text": "Baytal tammaasawey sanda \"*.wikipedia.org\" ga hin ka goyandi.\nMa bara nda, nd'a jaase, beene-alkadar nungu, sanda \"*.org\".<br />\n{{PLURAL:$2|fondo|fondawey}}: $1 (tilasu ra bere http:// ga nda fondo kul mana tabatandi).",
        "linksearch-line": "$1 ga dobu $2 ga",
        "linksearch-error": "Baytal tammaasawey ga bangay zunbudoo maa šintinoo hinne ga.",
        "listusersfrom": "Goykey cebe kaŋ ga šintin ne:",
index 728e19b..3ee09eb 100644 (file)
        "linksearch-pat": "Šema pretrage:",
        "linksearch-ns": "Imenski prostor:",
        "linksearch-ok": "Traži",
-       "linksearch-text": "Možete koristiti džoker znakove poput \"*.wikipedia.org\".\nPotrebno je navesti osnovnu domenu (TLD), npr. \"*.org\".<br />\nPodržani {{PLURAL:$2|protokol|protokoli}}: <code>$1</code> (default je http:// ako nijedan protokol nije naveden).",
+       "linksearch-text": "Možete koristiti džoker znakove poput \"*.wikipedia.org\".\nPotrebno je navesti osnovnu domenu (TLD), npr. \"*.org\".<br />\nPodržani {{PLURAL:$2|protokol|protokoli}}: $1 (default je http:// ako nijedan protokol nije naveden).",
        "linksearch-line": "$1 je povezan od $2",
        "linksearch-error": "Džokeri se mogu pojavljivati samo na početku naziva servera.",
        "listusersfrom": "Prikaži korisnike počev od:",
index 327f92e..d317988 100644 (file)
        "passwordreset": "මුරපදය වෙනස් කරන්න",
        "passwordreset-text-one": "තාවකාලික මුර-පදයක් විද්‍යුත් තැපෑළ මගින් ලබා ගැනීම සඳහා මෙම පෝරමය සම්පූර්ණ කරන්න.",
        "passwordreset-text-many": "{{PLURAL:$1|තාවකාලික මුරපදයක් ඊ-තැපෑල හරහා ගෙන්වා ගැනීමට එක් ක්ෂේත්‍රයක් පුරවන්න}}",
-       "passwordreset-legend": "මුරපදය යළි පිහිටුවන්න",
        "passwordreset-disabled": "මෙම විකියෙහි මුර පද ප්‍රත්‍යාරම්භ කිරීම් අක්‍රීය කොට ඇත.",
        "passwordreset-emaildisabled": "විද්‍යුත්  තැපැල් පහසුකම මෙම විකි ය සඳහා අවලංගු කොට ඇත.",
        "passwordreset-username": "පරිශීලක නාමය:",
        "resettokens": "සංකේත නැවත සකසන්න",
        "resettokens-text": "ඔබ මෙතනයි ඔබගේ ගිණුම හා සම්බන්ධ ඇතැම් පෞද්ගලික දත්ත වෙත ප්රවේශ ඉඩ දෙන ටෝකන් පත් සැකසිය හැක. \n\nඔබ වැරදී කෙනෙකු සමග හෝ ඔබගේ ගිණුම වෙනස් කර තිබේ නම්, ඔවුන් හවුල් නම් ඔබ එය කළ යුත්තේ.",
        "resettokens-no-tokens": "නැවත සකස් කිරීමට කිසිදු ටෝකන් පත් වේ.",
-       "resettokens-legend": "සංකේත නැවත සකසන්න",
        "resettokens-tokens": "සංකේත:",
        "resettokens-token-label": "$1 (පවතින අගය: $2)",
        "resettokens-watchlist-token": "වෙබ් සංග්රහය (Atom/RSS) සඳහා සංකේත [[Special:Watchlist|ඔබගේ මුර-ලැයිස්තුවෙහි පිටු වෙනස්කම්]]",
        "randomincategory-nopages": "[[:Category:$1|$1]] ප්‍රවර්ගයේ පිටු නොමැත.",
        "randomincategory-category": "ප්‍රවර්ගය:",
        "randomincategory-legend": "ප්‍රවර්ගයේ අහඹු පිටු",
+       "randomincategory-submit": "යන්න",
        "randomredirect": "අහුඹු යළි-යොමුකිරීම",
        "randomredirect-nopages": "\"$1\" නාම-අවකාශයෙහි යළි-යොමුවීම් නොමැත.",
        "statistics": "සංඛ්‍යාන දත්ත",
        "nmembers": "{{PLURAL:$1|එක් සාමාජිකයෙකි|සාමාජිකයෝ $1 කි}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|සාමාජිකයන්|සාමාජික}}",
        "nrevisions": "{{PLURAL:$1|එක් සංශෝධනයකි|සංශෝධන $1 කි }}",
-       "nviews": " {{PLURAL:$1|නැරඹුම් එකකි|නැරඹුම් $1 කි}}",
        "nimagelinks": "{{PLURAL:$1|පිටු|පිටු}} $1 ක භාවිතාකර ඇත",
        "ntransclusions": "{{PLURAL:$1|පිටු|පිටු}} $1 ක භාවිතාකර ඇත",
        "specialpage-empty": "මෙම වාර්තාවට ප්‍රතිඵල කිසිවක් නොමැත.",
        "linksearch-pat": "ගවේෂණ රටාව:",
        "linksearch-ns": "නාම-අවකාශය:",
        "linksearch-ok": "ගවේෂණය",
-       "linksearch-text": "\"*.wikipedia.org\" වැනි ආදේශක භාවිතා කල හැක.\nඅඩුම තරමින් උසස්-මට්ටමේ වසමක් අවශ්‍යයි, නිදසුනක් ලෙස \"*.org\".<br />\nසහය දක්වන : <code>$1</code> (ඔබේ සෙවුමෙහි මේවා කිසිවක් නොයොදන්න). {{PLURAL:$2|ප්‍රෝටෝකොලය|ප්‍රෝටෝකොලයන්}}:",
+       "linksearch-text": "\"*.wikipedia.org\" වැනි ආදේශක භාවිතා කල හැක.\nඅඩුම තරමින් උසස්-මට්ටමේ වසමක් අවශ්‍යයි, නිදසුනක් ලෙස \"*.org\".<br />\nසහය දක්වන : $1 (ඔබේ සෙවුමෙහි මේවා කිසිවක් නොයොදන්න). {{PLURAL:$2|ප්‍රෝටෝකොලය|ප්‍රෝටෝකොලයන්}}:",
        "linksearch-line": "$2 වෙතින් $1 සබැඳිණි",
        "linksearch-error": "ආදේශක  පෙනීසිටිය හැක්කේ සත්කාරකනාමය ආරම්භයෙහි පමණයි.",
        "listusersfrom": "‍මෙම අකුරෙන් පටන්ගෙන පරිශීලකයන් ප්‍රදර්ශනය කරන්න:",
        "tooltip-pt-logout": "නික්මීම",
        "tooltip-pt-createaccount": "ඔබ ගිණුමක් තනා පිවිසෙන්නේ නම් මැනවි; කෙසේ වුවත්, එය අනිවාර්ය නොවේ.",
        "tooltip-ca-talk": "අන්තර්ගත පිටුව පිළිබඳ සාකච්ඡාව",
-       "tooltip-ca-edit": "à¶\94බâ\80\8dට à¶¸à·\99ම à¶´à·\92ටà·\94à·\80 à·\83à¶\82à·\83à·\8aà¶\9aරණය à¶\9aල à·\84à·\90à¶\9a. à·\83à¶\82à¶\9aරණ à·\83à·\94රà·\90à¶\9aà·\93මට à¶´à·\99ර à¶´à·\99රදà·\83à·\94න à¶¶à·\9cතà·\8aතම à¶·à·\8fà·\80à·\92තà·\8fà¶\9aà·\92රà·\93ම à¶ºà·\9dà¶\9cà·\8aâ\80\8dයà·\80à·\9a.",
+       "tooltip-ca-edit": "මà·\99ම à¶´à·\92ටà·\94à·\80 à·\83à¶\82à·\83à·\8aà¶\9aරණය à¶\9aරනà·\8aන",
        "tooltip-ca-addsection": "නව කොටසක් අරඹන්න",
        "tooltip-ca-viewsource": "මෙම පිටුව ආරක්‍ෂණය කොට ඇත.\nඔබට එහි මූලාශ්‍රය නැරඹිය හැක.",
        "tooltip-ca-history": "මෙම පිටුවේ පෙර සංශෝධන",
index 4002e8b..e6b5f97 100644 (file)
        "linksearch-pat": "Vyhľadávací vzor:",
        "linksearch-ns": "Menný priestor:",
        "linksearch-ok": "Hľadať",
-       "linksearch-text": "Je možné používať zástupné znaky, napr. „*.wikipedia.org“.\nPovinná je minimálne doména najvyššej úrovne, napr. „*.org“.<br />\n{{PLURAL:$2|Podporovaný protokol|Podporované protokoly}}: <code>$1</code> (ak protokol nie je uvedený, použije sa http://).",
+       "linksearch-text": "Je možné používať zástupné znaky, napr. „*.wikipedia.org“.\nPovinná je minimálne doména najvyššej úrovne, napr. „*.org“.<br />\n{{PLURAL:$2|Podporovaný protokol|Podporované protokoly}}: $1 (ak protokol nie je uvedený, použije sa http://).",
        "linksearch-line": "Na $1 odkazuje $2",
        "linksearch-error": "Zástupné znaky je možné použiť iba na začiatku názvu domény.",
        "listusersfrom": "Zobraziť používateľov počnúc:",
index ce555e4..9a6e537 100644 (file)
        "preview": "Predogled",
        "showpreview": "Prikaži predogled",
        "showdiff": "Prikaži spremembe",
-       "blankarticle": "<strong>Opozorilo:</strong> Stran, ki jo ustvarjate, je prazna.\nČe ponovno kliknete »{{int:savearticle}}«, bomo stran ustvarili brez kakršne koli vsebine.",
-       "anoneditwarning": "<strong>Opozorilo:</strong> Niste prijavljeni. Vaš IP-naslov bo javno viden, če naredite kakršno koli urejanje. Če se <strong>[$1 prijavite]</strong> ali <strong>[$2 ustvarite račun]</strong>, bodo vaša urejanja pripisana vašemu uporabniškemu imenu skupaj z drugimi prednostmi.",
+       "blankarticle": "<strong>Opozorilo:</strong> Stran, ki jo ustvarjate, je prazna.\nČe ponovno kliknete »{{int:savearticle}}«, bomo stran ustvarili brez kakršnekoli vsebine.",
+       "anoneditwarning": "<strong>Opozorilo:</strong> Niste prijavljeni. Vaš IP-naslov bo javno viden, če naredite kakršnokoli urejanje. Če se <strong>[$1 prijavite]</strong> ali <strong>[$2 ustvarite račun]</strong>, bodo vaša urejanja pripisana vašemu uporabniškemu imenu skupaj z drugimi prednostmi.",
        "anonpreviewwarning": "Niste prijavljeni. Ob spremembi strani se bo vaš IP-naslov zapisal v zgodovini urejanja te strani.",
        "missingsummary": "'''Opozorilo:''' Niste napisali povzetka urejanja. Ob ponovnem kliku gumba ''Shrani'' se bo vaše urejanje shranilo brez njega.",
        "selfredirect": "<strong>Opozorilo:</strong> Stran preusmerjate na samo nase.\nMorda ste za cilj preusmeritve navedli napačno stran ali pa morda urejate napačno stran.\nČe ponovno kliknete »{{int:savearticle}}«, bomo preusmeritev vseeno ustvarili.",
        "editingold": "'''Opozorilo: Urejate staro redakcijo strani.'''\nČe jo boste shranili, bodo vse poznejše spremembe razveljavljene.",
        "yourdiff": "Primerjava",
        "copyrightwarning": "Vsi prispevki k {{GRAMMAR:dajalnik|{{SITENAME}}}} se obravnavajo kot objave pod pogoji $2 (za podrobnosti glej $1). Če niste pripravljeni na neusmiljeno urejanje in prosto razširjanje vašega gradiva, ga ne prispevajte.<br />\nPoleg tega zagotavljate, da ste prispevke napisali oziroma ustvarili sami ali pa prepisali iz javno dostopnega ali podobnega prostega vira.\n'''Ne dodajajte avtorsko zaščitenega dela brez dovoljenja!'''",
-       "copyrightwarning2": "Vedite, da lahko drugi urejevalci urejajo, spremenijo ali odstranijo kateri koli prispevek k {{GRAMMAR:dajalnik|{{SITENAME}}}}.\nČe niste pripravljeni na neusmiljeno urejanje svojega gradiva, ga ne objavljajte tukaj.<br />\nPoleg tega jamčite, da ste prispevke napisali oziroma ustvarili sami ali pa prepisali iz vira v javni lasti ali podobnega prostega vira (za podrobnosti glej $1).\n'''Ne objavljajte avtorsko zaščitenega gradiva brez dovoljenja!'''",
+       "copyrightwarning2": "Vedite, da lahko drugi urejevalci urejajo, spremenijo ali odstranijo katerikoli prispevek k {{GRAMMAR:dajalnik|{{SITENAME}}}}.\nČe niste pripravljeni na neusmiljeno urejanje svojega gradiva, ga ne objavljajte tukaj.<br />\nPoleg tega jamčite, da ste prispevke napisali oziroma ustvarili sami ali pa prepisali iz vira v javni lasti ali podobnega prostega vira (za podrobnosti glej $1).\n'''Ne objavljajte avtorsko zaščitenega gradiva brez dovoljenja!'''",
        "editpage-cannot-use-custom-model": "Modela vsebine strani ni mogoče spremeniti.",
        "longpageerror": "'''Napaka: Predloženo besedilo je dolgo $1 {{PLURAL:$1|kilobajt|kilobajta|kilobajte|kilobajtov}}, s čimer presega največjo dovoljeno dolžino $2 {{PLURAL:$2|kilobajta|kilobajtov|kilobajtov|kilobajtov}}.'''\nZato ga ni mogoče shraniti.",
        "readonlywarning": "<strong>Opozorilo: Zbirka podatkov je zaradi vzdrževanja začasno zaklenjena, kar pomeni, da sprememb trenutno ne morete shraniti.</strong>\nProsimo, prenesite besedilo v urejevalnik in ga dodajte pozneje.\n\nSistemski skrbnik, ki jo je zaklenil, je podal naslednjo razlago: $1",
        "prefsnologintext2": "Za spreminjanje svojih nastavitev se morate prijaviti.",
        "prefs-skin": "Koža",
        "skin-preview": "Predogled",
-       "datedefault": "Kakor koli",
+       "datedefault": "Kakorkoli",
        "prefs-labs": "Funkcije laboratorija",
        "prefs-user-pages": "Uporabniške strani",
        "prefs-personal": "Podatki o uporabniku",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[temo {{PLURAL:$1|spremlja|spremljata|spremljajo|spremlja|spremlja}} $1 {{PLURAL:$1|uporabnik|uporabnika|uporabniki|uporabnikov|uporabnikov}}]",
        "rc_categories": "Omejitev na kategorije (ločite jih z »|«)",
-       "rc_categories_any": "Katero koli",
+       "rc_categories_any": "Katerokoli",
        "rc-change-size-new": "po spremembi: $1 {{PLURAL:$1|zlog|zloga|zlogi|zlogov}}",
        "newsectionsummary": "/* $1 */ nov razdelek",
        "rc-enhanced-expand": "Pokaži podrobnosti",
        "uploaded-animate-svg": "V naloženi datoteki SVG smo našli oznako »animate«, ki lahko spreminja href z uporabo atributa »from« <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-setting-event-handler-svg": "Določevanje atributov za dogodke je blokirano; v naloženi datoteki SVG smo našli <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-setting-href-svg": "Uporaba oznake »set« za določevanje atributa »href« starševskega elementa je blokirano.",
-       "uploaded-wrong-setting-svg": "Uporaba oznake »set« za dodajanje oddaljenega/podatkovnega/skriptnega cilja kateremu koli atributu je blokirano. V naloženi datoteki SVG smo našli <code>&lt;set to=\"$1\"&gt;</code>.",
+       "uploaded-wrong-setting-svg": "Uporaba oznake »set« za dodajanje oddaljenega/podatkovnega/skriptnega cilja kateremukoli atributu je blokirano. V naloženi datoteki SVG smo našli <code>&lt;set to=\"$1\"&gt;</code>.",
        "uploaded-setting-handler-svg": "SVG, ki nastavi atribut »handler« z oddaljenim/podatkovnim/skriptom ciljem, je blokiran. V naloženi datoteki SVG smo našli <code>$1=\"$2\"</code>.",
-       "uploaded-remote-url-svg": "SVG, ki določi kateri koli slogovni atribut z oddaljenim URL-jem, je blokiran. V naloženi datoteki SVG smo našli <code>$1=\"$2\"</code>.",
+       "uploaded-remote-url-svg": "SVG, ki določi katerikoli slogovni atribut z oddaljenim URL-jem, je blokiran. V naloženi datoteki SVG smo našli <code>$1=\"$2\"</code>.",
        "uploaded-image-filter-svg": "V naloženi datoteki SVG smo našli slikovni filter z URL-jem: <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploadscriptednamespace": "Datoteka SVG vsebuje nedovoljen imenski prostor »$1«",
        "uploadinvalidxml": "XML v naloženi datoteki ne moremo razčleniti.",
        "randomincategory-nopages": "V kategoriji [[:Category:$1]] ni nobene strani.",
        "randomincategory-category": "Kategorija:",
        "randomincategory-legend": "Naključna stran v kategoriji",
+       "randomincategory-submit": "Pojdi",
        "randomredirect": "Naključna preusmeritev",
        "randomredirect-nopages": "V imenskem prostoru »$1« ni preusmeritev.",
        "statistics": "Statistika",
        "linksearch-pat": "Iskalni vzorec:",
        "linksearch-ns": "Imenski prostor:",
        "linksearch-ok": "Išči",
-       "linksearch-text": "Uporabljate lahko nadomestne znake, kot je »*.wikipedia.org«.\nZahtevana je vsaj najvišja domena, na primer »*.org«.<br />\n{{PLURAL:$2|Podprt protokol|Podprta protokola|Podprti protokoli}}: <code>$1</code> (če protokol ni določen, se privzame http://).",
+       "linksearch-text": "Uporabljate lahko nadomestne znake, kot je »*.wikipedia.org«.\nZahtevana je vsaj najvišja domena, na primer »*.org«.<br />\n{{PLURAL:$2|Podprt protokol|Podprta protokola|Podprti protokoli}}: $1 (če protokol ni določen, se privzame http://).",
        "linksearch-line": "$1 povezano iz $2",
        "linksearch-error": "Jokerji se lahko pojavijo le na začetku gostiteljskega imena.",
        "listusersfrom": "Prikaži uporabnike začenši z:",
        "listusers-noresult": "Ni najdenih uporabnikov.",
        "listusers-blocked": "(blokiran)",
        "activeusers": "Seznam aktivnih uporabnikov",
-       "activeusers-intro": "Seznam uporabnikov, ki so bili kakor koli aktivni v {{PLURAL:$1|zadnjem $1 dnevu|zadnjih $1 dneh}}.",
+       "activeusers-intro": "Seznam uporabnikov, ki so bili kakorkoli aktivni v {{PLURAL:$1|zadnjem $1 dnevu|zadnjih $1 dneh}}.",
        "activeusers-count": "$1 {{PLURAL:$1|dejanje|dejanji|dejanja|dejanj}} v {{PLURAL:$3|preteklem dnevu|preteklih $3 dneh}}",
        "activeusers-from": "Prikaži uporabnike začenši z:",
        "activeusers-hidebots": "Skrij bote",
        "rollback-success": "Razveljavljene spremembe uporabnika $1;\nvrnjeno na urejanje uporabnika $2.",
        "sessionfailure-title": "Neuspeh seje",
        "sessionfailure": "Vaša prijava ni uspela; da bi preprečili ugrabitev seje, je bilo dejanje preklicano. Prosimo, izberite »Nazaj« in ponovno naložite stran, s katere prihajate, nato poskusite znova.",
+       "changecontentmodel": "Spremeni model vsebine strani",
+       "changecontentmodel-legend": "Spremeni model vsebine",
+       "changecontentmodel-title-label": "Naslov strani",
+       "changecontentmodel-model-label": "Novi model vsebine",
+       "changecontentmodel-reason-label": "Razlog:",
+       "changecontentmodel-success-title": "Spremenili smo model vsebine",
+       "changecontentmodel-success-text": "Spremenili smo vrsto vsebine [[:$1]].",
+       "changecontentmodel-cannot-convert": "Vsebine na [[:$1]] ni mogoče pretvoriti v vrsto $2.",
+       "changecontentmodel-title-cantexist": "Na $1 ni mogoče imeti strani.",
+       "changecontentmodel-nodirectediting": "Model vsebine $1 ne podpira neposrednega urejanja",
+       "log-name-contentmodel": "Dnevnik sprememb modela vsebine",
+       "log-description-contentmodel": "Dogodki, povezani z modeli vsebin strani",
+       "logentry-contentmodel-change": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} model vsebine strani $3 z »$4« na »$5«",
+       "logentry-contentmodel-change-revertlink": "vrni",
+       "logentry-contentmodel-change-revert": "vrni",
        "protectlogpage": "Dnevnik zaščit strani",
        "protectlogtext": "Prikazan je seznam sprememb zaščit strani.\nOglejte si [[Special:ProtectedPages|seznam zaščitenih strani]] za seznam trenutno zaščitenih strani.",
        "protectedarticle": "je zaščitil(-a) stran »[[$1]]«",
        "restriction-upload": "Naloži",
        "restriction-level-sysop": "popolna zaščita",
        "restriction-level-autoconfirmed": "delno zaščiteno",
-       "restriction-level-all": "katera koli raven",
+       "restriction-level-all": "katerakoli raven",
        "undelete": "Ogled izbrisanih strani",
        "undeletepage": "Prikaži izbrisane strani in jih obnovi",
        "undeletepagetitle": "'''Slednje zajema izbrisane redakcije [[:$1|$1]].'''",
        "tooltip-pt-logout": "Odjavite se",
        "tooltip-pt-createaccount": "Predlagamo vam, da ustvarite račun in se prijavite, vendar pa to ni obvezno.",
        "tooltip-ca-talk": "Pogovor o strani",
-       "tooltip-ca-edit": "Stran lahko uredite. Preden jo shranite, uporabite gumb za predogled.",
+       "tooltip-ca-edit": "Uredi stran",
        "tooltip-ca-addsection": "Začnite novo razpravo",
        "tooltip-ca-viewsource": "Stran je zaščitena, ogledate si lahko njeno izvorno kodo",
        "tooltip-ca-history": "Prejšnje redakcije strani",
        "pageinfo-robot-index": "Dovoljeno",
        "pageinfo-robot-noindex": "Nedovoljeno",
        "pageinfo-watchers": "Število spremljevalcev strani",
+       "pageinfo-visiting-watchers": "Število sledilcev strani, ki so si ogledali zadnja urejanja",
        "pageinfo-few-watchers": "Manj kot $1 {{PLURAL:$1|spremljevalec|spremljevalca|spremljevalci|spremljevalcev}}",
+       "pageinfo-few-visiting-watchers": "Lahko obstaja uporabnik, ki si ogleduje zadnja urejanja",
        "pageinfo-redirects-name": "Število preusmeritev na stran",
        "pageinfo-subpages-name": "Podstrani strani",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|preusmeritev|preusmeritvi|preusmeritve|preusmeritev}}; $3 {{PLURAL:$3|nepreusmeritev|nepreusmeritvi|nepreusmeritve|nepreusmeritev}})",
        "confirmemail_pending": "Potrditveno geslo vam je že bilo poslano; če ste pred kratkim ustvarili svoj račun, boste na njega morali počakati nekaj minut da prispe, preden boste poskušali zahtevali novo geslo.",
        "confirmemail_send": "Pošlji mi potrditveno sporočilo",
        "confirmemail_sent": "Potrditveno e-sporočilo je bilo poslano.",
-       "confirmemail_oncreate": "Potrditveno geslo je bilo poslano na vaš e-poštni naslov.\nTo geslo ni potrebno za vpis, vendar ga boste morali vnesti pred omogočanjem katere koli funkcije temelječe na e-pošti na wikiju.",
+       "confirmemail_oncreate": "Potrditveno geslo je bilo poslano na vaš e-poštni naslov.\nTo geslo ni potrebno za vpis, vendar ga boste morali vnesti pred omogočanjem katerekoli funkcije temelječe na e-pošti na wikiju.",
        "confirmemail_sendfailed": "Potrditvenega sporočila ni bilo mogoče poslati.\nProsimo, preverite, če niste naslova vnesli napačno.\n\nPosrednik e-pošte je vrnil: $1",
        "confirmemail_invalid": "Potrditveno geslo je neveljavno. Morda je poteklo.",
        "confirmemail_needlogin": "Za potrditev svojega e-poštnega naslova se morate $1.",
        "version-poweredby-others": "drugi",
        "version-poweredby-translators": "Prevajalci translatewiki.net",
        "version-credits-summary": "Radi bi priznali prispevek naslednjih oseb k [[Special:Version|MediaWiki]].",
-       "version-license-info": "MediaWiki je prosto programje; lahko ga razširjate in / ali spreminjate pod pogoji GNU General Public License, kot ga je objavila Free Software Foundation; bodisi License različice 2 ali (po vaši izbiri) katere koli poznejše različice.\n\nMediaWiki je razširjan v upanju, da bo uporaben, vendar BREZ KAKRŠNEGA KOLI ZAGOTOVILA; tudi brez posrednega jamstva PRODAJNE VREDNOSTI ali PRIMERNOSTI ZA DOLOČEN NAMEN. Oglejte si GNU General Public License za več podrobnosti.\n\nSkupaj s programom bi morali bi prejeti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopijo GNU General Public License]; če je niste, pišite Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ali jo [//www.gnu.org/licenses/old-licenses/gpl-2.0.html preberite na spletu].",
+       "version-license-info": "MediaWiki je prosto programje; lahko ga razširjate in / ali spreminjate pod pogoji GNU General Public License, kot ga je objavila Free Software Foundation; bodisi License različice 2 ali (po vaši izbiri) katerekoli poznejše različice.\n\nMediaWiki je razširjan v upanju, da bo uporaben, vendar BREZ KAKRŠNEGA KOLI ZAGOTOVILA; tudi brez posrednega jamstva PRODAJNE VREDNOSTI ali PRIMERNOSTI ZA DOLOČEN NAMEN. Oglejte si GNU General Public License za več podrobnosti.\n\nSkupaj s programom bi morali bi prejeti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopijo GNU General Public License]; če je niste, pišite Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ali jo [//www.gnu.org/licenses/old-licenses/gpl-2.0.html preberite na spletu].",
        "version-software": "Nameščena programska oprema",
        "version-software-product": "Izdelek",
        "version-software-version": "Različica",
        "htmlform-cloner-create": "Dodaj več",
        "htmlform-cloner-delete": "Odstrani",
        "htmlform-cloner-required": "Zahtevana je vsaj ena vrednost.",
+       "htmlform-title-badnamespace": "[[:$1]] ni v imenskem prostoru »{{ns:$2}}«.",
+       "htmlform-title-not-creatable": "»$1« je naslov strani, ki ga ni mogoče ustvariti",
+       "htmlform-title-not-exists": "[[:$1]] ne obstaja.",
+       "htmlform-user-not-exists": "<strong>$1</strong> ne obstaja.",
+       "htmlform-user-not-valid": "<strong>$1</strong> ni veljavno uporabniško ime.",
        "sqlite-has-fts": "$1 s podporo iskanju polnih besedil",
        "sqlite-no-fts": "$1 brez podpore iskanju polnih besedil",
        "logentry-delete-delete": "$1 je {{GENDER:$2|izbrisal|izbrisala|izbrisal(-a)}} stran $3",
index da013e8..45f8809 100644 (file)
        "ncategories": "$1 {{PLURAL:$1|Kategorie|Kategoria}}",
        "nmembers": "{{PLURAL:$1|1 Eentrag|$1 Eenträge}}",
        "nrevisions": "{{PLURAL:$1|1 Beoarbeetung|$1 Beoarbeetunga}}",
-       "nviews": "{{PLURAL:$1|1 Obfroage|$1 Obfroaga}}",
        "specialpage-empty": "De Seite enthält aktuell kenne Einträge.",
        "lonelypages": "Verwaiste Seyta",
        "lonelypagestext": "De folgenden Seyta waan ne eingebunden oder is werd ne uff se ei {{SITENAME}} verwiesa.",
        "deletedcontributions-title": "Geläschte Beiträge",
        "linksearch-ns": "Noamensraum:",
        "linksearch-ok": "Sucha",
-       "linksearch-text": "Diese Spezialseite ermeegliecht de Suche noach Seita, ei denen bestimmte Weblinks enthaala sein. Dabei kinna Wildcards wie beispielsweise <code>*.example.com</code> benutzt waan.<br />Understitzte Protokolle: <code>$1</code>",
+       "linksearch-text": "Diese Spezialseite ermeegliecht de Suche noach Seita, ei denen bestimmte Weblinks enthaala sein. Dabei kinna Wildcards wie beispielsweise <code>*.example.com</code> benutzt waan.<br />Understitzte Protokolle: $1",
        "linksearch-line": "$1 ies verlinkt vun $2",
        "linksearch-error": "Wildcards kinna ock oam Oanfang dar URL verwendet waan.",
        "listusersfrom": "Zeige Benutzer ob:",
        "delete-toobig": "Diese Seite hoot miet meh ols $1 {{PLURAL:$1|Version|Versionen}} anne siehr lange Versionsgeschichte. Doas Läscha sulcher Seita wurde eingeschränkt, im anne versehentliche Ieberlastung der Server zu verhindern.",
        "delete-warning-toobig": "Diese Seite hoot miet meh ols $1 {{PLURAL:$1|Version|Versionen}} anne sehr lange Versionsgeschichte. Doas Läscha koan zu Sterunga eim Datenbankbetrieb fiehrn.",
        "rollback": "Zerrickesetza dar Änderunga",
-       "rollback_short": "Zerrickesetza",
        "rollbacklink": "Zerrickesetza",
        "rollbackfailed": "Zerrickesetza gescheitert",
        "cantrollback": "De Änderung koan ne zerrickegesetzt waan, do is kenne friehera Autoren gibt.",
        "import-interwiki-text": "Wähle a Wiki und anne Seite zum Importieren aus.\nDe Versionsdaten und Nutzernoama bleiba dabei erhaala.\nOlle Transwiki-Import-Aksjonna waan eim [[Special:Log/import|Import-Logbuch]] protokolliert.",
        "import-interwiki-history": "Olle Versionen dieser Seite importieren",
        "import-interwiki-templates": "Olle Vurloaga einschließen",
-       "import-interwiki-namespace": "Zielnoamasraum:",
        "import-upload-filename": "Dateinoame:",
        "importtext": "Uff dieser Spezialseyte kinna ieber de [[Special:Export|Exportfunktion]] eim Quellwiki exportierte Seyta ei dieses Wiki importiert waan.",
        "importstart": "Importiere Seite …",
        "import-token-mismatch": "Verlust dar Sessiondaten. Bitte versuche is erneut.",
        "import-invalid-interwiki": "Aus damm oagegahn'n Wiki ies kee Import meeglich.",
        "importlogpagetext": "Administrativer Import vu Seyta miet Versionsgeschichte vu andern Wikis.",
-       "import-logentry-upload": "hoot „[[$1]]“ vu a'r Datei importiert",
-       "import-logentry-interwiki": "hoot „$1“ importiert (Transwiki)",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|Version|Versiona}} vun $2",
        "tooltip-pt-userpage": "Denne Nutzerseyte",
        "tooltip-pt-anonuserpage": "Nutzerseite dar IP-Atresse vu dar aus du Änderunga durchfiehrst",
        "watchlisttools-view": "Beobachtungsliste: Änneronga",
        "watchlisttools-edit": "normal bearbta",
        "watchlisttools-raw": "eim Listenfurmat bearbta (Import/Export)",
-       "unknown_extension_tag": "Unbekennter Extension-Tag „$1“",
        "duplicate-defaultsort": "Ochtiche: Dar Sortierungsschlissel „$2“ ieberschreibt dann vorher verwendeta Schlissel „$1“.",
        "version-specialpages": "Spezialseyta",
        "version-other": "Oanderes",
index 137331a..25606f5 100644 (file)
        "passwordreset": "Ndrysho fjalkalimin",
        "passwordreset-text-one": "Plotësoni këtë formular për të marrë një fjalëkalim të përkohshëm nëpërmjet postës elektronike.",
        "passwordreset-text-many": "<span class=\"notranslate\" translate=\"asnjë\">{{PLURAL:$1|</span>Mbush një nga fushat për të marrë një fjalëkalim të përkohshëm nëpërmjet postës elektronike.}}",
-       "passwordreset-legend": "Ndrysho fjalkalimin",
        "passwordreset-disabled": "Rivendosja e fjalëkalimit është deaktivizuar në këtë wiki.",
        "passwordreset-emaildisabled": "Karakteristikat e  Email janë të paaftë në këtë wiki.",
        "passwordreset-username": "Nofka:",
        "action-siteadmin": "mbyll ose hap bazën e të dhënave",
        "action-sendemail": "dërgo e-maile",
        "nchanges": "$1 {{PLURAL:$1|ndryshim|ndryshime}}",
-       "recentchanges": "Ndryshime së fundmi",
+       "recentchanges": "Ndryshimet e fundit",
        "recentchanges-legend": "Zgjedhjet e ndryshimeve momentale",
        "recentchanges-summary": "Ndiqni ndryshime së fundmi tek kjo faqe.",
        "recentchanges-feed-description": "Ndjek ndryshimet më të fundit në wiki tek kjo fushë.",
        "nlinks": "$1 {{PLURAL:$1|lidhje|lidhje}}",
        "nmembers": "$1 {{PLURAL:$1|antar|antarë}}",
        "nrevisions": "$1 {{PLURAL:$1|version|versione}}",
-       "nviews": "$1 {{PLURAL:$1|shikim|shikime}}",
        "nimagelinks": "Përdorur në $1 {{PLURAL:$1|faqe|faqe}}",
        "ntransclusions": "përdorur në $1 {{PLURAL:$1|faqe|faqe}}",
        "specialpage-empty": "Kjo faqe është boshe.",
        "tooltip-pt-mycontris": "Lista e kontributeve tuaja",
        "tooltip-pt-login": "Identifikimi nuk është i detyrueshëm, megjithatë ne jua rekomandojmë.",
        "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.",
+       "tooltip-ca-talk": "Diskutim për përmbajtjen e faqes",
+       "tooltip-ca-edit": "Redakto këtë faqe",
        "tooltip-ca-addsection": "Fillo një temë të re diskutimi.",
        "tooltip-ca-viewsource": "Kjo faqe është e mbrojtur. Ju mundeni vetëm ta shikoni burimin e tekstit.",
        "tooltip-ca-history": "Versione të mëparshme të artikullit.",
index d828ff5..a3e903b 100644 (file)
@@ -26,7 +26,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Nemo bis",
-                       "Aktron"
+                       "Aktron",
+                       "Srdjan m"
                ]
        },
        "tog-underline": "Подвлачење веза:",
        "wrongpassword": "Унели сте неисправну лозинку. Покушајте поново.",
        "wrongpasswordempty": "Нисте унели лозинку. Покушајте поново.",
        "passwordtooshort": "Лозинка мора имати најмање {{PLURAL:$1|један знак|$1 знака|$1 знакова}}.",
+       "passwordtoolong": "Лозинке не могу бити дуже од {{PLURAL:$1|$1 знака|$1 знакова}}.",
        "password-name-match": "Лозинка се мора разликовати од корисничког имена.",
        "password-login-forbidden": "Коришћење овог корисничког имена и лозинке је забрањено.",
        "mailmypassword": "Ресетуј лозинку",
        "linksearch-pat": "Образац претраге:",
        "linksearch-ns": "Именски простор:",
        "linksearch-ok": "Претражи",
-       "linksearch-text": "Могу се користити џокери попут „*.wikipedia.org“.\nПотребан је највиши домен, као „*.org“.<br />\n{{PLURAL:$2|Подржан протокол|Подржани протоколи}}: <code>$1</code> (задаје http:// ако не наведете протокол).",
+       "linksearch-text": "Могу се користити џокери попут „*.wikipedia.org“.\nПотребан је највиши домен, као „*.org“.<br />\n{{PLURAL:$2|Подржан протокол|Подржани протоколи}}: $1 (задаје http:// ако не наведете протокол).",
        "linksearch-line": "$1 веза у $2",
        "linksearch-error": "Џокери се могу појавити само на почетку адресе.",
        "listusersfrom": "Прикажи кориснике почев од:",
        "rollback-success": "Враћене су измене {{GENDER:$1|корисника|кориснице}} $1\nна последњу измену {{GENDER:$2|корисника|кориснице}} $2.",
        "sessionfailure-title": "Сесија је окончана",
        "sessionfailure": "Изгледа да постоји проблем с вашом сесијом;\nова радња је отказана да би се избегла злоупотреба.\nВратите се на претходну страницу, поново је учитајте и покушајте поново.",
+       "changecontentmodel": "Промени модел садржаја странице",
+       "changecontentmodel-legend": "Промени модел садржаја",
+       "changecontentmodel-title-label": "Наслов странице",
+       "changecontentmodel-model-label": "Нови модел садржаја",
+       "changecontentmodel-reason-label": "Разлог:",
+       "changecontentmodel-success-title": "Модел садржаја је промењен",
+       "changecontentmodel-success-text": "Модел садржаја странице [[:$1]] је промењен.",
+       "changecontentmodel-cannot-convert": "Модел садржаја странице [[:$1]] се не може претворити у врсту $2.",
+       "changecontentmodel-title-cantexist": "Не може постојати страница на $1.",
+       "changecontentmodel-nodirectediting": "Модел садржаја $1 не подржава изравно уређивање",
+       "log-name-contentmodel": "Дневник промене модела садржаја",
+       "log-description-contentmodel": "Догађаји који имају везу са моделима садржаја страница",
+       "logentry-contentmodel-change": "$1 је {{GENDER:$2|променио|променила}} модел садржаја странице $3 из „$4“ у „$5“",
+       "logentry-contentmodel-change-revertlink": "врати",
        "protectlogpage": "Дневник закључавања",
        "protectlogtext": "Испод је списак заштићених страница.\nПогледајте [[Special:ProtectedPages|списак заштићених страница]] за више детаља.",
        "protectedarticle": "{{GENDER:|је заштитио|је заштитила}} „[[$1]]“",
        "prot_1movedto2": "је преместио [[$1]] на [[$2]]",
        "protect-badnamespace-title": "Незаштитљив именски простор",
        "protect-badnamespace-text": "Странице у овом именском простору се не могу заштитити.",
+       "protect-norestrictiontypes-text": "Ова страница се не може заштитити јер нема доступних врста ограничења.",
        "protect-norestrictiontypes-title": "Незаштитљива страна",
        "protect-legend": "Потврдите заштиту",
        "protectcomment": "Разлог:",
        "import-interwiki-history": "Копирај све верзије историје за ову страницу",
        "import-interwiki-templates": "Укључи све шаблоне",
        "import-interwiki-submit": "Увези",
+       "import-mapping-namespace": "Увези у именски простор:",
        "import-upload-filename": "Назив датотеке:",
        "import-comment": "Коментар:",
        "importtext": "Извезите датотеку с изворног викија користећи [[Special:Export|извоз]].\nСачувајте је на рачунар и пошаљите овде.",
        "tooltip-pt-logout": "Одјавите се",
        "tooltip-pt-createaccount": "Охрабрујемо вас да отворите налог и пријавите се али то није обавезно",
        "tooltip-ca-talk": "Разговор о страници са садржајем",
-       "tooltip-ca-edit": "Ð\9cожеÑ\82е Ð´Ð° Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98еÑ\82е Ð¾Ð²Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83. Ð\9aоÑ\80иÑ\81Ñ\82иÑ\82е Ð¿Ñ\80еÑ\82пÑ\80еглед Ð¿Ñ\80е Ñ\81нимаÑ\9aа",
+       "tooltip-ca-edit": "УÑ\80еди Ð¾Ð²Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83",
        "tooltip-ca-addsection": "Започните нови одељак",
        "tooltip-ca-viewsource": "Ова страница је закључана. Можете да видите изворни код.",
        "tooltip-ca-history": "Претходне верзије ове странице",
index a20d502..7c1e636 100644 (file)
@@ -17,7 +17,8 @@
                        "Михајло Анђелковић",
                        "לערי ריינהארט",
                        "아라",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Srdjan m"
                ]
        },
        "tog-underline": "Podvlačenje veza:",
        "delete-hook-aborted": "Brisanje je prekinula kuka.\nNije dato nikakvo obrazloženje.",
        "badtitle": "Neispravan naslov",
        "badtitletext": "Naslov stranice je neispravan, prazan ili je međujezički ili međuviki naslov pogrešno povezan.\nMožda sadrži znakove koji se ne mogu koristiti u naslovima.",
+       "title-invalid-characters": "Zatraženi naslov stranice sadrži neispravne znakove: „$1“.",
        "perfcached": "Sledeći podaci su keširani i mogu biti zastareli. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata|$1 rezultata}}.",
        "perfcachedts": "Sledeći podaci su keširani i poslednji put su ažurirani $2 u $3. U kešu {{PLURAL:$4|1=je dostupan najviše jedan rezultat|su dostupna najviše $4 rezultata|je dostupno najviše $4 rezultata}}.",
        "querypage-no-updates": "Ažuriranje ove stranice je trenutno onemogućeno.\nPodaci koji se ovde nalaze mogu biti zastareli.",
        "wrongpassword": "Uneli ste neispravnu lozinku. Pokušajte ponovo.",
        "wrongpasswordempty": "Niste uneli lozinku. Pokušajte ponovo.",
        "passwordtooshort": "Lozinka mora imati najmanje {{PLURAL:$1|jedan znak|$1 znaka|$1 znakova}}.",
+       "passwordtoolong": "Lozinke ne mogu biti duže od {{PLURAL:$1|jednog znaka|$1 znaka|$1 znakova}}.",
        "password-name-match": "Lozinka se mora razlikovati od korisničkog imena.",
        "password-login-forbidden": "Korišćenje ovog korisničkog imena i lozinke je zabranjeno.",
        "mailmypassword": "Resetuj lozinku",
        "notextmatches": "Nijedan tekst stranice ne odgovara",
        "prevn": "prethodnih {{PLURAL:$1|$1}}",
        "nextn": "sledećih {{PLURAL:$1|$1}}",
+       "prev-page": "prethodna stranica",
+       "next-page": "sledeća stranica",
        "prevn-title": "$1 {{PLURAL:$1|prethodni  rezultat|prethodna rezultata|prethodnih rezultata}}",
        "nextn-title": "$1 {{PLURAL:$1|sledeći rezultat|sledeća rezultata|sledećih rezultata}}",
        "shown-title": "Prikaži $1 {{PLURAL:$1|rezultat|rezultata|rezultata}} po stranici",
        "listfiles-delete": "obriši",
        "listfiles-summary": "Ova posebna stranica prikazuje sve poslate datoteke.",
        "listfiles_search_for": "Naziv datoteke:",
+       "listfiles-userdoesnotexist": "Korisnički nalog „$1“ nije registrovan.",
        "imgfile": "datoteka",
        "listfiles": "Spisak datoteka",
        "listfiles_thumb": "Minijatura",
        "randomincategory-nopages": "Nema stranica u kategoriji [[:Category:$1|$1]].",
        "randomincategory-category": "Kategorija:",
        "randomincategory-legend": "Slučajna stranica u kategoriji",
+       "randomincategory-submit": "Idi",
        "randomredirect": "Slučajno preusmerenje",
        "randomredirect-nopages": "Nema preusmerenja u imenskom prostoru „$1“.",
        "statistics": "Statistike",
        "linksearch-pat": "Obrazac pretrage:",
        "linksearch-ns": "Imenski prostor:",
        "linksearch-ok": "Pretraži",
-       "linksearch-text": "Mogu se koristiti džokeri poput „*.wikipedia.org“.\nPotreban je najviši domen, kao „*.org“.<br />\n{{PLURAL:$2|Podržan protokol|Podržani protokoli}}: <code>$1</code> (zadaje http:// ako ne navedete protokol).",
+       "linksearch-text": "Mogu se koristiti džokeri poput „*.wikipedia.org“.\nPotreban je najviši domen, kao „*.org“.<br />\n{{PLURAL:$2|Podržan protokol|Podržani protokoli}}: $1 (zadaje http:// ako ne navedete protokol).",
        "linksearch-line": "$1 veza u $2",
        "linksearch-error": "Džokeri se mogu pojaviti samo na početku adrese.",
        "listusersfrom": "Prikaži korisnike počev od:",
        "rollback-success": "Vraćene su izmene {{GENDER:$1|korisnika|korisnice}} $1\nna poslednju izmenu {{GENDER:$2|korisnika|korisnice}} $2.",
        "sessionfailure-title": "Sesija je okončana",
        "sessionfailure": "Izgleda da postoji problem s vašom sesijom;\nova radnja je otkazana da bi se izbegla zloupotreba.\nVratite se na prethodnu stranicu, ponovo je učitajte i pokušajte ponovo.",
+       "changecontentmodel": "Promeni model sadržaja stranice",
+       "changecontentmodel-legend": "Promeni model sadržaja",
+       "changecontentmodel-title-label": "Naslov stranice",
+       "changecontentmodel-model-label": "Novi model sadržaja",
+       "changecontentmodel-reason-label": "Razlog:",
+       "changecontentmodel-success-title": "Model sadržaja je promenjen",
+       "changecontentmodel-success-text": "Model sadržaja stranice [[:$1]] je promenjen.",
+       "changecontentmodel-cannot-convert": "Model sadržaja stranice [[:$1]] se ne može pretvoriti u vrstu $2.",
+       "changecontentmodel-title-cantexist": "Ne može postojati stranica na $1.",
+       "changecontentmodel-nodirectediting": "Model sadržaja $1 ne podržava izravno uređivanje",
+       "log-name-contentmodel": "Dnevnik promene modela sadržaja",
+       "log-description-contentmodel": "Događaji koji imaju vezu sa modelima sadržaja stranica",
+       "logentry-contentmodel-change": "$1 je {{GENDER:$2|promenio|promenila}} model sadržaja stranice $3 iz „$4“ u „$5“",
+       "logentry-contentmodel-change-revertlink": "vrati",
+       "logentry-contentmodel-change-revert": "vrati",
        "protectlogpage": "Dnevnik zaključavanja",
        "protectlogtext": "Ispod je spisak zaštićenih stranica.\nPogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za više detalja.",
        "protectedarticle": "{{GENDER:|je zaštitio|je zaštitila}} „[[$1]]“",
        "prot_1movedto2": "je premestio [[$1]] na [[$2]]",
        "protect-badnamespace-title": "Nezaštitljiv imenski prostor",
        "protect-badnamespace-text": "Stranice u ovom imenskom prostoru se ne mogu zaštititi.",
+       "protect-norestrictiontypes-text": "Ova stranica se ne može zaštititi jer nema dostupnih vrsta ograničenja.",
        "protect-norestrictiontypes-title": "Nezaštitljiva strana",
        "protect-legend": "Potvrdite zaštitu",
        "protectcomment": "Razlog:",
        "import": "Uvoz stranica",
        "importinterwiki": "Međuviki uvoz",
        "import-interwiki-text": "Izaberite viki i naslov stranice za uvoz.\nDatumi i imena urednika će biti sačuvani.\nSve radnje pri uvozu s drugih vikija su zabeležene u [[Special:Log/import|dnevniku uvoza]].",
+       "import-interwiki-sourcewiki": "Izvorna viki:",
+       "import-interwiki-sourcepage": "Izvorna stranica:",
        "import-interwiki-history": "Kopiraj sve verzije istorije za ovu stranicu",
        "import-interwiki-templates": "Uključi sve šablone",
        "import-interwiki-submit": "Uvezi",
+       "import-mapping-namespace": "Uvezi u imenski prostor:",
        "import-upload-filename": "Naziv datoteke:",
        "import-comment": "Komentar:",
        "importtext": "Izvezite datoteku s izvornog vikija koristeći [[Special:Export|izvoz]].\nSačuvajte je na računar i pošaljite ovde.",
index 10024ac..7935127 100644 (file)
        "resetpass-wrong-oldpass": "Uungultich tiedelk of aktuell Paaswoud.\nMuugelkerwiese hääst du dien Paaswoud al mäd Ärfoulch annerd of n näi tiedelk Paaswoud fräiged.",
        "resetpass-temp-password": "Tiedelk Paaswoud:",
        "passwordreset": "Paaswoud touräächsätte",
-       "passwordreset-legend": "Paaswoud touräächsätte",
        "passwordreset-disabled": "Dät Touräächsätten fon Paaswoude wuud in dissen Wiki deaktivierd.",
        "passwordreset-username": "Benutsernoome:",
        "passwordreset-domain": "Domain:",
        "unusedtemplateswlh": "Uur Ferbiendengen",
        "randompage": "Toufällige Siede",
        "randompage-nopages": "Der sunt neen Sieden in {{PLURAL:$2|dän foulgjende Noomensruum|do foulgjende Noomensruume}} äntheelden: „$1“",
+       "randomincategory-submit": "OK",
        "randomredirect": "Toufällige Fäärelaitenge",
        "randomredirect-nopages": "In dän Noomensruum \"$1\" sunt neen Fääreleedengen deer.",
        "statistics": "Statistik",
        "nlinks": "{{PLURAL:$1|1 Ferbiendenge|$1 Ferbiendengen}}",
        "nmembers": "{{PLURAL:$1|1 Iendraach|$1 Iendraage}}",
        "nrevisions": "{{PLURAL:$1|1 Beoarbaideng|$1 Beoarbaidengen}}",
-       "nviews": "{{PLURAL:$1|1 Oufroage|$1 Oufroagen}}",
        "nimagelinks": "Ferwoand ap $1 {{PLURAL:$1|Siede|Sieden}}",
        "ntransclusions": "ferwoand ap $1 {{PLURAL:$1|Siede|Sieden}}",
        "specialpage-empty": "Ju Siede änthaalt aktuell neen Iendraage.",
        "linksearch-pat": "Säikmuster:",
        "linksearch-ns": "Noomensruum:",
        "linksearch-ok": "Säike (012)",
-       "linksearch-text": "Disse Spezioalsiede moaket ju Säike muugelke ätter Sieden, in do bestimde Webferbiendengen äntheelden sunt. Deerbie konnen Ploatshooldere as biespilswiese <code>*.biespiell.de</code> benutsed wäide. Der mout ap minste een Top-Level-Domai, t.B. „*.org“. anroat wäide. <br />Unnerstutsede Protokolle: <code>$1</code> (Disse jädden nit bie ju Säikanfroage anreeke.)",
+       "linksearch-text": "Disse Spezioalsiede moaket ju Säike muugelke ätter Sieden, in do bestimde Webferbiendengen äntheelden sunt. Deerbie konnen Ploatshooldere as biespilswiese <code>*.biespiell.de</code> benutsed wäide. Der mout ap minste een Top-Level-Domai, t.B. „*.org“. anroat wäide. <br />Unnerstutsede Protokolle: $1 (Disse jädden nit bie ju Säikanfroage anreeke.)",
        "linksearch-line": "$1 is ferlinked fon $2",
        "linksearch-error": "Wildcards konnen bloot an dän Ounfang fon ju URL ferwoand wäide.",
        "listusersfrom": "Wies Benutsere fon:",
index 94ca2f1..94d56da 100644 (file)
        "passwordreset": "Setél ulang sandi",
        "passwordreset-text-one": "Eusian formulir ieu pikeun ngirimkeun kecap sandi saheulaanan kana surélék.",
        "passwordreset-text-many": "{{PLURAL:$1|Eusian salassahiji lapang pikeun nampa kecap sandi saheulaanan ngaliwatan ratron.}}",
-       "passwordreset-legend": "Setél ulang sandi",
        "passwordreset-disabled": "Dina ieu wiki, sandi teu bisa disetél ulang.",
        "passwordreset-emaildisabled": "Fitur surélék ditumpurkeun di ieu wiki.",
        "passwordreset-username": "Sandiasma:",
        "resettokens": "Rését token",
        "resettokens-text": "Anjeun bisa ngarését token sangkan bisa muka sababaraha data-data pribadi anu tumali jeung akun anjeun di dieu.\n\nAnjeun kudu ngarését lamun kungsi teu kahaja ngabéjaan anu séjén atawa lamun aya anu nyusup kana akun anjeun.",
        "resettokens-no-tokens": "Taya token pikeun dirését.",
-       "resettokens-legend": "Rését token",
        "resettokens-tokens": "Token:",
        "resettokens-token-label": "$1 (ajén ayeuna: $2)",
        "resettokens-watchlist-token": "Token pikeun asupan raramat (Atom/RSS) [[Special:Watchlist|parobahan kana kaca-kaca anu diponcorong]]",
        "nmembers": "$1 {{PLURAL:$1|kontributor|kontributor}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|anggota|anggota}}",
        "nrevisions": "$1 {{PLURAL:$1|révisi|révisi}}",
-       "nviews": "$1 {{PLURAL:$1|témbongan|témbongan}}",
        "nimagelinks": "Dipaké di $1 {{PLURAL:$1|kaca|kaca}}",
        "ntransclusions": "dipaké di $1 {{PLURAL:$1|kaca|kaca}}",
        "specialpage-empty": "Kaca ieu kosong.",
        "linksearch-pat": "Pola sungsi:",
        "linksearch-ns": "Spasi ngaran:",
        "linksearch-ok": "Sungsi",
-       "linksearch-text": "''Wildcard'' sarupaning \"*.wikipedia.org\" bisa dipaké.<br />Protokol nu dirojong: <code>$1</code>",
+       "linksearch-text": "''Wildcard'' sarupaning \"*.wikipedia.org\" bisa dipaké.<br />Protokol nu dirojong: $1",
        "linksearch-line": "$1 ditumbu ti $2",
        "linksearch-error": "''Wildcard'' ngan bisa némbongan dina awal ngaran indung (''host'').",
        "listusersfrom": "Témbongkeun kontributor dimimitian ku:",
index ed40df1..c4fb1be 100644 (file)
        "protectedinterface": "Denna sida innehåller text för mjukvarans gränssnitt på denna wiki, och är skrivskyddad för att förebygga missbruk.\nFör att lägga till eller ändra översättningar för alla wikis, var god använd [//translatewiki.net/ translatewiki.net], lokaliseringsprojektet för MediaWiki.",
        "editinginterface": "<strong>Varning:</strong> Du redigerar en sida som används för texten i gränssnittet.\nÄndringar på denna sida kommer att påverka användargränssnittets utseende för andra användare på denna wiki.",
        "translateinterface": "För att lägga till eller ändra översättningar för alla wikis, använd [//translatewiki.net/ translatewiki.net], lokaliseringsprojektet för MediaWiki.",
-       "cascadeprotected": "Den här sidan har skyddats från redigering eftersom den inkluderas på följande {{PLURAL:$1|sida|sidor}} som skrivskyddats med \"kaskaderande skydd\":\n$2",
+       "cascadeprotected": "Den här sidan har skyddats från redigering eftersom den inkluderas på följande {{PLURAL:$1|sida|sidor}} som skrivskyddats med \"kaskaderande\"-inställningen aktiverad:\n$2",
        "namespaceprotected": "Du har inte behörighet att redigera sidor i namnrymden '''$1'''.",
        "customcssprotected": "Du har inte behörighet att redigera denna CSS-sida eftersom den innehåller en annan användares personliga inställningar.",
        "customjsprotected": "Du har inte behörighet att redigera denna JavaScript-sida eftersom den innehåller en annan användares personliga inställningar.",
        "creating": "Skapar $1",
        "editingsection": "Redigerar $1 (avsnitt)",
        "editingcomment": "Redigerar $1 (nytt avsnitt)",
-       "editconflict": "Dina ändringar kunde inte sparas på grund av en redigeringskonflikt. Vill {{GENDER:|du}} lösa konflikten manuellt?",
+       "editconflict": "Redigeringskonflikt: $1",
        "explainconflict": "Någon har ändrat den här sidan efter att du började att redigera den.\nDen översta textrutan innehåller den nuvarande sparade versionen av texten.\nDin ändrade version visas i den nedre rutan.\nOm du vill spara dina ändringar så måste du infoga dem i den övre texten.\n'''Endast''' texten i den översta textrutan kommer att sparas när du trycker på \"{{int:savearticle}}\".",
        "yourtext": "Din text",
        "storedversion": "Den sparade versionen",
        "readonlywarning": "'''VARNING: Databasen är tillfälligt låst för underhåll. Du kommer inte att kunna spara dina ändringar just nu.\nDet kan vara klokt att kopiera texten till ett textdokument som sparas på din dator tills vidare.'''\n\nAdministratören som låste databasen gav följande förklaring: $1",
        "protectedpagewarning": "'''Varning: Den här sidan har låsts så att bara användare med administratörsrättigheter kan redigera den.'''\nDen senaste loggposten tillhandahålls nedan som referens:",
        "semiprotectedpagewarning": "'''Observera:''' Denna sida har låsts så att endast registrerade användare kan redigera den.\nDen senaste loggposten tillhandahålls nedan som referens:",
-       "cascadeprotectedwarning": "'''Varning:''' Den här sidan är låst så att bara användare med administratörsrättigheter kan redigera den, eftersom den är inkluderad på följande {{PLURAL:$1|sida|sidor}} som skyddats med kaskaderande skrivskydd:",
+       "cascadeprotectedwarning": "'''Varning:''' Den här sidan har låsts så att bara användare med administratörsrättigheter kan redigera den, eftersom den är inkluderad på följande {{PLURAL:$1|sida|sidor}} som skyddats med kaskaderande skrivskydd:",
        "titleprotectedwarning": "'''Varning: Denna sida har låsts så att [[Special:ListGroupRights|specifika rättigheter]] krävs för att skapa den.'''\nDen senaste loggposten tillhandahålls nedan som referens:",
        "templatesused": "{{PLURAL:$1|Mall|Mallar}} som används på den här sidan:",
        "templatesusedpreview": "{{PLURAL:$1|Mall|Mallar}} som används i denna förhandsgranskning:",
        "right-passwordreset": "Visa e-postmeddelanden med lösenordsåterställning",
        "right-managechangetags": "Skapa och radera [[Special:Tags|taggar]] från databasen",
        "right-applychangetags": "Tillämpa [[Special:Tags|taggar]] tillsammans med ens ändringar",
+       "right-changetags": "Lägg till och ta bort godtyckliga [[Special:Tags|märken]] på individuella sidversioner och loggposter.",
        "newuserlogpage": "Logg över nya användare",
        "newuserlogpagetext": "Detta är en logg över nya användarkonton.",
        "rightslog": "Användarrättighetslogg",
        "action-editcontentmodel": "ändra innehållsmodellen för en sida",
        "action-managechangetags": "skapa och radera taggar från databasen",
        "action-applychangetags": "tillämpa taggar tillsammans med dina ändringar",
+       "action-changetags": "lägg till och ta bort godtyckliga märken på individuella sidversioner och loggposter",
        "nchanges": "$1 {{PLURAL:$1|ändring|ändringar}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sedan senaste besöket}}",
        "enhancedrc-history": "historik",
        "uploaddisabledtext": "Uppladdning av filer är avstängd.",
        "php-uploaddisabledtext": "Filuppladdningar i PHP är avaktiverade. \nKolla inställningarna för file_uploads.",
        "uploadscripted": "Denna fil innehåller HTML eller script som felaktigt kan komma att tolkas av webbläsare.",
+       "upload-scripted-pi-callback": "Kan inte ladda upp en fil som innehåller instruktioner för behandling av XML-stylesheet.",
        "uploaded-script-svg": "Hittade skriptelementet \"$1\" i den uppladdade SVG-filen.",
        "uploaded-hostile-svg": "Hittade osäker CSS i den uppladdade filens stilelement.",
+       "uploaded-event-handler-on-svg": "Att ange event-handler-attribut <code>$1=\"$2\"</code> är inte tillåtet i SVG-filer.",
+       "uploaded-href-attribute-svg": "href-attribut <code>&lt;$1 $2=\"$3\"&gt;</code> med icke-lokala mål (t.ex. http://, javascript:, etc) tillåts inte i SVG filer.",
        "uploaded-href-unsafe-target-svg": "Hittade href till ett osäkert mål <code>&lt;$1 $2=\"$3\"&gt;</code> i den uppladdade SVG-filen.",
        "uploaded-animate-svg": "Hittades taggen \"animate\" som kan ändra href med hjälp av attributen \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> i den uppladdade SVG-filen.",
+       "uploaded-setting-event-handler-svg": "Att ange event-handler-attribut är blockerat. Hittade <code>&lt;$1 $2=\"$3\"&gt;</code> i den uppladdade SVG-filen.",
        "uploaded-setting-href-svg": "Användning av taggen \"set\" för att lägga till attributen \"href\" till överordnade element blockeras.",
+       "uploaded-wrong-setting-svg": "Användning av \"set\"-taggen för att lägga till ett remote-/data-/skriptmål till något attribut är blokerat. Hittade <code>&lt;set to=\"$1\"&gt;</code> i den uppladdade SVG-filen.",
+       "uploaded-setting-handler-svg": "SVG som anger \"handler\"-attributet med remote/data/skript är blockerat. Hittade <code>$1=\"$2\"</code> i den uppladdade SVG-filen.",
+       "uploaded-remote-url-svg": "SVG som anger style-attributet med en fjärr-URL är blockerat. Hittade <code>$1=\"$2\"</code> i den uppladdade SVG-filen.",
        "uploaded-image-filter-svg": "Hittade bildfilter med URL: <code>&lt;$1 $2=\"$3\"&gt;</code> i den uppladdade SVG-filen.",
        "uploadscriptednamespace": "Denna SVG-fil innehåller den ogiltiga namnrymden \"$1\".",
        "uploadinvalidxml": "XML-koden i den uppladdade filen kunde inte tolkas.",
        "linksearch-pat": "Sökmönster:",
        "linksearch-ns": "Namnrymd:",
        "linksearch-ok": "Sök",
-       "linksearch-text": "Jokertecken (wildcards) som t.ex. \"*.wikipedia.org\" kan användas.\nDet krävs åtminstone en toppdomän, t.ex. \"*.org\".<br />\n{{PLURAL:$2|Protokollet|Protokollen}} som stöds: <code>$1</code> (sätts till http:// om inget protokoll anges).",
+       "linksearch-text": "Jokertecken (wildcards) som t.ex. \"*.wikipedia.org\" kan användas.\nDet krävs åtminstone en toppdomän, t.ex. \"*.org\".<br />\n{{PLURAL:$2|Protokollet|Protokollen}} som stöds: $1 (sätts till http:// om inget protokoll anges).",
        "linksearch-line": "$1 länkas från $2",
        "linksearch-error": "Jokertecken kan bara användas i början av domännamnet.",
        "listusersfrom": "Visa användare från och med:",
        "rollback-success": "Återställde ändringar av $1;\nändrade tillbaka till senaste version av $2.",
        "sessionfailure-title": "Sessionsfel",
        "sessionfailure": "Något med din session som inloggad är på tok. Din begärda åtgärd har avbrutits, för att förhindra att någon kapar din session. Klicka på \"Tillbaka\" i din webbläsare och ladda om den sida du kom ifrån. Försök sedan igen.",
+       "changecontentmodel": "Ändra innehållsmodell för en sida",
+       "changecontentmodel-legend": "Ändra innehållsmodell",
        "changecontentmodel-title-label": "Sidtitel",
+       "changecontentmodel-model-label": "Ny innehållsmodell",
        "changecontentmodel-reason-label": "Orsak:",
+       "changecontentmodel-success-title": "Innehållsmodellen ändrades",
+       "changecontentmodel-success-text": "Innehållstypen för [[:$1]] har ändrats.",
+       "changecontentmodel-cannot-convert": "Innehållet på [[:$1]] kan inte konverteras till typen $2.",
+       "changecontentmodel-title-cantexist": "Det går inte att ha en sida på $1.",
+       "changecontentmodel-nodirectediting": "Innehållsmodellen $1 stöder inte direkt redigering",
+       "log-name-contentmodel": "Ändringslogg för innehållsmodellen",
+       "log-description-contentmodel": "Händelser som är relaterade till en sidas innehållsmodeller",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|ändrade}} innehållsmodellen för sidan $3 från \"$4\" till \"$5\"",
        "logentry-contentmodel-change-revertlink": "återställ",
        "logentry-contentmodel-change-revert": "återställ",
        "protectlogpage": "Skrivskyddslogg",
        "protect-locked-blocked": "Du kan inte ändra sidors skrivskydd medan du är blockerad.\nHär kan du se gällande skrivskyddsinställninger för sidan '''$1''':",
        "protect-locked-dblock": "Skrivskydd kan inte ändras då databasen är låst.\nNuvarande skrivskyddsinställning för sidan '''$1''' är:",
        "protect-locked-access": "Ditt konto har inte behörighet att ändra skrivskydd på sidor.\nNuvarande skrivskyddsinställning för sidan '''$1''' är:",
-       "protect-cascadeon": "Den här sidan är skrivskyddad eftersom den inkluderas på följande {{PLURAL:$1|sida|sidor}} som har ett kaskaderande skydd.\nÄndringar i skyddet för den här sidan kommer inte påverka det kaskaderande skyddet.",
+       "protect-cascadeon": "Den här sidan är skrivskyddad eftersom den inkluderas på följande {{PLURAL:$1|sida|sidor}} som har ett kaskaderande skydd aktiverat.\nÄndringar i skyddet för den här sidan kommer inte påverka det kaskaderande skyddet.",
        "protect-default": "Tillåt alla användare",
        "protect-fallback": "Kräv \"$1\"-behörighet",
        "protect-level-autoconfirmed": "Blockera nya och oregistrerade användare",
        "pageinfo-robot-index": "Tillåten",
        "pageinfo-robot-noindex": "Inte tillåten",
        "pageinfo-watchers": "Antal användare som bevakar sidan",
+       "pageinfo-visiting-watchers": "Antalet sidbevakare som har besökt senaste ändringar",
        "pageinfo-few-watchers": "Färre än $1 {{PLURAL:$1|bevakare}}",
        "pageinfo-redirects-name": "Antal omdirigeringar till denna sida",
        "pageinfo-subpages-name": "Undersidor till denna sida",
        "deletedwhileediting": "'''Varning''': Denna sida raderades efter att du började redigera!",
        "confirmrecreate": "Användaren [[User:$1|$1]] ([[User talk:$1|diskussion]]) raderade den här sidan efter att du började redigera den med motiveringen:\n: ''$2''\nBekräfta att du verkligen vill återskapa sidan.",
        "confirmrecreate-noreason": "Användare [[User:$1|$1]] ([[User talk:$1|diskussion]]) raderade den här sidan efter att du började redigera. Bekräfta att du verkligen vill återskapa sidan.",
-       "recreate": "Sidan har raderats sedan du började redigera. Tryck \"$1\" för att återskapa den.",
+       "recreate": "Återskapa",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Rensa denna sidas cache?",
        "confirm-purge-bottom": "Rensning av en sida tömmer cachen och tvingar fram den senaste versionen.",
        "htmlform-cloner-create": "Lägg till mer",
        "htmlform-cloner-delete": "Ta bort",
        "htmlform-cloner-required": "Det krävs minst ett värde.",
+       "htmlform-title-badnamespace": "[[:$1]] är inte i \"{{ns:$2}}\"-namnrymden.",
+       "htmlform-title-not-creatable": "\"$1\" är inte en sidtitel som kan skapas",
+       "htmlform-title-not-exists": "[[:$1]] finns inte.",
+       "htmlform-user-not-exists": "<strong>$1</strong> finns inte.",
+       "htmlform-user-not-valid": "<strong>$1</strong> är inte ett giltigt användarnamn.",
        "sqlite-has-fts": "$1 med stöd för fulltextsökning",
        "sqlite-no-fts": "$1 utan stöd för fulltextsökning",
        "logentry-delete-delete": "$1 {{GENDER:$2|raderade}} sidan $3",
index fb258dc..b565ada 100644 (file)
        "passwordreset": "Seti upya neno la siri",
        "passwordreset-text-one": "Jaza fomu hii kupokea neno la siri la muda kupitia barua pepe.",
        "passwordreset-text-many": "{{PLURAL:$1|Jaza katika moja ya mashamba kupokea neno la siri la muda kupitia barua pepe.}}",
-       "passwordreset-legend": "Seti upya neno la siri",
        "passwordreset-disabled": "Kuweka neno la siri jipya kumeshitishwa katika wiki hii.",
        "passwordreset-emaildisabled": "Vipengee vya barua pepe vimelemazwa katika wiki hii.",
        "passwordreset-username": "Jina la mtumiaji:",
        "changeemail-throttled": "Umejaribu mara nyingi sana kuingia.\nTafadhali subiri $1 kabla ya kujaribu tena.",
        "resettokens": "Weka vibazi upya",
        "resettokens-no-tokens": "Hakuna vibazi vya kuseti upya.",
-       "resettokens-legend": "Weka vibazi upya",
        "resettokens-tokens": "Vibazi:",
        "resettokens-token-label": "$1 (current value: $2)",
        "resettokens-done": "Seti vibazi upya.",
        "randomincategory-nopages": "Hakuna kurasa katika [[:Category:$1|$1]] jamii.",
        "randomincategory-category": "Kundi:",
        "randomincategory-legend": "Ukurasa wa bahati katika jamii",
+       "randomincategory-submit": "Enda",
        "randomredirect": "Elekezo la bahati",
        "randomredirect-nopages": "Hakuna maelekezo katika eneo la wiki la \"$1\".",
        "statistics": "Takwimu",
        "nmembers": "{{PLURAL:$1|kitu|vitu}} $1",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|member|wanachama}}",
        "nrevisions": "{{PLURAL:$1|pitio|mapitio}} $1",
-       "nviews": "{{PLURAL:$1|mtazamaji|mitazamaji}} $1",
        "nimagelinks": "Inatumika katika {{PLURAL:$1|ukurasa moja tu|kurasa $1}}",
        "ntransclusions": "inatumika katika {{PLURAL:$1|ukurasa moja tu|kurasa $1}}",
        "specialpage-empty": "Hakuna matokeo katika taarifa hii.",
        "linksearch-pat": "Herufi zitakazotafutwa:",
        "linksearch-ns": "Eneo la wiki:",
        "linksearch-ok": "Tafuta",
-       "linksearch-text": "Alama maalumu za kutafuta kama vile \"*.wikipedia.org\" zinaweza kutumika.<br />\nInahitajika angalau kikoa cha kiwango cha juu, kwa mfano \"*.org\".<br />\nItifaki zinazoungwa mkono: <code>$1</code> (usiongeza hizi unapotafuta).",
+       "linksearch-text": "Alama maalumu za kutafuta kama vile \"*.wikipedia.org\" zinaweza kutumika.<br />\nInahitajika angalau kikoa cha kiwango cha juu, kwa mfano \"*.org\".<br />\nItifaki zinazoungwa mkono: $1 (usiongeza hizi unapotafuta).",
        "linksearch-line": "$2 umeungwa kutoka $1",
        "linksearch-error": "Alama maalumu zinaweza kuonekana mwanzoni mwa URL tu.",
        "listusersfrom": "Onyesha watumiaji kuanzia:",
index 881e620..0cffa90 100644 (file)
        "resetpass-temp-password": "Tymczasowe hasło:",
        "resetpass-abort-generic": "Půmjyńańe hasła uostoła zatrzimane bez rozszyrzyńe.",
        "passwordreset": "Wyczyść hasło",
-       "passwordreset-legend": "Wyczyść hasło",
        "passwordreset-disabled": "No tyj wiki zamkńynto resytowańy hasył.",
        "passwordreset-username": "Mjano używacza:",
        "passwordreset-domain": "Domyna:",
        "nlinks": "$1 {{PLURAL:$1|link|linki|linkůw}}",
        "nmembers": "$1 {{PLURAL:$1|elyment|elymenty|elymentůw}}",
        "nrevisions": "$1 {{PLURAL:$1|wersja|wersje|wersjůw}}",
-       "nviews": "filowano $1 {{PLURAL:$1|roz|rozůw}}",
        "specialpage-empty": "Ta zajta je pusto.",
        "lonelypages": "Poćepńynte zajty",
        "lonelypagestext": "Do zajtůw půńiżyj ńy adresuje żodno inkszo zajta we {{SITENAME}}.",
        "linksearch-pat": "Wzorzec sznupańo",
        "linksearch-ns": "Przestrzyń mjan",
        "linksearch-ok": "Šnupej",
-       "linksearch-text": "Idźe użyć symbola wjeloznacznygo „*”. Lů bajszpila „*.wikipedia.org” spowoduje sznupańy za wszyjstkimi linkůma kere prowadzům ku důmyńy „wikipedia.org” a jeij poddůmyn.<br />\nUobsůgiwane protokoły: <code>$1</code>",
+       "linksearch-text": "Idźe użyć symbola wjeloznacznygo „*”. Lů bajszpila „*.wikipedia.org” spowoduje sznupańy za wszyjstkimi linkůma kere prowadzům ku důmyńy „wikipedia.org” a jeij poddůmyn.<br />\nUobsůgiwane protokoły: $1",
        "linksearch-line": "$1 link na zajće $2",
        "linksearch-error": "Symbola wjeloznacznygo idźe użyć yno na anfangu mjana hosta.",
        "listusersfrom": "Pokaž užytkowńikůw začynojůnc uod:",
index 397188b..eedd87b 100644 (file)
        "linksearch-pat": "వెతకాల్సిన నమూనా:",
        "linksearch-ns": "పేరుబరి:",
        "linksearch-ok": "వెతుకు",
-       "linksearch-text": "\"*.wikipedia.org\" వంటి వైల్డ్ కార్డులు వాడవచ్చు. కనీసం ఒక్కటైనా టాప్ లెవెల్ డొమెయిన్ ఉండాలి. ఉదా: \"*.org\".<br />ఉపయోగించుకోగల {{PLURAL:$2|ప్రోటోకోల్|ప్రోటోకోళ్లు}}: <code>$1</code> (ఏ ప్రోటోకోలునూ ఇవ్వకపోతే, http:// ను వాడబడుతుంది)",
+       "linksearch-text": "\"*.wikipedia.org\" వంటి వైల్డ్ కార్డులు వాడవచ్చు. కనీసం ఒక్కటైనా టాప్ లెవెల్ డొమెయిన్ ఉండాలి. ఉదా: \"*.org\".<br />ఉపయోగించుకోగల {{PLURAL:$2|ప్రోటోకోల్|ప్రోటోకోళ్లు}}: $1 (ఏ ప్రోటోకోలునూ ఇవ్వకపోతే, http:// ను వాడబడుతుంది)",
        "linksearch-line": "$2 నుండి $1కి లింకు ఉంది",
        "linksearch-error": "హోస్ట్‌నేముకు ముందు మాత్రమే వైల్డ్ కార్డులు వాడవచ్చు.",
        "listusersfrom": "వాడుకరులను ఇక్కడ నుండి చూపించు:",
index e346734..fc2bdc3 100644 (file)
        "resetpass-wrong-oldpass": "Гузарвожаи мувақат ё охир номӯътабар.\nМумкин аст, ки шумо аллакай гузарвожаатонро бо муваффақият тағйир дода бошед ё дархости як гузарвожаи мувақатӣ карда бошед.",
        "resetpass-temp-password": "Гузарвожаи муваққатӣ:",
        "passwordreset": "Тағйири гузарвожа",
-       "passwordreset-legend": "Тағйири гузарвожа",
        "passwordreset-username": "Номи корбарӣ:",
        "passwordreset-domain": "Домана:",
        "passwordreset-email": "Нишонаи почтаи электронӣ:",
        "changeemail-password": "Гузарвожаи Шумо дар {{SITENAME}}:",
        "changeemail-submit": "Ивази email",
        "resettokens-no-tokens": "Ягон нишона барои танзими муҷадад вуҷуд надорад.",
-       "resettokens-legend": "Танзими муҷадади нишона",
        "resettokens-tokens": "Нишонаҳо:",
        "resettokens-done": "Нишонаҳо тазим шуданд.",
        "resettokens-resetbutton": "Нишонаҳои интихобшуда танзим шаванд",
        "randompage": "Саҳифаи тасодуфӣ",
        "randompage-nopages": "Ҳеҷ саҳифае дар ин фазои ном мавҷуд нест.",
        "randomincategory": "Саҳифаи тасодуфӣ дар гурӯҳ",
+       "randomincategory-submit": "Бирав",
        "randomredirect": "Масири тасодуфӣ",
        "randomredirect-nopages": "Ҳеҷ саҳифаи тағйири масире дар ин фазои ном мавҷуд нест.",
        "statistics": "Омор\\Статистика",
        "nlinks": "$1 {{PLURAL:$1|пайванд|пайвандҳо}}",
        "nmembers": "$1 {{PLURAL:$1|узв}}",
        "nrevisions": "$1 {{PLURAL:$1|вироиш|вироиш}}",
-       "nviews": "$1 {{PLURAL:$1|намоиш|намоишҳо}}",
        "specialpage-empty": "Барои ин ҳисобот натиҷае вуҷуд надорад.",
        "lonelypages": "Саҳифаҳои ятим",
        "lonelypagestext": "Ба саҳифаҳои зерин дар дигар саҳифаи {{SITENAME}} пайванд дода нашудааст.",
        "linksearch-pat": "Ҷустуҷӯи нақш:",
        "linksearch-ns": "Фазоином:",
        "linksearch-ok": "Ҷустуҷӯ",
-       "linksearch-text": "Нишонаҳои монанди \"*.wikipedia.org\"-ро метавон истифода кард.<br />Протоколҳои пуштибонишуда: <code>$1</code>",
+       "linksearch-text": "Нишонаҳои монанди \"*.wikipedia.org\"-ро метавон истифода кард.<br />Протоколҳои пуштибонишуда: $1",
        "linksearch-line": "$1 дорои пайванд аз $2 аст",
        "linksearch-error": "Нишонаҳо фақат дар ибтидои номи мизбони интернетӣ метавонанд истифода шаванд.",
        "listusersfrom": "Намоиши корбарон бо шурӯъ аз:",
index 760949e..3ee9ca5 100644 (file)
        "unusedtemplates": "Şablonhoi istifodanaşuda",
        "unusedtemplateswlh": "digar pajvandho",
        "randompage": "Sahifai tasodufī",
+       "randomincategory-submit": "Birav",
        "randomredirect": "Masiri tasodufī",
        "statistics": "Omor\\Statistika",
        "statistics-header-pages": "Sahifai omor",
        "nlinks": "$1 {{PLURAL:$1|pajvand|pajvandho}}",
        "nmembers": "$1 {{PLURAL:$1|uzv}}",
        "nrevisions": "$1 {{PLURAL:$1|viroiş|viroiş}}",
-       "nviews": "$1 {{PLURAL:$1|namoiş|namoişho}}",
        "specialpage-empty": "Baroi in hisobot natiçae vuçud nadorad.",
        "lonelypages": "Sahifahoi jatim",
        "uncategorizedpages": "Sahifahoe, ki ba jagon gurūh doxil nestand",
        "linksearch-pat": "Çustuçūi naqş:",
        "linksearch-ns": "Fazoinom:",
        "linksearch-ok": "Çustuçū",
-       "linksearch-text": "Nişonahoi monandi \"*.wikipedia.org\"-ro metavon istifoda kard.<br />Protokolhoi puştibonişuda: <code>$1</code>",
+       "linksearch-text": "Nişonahoi monandi \"*.wikipedia.org\"-ro metavon istifoda kard.<br />Protokolhoi puştibonişuda: $1",
        "linksearch-line": "$1 doroi pajvand az $2 ast",
        "linksearch-error": "Nişonaho faqat dar ibtidoi nomi mizboni internetī metavonand istifoda şavand.",
        "listusersfrom": "Namoişi korbaron bo şurū' az:",
index d7b5dd4..e5bf3b6 100644 (file)
        "protectedinterface": "หน้านี้เป็นข้อความส่วนต่อประสานสำหรับซอฟต์แวร์บนวิกินี้ และถูกล็อกเพื่อป้องกันการกระทำผิด\nในการเพิ่มหรือเปลี่ยนแปลงการแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/ translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
        "editinginterface": "<strong>คำเตือน:</strong> คุณกำลังแก้ไขหน้าที่ใช้จัดหาข้อความอินเตอร์เฟซให้ซอฟต์แวร์\nการเปลี่ยนแปลงหน้านี้จะมีผลต่อสภาพปรากฏของส่วนต่อประสานผู้ใช้แก่ผู้ใช้อื่นบนวิกินี้",
        "translateinterface": "ในการเพิ่มหรือเปลี่ยนแปลงคำแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/ translatewiki.net] โครงการแปลเป็นภาษาถิ่นของมีเดียวิกิ",
-       "cascadeprotected": "หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81à¸\9bà¹\89อà¸\87à¸\81ัà¸\99มิà¹\83หà¹\89à¹\81à¸\81à¹\89à¹\84à¸\82 à¹\80à¸\9eราะà¸\96ูà¸\81รวมอยูà¹\88à¹\83à¸\99หà¸\99à¹\89าà¸\8bึà¹\88à¸\87à¸\96ูà¸\81ลà¹\87อà¸\81à¹\82à¸\94ยà¹\80à¸\9bิà¸\94à¸\95ัวà¹\80ลือà¸\81 \"à¸\97à¸\9aà¸\97ุà¸\81ลำà¸\94ัà¸\9aà¸\82ัà¹\89à¸\99\":\n$2",
+       "cascadeprotected": "หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81à¸\9bà¹\89อà¸\87à¸\81ัà¸\99มิà¹\83หà¹\89à¹\81à¸\81à¹\89à¹\84à¸\82 à¹\80à¸\9eราะà¸\96ูà¸\81รวมอยูà¹\88à¹\83à¸\99หà¸\99à¹\89าà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¸\8bึà¹\88à¸\87à¸\96ูà¸\81ลà¹\87อà¸\81à¹\82à¸\94ยà¹\80à¸\9bิà¸\94à¸\95ัวà¹\80ลือà¸\81 \"à¸\95à¹\88อà¹\80รียà¸\87\":\n$2",
        "namespaceprotected": "คุณไม่มีสิทธิแก้ไขหน้าในเนมสเปซ <strong>$1</strong>",
        "customcssprotected": "คุณไม่มีสิทธิแก้ไขหน้า CSS นี้ เพราะมีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
        "customjsprotected": "คุณไม่มีสิทธิแก้ไขหน้าจาวาสคริปต์นี้ เพราะหน้านี้มีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
        "createacct-yourpasswordagain": "ยืนยันรหัสผ่าน",
        "createacct-yourpasswordagain-ph": "กรอกรหัสผ่านอีกครั้ง",
        "remembermypassword": "จำการล็อกอินของฉันบนเบราเซอร์นี้ (นานสุด $1 วัน)",
-       "userlogin-remembermypassword": "ให้ฉันอยู่ในระบบ",
+       "userlogin-remembermypassword": "ให้ฉันอยู่ในระบบต่อ",
        "userlogin-signwithsecure": "ใช้การเชื่อมต่อที่ปลอดภัย",
        "yourdomainname": "โดเมนของคุณ:",
        "password-change-forbidden": "คุณไม่สามารถเปลี่ยนรหัสผ่านบนวิกินี้",
        "userlogin-loggedin": "คุณล็อกอินในชื่อ {{GENDER:$1|$1}} แล้ว\nใช้แบบด้านล่างเพื่อล็อกอินเป็นอีกผู้ใช้หนึ่ง",
        "userlogin-createanother": "สร้างอีกบัญชี",
        "createacct-emailrequired": "ที่อยู่อีเมล",
-       "createacct-emailoptional": "ที่อยู่อีเมล (เลือกไม่ใส่ได้)",
+       "createacct-emailoptional": "à¸\97ีà¹\88อยูà¹\88อีà¹\80มล (à¹\80ลือà¸\81à¹\84มà¹\88à¹\83สà¹\88à¸\81à¹\87à¹\84à¸\94à¹\89)",
        "createacct-email-ph": "กรอกที่อยู่อีเมลของคุณ",
        "createacct-another-email-ph": "กรอกที่อยู่อีเมล",
        "createaccountmail": "ใช้รหัสผ่านสุ่มชั่วคราวและส่งไปยังที่อยู่อีเมลที่ระบุ",
        "newarticle": "(ใหม่)",
        "newarticletext": "คุณตามลิงก์ไปยังหน้าที่ยังไม่มีในขณะนี้\nในการสร้างหน้า เริ่มพิมพ์ในกล่องด้านล่าง (ดูข้อมูลเพิ่มเติมใน[$1 หน้าคำอธิบาย])\nถ้าคุณเข้ามาหน้านี้โดยผิดพลาด ให้กดปุ่ม<strong>ถอยหลัง</strong> (back) ของเบราว์เซอร์",
        "anontalkpagetext": "----\n<em>หน้านี้เป็นหน้าคุยกับผู้ใช้สำหรับผู้ใช้นิรนามซึ่งยังไม่ได้สร้างหรือใช้บัญชี</em>\nดังนั้นเราจึงระบุตัวตนโดยใช้เลขที่อยู่ไอพีแทน\nเลขที่อยู่ไอพีนี้อาจมีผู้ใช้ร่วมกันหลายคน\nถ้าคุณเป็นผู้ใช้นิรนาม และรู้สึกว่าคุณได้รับความเห็นที่ไม่เกี่ยวข้องส่งหาคุณ กรุณา[[Special:UserLogin/signup|สร้างบัญชี]]หรือ[[Special:UserLogin|ล็อกอิน]] เพื่อป้องกันการสับสนกับผู้ใช้นิรนามรายอื่นในอนาคต",
-       "noarticletext": "ปัจจุบันไม่มีข้อความในหน้านี้\nคุณสามารถ[[Special:Search/{{PAGENAME}}|ค้นหาชื่อหน้านี้]]ในหน้าอื่น <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ค้นหาปูมที่เกี่ยวข้อง] หรือ[{{fullurl:{{FULLPAGENAME}}|action=edit}} แก้ไขหน้านี้]</span>",
+       "noarticletext": "à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¹\84มà¹\88มีà¸\82à¹\89อà¸\84วามà¹\83à¸\99หà¸\99à¹\89าà¸\99ีà¹\89\nà¸\84ุà¸\93สามารà¸\96[[Special:Search/{{PAGENAME}}|à¸\84à¹\89à¸\99หาà¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89]]à¹\83à¸\99หà¸\99à¹\89าอืà¹\88à¸\99 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} à¸\84à¹\89à¸\99หาà¸\9bูมà¸\97ีà¹\88à¹\80à¸\81ีà¹\88ยวà¸\82à¹\89อà¸\87] à¸«à¸£à¸·à¸­[{{fullurl:{{FULLPAGENAME}}|action=edit}} à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\99ีà¹\89]</span>",
        "noarticletext-nopermission": "ปัจจุบันไม่มีข้อความในหน้านี้\nคุณสามารถ[[Special:Search/{{PAGENAME}}|ค้นหาชื่อหน้านี้]]ในหน้าอื่น หรือ<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ค้นหาปูมที่เกี่ยวข้อง]</span> แต่คุณไม่มีสิทธิสร้างหน้านี้",
        "missing-revision": "ไม่มีรุ่นปรับปรุง #$1 ของหน้าชื่อ \"{{FULLPAGENAME}}\" \n\nปกติเกิดจากการตามการโยงประวัติเก่าไปยังหน้าที่ถูกลบแล้ว\nดูรายละเอียดได้ที่[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
        "userpage-userdoesnotexist": "บัญชีผู้ใช้ \"$1\" มิได้ลงทะเบียน \nกรุณาตรวจสอบหากคุณต้องการสร้าง/แก้ไขหน้านี้",
        "readonlywarning": "<strong>คำเตือน: ฐานข้อมูลถูกล็อกเพื่อบำรุงรักษา คุณจึงไม่สามารถบันทึกการเปลี่ยนแปลงของคุณได้ในขณะนี้</strong>\nคุณอาจต้องการคัดลอกและวางข้อความของคุณในไฟล์ข้อความ และบันทึกไว้ภายหลัง\n\nผู้ดูแลระบบที่ล็อกฐานข้อมูลให้คำอธิบายดังนี้: $1",
        "protectedpagewarning": "<strong>คำเตือน: หน้านี้ถูกล็อก เพื่อให้เฉพาะผู้ใช้ที่มีสิทธิผู้ดูแลระบบแก้ไขได้เท่านั้น</strong>\nรายการปูมล่าสุดจัดไว้ด้านล่างเพื่อการอ้างอิง:",
        "semiprotectedpagewarning": "<strong>หมายเหตุ:</strong> หน้านี้ถูกล็อก เพื่อให้เฉพาะผู้ใช้ลงทะเบียนสามารถแก้ไขเท่านั้น\nรายการปูมล่าสุดได้จัดไว้ด้านล่างนี้เพื่อการอ้างอิง",
-       "cascadeprotectedwarning": "<strong>คำเตือน:</strong> หน้านี้ถูกล็อก และแก้ไขได้เฉพาะผู้ใช้ที่มีสิทธิผู้ดูแลระบบเท่านั้น เนื่องจากหน้านี้สืบทอดการล็อกมาจาก{{PLURAL:$1|หน้า|หน้า}}ต่อไปนี้:",
+       "cascadeprotectedwarning": "<strong>คำเตือน:</strong> หน้านี้ถูกล็อก และแก้ไขได้เฉพาะผู้ใช้ที่มีสิทธิผู้ดูแลระบบ เนื่องจากหน้านี้รวมอยู่ใน{{PLURAL:$1|หน้า}}ที่ถูกล็อกแบบต่อเรียงต่อไปนี้:",
        "titleprotectedwarning": "<strong>คำเตือน: หน้านี้ได้รับการป้องกัน สร้างได้เฉพาะผู้ใช้ที่มี[[Special:ListGroupRights|สิทธิจำเพาะ]]เท่านั้น</strong>\nรายการปูมล่าสุดถูกแสดงไว้ด้านล่างเพื่อการอ้างอิง",
        "templatesused": "{{PLURAL:$1|แม่แบบ}}ที่ใช้ในหน้านี้:",
        "templatesusedpreview": "{{PLURAL:$1|แม่แบบ}}ที่ใช้ในตัวอย่างนี้:",
        "permissionserrorstext": "คุณไม่มีสิทธิทำเช่นนั้น เนื่องจาก{{PLURAL:$1|เหตุผล|เหตุผล}}ต่อไปนี้:",
        "permissionserrorstext-withaction": "คุณไม่มีสิทธิ$2 ด้วย{{PLURAL:$1|เหตุ|เหตุ}}ต่อไปนี้:",
        "recreate-moveddeleted-warn": "<strong>คำเตือน: คุณกำลังสร้างหน้าซึ่งได้ถูกลบไปก่อนหน้านี้แล้วอีกครั้ง</strong>\n\nคุณควรพิจารณาว่าการแก้ไขหน้านี้ต่อไปเหมาะสมหรือไม่\nปูมการลบและเปลี่ยนชื่อหน้านี้จัดไว้ด้านล่างเพื่อความสะดวก:",
-       "moveddeleted-notice": "หน้านี้ถูกลบ\nปูมการลบและเปลี่ยนชื่อของหน้านี้แสดงไว้ด้านล่างเพื่ออ้างอิง",
+       "moveddeleted-notice": "หน้านี้ถูกลบแล้ว\nปูมการลบและเปลี่ยนชื่อของหน้านี้แสดงไว้ด้านล่างเพื่ออ้างอิง",
        "log-fulllog": "ดูปูมแบบเต็ม",
        "edit-hook-aborted": "การแก้ไขถูกฮุกยกเลิก\nไม่ได้ให้คำอธิบาย",
        "edit-gone-missing": "ไม่สามารถปรับหน้าดังกล่าวได้\nดูเหมือนถูกลบแล้ว",
        "right-ipblock-exempt": "เลี่ยงการบล็อกเลขที่อยู่ไอพี บล็อกอัตโนมัติ และบล็อกช่วง",
        "right-proxyunbannable": "เลี่ยงการบล็อกอัตโนมัติของพร็อกซี",
        "right-unblockself": "ปลดบล็อกตนเอง",
-       "right-protect": "à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81à¹\81ละà¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81ลà¹\87อà¸\81à¹\81à¸\9aà¸\9aà¸\96à¹\88ายà¸\97อà¸\94",
+       "right-protect": "à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81à¹\81ละà¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81ลà¹\87อà¸\81à¹\81à¸\9aà¸\9aà¸\95à¹\88อà¹\80รียà¸\87",
        "right-editprotected": "แก้ไขหน้าที่ถูกล็อกในฐานะ \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "แก้ไขหน้าที่ถูกล็อกในฐานะ \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "แก้ไขตัวแบบเนื้อหาของหน้า",
        "recentchangeslinked-feed": "ปรับปรุงที่เกี่ยวโยง",
        "recentchangeslinked-toolbox": "การปรับปรุงที่เกี่ยวโยง",
        "recentchangeslinked-title": "การปรับปรุงที่โยงกับ \"$1\"",
-       "recentchangeslinked-summary": "นี่คือรายการเปลี่ยนแปลงล่าสุดของหน้าที่ถูกลิงก์จากหน้าเฉพาะ (หรือไปสมาชิกของหมวดหมู่เฉพาะ)\nหน้าใน[[Special:Watchlist|รายการเฝ้าดู]]แสดงเป็น<strong>ตัวหนา</strong>",
+       "recentchangeslinked-summary": "นี่คือรายการเปลี่ยนแปลงล่าสุดของหน้าที่ถูกลิงก์จากหน้าเฉพาะ (หรือไปสมาชิกของหมวดหมู่เฉพาะ)\nหน้าใน[[Special:Watchlist|รายการเฝ้าดูของคุณ]]แสดงเป็น<strong>ตัวหนา</strong>",
        "recentchangeslinked-page": "ชื่อหน้า:",
        "recentchangeslinked-to": "แสดงการเปลี่ยนแปลงไปหน้าซึ่งโยงไปหน้าที่ระบุแทน",
        "upload": "อัปโหลดไฟล์",
        "protectedpages": "หน้าที่ถูกล็อก",
        "protectedpages-indef": "เฉพาะการล็อกแบบไม่มีกำหนด",
        "protectedpages-summary": "หน้านี้แสดงรายการหน้าที่มีอยู่ซึ่งปัจจุบันถูกล็อก สำหรับรายการชื่อเรื่องที่ถูกป้องกันมิให้สร้าง ดู [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]",
-       "protectedpages-cascade": "à¹\80à¸\89à¸\9eาะà¸\81ารลà¹\87อà¸\81à¹\81à¸\9aà¸\9aสืà¸\9aà¸\97อà¸\94",
+       "protectedpages-cascade": "à¹\80à¸\89à¸\9eาะà¸\81ารลà¹\87อà¸\81à¹\81à¸\9aà¸\9aà¸\95à¹\88อà¹\80รียà¸\87",
        "protectedpages-noredirect": "ซ่อนการเปลี่ยนทาง",
        "protectedpagesempty": "ขณะนี้ไม่มีหน้าถูกล็อกตามพารามิเตอร์เหล่านี้",
        "protectedpages-timestamp": "ตราเวลา",
        "linksearch-pat": "รูปแบบการค้นหา:",
        "linksearch-ns": "เนมสเปซ:",
        "linksearch-ok": "ค้นหา",
-       "linksearch-text": "สามารถใช้ตัวแทนเช่น \"*.wikipedia.org\" ได้\nต้องการโดเมนระดับบนสุดเป็นอย่างน้อย เช่น \"*.org\"<br />\n{{PLURAL:$2|โพรโทคอล}}ที่รองรับ: <code>$1</code> (ค่าโดยปริยายเป็น http:// หากไม่ระบุโพรโทคอล)",
+       "linksearch-text": "สามารถใช้ตัวแทนเช่น \"*.wikipedia.org\" ได้\nต้องการโดเมนระดับบนสุดเป็นอย่างน้อย เช่น \"*.org\"<br />\n{{PLURAL:$2|โพรโทคอล}}ที่รองรับ: $1 (ค่าโดยปริยายเป็น http:// หากไม่ระบุโพรโทคอล)",
        "linksearch-line": "$1 ถูกลิงก์จาก $2",
        "linksearch-error": "อักขระตัวแทนอยู่ได้เฉพาะหน้าชื่อโฮสต์เท่านั้น",
        "listusersfrom": "แสดงผู้ใช้เริ่มจาก:",
        "protect-locked-blocked": "ไม่สามารถเปลี่ยนระดับการล็อกหน้าขณะถูกบล็อกได้ \nการตั้งค่าปัจจุบันของหน้า <strong>$1</strong> คือ:",
        "protect-locked-dblock": "ไม่สามารถเปลี่ยนระดับการล็อกได้เนื่องจากฐานข้อมูลกำลังถูกล็อก \nการตั้งค่าปัจจุบันของหน้า <strong>$1</strong> คือ:",
        "protect-locked-access": "บัญชีของคุณไม่มีสิทธิเปลี่ยนแปลงระดับการล็อกหน้า \nการตั้งค่าปัจจุบันของหน้า <strong>$1</strong> คือ:",
-       "protect-cascadeon": "à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81ลà¹\87อà¸\81à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81รวมอยูà¹\88à¹\83à¸\99{{PLURAL:$1|หà¸\99à¹\89า|หà¸\99à¹\89า}}à¸\97ีà¹\88à¹\80à¸\9bิà¸\94à¸\81ารลà¹\87อà¸\81à¹\81à¸\9aà¸\9aสืà¸\9aà¸\97อà¸\94\nà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¸\88ะà¹\84มà¹\88มีà¸\9cลà¸\95à¹\88อà¸\81ารลà¹\87อà¸\81à¹\81à¸\9aà¸\9aสืà¸\9aà¸\97อà¸\94",
+       "protect-cascadeon": "à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81ลà¹\87อà¸\81à¹\80à¸\9eราะรวมอยูà¹\88à¹\83à¸\99{{PLURAL:$1|หà¸\99à¹\89า}}à¸\97ีà¹\88à¹\80à¸\9bิà¸\94à¸\81ารลà¹\87อà¸\81à¹\81à¸\9aà¸\9aà¸\95à¹\88อà¹\80รียà¸\87\nà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¸\88ะà¹\84มà¹\88มีà¸\9cลà¸\95à¹\88อà¸\81ารลà¹\87อà¸\81à¹\81à¸\9aà¸\9aà¸\95à¹\88อà¹\80รียà¸\87",
        "protect-default": "อนุญาตผู้ใช้ทั้งหมด",
        "protect-fallback": "อนุญาตเฉพาะผู้ใช้ที่มีสิทธิ \"$1\"",
        "protect-level-autoconfirmed": "อนุญาตเฉพาะผู้ใช้ยืนยันอัตโนมัติ",
        "protect-level-sysop": "อนุญาตเฉพาะผู้ดูแลระบบ",
-       "protect-summary-cascade": "สืà¸\9aà¸\97อà¸\94",
+       "protect-summary-cascade": "à¸\95à¹\88อà¹\80รียà¸\87",
        "protect-expiring": "หมดอายุ $1 (UTC)",
        "protect-expiring-local": "หมดอายุ $1",
        "protect-expiry-indefinite": "ไม่มีกำหนด",
-       "protect-cascade": "ลà¹\87อà¸\81หà¸\99à¹\89าà¸\97ีà¹\88à¹\80à¸\9bà¹\87à¸\99รวมอยูà¹\88à¹\83à¸\99หà¸\99à¹\89าà¸\99ีà¹\89 (ลà¹\87อà¸\81à¹\81à¸\9aà¸\9aสืà¸\9aà¸\97อà¸\94)",
+       "protect-cascade": "ลà¹\87อà¸\81หà¸\99à¹\89าà¸\97ีà¹\88รวมอยูà¹\88à¹\83à¸\99หà¸\99à¹\89าà¸\99ีà¹\89 (ลà¹\87อà¸\81à¹\81à¸\9aà¸\9aà¸\95à¹\88อà¹\80รียà¸\87)",
        "protect-cantedit": "คุณไม่สามารถเปลี่ยนระดับการล็อกของหน้านี้ เพราะคุณไม่มีสิทธิแก้ไข",
        "protect-othertime": "เวลาอื่น:",
        "protect-othertime-op": "เวลาอื่น",
        "namespace_association": "เนมสเปซที่เกี่ยวข้อง",
        "tooltip-namespace_association": "เลือกกล่องนี้เพื่อรวมเนมสเปซพูดคุยหรือหัวข้อที่เกี่ยวข้องกับเนมสเปซที่เลือกด้วย",
        "blanknamespace": "(หลัก)",
-       "contributions": "à¹\80รืà¹\88อà¸\87à¸\97ีà¹\88{{GENDER:$1|à¸\9cูà¹\89à¹\83à¸\8aà¹\89}}รายà¸\99ีà¹\89à¹\80à¸\82ียà¸\99",
+       "contributions": "เรื่องที่{{GENDER:$1|ผู้ใช้}}นี้เขียน",
        "contributions-title": "เรื่องที่เขียนโดย $1",
        "mycontris": "เรื่องที่เขียน",
        "contribsub2": "สำหรับ {{GENDER:$3|$1}} ($2)",
        "tooltip-pt-preferences": "การตั้งค่าของคุณ",
        "tooltip-pt-watchlist": "รายการหน้าที่คุณกำลังเฝ้าดูการเปลี่ยนแลปง",
        "tooltip-pt-mycontris": "รายการหน้าที่คุณเขียน",
-       "tooltip-pt-login": "à¹\84มà¹\88à¸\88ำà¹\80à¸\9bà¹\87à¸\99à¸\95à¹\89อà¸\87ลà¹\87อà¸\81อิà¸\99 à¹\81à¸\95à¹\88à¹\81à¸\99ะà¸\99ำอยà¹\88าà¸\87ยิà¹\88à¸\87à¹\83หà¹\89ลà¹\87อà¸\81อิà¸\99",
+       "tooltip-pt-login": "สà¸\99ัà¸\9aสà¸\99ุà¸\99à¹\83หà¹\89à¸\84ุà¸\93ลà¹\87อà¸\81อิà¸\99 à¹\81à¸\95à¹\88à¹\84มà¹\88à¸\9aัà¸\87à¸\84ัà¸\9a",
        "tooltip-pt-logout": "ล็อกเอาต์",
        "tooltip-pt-createaccount": "สนับสนุนให้คุณสร้างบัญชีและล็อกอิน แต่ไม่บังคับ",
        "tooltip-ca-talk": "อภิปรายเกี่ยวกับหน้าเนื้อหา",
        "tooltip-n-recentchanges": "รายการปรับปรุงล่าสุดในวิกินี้",
        "tooltip-n-randompage": "โหลดหน้าสุ่ม",
        "tooltip-n-help": "อธิบายการใช้งาน",
-       "tooltip-t-whatlinkshere": "รายà¸\81ารà¸\97ุà¸\81หà¸\99à¹\89าวิà¸\81ิที่ลิงก์มาที่นี่",
+       "tooltip-t-whatlinkshere": "รายà¸\81ารหà¸\99à¹\89าวิà¸\81ิà¸\97ุà¸\81หà¸\99à¹\89าที่ลิงก์มาที่นี่",
        "tooltip-t-recentchangeslinked": "รายการปรับปรุงล่าสุดในหน้าที่ลิงก์จากหน้านี้",
        "tooltip-feed-rss": "ฟีดชนิดอาร์เอสเอส (RSS) ของหน้านี้",
        "tooltip-feed-atom": "ฟีดอะตอม (Atom) ของหน้านี้",
        "tooltip-t-upload": "อัปโหลดไฟล์",
        "tooltip-t-specialpages": "รายการหน้าพิเศษทั้งหมด",
        "tooltip-t-print": "รุ่นที่พร้อมพิมพ์ของหน้านี้",
-       "tooltip-t-permalink": "ลิà¸\87à¸\81à¹\8cà¸\96าวรมาà¸\97ีà¹\88à¹\80à¸\89à¸\9eาะรุà¹\88à¸\99à¸\99ีà¹\89à¸\82อà¸\87หà¸\99à¹\89า",
+       "tooltip-t-permalink": "ลิงก์ถาวรมารุ่นนี้ของหน้า",
        "tooltip-ca-nstab-main": "ดูหน้าเนื้อหา",
        "tooltip-ca-nstab-user": "ดูหน้าผู้ใช้",
        "tooltip-ca-nstab-media": "ดูหน้าสื่อ ภาพ เพลง",
        "tooltip-minoredit": "ทำเครื่องหมายเป็นการแก้ไขเล็กน้อย",
        "tooltip-save": "บันทึกการแก้ไขของคุณ",
        "tooltip-preview": "แสดงตัวอย่างการเปลี่ยนแปลงของคุณ กรุณาใช้คำสั่งนี้ก่อนบันทึก!",
-       "tooltip-diff": "à¹\81สà¸\94à¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\81ารต่อข้อความ",
+       "tooltip-diff": "à¹\81สà¸\94à¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\97ีà¹\88à¸\84ุà¸\93à¸\97ำต่อข้อความ",
        "tooltip-compareselectedversions": "แสดงความแตกต่างระหว่างสองรุ่นที่เลือกของหน้านี้",
        "tooltip-watch": "เพิ่มหน้านี้เข้ารายการเฝ้าดู",
        "tooltip-watchlistedit-normal-submit": "ลบชื่อเรื่องออก",
        "pageinfo-redirectsto": "เปลี่ยนทางไป",
        "pageinfo-contentpage": "นับเป็นหน้าเนื้อหา",
        "pageinfo-contentpage-yes": "ใช่",
-       "pageinfo-protect-cascading": "à¸\81ารลà¹\87อà¸\81à¸\97ีà¹\88สืà¸\9aà¸\97อà¸\94จากหน้านี้",
+       "pageinfo-protect-cascading": "à¸\81ารลà¹\87อà¸\81à¸\97ีà¹\88à¸\95à¹\88อà¹\80รียà¸\87จากหน้านี้",
        "pageinfo-protect-cascading-yes": "ใช่",
-       "pageinfo-protect-cascading-from": "à¸\81ารลà¹\87อà¸\81สืà¸\9aà¸\97อà¸\94จาก",
+       "pageinfo-protect-cascading-from": "à¸\81ารลà¹\87อà¸\81à¸\95à¹\88อà¹\80รียà¸\87จาก",
        "pageinfo-category-info": "สารสนเทศหมวดหมู่",
        "pageinfo-category-total": "จำนวนสมาชิกรวม",
        "pageinfo-category-pages": "จำนวนหน้า",
index 9d7ebe9..9e88060 100644 (file)
        "resetpass-wrong-oldpass": "Nädogry wagtlaýyn ýa-da häzirki parol.\nParolyňyzy eýýäm şowlulyk bilen üýtgeden ýa-da täze wagtlaýyn parol talap eden bolmagyňyz ahmal.",
        "resetpass-temp-password": "Wagtlaýyn parol:",
        "passwordreset": "Paroly nol et",
-       "passwordreset-legend": "Paroly nol et",
        "passwordreset-username": "Ulanyjy ady:",
        "passwordreset-domain": "Domen:",
        "passwordreset-emailelement": "Ulanyjy ady: $1\nWagtlaýyn parol: $2",
        "unusedtemplateswlh": "başga çykgytlar",
        "randompage": "Çemgeldik sahypa",
        "randompage-nopages": "Aşakdaky {{PLURAL:$2|at giňişliginde|at giňişliklerinde}} hiç hili sahypa ýok: $1.",
+       "randomincategory-submit": "Git",
        "randomredirect": "Mesaýy gönükdirme",
        "randomredirect-nopages": "\"$1\" at giňişliginde hiç hili gönükdirme ýok.",
        "statistics": "Statistika",
        "nlinks": "$1 {{PLURAL:$1|çykgyt|çykgyt}}",
        "nmembers": "{{PLURAL:$1|agza|agzalar}}",
        "nrevisions": "{{PLURAL:$1|wersiýa|wersiýalar}}",
-       "nviews": "$1 {{PLURAL:$1|synlama|synlama}}",
        "specialpage-empty": "Bu habarnama üçin hiç hili netije ýok.",
        "lonelypages": "Hossarsyz sahypalar",
        "lonelypagestext": "Aşakdaky sahypalara {{SITENAME}} saýtyndaky başga sahypalardan çykgyt berilmändir ýa-da olara atanaklaýyn girizilmändirler.",
        "linksearch-pat": "Gözleg şablony:",
        "linksearch-ns": "At giňişligi:",
        "linksearch-ok": "Gözle",
-       "linksearch-text": "\"*.wikipedia.org\" ýaly çalşyrma simwollar ulanylyp bilner.<br />\nGoldanylýan protokollar: <code>$1</code>",
+       "linksearch-text": "\"*.wikipedia.org\" ýaly çalşyrma simwollar ulanylyp bilner.<br />\nGoldanylýan protokollar: $1",
        "linksearch-line": "$1 sahypasyna $2 sahypasyndan çykgyt berilýär",
        "linksearch-error": "Çalşyrma simwollar diňe hostuň adynyň başlangyjynda peýda bolup bilýär.",
        "listusersfrom": "Şunuň bilen başlaýan ulanyjylary görkez:",
index 5a26f69..338fa0b 100644 (file)
        "createacct-benefit-heading": "{{SITENAME}} ay nilikha ng mga taong iyong katulad.",
        "createacct-benefit-body1": "{{PLURAL:$1|pagbabago|mga pagbabago}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pahina|mga pahina}}",
-       "createacct-benefit-body3": "kamakailang {{PLURAL:$1|nag-ambag|mga nag-ambag}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|kamakailang taga-ambag|mga kamakailang taga-ambag}}",
        "badretype": "Hindi magkatugma ang ipinasok mong mga password.",
        "userexists": "May gumagamit na ng ipinasok na bansag.\nPumili po ng ibang pangalan.",
        "loginerror": "Kamalian sa paglagda",
        "passwordreset": "Muling pagtatakda ng password",
        "passwordreset-text-one": "Ikumpleto ang form na ito upang makatanggap ng pansamantalang password sa pamamagitan ng email.",
        "passwordreset-text-many": "{{PLURAL:$1|Ipasok sa isa sa mga field upang makatanggap ng isang pansamantalang password sa pamamagitan ng email.}}",
-       "passwordreset-legend": "Itakdang muli ang password",
        "passwordreset-disabled": "Hindi pinagagana sa wiking ito ang muling mga pagtatakda ng password.",
        "passwordreset-emaildisabled": "Hindi pinagana ang email features sa wiking ito.",
        "passwordreset-username": "Pangalan ng tagagamit:",
        "currentrev": "Pangkasalukuyang pagbabago",
        "currentrev-asof": "Pangkasalukuyang pagbabago mula noong $1",
        "revisionasof": "Pagbabago mula noong $1",
-       "revision-info": "Pagbabago mula noong $1 ni $2",
+       "revision-info": "Pagbabago mula noong $1 ni {{GENDER:$6|$2}}$7",
        "previousrevision": "← Lumang pagbabago",
        "nextrevision": "Bagong pagbabago →",
        "currentrevisionlink": "Pangkasalukuyang pagbabago",
        "unusedtemplateswlh": "ibang mga ugnay",
        "randompage": "Pahinang walang-pili",
        "randompage-nopages": "Walang mga pahina sa sumusunod na {{PLURAL:$2|ngalan-espasyo|mga ngalan-espasyo}}: $1.",
+       "randomincategory-submit": "Gawin na",
        "randomredirect": "Pagkargang walang-pili",
        "randomredirect-nopages": "Walang mga pagkarga sa ngalan-espasyong \"$1\".",
        "statistics": "Mga estadistika",
        "nlinks": "$1 {{PLURAL:$1|ugnay|mga ugnay}}",
        "nmembers": "$1 {{PLURAL:$1|kasapi|mga kasapi}}",
        "nrevisions": "$1 {{PLURAL:$1|pagbabago|mga pagbabago}}",
-       "nviews": "$1 {{PLURAL:$1|pagtingin|mga pagtingin}}",
        "nimagelinks": "Ginamit sa $1 {{PLURAL:$1|pahina|mga pahina}}",
        "ntransclusions": "ginamit sa $1 {{PLURAL:$1|pahina|mga pahina}}",
        "specialpage-empty": "Walang resulta para sa ulat na ito.",
        "linksearch-pat": "Huwaran ng hanap",
        "linksearch-ns": "Pangalang espasyo",
        "linksearch-ok": "Hanapin",
-       "linksearch-text": "Maaaring gamitin ang mga \"barahang pamalit\" na katulad ng \"*.wikipedia.org\".\nKailangan ng kahit na isang nasasakupang mataas ang kaantasan, halimbawa na ang \"*.org\".<br />\nSinusuportahang mga protokolo: <code>$1</code> (huwag idagdag ang anuman sa mga ito sa paghahanap mo).",
+       "linksearch-text": "Maaaring gamitin ang mga \"barahang pamalit\" na katulad ng \"*.wikipedia.org\".\nKailangan ng kahit na isang nasasakupang mataas ang kaantasan, halimbawa na ang \"*.org\".<br />\nSinusuportahang mga protokolo: $1 (huwag idagdag ang anuman sa mga ito sa paghahanap mo).",
        "linksearch-line": "$1 nakakawing/nakaugnay mula sa $2",
        "linksearch-error": "Lilitaw lamang ang mga \"barahang-pamalit\" (''wildcard'') sa simula ng pangunahin/punong-abalang pangalan.",
        "listusersfrom": "Ipakita ang mga tagagamit na nagsisimula sa:",
        "tooltip-pt-logout": "Umalis sa pagkaka-login",
        "tooltip-pt-createaccount": "Hinihikayat kang lumikha ng kuwenta at lumigda; gayunpaman, hindi ito kinakailangan",
        "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.",
+       "tooltip-ca-edit": "Baguhin ang pahinang ito",
        "tooltip-ca-addsection": "Magsimula ng bagong seksiyon",
        "tooltip-ca-viewsource": "Nakasanggalang ang pahinang ito.\nMaaari mong tingnan ang batayan nito.",
        "tooltip-ca-history": "Mga nakaraang bersiyon ng pahinang ito.",
        "logentry-patrol-patrol": "Minarkahan ni $1 ang rebisyong $4 ng pahinang $3 bilang napatrolya na",
        "logentry-patrol-patrol-auto": "Kusang minarkahan ni $1 ang rebisyong $4 ng pahinang $3 bilang napatrolya na",
        "logentry-newusers-newusers": "Nilikha ang kuwenta ng tagagamit na $1",
-       "logentry-newusers-create": "{{GENDER:$2|Inilikha}} ang kuwentang $1 ng tagagamit",
+       "logentry-newusers-create": "{{GENDER:$2|Inilikha}} ang account na $1 ng tagagamit",
        "logentry-newusers-create2": "Lumikha si $1 ng isang kuwenta ng tagagamit na $3",
        "logentry-newusers-autocreate": "Automatikong {{GENDER:$2|inilikha}} ang account ng tagagamit na $1",
+       "logentry-upload-upload": "{{GENDER:$2|Ikinarga}} ni $1 ang $3",
        "rightsnone": "(wala)",
        "revdelete-summary": "buod ng pagbabago",
        "feedback-adding": "Idinaragdag ang pakaing-tugon sa pahina...",
index 8797346..e34fc5c 100644 (file)
@@ -74,7 +74,9 @@
                        "Nighteagle2000",
                        "Watermelon juice",
                        "Ömer Berkay",
-                       "Demircimehmed"
+                       "Demircimehmed",
+                       "Uğurkent",
+                       "Kincki"
                ]
        },
        "tog-underline": "Bağlantıların altını çiz:",
        "passwordreset": "Parola sıfırlama",
        "passwordreset-text-one": "Parolanızı sıfırlamak için bu formu doldurun.",
        "passwordreset-text-many": "{{PLURAL:$1|E-posta ile geçici bir parola almak için alanlardan birini doldurun.}}",
-       "passwordreset-legend": "Şifreyi sıfırla",
        "passwordreset-disabled": "Parola sıfırlamaları bu wiki üzerinde devre dışı bırakıldı.",
        "passwordreset-emaildisabled": "Bu wiki'deki e-posta özellikleri devre dışı bırakıldı.",
        "passwordreset-username": "Kullanıcı adı:",
        "resettokens": "Anahtarları sıfırla",
        "resettokens-text": "Burada hesabınızla ilişkili bazı özel verilere erişim izin anahtarları sıfırlayabilirsiniz.\n\n\nSiz yanlışlıkla bunları paylaştıysanız veya hesabınızda bir bozulma varsa bunu yapmalısınız.",
        "resettokens-no-tokens": "Sıfırlamak için hiç bir belirteç bulunmuyor.",
-       "resettokens-legend": "Anahtarları sıfırla",
        "resettokens-tokens": "Belirteçler:",
        "resettokens-token-label": "$1 (geçerli değer: $2)",
        "resettokens-watchlist-token": "[[Special:Watchlist|İzleme listenizdeki sayfa değişiklikleri]] için web beslemeleri (Atom/RSS) anahtarı",
        "randomincategory-nopages": "[[:Category:$1|$1]] kategorisinde hiç sayfa yok.",
        "randomincategory-category": "Kategori:",
        "randomincategory-legend": "Kategoriden rastgele sayfa",
+       "randomincategory-submit": "Git",
        "randomredirect": "Rastgele yönlendirme",
        "randomredirect-nopages": "\"$1\" ad alanında hiç bir yönlendirme yok.",
        "statistics": "İstatistikler",
        "categoriesfrom": "Şununla başlayan kategorileri görüntüle:",
        "special-categories-sort-count": "sayılarına göre sırala",
        "special-categories-sort-abc": "alfabetik olarak sırala",
-       "deletedcontributions": "Silinen kullanıcı katkıları",
-       "deletedcontributions-title": "Silinen kullanıcı katkıları",
+       "deletedcontributions": "Kullanıcının silinen katkıları",
+       "deletedcontributions-title": "Kullanıcının silinen katkıları",
        "sp-deletedcontributions-contribs": "katkılar",
        "linksearch": "Dış bağlantı arama",
        "linksearch-pat": "Motif ara:",
        "linksearch-ns": "Ad alanı:",
        "linksearch-ok": "Ara",
-       "linksearch-text": "\"*.wikipedia.org\" gibi jokerler kullanılabilir.\nEn az bir üst-seviye alan gerekir, örneğin \"*.org\".<br />\nDesteklenen {{PLURAL:$2|iletişim kuralı|iletişim kuralları}}: <code>$1</code> (herhangi bir iletişim kuralı belirtmezseniz http:// otomatik olarak eklenir).",
+       "linksearch-text": "\"*.wikipedia.org\" gibi jokerler kullanılabilir.\nEn az bir üst-seviye alan gerekir, örneğin \"*.org\".<br />\nDesteklenen {{PLURAL:$2|iletişim kuralı|iletişim kuralları}}: $1 (herhangi bir iletişim kuralı belirtmezseniz http:// otomatik olarak eklenir).",
        "linksearch-line": "$1'e $2'den bağlantı verilmiş",
        "linksearch-error": "Jokerler sadece ana makine adının başında görünebilir.",
        "listusersfrom": "Şununla başlayan kullanıcıları görüntüle:",
        "rollback-success": "$1 tarafından yapılan değişiklikler geri alınarak;\n$2 tarafından değiştirilmiş önceki sürüme geri dönüldü.",
        "sessionfailure-title": "Oturum başarısızlığı",
        "sessionfailure": "Giriş oturumunuzla ilgili bir sorun var gibi görünüyor;\nbu eylem, oturum gaspına karşı önlem olarak iptal edildi.\nLütfen \"geri\" gidin ve geldiğiniz sayfayı yeniden yükleyin, sonra tekrar deneyin.",
+       "changecontentmodel-title-label": "Sayfa başlığı",
+       "changecontentmodel-model-label": "Yeni içerik modeli",
+       "changecontentmodel-reason-label": "Gerekçe:",
+       "changecontentmodel-success-title": "İçerik modeli değiştirildi",
+       "changecontentmodel-success-text": "İçerik türü [[:$1]] olarak değiştirildi.",
+       "logentry-contentmodel-change-revertlink": "Eski haline döndür",
+       "logentry-contentmodel-change-revert": "Eski haline döndür",
        "protectlogpage": "Koruma kayıtları",
        "protectlogtext": "Aşağıdaki, sayfa korumalarına değişikliklerin bir listesidir.\nŞu anda uygulanan sayfa korumaları için [[Special:ProtectedPages|koruma altına alınmış sayfalar listesine]] bakabilirsiniz.",
        "protectedarticle": "\"[[$1]]\" koruma altında alındı",
        "sp-contributions-newbies-sub": "Yeni kullanıcılar için",
        "sp-contributions-newbies-title": "Yeni hesaplar için kullanıcı katkıları",
        "sp-contributions-blocklog": "Engel kaydı",
-       "sp-contributions-suppresslog": "Silinen kullanıcı katkıları",
-       "sp-contributions-deleted": "silinen kullanıcı katkıları",
+       "sp-contributions-suppresslog": "kullanıcının silinen katkıları",
+       "sp-contributions-deleted": "kullanıcının silinen katkıları",
        "sp-contributions-uploads": "yüklenenler",
        "sp-contributions-logs": "kayıtlar",
        "sp-contributions-talk": "mesaj",
        "tooltip-pt-logout": "Sistemden çık",
        "tooltip-pt-createaccount": "Bir hesap oluşturup oturum açmanız tavsiye edilmektedir ancak bu zorunlu değildir",
        "tooltip-ca-talk": "İçerik ile ilgili tartışma",
-       "tooltip-ca-edit": "Bu sayfayı değiştirebilirsiniz. Lütfen kaydetmeden önce önizleme düğmesini kullanın.",
+       "tooltip-ca-edit": "Bu sayfayı düzenleyin",
        "tooltip-ca-addsection": "Yeni bir altbaşlık aç",
        "tooltip-ca-viewsource": "Bu sayfa koruma altında. Sadece kaynağını görebilirsiniz.",
        "tooltip-ca-history": "Bu sayfanın geçmiş sürümleri",
        "version-libraries": "Yüklü kütüphaneler",
        "version-libraries-library": "Kütüphane",
        "version-libraries-version": "Sürüm",
+       "version-libraries-license": "Lisans",
+       "version-libraries-description": "Açıklama",
+       "version-libraries-authors": "Yazarlar",
        "redirect": "Dosya, kullanıcı, sayfa ya da revizyon kimliği ile yönlendirme",
        "redirect-legend": "Bir dosya veya sayfaya yönlendirme",
        "redirect-summary": "Bu özel sayfa sizi bir dosya (dosya adı verilen), bir sayfa (bir revizyon ya da sayfa ID'si verilen) veya bir kullanıcı sayfasının (sayısal kullanıcı kimliği verilen) adresine yönlendirir. Kullanım: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], ya da  [[{{#Special:Redirect}}/user/101]].",
        "htmlform-cloner-create": "Daha fazla ekle",
        "htmlform-cloner-delete": "Sil",
        "htmlform-cloner-required": "En az bir değer gereklidir.",
+       "htmlform-title-not-creatable": "\"$1\"oluşturulabilir bir sayfa ismi değil.",
+       "htmlform-title-not-exists": "[[:$1]] mevcut değil",
+       "htmlform-user-not-exists": "<strong>$1</strong> mevcut değil.",
+       "htmlform-user-not-valid": "<strong>$1</strong> geçerli bir kullanıcı ismi değildir.",
        "sqlite-has-fts": "$1 tam-metin arama desteği ile",
        "sqlite-no-fts": "$1 tam-metin arama desteği olmaksızın",
        "logentry-delete-delete": "$1 $3 sayfasını {{GENDER:$2|sildi}}",
        "special-characters-group-khmer": "Kmer",
        "special-characters-title-endash": "tire",
        "special-characters-title-emdash": "uzun çizgi",
-       "special-characters-title-minus": "Eksi işareti"
+       "special-characters-title-minus": "Eksi işareti",
+       "mw-widgets-titleinput-description-new-page": "sayfa henüz mevcut değil",
+       "mw-widgets-titleinput-description-redirect": "$1'e yönlendirildi"
 }
index c9b0a5a..24e81c6 100644 (file)
@@ -22,7 +22,8 @@
                        "Умар",
                        "아라",
                        "Derslek",
-                       "Macofe"
+                       "Macofe",
+                       "Selimcan"
                ]
        },
        "tog-underline": "Сылтамаларның астына сызу:",
        "resetpass-wrong-oldpass": "Ялгыш серсүз.\nСез серсүзегезне үзгәрткән яисә яңа вакытлы серсүз сораткан булырга мөмкинсез.",
        "resetpass-temp-password": "Вакытлы серсүз:",
        "passwordreset": "Серсүзне бетерү",
-       "passwordreset-legend": "Серсүзне яңадан кую",
        "passwordreset-disabled": "Бу викида серсүз бетереп булмый",
        "passwordreset-username": "Кулланучы исеме:",
        "passwordreset-domain": "Домен:",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|күзәтеп тора кулланучы}}]",
        "rc_categories": "Төркемнәрдә генә тора («|» бүлүче)",
        "rc_categories_any": "Һәрбер",
-       "rc-change-size-new": "Төзәтмәдән соң күләме: $1 {{PLURAL:$1|байт|байт|байт}}",
+       "rc-change-size-new": "Төзәтмәдән соң күләме: $1 {{PLURAL:$1|байт|байт}}",
        "newsectionsummary": "/* $1 */ яңа бүлек",
        "rc-enhanced-expand": "Ваклыкларны күрсәтү",
        "rc-enhanced-hide": "Ваклыкларны яшерү",
        "tooltip-pt-logout": "Чыгу",
        "tooltip-pt-createaccount": "Сезгә аккаунт ясарга һәм системага керергә киңәш итәбез, әмма бу мәҗбүри түгел.",
        "tooltip-ca-talk": "Битнең эчтәлеге турында бәхәс",
-       "tooltip-ca-edit": "Сез Ð±Ñ\83 Ð±Ð¸Ñ\82 Ò¯Ð·Ð³Ó\99Ñ\80Ñ\82Ó\99 Ð°Ð»Ð°Ñ\81Ñ\8bз. Ð\97инһаÑ\80, Ñ\81аклаганÑ\87Ñ\8b ÐºÐ°Ñ\80ап Ð°Ð»Ñ\83нÑ\8b ÐºÑ\83лланÑ\8bгÑ\8bз.",
+       "tooltip-ca-edit": "Ð\91Ñ\83 Ð±Ð¸Ñ\82не Ò¯Ð·Ð³Ó\99Ñ\80Ñ\82Ò¯",
        "tooltip-ca-addsection": "Яңа бүлек башлау",
        "tooltip-ca-viewsource": "Бу бит үзгәртүдән якланган. Сез аның чыганак текстын гына карый аласыз.",
        "tooltip-ca-history": "Битнең төзәтмәләр исемлеге",
        "file-info-size": "$1 × $2 нокта, файлның зурлыгы: $3, MIME тибы: $4",
        "file-nohires": "Югары ачыклык белән юрама юк.",
        "svg-long-desc": "SVG файлы, шартлы $1 × $2 нокта, файлның зурлыгы: $3",
-       "show-big-image": "ТÑ\83лÑ\8b Ð°Ñ\87Ñ\8bклÑ\8bк",
+       "show-big-image": "Ð\9eÑ\80игинал Ñ\84айл",
        "show-big-image-size": "$1 × $2 пиксель",
        "newimages": "Яңа сүрәтләр җыелмасы",
        "newimages-legend": "Фильтр",
index 34bf7c4..a24fa92 100644 (file)
        "passwordreset": "پارولنى ئەسلىگە قايتۇرماق",
        "passwordreset-text-one": "ۋاقىتلىق پارولنى ئېلخەت ئارقىلىق قوبۇل قىلىش ئۈچۈن بۇ رامكىنى تولدۇرۇڭ.",
        "passwordreset-text-many": "{{PLURAL:$1|ئېلخەت ئارقىلىق ۋاقىتلىق پارول قوبۇل قىلىش ئۈچۈن بۆلەكتىن بىرنى تولدۇرۇڭ.}}",
-       "passwordreset-legend": "پارولنى ئەسلىگە قايتۇر",
        "passwordreset-disabled": "بۇ ۋىكىدا پارولنى ئەسلىگە قايتۇرۇش چەكلەنگەن.",
        "passwordreset-emaildisabled": "بۇ ۋىكىدا ئېلخەت ئىقتىدار چەكلەنگەن.",
        "passwordreset-username": "ئىشلەتكۈچى نامى:",
        "resettokens": "ئاچقۇچلۇق بەلگىلەرنى قايتا بېكىتمەك",
        "resettokens-text": "سىز بۇ يەردە سىزنىڭ ھىساۋاتىڭىزگە مۇناسۋەتلىك شەخسى ئۇچۇر مەخپىيەتلىكىنى قايتا كۆرەلەيسىز.\n\nئۇ ئۇچۇرلار ھەمبەھرلىنىپ كەتسە ياكى باشقىلار ئىشلىتۋالغان بولسا، ئۇ ئۇچۇرلارنى ئەسلىگە قايتۇرۇڭ.",
        "resettokens-no-tokens": "قايتا بېكىتىدىغان ھېچقانداق ئاچقۇچلۇق بەلگە يوق.",
-       "resettokens-legend": "ئاچقۇچلۇق بەلگىلەرنى قايتا بېكىتمەك",
        "resettokens-tokens": "ئاچقۇچلۇق بەلگىلەر:",
        "resettokens-token-label": "$1 (نۆۋەتتىكى قىممىتى: $2)",
        "resettokens-watchlist-token": "[[Special:Watchlist|كۆزىتىش تىزىملىكىڭىزدىكى بەتلەر ئۆزگىرىشى]] (Atom/RSS) تور مەنبەسىنىڭ ئاچقۇچلۇق بەلگىسى",
        "randomincategory": "تۈردىكى ئىختىيارى بەت",
        "randomincategory-invalidcategory": "«$1» ئىناۋەتلىك تۈر نامى ئەمەس",
        "randomincategory-nopages": "[[:Category:$1|$1]] تۈرىدە ھىچقانداق بەت يوق.",
+       "randomincategory-submit": "كۆچۈش",
        "randomredirect": "ئىختىيارىي قايتا نىشانلانغان بەت",
        "randomredirect-nopages": "\"$1\" ئات بوشلۇقىدا قايتا نىشانلانغان بەت يوق.",
        "statistics": "ستاتىستىكا",
        "nlinks": "$1 {{PLURAL:$1|ئۇلانما|ئۇلانما}}",
        "nmembers": "$1 {{PLURAL:$1|ئەزا|ئەزا}}",
        "nrevisions": "$1 {{PLURAL:$1|تۈزىتىش|تۈزىتىش}}",
-       "nviews": "$1 {{PLURAL:$1|زىيارەت|زىيارەت}}",
        "nimagelinks": "$1 {{PLURAL:$1|بەت|بەت}} تە ئىشلىتىلىدۇ",
        "ntransclusions": "$1 {{PLURAL:$1|بەت|بەت}} تە ئىشلىتىلدى",
        "specialpage-empty": "بۇ دوكلاتنىڭ نەتىجىسى يوق.",
        "linksearch-pat": "ئىزدەش شەكلى:",
        "linksearch-ns": "ئات بوشلۇقى:",
        "linksearch-ok": "ئىزدەش",
-       "linksearch-text": "\"wikipedia.org.*\" غا ئوخشاش ئورتاق بەلگە ئىشلىتىشكە بولىدۇ.\n </br>ئالىي دەرىجىلىك دائىرە بۇلىشى كېرەك، مەسىلەن:\"org.*\".\nقوللايدىغان{{PLURAL:$2| كېلىشىم}}: <code>$1</code>.",
+       "linksearch-text": "\"wikipedia.org.*\" غا ئوخشاش ئورتاق بەلگە ئىشلىتىشكە بولىدۇ.\n </br>ئالىي دەرىجىلىك دائىرە بۇلىشى كېرەك، مەسىلەن:\"org.*\".\nقوللايدىغان{{PLURAL:$2| كېلىشىم}}: $1.",
        "linksearch-line": "$1 بولسا $2 دىن ئۇلانغان",
        "linksearch-error": "ئورتاق بەلگەنى پەقەت ئاساسىي ئاپپارات ئاتىنىڭ باشىدىلا ئىشلەتكىلى بولىدۇ.",
        "listusersfrom": "بېرىلگەن ئىشلەتكۈچى كۆرسىتىش شەرتى:",
index b43794e..9ae575c 100644 (file)
        "protectedinterface": "Ця сторінка містить текст інтерфейсу програмного забезпечення цієї Вікі, захищений від небажаного втручання. Щоб додати або змінити переклади для всіх вікі, перейдіть до [//translatewiki.net/ translatewiki.net], проекту локалізації MediaWiki.",
        "editinginterface": "'''Увага:''' Ви редагуєте сторінку, що є частиною текстового інтерфейсу програм. \nЗміни цієї сторінки спричинять зміну інтерфейсу для інших користувачів цієї Вікі.",
        "translateinterface": "Для того, щоб додати чи змінити переклад повідомлень інтерфейсу для всіх вікі-проектів, скористайтеся будь ласка проектом локалізації MediaWiki: [//translatewiki.net/ translatewiki.net].",
-       "cascadeprotected": "Сторінка захищена від змін, оскільки вона належить до {{PLURAL:$1|1=сторінки, для якої|сторінок, для яких}} установлено каскадний захист: $2",
+       "cascadeprotected": "Сторінка захищена від редагувань, оскільки вона включена на {{PLURAL:$1|1=сторінці|сторінках}}, де встановлено каскадний захист: $2",
        "namespaceprotected": "У вас нема дозволу редагувати сторінки в просторі назв «$1».",
        "customcssprotected": "У вас немає дозволу на редагування цієї CSS-сторінки, бо вона містить особисті налаштування іншого користувача.",
        "customjsprotected": "У вас немає дозволу на редагування цієї JavaScript-сторінки, бо вона містить особисті налаштування іншого користувача.",
        "readonlywarning": "'''Попередження: База даних заблокована на обслуговування, тому, на даний момент, ви не можете записати ваші зміни.\nМожливо, вам варто скопіювати текст у файл на вашому комп'ютері й зберегти його на пізніше.'''\n\nАдміністратор, що заблокував базу даних, залишив наступне пояснення: $1",
        "protectedpagewarning": "'''Попередження: Ця сторінка була захищена від змін так, що тільки користувачі з правами адміністратора можуть її редагувати.'''\nОстанній запис журналу наведений нижче для довідки:",
        "semiprotectedpagewarning": "'''Зауваження:''' Ця сторінка захищена так, що її можуть редагувати тільки зареєстровані користувачі.\nОстанній запис журналу наведений нижче для довідки:",
-       "cascadeprotectedwarning": "'''Попередження:''' Цю сторінку можуть редагувати лише користувачі з групи «Адміністратори», оскільки вона включена {{PLURAL:$1|1=до сторінки, для якої|до наступних сторінок, для яких}} активовано каскадний захист:",
+       "cascadeprotectedwarning": "<strong>Попередження:</strong> Цю сторінку можуть редагувати лише користувачі з правами адміністратора, оскільки вона включена на {{PLURAL:$1|1=сторінці|сторінках}}, де встановлено каскадний захист:",
        "titleprotectedwarning": "'''Попередження. Ця сторінка була захищена так, що для її створення потрібні [[Special:ListGroupRights|особливі права]].'''\nОстанній запис журналу наведений нижче для довідки:",
        "templatesused": "{{PLURAL:$1|1=Шаблон, використаний|Шаблони, використані}} на цій сторінці:",
        "templatesusedpreview": "{{PLURAL:$1|1=Шаблон, використаний|Шаблони, використані}} у цьому попередньому перегляді:",
        "filedelete-submit": "Вилучити",
        "filedelete-success": "'''$1''' було вилучено.",
        "filedelete-success-old": "Версія '''[[Media:$1|$1]]''' від $3, $2 була вилучена.",
-       "filedelete-nofile": "Файл '''$1''' не існує.",
+       "filedelete-nofile": "<strong>$1</strong> не існує.",
        "filedelete-nofile-old": "Не існує архівної версії '''$1''' із зазначеними атрибутами.",
        "filedelete-otherreason": "Інша/додаткова причина:",
        "filedelete-reason-otherlist": "Інша причина",
        "randomincategory-nopages": "У [[:Category:$1]] немає сторінок.",
        "randomincategory-category": "Категорія:",
        "randomincategory-legend": "Випадкова сторінка у категорії",
+       "randomincategory-submit": "Перейти",
        "randomredirect": "Випадкове перенаправлення",
        "randomredirect-nopages": "Простір назв «$1» не містить перенаправлень.",
        "statistics": "Статистика",
        "linksearch-pat": "Шаблон для пошуку:",
        "linksearch-ns": "Простір назв:",
        "linksearch-ok": "Знайти",
-       "linksearch-text": "Можна вживати підстановочні символи, наприклад, «*.wikipedia.org».\nНеобхідно зазначити домен, принаймні верхнього рівня, наприклад «*.org».<br />\n{{PLURAL:$2|1=Підтримується протокол|Підтримуються протоколи}}: <code>$1</code> (за замовчуванням http:// , якщо жоден протокол не зазначено).",
+       "linksearch-text": "Можна вживати підстановочні символи, наприклад, «*.wikipedia.org».\nНеобхідно зазначити домен, принаймні верхнього рівня, наприклад «*.org».<br />\n{{PLURAL:$2|1=Підтримується протокол|Підтримуються протоколи}}: $1 (за замовчуванням http:// , якщо жоден протокол не зазначено).",
        "linksearch-line": "Посилання на $1 із $2",
        "linksearch-error": "Підстановочні знаки можуть використовуватися лише на початку адрес.",
        "listusersfrom": "Показати користувачів, починаючи з:",
        "rollback-success": "Відкинуті редагування користувача $1; повернення до версії користувача $2.",
        "sessionfailure-title": "Помилка сеансу",
        "sessionfailure": "Здається, виникли проблеми з поточним сеансом роботи;\nця дія була скасована з метою попередити «захоплення сеансу».\nБудь ласка, натисніть кнопку «Назад» і перезавантажте сторінку, з якої ви прийшли.",
+       "changecontentmodel": "Змінити модель вмісту сторінки",
+       "changecontentmodel-legend": "Змінити модель вмісту",
+       "changecontentmodel-title-label": "Назва сторінки",
+       "changecontentmodel-model-label": "Нова модель вмісту",
+       "changecontentmodel-reason-label": "Причина:",
+       "changecontentmodel-success-title": "Модель вмісту було змінено",
+       "changecontentmodel-success-text": "Тип вмісту сторінки [[:$1]] було змінено.",
+       "changecontentmodel-cannot-convert": "Вміст сторінки [[:$1]] не можна перетворити на вміст типу $2.",
+       "changecontentmodel-title-cantexist": "Сторінка з назвою $1 не можлива.",
+       "changecontentmodel-nodirectediting": "Модель вмісту $1 не підтримує пряме редагування",
+       "log-name-contentmodel": "Журнал змін моделі вмісту",
+       "log-description-contentmodel": "Події, пов'язані з моделями вмісту сторінки",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|змінив|змінила}} модель вмісту сторінки $3 з «$4» на «$5»",
+       "logentry-contentmodel-change-revertlink": "відкинути",
+       "logentry-contentmodel-change-revert": "відкинути",
        "protectlogpage": "Журнал захисту",
        "protectlogtext": "Нижче наведено список встановлень і зняття захисту зі сторінки.\nВи також можете переглянути [[Special:ProtectedPages|список захищених сторінок]].",
        "protectedarticle": "захист на [[$1]] встановлено",
        "protect-locked-blocked": "Ви не можете змінювати рівень захисту сторінки, доки ваш обліковий запис заблокований.\nПоточні установки для сторінки '''$1''':",
        "protect-locked-dblock": "Рівень захисту не може бути зміненим, так як основна база даних тимчасово заблокована.\nПоточні установки для сторінки '''$1''':",
        "protect-locked-access": "У вашого облікового запису недостатньо прав для зміни рівня захисту сторінки.\nПоточні установки для сторінки: '''$1''':",
-       "protect-cascadeon": "Ця сторінка зараз захищена у зв'язку з тим, що вона включена в {{PLURAL:$1/1=зазначену нижче сторінку, для якої|нижченаведені сторінки, для яких}} встановлений каскадний захист. Зміни рівня захисту цієї сторінки не вплине на каскадний захист.",
+       "protect-cascadeon": "Ця сторінка зараз захищена у зв'язку з тим, що вона включена у {{PLURAL:$1|1=сторінку, для якої|сторінки, для яких}} встановлений каскадний захист. \nЗміни рівня захисту цієї сторінки не вплине на каскадний захист.",
        "protect-default": "Дозволити всім користувачам",
        "protect-fallback": "Дозволено тільки користувачам із дозволом «$1»",
        "protect-level-autoconfirmed": "Дозволено тільки автопідтвердженим користувачам",
        "tooltip-pt-logout": "Вихід із системи",
        "tooltip-pt-createaccount": "Пропонуємо створити обліковий запис і увійти в систему; однак, це не обов'язково",
        "tooltip-ca-talk": "Обговорення змісту сторінки",
-       "tooltip-ca-edit": "Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\80едагÑ\83ваÑ\82и Ñ\86Ñ\8e Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83. Ð\91Ñ\83дÑ\8c Ð»Ð°Ñ\81ка, Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83йÑ\82е ÐºÐ½Ð¾Ð¿ÐºÑ\83 Ð¿Ð¾Ð¿ÐµÑ\80еднÑ\8cого Ð¿ÐµÑ\80еглÑ\8fдÑ\83 Ð¿ÐµÑ\80ед Ð·Ð±ÐµÑ\80еженнÑ\8fм",
+       "tooltip-ca-edit": "РедагÑ\83ваÑ\82и Ñ\86Ñ\8e Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83",
        "tooltip-ca-addsection": "Створити новий розділ",
        "tooltip-ca-viewsource": "Ця сторінка захищена від змін. Ви можете переглянути і скопіювати її вихідний текст.",
        "tooltip-ca-history": "Журнал змін сторінки",
        "pageinfo-robot-index": "Індексується",
        "pageinfo-robot-noindex": "Не індексується",
        "pageinfo-watchers": "Кількість спостерігачів",
+       "pageinfo-visiting-watchers": "Кількість спостерігачів сторінки, які відвідали останні редагування",
        "pageinfo-few-watchers": "Менше ніж $1 {{PLURAL:$1|спостерігач|спостерігачі|спостерігачів}}",
+       "pageinfo-few-visiting-watchers": "Користувачі, що спостерігають за сторінкою і бачили останні редагування, можуть бути, а можуть ні",
        "pageinfo-redirects-name": "Число перенаправлень на цю сторінку",
        "pageinfo-subpages-name": "Підсторінки цієї сторінки",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|перенаправлення|перенаправлення|перенаправлень}}; $3 {{PLURAL:$3|неперенаправлення|неперенаправлення|неперенаправлень}})",
        "version-libraries": "Встановлені бібліотеки",
        "version-libraries-library": "Бібліотека",
        "version-libraries-version": "Версія",
+       "version-libraries-license": "Ліцензія",
+       "version-libraries-description": "Опис",
+       "version-libraries-authors": "Автори",
        "redirect": "Перенаправлення за файлом, користувачем, сторінкою або ID версії",
        "redirect-legend": "Перенаправити на файл чи сторінку",
        "redirect-summary": "Ця спеціальна сторінка перенаправляє на файл (за поданою назвою файлу), сторінку (за поданим ID версії або сторінки) або сторінку користувача (за поданим числовим ID користувача). Використання: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]],[[{{#Special:Redirect}}/revision/328429]] або [[{{#Special:Redirect}}/user/101]].",
        "htmlform-cloner-create": "Додати більше",
        "htmlform-cloner-delete": "Вилучити",
        "htmlform-cloner-required": "Необхідно принаймні одне значення.",
+       "htmlform-title-badnamespace": "[[:$1]] не в просторі назв «{{ns:$2}}».",
+       "htmlform-title-not-creatable": "«$1» — назва сторінки, яку не можна створити",
+       "htmlform-title-not-exists": "[[:$1]] не існує.",
+       "htmlform-user-not-exists": "<strong>$1</strong> не існує.",
+       "htmlform-user-not-valid": "<strong>$1</strong> не є дійсним іменем користувача.",
        "sqlite-has-fts": "$1 з підтримкою повнотекстового пошуку",
        "sqlite-no-fts": "$1 без підтримки повнотекстового пошуку",
        "logentry-delete-delete": "$1 {{GENDER:$2|вилучив|вилучила}} сторінку $3",
index 0d4696b..df2b2ba 100644 (file)
        "resetpass-temp-password": "Password tenporanea:",
        "resetpass-abort-generic": "La modifica de la password la xe sta anulà da un'estension.",
        "passwordreset": "Rinposta ła password",
-       "passwordreset-legend": "Rinposta ła password",
        "passwordreset-disabled": "Ła rinpostasion deła password xe stà dixabiłità so sto projeto wiki.",
        "passwordreset-emaildisabled": "Le funsionalità de posta eletrònega le xe stà disabilità su sta wiki.",
        "passwordreset-username": "Nome utente:",
        "nlinks": "$1 {{PLURAL:$1|colegamento|colegamenti}}",
        "nmembers": "$1 {{PLURAL:$1|elemento|elementi}}",
        "nrevisions": "$1 {{PLURAL:$1|revision}}",
-       "nviews": "$1 {{PLURAL:$1|visita|visite}}",
        "nimagelinks": "Doparà su $1 {{PLURAL:$1|pagina|pagine}}",
        "ntransclusions": "doparà su $1 {{PLURAL:$1|pagina|pagine}}",
        "specialpage-empty": "Sto raporto no'l contien nissun risultato.",
        "linksearch-pat": "Espression de riserca:",
        "linksearch-ns": "Namespace:",
        "linksearch-ok": "Serca",
-       "linksearch-text": "Xe posibiłe doparare metacarateri, come \"*.wikipedia.org\".\nXe nesesario almanco un dominio de primo liveło, tipo \"*.org\".<br />\n{{PLURAL:$2|Protocoło suportà|Protocołi suportai}}: <code>$1</code> (predefinio http:// se nisun protocoło el xe spesifegà).",
+       "linksearch-text": "Xe posibiłe doparare metacarateri, come \"*.wikipedia.org\".\nXe nesesario almanco un dominio de primo liveło, tipo \"*.org\".<br />\n{{PLURAL:$2|Protocoło suportà|Protocołi suportai}}: $1 (predefinio http:// se nisun protocoło el xe spesifegà).",
        "linksearch-line": "$1 presente ne la pagina $2",
        "linksearch-error": "I metacaràteri i pode vegner doparài solo a l'inizio del nome de l'host.",
        "listusersfrom": "Mostra i utenti tacando da:",
index b31768e..80c441a 100644 (file)
@@ -30,7 +30,8 @@
                        "Dinhxuanduyet",
                        "Macofe",
                        "KhangND",
-                       "Darcy Le"
+                       "Darcy Le",
+                       "Quenhitran"
                ]
        },
        "tog-underline": "Gạch chân liên kết:",
        "view": "Xem",
        "view-foreign": "Xem trên $1",
        "edit": "Sửa đổi",
-       "edit-local": "Sửa đổi miêu tả địa phương",
+       "edit-local": "Sửa đổi miêu tả trên wiki địa phương",
        "create": "Tạo",
-       "create-local": "Thêm miêu tả địa phương",
+       "create-local": "Thêm miêu tả trên wiki địa phương",
        "editthispage": "Sửa đổi trang này",
        "create-this-page": "Tạo trang này",
        "delete": "Xóa",
        "prefsnologintext2": "Xin vui lòng đăng nhập để thay đổi tùy chọn.",
        "prefs-skin": "Giao diện",
        "skin-preview": "Xem trước",
-       "datedefault": "Không quan tâm",
+       "datedefault": "Không tuỳ biến",
        "prefs-labs": "Tính năng phòng thí nghiệm",
        "prefs-user-pages": "Trang cá nhân",
        "prefs-personal": "Thông tin cá nhân",
        "prefs-files": "Tập tin",
        "prefs-custom-css": "sửa CSS",
        "prefs-custom-js": "sửa JS",
-       "prefs-common-css-js": "CSS/JS chung cho mọi giao diện:",
+       "prefs-common-css-js": "CSS/JavaScript chung cho mọi giao diện:",
        "prefs-reset-intro": "Có thể mặc định lại toàn bộ tùy chọn dùng trang này. Điều này không thể hoàn tác.",
        "prefs-emailconfirm-label": "Xác nhận thư điện tử:",
        "youremail": "Thư điện tử:",
        "prefs-info": "Thông tin cơ bản",
        "prefs-i18n": "Quốc tế hóa",
        "prefs-signature": "Chữ ký",
-       "prefs-dateformat": "Kiểu ngày tháng",
-       "prefs-timeoffset": "Chênh giờ",
+       "prefs-dateformat": "Kiểu hiển thị ngày tháng",
+       "prefs-timeoffset": "Chênh lệch giờ",
        "prefs-advancedediting": "Tùy chọn chung",
        "prefs-editor": "Trình soạn",
        "prefs-preview": "Xem trước",
        "php-uploaddisabledtext": "Việc tải tập tin trong PHP đã bị tắt. Xin hãy kiểm tra lại thiết lập file_uploads.",
        "uploadscripted": "Tập tin này có chứa mã HTML hoặc kịch bản có thể khiến trình duyệt web thông dịch sai.",
        "upload-scripted-pi-callback": "Không thể tải lên một file có chứa lệnh xử lý XML-stylesheet",
+       "uploaded-script-svg": "Tìm thấy phần tử “$1” có khả năng chạy kịch bản trong tập tin SVG được tải lên.",
+       "uploaded-hostile-svg": "Tìm thấy CSS nguy hiểm trong phần tử style của tập tin SVG được tải lên.",
+       "uploaded-event-handler-on-svg": "Không cho phép đặt thuộc tính xử lý sự kiện <code>$1=\"$2\"</code> trong tập tin SVG.",
+       "uploaded-href-attribute-svg": "Không cho phép thuộc tính href <code>&lt;$1 $2=\"$3\"&gt;</code> có đích ngoài máy (ví dụ http://, javascript:, v.v.) trong tập tin SVG.",
+       "uploaded-href-unsafe-target-svg": "Tìm thấy href đến đích nguy hiểm <code>&lt;$1 $2=\"$3\"&gt;</code> trong tập tin SVG được tải lên.",
+       "uploaded-animate-svg": "Tìm thấy thẻ “animate” có thể thay đổi href qua thuộc tính “from” <code>&lt;$1 $2=\"$3\"&gt;</code> trong tập tin SVG được tải lên.",
+       "uploaded-setting-event-handler-svg": "Đã ngăn cản việc đặt thuộc tính xử lý sự kiện khi tìm thấy <code>&lt;$1 $2=\"$3\"&gt;</code> trong tập tin SVG được tải lên.",
        "uploaded-setting-href-svg": "Sử dụng tag \"set\" để thêm thuộc tính \"href\" tới thành phần mẹ bị khóa.",
+       "uploaded-wrong-setting-svg": "Đã ngăn cản việc sử dụng thẻ “set” để thêm đích bên ngoài/dữ liệu/kịch bản vào thuộc tính nào đó. Tìm thấy <code>&lt;set to=\"$1\"&gt;</code> trong tập tin SVG được tải lên.",
+       "uploaded-setting-handler-svg": "Đã ngăn cản mã SVG đặt thuộc tính “handler” là từ xa/dữ liệu/kịch bản. Tìm thấy <code>$1=\"$2\"</code> trong tập tin SVG được tải lên.",
+       "uploaded-remote-url-svg": "Đã ngăn cản mã SVG đặt thuộc tính style nào đó là URL ngoài máy. Tìm thấy <code>$1=\"$2\"</code> trong tập tin SVG được tải lên.",
        "uploaded-image-filter-svg": "Tìm công cụ lọc ảnh với UPL: <Mã>&lt;$1 $2=\"$3\"&gt;</Mã> trong tập tin SVG được tải lên.",
        "uploadscriptednamespace": "Tập tin SVG này chứa không gian tên “$1” không được cho phép",
        "uploadinvalidxml": "Không thể phân tích mã XML trong tập tin tải lên.",
        "linksearch-pat": "Mẫu liên kết:",
        "linksearch-ns": "Không gian tên:",
        "linksearch-ok": "Tìm kiếm",
-       "linksearch-text": "Bạn có thể sử dụng ký tự đại diện (''wildcard''), ví dụ “*.wikipedia.org”; ít nhất phải có tên miền cấp cao nhất, thí dụ “*.org”.<br />{{PLURAL:$2|Giao thức|Các giao thức}} này được hỗ trợ: <code>$1</code>; mặc định là <code>http://</code> nếu không định rõ giao thức trong truy vấn.",
+       "linksearch-text": "Bạn có thể sử dụng ký tự đại diện (''wildcard''), ví dụ “*.wikipedia.org”; ít nhất phải có tên miền cấp cao nhất, thí dụ “*.org”.<br />{{PLURAL:$2|Giao thức|Các giao thức}} này được hỗ trợ: $1; mặc định là <code>http://</code> nếu không định rõ giao thức trong truy vấn.",
        "linksearch-line": "$1 được liên kết từ $2",
        "linksearch-error": "Chỉ được sử dụng ký tự đại diện (''wildcard'') vào đầu tên miền (''hostname'').",
        "listusersfrom": "Hiển thị thành viên bắt đầu từ:",
        "rollback-success": "Đã hủy sửa đổi của $1;\nquay về phiên bản cuối của $2.",
        "sessionfailure-title": "Phiên thất bại",
        "sessionfailure": "Dường như có trục trặc với phiên đăng nhập của bạn; thao tác này đã bị hủy để tránh việc cướp quyền đăng nhập. Xin hãy nhấn nút “Back”, tải lại trang đó, rồi thử lại.",
+       "changecontentmodel": "Thay đổi kiểu nội dung của một trang",
+       "changecontentmodel-legend": "Thay đổi kiểu nội dung",
+       "changecontentmodel-title-label": "Tên trang",
+       "changecontentmodel-model-label": "Kiểu nội dung mới",
+       "changecontentmodel-reason-label": "Lý do:",
+       "changecontentmodel-success-title": "Kiểu nội dung đã thay đổi",
+       "changecontentmodel-success-text": "Loại nội dung của [[:$1]] đã được thay đổi.",
+       "changecontentmodel-cannot-convert": "Không thể chuyển đổi nội dung [[:$1]] thành nội dung dưới dạng $2.",
+       "changecontentmodel-title-cantexist": "Không thể có trang tại $1.",
+       "changecontentmodel-nodirectediting": "Mô hình nội dung $1 không hỗ trợ sửa đổi trực tiếp",
+       "log-name-contentmodel": "Nhật trình thay đổi mô hình nội dung",
+       "log-description-contentmodel": "Sự kiện có liên quan đến mô hình nội dung của trang.",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2}}đã thay đổi mô hình nội dung của trang $3 từ “$4” thành “$5”",
+       "logentry-contentmodel-change-revertlink": "lùi lại",
+       "logentry-contentmodel-change-revert": "lùi lại",
        "protectlogpage": "Nhật trình khóa",
        "protectlogtext": "Đây là danh sách các thay đổi mức khóa trang. Xem [[Special:ProtectedPages|danh sách các trang hiện thời đang bị khóa]].",
        "protectedarticle": "đã khóa “[[$1]]”",
        "tooltip-pt-logout": "Đăng xuất",
        "tooltip-pt-createaccount": "Khuyến khích bạn mở tài khoản và đăng nhập; tuy nhiên, không phải bắt buộc phải có tài khoản",
        "tooltip-ca-talk": "Thảo luận về trang này",
-       "tooltip-ca-edit": "Bạn có thể sửa được trang này! (Xin vui lòng xem trước trước khi lưu.)",
+       "tooltip-ca-edit": "Chỉnh sửa trang này",
        "tooltip-ca-addsection": "Bắt đầu một đề mục mới",
        "tooltip-ca-viewsource": "Trang này được khóa. Bạn có thể xem mã nguồn.",
        "tooltip-ca-history": "Các phiên bản cũ của trang này",
        "pageinfo-robot-index": "Cho phép",
        "pageinfo-robot-noindex": "Không cho phép",
        "pageinfo-watchers": "Số người theo dõi trang",
+       "pageinfo-visiting-watchers": "Số người theo dõi trang đã xem sửa đổi gần đây",
        "pageinfo-few-watchers": "Không tới $1 người theo dõi",
+       "pageinfo-few-visiting-watchers": "Có thể có hoặc không có người dùng theo dõi các sửa đổi gần đây",
        "pageinfo-redirects-name": "Số trang đổi hướng đến trang này",
        "pageinfo-redirects-value": "$1",
        "pageinfo-subpages-name": "Số trang con của trang này",
        "htmlform-cloner-create": "Tiếp tục thêm",
        "htmlform-cloner-delete": "Loại bỏ",
        "htmlform-cloner-required": "Cần ít nhất một giá trị.",
+       "htmlform-title-badnamespace": "[[:$1]] không phải trong không gian tên “{{ns:$2}}”.",
+       "htmlform-title-not-creatable": "Không cho phép tạo ra trang với tên “$1”",
+       "htmlform-title-not-exists": "[[:$1]] không tồn tại.",
+       "htmlform-user-not-exists": "<strong>$1</strong> không tồn tại.",
+       "htmlform-user-not-valid": "<strong>$1</strong> không phải là tên người dùng.",
        "sqlite-has-fts": "$1 với sự hỗ trợ tìm kiếm toàn văn",
        "sqlite-no-fts": "$1 không có hỗ trợ tìm kiếm toàn văn",
        "logentry-delete-delete": "$1 {{GENDER:$2}}đã xóa trang “$3”",
        "log-description-pagelang": "Nhật trình này ghi các thay đổi ngôn ngữ của các trang.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2}}đã đổi ngôn ngữ của trang $3 từ $4 thành $5.",
        "default-skin-not-found": "Đã xảy ra lỗi! Giao diện mặc định của wiki này được định nghĩa trong <code dir=\"ltr\">$wgDefaultSkin</code> là <code>$1</code> nhưng không tồn tại.\n\nViệc cài đặt của bạn dường như bao gồm {{PLURAL:$4|giao diện|các giao diện}} sau. Xem [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration Hướng dẫn: Cấu hình giao diện] để biết thông tin về cách kích hoạt {{PLURAL:$4|nó|chúng và chọn giao diện mặc định}}.\n\n$2\n\n; Nếu bạn vừa mới cài đặt MediaWiki:\n: Có lẽ bạn đã cài đặt nó từ git, hoặc trực tiếp từ mã nguồn bằng cách sử dụng một số phương thức khác. Điều này đã nằm trong tính toán của chúng tôi. Hãy thử cài đặt một số giao diện từ [https://www.mediawiki.org/wiki/Category:All_skins thư mục giao diện của mediawiki.org] bằng cách:\n:* Tải về [https://www.mediawiki.org/wiki/Special:MyLanguage/Download trình cài đặt dưới dạng gói tar], trong đó có kèm theo một số giao diện và phần mở rộng. Bạn có thể chép nó và dán vào thư mục <code>skins/</code>.\n:* Tải về các gói giao diện nén riêng từ [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_từ_Git#Using_Git_to_download_MediaWiki_skins Sử dụng Git để tải về giao diện].\n: Cách này sẽ không có ảnh hưởng đến kho git của bạn dù bạn là một nhà phát triển MediaWiki.\n\n; Nếu bạn vừa mới nâng cấp MediaWiki:\n: Phiên bản MediaWiki 1.24 trở lên không còn tự động kích hoạt giao diện đã cài đặt (xem [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Hướng dẫn: Tự động dò giao diện]). Bạn có thể dán {{PLURAL:$5|dòng|các dòng}} sau vào <code>LocalSettings.php</code> để kích hoạt {{PLURAL:$5|giao diện|tất cả các giao diện}} đã được cài dặt:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Nếu bạn vừa mới chỉnh sửa <code>LocalSettings.php</code>:\n: Kiểm tra lại tên các giao diện xem có lỗi đánh máy nào không.",
-       "default-skin-not-found-no-skins": "Đã xảy ra lỗi! Giao diện mặc định của wiki này được định nghĩa trong <code dir=\"ltr\">$wgDefaultSkin</code> là <code>$1</code> nhưng không tồn tại.\n\nKhông có giao diện nào của bạn được kích hoạt.\n\n; Nếu bạn vừa mới cài đặt MediaWiki:\n: Bạn có thể cài đặt nó từ git, hoặc trực tiếp từ mã nguồn bằng cách sử dụng một số phương thức khác. Điều này nằm trong dự kiến. Hãy thử cài đặt một số giao diện từ [https://www.mediawiki.org/wiki/Category:All_skins thư mục giao diện của mediawiki.org], bằng cách:\n:* Tải về [https://www.mediawiki.org/wiki/Special:MyLanguage/Download trình cài đặt dưới dạng gói tar], trong đó có kèm theo một số giao diện và phần mở rộng. Bạn có thể chép nó và dán vào thư mục <code>skins/</code>.\n:* Tải về các gói giao diện nén riêng từ [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:*Sao chép một trong những kho <code>mediawiki/skins/*</code> thông qua git vào trong thư mục <code dir=\"ltr\">skins/</code> của cài đặt MediaWiki của bạn.\n: Cách này sẽ không có ảnh hưởng đến kho git của bạn dù bạn là một nhà phát triển MediaWiki. Xin xem [https://www.mediawiki.org/wiki/Manual:Skin_configuration Hướng dẫn: Cấu hình giao diện] để biết thông tin về cách kích hoạt hoặc chọn một trong số chúng làm giao diện mặc định.",
+       "default-skin-not-found-no-skins": "Đã xảy ra lỗi! Giao diện mặc định của wiki này được định nghĩa trong <code dir=\"ltr\">$wgDefaultSkin</code> là <code>$1</code> nhưng không tồn tại.\n\nKhông có giao diện nào của bạn được kích hoạt.\n\n; Nếu bạn vừa mới cài đặt MediaWiki:\n: Bạn có thể cài đặt nó từ git, hoặc trực tiếp từ mã nguồn bằng cách sử dụng một số phương thức khác. Điều này nằm trong dự kiến. Hãy thử cài đặt một số giao diện từ [https://www.mediawiki.org/wiki/Category:All_skins thư mục giao diện của mediawiki.org], bằng cách:\n:* Tải về [https://www.mediawiki.org/wiki/Special:MyLanguage/Download trình cài đặt dưới dạng gói tar], trong đó có kèm theo một số giao diện và phần mở rộng. Bạn có thể chép nó và dán vào thư mục <code>skins/</code>.\n:* Tải về các gói giao diện nén riêng từ [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git/vi#Using_Git_to_download_MediaWiki_skins Tải về giao diện qua Git].\n: Cách này sẽ không có ảnh hưởng đến kho git của bạn dù bạn là một nhà phát triển MediaWiki. Xin xem [https://www.mediawiki.org/wiki/Manual:Skin_configuration Hướng dẫn: Cấu hình giao diện] để biết thông tin về cách kích hoạt hoặc chọn một trong số chúng làm giao diện mặc định.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (kích hoạt)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''vô hiệu hóa''')",
        "mediastatistics": "Thống kê phương tiện",
        "special-characters-title-emdash": "dấu gạch em",
        "special-characters-title-minus": "dấu trừ",
        "mw-widgets-titleinput-description-new-page": "Trang này chưa tồn tại",
-       "mw-widgets-titleinput-description-redirect": "Đổi hướng đến $4"
+       "mw-widgets-titleinput-description-redirect": "Đổi hướng đến $1"
 }
index 68ddb77..949bef4 100644 (file)
        "resetpass-wrong-oldpass": "Letavöd (laidüpik u nelaidüpik) no lonöföl.\nBa ya evotükol benosekiko letavödi olik, u ya ebegol benosekiko letavödi nelaidüpik nulik.",
        "resetpass-temp-password": "Letavöd nelaidüpik:",
        "passwordreset": "Dönuvälön letavödi",
-       "passwordreset-legend": "Dönuvälön letavödi",
        "passwordreset-username": "Gebananem:",
        "passwordreset-domain": "Domen:",
        "passwordreset-email": "Ladet leäktronik:",
        "nlinks": "{{PLURAL:$1|yüm|yüms}} $1",
        "nmembers": "{{PLURAL:$1|liman|limans}} $1",
        "nrevisions": "{{PLURAL:$1|fomam|fomams}} $1",
-       "nviews": "{{PLURAL:$1|logam|logams}} $1",
        "nimagelinks": "Pageböl in {{PLURAL:$1|pad|pads}} $1",
        "ntransclusions": "pageböl in {{PLURAL:$1|pad|pads}} $1",
        "specialpage-empty": "Pad at vagon.",
        "linksearch-pat": "Sukapated:",
        "linksearch-ns": "Nemaspad:",
        "linksearch-ok": "Suk",
-       "linksearch-text": "WilStelüls kanons pagebön, a.s. „*.wikipedia.org“.<br />\nProtoks pestütöl: <code>$1</code>",
+       "linksearch-text": "WilStelüls kanons pagebön, a.s. „*.wikipedia.org“.<br />\nProtoks pestütöl: $1",
        "linksearch-line": "$1 labon yümi se $2",
        "linksearch-error": "Stelüls kanons pubön te lä prim lotidiananema.",
        "listusersfrom": "Jonolöd gebanis primölo me:",
index 939fbe3..5acfa3e 100644 (file)
        "resetpass-wrong-oldpass": "Li scret timporaire ou do moumint n' est nén valide.\nMotoit ki vos l' avoz ddja candjî ou ridmandé on novea scret timporaire.",
        "resetpass-temp-password": "Sicret timporaire:",
        "passwordreset": "Rifé l' sicret",
-       "passwordreset-legend": "Rifé l' sicret",
        "passwordreset-disabled": "Li rfijhaedje di screts a stî dismetou so ç' wiki ci.",
        "passwordreset-username": "No d' elodjaedje:",
        "passwordreset-domain": "Dominne:",
        "nlinks": "$1 {{PLURAL:$1|loyén|loyéns}}",
        "nmembers": "$1 {{PLURAL:$1|mimbe|mimbes}}",
        "nrevisions": "$1 {{PLURAL:$1|modêye|modêyes}}",
-       "nviews": "léjhowe $1 {{PLURAL:$1|côp|côps}}",
        "nimagelinks": "Eployî so $1 pådje{{PLURAL:$1||s}}",
        "ntransclusions": "eployî so $1 pådje{{PLURAL:$1||s}}",
        "specialpage-empty": "Cisse pådje cial est vude.",
        "linksearch-pat": "Patron pol cweraedje:",
        "linksearch-ns": "Espåce di lomaedje:",
        "linksearch-ok": "Cweri",
-       "linksearch-text": "Des caracteres «djokers» polèt esse eployîs, metans «*.wikipedia.org».\nMins i fåt pol moens on dominne di prumî livea, metans «*.org»<br />\nProtocoles ricnoxhous: <code>$1</code> (nelzès metoz nén dins vosse tchinne di cweraedje).",
+       "linksearch-text": "Des caracteres «djokers» polèt esse eployîs, metans «*.wikipedia.org».\nMins i fåt pol moens on dominne di prumî livea, metans «*.org»<br />\nProtocoles ricnoxhous: $1 (nelzès metoz nén dins vosse tchinne di cweraedje).",
        "linksearch-line": "$1 est loyî a pårti d' $2",
        "linksearch-error": "Les caracteres djokers èn polèt esse eployîs k' a l' atake d' on no d' dominne ou d' lodjoe.",
        "listusersfrom": "Håyner les uzeus a pårti di:",
index 04e30ad..5f06880 100644 (file)
@@ -18,7 +18,8 @@
                        "LNDDYL",
                        "TheChampionMan1234",
                        "Fitoschido",
-                       "Poiuyt"
+                       "Poiuyt",
+                       "反共复国"
                ]
        },
        "tog-underline": "鏈接下橫線:",
        "tog-showtoolbar": "顯示編傢伙欄",
        "tog-editondblclick": "捺兩記編頁",
        "tog-editsectiononrightclick": "用右捺標題編段",
-       "tog-watchcreations": "畀我建个页搭我传个文件加进我个关注表里去",
-       "tog-watchdefault": "畀我编个页搭文件加进我个关注表里去",
+       "tog-watchcreations": "拿我建个页面搭我传个文件加到我个关注表里去",
+       "tog-watchdefault": "拿我编个页面搭文件加到我个关注表里去",
        "tog-watchmoves": "畀我移个页搭文件加进我个监控列表里去",
        "tog-watchdeletion": "畀我刪脫個頁搭文件加進我個關注表裏",
+       "tog-watchrollback": "拿我执行过回退个页面加到我个关注表里去",
        "tog-minordefault": "默認記全部編都是細個",
        "tog-previewontop": "編寫框頭前顯示先望",
        "tog-previewonfirst": "頭垡編寫顯示先望",
        "view": "望",
        "view-foreign": "登$1上看",
        "edit": "编",
+       "edit-local": "编辑本地说明",
        "create": "建",
        "create-local": "添加本地说明",
        "editthispage": "編箇頁",
        "pool-timeout": "等锁过时",
        "pool-queuefull": "池队列满哉",
        "pool-errorunknown": "弗识个错误",
+       "poolcounter-usage-error": "用法出错:$1",
        "aboutsite": "有关{{SITENAME}}",
        "aboutpage": "Project:关于",
        "copyright": "除非另外声明,内容侪拉$1下底发布。",
        "disclaimers": "免责声明",
        "disclaimerpage": "Project:免责声明",
        "edithelp": "編寫幫助",
+       "helppage-top-gethelp": "帮忙",
        "mainpage": "封面",
        "mainpage-description": "封面",
        "policy-url": "Project:策略",
        "retrievedfrom": "取自“$1”",
        "youhavenewmessages": "你侬有$1($2)。",
        "newmessageslinkplural": "{{PLURAL:$1|新消息|999=新消息}}",
-       "newmessagesdifflinkplural": "此垡̺{{PLURAL:$1|变化}}",
+       "newmessagesdifflinkplural": "此垡̺{{PLURAL:$1|变化|999=变化}}",
        "youhavenewmessagesmulti": "爾徠$1裏有新信息",
        "editsection": "编辑",
        "editold": "编",
        "toc": "目录",
        "showtoc": "顯示",
        "hidetoc": "囥脫",
+       "collapsible-collapse": "折叠",
+       "collapsible-expand": "展开",
+       "confirmable-confirm": "{{GENDER:$1|侬}}啊确定?",
+       "confirmable-yes": "是",
+       "confirmable-no": "弗是",
        "thisisdeleted": "望要弗復原$1?",
        "viewdeleted": "$1望望相?",
        "restorelink": "$1個刪脫個版本",
        "site-atom-feed": "$1个Atom订阅",
        "page-rss-feed": "“$1”個RSS訂閱",
        "page-atom-feed": "\"$1\" 个Atom订阅",
-       "red-link-title": "$1 (呒有箇页)",
+       "red-link-title": "$1(页面弗存在)",
        "sort-descending": "倒排",
        "sort-ascending": "顺排",
        "nstab-main": "页",
        "readonly_lag": "从数据库服务器垃拉从主服务器上更新,数据库已经拨自动锁定",
        "internalerror": "内部错误",
        "internalerror_info": "内部错误:$1",
+       "internalerror-fatal-exception": "类型“$1”个致命错误",
        "filecopyerror": "弗好拿文件“$1”复制到“$2”。",
        "filerenameerror": "拿文件“$1”重命名为“$2”失败。",
        "filedeleteerror": "弗好删除文件“$1”。",
        "directorycreateerror": "创建目录“$1”失败。",
+       "directoryreadonlyerror": "目录“$1”是只读个。",
+       "directorynotreadableerror": "目录“$1”读弗出来。",
        "filenotfound": "寻弗着文件 \"$1\"。",
        "unexpected": "非正常值:“$1”=“$2”。",
        "formerror": "错误:提交表单失败",
        "badarticleerror": "呒处垃拉箇只页面进行箇只操作。",
        "cannotdelete": "无处删除页面或图像 \"$1\"。\n渠作兴已经拨别人家删除脱哉。",
        "cannotdelete-title": "\"$1\"箇页删弗爻",
+       "delete-hook-aborted": "删除畀钩子取消。\n渠弗曾畀出解释。",
        "no-null-revision": "\"$1\"页呒处建新个修改",
        "badtitle": "坏标题",
        "badtitletext": "所请求页面个标题是无效个、弗存在,跨语言或跨wiki链接个标题错误。渠作兴包含一只或多只弗好用拉标题里向字符。",
+       "title-invalid-characters": "请求个页面标题包括无效字符:“$1”。",
+       "title-invalid-too-long": "请求个页面标题忒长。作为UTF-8编码,它弗好超过$1个{{PLURAL:$1|字节}}。",
        "perfcached": "下向是缓存数据,呒数弗是最新个。 A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
        "perfcachedts": "下头是缓存数据,阿末一趟更新辰光是$1。缓存里最多有{{PLURAL:$4|$4条结果}}。",
        "querypage-no-updates": "当前禁止对此页面进行更新。箇搭个数据弗好立即刷新。",
        "viewsource": "望源码",
+       "viewsource-title": "望“$1”个源代码",
        "actionthrottled": "动作已压制",
        "actionthrottledtext": "基于反垃圾链接个考量,限制垃拉短时间内多趟重复箇只操作。请过脱几分钟再试试看。",
        "protectedpagetext": "箇页锁牢定,防编搭各许操作。",
        "invalidtitle-unknownnamespace": "非法个题目头,有弗识个数字$1搭文字$2",
        "exception-nologin": "朆登录",
        "exception-nologin-text": "请登录来访问箇页面或操作。",
+       "exception-nologin-text-manual": "望箇页面或者操作需要侬$1。",
        "virus-badscanner": "设置问题:未知个反病毒扫描器:''$1''",
        "virus-scanfailed": "扫描失败(代码 $1)",
        "virus-unknownscanner": "未知个反病毒扫描器:",
        "wrongpassword": "密码弗对。请侬再试试看。",
        "wrongpasswordempty": "密码为空,请重试。",
        "passwordtooshort": "密码起码要$1个字符。",
+       "passwordtoolong": "密码弗能超过{{PLURAL:$1|$1个字符}}。",
        "password-name-match": "密码弗好搭户名一样。",
        "password-login-forbidden": "用箇名字搭密码是弗准个。",
        "mailmypassword": "重置密码",
        "createaccount-text": "有人垃拉{{SITENAME}}里向利用侬个邮箱创建仔一只叫 \"$2\" 个新帐户($4),密码是 \"$3\" 。侬应该立即登录并更改密码。\n\n如果箇个账户创建错误个说话,侬可以忽略此信息。",
        "login-throttled": "你侬试登忒多次哉。\n等 $1 再试试凑相。",
        "login-abort-generic": "登录弗成功 - 已终止",
+       "login-migrated-generic": "侬个账号已经畀移脱哉,并且侬个用户名来箇wiki弗再存在。",
        "loginlanguagelabel": "语言:$1",
        "suspicious-userlogout": "侬登出个要求已经拨回头脱,因为渠可能是由已损坏个浏览器或者缓存代理传送个。",
        "pt-login": "登录",
        "loginreqlink": "登录",
        "loginreqpagetext": "侬必须$1再好查看其它页面。",
        "accmailtitle": "密码已发送哉。",
-       "accmailtext": "已经为[[User talk:$1|$1]] 产生只随机密码,并且已经发送到$2。\n\n登录之后,侬可以垃拉 ''[[Special:ChangePassword|箇只页面]]''更改密码。",
+       "accmailtext": "已经为[[User talk:$1|$1]]产生只随机密码,并且已经发送到$2。登录之后,侬可以垃拉<em>[[Special:ChangePassword|箇只页面]]</em>更改密码。",
        "newarticle": "(新)",
        "newarticletext": "倷跟仔链接来着一个还弗勒里个页面。\n要创建该页面呢,就勒下底个框框里向开始写([$1 帮助页面]浪有更加多个信息)。\n要是倷是弗用心到该搭个说话,只要点击倷浏览器个'''返回'''揿钮。",
        "anontalkpagetext": "---- ''箇是一个还弗曾建立账户个匿名用户个讨论页, 箇咾我伲只好用IP地址来搭渠联络。该IP地址可能由几名用户共享。如果侬是一名匿名用户并认为箇只页面高头个评语搭侬弗搭界,请 [[Special:UserLogin/signup|创建新账户]]或[[Special:UserLogin|登录]]来避免垃拉将来搭其他匿名用户混淆。''",
        "revdelete-confirm": "假使侬想箇能介做个闲话,请确认侬已经清爽箇能介做个后果,外加箇个程序符合[[{{MediaWiki:Policy-url}}|政策]]。",
        "revdelete-suppress-text": "'''只有'''出现下头眼情况再应阻止访问:\n* 弗适合个个人信息\n*: ''家庭地址、电话号码、身份证号码等。''",
        "revdelete-legend": "设置可见性之限制",
-       "revdelete-hide-text": "隐藏修订文本",
+       "revdelete-hide-text": "修订文本",
        "revdelete-hide-image": "隐藏文件内容",
-       "revdelete-hide-name": "隐藏动作搭仔目标",
-       "revdelete-hide-comment": "隐藏编辑备注",
-       "revdelete-hide-user": "隐藏编辑者个用户名/IP地址",
+       "revdelete-hide-name": "隐藏目标搭仔参数",
+       "revdelete-hide-comment": "编辑摘要",
+       "revdelete-hide-user": "者个用户名/IP地址",
        "revdelete-hide-restricted": "同时阻止管理员与其他用户查看数据",
        "revdelete-radio-same": "(弗要更改)",
-       "revdelete-radio-set": "",
-       "revdelete-radio-unset": "å\90¦",
+       "revdelete-radio-set": "囥脱",
+       "revdelete-radio-unset": "å\8f¯è§\81",
        "revdelete-suppress": "同时阻止管理员与其他用户查看数据",
        "revdelete-unsuppress": "垃拉已恢复个修订里向移除限制",
        "revdelete-log": "理由:",
        "revdelete-no-change": "警告:于$1 $2之项目已经请求仔可见性设置。",
        "revdelete-concurrent-change": "更改于$1 $2之项目错误:我伲尝试更改渠个设置个辰光,已经拨别人家更改过。请检查纪录。",
        "revdelete-only-restricted": "隐藏$1 $2个项目个辰光发生错误:侬弗好垃拉选择仔另一可见性选项后废止管理员查看该项目。",
-       "revdelete-reason-dropdown": "*常用删除理由\n** 侵犯版权\n** 弗适合个个人资料",
+       "revdelete-reason-dropdown": "*常用删除理由\n** 侵犯版权\n** 弗合适个评论或个人资料\n** 弗合适个用户名\n** 诽谤",
        "revdelete-otherreason": "别个/附加理由:",
        "revdelete-reasonotherlist": "别个理由",
        "revdelete-edit-reasonlist": "编辑删除理由",
        "revdelete-offender": "版本作者:",
        "suppressionlog": "阻止日志",
-       "suppressionlogtext": "下头是只删除搭仔封锁列表,包括对管理员隐藏个内容。\n参看[[Special:IPBlockList|IP封锁名单]]来了解目前有效个禁止搭仔封锁之名单。",
+       "suppressionlogtext": "下头是只删除搭仔封锁列表,包括对管理员囥脱个内容。\n参看[[Special:BlockList|封锁名单]]来了解目前有效个禁止搭仔封锁之名单。",
        "mergehistory": "合并页面历史",
        "mergehistory-header": "箇只页面可以让侬拿来源页面个修订历史合并到新页面里向。\n请确保此次更改能继续保持历史页面个连续性。",
        "mergehistory-box": "合并两只页面个修订历史:",
        "search-section": "(段落 $1)",
        "search-suggest": "你侬是寻:$1",
        "search-interwiki-caption": "姊妹项目",
-       "search-interwiki-default": "$1项结果:",
+       "search-interwiki-default": "来自$1个结果:",
        "search-interwiki-more": "(更多)",
        "search-relatedarticle": "相关",
        "searchrelated": "相关",
        "prefs-rc": "近段辰光个改动",
        "prefs-watchlist": "监控列表",
        "prefs-watchlist-days": "勒拉监控列表里向显示个日数:",
-       "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}",
+       "prefs-watchlist-days-max": "最长$1日天",
        "prefs-watchlist-edits": "勒拉扩展个监控列表里向显示个编辑趟数:",
        "prefs-watchlist-edits-max": "顶多:1000",
        "prefs-watchlist-token": "监控列表记认:",
        "prefs-misc": "杂项",
        "prefs-resetpass": "更改密码",
+       "prefs-changeemail": "更改电子邮箱地址",
        "prefs-email": "邮箱选项",
        "prefs-rendering": "外观",
        "saveprefs": "保存",
        "savedprefs": "倷个偏好已经保存哉。",
        "timezonelegend": "时区:",
        "localtime": "当地辰光:",
-       "timezoneuseserverdefault": "使用服务器默认值",
+       "timezoneuseserverdefault": "使用wiki默认值($1)",
        "timezoneuseoffset": "其它(指定时差)",
        "servertime": "服务器辰光:",
        "guesstimezone": "从浏览器填写",
        "timezoneregion-asia": "亚洲",
        "timezoneregion-atlantic": "大西洋",
        "timezoneregion-australia": "澳洲",
+       "timezoneregion-europe": "欧洲",
+       "timezoneregion-indian": "印度洋",
+       "timezoneregion-pacific": "太平洋",
        "allowemail": "接受别个用户个电子邮件",
        "prefs-searchoptions": "搜寻",
        "prefs-namespaces": "名字空间",
        "default": "默认",
        "prefs-files": "文件",
        "youremail": "电子信箱:",
-       "username": "用户名:",
+       "username": "{{GENDER:$1|用户名}}:",
        "yourrealname": "真名字:",
        "yourlanguage": "语言:",
        "yournick": "绰号:",
        "badsig": "无效原始签名;检查 HTML 标签。",
-       "gender-unknown": "æ\88\91å¼\97æ\83³è¬\9b",
+       "gender-unknown": "æ\8f\90å\88°ä¾¬ä¸ªè¾°å\85\89ï¼\8c软件ä¼\9aå°½é\87\8fç\94¨æ\80§å\88«ä¸­ç«\8b个è¯\8dæ±\87",
        "gender-male": "佢写Wiki",
        "gender-female": "\"姖\"写Wiki",
        "email": "电子邮件",
        "prefs-help-email": "电子信由你侬填弗填,转设密码用得着。",
        "prefs-help-email-others": "你侬也好来你侬个用户|讨论页里添加自己个电子信连接畀别人联系你用。\n别人联系你是弗晓得你侬个电子信地址个。",
        "prefs-help-email-required": "需要电子邮件地址。",
+       "prefs-dateformat": "日脚格式",
        "userrights-user-editname": "输入用户名:",
        "group-bot": "机器人",
        "group-sysop": "管理员",
        "group-bureaucrat": "行政员",
        "group-all": "(全)",
-       "group-bot-member": "机器人",
-       "group-sysop-member": "管理员",
-       "group-bureaucrat-member": "行政员",
+       "group-bot-member": "{{GENDER:$1|机器人}}",
+       "group-sysop-member": "{{GENDER:$1|管理员}}",
+       "group-bureaucrat-member": "{{GENDER:$1|行政员}}",
        "grouppage-bot": "{{ns:project}}:机器人",
        "grouppage-sysop": "{{ns:project}}:管理员",
        "grouppage-bureaucrat": "{{ns:project}}:行政员",
        "unwatchthispage": "停止监控",
        "notanarticle": "弗是內容頁",
        "watchlist-details": "弗包括讨论页,有 $1 页徕你侬关注表里向。",
+       "wlnote": "下底是{{PLURAL:$2|过去<strong>$2</strong>个钟头}}个{{PLURAL:$1|最后<strong>$1</strong>届更改}},截至$3 $4。",
        "wlshowlast": "显示上 $1 个钟头 $2 日",
        "watchlist-options": "监控列表选项",
        "watching": "监控……",
        "protect-othertime": "各許時間:",
        "protect-othertime-op": "各許時間",
        "protect-otherreason-op": "各許原因",
+       "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": "限制级别:",
        "minimum-size": "最小大細",
        "ipbreason": "理由:",
        "ipbsubmit": "封杀该个用户",
        "ipbother": "其它时间:",
-       "ipboptions": "2个钟头:2 hours,1日:1 day,3日:3 days,1个礼拜:1 week,2个礼拜:2 weeks,1个月日:1 month,3个月日:3 months,6个月日:6 months,1年:1 year,老世:infinite",
+       "ipboptions": "2个钟头:2 hours,1天:1 day,3天:3 days,1个礼拜:1 week,2个礼拜:2 weeks,1个号头:1 month,3个号头:3 months,6个号头:6 months,1年:1 year,老世:infinite",
        "badipaddress": "无效 IP 地址",
        "ipblocklist": "封脱个用户",
        "infiniteblock": "永远",
        "tooltip-pt-logout": "登出",
        "tooltip-pt-createaccount": "建议你建立一个账号并登录,但必过箇弗是板要个",
        "tooltip-ca-talk": "讨论内容页",
-       "tooltip-ca-edit": "ç®\87页你侬好ç¼\96ã\80\82ä¿\9då­\98ä¹\8bå\89\8dæ\9c\9bæ\9c\9bç\9b¸èµ·ã\80\82",
+       "tooltip-ca-edit": "ç¼\96è¾\91ç®\87页",
        "tooltip-ca-addsection": "开始新段",
        "tooltip-ca-viewsource": "箇页受保护,你好望源代码",
        "tooltip-ca-history": "箇页以早个版本",
        "show-big-image-size": "$1×$2像素",
        "newimages": "新文件陈列室",
        "ilsubmit": "搜寻",
+       "hours": "$1个钟头",
+       "hours-ago": "$1个钟头前",
        "bad_image_list": "格式如下:\n\n只列出项目(线开始* )的审议。\n第一个环节上线必须是一个链接到一个坏文件。\n其后的任何链接在同一行被认为是例外情况,即网页的文件,则可能会发生内部。",
        "variantname-zh-tw": "台湾",
        "metadata": "元数据",
index f341b8c..4b20e8b 100644 (file)
        "linksearch-pat": "ძიების თარგი:",
        "linksearch-ns": "ჯოხოეფიშ ოფირჩა:",
        "linksearch-ok": "გორუა",
-       "linksearch-text": "შესაძლებელია გამოიყენოთ ქვეხაზოვანი სიმბოლოები, მაგალითად, \"*.wikipedia.org\".\nუკიდურეს შემთხვევაში საჭიროა ზედა დონის დომენი, მაგალითად \"*.org\"<br />\nმხარდამჭერი {{PLURAL:$2|პროტოკოლი|პროტოკოლები}}: <code>$1</code> (სტანდარტულად http:// თუკი პროტოკოლი არ არის მითითებული)",
+       "linksearch-text": "შესაძლებელია გამოიყენოთ ქვეხაზოვანი სიმბოლოები, მაგალითად, \"*.wikipedia.org\".\nუკიდურეს შემთხვევაში საჭიროა ზედა დონის დომენი, მაგალითად \"*.org\"<br />\nმხარდამჭერი {{PLURAL:$2|პროტოკოლი|პროტოკოლები}}: $1 (სტანდარტულად http:// თუკი პროტოკოლი არ არის მითითებული)",
        "linksearch-line": "$1 მერცხიილი რე $2-შე",
        "linksearch-error": "წარმოდგენილი სიმბოლოების გამოყენება შესაძლებელია მხოლოდ მისამართის დასაწყისში.",
        "listusersfrom": "გეგმარჩქინ ხასილეფ დოჭყაფილ:",
index 500a168..ca13562 100644 (file)
        "protectedinterface": "דער בלאַט שטעלט צו באניצער־אויבערפלאך טעקסט פֿאַרן װײכװאַרג אויף דער דאזיקער וויקי, און איז פֿאַרשפּאַרט כּדי צו פֿאַרמײַדן װאַנדאַליזם.\nכדי צולייגן אדער ענדערן איבערזעצונגען פאר אלע וויקיס, זייט אזוי גוט ניצן [//translatewiki.net/ translatewiki.net], דער מעדיעוויקי לאקאליזאציע פראיעקט.",
        "editinginterface": "<strong>ווארענונג:</strong> איר באַאַרבעט א בלאט וואס ווערט געניצט צוצושטעלן אינטערפֿייס טעקסט פאר דער ווייכווארג.\nענדערונגען אין דעם בלאַט וועלן טוישן דאס אויסזען פון די סיסטעם מודעות פאר אנדערע באניצער אויף דער וויקי.",
        "translateinterface": "כדי צו צולייגן איבערזעצונגען פאר אלע וויקיס, זײַט אזוי גוט און ניצט [//translatewiki.net/ translatewiki.net], דער מעדיעוויקי לאקאליזירונג פראיעקט.",
-       "cascadeprotected": "×\93ער ×\91×\9c×\90×\98 ×\90×\99×\96 ×¤×\90רשפ×\90ר×\98 ×¦×\95×\9d ×¢× ×\93ער×\9f ×\95×\95×\99×\91×\90×\9c×\93 ×¢×¨ ×\90×\99×\96 ×\90×\99×\99× ×\92עש×\9c×\90ס×\9f ×\90×\99×\9f ×\90×\99×\99× ×¢ ×¤×\95×\9f ×\93×\99 ×¤×\90×\9c×\92× ×\93×¢ {{PLURAL:$1|×\91×\9c×\90×\98, ×\95×\95×\90ס ×\90×\99×\96\91×\9c×¢×\98ער, ×\95×\95×\90ס ×\96×¢× ×¢×\9f}} ×\91×\90ש×\99צ×\98 ×\9e×\99×\98 ×\93ער ×§×\90סק×\99×\99ד אפציע:\n\n$2",
+       "cascadeprotected": "×\93ער ×\91×\9c×\90×\98 ×\90×\99×\96 ×\92×¢×\95×\95×\90ר×\9f ×\91×\90ש×\99צ×\98 ×¤×\95×\9f ×¨×¢×\93×\90ק×\98×\99ר×\9f ×\95×\95×\99×\91×\90×\9c×\93 ×¢×¨ ×\90×\99×\96 ×\90×\99×\99× ×\92עש×\9c×\90ס×\9f ×\90×\99×\9f {{PLURAL:$1|×\93×¢×\9d ×¤×\90×\9c×\92× ×\93×\9f ×\91×\9c×\90×\98, ×\95×\95×\90ס ×\90×\99×\96\93×\99 ×¤×\90×\9c×\92× ×\93×¢ ×\91×\9c×¢×\98ער, ×\95×\95×\90ס ×\96×¢× ×¢×\9f}} ×\91×\90ש×\99צ×\98 ×\9e×\99×\98 ×\93ער ×§×\90סק×\90ד אפציע:\n\n$2",
        "namespaceprotected": "איר זענט נישט ערלויבט צו רעדאקטירן בלעטער אינעם '''$1''' נאמענטייל.",
        "customcssprotected": "איר האט נישט רשות צו רעדאַקטירן דעם CSS בלאַט, ווײַל ער אַנטהאַלט די פערזענלעכע באַשטימונגען פון אַן אַנדער באַניצער.",
        "customjsprotected": "איר האט נישט רשות צו רעדאַקטירן דעם JavaScript בלאַט, ווײַל ער אַנטהאַלט די פערזענלעכע באַשטימונגען פון אַן אַנדער באַניצער.",
        "readonlywarning": "'''ווארענונג: די דאטנבאזע איז געווארן פארשלאסן פאר אויפהאלטונג, ממילא וועט איר נישט קענען אפהיטן אייערע ענדערונגען אצינד. '''\nאיר קענט קאפירן און ארײַנלייגן דעם טעקסט אריין צו א טעקסט טעקע און דאס דארטן אפהיטן אויף שפעטער.\n\nדער אדמיניסטראטאר וואס האט זי פארשלאסן האט מסביר געווען אזוי: $1",
        "protectedpagewarning": "'''ווארענונג:  דער בלאט איז געווארן פארשפארט אז בלויז באניצערס מיט סיסאפ פריווילעגיעס קענען אים ענדערן.'''\nדי פארגאנגענע לאגבוך באשרײַבונג ווערט געוויזן דא:",
        "semiprotectedpagewarning": "'''באמערקונג:''' דער דאָזיקער בלאַט איז פאַרשפּאַרט, אַזוי אַז בלויז איינגעשריבענע באַניצער קענען אים ענדערן.\nדאָס פאַרגאַנגענע לאָגבוך באַשרייבונג ווערט געוויזן דאָ:",
-       "cascadeprotectedwarning": "'''ווארענונג:''' דער בלאט איז פארשפארט אז בלויז סיסאפן קענען אים ענדערן, וויבאלד ער איז איינגעשלאסן אין {{PLURAL:$1| דעם פאלגנדן בלאט, וואס איז|די פאלגנדע בלעטער, וואס זענען}} קאסקאד באשיצט:",
+       "cascadeprotectedwarning": "<strong>ווארענונג:</strong> דער בלאט איז פארשפארט אז בלויז סיסאפן קענען אים ענדערן, וויבאלד ער איז איינגעשלאסן אין {{PLURAL:$1| דעם פאלגנדן בלאט, וואס איז|די פאלגנדע בלעטער, וואס זענען}} קאסקאד באשיצט:",
        "titleprotectedwarning": "'''אזהרה: דער בלאט איז פֿארשפאַרט טא דארף מען [[Special:ListGroupRights|ספעציפֿישע רעכטן]] צו שאפֿן אים.'''\nדי פֿאַרגאַנגענע לאגבוך באשרײַבונג ווערט געוויזן דאָ:",
        "templatesused": "{{PLURAL:$1|מוסטער|מוסטערן}} באנוצט אויף דעם בלאט:",
        "templatesusedpreview": "{{PLURAL:$1|מוסטער| מוסטערן}}  באַניצט  אין דעם פֿאָראױסקוק:",
        "content-model-css": "CSS",
        "content-json-empty-object": "ליידיגער אביעקט",
        "content-json-empty-array": "ליידיגער אריי",
+       "duplicate-args-warning": "<strong>ווארענונג:</strong> [[:$1]] רופט [[:$2]] מיט מער ווי איין ווערט פארן פאראמעטער \"$3\". נאר דעם לעצטן ווערט וועט מען ניצן.",
        "duplicate-args-category": "בלעטער וואס ניצן געטאפלטע ארגומענטן אין מוסטער רופן",
        "duplicate-args-category-desc": "דער בלאט אנטהאלט מוסטער־אויפרופן וואס ניצן דופליקאטן פון ארגומענטן, ווי למשל <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''אזהרה:''' דער בלאט אנטהאלט צופיל טייערע פארזירער רופן.\n\nער דארף האבן ווינציגער פון  $2 {{PLURAL:$2|רוף|רופן}}, אבער אצינד {{PLURAL:$1|איז דא $1 רוף|זענען דא $1 רופן}}.",
        "protect-text": "איר מעגט זען און ענדערן דעם שוץ ניווא דא פֿארן בלאט '''$1'''.",
        "protect-locked-blocked": "איר קען נישט ענדערן דעם שוץ ניווא בעת ווען איר זענט בלאקירט.\nפֿאלגנד זענען די לויפֿיגע שטעלונגען פֿארן בלאט '''$1''':",
        "protect-locked-access": "אייער קאנטע האט נישט קיין ערלויבניש צו ענדערן בלאט שיצונג ניוואען.\nדא זענען די לויפֿיקע שטעלונגען פֿאַר דעם בלאַט '''$1''':",
-       "protect-cascadeon": "×\93ער ×\91×\9c×\90Ö·×\98 ×\90×\99×\96 ×\92עש×\99צ×\98 ×\90ַצ×\99× ×\93 ×\95×\95ײַ×\9c ×¢×¨ ×\90×\99×\96 ×\90ײַנ×\92עש×\9c×\90ס×\9f ×\90×\99×\9f  {{PLURAL:$1|×\93×¢×\9d ×¤Ö¿×\90×\9c×\92× ×\93×\9f ×\91×\9c×\90Ö·×\98, ×\95×\95×\90ס ×\94×\90×\98\93×\99 ×¤Ö¿×\90×\9c×\92× ×\93×¢ ×\91×\9c×¢×\98ער, ×\95×\95×\90ס ×\94×\90×\91×\9f}} ×§×\90ַסק×\90Ö·×\93×\99ר×\98×¢ ×©×\99צ×\95× ×\92.\n\nענדערונגען צום שיצונג ניווא פונעם בלאַט וועלן נישט ווירקן אויף דער קאַסקאַדירטער שיצונג .",
+       "protect-cascadeon": "×\93ער ×\91×\9c×\90Ö·×\98 ×\90×\99×\96 ×\92עש×\99צ×\98 ×\90ַצ×\99× ×\93 ×\95×\95ײַ×\9c ×¢×¨ ×\90×\99×\96 ×\90ר×\99×\91ער×\92עש×\9c×\90ס×\9f ×\90×\99×\9f  {{PLURAL:$1|×\93×¢×\9d ×¤Ö¿×\90×\9c×\92× ×\93×\9f ×\91×\9c×\90Ö·×\98, ×\95×\95×\90ס ×\94×\90×\98\93×\99 ×¤Ö¿×\90×\9c×\92× ×\93×¢ ×\91×\9c×¢×\98ער, ×\95×\95×\90ס ×\94×\90×\91×\9f}} ×§×\90ַסק×\90Ö·×\93×\99ר×\98×¢ ×©×\99צ×\95× ×\92.\nענדערונגען צום שיצונג ניווא פונעם בלאַט וועלן נישט ווירקן אויף דער קאַסקאַדירטער שיצונג .",
        "protect-default": "אלע באניצער ערלויבט",
        "protect-fallback": "דערלויבן נאר באניצער מיט \"$1\" ערלויבניש",
        "protect-level-autoconfirmed": "לאזן נאר אויטאמאטיש באשטעטיקטע באַניצער",
index b849ca4..4f05a3c 100644 (file)
        "resetpass-temp-password": "Ọ̀rọ̀ìpamọ́ fún ìgbà díẹ̀",
        "resetpass-abort-generic": "Ìyípadà ọ̀rọ̀ìpamọ́ ti jẹ́ jíjáwọ́ látọwọ́ àsomọ́ kan.",
        "passwordreset": "Ìtúntò ọ̀rọ̀ìpamọ́",
-       "passwordreset-legend": "Ìtúntò ọ̀rọ̀ìpamọ́",
        "passwordreset-disabled": "Ìdálẹ́kun ìtúntò ọ̀rọ̀ìpamọ́ lórí wiki yìí.",
        "passwordreset-emaildisabled": "Ìdálẹ́kun lílo email lórí wiki yìí.",
        "passwordreset-username": "Orúkọ oníṣe:",
        "nlinks": "{{PLURAL:$1|ìjápọ̀|àwọn ìjápọ̀}} $1",
        "nmembers": "{{PLURAL:$1|ará|àwọn ará}} $1",
        "nrevisions": "{{PLURAL:$1|àtúnyẹ̀wò|àwọn àtúnyẹ̀wò}} $1",
-       "nviews": "{{PLURAL:$1|Ìwò|Àwọn ìwò}} $1",
        "nimagelinks": "Lílò lórí {{PLURAL:$1|ojúewé|àwọn ojúewé}} $1",
        "ntransclusions": "lílò lórí {{PLURAL:$1|ojúewé|àwọn ojúewé}} $1",
        "specialpage-empty": "Kò sí àwọn èsì kankan fún ìjábọ̀ yìí.",
        "linksearch-pat": "Ọ̀nà àwáàrí:",
        "linksearch-ns": "Orúkọàyè:",
        "linksearch-ok": "Ṣàwárí",
-       "linksearch-text": "Àwọn ọ̀rọ̀ àfiwá bíi \"*.wikipedia.org\" le ṣe é lò.\nOrúkọ ibiàyè pọndandan, fún àpẹrẹ \"*.org\".<br />\n{{PLURAL:$2|Prótókólù|Àwọn prótókólù}} tí a ṣàtìlẹ́yìn fún: <code>$1</code> (yíó bẹ̀rẹ̀ pẹ̀lú http:// tí prótókólù kankan kò bá jẹ́ títọ́kasí).",
+       "linksearch-text": "Àwọn ọ̀rọ̀ àfiwá bíi \"*.wikipedia.org\" le ṣe é lò.\nOrúkọ ibiàyè pọndandan, fún àpẹrẹ \"*.org\".<br />\n{{PLURAL:$2|Prótókólù|Àwọn prótókólù}} tí a ṣàtìlẹ́yìn fún: $1 (yíó bẹ̀rẹ̀ pẹ̀lú http:// tí prótókólù kankan kò bá jẹ́ títọ́kasí).",
        "linksearch-line": "$1 jẹ́ jíjápọ̀ láti $2",
        "linksearch-error": "Àwọn ọ̀rọ̀ àfiwá le hàn ní ìbẹ̀rẹ̀ orúkọ ibiìtakùn (hostname) nìkan.",
        "listusersfrom": "Ìfihàn àwọn oníṣe nípa bíbẹ̀rẹ̀ láti:",
index 5d21409..775b111 100644 (file)
@@ -29,7 +29,7 @@
                ]
        },
        "tog-underline": "連結加底線:",
-       "tog-hideminor": "最新更改唔顯示修改",
+       "tog-hideminor": "最新更改唔顯示修改",
        "tog-hidepatrolled": "響最近修改度隱藏巡查過嘅編輯",
        "tog-newpageshidepatrolled": "響新頁清單度隱藏巡查過嘅版",
        "tog-extendwatchlist": "展開監視清單去顯示全部更改,唔係淨係最新嘅",
        "tog-watchdeletion": "將我刪除嘅頁同檔案加入監視清單",
        "tog-watchrollback": "將我反轉過嘅頁加落監視清單",
        "tog-minordefault": "預設全部編輯做小修改",
-       "tog-previewontop": "喺修改欄上顯示預覽",
+       "tog-previewontop": "喺修改欄上顯示預覽",
        "tog-previewonfirst": "第一次修改時顯示預覽",
-       "tog-enotifwatchlistpages": "當響我張監視清單度嘅頁面同檔案有修改時電郵通知我",
-       "tog-enotifusertalkpages": "å\80\8b人ç\95\99è¨\80ç\89\88æ\9c\89ä¿®æ\94¹æ\99\82é\9b»é\83µé\80\9aç\9f¥æ\88\91",
-       "tog-enotifminoredits": "頁面同檔案小修改都要電郵通知我",
+       "tog-enotifwatchlistpages": "喺我張監視清單度嘅頁同檔有修改時,用電郵通知我。",
+       "tog-enotifusertalkpages": "å\96ºå\80\8b人ç\95\99è¨\80ç\89\88æ\9c\89ä¿®æ\94¹æ\99\82ï¼\8cç\94¨é\9b»é\83µé\80\9aç\9f¥æ\88\91ã\80\82",
+       "tog-enotifminoredits": "喺頁面同檔案有細修改時,用電郵通知我。",
        "tog-enotifrevealaddr": "喺電郵通知信上面話畀人聽我嘅電郵地址",
        "tog-shownumberswatching": "顯示有幾多人監視",
        "tog-oldsig": "現有簽名:",
        "tog-forceeditsummary": "我冇入修改註解時通知我",
        "tog-watchlisthideown": "響監視清單度隱藏我嘅編輯",
        "tog-watchlisthidebots": "響監視清單度隱藏機械人嘅編輯",
-       "tog-watchlisthideminor": "響監視清單度隱藏修改",
+       "tog-watchlisthideminor": "響監視清單度隱藏修改",
        "tog-watchlisthideliu": "響監視清單度隱藏登入用戶",
        "tog-watchlisthideanons": "響監視清單度隱藏匿名用戶",
        "tog-watchlisthidepatrolled": "響監視清單度隱藏巡查過嘅編輯",
-       "tog-ccmeonemails": "當我寄電郵畀其他人嗰陣寄返封副本畀我",
+       "tog-ccmeonemails": "喺我寄電郵畀其他人嗰陣,寄返封副本畀我。",
        "tog-diffonly": "響差異下面唔顯示頁面內容",
        "tog-showhiddencats": "顯示隱藏類",
        "tog-norollbackdiff": "進行反轉之後略過差異",
        "creating": "開版$1",
        "editingsection": "而家喺度編輯$1 (小節)",
        "editingcomment": "而家喺度編輯$1 (新小節)",
-       "editconflict": "由於編輯衝突,{{GENDER:|你|妳|你}}嘅修改記唔低。{{GENDER:|你|妳|你}}想唔想人手解決呢個衝突?",
+       "editconflict": "ç\94±æ\96¼ç·¨è¼¯è¡\9dçª\81ï¼\8c{{GENDER:|ä½ |妳|ä½ }}å\96º$1å\98\85ä¿®æ\94¹è¨\98å\94\94ä½\8eã\80\82{{GENDER:|ä½ |妳|ä½ }}æ\83³å\94\94æ\83³äººæ\89\8b解決å\91¢å\80\8bè¡\9dçª\81ï¼\9f",
        "explainconflict": "有其他人喺你開始編輯之後已經更改呢一頁。\n喺上面嗰個空間而家現存嘅頁面文字。\n你嘅更改會喺下面嘅文字空間顯示。\n你需要合併你嘅更改到原有嘅文字。\n喺你撳「{{int:savearticle}}」之後,'''只有'''喺上面嘅文字區會被儲存。",
        "yourtext": "你嘅文字",
        "storedversion": "已經儲存咗嘅修訂",
        "yourdiff": "差異",
        "copyrightwarning": "請留意喺{{SITENAME}}度,所有喺呢度嘅貢獻會被考慮到喺$2之下發出(睇$1有更詳細嘅資訊)。如果你係唔想你編輯嘅文字無喇喇咁被分發,咁就唔好喺呢度遞交。\n\n你亦都要同我哋保證啲文字係你自己寫嘅,或者係由公有領域或相似嘅自由資源複製落嚟。\n'''喺未有任何許可嘅情況之下千祈唔好遞交有版權嘅作品!'''",
        "copyrightwarning2": "請留意喺{{SITENAME}}度,所有嘅貢獻可能會被其他嘅貢獻者編輯、修改,或者刪除。如果你係唔想你編輯嘅文字無喇喇咁被編輯,咁就唔好喺呢度遞交。\n\n你亦都要同我哋保證啲文字係你自己寫嘅,或者係由公有領域或相似嘅自由資源複製落嚟(睇$1有更詳細嘅資訊)。\n'''喺未有任何許可嘅情況之下千祈唔好遞交有版權嘅作品!'''",
+       "editpage-cannot-use-custom-model": "呢頁嘅目錄模型唔改得",
        "longpageerror": "<strong>出錯:你所遞交嘅文字係有 {{PLURAL:$1|1 KB|$1 KB}} 咁長,長過最大嘅 {{PLURAL:$2|1 KB|$2 KB}}。</strong>\n儲唔到你遞交嘅文字。",
        "readonlywarning": "<strong>警告:資料庫已經鎖住咗去做定期保養。而家你唔可以儲起你嘅編輯。</strong>\n\n你可以儲啲文字落一份文字檔先。\n\n管理員嘅解釋: $1",
        "protectedpagewarning": "'''警告:呢版已經受到保護,只有管理員權限嘅用戶先至可以改。'''\n最近嘅日誌響下面提供以便參考:",
        "semiprotectedpagewarning": "'''注意:'''呢一頁已經保護咗,只有已經註冊嘅用戶先至可以改。\n最近嘅日誌響下面提供以便參考:",
-       "cascadeprotectedwarning": "'''è­¦å\91\8aï¼\9a'''å\91¢ä¸\80é \81å·²ç¶\93ä¿\9dè­·å\92\97ï¼\8cå\8fªæ\9c\89管理員權限嘅用戶先至可以改,因為佢係響以下連串保護嘅{{PLURAL:$1|一|幾}}頁度包含咗:",
+       "cascadeprotectedwarning": "'''è­¦å\91\8aï¼\9a'''å\91¢ä¸\80é \81å·²ç¶\93ä¿\9dè­·å\92\97ï¼\8cå\87\88å¾\97管理員權限嘅用戶先至可以改,因為佢係響以下連串保護嘅{{PLURAL:$1|一|幾}}頁度包含咗:",
        "titleprotectedwarning": "'''警告:呢一版已經保護咗,需要一啲[[Special:ListGroupRights|指定權限]]先至可以開到。'''\n最近嘅日誌響下面提供以便參考:",
        "templatesused": "呢版用嘅{{PLURAL:$1|模}}:",
        "templatesusedpreview": "呢一次預覽裏面,用咗下面呢啲{{PLURAL:$1|模|模}}:",
        "postedit-confirmation-saved": "呢版經已儲存咗。",
        "edit-already-exists": "唔可以開一新版。\n佢已經存在。",
        "defaultmessagetext": "預設訊息文字",
+       "content-failed-to-parse": "從$1模型解析到$2目錄時肥佬咗。原因:$3。",
        "invalid-content-data": "無效嘅內容資料",
        "content-not-allowed-here": "「$1」唔可以輸入[[$2]]。",
        "editwarning-warning": "離開爾一版會令到閣下嘅修改唔見咗。\n閣下可以喺喜好設定嘅\"{{int:prefs-editing}}\"小節度停用爾個警告。",
        "editpage-notsupportedcontentformat-title": "唔支持爾種內容格式。",
+       "editpage-notsupportedcontentformat-text": "指定嘅目錄類$1同$2唔兼容",
        "content-model-wikitext": "維基文字",
        "content-model-text": "純文字",
        "content-model-javascript": "JavaScript程式語言",
        "parser-template-loop-warning": "已偵測迴模: [[$1]]",
        "parser-template-recursion-depth-warning": "迴模深度限制超過咗 ($1)",
        "language-converter-depth-warning": "字體變換器深度限制超過咗 ($1)",
+       "node-count-exceeded-category": "有頁面超出咗指定數",
+       "node-count-exceeded-category-desc": "頁數超過最大限制,快啲返去改過。",
+       "node-count-exceeded-warning": "頁面超出指定數",
        "undo-success": "呢個編輯可以取消。請檢查一下個差異去確認呢個係你要去做嘅,跟住儲存下面嘅更改去完成編輯。",
        "undo-failure": "呢個編輯唔能夠取消,由於同途中嘅編輯有衝突。",
        "undo-norev": "呢個編輯唔能夠取消,由於佢唔存在或者刪除咗。",
        "history-feed-description": "響哩個wiki嘅哩一頁嘅修訂歷史",
        "history-feed-item-nocomment": "$1 響 $2",
        "history-feed-empty": "要求嘅頁面並唔存在。\n佢可能響哩個 wiki 度刪除咗或者改咗名。\n試吓[[Special:Search|響哩個wiki度搵]]有關新頁面嘅資料。",
+       "history-edit-tags": "編輯已經揀咗嘅分頁",
        "rev-deleted-comment": "(編輯摘要已經移除咗)",
        "rev-deleted-user": "(用戶名已經移除咗)",
        "rev-deleted-event": "(日誌詳情已經移除咗)",
        "rev-deleted-user-contribs": "[用戶名或IP地址拎走咗 - 響貢獻度隱藏咗編輯]",
        "rev-deleted-text-permission": "呢頁嘅修訂已經被'''洗咗'''。\n喺[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 刪除日誌]裏面可以搵到更詳細嘅資料。",
+       "rev-suppressed-text-permission": "呢頁嘅修訂已經'''廢止咗'''。\n你可以去睇吓佢;\n喺[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 廢止日誌]裏面可以搵到更詳細嘅資料。",
        "rev-deleted-text-unhide": "呢頁嘅修訂已經被'''洗咗'''。\n喺[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 刪除日誌]裏面可以搵到更詳細嘅資料。\n如果你想繼續嘅話,可以仍然[$1 睇番呢次修訂]。",
        "rev-suppressed-text-unhide": "呢頁嘅修訂已經被'''廢止咗'''。\n喺[{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} 廢止日誌]裏面可以搵到更詳細嘅資料。\n如果你想繼續嘅話,可以仍然[$1 睇番呢次修訂]。",
        "rev-deleted-text-view": "呢頁嘅修訂已經'''洗咗'''。\n你可以去睇吓佢;\n喺[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]裏面可以搵到更詳細嘅資料。",
        "rev-showdeleted": "顯示",
        "revisiondelete": "刪除/反刪除修訂",
        "revdelete-nooldid-title": "無效嘅目標修訂",
-       "revdelete-nooldid-text": "講清用邊個修訂去做呢樣嘢、\n所指定嘅修訂唔存在,或者你試緊去隱藏現時嘅修訂。",
+       "revdelete-nooldid-text": "講清用邊個修訂去做呢樣嘢、所指定嘅修訂唔存在或你試緊去隱藏現時嘅修訂。",
        "revdelete-no-file": "指定嘅檔案未存在。",
        "revdelete-show-file-confirm": "你係咪真係想去睇響$2 $3刪咗 \"$1\" 嘅檔案修訂?",
        "revdelete-show-file-submit": "係",
        "prefs-diffs": "差異",
        "prefs-help-prefershttps": "呢項喜好設定會喺你下次簽到先至開始生效。",
        "prefswarning-warning": "你改嘅喜好設定改動重未記低。\n如果你未撳「$1」就走咗,你嘅喜好設定唔會有更新。",
+       "prefs-tabs-navigation-hint": "貼士:可以用鍵盤嘅←或→掣睇一覽內嘅分頁",
        "email-address-validity-valid": "電郵地址睇嚟有效",
        "email-address-validity-invalid": "請打一個有效嘅電郵地址",
        "userrights": "用戶權限管理",
        "userrights-notallowed": "你無權限去加減用戶權限。",
        "userrights-changeable-col": "你可以改嘅組",
        "userrights-unchangeable-col": "你唔可以改嘅組",
+       "userrights-removed-self": "移走自身權限成功,但你冇乜可能入到呢頁。",
        "group": "組:",
        "group-user": "用戶",
        "group-autoconfirmed": "自動確認用戶",
        "right-editusercssjs": "編輯其他用戶嘅CSS同埋JavaScript檔",
        "right-editusercss": "編輯其他用戶嘅CSS檔",
        "right-edituserjs": "編輯其他用戶嘅JavaScript檔",
+       "right-editmyusercss": "編輯戶口嘅CSS文件",
+       "right-editmyuserjs": "編輯戶口嘅JavaScript文件",
+       "right-viewmywatchlist": "睇你自己嘅監視一覽",
+       "right-viewmyprivateinfo": "睇下個人信息(例如電郵或真名)",
+       "right-editmyprivateinfo": "修改個人信息(例如電郵或真名)",
+       "right-editmyoptions": "設定個人參數",
        "right-rollback": "快速反轉上位用戶對某一版嘅編輯",
        "right-markbotedits": "標示反轉編輯做機械人編輯",
        "right-noratelimit": "唔受利用率限制影響",
        "right-siteadmin": "鎖同解鎖資料庫",
        "right-override-export-depth": "倒出包含有五層深連版嘅頁面",
        "right-sendemail": "寄電郵畀其他用戶",
+       "right-passwordreset": "檢查密碼/重設電郵",
+       "right-managechangetags": "從數據庫度開或刪走[[Special:Tags|tags]]",
        "newuserlogpage": "使用者開戶記錄",
        "newuserlogpagetext": "呢個係一個使用者開戶嘅日誌",
        "rightslog": "用戶權限日誌",
        "action-createpage": "開版",
        "action-createtalk": "開討論版",
        "action-createaccount": "開呢個用戶戶口",
+       "action-history": "睇呢頁嘅歷史",
        "action-minoredit": "標示呢個編輯做細嘅",
        "action-move": "搬呢版",
        "action-move-subpages": "搬呢版同埋佢嘅細頁",
        "action-move-rootuserpages": "搬根用戶版",
+       "action-move-categorypages": "搬類頁",
        "action-movefile": "搬呢個檔案",
        "action-upload": "上載呢個檔案",
        "action-reupload": "覆蓋呢個現有嘅檔案",
        "action-viewmywatchlist": "睇監視清單",
        "action-viewmyprivateinfo": "睇你嘅私人資料",
        "action-editmyprivateinfo": "改你嘅私人資料",
+       "action-managechangetags": "從數據庫開或刪走啲符",
        "nchanges": "$1次更改",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|你上次嚟之後}}有 $1 個",
        "enhancedrc-history": "歷史",
        "uploaddisabledtext": "檔案上載已經停用。",
        "php-uploaddisabledtext": "PHP 檔案上載已經停用。請檢查 file_uploads 設定。",
        "uploadscripted": "呢個檔案包含可能會誤被瀏覽器解釋執行嘅 HTML 或 script 代碼。",
+       "uploadscriptednamespace": "呢個SVG文件可能有“$1”嘅非法字詞響度",
+       "uploadinvalidxml": "分析唔到已經上傳咗嘅XML文件",
        "uploadvirus": "呢個檔案有病毒!\n詳情:$1",
        "uploadjava": "呢個係個ZIP檔案包括Java .class檔案。\n因為保安問題,上傳Java檔案係禁止左嘅。",
        "upload-source": "來源檔案",
        "upload-misc-error-text": "響上載時發生咗未知嘅錯誤。請確認輸入咗嘅URL係可以訪問嘅,之後再試多一次。如果重有問題嘅話,請聯絡一位[[Special:ListUsers/sysop|管理員]]。",
        "upload-too-many-redirects": "個URL有太多跳轉",
        "upload-http-error": "一個HTTP錯誤發生咗: $1",
+       "upload-copy-upload-invalid-domain": "從嗰個域名度冇複製上傳功能",
+       "backend-fail-backup": "檔案 \"$1\" 唔備份得。",
        "backend-fail-notexists": "檔案$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」。",
        "uploadstash-badtoken": "進行呢個動作唔成功,或者你嘅編輯資訊已經過咗期。再試吓喇。",
        "uploadstash-errclear": "清除檔案唔成功。",
        "uploadstash-refresh": "更新檔案清單",
+       "invalid-chunk-offset": "非法偏移塊",
        "img-auth-accessdenied": "拒絕通行",
        "img-auth-nopathinfo": "PATH_INFO唔見咗。\n你嘅伺服器重未設定呢個資料。\n佢可能係CGI為本,唔支援img_auth。\n睇吓 https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization 。",
        "img-auth-notindir": "所請求嘅路徑唔響個已經設定咗嘅上載目錄。",
        "randomincategory-nopages": "[[:Category:$1|$1]]類入面無嘢。",
        "randomincategory-category": "類:",
        "randomincategory-legend": "類入面是但一版",
+       "randomincategory-submit": "搵",
        "randomredirect": "隨便彈",
        "randomredirect-nopages": "響 \"$1\" 空間名度冇一個彈去版。",
        "statistics": "統計",
        "linksearch-pat": "搵嘅形態:",
        "linksearch-ns": "空間名",
        "linksearch-ok": "搵",
-       "linksearch-text": "可以用類似「*.wikipedia.org」嘅萬用字元。\n需要至少一個頂級域名,好似「*.org」。<br />\n支援嘅{{PLURAL:$2|協議}}:<code>$1</code> (預設用 http:// 如果唔指定協議)",
+       "linksearch-text": "可以用類似「*.wikipedia.org」嘅萬用字元。\n需要至少一個頂級域名,好似「*.org」。<br />\n支援嘅{{PLURAL:$2|協議}}:$1 (預設用 http:// 如果唔指定協議)",
        "linksearch-line": "$1 連自 $2",
        "linksearch-error": "萬用字元只可以響主機名嘅開頭度用。",
        "listusersfrom": "顯示由呢個字開始嘅用戶:",
        "trackingcategories": "追蹤類",
        "trackingcategories-msg": "追蹤類",
        "trackingcategories-name": "訊息名",
+       "post-expand-template-inclusion-category-desc": "由於呢篇頁面嘥士喺擴展之前,已經超出咗<code>$wgMaxArticleSize</code>限制,所以好多模都擴展唔到。",
        "trackingcategories-nodesc": "冇解說資料",
        "trackingcategories-disabled": "類停用咗",
        "mailnologin": "冇傳送地址",
        "delete-toobig": "呢一版有一個好大量嘅編輯歷史,過咗$1次修訂。刪除呢類版嘅動作已經限制咗,以防止響{{SITENAME}}嘅意外擾亂。",
        "delete-warning-toobig": "呢一版有一個好大量嘅編輯歷史,過咗$1次修訂。刪除佢可能會擾亂{{SITENAME}}嘅資料庫操作;響繼續嗰陣請小心。",
        "deleteprotected": "你唔可以刪呢版,因為佢畀人保護咗。",
+       "deleting-backlinks-warning": "'''警告:'''你所鏈到或轉到嘅[[Special:WhatLinksHere/{{FULLPAGENAME}}|其它頁面]]已經俾人話刪。",
        "rollback": "反轉修改",
        "rollbacklink": "反轉",
        "rollbacklinkcount": "反轉 $1 次修改",
+       "rollbacklinkcount-morethan": "反轉超過$1次嘅{{PLURAL:$1|edit|修改}}",
        "rollbackfailed": "反轉唔到",
        "cantrollback": "反轉唔到;上一位貢獻者係唯一修改過呢版嘅人。",
        "alreadyrolled": "無法反轉[[User:$2|$2]]([[User talk:$2|留言]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])對[[:$1]]嘅最後編輯;有人已經修改過或者反轉咗呢個頁面。\n\n上次對呢版嘅編輯係由[[User:$3|$3]]([[User talk:$3|留言]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])做嘅。",
        "rollback-success": "已經反轉由$1所寫嘅編輯;恢復到$2嘅最後修訂。",
        "sessionfailure-title": "會話失敗",
        "sessionfailure": "你嘅登入會話 (session) 好似有啲問題;\n為咗防止會話劫持,呢個操作已經取消。\n請返去之前嗰版,重新載入嗰版然後再試。",
+       "changecontentmodel": "喺頁面內改目錄類",
+       "changecontentmodel-legend": "改目錄類",
+       "changecontentmodel-title-label": "版題",
+       "changecontentmodel-model-label": "開新嘅目錄類",
+       "changecontentmodel-reason-label": "原因:",
+       "changecontentmodel-success-title": "目錄類已經改咗",
+       "changecontentmodel-success-text": "[[:$1]]目錄類已經改變咗",
+       "changecontentmodel-cannot-convert": "唔可以喺[[:$1]]嘅目錄轉成$2嘅類。",
+       "changecontentmodel-title-cantexist": "$1冇呢頁,可能係刪咗或未開。",
+       "logentry-contentmodel-change-revertlink": "反轉",
+       "logentry-contentmodel-change-revert": "反轉",
        "protectlogpage": "保護日誌",
        "protectlogtext": "下面係一個保護同埋解除保護頁面改動嘅一覽表。\n睇吓[[Special:ProtectedPages|保護頁面一覽]]去搵而家鎖咗嘅頁。",
        "protectedarticle": "已經保護 \"[[$1]]\"",
        "prot_1movedto2": "[[$1]]搬到去[[$2]]",
        "protect-badnamespace-title": "保護唔到嘅空間名",
        "protect-badnamespace-text": "呢個空間名嘅版面保護唔到。",
+       "protect-norestrictiontypes-text": "呢頁因冇乜限制類響度而唔可以保護。",
        "protect-norestrictiontypes-title": "保護唔到嘅頁",
        "protect-legend": "確認保護",
        "protectcomment": "原因:",
        "databasenotlocked": "資料庫而家冇鎖到。",
        "move-page": "搬$1",
        "move-page-legend": "搬頁",
-       "movepagetext": "用下面個表改版名,搬埋佢嘅歷史。\n舊標題會變做跳轉。\n你可以自動噉更新指到原先標題嘅跳轉。\n如果你揀咗唔去做嘅話,請務必要檢查吓有冇[[Special:DoubleRedirects|雙重跳轉]]或者[[Special:BrokenRedirects|死跳轉]](嘅情況發生)。\n你有責任確保啲連結依然指去佢哋應該指去嘅地方。\n\n注意如果已經有一個同個新名同名嘅頁,噉呢個頁係搬'''唔到'''嘅,除非嗰個同名嘅頁係空嘅或者佢係一個跳轉頁,兼且要之前冇編輯過(冇編輯歷史)先得。噉即係講萬一你搞錯咗,你可以將呢個頁改返去佢改之前噉,你唔可以覆蓋一個現有嘅頁。\n\n'''警告!'''\n噉樣對於一個好多人經過嘅頁面嚟講可能係一個好大嘅同埋出人意表嘅修改;請你喺行動之前確認你清楚噉做嘅後果。",
+       "movepagetext": "用下面個表改版名,搬埋佢嘅歷史。\n舊標題會變做跳轉。\n你可以自動噉更新指到原先標題嘅跳轉。\n如果你揀咗唔去做嘅話,請務必要檢查吓有冇[[Special:DoubleRedirects|雙重跳轉]]或者[[Special:BrokenRedirects|死跳轉]](嘅情況發生)。\n你有責任確保啲連結依然指去佢哋應該指去嘅地方。\n\n注意如果已經有一個同個新名同名嘅頁,噉呢個頁係搬'''唔到'''嘅,除非嗰個同名嘅頁係空嘅或者佢係一個跳轉頁,兼且要之前冇編輯過(冇編輯歷史)先得。噉即係講萬一你搞錯咗,你可以將呢個頁改返去佢改之前噉,你唔可以覆蓋一個現有嘅頁。\n\n<strong>警告!</strong>\n噉樣對於一個好多人經過嘅頁面嚟講可能係一個好大嘅同埋出人意表嘅修改;請你喺行動之前確認你清楚噉做嘅後果。",
        "movepagetext-noredirectfixer": "用下面個表改版名,搬埋佢嘅歷史。\n舊標題會變做跳轉。\n請肯定檢查清楚[[Special:DoubleRedirects|雙重]]或者[[Special:BrokenRedirects|死跳轉]]。\n你有責任確保啲連結依然指去佢哋應該指去嘅地方。\n\n注意如果已經有一個同個新名同名嘅頁,噉呢個頁係搬'''唔到'''嘅,除非嗰個同名嘅頁係空嘅或者佢係一個跳轉頁,兼且要之前冇編輯過(冇編輯歷史)先得。噉即係講萬一你搞錯咗,你可以將呢個頁改返去佢改之前噉,你唔可以覆蓋一個現有嘅頁。\n\n'''警告!'''\n噉樣對於一個好多人經過嘅頁面嚟講可能係一個好大嘅同埋出人意表嘅修改;請你喺行動之前確認你清楚噉做嘅後果。",
        "movepagetalktext": "相應嘅討論頁會連同佢一齊自動搬過去,'''除非''':\n*新嘅頁面名下面已經有咗一個非空嘅討論頁,又或者\n*你唔剔下面個框。\n\n喺呢啲情況下,需要嘅話你唯有手動搬同合併個頁。",
        "movearticle": "搬頁:",
        "import-interwiki-history": "複製呢一頁所有嘅歷史修訂",
        "import-interwiki-templates": "包含全部嘅模",
        "import-interwiki-submit": "倒入",
+       "import-mapping-default": "輸入默認位置",
        "import-upload-filename": "檔名:",
        "import-comment": "註解:",
        "importtext": "請由原 wiki 嘅[[Special:Export|匯出工具]]匯出成檔案。\n儲存喺你部電腦度,然後再上載到呢度。",
        "pageinfo-protect-cascading-yes": "係",
        "pageinfo-protect-cascading-from": "保護引申來源",
        "pageinfo-category-info": "類資料",
+       "pageinfo-category-total": "成員總數",
        "pageinfo-category-pages": "頁數",
        "pageinfo-category-subcats": "子類數",
        "pageinfo-category-files": "檔案數",
        "friday-at": "$1 禮拜五",
        "saturday-at": "$1 禮拜六",
        "sunday-at": "$1 禮拜日",
+       "yesterday-at": "尋日喺$1",
        "bad_image_list": "請根據下面嘅格式去寫:\n\n只有列示項目(以 * 開頭嘅項目)會考慮。第一個連結一定要連去幅壞檔度。\n之後響同一行嘅連結會考慮做例外,即係個檔可以響邊版度同時顯示。",
        "variantname-zh-hans": "簡體",
        "variantname-zh-hant": "繁體",
        "exif-gpsareainformation": "GPS 地區名",
        "exif-gpsdatestamp": "GPS 日期",
        "exif-gpsdifferential": "GPS 差動修正",
+       "exif-jpegfilecomment": "JPEG文件註",
+       "exif-keywords": "關鍵字",
+       "exif-countrydest": "顯示國家",
+       "exif-countrycodedest": "顯示國家地區碼",
+       "exif-provinceorstatedest": "顯示省份或州份或領域地區",
+       "exif-citydest": "顯示城市",
        "exif-objectname": "短標題",
+       "exif-specialinstructions": "特殊介紹",
        "exif-headline": "標題",
        "exif-source": "來源",
+       "exif-contact": "聯繫信息",
        "exif-languagecode": "語言",
        "exif-iimcategory": "類",
        "exif-label": "標籤",
        "exif-copyrighted": "版權狀態",
        "exif-copyrightowner": "版權人",
+       "exif-pngfilecomment": "PNG文件註",
        "exif-disclaimer": "免責聲明",
+       "exif-giffilecomment": "GIF文件註",
+       "exif-intellectualgenre": "項類",
+       "exif-subjectnewscode": "項碼",
        "exif-compression-1": "未壓過",
        "exif-unknowndate": "未知日期",
        "exif-orientation-1": "正常",
        "exif-dc-date": "日子",
        "exif-dc-publisher": "發佈者",
        "exif-dc-rights": "權",
+       "exif-rating-rejected": "拒絕咗",
+       "exif-isospeedratings-overflow": "超出咗65535嘅限制",
        "namespacesall": "全部",
        "monthsall": "全部",
        "confirmemail": "確認電郵地址",
index a0bf409..fa1931a 100644 (file)
        "protectedinterface": "该页提供此wiki软件的界面文字,它已被保护以防止恶意修改。\n如欲修改所有wiki的翻译,请到[//translatewiki.net/ translatewiki.net]上的MediaWiki本地化计划。",
        "editinginterface": "<strong>警告:</strong>您正在编辑用于提供软件的界面文字的页面。改变此页将影响其他在此wiki上其他用户的用户界面外观。",
        "translateinterface": "要加入或更改所有wiki的翻译,请访问MediaWiki本地化项目网站[//translatewiki.net/ translatewiki.net]。",
-       "cascadeprotected": "本页面已经受到保护,不能编辑,因为它包含于以下被“连锁保护”的{{PLURAL:$1|页面}}:\n$2",
+       "cascadeprotected": "本页面已经受到保护,不能编辑,因为它被嵌入于以下被“连锁保护”的{{PLURAL:$1|页面}}:\n$2",
        "namespaceprotected": "您没有权限编辑'''$1'''名字空间内的页面。",
        "customcssprotected": "您没有权限编辑此CSS页面,因为它包含另一位用户的个人设置。",
        "customjsprotected": "您没有权限编辑此JavaScript页面,因为它包含另一位用户的个人设置。",
        "loginreqlink": "登录",
        "loginreqpagetext": "您必须$1才能查看其它页面。",
        "accmailtitle": "密码已寄出",
-       "accmailtext": "为[[User talk:$1|$1]]随机生成的密码已送至$2。登录后可以在''[[Special:ChangePassword|更改密码]]''页面中修改。",
+       "accmailtext": "为[[User talk:$1|$1]]随机生成的密码已送至$2。登录后可以在<em>[[Special:ChangePassword|更改密码]]</em>页面中修改。",
        "newarticle": "(新页面)",
        "newarticletext": "你点击了一个尚不存在的页面的链接。要创建该页面,请在下面的编辑框中输入内容(更多信息请见[$1 帮助页面])。如果你是错误地到达这里,请点击您的浏览器的<strong>返回</strong>按钮。",
        "anontalkpagetext": "---- ''这是一个还未建立账户的匿名用户的讨论页, 因此我们只能用IP地址来与他或她联络。该IP地址可能由几名用户共享。如果您是一名匿名用户并认为此页上的评语与您无关,请[[Special:UserLogin/signup|创建新账户]]或[[Special:UserLogin|登录]]以避免在未来与其他匿名用户混淆。''",
        "creating": "创建“$1”",
        "editingsection": "编辑“$1(段落)”",
        "editingcomment": "编辑“$1”(新段落)",
-       "editconflict": "您的更改因为编辑冲突无法保存。{{GENDER:|您}}希望手动解决冲突吗?",
+       "editconflict": "编辑冲突:$1",
        "explainconflict": "其他用户在你开始编辑后更改了该页面。上面的文字区含有该页面当前的文字。下面的文字区显示你的更改。你必须把你的更改合并至现有文字。'''只有'''当你单击“{{int:savearticle}}”后,上面的文字区中的文字才会被保存。",
        "yourtext": "您的文字",
        "storedversion": "已保存的版本",
        "readonlywarning": "<strong>警告:数据库被锁定以进行维护,所以您目前将无法保存您的编辑。</strong>您可能希望将您的文本复制粘贴到一个文本文档并保存它,以便稍后更改。\n\n锁定数据库的管理员有如下解释:$1",
        "protectedpagewarning": "'''警告:本页面已被保护,只有拥有管理员权限的用户可以编辑。'''下面提供最后的日志条目以供参考:",
        "semiprotectedpagewarning": "'''注意:'''本页面已被保护,只有注册用户可以编辑。下面提供最后的日志条目以供参考:",
-       "cascadeprotectedwarning": "<strong>警告:</strong>本页面已经被保护,只有拥有管理员权限的用户可以编辑,因为它包含于以下启用连锁保护的{{PLURAL:$1|页面}}中:",
+       "cascadeprotectedwarning": "<strong>警告:</strong>本页面已经被保护,只有拥有管理员权限的用户可以编辑,因为它被嵌入于以下启用连锁保护的{{PLURAL:$1|页面}}中:",
        "titleprotectedwarning": "'''警告:本页面已被保护,创建本页面需要[[Special:ListGroupRights|特定权限]]。'''下面提供最后的日志条目以供参考:",
        "templatesused": "该页面使用的{{PLURAL:$1|模板}}:",
        "templatesusedpreview": "本预览使用的{{PLURAL:$1|模板}}:",
        "filerevert-comment": "原因:",
        "filerevert-defaultcomment": "恢复至$1 $2的版本",
        "filerevert-submit": "恢复",
-       "filerevert-success": "'''[[Media:$1|$1]]'''已经恢复至[$4 $2 $3的版本]。",
+       "filerevert-success": "<strong>[[Media:$1|$1]]</strong>已经恢复至[$4 $2 $3的版本]。",
        "filerevert-badversion": "文件并无所请求时间戳下的早期本地版本。",
        "filedelete": "删除$1",
        "filedelete-legend": "删除文件",
        "linksearch-pat": "搜索网址:",
        "linksearch-ns": "名字空间:",
        "linksearch-ok": "搜索",
-       "linksearch-text": "可以使用类似“*.wikipedia.org”的通配符。必须至少是顶级域名,例如“*.org”。<br />\n支持的{{PLURAL:$2|协议}}:<code>$1</code>(如果没有设置协议则默认为<nowiki>http://</nowiki>)。",
+       "linksearch-text": "可以使用类似“*.wikipedia.org”的通配符。必须至少是顶级域名,例如“*.org”。<br />\n支持的{{PLURAL:$2|协议}}:$1(如果没有设置协议则默认为http://)。",
        "linksearch-line": "$1 链自 $2",
        "linksearch-error": "通配符仅可在主机名称的开头使用。",
        "listusersfrom": "显示用户开始于:",
        "exbeforeblank": "被清空前的内容为:“$1”",
        "delete-confirm": "删除“$1”",
        "delete-legend": "删除",
-       "historywarning": "<strong>警告</strong>:您将要删除的页面有约$1次修订的历史:",
+       "historywarning": "<strong>警告:</strong>您将要删除的页面有约$1次{{PLURAL:$1|修订}}的历史:",
        "confirmdeletetext": "您即将删除一个页面或图像以及其历史。\n请确定您要进行此项操作,并且了解其后果,同时您的行为符合[[{{MediaWiki:Policy-url}}]]。",
        "actioncomplete": "操作完成",
        "actionfailed": "操作失败",
        "protect-locked-blocked": "您不能在被封禁时更改保护级别。以下是页面'''$1'''的当前设置:",
        "protect-locked-dblock": "您不能在数据库锁定时更改保护级别。以下是页面'''$1'''的当前设置:",
        "protect-locked-access": "您的帐户没有足够的权限去更改保护级别。以下是页面'''$1'''的当前设置:",
-       "protect-cascadeon": "该页面目前受到保护,因为它被嵌入了以下启用级联保护的{{PLURAL:$1|页面}}。更改该页面的保护级别不会影响级联保护。",
+       "protect-cascadeon": "此页面目前受到保护,因为它被嵌入了以下启用连锁保护的{{PLURAL:$1|页面}}。更改该页面的保护级别不会影响连锁保护。",
        "protect-default": "允许所有用户",
        "protect-fallback": "仅允许拥有“$1”权限的用户",
        "protect-level-autoconfirmed": "仅允许自动确认用户",
        "pageinfo-robot-index": "允许",
        "pageinfo-robot-noindex": "不允许",
        "pageinfo-watchers": "页面监视者数",
-       "pageinfo-visiting-watchers": "正在访问最近编辑的页面浏览者数量",
+       "pageinfo-visiting-watchers": "访问最近编辑的页面浏览者数量",
        "pageinfo-few-watchers": "少于$1个监视者",
        "pageinfo-few-visiting-watchers": "这里可能有或可能没有观察用户正在访问最近编辑",
        "pageinfo-redirects-name": "至该页面的重定向数",
        "deletedwhileediting": "'''警告''':此页在您开始编辑之后已经被删除!",
        "confirmrecreate": "在您开始编辑这个页面后,用户[[User:$1|$1]] ([[User talk:$1|讨论]])以下列原因删除了这个页面:\n: ''$2''\n请确认在您重新创建页面前三思。",
        "confirmrecreate-noreason": "用户 [[User:$1|$1]]([[User talk:$1|talk]]) 在您开始编辑之后删除此页面。请确认您确实要重新创建此页面。",
-       "recreate": "此页面自从您开始编辑以来已被删除。请点击“$1”以重新创建。",
+       "recreate": "重新创建",
        "confirm_purge_button": "确定",
        "confirm-purge-top": "要清除此页面的缓存吗?",
        "confirm-purge-bottom": "清除页面数据会清除缓存并强制显示最近的版本。",
        "htmlform-cloner-create": "添加更多",
        "htmlform-cloner-delete": "移除",
        "htmlform-cloner-required": "至少一个值是必需的。",
+       "htmlform-title-badnamespace": "[[:$1]]不在“{{ns:$2}}”名字空间中。",
+       "htmlform-title-not-creatable": "“$1”不是一个可创建的页面标题",
+       "htmlform-title-not-exists": "[[:$1]]不存在",
+       "htmlform-user-not-exists": "<strong>$1</strong>不存在。",
+       "htmlform-user-not-valid": "<strong>$1</strong>不是一个有效的用户名。",
        "sqlite-has-fts": "带全文搜索的版本$1",
        "sqlite-no-fts": "不带全文搜索的版本$1",
        "logentry-delete-delete": "$1{{GENDER:$2|删除}}页面$3",
index 6e435e3..12a5a92 100644 (file)
        "creating": "正在建立 $1",
        "editingsection": "正在編輯 $1 (章節)",
        "editingcomment": "正在編輯 $1 (新章節)",
-       "editconflict": "ç\94±æ\96¼ç·¨è¼¯è¡\9dçª\81ï¼\8cç\84¡æ³\95å\84²å­\98ç\9b®å\89\8dç\9a\84è®\8aæ\9b´ã\80\82{{GENDER:|æ\82¨}}æ\98¯å\90¦è¦\81æ\89\8bå\8b\95æ\8e\92é\99¤è¡\9dçª\81ï¼\9f",
+       "editconflict": "編輯è¡\9dçª\81ï¼\9a$1",
        "explainconflict": "在您開始編輯之後已有其他人儲存了此頁面。\n上方的文字框內顯示了目前頁面中的文字內容,\n您所變更的文字內容顯示在下方文字框中。\n您須要將您所變更的文字內容合併到已儲存的文字內容當中。\n若您直接點選 \"{{int:savearticle}}\" <strong>只有</strong> 上方文字框中的內容會被儲存。",
        "yourtext": "您的文字",
        "storedversion": "已儲存修訂",
        "readonlywarning": "<strong>警告:資料庫已被鎖定以進行維護,因此無法儲存您目前所做的編輯動作。</strong>\n您可先複製您的文字並貼上到文字檔案中儲存,稍後再儲存您編輯。\n\n鎖定資料庫的管理員有以下說明:$1",
        "protectedpagewarning": "<strong>警告:本頁已經被保護,只有擁有管理員權限的使用者才可編輯。</strong>\n以下提供最近的日誌以便參考:",
        "semiprotectedpagewarning": "<strong>注意:</strong>本頁已經被保護,只有已註冊的使用者才可編輯。\n以下提供最近的日誌以便參考:",
-       "cascadeprotectedwarning": "<strong>警告:</strong>本頁已經被保護,只有擁有管理員權限的使用者才可編輯,此頁面被下列頁面引用因此連鎖保護:",
+       "cascadeprotectedwarning": "<strong>警告:</strong>本頁已經被保護,只有擁有管理員權限的使用者才可編輯,此頁面被下列{{PLURAL:$1|頁面|頁面}}引用因此連鎖保護:",
        "titleprotectedwarning": "<strong>警告:本頁面已被保護,需要 [[Special:ListGroupRights|特殊權限]] 方可建立。</strong>\n以下提供最近的日誌以便參考:",
        "templatesused": "此頁面使用了以下{{PLURAL:$1|模板}}:",
        "templatesusedpreview": "此預覽使用了以下{{PLURAL:$1|模板}}:",
        "undo-summary-username-hidden": "還原隱藏使用者的修訂 $1",
        "cantcreateaccounttitle": "無法建立帳號",
        "cantcreateaccount-text": "來自這個 IP 位址 (<strong>$1</strong>) 建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n $3 封鎖的原因是 <em>$2</em>",
-       "cantcreateaccount-range-text": "來自 IP 位址範圍 '''$1''',包含您的 IP 位 ('''$4''') 所建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n $3 封鎖的原因是 ''$2''",
+       "cantcreateaccount-range-text": "來自 IP 位址範圍 '''$1''',包含您的 IP 位 ('''$4''') 所建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n $3 封鎖的原因是 ''$2''",
        "viewpagelogs": "檢視此頁面的日誌",
        "nohistory": "此頁沒有任何的修訂記錄。",
        "currentrev": "最新修訂",
        "randomincategory-nopages": "[[:Category:$1]] 中沒有任何頁面。",
        "randomincategory-category": "分類:",
        "randomincategory-legend": "隨機分類頁面",
-       "randomincategory-submit": "進入",
+       "randomincategory-submit": "前往",
        "randomredirect": "隨機重新導向",
        "randomredirect-nopages": "在命名空間 \"$1\" 中沒有任何重新導向頁面。",
        "statistics": "統計",
        "nopagetext": "您所指定的目標頁面並不存在。",
        "pager-newer-n": "較新 $1 筆",
        "pager-older-n": "較舊 $1 筆",
-       "suppress": "失職",
+       "suppress": "監督",
        "querypage-disabled": "此特殊頁面因考量效能問題已被停用。",
        "apihelp": "API 說明",
        "apihelp-no-such-module": "查無模組 \"$1\"。",
        "linksearch-pat": "搜尋關鍵字:",
        "linksearch-ns": "命名空間:",
        "linksearch-ok": "搜尋",
-       "linksearch-text": "可使用萬用字元如 *.wikipedia.org。\n萬用字元必須使用在最上層網域,例如 *.org 。<br />\n支援的{{PLURAL:$2|通訊協定}}有:<code>$1</code>  (若未指定則預設使用 http:// 通訊協定) 。",
+       "linksearch-text": "可使用萬用字元如 *.wikipedia.org。\n萬用字元必須使用在最上層網域,例如 *.org 。<br />\n支援的{{PLURAL:$2|通訊協定}}有:$1  (若未指定則預設使用 http:// 通訊協定) 。",
        "linksearch-line": "$1 由 $2 所連結",
        "linksearch-error": "萬用字元僅可在主機名稱的開頭使用。",
        "listusersfrom": "顯示使用者開始自:",
        "changecontentmodel-nodirectediting": "$1 的內容模型不支援直接編輯",
        "log-name-contentmodel": "內容模型變更日誌",
        "log-description-contentmodel": "與頁面內容模型相關的事件",
-       "logentry-contentmodel-change": "$1 已變頁面 $3 的內容模型自 \"$4\" 至 \"$5\"",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|已變更}}頁面 $3 的內容模型自 \"$4\" 至 \"$5\"",
        "logentry-contentmodel-change-revertlink": "還原",
        "logentry-contentmodel-change-revert": "還原",
        "protectlogpage": "保護日誌",
        "pageinfo-robot-index": "允許",
        "pageinfo-robot-noindex": "不允許",
        "pageinfo-watchers": "頁面監視者數",
-       "pageinfo-visiting-watchers": "頁面監視者參觀最近編輯數",
+       "pageinfo-visiting-watchers": "最後一次編輯後參觀人數",
        "pageinfo-few-watchers": "少於 $1 名監視者",
        "pageinfo-few-visiting-watchers": "參觀近期編輯的使用者可能為監視使用者",
        "pageinfo-redirects-name": "指向此頁面的重新導向頁面數量",
        "deletedwhileediting": "<strong>警告:</strong>此頁在您開始編輯之後已經被刪除﹗",
        "confirmrecreate": "在您編輯的同時,使用者 [[User:$1|$1]] ([[User talk:$1|對話]]) 刪除了此頁面,原因為:\n: <em>$2</em>\n請確認您是否真的要重新建立此頁面。",
        "confirmrecreate-noreason": "在您編輯的同時,使用者 [[User:$1|$1]] ([[User talk:$1|對話]]) 刪除了此頁面,請確認您是否真的要重新建立此頁面。",
-       "recreate": "此頁面在您編輯的這段期間已被刪除,請點選 \"$1\" 重新建立頁面。",
+       "recreate": "重新建立",
        "confirm_purge_button": "確定",
        "confirm-purge-top": "要清除此頁面的快取嗎?",
        "confirm-purge-bottom": "清除頁面會清空頁面的快取記錄並強制顯示最近的頁面修訂。",
        "htmlform-cloner-create": "新增更多",
        "htmlform-cloner-delete": "移除",
        "htmlform-cloner-required": "至少必須填寫一筆資料。",
+       "htmlform-title-badnamespace": "[[:$1]] 不在 \"{{ns:$2}}\" 命名空間中。",
+       "htmlform-title-not-creatable": "\"$1\" 並非可用來建立頁面的標題",
+       "htmlform-title-not-exists": "[[:$1]] 並不存在。",
+       "htmlform-user-not-exists": "<strong>$1</strong> 並不存在。",
+       "htmlform-user-not-valid": "<strong>$1</strong> 不是有效的使用者名稱。",
        "sqlite-has-fts": "$1 且支援全文搜索",
        "sqlite-no-fts": "$1 且不支援全文搜索",
        "logentry-delete-delete": "$1 刪除頁面 $3",
        "api-error-illegal-filename": "不允許使用的檔案名稱。",
        "api-error-internal-error": "內部錯誤:此 Wiki 在處理你的上傳時發生錯誤。",
        "api-error-invalid-file-key": "內部錯誤:於暫存儲存庫中查無檔案。",
-       "api-error-missingparam": "內部錯誤:請求缺少參數。",
+       "api-error-missingparam": "內部錯誤:請求缺少參數。",
        "api-error-missingresult": "內部錯誤:無法辨識複製是否成功。",
        "api-error-mustbeloggedin": "您必須登入方可上傳檔案。",
        "api-error-mustbeposted": "內部錯誤:請求需使用 HTTP POST。",
index 9961227..bc61235 100644 (file)
@@ -8,6 +8,7 @@
  *
  * @author Arjanizary
  * @author E THP
+ * @author Koroğlu
  * @author Mjbmr
  */
 
@@ -15,45 +16,45 @@ $fallback = 'fa';
 $rtl = true;
 
 $namespaceNames = array(
-       NS_MEDIA            => 'Ù\85ئدÛ\8cا',
+       NS_MEDIA            => 'مدیا',
        NS_SPECIAL          => 'اؤزل',
        NS_TALK             => 'دانیشیق',
-       NS_USER             => 'اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c',
-       NS_USER_TALK        => 'اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c_دانیشیغی',
+       NS_USER             => 'اÛ\8cØ´Ù\84دÙ\86',
+       NS_USER_TALK        => 'اÛ\8cØ´Ù\84دÙ\86_دانیشیغی',
        NS_PROJECT_TALK     => '$1_دانیشیغی',
        NS_FILE             => 'فایل',
        NS_FILE_TALK        => 'فایل_دانیشیغی',
-       NS_MEDIAWIKI        => 'Ù\85ئدÛ\8cاâ\80\8cÙ\88Û\8cÚ©Û\8c',
-       NS_MEDIAWIKI_TALK   => 'Ù\85ئدÛ\8cاâ\80\8cÙ\88Û\8cÚ©Û\8c_داÙ\86Û\8cØ´Û\8cغÛ\8c',
+       NS_MEDIAWIKI        => 'مدیا‌ویکی',
+       NS_MEDIAWIKI_TALK   => 'مدیا‌ویکی_دانیشیغی',
        NS_TEMPLATE         => 'شابلون',
        NS_TEMPLATE_TALK    => 'شابلون_دانیشیغی',
-       NS_HELP             => 'یاردیم',
-       NS_HELP_TALK        => 'یاردیم_دانیشیغی',
+       NS_HELP             => 'کؤمک',
+       NS_HELP_TALK        => 'کؤمک_دانیشیغی',
        NS_CATEGORY         => 'بؤلمه',
        NS_CATEGORY_TALK    => 'بؤلمه_دانیشیغی',
 );
 
 $specialPageAliases = array(
-       'Activeusers'               => array( 'Ú\86اÙ\84Û\8cØ´Ù\82اÙ\86_اÛ\8cستسÙ\81ادÙ\87â\80\8cÚ\86Û\8cÙ\84ر' ),
+       'Activeusers'               => array( 'Ú\86اÙ\84Û\8cØ´Ù\82اÙ\86_اÛ\8cØ´Ù\84دÙ\86â\80\8cÙ\84ر' ),
        'Allmessages'               => array( 'بوتون_مئساژلار' ),
-       'Allpages'                  => array( 'بوتون_صحیفه‌لر' ),
-       'Ancientpages'              => array( 'اسکی_صحیفه‌لر' ),
+       'Allpages'                  => array( 'بوتون_صفحه‌لر' ),
+       'Ancientpages'              => array( 'اسکی_صفحه‌لر' ),
        'Badtitle'                  => array( 'پیس_آد' ),
-       'Blankpage'                 => array( 'بوش_صحیفه' ),
+       'Blankpage'                 => array( 'بوش_صفحه' ),
        'ChangePassword'            => array( 'رمزی_دَییش' ),
        'CreateAccount'             => array( 'حساب_یارات' ),
        'Mycontributions'           => array( 'چالیشمالاریم' ),
-       'Mypage'                    => array( 'صحیفه‌م' ),
+       'Mypage'                    => array( 'صفحه‌م' ),
        'Mytalk'                    => array( 'دانیشیغیم' ),
        'Myuploads'                 => array( 'یوکله‌دیکلریم' ),
        'Newimages'                 => array( 'یئنی_فایل‌لار' ),
-       'Newpages'                  => array( 'یئنی_صحیفه‌لر' ),
+       'Newpages'                  => array( 'یئنی_صفحه‌لر' ),
        'PasswordReset'             => array( 'رمز_دَییشمه‌' ),
        'Randompage'                => array( 'راست‌گله' ),
        'Recentchanges'             => array( 'سون_دَییشیکلر' ),
        'Search'                    => array( 'آختار' ),
-       'Shortpages'                => array( 'قیسسا_صحیفه‌لر' ),
-       'Specialpages'              => array( 'اؤزل_صحیفه‌لر' ),
+       'Shortpages'                => array( 'قیسسا_صفحه‌لر' ),
+       'Specialpages'              => array( 'اؤزل_صفحه‌لر' ),
        'Statistics'                => array( 'آمار' ),
        'Unusedcategories'          => array( 'ایشلنممیش_بؤلمه‌لر' ),
        'Unusedimages'              => array( 'ایشلنممیش_فایل‌لار' ),
@@ -65,13 +66,13 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'numberofpages'             => array( '1', 'صحیفه‌لر_ساییسی', 'تعدادصفحه‌ها', 'NUMBEROFPAGES' ),
+       'numberofpages'             => array( '1', 'صفحه‌لر_ساییسی', 'تعدادصفحه‌ها', 'NUMBEROFPAGES' ),
        'numberofarticles'          => array( '1', 'مقاله‌لر_ساییسی', 'تعدادمقاله‌ها', 'NUMBEROFARTICLES' ),
        'numberoffiles'             => array( '1', 'قایل‌لار_ساییسی', 'تعدادپرونده‌ها', 'NUMBEROFFILES' ),
-       'numberofusers'             => array( '1', 'اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8cÙ\84ر_ساÛ\8cÛ\8cسÛ\8c', 'تعدادکاربراÙ\86', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'       => array( '1', 'Ú\86اÙ\84Û\8cØ´Ù\82اÙ\86_اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8cÙ\84ر', 'کاربراÙ\86â\80\8cÙ\81عاÙ\84', 'کاربراÙ\86\81عاÙ\84', 'NUMBEROFACTIVEUSERS' ),
+       'numberofusers'             => array( '1', 'Û\8cØ´Ù\84دÙ\86â\80\8cÙ\84ر_ساÛ\8cÛ\8cسÛ\8c', 'تعدادکاربراÙ\86', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'Ú\86اÙ\84Û\8cØ´Ù\82اÙ\86_اÛ\8cØ´Ù\84دÙ\86â\80\8cÙ\84ر', 'کاربراÙ\86â\80\8cÙ\81عاÙ\84', 'کاربراÙ\86\81عاÙ\84', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'دَییشدیرمه_ساییسی', 'تعدادویرایش‌ها', 'NUMBEROFEDITS' ),
-       'pagename'                  => array( '1', 'صحیفه‌نین_آدی', 'نام‌صفحه', 'نام_صفحه', 'PAGENAME' ),
+       'pagename'                  => array( '1', 'صفحه‌نین_آدی', 'نام‌صفحه', 'نام_صفحه', 'PAGENAME' ),
        'img_right'                 => array( '1', 'ساغ', 'راست', 'right' ),
        'img_left'                  => array( '1', 'سول', 'چپ', 'left' ),
        'img_none'                  => array( '1', 'هئچ', 'هیچ', 'none' ),
index f5ade22..f9ee1be 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Southern Balochi (بÙ\84Ù\88Ú\86Û\8c Ù\85کراÙ\86Û\8c)
+/** Southern Balochi (جÙ\87Ù\84سرÛ\8c Ø¨Ù\84Ù\88Ú\86Û\8c)
  *
  * To improve a translation please visit https://translatewiki.net
  *
index cb52c1a..0c9fa26 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Western Balochi (بÙ\84Ù\88Ú\86Û\8c Ø±Ø®Ø´Ø§Ù\86Û\8c)
+/** Western Balochi (رÙ\88Ú\86 Ú©Ù¾ØªÛ\8cÙ\86 Ø¨Ù\84Ù\88Ú\86Û\8c)
  *
  * To improve a translation please visit https://translatewiki.net
  *
index e587417..57a79bc 100644 (file)
@@ -396,6 +396,7 @@ $specialPageAliases = array(
        'Booksources'               => array( 'BookSources' ),
        'BrokenRedirects'           => array( 'BrokenRedirects' ),
        'Categories'                => array( 'Categories' ),
+       'ChangeContentModel'        => array( 'ChangeContentModel' ),
        'ChangeEmail'               => array( 'ChangeEmail' ),
        'ChangePassword'            => array( 'ChangePassword', 'ResetPass', 'ResetPassword' ),
        'ComparePages'              => array( 'ComparePages' ),
diff --git a/languages/messages/MessagesLuz.php b/languages/messages/MessagesLuz.php
new file mode 100644 (file)
index 0000000..b50b83c
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+/** Southern Luri (لئری جئنوٙڤی)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ */
+
+$fallback = 'lrc, fa';
+$rtl = true;
+
index 7205e6c..865ebb3 100644 (file)
@@ -32,6 +32,8 @@
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
  */
 
+$linkTrail = '/^([a-zA-ZĀāČčĒēĢģĪīĶķĻļŅņŠšŪūŽž]+)(.*)$/sDu';
+
 $namespaceNames = array(
        NS_MEDIA            => 'Media',
        NS_SPECIAL          => 'Special',
index e7f45f1..689fc02 100644 (file)
@@ -19,3 +19,21 @@ $fallback8bitEncoding = 'windows-1256';
 
 $rtl = true;
 
+$namespaceNames = array(
+       NS_MEDIA            => 'میڈیا',
+       NS_SPECIAL          => 'خاص',
+       NS_TALK             => 'گل_بات',
+       NS_USER             => 'ورتنوالا',
+       NS_USER_TALK        => 'ورتن_گل_بات',
+       NS_PROJECT_TALK     => 'ویونت_گل_بات',
+       NS_FILE             => 'فائل',
+       NS_FILE_TALK        => 'فائل_گل_بات',
+       NS_MEDIAWIKI        => 'میڈیا_وکی',
+       NS_MEDIAWIKI_TALK   => 'میڈیاوکی_گل_بات',
+       NS_TEMPLATE         => 'سانچہ',
+       NS_TEMPLATE_TALK    => 'سانچہ_گل_بات',
+       NS_HELP             => 'ہتھونڈائی',
+       NS_HELP_TALK        => 'ہتھونڈائی_گل_بات',
+       NS_CATEGORY         => 'گٹھ',
+       NS_CATEGORY_TALK    => 'گٹھ_گل_بات',
+);
index 79f7254..861b364 100644 (file)
@@ -43,6 +43,14 @@ class CreateAndPromote extends Maintenance {
                foreach ( self::$permitRoles as $role ) {
                        $this->addOption( $role, "Add the account to the {$role} group" );
                }
+
+               $this->addOption(
+                       'custom-groups',
+                       'Comma-separated list of groups to add the user to',
+                       false,
+                       true
+               );
+
                $this->addArg( "username", "Username of new user" );
                $this->addArg( "password", "Password to set (not required if --force is used)", false );
        }
@@ -69,8 +77,19 @@ class CreateAndPromote extends Maintenance {
                        $inGroups = $user->getGroups();
                }
 
+               $groups = array_filter( self::$permitRoles, array( $this, 'hasOption' ) );
+               if ( $this->hasOption( 'custom-groups' ) ) {
+                       $customGroupsText = $this->getOption( 'custom-groups' );
+                       if ( $customGroupsText !== '' ) {
+                               $customGroups = explode( ',', $customGroupsText );
+                               foreach ( $customGroups as $customGroup ) {
+                                       $groups[] = trim( $customGroup );
+                               }
+                       }
+               }
+
                $promotions = array_diff(
-                       array_filter( self::$permitRoles, array( $this, 'hasOption' ) ),
+                       $groups,
                        $inGroups
                );
 
index 5cf4536..114366b 100644 (file)
@@ -72,6 +72,7 @@ class FindHooks extends Maintenance {
                        $IP . '/includes/api/',
                        $IP . '/includes/cache/',
                        $IP . '/includes/changes/',
+                       $IP . '/includes/changetags/',
                        $IP . '/includes/clientpool/',
                        $IP . '/includes/content/',
                        $IP . '/includes/context/',
@@ -80,6 +81,7 @@ class FindHooks extends Maintenance {
                        $IP . '/includes/debug/',
                        $IP . '/includes/deferred/',
                        $IP . '/includes/diff/',
+                       $IP . '/includes/exception/',
                        $IP . '/includes/externalstore/',
                        $IP . '/includes/filebackend/',
                        $IP . '/includes/filerepo/',
@@ -95,6 +97,7 @@ class FindHooks extends Maintenance {
                        $IP . '/includes/media/',
                        $IP . '/includes/page/',
                        $IP . '/includes/parser/',
+                       $IP . '/includes/password/',
                        $IP . '/includes/rcfeed/',
                        $IP . '/includes/resourceloader/',
                        $IP . '/includes/revisiondelete/',
@@ -119,9 +122,9 @@ class FindHooks extends Maintenance {
                }
 
                $potential = array_unique( $potential );
-               $bad = array_unique( $bad );
-               $todo = array_diff( $potential, $documented );
-               $deprecated = array_diff( $documented, $potential );
+               $bad = array_diff( array_unique( $bad ), self::$ignore );
+               $todo = array_diff( $potential, $documented, self::$ignore );
+               $deprecated = array_diff( $documented, $potential, self::$ignore );
 
                // let's show the results:
                $this->printArray( 'Undocumented', $todo );
@@ -130,6 +133,8 @@ class FindHooks extends Maintenance {
 
                if ( count( $todo ) == 0 && count( $deprecated ) == 0 && count( $bad ) == 0 ) {
                        $this->output( "Looks good!\n" );
+               } else {
+                       $this->error( 'The script finished with errors.', 1 );
                }
        }
 
@@ -287,9 +292,7 @@ class FindHooks extends Maintenance {
                }
 
                foreach ( $arr as $v ) {
-                       if ( !in_array( $v, self::$ignore ) ) {
-                               $this->output( "$msg: $v\n" );
-                       }
+                       $this->output( "$msg: $v\n" );
                }
        }
 }
index 96c05a1..1d7a1ce 100644 (file)
@@ -22,6 +22,7 @@
                                "name": "General",
                                "classes": [
                                        "mw.Title",
+                                       "mw.Upload*",
                                        "mw.Uri",
                                        "mw.RegExp",
                                        "mw.messagePoster.*",
index 39589a0..cc8069d 100644 (file)
@@ -66,7 +66,7 @@ class SeeTag < CommonTag
     <<-EOHTML
       <h3 class="pa">Related</h3>
       <ul>
-      #{ context[@tagname].map { |tag| tag[:doc] }.join("\n") }
+      #{context[@tagname].map { |tag| tag[:doc] }.join("\n")}
       </ul>
     EOHTML
   end
@@ -102,7 +102,7 @@ class ContextTag < CommonTag
   def to_html(context)
     <<-EOHTML
       <h3 class="pa">Context</h3>
-      #{ context[@tagname].last[:doc] }
+      #{context[@tagname].last[:doc]}
     EOHTML
   end
 
index 4bb8369..c901240 100644 (file)
@@ -37,7 +37,6 @@
  * @alternateClassName jqXHR
  */
 
-
 /**
  * @class QUnit
  * @source <http://api.qunitjs.com/>
index 7e0270c..5518a88 100644 (file)
@@ -168,6 +168,7 @@ U+080DC胜|U+052DD勝|U+080DC胜|
 U+080E1胡|U+080E1胡|U+09B0D鬍|U+0885A衚|
 U+0810F脏|U+09AD2髒|U+081DF臟|
 U+0814A腊|U+081D8臘|U+0814A腊|
+U+0814C腌|U+09183醃|
 U+081F4致|U+081F4致|U+07DFB緻|
 U+0820D舍|U+0820D舍|U+06368捨|
 U+082B8芸|U+082B8芸|U+08553蕓|
index a3ea91c..2d3a922 100644 (file)
@@ -32,7 +32,7 @@
 投機份子   投机分子
 一份子      一分子
 水份 水分
-氧份 
+氧份 
 糖份 糖分
 鹽份 盐分
 組份 组分
 乘著名      乘著名
 乘著錄      乘著录
 乘著稱      乘著称
+乘著称      乘著称
 乘著者      乘著者
 乘著述      乘著述
 爭著 争着
 亮著名      亮著名
 亮著錄      亮著录
 亮著稱      亮著称
+亮著称      亮著称
 亮著者      亮著者
 亮著述      亮著述
 仗著 仗着
 低著名      低著名
 低著錄      低著录
 低著稱      低著称
+低著称      低著称
 低著者      低著者
 低著述      低著述
 住著 住着
 住著名      住著名
 住著錄      住著录
 住著稱      住著称
+住著称      住著称
 住著者      住著者
 住著述      住著述
 側著 侧着
 保障著名   保障著名
 保障著錄   保障著录
 保障著稱   保障著称
+保障著称   保障著称
 保障著者   保障著者
 保障著述   保障著述
 信著 信着
 信著名      信著名
 信著錄      信著录
 信著稱      信著称
+信著称      信著称
 信著者      信著者
 信著述      信著述
 候著 候着
 光著名      光著名
 光著錄      光著录
 光著稱      光著称
+光著称      光著称
 光著者      光著者
 光著述      光著述
 關著 关着
 關著稱      关著称
 關著者      关著者
 關著述      关著述
-冀著 冀着
-冀著書      冀著书
-冀著作      冀著作
-冀著名      冀著名
-冀著錄      冀著录
-冀著稱      冀著称
-冀著者      冀著者
-冀著述      冀著述
+希冀著      希冀着
 冒著 冒着
 冒著書      冒著书
 冒著作      冒著作
 刻著名      刻著名
 刻著錄      刻著录
 刻著稱      刻著称
+刻著称      刻著称
 刻著者      刻著者
 刻著述      刻著述
 辦著 办着
 努力著名   努力著名
 努力著錄   努力著录
 努力著稱   努力著称
+努力著称   努力著称
 努力著者   努力著者
 努力著述   努力著述
-努著 努着
-努著書      努著书
-努著作      努著作
-努著名      努著名
-努著錄      努著录
-努著稱      努著称
-努著者      努著者
-努著述      努著述
 印著 印着
 印著書      印著书
 印著作      印著作
 壓著稱      压著称
 壓著者      压著者
 壓著述      压著述
-去著 去着
-去著書      去著书
-去著作      去著作
-去著名      去著名
-去著錄      去著录
-去著稱      去著称
-去著者      去著者
-去著述      去著述
 受著 受着
 受著書      受著书
 受著作      受著作
 味著名      味著名
 味著錄      味著录
 味著稱      味著称
+味著称      味著称
 味著者      味著者
 味著述      味著述
 響著 响着
 圍著稱      围著称
 圍著者      围著者
 圍著述      围著述
-在著 在着
-在著書      在著书
-在著作      在著作
-在著名      在著名
-在著錄      在著录
-在著稱      在著称
-在著者      在著者
-在著述      在著述
+存在著      存在着
 坐著 坐着
 坐著書      坐著书
 坐著作      坐著作
 夾著稱      夹著称
 夾著者      夹著者
 夾著述      夹著述
-孤著 孤着
-孤著書      孤著书
-孤著作      孤著作
-孤著名      孤著名
-孤著錄      孤著录
-孤著稱      孤著称
-孤著者      孤著者
-孤著述      孤著述
 學著 学着
 學著書      学著书
 學著作      学著作
 守著名      守著名
 守著錄      守著录
 守著稱      守著称
+守著称      守著称
 守著者      守著者
 守著述      守著述
 定著 定着
 定著名      定著名
 定著錄      定著录
 定著稱      定著称
+定著称      定著称
 定著者      定著者
 定著述      定著述
 對著 对着
 應著稱      应著称
 應著者      应著者
 應著述      应著述
-康著 康着
-康著書      康著书
-康著作      康著作
-康著名      康著名
-康著錄      康著录
-康著稱      康著称
-康著者      康著者
-康著述      康著述
 開著 开着
 開著書      开著书
 開著作      开著作
 心著名      心著名
 心著錄      心著录
 心著稱      心著称
+心著称      心著称
 心著者      心著者
 心著述      心著述
 忍著 忍着
 忍著稱      忍著称
 忍著者      忍著者
 忍著述      忍著述
-志著 志着
-志著書      志著书
-志著作      志著作
-志著名      志著名
-志著錄      志著录
-志著稱      志著称
-志著者      志著者
-志著述      志著述
+標志著      标志着
 忙著 忙着
 忙著書      忙著书
 忙著作      忙著作
 急著稱      急著称
 急著者      急著者
 急著述      急著述
-性著 性着
-性著書      性著书
-性著作      性著作
-性著名      性著名
-性著錄      性著录
-性著稱      性著称
-性著者      性著者
-性著述      性著述
 戀著 恋着
 戀著書      恋著书
 戀著作      恋著作
 想著名      想著名
 想著錄      想著录
 想著稱      想著称
+想著称      想著称
 想著者      想著者
 想著述      想著述
 戰著 战着
 潤著稱      润著称
 潤著者      润著者
 潤著述      润著述
-涵著 涵着
-涵著書      涵著书
-涵著作      涵著作
-涵著名      涵著名
-涵著錄      涵著录
-涵著稱      涵著称
-涵著者      涵著者
-涵著述      涵著述
+蘊涵著      蕴涵着
 渴著 渴着
 渴著書      渴著书
 渴著作      渴著作
 牽著稱      牵著称
 牽著者      牵著者
 牽著述      牵著述
-獨著 独着
-獨著書      独著书
-獨著作      独著作
-獨著名      独著名
-獨著錄      独著录
-獨著稱      独著称
-獨著者      独著者
-獨著述      独著述
 猜著 猜着
 猜著書      猜着书
 猜著作      猜著作
 盯著稱      盯著称
 盯著者      盯著者
 盯著述      盯著述
-盾著 盾着
-盾著書      盾著书
-盾著作      盾著作
-盾著名      盾著名
-盾著錄      盾著录
-盾著稱      盾著称
-盾著者      盾著者
-盾著述      盾著述
+矛盾著      矛盾着
 看著 看着
 看著書      看着书
 看著作      看著作
 瞧著述      瞧著述
 存著 存着
 存著名      存著名
+存著作      存著作
 劃著 划着
 別著 别着
 刮著 刮着
 美著名      美著名
 美著錄      美著录
 美著稱      美著称
+美著称      美著称
 美著者      美著者
 美著述      美著述
 耀著 耀着
 膠著稱      胶著称
 膠著者      胶著者
 膠著述      胶著述
-藝著 艺着
-藝著書      艺著书
-藝著作      艺著作
-藝著名      艺著名
-藝著錄      艺著录
-藝著稱      艺著称
-藝著者      艺著者
-藝著述      艺著述
 苦著 苦着
 苦著書      苦著书
 苦著作      苦著作
 衣著名      衣著名
 衣著錄      衣著录
 衣著稱      衣著称
+衣著称      衣著称
 衣著者      衣著者
 衣著述      衣著述
 裝著 装着
 語著稱      语著称
 語著者      语著者
 語著述      语著述
-豫著 豫着
-豫著書      豫著书
-豫著作      豫著作
-豫著名      豫著名
-豫著錄      豫著录
-豫著稱      豫著称
-豫著者      豫著者
-豫著述      豫著述
-貞著 贞着
-貞著書      贞著书
-貞著作      贞著作
-貞著名      贞著名
-貞著錄      贞著录
-貞著稱      贞著称
-貞著者      贞著者
-貞著述      贞著述
+猶豫著      犹豫着
+堅貞著      坚贞着
+忠貞著      忠贞着
 走著 走着
 走著書      走著书
 走著作      走著作
 達著稱      达著称
 達著者      达著者
 達著述      达著述
-遠著 远着
-遠著書      远著书
-遠著作      远著作
-遠著名      远著名
-遠著錄      远著录
-遠著稱      远著称
-遠著者      远著者
-遠著述      远著述
 連著 连着
 連著書      连著书
 連著作      连著作
 遇著名      遇著名
 遇著錄      遇著录
 遇著稱      遇著称
+遇著称      遇著称
 遇著者      遇著者
 遇著述      遇著述
 配著 配着
 雅著名      雅著名
 雅著錄      雅著录
 雅著稱      雅著称
+雅著称      雅著称
 雅著者      雅著者
 雅著述      雅著述
 頂著 顶着
 高著名      高著名
 高著錄      高著录
 高著稱      高著称
+高著称      高著称
 高著者      高著者
 高著述      高著述
-髭著 髭着
-髭著書      髭著书
-髭著作      髭著作
-髭著名      髭著名
-髭著錄      髭著录
-髭著稱      髭著称
-髭著者      髭著者
-髭著述      髭著述
 黏著 黏着
 黏著書      黏著书
 黏著作      黏著作
 衝著 冲着
 沖著 冲着
 沖著《      冲著《
+沖著(      冲著(
 沖著。      冲著。
 沖著,      冲著,
+立著 立着
+立著名      立著名
+立著作      立著作
+立著者      立著者
+立著稱      立著称
+立著称      立著称
+立著有      立著有
+立著《      立著《
+立著(      立著(
 繫著 系着
 颳著 刮着
 鬥著 斗着
 多明尼加   多米尼加
 頻寬 带宽
 數位相機   数码相机
+數位照相機        数码照相机
 單眼相機   单反相机
 單鏡反光機        单反相机
 韌體 固件
index f6a277b..69bce98 100644 (file)
@@ -39,6 +39,7 @@
 秀发布      秀發佈
 并发布      並發佈
 分布 分佈
+分布于      分佈於
 宣布 宣佈
 公布 公佈
 摆布 擺佈
 屋里 屋裏
 屯里 屯裏
 巷里 巷裏
-市里 市裏
+城市里      城市裏
+都市里      都市裏
+市里的      市裏的
 年代里      年代裏
 年里 年裏
 店里 店裏
 框里 框裏
 碗里 碗裏
 电梯里      電梯裏
+个月里      個月裏
+月裡来      月裏來
+分钟里      分鐘裏
+小时里      小時裏
 苑裡 苑裡
 霄裡 霄裡
 岸裡 岸裡
 動著 動着
 鬥著 鬥着
 斗着 鬥着
-獨著 獨着
 對著 對着
\9b¾è\91\97 盾着
\9f\9bç\9b¾è\91\97      ç\9f\9b盾着
 犯得著      犯得着
 犯不著      犯不着
 福著 福着
 高著 高着
 隔著 隔着
 跟著 跟着
-孤著 孤着
 關著 關着
 管著 管着
 慣著 慣着
 獲著 獲着
 急著 急着
 記著 記着
\86\80è\91\97 冀着
¸\8cå\86\80è\91\97      å¸\8c冀着
 夾著 夾着
 駕著 駕着
 見著 見着
 看得著      看得着
 看不著      看不着
 看著 看着
-康著 康着
 扛著 扛着
 考著 考着
 渴著 渴着
 拿著 拿着
 逆著 逆着
 釀著 釀着
-努著 努着
 趴著 趴着
 跑著 跑着
 陪著 陪着
 騎著 騎着
 牽著 牽着
 求著 求着
-去著 去着
 嚷著 嚷着
 繞著 繞着
 忍著 忍着
 心著 心着
 信著 信着
 行著 行着
-性著 性着
 學著 學着
 尋著 尋着
 循著 循着
 衣著 衣着
 疑著 疑着
 溢著 溢着
-藝著 藝着
 因著 因着
 印著 印着
 應著 應着
 有著 有着
 與著 與着
 語著 語着
-豫著 豫着
-遠著 遠着
+猶豫著      猶豫着
 躍著 躍着
 雜著 雜着
 載著 載着
\9c¨è\91\97 在着
­\98å\9c¨è\91\97      å­\98在着
 紮著 紮着
 展著 展着
 占着 佔着
 找不著      找不着
 照著 照着
 罩著 罩着
-貞著 貞着
+堅貞著      堅貞着
+忠貞著      忠貞着
 枕著 枕着
 爭著 爭着
 掙著 掙着
 轉著 轉着
 裝著 裝着
 追著 追着
-髭著 髭着
 走著 走着
 坐著 坐着
 做著 做着
 含著 含着
-涵著 涵着
+蘊涵著      蘊涵着
 演著 演着
 保障著      保障着
 黏著 黏着
 乘著名      乘著名
 乘著述      乘著述
 乘著稱      乘著稱
+乘著称      乘著稱
 乘著錄      乘著錄
 乘著書      乘著書
 持著作      持著作
 低著名      低著名
 低著述      低著述
 低著稱      低著稱
+低著称      低著稱
 低著錄      低著錄
 低著書      低著書
 點著作      點著作
 定著名      定著名
 定著述      定著述
 定著稱      定著稱
+定著称      定著稱
 定著錄      定著錄
 定著書      定著書
 動著作      動著作
 鬥著稱      鬥著稱
 鬥著錄      鬥著錄
 鬥著書      鬥著書
-獨著作      獨著作
-獨著者      獨著者
-獨著名      獨著名
-獨著述      獨著述
-獨著稱      獨著稱
-獨著錄      獨著錄
-獨著書      獨著書
 對著作      對著作
 對著者      對著者
 對著名      對著名
 對著稱      對著稱
 對著錄      對著錄
 對著書      對著書
-盾著作      盾著作
-盾著者      盾著者
-盾著名      盾著名
-盾著述      盾著述
-盾著稱      盾著稱
-盾著錄      盾著錄
-盾著書      盾著書
 犯不著作   犯不著作
 犯不著者   犯不著者
 犯不著名   犯不著名
 高著名      高著名
 高著述      高著述
 高著稱      高著稱
+高著称      高著稱
 高著錄      高著錄
 高著書      高著書
 隔著作      隔著作
 跟著稱      跟著稱
 跟著錄      跟著錄
 跟著書      跟著書
-孤著作      孤著作
-孤著者      孤著者
-孤著名      孤著名
-孤著述      孤著述
-孤著稱      孤著稱
-孤著錄      孤著錄
-孤著書      孤著書
 關著作      關著作
 關著者      關著者
 關著名      關著名
 光著名      光著名
 光著述      光著述
 光著稱      光著稱
+光著称      光著稱
 光著錄      光著錄
 光著書      光著書
 跪著作      跪著作
 記著稱      記著稱
 記著錄      記著錄
 記著書      記著書
-冀著作      冀著作
-冀著者      冀著者
-冀著名      冀著名
-冀著述      冀著述
-冀著稱      冀著稱
-冀著錄      冀著錄
-冀著書      冀著書
 夾著作      夾著作
 夾著者      夾著者
 夾著名      夾著名
 看著稱      看著稱
 看著錄      看著錄
 看著書      看著書
-康著作      康著作
-康著者      康著者
-康著名      康著名
-康著述      康著述
-康著稱      康著稱
-康著錄      康著錄
-康著書      康著書
 扛著作      扛著作
 扛著者      扛著者
 扛著名      扛著名
 刻著名      刻著名
 刻著述      刻著述
 刻著稱      刻著稱
+刻著称      刻著稱
 刻著錄      刻著錄
 刻著書      刻著書
 空著作      空著作
 努力著名   努力著名
 努力著述   努力著述
 努力著稱   努力著稱
+努力著称   努力著稱
 努力著錄   努力著錄
 努力著書   努力著書
 麗著作      麗著作
 亮著名      亮著名
 亮著述      亮著述
 亮著稱      亮著稱
+亮著称      亮著稱
 亮著錄      亮著錄
 亮著書      亮著書
 臨著作      臨著作
 美著名      美著名
 美著述      美著述
 美著稱      美著稱
+美著称      美著稱
 美著錄      美著錄
 美著書      美著書
 夢著作      夢著作
 釀著稱      釀著稱
 釀著錄      釀著錄
 釀著書      釀著書
-努著作      努著作
-努著者      努著者
-努著名      努著名
-努著述      努著述
-努著稱      努著稱
-努著錄      努著錄
-努著書      努著書
 趴著作      趴著作
 趴著者      趴著者
 趴著名      趴著名
 求著稱      求著稱
 求著錄      求著錄
 求著書      求著書
-去著作      去著作
-去著者      去著者
-去著名      去著名
-去著述      去著述
-去著稱      去著稱
-去著錄      去著錄
-去著書      去著書
 嚷著作      嚷著作
 嚷著者      嚷著者
 嚷著名      嚷著名
 守著名      守著名
 守著述      守著述
 守著稱      守著稱
+守著称      守著稱
 守著錄      守著錄
 守著書      守著書
 受著作      受著作
 味著名      味著名
 味著述      味著述
 味著稱      味著稱
+味著称      味著稱
 味著錄      味著錄
 味著書      味著書
 想著作      想著作
 想著名      想著名
 想著述      想著述
 想著稱      想著稱
+想著称      想著稱
 想著錄      想著錄
 想著書      想著書
 響著作      響著作
 心著名      心著名
 心著述      心著述
 心著稱      心著稱
+心著称      心著稱
 心著錄      心著錄
 心著書      心著書
 信著作      信著作
 信著名      信著名
 信著述      信著述
 信著稱      信著稱
+信著称      信著稱
 信著錄      信著錄
 信著書      信著書
 行著作      行著作
 行著稱      行著稱
 行著錄      行著錄
 行著書      行著書
-性著作      性著作
-性著者      性著者
-性著名      性著名
-性著述      性著述
-性著稱      性著稱
-性著錄      性著錄
-性著書      性著書
 學著作      學著作
 學著者      學著者
 學著名      學著名
 雅著名      雅著名
 雅著述      雅著述
 雅著稱      雅著稱
+雅著称      雅著稱
 雅著錄      雅著錄
 雅著書      雅著書
 沿著作      沿著作
 衣著名      衣著名
 衣著述      衣著述
 衣著稱      衣著稱
+衣著稱      衣著稱
 衣著錄      衣著錄
 衣著書      衣著書
 疑著作      疑著作
 溢著稱      溢著稱
 溢著錄      溢著錄
 溢著書      溢著書
-藝著作      藝著作
-藝著者      藝著者
-藝著名      藝著名
-藝著述      藝著述
-藝著稱      藝著稱
-藝著錄      藝著錄
-藝著書      藝著書
 因著作      因著作
 因著者      因著者
 因著名      因著名
 語著稱      語著稱
 語著錄      語著錄
 語著書      語著書
-豫著作      豫著作
-豫著者      豫著者
-豫著名      豫著名
-豫著述      豫著述
-豫著稱      豫著稱
-豫著錄      豫著錄
-豫著書      豫著書
-遠著作      遠著作
-遠著者      遠著者
-遠著名      遠著名
-遠著述      遠著述
-遠著稱      遠著稱
-遠著錄      遠著錄
-遠著書      遠著書
 躍著作      躍著作
 躍著者      躍著者
 躍著名      躍著名
 載著稱      載著稱
 載著錄      載著錄
 載著書      載著書
-在著作      在著作
-在著者      在著者
-在著名      在著名
-在著述      在著述
-在著稱      在著稱
-在著錄      在著錄
-在著書      在著書
 紮著作      紮著作
 紮著者      紮著者
 紮著名      紮著名
 罩著稱      罩著稱
 罩著錄      罩著錄
 罩著書      罩著書
-貞著作      貞著作
-貞著者      貞著者
-貞著名      貞著名
-貞著述      貞著述
-貞著稱      貞著稱
-貞著錄      貞著錄
-貞著書      貞著書
 枕著作      枕著作
 枕著者      枕著者
 枕著名      枕著名
 制著稱      制著稱
 制著錄      制著錄
 制著書      制著書
-志著作      志著作
-志著者      志著者
-志著名      志著名
-志著述      志著述
-志著稱      志著稱
-志著錄      志著錄
-志著書      志著書
 皺著作      皺著作
 皺著者      皺著者
 皺著名      皺著名
 追著稱      追著稱
 追著錄      追著錄
 追著書      追著書
-髭著作      髭著作
-髭著者      髭著者
-髭著名      髭著名
-髭著述      髭著述
-髭著稱      髭著稱
-髭著錄      髭著錄
-髭著書      髭著書
 走著作      走著作
 走著者      走著者
 走著名      走著名
 含著稱      含著稱
 含著錄      含著錄
 含著書      含著書
-涵著作      涵著作
-涵著者      涵著者
-涵著名      涵著名
-涵著述      涵著述
-涵著稱      涵著稱
-涵著錄      涵著錄
-涵著書      涵著書
 演著作      演著作
 演著者      演著者
 演著名      演著名
 遇著名      遇著名
 遇著述      遇著述
 遇著稱      遇著稱
+遇著称      遇著稱
 遇著錄      遇著錄
 遇著書      遇著書
 殺著作      殺著作
 著甚麽      着甚麽
 存著 存着
 存著名      存著名
+存著作      存著作
 劃著 劃着
 別著 別着
 刮著 刮着
 蓋著稱      蓋著稱
 蓋著作      蓋著作
 覆蓋著      覆蓋着
+立著 立着
+立著名      立著名
+立著作      立著作
+立著者      立著者
+立著稱      立著稱
+立著称      立著稱
+立著有      立著有
+立著《      立著《
+立著(      立著(
 固著 固着
 班固著      班固著
 面包著      面包着
 柯林頓      克林頓
 萨达姆      薩達姆
 贝克汉姆   碧咸
´\9då\85\8bæ¼¢      ç¢§å\92¸
²\9då\85\8bæ¼¢      ç¢§å\92¸
 迈克尔·欧文      米高·奧雲
 卡普里亚蒂        卡佩雅蒂
 马拉特·萨芬      馬拉特·沙芬
@@ -2966,6 +2880,8 @@ IP地址  IP位址
 牛轧 鳥結
 牛軋 鳥結
 數位相機   數碼相機
+數位照相機        数碼照相機
+数字照相机        数碼照相機
 單眼相機   單鏡反光機
 单反相机   單鏡反光機
 形上學      形而上學
index 61ffc4d..6c93bb5 100644 (file)
 划着船      划著船
 划着竹筏   划著竹筏
 划着独木舟        划著獨木舟
+着眼于      著眼於
 缺省 預設
 以太网      乙太網
 光盘 光碟
 索贊尼辛   索忍尼辛
 瓦格纳      華格納
 毕加索      畢卡索
-碧å\92¸ è´\9då\85\8bæ¼¢
+碧å\92¸ è²\9då\85\8bæ¼¢
 梅尔·吉布森      梅爾·吉勃遜
 查韦斯      查維茲
 本杰明      班傑明
@@ -645,6 +646,9 @@ IP地址    IP位址
 數碼相機   數位相機
 單鏡反光機        單眼相機
 数码相机   數位相機
+数字照相机        數位照相機
+数码照相机        數位照相機
+數碼照相機        數位照相機
 单反相机   單眼相機
 形而上學   形上學
 形而上学   形上學
index b825402..b23faef 100644 (file)
 涂謹申      涂謹申
 涂鴻欽      涂鴻欽
 涂壯勳      涂壯勳
-於姓 於姓
-於氏 於氏
-於夫羅      於夫羅
-於梨華      於梨華
 鄭凱云      鄭凱云
 筑陽 筑陽
 筑後 筑後
@@ -45,7 +41,6 @@
 拜托 拜託
 委托书      委託書
 委托 委託
-於夫罗      於夫羅
 府干預      府干預
 府干擾      府干擾
 頁面 頁面
 于國治      于國治
 于楓 于楓
 黎吉雲      黎吉雲
-于飛島      于飛島
+于飛 于飛
 鄉愿 鄉愿
 愿樸 愿樸
 謹愿 謹愿
 昵称 暱稱
 單于 單于
 鮮于樞      鮮于樞
-鳳凰于飛   鳳凰于飛
 賦范 賦范
 茅于軾      茅于軾
 陳有后      陳有后
index bc4bff8..c7e4eca 100644 (file)
 乾剝剝
 乾刻版
 乾芻
-幹人
 乾產
 乾喬
 大目乾連
 乾巴
 偎乾
 眼乾
+瀝乾
+白乾兒
 肉絲麵
 薑絲
 反覆
 髮屋
 櫛髮工
 鬒髮
»¤äººé«®æ\8c\87
+人髮指
 爆發指數
 開發
 剪其髮
 鬆喉
 鬆化
 很鬆
+寬鬆鬆
+蓬鬆鬆
+輕鬆鬆
+鬆鬆地
 囉囉囌囌
 囉囌
 骨罈
 鹽打怎麼鹹
 鹹派
 鹹批
+鹹濕
+鹹豬
 錦綉花園
 籲天
 勃鬱
 幹事
 幹什麼
 幹細胞
+樹幹
 口燥唇乾
 舌乾唇焦
 不食乾腊
 乾鍋
 自乾五
 不乾膠
+老白乾
+乾姐
+乾紅葡萄酒
+乾白葡萄酒
 楨幹
 新幹縣
 誰幹的
 的幹將
 幹大事
 對着幹
+怎麼幹
+這麼幹
+幹這
+幹仗
 李連杰
 周杰
 杰倫
 叶韻
 叶音
 叶恭弘
-於1
-於2
-於3
-於4
-於5
-於6
-於7
-於8
-於9
-於0
-於一
-於二
-於三
-於四
-於五
-於六
-於七
-於八
-於九
-於十
-於半
-於1天 #分詞用
-於2天
-於3天
-於4天
-於5天
-於6天
-於7天
-於8天
-於9天
-於一天
-於二天
-於三天
-於四天
-於五天
-於六天
-於七天
-於八天
-於九天
-於十天
-於夫羅
-於梨華
 置於
 散於
 播於
 國於
 敗於
-於一役
 畢於
 畢業於
 寒於
 拘於
 插於
 中於
-於市
-於野
 敏於
 聽於
 短於
 成於
 樊於期
 淡於
-於陸
-於密
-於盡
 禍於
 格於
 猛於
 施於
-於牆
-於物
-於己
-於你
-於我
-於他
-於她
-於它
-於祂
 拒人於
 拒於
 潰於
 相於
 形於
 半於
-於始
-於終
 詢於
 美於
 醜於
 弱於
 差於
 劣於
-於美
-於醜
-於好
-於坏
-於強
-於弱
-於差
-於劣
-於垂
 染指於
-於火
-存十一於千百
 存於
-於勤
 隱於
 藏於
 嚴於
 寬於
-於幕
 給於
-於穆
-於呼哀哉
-於時
-於該
 危於
-於伏
-於何
-於家
-於國
-於潛縣
-於焉
 於徵
 離於
-於畢
 麗於
 下於
 亞於
 屑於
 絕於
 致於
-於行
 遜於
 任教於
 教於
 自於
 來於
 附於
-於人
-於世
 阻於
-於民
-於盲
-於色
 囿於
 直於
 建於
 都於
-於農
-於樂
-於前
 役於
-於心
-於法
-於事
 助於
 害於
 損於
 身於
 足於
 溢於
-於衷
 畏於
 視於
 衷於
 狃於
 疲於
 通於
-於途
 老於
 耿於
-於懷
 服於
 臻於
 匿於
 影相弔
 哀弔
 唁弔
-於水
 安於
 迫於
 罷於
 蹪於
-於敝
-於過
 甚於
 等於
 定於
 利於
 對於
-推舟於陸
-退藏於密
 歸於
 難於
 移禍於
 基於
 急於
 嫁禍於
-借聽於聾
 見於
 鑒於
-謹於心
-求道於盲
 始於
-於藍
 出於
 輕於
-行百里者半於九十
 幸於
 怠於
-詢於芻蕘
 止於
 至於
 拙於
 屬於
 浮於
 在於
-厝薪於火
 易於
 精於
 由於
-於此
-燕巢於幕
-於菟
-於乎
-於戲
-於邑
 補於
 位於
-於今
-於是
-於是乎
-於斯
 寓於
-月離於畢
-月麗於箕
 源於
 且於
 長於
 現於
 較於
-於之
 分布於
-散於
+散於
 優於
 早於
 晚於
 感於
+用於
+處於
+助於
+便於
+戰於
+葬於
+困於
+適於
+苦於
+落於
+取決於
+着眼於
 鬼谷子
 谷子敬
 洪谷子
 西米谷
 世田谷
-山谷道
 聖馬爾谷日
+澀谷區
+開山闢谷
+山谷 #分詞用
+溝谷
+曼谷
 于美人
 緊緻
 曰云
 鬥蛐
 鬥垮
 鬥敗
+鬥戰
 石樑
 木樑
 藏歷史
 賞讚
 讚唄
 點讚
+點個讚
 飛紮
 紮裹
 紮腳
 尸祿
 尸臣
 尸鳩
+尸佼
+尸子
+尸羅精舍
+毗婆尸佛
+尸棄佛
 已占卜
 已占算
 并迭
 網站裡
 行家裡手
 雲裡霧裡
+城市裡
+都市裡
+市裡的
+個月裡
+月裡來
+分鐘裡
+小時裡
 首發
 夸脫
 風采
 分别致
 韶山沖
 于丹
-于樂
 于冕
-于軍
 于吉
 于堅
 于姓
 于靖
 于勒
 于格
+于飛
 于仁泰
 于會泳
 于偉國
 簡筑翎
 楊雅筑
 彭于晏
-尸羅精舍
 進制
 劉佳怜
 于小惠
 熊杰
 卜云吉
 黎吉雲
-于飛島
 代表
 水無怜奈
 賭后
 於震後
 於震中
 固定制
-毗婆尸佛
-尸棄佛
 划船
 划不來
 划拳
 余力為
 葉叶琴
 幾個
-澀谷區
 併發症
 併發重症
 併發模式
 衝着
 確係
 乃係
-開山闢谷
 穀祿
 製衣
 巨製
 花葯
 聚葯雄蕊
 遺蹟
-開山闢谷
 受僱
 僱請
 僱車
 嫩薑
 酸薑
 薑啤
-鹹濕
 騰湧
 草蓆
 竹蓆
 被廢後
 蒸製
 烹製
+醃製
 體徵
 綜合徵
 价川
 梁啓超
 改制成
 王添灯
+腌臢
+風颳
+颳大風
index 18eab85..c6e4bf8 100644 (file)
 麵灰
 麵價
 承製
+樹榦
+白乾
+白干兒
+市裡
+于飛
+髮指
+鬆鬆
+于是
+于七
+于今
diff --git a/maintenance/migrateFileRepoLayout.php b/maintenance/migrateFileRepoLayout.php
new file mode 100644 (file)
index 0000000..78587ce
--- /dev/null
@@ -0,0 +1,232 @@
+<?php
+/**
+ * Copy all files in FileRepo to an originals container using SHA1 paths.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Copy all files in FileRepo to an originals container using SHA1 paths.
+ *
+ * This script should be run while the repo is still set to the old layout.
+ *
+ * @ingroup Maintenance
+ */
+class MigrateFileRepoLayout extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Copy files in repo to a different layout.";
+               $this->addOption( 'oldlayout', "Old layout; one of 'name' or 'sha1'", true, true );
+               $this->addOption( 'newlayout', "New layout; one of 'name' or 'sha1'", true, true );
+               $this->addOption( 'since', "Copy only files from after this timestamp", false, true );
+               $this->setBatchSize( 50 );
+       }
+
+       public function execute() {
+               $oldLayout = $this->getOption( 'oldlayout' );
+               if ( !in_array( $oldLayout, array( 'name', 'sha1' ) ) ) {
+                       $this->error( "Invalid old layout.", 1 );
+               }
+               $newLayout = $this->getOption( 'newlayout' );
+               if ( !in_array( $newLayout, array( 'name', 'sha1' ) ) ) {
+                       $this->error( "Invalid new layout.", 1 );
+               }
+               $since = $this->getOption( 'since' );
+
+               $repo = $this->getRepo();
+
+               $be = $repo->getBackend();
+               if ( $be instanceof FileBackendDBRepoWrapper ) {
+                       $be = $be->getInternalBackend(); // avoid path translations for this script
+               }
+
+               $dbw = $repo->getMasterDB();
+
+               $origBase = $be->getContainerStoragePath( "{$repo->getName()}-original" );
+               $startTime = wfTimestampNow();
+
+               // Do current and archived versions...
+               $conds = array();
+               if ( $since ) {
+                       $conds[] = 'img_timestamp >= ' . $dbw->addQuotes( $dbw->timestamp( $since ) );
+               }
+
+               $batch = array();
+               $lastName = '';
+               do {
+                       $res = $dbw->select( 'image', array( 'img_name', 'img_sha1' ),
+                               array_merge( array( 'img_name > ' . $dbw->addQuotes( $lastName ) ), $conds ),
+                               __METHOD__,
+                               array( 'LIMIT' => $this->mBatchSize, 'ORDER BY' => 'img_name' )
+                       );
+
+                       foreach ( $res as $row ) {
+                               $lastName = $row->img_name;
+                               $sha1 = $row->img_sha1;
+                               if ( !strlen( $sha1 ) ) {
+                                       $this->error( "Image SHA-1 not set for {$row->img_name}." );
+                               } else {
+                                       $file = $repo->newFile( $row->img_name );
+
+                                       if ( $oldLayout === 'sha1' ) {
+                                               $spath = "{$origBase}/{$sha1[0]}/{$sha1[1]}/{$sha1[2]}/{$sha1}";
+                                       } else {
+                                               $spath = $file->getPath();
+                                       }
+
+                                       if ( $newLayout === 'sha1' ) {
+                                               $dpath = "{$origBase}/{$sha1[0]}/{$sha1[1]}/{$sha1[2]}/{$sha1}";
+                                       } else {
+                                               $dpath = $file->getPath();
+                                       }
+
+                                       $status = $be->prepare( array( 'dir' => dirname( $dpath ) ) );
+                                       if ( !$status->isOK() ) {
+                                               $this->error( print_r( $status->getErrorsArray(), true ) );
+                                       }
+
+                                       $batch[] = array( 'op' => 'copy', 'overwrite' => true,
+                                               'src' => $spath, 'dst' => $dpath, 'img' => $row->img_name );
+                               }
+
+                               foreach ( $file->getHistory() as $ofile ) {
+                                       $sha1 = $ofile->getSha1();
+                                       if ( !strlen( $sha1 ) ) {
+                                               $this->error( "Image SHA-1 not set for {$ofile->getArchiveName()}." );
+                                               continue;
+                                       }
+
+                                       if ( $oldLayout === 'sha1' ) {
+                                               $spath = "{$origBase}/{$sha1[0]}/{$sha1[1]}/{$sha1[2]}/{$sha1}";
+                                       } elseif ( $ofile->isDeleted( File::DELETED_FILE ) ) {
+                                               $spath = $be->getContainerStoragePath( "{$repo->getName()}-deleted" ) .
+                                                       '/' . $repo->getDeletedHashPath( $sha1 ) .
+                                                       $sha1 . '.' . $ofile->getExtension();
+                                       } else {
+                                               $spath = $ofile->getPath();
+                                       }
+
+                                       if ( $newLayout === 'sha1' ) {
+                                               $dpath = "{$origBase}/{$sha1[0]}/{$sha1[1]}/{$sha1[2]}/{$sha1}";
+                                       } else {
+                                               $dpath = $ofile->getPath();
+                                       }
+
+                                       $status = $be->prepare( array( 'dir' => dirname( $dpath ) ) );
+                                       if ( !$status->isOK() ) {
+                                               $this->error( print_r( $status->getErrorsArray(), true ) );
+                                       }
+                                       $batch[] = array( 'op' => 'copy', 'overwrite' => true,
+                                               'src' => $spath, 'dst' => $dpath, 'img' => $ofile->getArchiveName() );
+                               }
+
+                               if ( count( $batch ) >= $this->mBatchSize ) {
+                                       $this->runBatch( $batch, $be );
+                                       $batch = array();
+                               }
+                       }
+               } while ( $res->numRows() );
+
+               if ( count( $batch ) ) {
+                       $this->runBatch( $batch, $be );
+               }
+
+               // Do deleted versions...
+               $conds = array();
+               if ( $since ) {
+                       $conds[] = 'fa_deleted_timestamp >= ' . $dbw->addQuotes( $dbw->timestamp( $since ) );
+               }
+
+               $batch = array();
+               $lastId = 0;
+               do {
+                       $res = $dbw->select( 'filearchive', array( 'fa_storage_key', 'fa_id', 'fa_name' ),
+                               array_merge( array( 'fa_id > ' . $dbw->addQuotes( $lastId ) ), $conds ),
+                               __METHOD__,
+                               array( 'LIMIT' => $this->mBatchSize, 'ORDER BY' => 'fa_id' )
+                       );
+
+                       foreach ( $res as $row ) {
+                               $lastId = $row->fa_id;
+                               $sha1Key = $row->fa_storage_key;
+                               if ( !strlen( $sha1Key ) ) {
+                                       $this->error( "Image SHA-1 not set for file #{$row->fa_id} (deleted)." );
+                                       continue;
+                               }
+                               $sha1 = substr( $sha1Key, 0, strpos( $sha1Key, '.' ) );
+
+                               if ( $oldLayout === 'sha1' ) {
+                                       $spath = "{$origBase}/{$sha1[0]}/{$sha1[1]}/{$sha1[2]}/{$sha1}";
+                               } else {
+                                       $spath = $be->getContainerStoragePath( "{$repo->getName()}-deleted" ) .
+                                               '/' . $repo->getDeletedHashPath( $sha1Key ) . $sha1Key;
+                               }
+
+                               if ( $newLayout === 'sha1' ) {
+                                       $dpath = "{$origBase}/{$sha1[0]}/{$sha1[1]}/{$sha1[2]}/{$sha1}";
+                               } else {
+                                       $dpath = $be->getContainerStoragePath( "{$repo->getName()}-deleted" ) .
+                                               '/' . $repo->getDeletedHashPath( $sha1Key ) . $sha1Key;
+                               }
+
+                               $status = $be->prepare( array( 'dir' => dirname( $dpath ) ) );
+                               if ( !$status->isOK() ) {
+                                       $this->error( print_r( $status->getErrorsArray(), true ) );
+                               }
+
+                               $batch[] = array( 'op' => 'copy', 'src' => $spath, 'dst' => $dpath,
+                                       'overwriteSame' => true, 'img' => "(ID {$row->fa_id}) {$row->fa_name}" );
+
+                               if ( count( $batch ) >= $this->mBatchSize ) {
+                                       $this->runBatch( $batch, $be );
+                                       $batch = array();
+                               }
+                       }
+               } while ( $res->numRows() );
+
+               if ( count( $batch ) ) {
+                       $this->runBatch( $batch, $be );
+               }
+
+               $this->output( "Done (started $startTime)\n" );
+       }
+
+       protected function getRepo() {
+               return RepoGroup::singleton()->getLocalRepo();
+       }
+
+       protected function runBatch( array $ops, FileBackend $be ) {
+               $this->output( "Migrating file batch:\n" );
+               foreach ( $ops as $op ) {
+                       $this->output( "\"{$op['img']}\" (dest: {$op['dst']})\n" );
+               }
+
+               $status = $be->doOperations( $ops );
+               if ( !$status->isOK() ) {
+                       $this->output( print_r( $status->getErrorsArray(), true ) );
+               }
+
+               $this->output( "Batch done\n\n" );
+       }
+}
+
+$maintClass = 'MigrateFileRepoLayout';
+require_once RUN_MAINTENANCE_IF_MAIN;
index 7b05cb7..d655965 100644 (file)
@@ -89,11 +89,10 @@ class CLIParser extends Maintenance {
         * @return string Wikitext
         */
        protected function Wikitext() {
-
                $php_stdin = 'php://stdin';
                $input_file = $this->getArg( 0, $php_stdin );
 
-               if ( $input_file === $php_stdin ) {
+               if ( $input_file === $php_stdin && !$this->mQuiet ) {
                        $ctrl = wfIsWindows() ? 'CTRL+Z' : 'CTRL+D';
                        $this->error( basename( __FILE__ )
                                . ": warning: reading wikitext from STDIN. Press $ctrl to parse.\n" );
diff --git a/maintenance/postgres/archives/patch-textsearch_bug66650.sql b/maintenance/postgres/archives/patch-textsearch_bug66650.sql
new file mode 100644 (file)
index 0000000..e4f5681
--- /dev/null
@@ -0,0 +1,5 @@
+UPDATE /*_*/pagecontent SET textvector=to_tsvector(old_text)
+WHERE textvector IS NULL AND old_id IN 
+(SELECT  max(rev_text_id) FROM revision GROUP BY rev_page);
+
+INSERT INTO /*_*/updatelog(ul_key) VALUES ('patch-textsearch_bug66650.sql');
index 7761d0c..b858551 100644 (file)
@@ -27,3 +27,8 @@ INSERT INTO /*_*/updatelog (ul_key, ul_value)
        VALUES( 'user_former_groups-ufg_group-patch-ufg_group-length-increase-255.sql', null );
 INSERT INTO /*_*/updatelog (ul_key, ul_value)
        VALUES( 'user_properties-up_property-patch-up_property.sql', null );
+
+-- PostgreSQL-specific patches.
+
+INSERT INTO /*_*/updatelog (ul_key, ul_value)
+       VALUES( 'patch-textsearch_bug66650.sql', null );
index 47866dc..f89877e 100644 (file)
@@ -48,14 +48,6 @@ class RebuildLocalisationCache extends Maintenance {
                        false, true );
        }
 
-       public function memoryLimit() {
-               if ( $this->hasOption( 'memory-limit' ) ) {
-                       return parent::memoryLimit();
-               }
-
-               return '1000M';
-       }
-
        public function finalSetup() {
                # This script needs to be run to build the inital l10n cache. But if
                # $wgLanguageCode is not 'en', it won't be able to run because there is
index 82eae21..a93e51f 100644 (file)
@@ -34,6 +34,7 @@ class MwSql extends Maintenance {
                parent::__construct();
                $this->mDescription = "Send SQL queries to a MediaWiki database. " .
                                "Takes a file name containing SQL as argument or runs interactively.";
+               $this->addOption( 'query', 'Run a single query instead of running interactively', false, true );
                $this->addOption( 'cluster', 'Use an external cluster by name', false, true );
                $this->addOption( 'wikidb', 'The database wiki ID to use if not the current one', false, true );
                $this->addOption( 'slave', 'Use a slave server (either "any" or by name)', false, true );
@@ -89,6 +90,13 @@ class MwSql extends Maintenance {
                        }
                }
 
+               if ( $this->hasOption( 'query' ) ) {
+                       $query = $this->getOption( 'query' );
+                       $this->sqlDoQuery( $db, $query, /* dieOnError */ true );
+                       wfWaitForSlaves();
+                       return;
+               }
+
                $useReadline = function_exists( 'readline_add_history' )
                        && Maintenance::posix_isatty( 0 /*STDIN*/ );
 
@@ -102,6 +110,7 @@ class MwSql extends Maintenance {
                $wholeLine = '';
                $newPrompt = '> ';
                $prompt = $newPrompt;
+               $doDie = !Maintenance::posix_isatty( 0 );
                while ( ( $line = Maintenance::readconsole( $prompt ) ) !== false ) {
                        if ( !$line ) {
                                # User simply pressed return key
@@ -122,19 +131,22 @@ class MwSql extends Maintenance {
                                readline_add_history( $wholeLine . $db->getDelimiter() );
                                readline_write_history( $historyFile );
                        }
-                       try {
-                               $res = $db->query( $wholeLine );
-                               $this->sqlPrintResult( $res, $db );
-                               $prompt = $newPrompt;
-                               $wholeLine = '';
-                       } catch ( DBQueryError $e ) {
-                               $doDie = !Maintenance::posix_isatty( 0 );
-                               $this->error( $e, $doDie );
-                       }
+                       $this->sqlDoQuery( $db, $wholeLine, $doDie );
+                       $prompt = $newPrompt;
+                       $wholeLine = '';
                }
                wfWaitForSlaves();
        }
 
+       protected function sqlDoQuery( $db, $line, $dieOnError ) {
+               try {
+                       $res = $db->query( $line );
+                       $this->sqlPrintResult( $res, $db );
+               } catch ( DBQueryError $e ) {
+                       $this->error( $e, $dieOnError );
+               }
+       }
+
        /**
         * Print the results, callback for $db->sourceStream()
         * @param ResultWrapper $res The results object
diff --git a/phpcs.xml b/phpcs.xml
new file mode 100644 (file)
index 0000000..7f1bced
--- /dev/null
+++ b/phpcs.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<ruleset name="MediaWiki">
+       <rule ref="vendor/mediawiki/mediawiki-codesniffer/MediaWiki"/>
+       <file>.</file>
+       <arg name="encoding" value="utf8"/>
+       <arg name="extensions" value="php,php5,inc,sample"/>
+       <exclude-pattern>node_modules</exclude-pattern>
+       <exclude-pattern>vendor</exclude-pattern>
+       <exclude-pattern>extensions</exclude-pattern>
+       <exclude-pattern>skins</exclude-pattern>
+</ruleset>
index 182f090..a47a1c0 100644 (file)
@@ -247,12 +247,44 @@ return array(
        ),
        'jquery.highlightText' => array(
                'scripts' => 'resources/src/jquery/jquery.highlightText.js',
-               'dependencies' => 'mediawiki.RegExp',
+               'dependencies' => array(
+                       'mediawiki.RegExp',
+                       'dom-level2-shim',
+               ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.hoverIntent' => array(
                'scripts' => 'resources/lib/jquery/jquery.hoverIntent.js',
        ),
+       'jquery.i18n' => array(
+               'scripts' => array(
+                       'resources/lib/jquery.i18n/src/jquery.i18n.js',
+                       'resources/lib/jquery.i18n/src/jquery.i18n.messagestore.js',
+                       'resources/lib/jquery.i18n/src/jquery.i18n.parser.js',
+                       'resources/lib/jquery.i18n/src/jquery.i18n.emitter.js',
+                       'resources/lib/jquery.i18n/src/jquery.i18n.emitter.bidi.js',
+                       'resources/lib/jquery.i18n/src/jquery.i18n.language.js',
+                       'resources/lib/jquery.i18n/src/jquery.i18n.fallbacks.js',
+               ),
+               'dependencies' => 'mediawiki.libs.pluralruleparser',
+               'languageScripts' => array(
+                       'bs' => 'resources/lib/jquery.i18n/src/languages/bs.js',
+                       'dsb' => 'resources/lib/jquery.i18n/src/languages/dsb.js',
+                       'fi' => 'resources/lib/jquery.i18n/src/languages/fi.js',
+                       'ga' => 'resources/lib/jquery.i18n/src/languages/ga.js',
+                       'he' => 'resources/lib/jquery.i18n/src/languages/he.js',
+                       'hsb' => 'resources/lib/jquery.i18n/src/languages/hsb.js',
+                       'hu' => 'resources/lib/jquery.i18n/src/languages/hu.js',
+                       'hy' => 'resources/lib/jquery.i18n/src/languages/hy.js',
+                       'la' => 'resources/lib/jquery.i18n/src/languages/la.js',
+                       'ml' => 'resources/lib/jquery.i18n/src/languages/ml.js',
+                       'os' => 'resources/lib/jquery.i18n/src/languages/os.js',
+                       'ru' => 'resources/lib/jquery.i18n/src/languages/ru.js',
+                       'sl' => 'resources/lib/jquery.i18n/src/languages/sl.js',
+                       'uk' => 'resources/lib/jquery.i18n/src/languages/uk.js',
+               ),
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
        'jquery.localize' => array(
                'scripts' => 'resources/src/jquery/jquery.localize.js',
        ),
@@ -309,6 +341,7 @@ return array(
                'styles' => 'resources/src/jquery/jquery.tablesorter.css',
                'messages' => array( 'sort-descending', 'sort-ascending' ),
                'dependencies' => array(
+                       'dom-level2-shim',
                        'mediawiki.RegExp',
                        'mediawiki.language.months',
                ),
@@ -853,6 +886,16 @@ return array(
        'mediawiki.api.parse' => array(
                'scripts' => 'resources/src/mediawiki.api/mediawiki.api.parse.js',
                'dependencies' => 'mediawiki.api',
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
+       'mediawiki.api.upload' => array(
+               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.upload.js',
+               'dependencies' => array(
+                       'dom-level2-shim',
+                       'mediawiki.api',
+                       'mediawiki.api.edit',
+                       'json',
+               ),
        ),
        'mediawiki.api.watch' => array(
                'scripts' => 'resources/src/mediawiki.api/mediawiki.api.watch.js',
@@ -1054,6 +1097,13 @@ return array(
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'mediawiki.Upload' => array(
+               'scripts' => 'resources/src/mediawiki/mediawiki.Upload.js',
+               'dependencies' => array(
+                       'dom-level2-shim',
+                       'mediawiki.api.upload',
+               ),
+       ),
        'mediawiki.toc' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.toc.js',
                'dependencies' => 'mediawiki.cookie',
@@ -1733,14 +1783,18 @@ return array(
        'mediawiki.widgets' => array(
                'scripts' => array(
                        'resources/src/mediawiki.widgets/mw.widgets.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.js',
                        'resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js',
                        'resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js',
-                       'resources/src/mediawiki.widgets/mw.widgets.infuse.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js',
                ),
                'skinStyles' => array(
-                       'default' => 'resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.css',
+                       'default' => array(
+                               'resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.css',
+                       ),
                ),
                'dependencies' => array(
+                       'mediawiki.widgets.styles',
                        'jquery.autoEllipsis',
                        'mediawiki.Title',
                        'mediawiki.api',
@@ -1752,6 +1806,15 @@ return array(
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'mediawiki.widgets.styles' => array(
+               'skinStyles' => array(
+                       'default' => array(
+                               'resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.base.css',
+                       ),
+               ),
+               'position' => 'top',
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
 
        /* es5-shim */
        'es5-shim' => array(
index 8320b37..974db87 100644 (file)
@@ -27,11 +27,12 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 // WARNING: OOjs-UI is NOT TESTED with older browsers and is likely to break
 // if loaded in browsers that don't support ES5
 return call_user_func( function () {
-       // Core default themes
-       $themes = array( 'default' => 'mediawiki' );
-       $themes += ExtensionRegistry::getInstance()->getAttribute( 'SkinOOUIThemes' );
-       $modules = array();
+       $themes = ExtensionRegistry::getInstance()->getAttribute( 'SkinOOUIThemes' );
+       // We only use the theme names for file names, and they are lowercase
+       $themes = array_map( 'strtolower', $themes );
+       $themes['default'] = 'mediawiki';
 
+       $modules = array();
        $modules['oojs-ui'] = array(
                'scripts' => array(
                        'resources/lib/oojs-ui/oojs-ui.js',
diff --git a/resources/lib/jquery.i18n/CREDITS b/resources/lib/jquery.i18n/CREDITS
new file mode 100644 (file)
index 0000000..3a4eb5e
--- /dev/null
@@ -0,0 +1,9 @@
+Credits
+=======
+
+Santhosh Thottingal
+Amir E. Aharoni
+Siebrand Mazeland
+Niklas Laxström
+Neil Kandalgaonkar
+David Chan
diff --git a/resources/lib/jquery.i18n/GPL-LICENSE b/resources/lib/jquery.i18n/GPL-LICENSE
new file mode 100644 (file)
index 0000000..019694a
--- /dev/null
@@ -0,0 +1,342 @@
+== GNU GENERAL PUBLIC LICENSE ==
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+=== Preamble ===
+
+The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+== TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ==
+
+'''0.''' This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+'''1.''' You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+'''2.''' You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+       '''a)''' You must cause the modified files to carry prominent notices
+       stating that you changed the files and the date of any change.
+
+       '''b)''' You must cause any work that you distribute or publish, that in
+       whole or in part contains or is derived from the Program or any
+       part thereof, to be licensed as a whole at no charge to all third
+       parties under the terms of this License.
+
+       '''c)''' If the modified program normally reads commands interactively
+       when run, you must cause it, when started running for such
+       interactive use in the most ordinary way, to print or display an
+       announcement including an appropriate copyright notice and a
+       notice that there is no warranty (or else, saying that you provide
+       a warranty) and that users may redistribute the program under
+       these conditions, and telling the user how to view a copy of this
+       License.  (Exception: if the Program itself is interactive but
+       does not normally print such an announcement, your work based on
+       the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+'''3.''' You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+       '''a)''' Accompany it with the complete corresponding machine-readable
+       source code, which must be distributed under the terms of Sections
+       1 and 2 above on a medium customarily used for software interchange; or,
+
+       '''b)''' Accompany it with a written offer, valid for at least three
+       years, to give any third party, for a charge no more than your
+       cost of physically performing source distribution, a complete
+       machine-readable copy of the corresponding source code, to be
+       distributed under the terms of Sections 1 and 2 above on a medium
+       customarily used for software interchange; or,
+
+       '''c)''' Accompany it with the information you received as to the offer
+       to distribute corresponding source code.  (This alternative is
+       allowed only for noncommercial distribution and only if you
+       received the program in object code or executable form with such
+       an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+'''4.''' You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+'''5.''' You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+'''6.''' Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+'''7.''' If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+'''8.''' If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+'''9.''' The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+'''10.''' If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+=== NO WARRANTY ===
+
+'''11.''' BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+'''12.''' IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+       '''END OF TERMS AND CONDITIONS'''
+
+== How to Apply These Terms to Your New Programs ==
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+       <one line to give the program's name and a brief idea of what it does.>
+
+       Copyright (C) <year>  <name of author>
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+       Gnomovision version 69, Copyright (C) year name of author
+       Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+       This is free software, and you are welcome to redistribute it
+       under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+       Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+       `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+       <signature of Ty Coon>, 1 April 1989
+
+       Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/resources/lib/jquery.i18n/MIT-LICENSE b/resources/lib/jquery.i18n/MIT-LICENSE
new file mode 100644 (file)
index 0000000..f3a03b7
--- /dev/null
@@ -0,0 +1,21 @@
+Copyright (c) 2012-2013 Santhosh Thottingal and other
+contributors. See CREDITS for a list.
+
+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/lib/jquery.i18n/README.md b/resources/lib/jquery.i18n/README.md
new file mode 100644 (file)
index 0000000..da82c2b
--- /dev/null
@@ -0,0 +1,432 @@
+jQuery.i18n
+===========
+
+jQuery.i18n is a jQuery based Javascript internationalization library. It helps you to internationalize your web applications easily.
+
+This is a project by Wikimedia foundation's [Language Engineering team](http://wikimediafoundation.org/wiki/Language_Engineering_team) and used in some of the Wikimedia Foundation projects like Universal Language Selector.
+
+The jquery.i18n library uses a json based localization file format, "banana", which is used as the localization file format for  MediaWiki and other projects.
+
+Features
+========
+* Simple file format - JSON. Easily readable for humans and machines.
+* Author and metadata information is not lost anywhere. There are other file formats using comments to store this.
+* Uses MediaWiki convention for placeholders. Easily readable and proven convention. Example: ```There are $1 cars```
+* Supports plural conversion without using extra messages for all plural forms. Plural rule handling is done using CLDR. Covers a wide range of languages
+* Supports gender. By passing the gender value, you get correct sentences according to gender.
+* Supports grammar forms. jquery.i18n has a basic but extensible grammar conversion support
+* Fallback chains for all languages.
+* Data api- the message key. Example: ```<li data-i18n="message-key"></li>```.
+* Dynamic change of interface language without refreshing a webpage.
+* Nestable grammar, plural, gender support. These constructs can be nested to any arbitrary level for supporting sophisticated message localization
+* Message documentation through special language code ```qqq```
+* Extensible message parser to add or customize magic words in the messages. Example: ```{sitename}``` or ```[[link]]``
+
+
+Quick start
+-----------
+
+```bash
+git clone https://github.com/wikimedia/jquery.i18n.git
+cd jquery.i18n
+git submodule update --init
+```
+
+Testing
+-------
+
+```shell
+npm install
+```
+
+To run tests locally, run `npm test`, and this will run the tests.
+
+Message File Format
+===================
+
+The message files are json formatted. As a convention you can have a folder named i18n inside your source code. For each language or locale, have a file named like languagecode.json.
+
+Example:
+```
+App
+       |--src
+       |--doc
+       |--i18n
+               |--ar.json
+               |--de.json
+               |--en.json
+               |--he.json
+               |--hi.json
+               |--fr.json
+               |--qqq.json
+```
+
+A simple en.json file example is given below
+
+```json
+{
+       "@metadata": {
+               "authors": [
+                       "Alice",
+                       "David",
+                       "Santhosh"
+               ],
+               "last-updated": "2012-09-21",
+               "locale": "en",
+               "message-documentation": "qqq",
+               "AnotherMetadata": "AnotherMedatadataValue"
+       },
+       "appname-title": "Example Application",
+       "appname-sub-title": "An example application with jquery.i18n",
+       "appname-header-introduction": "Introduction",
+       "appname-about": "About this application",
+       "appname-footer": "Footer text"
+}
+```
+
+The json file should be a valid json. The ```@metadata``` holds all kind of data that are not messages. You can store author information, copyright, updated date or anything there.
+
+Messages are key value pairs. It is a good convention to prefix your appname to message keys to make the messages unique. It acts as the namespace for the message keys. It is also a good convention to have the message keys with ```-``` separated words, all in lower case.
+
+If you are curious to see some real jquery.i18n message file from other projects:
+
+- message files of MediaWiki https://github.com/wikimedia/mediawiki-core/tree/master/languages/i18n
+- message files from jquery.uls project https://github.com/wikimedia/jquery.uls/blob/master/i18n
+
+Single message file for all languages
+-------------------------------------
+There are some alternate message file format supported for different use cases. If your application is not big, and want all the translation in a single file, you can have it as shown in the below example:
+
+```json
+{
+       "@metadata": {
+               "authors": [
+                       "Alice",
+                       "David",
+                       "Santhosh"
+               ],
+               "last-updated": "2012-09-21",
+               "locale": "en",
+               "message-documentation": "qqq",
+               "AnotherMetadata": "AnotherMedatadataValue"
+       },
+       "en": {
+               "appname-title": "Example Application",
+               "appname-sub-title": "An example application with jquery.i18n",
+               "appname-header-introduction": "Introduction",
+               "appname-about": "About this application",
+               "appname-footer": "Footer text"
+               },
+       "ml": {
+               "appname-title": "അപ്ലിക്കേഷന്‍ ഉദാഹരണം",
+               "appname-sub-title": "jquery.i18n ഉപയോഗിച്ചുള്ള അപ്ലിക്കേഷന്‍ ഉദാഹരണം",
+               "appname-header-introduction": "ആമുഖം",
+               "appname-about": "ഈ അപ്ലിക്കേഷനെപ്പറ്റി",
+               "appname-footer": "അടിക്കുറിപ്പു്"
+       }
+}
+```
+
+Here the json file contains language code as key value and messagekey-message pairs as the value for all language pairs. You can choose this format or per-language file formats depending on your use case. Per-language files are more convenient for collaboration, version controlling, scalability, etc.
+
+In this approach, it is also possible to give a file name as the value of language code.
+
+```json
+{
+       "@metadata": {
+               "authors": [
+                       "Alice",
+                       "David",
+                       "Santhosh"
+               ],
+               "last-updated": "2012-09-21",
+               "locale": "en",
+               "message-documentation": "qqq",
+               "AnotherMetadata": "AnotherMedatadataValue"
+       },
+       "en": {
+               "appname-title": "Example Application",
+               "appname-sub-title": "An example application with jquery.i18n",
+               "appname-header-introduction": "Introduction",
+               "appname-about": "About this application",
+               "appname-footer": "Footer text"
+               },
+       "ml": "path/to/ml.json"
+}
+```
+
+Translation
+===========
+To translate the jquery.i18n application, depending on the expertise of the translator, there are multiple ways.
+
+* Editing the json files directly - Suitable for translators with technical background. Also suitable if your application is small and you want to work with only a small number of languages
+* Providing a translation interface along with your application: Suitable for proprietary or private applications with significant amount of translators
+* Using open source translation platforms like translatewiki.net. The MediaWiki and jquery.uls from previous examples use translatewiki.net for crowdsourced message translation. Translatewiki.net can update your code repo in regular intervals with updated translations. Highly recommended if your application is opensource and want localized to as many as languages possible with maximum number of translators.
+
+Usage
+=====
+
+## Switching locale
+
+While initializing the `jquery.i18n`, the locale for the page can be given using the `locale` option. For example
+
+```javascript
+$.i18n( {
+    locale: 'he' // Locale is Hebrew
+} );
+```
+
+In case locale option is not given, `jquery.i18n` plugin will use the language attribute given for the html tag. For example
+
+```html
+<html lang="he" dir="rtl">
+```
+
+In this case the locale will be he(Hebrew). If that `lang` attribute is also missing, it will try to use the locale specified by the browser.
+
+It is possible to switch to another locale after plugin is initialized. See below example:
+
+```javascript
+$.i18n({
+    locale: 'he' // Locale is Hebrew
+});
+$.i18n( 'message_hello' ); // This will give the Hebrew translation of message key `message_hello`.
+$.i18n().locale = 'ml'; // Now onwards locale is 'Malayalam'
+$.i18n( 'message_hello' ); // This will give the Malayalam translation of message key `message_hello`.
+```
+
+## Message Loading
+
+JSON formatted messages can be loaded to the plugin using multiple ways.
+
+### Dynamic loading using `load` method.
+
+Following example shows loading messages for two locales- localex, and localey. Here localex and localey are just examples. They should be valid IS0 639 language codes(eg: en, ml, hi, fr, ta etc)
+
+```javascript
+$.i18n().load( {
+       'localex' : {
+               'message-key1' : 'message1' // Message for localex.
+       },
+       'localey' : {
+               'message-key1' : 'message1'
+       }
+} );
+```
+
+If we want to load the messages for a specific locale, it can be done like this:
+
+```javascript
+$.i18n().load({
+    'message-hello': 'Hello World',
+    'message-welcome': 'Welcome'
+}, 'en');
+```
+
+Note the second argument for the `load` method. It should be a valid language code.
+
+It is also possible to refer messages from an external URL. See below example
+
+```javascript
+$.i18n().load( {
+       en: {
+               message_hello: 'Hello World',
+       message_welcome: 'Welcome'
+       },
+       hi: 'i18n/messages-hi.json', // Messages for Hindi
+       de: 'i18n/messages-de.json'
+} );
+```
+
+Messages for a locale can be also loaded in parts. Example
+
+```javascript
+$.i18n().load( {
+       en: {
+               message_hello: 'Hello World',
+       message_welcome: 'Welcome'
+       }
+} );
+
+$.i18n().load( {
+       // This does not remove the previous messages.
+       en: {
+               'message_header' : 'Header',
+               'message_footer' : 'Footer',
+               // This will overwrite message_welcome message
+               'message_welcome' : 'Welcome back'
+       }
+} );
+```
+
+Since it is desirable to render interface messages instantly and not after a delay of loading the message files from a server, make sure that the messages are present at client side before using jQuery.i18n.
+
+The library should expose an API to load an object containing key-value pair of messages. Example: ```$.i18n.load(data)```. This will return a ```jQuery.Promise```.
+
+jquery.i18n plugin
+=========================
+
+The jQuery plugin defines ```$.i18n()``` and ```$.fn.i18n()```
+
+```javascript
+$.i18n( 'message-key-sample1' );
+$.i18n( 'message-key-sample1' );
+$.i18n( 'Found $1 {{plural:$1|result|results}}', 10 ); // Message key itself is message text
+$.i18n( 'Showing $1 out of $2 {{plural:$2|result|results}}', 5,100 );
+$.i18n(' User X updated {{gender|his|her}} profile', 'male' );
+
+$( '#foo' ).i18n(); // to translate the element matching jquery selector based on data-i18n key
+```
+
+Data API
+--------
+
+It is possible to display localized messages without any custom JavaScript. For the HTML tags, add an attribute data-i18n with value as the message key. Example:
+```html
+<li data-i18n="message-key"></li>.
+```
+
+It is also possible to have the above li node with fallback text already in place.
+```html
+<li data-i18n="message-key">Fallback text</li>
+```
+
+The framework will place the localized message corresponding to message-key as the text value of the node. Similar to $('selector').i18n( ... ).
+This will not work for dynamically created elements.
+
+Note that if data-i18n contains html markup, that html will not be used as the element content, instead, the text version will be used. $.fn.i18n is always about replacing text of the element. If you want to change the html of the element, you may want to use: ```$(selector).html($.i18n(messagekey))```
+
+Examples
+========
+
+See http://thottingal.in/projects/js/jquery.i18n/demo/
+
+Message format
+==============
+
+## Placeholders
+
+Messages take parameters. They are represented by $1, $2, $3, … in the message texts, and replaced at run time. Typical parameter values are numbers (Example: "Delete 3 versions?"), or user names (Example: "Page last edited by $1"), page names, links, and so on, or sometimes other messages.
+
+```javascript
+var message = "Welcome, $1";
+$.i18n(message, 'Alice'); // This gives "Welcome, Alice"
+```
+
+
+## Plurals
+
+To make the syntax of sentence correct, plural forms are required. jquery.i18n support plural forms in the message using the syntax `{{PLURAL:$1|pluralform1|pluralform2|...}}`
+
+For example:
+
+```javascript
+var message = "Found $1 {{PLURAL:$1|result|results}}";
+$.i18n(message, 1); // This gives "Found 1 result"
+$.i18n(message, 4); // This gives "Found 4 results"
+```
+Note that {{PLURAL:...}} is not case sensitive. It can be {{plural:...}} too.
+
+In case of English, there are only 2 plural forms, but many languages use more than 2 plural forms. All the plural forms can be given in the above syntax, separated by pipe(|)
+
+## Gender
+Similar to plural, depending on gender of placeholders, mostly user names, the syntax changes dynamically. An example in English is "Alice changed her profile picture" and "Bob changed his profile picture". To support this {{GENDER...}} syntax can be used as show in example
+
+```javascript
+var message = "$1 changed {{GENDER:$2|his|her}} profile picture";
+$.i18n(message, 'Alice', 'female' ); // This gives "Alice changed her profile picture"
+$.i18n(message, 'Bob', 'male' ); // This gives "Bob changed his profile picture"
+```
+
+Note that {{GENDER:...}} is not case sensitive. It can be {{gender:...}} too.
+
+## Grammar
+
+
+```javascript
+$.i18n( { locale: 'fi' } );
+
+var message = "{{grammar:genitive|$1}}";
+
+$.i18n(message, 'talo' ); // This gives "talon"
+
+$.i18n().locale = 'hy'; // Switch to locale Armenian
+$.i18n(message, 'Մաունա'); // This gives "Մաունայի"
+```
+
+## Directionality-safe isolation
+
+To avoid BIDI corruption that looks like "(Foo_(Bar", which happens when a string is inserted into a context with the reverse directionality, you can use `{{bidi:…}}`. Directionality-neutral characters at the edge of the string can get wrongly interpreted by the BIDI algorithm. This would let you embed your substituted string into a new BIDI context, //e.g.//:
+
+   "`Shalom, {{bidi:$1}}, hi!`"
+
+The embedded context's directionality is determined by looking at the argument for `$1`, and then explicitly inserted into the Unicode text, ensuring correct rendering (because then the bidi algorithm "knows" the argument text is a separate context).
+
+
+Fallback
+========
+
+The plugin takes an option 'fallback' with the default value 'en'. The library reuses the fallback data available in MediaWiki for calculating the language fallbacks. Fallbacks are used when a message key is not found in a locale. Example fallbacks: sa->hi->en or tt->tt-cyrl->ru.
+
+See jquery.i18n.fallbacks.js in the source.
+
+Magic word support
+===================
+* For plural, gender and grammar support, MediaWiki template-like syntax - {{...}} will be used.
+* There will be a default implementation for all these in $.i18n.language['default']
+* The plural, gender and grammar methods in ```$.i18n.language[ 'default' ]``` can be overridden or extended in ```$.i18n.language['languageCode']```.
+* Language-specific rules about Gender and Grammar can be written in languages/langXYZ.js files
+* Plural forms will be dynamically calculated using the CLDR plural parser.
+
+Extending the parser
+--------------------
+Following example illustrates extending the parser to support more magic words
+
+```javascript
+$.extend( $.i18n.parser.emitter, {
+       // Handle SITENAME keywords
+       sitename: function () {
+               return 'Wikipedia';
+       },
+       // Handle LINK keywords
+       link: function ( nodes ) {
+               return '<a href="' + nodes[1] + '">' + nodes[0] + '</a>';
+       }
+} );
+```
+
+This will parse the message
+```javascript
+$.i18n( '{{link:{{SITENAME}}|http://en.wikipedia.org}}' );
+```
+
+to
+
+```html
+<a href="http://en.wikipedia.org">Wikipedia</a>
+```
+
+Message documentation
+=====================
+
+The message keys and messages won't give a enough context about the message being translated to the translator. Whenever a developer adds a new message, it is a usual practice to document the message to a file named qqq.json
+with same message key.
+
+Example qqq.json:
+```json
+{
+       "@metadata": {
+               "authors": [
+                       "Developer Name"
+               ]
+       },
+       "appname-title": "Application name. Transliteration is recommended",
+       "appname-sub-title": "Brief explanation of the application",
+       "appname-header-introduction": "Text for the introduction header",
+       "appname-about": "About this application text",
+       "appname-footer": "Footer text"
+}
+
+```
+
+In MediaWiki and its hundreds of extensions, message documentation is a strictly followed practice. There is a grunt task to check whether all messages are documented or not. See https://www.npmjs.org/package/grunt-banana-checker
diff --git a/resources/lib/jquery.i18n/package.json b/resources/lib/jquery.i18n/package.json
new file mode 100644 (file)
index 0000000..0dded29
--- /dev/null
@@ -0,0 +1,47 @@
+{
+  "name": "jquery.i18n",
+  "version": "1.0.3",
+  "description": "jQuery based internationalization library",
+  "homepage": "https://github.com/wikimedia/jquery.i18n",
+  "keywords": [
+    "internationalization",
+    "localization",
+    "i18n",
+    "jquery",
+    "l10n"
+  ],
+  "author": {
+    "name": "Santhosh Thottingal",
+    "email": "santhosh.thottingal@gmail.com"
+  },
+  "contributors": [
+    "Amir Aharoni <amir.aharoni@mail.huji.ac.il>",
+    "Niklas Laxström <nlaxstrom@wikimedia.org>",
+    "Neil Kandalgaonkar <neilk@brevity.org>",
+    "David Chan <david@troi.org>"
+  ],
+  "devDependencies": {
+    "qunit": "0.7.6",
+    "grunt": "0.4.5",
+    "grunt-cli": "0.1.13",
+    "grunt-contrib-jshint": "0.11.2",
+    "grunt-contrib-connect": "0.10.1",
+    "grunt-contrib-qunit": "0.7.0",
+    "grunt-contrib-watch": "0.6.1",
+    "grunt-jscs": "1.8.0"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/wikimedia/jquery.i18n.git"
+  },
+  "bugs": {
+      "url" : "http://github.com/wikimedia/jquery.i18n/issues"
+  },
+  "engine": {
+    "node": ">=0.8.x"
+  },
+  "license": "(MIT OR GPL-2.0)",
+  "scripts": {
+    "test": "grunt test --verbose"
+  }
+}
diff --git a/resources/lib/jquery.i18n/src/jquery.i18n.emitter.bidi.js b/resources/lib/jquery.i18n/src/jquery.i18n.emitter.bidi.js
new file mode 100644 (file)
index 0000000..3a5b625
--- /dev/null
@@ -0,0 +1,88 @@
+/**
+ * BIDI embedding support for jQuery.i18n
+ *
+ * Copyright (C) 2015, David Chan
+ *
+ * This code is dual licensed GPLv2 or later and MIT. You don't have to do
+ * anything special to choose one license or the other and you don't have to
+ * notify anyone which license you are using. You are free to use this code
+ * in commercial projects as long as the copyright header is left intact.
+ * See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @licence GNU General Public Licence 2.0 or later
+ * @licence MIT License
+ */
+
+( function ( $ ) {
+       'use strict';
+       var strongDirRegExp;
+
+       /**
+        * Matches the first strong directionality codepoint:
+        * - in group 1 if it is LTR
+        * - in group 2 if it is RTL
+        * Does not match if there is no strong directionality codepoint.
+        *
+        * Generated by UnicodeJS (see tools/strongDir) from the UCD; see
+        * https://git.wikimedia.org/summary/unicodejs.git .
+        */
+       strongDirRegExp = new RegExp(
+               '(?:' +
+                       '(' +
+                               '[\u0041-\u005a\u0061-\u007a\u00aa\u00b5\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u02bb-\u02c1\u02d0\u02d1\u02e0-\u02e4\u02ee\u0370-\u0373\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0482\u048a-\u052f\u0531-\u0556\u0559-\u055f\u0561-\u0587\u0589\u0903-\u0939\u093b\u093d-\u0940\u0949-\u094c\u094e-\u0950\u0958-\u0961\u0964-\u0980\u0982\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd-\u09c0\u09c7\u09c8\u09cb\u09cc\u09ce\u09d7\u09dc\u09dd\u09df-\u09e1\u09e6-\u09f1\u09f4-\u09fa\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3e-\u0a40\u0a59-\u0a5c\u0a5e\u0a66-\u0a6f\u0a72-\u0a74\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd-\u0ac0\u0ac9\u0acb\u0acc\u0ad0\u0ae0\u0ae1\u0ae6-\u0af0\u0af9\u0b02\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b3e\u0b40\u0b47\u0b48\u0b4b\u0b4c\u0b57\u0b5c\u0b5d\u0b5f-\u0b61\u0b66-\u0b77\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe\u0bbf\u0bc1\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd0\u0bd7\u0be6-\u0bf2\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c41-\u0c44\u0c58-\u0c5a\u0c60\u0c61\u0c66-\u0c6f\u0c7f\u0c82\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd-\u0cc4\u0cc6-\u0cc8\u0cca\u0ccb\u0cd5\u0cd6\u0cde\u0ce0\u0ce1\u0ce6-\u0cef\u0cf1\u0cf2\u0d02\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d40\u0d46-\u0d48\u0d4a-\u0d4c\u0d4e\u0d57\u0d5f-\u0d61\u0d66-\u0d75\u0d79-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dcf-\u0dd1\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df4\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e4f-\u0e5b\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0ed0-\u0ed9\u0edc-\u0edf\u0f00-\u0f17\u0f1a-\u0f34\u0f36\u0f38\u0f3e-\u0f47\u0f49-\u0f6c\u0f7f\u0f85\u0f88-\u0f8c\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce-\u0fda\u1000-\u102c\u1031\u1038\u103b\u103c\u103f-\u1057\u105a-\u105d\u1061-\u1070\u1075-\u1081\u1083\u1084\u1087-\u108c\u108e-\u109c\u109e-\u10c5\u10c7\u10cd\u10d0-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1360-\u137c\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u167f\u1681-\u169a\u16a0-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1735\u1736\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17b6\u17be-\u17c5\u17c7\u17c8\u17d4-\u17da\u17dc\u17e0-\u17e9\u1810-\u1819\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1923-\u1926\u1929-\u192b\u1930\u1931\u1933-\u1938\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u1a00-\u1a16\u1a19\u1a1a\u1a1e-\u1a55\u1a57\u1a61\u1a63\u1a64\u1a6d-\u1a72\u1a80-\u1a89\u1a90-\u1a99\u1aa0-\u1aad\u1b04-\u1b33\u1b35\u1b3b\u1b3d-\u1b41\u1b43-\u1b4b\u1b50-\u1b6a\u1b74-\u1b7c\u1b82-\u1ba1\u1ba6\u1ba7\u1baa\u1bae-\u1be5\u1be7\u1bea-\u1bec\u1bee\u1bf2\u1bf3\u1bfc-\u1c2b\u1c34\u1c35\u1c3b-\u1c49\u1c4d-\u1c7f\u1cc0-\u1cc7\u1cd3\u1ce1\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u200e\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u214f\u2160-\u2188\u2336-\u237a\u2395\u249c-\u24e9\u26ac\u2800-\u28ff\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d70\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u302e\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u3190-\u31ba\u31f0-\u321c\u3220-\u324f\u3260-\u327b\u327f-\u32b0\u32c0-\u32cb\u32d0-\u32fe\u3300-\u3376\u337b-\u33dd\u33e0-\u33fe\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua60c\ua610-\ua62b\ua640-\ua66e\ua680-\ua69d\ua6a0-\ua6ef\ua6f2-\ua6f7\ua722-\ua787\ua789-\ua7ad\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua824\ua827\ua830-\ua837\ua840-\ua873\ua880-\ua8c3\ua8ce-\ua8d9\ua8f2-\ua8fd\ua900-\ua925\ua92e-\ua946\ua952\ua953\ua95f-\ua97c\ua983-\ua9b2\ua9b4\ua9b5\ua9ba\ua9bb\ua9bd-\ua9cd\ua9cf-\ua9d9\ua9de-\ua9e4\ua9e6-\ua9fe\uaa00-\uaa28\uaa2f\uaa30\uaa33\uaa34\uaa40-\uaa42\uaa44-\uaa4b\uaa4d\uaa50-\uaa59\uaa5c-\uaa7b\uaa7d-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaaeb\uaaee-\uaaf5\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab65\uab70-\uabe4\uabe6\uabe7\uabe9-\uabec\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\ue000-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]|\ud800[\udc00-\udc0b]|\ud800[\udc0d-\udc26]|\ud800[\udc28-\udc3a]|\ud800\udc3c|\ud800\udc3d|\ud800[\udc3f-\udc4d]|\ud800[\udc50-\udc5d]|\ud800[\udc80-\udcfa]|\ud800\udd00|\ud800\udd02|\ud800[\udd07-\udd33]|\ud800[\udd37-\udd3f]|\ud800[\uddd0-\uddfc]|\ud800[\ude80-\ude9c]|\ud800[\udea0-\uded0]|\ud800[\udf00-\udf23]|\ud800[\udf30-\udf4a]|\ud800[\udf50-\udf75]|\ud800[\udf80-\udf9d]|\ud800[\udf9f-\udfc3]|\ud800[\udfc8-\udfd5]|\ud801[\udc00-\udc9d]|\ud801[\udca0-\udca9]|\ud801[\udd00-\udd27]|\ud801[\udd30-\udd63]|\ud801\udd6f|\ud801[\ude00-\udf36]|\ud801[\udf40-\udf55]|\ud801[\udf60-\udf67]|\ud804\udc00|\ud804[\udc02-\udc37]|\ud804[\udc47-\udc4d]|\ud804[\udc66-\udc6f]|\ud804[\udc82-\udcb2]|\ud804\udcb7|\ud804\udcb8|\ud804[\udcbb-\udcc1]|\ud804[\udcd0-\udce8]|\ud804[\udcf0-\udcf9]|\ud804[\udd03-\udd26]|\ud804\udd2c|\ud804[\udd36-\udd43]|\ud804[\udd50-\udd72]|\ud804[\udd74-\udd76]|\ud804[\udd82-\uddb5]|\ud804[\uddbf-\uddc9]|\ud804\uddcd|\ud804[\uddd0-\udddf]|\ud804[\udde1-\uddf4]|\ud804[\ude00-\ude11]|\ud804[\ude13-\ude2e]|\ud804\ude32|\ud804\ude33|\ud804\ude35|\ud804[\ude38-\ude3d]|\ud804[\ude80-\ude86]|\ud804\ude88|\ud804[\ude8a-\ude8d]|\ud804[\ude8f-\ude9d]|\ud804[\ude9f-\udea9]|\ud804[\udeb0-\udede]|\ud804[\udee0-\udee2]|\ud804[\udef0-\udef9]|\ud804\udf02|\ud804\udf03|\ud804[\udf05-\udf0c]|\ud804\udf0f|\ud804\udf10|\ud804[\udf13-\udf28]|\ud804[\udf2a-\udf30]|\ud804\udf32|\ud804\udf33|\ud804[\udf35-\udf39]|\ud804[\udf3d-\udf3f]|\ud804[\udf41-\udf44]|\ud804\udf47|\ud804\udf48|\ud804[\udf4b-\udf4d]|\ud804\udf50|\ud804\udf57|\ud804[\udf5d-\udf63]|\ud805[\udc80-\udcb2]|\ud805\udcb9|\ud805[\udcbb-\udcbe]|\ud805\udcc1|\ud805[\udcc4-\udcc7]|\ud805[\udcd0-\udcd9]|\ud805[\udd80-\uddb1]|\ud805[\uddb8-\uddbb]|\ud805\uddbe|\ud805[\uddc1-\udddb]|\ud805[\ude00-\ude32]|\ud805\ude3b|\ud805\ude3c|\ud805\ude3e|\ud805[\ude41-\ude44]|\ud805[\ude50-\ude59]|\ud805[\ude80-\udeaa]|\ud805\udeac|\ud805\udeae|\ud805\udeaf|\ud805\udeb6|\ud805[\udec0-\udec9]|\ud805[\udf00-\udf19]|\ud805\udf20|\ud805\udf21|\ud805\udf26|\ud805[\udf30-\udf3f]|\ud806[\udca0-\udcf2]|\ud806\udcff|\ud806[\udec0-\udef8]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e]|\ud809[\udc70-\udc74]|\ud809[\udc80-\udd43]|\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38]|\ud81a[\ude40-\ude5e]|\ud81a[\ude60-\ude69]|\ud81a\ude6e|\ud81a\ude6f|\ud81a[\uded0-\udeed]|\ud81a\udef5|\ud81a[\udf00-\udf2f]|\ud81a[\udf37-\udf45]|\ud81a[\udf50-\udf59]|\ud81a[\udf5b-\udf61]|\ud81a[\udf63-\udf77]|\ud81a[\udf7d-\udf8f]|\ud81b[\udf00-\udf44]|\ud81b[\udf50-\udf7e]|\ud81b[\udf93-\udf9f]|\ud82c\udc00|\ud82c\udc01|\ud82f[\udc00-\udc6a]|\ud82f[\udc70-\udc7c]|\ud82f[\udc80-\udc88]|\ud82f[\udc90-\udc99]|\ud82f\udc9c|\ud82f\udc9f|\ud834[\udc00-\udcf5]|\ud834[\udd00-\udd26]|\ud834[\udd29-\udd66]|\ud834[\udd6a-\udd72]|\ud834\udd83|\ud834\udd84|\ud834[\udd8c-\udda9]|\ud834[\uddae-\udde8]|\ud834[\udf60-\udf71]|\ud835[\udc00-\udc54]|\ud835[\udc56-\udc9c]|\ud835\udc9e|\ud835\udc9f|\ud835\udca2|\ud835\udca5|\ud835\udca6|\ud835[\udca9-\udcac]|\ud835[\udcae-\udcb9]|\ud835\udcbb|\ud835[\udcbd-\udcc3]|\ud835[\udcc5-\udd05]|\ud835[\udd07-\udd0a]|\ud835[\udd0d-\udd14]|\ud835[\udd16-\udd1c]|\ud835[\udd1e-\udd39]|\ud835[\udd3b-\udd3e]|\ud835[\udd40-\udd44]|\ud835\udd46|\ud835[\udd4a-\udd50]|\ud835[\udd52-\udea5]|\ud835[\udea8-\udeda]|\ud835[\udedc-\udf14]|\ud835[\udf16-\udf4e]|\ud835[\udf50-\udf88]|\ud835[\udf8a-\udfc2]|\ud835[\udfc4-\udfcb]|\ud836[\udc00-\uddff]|\ud836[\ude37-\ude3a]|\ud836[\ude6d-\ude74]|\ud836[\ude76-\ude83]|\ud836[\ude85-\ude8b]|\ud83c[\udd10-\udd2e]|\ud83c[\udd30-\udd69]|\ud83c[\udd70-\udd9a]|\ud83c[\udde6-\ude02]|\ud83c[\ude10-\ude3a]|\ud83c[\ude40-\ude48]|\ud83c\ude50|\ud83c\ude51|[\ud840-\ud868][\udc00-\udfff]|\ud869[\udc00-\uded6]|\ud869[\udf00-\udfff]|[\ud86a-\ud86c][\udc00-\udfff]|\ud86d[\udc00-\udf34]|\ud86d[\udf40-\udfff]|\ud86e[\udc00-\udc1d]|\ud86e[\udc20-\udfff]|[\ud86f-\ud872][\udc00-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]|[\udb80-\udbbe][\udc00-\udfff]|\udbbf[\udc00-\udffd]|[\udbc0-\udbfe][\udc00-\udfff]|\udbff[\udc00-\udffd]' +
+                       ')|(' +
+                               '[\u0590\u05be\u05c0\u05c3\u05c6\u05c8-\u05ff\u07c0-\u07ea\u07f4\u07f5\u07fa-\u0815\u081a\u0824\u0828\u082e-\u0858\u085c-\u089f\u200f\ufb1d\ufb1f-\ufb28\ufb2a-\ufb4f\u0608\u060b\u060d\u061b-\u064a\u066d-\u066f\u0671-\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u0710\u0712-\u072f\u074b-\u07a5\u07b1-\u07bf\u08a0-\u08e2\ufb50-\ufd3d\ufd40-\ufdcf\ufdf0-\ufdfc\ufdfe\ufdff\ufe70-\ufefe]|\ud802[\udc00-\udd1e]|\ud802[\udd20-\ude00]|\ud802\ude04|\ud802[\ude07-\ude0b]|\ud802[\ude10-\ude37]|\ud802[\ude3b-\ude3e]|\ud802[\ude40-\udee4]|\ud802[\udee7-\udf38]|\ud802[\udf40-\udfff]|\ud803[\udc00-\ude5f]|\ud803[\ude7f-\udfff]|\ud83a[\udc00-\udccf]|\ud83a[\udcd7-\udfff]|\ud83b[\udc00-\uddff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\ude00-\udeef]|\ud83b[\udef2-\udeff]' +
+                       ')' +
+               ')'
+       );
+
+       /**
+        * Gets directionality of the first strongly directional codepoint
+        *
+        * This is the rule the BIDI algorithm uses to determine the directionality of
+        * paragraphs ( http://unicode.org/reports/tr9/#The_Paragraph_Level ) and
+        * FSI isolates ( http://unicode.org/reports/tr9/#Explicit_Directional_Isolates ).
+        *
+        * TODO: Does not handle BIDI control characters inside the text.
+        * TODO: Does not handle unallocated characters.
+        */
+       function strongDirFromContent( text ) {
+               var m = text.match( strongDirRegExp );
+               if ( !m ) {
+                       return null;
+               }
+               if ( m[2] === undefined ) {
+                       return 'ltr';
+               }
+               return 'rtl';
+       }
+
+       $.extend( $.i18n.parser.emitter, {
+               /**
+                * Wraps argument with unicode control characters for directionality safety
+                *
+                * This solves the problem where directionality-neutral characters at the edge of
+                * the argument string get interpreted with the wrong directionality from the
+                * enclosing context, giving renderings that look corrupted like "(Ben_(WMF".
+                *
+                * The wrapping is LRE...PDF or RLE...PDF, depending on the detected
+                * directionality of the argument string, using the BIDI algorithm's own "First
+                * strong directional codepoint" rule. Essentially, this works round the fact that
+                * there is no embedding equivalent of U+2068 FSI (isolation with heuristic
+                * direction inference). The latter is cleaner but still not widely supported.
+                */
+               bidi: function ( nodes ) {
+                       var dir = strongDirFromContent( nodes[0] );
+                       if ( dir === 'ltr' ) {
+                               // Wrap in LEFT-TO-RIGHT EMBEDDING ... POP DIRECTIONAL FORMATTING
+                               return '\u202A' + nodes[0] + '\u202C';
+                       }
+                       if ( dir === 'rtl' ) {
+                               // Wrap in RIGHT-TO-LEFT EMBEDDING ... POP DIRECTIONAL FORMATTING
+                               return '\u202B' + nodes[0] + '\u202C';
+                       }
+                       // No strong directionality: do not wrap
+                       return nodes[0];
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/jquery.i18n.emitter.js b/resources/lib/jquery.i18n/src/jquery.i18n.emitter.js
new file mode 100644 (file)
index 0000000..b26f147
--- /dev/null
@@ -0,0 +1,168 @@
+/**
+ * jQuery Internationalization library
+ *
+ * Copyright (C) 2011-2013 Santhosh Thottingal, Neil Kandalgaonkar
+ *
+ * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do
+ * anything special to choose one license or the other and you don't have to
+ * notify anyone which license you are using. You are free to use
+ * UniversalLanguageSelector in commercial projects as long as the copyright
+ * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @licence GNU General Public Licence 2.0 or later
+ * @licence MIT License
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       var MessageParserEmitter = function () {
+               this.language = $.i18n.languages[String.locale] || $.i18n.languages['default'];
+       };
+
+       MessageParserEmitter.prototype = {
+               constructor: MessageParserEmitter,
+
+               /**
+                * (We put this method definition here, and not in prototype, to make
+                * sure it's not overwritten by any magic.) Walk entire node structure,
+                * applying replacements and template functions when appropriate
+                *
+                * @param {Mixed} node abstract syntax tree (top node or subnode)
+                * @param {Array} replacements for $1, $2, ... $n
+                * @return {Mixed} single-string node or array of nodes suitable for
+                *  jQuery appending.
+                */
+               emit: function ( node, replacements ) {
+                       var ret, subnodes, operation,
+                               messageParserEmitter = this;
+
+                       switch ( typeof node ) {
+                       case 'string':
+                       case 'number':
+                               ret = node;
+                               break;
+                       case 'object':
+                               // node is an array of nodes
+                               subnodes = $.map( node.slice( 1 ), function ( n ) {
+                                       return messageParserEmitter.emit( n, replacements );
+                               } );
+
+                               operation = node[0].toLowerCase();
+
+                               if ( typeof messageParserEmitter[operation] === 'function' ) {
+                                       ret = messageParserEmitter[operation]( subnodes, replacements );
+                               } else {
+                                       throw new Error( 'unknown operation "' + operation + '"' );
+                               }
+
+                               break;
+                       case 'undefined':
+                               // Parsing the empty string (as an entire expression, or as a
+                               // paramExpression in a template) results in undefined
+                               // Perhaps a more clever parser can detect this, and return the
+                               // empty string? Or is that useful information?
+                               // The logical thing is probably to return the empty string here
+                               // when we encounter undefined.
+                               ret = '';
+                               break;
+                       default:
+                               throw new Error( 'unexpected type in AST: ' + typeof node );
+                       }
+
+                       return ret;
+               },
+
+               /**
+                * Parsing has been applied depth-first we can assume that all nodes
+                * here are single nodes Must return a single node to parents -- a
+                * jQuery with synthetic span However, unwrap any other synthetic spans
+                * in our children and pass them upwards
+                *
+                * @param {Array} nodes Mixed, some single nodes, some arrays of nodes.
+                * @return String
+                */
+               concat: function ( nodes ) {
+                       var result = '';
+
+                       $.each( nodes, function ( i, node ) {
+                               // strings, integers, anything else
+                               result += node;
+                       } );
+
+                       return result;
+               },
+
+               /**
+                * Return escaped replacement of correct index, or string if
+                * unavailable. Note that we expect the parsed parameter to be
+                * zero-based. i.e. $1 should have become [ 0 ]. if the specified
+                * parameter is not found return the same string (e.g. "$99" ->
+                * parameter 98 -> not found -> return "$99" ) TODO throw error if
+                * nodes.length > 1 ?
+                *
+                * @param {Array} nodes One element, integer, n >= 0
+                * @param {Array} replacements for $1, $2, ... $n
+                * @return {string} replacement
+                */
+               replace: function ( nodes, replacements ) {
+                       var index = parseInt( nodes[0], 10 );
+
+                       if ( index < replacements.length ) {
+                               // replacement is not a string, don't touch!
+                               return replacements[index];
+                       } else {
+                               // index not found, fallback to displaying variable
+                               return '$' + ( index + 1 );
+                       }
+               },
+
+               /**
+                * 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} nodes List [ {String|Number}, {String}, {String} ... ]
+                * @return {String} selected pluralized form according to current
+                *  language.
+                */
+               plural: function ( nodes ) {
+                       var count = parseFloat( this.language.convertNumber( nodes[0], 10 ) ),
+                               forms = nodes.slice( 1 );
+
+                       return forms.length ? this.language.convertPlural( count, forms ) : '';
+               },
+
+               /**
+                * Transform parsed structure into gender Usage
+                * {{gender:gender|masculine|feminine|neutral}}.
+                *
+                * @param {Array} nodes List [ {String}, {String}, {String} , {String} ]
+                * @return {String} selected gender form according to current language
+                */
+               gender: function ( nodes ) {
+                       var gender = nodes[0],
+                               forms = nodes.slice( 1 );
+
+                       return this.language.gender( gender, forms );
+               },
+
+               /**
+                * Transform parsed structure into grammar conversion. Invoked by
+                * putting {{grammar:form|word}} in a message
+                *
+                * @param {Array} nodes List [{Grammar case eg: genitive}, {String word}]
+                * @return {String} selected grammatical form according to current
+                *  language.
+                */
+               grammar: function ( nodes ) {
+                       var form = nodes[0],
+                               word = nodes[1];
+
+                       return word && form && this.language.convertGrammar( word, form );
+               }
+       };
+
+       $.extend( $.i18n.parser.emitter, new MessageParserEmitter() );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/jquery.i18n.fallbacks.js b/resources/lib/jquery.i18n/src/jquery.i18n.fallbacks.js
new file mode 100644 (file)
index 0000000..4584c5f
--- /dev/null
@@ -0,0 +1,186 @@
+/**
+ * jQuery Internationalization library
+ *
+ * Copyright (C) 2012 Santhosh Thottingal
+ *
+ * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do anything special to
+ * choose one license or the other and you don't have to notify anyone which license you are using.
+ * You are free to use UniversalLanguageSelector in commercial projects as long as the copyright
+ * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @licence GNU General Public Licence 2.0 or later
+ * @licence MIT License
+ */
+( function ( $, undefined ) {
+       'use strict';
+
+       $.i18n = $.i18n || {};
+       $.extend( $.i18n.fallbacks, {
+               ab: [ 'ru' ],
+               ace: [ 'id' ],
+               aln: [ 'sq' ],
+               // Not so standard - als is supposed to be Tosk Albanian,
+               // but in Wikipedia it's used for a Germanic language.
+               als: [ 'gsw', 'de' ],
+               an: [ 'es' ],
+               anp: [ 'hi' ],
+               arn: [ 'es' ],
+               arz: [ 'ar' ],
+               av: [ 'ru' ],
+               ay: [ 'es' ],
+               ba: [ 'ru' ],
+               bar: [ 'de' ],
+               'bat-smg': [ 'sgs', 'lt' ],
+               bcc: [ 'fa' ],
+               'be-x-old': [ 'be-tarask' ],
+               bh: [ 'bho' ],
+               bjn: [ 'id' ],
+               bm: [ 'fr' ],
+               bpy: [ 'bn' ],
+               bqi: [ 'fa' ],
+               bug: [ 'id' ],
+               'cbk-zam': [ 'es' ],
+               ce: [ 'ru' ],
+               crh: [ 'crh-latn' ],
+               'crh-cyrl': [ 'ru' ],
+               csb: [ 'pl' ],
+               cv: [ 'ru' ],
+               'de-at': [ 'de' ],
+               'de-ch': [ 'de' ],
+               'de-formal': [ 'de' ],
+               dsb: [ 'de' ],
+               dtp: [ 'ms' ],
+               egl: [ 'it' ],
+               eml: [ 'it' ],
+               ff: [ 'fr' ],
+               fit: [ 'fi' ],
+               'fiu-vro': [ 'vro', 'et' ],
+               frc: [ 'fr' ],
+               frp: [ 'fr' ],
+               frr: [ 'de' ],
+               fur: [ 'it' ],
+               gag: [ 'tr' ],
+               gan: [ 'gan-hant', 'zh-hant', 'zh-hans' ],
+               'gan-hans': [ 'zh-hans' ],
+               'gan-hant': [ 'zh-hant', 'zh-hans' ],
+               gl: [ 'pt' ],
+               glk: [ 'fa' ],
+               gn: [ 'es' ],
+               gsw: [ 'de' ],
+               hif: [ 'hif-latn' ],
+               hsb: [ 'de' ],
+               ht: [ 'fr' ],
+               ii: [ 'zh-cn', 'zh-hans' ],
+               inh: [ 'ru' ],
+               iu: [ 'ike-cans' ],
+               jut: [ 'da' ],
+               jv: [ 'id' ],
+               kaa: [ 'kk-latn', 'kk-cyrl' ],
+               kbd: [ 'kbd-cyrl' ],
+               khw: [ 'ur' ],
+               kiu: [ 'tr' ],
+               kk: [ 'kk-cyrl' ],
+               'kk-arab': [ 'kk-cyrl' ],
+               'kk-latn': [ 'kk-cyrl' ],
+               'kk-cn': [ 'kk-arab', 'kk-cyrl' ],
+               'kk-kz': [ 'kk-cyrl' ],
+               'kk-tr': [ 'kk-latn', 'kk-cyrl' ],
+               kl: [ 'da' ],
+               'ko-kp': [ 'ko' ],
+               koi: [ 'ru' ],
+               krc: [ 'ru' ],
+               ks: [ 'ks-arab' ],
+               ksh: [ 'de' ],
+               ku: [ 'ku-latn' ],
+               'ku-arab': [ 'ckb' ],
+               kv: [ 'ru' ],
+               lad: [ 'es' ],
+               lb: [ 'de' ],
+               lbe: [ 'ru' ],
+               lez: [ 'ru' ],
+               li: [ 'nl' ],
+               lij: [ 'it' ],
+               liv: [ 'et' ],
+               lmo: [ 'it' ],
+               ln: [ 'fr' ],
+               ltg: [ 'lv' ],
+               lzz: [ 'tr' ],
+               mai: [ 'hi' ],
+               'map-bms': [ 'jv', 'id' ],
+               mg: [ 'fr' ],
+               mhr: [ 'ru' ],
+               min: [ 'id' ],
+               mo: [ 'ro' ],
+               mrj: [ 'ru' ],
+               mwl: [ 'pt' ],
+               myv: [ 'ru' ],
+               mzn: [ 'fa' ],
+               nah: [ 'es' ],
+               nap: [ 'it' ],
+               nds: [ 'de' ],
+               'nds-nl': [ 'nl' ],
+               'nl-informal': [ 'nl' ],
+               no: [ 'nb' ],
+               os: [ 'ru' ],
+               pcd: [ 'fr' ],
+               pdc: [ 'de' ],
+               pdt: [ 'de' ],
+               pfl: [ 'de' ],
+               pms: [ 'it' ],
+               pt: [ 'pt-br' ],
+               'pt-br': [ 'pt' ],
+               qu: [ 'es' ],
+               qug: [ 'qu', 'es' ],
+               rgn: [ 'it' ],
+               rmy: [ 'ro' ],
+               'roa-rup': [ 'rup' ],
+               rue: [ 'uk', 'ru' ],
+               ruq: [ 'ruq-latn', 'ro' ],
+               'ruq-cyrl': [ 'mk' ],
+               'ruq-latn': [ 'ro' ],
+               sa: [ 'hi' ],
+               sah: [ 'ru' ],
+               scn: [ 'it' ],
+               sg: [ 'fr' ],
+               sgs: [ 'lt' ],
+               sli: [ 'de' ],
+               sr: [ 'sr-ec' ],
+               srn: [ 'nl' ],
+               stq: [ 'de' ],
+               su: [ 'id' ],
+               szl: [ 'pl' ],
+               tcy: [ 'kn' ],
+               tg: [ 'tg-cyrl' ],
+               tt: [ 'tt-cyrl', 'ru' ],
+               'tt-cyrl': [ 'ru' ],
+               ty: [ 'fr' ],
+               udm: [ 'ru' ],
+               ug: [ 'ug-arab' ],
+               uk: [ 'ru' ],
+               vec: [ 'it' ],
+               vep: [ 'et' ],
+               vls: [ 'nl' ],
+               vmf: [ 'de' ],
+               vot: [ 'fi' ],
+               vro: [ 'et' ],
+               wa: [ 'fr' ],
+               wo: [ 'fr' ],
+               wuu: [ 'zh-hans' ],
+               xal: [ 'ru' ],
+               xmf: [ 'ka' ],
+               yi: [ 'he' ],
+               za: [ 'zh-hans' ],
+               zea: [ 'nl' ],
+               zh: [ 'zh-hans' ],
+               'zh-classical': [ 'lzh' ],
+               'zh-cn': [ 'zh-hans' ],
+               'zh-hant': [ 'zh-hans' ],
+               'zh-hk': [ 'zh-hant', 'zh-hans' ],
+               'zh-min-nan': [ 'nan' ],
+               'zh-mo': [ 'zh-hk', 'zh-hant', 'zh-hans' ],
+               'zh-my': [ 'zh-sg', 'zh-hans' ],
+               'zh-sg': [ 'zh-hans' ],
+               'zh-tw': [ 'zh-hant', 'zh-hans' ],
+               'zh-yue': [ 'yue' ]
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/jquery.i18n.js b/resources/lib/jquery.i18n/src/jquery.i18n.js
new file mode 100644 (file)
index 0000000..9236e4e
--- /dev/null
@@ -0,0 +1,287 @@
+/**
+ * jQuery Internationalization library
+ *
+ * Copyright (C) 2012 Santhosh Thottingal
+ *
+ * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do
+ * anything special to choose one license or the other and you don't have to
+ * notify anyone which license you are using. You are free to use
+ * UniversalLanguageSelector in commercial projects as long as the copyright
+ * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @licence GNU General Public Licence 2.0 or later
+ * @licence MIT License
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       var nav, I18N,
+               slice = Array.prototype.slice;
+       /**
+        * @constructor
+        * @param {Object} options
+        */
+       I18N = function ( options ) {
+               // Load defaults
+               this.options = $.extend( {}, I18N.defaults, options );
+
+               this.parser = this.options.parser;
+               this.locale = this.options.locale;
+               this.messageStore = this.options.messageStore;
+               this.languages = {};
+
+               this.init();
+       };
+
+       I18N.prototype = {
+               /**
+                * Initialize by loading locales and setting up
+                * String.prototype.toLocaleString and String.locale.
+                */
+               init: function () {
+                       var i18n = this;
+
+                       // Set locale of String environment
+                       String.locale = i18n.locale;
+
+                       // Override String.localeString method
+                       String.prototype.toLocaleString = function () {
+                               var localeParts, localePartIndex, value, locale, fallbackIndex,
+                                       tryingLocale, message;
+
+                               value = this.valueOf();
+                               locale = i18n.locale;
+                               fallbackIndex = 0;
+
+                               while ( locale ) {
+                                       // Iterate through locales starting at most-specific until
+                                       // localization is found. As in fi-Latn-FI, fi-Latn and fi.
+                                       localeParts = locale.split( '-' );
+                                       localePartIndex = localeParts.length;
+
+                                       do {
+                                               tryingLocale = localeParts.slice( 0, localePartIndex ).join( '-' );
+                                               message = i18n.messageStore.get( tryingLocale, value );
+
+                                               if ( message ) {
+                                                       return message;
+                                               }
+
+                                               localePartIndex--;
+                                       } while ( localePartIndex );
+
+                                       if ( locale === 'en' ) {
+                                               break;
+                                       }
+
+                                       locale = ( $.i18n.fallbacks[i18n.locale] && $.i18n.fallbacks[i18n.locale][fallbackIndex] ) ||
+                                               i18n.options.fallbackLocale;
+                                       $.i18n.log( 'Trying fallback locale for ' + i18n.locale + ': ' + locale );
+
+                                       fallbackIndex++;
+                               }
+
+                               // key not found
+                               return '';
+                       };
+               },
+
+               /*
+                * Destroy the i18n instance.
+                */
+               destroy: function () {
+                       $.removeData( document, 'i18n' );
+               },
+
+               /**
+                * General message loading API This can take a URL string for
+                * the json formatted messages. Example:
+                * <code>load('path/to/all_localizations.json');</code>
+                *
+                * To load a localization file for a locale:
+                * <code>
+                * load('path/to/de-messages.json', 'de' );
+                * </code>
+                *
+                * To load a localization file from a directory:
+                * <code>
+                * load('path/to/i18n/directory', 'de' );
+                * </code>
+                * The above method has the advantage of fallback resolution.
+                * ie, it will automatically load the fallback locales for de.
+                * For most usecases, this is the recommended method.
+                * It is optional to have trailing slash at end.
+                *
+                * A data object containing message key- message translation mappings
+                * can also be passed. Example:
+                * <code>
+                * load( { 'hello' : 'Hello' }, optionalLocale );
+                * </code>
+                *
+                * A source map containing key-value pair of languagename and locations
+                * can also be passed. Example:
+                * <code>
+                * load( {
+                * bn: 'i18n/bn.json',
+                * he: 'i18n/he.json',
+                * en: 'i18n/en.json'
+                * } )
+                * </code>
+                *
+                * If the data argument is null/undefined/false,
+                * all cached messages for the i18n instance will get reset.
+                *
+                * @param {String|Object} source
+                * @param {String} locale Language tag
+                * @returns {jQuery.Promise}
+                */
+               load: function ( source, locale ) {
+                       var fallbackLocales, locIndex, fallbackLocale, sourceMap = {};
+                       if ( !source && !locale ) {
+                               source = 'i18n/' + $.i18n().locale + '.json';
+                               locale = $.i18n().locale;
+                       }
+                       if ( typeof source === 'string' &&
+                               source.split( '.' ).pop() !== 'json'
+                       ) {
+                               // Load specified locale then check for fallbacks when directory is specified in load()
+                               sourceMap[locale] = source + '/' + locale + '.json';
+                               fallbackLocales = ( $.i18n.fallbacks[locale] || [] )
+                                       .concat( this.options.fallbackLocale );
+                               for ( locIndex in fallbackLocales ) {
+                                       fallbackLocale = fallbackLocales[locIndex];
+                                       sourceMap[fallbackLocale] = source + '/' + fallbackLocale + '.json';
+                               }
+                               return this.load( sourceMap );
+                       } else {
+                               return this.messageStore.load( source, locale );
+                       }
+
+               },
+
+               /**
+                * Does parameter and magic word substitution.
+                *
+                * @param {string} key Message key
+                * @param {Array} parameters Message parameters
+                * @return {string}
+                */
+               parse: function ( key, parameters ) {
+                       var message = key.toLocaleString();
+                       // FIXME: This changes the state of the I18N object,
+                       // should probably not change the 'this.parser' but just
+                       // pass it to the parser.
+                       this.parser.language = $.i18n.languages[$.i18n().locale] || $.i18n.languages['default'];
+                       if ( message === '' ) {
+                               message = key;
+                       }
+                       return this.parser.parse( message, parameters );
+               }
+       };
+
+       /**
+        * Process a message from the $.I18N instance
+        * for the current document, stored in jQuery.data(document).
+        *
+        * @param {string} key Key of the message.
+        * @param {string} param1 [param...] Variadic list of parameters for {key}.
+        * @return {string|$.I18N} Parsed message, or if no key was given
+        * the instance of $.I18N is returned.
+        */
+       $.i18n = function ( key, param1 ) {
+               var parameters,
+                       i18n = $.data( document, 'i18n' ),
+                       options = typeof key === 'object' && key;
+
+               // If the locale option for this call is different then the setup so far,
+               // update it automatically. This doesn't just change the context for this
+               // call but for all future call as well.
+               // If there is no i18n setup yet, don't do this. It will be taken care of
+               // by the `new I18N` construction below.
+               // NOTE: It should only change language for this one call.
+               // Then cache instances of I18N somewhere.
+               if ( options && options.locale && i18n && i18n.locale !== options.locale ) {
+                       String.locale = i18n.locale = options.locale;
+               }
+
+               if ( !i18n ) {
+                       i18n = new I18N( options );
+                       $.data( document, 'i18n', i18n );
+               }
+
+               if ( typeof key === 'string' ) {
+                       if ( param1 !== undefined ) {
+                               parameters = slice.call( arguments, 1 );
+                       } else {
+                               parameters = [];
+                       }
+
+                       return i18n.parse( key, parameters );
+               } else {
+                       // FIXME: remove this feature/bug.
+                       return i18n;
+               }
+       };
+
+       $.fn.i18n = function () {
+               var i18n = $.data( document, 'i18n' );
+
+               if ( !i18n ) {
+                       i18n = new I18N();
+                       $.data( document, 'i18n', i18n );
+               }
+               String.locale = i18n.locale;
+               return this.each( function () {
+                       var $this = $( this ),
+                               messageKey = $this.data( 'i18n' );
+
+                       if ( messageKey ) {
+                               $this.text( i18n.parse( messageKey ) );
+                       } else {
+                               $this.find( '[data-i18n]' ).i18n();
+                       }
+               } );
+       };
+
+       String.locale = String.locale || $( 'html' ).attr( 'lang' );
+
+       if ( !String.locale ) {
+               if ( typeof window.navigator !== undefined ) {
+                       nav = window.navigator;
+                       String.locale = nav.language || nav.userLanguage || '';
+               } else {
+                       String.locale = '';
+               }
+       }
+
+       $.i18n.languages = {};
+       $.i18n.messageStore = $.i18n.messageStore || {};
+       $.i18n.parser = {
+               // The default parser only handles variable substitution
+               parse: function ( message, parameters ) {
+                       return message.replace( /\$(\d+)/g, function ( str, match ) {
+                               var index = parseInt( match, 10 ) - 1;
+                               return parameters[index] !== undefined ? parameters[index] : '$' + match;
+                       } );
+               },
+               emitter: {}
+       };
+       $.i18n.fallbacks = {};
+       $.i18n.debug = false;
+       $.i18n.log = function ( /* arguments */ ) {
+               if ( window.console && $.i18n.debug ) {
+                       window.console.log.apply( window.console, arguments );
+               }
+       };
+       /* Static members */
+       I18N.defaults = {
+               locale: String.locale,
+               fallbackLocale: 'en',
+               parser: $.i18n.parser,
+               messageStore: $.i18n.messageStore
+       };
+
+       // Expose constructor
+       $.i18n.constructor = I18N;
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/jquery.i18n.language.js b/resources/lib/jquery.i18n/src/jquery.i18n.language.js
new file mode 100644 (file)
index 0000000..3ce0a99
--- /dev/null
@@ -0,0 +1,472 @@
+/*global pluralRuleParser */
+( function ( $ ) {
+       'use strict';
+
+       var language = {
+               // CLDR plural rules generated using
+               // libs/CLDRPluralRuleParser/tools/PluralXML2JSON.html
+               pluralRules: {
+                       ak: {
+                               one: 'n = 0..1'
+                       },
+                       am: {
+                               one: 'i = 0 or n = 1'
+                       },
+                       ar: {
+                               zero: 'n = 0',
+                               one: 'n = 1',
+                               two: 'n = 2',
+                               few: 'n % 100 = 3..10',
+                               many: 'n % 100 = 11..99'
+                       },
+                       be: {
+                               one: 'n % 10 = 1 and n % 100 != 11',
+                               few: 'n % 10 = 2..4 and n % 100 != 12..14',
+                               many: 'n % 10 = 0 or n % 10 = 5..9 or n % 100 = 11..14'
+                       },
+                       bh: {
+                               one: 'n = 0..1'
+                       },
+                       bn: {
+                               one: 'i = 0 or n = 1'
+                       },
+                       br: {
+                               one: 'n % 10 = 1 and n % 100 != 11,71,91',
+                               two: 'n % 10 = 2 and n % 100 != 12,72,92',
+                               few: 'n % 10 = 3..4,9 and n % 100 != 10..19,70..79,90..99',
+                               many: 'n != 0 and n % 1000000 = 0'
+                       },
+                       bs: {
+                               one: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',
+                               few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'
+                       },
+                       cs: {
+                               one: 'i = 1 and v = 0',
+                               few: 'i = 2..4 and v = 0',
+                               many: 'v != 0'
+                       },
+                       cy: {
+                               zero: 'n = 0',
+                               one: 'n = 1',
+                               two: 'n = 2',
+                               few: 'n = 3',
+                               many: 'n = 6'
+                       },
+                       da: {
+                               one: 'n = 1 or t != 0 and i = 0,1'
+                       },
+                       fa: {
+                               one: 'i = 0 or n = 1'
+                       },
+                       ff: {
+                               one: 'i = 0,1'
+                       },
+                       fil: {
+                               one: 'i = 0..1 and v = 0'
+                       },
+                       fr: {
+                               one: 'i = 0,1'
+                       },
+                       ga: {
+                               one: 'n = 1',
+                               two: 'n = 2',
+                               few: 'n = 3..6',
+                               many: 'n = 7..10'
+                       },
+                       gd: {
+                               one: 'n = 1,11',
+                               two: 'n = 2,12',
+                               few: 'n = 3..10,13..19'
+                       },
+                       gu: {
+                               one: 'i = 0 or n = 1'
+                       },
+                       guw: {
+                               one: 'n = 0..1'
+                       },
+                       gv: {
+                               one: 'n % 10 = 1',
+                               two: 'n % 10 = 2',
+                               few: 'n % 100 = 0,20,40,60'
+                       },
+                       he: {
+                               one: 'i = 1 and v = 0',
+                               two: 'i = 2 and v = 0',
+                               many: 'v = 0 and n != 0..10 and n % 10 = 0'
+                       },
+                       hi: {
+                               one: 'i = 0 or n = 1'
+                       },
+                       hr: {
+                               one: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',
+                               few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'
+                       },
+                       hy: {
+                               one: 'i = 0,1'
+                       },
+                       is: {
+                               one: 't = 0 and i % 10 = 1 and i % 100 != 11 or t != 0'
+                       },
+                       iu: {
+                               one: 'n = 1',
+                               two: 'n = 2'
+                       },
+                       iw: {
+                               one: 'i = 1 and v = 0',
+                               two: 'i = 2 and v = 0',
+                               many: 'v = 0 and n != 0..10 and n % 10 = 0'
+                       },
+                       kab: {
+                               one: 'i = 0,1'
+                       },
+                       kn: {
+                               one: 'i = 0 or n = 1'
+                       },
+                       kw: {
+                               one: 'n = 1',
+                               two: 'n = 2'
+                       },
+                       lag: {
+                               zero: 'n = 0',
+                               one: 'i = 0,1 and n != 0'
+                       },
+                       ln: {
+                               one: 'n = 0..1'
+                       },
+                       lt: {
+                               one: 'n % 10 = 1 and n % 100 != 11..19',
+                               few: 'n % 10 = 2..9 and n % 100 != 11..19',
+                               many: 'f != 0'
+                       },
+                       lv: {
+                               zero: 'n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19',
+                               one: 'n % 10 = 1 and n % 100 != 11 or v = 2 and f % 10 = 1 and f % 100 != 11 or v != 2 and f % 10 = 1'
+                       },
+                       mg: {
+                               one: 'n = 0..1'
+                       },
+                       mk: {
+                               one: 'v = 0 and i % 10 = 1 or f % 10 = 1'
+                       },
+                       mo: {
+                               one: 'i = 1 and v = 0',
+                               few: 'v != 0 or n = 0 or n != 1 and n % 100 = 1..19'
+                       },
+                       mr: {
+                               one: 'i = 0 or n = 1'
+                       },
+                       mt: {
+                               one: 'n = 1',
+                               few: 'n = 0 or n % 100 = 2..10',
+                               many: 'n % 100 = 11..19'
+                       },
+                       naq: {
+                               one: 'n = 1',
+                               two: 'n = 2'
+                       },
+                       nso: {
+                               one: 'n = 0..1'
+                       },
+                       pa: {
+                               one: 'n = 0..1'
+                       },
+                       pl: {
+                               one: 'i = 1 and v = 0',
+                               few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14',
+                               many: 'v = 0 and i != 1 and i % 10 = 0..1 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 12..14'
+                       },
+                       pt: {
+                               one: 'i = 1 and v = 0 or i = 0 and t = 1'
+                       },
+                       // jscs:disable requireCamelCaseOrUpperCaseIdentifiers
+                       pt_PT: {
+                               one: 'n = 1 and v = 0'
+                       },
+                       // jscs:enable requireCamelCaseOrUpperCaseIdentifiers
+                       ro: {
+                               one: 'i = 1 and v = 0',
+                               few: 'v != 0 or n = 0 or n != 1 and n % 100 = 1..19'
+                       },
+                       ru: {
+                               one: 'v = 0 and i % 10 = 1 and i % 100 != 11',
+                               many: 'v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14'
+                       },
+                       se: {
+                               one: 'n = 1',
+                               two: 'n = 2'
+                       },
+                       sh: {
+                               one: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',
+                               few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'
+                       },
+                       shi: {
+                               one: 'i = 0 or n = 1',
+                               few: 'n = 2..10'
+                       },
+                       si: {
+                               one: 'n = 0,1 or i = 0 and f = 1'
+                       },
+                       sk: {
+                               one: 'i = 1 and v = 0',
+                               few: 'i = 2..4 and v = 0',
+                               many: 'v != 0'
+                       },
+                       sl: {
+                               one: 'v = 0 and i % 100 = 1',
+                               two: 'v = 0 and i % 100 = 2',
+                               few: 'v = 0 and i % 100 = 3..4 or v != 0'
+                       },
+                       sma: {
+                               one: 'n = 1',
+                               two: 'n = 2'
+                       },
+                       smi: {
+                               one: 'n = 1',
+                               two: 'n = 2'
+                       },
+                       smj: {
+                               one: 'n = 1',
+                               two: 'n = 2'
+                       },
+                       smn: {
+                               one: 'n = 1',
+                               two: 'n = 2'
+                       },
+                       sms: {
+                               one: 'n = 1',
+                               two: 'n = 2'
+                       },
+                       sr: {
+                               one: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',
+                               few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'
+                       },
+                       ti: {
+                               one: 'n = 0..1'
+                       },
+                       tl: {
+                               one: 'i = 0..1 and v = 0'
+                       },
+                       tzm: {
+                               one: 'n = 0..1 or n = 11..99'
+                       },
+                       uk: {
+                               one: 'v = 0 and i % 10 = 1 and i % 100 != 11',
+                               few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14',
+                               many: 'v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14'
+                       },
+                       wa: {
+                               one: 'n = 0..1'
+                       },
+                       zu: {
+                               one: 'i = 0 or n = 1'
+                       }
+               },
+
+               /**
+                * Plural form transformations, needed for some languages.
+                *
+                * @param count
+                *            integer Non-localized quantifier
+                * @param forms
+                *            array List of plural forms
+                * @return string Correct form for quantifier in this language
+                */
+               convertPlural: function ( count, forms ) {
+                       var pluralRules,
+                               pluralFormIndex,
+                               index,
+                               explicitPluralPattern = new RegExp( '\\d+=', 'i' ),
+                               formCount,
+                               form;
+
+                       if ( !forms || forms.length === 0 ) {
+                               return '';
+                       }
+
+                       // Handle for Explicit 0= & 1= values
+                       for ( index = 0; index < forms.length; index++ ) {
+                               form = forms[index];
+                               if ( explicitPluralPattern.test( form ) ) {
+                                       formCount = parseInt( form.substring( 0, form.indexOf( '=' ) ), 10 );
+                                       if ( formCount === count ) {
+                                               return ( form.substr( form.indexOf( '=' ) + 1 ) );
+                                       }
+                                       forms[index] = undefined;
+                               }
+                       }
+
+                       forms = $.map( forms, function ( form ) {
+                               if ( form !== undefined ) {
+                                       return form;
+                               }
+                       } );
+
+                       pluralRules = this.pluralRules[$.i18n().locale];
+
+                       if ( !pluralRules ) {
+                               // default fallback.
+                               return ( count === 1 ) ? forms[0] : forms[1];
+                       }
+
+                       pluralFormIndex = this.getPluralForm( count, pluralRules );
+                       pluralFormIndex = Math.min( pluralFormIndex, forms.length - 1 );
+
+                       return forms[pluralFormIndex];
+               },
+
+               /**
+                * For the number, get the plural for index
+                *
+                * @param number
+                * @param pluralRules
+                * @return plural form index
+                */
+               getPluralForm: function ( number, pluralRules ) {
+                       var i,
+                               pluralForms = [ 'zero', 'one', 'two', 'few', 'many', 'other' ],
+                               pluralFormIndex = 0;
+
+                       for ( i = 0; i < pluralForms.length; i++ ) {
+                               if ( pluralRules[pluralForms[i]] ) {
+                                       if ( pluralRuleParser( pluralRules[pluralForms[i]], number ) ) {
+                                               return pluralFormIndex;
+                                       }
+
+                                       pluralFormIndex++;
+                               }
+                       }
+
+                       return pluralFormIndex;
+               },
+
+               /**
+                * Converts a number using digitTransformTable.
+                *
+                * @param {number} num Value to be converted
+                * @param {boolean} integer Convert the return value to an integer
+                */
+               convertNumber: function ( num, integer ) {
+                       var tmp, item, i,
+                               transformTable, numberString, convertedNumber;
+
+                       // Set the target Transform table:
+                       transformTable = this.digitTransformTable( $.i18n().locale );
+                       numberString = String( num );
+                       convertedNumber = '';
+
+                       if ( !transformTable ) {
+                               return num;
+                       }
+
+                       // Check if the restore to Latin number flag is set:
+                       if ( integer ) {
+                               if ( parseFloat( num, 10 ) === num ) {
+                                       return num;
+                               }
+
+                               tmp = [];
+
+                               for ( item in transformTable ) {
+                                       tmp[transformTable[item]] = item;
+                               }
+
+                               transformTable = tmp;
+                       }
+
+                       for ( i = 0; i < numberString.length; i++ ) {
+                               if ( transformTable[numberString[i]] ) {
+                                       convertedNumber += transformTable[numberString[i]];
+                               } else {
+                                       convertedNumber += numberString[i];
+                               }
+                       }
+
+                       return integer ? parseFloat( convertedNumber, 10 ) : convertedNumber;
+               },
+
+               /**
+                * Grammatical transformations, needed for inflected languages.
+                * Invoked by putting {{grammar:form|word}} in a message.
+                * Override this method for languages that need special grammar rules
+                * applied dynamically.
+                *
+                * @param word {String}
+                * @param form {String}
+                * @return {String}
+                */
+               convertGrammar: function ( word, form ) { /*jshint unused: false */
+                       return word;
+               },
+
+               /**
+                * Provides an alternative text depending on specified gender. Usage
+                * {{gender:[gender|user object]|masculine|feminine|neutral}}. If second
+                * or third parameter are not specified, masculine is used.
+                *
+                * These details may be overriden per language.
+                *
+                * @param gender
+                *      string male, female, or anything else for neutral.
+                * @param forms
+                *      array List of gender forms
+                *
+                * @return string
+                */
+               gender: function ( gender, forms ) {
+                       if ( !forms || forms.length === 0 ) {
+                               return '';
+                       }
+
+                       while ( forms.length < 2 ) {
+                               forms.push( forms[forms.length - 1] );
+                       }
+
+                       if ( gender === 'male' ) {
+                               return forms[0];
+                       }
+
+                       if ( gender === 'female' ) {
+                               return forms[1];
+                       }
+
+                       return ( forms.length === 3 ) ? forms[2] : forms[0];
+               },
+
+               /**
+                * Get the digit transform table for the given language
+                * See http://cldr.unicode.org/translation/numbering-systems
+                * @param language
+                * @returns {Array|boolean} List of digits in the passed language or false
+                * representation, or boolean false if there is no information.
+                */
+               digitTransformTable: function ( language ) {
+                       var tables = {
+                               ar: '٠١٢٣٤٥٦٧٨٩',
+                               fa: '۰۱۲۳۴۵۶۷۸۹',
+                               ml: '൦൧൨൩൪൫൬൭൮൯',
+                               kn: '೦೧೨೩೪೫೬೭೮೯',
+                               lo: '໐໑໒໓໔໕໖໗໘໙',
+                               or: '୦୧୨୩୪୫୬୭୮୯',
+                               kh: '០១២៣៤៥៦៧៨៩',
+                               pa: '੦੧੨੩੪੫੬੭੮੯',
+                               gu: '૦૧૨૩૪૫૬૭૮૯',
+                               hi: '०१२३४५६७८९',
+                               my: '၀၁၂၃၄၅၆၇၈၉',
+                               ta: '௦௧௨௩௪௫௬௭௮௯',
+                               te: '౦౧౨౩౪౫౬౭౮౯',
+                               th: '๐๑๒๓๔๕๖๗๘๙', // FIXME use iso 639 codes
+                               bo: '༠༡༢༣༤༥༦༧༨༩' // FIXME use iso 639 codes
+                       };
+
+                       if ( !tables[language] ) {
+                               return false;
+                       }
+
+                       return tables[language].split( '' );
+               }
+       };
+
+       $.extend( $.i18n.languages, {
+               default: language
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/jquery.i18n.messagestore.js b/resources/lib/jquery.i18n/src/jquery.i18n.messagestore.js
new file mode 100644 (file)
index 0000000..759295c
--- /dev/null
@@ -0,0 +1,125 @@
+/**
+ * jQuery Internationalization library - Message Store
+ *
+ * Copyright (C) 2012 Santhosh Thottingal
+ *
+ * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do anything special to
+ * choose one license or the other and you don't have to notify anyone which license you are using.
+ * You are free to use UniversalLanguageSelector in commercial projects as long as the copyright
+ * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @licence GNU General Public Licence 2.0 or later
+ * @licence MIT License
+ */
+
+( function ( $, window, undefined ) {
+       'use strict';
+
+       var MessageStore = function () {
+               this.messages = {};
+               this.sources = {};
+       };
+
+       /**
+        * See https://github.com/wikimedia/jquery.i18n/wiki/Specification#wiki-Message_File_Loading
+        */
+       MessageStore.prototype = {
+
+               /**
+                * General message loading API This can take a URL string for
+                * the json formatted messages.
+                * <code>load('path/to/all_localizations.json');</code>
+                *
+                * This can also load a localization file for a locale <code>
+                * load( 'path/to/de-messages.json', 'de' );
+                * </code>
+                * A data object containing message key- message translation mappings
+                * can also be passed Eg:
+                * <code>
+                * load( { 'hello' : 'Hello' }, optionalLocale );
+                * </code> If the data argument is
+                * null/undefined/false,
+                * all cached messages for the i18n instance will get reset.
+                *
+                * @param {String|Object} source
+                * @param {String} locale Language tag
+                * @return {jQuery.Promise}
+                */
+               load: function ( source, locale ) {
+                       var key = null,
+                               deferred = null,
+                               deferreds = [],
+                               messageStore = this;
+
+                       if ( typeof source === 'string' ) {
+                               // This is a URL to the messages file.
+                               $.i18n.log( 'Loading messages from: ' + source );
+                               deferred = jsonMessageLoader( source )
+                                       .done( function ( localization ) {
+                                               messageStore.set( locale, localization );
+                                       } );
+
+                               return deferred.promise();
+                       }
+
+                       if ( locale ) {
+                               // source is an key-value pair of messages for given locale
+                               messageStore.set( locale, source );
+
+                               return $.Deferred().resolve();
+                       } else {
+                               // source is a key-value pair of locales and their source
+                               for ( key in source ) {
+                                       if ( Object.prototype.hasOwnProperty.call( source, key ) ) {
+                                               locale = key;
+                                               // No {locale} given, assume data is a group of languages,
+                                               // call this function again for each language.
+                                               deferreds.push( messageStore.load( source[key], locale ) );
+                                       }
+                               }
+                               return $.when.apply( $, deferreds );
+                       }
+
+               },
+
+               /**
+                * Set messages to the given locale.
+                * If locale exists, add messages to the locale.
+                * @param locale
+                * @param messages
+                */
+               set: function ( locale, messages ) {
+                       if ( !this.messages[locale] ) {
+                               this.messages[locale] = messages;
+                       } else {
+                               this.messages[locale] = $.extend( this.messages[locale], messages );
+                       }
+               },
+
+               /**
+                *
+                * @param locale
+                * @param messageKey
+                * @returns {Boolean}
+                */
+               get: function ( locale, messageKey ) {
+                       return this.messages[locale] && this.messages[locale][messageKey];
+               }
+       };
+
+       function jsonMessageLoader( url ) {
+               var deferred = $.Deferred();
+
+               $.getJSON( url )
+                       .done( deferred.resolve )
+                       .fail( function ( jqxhr, settings, exception ) {
+                               $.i18n.log( 'Error in loading messages from ' + url + ' Exception: ' + exception );
+                               // Ignore 404 exception, because we are handling fallabacks explicitly
+                               deferred.resolve();
+                       } );
+
+               return deferred.promise();
+       }
+
+       $.extend( $.i18n.messageStore, new MessageStore() );
+}( jQuery, window ) );
diff --git a/resources/lib/jquery.i18n/src/jquery.i18n.parser.js b/resources/lib/jquery.i18n/src/jquery.i18n.parser.js
new file mode 100644 (file)
index 0000000..3dea284
--- /dev/null
@@ -0,0 +1,309 @@
+/**
+ * jQuery Internationalization library
+ *
+ * Copyright (C) 2011-2013 Santhosh Thottingal, Neil Kandalgaonkar
+ *
+ * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do
+ * anything special to choose one license or the other and you don't have to
+ * notify anyone which license you are using. You are free to use
+ * UniversalLanguageSelector in commercial projects as long as the copyright
+ * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @licence GNU General Public Licence 2.0 or later
+ * @licence MIT License
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       var MessageParser = function ( options ) {
+               this.options = $.extend( {}, $.i18n.parser.defaults, options );
+               this.language = $.i18n.languages[String.locale] || $.i18n.languages['default'];
+               this.emitter = $.i18n.parser.emitter;
+       };
+
+       MessageParser.prototype = {
+
+               constructor: MessageParser,
+
+               simpleParse: function ( message, parameters ) {
+                       return message.replace( /\$(\d+)/g, function ( str, match ) {
+                               var index = parseInt( match, 10 ) - 1;
+
+                               return parameters[index] !== undefined ? parameters[index] : '$' + match;
+                       } );
+               },
+
+               parse: function ( message, replacements ) {
+                       if ( message.indexOf( '{{' ) < 0 ) {
+                               return this.simpleParse( message, replacements );
+                       }
+
+                       this.emitter.language = $.i18n.languages[$.i18n().locale] ||
+                               $.i18n.languages['default'];
+
+                       return this.emitter.emit( this.ast( message ), replacements );
+               },
+
+               ast: function ( message ) {
+                       var pipe, colon, backslash, anyCharacter, dollar, digits, regularLiteral,
+                               regularLiteralWithoutBar, regularLiteralWithoutSpace, escapedOrLiteralWithoutBar,
+                               escapedOrRegularLiteral, templateContents, templateName, openTemplate,
+                               closeTemplate, expression, paramExpression, result,
+                               pos = 0;
+
+                       // Try parsers until one works, if none work return null
+                       function choice( parserSyntax ) {
+                               return function () {
+                                       var i, result;
+
+                                       for ( i = 0; i < parserSyntax.length; i++ ) {
+                                               result = parserSyntax[i]();
+
+                                               if ( result !== null ) {
+                                                       return result;
+                                               }
+                                       }
+
+                                       return null;
+                               };
+                       }
+
+                       // Try several parserSyntax-es in a row.
+                       // All must succeed; otherwise, return null.
+                       // This is the only eager one.
+                       function sequence( parserSyntax ) {
+                               var i, res,
+                                       originalPos = pos,
+                                       result = [];
+
+                               for ( i = 0; i < parserSyntax.length; i++ ) {
+                                       res = parserSyntax[i]();
+
+                                       if ( res === null ) {
+                                               pos = originalPos;
+
+                                               return null;
+                                       }
+
+                                       result.push( res );
+                               }
+
+                               return result;
+                       }
+
+                       // Run the same parser over and over until it fails.
+                       // Must succeed a minimum of n times; otherwise, return null.
+                       function nOrMore( n, p ) {
+                               return function () {
+                                       var originalPos = pos,
+                                               result = [],
+                                               parsed = p();
+
+                                       while ( parsed !== null ) {
+                                               result.push( parsed );
+                                               parsed = p();
+                                       }
+
+                                       if ( result.length < n ) {
+                                               pos = originalPos;
+
+                                               return null;
+                                       }
+
+                                       return result;
+                               };
+                       }
+
+                       // Helpers -- just make parserSyntax out of simpler JS builtin types
+
+                       function makeStringParser( s ) {
+                               var len = s.length;
+
+                               return function () {
+                                       var result = null;
+
+                                       if ( message.substr( pos, len ) === s ) {
+                                               result = s;
+                                               pos += len;
+                                       }
+
+                                       return result;
+                               };
+                       }
+
+                       function makeRegexParser( regex ) {
+                               return function () {
+                                       var matches = message.substr( pos ).match( regex );
+
+                                       if ( matches === null ) {
+                                               return null;
+                                       }
+
+                                       pos += matches[0].length;
+
+                                       return matches[0];
+                               };
+                       }
+
+                       pipe = makeStringParser( '|' );
+                       colon = makeStringParser( ':' );
+                       backslash = makeStringParser( '\\' );
+                       anyCharacter = makeRegexParser( /^./ );
+                       dollar = makeStringParser( '$' );
+                       digits = makeRegexParser( /^\d+/ );
+                       regularLiteral = makeRegexParser( /^[^{}\[\]$\\]/ );
+                       regularLiteralWithoutBar = makeRegexParser( /^[^{}\[\]$\\|]/ );
+                       regularLiteralWithoutSpace = makeRegexParser( /^[^{}\[\]$\s]/ );
+
+                       // There is a general pattern:
+                       // parse a thing;
+                       // if it worked, apply transform,
+                       // otherwise return null.
+                       // But using this as a combinator seems to cause problems
+                       // when combined with nOrMore().
+                       // May be some scoping issue.
+                       function transform( p, fn ) {
+                               return function () {
+                                       var result = p();
+
+                                       return result === null ? null : fn( result );
+                               };
+                       }
+
+                       // Used to define "literals" within template parameters. The pipe
+                       // character is the parameter delimeter, so by default
+                       // it is not a literal in the parameter
+                       function literalWithoutBar() {
+                               var result = nOrMore( 1, escapedOrLiteralWithoutBar )();
+
+                               return result === null ? null : result.join( '' );
+                       }
+
+                       function literal() {
+                               var result = nOrMore( 1, escapedOrRegularLiteral )();
+
+                               return result === null ? null : result.join( '' );
+                       }
+
+                       function escapedLiteral() {
+                               var result = sequence( [ backslash, anyCharacter ] );
+
+                               return result === null ? null : result[1];
+                       }
+
+                       choice( [ escapedLiteral, regularLiteralWithoutSpace ] );
+                       escapedOrLiteralWithoutBar = choice( [ escapedLiteral, regularLiteralWithoutBar ] );
+                       escapedOrRegularLiteral = choice( [ escapedLiteral, regularLiteral ] );
+
+                       function replacement() {
+                               var result = sequence( [ dollar, digits ] );
+
+                               if ( result === null ) {
+                                       return null;
+                               }
+
+                               return [ 'REPLACE', parseInt( result[1], 10 ) - 1 ];
+                       }
+
+                       templateName = transform(
+                               // see $wgLegalTitleChars
+                               // not allowing : due to the need to catch "PLURAL:$1"
+                               makeRegexParser( /^[ !"$&'()*,.\/0-9;=?@A-Z\^_`a-z~\x80-\xFF+\-]+/ ),
+
+                               function ( result ) {
+                                       return result.toString();
+                               }
+                       );
+
+                       function templateParam() {
+                               var expr,
+                                       result = sequence( [ pipe, nOrMore( 0, paramExpression ) ] );
+
+                               if ( result === null ) {
+                                       return null;
+                               }
+
+                               expr = result[1];
+
+                               // use a "CONCAT" operator if there are multiple nodes,
+                               // otherwise return the first node, raw.
+                               return expr.length > 1 ? [ 'CONCAT' ].concat( expr ) : expr[0];
+                       }
+
+                       function templateWithReplacement() {
+                               var result = sequence( [ templateName, colon, replacement ] );
+
+                               return result === null ? null : [ result[0], result[2] ];
+                       }
+
+                       function templateWithOutReplacement() {
+                               var result = sequence( [ templateName, colon, paramExpression ] );
+
+                               return result === null ? null : [ result[0], result[2] ];
+                       }
+
+                       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 ] ),
+                                               nOrMore( 0, templateParam )
+                                       ] );
+
+                                       return res === null ? null : res[0].concat( res[1] );
+                               },
+                               function () {
+                                       var res = sequence( [ templateName, nOrMore( 0, templateParam ) ] );
+
+                                       if ( res === null ) {
+                                               return null;
+                                       }
+
+                                       return [ res[0] ].concat( res[1] );
+                               }
+                       ] );
+
+                       openTemplate = makeStringParser( '{{' );
+                       closeTemplate = makeStringParser( '}}' );
+
+                       function template() {
+                               var result = sequence( [ openTemplate, templateContents, closeTemplate ] );
+
+                               return result === null ? null : result[1];
+                       }
+
+                       expression = choice( [ template, replacement, literal ] );
+                       paramExpression = choice( [ template, replacement, literalWithoutBar ] );
+
+                       function start() {
+                               var result = nOrMore( 0, expression )();
+
+                               if ( result === null ) {
+                                       return null;
+                               }
+
+                               return [ 'CONCAT' ].concat( result );
+                       }
+
+                       result = start();
+
+                       /*
+                        * For success, the pos must have gotten to the end of the input
+                        * and returned a non-null.
+                        * n.b. This is part of language infrastructure, so we do not throw an internationalizable message.
+                        */
+                       if ( result === null || pos !== message.length ) {
+                               throw new Error( 'Parse error at position ' + pos.toString() + ' in input: ' + message );
+                       }
+
+                       return result;
+               }
+
+       };
+
+       $.extend( $.i18n.parser, new MessageParser() );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/bs.js b/resources/lib/jquery.i18n/src/languages/bs.js
new file mode 100644 (file)
index 0000000..5370069
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Bosnian (bosanski) language functions
+ */
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.bs = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       switch ( form ) {
+                       case 'instrumental': // instrumental
+                               word = 's ' + word;
+                               break;
+                       case 'lokativ': // locative
+                               word = 'o ' + word;
+                               break;
+                       }
+
+                       return word;
+               }
+       } );
+
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/dsb.js b/resources/lib/jquery.i18n/src/languages/dsb.js
new file mode 100644 (file)
index 0000000..cc069eb
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Lower Sorbian (Dolnoserbski) language functions
+ */
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.dsb = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       switch ( form ) {
+                               case 'instrumental': // instrumental
+                                       word = 'z ' + word;
+                                       break;
+                               case 'lokatiw': // lokatiw
+                                       word = 'wo ' + word;
+                                       break;
+                       }
+
+                       return word;
+               }
+       } );
+
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/fi.js b/resources/lib/jquery.i18n/src/languages/fi.js
new file mode 100644 (file)
index 0000000..d8e9578
--- /dev/null
@@ -0,0 +1,49 @@
+/**
+ * Finnish (Suomi) language functions
+ *
+ * @author Santhosh Thottingal
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.fi = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       // vowel harmony flag
+                       var aou = word.match( /[aou][^äöy]*$/i ),
+                               origWord = word;
+                       if ( word.match( /wiki$/i ) ) {
+                               aou = false;
+                       }
+
+                       // append i after final consonant
+                       if ( word.match( /[bcdfghjklmnpqrstvwxz]$/i ) ) {
+                               word += 'i';
+                       }
+
+                       switch ( form ) {
+                       case 'genitive':
+                               word += 'n';
+                               break;
+                       case 'elative':
+                               word += ( aou ? 'sta' : 'stä' );
+                               break;
+                       case 'partitive':
+                               word += ( aou ? 'a' : 'ä' );
+                               break;
+                       case 'illative':
+                               // Double the last letter and add 'n'
+                               word += word.substr( word.length - 1 ) + 'n';
+                               break;
+                       case 'inessive':
+                               word += ( aou ? 'ssa' : 'ssä' );
+                               break;
+                       default:
+                               word = origWord;
+                               break;
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/ga.js b/resources/lib/jquery.i18n/src/languages/ga.js
new file mode 100644 (file)
index 0000000..1aceab7
--- /dev/null
@@ -0,0 +1,38 @@
+/**
+ * Irish (Gaeilge) language functions
+ */
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.ga = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       if ( form === 'ainmlae' ) {
+                               switch ( word ) {
+                               case 'an Domhnach':
+                                       word = 'Dé Domhnaigh';
+                                       break;
+                               case 'an Luan':
+                                       word = 'Dé Luain';
+                                       break;
+                               case 'an Mháirt':
+                                       word = 'Dé Mháirt';
+                                       break;
+                               case 'an Chéadaoin':
+                                       word = 'Dé Chéadaoin';
+                                       break;
+                               case 'an Déardaoin':
+                                       word = 'Déardaoin';
+                                       break;
+                               case 'an Aoine':
+                                       word = 'Dé hAoine';
+                                       break;
+                               case 'an Satharn':
+                                       word = 'Dé Sathairn';
+                                       break;
+                               }
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/he.js b/resources/lib/jquery.i18n/src/languages/he.js
new file mode 100644 (file)
index 0000000..cbbe90b
--- /dev/null
@@ -0,0 +1,31 @@
+/**
+ * Hebrew (עברית) language functions
+ */
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.he = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       switch ( form ) {
+                       case 'prefixed':
+                       case 'תחילית': // the same word in Hebrew
+                               // Duplicate prefixed "Waw", but only if it's not already double
+                               if ( word.substr( 0, 1 ) === 'ו' && word.substr( 0, 2 ) !== 'וו' ) {
+                                       word = 'ו' + word;
+                               }
+
+                               // Remove the "He" if prefixed
+                               if ( word.substr( 0, 1 ) === 'ה' ) {
+                                       word = word.substr( 1, word.length );
+                               }
+
+                               // Add a hyphen (maqaf) before numbers and non-Hebrew letters
+                               if ( word.substr( 0, 1 ) < 'א' || word.substr( 0, 1 ) > 'ת' ) {
+                                       word = '־' + word;
+                               }
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/hsb.js b/resources/lib/jquery.i18n/src/languages/hsb.js
new file mode 100644 (file)
index 0000000..957616f
--- /dev/null
@@ -0,0 +1,21 @@
+/**
+ * Upper Sorbian (Hornjoserbsce) language functions
+ */
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.hsb = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       switch ( form ) {
+                       case 'instrumental': // instrumental
+                               word = 'z ' + word;
+                               break;
+                       case 'lokatiw': // lokatiw
+                               word = 'wo ' + word;
+                               break;
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/hu.js b/resources/lib/jquery.i18n/src/languages/hu.js
new file mode 100644 (file)
index 0000000..1177b85
--- /dev/null
@@ -0,0 +1,26 @@
+/**
+ * Hungarian language functions
+ *
+ * @author Santhosh Thottingal
+ */
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.hu = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       switch ( form ) {
+                       case 'rol':
+                               word += 'ról';
+                               break;
+                       case 'ba':
+                               word += 'ba';
+                               break;
+                       case 'k':
+                               word += 'k';
+                               break;
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/hy.js b/resources/lib/jquery.i18n/src/languages/hy.js
new file mode 100644 (file)
index 0000000..9c56899
--- /dev/null
@@ -0,0 +1,25 @@
+/**
+ * Armenian (Հայերեն) language functions
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.hy = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       if ( form === 'genitive' ) { // սեռական հոլով
+                               if ( word.substr( -1 ) === 'ա' ) {
+                                       word = word.substr( 0, word.length - 1 ) + 'այի';
+                               } else if ( word.substr( -1 ) === 'ո' ) {
+                                       word = word.substr( 0, word.length - 1 ) + 'ոյի';
+                               } else if ( word.substr( -4 ) === 'գիրք' ) {
+                                       word = word.substr( 0, word.length - 4 ) + 'գրքի';
+                               } else {
+                                       word = word + 'ի';
+                               }
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/la.js b/resources/lib/jquery.i18n/src/languages/la.js
new file mode 100644 (file)
index 0000000..11c1122
--- /dev/null
@@ -0,0 +1,54 @@
+/**
+ * Latin (lingua Latina) language functions
+ *
+ * @author Santhosh Thottingal
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.la = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       switch ( form ) {
+                       case 'genitive':
+                               // only a few declensions, and even for those mostly the singular only
+                               word = word.replace( /u[ms]$/i, 'i' ); // 2nd declension singular
+                               word = word.replace( /ommunia$/i, 'ommunium' ); // 3rd declension neuter plural (partly)
+                               word = word.replace( /a$/i, 'ae' ); // 1st declension singular
+                               word = word.replace( /libri$/i, 'librorum' ); // 2nd declension plural (partly)
+                               word = word.replace( /nuntii$/i, 'nuntiorum' ); // 2nd declension plural (partly)
+                               word = word.replace( /tio$/i, 'tionis' ); // 3rd declension singular (partly)
+                               word = word.replace( /ns$/i, 'ntis' );
+                               word = word.replace( /as$/i, 'atis' );
+                               word = word.replace( /es$/i, 'ei' ); // 5th declension singular
+                               break;
+                       case 'accusative':
+                               // only a few declensions, and even for those mostly the singular only
+                               word = word.replace( /u[ms]$/i, 'um' ); // 2nd declension singular
+                               word = word.replace( /ommunia$/i, 'am' ); // 3rd declension neuter plural (partly)
+                               word = word.replace( /a$/i, 'ommunia' ); // 1st declension singular
+                               word = word.replace( /libri$/i, 'libros' ); // 2nd declension plural (partly)
+                               word = word.replace( /nuntii$/i, 'nuntios' );// 2nd declension plural (partly)
+                               word = word.replace( /tio$/i, 'tionem' ); // 3rd declension singular (partly)
+                               word = word.replace( /ns$/i, 'ntem' );
+                               word = word.replace( /as$/i, 'atem' );
+                               word = word.replace( /es$/i, 'em' ); // 5th declension singular
+                               break;
+                       case 'ablative':
+                               // only a few declensions, and even for those mostly the singular only
+                               word = word.replace( /u[ms]$/i, 'o' ); // 2nd declension singular
+                               word = word.replace( /ommunia$/i, 'ommunibus' ); // 3rd declension neuter plural (partly)
+                               word = word.replace( /a$/i, 'a' ); // 1st declension singular
+                               word = word.replace( /libri$/i, 'libris' ); // 2nd declension plural (partly)
+                               word = word.replace( /nuntii$/i, 'nuntiis' ); // 2nd declension plural (partly)
+                               word = word.replace( /tio$/i, 'tione' ); // 3rd declension singular (partly)
+                               word = word.replace( /ns$/i, 'nte' );
+                               word = word.replace( /as$/i, 'ate' );
+                               word = word.replace( /es$/i, 'e' ); // 5th declension singular
+                               break;
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/ml.js b/resources/lib/jquery.i18n/src/languages/ml.js
new file mode 100644 (file)
index 0000000..f724b7b
--- /dev/null
@@ -0,0 +1,98 @@
+/**
+ * Malayalam language functions
+ *
+ * @author Santhosh Thottingal
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.ml = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       form = form.toLowerCase();
+                       switch ( form ) {
+                               case 'ഉദ്ദേശിക':
+                               case 'dative':
+                                       if ( word.substr( -1 ) === 'ു' ||
+                                               word.substr( -1 ) === 'ൂ' ||
+                                               word.substr( -1 ) === 'ൗ' ||
+                                               word.substr( -1 ) === 'ൌ'
+                                       ) {
+                                               word += 'വിന്';
+                                       } else if ( word.substr( -1 ) === 'ം' ) {
+                                               word = word.substr( 0, word.length - 1 ) + 'ത്തിന്';
+                                       } else if ( word.substr( -1 ) === 'ൻ' ) {
+                                               // Atomic chillu n. അവൻ -> അവന്
+                                               word = word.substr( 0, word.length - 1 ) + 'ന്';
+                                       } else if ( word.substr( -3 ) === 'ന്\u200d' ) {
+                                               // chillu n. അവൻ -> അവന്
+                                               word = word.substr( 0, word.length - 1 );
+                                       } else if ( word.substr( -1 ) === 'ൾ' || word.substr( -3 ) === 'ള്\u200d' ) {
+                                               word += 'ക്ക്';
+                                       } else if ( word.substr( -1 ) === 'ർ' || word.substr( -3 ) === 'ര്\u200d' ) {
+                                               word += 'ക്ക്';
+                                       } else if ( word.substr( -1 ) === 'ൽ' ) {
+                                               // Atomic chillu ൽ , ഫയൽ -> ഫയലിന്
+                                               word = word.substr( 0, word.length - 1 ) + 'ലിന്';
+                                       } else if ( word.substr( -3 ) === 'ല്\u200d' ) {
+                                               // chillu ല്\u200d , ഫയല്\u200d -> ഫയലിന്
+                                               word = word.substr( 0, word.length - 2 ) + 'ിന്';
+                                       } else if ( word.substr( -2 ) === 'ു്' ) {
+                                               word = word.substr( 0, word.length - 2 ) + 'ിന്';
+                                       } else if ( word.substr( -1 ) === '്' ) {
+                                               word = word.substr( 0, word.length - 1 ) + 'ിന്';
+                                       } else {
+                                               // കാവ്യ -> കാവ്യയ്ക്ക്, ഹരി -> ഹരിയ്ക്ക്, മല -> മലയ്ക്ക്
+                                               word += 'യ്ക്ക്';
+                                       }
+
+                                       break;
+                               case 'സംബന്ധിക':
+                               case 'genitive':
+                                       if ( word.substr( -1 ) === 'ം' ) {
+                                               word = word.substr( 0, word.length - 1 ) + 'ത്തിന്റെ';
+                                       } else if ( word.substr( -2 ) === 'ു്' ) {
+                                               word = word.substr( 0, word.length - 2 ) + 'ിന്റെ';
+                                       } else if ( word.substr( -1 ) === '്' ) {
+                                               word = word.substr( 0, word.length - 1 ) + 'ിന്റെ';
+                                       } else if (  word.substr( -1 ) === 'ു' ||
+                                               word.substr( -1 ) === 'ൂ' ||
+                                               word.substr( -1 ) === 'ൗ' ||
+                                               word.substr( -1 ) === 'ൌ'
+                                       ) {
+                                               word += 'വിന്റെ';
+                                       } else if ( word.substr( -1 ) === 'ൻ' ) {
+                                               // Atomic chillu n. അവൻ -> അവന്റെ
+                                               word = word.substr( 0, word.length - 1 ) + 'ന്റെ';
+                                       } else if ( word.substr( -3 ) === 'ന്\u200d' ) {
+                                               // chillu n. അവൻ -> അവന്റെ
+                                               word = word.substr( 0, word.length - 1 ) + 'റെ';
+                                       } else if ( word.substr( -3 ) === 'ള്\u200d' ) {
+                                               // chillu n. അവൾ -> അവളുടെ
+                                               word = word.substr( 0, word.length - 2 ) + 'ുടെ';
+                                       } else if ( word.substr( -1 ) === 'ൾ' ) {
+                                               // Atomic chillu n. അവള്\u200d -> അവളുടെ
+                                               word = word.substr( 0, word.length - 1 ) + 'ളുടെ';
+                                       } else if ( word.substr( -1 ) === 'ൽ' ) {
+                                               // Atomic l. മുയല്\u200d -> മുയലിന്റെ
+                                               word = word.substr( 0, word.length - 1 ) + 'ലിന്റെ';
+                                       } else if ( word.substr( -3 ) === 'ല്\u200d' ) {
+                                               // chillu l. മുയല്\u200d -> അവളുടെ
+                                               word = word.substr( 0, word.length - 2 ) + 'ിന്റെ';
+                                       } else if ( word.substr( -3 ) === 'ര്\u200d' ) {
+                                               // chillu r. അവര്\u200d -> അവരുടെ
+                                               word = word.substr( 0, word.length - 2 ) + 'ുടെ';
+                                       } else if ( word.substr( -1 ) === 'ർ' ) {
+                                               // Atomic chillu r. അവർ -> അവരുടെ
+                                               word = word.substr( 0, word.length - 1 ) + 'രുടെ';
+                                       } else {
+                                               word += 'യുടെ';
+                                       }
+
+                                       break;
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/os.js b/resources/lib/jquery.i18n/src/languages/os.js
new file mode 100644 (file)
index 0000000..4744367
--- /dev/null
@@ -0,0 +1,76 @@
+/**
+ * Ossetian (Ирон) language functions
+ *
+ * @author Santhosh Thottingal
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.os = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       var endAllative, jot, hyphen, ending;
+
+                       // Ending for allative case
+                       endAllative = 'мæ';
+                       // Variable for 'j' beetwen vowels
+                       jot = '';
+                       // Variable for "-" for not Ossetic words
+                       hyphen = '';
+                       // Variable for ending
+                       ending = '';
+
+                       if ( word.match( /тæ$/i ) ) {
+                               // Checking if the $word is in plural form
+                               word = word.substring( 0, word.length - 1 );
+                               endAllative = 'æм';
+                       } else if ( word.match( /[аæеёиоыэюя]$/i ) ) {
+                               // Works if word is in singular form.
+                               // Checking if word ends on one of the vowels: е, ё, и, о, ы, э, ю,
+                               // я.
+                               jot = 'й';
+                       } else if ( word.match( /у$/i ) ) {
+                               // Checking if word ends on 'у'. 'У' can be either consonant 'W' or
+                               // vowel 'U' in cyrillic Ossetic.
+                               // Examples: {{grammar:genitive|аунеу}} = аунеуы,
+                               // {{grammar:genitive|лæппу}} = лæппуйы.
+                               if ( !word.substring( word.length - 2, word.length - 1 )
+                                               .match( /[аæеёиоыэюя]$/i ) ) {
+                                       jot = 'й';
+                               }
+                       } else if ( !word.match( /[бвгджзйклмнопрстфхцчшщьъ]$/i ) ) {
+                               hyphen = '-';
+                       }
+
+                       switch ( form ) {
+                       case 'genitive':
+                               ending = hyphen + jot + 'ы';
+                               break;
+                       case 'dative':
+                               ending = hyphen + jot + 'æн';
+                               break;
+                       case 'allative':
+                               ending = hyphen + endAllative;
+                               break;
+                       case 'ablative':
+                               if ( jot === 'й' ) {
+                                       ending = hyphen + jot + 'æ';
+                               } else {
+                                       ending = hyphen + jot + 'æй';
+                               }
+                               break;
+                       case 'superessive':
+                               ending = hyphen + jot + 'ыл';
+                               break;
+                       case 'equative':
+                               ending = hyphen + jot + 'ау';
+                               break;
+                       case 'comitative':
+                               ending = hyphen + 'имæ';
+                               break;
+                       }
+
+                       return word + ending;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/ru.js b/resources/lib/jquery.i18n/src/languages/ru.js
new file mode 100644 (file)
index 0000000..893b238
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * Russian (Русский) language functions
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.ru = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       if ( form === 'genitive' ) { // родительный падеж
+                               if ( word.substr( -1 ) === 'ь' ) {
+                                       word = word.substr( 0, word.length - 1 ) + 'я';
+                               } else if ( word.substr( -2 ) === 'ия' ) {
+                                       word = word.substr( 0, word.length - 2 ) + 'ии';
+                               } else if ( word.substr( -2 ) === 'ка' ) {
+                                       word = word.substr( 0, word.length - 2 ) + 'ки';
+                               } else if ( word.substr( -2 ) === 'ти' ) {
+                                       word = word.substr( 0, word.length - 2 ) + 'тей';
+                               } else if ( word.substr( -2 ) === 'ды' ) {
+                                       word = word.substr( 0, word.length - 2 ) + 'дов';
+                               } else if ( word.substr( -3 ) === 'ник' ) {
+                                       word = word.substr( 0, word.length - 3 ) + 'ника';
+                               }
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/sl.js b/resources/lib/jquery.i18n/src/languages/sl.js
new file mode 100644 (file)
index 0000000..a3aafc3
--- /dev/null
@@ -0,0 +1,26 @@
+/**
+ * Slovenian (Slovenščina) language functions
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.sl = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       switch ( form ) {
+                               // locative
+                               case 'mestnik':
+                                       word = 'o ' + word;
+
+                                       break;
+                               // instrumental
+                               case 'orodnik':
+                                       word = 'z ' + word;
+
+                                       break;
+                       }
+
+                       return word;
+               }
+       } );
+}( jQuery ) );
diff --git a/resources/lib/jquery.i18n/src/languages/uk.js b/resources/lib/jquery.i18n/src/languages/uk.js
new file mode 100644 (file)
index 0000000..8e69efc
--- /dev/null
@@ -0,0 +1,39 @@
+/**
+ * Ukrainian (Українська) language functions
+ */
+
+( function ( $ ) {
+       'use strict';
+
+       $.i18n.languages.uk = $.extend( {}, $.i18n.languages['default'], {
+               convertGrammar: function ( word, form ) {
+                       switch ( form ) {
+                       case 'genitive': // родовий відмінок
+                               if ( word.substr( -1 ) === 'ь' ) {
+                                       word = word.substr( 0, word.length - 1 ) + 'я';
+                               } else if ( word.substr( -2 ) === 'ія' ) {
+                                       word = word.substr( 0, word.length - 2 ) + 'ії';
+                               } else if ( word.substr( -2 ) === 'ка' ) {
+                                       word = word.substr( 0, word.length - 2 ) + 'ки';
+                               } else if ( word.substr( -2 ) === 'ти' ) {
+                                       word = word.substr( 0, word.length - 2 ) + 'тей';
+                               } else if ( word.substr( -2 ) === 'ды' ) {
+                                       word = word.substr( 0, word.length - 2 ) + 'дов';
+                               } else if ( word.substr( -3 ) === 'ник' ) {
+                                       word = word.substr( 0, word.length - 3 ) + 'ника';
+                               }
+
+                               break;
+                       case 'accusative': // знахідний відмінок
+                               if ( word.substr( -2 ) === 'ія' ) {
+                                       word = word.substr( 0, word.length - 2 ) + 'ію';
+                               }
+
+                               break;
+                       }
+
+                       return word;
+               }
+       } );
+
+}( jQuery ) );
diff --git a/resources/lib/mustache/LICENSE b/resources/lib/mustache/LICENSE
new file mode 100644 (file)
index 0000000..aa1b831
--- /dev/null
@@ -0,0 +1,10 @@
+The MIT License
+
+Copyright (c) 2009 Chris Wanstrath (Ruby)
+Copyright (c) 2010-2014 Jan Lehnardt (JavaScript)
+
+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.
index 8098781..61eb384 100644 (file)
@@ -8,9 +8,14 @@
        "ooui-outline-control-move-up": "طلع الشيئ للفوق",
        "ooui-outline-control-remove": "أمحي العنصر",
        "ooui-toolbar-more": "زيادة",
+       "ooui-toolgroup-expand": "زيادة",
+       "ooui-toolgroup-collapse": "قليل",
        "ooui-dialog-message-accept": "مليح",
        "ooui-dialog-message-reject": "رجَع",
        "ooui-dialog-process-error": "حاجه ما خدمتش مليح",
        "ooui-dialog-process-dismiss": "أرفضها",
-       "ooui-dialog-process-retry": "عاود جرب"
+       "ooui-dialog-process-retry": "عاود جرب",
+       "ooui-dialog-process-continue": "واصل",
+       "ooui-selectfile-not-supported": "تحديد الفيشيات ما هوش محدد",
+       "ooui-selectfile-placeholder": "ما اختاريتش حتا ملف"
 }
index ae853dd..c373601 100644 (file)
@@ -1,9 +1,13 @@
 {
        "@metadata": {
                "authors": [
-                       "Gitartha.bordoloi"
+                       "Gitartha.bordoloi",
+                       "Dibya Dutta"
                ]
        },
+       "ooui-outline-control-move-down": "সমল তললৈ স্থানান্তৰ কৰক",
+       "ooui-outline-control-move-up": "সমল ওপৰলৈ স্থানান্তৰ কৰক",
+       "ooui-outline-control-remove": "সমল আঁতৰাওক",
        "ooui-toolbar-more": "অধিক",
        "ooui-toolgroup-expand": "অধিক",
        "ooui-toolgroup-collapse": "কম দেখাওক",
@@ -12,5 +16,7 @@
        "ooui-dialog-process-error": "কিবা ত্ৰুটি হৈছে",
        "ooui-dialog-process-dismiss": "বাতিল",
        "ooui-dialog-process-retry": "পুনৰ চেষ্টা কৰক",
-       "ooui-dialog-process-continue": "অব্যাহত ৰাখক"
+       "ooui-dialog-process-continue": "অব্যাহত ৰাখক",
+       "ooui-selectfile-not-supported": "নথি নিৰ্বাচন সমৰ্থন কৰা নাই",
+       "ooui-selectfile-placeholder": "কোনো নথি নিৰ্বাচিত কৰা হোৱা নাই"
 }
index 87d7688..216df70 100644 (file)
        "ooui-outline-control-move-up": "Mover arriba l'elementu",
        "ooui-outline-control-remove": "Desaniciar elementu",
        "ooui-toolbar-more": "Más",
+       "ooui-toolgroup-expand": "Más",
+       "ooui-toolgroup-collapse": "Menos",
        "ooui-dialog-message-accept": "Aceutar",
        "ooui-dialog-message-reject": "Encaboxar",
        "ooui-dialog-process-error": "Daqué funcionó mal",
        "ooui-dialog-process-dismiss": "Descartar",
-       "ooui-dialog-process-retry": "Vuelvi a intentalo"
+       "ooui-dialog-process-retry": "Vuelvi a intentalo",
+       "ooui-dialog-process-continue": "Siguir",
+       "ooui-selectfile-not-supported": "Nun hai encontu pa la seleición de ficheros",
+       "ooui-selectfile-placeholder": "Nun se seleicionó nengún ficheru"
 }
index 4aeb490..3548239 100644 (file)
@@ -5,12 +5,22 @@
                        "Wizardist",
                        "Чаховіч Уладзіслаў",
                        "Zedlik",
-                       "Red Winged Duck"
+                       "Red Winged Duck",
+                       "Renessaince"
                ]
        },
        "ooui-outline-control-move-down": "Перасунуць элемэнт ніжэй",
        "ooui-outline-control-move-up": "Перасунуць элемэнт вышэй",
+       "ooui-outline-control-remove": "Выдаліць пункт",
        "ooui-toolbar-more": "Болей",
        "ooui-toolgroup-expand": "Болей",
-       "ooui-toolgroup-collapse": "Меней"
+       "ooui-toolgroup-collapse": "Меней",
+       "ooui-dialog-message-accept": "Добра",
+       "ooui-dialog-message-reject": "Скасаваць",
+       "ooui-dialog-process-error": "Нешта пайшло ня так",
+       "ooui-dialog-process-dismiss": "Прапусьціць",
+       "ooui-dialog-process-retry": "Паспрабаваць зноў",
+       "ooui-dialog-process-continue": "Працягваць",
+       "ooui-selectfile-not-supported": "Выбар файлу не падтрымліваецца",
+       "ooui-selectfile-placeholder": "Ніводзін файл не абраны"
 }
index fb0f688..7db7547 100644 (file)
@@ -2,9 +2,22 @@
        "@metadata": {
                "authors": [
                        "Чаховіч Уладзіслаў",
-                       "Artificial123"
+                       "Artificial123",
+                       "Goshaproject"
                ]
        },
+       "ooui-outline-control-move-down": "Перамясціць элемент ўніз",
+       "ooui-outline-control-move-up": "Перамясціць элемент уверх",
+       "ooui-outline-control-remove": "Выдаліць элемент",
+       "ooui-toolbar-more": "Яшчэ",
+       "ooui-toolgroup-expand": "Яшчэ",
+       "ooui-toolgroup-collapse": "Менш",
        "ooui-dialog-message-accept": "ОК",
-       "ooui-dialog-message-reject": "Адмяніць"
+       "ooui-dialog-message-reject": "Адмяніць",
+       "ooui-dialog-process-error": "Штось пайшло не так…",
+       "ooui-dialog-process-dismiss": "Прапусціць",
+       "ooui-dialog-process-retry": "Паспрабаваць яшчэ раз",
+       "ooui-dialog-process-continue": "Працягнуць",
+       "ooui-selectfile-not-supported": "Выбраны файл не падтрымліваецца",
+       "ooui-selectfile-placeholder": "Файл не выбраны"
 }
index 02d95b5..dce3593 100644 (file)
@@ -4,9 +4,18 @@
                        "DCLXVI",
                        "Hristofor.mirchev",
                        "පසිඳු කාවින්ද",
-                       "Mitzev"
+                       "Mitzev",
+                       "Aquilax"
                ]
        },
        "ooui-outline-control-remove": "Премахване на обекта",
-       "ooui-toolbar-more": "Още"
+       "ooui-toolbar-more": "Още",
+       "ooui-toolgroup-expand": "Още",
+       "ooui-toolgroup-collapse": "По-малко",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Отказ",
+       "ooui-dialog-process-error": "Нещо се обърка",
+       "ooui-dialog-process-dismiss": "Затвори",
+       "ooui-dialog-process-retry": "Опитайте отново",
+       "ooui-dialog-process-continue": "Продължаване"
 }
index 1cfa6c4..9481a2c 100644 (file)
@@ -8,7 +8,8 @@
                        "Runab",
                        "Sayak Sarkar",
                        "Aftabuzzaman",
-                       "RYasmeen (WMF)"
+                       "RYasmeen (WMF)",
+                       "NahidSultan"
                ]
        },
        "ooui-outline-control-move-down": "আইটেম নিচে স্থানান্তর",
@@ -22,5 +23,7 @@
        "ooui-dialog-process-error": "কিছু একটায় ত্রুটি হয়েছে",
        "ooui-dialog-process-dismiss": "বাতিল করুন",
        "ooui-dialog-process-retry": "আবার চেষ্টা করুন",
-       "ooui-dialog-process-continue": "অগ্রসর হোন"
+       "ooui-dialog-process-continue": "অগ্রসর হোন",
+       "ooui-selectfile-not-supported": "চিত্র নির্বাচন সমর্থন করছে না।",
+       "ooui-selectfile-placeholder": " কোন চিত্র নির্বাচিত হয়নি।"
 }
index 130bd8e..d6f61ae 100644 (file)
@@ -1,10 +1,11 @@
 {
        "@metadata": {
                "authors": [
-                       "DzWiki"
+                       "DzWiki",
+                       "Semso98"
                ]
        },
-       "ooui-outline-control-move-down": "Premjesti stavku dole",
+       "ooui-outline-control-move-down": "Premjesti stavku dolje",
        "ooui-outline-control-move-up": "Premjesti stavku gore",
        "ooui-outline-control-remove": "Ukloni stavku",
        "ooui-toolbar-more": "Više",
index ce3afa4..35a550b 100644 (file)
@@ -10,7 +10,9 @@
                        "Vriullop",
                        "Toniher",
                        "Edustus",
-                       "Davidpar"
+                       "Davidpar",
+                       "Maceleiro",
+                       "Kippelboy"
                ]
        },
        "ooui-outline-control-move-down": "Baixa l'element",
@@ -24,5 +26,7 @@
        "ooui-dialog-process-error": "Alguna cosa no ha funcionat",
        "ooui-dialog-process-dismiss": "Descarta",
        "ooui-dialog-process-retry": "Torneu-ho a provar",
-       "ooui-dialog-process-continue": "Continua"
+       "ooui-dialog-process-continue": "Continua",
+       "ooui-selectfile-not-supported": "El tipus de fitxer no és compatible",
+       "ooui-selectfile-placeholder": "No s'ha seleccionat cap fitxer"
 }
index 0c66619..d2a998c 100644 (file)
@@ -3,9 +3,18 @@
                "authors": [
                        "Calak",
                        "Muhammed taha",
-                       "Serwan"
+                       "Serwan",
+                       "Pirehelokan"
                ]
        },
+       "ooui-toolbar-more": "زیاتر",
+       "ooui-toolgroup-expand": "زیاتر",
+       "ooui-toolgroup-collapse": "کەمتر",
        "ooui-dialog-message-accept": "باشە",
-       "ooui-dialog-message-reject": "پاشگەزبوونەوە"
+       "ooui-dialog-message-reject": "پاشگەزبوونەوە",
+       "ooui-dialog-process-error": "ھەڵەیەک ڕووی داوە",
+       "ooui-dialog-process-dismiss": "لێگەڕان",
+       "ooui-dialog-process-retry": "دیسان ھەوڵ بدە",
+       "ooui-dialog-process-continue": "درێژە بدە",
+       "ooui-selectfile-placeholder": "ھیچ فایلێک ھەڵنەبژێراوە"
 }
index aa916af..d627de0 100644 (file)
@@ -5,5 +5,6 @@
                ]
        },
        "ooui-toolbar-more": "вѧщє",
-       "ooui-toolgroup-expand": "вѧщє"
+       "ooui-toolgroup-expand": "вѧщє",
+       "ooui-dialog-process-error": "нѣчьто ꙁълѣ сѧ авило"
 }
index 0b847be..30e3efa 100644 (file)
@@ -7,10 +7,13 @@
                        "Laketown",
                        "Palnatoke",
                        "Simeondahl",
-                       "Tehnix"
+                       "Tehnix",
+                       "Macofe"
                ]
        },
        "ooui-outline-control-move-down": "Flyt ned",
        "ooui-outline-control-move-up": "Flyt op",
-       "ooui-toolbar-more": "Mere"
+       "ooui-toolbar-more": "Mere",
+       "ooui-toolgroup-expand": "Mere",
+       "ooui-dialog-process-continue": "Fortsæt"
 }
diff --git a/resources/lib/oojs-ui/i18n/dty.json b/resources/lib/oojs-ui/i18n/dty.json
new file mode 100644 (file)
index 0000000..21742b6
--- /dev/null
@@ -0,0 +1,18 @@
+{
+       "@metadata": {
+               "authors": [
+                       "जनक राज भट्ट"
+               ]
+       },
+       "ooui-outline-control-move-down": "वस्तुलाई तल साददे",
+       "ooui-outline-control-move-up": "वस्तुलाई मथि साददे",
+       "ooui-outline-control-remove": "वस्तुलाई हटुन्या",
+       "ooui-toolbar-more": "झिक्क",
+       "ooui-toolgroup-expand": "झिक्क",
+       "ooui-toolgroup-collapse": "थोका",
+       "ooui-dialog-message-accept": "हुन्छ",
+       "ooui-dialog-message-reject": "रद्द",
+       "ooui-dialog-process-dismiss": "खारेज गद्दे",
+       "ooui-dialog-process-retry": "दोसरया प्रयास गर",
+       "ooui-dialog-process-continue": "जारी राख्या"
+}
index 6fb7dba..27f1996 100644 (file)
@@ -22,5 +22,7 @@
        "ooui-dialog-process-error": "Κάτι πήγε στραβά",
        "ooui-dialog-process-dismiss": "Απόρριψη",
        "ooui-dialog-process-retry": "Δοκιμάστε ξανά",
-       "ooui-dialog-process-continue": "Συνέχεια"
+       "ooui-dialog-process-continue": "Συνέχεια",
+       "ooui-selectfile-not-supported": "Επιλογή αρχείου δεν υποστηρίζεται",
+       "ooui-selectfile-placeholder": "Κανένα αρχείο δεν είναι επιλεγμένο"
 }
index 0f705ad..2ead5c5 100644 (file)
@@ -4,7 +4,8 @@
                        "Happy5214",
                        "KuboF",
                        "Shirayuki",
-                       "Yekrats"
+                       "Yekrats",
+                       "Kvardek du"
                ]
        },
        "ooui-outline-control-move-down": "Movi eron suben",
@@ -16,6 +17,9 @@
        "ooui-dialog-message-accept": "Bone",
        "ooui-dialog-message-reject": "Nuligi",
        "ooui-dialog-process-error": "Io rompiĝis",
+       "ooui-dialog-process-dismiss": "Elimini",
        "ooui-dialog-process-retry": "Reprovi",
-       "ooui-dialog-process-continue": "Daŭrigi"
+       "ooui-dialog-process-continue": "Daŭrigi",
+       "ooui-selectfile-not-supported": "Dosieroselekto ne estas subtenata.",
+       "ooui-selectfile-placeholder": "Vi ne selektis dosieron"
 }
index 6a212b6..e86f11e 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Avjoska",
-                       "Pikne"
+                       "Pikne",
+                       "Suwa"
                ]
        },
        "ooui-outline-control-move-down": "Liiguta üksust allapoole",
@@ -16,5 +17,7 @@
        "ooui-dialog-process-error": "Midagi läks valesti",
        "ooui-dialog-process-dismiss": "Hülga",
        "ooui-dialog-process-retry": "Proovi uuesti",
-       "ooui-dialog-process-continue": "Jätka"
+       "ooui-dialog-process-continue": "Jätka",
+       "ooui-selectfile-not-supported": "Faili valiku tugi puudub",
+       "ooui-selectfile-placeholder": "Faili ei ole valitud"
 }
index fe6e997..93c66c5 100644 (file)
@@ -20,5 +20,6 @@
        "ooui-dialog-process-dismiss": "Utzi",
        "ooui-dialog-process-retry": "Saiatu berriro",
        "ooui-dialog-process-continue": "Jarraitu",
+       "ooui-selectfile-not-supported": "Fitxategi aukeraketa ez da onartzen",
        "ooui-selectfile-placeholder": "Ez da fitxategirik hautatu"
 }
index 7cfcfa2..e20997a 100644 (file)
@@ -11,7 +11,9 @@
                        "Taha",
                        "درفش کاویانی",
                        "Armin1392",
-                       "Alirezaaa"
+                       "Alirezaaa",
+                       "Leyth",
+                       "الناز"
                ]
        },
        "ooui-outline-control-move-down": "انتقال مورد به پایین",
@@ -23,7 +25,9 @@
        "ooui-dialog-message-accept": "تأیید",
        "ooui-dialog-message-reject": "لغو",
        "ooui-dialog-process-error": "مشکلی وجود دارد",
-       "ooui-dialog-process-dismiss": "نپذیرفتن",
-       "ooui-dialog-process-retry": "دوباره امتحان کن",
-       "ooui-dialog-process-continue": "ادامه"
+       "ooui-dialog-process-dismiss": "رد",
+       "ooui-dialog-process-retry": "دوباره امتحان کنید",
+       "ooui-dialog-process-continue": "ادامه",
+       "ooui-selectfile-not-supported": "انتخاب پرونده پشتیبانی نمی‌شود",
+       "ooui-selectfile-placeholder": "هیچ پرونده‌ای انتخاب نشده است"
 }
index d00254c..c96a74e 100644 (file)
                        "Silvonen",
                        "Skalman",
                        "Stryn",
-                       "VezonThunder"
+                       "VezonThunder",
+                       "Alluk."
                ]
        },
        "ooui-outline-control-move-down": "Siirrä kohdetta alaspäin",
        "ooui-outline-control-move-up": "Siirrä kohdetta ylöspäin",
        "ooui-outline-control-remove": "Poista kohde",
        "ooui-toolbar-more": "Lisää",
-       "ooui-toolgroup-expand": "Enemmän",
-       "ooui-toolgroup-collapse": "Vähemmän",
+       "ooui-toolgroup-expand": "Näytä lisää",
+       "ooui-toolgroup-collapse": "Näytä vähemmän",
        "ooui-dialog-message-accept": "OK",
-       "ooui-dialog-message-reject": "Peruuta",
+       "ooui-dialog-message-reject": "Peru",
        "ooui-dialog-process-error": "Jokin meni pieleen",
        "ooui-dialog-process-dismiss": "Hylkää",
        "ooui-dialog-process-retry": "Yritä uudelleen",
index ae671cb..537f6b8 100644 (file)
                        "Verdy p",
                        "Wyz",
                        "SnowedEarth",
-                       "Jdforrester"
+                       "Jdforrester",
+                       "Wladek92",
+                       "Harmonia Amanda"
                ]
        },
-       "ooui-outline-control-move-down": "Faire descendre l’élément",
-       "ooui-outline-control-move-up": "Faire monter l’élément",
+       "ooui-outline-control-move-down": "Descendre l’élément",
+       "ooui-outline-control-move-up": "Monter l’élément",
        "ooui-outline-control-remove": "Supprimer l’élément",
        "ooui-toolbar-more": "Plus",
        "ooui-toolgroup-expand": "Plus",
        "ooui-toolgroup-collapse": "Moins",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Annuler",
-       "ooui-dialog-process-error": "Quelque chose a mal tourné",
+       "ooui-dialog-process-error": "Quelque chose s'est mal passé",
        "ooui-dialog-process-dismiss": "Rejeter",
-       "ooui-dialog-process-retry": "Réessayez",
+       "ooui-dialog-process-retry": "Réessayer",
        "ooui-dialog-process-continue": "Continuer",
        "ooui-selectfile-not-supported": "La sélection de fichier n’est pas prise en charge",
        "ooui-selectfile-placeholder": "Aucun fichier sélectionné"
index 3f02e19..5c48b9e 100644 (file)
@@ -4,7 +4,8 @@
                        "Ashok modhvadia",
                        "KartikMistry",
                        "The Discoverer",
-                       "NehalDaveND"
+                       "NehalDaveND",
+                       "Dsvyas"
                ]
        },
        "ooui-outline-control-move-down": "વસ્તુ નીચે ખસેડો",
        "ooui-outline-control-remove": "વસ્તુ હટાવો",
        "ooui-toolbar-more": "વધુ",
        "ooui-toolgroup-expand": "વધુ",
+       "ooui-toolgroup-collapse": "ઓછા",
        "ooui-dialog-message-accept": "બરાબર",
        "ooui-dialog-message-reject": "રદ કરો",
        "ooui-dialog-process-error": "કંઇક ગરબડ થઇ",
+       "ooui-dialog-process-dismiss": "વિસર્જન",
        "ooui-dialog-process-retry": "ફરી પ્રયત્ન કરો",
-       "ooui-dialog-process-continue": "ચાલુ રાખો"
+       "ooui-dialog-process-continue": "ચાલુ રાખો",
+       "ooui-selectfile-not-supported": "ફાઇલ પસંદગીની જોગવાઈ નથી",
+       "ooui-selectfile-placeholder": "કોઇ ફાઇલ પસંદ નથી કરાઈ"
 }
index ce86aaa..573096f 100644 (file)
@@ -6,7 +6,8 @@
                        "Rajesh",
                        "Siddhartha Ghai",
                        "Goelujjwal",
-                       "Ankita-ks"
+                       "Ankita-ks",
+                       "Param Mudgal"
                ]
        },
        "ooui-outline-control-move-down": "प्रविष्टि नीचे ले जाएँ",
@@ -20,5 +21,7 @@
        "ooui-dialog-process-error": "कुछ गलत हुअा है",
        "ooui-dialog-process-dismiss": "ख़ारिज करें",
        "ooui-dialog-process-retry": "पुनः प्रयास करें",
-       "ooui-dialog-process-continue": "जारी रखें"
+       "ooui-dialog-process-continue": "जारी रखें",
+       "ooui-selectfile-not-supported": "फ़ाइल का चयन समर्थित नहीं है",
+       "ooui-selectfile-placeholder": "कोई फाइल चुनी नही गई हेै"
 }
diff --git a/resources/lib/oojs-ui/i18n/hu-formal.json b/resources/lib/oojs-ui/i18n/hu-formal.json
new file mode 100644 (file)
index 0000000..34aa0ae
--- /dev/null
@@ -0,0 +1,21 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Misibacsi"
+               ]
+       },
+       "ooui-outline-control-move-down": "Elem mozgatása lefelé",
+       "ooui-outline-control-move-up": "Elem mozgatása felfelé",
+       "ooui-outline-control-remove": "Elem eltávolítása",
+       "ooui-toolbar-more": "Tovább...",
+       "ooui-toolgroup-expand": "Tovább",
+       "ooui-toolgroup-collapse": "Kevesebb",
+       "ooui-dialog-message-accept": "Rendben",
+       "ooui-dialog-message-reject": "Mégse",
+       "ooui-dialog-process-error": "Valami elromlott.",
+       "ooui-dialog-process-dismiss": "Mégse",
+       "ooui-dialog-process-retry": "Próbálja újra",
+       "ooui-dialog-process-continue": "Folytatás",
+       "ooui-selectfile-not-supported": "A fájl kiválasztása nincs támogatva",
+       "ooui-selectfile-placeholder": "Nincs fájl kiválasztva"
+}
index f0fae3c..acd9d3b 100644 (file)
@@ -6,19 +6,22 @@
                        "Misibacsi",
                        "ViDam",
                        "Tacsipacsi",
-                       "Csega"
+                       "Csega",
+                       "Kishajnalka"
                ]
        },
        "ooui-outline-control-move-down": "Elem mozgatása lefelé",
        "ooui-outline-control-move-up": "Elem mozgatása felfelé",
        "ooui-outline-control-remove": "Elem eltávolítása",
-       "ooui-toolbar-more": "Tovább...",
+       "ooui-toolbar-more": "Több",
        "ooui-toolgroup-expand": "Több",
        "ooui-toolgroup-collapse": "Kevesebb",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Mégse",
+       "ooui-dialog-process-error": "Valami elromlott",
        "ooui-dialog-process-dismiss": "Elrejt",
        "ooui-dialog-process-retry": "Próbáld újra",
        "ooui-dialog-process-continue": "Folytatás",
+       "ooui-selectfile-not-supported": "A fájl kiválasztása nincs támogatva",
        "ooui-selectfile-placeholder": "Nincs fájl kiválasztva"
 }
index 2aaf4e4..c2b45a8 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Vacio",
                        "Xelgen",
-                       "Դավիթ Սարոյան"
+                       "Դավիթ Սարոյան",
+                       "Vahe Gharakhanyan"
                ]
        },
        "ooui-outline-control-move-down": "Իջեցնել կետը",
@@ -17,5 +18,7 @@
        "ooui-dialog-process-error": "Ինչ-որ սխալ է տեղի ունեցել",
        "ooui-dialog-process-dismiss": "Փակել",
        "ooui-dialog-process-retry": "Կրկին փորձել",
-       "ooui-dialog-process-continue": "Շարունակել"
+       "ooui-dialog-process-continue": "Շարունակել",
+       "ooui-selectfile-not-supported": "Ֆայլի ընտրությունը չի պաշտպանվում",
+       "ooui-selectfile-placeholder": "Ֆայլն ընտրված չէ"
 }
index bd65e71..400a432 100644 (file)
@@ -22,5 +22,7 @@
        "ooui-dialog-process-error": "Ada yang tidak beres",
        "ooui-dialog-process-dismiss": "Tutup",
        "ooui-dialog-process-retry": "Coba lagi",
-       "ooui-dialog-process-continue": "Lanjutkan"
+       "ooui-dialog-process-continue": "Lanjutkan",
+       "ooui-selectfile-not-supported": "Peilihan berkas tidak didukung",
+       "ooui-selectfile-placeholder": "Tidak ada berkas yang terpilih"
 }
index ec86124..631b3f5 100644 (file)
@@ -20,5 +20,7 @@
        "ooui-dialog-process-error": "エラーが発生しました…",
        "ooui-dialog-process-dismiss": "閉じる",
        "ooui-dialog-process-retry": "もう一度お試しください",
-       "ooui-dialog-process-continue": "続行"
+       "ooui-dialog-process-continue": "続行",
+       "ooui-selectfile-not-supported": "ファイルの選択はサポートされていません",
+       "ooui-selectfile-placeholder": "ファイルが選択されていません"
 }
index 8827af3..677b1c3 100644 (file)
@@ -3,8 +3,22 @@
                "authors": [
                        "Gleki",
                        "NoiX180",
-                       "Pras"
+                       "Pras",
+                       "Jadinegara"
                ]
        },
-       "ooui-outline-control-move-down": "Pindhahaken butir mangandhap"
+       "ooui-outline-control-move-down": "Pindhahaken butir mangandhap",
+       "ooui-outline-control-move-up": "Pindhah kara mêndhuwur",
+       "ooui-outline-control-remove": "Busak kara",
+       "ooui-toolbar-more": "Mênèh",
+       "ooui-toolgroup-expand": "Mênèh",
+       "ooui-toolgroup-collapse": "Suda",
+       "ooui-dialog-message-accept": "Oké",
+       "ooui-dialog-message-reject": "Batal",
+       "ooui-dialog-process-error": "Ana sing klèru",
+       "ooui-dialog-process-dismiss": "Tutup",
+       "ooui-dialog-process-retry": "Jajal manèh",
+       "ooui-dialog-process-continue": "Tutug",
+       "ooui-selectfile-not-supported": "Pilihan bêrkas ora disokong",
+       "ooui-selectfile-placeholder": "Ora ana bêrkas sing kapilih"
 }
index 60ef661..efacb63 100644 (file)
@@ -22,5 +22,8 @@
        "ooui-dialog-process-error": "მოხდა რაღაც შეცდომა",
        "ooui-dialog-process-dismiss": "დამალვა",
        "ooui-dialog-process-retry": "კიდევ სცადეთ",
-       "ooui-dialog-process-continue": "გაგრძელება"
+       "ooui-dialog-process-continue": "გაგრძელება",
+       "ooui-selectfile-not-supported": "ფაილის არჩევა არ არის მხარდაჭერილი",
+       "ooui-selectfile-placeholder": "ფაილი არ არის არჩეული",
+       "ooui-semicolon-separator": ";"
 }
index 196dc2c..f23f687 100644 (file)
        "ooui-outline-control-remove": "항목 지우기",
        "ooui-toolbar-more": "더 보기",
        "ooui-toolgroup-expand": "더 보기",
+       "ooui-toolgroup-collapse": "덜 보기",
        "ooui-dialog-message-accept": "확인",
        "ooui-dialog-message-reject": "취소",
        "ooui-dialog-process-error": "무언가가 잘못되었습니다",
        "ooui-dialog-process-dismiss": "숨기기",
-       "ooui-dialog-process-retry": "다시 시도하세요"
+       "ooui-dialog-process-retry": "다시 시도하세요",
+       "ooui-dialog-process-continue": "계속",
+       "ooui-selectfile-not-supported": "파일 선택은 지원하지 않습니다",
+       "ooui-selectfile-placeholder": "선택한 파일 없음"
 }
diff --git a/resources/lib/oojs-ui/i18n/la.json b/resources/lib/oojs-ui/i18n/la.json
new file mode 100644 (file)
index 0000000..7a9b2d2
--- /dev/null
@@ -0,0 +1,15 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Jdforrester"
+               ]
+       },
+       "ooui-toolbar-more": "Plus",
+       "ooui-toolgroup-expand": "Plus",
+       "ooui-toolgroup-collapse": "Paucior",
+       "ooui-dialog-message-accept": "Assentior",
+       "ooui-dialog-message-reject": "Dimittere",
+       "ooui-dialog-process-dismiss": "Dimittere",
+       "ooui-dialog-process-retry": "Retemptare",
+       "ooui-dialog-process-continue": "Pergere"
+}
diff --git a/resources/lib/oojs-ui/i18n/li.json b/resources/lib/oojs-ui/i18n/li.json
new file mode 100644 (file)
index 0000000..f05a957
--- /dev/null
@@ -0,0 +1,21 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Pahles"
+               ]
+       },
+       "ooui-outline-control-move-down": "Item nao ónger verplaatse",
+       "ooui-outline-control-move-up": "Item nao bove verplaetse",
+       "ooui-outline-control-remove": "Item ewegsjaffe",
+       "ooui-toolbar-more": "Mieë",
+       "ooui-toolgroup-expand": "Mieë",
+       "ooui-toolgroup-collapse": "Minder",
+       "ooui-dialog-message-accept": "Ok",
+       "ooui-dialog-message-reject": "Aafbraeke",
+       "ooui-dialog-process-error": "Dao is get misgegange",
+       "ooui-dialog-process-dismiss": "Sjlete",
+       "ooui-dialog-process-retry": "Perbeer obbenuujts",
+       "ooui-dialog-process-continue": "Doorgaon",
+       "ooui-selectfile-not-supported": "Selektie van 'n besjtandj waert neet óngersteund",
+       "ooui-selectfile-placeholder": "Dao is gein besjtandj geselekteerd"
+}
index ecd06a8..4334efb 100644 (file)
@@ -3,8 +3,22 @@
                "authors": [
                        "Audriusa",
                        "Eitvys200",
-                       "Mantak111"
+                       "Mantak111",
+                       "Albertas"
                ]
        },
-       "ooui-outline-control-remove": "Šalinti elementus"
+       "ooui-outline-control-move-down": "Perkelti elementą žemyn",
+       "ooui-outline-control-move-up": "Perkelti elementą aukštyn",
+       "ooui-outline-control-remove": "Šalinti elementus",
+       "ooui-toolbar-more": "Daugiau",
+       "ooui-toolgroup-expand": "Daugiau",
+       "ooui-toolgroup-collapse": "Mažiau",
+       "ooui-dialog-message-accept": "Gerai",
+       "ooui-dialog-message-reject": "Atšaukti",
+       "ooui-dialog-process-error": "Kažkas nutiko ne taip",
+       "ooui-dialog-process-dismiss": "Paslėpti",
+       "ooui-dialog-process-retry": "Bandykite dar kartą",
+       "ooui-dialog-process-continue": "Tęsti",
+       "ooui-selectfile-not-supported": "Failų pasirinkimas nepalaikomas",
+       "ooui-selectfile-placeholder": "Nėra pasirinktų failų"
 }
index 0ce0c3f..326dd14 100644 (file)
@@ -9,5 +9,16 @@
        },
        "ooui-outline-control-move-down": "ഇനം താഴേയ്ക്ക് മാറ്റുക",
        "ooui-outline-control-move-up": "ഇനം മുകളിലേയ്ക്ക് മാറ്റുക",
-       "ooui-toolbar-more": "കൂടുതൽ"
+       "ooui-outline-control-remove": "ഇനം നീക്കംചെയ്യുക",
+       "ooui-toolbar-more": "കൂടുതൽ",
+       "ooui-toolgroup-expand": "കൂടുതൽ",
+       "ooui-toolgroup-collapse": "കുറച്ച്",
+       "ooui-dialog-message-accept": "ശരി",
+       "ooui-dialog-message-reject": "റദ്ദാക്കുക",
+       "ooui-dialog-process-error": "എന്തോ പ്രശ്നമുണ്ടായി",
+       "ooui-dialog-process-dismiss": "ഒഴിവാക്കുക",
+       "ooui-dialog-process-retry": "വീണ്ടും ശ്രമിക്കുക",
+       "ooui-dialog-process-continue": "തുടരുക",
+       "ooui-selectfile-not-supported": "പ്രമാണം തിരഞ്ഞെടുക്കൽ പിന്തുണയ്ക്കുന്നില്ല",
+       "ooui-selectfile-placeholder": "പ്രമാണങ്ങൾ ഒന്നും തിരഞ്ഞെടുത്തിട്ടില്ല"
 }
index 6bc94f1..15a5de3 100644 (file)
@@ -7,7 +7,8 @@
                        "V.narsikar",
                        "Ydyashad",
                        "संतोष दहिवळ",
-                       "NehalDaveND"
+                       "NehalDaveND",
+                       "Sau6402"
                ]
        },
        "ooui-outline-control-move-down": "घटक (आयटम) खाली सरकवा",
index 2be1122..19ce1c2 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Anakmalaysia",
                        "Aurora",
-                       "Pizza1016"
+                       "Pizza1016",
+                       "Karmadunya9-"
                ]
        },
        "ooui-outline-control-move-down": "Alihkan perkara ke bawah",
@@ -17,5 +18,7 @@
        "ooui-dialog-process-error": "Ada masalah",
        "ooui-dialog-process-dismiss": "Singkir",
        "ooui-dialog-process-retry": "Cuba lagi",
-       "ooui-dialog-process-continue": "Teruskan"
+       "ooui-dialog-process-continue": "Teruskan",
+       "ooui-selectfile-not-supported": "Pilihan fail tidak disokong",
+       "ooui-selectfile-placeholder": "Tiada fail yang dipilih"
 }
index 9e2d8f2..4efb02a 100644 (file)
@@ -22,5 +22,6 @@
        "ooui-dialog-process-dismiss": "Lukk",
        "ooui-dialog-process-retry": "Prøv igjen",
        "ooui-dialog-process-continue": "Fortsett",
+       "ooui-selectfile-not-supported": "Filvalg er ikke støttet",
        "ooui-selectfile-placeholder": "Ingen fil er valgt"
 }
index 8eba859..515eada 100644 (file)
@@ -32,5 +32,6 @@
        "ooui-dialog-process-dismiss": "Sluiten",
        "ooui-dialog-process-retry": "Opnieuw proberen",
        "ooui-dialog-process-continue": "Doorgaan",
+       "ooui-selectfile-not-supported": "Selectie van een bestand wordt niet ondersteund",
        "ooui-selectfile-placeholder": "Er is geen bestand geselecteerd"
 }
index 4d35b6c..bccd615 100644 (file)
@@ -9,5 +9,12 @@
        "ooui-outline-control-move-up": "Far montar l’element",
        "ooui-outline-control-remove": "Suprimir l’element",
        "ooui-toolbar-more": "Mai",
-       "ooui-dialog-message-reject": "Anullar"
+       "ooui-toolgroup-expand": "Mai",
+       "ooui-toolgroup-collapse": "Mens",
+       "ooui-dialog-message-accept": "D'acòrdi",
+       "ooui-dialog-message-reject": "Anullar",
+       "ooui-dialog-process-dismiss": "Regetar",
+       "ooui-dialog-process-retry": "Ensajatz tornamai",
+       "ooui-dialog-process-continue": "Contunhar",
+       "ooui-selectfile-placeholder": "Cap de fichièr pas seleccionat"
 }
index ecf9597..a61083b 100644 (file)
@@ -16,5 +16,7 @@
        "ooui-dialog-process-error": "Dogoggorri wayii ummameera",
        "ooui-dialog-process-dismiss": "Didi",
        "ooui-dialog-process-retry": "Itti deebi'ii yaali",
-       "ooui-dialog-process-continue": "Itti fufi"
+       "ooui-dialog-process-continue": "Itti fufi",
+       "ooui-selectfile-not-supported": "Faayilii filachuun hin danda'amu.",
+       "ooui-selectfile-placeholder": "Faayiliin wayiiyyuu hin filatamne"
 }
index dde49bf..7d96dcb 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Odisha1",
                        "Psubhashish",
-                       "ଶିତିକଣ୍ଠ ଦାଶ"
+                       "ଶିତିକଣ୍ଠ ଦାଶ",
+                       "Jnanaranjan Sahu"
                ]
        },
        "ooui-outline-control-move-down": "ବସ୍ତୁଟିକୁ ତଳକୁ ଘୁଞ୍ଚାନ୍ତୁ",
@@ -17,5 +18,7 @@
        "ooui-dialog-process-error": "ଅସୁବିଧାଟିଏ ଘଟିଲା",
        "ooui-dialog-process-dismiss": "ଖାରଜ",
        "ooui-dialog-process-retry": "ଆଉ ଥରେ ଚେଷ୍ଟା କରନ୍ତୁ",
-       "ooui-dialog-process-continue": "ଚାଲୁରଖିବେ"
+       "ooui-dialog-process-continue": "ଚାଲୁରଖିବେ",
+       "ooui-selectfile-not-supported": "ଫାଇଲ ବାଛିବା ସୁବିଧା ନାହିଁ",
+       "ooui-selectfile-placeholder": "କୌଣସି ଫାଇଲ ବଛାଯାଇନାହିଁ"
 }
index 8c7a1e7..0661b3f 100644 (file)
@@ -12,7 +12,7 @@
        "ooui-outline-control-move-up": "ਉੱਤੇ ਲੈਕੇ ਜਾਓ",
        "ooui-toolbar-more": "ਹੋਰ",
        "ooui-toolgroup-expand": "ਹੋਰ",
-       "ooui-toolgroup-collapse": "ਥੋੜੇ",
+       "ooui-toolgroup-collapse": "ਥà©\8bà©\9cà©\8dਹà©\87",
        "ooui-dialog-message-accept": "ਠੀਕ ਹੈ",
        "ooui-dialog-message-reject": "ਰੱਦ ਕਰੋ",
        "ooui-dialog-process-error": "ਕੁਝ ਗਲਤ ਹੋ ਗਿਆ",
index 3023479..81da6f5 100644 (file)
@@ -31,5 +31,6 @@
        "ooui-dialog-process-dismiss": "Ukryj",
        "ooui-dialog-process-retry": "Spróbuj ponownie",
        "ooui-dialog-process-continue": "Kontynuuj",
+       "ooui-selectfile-not-supported": "Wybór pliku nie jest obsługiwany",
        "ooui-selectfile-placeholder": "Nie wybrano pliku"
 }
index b8fd3a5..c8b5bc7 100644 (file)
@@ -8,5 +8,16 @@
        },
        "ooui-outline-control-move-down": "Fé calé giù l'element",
        "ooui-outline-control-move-up": "Fé monté l'element",
-       "ooui-toolbar-more": "Ëd pi"
+       "ooui-outline-control-remove": "Gavé j'element",
+       "ooui-toolbar-more": "Ëd pi",
+       "ooui-toolgroup-expand": "Pi",
+       "ooui-toolgroup-collapse": "Men",
+       "ooui-dialog-message-accept": "Va bin",
+       "ooui-dialog-message-reject": "Scancelé",
+       "ooui-dialog-process-error": "Quaicòs a l'é andà mal",
+       "ooui-dialog-process-dismiss": "Stërmé",
+       "ooui-dialog-process-retry": "Preuva torna",
+       "ooui-dialog-process-continue": "Continua",
+       "ooui-selectfile-not-supported": "La selession d'archivi a l'é nen mantnùa",
+       "ooui-selectfile-placeholder": "Gnun archivi selessionà"
 }
index ebffe53..c371bbc 100644 (file)
@@ -14,5 +14,8 @@
        "ooui-dialog-message-reject": "ناگارل",
        "ooui-dialog-process-error": "يوه ستونزه رامنځ ته شوه",
        "ooui-dialog-process-dismiss": "تړل",
-       "ooui-dialog-process-retry": "بيا هڅه"
+       "ooui-dialog-process-retry": "بيا هڅه",
+       "ooui-dialog-process-continue": "پرله پورې",
+       "ooui-selectfile-not-supported": "د دوتنې د ټاکنې ملاتړ نه دی شوی",
+       "ooui-selectfile-placeholder": "کومه دوتنه نه ده ټاکل شوې"
 }
index 94ea089..bcc31e0 100644 (file)
@@ -9,10 +9,23 @@
                        "Jaideraf",
                        "Luckas",
                        "OTAVIO1981",
-                       555
+                       555,
+                       "TheEduGobi",
+                       "TheGabrielZaum"
                ]
        },
        "ooui-outline-control-move-down": "Mover item para baixo",
        "ooui-outline-control-move-up": "Mover item para cima",
-       "ooui-toolbar-more": "Mais"
+       "ooui-outline-control-remove": "Remover item",
+       "ooui-toolbar-more": "Mais",
+       "ooui-toolgroup-expand": "Mais",
+       "ooui-toolgroup-collapse": "Menos",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Cancelar",
+       "ooui-dialog-process-error": "Algo deu errado",
+       "ooui-dialog-process-dismiss": "Dispensar",
+       "ooui-dialog-process-retry": "Tentar novamente",
+       "ooui-dialog-process-continue": "Continuar",
+       "ooui-selectfile-not-supported": "O selecionamento de arquivos não é suportado",
+       "ooui-selectfile-placeholder": "Nenhum arquivo selecionado"
 }
index 129dd6a..7435416 100644 (file)
@@ -16,7 +16,8 @@
                        "Sunpriat",
                        "Yury Katkov",
                        "Умар",
-                       "Камалист"
+                       "Камалист",
+                       "Meshkov.a"
                ]
        },
        "ooui-outline-control-move-down": "Переместить элемент вниз",
@@ -30,5 +31,7 @@
        "ooui-dialog-process-error": "Что-то пошло не так",
        "ooui-dialog-process-dismiss": "Закрыть",
        "ooui-dialog-process-retry": "Попробовать ещё раз",
-       "ooui-dialog-process-continue": "Продолжить"
+       "ooui-dialog-process-continue": "Продолжить",
+       "ooui-selectfile-not-supported": "Выбор файла не поддерживается",
+       "ooui-selectfile-placeholder": "Не выбран файл"
 }
index 85a94cd..1e1b05d 100644 (file)
@@ -4,5 +4,19 @@
                        "Gazeb",
                        "HalanTul"
                ]
-       }
+       },
+       "ooui-outline-control-move-down": "Аллара түһэрэн биэр",
+       "ooui-outline-control-move-up": "Үөһэ таһааран биэр",
+       "ooui-outline-control-remove": "Сот",
+       "ooui-toolbar-more": "Эбии",
+       "ooui-toolgroup-expand": "Эбии",
+       "ooui-toolgroup-collapse": "Кыччат",
+       "ooui-dialog-message-accept": "Сөп",
+       "ooui-dialog-message-reject": "Салҕаама",
+       "ooui-dialog-process-error": "Туга эрэ сатаммата",
+       "ooui-dialog-process-dismiss": "Сап",
+       "ooui-dialog-process-retry": "Хатылаан көр",
+       "ooui-dialog-process-continue": "Салгыы",
+       "ooui-selectfile-not-supported": "Билэни талыы өйөммөт",
+       "ooui-selectfile-placeholder": "Биир да билэ талыллыбатах"
 }
index 0a26a5c..794d71f 100644 (file)
@@ -1,11 +1,22 @@
 {
        "@metadata": {
                "authors": [
-                       "John Reid"
+                       "John Reid",
+                       "Foxj"
                ]
        },
        "ooui-outline-control-move-down": "Muiv eetem doon",
        "ooui-outline-control-move-up": "Muiv eetem up",
        "ooui-outline-control-remove": "Remuiv eetem",
-       "ooui-toolbar-more": "Mair"
+       "ooui-toolbar-more": "Mair",
+       "ooui-toolgroup-expand": "Mair",
+       "ooui-toolgroup-collapse": "Less",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Cancel",
+       "ooui-dialog-process-error": "Sommit went wrang",
+       "ooui-dialog-process-dismiss": "Close",
+       "ooui-dialog-process-retry": "Hae aniter gae",
+       "ooui-dialog-process-continue": "Conteena",
+       "ooui-selectfile-not-supported": "Cannae pick ony files",
+       "ooui-selectfile-placeholder": "Nae file selectit"
 }
index b40fa04..db6fa3c 100644 (file)
@@ -5,5 +5,17 @@
                ]
        },
        "ooui-outline-control-move-down": "Pomakni stavku dolje",
-       "ooui-outline-control-move-up": "Pomakni stavku gore"
+       "ooui-outline-control-move-up": "Premjesti stavku gore",
+       "ooui-outline-control-remove": "Ukloni stavku",
+       "ooui-toolbar-more": "Više",
+       "ooui-toolgroup-expand": "Više",
+       "ooui-toolgroup-collapse": "Manje",
+       "ooui-dialog-message-accept": "U redu",
+       "ooui-dialog-message-reject": "Otkaži",
+       "ooui-dialog-process-error": "Nešto je pošlo naopako",
+       "ooui-dialog-process-dismiss": "Odbaci",
+       "ooui-dialog-process-retry": "Pokušajte ponovo",
+       "ooui-dialog-process-continue": "Nastavi",
+       "ooui-selectfile-not-supported": "Izbor datoteke nije podržan",
+       "ooui-selectfile-placeholder": "Nijedna datoteka nije odabrana"
 }
index c8246da..fa65888 100644 (file)
@@ -2,11 +2,21 @@
        "@metadata": {
                "authors": [
                        "Mimarik",
-                       "Teslaton"
+                       "Teslaton",
+                       "Kusavica"
                ]
        },
        "ooui-outline-control-move-down": "Posunúť položku nadol",
        "ooui-outline-control-move-up": "Posunúť položku nahor",
        "ooui-outline-control-remove": "Odstrániť položku",
-       "ooui-toolbar-more": "Viac"
+       "ooui-toolbar-more": "Viac",
+       "ooui-toolgroup-expand": "Viac",
+       "ooui-toolgroup-collapse": "Menej",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Zrušiť",
+       "ooui-dialog-process-error": "Niečo sa pokazilo",
+       "ooui-dialog-process-dismiss": "Zrušiť",
+       "ooui-dialog-process-retry": "Skúsiť znova",
+       "ooui-dialog-process-continue": "Pokračovať",
+       "ooui-selectfile-placeholder": "Nie je vybraný žiadny súbor"
 }
index a40728a..e113671 100644 (file)
@@ -18,5 +18,7 @@
        "ooui-dialog-process-error": "Nekaj je šlo narobe",
        "ooui-dialog-process-dismiss": "Skrij",
        "ooui-dialog-process-retry": "Poskusi znova",
-       "ooui-dialog-process-continue": "Nadaljuj"
+       "ooui-dialog-process-continue": "Nadaljuj",
+       "ooui-selectfile-not-supported": "Izbira datoteke ni podprta",
+       "ooui-selectfile-placeholder": "Nobena datoteka ni izbrana"
 }
index ec18019..4bf5dac 100644 (file)
@@ -5,15 +5,22 @@
                        "Kushtrim",
                        "Elioqoshi",
                        "GretaDoci",
-                       "Gertakapllani"
+                       "Gertakapllani",
+                       "Techlik"
                ]
        },
        "ooui-outline-control-move-down": "Zhvendose artikullin më poshtë",
        "ooui-outline-control-move-up": "Zhvendose artikullin më lart",
        "ooui-outline-control-remove": "Hiq artikullin",
        "ooui-toolbar-more": "Më tepër...",
+       "ooui-toolgroup-expand": "Më tepër...",
+       "ooui-toolgroup-collapse": "Më pak",
        "ooui-dialog-message-accept": "Në rregull",
        "ooui-dialog-message-reject": "Anullo",
        "ooui-dialog-process-error": "Diçka shkoi keq",
-       "ooui-dialog-process-retry": "Provo përsëri"
+       "ooui-dialog-process-dismiss": "Largoje",
+       "ooui-dialog-process-retry": "Provo përsëri",
+       "ooui-dialog-process-continue": "Vazhdo",
+       "ooui-selectfile-not-supported": "Skedari i përzgjedhur nuk përkrahet",
+       "ooui-selectfile-placeholder": "Nuk është zgjedhur asnjë skedar"
 }
index c2422ba..9cd8ea3 100644 (file)
@@ -11,7 +11,8 @@
                        "Sendelbach",
                        "Skalman",
                        "WikiPhoenix",
-                       "Lokal Profil"
+                       "Lokal Profil",
+                       "Warrakkk"
                ]
        },
        "ooui-outline-control-move-down": "Flytta ned objekt",
@@ -26,5 +27,6 @@
        "ooui-dialog-process-dismiss": "Stäng",
        "ooui-dialog-process-retry": "Försök igen",
        "ooui-dialog-process-continue": "Fortsätt",
+       "ooui-selectfile-not-supported": "Filval stöds inte",
        "ooui-selectfile-placeholder": "Ingen fil är vald"
 }
index 122d4a2..6e7b249 100644 (file)
@@ -5,9 +5,22 @@
                        "Sank",
                        "Shanmugamp7",
                        "மதனாஹரன்",
-                       "ElangoRamanujam"
+                       "ElangoRamanujam",
+                       "Info-farmer"
                ]
        },
+       "ooui-outline-control-move-down": "உருப்படியை கீழிடு",
+       "ooui-outline-control-move-up": "உருப்படியை மேலிடு",
+       "ooui-outline-control-remove": "உருப்படியை நீக்கு",
+       "ooui-toolbar-more": "மேலும்",
        "ooui-toolgroup-expand": "மேலும்",
-       "ooui-dialog-process-continue": "தொடரவும்"
+       "ooui-toolgroup-collapse": "குறைவாக",
+       "ooui-dialog-message-accept": "சரி",
+       "ooui-dialog-message-reject": "கைவிடுக",
+       "ooui-dialog-process-error": "ஏதோ தவறாகியுள்ளது",
+       "ooui-dialog-process-dismiss": "அகற்று",
+       "ooui-dialog-process-retry": "மீண்டும் முயல்க",
+       "ooui-dialog-process-continue": "தொடரவும்",
+       "ooui-selectfile-not-supported": "கோப்புத்தேர்வு ஆதரவாக இல்லை",
+       "ooui-selectfile-placeholder": "எக்கோப்பும் தெரிவாகவில்லை"
 }
index b3a9f24..c0dbd5f 100644 (file)
@@ -2,13 +2,22 @@
        "@metadata": {
                "authors": [
                        "AnakngAraw",
-                       "Sky Harbor"
+                       "Sky Harbor",
+                       "Jewel457"
                ]
        },
        "ooui-outline-control-move-down": "Ilipat ang aytem pababa",
        "ooui-outline-control-move-up": "Ilipat ang aytem pataas",
        "ooui-outline-control-remove": "Tanggalin ang aytem",
        "ooui-toolbar-more": "Marami pa",
+       "ooui-toolgroup-expand": "Maraming iba pa",
+       "ooui-toolgroup-collapse": "Kakaunti",
        "ooui-dialog-message-accept": "Sige",
-       "ooui-dialog-message-reject": "Huwag ituloy"
+       "ooui-dialog-message-reject": "Huwag ituloy",
+       "ooui-dialog-process-error": "May pagkakamali",
+       "ooui-dialog-process-dismiss": "Isa-isantabi",
+       "ooui-dialog-process-retry": "Subuking muli",
+       "ooui-dialog-process-continue": "Magpatuloy",
+       "ooui-selectfile-not-supported": "Ang pagpili ng file ay hindi kinakatigan",
+       "ooui-selectfile-placeholder": "Walang piniling file"
 }
index 0197a4c..9e0b977 100644 (file)
@@ -15,7 +15,8 @@
                        "Tel'et",
                        "Tifinaghes",
                        "Ата",
-                       "Piramidion"
+                       "Piramidion",
+                       "A1"
                ]
        },
        "ooui-outline-control-move-down": "Перемістити елемент униз",
@@ -29,5 +30,7 @@
        "ooui-dialog-process-error": "Щось пішло не так",
        "ooui-dialog-process-dismiss": "Приховати",
        "ooui-dialog-process-retry": "Спробуйте ще раз",
-       "ooui-dialog-process-continue": "Продовжити"
+       "ooui-dialog-process-continue": "Продовжити",
+       "ooui-selectfile-not-supported": "Вибір файлу не підтримується",
+       "ooui-selectfile-placeholder": "Жодного файлу не вибрано"
 }
index d5c1e36..d62e3cb 100644 (file)
@@ -4,19 +4,22 @@
                        "Cheers!",
                        "Jdforrester",
                        "Minh Nguyen",
-                       "Max20091"
+                       "Max20091",
+                       "Anh88"
                ]
        },
        "ooui-outline-control-move-down": "Chuyển mục xuống",
        "ooui-outline-control-move-up": "Chuyển mục lên",
-       "ooui-outline-control-remove": "Xóa khoản",
+       "ooui-outline-control-remove": "Xóa mục",
        "ooui-toolbar-more": "Thêm",
        "ooui-toolgroup-expand": "Mở rộng",
        "ooui-toolgroup-collapse": "Rút gọn",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Hủy bỏ",
-       "ooui-dialog-process-error": "Đã bị trục trặc",
+       "ooui-dialog-process-error": "Có thứ gì đó bị lỗi",
        "ooui-dialog-process-dismiss": "Bỏ qua",
        "ooui-dialog-process-retry": "Thử lại",
-       "ooui-dialog-process-continue": "Tiếp tục"
+       "ooui-dialog-process-continue": "Tiếp tục",
+       "ooui-selectfile-not-supported": "Tệp tin được chọn không được hỗ trợ",
+       "ooui-selectfile-placeholder": "Không có Tệp tin nào được chọn"
 }
index a850fce..f206a72 100644 (file)
        "ooui-outline-control-move-up": "רוקן עלעמענט ארויף",
        "ooui-outline-control-remove": "אַראָפנעמען איינס",
        "ooui-toolbar-more": "נאך",
+       "ooui-toolgroup-expand": "נאך",
+       "ooui-toolgroup-collapse": "ווייניגער",
        "ooui-dialog-message-accept": "יאָ",
        "ooui-dialog-message-reject": "אַנולירן",
        "ooui-dialog-process-error": "עפעס איז דורכגעפאלן",
        "ooui-dialog-process-dismiss": "צומאַכן",
-       "ooui-dialog-process-retry": "פרובירט נאכאמאל"
+       "ooui-dialog-process-retry": "פרובירט נאכאמאל",
+       "ooui-dialog-process-continue": "פֿארזעצן",
+       "ooui-selectfile-not-supported": "טעקע אויסווייל נישט געשטיצט",
+       "ooui-selectfile-placeholder": "קיין טעקע נישט אויסגעוויילט"
 }
index d328e6e..7d4e710 100644 (file)
@@ -2,13 +2,14 @@
        "@metadata": {
                "authors": [
                        "Deryck Chan",
-                       "William915"
+                       "William915",
+                       "Shinjiman"
                ]
        },
        "ooui-outline-control-move-down": "向下搬",
        "ooui-outline-control-move-up": "向上搬",
        "ooui-outline-control-remove": "拎走",
-       "ooui-toolbar-more": "仲有...",
+       "ooui-toolbar-more": "仲有",
        "ooui-toolgroup-expand": "更多",
        "ooui-dialog-message-accept": "好",
        "ooui-dialog-message-reject": "取消",
index 3f59200..195bb3a 100644 (file)
@@ -31,5 +31,5 @@
        "ooui-dialog-process-retry": "再試一次",
        "ooui-dialog-process-continue": "繼續",
        "ooui-selectfile-not-supported": "無法支援所選擇的檔案",
-       "ooui-selectfile-placeholder": "æ²\92æ\9c\89選擇檔案"
+       "ooui-selectfile-placeholder": "æ\9cª選擇檔案"
 }
index 37c88af..d9a8314 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.11.7
+ * OOjs UI v0.12.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2015 OOjs Team and other contributors.
+ * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-07-01T19:04:35Z
+ * Date: 2015-07-22T19:37:14Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
        z-index: 1;
        width: 100%;
 }
+.oo-ui-pendingElement-pending {
+       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
+}
 .oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous > .oo-ui-panelLayout-scrollable {
        overflow-y: hidden;
 }
        border-radius: 0.5em;
        box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
 }
+.oo-ui-panelLayout-padded.oo-ui-panelLayout-framed {
+       margin: 1em 0;
+}
 .oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
        display: block;
        position: relative;
            -ms-user-select: none;
                user-select: none;
 }
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
        float: right;
 }
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
        float: left;
        cursor: default;
 }
 .oo-ui-popupWidget-head {
        height: 2.5em;
 }
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
        margin: 0.25em;
 }
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
        margin: 0.75em 1em;
 }
 .oo-ui-popupWidget-body-padded {
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
+.oo-ui-textInputWidget input[type="search"] {
+       -webkit-appearance: none;
+}
+.oo-ui-textInputWidget input[type="search"]::-ms-clear {
+       display: none;
+}
+.oo-ui-textInputWidget input[type="search"]::-ms-reveal {
+       display: none;
+}
+.oo-ui-textInputWidget input[type="search"]::-webkit-search-decoration,
+.oo-ui-textInputWidget input[type="search"]::-webkit-search-cancel-button,
+.oo-ui-textInputWidget input[type="search"]::-webkit-search-results-button,
+.oo-ui-textInputWidget input[type="search"]::-webkit-search-results-decoration {
+       display: none;
+}
 .oo-ui-textInputWidget > .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
 .oo-ui-textInputWidget > .oo-ui-labelElement-label {
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
+       cursor: text;
+}
+.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-textInputWidget-type-search > .oo-ui-indicatorElement-indicator {
        cursor: pointer;
 }
 .oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
             -o-transition: border-color 200ms, box-shadow 200ms;
                transition: border-color 200ms, box-shadow 200ms;
 }
+.oo-ui-textInputWidget input.oo-ui-pendingElement-pending,
+.oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
+       background-color: transparent;
+}
 .oo-ui-textInputWidget-decorated input,
 .oo-ui-textInputWidget-decorated textarea {
        padding-left: 2em;
        color: #dddddd;
        text-shadow: 0 1px 1px #ffffff;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
        padding-left: 2em;
        z-index: 1;
        width: 100%;
 }
+.oo-ui-comboBoxWidget > .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
+       cursor: pointer;
+}
 .oo-ui-comboBoxWidget:last-child {
        margin-right: 0;
 }
 .oo-ui-processDialog-content .oo-ui-window-head {
        height: 3.4em;
 }
-.oo-ui-processDialog-content .oo-ui-window-head.oo-ui-pendingElement-pending {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
 .oo-ui-processDialog-content .oo-ui-window-body {
        top: 3.4em;
        box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
index a9756a1..f5d2ea7 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.11.7
+ * OOjs UI v0.12.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2015 OOjs Team and other contributors.
+ * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-07-01T19:04:28Z
+ * Date: 2015-07-22T19:37:07Z
  */
 /**
  * @class
index 30b58e6..d539219 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.11.7
+ * OOjs UI v0.12.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2015 OOjs Team and other contributors.
+ * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-07-01T19:04:35Z
+ * Date: 2015-07-22T19:37:14Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
        width: 1.875em;
        height: 1.875em;
 }
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ) > .oo-ui-buttonElement-button:focus {
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
        box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(0, 0, 0, 0.2);
        outline: none;
 }
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ) > .oo-ui-buttonElement-button .oo-ui-indicatorElement-indicator {
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button .oo-ui-indicatorElement-indicator {
        margin-right: 0;
 }
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        margin-left: 0.25em;
        margin-right: 0.25em;
 }
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ) > input.oo-ui-buttonElement-button {
+.oo-ui-buttonElement-frameless > input.oo-ui-buttonElement-button {
        padding-left: 0.25em;
        padding-right: 0.25em;
        color: #333333;
 }
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-enabled > input.oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > input.oo-ui-buttonElement-button,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #555555;
 }
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-enabled.oo-ui-buttonElement-pressed > input.oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > input.oo-ui-buttonElement-button,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #444444;
 }
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
        color: #347bff;
 }
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #777777;
 }
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #1f4999;
        box-shadow: none;
 }
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
        color: #00af89;
 }
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #777777;
 }
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #005946;
        box-shadow: none;
 }
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
        color: #d11d13;
 }
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #777777;
 }
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #73100a;
        box-shadow: none;
 }
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
        color: #cccccc;
 }
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
-.oo-ui-buttonElement-frameless:not( .oo-ui-flaggedElement-primary ).oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
        margin: 0.1em 0;
        padding: 0.2em 0.8em;
        border-radius: 2px;
-}
-.oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       line-height: 1.875em;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-       border: 1px solid #dddddd;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
-       border: 1px solid #cdcdcd;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button {
        -webkit-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
           -moz-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
            -ms-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
                transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus {
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
        outline: none;
 }
-.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+.oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       line-height: 1.875em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
        margin-left: -0.5em;
        margin-right: -0.5em;
 }
-.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
        margin-right: 0.3em;
 }
-.oo-ui-buttonElement-framed.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
        /* -0.5 - 0.475 */
        margin-left: -0.005em;
        margin-right: -0.005em;
 }
 .oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-indicatorElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-iconElement:not( .oo-ui-labelElement ) > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-indicatorElement.oo-ui-iconElement:not( .oo-ui-labelElement ) > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-iconElement:not( .oo-ui-labelElement ) > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
        margin-left: 0.46875em;
        margin-right: -0.275em;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
        color: #ffffff;
        background: #dddddd;
+       border: 1px solid #dddddd;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
        color: #555555;
        background-color: #ffffff;
+       border: 1px solid #cdcdcd;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover {
        background-color: #ebebeb;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
        box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2);
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        background-color: #d9d9d9;
        border-color: #d9d9d9;
        box-shadow: none;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
        background-color: #999999;
        color: #ffffff;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
        color: #347bff;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover {
        background-color: rgba(52, 123, 255, 0.1);
        border-color: rgba(31, 73, 153, 0.5);
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus {
        box-shadow: inset 0 0 0 1px #1f4999;
        border-color: #1f4999;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        color: #1f4999;
        border-color: #1f4999;
        box-shadow: none;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
        background-color: #999999;
        color: #ffffff;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
        color: #00af89;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover {
        background-color: rgba(0, 171, 137, 0.1);
        border-color: rgba(0, 89, 70, 0.5);
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
        box-shadow: inset 0 0 0 1px #005946;
        border-color: #005946;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        color: #005946;
        border-color: #005946;
        box-shadow: none;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
        background-color: #999999;
        color: #ffffff;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
        color: #d11d13;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover {
        background-color: rgba(209, 29, 19, 0.1);
        border-color: rgba(115, 16, 10, 0.5);
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
        box-shadow: inset 0 0 0 1px #73100a;
        border-color: #73100a;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        color: #73100a;
        border-color: #73100a;
        box-shadow: none;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
        background-color: #999999;
        color: #ffffff;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
        color: #ffffff;
        background-color: #347bff;
        border-color: #347bff;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover {
        background: #2962cc;
        border-color: #2962cc;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus {
        box-shadow: inset 0 0 0 1px #ffffff;
        border-color: #347bff;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        color: #ffffff;
        background-color: #1f4999;
        border-color: #1f4999;
        box-shadow: none;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
        background-color: #999999;
        color: #ffffff;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
        color: #ffffff;
        background-color: #00af89;
        border-color: #00af89;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover {
        background: #008064;
        border-color: #008064;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
        box-shadow: inset 0 0 0 1px #ffffff;
        border-color: #00af89;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        color: #ffffff;
        background-color: #005946;
        border-color: #005946;
        box-shadow: none;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
        background-color: #999999;
        color: #ffffff;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
        color: #ffffff;
        background-color: #d11d13;
        border-color: #d11d13;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover {
        background: #8c130d;
        border-color: #8c130d;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
        box-shadow: inset 0 0 0 1px #ffffff;
        border-color: #d11d13;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        color: #ffffff;
        background-color: #73100a;
        border-color: #73100a;
        box-shadow: none;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
        background-color: #999999;
        color: #ffffff;
 }
        z-index: 1;
        width: 100%;
 }
+.oo-ui-pendingElement-pending {
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
 .oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous > .oo-ui-panelLayout-scrollable {
        overflow-y: hidden;
 }
        border-radius: 0.2em;
        box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
 }
+.oo-ui-panelLayout-padded.oo-ui-panelLayout-framed {
+       margin: 1em 0;
+}
 .oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
        display: block;
        position: relative;
 }
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
        padding-left: 0.5em;
-       color: #000000;
+       color: #555555;
 }
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel,
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
        background: none;
        box-shadow: none;
 }
-.oo-ui-toolbar-actions > .oo-ui-buttonElement-framed,
-.oo-ui-toolbar-actions > .oo-ui-buttonElement-framed:last-child {
-       margin-top: 0.25em;
-       margin-bottom: 0.25em;
-       margin-right: 0.5em;
-}
-.oo-ui-toolbar-actions > .oo-ui-buttonElement-frameless.oo-ui-labelElement {
+.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-labelElement {
        margin: 0;
 }
-.oo-ui-toolbar-actions > .oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button {
+.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button {
+       border: 0;
+       border-radius: 0;
+       margin: 0;
        padding: 1.0546875em 0.3125em;
 }
-.oo-ui-toolbar-actions > .oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        margin: 0 1em;
+       line-height: inherit;
 }
 .oo-ui-optionWidget {
        position: relative;
 .oo-ui-progressBarWidget.oo-ui-widget-disabled {
        opacity: 0.6;
 }
-.oo-ui-actionWidget.oo-ui-pendingElement-pending {
-       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
-}
 .oo-ui-popupWidget {
        position: absolute;
        /* @noflip */
            -ms-user-select: none;
                user-select: none;
 }
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
        float: right;
 }
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
        float: left;
        cursor: default;
 }
 .oo-ui-popupWidget-head {
        height: 2.5em;
 }
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
        margin: 0.25em;
 }
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
        margin: 0.75em 1em;
 }
 .oo-ui-popupWidget-body-padded {
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
+.oo-ui-textInputWidget input[type="search"] {
+       -webkit-appearance: none;
+}
+.oo-ui-textInputWidget input[type="search"]::-ms-clear {
+       display: none;
+}
+.oo-ui-textInputWidget input[type="search"]::-ms-reveal {
+       display: none;
+}
+.oo-ui-textInputWidget input[type="search"]::-webkit-search-decoration,
+.oo-ui-textInputWidget input[type="search"]::-webkit-search-cancel-button,
+.oo-ui-textInputWidget input[type="search"]::-webkit-search-results-button,
+.oo-ui-textInputWidget input[type="search"]::-webkit-search-results-decoration {
+       display: none;
+}
 .oo-ui-textInputWidget > .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
 .oo-ui-textInputWidget > .oo-ui-labelElement-label {
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
+       cursor: text;
+}
+.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-textInputWidget-type-search > .oo-ui-indicatorElement-indicator {
        cursor: pointer;
 }
 .oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
+.oo-ui-textInputWidget input.oo-ui-pendingElement-pending,
+.oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
+       background-color: transparent;
+}
 .oo-ui-textInputWidget-decorated input,
 .oo-ui-textInputWidget-decorated textarea {
        padding-left: 2em;
        color: #dddddd;
        text-shadow: 0 1px 1px #ffffff;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
-       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
-}
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
        padding-left: 2.75em;
        z-index: 1;
        width: 100%;
 }
+.oo-ui-comboBoxWidget > .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
+       cursor: pointer;
+}
 .oo-ui-comboBoxWidget:last-child {
        margin-right: 0;
 }
 .oo-ui-processDialog-content .oo-ui-window-head {
        height: 3.4em;
 }
-.oo-ui-processDialog-content .oo-ui-window-head.oo-ui-pendingElement-pending {
-       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
-}
 .oo-ui-processDialog-content .oo-ui-window-body {
        top: 3.4em;
        outline: 1px solid rgba(0, 0, 0, 0.2);
index b20b5c9..b73f751 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.11.7
+ * OOjs UI v0.12.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2015 OOjs Team and other contributors.
+ * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-07-01T19:04:28Z
+ * Date: 2015-07-22T19:37:07Z
  */
 /**
  * @class
index b53a88e..96c3204 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.11.7
+ * OOjs UI v0.12.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2015 OOjs Team and other contributors.
+ * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-07-01T19:04:28Z
+ * Date: 2015-07-22T19:37:07Z
  */
 ( function ( OO ) {
 
@@ -1097,7 +1097,7 @@ OO.ui.Element.static.infuse = function ( idOrNode ) {
  */
 OO.ui.Element.static.unsafeInfuse = function ( idOrNode, top ) {
        // look for a cached result of a previous infusion.
-       var id, $elem, data, cls, obj;
+       var id, $elem, data, cls, parts, parent, obj;
        if ( typeof idOrNode === 'string' ) {
                id = idOrNode;
                $elem = $( document.getElementById( id ) );
@@ -1132,10 +1132,33 @@ OO.ui.Element.static.unsafeInfuse = function ( idOrNode, top ) {
                // Special case: this is a raw Tag; wrap existing node, don't rebuild.
                return new OO.ui.Element( { $element: $elem } );
        }
-       cls = OO.ui[data._];
-       if ( !cls ) {
-               throw new Error( 'Unknown widget type: ' + id );
+       parts = data._.split( '.' );
+       cls = OO.getProp.apply( OO, [ window ].concat( parts ) );
+       if ( cls === undefined ) {
+               // The PHP output might be old and not including the "OO.ui" prefix
+               // TODO: Remove this back-compat after next major release
+               cls = OO.getProp.apply( OO, [ OO.ui ].concat( parts ) );
+               if ( cls === undefined ) {
+                       throw new Error( 'Unknown widget type: id: ' + id + ', class: ' + data._ );
+               }
+       }
+
+       // Verify that we're creating an OO.ui.Element instance
+       parent = cls.parent;
+
+       while ( parent !== undefined ) {
+               if ( parent === OO.ui.Element ) {
+                       // Safe
+                       break;
+               }
+
+               parent = parent.parent;
        }
+
+       if ( parent !== OO.ui.Element ) {
+               throw new Error( 'Unknown widget type: id: ' + id + ', class: ' + data._ );
+       }
+
        $elem.data( 'ooui-infused', true ); // prevent loops
        data.id = id; // implicit
        data = OO.copy( data, null, function deserialize( value ) {
@@ -1436,11 +1459,12 @@ OO.ui.Element.static.getRootScrollableElement = function ( el ) {
  */
 OO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension ) {
        var i, val,
-               props = [ 'overflow' ],
+               // props = [ 'overflow' ] doesn't work due to https://bugzilla.mozilla.org/show_bug.cgi?id=889091
+               props = [ 'overflow-x', 'overflow-y' ],
                $parent = $( el ).parent();
 
        if ( dimension === 'x' || dimension === 'y' ) {
-               props.push( 'overflow-' + dimension );
+               props = [ 'overflow-' + dimension ];
        }
 
        while ( $parent.length ) {
@@ -2152,7 +2176,7 @@ OO.ui.Window.prototype.getBodyHeight = function () {
  * @return {string} Directionality: `'ltr'` or `'rtl'`
  */
 OO.ui.Window.prototype.getDir = function () {
-       return this.dir;
+       return OO.ui.Element.static.getDir( this.$content ) || 'ltr';
 };
 
 /**
@@ -2347,7 +2371,6 @@ OO.ui.Window.prototype.initialize = function () {
        this.$head = $( '<div>' );
        this.$body = $( '<div>' );
        this.$foot = $( '<div>' );
-       this.dir = OO.ui.Element.static.getDir( this.$content ) || 'ltr';
        this.$document = $( this.getElementDocument() );
 
        // Events
@@ -5990,6 +6013,28 @@ OO.ui.mixin.LookupElement.prototype.getLookupMenuOptionsFromData = function () {
        return [];
 };
 
+/**
+ * Set the read-only state of the widget.
+ *
+ * This will also disable/enable the lookups functionality.
+ *
+ * @param {boolean} readOnly Make input read-only
+ * @chainable
+ */
+OO.ui.mixin.LookupElement.prototype.setReadOnly = function ( readOnly ) {
+       // Parent method
+       // Note: Calling #setReadOnly this way assumes this is mixed into an OO.ui.TextInputWidget
+       OO.ui.TextInputWidget.prototype.setReadOnly.call( this, readOnly );
+
+       this.setLookupsDisabled( readOnly );
+       // During construction, #setReadOnly is called before the OO.ui.mixin.LookupElement constructor
+       if ( readOnly && this.lookupMenu ) {
+               this.closeLookupMenu();
+       }
+
+       return this;
+};
+
 /**
  * PopupElement is mixed into other classes to generate a {@link OO.ui.PopupWidget popup widget}.
  * A popup is a container for content. It is overlaid and positioned absolutely. By default, each
@@ -6515,8 +6560,9 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
                ccHeight = $container.innerHeight() - buffer,
                ccWidth = $container.innerWidth() - buffer,
                cWidth = this.$clippable.outerWidth() + buffer,
-               scrollTop = this.$clippableScroller[0] === this.$clippableWindow[0] ? this.$clippableScroller.scrollTop() : 0,
-               scrollLeft = this.$clippableScroller.scrollLeft(),
+               scrollerIsWindow = this.$clippableScroller[0] === this.$clippableWindow[0],
+               scrollTop = scrollerIsWindow ? this.$clippableScroller.scrollTop() : 0,
+               scrollLeft = scrollerIsWindow ? this.$clippableScroller.scrollLeft() : 0,
                desiredWidth = cOffset.left < 0 ?
                        cWidth + cOffset.left :
                        ( ccOffset.left + scrollLeft + ccWidth ) - cOffset.left,
@@ -6538,7 +6584,7 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
        }
 
        // If we stopped clipping in at least one of the dimensions
-       if ( !clipWidth || !clipHeight ) {
+       if ( ( this.clippedHorizontally && !clipWidth ) || ( this.clippedVertically && !clipHeight ) ) {
                OO.ui.Element.static.reconsiderScrollbars( this.$clippable[ 0 ] );
        }
 
@@ -7785,7 +7831,7 @@ OO.ui.MessageDialog = function OoUiMessageDialog( config ) {
        this.$element.addClass( 'oo-ui-messageDialog' );
 };
 
-/* Inheritance */
+/* Setup */
 
 OO.inheritClass( OO.ui.MessageDialog, OO.ui.Dialog );
 
@@ -8404,7 +8450,7 @@ OO.ui.ProcessDialog.prototype.getTeardownProcess = function ( data ) {
  * @param {OO.ui.Widget} fieldWidget Field widget
  * @param {Object} [config] Configuration options
  * @cfg {string} [align='left'] Alignment of the label: 'left', 'right', 'top' or 'inline'
- * @cfg {string} [help] Help text. When help text is specified, a help icon will appear
+ * @cfg {string|OO.ui.HtmlSnippet} [help] Help text. When help text is specified, a help icon will appear
  *  in the upper-right corner of the rendered field.
  */
 OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
@@ -8414,7 +8460,8 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
                fieldWidget = config.fieldWidget;
        }
 
-       var hasInputWidget = fieldWidget.constructor.static.supportsSimpleLabel;
+       var hasInputWidget = fieldWidget.constructor.static.supportsSimpleLabel,
+               div;
 
        // Configuration initialization
        config = $.extend( { align: 'left' }, config );
@@ -8437,10 +8484,14 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
                        icon: 'info'
                } );
 
+               div = $( '<div>' );
+               if ( config.help instanceof OO.ui.HtmlSnippet ) {
+                       div.html( config.help.toString() );
+               } else {
+                       div.text( config.help );
+               }
                this.popupButtonWidget.getPopup().$body.append(
-                       $( '<div>' )
-                               .text( config.help )
-                               .addClass( 'oo-ui-fieldLayout-help-content' )
+                       div.addClass( 'oo-ui-fieldLayout-help-content' )
                );
                this.$help = this.popupButtonWidget.$element;
        } else {
@@ -12551,8 +12602,8 @@ OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
        // Mixin constructors
        OO.ui.mixin.IconElement.call( this, config );
        OO.ui.mixin.IndicatorElement.call( this, config );
-       OO.ui.mixin.PendingElement.call( this, config );
-       OO.ui.mixin.LabelElement.call( this, $.extend( config, { autoFitLabel: true } ) );
+       OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$handle } ) );
+       OO.ui.mixin.LabelElement.call( this, $.extend( {}, config, { autoFitLabel: true } ) );
        OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$handle } ) );
 
        // Properties
@@ -12615,7 +12666,7 @@ OO.mixinClass( OO.ui.SelectFileWidget, OO.ui.mixin.PendingElement );
 OO.mixinClass( OO.ui.SelectFileWidget, OO.ui.mixin.LabelElement );
 OO.mixinClass( OO.ui.SelectFileWidget, OO.ui.mixin.TabIndexedElement );
 
-/* Static properties */
+/* Static Properties */
 
 /**
  * Check if this widget is supported
@@ -13039,7 +13090,9 @@ OO.ui.InputWidget = function OoUiInputWidget( config ) {
        this.$input
                .attr( 'name', config.name )
                .prop( 'disabled', this.isDisabled() );
-       this.$element.addClass( 'oo-ui-inputWidget' ).append( this.$input, $( '<span>' ) );
+       this.$element
+               .addClass( 'oo-ui-inputWidget' )
+               .append( this.$input );
        this.setValue( config.value );
 };
 
@@ -13274,6 +13327,14 @@ OO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.mixin.IndicatorElement );
 OO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.mixin.LabelElement );
 OO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.mixin.TitledElement );
 
+/* Static Properties */
+
+/**
+ * Disable generating `<label>` elements for buttons. One would very rarely need additional label
+ * for a button, and it's already a big clickable target, and it causes unexpected rendering.
+ */
+OO.ui.ButtonInputWidget.static.supportsSimpleLabel = false;
+
 /* Methods */
 
 /**
@@ -13380,7 +13441,10 @@ OO.ui.CheckboxInputWidget = function OoUiCheckboxInputWidget( config ) {
        OO.ui.CheckboxInputWidget.parent.call( this, config );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-checkboxInputWidget' );
+       this.$element
+               .addClass( 'oo-ui-checkboxInputWidget' )
+               // Required for pretty styling in MediaWiki theme
+               .append( $( '<span>' ) );
        this.setSelected( config.selected !== undefined ? config.selected : false );
 };
 
@@ -13522,6 +13586,7 @@ OO.ui.DropdownInputWidget.prototype.onMenuSelect = function ( item ) {
  * @inheritdoc
  */
 OO.ui.DropdownInputWidget.prototype.setValue = function ( value ) {
+       value = this.cleanUpValue( value );
        this.dropdownWidget.getMenu().selectItemByData( value );
        OO.ui.DropdownInputWidget.parent.prototype.setValue.call( this, value );
        return this;
@@ -13543,15 +13608,18 @@ OO.ui.DropdownInputWidget.prototype.setDisabled = function ( state ) {
  * @chainable
  */
 OO.ui.DropdownInputWidget.prototype.setOptions = function ( options ) {
-       var value = this.getValue();
+       var
+               value = this.getValue(),
+               widget = this;
 
        // Rebuild the dropdown menu
        this.dropdownWidget.getMenu()
                .clearItems()
                .addItems( options.map( function ( opt ) {
+                       var optValue = widget.cleanUpValue( opt.data );
                        return new OO.ui.MenuOptionWidget( {
-                               data: opt.data,
-                               label: opt.label !== undefined ? opt.label : opt.data
+                               data: optValue,
+                               label: opt.label !== undefined ? opt.label : optValue
                        } );
                } ) );
 
@@ -13634,7 +13702,10 @@ OO.ui.RadioInputWidget = function OoUiRadioInputWidget( config ) {
        OO.ui.RadioInputWidget.parent.call( this, config );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-radioInputWidget' );
+       this.$element
+               .addClass( 'oo-ui-radioInputWidget' )
+               // Required for pretty styling in MediaWiki theme
+               .append( $( '<span>' ) );
        this.setSelected( config.selected !== undefined ? config.selected : false );
 };
 
@@ -13760,6 +13831,7 @@ OO.ui.RadioSelectInputWidget.prototype.onMenuSelect = function ( item ) {
  * @inheritdoc
  */
 OO.ui.RadioSelectInputWidget.prototype.setValue = function ( value ) {
+       value = this.cleanUpValue( value );
        this.radioSelectWidget.selectItemByData( value );
        OO.ui.RadioSelectInputWidget.parent.prototype.setValue.call( this, value );
        return this;
@@ -13781,15 +13853,18 @@ OO.ui.RadioSelectInputWidget.prototype.setDisabled = function ( state ) {
  * @chainable
  */
 OO.ui.RadioSelectInputWidget.prototype.setOptions = function ( options ) {
-       var value = this.getValue();
+       var
+               value = this.getValue(),
+               widget = this;
 
        // Rebuild the radioSelect menu
        this.radioSelectWidget
                .clearItems()
                .addItems( options.map( function ( opt ) {
+                       var optValue = widget.cleanUpValue( opt.data );
                        return new OO.ui.RadioOptionWidget( {
-                               data: opt.data,
-                               label: opt.label !== undefined ? opt.label : opt.data
+                               data: optValue,
+                               label: opt.label !== undefined ? opt.label : optValue
                        } );
                } ) );
 
@@ -13837,18 +13912,27 @@ OO.ui.RadioSelectInputWidget.prototype.setOptions = function ( options ) {
  * @param {Object} [config] Configuration options
  * @cfg {string} [type='text'] The value of the HTML `type` attribute: 'text', 'password', 'search',
  *  'email' or 'url'. Ignored if `multiline` is true.
+ *
+ *  Some values of `type` result in additional behaviors:
+ *
+ *  - `search`: implies `icon: 'search'` and `indicator: 'clear'`; when clicked, the indicator
+ *    empties the text field
  * @cfg {string} [placeholder] Placeholder text
  * @cfg {boolean} [autofocus=false] Use an HTML `autofocus` attribute to
  *  instruct the browser to focus this widget.
  * @cfg {boolean} [readOnly=false] Prevent changes to the value of the text input.
  * @cfg {number} [maxLength] Maximum number of characters allowed in the input.
  * @cfg {boolean} [multiline=false] Allow multiple lines of text
+ * @cfg {number} [rows] If multiline, number of visible lines in textarea. If used with `autosize`,
+ *  specifies minimum number of rows to display.
  * @cfg {boolean} [autosize=false] Automatically resize the text input to fit its content.
  *  Use the #maxRows config to specify a maximum number of displayed rows.
- * @cfg {boolean} [maxRows=10] Maximum number of rows to display when #autosize is set to true.
+ * @cfg {boolean} [maxRows] Maximum number of rows to display when #autosize is set to true.
+ *  Defaults to the maximum of `10` and `2 * rows`, or `10` if `rows` isn't provided.
  * @cfg {string} [labelPosition='after'] The position of the inline label relative to that of
  *  the value or placeholder text: `'before'` or `'after'`
- * @cfg {boolean} [required=false] Mark the field as required
+ * @cfg {boolean} [required=false] Mark the field as required. Implies `indicator: 'required'`.
+ * @cfg {boolean} [autocomplete=true] Should the browser support autocomplete for this field
  * @cfg {RegExp|Function|string} [validate] Validation pattern: when string, a symbolic name of a
  *  pattern defined by the class: 'non-empty' (the value cannot be an empty string) or 'integer'
  *  (the value must contain only numbers); when RegExp, a regular expression that must match the
@@ -13859,9 +13943,19 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        // Configuration initialization
        config = $.extend( {
                type: 'text',
-               labelPosition: 'after',
-               maxRows: 10
+               labelPosition: 'after'
        }, config );
+       if ( config.type === 'search' ) {
+               if ( config.icon === undefined ) {
+                       config.icon = 'search';
+               }
+               // indicator: 'clear' is set dynamically later, depending on value
+       }
+       if ( config.required ) {
+               if ( config.indicator === undefined ) {
+                       config.indicator = 'required';
+               }
+       }
 
        // Parent constructor
        OO.ui.TextInputWidget.parent.call( this, config );
@@ -13869,14 +13963,16 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        // Mixin constructors
        OO.ui.mixin.IconElement.call( this, config );
        OO.ui.mixin.IndicatorElement.call( this, config );
-       OO.ui.mixin.PendingElement.call( this, config );
+       OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$input } ) );
        OO.ui.mixin.LabelElement.call( this, config );
 
        // Properties
+       this.type = this.getSaneType( config );
        this.readOnly = false;
        this.multiline = !!config.multiline;
        this.autosize = !!config.autosize;
-       this.maxRows = config.maxRows;
+       this.minRows = config.rows !== undefined ? config.rows : '';
+       this.maxRows = config.maxRows || Math.max( 2 * ( this.minRows || 0 ), 10 );
        this.validate = null;
 
        // Clone for resizing
@@ -13902,13 +13998,17 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        this.$icon.on( 'mousedown', this.onIconMouseDown.bind( this ) );
        this.$indicator.on( 'mousedown', this.onIndicatorMouseDown.bind( this ) );
        this.on( 'labelChange', this.updatePosition.bind( this ) );
-       this.connect( this, { change: 'onChange' } );
+       this.connect( this, {
+               change: 'onChange',
+               disable: 'onDisable'
+       } );
 
        // Initialization
        this.$element
-               .addClass( 'oo-ui-textInputWidget' )
+               .addClass( 'oo-ui-textInputWidget oo-ui-textInputWidget-type-' + this.type )
                .append( this.$icon, this.$indicator );
        this.setReadOnly( !!config.readOnly );
+       this.updateSearchIndicator();
        if ( config.placeholder ) {
                this.$input.attr( 'placeholder', config.placeholder );
        }
@@ -13922,6 +14022,12 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
                this.$input.attr( 'required', 'required' );
                this.$input.attr( 'aria-required', 'true' );
        }
+       if ( config.autocomplete === false ) {
+               this.$input.attr( 'autocomplete', 'off' );
+       }
+       if ( this.multiline && config.rows ) {
+               this.$input.attr( 'rows', config.rows );
+       }
        if ( this.label || config.autosize ) {
                this.installParentChangeDetector();
        }
@@ -13935,7 +14041,7 @@ OO.mixinClass( OO.ui.TextInputWidget, OO.ui.mixin.IndicatorElement );
 OO.mixinClass( OO.ui.TextInputWidget, OO.ui.mixin.PendingElement );
 OO.mixinClass( OO.ui.TextInputWidget, OO.ui.mixin.LabelElement );
 
-/* Static properties */
+/* Static Properties */
 
 OO.ui.TextInputWidget.static.validationPatterns = {
        'non-empty': /.+/,
@@ -13977,6 +14083,10 @@ OO.ui.TextInputWidget.prototype.onIconMouseDown = function ( e ) {
  */
 OO.ui.TextInputWidget.prototype.onIndicatorMouseDown = function ( e ) {
        if ( e.which === 1 ) {
+               if ( this.type === 'search' ) {
+                       // Clear the text field
+                       this.setValue( '' );
+               }
                this.$input[ 0 ].focus();
                return false;
        }
@@ -14025,10 +14135,21 @@ OO.ui.TextInputWidget.prototype.onElementAttach = function () {
  * @private
  */
 OO.ui.TextInputWidget.prototype.onChange = function () {
+       this.updateSearchIndicator();
        this.setValidityFlag();
        this.adjustSize();
 };
 
+/**
+ * Handle disable events.
+ *
+ * @param {boolean} disabled Element is disabled
+ * @private
+ */
+OO.ui.TextInputWidget.prototype.onDisable = function () {
+       this.updateSearchIndicator();
+};
+
 /**
  * Check if the input is {@link #readOnly read-only}.
  *
@@ -14047,6 +14168,7 @@ OO.ui.TextInputWidget.prototype.isReadOnly = function () {
 OO.ui.TextInputWidget.prototype.setReadOnly = function ( state ) {
        this.readOnly = !!state;
        this.$input.prop( 'readOnly', this.readOnly );
+       this.updateSearchIndicator();
        return this;
 };
 
@@ -14110,7 +14232,7 @@ OO.ui.TextInputWidget.prototype.installParentChangeDetector = function () {
                };
 
                // Create a fake parent and observe it
-               fakeParentNode = $( '<div>' ).append( this.$element )[0];
+               fakeParentNode = $( '<div>' ).append( topmostNode )[0];
                mutationObserver.observe( fakeParentNode, { childList: true } );
        } else {
                // Using the DOMNodeInsertedIntoDocument event is much nicer and less magical, and works for
@@ -14132,7 +14254,7 @@ OO.ui.TextInputWidget.prototype.adjustSize = function () {
        if ( this.multiline && this.autosize && this.$input.val() !== this.valCache ) {
                this.$clone
                        .val( this.$input.val() )
-                       .attr( 'rows', '' )
+                       .attr( 'rows', this.minRows )
                        // Set inline height property to 0 to measure scroll height
                        .css( 'height', 0 );
 
@@ -14177,10 +14299,23 @@ OO.ui.TextInputWidget.prototype.adjustSize = function () {
  * @protected
  */
 OO.ui.TextInputWidget.prototype.getInputElement = function ( config ) {
+       return config.multiline ?
+               $( '<textarea>' ) :
+               $( '<input type="' + this.getSaneType( config ) + '" />' );
+};
+
+/**
+ * Get sanitized value for 'type' for given config.
+ *
+ * @param {Object} config Configuration options
+ * @return {string|null}
+ * @private
+ */
+OO.ui.TextInputWidget.prototype.getSaneType = function ( config ) {
        var type = [ 'text', 'password', 'search', 'email', 'url' ].indexOf( config.type ) !== -1 ?
                config.type :
                'text';
-       return config.multiline ? $( '<textarea>' ) : $( '<input type="' + type + '" />' );
+       return config.multiline ? 'multiline' : type;
 };
 
 /**
@@ -14299,7 +14434,6 @@ OO.ui.TextInputWidget.prototype.setPosition =
  * This method is called by #setLabelPosition, and can also be called on its own if
  * something causes the label to be mispositioned.
  *
- *
  * @chainable
  */
 OO.ui.TextInputWidget.prototype.updatePosition = function () {
@@ -14316,6 +14450,20 @@ OO.ui.TextInputWidget.prototype.updatePosition = function () {
        return this;
 };
 
+/**
+ * Update the 'clear' indicator displayed on type: 'search' text fields, hiding it when the field is
+ * already empty or when it's not editable.
+ */
+OO.ui.TextInputWidget.prototype.updateSearchIndicator = function () {
+       if ( this.type === 'search' ) {
+               if ( this.getValue() === '' || this.isDisabled() || this.isReadOnly() ) {
+                       this.setIndicator( null );
+               } else {
+                       this.setIndicator( 'clear' );
+               }
+       }
+};
+
 /**
  * Position the label by setting the correct padding on the input.
  *
@@ -14994,8 +15142,13 @@ OO.ui.RadioOptionWidget = function OoUiRadioOptionWidget( config ) {
        this.radio.$input.on( 'focus', this.onInputFocus.bind( this ) );
 
        // Initialization
+       // Remove implicit role, we're handling it ourselves
+       this.radio.$input.attr( 'role', 'presentation' );
        this.$element
                .addClass( 'oo-ui-radioOptionWidget' )
+               .attr( 'role', 'radio' )
+               .attr( 'aria-checked', 'false' )
+               .removeAttr( 'aria-selected' )
                .prepend( this.radio.$element );
 };
 
@@ -15031,6 +15184,9 @@ OO.ui.RadioOptionWidget.prototype.setSelected = function ( state ) {
        OO.ui.RadioOptionWidget.parent.prototype.setSelected.call( this, state );
 
        this.radio.setSelected( state );
+       this.$element
+               .attr( 'aria-checked', state.toString() )
+               .removeAttr( 'aria-selected' );
 
        return this;
 };
@@ -15834,10 +15990,6 @@ OO.ui.SearchWidget = function OoUiSearchWidget( config ) {
                change: 'onQueryChange',
                enter: 'onQueryEnter'
        } );
-       this.results.connect( this, {
-               highlight: 'onResultsHighlight',
-               select: 'onResultsSelect'
-       } );
        this.query.$input.on( 'keydown', this.onQueryKeydown.bind( this ) );
 
        // Initialization
@@ -15856,28 +16008,6 @@ OO.ui.SearchWidget = function OoUiSearchWidget( config ) {
 
 OO.inheritClass( OO.ui.SearchWidget, OO.ui.Widget );
 
-/* Events */
-
-/**
- * A 'highlight' event is emitted when an item is highlighted. The highlight indicates which
- * item will be selected. When a user mouses over a menu item, it is highlighted. If a search
- * string is typed into the query field instead, the first menu item that matches the query
- * will be highlighted.
-
- * @event highlight
- * @deprecated Connect straight to getResults() events instead
- * @param {Object|null} item Item data or null if no item is highlighted
- */
-
-/**
- * A 'select' event is emitted when an item is selected. A menu item is selected when it is clicked,
- * or when a user types a search query, a menu result is highlighted, and the user presses enter.
- *
- * @event select
- * @deprecated Connect straight to getResults() events instead
- * @param {Object|null} item Item data or null if no item is selected
- */
-
 /* Methods */
 
 /**
@@ -15917,38 +16047,14 @@ OO.ui.SearchWidget.prototype.onQueryChange = function () {
 /**
  * Handle select widget enter key events.
  *
- * Selects highlighted item.
+ * Chooses highlighted item.
  *
  * @private
  * @param {string} value New value
  */
 OO.ui.SearchWidget.prototype.onQueryEnter = function () {
        // Reset
-       this.results.selectItem( this.results.getHighlightedItem() );
-};
-
-/**
- * Handle select widget highlight events.
- *
- * @private
- * @deprecated Connect straight to getResults() events instead
- * @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.
- *
- * @private
- * @deprecated Connect straight to getResults() events instead
- * @param {OO.ui.OptionWidget} item Selected item
- * @fires select
- */
-OO.ui.SearchWidget.prototype.onResultsSelect = function ( item ) {
-       this.emit( 'select', item ? item.getData() : null );
+       this.results.chooseItem( this.results.getHighlightedItem() );
 };
 
 /**
@@ -16865,7 +16971,9 @@ OO.ui.RadioSelectWidget = function OoUiRadioSelectWidget( config ) {
        } );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-radioSelectWidget' );
+       this.$element
+               .addClass( 'oo-ui-radioSelectWidget' )
+               .attr( 'role', 'radiogroup' );
 };
 
 /* Setup */
index 95e8358..ceb3199 100644 (file)
@@ -17,7 +17,7 @@
                "link": { "file": "images/icons/link.svg" },
                "linkExternal": { "file": {
                        "ltr": "images/icons/external-link-ltr.svg",
-                       "rtl":  "images/icons/external-link-rtl.svg"
+                       "rtl": "images/icons/external-link-rtl.svg"
                } },
                "linkSecure": { "file": "images/icons/secure-link.svg" }
        }
index 65fbc21..4fb736c 100644 (file)
@@ -23,7 +23,7 @@
                        "lang": {
                                "ar": "images/icons/bold-arab-ain.svg",
                                "be": "images/icons/bold-cyrl-te.svg",
-                               "cs,en,he,ml,pl": "images/icons/bold-b.svg",
+                               "cs,en,he,ml,pl,sco": "images/icons/bold-b.svg",
                                "da,de,hu,ksh,nn,no,sv": "images/icons/bold-f.svg",
                                "es,gl,pt": "images/icons/bold-n.svg",
                                "eu,fi": "images/icons/bold-l.svg",
@@ -40,7 +40,7 @@
                        "default": "images/icons/italic-a.svg",
                        "lang": {
                                        "ar": "images/icons/italic-arab-meem.svg",
-                                       "cs,en,fr,he,ml,pl,pt": "images/icons/italic-i.svg",
+                                       "cs,en,fr,he,ml,pl,pt,sco": "images/icons/italic-i.svg",
                                        "be,da,de,fi,ky,nn,no,os,sv,ru": "images/icons/italic-k.svg",
                                        "es,gl,it,nl": "images/icons/italic-c.svg",
                                        "eu": "images/icons/italic-e.svg",
index 9372363..2c5f858 100644 (file)
@@ -28,6 +28,7 @@
                        "ltr": "images/icons/move-ltr.svg",
                        "rtl": "images/icons/move-rtl.svg"
                } },
+               "notice": { "file": "images/icons/notice.svg" },
                "picture": { "file": "images/icons/picture.svg" },
                "previous": { "file": {
                        "ltr": "images/icons/move-rtl.svg",
index 9732802..9769e03 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/advanced.png and b/resources/lib/oojs-ui/themes/apex/images/icons/advanced.png differ
index 5b72d10..4922543 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="settings">
-        <path id="gear" d="M20.87 13.476c.078-.482.13-.972.13-1.476s-.052-.994-.13-1.476l-2.464-.26c-.15-.555-.367-1.08-.648-1.57l1.558-1.923c-.576-.805-1.28-1.51-2.087-2.086l-1.925 1.558c-.488-.28-1.015-.5-1.57-.648l-.26-2.463C12.996 3.053 12.506 3 12 3s-.994.052-1.476.13l-.26 2.464c-.554.15-1.08.367-1.57.648L6.772 4.685c-.804.576-1.51 1.28-2.085 2.086l1.558 1.925c-.28.488-.5 1.015-.648 1.57l-2.463.26c-.08.48-.132.97-.132 1.475s.052.994.13 1.476l2.464.26c.15.555.367 1.08.648 1.57l-1.558 1.923c.576.805 1.28 1.51 2.087 2.086l1.925-1.558c.488.28 1.015.5 1.57.648l.26 2.463c.48.078.97.13 1.475.13s.994-.052 1.476-.13l.26-2.464c.555-.15 1.08-.367 1.57-.648l1.923 1.558c.805-.576 1.51-1.28 2.086-2.087l-1.558-1.925c.28-.488.5-1.015.648-1.57l2.463-.26zM12 15.998c-2.21 0-3.998-1.79-3.998-3.998S9.792 8.002 12 8.002s3.998 1.79 3.998 3.998-1.79 3.998-3.998 3.998z"/>
+        <path id="gear" d="M20.87 13.476c.078-.482.13-.972.13-1.476s-.052-.994-.13-1.476l-2.464-.26c-.15-.555-.367-1.08-.648-1.57l1.558-1.923c-.576-.803-1.28-1.51-2.087-2.084l-1.927 1.558c-.488-.28-1.015-.5-1.57-.648l-.26-2.463C12.996 3.053 12.506 3 12 3s-.994.052-1.476.13l-.26 2.464c-.554.15-1.08.367-1.57.648L6.772 4.685c-.804.576-1.51 1.28-2.085 2.086l1.558 1.927c-.28.488-.5 1.015-.648 1.57l-2.463.26c-.08.48-.132.97-.132 1.475s.052.995.13 1.477l2.464.26c.15.554.367 1.08.648 1.57l-1.558 1.92c.576.805 1.28 1.51 2.087 2.086l1.925-1.558c.488.28 1.015.5 1.57.648l.26 2.463c.48.076.97.13 1.475.13s.994-.054 1.476-.13l.26-2.466c.553-.15 1.08-.367 1.57-.648l1.92 1.558c.806-.576 1.51-1.28 2.087-2.087l-1.558-1.925c.28-.488.5-1.015.647-1.57l2.463-.26zM12 15.998c-2.21 0-3.998-1.79-3.998-3.998S9.792 8.002 12 8.002s3.998 1.79 3.998 3.998-1.79 3.998-3.998 3.998z"/>
     </g>
 </svg>
index e98a14a..98e94fb 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/alert.png and b/resources/lib/oojs-ui/themes/apex/images/icons/alert.png differ
index 42a4bf6..8b601d5 100644 (file)
@@ -3,6 +3,6 @@
     <g id="alert">
         <path id="point" d="M11 16h2v2h-2z"/>
         <path id="stroke" d="M13.516 10h-3L11 15h2z"/>
-        <path id="triangle" d="M12.017 5.974L19.537 19H4.496l7.52-13.026m0-2.474c-.544 0-1.088.357-1.5 1.07L2.532 18.403c-.825 1.43-.15 2.598 1.5 2.598H20c1.65 0 2.325-1.17 1.5-2.6L13.517 4.573c-.413-.715-.956-1.072-1.5-1.072z"/>
+        <path id="triangle" d="M12.017 5.974L19.537 19H4.497l7.52-13.026m0-2.474c-.545 0-1.09.357-1.5 1.07L2.53 18.403C1.705 19.833 2.38 21 4.03 21H20c1.65 0 2.325-1.17 1.5-2.6L13.517 4.575c-.413-.715-.956-1.072-1.5-1.072z"/>
     </g>
 </svg>
index 3737ef8..114ce31 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.png and b/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.png differ
index ba80ed0..918c5b6 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="arched-arrow-ltr">
-        <path id="arrow" d="M19.925 14.937l-2.39-6.9-1.48 2.328c-.965-.845-2.7-1.85-5.514-1.823-4.886.046-6.523 4.244-6.523 4.244s2.753-2.64 6.925-1.95c1.73.287 3.007 1.207 3.675 1.792l-1.474 2.32 6.782-.01z"/>
+        <path id="arrow" d="M19.925 14.937l-2.39-6.9-1.48 2.328c-.965-.845-2.7-1.85-5.514-1.823-4.884.046-6.52 4.244-6.52 4.244s2.752-2.64 6.924-1.95c1.73.287 3.007 1.207 3.675 1.792l-1.475 2.32 6.782-.01z"/>
     </g>
 </svg>
index c2addd8..ad07634 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/bold-arab-ain.png and b/resources/lib/oojs-ui/themes/apex/images/icons/bold-arab-ain.png differ
index ad6b3e4..2f0edb7 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="bold-arab-ain">
-        <path id="arab-ain" d="M9.337 13.616c0 1.35 1.386 2.1 4.16 2.258l2.186-.03.318.045c-.03.126-.25.344-.664.65l-.09.067c-1.235.93-2.422 1.393-3.56 1.393-1.142 0-2.045-.33-2.71-.99-.65-.66-.975-1.56-.975-2.698.006-1.354.567-2.573 1.685-3.658v-.044l-.606-.55c-.15-.18-.223-.39-.223-.63 0-.49.24-1.11.717-1.862.65-1.046 1.303-1.566 1.958-1.56.886.004 1.618.42 2.194 1.245.325.48-.03.552-1.064.22-.842-.327-1.527-.05-2.054.828l.015.074 1.123.865.052.006c1.404-.498 2.418-.74 3.043-.726-.058.117-.14.362-.243.733-.103.357-.204.684-.303.982l-.126.374-.384.05c-1.743.24-2.992.716-3.745 1.43-.464.463-.698.972-.703 1.524"/>
+        <path id="arab-ain" d="M9.337 13.616c0 1.35 1.386 2.1 4.16 2.258l2.186-.03.318.045c-.03.124-.25.342-.662.65l-.09.065c-1.235.93-2.422 1.393-3.56 1.393-1.142 0-2.045-.33-2.71-.99-.65-.66-.975-1.56-.975-2.7.006-1.353.567-2.572 1.685-3.657v-.043l-.606-.55c-.15-.18-.222-.39-.222-.63 0-.49.24-1.11.717-1.863.65-1.046 1.303-1.566 1.958-1.56.886.004 1.618.42 2.194 1.245.324.48-.03.55-1.065.22-.842-.328-1.527-.05-2.054.827l.015.074 1.123.866.052.005c1.403-.497 2.417-.74 3.042-.725-.058.116-.14.36-.243.732-.105.357-.206.684-.305.982l-.126.373-.385.05c-1.743.24-2.992.716-3.745 1.43-.463.463-.697.972-.702 1.524"/>
     </g>
 </svg>
index ed491f3..0ade40c 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/bold-arab-dad.png and b/resources/lib/oojs-ui/themes/apex/images/icons/bold-arab-dad.png differ
index 27108e2..ba7ffe1 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="bold-arab-dad">
-        <path id="arab-dad" d="M16.41 8.232l-1.675-.665L15.43 6l1.687.64-.707 1.592m.775 3.078c-.51-.286-1-.427-1.476-.423-.472 0-.983.205-1.533.616l-.506.38.007.024c1.084.066 1.934.1 2.55.1h.314c.568-.022.993-.065 1.277-.132-.067-.17-.275-.36-.625-.566h-.006m-6.803 3.295c-.017-.904-.33-1.87-.938-2.898l1.294-1.73.118.15c.267.336.504.924.713 1.766l.064.05c.496-.008.942-.17 1.338-.485v-.006l1.732-1.53c.68-.6 1.282-.902 1.807-.902.384.004.85.195 1.395.572.55.377.884.696 1 .958.063.15.094.386.094.71 0 .695-.11 1.228-.332 1.597-.192.31-.473.555-.844.734-.438.208-1.55.312-3.333.312-.8 0-1.794-.02-2.982-.062l-.144.43c-.254.67-.463 1.112-.625 1.323-.726.937-1.787 1.405-3.184 1.405C5.85 16.99 5 16.076 5 14.256c.003-.94.278-1.814.824-2.618.15-.216.298-.367.444-.454.225-.133.288-.09.188.124-.396.862-.596 1.548-.6 2.058.008 1.177.752 1.768 2.232 1.772 1.038-.004 1.803-.182 2.295-.535"/>
+        <path id="arab-dad" d="M16.41 8.232l-1.675-.665L15.43 6l1.687.64-.707 1.592m.775 3.078c-.51-.286-1-.427-1.476-.423-.474 0-.985.205-1.535.616l-.506.38.006.024c1.084.066 1.934.1 2.55.1h.314c.57-.022.994-.065 1.278-.132-.067-.17-.275-.36-.625-.566h-.006m-6.803 3.293c-.017-.904-.33-1.87-.938-2.898l1.294-1.73.118.15c.267.336.504.924.713 1.766l.066.05c.496-.007.942-.17 1.338-.484v-.006l1.732-1.53c.68-.6 1.282-.9 1.807-.9.384.003.85.194 1.395.57.55.378.884.697 1 .96.063.15.094.385.094.71 0 .694-.11 1.227-.33 1.596-.193.31-.474.555-.845.734-.438.208-1.55.312-3.333.312-.8 0-1.794-.02-2.982-.062l-.144.43c-.254.67-.463 1.112-.625 1.323-.725.937-1.786 1.405-3.183 1.405C5.85 16.99 5 16.076 5 14.256c.003-.94.278-1.814.824-2.618.15-.216.298-.367.444-.454.225-.133.288-.09.188.124-.396.862-.596 1.548-.6 2.058.008 1.177.752 1.768 2.232 1.772 1.038-.004 1.803-.182 2.295-.535"/>
     </g>
 </svg>
index 718accb..0a16f8c 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/bold-armn-to.png and b/resources/lib/oojs-ui/themes/apex/images/icons/bold-armn-to.png differ
index b55042a..0dc8b52 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="bold-armn-to">
-        <path id="armn-to" d="M13.86 16.257c.124 0 .254-.026.39-.078.135-.06.257-.15.367-.275.114-.13.205-.302.273-.516.073-.214.11-.48.11-.798V13h-1.14c-.14 0-.284.026-.43.078-.14.047-.27.133-.383.258-.11.125-.2.294-.274.508-.067.213-.1.487-.1.82 0 .34.035.47.108.695.08.217.176.394.29.53.12.135.248.23.384.29.14.05.276.076.406.076m-2.97-7.84c-.37.082-.695.247-.976.45-.28.198-.505.47-.672.813-.16.342-.242.78-.242 1.31V18H6v-7.188c0-.776.15-1.455.453-2.04.302-.587.714-1.077 1.234-1.467.52-.39 1.13-.685 1.83-.883.697-.198 1.44-.297 2.225-.297.526 0 1.04.044 1.54.133.504.088.98.22 1.43.398.447.172.858.388 1.233.65.375.26.698.564.97.913.275.347.49.737.64 1.17.15.432.226 1.093.226 1.61h1.354v2.04H17.78v1.6c0 .58-.103 1.09-.31 1.54-.21.44-.49.814-.845 1.116-.35.302-.834.53-1.297.687-.464.15-.953.226-1.47.226-.51 0-.996-.08-1.46-.235-.464-.156-.87-.39-1.22-.703-.348-.313-.626-.703-.835-1.172-.203-.473-.304-1.028-.304-1.663s.104-1.182.32-1.64c.212-.46.496-.685.85-.977.354-.297.76-.513 1.22-.648.457-.14.934-.21 1.43-.21h1.13c-.01-.49-.04-1.043-.24-1.36-.2-.323-.454-.58-.767-.766-.312-.193-.598-.332-.984-.426-.375-.09-.578-.094-1.1-.094-.52 0-.64.02-1.01.102z"/>
+        <path id="armn-to" d="M13.86 16.257c.124 0 .254-.026.39-.078.135-.06.257-.15.367-.277.114-.13.205-.302.273-.516.073-.214.11-.48.11-.798V13h-1.14c-.14 0-.284.026-.43.078-.14.047-.27.133-.383.258-.11.125-.2.294-.274.508-.067.213-.1.487-.1.82 0 .34.035.47.108.695.08.215.178.392.29.53.12.133.25.23.386.29.14.05.276.074.406.074m-2.97-7.84c-.37.082-.694.247-.975.45-.28.198-.505.47-.672.813-.16.342-.242.78-.242 1.31V18H6v-7.188c0-.776.15-1.455.453-2.04.302-.587.714-1.077 1.234-1.467.52-.39 1.13-.685 1.83-.883.697-.198 1.44-.297 2.225-.297.526 0 1.04.044 1.54.133.504.088.98.22 1.43.398.447.172.858.388 1.233.65.375.26.698.564.97.913.275.345.49.735.64 1.17.15.43.226 1.09.226 1.61h1.356v2.04H17.78v1.6c0 .58-.103 1.09-.31 1.54-.21.44-.49.812-.845 1.114-.35.302-.834.53-1.297.687-.464.15-.953.227-1.47.227-.51 0-.996-.08-1.46-.235-.464-.156-.87-.39-1.22-.703-.348-.314-.626-.704-.835-1.173-.203-.473-.304-1.028-.304-1.663s.102-1.182.32-1.64c.21-.46.494-.685.85-.977.352-.297.76-.513 1.22-.648.455-.14.932-.21 1.43-.21h1.13c-.01-.49-.04-1.044-.24-1.36-.2-.324-.456-.58-.77-.767-.31-.193-.597-.332-.983-.426-.375-.09-.578-.094-1.1-.094-.52 0-.64.02-1.01.102z"/>
     </g>
 </svg>
index 5c6f8c0..d87d0fc 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="bold-cyrl-be">
-        <path id="cyrl-be" d="M7 6h9v2h-6v3h2.65c.892 0 1.632.11 2.22.327.587.218 1.087.622 1.5 1.21.42.59.63 1.188.63 1.98 0 .812-.21 1.397-.63 1.976-.418.578-.897.974-1.436 1.187-.533.213-1.295.32-2.286.32h-5.65m4.768-2c.75 0 1.28-.05 1.584-.12.305-.077.57-.247.792-.51.23-.26.343-.472.343-.854 0-.557-.2-.868-.596-1.12-.393-.255-1.065-.397-2.017-.397H10v3"/>
+        <path id="cyrl-be" d="M7 6h9v2h-6v3h2.65c.892 0 1.632.11 2.22.327.587.218 1.087.622 1.5 1.21.42.59.63 1.188.63 1.98 0 .812-.21 1.397-.63 1.976-.418.578-.897.974-1.436 1.187-.533.213-1.295.32-2.286.32h-5.65m4.768-2c.75 0 1.28-.05 1.584-.12.305-.077.57-.247.792-.51.23-.26.343-.472.343-.854 0-.557-.2-.868-.596-1.12-.395-.255-1.067-.397-2.02-.397H10v3"/>
     </g>
 </svg>
index cfe0009..41e562b 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/bold-cyrl-zhe.png and b/resources/lib/oojs-ui/themes/apex/images/icons/bold-cyrl-zhe.png differ
index d26bdf6..3c0a879 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="bold-cyrl-zhe">
-        <path id="cyrl-zhe" d="M13 6v5.154c.328-.033.537-.18.705-.447.168-.266.4-.873.698-1.82.39-1.242.79-2.034 1.197-2.375.403-.336 1.075-.504 2.014-.504L18 6v1.78l-.386-.008c-.4 0-.69.062-.878.187-.186.118-.337.303-.452.552-.115.25-.286.762-.512 1.537-.12.41-.25.755-.392 1.032-.137.276-.383.537-.738.78.44.157.8.466 1.084.927.288.454.603 1.102.944 1.942L18 18h-2.314l-1.17-3.08-.113-.253-.24-.56c-.247-.57-.45-.933-.61-1.09-.16-.157-.318-.236-.553-.236V18h-2v-5.22c-.226 0-.382.077-.546.23-.164.15-.368.517-.612 1.097l-.246.56-.113.253L8.313 18H6l1.33-3.267c.327-.808.635-1.447.923-1.92.293-.476.663-.793 1.11-.95-.355-.244-.603-.5-.745-.772-.137-.275-.268-.622-.392-1.04-.222-.76-.39-1.266-.505-1.52-.11-.255-.26-.444-.45-.57-.187-.124-.493-.186-.918-.186L6 7.782v-1.78l.386.008c.953 0 1.63.17 2.034.512.4.347.79 1.136 1.177 2.366.3.954.534 1.564.698 1.83.168.26.377.405.705.438V6.002"/>
+        <path id="cyrl-zhe" d="M13 6v5.154c.328-.033.537-.18.705-.447.168-.266.4-.873.698-1.82.39-1.242.79-2.034 1.197-2.375.403-.336 1.075-.504 2.014-.504L18 6v1.78l-.386-.008c-.4 0-.69.062-.878.187-.186.116-.337.3-.452.55-.115.25-.286.762-.512 1.537-.12.41-.25.755-.392 1.032-.137.275-.383.536-.738.78.44.156.8.465 1.084.926.288.454.603 1.102.944 1.942L18 18h-2.314l-1.17-3.08-.113-.253-.24-.56c-.247-.57-.45-.933-.61-1.09-.16-.157-.318-.236-.553-.236V18h-2v-5.22c-.226 0-.382.077-.546.23-.164.15-.368.517-.612 1.097l-.246.56-.113.253L8.313 18H6l1.33-3.267c.327-.808.635-1.447.923-1.92.293-.476.663-.793 1.11-.95-.355-.244-.603-.5-.745-.772-.137-.273-.268-.62-.392-1.04-.222-.76-.39-1.264-.505-1.52-.11-.253-.26-.442-.45-.57-.185-.122-.49-.184-.916-.184L6 7.782v-1.78l.386.008c.953 0 1.63.17 2.034.512.4.347.79 1.136 1.177 2.366.3.954.534 1.564.698 1.83.168.26.377.405.705.438V6.002"/>
     </g>
 </svg>
index ceb792b..e809453 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/bold-g.png and b/resources/lib/oojs-ui/themes/apex/images/icons/bold-g.png differ
index dd6e27a..277f17e 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="bold-g">
-        <path id="g" d="M12 14v-2h5v4.203c-.497.475-1.22.894-2.166 1.26-.94.358-1.896.537-2.864.537-1.23 0-2.303-.253-3.217-.76-.915-.512-1.602-1.24-2.062-2.185-.46-.95-.69-1.982-.69-3.095 0-1.208.258-2.282.77-3.222.514-.94 1.266-1.66 2.256-2.16.754-.386 1.693-.58 2.816-.58 1.46 0 2.6.304 3.418.91.824.603 1.353 1.436 1.59 2.502l-2.36.435c-.166-.57-.48-1.018-.94-1.346-.454-.333-1.023-.5-1.708-.5-1.038 0-1.864.325-2.48.974-.61.65-.914 1.612-.914 2.89 0 1.376.31 2.41.93 3.102.62.686 1.434 1.03 2.44 1.03.497 0 .995-.096 1.492-.286.503-.195 1.332-.57 1.69-.845v-.867"/>
+        <path id="g" d="M12 14v-2h5v4.203c-.497.475-1.22.894-2.166 1.26-.94.358-1.896.537-2.864.537-1.23 0-2.303-.253-3.217-.76-.915-.512-1.602-1.24-2.062-2.185-.46-.95-.69-1.982-.69-3.095 0-1.208.26-2.282.77-3.222.516-.94 1.268-1.66 2.258-2.16.754-.386 1.693-.58 2.816-.58 1.46 0 2.6.304 3.418.91.825.603 1.354 1.436 1.59 2.502l-2.36.435c-.165-.57-.48-1.018-.94-1.346-.453-.335-1.022-.5-1.707-.5-1.038 0-1.864.323-2.48.972-.61.65-.914 1.612-.914 2.89 0 1.376.31 2.41.93 3.102.62.686 1.434 1.03 2.44 1.03.497 0 .995-.096 1.49-.286.505-.196 1.334-.57 1.69-.846v-.867"/>
     </g>
 </svg>
index 00c8051..5d0bbd9 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="cancel">
-        <path id="circle-with-strike" d="M12 5.022C8.145 5.022 5.02 8.146 5.02 12c0 3.853 3.124 6.978 6.977 6.978s6.978-3.125 6.978-6.978c0-3.854-3.125-6.978-6.98-6.978zM6.885 12c0-1.092.572-3.25.93-2.93l7.113 7.114c.487.525-1.838.93-2.93.93-2.826 0-5.114-2.29-5.114-5.114zm9.298 2.93L9.07 7.815c-.445-.483 1.837-.93 2.93-.93 2.826 0 5.114 2.288 5.114 5.113 0 1.092-.364 3.542-.93 2.93z"/>
+        <path id="circle-with-strike" d="M12 5.022c-3.855 0-6.98 3.124-6.98 6.978 0 3.853 3.124 6.978 6.977 6.978s6.978-3.125 6.978-6.978c0-3.854-3.125-6.978-6.98-6.978zM6.885 12c0-1.092.572-3.25.93-2.93l7.113 7.114c.487.525-1.838.93-2.93.93-2.826 0-5.114-2.29-5.114-5.114zm9.298 2.93L9.07 7.815c-.445-.483 1.837-.93 2.93-.93 2.826 0 5.114 2.288 5.114 5.113 0 1.092-.364 3.542-.93 2.93z"/>
     </g>
 </svg>
index e924c44..1b0a659 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/case-sensitive.png and b/resources/lib/oojs-ui/themes/apex/images/icons/case-sensitive.png differ
index 3f0a3a5..8de2583 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="regular-expression">
-        <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.657 7H7.533zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
-        <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.082.92-.368.167-.85.25-1.444.25-.564 0-.955-.208-1.377-.625-.418-.418-.627-1.012-.627-1.784 0-.808.282-1.403.845-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.395-1.158-1.186-1.158-.61 0-1.325.183-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.023 0 1.588.223 2.133.668.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.804.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .585.336.877 1.008.877.48 0 .865-.138 1.152-.415.29-.277.436-.645.436-1.103v-.627"/>
+        <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.655 7H7.533zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
+        <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.444.25-.564 0-.955-.208-1.377-.625-.42-.418-.628-1.012-.628-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.395-1.158-1.186-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.666.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.803.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .583.336.875 1.008.875.48 0 .865-.138 1.152-.415.29-.276.436-.644.436-1.102v-.627"/>
     </g>
 </svg>
index 02c9bd8..d455904 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="check">
-        <path d="M7.105 13.473l1.422-1.423 1.9 1.902L15.238 7l1.658 1.148L10.635 17z"/>
+        <path d="M7.105 13.473l1.422-1.423 1.9 1.902L15.237 7l1.66 1.148L10.634 17z"/>
     </g>
 </svg>
index 6e32d78..fe5309d 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24">
     <g id="code">
-        <path id="left-bracket" d="M4 12v-1h1c1 0 1 0 1-1V7.614c0-.514.024-.896.073-1.142.054-.252.14-.463.257-.633.204-.28.473-.476.808-.585C7.473 5.14 8.01 5 8.973 5H10v1h-.752c-.457 0-.77.19-.936.408C8.145 6.623 8 6.853 8 7.476v1.857c0 .73-.04 1.18-.244 1.493-.2.307-.562.53-1.09.667.535.155.9.385 1.096.688.2.304.238.758.238 1.485v1.862c0 .62.145.848.312 1.062.166.22.48.406.936.406L10 17v1H8.973c-.963 0-1.5-.133-1.835-.248-.335-.11-.604-.307-.808-.59-.118-.166-.203-.375-.257-.626-.05-.253-.073-.636-.073-1.15V13c0-1 0-1-1-1H4z"/>
+        <path id="left-bracket" d="M4 12v-1h1c1 0 1 0 1-1V7.614c0-.514.024-.896.073-1.142.054-.252.14-.463.257-.633.204-.28.473-.478.808-.587C7.473 5.14 8.01 5 8.973 5H10v1h-.752c-.457 0-.77.19-.936.408C8.145 6.623 8 6.853 8 7.476v1.857c0 .73-.04 1.18-.244 1.493-.2.307-.562.53-1.09.667.535.155.9.385 1.096.688.2.306.238.76.238 1.487v1.862c0 .62.145.847.312 1.06.166.22.48.407.936.407L10 17v1H8.973c-.963 0-1.5-.133-1.835-.248-.335-.11-.604-.307-.808-.59-.118-.166-.203-.375-.257-.626-.05-.253-.073-.636-.073-1.15V13c0-1 0-1-1-1H4z"/>
         <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" width="24" height="24" xlink:href="#left-bracket"/>
     </g>
 </svg>
index 7e37682..1b1cb76 100644 (file)
@@ -2,7 +2,7 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="Layer_2">
         <g id="g184">
-            <path d="M21 4v-1s0-3-3-3-3 3-3 3v1h-1v6h8v-6zm-1.5 0h-3v-1s0-1.5 1.5-1.5c1.48.06 1.5 1.5 1.5 1.5zm-6.5 5.6l-6.8 6.9c-.3-.3-.7-.6-1-.8 1.4-1.4 5-5 7.8-7.9v-1.8l-9 9-1 5 5-1 8-8h-3z" id="path186"/>
+            <path d="M21 4V3s0-3-3-3-3 3-3 3v1h-1v6h8V4zm-1.5 0h-3V3s0-1.5 1.5-1.5c1.48.06 1.5 1.5 1.5 1.5zM13 9.6l-6.8 6.9c-.3-.3-.7-.6-1-.8 1.4-1.4 5-5 7.8-7.9V6l-9 9-1 5 5-1 8-8h-3z" id="path186"/>
         </g>
     </g>
 </svg>
index 0b4751d..84a6816 100644 (file)
@@ -2,7 +2,7 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="Layer_2">
         <g id="g184">
-            <path d="M4 4v-1s0-3 3-3 3 3 3 3v1h1v6h-8v-6zm1.5 0h3v-1s0-1.5-1.5-1.5c-1.48.06-1.5 1.5-1.5 1.5zm6.5 5.6l6.8 6.9c.3-.3.7-.6 1-.8-1.4-1.4-5-5-7.8-7.9v-1.8l9 9 1 5-5-1-8-8h3z" id="path186"/>
+            <path d="M4 4V3s0-3 3-3 3 3 3 3v1h1v6H3V4zm1.5 0h3V3s0-1.5-1.5-1.5C5.52 1.56 5.5 3 5.5 3zM12 9.6l6.8 6.9c.3-.3.7-.6 1-.8-1.4-1.4-5-5-7.8-7.9V6l9 9 1 5-5-1-8-8h3z" id="path186"/>
         </g>
     </g>
 </svg>
index 60e6a0c..9fdc8ca 100644 (file)
@@ -2,6 +2,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="external">
         <path id="box" d="M7 3h2v6H3V7H2v3h8V2H7z"/>
-        <path id="arrow" d="M2 5.79l1.42-1.422L5.554 6.5l.947-.947L4.368 3.42 5.788 2H2z"/>
+        <path id="arrow" d="M2 5.79l1.42-1.422L5.554 6.5l.947-.947L4.37 3.42 5.788 2H2z"/>
     </g>
 </svg>
index 4625881..5c66688 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/find-ltr.png and b/resources/lib/oojs-ui/themes/apex/images/icons/find-ltr.png differ
index e97230c..bbfdaa0 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="find">
-        <path id="magnifying-glass" d="M13.656 11c-1.92 0-3.5 1.548-3.5 3.47 0 1.92 1.58 3.5 3.5 3.5.75 0 1.432-.253 2-.657l.094.156 2.375 2.374c.19.19.534.153.78-.094s.315-.59.126-.78l-2.374-2.376-.188-.094c.403-.566.656-1.282.656-2.03 0-1.92-1.55-3.47-3.47-3.47zm0 1.656c1.01 0 1.813.8 1.813 1.813 0 1.01-.802 1.843-1.814 1.843-1.01 0-1.844-.832-1.844-1.844s.832-1.814 1.844-1.814z"/>
+        <path id="magnifying-glass" d="M13.656 11c-1.92 0-3.5 1.548-3.5 3.47 0 1.92 1.58 3.5 3.5 3.5.75 0 1.432-.253 2-.657l.094.156 2.375 2.372c.19.19.534.153.78-.094s.315-.59.126-.78L16.66 16.59l-.188-.093c.402-.567.655-1.283.655-2.03 0-1.92-1.55-3.47-3.47-3.47zm0 1.656c1.01 0 1.813.8 1.813 1.813 0 1.01-.804 1.84-1.816 1.84-1.01 0-1.844-.83-1.844-1.843s.833-1.814 1.845-1.814z"/>
         <path id="text" d="M6 5v2h10V5H6zm0 3v2h11V8H6zm0 3v2h3.53c.284-.797.787-1.486 1.44-2H6zm0 3v2h3.53c-.177-.48-.28-.99-.28-1.53 0-.16.046-.315.063-.47H6z"/>
     </g>
 </svg>
index ed8eea0..28aab68 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/find-rtl.png and b/resources/lib/oojs-ui/themes/apex/images/icons/find-rtl.png differ
index ca03754..e70ae48 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="find">
-        <path id="magnifying-glass" d="M11.344 11c1.92 0 3.5 1.548 3.5 3.47 0 1.92-1.58 3.5-3.5 3.5-.75 0-1.432-.253-2-.657l-.094.156-2.375 2.374c-.19.19-.534.153-.78-.094s-.315-.59-.126-.78l2.374-2.376.188-.094c-.403-.566-.656-1.282-.656-2.03 0-1.92 1.55-3.47 3.47-3.47zm0 1.656c-1.01 0-1.813.8-1.813 1.813 0 1.01.802 1.843 1.814 1.843 1.01 0 1.844-.832 1.844-1.844s-.832-1.814-1.844-1.814z"/>
+        <path id="magnifying-glass" d="M11.344 11c1.92 0 3.5 1.548 3.5 3.47 0 1.92-1.58 3.5-3.5 3.5-.75 0-1.432-.253-2-.657l-.094.156-2.375 2.372c-.19.19-.534.153-.78-.094s-.315-.59-.126-.78L8.34 16.59l.188-.093c-.402-.567-.655-1.283-.655-2.03 0-1.92 1.55-3.47 3.47-3.47zm0 1.656c-1.01 0-1.813.8-1.813 1.813 0 1.01.804 1.84 1.816 1.84 1.01 0 1.844-.83 1.844-1.843s-.833-1.814-1.845-1.814z"/>
         <path id="text" d="M19 5v2H9V5zm0 3v2H8V8zm0 3v2h-3.53c-.284-.797-.787-1.486-1.44-2zm0 3v2h-3.53c.177-.48.28-.99.28-1.53 0-.16-.046-.315-.063-.47z"/>
     </g>
 </svg>
index e5eb877..a9a0ebb 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="help">
-        <path id="circle" d="M12 2.085c-5.477 0-9.915 4.438-9.915 9.916 0 5.477 4.438 9.915 9.916 9.915 5.477 0 9.915-4.438 9.915-9.914 0-5.477-4.438-9.915-9.914-9.915zm.002 18c-4.465 0-8.084-3.62-8.084-8.083 0-4.465 3.62-8.084 8.084-8.084 4.464 0 8.083 3.62 8.083 8.084 0 4.464-3.62 8.083-8.083 8.083z"/>
+        <path id="circle" d="M12 2.085c-5.477 0-9.915 4.438-9.915 9.916 0 5.48 4.438 9.917 9.916 9.917 5.48 0 9.917-4.438 9.917-9.914 0-5.477-4.438-9.915-9.914-9.915zm.002 18c-4.465 0-8.084-3.62-8.084-8.083 0-4.465 3.62-8.084 8.084-8.084 4.464 0 8.083 3.62 8.083 8.084 0 4.464-3.62 8.083-8.083 8.083z"/>
         <g id="question-mark">
             <path id="top" d="M11.766 6.688c-2.5 0-3.22 2.188-3.22 2.188l1.412.854s.298-.79.9-1.23c.517-.374 1.626-.624 2.22.126.7.885-.17 1.587-1.078 2.72C11.047 12.53 11 15 11 15h1.97s.134-2.318 1.04-3.38c.603-.708 1.443-1.34 1.443-2.495s-1.187-2.437-3.687-2.437z"/>
             <path id="bottom" d="M11 16h2v2h-2z"/>
index bf4f537..1b513d0 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="help">
-        <path id="circle" d="M12 2.085c5.477 0 9.915 4.438 9.915 9.916 0 5.477-4.438 9.915-9.916 9.915-5.477 0-9.915-4.438-9.915-9.914 0-5.477 4.438-9.915 9.914-9.915zm-.002 18c4.465 0 8.084-3.62 8.084-8.083 0-4.465-3.62-8.084-8.084-8.084-4.464 0-8.083 3.62-8.083 8.084 0 4.464 3.62 8.083 8.083 8.083z"/>
+        <path id="circle" d="M12 2.085c5.477 0 9.915 4.438 9.915 9.916 0 5.48-4.438 9.917-9.916 9.917-5.48 0-9.917-4.438-9.917-9.914 0-5.477 4.438-9.915 9.914-9.915zm-.002 18c4.465 0 8.084-3.62 8.084-8.083 0-4.465-3.62-8.084-8.084-8.084-4.464 0-8.083 3.62-8.083 8.084 0 4.464 3.62 8.083 8.083 8.083z"/>
         <g id="question-mark">
             <path id="top" d="M12.234 6.688c2.5 0 3.22 2.188 3.22 2.188l-1.412.854s-.298-.79-.9-1.23c-.517-.374-1.626-.624-2.22.126-.7.885.17 1.587 1.078 2.72C12.953 12.53 13 15 13 15h-1.97s-.134-2.318-1.04-3.38c-.603-.708-1.443-1.34-1.443-2.495 0-1.156 1.187-2.437 3.687-2.437z"/>
             <path id="bottom" d="M13 16h-2v2h2z"/>
index e9bbf95..0e177ab 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/history.png and b/resources/lib/oojs-ui/themes/apex/images/icons/history.png differ
index 019e558..9375751 100644 (file)
@@ -2,6 +2,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="history">
         <path id="clock-hands" d="M17.26 15.076s-2.385-1.935-4.005-3.062c.72-2.397 1.702-6.56 1.702-6.56s-4.35 5.364-4.877 6.7c-.463 1.168 1.46 2.21 2.346 1.678 1.9.55 4.834 1.244 4.834 1.244z"/>
-        <path id="arrow" d="M12.086 2.085C6.608 2.085 2.17 6.523 2.17 12c0 1.784.476 3.455 1.3 4.9L1.25 18.94h5.688v-5.22L4.87 15.616c-.55-1.088-.866-2.312-.866-3.615 0-4.464 3.62-8.083 8.084-8.083 4.464 0 8.083 3.62 8.083 8.084 0 4.465-3.618 8.084-8.082 8.084-1.145 0-2.228-.247-3.213-.678l-.833 1.634c1.235.557 2.602.874 4.045.874C17.563 21.914 22 17.476 22 12c0-5.477-4.438-9.915-9.914-9.915z"/>
+        <path id="arrow" d="M12.086 2.085C6.608 2.085 2.17 6.523 2.17 12c0 1.784.476 3.455 1.3 4.9l-2.22 2.04h5.688v-5.22L4.87 15.616c-.55-1.088-.866-2.312-.866-3.615 0-4.462 3.62-8.08 8.084-8.08 4.464 0 8.083 3.62 8.083 8.083 0 4.465-3.616 8.084-8.08 8.084-1.145 0-2.23-.247-3.213-.678l-.833 1.633c1.235.557 2.602.874 4.045.874C17.562 21.914 22 17.477 22 12c0-5.477-4.438-9.915-9.914-9.915z"/>
     </g>
 </svg>
index f94928b..3285ad9 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/italic-arab-keheh-jeem.png and b/resources/lib/oojs-ui/themes/apex/images/icons/italic-arab-keheh-jeem.png differ
index 1c4aeb7..04cdebb 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="italic-arab-keheh-jeem">
-        <path id="arab-keheh-jeem" d="M18.125 5.844c-1.695.555-3.297 1.162-4.594 1.938-.49.3-.773.712-.874 1.125-.064.263-.035.572.063.78.188.406.538.575.843.814l.094-.124.53.625c.14.165.344.514.47.94.137.462.08.724 0 1.124H11.22c-.34 0-.593.007-.767-.02-.34-.053-.256-.208-.234-.34.33-.127.563-.173.937-.14.29-.495.593-.886.906-1.314-.98.037-1.878.015-2.688-.094-.346-.047-.698-.186-1.094-.156-.356.026-.767.24-1.03.72-.246.447-.434.838-.656 1.28l.75-.47c.23-.14.484-.226.72-.218.156.005.274.054.405.094-.232.205-.51.402-.72.563-.3.26-.702.687-.906 1-.403.614-.694 1.083-.875 1.78-.18.69.003 1.34.468 1.75.426.376.846.52 1.28.563.65.065 1.206.093 2-.188.658-.23 1.022-.553 1.5-.97-.882.11-1.816.09-2.53.032-.87-.07-1.268-.384-1.47-.594-.27-.283-.306-.64-.155-1.22.036-.14.097-.322.25-.53.168-.228.364-.435.594-.656.45-.436 1.01-.737 1.46-.938-.044.205-.106.442-.054.687.05.23.248.38.438.47.26.12.507.154.69.155 1.42.01 2.86 0 4.28 0 .247 0 .452-.163.594-.375.14-.208.25-.48.344-.844.13-.5.094-1.062-.094-1.625-.182-.543-.418-1.01-.72-1.406-.334-.443-.673-.83-1-1.22 1.258-.814 2.717-1.238 3.97-1.687.12-.452.224-.926.313-1.313zm-9.47 8.438c-.26.394-.583.69-.874 1 .376.286.75.556 1.095.813.335-.303.626-.674.875-.97-.39-.267-.77-.587-1.094-.843z"/>
+        <path id="arab-keheh-jeem" d="M18.125 5.844c-1.695.555-3.297 1.162-4.594 1.938-.49.3-.77.712-.872 1.125-.064.263-.035.572.063.78.19.406.54.575.844.814l.094-.122.53.625c.14.165.344.514.47.94.137.462.08.724 0 1.124H11.22c-.34 0-.593.007-.767-.02-.34-.053-.256-.208-.234-.34.33-.127.56-.173.935-.14.29-.495.593-.886.906-1.314-.98.037-1.877.015-2.687-.094-.346-.048-.698-.187-1.094-.157-.357.026-.768.24-1.03.72-.247.447-.435.838-.657 1.28l.75-.47c.23-.14.484-.226.72-.218.156.005.274.054.405.094-.233.204-.51.4-.72.562-.3.26-.703.688-.907 1-.402.615-.693 1.084-.874 1.78-.18.69.003 1.34.468 1.75.426.377.846.52 1.28.564.65.065 1.206.093 2-.188.658-.23 1.022-.553 1.5-.97-.882.11-1.816.09-2.53.032-.87-.07-1.268-.384-1.47-.594-.27-.283-.306-.64-.155-1.22.036-.14.097-.322.25-.53.17-.228.364-.435.594-.656.45-.436 1.01-.737 1.46-.938-.044.205-.106.442-.054.687.05.23.25.38.44.47.26.12.506.153.69.154 1.42.01 2.86 0 4.28 0 .246 0 .45-.163.593-.375.14-.21.25-.48.344-.845.13-.5.094-1.062-.094-1.625-.182-.543-.418-1.01-.72-1.406-.334-.443-.673-.83-1-1.22 1.258-.814 2.717-1.238 3.97-1.687.12-.452.224-.926.313-1.313zm-9.47 8.438c-.26.394-.583.69-.874 1 .378.286.75.556 1.097.813.335-.303.626-.674.875-.97-.39-.267-.77-.587-1.093-.843z"/>
     </g>
 </svg>
index a963197..3c5adc3 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/italic-arab-meem.png and b/resources/lib/oojs-ui/themes/apex/images/icons/italic-arab-meem.png differ
index 7b2670f..f315377 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="italic-arab-meem">
-        <path id="arab-meem" d="M16 9.73l-.93 2.19h-4.663c-.48 0-.857.12-1.135.366l-.06.11c-.185 2.016-.503 3.558-.956 4.627-.272.64-.633 1.252-1.082 1.833-.177.226-.22.186-.126-.12l.142-.503.17-.67.234-.87.002-.008.202-1.045.258-1.41.353-1.907c.19-.312.423-.638.698-.98.276-.342.59-.706.94-1.09.13-.092.697-.18 1.705-.266 1.05-.086 1.638-.183 1.765-.293l.065-.128c.007-.11-.01-.24-.054-.394-.044-.153-.12-.327-.232-.522-.22-.428-.438-.64-.654-.64-.294 0-.915.268-1.864.805-.36.208-.376.125-.05-.247 1.557-1.71 2.707-2.566 3.45-2.566.382 0 .67.13.862.394.135.195.25.6.344 1.21l.203 1.2c.105.586.24.895.408.925"/>
+        <path id="arab-meem" d="M16 9.73l-.93 2.19h-4.663c-.48 0-.857.12-1.135.366l-.06.11c-.185 2.016-.503 3.558-.956 4.627-.272.64-.633 1.252-1.082 1.833-.177.226-.22.186-.126-.12l.142-.503.17-.67.234-.87.002-.008.202-1.045.258-1.41.353-1.907c.19-.312.42-.638.696-.98.276-.342.59-.706.94-1.09.13-.092.697-.18 1.705-.266 1.05-.086 1.64-.183 1.766-.293l.065-.128c.008-.11-.01-.24-.053-.394-.044-.153-.12-.327-.232-.522-.22-.428-.438-.64-.654-.64-.293 0-.914.268-1.863.805-.36.208-.376.125-.05-.247 1.557-1.71 2.707-2.566 3.45-2.566.382 0 .67.13.862.394.134.195.25.6.343 1.21l.203 1.2c.105.586.24.895.408.925"/>
     </g>
 </svg>
index e4f1bda..15795c5 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/italic-armn-sha.png and b/resources/lib/oojs-ui/themes/apex/images/icons/italic-armn-sha.png differ
index 67283c8..f0d10d9 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="italic-armn-sha">
-        <path id="armn-sha" d="M11.564 7.678c-.268-.13-.578-.22-.93-.268-.35-.047-.75-.07-1.197-.07h-1.11L8.587 6h1.723c.558 0 1.042.032 1.45.095.416.063.794.173 1.136.33l4.483 2.033-.325 1.67-2.624-1.165c-.125-.058-.27-.103-.432-.134-.164-.04-.356-.058-.576-.058-.583 0-1.137.095-1.663.284-.525.19-1 .46-1.426.812-.42.35-.777.78-1.072 1.283-.294.505-.504 1.075-.63 1.71-.242 1.256-.152 2.21.268 2.87.426.65 1.19.977 2.294.977.55 0 1.045-.08 1.48-.237.437-.156.815-.377 1.136-.66.326-.29.59-.633.796-1.033.21-.4.362-.84.457-1.323l.11-.56h1.6l-.12.59c-.13.674-.356 1.288-.676 1.845-.32.55-.725 1.025-1.214 1.424-.488.394-1.053.7-1.694.922-.643.215-1.344.323-2.106.323-.767 0-1.434-.114-2-.34-.568-.226-1.025-.554-1.372-.985-.347-.436-.573-.97-.678-1.607-.105-.637-.078-1.364.08-2.184.125-.66.346-1.273.66-1.835.316-.568.697-1.067 1.144-1.497.445-.436.944-.794 1.496-1.072.55-.283 1.13-.474 1.733-.574l-.466-.23"/>
+        <path id="armn-sha" d="M11.564 7.678c-.268-.13-.578-.22-.93-.268-.35-.047-.75-.07-1.197-.07h-1.11L8.587 6h1.723c.558 0 1.042.032 1.45.095.416.063.794.173 1.136.33l4.483 2.033-.327 1.67-2.624-1.165c-.126-.058-.27-.103-.433-.134-.164-.04-.356-.06-.576-.06-.582 0-1.136.095-1.662.284-.526.19-1 .46-1.427.812-.42.35-.776.78-1.07 1.283-.294.504-.504 1.074-.63 1.71-.24 1.255-.15 2.21.27 2.87.424.65 1.19.976 2.292.976.55 0 1.045-.08 1.48-.237.437-.157.815-.378 1.136-.66.325-.29.59-.634.795-1.034.21-.4.362-.84.457-1.323l.11-.56h1.6l-.12.59c-.13.674-.356 1.288-.676 1.845-.32.55-.725 1.024-1.214 1.423-.488.395-1.053.7-1.694.923-.643.215-1.344.323-2.106.323-.767 0-1.434-.114-2-.34-.568-.226-1.025-.554-1.372-.985-.347-.435-.573-.97-.678-1.606-.105-.637-.078-1.364.08-2.184.125-.66.346-1.273.66-1.835.316-.568.697-1.067 1.144-1.497.445-.436.944-.794 1.496-1.072.55-.283 1.13-.474 1.733-.574l-.466-.23"/>
     </g>
 </svg>
index 1ba8613..2b8b6e4 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/italic-c.png and b/resources/lib/oojs-ui/themes/apex/images/icons/italic-c.png differ
index 0ef7345..2018e60 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="italic-c">
-        <path id="c" d="M15.008 13.718l1.48.214c-.467 1.34-1.15 2.354-2.045 3.04-.896.686-1.9 1.03-3.015 1.03-1.36 0-2.438-.43-3.237-1.29C7.398 15.85 7 14.618 7 13.013c0-2.09.606-3.818 1.817-5.185C9.897 6.61 11.237 6 12.84 6c1.186 0 2.145.33 2.878.99.738.66 1.165 1.546 1.282 2.66l-1.397.135c-.148-.84-.453-1.464-.916-1.876-.458-.418-1.05-.626-1.78-.626-1.368 0-2.475.63-3.32 1.892-.733 1.087-1.1 2.377-1.1 3.87 0 1.194.283 2.104.848 2.732.565.628 1.3.942 2.206.942.775 0 1.474-.26 2.1-.784.626-.522 1.08-1.26 1.366-2.216"/>
+        <path id="c" d="M15.008 13.718l1.48.214c-.467 1.34-1.15 2.354-2.045 3.04-.896.686-1.9 1.03-3.015 1.03-1.36 0-2.438-.43-3.237-1.29C7.4 15.85 7 14.618 7 13.012c0-2.09.606-3.817 1.817-5.184C9.897 6.61 11.237 6 12.84 6c1.186 0 2.145.33 2.878.99.738.66 1.165 1.546 1.282 2.66l-1.397.135c-.148-.84-.453-1.464-.916-1.876-.458-.42-1.05-.628-1.78-.628-1.368 0-2.475.63-3.32 1.892-.733 1.087-1.1 2.377-1.1 3.87 0 1.194.283 2.104.848 2.732.565.628 1.3.942 2.206.942.777 0 1.476-.26 2.1-.785.628-.522 1.08-1.26 1.368-2.216"/>
     </g>
 </svg>
index 39b09a2..4ace3f3 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/italic-d.png and b/resources/lib/oojs-ui/themes/apex/images/icons/italic-d.png differ
index 6ac99ab..c044c86 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="italic-d">
-        <path id="d" d="M7 18L9.462 6h3.557c.852 0 1.504.063 1.954.188.644.17 1.194.472 1.65.91.456.43.8.97 1.03 1.62.23.65.346 1.378.346 2.186 0 .966-.145 1.847-.435 2.644-.284.79-.66 1.49-1.127 2.095-.46.6-.947 1.072-1.456 1.416-.504.337-1.102.588-1.794.752-.526.126-1.172.188-1.94.188H7m1.86-1.36h1.866c.842 0 1.59-.078 2.245-.236.41-.098.757-.243 1.047-.434.38-.246.727-.57 1.038-.974.408-.535.732-1.143.974-1.825.246-.687.37-1.467.37-2.34 0-.97-.167-1.716-.5-2.235-.333-.524-.756-.87-1.27-1.04-.382-.126-.975-.188-1.78-.188H11L9.095 16.64"/>
+        <path id="d" d="M7 18L9.462 6h3.557c.85 0 1.502.063 1.952.188.644.17 1.194.472 1.65.91.456.43.8.97 1.03 1.62.23.65.346 1.378.346 2.186 0 .966-.146 1.847-.436 2.644-.284.79-.66 1.49-1.127 2.095-.46.6-.947 1.072-1.456 1.416-.504.335-1.1.586-1.794.75-.526.126-1.172.19-1.94.19H7m1.86-1.36h1.866c.842 0 1.59-.08 2.245-.238.41-.098.76-.243 1.05-.434.38-.247.726-.57 1.037-.975.408-.535.732-1.143.974-1.825.247-.687.37-1.467.37-2.34 0-.97-.166-1.716-.5-2.235-.332-.524-.755-.87-1.27-1.04-.38-.126-.974-.188-1.78-.188H11L9.095 16.64"/>
     </g>
 </svg>
index 72df8bb..f385149 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="italic-e">
-        <path id="e" d="M7 18L9.474 6H18l-.282 1.367H10.77L10.02 11h6.09l-.28 1.367H9.74L8.86 16.64H16.3L16.018 18H7"/>
+        <path id="e" d="M7 18L9.474 6H18l-.282 1.367H10.77L10.02 11h6.09l-.28 1.367H9.74l-.88 4.273h7.44L16.018 18H7"/>
     </g>
 </svg>
index 3ab33f2..7f2512e 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/italic-geor-kan.png and b/resources/lib/oojs-ui/themes/apex/images/icons/italic-geor-kan.png differ
index a1a93dc..867f458 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="italic-geor-kan">
-        <path id="geor-kan" d="M15.057 14.663C14.617 16.888 13.223 18 10.88 18 8.96 18 8 17.213 8 15.64c0-.298.036-.624.108-.977.083-.43.245-.836.488-1.217l1.24.605-.206.614c-.055.26-.083.497-.083.712 0 .972.52 1.458 1.564 1.458 1.308 0 2.102-.723 2.384-2.17l.058-.33c.044-.222.066-.426.066-.614 0-.928-.546-1.39-1.638-1.39h-1.117l.248-1.26h1.118c1.202-.005 1.908-.552 2.118-1.64.04-.182.058-.356.058-.522 0-1.143-.9-1.714-2.697-1.714L11.94 6C14.646 6 16 6.877 16 8.627c0 .248-.027.516-.082.803-.204 1.092-1.05 1.824-2.54 2.194l-.033.166c1.23.2 1.845.823 1.845 1.872 0 .21-.025.433-.074.67l-.058.332"/>
+        <path id="geor-kan" d="M15.057 14.663C14.617 16.888 13.223 18 10.88 18 8.96 18 8 17.213 8 15.64c0-.298.036-.624.108-.977.083-.43.245-.836.488-1.217l1.24.605-.206.616c-.055.26-.083.497-.083.712 0 .972.52 1.458 1.564 1.458 1.31 0 2.104-.723 2.386-2.17l.058-.33c.044-.222.066-.426.066-.614 0-.927-.547-1.39-1.64-1.39h-1.116l.248-1.26h1.118c1.202-.004 1.908-.55 2.118-1.64.04-.18.058-.355.058-.52 0-1.144-.9-1.715-2.697-1.715L11.94 6C14.646 6 16 6.877 16 8.627c0 .248-.027.516-.082.803-.204 1.092-1.05 1.824-2.54 2.194l-.033.166c1.23.2 1.845.823 1.845 1.872 0 .21-.025.433-.074.67l-.058.332"/>
     </g>
 </svg>
index aafa618..c3b1e6e 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/italic-s.png and b/resources/lib/oojs-ui/themes/apex/images/icons/italic-s.png differ
index 56e457b..1c5a4ca 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="italic-s">
-        <path id="s" d="M16.474 6.59l-.302 1.525c-.522-.28-1.04-.488-1.557-.628-.51-.145-1.007-.217-1.487-.217-.935 0-1.68.204-2.23.612-.554.408-.83.95-.83 1.627 0 .37.1.657.302.86.207.195.733.407 1.58.634l.937.232c1.06.274 1.795.622 2.208 1.046.413.418.62 1.007.62 1.766 0 1.167-.46 2.117-1.38 2.85-.913.734-2.12 1.1-3.617 1.1-.615 0-1.232-.06-1.852-.185-.62-.12-1.242-.302-1.867-.55l.317-1.61c.573.355 1.147.624 1.72.805.578.18 1.154.27 1.728.27.976 0 1.76-.216 2.347-.65.59-.434.883-1 .883-1.697 0-.464-.12-.815-.356-1.053-.233-.243-.737-.462-1.512-.658l-.937-.24c-1.068-.28-1.8-.6-2.19-.962-.388-.367-.582-.878-.582-1.534 0-1.152.442-2.094 1.325-2.828.888-.74 2.043-1.108 3.463-1.108.553 0 1.1.05 1.642.147.542.098 1.085.245 1.627.442"/>
+        <path id="s" d="M16.474 6.59l-.302 1.525c-.522-.28-1.04-.488-1.557-.628-.51-.145-1.007-.217-1.487-.217-.935 0-1.68.204-2.23.612-.554.408-.83.95-.83 1.627 0 .37.1.655.302.86.207.193.733.405 1.58.632l.937.232c1.06.274 1.795.622 2.208 1.046.413.42.62 1.008.62 1.767 0 1.167-.46 2.117-1.38 2.85-.913.734-2.12 1.1-3.617 1.1-.615 0-1.232-.06-1.852-.185-.62-.12-1.242-.302-1.867-.55l.315-1.61c.573.355 1.147.624 1.72.805.578.18 1.154.27 1.728.27.976 0 1.76-.216 2.347-.65.59-.434.884-1 .884-1.697 0-.464-.12-.815-.356-1.053-.233-.243-.737-.462-1.512-.658l-.937-.24c-1.07-.28-1.8-.6-2.19-.964-.39-.367-.584-.878-.584-1.534 0-1.152.442-2.094 1.325-2.828.89-.74 2.044-1.108 3.464-1.108.553 0 1.1.05 1.642.147.542.098 1.085.245 1.627.442"/>
     </g>
 </svg>
index ebd11a2..cae0e77 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/language.png and b/resources/lib/oojs-ui/themes/apex/images/icons/language.png differ
index 549c303..694d225 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="language">
-        <path id="japanese" d="M17.533 9.81l.27-.59 1.042.407-.18.363c.66.27 1.1.468 1.312.59.33.21.618.513.86.904.21.393.316.846.316 1.358 0 .786-.302 1.48-.905 2.083-.604.634-1.66 1.057-3.17 1.268-.12-.36-.257-.68-.407-.95.966-.15 1.646-.333 2.038-.545.454-.21.785-.48.998-.813.21-.303.314-.663.314-1.087 0-.482-.136-.905-.407-1.27-.33-.33-.8-.588-1.402-.77-.332.635-.648 1.118-.95 1.45-.242.332-.694.906-1.358 1.72.09.394.18.71.272.952l-1.042.362-.09-.498c-.424.36-.802.617-1.134.77-.36.15-.664.226-.905.226-.303 0-.574-.136-.814-.407-.244-.3-.363-.68-.363-1.132 0-.603.136-1.146.407-1.63.24-.452.603-.89 1.086-1.312.272-.24.725-.528 1.36-.86 0-.27.03-.8.09-1.585-.515.03-.922.045-1.223.045-.393 0-.71-.015-.95-.045l-.047-1.04c.725.09 1.494.134 2.31.134 0-.15.075-.738.227-1.766l1.177.184c-.15.542-.256 1.04-.316 1.493.242-.03.543-.075.906-.136.362-.06.573-.09.634-.09s.648-.15 1.766-.453l.046 1.04c-.967.244-2.145.44-3.532.592-.062.662-.092 1.085-.092 1.265.663-.15 1.284-.225 1.857-.225zm-2.672 3.893c-.06-.48-.135-1.252-.226-2.31-.573.424-1.04.86-1.403 1.313-.302.423-.45.875-.45 1.358 0 .24.043.438.135.588.09.092.195.137.316.137.364 0 .908-.362 1.63-1.087zm.772-2.763c0 .483.03 1.088.09 1.81.604-.904 1.057-1.598 1.36-2.08-.575.06-1.06.15-1.45.27z"/>
+        <path id="japanese" d="M17.533 9.81l.27-.59 1.042.407-.18.363c.66.27 1.1.468 1.312.59.33.21.618.513.86.904.21.393.316.846.316 1.358 0 .786-.302 1.48-.905 2.083-.604.634-1.66 1.057-3.17 1.268-.12-.36-.257-.68-.407-.95.968-.15 1.648-.333 2.04-.545.454-.21.785-.48.998-.813.21-.303.314-.663.314-1.087 0-.482-.135-.905-.406-1.27-.33-.33-.8-.588-1.402-.77-.332.635-.648 1.118-.95 1.45-.242.332-.694.906-1.358 1.72.09.394.18.71.272.952l-1.042.362-.09-.498c-.424.36-.802.617-1.134.77-.36.15-.664.226-.905.226-.303 0-.574-.136-.814-.407-.243-.3-.362-.68-.362-1.132 0-.6.137-1.144.408-1.63.24-.45.603-.89 1.086-1.31.273-.24.726-.53 1.36-.86 0-.27.03-.8.09-1.585-.514.03-.92.045-1.222.045-.393 0-.71-.016-.95-.046l-.047-1.04c.726.09 1.495.134 2.31.134 0-.15.076-.738.228-1.766l1.177.184c-.15.542-.256 1.04-.316 1.493.24-.03.542-.077.905-.138.36-.06.572-.09.633-.09s.647-.15 1.765-.453l.046 1.04c-.966.243-2.144.44-3.53.59-.063.663-.093 1.086-.093 1.266.664-.15 1.285-.225 1.858-.225zm-2.672 3.893c-.06-.48-.133-1.252-.224-2.31-.573.424-1.04.86-1.403 1.313-.302.423-.45.875-.45 1.358 0 .24.043.438.135.588.09.092.195.137.316.137.364 0 .908-.364 1.63-1.09zm.774-2.763c0 .483.03 1.088.09 1.81.604-.904 1.057-1.598 1.36-2.08-.575.06-1.06.15-1.45.27z"/>
         <path id="english" d="M9.497 15.98h1.85L8.265 7.033h-1.85l-3.08 8.95h1.85L5.74 14h3.21l.547 1.98zm-3.49-3.376L7.34 8.822l1.343 3.782H6.008z"/>
     </g>
 </svg>
index f1ac1e3..710872b 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="link">
-        <path id="right" d="M19.188 12c0 1.1-.89 2.016-1.988 2.016L13.005 14c.538 1.09.963 2 1.997 2h3C19.658 16 21 13.657 21 12s-1.342-4-2.998-4h-3c-1.034 0-1.46.91-1.998 2l4.195-.016c1.097 0 1.988.917 1.988 2.017z"/>
+        <path id="right" d="M19.188 12c0 1.1-.89 2.016-1.988 2.016L13.005 14c.538 1.09.963 2 1.997 2h3C19.658 16 21 13.657 21 12s-1.342-4-2.998-4h-3c-1.034 0-1.46.91-1.998 2l4.195-.016c1.095 0 1.986.917 1.986 2.017z"/>
         <path id="center" d="M8 12c0 .535.42 1 .938 1h6.11c.517 0 .937-.465.937-1 0-.534-.42-1-.938-1h-6.11C8.42 11 8 11.466 8 12z"/>
         <path id="left" d="M4.816 12c0-1.1.89-2.016 1.988-2.016L11 10c-.54-1.09-.964-2-1.998-2h-3c-1.656 0-2.998 2.343-2.998 4s1.342 4 2.998 4h3c1.034 0 1.46-.91 1.998-2l-4.195.016c-1.098 0-1.99-.917-1.99-2.017z"/>
     </g>
index dbce05e..7aab217 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.png and b/resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.png differ
index 00583b4..48d2c7e 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="move-rtl">
-        <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.414-1.413-6.715 6.716L13.65 19.2z"/>
+        <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.415-1.41-6.714 6.716L13.65 19.2z"/>
     </g>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/notice.png b/resources/lib/oojs-ui/themes/apex/images/icons/notice.png
new file mode 100644 (file)
index 0000000..7d27f8e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/notice.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/notice.svg b/resources/lib/oojs-ui/themes/apex/images/icons/notice.svg
new file mode 100644 (file)
index 0000000..b7fb2e7
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" id="svg3116">
+    <g id="alert">
+        <path d="M12 18c-3.314 0-6-2.686-6-6s2.686-6 6-6 6 2.686 6 6-2.686 6-6 6zm-1-5h2V8h-2zm0 3h2v-2h-2z" id="path3119"/>
+    </g>
+</svg>
index 68bb9d7..b8736a0 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/regular-expression.png and b/resources/lib/oojs-ui/themes/apex/images/icons/regular-expression.png differ
index e9594a1..5f10d4d 100644 (file)
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="regular-expression">
-        <path id="left-bracket" d="M3 12.045c0-.99.15-1.915.45-2.777.306-.862.743-1.618 1.314-2.268H6.23c-.552.72-.968 1.512-1.25 2.374-.28.862-.42 1.75-.42 2.66 0 .915.142 1.8.427 2.654.29.85.7 1.622 1.23 2.312H4.766c-.574-.635-1.012-1.376-1.313-2.223-.3-.847-.45-1.758-.45-2.732"/>
+        <path id="left-bracket" d="M3 12.045c0-.99.15-1.915.45-2.777.306-.862.743-1.618 1.314-2.268H6.23c-.552.72-.968 1.512-1.25 2.374-.28.862-.42 1.75-.42 2.66 0 .915.142 1.8.427 2.654.29.85.7 1.622 1.23 2.312h-1.45c-.575-.635-1.013-1.376-1.314-2.223-.3-.847-.45-1.758-.45-2.732"/>
         <path id="dot" d="M10 16c0 .552-.448 1-1 1s-1-.448-1-1 .448-1 1-1 1 .448 1 1z"/>
-        <path id="star" d="M14.25 7.013l-.24 2.156 2.187-.61.193 1.477-1.992.14 1.307 1.74-1.33.71-.914-1.834-.802 1.822-1.383-.697 1.295-1.74-1.98-.152.23-1.465 2.138.61-.24-2.156h1.535"/>
-        <path id="right-bracket" d="M21 12.045c0 .982-.152 1.896-.457 2.744-.3.846-.737 1.584-1.307 2.21h-1.453c.527-.686.936-1.455 1.225-2.306.29-.855.434-1.74.434-2.66 0-.91-.14-1.797-.422-2.66-.28-.862-.697-1.654-1.248-2.374h1.465c.574.653 1.012 1.413 1.313 2.28.3.86.45 1.783.45 2.765"/>
+        <path id="star" d="M14.25 7.013l-.24 2.156 2.187-.61.193 1.475-1.992.14 1.307 1.74-1.33.71-.914-1.834-.8 1.823-1.383-.697 1.295-1.74-1.98-.152.23-1.465 2.14.61-.24-2.157h1.534"/>
+        <path id="right-bracket" d="M21 12.045c0 .982-.152 1.896-.457 2.744-.3.844-.737 1.582-1.307 2.21h-1.453c.527-.688.936-1.457 1.225-2.308.29-.855.434-1.74.434-2.66 0-.91-.14-1.797-.422-2.66-.28-.862-.697-1.654-1.248-2.374h1.465c.574.652 1.012 1.412 1.313 2.28.3.86.45 1.782.45 2.764"/>
     </g>
 </svg>
index 39d3ab8..d6e3e8e 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/search.png and b/resources/lib/oojs-ui/themes/apex/images/icons/search.png differ
index e683c01..070e4bf 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="search">
-        <path id="search" d="M16.02 15.96l-2.373-2.375-.17-.1c.404-.565.644-1.26.644-2.008C14.12 9.557 12.564 8 10.645 8c-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.643l.098.17 2.375 2.373c.19.19.543.143.79-.104s.293-.6.104-.79zm-5.376-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.993-2.213 2.214-2.213 1.222 0 2.213.992 2.213 2.213 0 1.222-.992 2.213-2.213 2.213z"/>
+        <path id="search" d="M16.02 15.96l-2.373-2.375-.17-.1c.404-.565.644-1.26.644-2.008C14.12 9.557 12.566 8 10.647 8c-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.643l.098.17 2.375 2.373c.19.19.542.143.79-.104s.292-.6.103-.79zm-5.376-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.995-2.213 2.216-2.213 1.222 0 2.213.992 2.213 2.213 0 1.222-.993 2.213-2.214 2.213z"/>
     </g>
 </svg>
index 9a75454..6eefe90 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="secure">
-        <path id="lock" d="M8 5h.02v-.997c0-.057.003-1.41-.833-2.255-.434-.438-.998-.66-1.68-.66s-1.244.222-1.677.66c-.837.846-.833 2.198-.832 2.25V5H3c-.553 0-1 .447-1 1v3c0 .553.447 1 1 1h5c.553 0 1-.447 1-1V6c0-.553-.447-1-1-1zM3.998 5V3.993c0-.01.005-1 .543-1.543.483-.485 1.45-.487 1.933-.002.544.546.546 1.536.546 1.55V5H3.997z"/>
+        <path id="lock" d="M8 5h.02v-.997c0-.057.003-1.41-.833-2.255-.434-.438-.998-.66-1.68-.66s-1.244.222-1.677.66c-.837.846-.833 2.198-.832 2.25V5H3c-.553 0-1 .447-1 1v3c0 .553.447 1 1 1h5c.553 0 1-.447 1-1V6c0-.553-.447-1-1-1zM3.998 5V3.993c0-.01.005-1 .543-1.543.485-.485 1.45-.487 1.935-.002.544.546.546 1.536.546 1.55V5H3.998z"/>
     </g>
 </svg>
index 2f38ecc..e632f8a 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/specialCharacter.png and b/resources/lib/oojs-ui/themes/apex/images/icons/specialCharacter.png differ
index c2ffd48..bb81880 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="special-character">
-        <path id="omega" d="M12 6.708c-.794 0-1.368.103-1.894.31-.525.207-.944.496-1.255.867-.31.366-.53.808-.66 1.327-.127.513-.19 1.08-.19 1.7 0 .512.057 1 .173 1.46.122.46.31.87.568 1.23.63.862 1.156 1.138 2.012 1.362L11 18H6v-3h.604l.53 1.353.395.053.604.044.75.035.457.01H10l-.09-.895c-.63-.094-.812-.268-1.337-.522-.525-.26-.98-.59-1.365-.99-.38-.402-.675-.868-.89-1.4-.213-.536-.32-1.13-.32-1.778 0-.82.13-1.537.394-2.15.27-.62.656-1.133 1.163-1.54.507-.407 1.133-.71 1.878-.912.745-.206 1.6-.31 2.565-.31.96 0 1.81.103 2.556.31.75.2 1.38.504 1.887.912.508.407.893.92 1.155 1.54.27.614.403 1.33.403 2.15 0 .65-.107 1.242-.32 1.78-.215.53-.514.996-.9 1.397-.378.4-.83.732-1.355.99-.525.255-.707.43-1.336.523l-.092.894h.66l.447-.01.75-.034.606-.044.403-.053.532-1.354h.605v3h-5l.247-3.036c1.066-.11 1.337-.696 2.002-1.363.263-.36.452-.77.568-1.23.122-.46.183-.946.183-1.46 0-.618-.064-1.185-.192-1.698-.128-.52-.348-.962-.66-1.327-.31-.372-.73-.66-1.255-.867-.525-.206-1.1-.31-1.894-.31"/>
+        <path id="omega" d="M12 6.708c-.794 0-1.368.103-1.894.31-.525.207-.944.496-1.255.867-.31.366-.53.808-.66 1.327-.125.513-.19 1.08-.19 1.7 0 .512.06 1 .175 1.46.122.46.31.87.568 1.23.63.862 1.156 1.138 2.012 1.362L11 18H6v-3h.604l.53 1.353.395.053.602.044.75.035.457.01H10l-.09-.895c-.63-.094-.812-.268-1.337-.522-.525-.26-.98-.59-1.365-.99-.38-.402-.675-.868-.89-1.4-.213-.536-.32-1.13-.32-1.778 0-.82.13-1.537.394-2.15.27-.62.656-1.133 1.163-1.54.507-.407 1.133-.71 1.878-.912.745-.206 1.6-.31 2.565-.31.96 0 1.81.103 2.556.31.75.2 1.38.504 1.887.912.51.407.895.92 1.157 1.54.27.614.403 1.33.403 2.15 0 .65-.108 1.242-.32 1.78-.216.53-.515.996-.9 1.397-.38.4-.83.732-1.356.99-.525.255-.707.43-1.336.523l-.092.894h.66l.447-.01.75-.034.606-.044.4-.053.533-1.354H18v3h-5l.246-3.038c1.066-.11 1.337-.696 2.002-1.363.263-.36.452-.77.568-1.23.122-.46.183-.947.183-1.46 0-.62-.066-1.186-.194-1.7-.128-.52-.348-.96-.66-1.326-.31-.372-.73-.66-1.255-.867-.524-.206-1.1-.31-1.893-.31"/>
     </g>
 </svg>
index 6408d01..71fa960 100644 (file)
@@ -2,6 +2,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="strikethrough-s">
         <path id="strikethrough" d="M6 12h12v1H6v-1z"/>
-        <path id="s" d="M12.094 6c-1.133 0-2.076.287-2.75.9-.67.613-1 1.49-1 2.52 0 .89.22 1.602.72 2.13.497.528 1.278.91 2.31 1.14l.813.182v-.03c.656.147 1.128.375 1.375.63.252.256.375.607.375 1.11 0 .573-.172.97-.53 1.26-.36.29-.895.45-1.626.45-.476 0-.968-.074-1.468-.24-.502-.166-1.03-.417-1.562-.75l-.375-.238v2.158l.156.062c.58.237 1.144.417 1.69.54.548.12 1.07.18 1.56.18 1.287 0 2.298-.293 3-.9.71-.605 1.063-1.486 1.063-2.608 0-.943-.256-1.726-.78-2.312-.522-.592-1.306-1-2.345-1.23l-.812-.18c-.716-.148-1.204-.352-1.406-.54-.205-.202-.312-.484-.312-.934 0-.533.162-.9.5-1.17.342-.27.836-.42 1.53-.42.396 0 .82.052 1.25.18.434.128.91.334 1.407.6l.375.18V6.63s-1.188-.383-1.688-.48c-.5-.097-.984-.15-1.468-.15z"/>
+        <path id="s" d="M12.094 6c-1.133 0-2.076.287-2.75.9-.67.613-1 1.49-1 2.52 0 .89.22 1.602.72 2.13.497.528 1.278.91 2.31 1.14l.813.182v-.03c.656.147 1.128.375 1.375.63.252.256.375.607.375 1.11 0 .573-.172.97-.53 1.26-.36.29-.895.45-1.626.45-.474 0-.966-.074-1.466-.24-.502-.166-1.03-.417-1.562-.75l-.374-.238v2.158l.156.062c.58.237 1.144.417 1.69.54.548.12 1.07.18 1.56.18 1.287 0 2.298-.293 3-.9.71-.605 1.063-1.486 1.063-2.608 0-.943-.256-1.726-.78-2.312-.522-.592-1.306-1-2.345-1.23l-.812-.18c-.716-.148-1.204-.352-1.406-.54-.205-.202-.312-.484-.312-.934 0-.533.162-.9.5-1.17.342-.27.836-.42 1.53-.42.396 0 .82.052 1.25.18.434.128.91.334 1.407.6l.374.18V6.63s-1.188-.383-1.688-.48c-.5-.097-.984-.15-1.468-.15z"/>
     </g>
 </svg>
index 15de70b..3bfbd0b 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/tag.png and b/resources/lib/oojs-ui/themes/apex/images/icons/tag.png differ
index 8e517bf..71671c0 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="tag">
-        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.388-.707-1.156-.707-1.706V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.708.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.576 1.515.576 2.094 0 .576-.578.576-1.517 0-2.095-.58-.576-1.518-.577-2.094 0z"/>
+        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.386-.707-1.154-.707-1.704V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.574 1.515.574 2.094 0 .576-.58.576-1.52 0-2.097-.58-.576-1.518-.577-2.094 0z"/>
     </g>
 </svg>
index d9ff340..77c66a0 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="text-style">
-        <path id="a" d="M15.296 18h2.79l-1.14-12h-2.79L6 18h2.79l2.038-3h4.183l.286 3zm-3.11-5L14.5 9.6l.323 3.4h-2.633z"/>
+        <path id="a" d="M15.296 18h2.79l-1.14-12h-2.79L6 18h2.79l2.038-3h4.183l.288 3zm-3.11-5L14.5 9.6l.323 3.4H12.19z"/>
         <path id="underline" d="M6 19h12v1H6v-1z"/>
     </g>
 </svg>
index 81713bd..f4add0a 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/underline-a.png and b/resources/lib/oojs-ui/themes/apex/images/icons/underline-a.png differ
index ea7350b..1ddae10 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="underline-a">
-        <path id="a" d="M14.424 16H16.5L13.037 6H10.96L7.5 16h2.077l.627-2h3.604l.616 2zm-3.92-3.623l1.495-4.38 1.51 4.38h-3z"/>
+        <path id="a" d="M14.424 16H16.5L13.037 6H10.96L7.5 16h2.077l.627-2h3.604l.616 2zm-3.92-3.623L12 7.997l1.51 4.38h-3z"/>
         <path id="underline" d="M7 17h10v1H7v-1z"/>
     </g>
 </svg>
index d07129f..7378298 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="underline-u">
-        <path id="u" d="M8 6h2v5.96c-.104 1.706.695 2 2 2.04 1.777.062 2.002-.88 2-2.04V6h2v6.123c0 1.28-.338 2.245-1.016 2.898-.672.652-1.666.98-2.98.98-1.32 0-2.32-.326-2.996-.98C8.336 14.37 8 13.403 8 12.124V6"/>
+        <path id="u" d="M8 6h2v5.96c-.104 1.706.695 2 2 2.04 1.777.062 2.002-.88 2-2.04V6h2v6.123c0 1.28-.338 2.245-1.016 2.898-.672.654-1.666.98-2.98.98-1.32 0-2.32-.324-2.996-.98C8.336 14.37 8 13.405 8 12.126V6"/>
         <path id="underline" d="M7 17h10v1H7v-1z"/>
     </g>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/clear.png b/resources/lib/oojs-ui/themes/apex/images/indicators/clear.png
new file mode 100644 (file)
index 0000000..5db444c
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/indicators/clear.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/clear.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/clear.svg
new file mode 100644 (file)
index 0000000..b18405d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+    <g id="clear">
+        <path id="circle-with-cross" d="M6 0C2.7 0 0 2.7 0 6s2.7 6 6 6 6-2.7 6-6-2.7-6-6-6zM3.5 2.5L6 5l2.5-2.5 1 1L7 6l2.5 2.5-1 1L6 7 3.5 9.5l-1-1L5 6 2.5 3.5z"/>
+    </g>
+</svg>
index cc1f377..985e602 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/indicators/search-ltr.png and b/resources/lib/oojs-ui/themes/apex/images/indicators/search-ltr.png differ
index 9b49c4b..e5c4010 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="search">
-        <path id="path3051" d="M10.37 9.474L7.994 7.1l-.17-.1c.404-.566.644-1.26.644-2.01-.002-1.92-1.56-3.476-3.478-3.476-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.644l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zM4.99 7.204c-1.22 0-2.213-.99-2.213-2.213 0-1.22.99-2.212 2.212-2.212 1.222 0 2.213.992 2.213 2.213 0 1.223-.992 2.214-2.213 2.214z"/>
+        <path id="path3051" d="M10.37 9.474L7.994 7.1l-.17-.1c.404-.566.644-1.26.644-2.01-.002-1.92-1.56-3.476-3.478-3.476-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.646l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zm-5.38-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.99-2.21 2.212-2.21 1.22 0 2.21.99 2.21 2.213S6.21 7.207 4.99 7.207z"/>
     </g>
 </svg>
index 5564b42..4213d67 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/indicators/search-rtl.png and b/resources/lib/oojs-ui/themes/apex/images/indicators/search-rtl.png differ
index 3847af2..759f57e 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="search">
-        <path id="path3051" d="M1.63 9.474L4.006 7.1l.17-.1c-.404-.566-.644-1.26-.644-2.01.002-1.92 1.56-3.476 3.478-3.476 1.92 0 3.478 1.557 3.478 3.478 0 1.92-1.557 3.477-3.478 3.477-.75 0-1.442-.24-2.01-.644l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27c1.22 0 2.213-.99 2.213-2.213 0-1.22-.99-2.212-2.212-2.212-1.222 0-2.213.992-2.213 2.213 0 1.223.992 2.214 2.213 2.214z"/>
+        <path id="path3051" d="M1.63 9.474L4.006 7.1l.17-.1c-.404-.566-.644-1.26-.644-2.01.002-1.92 1.56-3.476 3.478-3.476 1.92 0 3.478 1.557 3.478 3.478 0 1.92-1.557 3.477-3.478 3.477-.75 0-1.442-.24-2.01-.646l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27c1.22 0 2.213-.99 2.213-2.213 0-1.22-.99-2.21-2.21-2.21-1.222 0-2.213.99-2.213 2.213S5.79 7.207 7.01 7.207z"/>
     </g>
 </svg>
index 0a9d1d2..9a9afa8 100644 (file)
@@ -3,6 +3,7 @@
        "intro": "@import '../../../../src/styles/common';",
        "images": {
                "alert": { "file": "images/indicators/alert.svg" },
+               "clear": { "file": "images/indicators/clear.svg" },
                "up": { "file": "images/indicators/arrow-up.svg" },
                "down": { "file": "images/indicators/arrow-down.svg" },
                "next": { "file": {
index 03aeb51..48af33a 100644 (file)
@@ -29,7 +29,7 @@
                        "lang": {
                                "ar": "images/icons/bold-arab-ain.svg",
                                "be": "images/icons/bold-cyrl-te.svg",
-                               "cs,en,he,ml,pl": "images/icons/bold-b.svg",
+                               "cs,en,he,ml,pl,sco": "images/icons/bold-b.svg",
                                "da,de,hu,ksh,nn,no,sv": "images/icons/bold-f.svg",
                                "es,gl,pt": "images/icons/bold-n.svg",
                                "eu,fi": "images/icons/bold-l.svg",
@@ -46,7 +46,7 @@
                        "default": "images/icons/italic-a.svg",
                        "lang": {
                                        "ar": "images/icons/italic-arab-meem.svg",
-                                       "cs,en,fr,he,ml,pl,pt": "images/icons/italic-i.svg",
+                                       "cs,en,fr,he,ml,pl,pt,sco": "images/icons/italic-i.svg",
                                        "be,da,de,fi,ky,nn,no,os,sv,ru": "images/icons/italic-k.svg",
                                        "es,gl,it,nl": "images/icons/italic-c.svg",
                                        "eu": "images/icons/italic-e.svg",
index a311de0..f351b5b 100644 (file)
@@ -50,6 +50,7 @@
                        "ltr": "images/icons/move-ltr.svg",
                        "rtl": "images/icons/move-rtl.svg"
                } },
+               "notice": { "file": "images/icons/notice.svg" },
                "picture": { "file": "images/icons/picture.svg" },
                "previous": { "file": {
                        "ltr": "images/icons/move-rtl.svg",
index 74cf62b..4f786c5 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced-invert.png differ
index 855b7b8..a0f0670 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <path d="M20 13.44v-2.88l-1.8-.3c-.1-.397-.3-.794-.6-1.39l1.1-1.49-2.1-2.088-1.5 1.093c-.5-.298-1-.497-1.4-.596L13.5 4h-2.9l-.3 1.79c-.5.098-.9.297-1.4.595L7.4 5.292 5.3 7.38l1 1.49c-.3.496-.4.894-.6 1.39l-1.7.2v2.882l1.8.298c.1.497.3.894.6 1.39l-1 1.492 2.1 2.087 1.5-.995c.4.2.9.397 1.4.596l.3 1.79h3l.3-1.79c.5-.098.9-.297 1.4-.595l1.5 1.093L19 16.62l-1.1-1.49c.3-.496.5-.993.6-1.39l1.5-.3zm-8 1.492c-1.7 0-3-1.292-3-2.982 0-1.69 1.3-2.98 3-2.98s3 1.29 3 2.98-1.3 2.982-3 2.982z"/>
+    <path d="M20 13.44v-2.88l-1.8-.3c-.1-.397-.3-.794-.6-1.39l1.1-1.49-2.1-2.088-1.5 1.093c-.5-.298-1-.497-1.4-.596L13.5 4h-2.9l-.3 1.79c-.5.098-.9.297-1.4.595L7.4 5.292 5.3 7.38l1 1.49c-.3.496-.4.894-.6 1.39l-1.7.2v2.882l1.8.298c.1.497.3.894.6 1.39l-1 1.492 2.1 2.087 1.5-.997c.4.2.9.397 1.4.596l.3 1.79h3l.3-1.79c.5-.1.9-.298 1.4-.596l1.5 1.093L19 16.62l-1.1-1.49c.3-.496.5-.993.6-1.39l1.5-.3zm-8 1.492c-1.7 0-3-1.292-3-2.982 0-1.69 1.3-2.98 3-2.98s3 1.29 3 2.98-1.3 2.982-3 2.982z"/>
 </svg>
index c486b98..1358969 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced.png differ
index cdf07b2..d0bd78b 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M20 13.44v-2.88l-1.8-.3c-.1-.397-.3-.794-.6-1.39l1.1-1.49-2.1-2.088-1.5 1.093c-.5-.298-1-.497-1.4-.596L13.5 4h-2.9l-.3 1.79c-.5.098-.9.297-1.4.595L7.4 5.292 5.3 7.38l1 1.49c-.3.496-.4.894-.6 1.39l-1.7.2v2.882l1.8.298c.1.497.3.894.6 1.39l-1 1.492 2.1 2.087 1.5-.995c.4.2.9.397 1.4.596l.3 1.79h3l.3-1.79c.5-.098.9-.297 1.4-.595l1.5 1.093L19 16.62l-1.1-1.49c.3-.496.5-.993.6-1.39l1.5-.3zm-8 1.492c-1.7 0-3-1.292-3-2.982 0-1.69 1.3-2.98 3-2.98s3 1.29 3 2.98-1.3 2.982-3 2.982z"/>
+    <path d="M20 13.44v-2.88l-1.8-.3c-.1-.397-.3-.794-.6-1.39l1.1-1.49-2.1-2.088-1.5 1.093c-.5-.298-1-.497-1.4-.596L13.5 4h-2.9l-.3 1.79c-.5.098-.9.297-1.4.595L7.4 5.292 5.3 7.38l1 1.49c-.3.496-.4.894-.6 1.39l-1.7.2v2.882l1.8.298c.1.497.3.894.6 1.39l-1 1.492 2.1 2.087 1.5-.997c.4.2.9.397 1.4.596l.3 1.79h3l.3-1.79c.5-.1.9-.298 1.4-.596l1.5 1.093L19 16.62l-1.1-1.49c.3-.496.5-.993.6-1.39l1.5-.3zm-8 1.492c-1.7 0-3-1.292-3-2.982 0-1.69 1.3-2.98 3-2.98s3 1.29 3 2.98-1.3 2.982-3 2.982z"/>
 </svg>
index 5440113..6071d88 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/alert-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/alert-invert.png differ
index d743519..55621b9 100644 (file)
@@ -3,6 +3,6 @@
     <g id="alert">
         <path id="point" d="M11 16h2v2h-2z"/>
         <path id="stroke" d="M13.516 10h-3L11 15h2z"/>
-        <path id="triangle" d="M12.017 5.974L19.537 19H4.496l7.52-13.026m0-2.474c-.544 0-1.088.357-1.5 1.07L2.532 18.403c-.825 1.43-.15 2.598 1.5 2.598H20c1.65 0 2.325-1.17 1.5-2.6L13.517 4.573c-.413-.715-.956-1.072-1.5-1.072z"/>
+        <path id="triangle" d="M12.017 5.974L19.537 19H4.497l7.52-13.026m0-2.474c-.545 0-1.09.357-1.5 1.07L2.53 18.403C1.705 19.833 2.38 21 4.03 21H20c1.65 0 2.325-1.17 1.5-2.6L13.517 4.575c-.413-.715-.956-1.072-1.5-1.072z"/>
     </g>
 </svg>
index fcf98c5..82bcd06 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/alert-warning.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/alert-warning.png differ
index 1daa91f..bdf0ac2 100644 (file)
@@ -3,6 +3,6 @@
     <g id="alert">
         <path id="point" d="M11 16h2v2h-2z"/>
         <path id="stroke" d="M13.516 10h-3L11 15h2z"/>
-        <path id="triangle" d="M12.017 5.974L19.537 19H4.496l7.52-13.026m0-2.474c-.544 0-1.088.357-1.5 1.07L2.532 18.403c-.825 1.43-.15 2.598 1.5 2.598H20c1.65 0 2.325-1.17 1.5-2.6L13.517 4.573c-.413-.715-.956-1.072-1.5-1.072z"/>
+        <path id="triangle" d="M12.017 5.974L19.537 19H4.497l7.52-13.026m0-2.474c-.545 0-1.09.357-1.5 1.07L2.53 18.403C1.705 19.833 2.38 21 4.03 21H20c1.65 0 2.325-1.17 1.5-2.6L13.517 4.575c-.413-.715-.956-1.072-1.5-1.072z"/>
     </g>
 </svg>
index e98a14a..98e94fb 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/alert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/alert.png differ
index 42a4bf6..8b601d5 100644 (file)
@@ -3,6 +3,6 @@
     <g id="alert">
         <path id="point" d="M11 16h2v2h-2z"/>
         <path id="stroke" d="M13.516 10h-3L11 15h2z"/>
-        <path id="triangle" d="M12.017 5.974L19.537 19H4.496l7.52-13.026m0-2.474c-.544 0-1.088.357-1.5 1.07L2.532 18.403c-.825 1.43-.15 2.598 1.5 2.598H20c1.65 0 2.325-1.17 1.5-2.6L13.517 4.573c-.413-.715-.956-1.072-1.5-1.072z"/>
+        <path id="triangle" d="M12.017 5.974L19.537 19H4.497l7.52-13.026m0-2.474c-.545 0-1.09.357-1.5 1.07L2.53 18.403C1.705 19.833 2.38 21 4.03 21H20c1.65 0 2.325-1.17 1.5-2.6L13.517 4.575c-.413-.715-.956-1.072-1.5-1.072z"/>
     </g>
 </svg>
index d46c11a..b498481 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain-invert.png differ
index da076ed..4363d3e 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="bold-arab-ain">
-        <path id="arab-ain" d="M9.337 13.616c0 1.35 1.386 2.1 4.16 2.258l2.186-.03.318.045c-.03.126-.25.344-.664.65l-.09.067c-1.235.93-2.422 1.393-3.56 1.393-1.142 0-2.045-.33-2.71-.99-.65-.66-.975-1.56-.975-2.698.006-1.354.567-2.573 1.685-3.658v-.044l-.606-.55c-.15-.18-.223-.39-.223-.63 0-.49.24-1.11.717-1.862.65-1.046 1.303-1.566 1.958-1.56.886.004 1.618.42 2.194 1.245.325.48-.03.552-1.064.22-.842-.327-1.527-.05-2.054.828l.015.074 1.123.865.052.006c1.404-.498 2.418-.74 3.043-.726-.058.117-.14.362-.243.733-.103.357-.204.684-.303.982l-.126.374-.384.05c-1.743.24-2.992.716-3.745 1.43-.464.463-.698.972-.703 1.524"/>
+        <path id="arab-ain" d="M9.337 13.616c0 1.35 1.386 2.1 4.16 2.258l2.186-.03.318.045c-.03.124-.25.342-.662.65l-.09.065c-1.235.93-2.422 1.393-3.56 1.393-1.142 0-2.045-.33-2.71-.99-.65-.66-.975-1.56-.975-2.7.006-1.353.567-2.572 1.685-3.657v-.043l-.606-.55c-.15-.18-.222-.39-.222-.63 0-.49.24-1.11.717-1.863.65-1.046 1.303-1.566 1.958-1.56.886.004 1.618.42 2.194 1.245.324.48-.03.55-1.065.22-.842-.328-1.527-.05-2.054.827l.015.074 1.123.866.052.005c1.403-.497 2.417-.74 3.042-.725-.058.116-.14.36-.243.732-.105.357-.206.684-.305.982l-.126.373-.385.05c-1.743.24-2.992.716-3.745 1.43-.463.463-.697.972-.702 1.524"/>
     </g>
 </svg>
index c2addd8..ad07634 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain.png differ
index ad6b3e4..2f0edb7 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="bold-arab-ain">
-        <path id="arab-ain" d="M9.337 13.616c0 1.35 1.386 2.1 4.16 2.258l2.186-.03.318.045c-.03.126-.25.344-.664.65l-.09.067c-1.235.93-2.422 1.393-3.56 1.393-1.142 0-2.045-.33-2.71-.99-.65-.66-.975-1.56-.975-2.698.006-1.354.567-2.573 1.685-3.658v-.044l-.606-.55c-.15-.18-.223-.39-.223-.63 0-.49.24-1.11.717-1.862.65-1.046 1.303-1.566 1.958-1.56.886.004 1.618.42 2.194 1.245.325.48-.03.552-1.064.22-.842-.327-1.527-.05-2.054.828l.015.074 1.123.865.052.006c1.404-.498 2.418-.74 3.043-.726-.058.117-.14.362-.243.733-.103.357-.204.684-.303.982l-.126.374-.384.05c-1.743.24-2.992.716-3.745 1.43-.464.463-.698.972-.703 1.524"/>
+        <path id="arab-ain" d="M9.337 13.616c0 1.35 1.386 2.1 4.16 2.258l2.186-.03.318.045c-.03.124-.25.342-.662.65l-.09.065c-1.235.93-2.422 1.393-3.56 1.393-1.142 0-2.045-.33-2.71-.99-.65-.66-.975-1.56-.975-2.7.006-1.353.567-2.572 1.685-3.657v-.043l-.606-.55c-.15-.18-.222-.39-.222-.63 0-.49.24-1.11.717-1.863.65-1.046 1.303-1.566 1.958-1.56.886.004 1.618.42 2.194 1.245.324.48-.03.55-1.065.22-.842-.328-1.527-.05-2.054.827l.015.074 1.123.866.052.005c1.403-.497 2.417-.74 3.042-.725-.058.116-.14.36-.243.732-.105.357-.206.684-.305.982l-.126.373-.385.05c-1.743.24-2.992.716-3.745 1.43-.463.463-.697.972-.702 1.524"/>
     </g>
 </svg>
index eb0121d..42518e7 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad-invert.png differ
index 6493657..6a2a9e3 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="bold-arab-dad">
-        <path id="arab-dad" d="M16.41 8.232l-1.675-.665L15.43 6l1.687.64-.707 1.592m.775 3.078c-.51-.286-1-.427-1.476-.423-.472 0-.983.205-1.533.616l-.506.38.007.024c1.084.066 1.934.1 2.55.1h.314c.568-.022.993-.065 1.277-.132-.067-.17-.275-.36-.625-.566h-.006m-6.803 3.295c-.017-.904-.33-1.87-.938-2.898l1.294-1.73.118.15c.267.336.504.924.713 1.766l.064.05c.496-.008.942-.17 1.338-.485v-.006l1.732-1.53c.68-.6 1.282-.902 1.807-.902.384.004.85.195 1.395.572.55.377.884.696 1 .958.063.15.094.386.094.71 0 .695-.11 1.228-.332 1.597-.192.31-.473.555-.844.734-.438.208-1.55.312-3.333.312-.8 0-1.794-.02-2.982-.062l-.144.43c-.254.67-.463 1.112-.625 1.323-.726.937-1.787 1.405-3.184 1.405C5.85 16.99 5 16.076 5 14.256c.003-.94.278-1.814.824-2.618.15-.216.298-.367.444-.454.225-.133.288-.09.188.124-.396.862-.596 1.548-.6 2.058.008 1.177.752 1.768 2.232 1.772 1.038-.004 1.803-.182 2.295-.535"/>
+        <path id="arab-dad" d="M16.41 8.232l-1.675-.665L15.43 6l1.687.64-.707 1.592m.775 3.078c-.51-.286-1-.427-1.476-.423-.474 0-.985.205-1.535.616l-.506.38.006.024c1.084.066 1.934.1 2.55.1h.314c.57-.022.994-.065 1.278-.132-.067-.17-.275-.36-.625-.566h-.006m-6.803 3.293c-.017-.904-.33-1.87-.938-2.898l1.294-1.73.118.15c.267.336.504.924.713 1.766l.066.05c.496-.007.942-.17 1.338-.484v-.006l1.732-1.53c.68-.6 1.282-.9 1.807-.9.384.003.85.194 1.395.57.55.378.884.697 1 .96.063.15.094.385.094.71 0 .694-.11 1.227-.33 1.596-.193.31-.474.555-.845.734-.438.208-1.55.312-3.333.312-.8 0-1.794-.02-2.982-.062l-.144.43c-.254.67-.463 1.112-.625 1.323-.725.937-1.786 1.405-3.183 1.405C5.85 16.99 5 16.076 5 14.256c.003-.94.278-1.814.824-2.618.15-.216.298-.367.444-.454.225-.133.288-.09.188.124-.396.862-.596 1.548-.6 2.058.008 1.177.752 1.768 2.232 1.772 1.038-.004 1.803-.182 2.295-.535"/>
     </g>
 </svg>
index ed491f3..0ade40c 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad.png differ
index 27108e2..ba7ffe1 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="bold-arab-dad">
-        <path id="arab-dad" d="M16.41 8.232l-1.675-.665L15.43 6l1.687.64-.707 1.592m.775 3.078c-.51-.286-1-.427-1.476-.423-.472 0-.983.205-1.533.616l-.506.38.007.024c1.084.066 1.934.1 2.55.1h.314c.568-.022.993-.065 1.277-.132-.067-.17-.275-.36-.625-.566h-.006m-6.803 3.295c-.017-.904-.33-1.87-.938-2.898l1.294-1.73.118.15c.267.336.504.924.713 1.766l.064.05c.496-.008.942-.17 1.338-.485v-.006l1.732-1.53c.68-.6 1.282-.902 1.807-.902.384.004.85.195 1.395.572.55.377.884.696 1 .958.063.15.094.386.094.71 0 .695-.11 1.228-.332 1.597-.192.31-.473.555-.844.734-.438.208-1.55.312-3.333.312-.8 0-1.794-.02-2.982-.062l-.144.43c-.254.67-.463 1.112-.625 1.323-.726.937-1.787 1.405-3.184 1.405C5.85 16.99 5 16.076 5 14.256c.003-.94.278-1.814.824-2.618.15-.216.298-.367.444-.454.225-.133.288-.09.188.124-.396.862-.596 1.548-.6 2.058.008 1.177.752 1.768 2.232 1.772 1.038-.004 1.803-.182 2.295-.535"/>
+        <path id="arab-dad" d="M16.41 8.232l-1.675-.665L15.43 6l1.687.64-.707 1.592m.775 3.078c-.51-.286-1-.427-1.476-.423-.474 0-.985.205-1.535.616l-.506.38.006.024c1.084.066 1.934.1 2.55.1h.314c.57-.022.994-.065 1.278-.132-.067-.17-.275-.36-.625-.566h-.006m-6.803 3.293c-.017-.904-.33-1.87-.938-2.898l1.294-1.73.118.15c.267.336.504.924.713 1.766l.066.05c.496-.007.942-.17 1.338-.484v-.006l1.732-1.53c.68-.6 1.282-.9 1.807-.9.384.003.85.194 1.395.57.55.378.884.697 1 .96.063.15.094.385.094.71 0 .694-.11 1.227-.33 1.596-.193.31-.474.555-.845.734-.438.208-1.55.312-3.333.312-.8 0-1.794-.02-2.982-.062l-.144.43c-.254.67-.463 1.112-.625 1.323-.725.937-1.786 1.405-3.183 1.405C5.85 16.99 5 16.076 5 14.256c.003-.94.278-1.814.824-2.618.15-.216.298-.367.444-.454.225-.133.288-.09.188.124-.396.862-.596 1.548-.6 2.058.008 1.177.752 1.768 2.232 1.772 1.038-.004 1.803-.182 2.295-.535"/>
     </g>
 </svg>
index 4dcdaa2..c11de3e 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to-invert.png differ
index 6396571..e3a0813 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="bold-armn-to">
-        <path id="armn-to" d="M13.86 16.257c.124 0 .254-.026.39-.078.135-.06.257-.15.367-.275.114-.13.205-.302.273-.516.073-.214.11-.48.11-.798V13h-1.14c-.14 0-.284.026-.43.078-.14.047-.27.133-.383.258-.11.125-.2.294-.274.508-.067.213-.1.487-.1.82 0 .34.035.47.108.695.08.217.176.394.29.53.12.135.248.23.384.29.14.05.276.076.406.076m-2.97-7.84c-.37.082-.695.247-.976.45-.28.198-.505.47-.672.813-.16.342-.242.78-.242 1.31V18H6v-7.188c0-.776.15-1.455.453-2.04.302-.587.714-1.077 1.234-1.467.52-.39 1.13-.685 1.83-.883.697-.198 1.44-.297 2.225-.297.526 0 1.04.044 1.54.133.504.088.98.22 1.43.398.447.172.858.388 1.233.65.375.26.698.564.97.913.275.347.49.737.64 1.17.15.432.226 1.093.226 1.61h1.354v2.04H17.78v1.6c0 .58-.103 1.09-.31 1.54-.21.44-.49.814-.845 1.116-.35.302-.834.53-1.297.687-.464.15-.953.226-1.47.226-.51 0-.996-.08-1.46-.235-.464-.156-.87-.39-1.22-.703-.348-.313-.626-.703-.835-1.172-.203-.473-.304-1.028-.304-1.663s.104-1.182.32-1.64c.212-.46.496-.685.85-.977.354-.297.76-.513 1.22-.648.457-.14.934-.21 1.43-.21h1.13c-.01-.49-.04-1.043-.24-1.36-.2-.323-.454-.58-.767-.766-.312-.193-.598-.332-.984-.426-.375-.09-.578-.094-1.1-.094-.52 0-.64.02-1.01.102z"/>
+        <path id="armn-to" d="M13.86 16.257c.124 0 .254-.026.39-.078.135-.06.257-.15.367-.277.114-.13.205-.302.273-.516.073-.214.11-.48.11-.798V13h-1.14c-.14 0-.284.026-.43.078-.14.047-.27.133-.383.258-.11.125-.2.294-.274.508-.067.213-.1.487-.1.82 0 .34.035.47.108.695.08.215.178.392.29.53.12.133.25.23.386.29.14.05.276.074.406.074m-2.97-7.84c-.37.082-.694.247-.975.45-.28.198-.505.47-.672.813-.16.342-.242.78-.242 1.31V18H6v-7.188c0-.776.15-1.455.453-2.04.302-.587.714-1.077 1.234-1.467.52-.39 1.13-.685 1.83-.883.697-.198 1.44-.297 2.225-.297.526 0 1.04.044 1.54.133.504.088.98.22 1.43.398.447.172.858.388 1.233.65.375.26.698.564.97.913.275.345.49.735.64 1.17.15.43.226 1.09.226 1.61h1.356v2.04H17.78v1.6c0 .58-.103 1.09-.31 1.54-.21.44-.49.812-.845 1.114-.35.302-.834.53-1.297.687-.464.15-.953.227-1.47.227-.51 0-.996-.08-1.46-.235-.464-.156-.87-.39-1.22-.703-.348-.314-.626-.704-.835-1.173-.203-.473-.304-1.028-.304-1.663s.102-1.182.32-1.64c.21-.46.494-.685.85-.977.352-.297.76-.513 1.22-.648.455-.14.932-.21 1.43-.21h1.13c-.01-.49-.04-1.044-.24-1.36-.2-.324-.456-.58-.77-.767-.31-.193-.597-.332-.983-.426-.375-.09-.578-.094-1.1-.094-.52 0-.64.02-1.01.102z"/>
     </g>
 </svg>
index 718accb..0a16f8c 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to.png differ
index b55042a..0dc8b52 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="bold-armn-to">
-        <path id="armn-to" d="M13.86 16.257c.124 0 .254-.026.39-.078.135-.06.257-.15.367-.275.114-.13.205-.302.273-.516.073-.214.11-.48.11-.798V13h-1.14c-.14 0-.284.026-.43.078-.14.047-.27.133-.383.258-.11.125-.2.294-.274.508-.067.213-.1.487-.1.82 0 .34.035.47.108.695.08.217.176.394.29.53.12.135.248.23.384.29.14.05.276.076.406.076m-2.97-7.84c-.37.082-.695.247-.976.45-.28.198-.505.47-.672.813-.16.342-.242.78-.242 1.31V18H6v-7.188c0-.776.15-1.455.453-2.04.302-.587.714-1.077 1.234-1.467.52-.39 1.13-.685 1.83-.883.697-.198 1.44-.297 2.225-.297.526 0 1.04.044 1.54.133.504.088.98.22 1.43.398.447.172.858.388 1.233.65.375.26.698.564.97.913.275.347.49.737.64 1.17.15.432.226 1.093.226 1.61h1.354v2.04H17.78v1.6c0 .58-.103 1.09-.31 1.54-.21.44-.49.814-.845 1.116-.35.302-.834.53-1.297.687-.464.15-.953.226-1.47.226-.51 0-.996-.08-1.46-.235-.464-.156-.87-.39-1.22-.703-.348-.313-.626-.703-.835-1.172-.203-.473-.304-1.028-.304-1.663s.104-1.182.32-1.64c.212-.46.496-.685.85-.977.354-.297.76-.513 1.22-.648.457-.14.934-.21 1.43-.21h1.13c-.01-.49-.04-1.043-.24-1.36-.2-.323-.454-.58-.767-.766-.312-.193-.598-.332-.984-.426-.375-.09-.578-.094-1.1-.094-.52 0-.64.02-1.01.102z"/>
+        <path id="armn-to" d="M13.86 16.257c.124 0 .254-.026.39-.078.135-.06.257-.15.367-.277.114-.13.205-.302.273-.516.073-.214.11-.48.11-.798V13h-1.14c-.14 0-.284.026-.43.078-.14.047-.27.133-.383.258-.11.125-.2.294-.274.508-.067.213-.1.487-.1.82 0 .34.035.47.108.695.08.215.178.392.29.53.12.133.25.23.386.29.14.05.276.074.406.074m-2.97-7.84c-.37.082-.694.247-.975.45-.28.198-.505.47-.672.813-.16.342-.242.78-.242 1.31V18H6v-7.188c0-.776.15-1.455.453-2.04.302-.587.714-1.077 1.234-1.467.52-.39 1.13-.685 1.83-.883.697-.198 1.44-.297 2.225-.297.526 0 1.04.044 1.54.133.504.088.98.22 1.43.398.447.172.858.388 1.233.65.375.26.698.564.97.913.275.345.49.735.64 1.17.15.43.226 1.09.226 1.61h1.356v2.04H17.78v1.6c0 .58-.103 1.09-.31 1.54-.21.44-.49.812-.845 1.114-.35.302-.834.53-1.297.687-.464.15-.953.227-1.47.227-.51 0-.996-.08-1.46-.235-.464-.156-.87-.39-1.22-.703-.348-.314-.626-.704-.835-1.173-.203-.473-.304-1.028-.304-1.663s.102-1.182.32-1.64c.21-.46.494-.685.85-.977.352-.297.76-.513 1.22-.648.455-.14.932-.21 1.43-.21h1.13c-.01-.49-.04-1.044-.24-1.36-.2-.324-.456-.58-.77-.767-.31-.193-.597-.332-.983-.426-.375-.09-.578-.094-1.1-.094-.52 0-.64.02-1.01.102z"/>
     </g>
 </svg>
index 92aff6d..5716249 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="bold-cyrl-be">
-        <path id="cyrl-be" d="M7 6h9v2h-6v3h2.65c.892 0 1.632.11 2.22.327.587.218 1.087.622 1.5 1.21.42.59.63 1.188.63 1.98 0 .812-.21 1.397-.63 1.976-.418.578-.897.974-1.436 1.187-.533.213-1.295.32-2.286.32h-5.65m4.768-2c.75 0 1.28-.05 1.584-.12.305-.077.57-.247.792-.51.23-.26.343-.472.343-.854 0-.557-.2-.868-.596-1.12-.393-.255-1.065-.397-2.017-.397H10v3"/>
+        <path id="cyrl-be" d="M7 6h9v2h-6v3h2.65c.892 0 1.632.11 2.22.327.587.218 1.087.622 1.5 1.21.42.59.63 1.188.63 1.98 0 .812-.21 1.397-.63 1.976-.418.578-.897.974-1.436 1.187-.533.213-1.295.32-2.286.32h-5.65m4.768-2c.75 0 1.28-.05 1.584-.12.305-.077.57-.247.792-.51.23-.26.343-.472.343-.854 0-.557-.2-.868-.596-1.12-.395-.255-1.067-.397-2.02-.397H10v3"/>
     </g>
 </svg>
index 5c6f8c0..d87d0fc 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="bold-cyrl-be">
-        <path id="cyrl-be" d="M7 6h9v2h-6v3h2.65c.892 0 1.632.11 2.22.327.587.218 1.087.622 1.5 1.21.42.59.63 1.188.63 1.98 0 .812-.21 1.397-.63 1.976-.418.578-.897.974-1.436 1.187-.533.213-1.295.32-2.286.32h-5.65m4.768-2c.75 0 1.28-.05 1.584-.12.305-.077.57-.247.792-.51.23-.26.343-.472.343-.854 0-.557-.2-.868-.596-1.12-.393-.255-1.065-.397-2.017-.397H10v3"/>
+        <path id="cyrl-be" d="M7 6h9v2h-6v3h2.65c.892 0 1.632.11 2.22.327.587.218 1.087.622 1.5 1.21.42.59.63 1.188.63 1.98 0 .812-.21 1.397-.63 1.976-.418.578-.897.974-1.436 1.187-.533.213-1.295.32-2.286.32h-5.65m4.768-2c.75 0 1.28-.05 1.584-.12.305-.077.57-.247.792-.51.23-.26.343-.472.343-.854 0-.557-.2-.868-.596-1.12-.395-.255-1.067-.397-2.02-.397H10v3"/>
     </g>
 </svg>
index b9154e5..e9cc60f 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-zhe-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-zhe-invert.png differ
index 98f4b55..6085d9c 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="bold-cyrl-zhe">
-        <path id="cyrl-zhe" d="M13 6v5.154c.328-.033.537-.18.705-.447.168-.266.4-.873.698-1.82.39-1.242.79-2.034 1.197-2.375.403-.336 1.075-.504 2.014-.504L18 6v1.78l-.386-.008c-.4 0-.69.062-.878.187-.186.118-.337.303-.452.552-.115.25-.286.762-.512 1.537-.12.41-.25.755-.392 1.032-.137.276-.383.537-.738.78.44.157.8.466 1.084.927.288.454.603 1.102.944 1.942L18 18h-2.314l-1.17-3.08-.113-.253-.24-.56c-.247-.57-.45-.933-.61-1.09-.16-.157-.318-.236-.553-.236V18h-2v-5.22c-.226 0-.382.077-.546.23-.164.15-.368.517-.612 1.097l-.246.56-.113.253L8.313 18H6l1.33-3.267c.327-.808.635-1.447.923-1.92.293-.476.663-.793 1.11-.95-.355-.244-.603-.5-.745-.772-.137-.275-.268-.622-.392-1.04-.222-.76-.39-1.266-.505-1.52-.11-.255-.26-.444-.45-.57-.187-.124-.493-.186-.918-.186L6 7.782v-1.78l.386.008c.953 0 1.63.17 2.034.512.4.347.79 1.136 1.177 2.366.3.954.534 1.564.698 1.83.168.26.377.405.705.438V6.002"/>
+        <path id="cyrl-zhe" d="M13 6v5.154c.328-.033.537-.18.705-.447.168-.266.4-.873.698-1.82.39-1.242.79-2.034 1.197-2.375.403-.336 1.075-.504 2.014-.504L18 6v1.78l-.386-.008c-.4 0-.69.062-.878.187-.186.116-.337.3-.452.55-.115.25-.286.762-.512 1.537-.12.41-.25.755-.392 1.032-.137.275-.383.536-.738.78.44.156.8.465 1.084.926.288.454.603 1.102.944 1.942L18 18h-2.314l-1.17-3.08-.113-.253-.24-.56c-.247-.57-.45-.933-.61-1.09-.16-.157-.318-.236-.553-.236V18h-2v-5.22c-.226 0-.382.077-.546.23-.164.15-.368.517-.612 1.097l-.246.56-.113.253L8.313 18H6l1.33-3.267c.327-.808.635-1.447.923-1.92.293-.476.663-.793 1.11-.95-.355-.244-.603-.5-.745-.772-.137-.273-.268-.62-.392-1.04-.222-.76-.39-1.264-.505-1.52-.11-.253-.26-.442-.45-.57-.185-.122-.49-.184-.916-.184L6 7.782v-1.78l.386.008c.953 0 1.63.17 2.034.512.4.347.79 1.136 1.177 2.366.3.954.534 1.564.698 1.83.168.26.377.405.705.438V6.002"/>
     </g>
 </svg>
index cfe0009..41e562b 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-zhe.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-zhe.png differ
index d26bdf6..3c0a879 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="bold-cyrl-zhe">
-        <path id="cyrl-zhe" d="M13 6v5.154c.328-.033.537-.18.705-.447.168-.266.4-.873.698-1.82.39-1.242.79-2.034 1.197-2.375.403-.336 1.075-.504 2.014-.504L18 6v1.78l-.386-.008c-.4 0-.69.062-.878.187-.186.118-.337.303-.452.552-.115.25-.286.762-.512 1.537-.12.41-.25.755-.392 1.032-.137.276-.383.537-.738.78.44.157.8.466 1.084.927.288.454.603 1.102.944 1.942L18 18h-2.314l-1.17-3.08-.113-.253-.24-.56c-.247-.57-.45-.933-.61-1.09-.16-.157-.318-.236-.553-.236V18h-2v-5.22c-.226 0-.382.077-.546.23-.164.15-.368.517-.612 1.097l-.246.56-.113.253L8.313 18H6l1.33-3.267c.327-.808.635-1.447.923-1.92.293-.476.663-.793 1.11-.95-.355-.244-.603-.5-.745-.772-.137-.275-.268-.622-.392-1.04-.222-.76-.39-1.266-.505-1.52-.11-.255-.26-.444-.45-.57-.187-.124-.493-.186-.918-.186L6 7.782v-1.78l.386.008c.953 0 1.63.17 2.034.512.4.347.79 1.136 1.177 2.366.3.954.534 1.564.698 1.83.168.26.377.405.705.438V6.002"/>
+        <path id="cyrl-zhe" d="M13 6v5.154c.328-.033.537-.18.705-.447.168-.266.4-.873.698-1.82.39-1.242.79-2.034 1.197-2.375.403-.336 1.075-.504 2.014-.504L18 6v1.78l-.386-.008c-.4 0-.69.062-.878.187-.186.116-.337.3-.452.55-.115.25-.286.762-.512 1.537-.12.41-.25.755-.392 1.032-.137.275-.383.536-.738.78.44.156.8.465 1.084.926.288.454.603 1.102.944 1.942L18 18h-2.314l-1.17-3.08-.113-.253-.24-.56c-.247-.57-.45-.933-.61-1.09-.16-.157-.318-.236-.553-.236V18h-2v-5.22c-.226 0-.382.077-.546.23-.164.15-.368.517-.612 1.097l-.246.56-.113.253L8.313 18H6l1.33-3.267c.327-.808.635-1.447.923-1.92.293-.476.663-.793 1.11-.95-.355-.244-.603-.5-.745-.772-.137-.273-.268-.62-.392-1.04-.222-.76-.39-1.264-.505-1.52-.11-.253-.26-.442-.45-.57-.185-.122-.49-.184-.916-.184L6 7.782v-1.78l.386.008c.953 0 1.63.17 2.034.512.4.347.79 1.136 1.177 2.366.3.954.534 1.564.698 1.83.168.26.377.405.705.438V6.002"/>
     </g>
 </svg>
index 37fd2b3..18de673 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g-invert.png differ
index 0efd55a..c840c51 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="bold-g">
-        <path id="g" d="M12 14v-2h5v4.203c-.497.475-1.22.894-2.166 1.26-.94.358-1.896.537-2.864.537-1.23 0-2.303-.253-3.217-.76-.915-.512-1.602-1.24-2.062-2.185-.46-.95-.69-1.982-.69-3.095 0-1.208.258-2.282.77-3.222.514-.94 1.266-1.66 2.256-2.16.754-.386 1.693-.58 2.816-.58 1.46 0 2.6.304 3.418.91.824.603 1.353 1.436 1.59 2.502l-2.36.435c-.166-.57-.48-1.018-.94-1.346-.454-.333-1.023-.5-1.708-.5-1.038 0-1.864.325-2.48.974-.61.65-.914 1.612-.914 2.89 0 1.376.31 2.41.93 3.102.62.686 1.434 1.03 2.44 1.03.497 0 .995-.096 1.492-.286.503-.195 1.332-.57 1.69-.845v-.867"/>
+        <path id="g" d="M12 14v-2h5v4.203c-.497.475-1.22.894-2.166 1.26-.94.358-1.896.537-2.864.537-1.23 0-2.303-.253-3.217-.76-.915-.512-1.602-1.24-2.062-2.185-.46-.95-.69-1.982-.69-3.095 0-1.208.26-2.282.77-3.222.516-.94 1.268-1.66 2.258-2.16.754-.386 1.693-.58 2.816-.58 1.46 0 2.6.304 3.418.91.825.603 1.354 1.436 1.59 2.502l-2.36.435c-.165-.57-.48-1.018-.94-1.346-.453-.335-1.022-.5-1.707-.5-1.038 0-1.864.323-2.48.972-.61.65-.914 1.612-.914 2.89 0 1.376.31 2.41.93 3.102.62.686 1.434 1.03 2.44 1.03.497 0 .995-.096 1.49-.286.505-.196 1.334-.57 1.69-.846v-.867"/>
     </g>
 </svg>
index ceb792b..e809453 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g.png differ
index dd6e27a..277f17e 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="bold-g">
-        <path id="g" d="M12 14v-2h5v4.203c-.497.475-1.22.894-2.166 1.26-.94.358-1.896.537-2.864.537-1.23 0-2.303-.253-3.217-.76-.915-.512-1.602-1.24-2.062-2.185-.46-.95-.69-1.982-.69-3.095 0-1.208.258-2.282.77-3.222.514-.94 1.266-1.66 2.256-2.16.754-.386 1.693-.58 2.816-.58 1.46 0 2.6.304 3.418.91.824.603 1.353 1.436 1.59 2.502l-2.36.435c-.166-.57-.48-1.018-.94-1.346-.454-.333-1.023-.5-1.708-.5-1.038 0-1.864.325-2.48.974-.61.65-.914 1.612-.914 2.89 0 1.376.31 2.41.93 3.102.62.686 1.434 1.03 2.44 1.03.497 0 .995-.096 1.492-.286.503-.195 1.332-.57 1.69-.845v-.867"/>
+        <path id="g" d="M12 14v-2h5v4.203c-.497.475-1.22.894-2.166 1.26-.94.358-1.896.537-2.864.537-1.23 0-2.303-.253-3.217-.76-.915-.512-1.602-1.24-2.062-2.185-.46-.95-.69-1.982-.69-3.095 0-1.208.26-2.282.77-3.222.516-.94 1.268-1.66 2.258-2.16.754-.386 1.693-.58 2.816-.58 1.46 0 2.6.304 3.418.91.825.603 1.354 1.436 1.59 2.502l-2.36.435c-.165-.57-.48-1.018-.94-1.346-.453-.335-1.022-.5-1.707-.5-1.038 0-1.864.323-2.48.972-.61.65-.914 1.612-.914 2.89 0 1.376.31 2.41.93 3.102.62.686 1.434 1.03 2.44 1.03.497 0 .995-.096 1.49-.286.505-.196 1.334-.57 1.69-.846v-.867"/>
     </g>
 </svg>
index 0858177..44cb3ff 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="cancel">
-        <path id="circle-with-strike" d="M12 5.022C8.145 5.022 5.02 8.146 5.02 12c0 3.853 3.124 6.978 6.977 6.978s6.978-3.125 6.978-6.978c0-3.854-3.125-6.978-6.98-6.978zM6.885 12c0-1.092.572-3.25.93-2.93l7.113 7.114c.487.525-1.838.93-2.93.93-2.826 0-5.114-2.29-5.114-5.114zm9.298 2.93L9.07 7.815c-.445-.483 1.837-.93 2.93-.93 2.826 0 5.114 2.288 5.114 5.113 0 1.092-.364 3.542-.93 2.93z"/>
+        <path id="circle-with-strike" d="M12 5.022c-3.855 0-6.98 3.124-6.98 6.978 0 3.853 3.124 6.978 6.977 6.978s6.978-3.125 6.978-6.978c0-3.854-3.125-6.978-6.98-6.978zM6.885 12c0-1.092.572-3.25.93-2.93l7.113 7.114c.487.525-1.838.93-2.93.93-2.826 0-5.114-2.29-5.114-5.114zm9.298 2.93L9.07 7.815c-.445-.483 1.837-.93 2.93-.93 2.826 0 5.114 2.288 5.114 5.113 0 1.092-.364 3.542-.93 2.93z"/>
     </g>
 </svg>
index 00c8051..5d0bbd9 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="cancel">
-        <path id="circle-with-strike" d="M12 5.022C8.145 5.022 5.02 8.146 5.02 12c0 3.853 3.124 6.978 6.977 6.978s6.978-3.125 6.978-6.978c0-3.854-3.125-6.978-6.98-6.978zM6.885 12c0-1.092.572-3.25.93-2.93l7.113 7.114c.487.525-1.838.93-2.93.93-2.826 0-5.114-2.29-5.114-5.114zm9.298 2.93L9.07 7.815c-.445-.483 1.837-.93 2.93-.93 2.826 0 5.114 2.288 5.114 5.113 0 1.092-.364 3.542-.93 2.93z"/>
+        <path id="circle-with-strike" d="M12 5.022c-3.855 0-6.98 3.124-6.98 6.978 0 3.853 3.124 6.978 6.977 6.978s6.978-3.125 6.978-6.978c0-3.854-3.125-6.978-6.98-6.978zM6.885 12c0-1.092.572-3.25.93-2.93l7.113 7.114c.487.525-1.838.93-2.93.93-2.826 0-5.114-2.29-5.114-5.114zm9.298 2.93L9.07 7.815c-.445-.483 1.837-.93 2.93-.93 2.826 0 5.114 2.288 5.114 5.113 0 1.092-.364 3.542-.93 2.93z"/>
     </g>
 </svg>
index b6dd780..1a1ce2e 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive-invert.png differ
index d100b44..1708674 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="regular-expression">
-        <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.657 7H7.533zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
-        <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.082.92-.368.167-.85.25-1.444.25-.564 0-.955-.208-1.377-.625-.418-.418-.627-1.012-.627-1.784 0-.808.282-1.403.845-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.395-1.158-1.186-1.158-.61 0-1.325.183-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.023 0 1.588.223 2.133.668.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.804.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .585.336.877 1.008.877.48 0 .865-.138 1.152-.415.29-.277.436-.645.436-1.103v-.627"/>
+        <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.655 7H7.533zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
+        <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.444.25-.564 0-.955-.208-1.377-.625-.42-.418-.628-1.012-.628-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.395-1.158-1.186-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.666.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.803.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .583.336.875 1.008.875.48 0 .865-.138 1.152-.415.29-.276.436-.644.436-1.102v-.627"/>
     </g>
 </svg>
index e924c44..1b0a659 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive.png differ
index 3f0a3a5..8de2583 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="regular-expression">
-        <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.657 7H7.533zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
-        <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.082.92-.368.167-.85.25-1.444.25-.564 0-.955-.208-1.377-.625-.418-.418-.627-1.012-.627-1.784 0-.808.282-1.403.845-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.395-1.158-1.186-1.158-.61 0-1.325.183-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.023 0 1.588.223 2.133.668.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.804.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .585.336.877 1.008.877.48 0 .865-.138 1.152-.415.29-.277.436-.645.436-1.103v-.627"/>
+        <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.655 7H7.533zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
+        <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.444.25-.564 0-.955-.208-1.377-.625-.42-.418-.628-1.012-.628-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.395-1.158-1.186-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.666.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.803.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .583.336.875 1.008.875.48 0 .865-.138 1.152-.415.29-.276.436-.644.436-1.102v-.627"/>
     </g>
 </svg>
index a816be8..fab61c1 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="code">
-        <path id="left-bracket" d="M4 12v-1h1c1 0 1 0 1-1V7.614c0-.514.024-.896.073-1.142.054-.252.14-.463.257-.633.204-.28.473-.476.808-.585C7.473 5.14 8.01 5 8.973 5H10v1h-.752c-.457 0-.77.19-.936.408C8.145 6.623 8 6.853 8 7.476v1.857c0 .73-.04 1.18-.244 1.493-.2.307-.562.53-1.09.667.535.155.9.385 1.096.688.2.304.238.758.238 1.485v1.862c0 .62.145.848.312 1.062.166.22.48.406.936.406L10 17v1H8.973c-.963 0-1.5-.133-1.835-.248-.335-.11-.604-.307-.808-.59-.118-.166-.203-.375-.257-.626-.05-.253-.073-.636-.073-1.15V13c0-1 0-1-1-1H4z"/>
+        <path id="left-bracket" d="M4 12v-1h1c1 0 1 0 1-1V7.614c0-.514.024-.896.073-1.142.054-.252.14-.463.257-.633.204-.28.473-.478.808-.587C7.473 5.14 8.01 5 8.973 5H10v1h-.752c-.457 0-.77.19-.936.408C8.145 6.623 8 6.853 8 7.476v1.857c0 .73-.04 1.18-.244 1.493-.2.307-.562.53-1.09.667.535.155.9.385 1.096.688.2.306.238.76.238 1.487v1.862c0 .62.145.847.312 1.06.166.22.48.407.936.407L10 17v1H8.973c-.963 0-1.5-.133-1.835-.248-.335-.11-.604-.307-.808-.59-.118-.166-.203-.375-.257-.626-.05-.253-.073-.636-.073-1.15V13c0-1 0-1-1-1H4z"/>
         <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" width="24" height="24" xlink:href="#left-bracket"/>
     </g>
 </svg>
index 6e32d78..fe5309d 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24">
     <g id="code">
-        <path id="left-bracket" d="M4 12v-1h1c1 0 1 0 1-1V7.614c0-.514.024-.896.073-1.142.054-.252.14-.463.257-.633.204-.28.473-.476.808-.585C7.473 5.14 8.01 5 8.973 5H10v1h-.752c-.457 0-.77.19-.936.408C8.145 6.623 8 6.853 8 7.476v1.857c0 .73-.04 1.18-.244 1.493-.2.307-.562.53-1.09.667.535.155.9.385 1.096.688.2.304.238.758.238 1.485v1.862c0 .62.145.848.312 1.062.166.22.48.406.936.406L10 17v1H8.973c-.963 0-1.5-.133-1.835-.248-.335-.11-.604-.307-.808-.59-.118-.166-.203-.375-.257-.626-.05-.253-.073-.636-.073-1.15V13c0-1 0-1-1-1H4z"/>
+        <path id="left-bracket" d="M4 12v-1h1c1 0 1 0 1-1V7.614c0-.514.024-.896.073-1.142.054-.252.14-.463.257-.633.204-.28.473-.478.808-.587C7.473 5.14 8.01 5 8.973 5H10v1h-.752c-.457 0-.77.19-.936.408C8.145 6.623 8 6.853 8 7.476v1.857c0 .73-.04 1.18-.244 1.493-.2.307-.562.53-1.09.667.535.155.9.385 1.096.688.2.306.238.76.238 1.487v1.862c0 .62.145.847.312 1.06.166.22.48.407.936.407L10 17v1H8.973c-.963 0-1.5-.133-1.835-.248-.335-.11-.604-.307-.808-.59-.118-.166-.203-.375-.257-.626-.05-.253-.073-.636-.073-1.15V13c0-1 0-1-1-1H4z"/>
         <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" width="24" height="24" xlink:href="#left-bracket"/>
     </g>
 </svg>
index 30d1021..774d15a 100644 (file)
@@ -2,7 +2,7 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="Layer_2">
         <g id="g184">
-            <path d="M21 4v-1s0-3-3-3-3 3-3 3v1h-1v6h8v-6zm-1.5 0h-3v-1s0-1.5 1.5-1.5c1.48.06 1.5 1.5 1.5 1.5zm-6.5 5.6l-6.8 6.9c-.3-.3-.7-.6-1-.8 1.4-1.4 5-5 7.8-7.9v-1.8l-9 9-1 5 5-1 8-8h-3z" id="path186"/>
+            <path d="M21 4V3s0-3-3-3-3 3-3 3v1h-1v6h8V4zm-1.5 0h-3V3s0-1.5 1.5-1.5c1.48.06 1.5 1.5 1.5 1.5zM13 9.6l-6.8 6.9c-.3-.3-.7-.6-1-.8 1.4-1.4 5-5 7.8-7.9V6l-9 9-1 5 5-1 8-8h-3z" id="path186"/>
         </g>
     </g>
 </svg>
index 7e37682..1b1cb76 100644 (file)
@@ -2,7 +2,7 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="Layer_2">
         <g id="g184">
-            <path d="M21 4v-1s0-3-3-3-3 3-3 3v1h-1v6h8v-6zm-1.5 0h-3v-1s0-1.5 1.5-1.5c1.48.06 1.5 1.5 1.5 1.5zm-6.5 5.6l-6.8 6.9c-.3-.3-.7-.6-1-.8 1.4-1.4 5-5 7.8-7.9v-1.8l-9 9-1 5 5-1 8-8h-3z" id="path186"/>
+            <path d="M21 4V3s0-3-3-3-3 3-3 3v1h-1v6h8V4zm-1.5 0h-3V3s0-1.5 1.5-1.5c1.48.06 1.5 1.5 1.5 1.5zM13 9.6l-6.8 6.9c-.3-.3-.7-.6-1-.8 1.4-1.4 5-5 7.8-7.9V6l-9 9-1 5 5-1 8-8h-3z" id="path186"/>
         </g>
     </g>
 </svg>
index 0e975b5..2908444 100644 (file)
@@ -2,7 +2,7 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="Layer_2">
         <g id="g184">
-            <path d="M4 4v-1s0-3 3-3 3 3 3 3v1h1v6h-8v-6zm1.5 0h3v-1s0-1.5-1.5-1.5c-1.48.06-1.5 1.5-1.5 1.5zm6.5 5.6l6.8 6.9c.3-.3.7-.6 1-.8-1.4-1.4-5-5-7.8-7.9v-1.8l9 9 1 5-5-1-8-8h3z" id="path186"/>
+            <path d="M4 4V3s0-3 3-3 3 3 3 3v1h1v6H3V4zm1.5 0h3V3s0-1.5-1.5-1.5C5.52 1.56 5.5 3 5.5 3zM12 9.6l6.8 6.9c.3-.3.7-.6 1-.8-1.4-1.4-5-5-7.8-7.9V6l9 9 1 5-5-1-8-8h3z" id="path186"/>
         </g>
     </g>
 </svg>
index 0b4751d..84a6816 100644 (file)
@@ -2,7 +2,7 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="Layer_2">
         <g id="g184">
-            <path d="M4 4v-1s0-3 3-3 3 3 3 3v1h1v6h-8v-6zm1.5 0h3v-1s0-1.5-1.5-1.5c-1.48.06-1.5 1.5-1.5 1.5zm6.5 5.6l6.8 6.9c.3-.3.7-.6 1-.8-1.4-1.4-5-5-7.8-7.9v-1.8l9 9 1 5-5-1-8-8h3z" id="path186"/>
+            <path d="M4 4V3s0-3 3-3 3 3 3 3v1h1v6H3V4zm1.5 0h3V3s0-1.5-1.5-1.5C5.52 1.56 5.5 3 5.5 3zM12 9.6l6.8 6.9c.3-.3.7-.6 1-.8-1.4-1.4-5-5-7.8-7.9V6l9 9 1 5-5-1-8-8h3z" id="path186"/>
         </g>
     </g>
 </svg>
index fa3ffe0..d1d7093 100644 (file)
@@ -2,6 +2,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
     <g id="external">
         <path id="box" d="M7 3h2v6H3V7H2v3h8V2H7z"/>
-        <path id="arrow" d="M2 5.79l1.42-1.422L5.554 6.5l.947-.947L4.368 3.42 5.788 2H2z"/>
+        <path id="arrow" d="M2 5.79l1.42-1.422L5.554 6.5l.947-.947L4.37 3.42 5.788 2H2z"/>
     </g>
 </svg>
index 60e6a0c..9fdc8ca 100644 (file)
@@ -2,6 +2,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="external">
         <path id="box" d="M7 3h2v6H3V7H2v3h8V2H7z"/>
-        <path id="arrow" d="M2 5.79l1.42-1.422L5.554 6.5l.947-.947L4.368 3.42 5.788 2H2z"/>
+        <path id="arrow" d="M2 5.79l1.42-1.422L5.554 6.5l.947-.947L4.37 3.42 5.788 2H2z"/>
     </g>
 </svg>
index 77778d8..dd95034 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr-invert.png differ
index 4951ac6..dc37aa1 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="find">
-        <path id="magnifying-glass" d="M13.656 11c-1.92 0-3.5 1.548-3.5 3.47 0 1.92 1.58 3.5 3.5 3.5.75 0 1.432-.253 2-.657l.094.156 2.375 2.374c.19.19.534.153.78-.094s.315-.59.126-.78l-2.374-2.376-.188-.094c.403-.566.656-1.282.656-2.03 0-1.92-1.55-3.47-3.47-3.47zm0 1.656c1.01 0 1.813.8 1.813 1.813 0 1.01-.802 1.843-1.814 1.843-1.01 0-1.844-.832-1.844-1.844s.832-1.814 1.844-1.814z"/>
+        <path id="magnifying-glass" d="M13.656 11c-1.92 0-3.5 1.548-3.5 3.47 0 1.92 1.58 3.5 3.5 3.5.75 0 1.432-.253 2-.657l.094.156 2.375 2.372c.19.19.534.153.78-.094s.315-.59.126-.78L16.66 16.59l-.188-.093c.402-.567.655-1.283.655-2.03 0-1.92-1.55-3.47-3.47-3.47zm0 1.656c1.01 0 1.813.8 1.813 1.813 0 1.01-.804 1.84-1.816 1.84-1.01 0-1.844-.83-1.844-1.843s.833-1.814 1.845-1.814z"/>
         <path id="text" d="M6 5v2h10V5H6zm0 3v2h11V8H6zm0 3v2h3.53c.284-.797.787-1.486 1.44-2H6zm0 3v2h3.53c-.177-.48-.28-.99-.28-1.53 0-.16.046-.315.063-.47H6z"/>
     </g>
 </svg>
index 4625881..5c66688 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr.png differ
index e97230c..bbfdaa0 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="find">
-        <path id="magnifying-glass" d="M13.656 11c-1.92 0-3.5 1.548-3.5 3.47 0 1.92 1.58 3.5 3.5 3.5.75 0 1.432-.253 2-.657l.094.156 2.375 2.374c.19.19.534.153.78-.094s.315-.59.126-.78l-2.374-2.376-.188-.094c.403-.566.656-1.282.656-2.03 0-1.92-1.55-3.47-3.47-3.47zm0 1.656c1.01 0 1.813.8 1.813 1.813 0 1.01-.802 1.843-1.814 1.843-1.01 0-1.844-.832-1.844-1.844s.832-1.814 1.844-1.814z"/>
+        <path id="magnifying-glass" d="M13.656 11c-1.92 0-3.5 1.548-3.5 3.47 0 1.92 1.58 3.5 3.5 3.5.75 0 1.432-.253 2-.657l.094.156 2.375 2.372c.19.19.534.153.78-.094s.315-.59.126-.78L16.66 16.59l-.188-.093c.402-.567.655-1.283.655-2.03 0-1.92-1.55-3.47-3.47-3.47zm0 1.656c1.01 0 1.813.8 1.813 1.813 0 1.01-.804 1.84-1.816 1.84-1.01 0-1.844-.83-1.844-1.843s.833-1.814 1.845-1.814z"/>
         <path id="text" d="M6 5v2h10V5H6zm0 3v2h11V8H6zm0 3v2h3.53c.284-.797.787-1.486 1.44-2H6zm0 3v2h3.53c-.177-.48-.28-.99-.28-1.53 0-.16.046-.315.063-.47H6z"/>
     </g>
 </svg>
index d67357b..9f23f4a 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl-invert.png differ
index 51b3d40..083c2d3 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="find">
-        <path id="magnifying-glass" d="M11.344 11c1.92 0 3.5 1.548 3.5 3.47 0 1.92-1.58 3.5-3.5 3.5-.75 0-1.432-.253-2-.657l-.094.156-2.375 2.374c-.19.19-.534.153-.78-.094s-.315-.59-.126-.78l2.374-2.376.188-.094c-.403-.566-.656-1.282-.656-2.03 0-1.92 1.55-3.47 3.47-3.47zm0 1.656c-1.01 0-1.813.8-1.813 1.813 0 1.01.802 1.843 1.814 1.843 1.01 0 1.844-.832 1.844-1.844s-.832-1.814-1.844-1.814z"/>
+        <path id="magnifying-glass" d="M11.344 11c1.92 0 3.5 1.548 3.5 3.47 0 1.92-1.58 3.5-3.5 3.5-.75 0-1.432-.253-2-.657l-.094.156-2.375 2.372c-.19.19-.534.153-.78-.094s-.315-.59-.126-.78L8.34 16.59l.188-.093c-.402-.567-.655-1.283-.655-2.03 0-1.92 1.55-3.47 3.47-3.47zm0 1.656c-1.01 0-1.813.8-1.813 1.813 0 1.01.804 1.84 1.816 1.84 1.01 0 1.844-.83 1.844-1.843s-.833-1.814-1.845-1.814z"/>
         <path id="text" d="M19 5v2H9V5zm0 3v2H8V8zm0 3v2h-3.53c-.284-.797-.787-1.486-1.44-2zm0 3v2h-3.53c.177-.48.28-.99.28-1.53 0-.16-.046-.315-.063-.47z"/>
     </g>
 </svg>
index ed8eea0..28aab68 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl.png differ
index ca03754..e70ae48 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="find">
-        <path id="magnifying-glass" d="M11.344 11c1.92 0 3.5 1.548 3.5 3.47 0 1.92-1.58 3.5-3.5 3.5-.75 0-1.432-.253-2-.657l-.094.156-2.375 2.374c-.19.19-.534.153-.78-.094s-.315-.59-.126-.78l2.374-2.376.188-.094c-.403-.566-.656-1.282-.656-2.03 0-1.92 1.55-3.47 3.47-3.47zm0 1.656c-1.01 0-1.813.8-1.813 1.813 0 1.01.802 1.843 1.814 1.843 1.01 0 1.844-.832 1.844-1.844s-.832-1.814-1.844-1.814z"/>
+        <path id="magnifying-glass" d="M11.344 11c1.92 0 3.5 1.548 3.5 3.47 0 1.92-1.58 3.5-3.5 3.5-.75 0-1.432-.253-2-.657l-.094.156-2.375 2.372c-.19.19-.534.153-.78-.094s-.315-.59-.126-.78L8.34 16.59l.188-.093c-.402-.567-.655-1.283-.655-2.03 0-1.92 1.55-3.47 3.47-3.47zm0 1.656c-1.01 0-1.813.8-1.813 1.813 0 1.01.804 1.84 1.816 1.84 1.01 0 1.844-.83 1.844-1.843s-.833-1.814-1.845-1.814z"/>
         <path id="text" d="M19 5v2H9V5zm0 3v2H8V8zm0 3v2h-3.53c-.284-.797-.787-1.486-1.44-2zm0 3v2h-3.53c.177-.48.28-.99.28-1.53 0-.16-.046-.315-.063-.47z"/>
     </g>
 </svg>
index ccd9e96..3f56009 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="help">
-        <path id="circle" d="M12 2.085c-5.477 0-9.915 4.438-9.915 9.916 0 5.477 4.438 9.915 9.916 9.915 5.477 0 9.915-4.438 9.915-9.914 0-5.477-4.438-9.915-9.914-9.915zm.002 18c-4.465 0-8.084-3.62-8.084-8.083 0-4.465 3.62-8.084 8.084-8.084 4.464 0 8.083 3.62 8.083 8.084 0 4.464-3.62 8.083-8.083 8.083z"/>
+        <path id="circle" d="M12 2.085c-5.477 0-9.915 4.438-9.915 9.916 0 5.48 4.438 9.917 9.916 9.917 5.48 0 9.917-4.438 9.917-9.914 0-5.477-4.438-9.915-9.914-9.915zm.002 18c-4.465 0-8.084-3.62-8.084-8.083 0-4.465 3.62-8.084 8.084-8.084 4.464 0 8.083 3.62 8.083 8.084 0 4.464-3.62 8.083-8.083 8.083z"/>
         <g id="question-mark">
             <path id="top" d="M11.766 6.688c-2.5 0-3.22 2.188-3.22 2.188l1.412.854s.298-.79.9-1.23c.517-.374 1.626-.624 2.22.126.7.885-.17 1.587-1.078 2.72C11.047 12.53 11 15 11 15h1.97s.134-2.318 1.04-3.38c.603-.708 1.443-1.34 1.443-2.495s-1.187-2.437-3.687-2.437z"/>
             <path id="bottom" d="M11 16h2v2h-2z"/>
index e5eb877..a9a0ebb 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="help">
-        <path id="circle" d="M12 2.085c-5.477 0-9.915 4.438-9.915 9.916 0 5.477 4.438 9.915 9.916 9.915 5.477 0 9.915-4.438 9.915-9.914 0-5.477-4.438-9.915-9.914-9.915zm.002 18c-4.465 0-8.084-3.62-8.084-8.083 0-4.465 3.62-8.084 8.084-8.084 4.464 0 8.083 3.62 8.083 8.084 0 4.464-3.62 8.083-8.083 8.083z"/>
+        <path id="circle" d="M12 2.085c-5.477 0-9.915 4.438-9.915 9.916 0 5.48 4.438 9.917 9.916 9.917 5.48 0 9.917-4.438 9.917-9.914 0-5.477-4.438-9.915-9.914-9.915zm.002 18c-4.465 0-8.084-3.62-8.084-8.083 0-4.465 3.62-8.084 8.084-8.084 4.464 0 8.083 3.62 8.083 8.084 0 4.464-3.62 8.083-8.083 8.083z"/>
         <g id="question-mark">
             <path id="top" d="M11.766 6.688c-2.5 0-3.22 2.188-3.22 2.188l1.412.854s.298-.79.9-1.23c.517-.374 1.626-.624 2.22.126.7.885-.17 1.587-1.078 2.72C11.047 12.53 11 15 11 15h1.97s.134-2.318 1.04-3.38c.603-.708 1.443-1.34 1.443-2.495s-1.187-2.437-3.687-2.437z"/>
             <path id="bottom" d="M11 16h2v2h-2z"/>
index 0b02d6b..6866809 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="help">
-        <path id="circle" d="M12 2.085c5.477 0 9.915 4.438 9.915 9.916 0 5.477-4.438 9.915-9.916 9.915-5.477 0-9.915-4.438-9.915-9.914 0-5.477 4.438-9.915 9.914-9.915zm-.002 18c4.465 0 8.084-3.62 8.084-8.083 0-4.465-3.62-8.084-8.084-8.084-4.464 0-8.083 3.62-8.083 8.084 0 4.464 3.62 8.083 8.083 8.083z"/>
+        <path id="circle" d="M12 2.085c5.477 0 9.915 4.438 9.915 9.916 0 5.48-4.438 9.917-9.916 9.917-5.48 0-9.917-4.438-9.917-9.914 0-5.477 4.438-9.915 9.914-9.915zm-.002 18c4.465 0 8.084-3.62 8.084-8.083 0-4.465-3.62-8.084-8.084-8.084-4.464 0-8.083 3.62-8.083 8.084 0 4.464 3.62 8.083 8.083 8.083z"/>
         <g id="question-mark">
             <path id="top" d="M12.234 6.688c2.5 0 3.22 2.188 3.22 2.188l-1.412.854s-.298-.79-.9-1.23c-.517-.374-1.626-.624-2.22.126-.7.885.17 1.587 1.078 2.72C12.953 12.53 13 15 13 15h-1.97s-.134-2.318-1.04-3.38c-.603-.708-1.443-1.34-1.443-2.495 0-1.156 1.187-2.437 3.687-2.437z"/>
             <path id="bottom" d="M13 16h-2v2h2z"/>
index bf4f537..1b513d0 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="help">
-        <path id="circle" d="M12 2.085c5.477 0 9.915 4.438 9.915 9.916 0 5.477-4.438 9.915-9.916 9.915-5.477 0-9.915-4.438-9.915-9.914 0-5.477 4.438-9.915 9.914-9.915zm-.002 18c4.465 0 8.084-3.62 8.084-8.083 0-4.465-3.62-8.084-8.084-8.084-4.464 0-8.083 3.62-8.083 8.084 0 4.464 3.62 8.083 8.083 8.083z"/>
+        <path id="circle" d="M12 2.085c5.477 0 9.915 4.438 9.915 9.916 0 5.48-4.438 9.917-9.916 9.917-5.48 0-9.917-4.438-9.917-9.914 0-5.477 4.438-9.915 9.914-9.915zm-.002 18c4.465 0 8.084-3.62 8.084-8.083 0-4.465-3.62-8.084-8.084-8.084-4.464 0-8.083 3.62-8.083 8.084 0 4.464 3.62 8.083 8.083 8.083z"/>
         <g id="question-mark">
             <path id="top" d="M12.234 6.688c2.5 0 3.22 2.188 3.22 2.188l-1.412.854s-.298-.79-.9-1.23c-.517-.374-1.626-.624-2.22.126-.7.885.17 1.587 1.078 2.72C12.953 12.53 13 15 13 15h-1.97s-.134-2.318-1.04-3.38c-.603-.708-1.443-1.34-1.443-2.495 0-1.156 1.187-2.437 3.687-2.437z"/>
             <path id="bottom" d="M13 16h-2v2h2z"/>
index a38092d..ea5a18e 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/history-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/history-invert.png differ
index 2a1db00..6fcd856 100644 (file)
@@ -2,6 +2,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="history">
         <path id="clock-hands" d="M17.26 15.076s-2.385-1.935-4.005-3.062c.72-2.397 1.702-6.56 1.702-6.56s-4.35 5.364-4.877 6.7c-.463 1.168 1.46 2.21 2.346 1.678 1.9.55 4.834 1.244 4.834 1.244z"/>
-        <path id="arrow" d="M12.086 2.085C6.608 2.085 2.17 6.523 2.17 12c0 1.784.476 3.455 1.3 4.9L1.25 18.94h5.688v-5.22L4.87 15.616c-.55-1.088-.866-2.312-.866-3.615 0-4.464 3.62-8.083 8.084-8.083 4.464 0 8.083 3.62 8.083 8.084 0 4.465-3.618 8.084-8.082 8.084-1.145 0-2.228-.247-3.213-.678l-.833 1.634c1.235.557 2.602.874 4.045.874C17.563 21.914 22 17.476 22 12c0-5.477-4.438-9.915-9.914-9.915z"/>
+        <path id="arrow" d="M12.086 2.085C6.608 2.085 2.17 6.523 2.17 12c0 1.784.476 3.455 1.3 4.9l-2.22 2.04h5.688v-5.22L4.87 15.616c-.55-1.088-.866-2.312-.866-3.615 0-4.462 3.62-8.08 8.084-8.08 4.464 0 8.083 3.62 8.083 8.083 0 4.465-3.616 8.084-8.08 8.084-1.145 0-2.23-.247-3.213-.678l-.833 1.633c1.235.557 2.602.874 4.045.874C17.562 21.914 22 17.477 22 12c0-5.477-4.438-9.915-9.914-9.915z"/>
     </g>
 </svg>
index e9bbf95..0e177ab 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/history.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/history.png differ
index 019e558..9375751 100644 (file)
@@ -2,6 +2,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="history">
         <path id="clock-hands" d="M17.26 15.076s-2.385-1.935-4.005-3.062c.72-2.397 1.702-6.56 1.702-6.56s-4.35 5.364-4.877 6.7c-.463 1.168 1.46 2.21 2.346 1.678 1.9.55 4.834 1.244 4.834 1.244z"/>
-        <path id="arrow" d="M12.086 2.085C6.608 2.085 2.17 6.523 2.17 12c0 1.784.476 3.455 1.3 4.9L1.25 18.94h5.688v-5.22L4.87 15.616c-.55-1.088-.866-2.312-.866-3.615 0-4.464 3.62-8.083 8.084-8.083 4.464 0 8.083 3.62 8.083 8.084 0 4.465-3.618 8.084-8.082 8.084-1.145 0-2.228-.247-3.213-.678l-.833 1.634c1.235.557 2.602.874 4.045.874C17.563 21.914 22 17.476 22 12c0-5.477-4.438-9.915-9.914-9.915z"/>
+        <path id="arrow" d="M12.086 2.085C6.608 2.085 2.17 6.523 2.17 12c0 1.784.476 3.455 1.3 4.9l-2.22 2.04h5.688v-5.22L4.87 15.616c-.55-1.088-.866-2.312-.866-3.615 0-4.462 3.62-8.08 8.084-8.08 4.464 0 8.083 3.62 8.083 8.083 0 4.465-3.616 8.084-8.08 8.084-1.145 0-2.23-.247-3.213-.678l-.833 1.633c1.235.557 2.602.874 4.045.874C17.562 21.914 22 17.477 22 12c0-5.477-4.438-9.915-9.914-9.915z"/>
     </g>
 </svg>
index bfdcb1c..10d770a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <path d="M19.5 4h-3v-1s0-1.5 1.5-1.5c1.5.06 1.5 1.5 1.5 1.5zm1.5 0v-1s0-3-3-3-3 3-3 3v1h-1v6h8v-6zm-8 7v-6h-11v15h20v-9zm-9 7l4-5 2-1 4 4 2-2 4 4z" id="path304"/>
+    <path d="M19.5 4h-3V3s0-1.5 1.5-1.5c1.5.06 1.5 1.5 1.5 1.5zM21 4V3s0-3-3-3-3 3-3 3v1h-1v6h8V4zm-8 7V5H2v15h20v-9zm-9 7l4-5 2-1 4 4 2-2 4 4z" id="path304"/>
 </svg>
index 8cec9f5..b41ff43 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M19.5 4h-3v-1s0-1.5 1.5-1.5c1.5.06 1.5 1.5 1.5 1.5zm1.5 0v-1s0-3-3-3-3 3-3 3v1h-1v6h8v-6zm-8 7v-6h-11v15h20v-9zm-9 7l4-5 2-1 4 4 2-2 4 4z" id="path304"/>
+    <path d="M19.5 4h-3V3s0-1.5 1.5-1.5c1.5.06 1.5 1.5 1.5 1.5zM21 4V3s0-3-3-3-3 3-3 3v1h-1v6h8V4zm-8 7V5H2v15h20v-9zm-9 7l4-5 2-1 4 4 2-2 4 4z" id="path304"/>
 </svg>
index 5136ef5..c821cd1 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <path d="M4.5 4h3v-1s0-1.5-1.5-1.5c-1.5.06-1.5 1.5-1.5 1.5zm-1.5 0v-1s0-3 3-3 3 3 3 3v1h1v6h-8v-6zm8 7v-6h11v15h-20v-9zm9 7l-4-5-2-1-4 4-2-2-4 4z" id="path304"/>
+    <path d="M4.5 4h3V3s0-1.5-1.5-1.5C4.5 1.56 4.5 3 4.5 3zM3 4V3s0-3 3-3 3 3 3 3v1h1v6H2V4zm8 7V5h11v15H2v-9zm9 7l-4-5-2-1-4 4-2-2-4 4z" id="path304"/>
 </svg>
index 6bb78f7..29004d4 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M4.5 4h3v-1s0-1.5-1.5-1.5c-1.5.06-1.5 1.5-1.5 1.5zm-1.5 0v-1s0-3 3-3 3 3 3 3v1h1v6h-8v-6zm8 7v-6h11v15h-20v-9zm9 7l-4-5-2-1-4 4-2-2-4 4z" id="path304"/>
+    <path d="M4.5 4h3V3s0-1.5-1.5-1.5C4.5 1.56 4.5 3 4.5 3zM3 4V3s0-3 3-3 3 3 3 3v1h1v6H2V4zm8 7V5h11v15H2v-9zm9 7l-4-5-2-1-4 4-2-2-4 4z" id="path304"/>
 </svg>
index 28f2b17..cf194aa 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem-invert.png differ
index 6e9a2ec..938c32e 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="italic-arab-keheh-jeem">
-        <path id="arab-keheh-jeem" d="M18.125 5.844c-1.695.555-3.297 1.162-4.594 1.938-.49.3-.773.712-.874 1.125-.064.263-.035.572.063.78.188.406.538.575.843.814l.094-.124.53.625c.14.165.344.514.47.94.137.462.08.724 0 1.124H11.22c-.34 0-.593.007-.767-.02-.34-.053-.256-.208-.234-.34.33-.127.563-.173.937-.14.29-.495.593-.886.906-1.314-.98.037-1.878.015-2.688-.094-.346-.047-.698-.186-1.094-.156-.356.026-.767.24-1.03.72-.246.447-.434.838-.656 1.28l.75-.47c.23-.14.484-.226.72-.218.156.005.274.054.405.094-.232.205-.51.402-.72.563-.3.26-.702.687-.906 1-.403.614-.694 1.083-.875 1.78-.18.69.003 1.34.468 1.75.426.376.846.52 1.28.563.65.065 1.206.093 2-.188.658-.23 1.022-.553 1.5-.97-.882.11-1.816.09-2.53.032-.87-.07-1.268-.384-1.47-.594-.27-.283-.306-.64-.155-1.22.036-.14.097-.322.25-.53.168-.228.364-.435.594-.656.45-.436 1.01-.737 1.46-.938-.044.205-.106.442-.054.687.05.23.248.38.438.47.26.12.507.154.69.155 1.42.01 2.86 0 4.28 0 .247 0 .452-.163.594-.375.14-.208.25-.48.344-.844.13-.5.094-1.062-.094-1.625-.182-.543-.418-1.01-.72-1.406-.334-.443-.673-.83-1-1.22 1.258-.814 2.717-1.238 3.97-1.687.12-.452.224-.926.313-1.313zm-9.47 8.438c-.26.394-.583.69-.874 1 .376.286.75.556 1.095.813.335-.303.626-.674.875-.97-.39-.267-.77-.587-1.094-.843z"/>
+        <path id="arab-keheh-jeem" d="M18.125 5.844c-1.695.555-3.297 1.162-4.594 1.938-.49.3-.77.712-.872 1.125-.064.263-.035.572.063.78.19.406.54.575.844.814l.094-.122.53.625c.14.165.344.514.47.94.137.462.08.724 0 1.124H11.22c-.34 0-.593.007-.767-.02-.34-.053-.256-.208-.234-.34.33-.127.56-.173.935-.14.29-.495.593-.886.906-1.314-.98.037-1.877.015-2.687-.094-.346-.048-.698-.187-1.094-.157-.357.026-.768.24-1.03.72-.247.447-.435.838-.657 1.28l.75-.47c.23-.14.484-.226.72-.218.156.005.274.054.405.094-.233.204-.51.4-.72.562-.3.26-.703.688-.907 1-.402.615-.693 1.084-.874 1.78-.18.69.003 1.34.468 1.75.426.377.846.52 1.28.564.65.065 1.206.093 2-.188.658-.23 1.022-.553 1.5-.97-.882.11-1.816.09-2.53.032-.87-.07-1.268-.384-1.47-.594-.27-.283-.306-.64-.155-1.22.036-.14.097-.322.25-.53.17-.228.364-.435.594-.656.45-.436 1.01-.737 1.46-.938-.044.205-.106.442-.054.687.05.23.25.38.44.47.26.12.506.153.69.154 1.42.01 2.86 0 4.28 0 .246 0 .45-.163.593-.375.14-.21.25-.48.344-.845.13-.5.094-1.062-.094-1.625-.182-.543-.418-1.01-.72-1.406-.334-.443-.673-.83-1-1.22 1.258-.814 2.717-1.238 3.97-1.687.12-.452.224-.926.313-1.313zm-9.47 8.438c-.26.394-.583.69-.874 1 .378.286.75.556 1.097.813.335-.303.626-.674.875-.97-.39-.267-.77-.587-1.093-.843z"/>
     </g>
 </svg>
index f94928b..3285ad9 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem.png differ
index 1c4aeb7..04cdebb 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="italic-arab-keheh-jeem">
-        <path id="arab-keheh-jeem" d="M18.125 5.844c-1.695.555-3.297 1.162-4.594 1.938-.49.3-.773.712-.874 1.125-.064.263-.035.572.063.78.188.406.538.575.843.814l.094-.124.53.625c.14.165.344.514.47.94.137.462.08.724 0 1.124H11.22c-.34 0-.593.007-.767-.02-.34-.053-.256-.208-.234-.34.33-.127.563-.173.937-.14.29-.495.593-.886.906-1.314-.98.037-1.878.015-2.688-.094-.346-.047-.698-.186-1.094-.156-.356.026-.767.24-1.03.72-.246.447-.434.838-.656 1.28l.75-.47c.23-.14.484-.226.72-.218.156.005.274.054.405.094-.232.205-.51.402-.72.563-.3.26-.702.687-.906 1-.403.614-.694 1.083-.875 1.78-.18.69.003 1.34.468 1.75.426.376.846.52 1.28.563.65.065 1.206.093 2-.188.658-.23 1.022-.553 1.5-.97-.882.11-1.816.09-2.53.032-.87-.07-1.268-.384-1.47-.594-.27-.283-.306-.64-.155-1.22.036-.14.097-.322.25-.53.168-.228.364-.435.594-.656.45-.436 1.01-.737 1.46-.938-.044.205-.106.442-.054.687.05.23.248.38.438.47.26.12.507.154.69.155 1.42.01 2.86 0 4.28 0 .247 0 .452-.163.594-.375.14-.208.25-.48.344-.844.13-.5.094-1.062-.094-1.625-.182-.543-.418-1.01-.72-1.406-.334-.443-.673-.83-1-1.22 1.258-.814 2.717-1.238 3.97-1.687.12-.452.224-.926.313-1.313zm-9.47 8.438c-.26.394-.583.69-.874 1 .376.286.75.556 1.095.813.335-.303.626-.674.875-.97-.39-.267-.77-.587-1.094-.843z"/>
+        <path id="arab-keheh-jeem" d="M18.125 5.844c-1.695.555-3.297 1.162-4.594 1.938-.49.3-.77.712-.872 1.125-.064.263-.035.572.063.78.19.406.54.575.844.814l.094-.122.53.625c.14.165.344.514.47.94.137.462.08.724 0 1.124H11.22c-.34 0-.593.007-.767-.02-.34-.053-.256-.208-.234-.34.33-.127.56-.173.935-.14.29-.495.593-.886.906-1.314-.98.037-1.877.015-2.687-.094-.346-.048-.698-.187-1.094-.157-.357.026-.768.24-1.03.72-.247.447-.435.838-.657 1.28l.75-.47c.23-.14.484-.226.72-.218.156.005.274.054.405.094-.233.204-.51.4-.72.562-.3.26-.703.688-.907 1-.402.615-.693 1.084-.874 1.78-.18.69.003 1.34.468 1.75.426.377.846.52 1.28.564.65.065 1.206.093 2-.188.658-.23 1.022-.553 1.5-.97-.882.11-1.816.09-2.53.032-.87-.07-1.268-.384-1.47-.594-.27-.283-.306-.64-.155-1.22.036-.14.097-.322.25-.53.17-.228.364-.435.594-.656.45-.436 1.01-.737 1.46-.938-.044.205-.106.442-.054.687.05.23.25.38.44.47.26.12.506.153.69.154 1.42.01 2.86 0 4.28 0 .246 0 .45-.163.593-.375.14-.21.25-.48.344-.845.13-.5.094-1.062-.094-1.625-.182-.543-.418-1.01-.72-1.406-.334-.443-.673-.83-1-1.22 1.258-.814 2.717-1.238 3.97-1.687.12-.452.224-.926.313-1.313zm-9.47 8.438c-.26.394-.583.69-.874 1 .378.286.75.556 1.097.813.335-.303.626-.674.875-.97-.39-.267-.77-.587-1.093-.843z"/>
     </g>
 </svg>
index 864e6e2..37282ef 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem-invert.png differ
index 31b9be1..4b9da20 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="italic-arab-meem">
-        <path id="arab-meem" d="M16 9.73l-.93 2.19h-4.663c-.48 0-.857.12-1.135.366l-.06.11c-.185 2.016-.503 3.558-.956 4.627-.272.64-.633 1.252-1.082 1.833-.177.226-.22.186-.126-.12l.142-.503.17-.67.234-.87.002-.008.202-1.045.258-1.41.353-1.907c.19-.312.423-.638.698-.98.276-.342.59-.706.94-1.09.13-.092.697-.18 1.705-.266 1.05-.086 1.638-.183 1.765-.293l.065-.128c.007-.11-.01-.24-.054-.394-.044-.153-.12-.327-.232-.522-.22-.428-.438-.64-.654-.64-.294 0-.915.268-1.864.805-.36.208-.376.125-.05-.247 1.557-1.71 2.707-2.566 3.45-2.566.382 0 .67.13.862.394.135.195.25.6.344 1.21l.203 1.2c.105.586.24.895.408.925"/>
+        <path id="arab-meem" d="M16 9.73l-.93 2.19h-4.663c-.48 0-.857.12-1.135.366l-.06.11c-.185 2.016-.503 3.558-.956 4.627-.272.64-.633 1.252-1.082 1.833-.177.226-.22.186-.126-.12l.142-.503.17-.67.234-.87.002-.008.202-1.045.258-1.41.353-1.907c.19-.312.42-.638.696-.98.276-.342.59-.706.94-1.09.13-.092.697-.18 1.705-.266 1.05-.086 1.64-.183 1.766-.293l.065-.128c.008-.11-.01-.24-.053-.394-.044-.153-.12-.327-.232-.522-.22-.428-.438-.64-.654-.64-.293 0-.914.268-1.863.805-.36.208-.376.125-.05-.247 1.557-1.71 2.707-2.566 3.45-2.566.382 0 .67.13.862.394.134.195.25.6.343 1.21l.203 1.2c.105.586.24.895.408.925"/>
     </g>
 </svg>
index a963197..3c5adc3 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem.png differ
index 7b2670f..f315377 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="italic-arab-meem">
-        <path id="arab-meem" d="M16 9.73l-.93 2.19h-4.663c-.48 0-.857.12-1.135.366l-.06.11c-.185 2.016-.503 3.558-.956 4.627-.272.64-.633 1.252-1.082 1.833-.177.226-.22.186-.126-.12l.142-.503.17-.67.234-.87.002-.008.202-1.045.258-1.41.353-1.907c.19-.312.423-.638.698-.98.276-.342.59-.706.94-1.09.13-.092.697-.18 1.705-.266 1.05-.086 1.638-.183 1.765-.293l.065-.128c.007-.11-.01-.24-.054-.394-.044-.153-.12-.327-.232-.522-.22-.428-.438-.64-.654-.64-.294 0-.915.268-1.864.805-.36.208-.376.125-.05-.247 1.557-1.71 2.707-2.566 3.45-2.566.382 0 .67.13.862.394.135.195.25.6.344 1.21l.203 1.2c.105.586.24.895.408.925"/>
+        <path id="arab-meem" d="M16 9.73l-.93 2.19h-4.663c-.48 0-.857.12-1.135.366l-.06.11c-.185 2.016-.503 3.558-.956 4.627-.272.64-.633 1.252-1.082 1.833-.177.226-.22.186-.126-.12l.142-.503.17-.67.234-.87.002-.008.202-1.045.258-1.41.353-1.907c.19-.312.42-.638.696-.98.276-.342.59-.706.94-1.09.13-.092.697-.18 1.705-.266 1.05-.086 1.64-.183 1.766-.293l.065-.128c.008-.11-.01-.24-.053-.394-.044-.153-.12-.327-.232-.522-.22-.428-.438-.64-.654-.64-.293 0-.914.268-1.863.805-.36.208-.376.125-.05-.247 1.557-1.71 2.707-2.566 3.45-2.566.382 0 .67.13.862.394.134.195.25.6.343 1.21l.203 1.2c.105.586.24.895.408.925"/>
     </g>
 </svg>
index ce7b445..91497a7 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha-invert.png differ
index 4f3621e..c75dda0 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="italic-armn-sha">
-        <path id="armn-sha" d="M11.564 7.678c-.268-.13-.578-.22-.93-.268-.35-.047-.75-.07-1.197-.07h-1.11L8.587 6h1.723c.558 0 1.042.032 1.45.095.416.063.794.173 1.136.33l4.483 2.033-.325 1.67-2.624-1.165c-.125-.058-.27-.103-.432-.134-.164-.04-.356-.058-.576-.058-.583 0-1.137.095-1.663.284-.525.19-1 .46-1.426.812-.42.35-.777.78-1.072 1.283-.294.505-.504 1.075-.63 1.71-.242 1.256-.152 2.21.268 2.87.426.65 1.19.977 2.294.977.55 0 1.045-.08 1.48-.237.437-.156.815-.377 1.136-.66.326-.29.59-.633.796-1.033.21-.4.362-.84.457-1.323l.11-.56h1.6l-.12.59c-.13.674-.356 1.288-.676 1.845-.32.55-.725 1.025-1.214 1.424-.488.394-1.053.7-1.694.922-.643.215-1.344.323-2.106.323-.767 0-1.434-.114-2-.34-.568-.226-1.025-.554-1.372-.985-.347-.436-.573-.97-.678-1.607-.105-.637-.078-1.364.08-2.184.125-.66.346-1.273.66-1.835.316-.568.697-1.067 1.144-1.497.445-.436.944-.794 1.496-1.072.55-.283 1.13-.474 1.733-.574l-.466-.23"/>
+        <path id="armn-sha" d="M11.564 7.678c-.268-.13-.578-.22-.93-.268-.35-.047-.75-.07-1.197-.07h-1.11L8.587 6h1.723c.558 0 1.042.032 1.45.095.416.063.794.173 1.136.33l4.483 2.033-.327 1.67-2.624-1.165c-.126-.058-.27-.103-.433-.134-.164-.04-.356-.06-.576-.06-.582 0-1.136.095-1.662.284-.526.19-1 .46-1.427.812-.42.35-.776.78-1.07 1.283-.294.504-.504 1.074-.63 1.71-.24 1.255-.15 2.21.27 2.87.424.65 1.19.976 2.292.976.55 0 1.045-.08 1.48-.237.437-.157.815-.378 1.136-.66.325-.29.59-.634.795-1.034.21-.4.362-.84.457-1.323l.11-.56h1.6l-.12.59c-.13.674-.356 1.288-.676 1.845-.32.55-.725 1.024-1.214 1.423-.488.395-1.053.7-1.694.923-.643.215-1.344.323-2.106.323-.767 0-1.434-.114-2-.34-.568-.226-1.025-.554-1.372-.985-.347-.435-.573-.97-.678-1.606-.105-.637-.078-1.364.08-2.184.125-.66.346-1.273.66-1.835.316-.568.697-1.067 1.144-1.497.445-.436.944-.794 1.496-1.072.55-.283 1.13-.474 1.733-.574l-.466-.23"/>
     </g>
 </svg>
index e4f1bda..15795c5 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha.png differ
index 67283c8..f0d10d9 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="italic-armn-sha">
-        <path id="armn-sha" d="M11.564 7.678c-.268-.13-.578-.22-.93-.268-.35-.047-.75-.07-1.197-.07h-1.11L8.587 6h1.723c.558 0 1.042.032 1.45.095.416.063.794.173 1.136.33l4.483 2.033-.325 1.67-2.624-1.165c-.125-.058-.27-.103-.432-.134-.164-.04-.356-.058-.576-.058-.583 0-1.137.095-1.663.284-.525.19-1 .46-1.426.812-.42.35-.777.78-1.072 1.283-.294.505-.504 1.075-.63 1.71-.242 1.256-.152 2.21.268 2.87.426.65 1.19.977 2.294.977.55 0 1.045-.08 1.48-.237.437-.156.815-.377 1.136-.66.326-.29.59-.633.796-1.033.21-.4.362-.84.457-1.323l.11-.56h1.6l-.12.59c-.13.674-.356 1.288-.676 1.845-.32.55-.725 1.025-1.214 1.424-.488.394-1.053.7-1.694.922-.643.215-1.344.323-2.106.323-.767 0-1.434-.114-2-.34-.568-.226-1.025-.554-1.372-.985-.347-.436-.573-.97-.678-1.607-.105-.637-.078-1.364.08-2.184.125-.66.346-1.273.66-1.835.316-.568.697-1.067 1.144-1.497.445-.436.944-.794 1.496-1.072.55-.283 1.13-.474 1.733-.574l-.466-.23"/>
+        <path id="armn-sha" d="M11.564 7.678c-.268-.13-.578-.22-.93-.268-.35-.047-.75-.07-1.197-.07h-1.11L8.587 6h1.723c.558 0 1.042.032 1.45.095.416.063.794.173 1.136.33l4.483 2.033-.327 1.67-2.624-1.165c-.126-.058-.27-.103-.433-.134-.164-.04-.356-.06-.576-.06-.582 0-1.136.095-1.662.284-.526.19-1 .46-1.427.812-.42.35-.776.78-1.07 1.283-.294.504-.504 1.074-.63 1.71-.24 1.255-.15 2.21.27 2.87.424.65 1.19.976 2.292.976.55 0 1.045-.08 1.48-.237.437-.157.815-.378 1.136-.66.325-.29.59-.634.795-1.034.21-.4.362-.84.457-1.323l.11-.56h1.6l-.12.59c-.13.674-.356 1.288-.676 1.845-.32.55-.725 1.024-1.214 1.423-.488.395-1.053.7-1.694.923-.643.215-1.344.323-2.106.323-.767 0-1.434-.114-2-.34-.568-.226-1.025-.554-1.372-.985-.347-.435-.573-.97-.678-1.606-.105-.637-.078-1.364.08-2.184.125-.66.346-1.273.66-1.835.316-.568.697-1.067 1.144-1.497.445-.436.944-.794 1.496-1.072.55-.283 1.13-.474 1.733-.574l-.466-.23"/>
     </g>
 </svg>
index a458be9..f7851fa 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c-invert.png differ
index 8c51971..761aea3 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="italic-c">
-        <path id="c" d="M15.008 13.718l1.48.214c-.467 1.34-1.15 2.354-2.045 3.04-.896.686-1.9 1.03-3.015 1.03-1.36 0-2.438-.43-3.237-1.29C7.398 15.85 7 14.618 7 13.013c0-2.09.606-3.818 1.817-5.185C9.897 6.61 11.237 6 12.84 6c1.186 0 2.145.33 2.878.99.738.66 1.165 1.546 1.282 2.66l-1.397.135c-.148-.84-.453-1.464-.916-1.876-.458-.418-1.05-.626-1.78-.626-1.368 0-2.475.63-3.32 1.892-.733 1.087-1.1 2.377-1.1 3.87 0 1.194.283 2.104.848 2.732.565.628 1.3.942 2.206.942.775 0 1.474-.26 2.1-.784.626-.522 1.08-1.26 1.366-2.216"/>
+        <path id="c" d="M15.008 13.718l1.48.214c-.467 1.34-1.15 2.354-2.045 3.04-.896.686-1.9 1.03-3.015 1.03-1.36 0-2.438-.43-3.237-1.29C7.4 15.85 7 14.618 7 13.012c0-2.09.606-3.817 1.817-5.184C9.897 6.61 11.237 6 12.84 6c1.186 0 2.145.33 2.878.99.738.66 1.165 1.546 1.282 2.66l-1.397.135c-.148-.84-.453-1.464-.916-1.876-.458-.42-1.05-.628-1.78-.628-1.368 0-2.475.63-3.32 1.892-.733 1.087-1.1 2.377-1.1 3.87 0 1.194.283 2.104.848 2.732.565.628 1.3.942 2.206.942.777 0 1.476-.26 2.1-.785.628-.522 1.08-1.26 1.368-2.216"/>
     </g>
 </svg>
index 1ba8613..2b8b6e4 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c.png differ
index 0ef7345..2018e60 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="italic-c">
-        <path id="c" d="M15.008 13.718l1.48.214c-.467 1.34-1.15 2.354-2.045 3.04-.896.686-1.9 1.03-3.015 1.03-1.36 0-2.438-.43-3.237-1.29C7.398 15.85 7 14.618 7 13.013c0-2.09.606-3.818 1.817-5.185C9.897 6.61 11.237 6 12.84 6c1.186 0 2.145.33 2.878.99.738.66 1.165 1.546 1.282 2.66l-1.397.135c-.148-.84-.453-1.464-.916-1.876-.458-.418-1.05-.626-1.78-.626-1.368 0-2.475.63-3.32 1.892-.733 1.087-1.1 2.377-1.1 3.87 0 1.194.283 2.104.848 2.732.565.628 1.3.942 2.206.942.775 0 1.474-.26 2.1-.784.626-.522 1.08-1.26 1.366-2.216"/>
+        <path id="c" d="M15.008 13.718l1.48.214c-.467 1.34-1.15 2.354-2.045 3.04-.896.686-1.9 1.03-3.015 1.03-1.36 0-2.438-.43-3.237-1.29C7.4 15.85 7 14.618 7 13.012c0-2.09.606-3.817 1.817-5.184C9.897 6.61 11.237 6 12.84 6c1.186 0 2.145.33 2.878.99.738.66 1.165 1.546 1.282 2.66l-1.397.135c-.148-.84-.453-1.464-.916-1.876-.458-.42-1.05-.628-1.78-.628-1.368 0-2.475.63-3.32 1.892-.733 1.087-1.1 2.377-1.1 3.87 0 1.194.283 2.104.848 2.732.565.628 1.3.942 2.206.942.777 0 1.476-.26 2.1-.785.628-.522 1.08-1.26 1.368-2.216"/>
     </g>
 </svg>
index 093545c..33a41cb 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d-invert.png differ
index 63c2c9d..e9ce6db 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="italic-d">
-        <path id="d" d="M7 18L9.462 6h3.557c.852 0 1.504.063 1.954.188.644.17 1.194.472 1.65.91.456.43.8.97 1.03 1.62.23.65.346 1.378.346 2.186 0 .966-.145 1.847-.435 2.644-.284.79-.66 1.49-1.127 2.095-.46.6-.947 1.072-1.456 1.416-.504.337-1.102.588-1.794.752-.526.126-1.172.188-1.94.188H7m1.86-1.36h1.866c.842 0 1.59-.078 2.245-.236.41-.098.757-.243 1.047-.434.38-.246.727-.57 1.038-.974.408-.535.732-1.143.974-1.825.246-.687.37-1.467.37-2.34 0-.97-.167-1.716-.5-2.235-.333-.524-.756-.87-1.27-1.04-.382-.126-.975-.188-1.78-.188H11L9.095 16.64"/>
+        <path id="d" d="M7 18L9.462 6h3.557c.85 0 1.502.063 1.952.188.644.17 1.194.472 1.65.91.456.43.8.97 1.03 1.62.23.65.346 1.378.346 2.186 0 .966-.146 1.847-.436 2.644-.284.79-.66 1.49-1.127 2.095-.46.6-.947 1.072-1.456 1.416-.504.335-1.1.586-1.794.75-.526.126-1.172.19-1.94.19H7m1.86-1.36h1.866c.842 0 1.59-.08 2.245-.238.41-.098.76-.243 1.05-.434.38-.247.726-.57 1.037-.975.408-.535.732-1.143.974-1.825.247-.687.37-1.467.37-2.34 0-.97-.166-1.716-.5-2.235-.332-.524-.755-.87-1.27-1.04-.38-.126-.974-.188-1.78-.188H11L9.095 16.64"/>
     </g>
 </svg>
index 39b09a2..4ace3f3 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d.png differ
index 6ac99ab..c044c86 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="italic-d">
-        <path id="d" d="M7 18L9.462 6h3.557c.852 0 1.504.063 1.954.188.644.17 1.194.472 1.65.91.456.43.8.97 1.03 1.62.23.65.346 1.378.346 2.186 0 .966-.145 1.847-.435 2.644-.284.79-.66 1.49-1.127 2.095-.46.6-.947 1.072-1.456 1.416-.504.337-1.102.588-1.794.752-.526.126-1.172.188-1.94.188H7m1.86-1.36h1.866c.842 0 1.59-.078 2.245-.236.41-.098.757-.243 1.047-.434.38-.246.727-.57 1.038-.974.408-.535.732-1.143.974-1.825.246-.687.37-1.467.37-2.34 0-.97-.167-1.716-.5-2.235-.333-.524-.756-.87-1.27-1.04-.382-.126-.975-.188-1.78-.188H11L9.095 16.64"/>
+        <path id="d" d="M7 18L9.462 6h3.557c.85 0 1.502.063 1.952.188.644.17 1.194.472 1.65.91.456.43.8.97 1.03 1.62.23.65.346 1.378.346 2.186 0 .966-.146 1.847-.436 2.644-.284.79-.66 1.49-1.127 2.095-.46.6-.947 1.072-1.456 1.416-.504.335-1.1.586-1.794.75-.526.126-1.172.19-1.94.19H7m1.86-1.36h1.866c.842 0 1.59-.08 2.245-.238.41-.098.76-.243 1.05-.434.38-.247.726-.57 1.037-.975.408-.535.732-1.143.974-1.825.247-.687.37-1.467.37-2.34 0-.97-.166-1.716-.5-2.235-.332-.524-.755-.87-1.27-1.04-.38-.126-.974-.188-1.78-.188H11L9.095 16.64"/>
     </g>
 </svg>
index 9d11112..f6c18e5 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="italic-e">
-        <path id="e" d="M7 18L9.474 6H18l-.282 1.367H10.77L10.02 11h6.09l-.28 1.367H9.74L8.86 16.64H16.3L16.018 18H7"/>
+        <path id="e" d="M7 18L9.474 6H18l-.282 1.367H10.77L10.02 11h6.09l-.28 1.367H9.74l-.88 4.273h7.44L16.018 18H7"/>
     </g>
 </svg>
index 72df8bb..f385149 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="italic-e">
-        <path id="e" d="M7 18L9.474 6H18l-.282 1.367H10.77L10.02 11h6.09l-.28 1.367H9.74L8.86 16.64H16.3L16.018 18H7"/>
+        <path id="e" d="M7 18L9.474 6H18l-.282 1.367H10.77L10.02 11h6.09l-.28 1.367H9.74l-.88 4.273h7.44L16.018 18H7"/>
     </g>
 </svg>
index 61ae2cc..c3feced 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan-invert.png differ
index 256a8eb..d77fe40 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="italic-geor-kan">
-        <path id="geor-kan" d="M15.057 14.663C14.617 16.888 13.223 18 10.88 18 8.96 18 8 17.213 8 15.64c0-.298.036-.624.108-.977.083-.43.245-.836.488-1.217l1.24.605-.206.614c-.055.26-.083.497-.083.712 0 .972.52 1.458 1.564 1.458 1.308 0 2.102-.723 2.384-2.17l.058-.33c.044-.222.066-.426.066-.614 0-.928-.546-1.39-1.638-1.39h-1.117l.248-1.26h1.118c1.202-.005 1.908-.552 2.118-1.64.04-.182.058-.356.058-.522 0-1.143-.9-1.714-2.697-1.714L11.94 6C14.646 6 16 6.877 16 8.627c0 .248-.027.516-.082.803-.204 1.092-1.05 1.824-2.54 2.194l-.033.166c1.23.2 1.845.823 1.845 1.872 0 .21-.025.433-.074.67l-.058.332"/>
+        <path id="geor-kan" d="M15.057 14.663C14.617 16.888 13.223 18 10.88 18 8.96 18 8 17.213 8 15.64c0-.298.036-.624.108-.977.083-.43.245-.836.488-1.217l1.24.605-.206.616c-.055.26-.083.497-.083.712 0 .972.52 1.458 1.564 1.458 1.31 0 2.104-.723 2.386-2.17l.058-.33c.044-.222.066-.426.066-.614 0-.927-.547-1.39-1.64-1.39h-1.116l.248-1.26h1.118c1.202-.004 1.908-.55 2.118-1.64.04-.18.058-.355.058-.52 0-1.144-.9-1.715-2.697-1.715L11.94 6C14.646 6 16 6.877 16 8.627c0 .248-.027.516-.082.803-.204 1.092-1.05 1.824-2.54 2.194l-.033.166c1.23.2 1.845.823 1.845 1.872 0 .21-.025.433-.074.67l-.058.332"/>
     </g>
 </svg>
index 3ab33f2..7f2512e 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan.png differ
index a1a93dc..867f458 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="italic-geor-kan">
-        <path id="geor-kan" d="M15.057 14.663C14.617 16.888 13.223 18 10.88 18 8.96 18 8 17.213 8 15.64c0-.298.036-.624.108-.977.083-.43.245-.836.488-1.217l1.24.605-.206.614c-.055.26-.083.497-.083.712 0 .972.52 1.458 1.564 1.458 1.308 0 2.102-.723 2.384-2.17l.058-.33c.044-.222.066-.426.066-.614 0-.928-.546-1.39-1.638-1.39h-1.117l.248-1.26h1.118c1.202-.005 1.908-.552 2.118-1.64.04-.182.058-.356.058-.522 0-1.143-.9-1.714-2.697-1.714L11.94 6C14.646 6 16 6.877 16 8.627c0 .248-.027.516-.082.803-.204 1.092-1.05 1.824-2.54 2.194l-.033.166c1.23.2 1.845.823 1.845 1.872 0 .21-.025.433-.074.67l-.058.332"/>
+        <path id="geor-kan" d="M15.057 14.663C14.617 16.888 13.223 18 10.88 18 8.96 18 8 17.213 8 15.64c0-.298.036-.624.108-.977.083-.43.245-.836.488-1.217l1.24.605-.206.616c-.055.26-.083.497-.083.712 0 .972.52 1.458 1.564 1.458 1.31 0 2.104-.723 2.386-2.17l.058-.33c.044-.222.066-.426.066-.614 0-.927-.547-1.39-1.64-1.39h-1.116l.248-1.26h1.118c1.202-.004 1.908-.55 2.118-1.64.04-.18.058-.355.058-.52 0-1.144-.9-1.715-2.697-1.715L11.94 6C14.646 6 16 6.877 16 8.627c0 .248-.027.516-.082.803-.204 1.092-1.05 1.824-2.54 2.194l-.033.166c1.23.2 1.845.823 1.845 1.872 0 .21-.025.433-.074.67l-.058.332"/>
     </g>
 </svg>
index a9a5e49..eb3dc91 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s-invert.png differ
index d5557d1..ef5a411 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="italic-s">
-        <path id="s" d="M16.474 6.59l-.302 1.525c-.522-.28-1.04-.488-1.557-.628-.51-.145-1.007-.217-1.487-.217-.935 0-1.68.204-2.23.612-.554.408-.83.95-.83 1.627 0 .37.1.657.302.86.207.195.733.407 1.58.634l.937.232c1.06.274 1.795.622 2.208 1.046.413.418.62 1.007.62 1.766 0 1.167-.46 2.117-1.38 2.85-.913.734-2.12 1.1-3.617 1.1-.615 0-1.232-.06-1.852-.185-.62-.12-1.242-.302-1.867-.55l.317-1.61c.573.355 1.147.624 1.72.805.578.18 1.154.27 1.728.27.976 0 1.76-.216 2.347-.65.59-.434.883-1 .883-1.697 0-.464-.12-.815-.356-1.053-.233-.243-.737-.462-1.512-.658l-.937-.24c-1.068-.28-1.8-.6-2.19-.962-.388-.367-.582-.878-.582-1.534 0-1.152.442-2.094 1.325-2.828.888-.74 2.043-1.108 3.463-1.108.553 0 1.1.05 1.642.147.542.098 1.085.245 1.627.442"/>
+        <path id="s" d="M16.474 6.59l-.302 1.525c-.522-.28-1.04-.488-1.557-.628-.51-.145-1.007-.217-1.487-.217-.935 0-1.68.204-2.23.612-.554.408-.83.95-.83 1.627 0 .37.1.655.302.86.207.193.733.405 1.58.632l.937.232c1.06.274 1.795.622 2.208 1.046.413.42.62 1.008.62 1.767 0 1.167-.46 2.117-1.38 2.85-.913.734-2.12 1.1-3.617 1.1-.615 0-1.232-.06-1.852-.185-.62-.12-1.242-.302-1.867-.55l.315-1.61c.573.355 1.147.624 1.72.805.578.18 1.154.27 1.728.27.976 0 1.76-.216 2.347-.65.59-.434.884-1 .884-1.697 0-.464-.12-.815-.356-1.053-.233-.243-.737-.462-1.512-.658l-.937-.24c-1.07-.28-1.8-.6-2.19-.964-.39-.367-.584-.878-.584-1.534 0-1.152.442-2.094 1.325-2.828.89-.74 2.044-1.108 3.464-1.108.553 0 1.1.05 1.642.147.542.098 1.085.245 1.627.442"/>
     </g>
 </svg>
index aafa618..c3b1e6e 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s.png differ
index 56e457b..1c5a4ca 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="italic-s">
-        <path id="s" d="M16.474 6.59l-.302 1.525c-.522-.28-1.04-.488-1.557-.628-.51-.145-1.007-.217-1.487-.217-.935 0-1.68.204-2.23.612-.554.408-.83.95-.83 1.627 0 .37.1.657.302.86.207.195.733.407 1.58.634l.937.232c1.06.274 1.795.622 2.208 1.046.413.418.62 1.007.62 1.766 0 1.167-.46 2.117-1.38 2.85-.913.734-2.12 1.1-3.617 1.1-.615 0-1.232-.06-1.852-.185-.62-.12-1.242-.302-1.867-.55l.317-1.61c.573.355 1.147.624 1.72.805.578.18 1.154.27 1.728.27.976 0 1.76-.216 2.347-.65.59-.434.883-1 .883-1.697 0-.464-.12-.815-.356-1.053-.233-.243-.737-.462-1.512-.658l-.937-.24c-1.068-.28-1.8-.6-2.19-.962-.388-.367-.582-.878-.582-1.534 0-1.152.442-2.094 1.325-2.828.888-.74 2.043-1.108 3.463-1.108.553 0 1.1.05 1.642.147.542.098 1.085.245 1.627.442"/>
+        <path id="s" d="M16.474 6.59l-.302 1.525c-.522-.28-1.04-.488-1.557-.628-.51-.145-1.007-.217-1.487-.217-.935 0-1.68.204-2.23.612-.554.408-.83.95-.83 1.627 0 .37.1.655.302.86.207.193.733.405 1.58.632l.937.232c1.06.274 1.795.622 2.208 1.046.413.42.62 1.008.62 1.767 0 1.167-.46 2.117-1.38 2.85-.913.734-2.12 1.1-3.617 1.1-.615 0-1.232-.06-1.852-.185-.62-.12-1.242-.302-1.867-.55l.315-1.61c.573.355 1.147.624 1.72.805.578.18 1.154.27 1.728.27.976 0 1.76-.216 2.347-.65.59-.434.884-1 .884-1.697 0-.464-.12-.815-.356-1.053-.233-.243-.737-.462-1.512-.658l-.937-.24c-1.07-.28-1.8-.6-2.19-.964-.39-.367-.584-.878-.584-1.534 0-1.152.442-2.094 1.325-2.828.89-.74 2.044-1.108 3.464-1.108.553 0 1.1.05 1.642.147.542.098 1.085.245 1.627.442"/>
     </g>
 </svg>
index fc0917e..81930e3 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-invert.png differ
index 96a39e2..d857a04 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="language">
-        <path id="japanese" d="M17.533 9.81l.27-.59 1.042.407-.18.363c.66.27 1.1.468 1.312.59.33.21.618.513.86.904.21.393.316.846.316 1.358 0 .786-.302 1.48-.905 2.083-.604.634-1.66 1.057-3.17 1.268-.12-.36-.257-.68-.407-.95.966-.15 1.646-.333 2.038-.545.454-.21.785-.48.998-.813.21-.303.314-.663.314-1.087 0-.482-.136-.905-.407-1.27-.33-.33-.8-.588-1.402-.77-.332.635-.648 1.118-.95 1.45-.242.332-.694.906-1.358 1.72.09.394.18.71.272.952l-1.042.362-.09-.498c-.424.36-.802.617-1.134.77-.36.15-.664.226-.905.226-.303 0-.574-.136-.814-.407-.244-.3-.363-.68-.363-1.132 0-.603.136-1.146.407-1.63.24-.452.603-.89 1.086-1.312.272-.24.725-.528 1.36-.86 0-.27.03-.8.09-1.585-.515.03-.922.045-1.223.045-.393 0-.71-.015-.95-.045l-.047-1.04c.725.09 1.494.134 2.31.134 0-.15.075-.738.227-1.766l1.177.184c-.15.542-.256 1.04-.316 1.493.242-.03.543-.075.906-.136.362-.06.573-.09.634-.09s.648-.15 1.766-.453l.046 1.04c-.967.244-2.145.44-3.532.592-.062.662-.092 1.085-.092 1.265.663-.15 1.284-.225 1.857-.225zm-2.672 3.893c-.06-.48-.135-1.252-.226-2.31-.573.424-1.04.86-1.403 1.313-.302.423-.45.875-.45 1.358 0 .24.043.438.135.588.09.092.195.137.316.137.364 0 .908-.362 1.63-1.087zm.772-2.763c0 .483.03 1.088.09 1.81.604-.904 1.057-1.598 1.36-2.08-.575.06-1.06.15-1.45.27z"/>
+        <path id="japanese" d="M17.533 9.81l.27-.59 1.042.407-.18.363c.66.27 1.1.468 1.312.59.33.21.618.513.86.904.21.393.316.846.316 1.358 0 .786-.302 1.48-.905 2.083-.604.634-1.66 1.057-3.17 1.268-.12-.36-.257-.68-.407-.95.968-.15 1.648-.333 2.04-.545.454-.21.785-.48.998-.813.21-.303.314-.663.314-1.087 0-.482-.135-.905-.406-1.27-.33-.33-.8-.588-1.402-.77-.332.635-.648 1.118-.95 1.45-.242.332-.694.906-1.358 1.72.09.394.18.71.272.952l-1.042.362-.09-.498c-.424.36-.802.617-1.134.77-.36.15-.664.226-.905.226-.303 0-.574-.136-.814-.407-.243-.3-.362-.68-.362-1.132 0-.6.137-1.144.408-1.63.24-.45.603-.89 1.086-1.31.273-.24.726-.53 1.36-.86 0-.27.03-.8.09-1.585-.514.03-.92.045-1.222.045-.393 0-.71-.016-.95-.046l-.047-1.04c.726.09 1.495.134 2.31.134 0-.15.076-.738.228-1.766l1.177.184c-.15.542-.256 1.04-.316 1.493.24-.03.542-.077.905-.138.36-.06.572-.09.633-.09s.647-.15 1.765-.453l.046 1.04c-.966.243-2.144.44-3.53.59-.063.663-.093 1.086-.093 1.266.664-.15 1.285-.225 1.858-.225zm-2.672 3.893c-.06-.48-.133-1.252-.224-2.31-.573.424-1.04.86-1.403 1.313-.302.423-.45.875-.45 1.358 0 .24.043.438.135.588.09.092.195.137.316.137.364 0 .908-.364 1.63-1.09zm.774-2.763c0 .483.03 1.088.09 1.81.604-.904 1.057-1.598 1.36-2.08-.575.06-1.06.15-1.45.27z"/>
         <path id="english" d="M9.497 15.98h1.85L8.265 7.033h-1.85l-3.08 8.95h1.85L5.74 14h3.21l.547 1.98zm-3.49-3.376L7.34 8.822l1.343 3.782H6.008z"/>
     </g>
 </svg>
index ebd11a2..cae0e77 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/language.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/language.png differ
index 549c303..694d225 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="language">
-        <path id="japanese" d="M17.533 9.81l.27-.59 1.042.407-.18.363c.66.27 1.1.468 1.312.59.33.21.618.513.86.904.21.393.316.846.316 1.358 0 .786-.302 1.48-.905 2.083-.604.634-1.66 1.057-3.17 1.268-.12-.36-.257-.68-.407-.95.966-.15 1.646-.333 2.038-.545.454-.21.785-.48.998-.813.21-.303.314-.663.314-1.087 0-.482-.136-.905-.407-1.27-.33-.33-.8-.588-1.402-.77-.332.635-.648 1.118-.95 1.45-.242.332-.694.906-1.358 1.72.09.394.18.71.272.952l-1.042.362-.09-.498c-.424.36-.802.617-1.134.77-.36.15-.664.226-.905.226-.303 0-.574-.136-.814-.407-.244-.3-.363-.68-.363-1.132 0-.603.136-1.146.407-1.63.24-.452.603-.89 1.086-1.312.272-.24.725-.528 1.36-.86 0-.27.03-.8.09-1.585-.515.03-.922.045-1.223.045-.393 0-.71-.015-.95-.045l-.047-1.04c.725.09 1.494.134 2.31.134 0-.15.075-.738.227-1.766l1.177.184c-.15.542-.256 1.04-.316 1.493.242-.03.543-.075.906-.136.362-.06.573-.09.634-.09s.648-.15 1.766-.453l.046 1.04c-.967.244-2.145.44-3.532.592-.062.662-.092 1.085-.092 1.265.663-.15 1.284-.225 1.857-.225zm-2.672 3.893c-.06-.48-.135-1.252-.226-2.31-.573.424-1.04.86-1.403 1.313-.302.423-.45.875-.45 1.358 0 .24.043.438.135.588.09.092.195.137.316.137.364 0 .908-.362 1.63-1.087zm.772-2.763c0 .483.03 1.088.09 1.81.604-.904 1.057-1.598 1.36-2.08-.575.06-1.06.15-1.45.27z"/>
+        <path id="japanese" d="M17.533 9.81l.27-.59 1.042.407-.18.363c.66.27 1.1.468 1.312.59.33.21.618.513.86.904.21.393.316.846.316 1.358 0 .786-.302 1.48-.905 2.083-.604.634-1.66 1.057-3.17 1.268-.12-.36-.257-.68-.407-.95.968-.15 1.648-.333 2.04-.545.454-.21.785-.48.998-.813.21-.303.314-.663.314-1.087 0-.482-.135-.905-.406-1.27-.33-.33-.8-.588-1.402-.77-.332.635-.648 1.118-.95 1.45-.242.332-.694.906-1.358 1.72.09.394.18.71.272.952l-1.042.362-.09-.498c-.424.36-.802.617-1.134.77-.36.15-.664.226-.905.226-.303 0-.574-.136-.814-.407-.243-.3-.362-.68-.362-1.132 0-.6.137-1.144.408-1.63.24-.45.603-.89 1.086-1.31.273-.24.726-.53 1.36-.86 0-.27.03-.8.09-1.585-.514.03-.92.045-1.222.045-.393 0-.71-.016-.95-.046l-.047-1.04c.726.09 1.495.134 2.31.134 0-.15.076-.738.228-1.766l1.177.184c-.15.542-.256 1.04-.316 1.493.24-.03.542-.077.905-.138.36-.06.572-.09.633-.09s.647-.15 1.765-.453l.046 1.04c-.966.243-2.144.44-3.53.59-.063.663-.093 1.086-.093 1.266.664-.15 1.285-.225 1.858-.225zm-2.672 3.893c-.06-.48-.133-1.252-.224-2.31-.573.424-1.04.86-1.403 1.313-.302.423-.45.875-.45 1.358 0 .24.043.438.135.588.09.092.195.137.316.137.364 0 .908-.364 1.63-1.09zm.774-2.763c0 .483.03 1.088.09 1.81.604-.904 1.057-1.598 1.36-2.08-.575.06-1.06.15-1.45.27z"/>
         <path id="english" d="M9.497 15.98h1.85L8.265 7.033h-1.85l-3.08 8.95h1.85L5.74 14h3.21l.547 1.98zm-3.49-3.376L7.34 8.822l1.343 3.782H6.008z"/>
     </g>
 </svg>
index 934cb4e..6e17f59 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #D11D13 }</style>
     <g id="g390">
-        <path d="M15 8s0-3-2.5-3-2.5 3-2.5 3v1h5zm2 0v1h2v10h-10c-1.7 0-3-1.3-3-3v-7h2v-1s0-5 4.5-5 4.5 5 4.5 5z" id="path392"/>
+        <path d="M15 8s0-3-2.5-3S10 8 10 8v1h5zm2 0v1h2v10H9c-1.7 0-3-1.3-3-3V9h2V8s0-5 4.5-5S17 8 17 8z" id="path392"/>
     </g>
 </svg>
index 7aed0f6..fd9359a 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="g390">
-        <path d="M15 8s0-3-2.5-3-2.5 3-2.5 3v1h5zm2 0v1h2v10h-10c-1.7 0-3-1.3-3-3v-7h2v-1s0-5 4.5-5 4.5 5 4.5 5z" id="path392"/>
+        <path d="M15 8s0-3-2.5-3S10 8 10 8v1h5zm2 0v1h2v10H9c-1.7 0-3-1.3-3-3V9h2V8s0-5 4.5-5S17 8 17 8z" id="path392"/>
     </g>
 </svg>
index 5945492..80d3ace 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="g390">
-        <path d="M15 8s0-3-2.5-3-2.5 3-2.5 3v1h5zm2 0v1h2v10h-10c-1.7 0-3-1.3-3-3v-7h2v-1s0-5 4.5-5 4.5 5 4.5 5z" id="path392"/>
+        <path d="M15 8s0-3-2.5-3S10 8 10 8v1h5zm2 0v1h2v10H9c-1.7 0-3-1.3-3-3V9h2V8s0-5 4.5-5S17 8 17 8z" id="path392"/>
     </g>
 </svg>
index 64c2324..9e88270 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #D11D13 }</style>
     <g id="g390">
-        <path d="M10 8s0-3 2.5-3 2.5 3 2.5 3v1h-5zm-2 0v1h-2v10h10c1.7 0 3-1.3 3-3v-7h-2v-1s0-5-4.5-5-4.5 5-4.5 5z" id="path392"/>
+        <path d="M10 8s0-3 2.5-3S15 8 15 8v1h-5zM8 8v1H6v10h10c1.7 0 3-1.3 3-3V9h-2V8s0-5-4.5-5S8 8 8 8z" id="path392"/>
     </g>
 </svg>
index 63cb2eb..bcb3f4f 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="g390">
-        <path d="M10 8s0-3 2.5-3 2.5 3 2.5 3v1h-5zm-2 0v1h-2v10h10c1.7 0 3-1.3 3-3v-7h-2v-1s0-5-4.5-5-4.5 5-4.5 5z" id="path392"/>
+        <path d="M10 8s0-3 2.5-3S15 8 15 8v1h-5zM8 8v1H6v10h10c1.7 0 3-1.3 3-3V9h-2V8s0-5-4.5-5S8 8 8 8z" id="path392"/>
     </g>
 </svg>
index 0591f66..21881e9 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="g390">
-        <path d="M10 8s0-3 2.5-3 2.5 3 2.5 3v1h-5zm-2 0v1h-2v10h10c1.7 0 3-1.3 3-3v-7h-2v-1s0-5-4.5-5-4.5 5-4.5 5z" id="path392"/>
+        <path d="M10 8s0-3 2.5-3S15 8 15 8v1h-5zM8 8v1H6v10h10c1.7 0 3-1.3 3-3V9h-2V8s0-5-4.5-5S8 8 8 8z" id="path392"/>
     </g>
 </svg>
index e97d37b..db69b5a 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl-invert.png differ
index f8eadf9..8ca43a3 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="move-rtl">
-        <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.414-1.413-6.715 6.716L13.65 19.2z"/>
+        <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.415-1.41-6.714 6.716L13.65 19.2z"/>
     </g>
 </svg>
index dbce05e..7aab217 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl.png differ
index 00583b4..48d2c7e 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="move-rtl">
-        <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.414-1.413-6.715 6.716L13.65 19.2z"/>
+        <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.415-1.41-6.714 6.716L13.65 19.2z"/>
     </g>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/notice-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/notice-invert.png
new file mode 100644 (file)
index 0000000..ce1a278
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/notice-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/notice-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/notice-invert.svg
new file mode 100644 (file)
index 0000000..48273f4
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" id="svg3116"><style>* { fill: #FFFFFF }</style>
+    <g id="alert">
+        <path d="M12 18c-3.314 0-6-2.686-6-6s2.686-6 6-6 6 2.686 6 6-2.686 6-6 6zm-1-5h2V8h-2zm0 3h2v-2h-2z" id="path3119"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/notice.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/notice.png
new file mode 100644 (file)
index 0000000..7d27f8e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/notice.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/notice.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/notice.svg
new file mode 100644 (file)
index 0000000..b7fb2e7
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" id="svg3116">
+    <g id="alert">
+        <path d="M12 18c-3.314 0-6-2.686-6-6s2.686-6 6-6 6 2.686 6 6-2.686 6-6 6zm-1-5h2V8h-2zm0 3h2v-2h-2z" id="path3119"/>
+    </g>
+</svg>
index 215cea5..0d34e60 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression-invert.png differ
index 59e863b..e7889c3 100644 (file)
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="regular-expression">
-        <path id="left-bracket" d="M3 12.045c0-.99.15-1.915.45-2.777.306-.862.743-1.618 1.314-2.268H6.23c-.552.72-.968 1.512-1.25 2.374-.28.862-.42 1.75-.42 2.66 0 .915.142 1.8.427 2.654.29.85.7 1.622 1.23 2.312H4.766c-.574-.635-1.012-1.376-1.313-2.223-.3-.847-.45-1.758-.45-2.732"/>
+        <path id="left-bracket" d="M3 12.045c0-.99.15-1.915.45-2.777.306-.862.743-1.618 1.314-2.268H6.23c-.552.72-.968 1.512-1.25 2.374-.28.862-.42 1.75-.42 2.66 0 .915.142 1.8.427 2.654.29.85.7 1.622 1.23 2.312h-1.45c-.575-.635-1.013-1.376-1.314-2.223-.3-.847-.45-1.758-.45-2.732"/>
         <path id="dot" d="M10 16c0 .552-.448 1-1 1s-1-.448-1-1 .448-1 1-1 1 .448 1 1z"/>
-        <path id="star" d="M14.25 7.013l-.24 2.156 2.187-.61.193 1.477-1.992.14 1.307 1.74-1.33.71-.914-1.834-.802 1.822-1.383-.697 1.295-1.74-1.98-.152.23-1.465 2.138.61-.24-2.156h1.535"/>
-        <path id="right-bracket" d="M21 12.045c0 .982-.152 1.896-.457 2.744-.3.846-.737 1.584-1.307 2.21h-1.453c.527-.686.936-1.455 1.225-2.306.29-.855.434-1.74.434-2.66 0-.91-.14-1.797-.422-2.66-.28-.862-.697-1.654-1.248-2.374h1.465c.574.653 1.012 1.413 1.313 2.28.3.86.45 1.783.45 2.765"/>
+        <path id="star" d="M14.25 7.013l-.24 2.156 2.187-.61.193 1.475-1.992.14 1.307 1.74-1.33.71-.914-1.834-.8 1.823-1.383-.697 1.295-1.74-1.98-.152.23-1.465 2.14.61-.24-2.157h1.534"/>
+        <path id="right-bracket" d="M21 12.045c0 .982-.152 1.896-.457 2.744-.3.844-.737 1.582-1.307 2.21h-1.453c.527-.688.936-1.457 1.225-2.308.29-.855.434-1.74.434-2.66 0-.91-.14-1.797-.422-2.66-.28-.862-.697-1.654-1.248-2.374h1.465c.574.652 1.012 1.412 1.313 2.28.3.86.45 1.782.45 2.764"/>
     </g>
 </svg>
index 68bb9d7..b8736a0 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression.png differ
index e9594a1..5f10d4d 100644 (file)
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="regular-expression">
-        <path id="left-bracket" d="M3 12.045c0-.99.15-1.915.45-2.777.306-.862.743-1.618 1.314-2.268H6.23c-.552.72-.968 1.512-1.25 2.374-.28.862-.42 1.75-.42 2.66 0 .915.142 1.8.427 2.654.29.85.7 1.622 1.23 2.312H4.766c-.574-.635-1.012-1.376-1.313-2.223-.3-.847-.45-1.758-.45-2.732"/>
+        <path id="left-bracket" d="M3 12.045c0-.99.15-1.915.45-2.777.306-.862.743-1.618 1.314-2.268H6.23c-.552.72-.968 1.512-1.25 2.374-.28.862-.42 1.75-.42 2.66 0 .915.142 1.8.427 2.654.29.85.7 1.622 1.23 2.312h-1.45c-.575-.635-1.013-1.376-1.314-2.223-.3-.847-.45-1.758-.45-2.732"/>
         <path id="dot" d="M10 16c0 .552-.448 1-1 1s-1-.448-1-1 .448-1 1-1 1 .448 1 1z"/>
-        <path id="star" d="M14.25 7.013l-.24 2.156 2.187-.61.193 1.477-1.992.14 1.307 1.74-1.33.71-.914-1.834-.802 1.822-1.383-.697 1.295-1.74-1.98-.152.23-1.465 2.138.61-.24-2.156h1.535"/>
-        <path id="right-bracket" d="M21 12.045c0 .982-.152 1.896-.457 2.744-.3.846-.737 1.584-1.307 2.21h-1.453c.527-.686.936-1.455 1.225-2.306.29-.855.434-1.74.434-2.66 0-.91-.14-1.797-.422-2.66-.28-.862-.697-1.654-1.248-2.374h1.465c.574.653 1.012 1.413 1.313 2.28.3.86.45 1.783.45 2.765"/>
+        <path id="star" d="M14.25 7.013l-.24 2.156 2.187-.61.193 1.475-1.992.14 1.307 1.74-1.33.71-.914-1.834-.8 1.823-1.383-.697 1.295-1.74-1.98-.152.23-1.465 2.14.61-.24-2.157h1.534"/>
+        <path id="right-bracket" d="M21 12.045c0 .982-.152 1.896-.457 2.744-.3.844-.737 1.582-1.307 2.21h-1.453c.527-.688.936-1.457 1.225-2.308.29-.855.434-1.74.434-2.66 0-.91-.14-1.797-.422-2.66-.28-.862-.697-1.654-1.248-2.374h1.465c.574.652 1.012 1.412 1.313 2.28.3.86.45 1.782.45 2.764"/>
     </g>
 </svg>
index 092200a..ce6f7b2 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
     <g id="secure">
-        <path id="lock" d="M8 5h.02v-.997c0-.057.003-1.41-.833-2.255-.434-.438-.998-.66-1.68-.66s-1.244.222-1.677.66c-.837.846-.833 2.198-.832 2.25V5H3c-.553 0-1 .447-1 1v3c0 .553.447 1 1 1h5c.553 0 1-.447 1-1V6c0-.553-.447-1-1-1zM3.998 5V3.993c0-.01.005-1 .543-1.543.483-.485 1.45-.487 1.933-.002.544.546.546 1.536.546 1.55V5H3.997z"/>
+        <path id="lock" d="M8 5h.02v-.997c0-.057.003-1.41-.833-2.255-.434-.438-.998-.66-1.68-.66s-1.244.222-1.677.66c-.837.846-.833 2.198-.832 2.25V5H3c-.553 0-1 .447-1 1v3c0 .553.447 1 1 1h5c.553 0 1-.447 1-1V6c0-.553-.447-1-1-1zM3.998 5V3.993c0-.01.005-1 .543-1.543.485-.485 1.45-.487 1.935-.002.544.546.546 1.536.546 1.55V5H3.998z"/>
     </g>
 </svg>
index 9a75454..6eefe90 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="secure">
-        <path id="lock" d="M8 5h.02v-.997c0-.057.003-1.41-.833-2.255-.434-.438-.998-.66-1.68-.66s-1.244.222-1.677.66c-.837.846-.833 2.198-.832 2.25V5H3c-.553 0-1 .447-1 1v3c0 .553.447 1 1 1h5c.553 0 1-.447 1-1V6c0-.553-.447-1-1-1zM3.998 5V3.993c0-.01.005-1 .543-1.543.483-.485 1.45-.487 1.933-.002.544.546.546 1.536.546 1.55V5H3.997z"/>
+        <path id="lock" d="M8 5h.02v-.997c0-.057.003-1.41-.833-2.255-.434-.438-.998-.66-1.68-.66s-1.244.222-1.677.66c-.837.846-.833 2.198-.832 2.25V5H3c-.553 0-1 .447-1 1v3c0 .553.447 1 1 1h5c.553 0 1-.447 1-1V6c0-.553-.447-1-1-1zM3.998 5V3.993c0-.01.005-1 .543-1.543.485-.485 1.45-.487 1.935-.002.544.546.546 1.536.546 1.55V5H3.998z"/>
     </g>
 </svg>
index 17df47a..10e7967 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter-invert.png differ
index e88f51b..fbba082 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="special-character">
-        <path id="omega" d="M12 6.708c-.794 0-1.368.103-1.894.31-.525.207-.944.496-1.255.867-.31.366-.53.808-.66 1.327-.127.513-.19 1.08-.19 1.7 0 .512.057 1 .173 1.46.122.46.31.87.568 1.23.63.862 1.156 1.138 2.012 1.362L11 18H6v-3h.604l.53 1.353.395.053.604.044.75.035.457.01H10l-.09-.895c-.63-.094-.812-.268-1.337-.522-.525-.26-.98-.59-1.365-.99-.38-.402-.675-.868-.89-1.4-.213-.536-.32-1.13-.32-1.778 0-.82.13-1.537.394-2.15.27-.62.656-1.133 1.163-1.54.507-.407 1.133-.71 1.878-.912.745-.206 1.6-.31 2.565-.31.96 0 1.81.103 2.556.31.75.2 1.38.504 1.887.912.508.407.893.92 1.155 1.54.27.614.403 1.33.403 2.15 0 .65-.107 1.242-.32 1.78-.215.53-.514.996-.9 1.397-.378.4-.83.732-1.355.99-.525.255-.707.43-1.336.523l-.092.894h.66l.447-.01.75-.034.606-.044.403-.053.532-1.354h.605v3h-5l.247-3.036c1.066-.11 1.337-.696 2.002-1.363.263-.36.452-.77.568-1.23.122-.46.183-.946.183-1.46 0-.618-.064-1.185-.192-1.698-.128-.52-.348-.962-.66-1.327-.31-.372-.73-.66-1.255-.867-.525-.206-1.1-.31-1.894-.31"/>
+        <path id="omega" d="M12 6.708c-.794 0-1.368.103-1.894.31-.525.207-.944.496-1.255.867-.31.366-.53.808-.66 1.327-.125.513-.19 1.08-.19 1.7 0 .512.06 1 .175 1.46.122.46.31.87.568 1.23.63.862 1.156 1.138 2.012 1.362L11 18H6v-3h.604l.53 1.353.395.053.602.044.75.035.457.01H10l-.09-.895c-.63-.094-.812-.268-1.337-.522-.525-.26-.98-.59-1.365-.99-.38-.402-.675-.868-.89-1.4-.213-.536-.32-1.13-.32-1.778 0-.82.13-1.537.394-2.15.27-.62.656-1.133 1.163-1.54.507-.407 1.133-.71 1.878-.912.745-.206 1.6-.31 2.565-.31.96 0 1.81.103 2.556.31.75.2 1.38.504 1.887.912.51.407.895.92 1.157 1.54.27.614.403 1.33.403 2.15 0 .65-.108 1.242-.32 1.78-.216.53-.515.996-.9 1.397-.38.4-.83.732-1.356.99-.525.255-.707.43-1.336.523l-.092.894h.66l.447-.01.75-.034.606-.044.4-.053.533-1.354H18v3h-5l.246-3.038c1.066-.11 1.337-.696 2.002-1.363.263-.36.452-.77.568-1.23.122-.46.183-.947.183-1.46 0-.62-.066-1.186-.194-1.7-.128-.52-.348-.96-.66-1.326-.31-.372-.73-.66-1.255-.867-.524-.206-1.1-.31-1.893-.31"/>
     </g>
 </svg>
index 2f38ecc..e632f8a 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter.png differ
index c2ffd48..bb81880 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="special-character">
-        <path id="omega" d="M12 6.708c-.794 0-1.368.103-1.894.31-.525.207-.944.496-1.255.867-.31.366-.53.808-.66 1.327-.127.513-.19 1.08-.19 1.7 0 .512.057 1 .173 1.46.122.46.31.87.568 1.23.63.862 1.156 1.138 2.012 1.362L11 18H6v-3h.604l.53 1.353.395.053.604.044.75.035.457.01H10l-.09-.895c-.63-.094-.812-.268-1.337-.522-.525-.26-.98-.59-1.365-.99-.38-.402-.675-.868-.89-1.4-.213-.536-.32-1.13-.32-1.778 0-.82.13-1.537.394-2.15.27-.62.656-1.133 1.163-1.54.507-.407 1.133-.71 1.878-.912.745-.206 1.6-.31 2.565-.31.96 0 1.81.103 2.556.31.75.2 1.38.504 1.887.912.508.407.893.92 1.155 1.54.27.614.403 1.33.403 2.15 0 .65-.107 1.242-.32 1.78-.215.53-.514.996-.9 1.397-.378.4-.83.732-1.355.99-.525.255-.707.43-1.336.523l-.092.894h.66l.447-.01.75-.034.606-.044.403-.053.532-1.354h.605v3h-5l.247-3.036c1.066-.11 1.337-.696 2.002-1.363.263-.36.452-.77.568-1.23.122-.46.183-.946.183-1.46 0-.618-.064-1.185-.192-1.698-.128-.52-.348-.962-.66-1.327-.31-.372-.73-.66-1.255-.867-.525-.206-1.1-.31-1.894-.31"/>
+        <path id="omega" d="M12 6.708c-.794 0-1.368.103-1.894.31-.525.207-.944.496-1.255.867-.31.366-.53.808-.66 1.327-.125.513-.19 1.08-.19 1.7 0 .512.06 1 .175 1.46.122.46.31.87.568 1.23.63.862 1.156 1.138 2.012 1.362L11 18H6v-3h.604l.53 1.353.395.053.602.044.75.035.457.01H10l-.09-.895c-.63-.094-.812-.268-1.337-.522-.525-.26-.98-.59-1.365-.99-.38-.402-.675-.868-.89-1.4-.213-.536-.32-1.13-.32-1.778 0-.82.13-1.537.394-2.15.27-.62.656-1.133 1.163-1.54.507-.407 1.133-.71 1.878-.912.745-.206 1.6-.31 2.565-.31.96 0 1.81.103 2.556.31.75.2 1.38.504 1.887.912.51.407.895.92 1.157 1.54.27.614.403 1.33.403 2.15 0 .65-.108 1.242-.32 1.78-.216.53-.515.996-.9 1.397-.38.4-.83.732-1.356.99-.525.255-.707.43-1.336.523l-.092.894h.66l.447-.01.75-.034.606-.044.4-.053.533-1.354H18v3h-5l.246-3.038c1.066-.11 1.337-.696 2.002-1.363.263-.36.452-.77.568-1.23.122-.46.183-.947.183-1.46 0-.62-.066-1.186-.194-1.7-.128-.52-.348-.96-.66-1.326-.31-.372-.73-.66-1.255-.867-.524-.206-1.1-.31-1.893-.31"/>
     </g>
 </svg>
index d4cea6e..b707280 100644 (file)
@@ -2,6 +2,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="strikethrough-s">
         <path id="strikethrough" d="M6 12h12v1H6v-1z"/>
-        <path id="s" d="M12.094 6c-1.133 0-2.076.287-2.75.9-.67.613-1 1.49-1 2.52 0 .89.22 1.602.72 2.13.497.528 1.278.91 2.31 1.14l.813.182v-.03c.656.147 1.128.375 1.375.63.252.256.375.607.375 1.11 0 .573-.172.97-.53 1.26-.36.29-.895.45-1.626.45-.476 0-.968-.074-1.468-.24-.502-.166-1.03-.417-1.562-.75l-.375-.238v2.158l.156.062c.58.237 1.144.417 1.69.54.548.12 1.07.18 1.56.18 1.287 0 2.298-.293 3-.9.71-.605 1.063-1.486 1.063-2.608 0-.943-.256-1.726-.78-2.312-.522-.592-1.306-1-2.345-1.23l-.812-.18c-.716-.148-1.204-.352-1.406-.54-.205-.202-.312-.484-.312-.934 0-.533.162-.9.5-1.17.342-.27.836-.42 1.53-.42.396 0 .82.052 1.25.18.434.128.91.334 1.407.6l.375.18V6.63s-1.188-.383-1.688-.48c-.5-.097-.984-.15-1.468-.15z"/>
+        <path id="s" d="M12.094 6c-1.133 0-2.076.287-2.75.9-.67.613-1 1.49-1 2.52 0 .89.22 1.602.72 2.13.497.528 1.278.91 2.31 1.14l.813.182v-.03c.656.147 1.128.375 1.375.63.252.256.375.607.375 1.11 0 .573-.172.97-.53 1.26-.36.29-.895.45-1.626.45-.474 0-.966-.074-1.466-.24-.502-.166-1.03-.417-1.562-.75l-.374-.238v2.158l.156.062c.58.237 1.144.417 1.69.54.548.12 1.07.18 1.56.18 1.287 0 2.298-.293 3-.9.71-.605 1.063-1.486 1.063-2.608 0-.943-.256-1.726-.78-2.312-.522-.592-1.306-1-2.345-1.23l-.812-.18c-.716-.148-1.204-.352-1.406-.54-.205-.202-.312-.484-.312-.934 0-.533.162-.9.5-1.17.342-.27.836-.42 1.53-.42.396 0 .82.052 1.25.18.434.128.91.334 1.407.6l.374.18V6.63s-1.188-.383-1.688-.48c-.5-.097-.984-.15-1.468-.15z"/>
     </g>
 </svg>
index 6408d01..71fa960 100644 (file)
@@ -2,6 +2,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="strikethrough-s">
         <path id="strikethrough" d="M6 12h12v1H6v-1z"/>
-        <path id="s" d="M12.094 6c-1.133 0-2.076.287-2.75.9-.67.613-1 1.49-1 2.52 0 .89.22 1.602.72 2.13.497.528 1.278.91 2.31 1.14l.813.182v-.03c.656.147 1.128.375 1.375.63.252.256.375.607.375 1.11 0 .573-.172.97-.53 1.26-.36.29-.895.45-1.626.45-.476 0-.968-.074-1.468-.24-.502-.166-1.03-.417-1.562-.75l-.375-.238v2.158l.156.062c.58.237 1.144.417 1.69.54.548.12 1.07.18 1.56.18 1.287 0 2.298-.293 3-.9.71-.605 1.063-1.486 1.063-2.608 0-.943-.256-1.726-.78-2.312-.522-.592-1.306-1-2.345-1.23l-.812-.18c-.716-.148-1.204-.352-1.406-.54-.205-.202-.312-.484-.312-.934 0-.533.162-.9.5-1.17.342-.27.836-.42 1.53-.42.396 0 .82.052 1.25.18.434.128.91.334 1.407.6l.375.18V6.63s-1.188-.383-1.688-.48c-.5-.097-.984-.15-1.468-.15z"/>
+        <path id="s" d="M12.094 6c-1.133 0-2.076.287-2.75.9-.67.613-1 1.49-1 2.52 0 .89.22 1.602.72 2.13.497.528 1.278.91 2.31 1.14l.813.182v-.03c.656.147 1.128.375 1.375.63.252.256.375.607.375 1.11 0 .573-.172.97-.53 1.26-.36.29-.895.45-1.626.45-.474 0-.966-.074-1.466-.24-.502-.166-1.03-.417-1.562-.75l-.374-.238v2.158l.156.062c.58.237 1.144.417 1.69.54.548.12 1.07.18 1.56.18 1.287 0 2.298-.293 3-.9.71-.605 1.063-1.486 1.063-2.608 0-.943-.256-1.726-.78-2.312-.522-.592-1.306-1-2.345-1.23l-.812-.18c-.716-.148-1.204-.352-1.406-.54-.205-.202-.312-.484-.312-.934 0-.533.162-.9.5-1.17.342-.27.836-.42 1.53-.42.396 0 .82.052 1.25.18.434.128.91.334 1.407.6l.374.18V6.63s-1.188-.383-1.688-.48c-.5-.097-.984-.15-1.468-.15z"/>
     </g>
 </svg>
index 6067a84..24e7133 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-constructive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-constructive.png differ
index d53e332..b79e14c 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #00AF89 }</style>
     <g id="tag">
-        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.388-.707-1.156-.707-1.706V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.708.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.576 1.515.576 2.094 0 .576-.578.576-1.517 0-2.095-.58-.576-1.518-.577-2.094 0z"/>
+        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.386-.707-1.154-.707-1.704V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.574 1.515.574 2.094 0 .576-.58.576-1.52 0-2.097-.58-.576-1.518-.577-2.094 0z"/>
     </g>
 </svg>
index 6c6099e..d8571fe 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-destructive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-destructive.png differ
index 710a19a..61848c7 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #D11D13 }</style>
     <g id="tag">
-        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.388-.707-1.156-.707-1.706V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.708.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.576 1.515.576 2.094 0 .576-.578.576-1.517 0-2.095-.58-.576-1.518-.577-2.094 0z"/>
+        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.386-.707-1.154-.707-1.704V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.574 1.515.574 2.094 0 .576-.58.576-1.52 0-2.097-.58-.576-1.518-.577-2.094 0z"/>
     </g>
 </svg>
index 80c5e8c..1d59c50 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-invert.png differ
index d42ac07..71e05f1 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="tag">
-        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.388-.707-1.156-.707-1.706V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.708.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.576 1.515.576 2.094 0 .576-.578.576-1.517 0-2.095-.58-.576-1.518-.577-2.094 0z"/>
+        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.386-.707-1.154-.707-1.704V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.574 1.515.574 2.094 0 .576-.58.576-1.52 0-2.097-.58-.576-1.518-.577-2.094 0z"/>
     </g>
 </svg>
index 7b4e2f9..b2c39f7 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-progressive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-progressive.png differ
index 49dde93..d4b7032 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #347BFF }</style>
     <g id="tag">
-        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.388-.707-1.156-.707-1.706V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.708.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.576 1.515.576 2.094 0 .576-.578.576-1.517 0-2.095-.58-.576-1.518-.577-2.094 0z"/>
+        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.386-.707-1.154-.707-1.704V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.574 1.515.574 2.094 0 .576-.58.576-1.52 0-2.097-.58-.576-1.518-.577-2.094 0z"/>
     </g>
 </svg>
index 844cc18..1049e15 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-warning.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-warning.png differ
index 3fe96f5..36e56b2 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FF5D00 }</style>
     <g id="tag">
-        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.388-.707-1.156-.707-1.706V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.708.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.576 1.515.576 2.094 0 .576-.578.576-1.517 0-2.095-.58-.576-1.518-.577-2.094 0z"/>
+        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.386-.707-1.154-.707-1.704V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.574 1.515.574 2.094 0 .576-.58.576-1.52 0-2.097-.58-.576-1.518-.577-2.094 0z"/>
     </g>
 </svg>
index 15de70b..3bfbd0b 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag.png differ
index 8e517bf..71671c0 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="tag">
-        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.388-.707-1.156-.707-1.706V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.708.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.576 1.515.576 2.094 0 .576-.578.576-1.517 0-2.095-.58-.576-1.518-.577-2.094 0z"/>
+        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.386-.707-1.154-.707-1.704V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.574 1.515.574 2.094 0 .576-.58.576-1.52 0-2.097-.58-.576-1.518-.577-2.094 0z"/>
     </g>
 </svg>
index baf5c14..33089a0 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="text-style">
-        <path id="a" d="M15.296 18h2.79l-1.14-12h-2.79L6 18h2.79l2.038-3h4.183l.286 3zm-3.11-5L14.5 9.6l.323 3.4h-2.633z"/>
+        <path id="a" d="M15.296 18h2.79l-1.14-12h-2.79L6 18h2.79l2.038-3h4.183l.288 3zm-3.11-5L14.5 9.6l.323 3.4H12.19z"/>
         <path id="underline" d="M6 19h12v1H6v-1z"/>
     </g>
 </svg>
index d9ff340..77c66a0 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="text-style">
-        <path id="a" d="M15.296 18h2.79l-1.14-12h-2.79L6 18h2.79l2.038-3h4.183l.286 3zm-3.11-5L14.5 9.6l.323 3.4h-2.633z"/>
+        <path id="a" d="M15.296 18h2.79l-1.14-12h-2.79L6 18h2.79l2.038-3h4.183l.288 3zm-3.11-5L14.5 9.6l.323 3.4H12.19z"/>
         <path id="underline" d="M6 19h12v1H6v-1z"/>
     </g>
 </svg>
index 97fcdc4..9629e8f 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #D11D13 }</style>
-    <path d="M12 9v-2s0-5-4.5-5-4.5 5-4.5 5h2s0-3 2.5-3 2.5 3 2.5 3v2h-3v7c0 1.7 1.3 3 3 3h10v-10z" id="path726"/>
+    <path d="M12 9V7s0-5-4.5-5S3 7 3 7h2s0-3 2.5-3S10 7 10 7v2H7v7c0 1.7 1.3 3 3 3h10V9z" id="path726"/>
 </svg>
index b496a06..ef4247a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <path d="M12 9v-2s0-5-4.5-5-4.5 5-4.5 5h2s0-3 2.5-3 2.5 3 2.5 3v2h-3v7c0 1.7 1.3 3 3 3h10v-10z" id="path726"/>
+    <path d="M12 9V7s0-5-4.5-5S3 7 3 7h2s0-3 2.5-3S10 7 10 7v2H7v7c0 1.7 1.3 3 3 3h10V9z" id="path726"/>
 </svg>
index 66c024a..cf12ece 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M12 9v-2s0-5-4.5-5-4.5 5-4.5 5h2s0-3 2.5-3 2.5 3 2.5 3v2h-3v7c0 1.7 1.3 3 3 3h10v-10z" id="path726"/>
+    <path d="M12 9V7s0-5-4.5-5S3 7 3 7h2s0-3 2.5-3S10 7 10 7v2H7v7c0 1.7 1.3 3 3 3h10V9z" id="path726"/>
 </svg>
index a52f0fe..73e0db1 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #D11D13 }</style>
-    <path d="M11 9v-2s0-5 4.5-5 4.5 5 4.5 5h-2s0-3-2.5-3-2.5 3-2.5 3v2h3v7c0 1.7-1.3 3-3 3h-10v-10z" id="path726"/>
+    <path d="M11 9V7s0-5 4.5-5S20 7 20 7h-2s0-3-2.5-3S13 7 13 7v2h3v7c0 1.7-1.3 3-3 3H3V9z" id="path726"/>
 </svg>
index 814af1d..ce5f164 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <path d="M11 9v-2s0-5 4.5-5 4.5 5 4.5 5h-2s0-3-2.5-3-2.5 3-2.5 3v2h3v7c0 1.7-1.3 3-3 3h-10v-10z" id="path726"/>
+    <path d="M11 9V7s0-5 4.5-5S20 7 20 7h-2s0-3-2.5-3S13 7 13 7v2h3v7c0 1.7-1.3 3-3 3H3V9z" id="path726"/>
 </svg>
index 07cecbf..0004535 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M11 9v-2s0-5 4.5-5 4.5 5 4.5 5h-2s0-3-2.5-3-2.5 3-2.5 3v2h3v7c0 1.7-1.3 3-3 3h-10v-10z" id="path726"/>
+    <path d="M11 9V7s0-5 4.5-5S20 7 20 7h-2s0-3-2.5-3S13 7 13 7v2h3v7c0 1.7-1.3 3-3 3H3V9z" id="path726"/>
 </svg>
index 00913f7..b12856d 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-a-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-a-invert.png differ
index 4ee0553..3581c57 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="underline-a">
-        <path id="a" d="M14.424 16H16.5L13.037 6H10.96L7.5 16h2.077l.627-2h3.604l.616 2zm-3.92-3.623l1.495-4.38 1.51 4.38h-3z"/>
+        <path id="a" d="M14.424 16H16.5L13.037 6H10.96L7.5 16h2.077l.627-2h3.604l.616 2zm-3.92-3.623L12 7.997l1.51 4.38h-3z"/>
         <path id="underline" d="M7 17h10v1H7v-1z"/>
     </g>
 </svg>
index 81713bd..f4add0a 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-a.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-a.png differ
index ea7350b..1ddae10 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="underline-a">
-        <path id="a" d="M14.424 16H16.5L13.037 6H10.96L7.5 16h2.077l.627-2h3.604l.616 2zm-3.92-3.623l1.495-4.38 1.51 4.38h-3z"/>
+        <path id="a" d="M14.424 16H16.5L13.037 6H10.96L7.5 16h2.077l.627-2h3.604l.616 2zm-3.92-3.623L12 7.997l1.51 4.38h-3z"/>
         <path id="underline" d="M7 17h10v1H7v-1z"/>
     </g>
 </svg>
index 5f841f9..342493b 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="underline-u">
-        <path id="u" d="M8 6h2v5.96c-.104 1.706.695 2 2 2.04 1.777.062 2.002-.88 2-2.04V6h2v6.123c0 1.28-.338 2.245-1.016 2.898-.672.652-1.666.98-2.98.98-1.32 0-2.32-.326-2.996-.98C8.336 14.37 8 13.403 8 12.124V6"/>
+        <path id="u" d="M8 6h2v5.96c-.104 1.706.695 2 2 2.04 1.777.062 2.002-.88 2-2.04V6h2v6.123c0 1.28-.338 2.245-1.016 2.898-.672.654-1.666.98-2.98.98-1.32 0-2.32-.324-2.996-.98C8.336 14.37 8 13.405 8 12.126V6"/>
         <path id="underline" d="M7 17h10v1H7v-1z"/>
     </g>
 </svg>
index d07129f..7378298 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="underline-u">
-        <path id="u" d="M8 6h2v5.96c-.104 1.706.695 2 2 2.04 1.777.062 2.002-.88 2-2.04V6h2v6.123c0 1.28-.338 2.245-1.016 2.898-.672.652-1.666.98-2.98.98-1.32 0-2.32-.326-2.996-.98C8.336 14.37 8 13.403 8 12.124V6"/>
+        <path id="u" d="M8 6h2v5.96c-.104 1.706.695 2 2 2.04 1.777.062 2.002-.88 2-2.04V6h2v6.123c0 1.28-.338 2.245-1.016 2.898-.672.654-1.666.98-2.98.98-1.32 0-2.32-.324-2.996-.98C8.336 14.37 8 13.405 8 12.126V6"/>
         <path id="underline" d="M7 17h10v1H7v-1z"/>
     </g>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-invert.png
new file mode 100644 (file)
index 0000000..d68353b
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-invert.svg
new file mode 100644 (file)
index 0000000..ba5fd1d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
+    <g id="clear">
+        <path id="circle-with-cross" d="M6 0C2.7 0 0 2.7 0 6s2.7 6 6 6 6-2.7 6-6-2.7-6-6-6zM3.5 2.5L6 5l2.5-2.5 1 1L7 6l2.5 2.5-1 1L6 7 3.5 9.5l-1-1L5 6 2.5 3.5z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear.png
new file mode 100644 (file)
index 0000000..5db444c
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear.svg
new file mode 100644 (file)
index 0000000..b18405d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+    <g id="clear">
+        <path id="circle-with-cross" d="M6 0C2.7 0 0 2.7 0 6s2.7 6 6 6 6-2.7 6-6-2.7-6-6-6zM3.5 2.5L6 5l2.5-2.5 1 1L7 6l2.5 2.5-1 1L6 7 3.5 9.5l-1-1L5 6 2.5 3.5z"/>
+    </g>
+</svg>
index b04b92a..fbd6af1 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-invert.png differ
index 2348e8e..322b5b1 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
     <g id="search">
-        <path id="path3051" d="M10.37 9.474L7.994 7.1l-.17-.1c.404-.566.644-1.26.644-2.01-.002-1.92-1.56-3.476-3.478-3.476-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.644l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zM4.99 7.204c-1.22 0-2.213-.99-2.213-2.213 0-1.22.99-2.212 2.212-2.212 1.222 0 2.213.992 2.213 2.213 0 1.223-.992 2.214-2.213 2.214z"/>
+        <path id="path3051" d="M10.37 9.474L7.994 7.1l-.17-.1c.404-.566.644-1.26.644-2.01-.002-1.92-1.56-3.476-3.478-3.476-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.646l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zm-5.38-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.99-2.21 2.212-2.21 1.22 0 2.21.99 2.21 2.213S6.21 7.207 4.99 7.207z"/>
     </g>
 </svg>
index cc1f377..985e602 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr.png differ
index 9b49c4b..e5c4010 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="search">
-        <path id="path3051" d="M10.37 9.474L7.994 7.1l-.17-.1c.404-.566.644-1.26.644-2.01-.002-1.92-1.56-3.476-3.478-3.476-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.644l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zM4.99 7.204c-1.22 0-2.213-.99-2.213-2.213 0-1.22.99-2.212 2.212-2.212 1.222 0 2.213.992 2.213 2.213 0 1.223-.992 2.214-2.213 2.214z"/>
+        <path id="path3051" d="M10.37 9.474L7.994 7.1l-.17-.1c.404-.566.644-1.26.644-2.01-.002-1.92-1.56-3.476-3.478-3.476-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.646l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zm-5.38-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.99-2.21 2.212-2.21 1.22 0 2.21.99 2.21 2.213S6.21 7.207 4.99 7.207z"/>
     </g>
 </svg>
index acabbbd..bcafcd6 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-invert.png differ
index d57b976..a90817d 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
     <g id="search">
-        <path id="path3051" d="M1.63 9.474L4.006 7.1l.17-.1c-.404-.566-.644-1.26-.644-2.01.002-1.92 1.56-3.476 3.478-3.476 1.92 0 3.478 1.557 3.478 3.478 0 1.92-1.557 3.477-3.478 3.477-.75 0-1.442-.24-2.01-.644l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27c1.22 0 2.213-.99 2.213-2.213 0-1.22-.99-2.212-2.212-2.212-1.222 0-2.213.992-2.213 2.213 0 1.223.992 2.214 2.213 2.214z"/>
+        <path id="path3051" d="M1.63 9.474L4.006 7.1l.17-.1c-.404-.566-.644-1.26-.644-2.01.002-1.92 1.56-3.476 3.478-3.476 1.92 0 3.478 1.557 3.478 3.478 0 1.92-1.557 3.477-3.478 3.477-.75 0-1.442-.24-2.01-.646l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27c1.22 0 2.213-.99 2.213-2.213 0-1.22-.99-2.21-2.21-2.21-1.222 0-2.213.99-2.213 2.213S5.79 7.207 7.01 7.207z"/>
     </g>
 </svg>
index 5564b42..4213d67 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl.png differ
index 3847af2..759f57e 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="search">
-        <path id="path3051" d="M1.63 9.474L4.006 7.1l.17-.1c-.404-.566-.644-1.26-.644-2.01.002-1.92 1.56-3.476 3.478-3.476 1.92 0 3.478 1.557 3.478 3.478 0 1.92-1.557 3.477-3.478 3.477-.75 0-1.442-.24-2.01-.644l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27c1.22 0 2.213-.99 2.213-2.213 0-1.22-.99-2.212-2.212-2.212-1.222 0-2.213.992-2.213 2.213 0 1.223.992 2.214 2.213 2.214z"/>
+        <path id="path3051" d="M1.63 9.474L4.006 7.1l.17-.1c-.404-.566-.644-1.26-.644-2.01.002-1.92 1.56-3.476 3.478-3.476 1.92 0 3.478 1.557 3.478 3.478 0 1.92-1.557 3.477-3.478 3.477-.75 0-1.442-.24-2.01-.646l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27c1.22 0 2.213-.99 2.213-2.213 0-1.22-.99-2.21-2.21-2.21-1.222 0-2.213.99-2.213 2.213S5.79 7.207 7.01 7.207z"/>
     </g>
 </svg>
index d83e57e..3d66337 100644 (file)
@@ -10,6 +10,7 @@
        },
        "images": {
                "alert": { "file": "images/indicators/alert.svg" },
+               "clear": { "file": "images/indicators/clear.svg" },
                "up": { "file": "images/indicators/arrow-up.svg" },
                "down": { "file": "images/indicators/arrow-down.svg" },
                "next": { "file": {
index d87183e..6e7851a 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs v1.1.7 optimised for jQuery
+ * OOjs v1.1.8 optimised for jQuery
  * https://www.mediawiki.org/wiki/OOjs
  *
  * Copyright 2011-2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-04-29T01:13:49Z
+ * Date: 2015-07-23T19:16:00Z
  */
 ( function ( global ) {
 
@@ -698,12 +698,9 @@ oo.isPlainObject = $.isPlainObject;
        /**
         * Emit an event.
         *
-        * TODO: Should this be chainable? What is the usefulness of the boolean
-        * return value here?
-        *
         * @param {string} event Type of event
         * @param {Mixed} args First in a list of variadic arguments passed to event handler (optional)
-        * @return {boolean} If event was handled by at least one listener
+        * @return {boolean} Whether the event was handled by at least one listener
         */
        oo.EventEmitter.prototype.emit = function ( event ) {
                var args = [],
index 0eb0b01..f1dcd4e 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * QUnit 1.17.1
+ * QUnit 1.18.0
  * http://qunitjs.com/
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license
  * http://jquery.org/license
  *
- * Date: 2015-01-20T19:39Z
+ * Date: 2015-04-03T10:23Z
  */
 
 /** Font Family and Sizes */
 
 #qunit-tests.hidepass li.running,
 #qunit-tests.hidepass li.pass {
-       display: none;
+       visibility: hidden;
+       position: absolute;
+       width:   0px;
+       height:  0px;
+       padding: 0;
+       border:  0;
+       margin:  0;
 }
 
 #qunit-tests li strong {
        color: #C2CCD1;
        text-decoration: none;
 }
+
+#qunit-tests li p a {
+       padding: 0.25em;
+       color: #6B6464;
+}
 #qunit-tests li a:hover,
 #qunit-tests li a:focus {
        color: #000;
index 006ca47..f3542ca 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * QUnit 1.17.1
+ * QUnit 1.18.0
  * http://qunitjs.com/
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license
  * http://jquery.org/license
  *
- * Date: 2015-01-20T19:39Z
+ * Date: 2015-04-03T10:23Z
  */
 
 (function( window ) {
@@ -116,6 +116,9 @@ config = {
        // when enabled, all tests must call expect()
        requireExpects: false,
 
+       // depth up-to which object will be dumped
+       maxDepth: 5,
+
        // add checkboxes that are persisted in the query-string
        // when enabled, the id is set to `true` as a `QUnit.config` property
        urlConfig: [
@@ -185,11 +188,17 @@ config.modules.push( config.currentModule );
        // String search anywhere in moduleName+testName
        config.filter = urlParams.filter;
 
+       if ( urlParams.maxDepth ) {
+               config.maxDepth = parseInt( urlParams.maxDepth, 10 ) === -1 ?
+                       Number.POSITIVE_INFINITY :
+                       urlParams.maxDepth;
+       }
+
        config.testId = [];
        if ( urlParams.testId ) {
 
                // Ensure that urlParams.testId is an array
-               urlParams.testId = [].concat( urlParams.testId );
+               urlParams.testId = decodeURIComponent( urlParams.testId ).split( "," );
                for ( i = 0; i < urlParams.testId.length; i++ ) {
                        config.testId.push( urlParams.testId[ i ] );
                }
@@ -197,6 +206,9 @@ config.modules.push( config.currentModule );
 
        // Figure out if we're running the tests from a server or not
        QUnit.isLocal = location.protocol === "file:";
+
+       // Expose the current QUnit version
+       QUnit.version = "1.18.0";
 }());
 
 // Root QUnit object.
@@ -484,20 +496,14 @@ function done() {
        });
 }
 
-// Doesn't support IE6 to IE9
+// Doesn't support IE6 to IE9, it will return undefined on these browsers
 // See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
 function extractStacktrace( e, offset ) {
        offset = offset === undefined ? 4 : offset;
 
        var stack, include, i;
 
-       if ( e.stacktrace ) {
-
-               // Opera 12.x
-               return e.stacktrace.split( "\n" )[ offset + 3 ];
-       } else if ( e.stack ) {
-
-               // Firefox, Chrome, Safari 6+, IE10+, PhantomJS and Node
+       if ( e.stack ) {
                stack = e.stack.split( "\n" );
                if ( /^error$/i.test( stack[ 0 ] ) ) {
                        stack.shift();
@@ -515,9 +521,10 @@ function extractStacktrace( e, offset ) {
                        }
                }
                return stack[ offset ];
+
+       // Support: Safari <=6 only
        } else if ( e.sourceURL ) {
 
-               // Safari < 6
                // exclude useless self-reference for generated Error objects
                if ( /qunit.js$/.test( e.sourceURL ) ) {
                        return;
@@ -529,16 +536,19 @@ function extractStacktrace( e, offset ) {
 }
 
 function sourceFromStacktrace( offset ) {
-       var e = new Error();
-       if ( !e.stack ) {
+       var error = new Error();
+
+       // Support: Safari <=7 only, IE <=10 - 11 only
+       // Not all browsers generate the `stack` property for `new Error()`, see also #636
+       if ( !error.stack ) {
                try {
-                       throw e;
+                       throw error;
                } catch ( err ) {
-                       // This should already be true in most browsers
-                       e = err;
+                       error = err;
                }
        }
-       return extractStacktrace( e, offset );
+
+       return extractStacktrace( error, offset );
 }
 
 function synchronize( callback, last ) {
@@ -1123,7 +1133,7 @@ Test.prototype = {
 
        valid: function() {
                var include,
-                       filter = config.filter,
+                       filter = config.filter && config.filter.toLowerCase(),
                        module = QUnit.urlParams.module && QUnit.urlParams.module.toLowerCase(),
                        fullName = ( this.module.name + ": " + this.testName ).toLowerCase();
 
@@ -1146,7 +1156,7 @@ Test.prototype = {
 
                include = filter.charAt( 0 ) !== "!";
                if ( !include ) {
-                       filter = filter.toLowerCase().slice( 1 );
+                       filter = filter.slice( 1 );
                }
 
                // If the filter matches, we need to honour include
@@ -1284,87 +1294,52 @@ QUnit.assert = Assert.prototype = {
                return assert.test.push.apply( assert.test, arguments );
        },
 
-       /**
-        * Asserts rough true-ish result.
-        * @name ok
-        * @function
-        * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
-        */
        ok: function( result, message ) {
                message = message || ( result ? "okay" : "failed, expected argument to be truthy, was: " +
                        QUnit.dump.parse( result ) );
                this.push( !!result, result, true, message );
        },
 
-       /**
-        * Assert that the first two arguments are equal, with an optional message.
-        * Prints out both actual and expected values.
-        * @name equal
-        * @function
-        * @example equal( format( "{0} bytes.", 2), "2 bytes.", "replaces {0} with next argument" );
-        */
+       notOk: function( result, message ) {
+               message = message || ( !result ? "okay" : "failed, expected argument to be falsy, was: " +
+                       QUnit.dump.parse( result ) );
+               this.push( !result, result, false, message );
+       },
+
        equal: function( actual, expected, message ) {
                /*jshint eqeqeq:false */
                this.push( expected == actual, actual, expected, message );
        },
 
-       /**
-        * @name notEqual
-        * @function
-        */
        notEqual: function( actual, expected, message ) {
                /*jshint eqeqeq:false */
                this.push( expected != actual, actual, expected, message );
        },
 
-       /**
-        * @name propEqual
-        * @function
-        */
        propEqual: function( actual, expected, message ) {
                actual = objectValues( actual );
                expected = objectValues( expected );
                this.push( QUnit.equiv( actual, expected ), actual, expected, message );
        },
 
-       /**
-        * @name notPropEqual
-        * @function
-        */
        notPropEqual: function( actual, expected, message ) {
                actual = objectValues( actual );
                expected = objectValues( expected );
                this.push( !QUnit.equiv( actual, expected ), actual, expected, message );
        },
 
-       /**
-        * @name deepEqual
-        * @function
-        */
        deepEqual: function( actual, expected, message ) {
                this.push( QUnit.equiv( actual, expected ), actual, expected, message );
        },
 
-       /**
-        * @name notDeepEqual
-        * @function
-        */
        notDeepEqual: function( actual, expected, message ) {
                this.push( !QUnit.equiv( actual, expected ), actual, expected, message );
        },
 
-       /**
-        * @name strictEqual
-        * @function
-        */
        strictEqual: function( actual, expected, message ) {
                this.push( expected === actual, actual, expected, message );
        },
 
-       /**
-        * @name notStrictEqual
-        * @function
-        */
        notStrictEqual: function( actual, expected, message ) {
                this.push( expected !== actual, actual, expected, message );
        },
@@ -1372,7 +1347,8 @@ QUnit.assert = Assert.prototype = {
        "throws": function( block, expected, message ) {
                var actual, expectedType,
                        expectedOutput = expected,
-                       ok = false;
+                       ok = false,
+                       currentTest = ( this instanceof Assert && this.test ) || QUnit.config.current;
 
                // 'expected' is optional unless doing string comparison
                if ( message == null && typeof expected === "string" ) {
@@ -1380,13 +1356,13 @@ QUnit.assert = Assert.prototype = {
                        expected = null;
                }
 
-               this.test.ignoreGlobalErrors = true;
+               currentTest.ignoreGlobalErrors = true;
                try {
-                       block.call( this.test.testEnvironment );
+                       block.call( currentTest.testEnvironment );
                } catch (e) {
                        actual = e;
                }
-               this.test.ignoreGlobalErrors = false;
+               currentTest.ignoreGlobalErrors = false;
 
                if ( actual ) {
                        expectedType = QUnit.objectType( expected );
@@ -1419,11 +1395,9 @@ QUnit.assert = Assert.prototype = {
                                expectedOutput = null;
                                ok = true;
                        }
-
-                       this.push( ok, actual, expectedOutput, message );
-               } else {
-                       this.test.pushFailure( message, null, "No exception was thrown." );
                }
+
+               currentTest.assert.push( ok, actual, expectedOutput, message );
        }
 };
 
@@ -1783,7 +1757,7 @@ QUnit.dump = (function() {
                        join: join,
                        //
                        depth: 1,
-                       maxDepth: 5,
+                       maxDepth: QUnit.config.maxDepth,
 
                        // This is the list of parsers, to modify them, use dump.setParser
                        parsers: {
@@ -1830,7 +1804,7 @@ QUnit.dump = (function() {
                                        nonEnumerableProperties = [ "message", "name" ];
                                        for ( i in nonEnumerableProperties ) {
                                                key = nonEnumerableProperties[ i ];
-                                               if ( key in map && !( key in keys ) ) {
+                                               if ( key in map && inArray( key, keys ) < 0 ) {
                                                        keys.push( key );
                                                }
                                        }
@@ -1949,6 +1923,7 @@ if ( typeof window !== "undefined" ) {
                                "start",
                                "stop",
                                "ok",
+                               "notOk",
                                "equal",
                                "notEqual",
                                "propEqual",
@@ -1981,6 +1956,13 @@ if ( typeof exports !== "undefined" && exports ) {
        exports.QUnit = QUnit;
 }
 
+if ( typeof define === "function" && define.amd ) {
+       define( function() {
+               return QUnit;
+       } );
+       QUnit.config.autostart = false;
+}
+
 // Get a reference to the global object, like window in browsers
 }( (function() {
        return this;
@@ -1989,150 +1971,1088 @@ if ( typeof exports !== "undefined" && exports ) {
 /*istanbul ignore next */
 // jscs:disable maximumLineLength
 /*
- * Javascript Diff Algorithm
- *  By John Resig (http://ejohn.org/)
- *  Modified by Chu Alan "sprite"
+ * This file is a modified version of google-diff-match-patch's JavaScript implementation
+ * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),
+ * modifications are licensed as more fully set forth in LICENSE.txt.
+ *
+ * The original source of google-diff-match-patch is attributable and licensed as follows:
  *
- * Released under the MIT license.
+ * Copyright 2006 Google Inc.
+ * http://code.google.com/p/google-diff-match-patch/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  *
  * More Info:
- *  http://ejohn.org/projects/javascript-diff-algorithm/
+ *  https://code.google.com/p/google-diff-match-patch/
  *
  * Usage: QUnit.diff(expected, actual)
  *
- * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
+ * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) === "the  quick <del>brown </del> fox jump<ins>s</ins><del>ed</del over"
  */
 QUnit.diff = (function() {
-       var hasOwn = Object.prototype.hasOwnProperty;
-
-       /*jshint eqeqeq:false, eqnull:true */
-       function diff( o, n ) {
-               var i,
-                       ns = {},
-                       os = {};
-
-               for ( i = 0; i < n.length; i++ ) {
-                       if ( !hasOwn.call( ns, n[ i ] ) ) {
-                               ns[ n[ i ] ] = {
-                                       rows: [],
-                                       o: null
-                               };
-                       }
-                       ns[ n[ i ] ].rows.push( i );
-               }
-
-               for ( i = 0; i < o.length; i++ ) {
-                       if ( !hasOwn.call( os, o[ i ] ) ) {
-                               os[ o[ i ] ] = {
-                                       rows: [],
-                                       n: null
-                               };
-                       }
-                       os[ o[ i ] ].rows.push( i );
-               }
-
-               for ( i in ns ) {
-                       if ( hasOwn.call( ns, i ) ) {
-                               if ( ns[ i ].rows.length === 1 && hasOwn.call( os, i ) && os[ i ].rows.length === 1 ) {
-                                       n[ ns[ i ].rows[ 0 ] ] = {
-                                               text: n[ ns[ i ].rows[ 0 ] ],
-                                               row: os[ i ].rows[ 0 ]
-                                       };
-                                       o[ os[ i ].rows[ 0 ] ] = {
-                                               text: o[ os[ i ].rows[ 0 ] ],
-                                               row: ns[ i ].rows[ 0 ]
-                                       };
-                               }
-                       }
-               }
 
-               for ( i = 0; i < n.length - 1; i++ ) {
-                       if ( n[ i ].text != null && n[ i + 1 ].text == null && n[ i ].row + 1 < o.length && o[ n[ i ].row + 1 ].text == null &&
-                               n[ i + 1 ] == o[ n[ i ].row + 1 ] ) {
-
-                               n[ i + 1 ] = {
-                                       text: n[ i + 1 ],
-                                       row: n[ i ].row + 1
-                               };
-                               o[ n[ i ].row + 1 ] = {
-                                       text: o[ n[ i ].row + 1 ],
-                                       row: i + 1
-                               };
-                       }
-               }
-
-               for ( i = n.length - 1; i > 0; i-- ) {
-                       if ( n[ i ].text != null && n[ i - 1 ].text == null && n[ i ].row > 0 && o[ n[ i ].row - 1 ].text == null &&
-                               n[ i - 1 ] == o[ n[ i ].row - 1 ] ) {
-
-                               n[ i - 1 ] = {
-                                       text: n[ i - 1 ],
-                                       row: n[ i ].row - 1
-                               };
-                               o[ n[ i ].row - 1 ] = {
-                                       text: o[ n[ i ].row - 1 ],
-                                       row: i - 1
-                               };
-                       }
-               }
-
-               return {
-                       o: o,
-                       n: n
-               };
-       }
-
-       return function( o, n ) {
-               o = o.replace( /\s+$/, "" );
-               n = n.replace( /\s+$/, "" );
-
-               var i, pre,
-                       str = "",
-                       out = diff( o === "" ? [] : o.split( /\s+/ ), n === "" ? [] : n.split( /\s+/ ) ),
-                       oSpace = o.match( /\s+/g ),
-                       nSpace = n.match( /\s+/g );
-
-               if ( oSpace == null ) {
-                       oSpace = [ " " ];
-               } else {
-                       oSpace.push( " " );
-               }
-
-               if ( nSpace == null ) {
-                       nSpace = [ " " ];
-               } else {
-                       nSpace.push( " " );
-               }
-
-               if ( out.n.length === 0 ) {
-                       for ( i = 0; i < out.o.length; i++ ) {
-                               str += "<del>" + out.o[ i ] + oSpace[ i ] + "</del>";
-                       }
-               } else {
-                       if ( out.n[ 0 ].text == null ) {
-                               for ( n = 0; n < out.o.length && out.o[ n ].text == null; n++ ) {
-                                       str += "<del>" + out.o[ n ] + oSpace[ n ] + "</del>";
-                               }
-                       }
-
-                       for ( i = 0; i < out.n.length; i++ ) {
-                               if ( out.n[ i ].text == null ) {
-                                       str += "<ins>" + out.n[ i ] + nSpace[ i ] + "</ins>";
-                               } else {
-
-                                       // `pre` initialized at top of scope
-                                       pre = "";
-
-                                       for ( n = out.n[ i ].row + 1; n < out.o.length && out.o[ n ].text == null; n++ ) {
-                                               pre += "<del>" + out.o[ n ] + oSpace[ n ] + "</del>";
-                                       }
-                                       str += " " + out.n[ i ].text + nSpace[ i ] + pre;
-                               }
-                       }
-               }
-
-               return str;
-       };
+    function DiffMatchPatch() {
+
+        // Defaults.
+        // Redefine these in your program to override the defaults.
+
+        // Number of seconds to map a diff before giving up (0 for infinity).
+        this.DiffTimeout = 1.0;
+        // Cost of an empty edit operation in terms of edit characters.
+        this.DiffEditCost = 4;
+    }
+
+    //  DIFF FUNCTIONS
+
+    /**
+     * The data structure representing a diff is an array of tuples:
+     * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]
+     * which means: delete 'Hello', add 'Goodbye' and keep ' world.'
+     */
+    var DIFF_DELETE = -1,
+               DIFF_INSERT = 1,
+               DIFF_EQUAL = 0;
+
+    /**
+     * Find the differences between two texts.  Simplifies the problem by stripping
+     * any common prefix or suffix off the texts before diffing.
+     * @param {string} text1 Old string to be diffed.
+     * @param {string} text2 New string to be diffed.
+     * @param {boolean=} optChecklines Optional speedup flag. If present and false,
+     *     then don't run a line-level diff first to identify the changed areas.
+     *     Defaults to true, which does a faster, slightly less optimal diff.
+     * @param {number} optDeadline Optional time when the diff should be complete
+     *     by.  Used internally for recursive calls.  Users should set DiffTimeout
+     *     instead.
+     * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+     */
+    DiffMatchPatch.prototype.DiffMain = function( text1, text2, optChecklines, optDeadline ) {
+        var deadline, checklines, commonlength,
+                       commonprefix, commonsuffix, diffs;
+        // Set a deadline by which time the diff must be complete.
+        if ( typeof optDeadline === "undefined" ) {
+            if ( this.DiffTimeout <= 0 ) {
+                optDeadline = Number.MAX_VALUE;
+            } else {
+                optDeadline = ( new Date() ).getTime() + this.DiffTimeout * 1000;
+            }
+        }
+        deadline = optDeadline;
+
+        // Check for null inputs.
+        if ( text1 === null || text2 === null ) {
+            throw new Error( "Null input. (DiffMain)" );
+        }
+
+        // Check for equality (speedup).
+        if ( text1 === text2 ) {
+            if ( text1 ) {
+                return [
+                    [ DIFF_EQUAL, text1 ]
+                ];
+            }
+            return [];
+        }
+
+        if ( typeof optChecklines === "undefined" ) {
+            optChecklines = true;
+        }
+
+        checklines = optChecklines;
+
+        // Trim off common prefix (speedup).
+        commonlength = this.diffCommonPrefix( text1, text2 );
+        commonprefix = text1.substring( 0, commonlength );
+        text1 = text1.substring( commonlength );
+        text2 = text2.substring( commonlength );
+
+        // Trim off common suffix (speedup).
+        /////////
+        commonlength = this.diffCommonSuffix( text1, text2 );
+        commonsuffix = text1.substring( text1.length - commonlength );
+        text1 = text1.substring( 0, text1.length - commonlength );
+        text2 = text2.substring( 0, text2.length - commonlength );
+
+        // Compute the diff on the middle block.
+        diffs = this.diffCompute( text1, text2, checklines, deadline );
+
+        // Restore the prefix and suffix.
+        if ( commonprefix ) {
+            diffs.unshift( [ DIFF_EQUAL, commonprefix ] );
+        }
+        if ( commonsuffix ) {
+            diffs.push( [ DIFF_EQUAL, commonsuffix ] );
+        }
+        this.diffCleanupMerge( diffs );
+        return diffs;
+    };
+
+    /**
+     * Reduce the number of edits by eliminating operationally trivial equalities.
+     * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+     */
+    DiffMatchPatch.prototype.diffCleanupEfficiency = function( diffs ) {
+        var changes, equalities, equalitiesLength, lastequality,
+                       pointer, preIns, preDel, postIns, postDel;
+        changes = false;
+        equalities = []; // Stack of indices where equalities are found.
+        equalitiesLength = 0; // Keeping our own length var is faster in JS.
+        /** @type {?string} */
+        lastequality = null;
+        // Always equal to diffs[equalities[equalitiesLength - 1]][1]
+        pointer = 0; // Index of current position.
+        // Is there an insertion operation before the last equality.
+        preIns = false;
+        // Is there a deletion operation before the last equality.
+        preDel = false;
+        // Is there an insertion operation after the last equality.
+        postIns = false;
+        // Is there a deletion operation after the last equality.
+        postDel = false;
+        while ( pointer < diffs.length ) {
+            if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) { // Equality found.
+                if ( diffs[ pointer ][ 1 ].length < this.DiffEditCost && ( postIns || postDel ) ) {
+                    // Candidate found.
+                    equalities[ equalitiesLength++ ] = pointer;
+                    preIns = postIns;
+                    preDel = postDel;
+                    lastequality = diffs[ pointer ][ 1 ];
+                } else {
+                    // Not a candidate, and can never become one.
+                    equalitiesLength = 0;
+                    lastequality = null;
+                }
+                postIns = postDel = false;
+            } else { // An insertion or deletion.
+                if ( diffs[ pointer ][ 0 ] === DIFF_DELETE ) {
+                    postDel = true;
+                } else {
+                    postIns = true;
+                }
+                /*
+                 * Five types to be split:
+                 * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>
+                 * <ins>A</ins>X<ins>C</ins><del>D</del>
+                 * <ins>A</ins><del>B</del>X<ins>C</ins>
+                 * <ins>A</del>X<ins>C</ins><del>D</del>
+                 * <ins>A</ins><del>B</del>X<del>C</del>
+                 */
+                if ( lastequality && ( ( preIns && preDel && postIns && postDel ) ||
+                        ( ( lastequality.length < this.DiffEditCost / 2 ) &&
+                            ( preIns + preDel + postIns + postDel ) === 3 ) ) ) {
+                    // Duplicate record.
+                    diffs.splice( equalities[equalitiesLength - 1], 0, [ DIFF_DELETE, lastequality ] );
+                    // Change second copy to insert.
+                    diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;
+                    equalitiesLength--; // Throw away the equality we just deleted;
+                    lastequality = null;
+                    if (preIns && preDel) {
+                        // No changes made which could affect previous entry, keep going.
+                        postIns = postDel = true;
+                        equalitiesLength = 0;
+                    } else {
+                        equalitiesLength--; // Throw away the previous equality.
+                        pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;
+                        postIns = postDel = false;
+                    }
+                    changes = true;
+                }
+            }
+            pointer++;
+        }
+
+        if ( changes ) {
+            this.diffCleanupMerge( diffs );
+        }
+    };
+
+    /**
+     * Convert a diff array into a pretty HTML report.
+     * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+     * @param {integer} string to be beautified.
+     * @return {string} HTML representation.
+     */
+    DiffMatchPatch.prototype.diffPrettyHtml = function( diffs ) {
+        var op, data, x, html = [];
+        for ( x = 0; x < diffs.length; x++ ) {
+            op = diffs[x][0]; // Operation (insert, delete, equal)
+            data = diffs[x][1]; // Text of change.
+            switch ( op ) {
+                case DIFF_INSERT:
+                    html[x] = "<ins>" + data + "</ins>";
+                    break;
+                case DIFF_DELETE:
+                    html[x] = "<del>" + data + "</del>";
+                    break;
+                case DIFF_EQUAL:
+                    html[x] = "<span>" + data + "</span>";
+                    break;
+            }
+        }
+        return html.join("");
+    };
+
+    /**
+     * Determine the common prefix of two strings.
+     * @param {string} text1 First string.
+     * @param {string} text2 Second string.
+     * @return {number} The number of characters common to the start of each
+     *     string.
+     */
+    DiffMatchPatch.prototype.diffCommonPrefix = function( text1, text2 ) {
+        var pointermid, pointermax, pointermin, pointerstart;
+        // Quick check for common null cases.
+        if ( !text1 || !text2 || text1.charAt(0) !== text2.charAt(0) ) {
+            return 0;
+        }
+        // Binary search.
+        // Performance analysis: http://neil.fraser.name/news/2007/10/09/
+        pointermin = 0;
+        pointermax = Math.min( text1.length, text2.length );
+        pointermid = pointermax;
+        pointerstart = 0;
+        while ( pointermin < pointermid ) {
+            if ( text1.substring( pointerstart, pointermid ) === text2.substring( pointerstart, pointermid ) ) {
+                pointermin = pointermid;
+                pointerstart = pointermin;
+            } else {
+                pointermax = pointermid;
+            }
+            pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
+        }
+        return pointermid;
+    };
+
+    /**
+     * Determine the common suffix of two strings.
+     * @param {string} text1 First string.
+     * @param {string} text2 Second string.
+     * @return {number} The number of characters common to the end of each string.
+     */
+    DiffMatchPatch.prototype.diffCommonSuffix = function( text1, text2 ) {
+        var pointermid, pointermax, pointermin, pointerend;
+        // Quick check for common null cases.
+        if (!text1 || !text2 || text1.charAt(text1.length - 1) !== text2.charAt(text2.length - 1)) {
+            return 0;
+        }
+        // Binary search.
+        // Performance analysis: http://neil.fraser.name/news/2007/10/09/
+        pointermin = 0;
+        pointermax = Math.min(text1.length, text2.length);
+        pointermid = pointermax;
+        pointerend = 0;
+        while ( pointermin < pointermid ) {
+            if (text1.substring( text1.length - pointermid, text1.length - pointerend ) ===
+                text2.substring( text2.length - pointermid, text2.length - pointerend ) ) {
+                pointermin = pointermid;
+                pointerend = pointermin;
+            } else {
+                pointermax = pointermid;
+            }
+            pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
+        }
+        return pointermid;
+    };
+
+    /**
+     * Find the differences between two texts.  Assumes that the texts do not
+     * have any common prefix or suffix.
+     * @param {string} text1 Old string to be diffed.
+     * @param {string} text2 New string to be diffed.
+     * @param {boolean} checklines Speedup flag.  If false, then don't run a
+     *     line-level diff first to identify the changed areas.
+     *     If true, then run a faster, slightly less optimal diff.
+     * @param {number} deadline Time when the diff should be complete by.
+     * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+     * @private
+     */
+    DiffMatchPatch.prototype.diffCompute = function( text1, text2, checklines, deadline ) {
+        var diffs, longtext, shorttext, i, hm,
+                       text1A, text2A, text1B, text2B,
+                       midCommon, diffsA, diffsB;
+
+        if ( !text1 ) {
+            // Just add some text (speedup).
+            return [
+                [ DIFF_INSERT, text2 ]
+            ];
+        }
+
+        if (!text2) {
+            // Just delete some text (speedup).
+            return [
+                [ DIFF_DELETE, text1 ]
+            ];
+        }
+
+        longtext = text1.length > text2.length ? text1 : text2;
+        shorttext = text1.length > text2.length ? text2 : text1;
+        i = longtext.indexOf( shorttext );
+        if ( i !== -1 ) {
+            // Shorter text is inside the longer text (speedup).
+            diffs = [
+                [ DIFF_INSERT, longtext.substring( 0, i ) ],
+                [ DIFF_EQUAL, shorttext ],
+                [ DIFF_INSERT, longtext.substring( i + shorttext.length ) ]
+            ];
+            // Swap insertions for deletions if diff is reversed.
+            if ( text1.length > text2.length ) {
+                diffs[0][0] = diffs[2][0] = DIFF_DELETE;
+            }
+            return diffs;
+        }
+
+        if ( shorttext.length === 1 ) {
+            // Single character string.
+            // After the previous speedup, the character can't be an equality.
+            return [
+                [ DIFF_DELETE, text1 ],
+                [ DIFF_INSERT, text2 ]
+            ];
+        }
+
+        // Check to see if the problem can be split in two.
+        hm = this.diffHalfMatch(text1, text2);
+        if (hm) {
+            // A half-match was found, sort out the return data.
+            text1A = hm[0];
+            text1B = hm[1];
+            text2A = hm[2];
+            text2B = hm[3];
+            midCommon = hm[4];
+            // Send both pairs off for separate processing.
+            diffsA = this.DiffMain(text1A, text2A, checklines, deadline);
+            diffsB = this.DiffMain(text1B, text2B, checklines, deadline);
+            // Merge the results.
+            return diffsA.concat([
+                [ DIFF_EQUAL, midCommon ]
+            ], diffsB);
+        }
+
+        if (checklines && text1.length > 100 && text2.length > 100) {
+            return this.diffLineMode(text1, text2, deadline);
+        }
+
+        return this.diffBisect(text1, text2, deadline);
+    };
+
+    /**
+     * Do the two texts share a substring which is at least half the length of the
+     * longer text?
+     * This speedup can produce non-minimal diffs.
+     * @param {string} text1 First string.
+     * @param {string} text2 Second string.
+     * @return {Array.<string>} Five element Array, containing the prefix of
+     *     text1, the suffix of text1, the prefix of text2, the suffix of
+     *     text2 and the common middle.  Or null if there was no match.
+     * @private
+     */
+    DiffMatchPatch.prototype.diffHalfMatch = function(text1, text2) {
+        var longtext, shorttext, dmp,
+                       text1A, text2B, text2A, text1B, midCommon,
+                       hm1, hm2, hm;
+        if (this.DiffTimeout <= 0) {
+            // Don't risk returning a non-optimal diff if we have unlimited time.
+            return null;
+        }
+        longtext = text1.length > text2.length ? text1 : text2;
+        shorttext = text1.length > text2.length ? text2 : text1;
+        if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {
+            return null; // Pointless.
+        }
+        dmp = this; // 'this' becomes 'window' in a closure.
+
+        /**
+         * Does a substring of shorttext exist within longtext such that the substring
+         * is at least half the length of longtext?
+         * Closure, but does not reference any external variables.
+         * @param {string} longtext Longer string.
+         * @param {string} shorttext Shorter string.
+         * @param {number} i Start index of quarter length substring within longtext.
+         * @return {Array.<string>} Five element Array, containing the prefix of
+         *     longtext, the suffix of longtext, the prefix of shorttext, the suffix
+         *     of shorttext and the common middle.  Or null if there was no match.
+         * @private
+         */
+        function diffHalfMatchI(longtext, shorttext, i) {
+            var seed, j, bestCommon, prefixLength, suffixLength,
+                               bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;
+            // Start with a 1/4 length substring at position i as a seed.
+            seed = longtext.substring(i, i + Math.floor(longtext.length / 4));
+            j = -1;
+            bestCommon = "";
+            while ((j = shorttext.indexOf(seed, j + 1)) !== -1) {
+                prefixLength = dmp.diffCommonPrefix(longtext.substring(i),
+                    shorttext.substring(j));
+                suffixLength = dmp.diffCommonSuffix(longtext.substring(0, i),
+                    shorttext.substring(0, j));
+                if (bestCommon.length < suffixLength + prefixLength) {
+                    bestCommon = shorttext.substring(j - suffixLength, j) +
+                        shorttext.substring(j, j + prefixLength);
+                    bestLongtextA = longtext.substring(0, i - suffixLength);
+                    bestLongtextB = longtext.substring(i + prefixLength);
+                    bestShorttextA = shorttext.substring(0, j - suffixLength);
+                    bestShorttextB = shorttext.substring(j + prefixLength);
+                }
+            }
+            if (bestCommon.length * 2 >= longtext.length) {
+                return [ bestLongtextA, bestLongtextB,
+                    bestShorttextA, bestShorttextB, bestCommon
+                ];
+            } else {
+                return null;
+            }
+        }
+
+        // First check if the second quarter is the seed for a half-match.
+        hm1 = diffHalfMatchI(longtext, shorttext,
+            Math.ceil(longtext.length / 4));
+        // Check again based on the third quarter.
+        hm2 = diffHalfMatchI(longtext, shorttext,
+            Math.ceil(longtext.length / 2));
+        if (!hm1 && !hm2) {
+            return null;
+        } else if (!hm2) {
+            hm = hm1;
+        } else if (!hm1) {
+            hm = hm2;
+        } else {
+            // Both matched.  Select the longest.
+            hm = hm1[4].length > hm2[4].length ? hm1 : hm2;
+        }
+
+        // A half-match was found, sort out the return data.
+        text1A, text1B, text2A, text2B;
+        if (text1.length > text2.length) {
+            text1A = hm[0];
+            text1B = hm[1];
+            text2A = hm[2];
+            text2B = hm[3];
+        } else {
+            text2A = hm[0];
+            text2B = hm[1];
+            text1A = hm[2];
+            text1B = hm[3];
+        }
+        midCommon = hm[4];
+        return [ text1A, text1B, text2A, text2B, midCommon ];
+    };
+
+    /**
+     * Do a quick line-level diff on both strings, then rediff the parts for
+     * greater accuracy.
+     * This speedup can produce non-minimal diffs.
+     * @param {string} text1 Old string to be diffed.
+     * @param {string} text2 New string to be diffed.
+     * @param {number} deadline Time when the diff should be complete by.
+     * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+     * @private
+     */
+    DiffMatchPatch.prototype.diffLineMode = function(text1, text2, deadline) {
+        var a, diffs, linearray, pointer, countInsert,
+                       countDelete, textInsert, textDelete, j;
+        // Scan the text on a line-by-line basis first.
+        a = this.diffLinesToChars(text1, text2);
+        text1 = a.chars1;
+        text2 = a.chars2;
+        linearray = a.lineArray;
+
+        diffs = this.DiffMain(text1, text2, false, deadline);
+
+        // Convert the diff back to original text.
+        this.diffCharsToLines(diffs, linearray);
+        // Eliminate freak matches (e.g. blank lines)
+        this.diffCleanupSemantic(diffs);
+
+        // Rediff any replacement blocks, this time character-by-character.
+        // Add a dummy entry at the end.
+        diffs.push( [ DIFF_EQUAL, "" ] );
+        pointer = 0;
+        countDelete = 0;
+        countInsert = 0;
+        textDelete = "";
+        textInsert = "";
+        while (pointer < diffs.length) {
+            switch ( diffs[pointer][0] ) {
+                case DIFF_INSERT:
+                    countInsert++;
+                    textInsert += diffs[pointer][1];
+                    break;
+                case DIFF_DELETE:
+                    countDelete++;
+                    textDelete += diffs[pointer][1];
+                    break;
+                case DIFF_EQUAL:
+                    // Upon reaching an equality, check for prior redundancies.
+                    if (countDelete >= 1 && countInsert >= 1) {
+                        // Delete the offending records and add the merged ones.
+                        diffs.splice(pointer - countDelete - countInsert,
+                            countDelete + countInsert);
+                        pointer = pointer - countDelete - countInsert;
+                        a = this.DiffMain(textDelete, textInsert, false, deadline);
+                        for (j = a.length - 1; j >= 0; j--) {
+                            diffs.splice( pointer, 0, a[j] );
+                        }
+                        pointer = pointer + a.length;
+                    }
+                    countInsert = 0;
+                    countDelete = 0;
+                    textDelete = "";
+                    textInsert = "";
+                    break;
+            }
+            pointer++;
+        }
+        diffs.pop(); // Remove the dummy entry at the end.
+
+        return diffs;
+    };
+
+    /**
+     * Find the 'middle snake' of a diff, split the problem in two
+     * and return the recursively constructed diff.
+     * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.
+     * @param {string} text1 Old string to be diffed.
+     * @param {string} text2 New string to be diffed.
+     * @param {number} deadline Time at which to bail if not yet complete.
+     * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+     * @private
+     */
+    DiffMatchPatch.prototype.diffBisect = function(text1, text2, deadline) {
+        var text1Length, text2Length, maxD, vOffset, vLength,
+                       v1, v2, x, delta, front, k1start, k1end, k2start,
+                       k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;
+        // Cache the text lengths to prevent multiple calls.
+        text1Length = text1.length;
+        text2Length = text2.length;
+        maxD = Math.ceil((text1Length + text2Length) / 2);
+        vOffset = maxD;
+        vLength = 2 * maxD;
+        v1 = new Array(vLength);
+        v2 = new Array(vLength);
+        // Setting all elements to -1 is faster in Chrome & Firefox than mixing
+        // integers and undefined.
+        for (x = 0; x < vLength; x++) {
+            v1[x] = -1;
+            v2[x] = -1;
+        }
+        v1[vOffset + 1] = 0;
+        v2[vOffset + 1] = 0;
+        delta = text1Length - text2Length;
+        // If the total number of characters is odd, then the front path will collide
+        // with the reverse path.
+        front = (delta % 2 !== 0);
+        // Offsets for start and end of k loop.
+        // Prevents mapping of space beyond the grid.
+        k1start = 0;
+        k1end = 0;
+        k2start = 0;
+        k2end = 0;
+        for (d = 0; d < maxD; d++) {
+            // Bail out if deadline is reached.
+            if ((new Date()).getTime() > deadline) {
+                break;
+            }
+
+            // Walk the front path one step.
+            for (k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {
+                k1Offset = vOffset + k1;
+                if ( k1 === -d || ( k1 !== d && v1[ k1Offset - 1 ] < v1[ k1Offset + 1 ] ) ) {
+                    x1 = v1[k1Offset + 1];
+                } else {
+                    x1 = v1[k1Offset - 1] + 1;
+                }
+                y1 = x1 - k1;
+                while (x1 < text1Length && y1 < text2Length &&
+                    text1.charAt(x1) === text2.charAt(y1)) {
+                    x1++;
+                    y1++;
+                }
+                v1[k1Offset] = x1;
+                if (x1 > text1Length) {
+                    // Ran off the right of the graph.
+                    k1end += 2;
+                } else if (y1 > text2Length) {
+                    // Ran off the bottom of the graph.
+                    k1start += 2;
+                } else if (front) {
+                    k2Offset = vOffset + delta - k1;
+                    if (k2Offset >= 0 && k2Offset < vLength && v2[k2Offset] !== -1) {
+                        // Mirror x2 onto top-left coordinate system.
+                        x2 = text1Length - v2[k2Offset];
+                        if (x1 >= x2) {
+                            // Overlap detected.
+                            return this.diffBisectSplit(text1, text2, x1, y1, deadline);
+                        }
+                    }
+                }
+            }
+
+            // Walk the reverse path one step.
+            for (k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {
+                k2Offset = vOffset + k2;
+                if ( k2 === -d || (k2 !== d && v2[ k2Offset - 1 ] < v2[ k2Offset + 1 ] ) ) {
+                    x2 = v2[k2Offset + 1];
+                } else {
+                    x2 = v2[k2Offset - 1] + 1;
+                }
+                y2 = x2 - k2;
+                while (x2 < text1Length && y2 < text2Length &&
+                    text1.charAt(text1Length - x2 - 1) ===
+                    text2.charAt(text2Length - y2 - 1)) {
+                    x2++;
+                    y2++;
+                }
+                v2[k2Offset] = x2;
+                if (x2 > text1Length) {
+                    // Ran off the left of the graph.
+                    k2end += 2;
+                } else if (y2 > text2Length) {
+                    // Ran off the top of the graph.
+                    k2start += 2;
+                } else if (!front) {
+                    k1Offset = vOffset + delta - k2;
+                    if (k1Offset >= 0 && k1Offset < vLength && v1[k1Offset] !== -1) {
+                        x1 = v1[k1Offset];
+                        y1 = vOffset + x1 - k1Offset;
+                        // Mirror x2 onto top-left coordinate system.
+                        x2 = text1Length - x2;
+                        if (x1 >= x2) {
+                            // Overlap detected.
+                            return this.diffBisectSplit(text1, text2, x1, y1, deadline);
+                        }
+                    }
+                }
+            }
+        }
+        // Diff took too long and hit the deadline or
+        // number of diffs equals number of characters, no commonality at all.
+        return [
+            [ DIFF_DELETE, text1 ],
+            [ DIFF_INSERT, text2 ]
+        ];
+    };
+
+    /**
+     * Given the location of the 'middle snake', split the diff in two parts
+     * and recurse.
+     * @param {string} text1 Old string to be diffed.
+     * @param {string} text2 New string to be diffed.
+     * @param {number} x Index of split point in text1.
+     * @param {number} y Index of split point in text2.
+     * @param {number} deadline Time at which to bail if not yet complete.
+     * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+     * @private
+     */
+    DiffMatchPatch.prototype.diffBisectSplit = function( text1, text2, x, y, deadline ) {
+        var text1a, text1b, text2a, text2b, diffs, diffsb;
+        text1a = text1.substring(0, x);
+        text2a = text2.substring(0, y);
+        text1b = text1.substring(x);
+        text2b = text2.substring(y);
+
+        // Compute both diffs serially.
+        diffs = this.DiffMain(text1a, text2a, false, deadline);
+        diffsb = this.DiffMain(text1b, text2b, false, deadline);
+
+        return diffs.concat(diffsb);
+    };
+
+    /**
+     * Reduce the number of edits by eliminating semantically trivial equalities.
+     * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+     */
+    DiffMatchPatch.prototype.diffCleanupSemantic = function(diffs) {
+        var changes, equalities, equalitiesLength, lastequality,
+                       pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1,
+                       lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2;
+        changes = false;
+        equalities = []; // Stack of indices where equalities are found.
+        equalitiesLength = 0; // Keeping our own length var is faster in JS.
+        /** @type {?string} */
+        lastequality = null;
+        // Always equal to diffs[equalities[equalitiesLength - 1]][1]
+        pointer = 0; // Index of current position.
+        // Number of characters that changed prior to the equality.
+        lengthInsertions1 = 0;
+        lengthDeletions1 = 0;
+        // Number of characters that changed after the equality.
+        lengthInsertions2 = 0;
+        lengthDeletions2 = 0;
+        while (pointer < diffs.length) {
+            if (diffs[pointer][0] === DIFF_EQUAL) { // Equality found.
+                equalities[equalitiesLength++] = pointer;
+                lengthInsertions1 = lengthInsertions2;
+                lengthDeletions1 = lengthDeletions2;
+                lengthInsertions2 = 0;
+                lengthDeletions2 = 0;
+                lastequality = diffs[pointer][1];
+            } else { // An insertion or deletion.
+                if (diffs[pointer][0] === DIFF_INSERT) {
+                    lengthInsertions2 += diffs[pointer][1].length;
+                } else {
+                    lengthDeletions2 += diffs[pointer][1].length;
+                }
+                // Eliminate an equality that is smaller or equal to the edits on both
+                // sides of it.
+                if (lastequality && (lastequality.length <=
+                        Math.max(lengthInsertions1, lengthDeletions1)) &&
+                    (lastequality.length <= Math.max(lengthInsertions2,
+                        lengthDeletions2))) {
+                    // Duplicate record.
+                    diffs.splice( equalities[ equalitiesLength - 1 ], 0, [ DIFF_DELETE, lastequality ] );
+                    // Change second copy to insert.
+                    diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;
+                    // Throw away the equality we just deleted.
+                    equalitiesLength--;
+                    // Throw away the previous equality (it needs to be reevaluated).
+                    equalitiesLength--;
+                    pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;
+                    lengthInsertions1 = 0; // Reset the counters.
+                    lengthDeletions1 = 0;
+                    lengthInsertions2 = 0;
+                    lengthDeletions2 = 0;
+                    lastequality = null;
+                    changes = true;
+                }
+            }
+            pointer++;
+        }
+
+        // Normalize the diff.
+        if (changes) {
+            this.diffCleanupMerge(diffs);
+        }
+
+        // Find any overlaps between deletions and insertions.
+        // e.g: <del>abcxxx</del><ins>xxxdef</ins>
+        //   -> <del>abc</del>xxx<ins>def</ins>
+        // e.g: <del>xxxabc</del><ins>defxxx</ins>
+        //   -> <ins>def</ins>xxx<del>abc</del>
+        // Only extract an overlap if it is as big as the edit ahead or behind it.
+        pointer = 1;
+        while (pointer < diffs.length) {
+            if (diffs[pointer - 1][0] === DIFF_DELETE &&
+                diffs[pointer][0] === DIFF_INSERT) {
+                deletion = diffs[pointer - 1][1];
+                insertion = diffs[pointer][1];
+                overlapLength1 = this.diffCommonOverlap(deletion, insertion);
+                overlapLength2 = this.diffCommonOverlap(insertion, deletion);
+                if (overlapLength1 >= overlapLength2) {
+                    if (overlapLength1 >= deletion.length / 2 ||
+                        overlapLength1 >= insertion.length / 2) {
+                        // Overlap found.  Insert an equality and trim the surrounding edits.
+                        diffs.splice( pointer, 0, [ DIFF_EQUAL, insertion.substring( 0, overlapLength1 ) ] );
+                        diffs[pointer - 1][1] =
+                            deletion.substring(0, deletion.length - overlapLength1);
+                        diffs[pointer + 1][1] = insertion.substring(overlapLength1);
+                        pointer++;
+                    }
+                } else {
+                    if (overlapLength2 >= deletion.length / 2 ||
+                        overlapLength2 >= insertion.length / 2) {
+                        // Reverse overlap found.
+                        // Insert an equality and swap and trim the surrounding edits.
+                        diffs.splice( pointer, 0, [ DIFF_EQUAL, deletion.substring( 0, overlapLength2 ) ] );
+                        diffs[pointer - 1][0] = DIFF_INSERT;
+                        diffs[pointer - 1][1] =
+                            insertion.substring(0, insertion.length - overlapLength2);
+                        diffs[pointer + 1][0] = DIFF_DELETE;
+                        diffs[pointer + 1][1] =
+                            deletion.substring(overlapLength2);
+                        pointer++;
+                    }
+                }
+                pointer++;
+            }
+            pointer++;
+        }
+    };
+
+    /**
+     * Determine if the suffix of one string is the prefix of another.
+     * @param {string} text1 First string.
+     * @param {string} text2 Second string.
+     * @return {number} The number of characters common to the end of the first
+     *     string and the start of the second string.
+     * @private
+     */
+    DiffMatchPatch.prototype.diffCommonOverlap = function(text1, text2) {
+        var text1Length, text2Length, textLength,
+                       best, length, pattern, found;
+        // Cache the text lengths to prevent multiple calls.
+        text1Length = text1.length;
+        text2Length = text2.length;
+        // Eliminate the null case.
+        if (text1Length === 0 || text2Length === 0) {
+            return 0;
+        }
+        // Truncate the longer string.
+        if (text1Length > text2Length) {
+            text1 = text1.substring(text1Length - text2Length);
+        } else if (text1Length < text2Length) {
+            text2 = text2.substring(0, text1Length);
+        }
+        textLength = Math.min(text1Length, text2Length);
+        // Quick check for the worst case.
+        if (text1 === text2) {
+            return textLength;
+        }
+
+        // Start by looking for a single character match
+        // and increase length until no match is found.
+        // Performance analysis: http://neil.fraser.name/news/2010/11/04/
+        best = 0;
+        length = 1;
+        while (true) {
+            pattern = text1.substring(textLength - length);
+            found = text2.indexOf(pattern);
+            if (found === -1) {
+                return best;
+            }
+            length += found;
+            if (found === 0 || text1.substring(textLength - length) ===
+                text2.substring(0, length)) {
+                best = length;
+                length++;
+            }
+        }
+    };
+
+    /**
+     * Split two texts into an array of strings.  Reduce the texts to a string of
+     * hashes where each Unicode character represents one line.
+     * @param {string} text1 First string.
+     * @param {string} text2 Second string.
+     * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}
+     *     An object containing the encoded text1, the encoded text2 and
+     *     the array of unique strings.
+     *     The zeroth element of the array of unique strings is intentionally blank.
+     * @private
+     */
+    DiffMatchPatch.prototype.diffLinesToChars = function(text1, text2) {
+        var lineArray, lineHash, chars1, chars2;
+        lineArray = []; // e.g. lineArray[4] === 'Hello\n'
+        lineHash = {}; // e.g. lineHash['Hello\n'] === 4
+
+        // '\x00' is a valid character, but various debuggers don't like it.
+        // So we'll insert a junk entry to avoid generating a null character.
+        lineArray[0] = "";
+
+        /**
+         * Split a text into an array of strings.  Reduce the texts to a string of
+         * hashes where each Unicode character represents one line.
+         * Modifies linearray and linehash through being a closure.
+         * @param {string} text String to encode.
+         * @return {string} Encoded string.
+         * @private
+         */
+        function diffLinesToCharsMunge(text) {
+            var chars, lineStart, lineEnd, lineArrayLength, line;
+            chars = "";
+            // Walk the text, pulling out a substring for each line.
+            // text.split('\n') would would temporarily double our memory footprint.
+            // Modifying text would create many large strings to garbage collect.
+            lineStart = 0;
+            lineEnd = -1;
+            // Keeping our own length variable is faster than looking it up.
+            lineArrayLength = lineArray.length;
+            while (lineEnd < text.length - 1) {
+                lineEnd = text.indexOf("\n", lineStart);
+                if (lineEnd === -1) {
+                    lineEnd = text.length - 1;
+                }
+                line = text.substring(lineStart, lineEnd + 1);
+                lineStart = lineEnd + 1;
+
+                if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) :
+                    (lineHash[line] !== undefined)) {
+                    chars += String.fromCharCode( lineHash[ line ] );
+                } else {
+                    chars += String.fromCharCode(lineArrayLength);
+                    lineHash[line] = lineArrayLength;
+                    lineArray[lineArrayLength++] = line;
+                }
+            }
+            return chars;
+        }
+
+        chars1 = diffLinesToCharsMunge(text1);
+        chars2 = diffLinesToCharsMunge(text2);
+        return {
+            chars1: chars1,
+            chars2: chars2,
+            lineArray: lineArray
+        };
+    };
+
+    /**
+     * Rehydrate the text in a diff from a string of line hashes to real lines of
+     * text.
+     * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+     * @param {!Array.<string>} lineArray Array of unique strings.
+     * @private
+     */
+    DiffMatchPatch.prototype.diffCharsToLines = function( diffs, lineArray ) {
+        var x, chars, text, y;
+        for ( x = 0; x < diffs.length; x++ ) {
+            chars = diffs[x][1];
+            text = [];
+            for ( y = 0; y < chars.length; y++ ) {
+                text[y] = lineArray[chars.charCodeAt(y)];
+            }
+            diffs[x][1] = text.join("");
+        }
+    };
+
+    /**
+     * Reorder and merge like edit sections.  Merge equalities.
+     * Any edit section can move as long as it doesn't cross an equality.
+     * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+     */
+    DiffMatchPatch.prototype.diffCleanupMerge = function(diffs) {
+        var pointer, countDelete, countInsert, textInsert, textDelete,
+                       commonlength, changes;
+        diffs.push( [ DIFF_EQUAL, "" ] ); // Add a dummy entry at the end.
+        pointer = 0;
+        countDelete = 0;
+        countInsert = 0;
+        textDelete = "";
+        textInsert = "";
+        commonlength;
+        while (pointer < diffs.length) {
+            switch ( diffs[ pointer ][ 0 ] ) {
+                case DIFF_INSERT:
+                    countInsert++;
+                    textInsert += diffs[pointer][1];
+                    pointer++;
+                    break;
+                case DIFF_DELETE:
+                    countDelete++;
+                    textDelete += diffs[pointer][1];
+                    pointer++;
+                    break;
+                case DIFF_EQUAL:
+                    // Upon reaching an equality, check for prior redundancies.
+                    if (countDelete + countInsert > 1) {
+                        if (countDelete !== 0 && countInsert !== 0) {
+                            // Factor out any common prefixies.
+                            commonlength = this.diffCommonPrefix(textInsert, textDelete);
+                            if (commonlength !== 0) {
+                                if ((pointer - countDelete - countInsert) > 0 &&
+                                    diffs[pointer - countDelete - countInsert - 1][0] ===
+                                    DIFF_EQUAL) {
+                                    diffs[pointer - countDelete - countInsert - 1][1] +=
+                                        textInsert.substring(0, commonlength);
+                                } else {
+                                    diffs.splice( 0, 0, [ DIFF_EQUAL,
+                                        textInsert.substring( 0, commonlength )
+                                     ] );
+                                    pointer++;
+                                }
+                                textInsert = textInsert.substring(commonlength);
+                                textDelete = textDelete.substring(commonlength);
+                            }
+                            // Factor out any common suffixies.
+                            commonlength = this.diffCommonSuffix(textInsert, textDelete);
+                            if (commonlength !== 0) {
+                                diffs[pointer][1] = textInsert.substring(textInsert.length -
+                                    commonlength) + diffs[pointer][1];
+                                textInsert = textInsert.substring(0, textInsert.length -
+                                    commonlength);
+                                textDelete = textDelete.substring(0, textDelete.length -
+                                    commonlength);
+                            }
+                        }
+                        // Delete the offending records and add the merged ones.
+                        if (countDelete === 0) {
+                            diffs.splice( pointer - countInsert,
+                                countDelete + countInsert, [ DIFF_INSERT, textInsert ] );
+                        } else if (countInsert === 0) {
+                            diffs.splice( pointer - countDelete,
+                                countDelete + countInsert, [ DIFF_DELETE, textDelete ] );
+                        } else {
+                            diffs.splice( pointer - countDelete - countInsert,
+                                countDelete + countInsert, [ DIFF_DELETE, textDelete ], [ DIFF_INSERT, textInsert ] );
+                        }
+                        pointer = pointer - countDelete - countInsert +
+                            (countDelete ? 1 : 0) + (countInsert ? 1 : 0) + 1;
+                    } else if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) {
+                        // Merge this equality with the previous one.
+                        diffs[pointer - 1][1] += diffs[pointer][1];
+                        diffs.splice(pointer, 1);
+                    } else {
+                        pointer++;
+                    }
+                    countInsert = 0;
+                    countDelete = 0;
+                    textDelete = "";
+                    textInsert = "";
+                    break;
+            }
+        }
+        if (diffs[diffs.length - 1][1] === "") {
+            diffs.pop(); // Remove the dummy entry at the end.
+        }
+
+        // Second pass: look for single edits surrounded on both sides by equalities
+        // which can be shifted sideways to eliminate an equality.
+        // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC
+        changes = false;
+        pointer = 1;
+        // Intentionally ignore the first and last element (don't need checking).
+        while (pointer < diffs.length - 1) {
+            if (diffs[pointer - 1][0] === DIFF_EQUAL &&
+                diffs[pointer + 1][0] === DIFF_EQUAL) {
+                // This is a single edit surrounded by equalities.
+                if ( diffs[ pointer ][ 1 ].substring( diffs[ pointer ][ 1 ].length -
+                        diffs[ pointer - 1 ][ 1 ].length ) === diffs[ pointer - 1 ][ 1 ] ) {
+                    // Shift the edit over the previous equality.
+                    diffs[pointer][1] = diffs[pointer - 1][1] +
+                        diffs[pointer][1].substring(0, diffs[pointer][1].length -
+                            diffs[pointer - 1][1].length);
+                    diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];
+                    diffs.splice(pointer - 1, 1);
+                    changes = true;
+                } else if ( diffs[ pointer ][ 1 ].substring( 0, diffs[ pointer + 1 ][ 1 ].length ) ===
+                    diffs[ pointer + 1 ][ 1 ] ) {
+                    // Shift the edit over the next equality.
+                    diffs[pointer - 1][1] += diffs[pointer + 1][1];
+                    diffs[pointer][1] =
+                        diffs[pointer][1].substring(diffs[pointer + 1][1].length) +
+                        diffs[pointer + 1][1];
+                    diffs.splice(pointer + 1, 1);
+                    changes = true;
+                }
+            }
+            pointer++;
+        }
+        // If shifts were made, the diff needs reordering and another shift sweep.
+        if (changes) {
+            this.diffCleanupMerge(diffs);
+        }
+    };
+
+    return function(o, n) {
+               var diff, output, text;
+        diff = new DiffMatchPatch();
+        output = diff.DiffMain(o, n);
+        //console.log(output);
+        diff.diffCleanupEfficiency(output);
+        text = diff.diffPrettyHtml(output);
+
+        return text;
+    };
 }());
 // jscs:enable
 
@@ -2256,7 +3176,14 @@ function addEvent( elem, type, fn ) {
        } else if ( elem.attachEvent ) {
 
                // support: IE <9
-               elem.attachEvent( "on" + type, fn );
+               elem.attachEvent( "on" + type, function() {
+                       var event = window.event;
+                       if ( !event.target ) {
+                               event.target = event.srcElement || document;
+                       }
+
+                       fn.call( elem, event );
+               });
        }
 }
 
@@ -2427,12 +3354,16 @@ function setUrl( params ) {
 }
 
 function applyUrlParams() {
-       var selectBox = id( "qunit-modulefilter" ),
-               selection = decodeURIComponent( selectBox.options[ selectBox.selectedIndex ].value ),
+       var selectedModule,
+               modulesList = id( "qunit-modulefilter" ),
                filter = id( "qunit-filter-input" ).value;
 
+       selectedModule = modulesList ?
+               decodeURIComponent( modulesList.options[ modulesList.selectedIndex ].value ) :
+               undefined;
+
        window.location = setUrl({
-               module: ( selection === "" ) ? undefined : selection,
+               module: ( selectedModule === "" ) ? undefined : selectedModule,
                filter: ( filter === "" ) ? undefined : filter,
 
                // Remove testId filter
@@ -2588,9 +3519,14 @@ function storeFixture() {
 
 function appendUserAgent() {
        var userAgent = id( "qunit-userAgent" );
+
        if ( userAgent ) {
                userAgent.innerHTML = "";
-               userAgent.appendChild( document.createTextNode( navigator.userAgent ) );
+               userAgent.appendChild(
+                       document.createTextNode(
+                               "QUnit " + QUnit.version  + "; " + navigator.userAgent
+                       )
+               );
        }
 }
 
@@ -2733,7 +3669,7 @@ function getNameHtml( name, module ) {
 }
 
 QUnit.testStart(function( details ) {
-       var running, testBlock;
+       var running, testBlock, bad;
 
        testBlock = id( "qunit-test-output-" + details.testId );
        if ( testBlock ) {
@@ -2746,7 +3682,13 @@ QUnit.testStart(function( details ) {
 
        running = id( "qunit-testresult" );
        if ( running ) {
-               running.innerHTML = "Running: <br />" + getNameHtml( details.name, details.module );
+               bad = QUnit.config.reorder && defined.sessionStorage &&
+                       +sessionStorage.getItem( "qunit-test-" + details.module + "-" + details.name );
+
+               running.innerHTML = ( bad ?
+                       "Rerunning previously failed test: <br />" :
+                       "Running: <br />" ) +
+                       getNameHtml( details.name, details.module );
        }
 
 });
@@ -2779,6 +3721,15 @@ QUnit.log(function( details ) {
                                actual + "</pre></td></tr>" +
                                "<tr class='test-diff'><th>Diff: </th><td><pre>" +
                                QUnit.diff( expected, actual ) + "</pre></td></tr>";
+               } else {
+                       if ( expected.indexOf( "[object Array]" ) !== -1 ||
+                                       expected.indexOf( "[object Object]" ) !== -1 ) {
+                               message += "<tr class='test-message'><th>Message: </th><td>" +
+                                       "Diff suppressed as the depth of object is more than current max depth (" +
+                                       QUnit.config.maxDepth + ").<p>Hint: Use <code>QUnit.dump.maxDepth</code> to " +
+                                       " run with a higher max depth or <a href='" + setUrl({ maxDepth: -1 }) + "'>" +
+                                       "Rerun</a> without max depth.</p></td></tr>";
+                       }
                }
 
                if ( details.source ) {
@@ -2863,13 +3814,15 @@ QUnit.testDone(function( details ) {
        }
 });
 
-if ( !defined.document || document.readyState === "complete" ) {
+if ( defined.document ) {
+       if ( document.readyState === "complete" ) {
+               QUnit.load();
+       } else {
+               addEvent( window, "load", QUnit.load );
+       }
+} else {
        config.pageLoaded = true;
        config.autorun = true;
 }
 
-if ( defined.document ) {
-       addEvent( window, "load", QUnit.load );
-}
-
 })();
diff --git a/resources/lib/sinonjs/sinon-1.15.0.js b/resources/lib/sinonjs/sinon-1.15.0.js
deleted file mode 100644 (file)
index 8add41d..0000000
+++ /dev/null
@@ -1,5939 +0,0 @@
-/**
- * Sinon.JS 1.15.0, 2015/05/30
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS
- *
- * (The BSD License)
- * 
- * Copyright (c) 2010-2014, 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.
- */
-
-(function (root, factory) {
-  'use strict';
-  if (typeof define === 'function' && define.amd) {
-    define('sinon', [], function () {
-      return (root.sinon = factory());
-    });
-  } else if (typeof exports === 'object') {
-    module.exports = factory();
-  } else {
-    root.sinon = factory();
-  }
-}(this, function () {
-  'use strict';
-  var samsam, formatio, lolex;
-  (function () {
-                function define(mod, deps, fn) {
-                  if (mod == "samsam") {
-                    samsam = deps();
-                  } else if (typeof deps === "function" && mod.length === 0) {
-                    lolex = deps();
-                  } else if (typeof fn === "function") {
-                    formatio = fn(samsam);
-                  }
-                }
-    define.amd = {};
-((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 (getClass(object) === 'Arguments') { return true; }
-        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 (typeof(matcher) === "undefined") {
-            return typeof(object) === "undefined";
-        }
-
-        if (matcher === null) {
-            return object === null;
-        }
-
-        if (getClass(object) === "Array" && getClass(matcher) === "Array") {
-            return arrayContains(object, matcher);
-        }
-
-        if (matcher && typeof matcher === "object") {
-            if (matcher === object) {
-                return true;
-            }
-            var prop;
-            for (prop in matcher) {
-                var value = object[prop];
-                if (typeof value === "undefined" &&
-                        typeof object.getAttribute === "function") {
-                    value = object.getAttribute(prop);
-                }
-                if (matcher[prop] === null || typeof matcher[prop] === 'undefined') {
-                    if (value !== matcher[prop]) {
-                        return false;
-                    }
-                } else if (typeof  value === "undefined" || !match(value, 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,
-        limitChildrenCount: 0
-    };
-
-    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 pieces = [];
-        var i, l;
-        l = (this.limitChildrenCount > 0) ? 
-            Math.min(this.limitChildrenCount, array.length) : array.length;
-
-        for (i = 0; i < l; ++i) {
-            pieces.push(ascii(this, array[i], processed));
-        }
-
-        if(l < array.length)
-            pieces.push("[... " + (array.length - l) + " more elements]");
-
-        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, k, l;
-        l = (this.limitChildrenCount > 0) ? 
-            Math.min(this.limitChildrenCount, properties.length) : properties.length;
-
-        for (i = 0; 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, k = indent; i < k; ++i) { is += " "; }
-
-        if(l < properties.length)
-            pieces.push("[... " + (properties.length - l) + " more elements]");
-
-        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;
-});
-!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.lolex=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
-(function (global){
-/*jslint eqeqeq: false, plusplus: false, evil: true, onevar: false, browser: true, forin: false*/
-/*global global*/
-/**
- * @author Christian Johansen (christian@cjohansen.no) and contributors
- * @license BSD
- *
- * Copyright (c) 2010-2014 Christian Johansen
- */
-
-// node expects setTimeout/setInterval to return a fn object w/ .ref()/.unref()
-// browsers, a number.
-// see https://github.com/cjohansen/Sinon.JS/pull/436
-var timeoutResult = setTimeout(function() {}, 0);
-var addTimerReturnsObject = typeof timeoutResult === "object";
-clearTimeout(timeoutResult);
-
-var NativeDate = Date;
-var id = 1;
-
-/**
- * Parse strings like "01:10:00" (meaning 1 hour, 10 minutes, 0 seconds) into
- * number of milliseconds. This is used to support human-readable strings passed
- * to clock.tick()
- */
-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;
-}
-
-/**
- * Used to grok the `now` parameter to createClock.
- */
-function getEpoch(epoch) {
-    if (!epoch) { return 0; }
-    if (typeof epoch.getTime === "function") { return epoch.getTime(); }
-    if (typeof epoch === "number") { return epoch; }
-    throw new TypeError("now should be milliseconds since UNIX epoch");
-}
-
-function inRange(from, to, timer) {
-    return timer && timer.callAt >= from && timer.callAt <= to;
-}
-
-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;
-}
-
-function createDate() {
-    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 addTimer(clock, timer) {
-    if (typeof timer.func === "undefined") {
-        throw new Error("Callback must be provided to timer calls");
-    }
-
-    if (!clock.timers) {
-        clock.timers = {};
-    }
-
-    timer.id = id++;
-    timer.createdAt = clock.now;
-    timer.callAt = clock.now + (timer.delay || 0);
-
-    clock.timers[timer.id] = timer;
-
-    if (addTimerReturnsObject) {
-        return {
-            id: timer.id,
-            ref: function() {},
-            unref: function() {}
-        };
-    }
-    else {
-        return timer.id;
-    }
-}
-
-function firstTimerInRange(clock, from, to) {
-    var timers = clock.timers, timer = null;
-
-    for (var id in timers) {
-        if (!inRange(from, to, timers[id])) {
-            continue;
-        }
-
-        if (!timer || ~compareTimers(timer, timers[id])) {
-            timer = timers[id];
-        }
-    }
-
-    return timer;
-}
-
-function compareTimers(a, b) {
-    // Sort first by absolute timing
-    if (a.callAt < b.callAt) {
-        return -1;
-    }
-    if (a.callAt > b.callAt) {
-        return 1;
-    }
-
-    // Sort next by immediate, immediate timers take precedence
-    if (a.immediate && !b.immediate) {
-        return -1;
-    }
-    if (!a.immediate && b.immediate) {
-        return 1;
-    }
-
-    // Sort next by creation time, earlier-created timers take precedence
-    if (a.createdAt < b.createdAt) {
-        return -1;
-    }
-    if (a.createdAt > b.createdAt) {
-        return 1;
-    }
-
-    // Sort next by id, lower-id timers take precedence
-    if (a.id < b.id) {
-        return -1;
-    }
-    if (a.id > b.id) {
-        return 1;
-    }
-
-    // As timer ids are unique, no fallback `0` is necessary
-}
-
-function callTimer(clock, timer) {
-    if (typeof timer.interval == "number") {
-        clock.timers[timer.id].callAt += timer.interval;
-    } else {
-        delete clock.timers[timer.id];
-    }
-
-    try {
-        if (typeof timer.func == "function") {
-            timer.func.apply(null, timer.args);
-        } else {
-            eval(timer.func);
-        }
-    } catch (e) {
-        var exception = e;
-    }
-
-    if (!clock.timers[timer.id]) {
-        if (exception) {
-            throw exception;
-        }
-        return;
-    }
-
-    if (exception) {
-        throw exception;
-    }
-}
-
-function uninstall(clock, target) {
-    var method;
-
-    for (var i = 0, l = clock.methods.length; i < l; i++) {
-        method = clock.methods[i];
-
-        if (target[method].hadOwnProperty) {
-            target[method] = clock["_" + method];
-        } else {
-            try {
-                delete target[method];
-            } catch (e) {}
-        }
-    }
-
-    // Prevent multiple executions which will completely remove these props
-    clock.methods = [];
-}
-
-function hijackMethod(target, method, clock) {
-    clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(target, method);
-    clock["_" + method] = target[method];
-
-    if (method == "Date") {
-        var date = mirrorDateProperties(clock[method], target[method]);
-        target[method] = date;
-    } else {
-        target[method] = function () {
-            return clock[method].apply(clock, arguments);
-        };
-
-        for (var prop in clock[method]) {
-            if (clock[method].hasOwnProperty(prop)) {
-                target[method][prop] = clock[method][prop];
-            }
-        }
-    }
-
-    target[method].clock = clock;
-}
-
-var timers = {
-    setTimeout: setTimeout,
-    clearTimeout: clearTimeout,
-    setImmediate: (typeof setImmediate !== "undefined" ? setImmediate : undefined),
-    clearImmediate: (typeof clearImmediate !== "undefined" ? clearImmediate: undefined),
-    setInterval: setInterval,
-    clearInterval: clearInterval,
-    Date: Date
-};
-
-var keys = Object.keys || function (obj) {
-    var ks = [];
-    for (var key in obj) {
-        ks.push(key);
-    }
-    return ks;
-};
-
-exports.timers = timers;
-
-var createClock = exports.createClock = function (now) {
-    var clock = {
-        now: getEpoch(now),
-        timeouts: {},
-        Date: createDate()
-    };
-
-    clock.Date.clock = clock;
-
-    clock.setTimeout = function setTimeout(func, timeout) {
-        return addTimer(clock, {
-            func: func,
-            args: Array.prototype.slice.call(arguments, 2),
-            delay: timeout
-        });
-    };
-
-    clock.clearTimeout = function clearTimeout(timerId) {
-        if (!timerId) {
-            // null appears to be allowed in most browsers, and appears to be
-            // relied upon by some libraries, like Bootstrap carousel
-            return;
-        }
-        if (!clock.timers) {
-            clock.timers = [];
-        }
-        // in Node, timerId is an object with .ref()/.unref(), and
-        // its .id field is the actual timer id.
-        if (typeof timerId === "object") {
-            timerId = timerId.id
-        }
-        if (timerId in clock.timers) {
-            delete clock.timers[timerId];
-        }
-    };
-
-    clock.setInterval = function setInterval(func, timeout) {
-        return addTimer(clock, {
-            func: func,
-            args: Array.prototype.slice.call(arguments, 2),
-            delay: timeout,
-            interval: timeout
-        });
-    };
-
-    clock.clearInterval = function clearInterval(timerId) {
-        clock.clearTimeout(timerId);
-    };
-
-    clock.setImmediate = function setImmediate(func) {
-        return addTimer(clock, {
-            func: func,
-            args: Array.prototype.slice.call(arguments, 1),
-            immediate: true
-        });
-    };
-
-    clock.clearImmediate = function clearImmediate(timerId) {
-        clock.clearTimeout(timerId);
-    };
-
-    clock.tick = function tick(ms) {
-        ms = typeof ms == "number" ? ms : parseTime(ms);
-        var tickFrom = clock.now, tickTo = clock.now + ms, previous = clock.now;
-        var timer = firstTimerInRange(clock, tickFrom, tickTo);
-
-        var firstException;
-        while (timer && tickFrom <= tickTo) {
-            if (clock.timers[timer.id]) {
-                tickFrom = clock.now = timer.callAt;
-                try {
-                    callTimer(clock, timer);
-                } catch (e) {
-                    firstException = firstException || e;
-                }
-            }
-
-            timer = firstTimerInRange(clock, previous, tickTo);
-            previous = tickFrom;
-        }
-
-        clock.now = tickTo;
-
-        if (firstException) {
-            throw firstException;
-        }
-
-        return clock.now;
-    };
-
-    clock.reset = function reset() {
-        clock.timers = {};
-    };
-
-    return clock;
-};
-
-exports.install = function install(target, now, toFake) {
-    if (typeof target === "number") {
-        toFake = now;
-        now = target;
-        target = null;
-    }
-
-    if (!target) {
-        target = global;
-    }
-
-    var clock = createClock(now);
-
-    clock.uninstall = function () {
-        uninstall(clock, target);
-    };
-
-    clock.methods = toFake || [];
-
-    if (clock.methods.length === 0) {
-        clock.methods = keys(timers);
-    }
-
-    for (var i = 0, l = clock.methods.length; i < l; i++) {
-        hijackMethod(target, clock.methods[i], clock);
-    }
-
-    return clock;
-};
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{}]},{},[1])(1)
-});
-  })();
-  var define;
-/**
- * Sinon core utilities. For internal use only.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-var sinon = (function () {
-"use strict";
-
-    var sinon;
-    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        sinon = module.exports = require("./sinon/util/core");
-        require("./sinon/extend");
-        require("./sinon/typeOf");
-        require("./sinon/times_in_words");
-        require("./sinon/spy");
-        require("./sinon/call");
-        require("./sinon/behavior");
-        require("./sinon/stub");
-        require("./sinon/mock");
-        require("./sinon/collection");
-        require("./sinon/assert");
-        require("./sinon/sandbox");
-        require("./sinon/test");
-        require("./sinon/test_case");
-        require("./sinon/match");
-        require("./sinon/format");
-        require("./sinon/log_error");
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-        sinon = module.exports;
-    } else {
-        sinon = {};
-    }
-
-    return sinon;
-}());
-
-/**
- * @depend ../../sinon.js
- */
-/**
- * Sinon core utilities. For internal use only.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    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 isReallyNaN(val) {
-        return typeof val === "number" && isNaN(val);
-    }
-
-    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;
-    }
-
-    // Cheap way to detect if we have ES5 support.
-    var hasES5Support = "keys" in Object;
-
-    function makeApi(sinon) {
-        sinon.wrapMethod = function wrapMethod(object, property, method) {
-            if (!object) {
-                throw new TypeError("Should wrap property of object");
-            }
-
-            if (typeof method != "function" && typeof method != "object") {
-                throw new TypeError("Method wrapper should be a function or a property descriptor");
-            }
-
-            function checkWrappedMethod(wrappedMethod) {
-                if (!isFunction(wrappedMethod)) {
-                    error = new TypeError("Attempted to wrap " + (typeof wrappedMethod) + " property " +
-                                        property + " as function");
-                } else if (wrappedMethod.restore && wrappedMethod.restore.sinon) {
-                    error = new TypeError("Attempted to wrap " + property + " which is already wrapped");
-                } else 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 && wrappedMethod.stackTrace) {
-                        error.stack += "\n--------------\n" + wrappedMethod.stackTrace;
-                    }
-                    throw error;
-                }
-            }
-
-            var error, wrappedMethod;
-
-            // 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);
-
-            if (hasES5Support) {
-                var methodDesc = (typeof method == "function") ? {value: method} : method,
-                    wrappedMethodDesc = sinon.getPropertyDescriptor(object, property),
-                    i;
-
-                if (!wrappedMethodDesc) {
-                    error = new TypeError("Attempted to wrap " + (typeof wrappedMethod) + " property " +
-                                        property + " as function");
-                } else if (wrappedMethodDesc.restore && wrappedMethodDesc.restore.sinon) {
-                    error = new TypeError("Attempted to wrap " + property + " which is already wrapped");
-                }
-                if (error) {
-                    if (wrappedMethodDesc && wrappedMethodDesc.stackTrace) {
-                        error.stack += "\n--------------\n" + wrappedMethodDesc.stackTrace;
-                    }
-                    throw error;
-                }
-
-                var types = sinon.objectKeys(methodDesc);
-                for (i = 0; i < types.length; i++) {
-                    wrappedMethod = wrappedMethodDesc[types[i]];
-                    checkWrappedMethod(wrappedMethod);
-                }
-
-                mirrorProperties(methodDesc, wrappedMethodDesc);
-                for (i = 0; i < types.length; i++) {
-                    mirrorProperties(methodDesc[types[i]], wrappedMethodDesc[types[i]]);
-                }
-                Object.defineProperty(object, property, methodDesc);
-            } else {
-                wrappedMethod = object[property];
-                checkWrappedMethod(wrappedMethod);
-                object[property] = method;
-                method.displayName = property;
-            }
-
-            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.stackTrace = (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) {
-                    // In some cases `delete` may throw an error
-                    try {
-                        delete object[property];
-                    } catch (e) {}
-                    // For native code functions `delete` fails without throwing an error
-                    // on Chrome < 43, PhantomJS, etc.
-                } else if (hasES5Support) {
-                    Object.defineProperty(object, property, wrappedMethodDesc);
-                }
-
-                // Use strict equality comparison to check failures then force a reset
-                // via direct assignment.
-                if (object[property] === method) {
-                    object[property] = wrappedMethod;
-                }
-            };
-
-            method.restore.sinon = true;
-
-            if (!hasES5Support) {
-                mirrorProperties(method, wrappedMethod);
-            }
-
-            return method;
-        };
-
-        sinon.create = function create(proto) {
-            var F = function () {};
-            F.prototype = proto;
-            return new F();
-        };
-
-        sinon.deepEqual = function deepEqual(a, b) {
-            if (sinon.match && sinon.match.isMatcher(a)) {
-                return a.test(b);
-            }
-
-            if (typeof a != "object" || typeof b != "object") {
-                if (isReallyNaN(a) && isReallyNaN(b)) {
-                    return true;
-                } else {
-                    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;
-            }
-
-            if (a instanceof RegExp && b instanceof RegExp) {
-                return (a.source === b.source) && (a.global === b.global) &&
-                    (a.ignoreCase === b.ignoreCase) && (a.multiline === b.multiline);
-            }
-
-            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 (!(prop in b)) {
-                    return false;
-                }
-
-                if (!deepEqual(a[prop], b[prop])) {
-                    return false;
-                }
-            }
-
-            for (prop in b) {
-                bLength += 1;
-            }
-
-            return aLength == bLength;
-        };
-
-        sinon.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;
-        };
-
-        sinon.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";
-        };
-
-        sinon.objectKeys = function objectKeys(obj) {
-            if (obj !== Object(obj)) {
-                throw new TypeError("sinon.objectKeys called on a non-object");
-            }
-
-            var keys = [];
-            var key;
-            for (key in obj) {
-                if (hasOwn.call(obj, key)) {
-                    keys.push(key);
-                }
-            }
-
-            return keys;
-        };
-
-        sinon.getPropertyDescriptor = function getPropertyDescriptor(object, property) {
-            var proto = object, descriptor;
-            while (proto && !(descriptor = Object.getOwnPropertyDescriptor(proto, property))) {
-                proto = Object.getPrototypeOf(proto);
-            }
-            return descriptor;
-        }
-
-        sinon.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;
-        };
-
-        sinon.defaultConfig = {
-            injectIntoThis: true,
-            injectInto: null,
-            properties: ["spy", "stub", "mock", "clock", "server", "requests"],
-            useFakeTimers: true,
-            useFakeServer: true
-        };
-
-        sinon.timesInWords = function timesInWords(count) {
-            return count == 1 && "once" ||
-                count == 2 && "twice" ||
-                count == 3 && "thrice" ||
-                (count || 0) + " times";
-        };
-
-        sinon.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;
-        };
-
-        sinon.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;
-            });
-        };
-
-        sinon.createStubInstance = function (constructor) {
-            if (typeof constructor !== "function") {
-                throw new TypeError("The constructor should be a function.");
-            }
-            return sinon.stub(sinon.create(constructor.prototype));
-        };
-
-        sinon.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();
-            }
-        };
-
-        return sinon;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports) {
-        makeApi(exports);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend util/core.js
- */
-
-(function (sinon) {
-    function makeApi(sinon) {
-
-        // Adapted from https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug
-        var hasDontEnumBug = (function () {
-            var obj = {
-                constructor: function () {
-                    return "0";
-                },
-                toString: function () {
-                    return "1";
-                },
-                valueOf: function () {
-                    return "2";
-                },
-                toLocaleString: function () {
-                    return "3";
-                },
-                prototype: function () {
-                    return "4";
-                },
-                isPrototypeOf: function () {
-                    return "5";
-                },
-                propertyIsEnumerable: function () {
-                    return "6";
-                },
-                hasOwnProperty: function () {
-                    return "7";
-                },
-                length: function () {
-                    return "8";
-                },
-                unique: function () {
-                    return "9"
-                }
-            };
-
-            var result = [];
-            for (var prop in obj) {
-                result.push(obj[prop]());
-            }
-            return result.join("") !== "0123456789";
-        })();
-
-        /* Public: Extend target in place with all (own) properties from sources in-order. Thus, last source will
-         *         override properties in previous sources.
-         *
-         * target - The Object to extend
-         * sources - Objects to copy properties from.
-         *
-         * Returns the extended target
-         */
-        function extend(target /*, sources */) {
-            var sources = Array.prototype.slice.call(arguments, 1),
-                source, i, prop;
-
-            for (i = 0; i < sources.length; i++) {
-                source = sources[i];
-
-                for (prop in source) {
-                    if (source.hasOwnProperty(prop)) {
-                        target[prop] = source[prop];
-                    }
-                }
-
-                // Make sure we copy (own) toString method even when in JScript with DontEnum bug
-                // See https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug
-                if (hasDontEnumBug && source.hasOwnProperty("toString") && source.toString !== target.toString) {
-                    target.toString = source.toString;
-                }
-            }
-
-            return target;
-        };
-
-        sinon.extend = extend;
-        return sinon.extend;
-    }
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        module.exports = makeApi(sinon);
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend util/core.js
- */
-
-(function (sinon) {
-    function makeApi(sinon) {
-
-        function timesInWords(count) {
-            switch (count) {
-                case 1:
-                    return "once";
-                case 2:
-                    return "twice";
-                case 3:
-                    return "thrice";
-                default:
-                    return (count || 0) + " times";
-            }
-        }
-
-        sinon.timesInWords = timesInWords;
-        return sinon.timesInWords;
-    }
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        module.exports = makeApi(sinon);
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend util/core.js
- */
-/**
- * Format functions
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2014 Christian Johansen
- */
-
-(function (sinon, formatio) {
-    function makeApi(sinon) {
-        function typeOf(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();
-        };
-
-        sinon.typeOf = typeOf;
-        return sinon.typeOf;
-    }
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        module.exports = makeApi(sinon);
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(
-    (typeof sinon == "object" && sinon || null),
-    (typeof formatio == "object" && formatio)
-));
-
-/**
- * @depend util/core.js
- * @depend typeOf.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) {
-    function makeApi(sinon) {
-        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 (!arguments.length) {
-                throw new TypeError("Matcher expected");
-            } else if (!isMatcher(m2)) {
-                m2 = match(m2);
-            }
-            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 (!arguments.length) {
-                throw new TypeError("Matcher expected");
-            } else if (!isMatcher(m2)) {
-                m2 = match(m2);
-            }
-            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");
-
-        sinon.match = match;
-        return match;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./typeOf");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend util/core.js
- */
-/**
- * Format functions
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2014 Christian Johansen
- */
-
-(function (sinon, formatio) {
-    function makeApi(sinon) {
-        function valueFormatter(value) {
-            return "" + value;
-        }
-
-        function getFormatioFormatter() {
-            var formatter = formatio.configure({
-                    quoteStrings: false,
-                    limitChildrenCount: 250
-                });
-
-            function format() {
-                return formatter.ascii.apply(formatter, arguments);
-            };
-
-            return format;
-        }
-
-        function getNodeFormatter(value) {
-            function format(value) {
-                return typeof value == "object" && value.toString === Object.prototype.toString ? util.inspect(value) : value;
-            };
-
-            try {
-                var util = require("util");
-            } catch (e) {
-                /* Node, but no util module - would be very old, but better safe than sorry */
-            }
-
-            return util ? format : valueFormatter;
-        }
-
-        var isNode = typeof module !== "undefined" && module.exports && typeof require == "function",
-            formatter;
-
-        if (isNode) {
-            try {
-                formatio = require("formatio");
-            } catch (e) {}
-        }
-
-        if (formatio) {
-            formatter = getFormatioFormatter()
-        } else if (isNode) {
-            formatter = getNodeFormatter();
-        } else {
-            formatter = valueFormatter;
-        }
-
-        sinon.format = formatter;
-        return sinon.format;
-    }
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        module.exports = makeApi(sinon);
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(
-    (typeof sinon == "object" && sinon || null),
-    (typeof formatio == "object" && formatio)
-));
-
-/**
-  * @depend util/core.js
-  * @depend match.js
-  * @depend format.js
-  */
-/**
-  * 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) {
-    function makeApi(sinon) {
-        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() {
-                var l = arguments.length;
-                if (l > this.args.length) {
-                    return false;
-                }
-                for (var i = 0; i < l; i += 1) {
-                    if (!sinon.deepEqual(arguments[i], this.args[i])) {
-                        return false;
-                    }
-                }
-
-                return true;
-            },
-
-            calledWithMatch: function calledWithMatch() {
-                var l = arguments.length;
-                if (l > this.args.length) {
-                    return false;
-                }
-                for (var i = 0; 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.proxy.prototype && 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
-
-        sinon.spyCall = createSpyCall;
-        return createSpyCall;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./match");
-        require("./format");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
-  * @depend times_in_words.js
-  * @depend util/core.js
-  * @depend extend.js
-  * @depend call.js
-  * @depend format.js
-  */
-/**
-  * Spy functions
-  *
-  * @author Christian Johansen (christian@cjohansen.no)
-  * @license BSD
-  *
-  * Copyright (c) 2010-2013 Christian Johansen
-  */
-
-(function (sinon) {
-
-    function makeApi(sinon) {
-        var push = Array.prototype.push;
-        var slice = Array.prototype.slice;
-        var callId = 0;
-
-        function spy(object, property, types) {
-            if (!property && typeof object == "function") {
-                return spy.create(object);
-            }
-
-            if (!object && !property) {
-                return spy.create(function () { });
-            }
-
-            if (types) {
-                var methodDesc = sinon.getPropertyDescriptor(object, property);
-                for (var i = 0; i < types.length; i++) {
-                    methodDesc[types[i]] = spy.create(methodDesc[types[i]]);
-                }
-                return sinon.wrapMethod(object, property, methodDesc);
-            } else {
-                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, proxyLength) {
-            // Retain the function length:
-            var p;
-            if (proxyLength) {
-                eval("p = (function proxy(" + vars.substring(0, proxyLength * 2 - 1) +
-                    ") { return p.invoke(func, this, slice.call(arguments)); });");
-            } else {
-                p = function proxy() {
-                    return p.invoke(func, this, slice.call(arguments));
-                };
-            }
-            p.isSinonProxy = true;
-            return p;
-        }
-
-        var uuid = 0;
-
-        // Public API
-        var spyApi = {
-            reset: function () {
-                if (this.invoking) {
-                    var err = new Error("Cannot reset Sinon function while invoking it. " +
-                                        "Move the call to .reset outside of the callback.");
-                    err.name = "InvalidResetException";
-                    throw err;
-                }
-
-                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();
-                    }
-                }
-
-                return this;
-            },
-
-            create: function create(func, spyLength) {
-                var name;
-
-                if (typeof func != "function") {
-                    func = function () { };
-                } else {
-                    name = sinon.functionName(func);
-                }
-
-                if (!spyLength) {
-                    spyLength = func.length;
-                }
-
-                var proxy = createProxy(func, spyLength);
-
-                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.instantiateFake = 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++);
-
-                // Make call properties available from within the spied function:
-                createCallProperties.call(this);
-
-                try {
-                    this.invoking = true;
-
-                    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;
-                } finally {
-                    delete this.invoking;
-                }
-
-                push.call(this.exceptions, exception);
-                push.call(this.returnValues, returnValue);
-
-                // Make return value and exception available in the calls:
-                createCallProperties.call(this);
-
-                if (exception !== undefined) {
-                    throw exception;
-                }
-
-                return returnValue;
-            },
-
-            named: function named(name) {
-                this.displayName = name;
-                return this;
-            },
-
-            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.instantiateFake();
-                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;
-        sinon.spy = spy;
-
-        return spy;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./call");
-        require("./extend");
-        require("./times_in_words");
-        require("./format");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend util/core.js
- * @depend extend.js
- */
-/**
- * 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 slice = Array.prototype.slice;
-    var join = Array.prototype.join;
-    var useLeftMostCallback = -1;
-    var useRightMostCallback = -2;
-
-    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) {
-            return args[callArgAt];
-        }
-
-        var argumentList;
-
-        if (callArgAt === useLeftMostCallback) {
-            argumentList = args;
-        }
-
-        if (callArgAt === useRightMostCallback) {
-            argumentList = slice.call(args).reverse();
-        }
-
-        var callArgProp = behavior.callArgProp;
-
-        for (var i = 0, l = argumentList.length; i < l; ++i) {
-            if (!callArgProp && typeof argumentList[i] == "function") {
-                return argumentList[i];
-            }
-
-            if (callArgProp && argumentList[i] &&
-                typeof argumentList[i][callArgProp] == "function") {
-                return argumentList[i][callArgProp];
-            }
-        }
-
-        return null;
-    }
-
-    function makeApi(sinon) {
-        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);
-                }
-            }
-        }
-
-        var proto = {
-            create: function create(stub) {
-                var behavior = sinon.extend({}, sinon.behavior);
-                delete behavior.create;
-                behavior.stub = stub;
-
-                return behavior;
-            },
-
-            isPresent: function isPresent() {
-                return (typeof this.callArgAt == "number" ||
-                        this.exception ||
-                        typeof this.returnArgAt == "number" ||
-                        this.returnThis ||
-                        this.returnValueDefined);
-            },
-
-            invoke: function invoke(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 onCall(index) {
-                return this.stub.onCall(index);
-            },
-
-            onFirstCall: function onFirstCall() {
-                return this.stub.onFirstCall();
-            },
-
-            onSecondCall: function onSecondCall() {
-                return this.stub.onSecondCall();
-            },
-
-            onThirdCall: function onThirdCall() {
-                return this.stub.onThirdCall();
-            },
-
-            withArgs: function withArgs(/* 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 = useLeftMostCallback;
-                this.callbackArguments = slice.call(arguments, 0);
-                this.callbackContext = undefined;
-                this.callArgProp = undefined;
-                this.callbackAsync = false;
-
-                return this;
-            },
-
-            yieldsRight: function () {
-                this.callArgAt = useRightMostCallback;
-                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 = useLeftMostCallback;
-                this.callbackArguments = slice.call(arguments, 1);
-                this.callbackContext = context;
-                this.callArgProp = undefined;
-                this.callbackAsync = false;
-
-                return this;
-            },
-
-            yieldsTo: function (prop) {
-                this.callArgAt = useLeftMostCallback;
-                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 = useLeftMostCallback;
-                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);
-            }
-        }
-
-        sinon.behavior = proto;
-        return proto;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./extend");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend util/core.js
- * @depend extend.js
- * @depend spy.js
- * @depend behavior.js
- */
-/**
- * Stub functions
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    function makeApi(sinon) {
-        function stub(object, property, func) {
-            if (!!func && typeof func != "function" && typeof func != "object") {
-                throw new TypeError("Custom stub should be a function or a property descriptor");
-            }
-
-            var wrapper;
-
-            if (func) {
-                if (typeof func == "function") {
-                    wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func;
-                } else {
-                    wrapper = func;
-                    if (sinon.spy && sinon.spy.create) {
-                        var types = sinon.objectKeys(wrapper);
-                        for (var i = 0; i < types.length; i++) {
-                            wrapper[types[i]] = sinon.spy.create(wrapper[types[i]]);
-                        }
-                    }
-                }
-            } else {
-                var stubLength = 0;
-                if (typeof object == "object" && typeof object[property] == "function") {
-                    stubLength = object[property].length;
-                }
-                wrapper = stub.create(stubLength);
-            }
-
-            if (!object && typeof property === "undefined") {
-                return sinon.stub.create();
-            }
-
-            if (typeof property === "undefined" && typeof object == "object") {
-                for (var prop in object) {
-                    if (typeof sinon.getPropertyDescriptor(object, prop).value === "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;
-
-        var proto = {
-            create: function create(stubLength) {
-                var functionStub = function () {
-                    return getCurrentBehavior(functionStub).invoke(this, arguments);
-                };
-
-                functionStub.id = "stub#" + uuid++;
-                var orig = functionStub;
-                functionStub = sinon.spy.create(functionStub, stubLength);
-                functionStub.func = orig;
-
-                sinon.extend(functionStub, stub);
-                functionStub.instantiateFake = 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 onCall(index) {
-                if (!this.behaviors[index]) {
-                    this.behaviors[index] = sinon.behavior.create(this);
-                }
-
-                return this.behaviors[index];
-            },
-
-            onFirstCall: function onFirstCall() {
-                return this.onCall(0);
-            },
-
-            onSecondCall: function onSecondCall() {
-                return this.onCall(1);
-            },
-
-            onThirdCall: function onThirdCall() {
-                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));
-            }
-        }
-
-        sinon.extend(stub, proto);
-        sinon.stub = stub;
-
-        return stub;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./behavior");
-        require("./spy");
-        require("./extend");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend times_in_words.js
- * @depend util/core.js
- * @depend call.js
- * @depend extend.js
- * @depend match.js
- * @depend spy.js
- * @depend stub.js
- * @depend format.js
- */
-/**
- * Mock functions.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    function makeApi(sinon) {
-        var push = [].push;
-        var match = sinon.match;
-
-        function mock(object) {
-            if (typeof console !== undefined && console.warn) {
-                console.warn("mock will be removed from Sinon.JS v2.0");
-            }
-
-            if (!object) {
-                return sinon.expectation.create("Anonymous mock");
-            }
-
-            return mock.create(object);
-        }
-
-        function each(collection, callback) {
-            if (!collection) {
-                return;
-            }
-
-            for (var i = 0, l = collection.length; i < l; i += 1) {
-                callback(collection[i]);
-            }
-        }
-
-        sinon.extend(mock, {
-            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 if (met.length > 0) {
-                    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;
-        var slice = Array.prototype.slice;
-
-        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;
-            }
-        }
-
-        sinon.expectation = {
-            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 sinon.spy.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 pass(message) {
-                sinon.assert.pass(message);
-            },
-
-            fail: function fail(message) {
-                var exception = new Error(message);
-                exception.name = "ExpectationError";
-
-                throw exception;
-            }
-        };
-
-        sinon.mock = mock;
-        return mock;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./times_in_words");
-        require("./call");
-        require("./extend");
-        require("./match");
-        require("./spy");
-        require("./stub");
-        require("./format");
-
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend util/core.js
- * @depend spy.js
- * @depend stub.js
- * @depend mock.js
- */
-/**
- * Collections of stubs, spies and mocks.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    var push = [].push;
-    var hasOwnProperty = Object.prototype.hasOwnProperty;
-
-    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);
-        }
-    }
-
-    function makeApi(sinon) {
-        var collection = {
-            verify: function resolve() {
-                each(this, "verify");
-            },
-
-            restore: function restore() {
-                each(this, "restore");
-                compact(this);
-            },
-
-            reset: function restore() {
-                each(this, "reset");
-            },
-
-            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;
-            }
-        };
-
-        sinon.collection = collection;
-        return collection;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./mock");
-        require("./spy");
-        require("./stub");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/*global lolex */
-
-/**
- * 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) {
-    function makeApi(sinon, lol) {
-        var llx = typeof lolex !== "undefined" ? lolex : lol;
-
-        sinon.useFakeTimers = function () {
-            var now, methods = Array.prototype.slice.call(arguments);
-
-            if (typeof methods[0] === "string") {
-                now = 0;
-            } else {
-                now = methods.shift();
-            }
-
-            var clock = llx.install(now || 0, methods);
-            clock.restore = clock.uninstall;
-            return clock;
-        };
-
-        sinon.clock = {
-            create: function (now) {
-                return llx.createClock(now);
-            }
-        };
-
-        sinon.timers = {
-            setTimeout: setTimeout,
-            clearTimeout: clearTimeout,
-            setImmediate: (typeof setImmediate !== "undefined" ? setImmediate : undefined),
-            clearImmediate: (typeof clearImmediate !== "undefined" ? clearImmediate : undefined),
-            setInterval: setInterval,
-            clearInterval: clearInterval,
-            Date: Date
-        };
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, epxorts, module, lolex) {
-        var sinon = require("./core");
-        makeApi(sinon, lolex);
-        module.exports = sinon;
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module, require("lolex"));
-    } else {
-        makeApi(sinon);
-    }
-}(typeof global != "undefined" && typeof global !== "function" ? global : this));
-
-/**
- * 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;
-
-    function makeApi(sinon) {
-        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.ProgressEvent = function ProgressEvent(type, progressEventRaw, target) {
-            this.initEvent(type, false, false, target);
-            this.loaded = progressEventRaw.loaded || null;
-            this.total = progressEventRaw.total || null;
-            this.lengthComputable = !!progressEventRaw.total;
-        };
-
-        sinon.ProgressEvent.prototype = new sinon.Event();
-
-        sinon.ProgressEvent.prototype.constructor =  sinon.ProgressEvent;
-
-        sinon.CustomEvent = function CustomEvent(type, customData, target) {
-            this.initEvent(type, false, false, target);
-            this.detail = customData.detail || null;
-        };
-
-        sinon.CustomEvent.prototype = new sinon.Event();
-
-        sinon.CustomEvent.prototype.constructor =  sinon.CustomEvent;
-
-        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;
-            }
-        };
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require) {
-        var sinon = require("./core");
-        makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require);
-    } else {
-        makeApi(sinon);
-    }
-}());
-
-/**
- * @depend util/core.js
- */
-/**
- * Logs errors
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2014 Christian Johansen
- */
-
-(function (sinon) {
-    // cache a reference to setTimeout, so that our reference won't be stubbed out
-    // when using fake timers and errors will still get logged
-    // https://github.com/cjohansen/Sinon.JS/issues/381
-    var realSetTimeout = setTimeout;
-
-    function makeApi(sinon) {
-
-        function log() {}
-
-        function logError(label, err) {
-            var msg = label + " threw exception: ";
-
-            sinon.log(msg + "[" + err.name + "] " + err.message);
-
-            if (err.stack) {
-                sinon.log(err.stack);
-            }
-
-            logError.setTimeout(function () {
-                err.message = msg + err.message;
-                throw err;
-            }, 0);
-        };
-
-        // wrap realSetTimeout with something we can stub in tests
-        logError.setTimeout = function (func, timeout) {
-            realSetTimeout(func, timeout);
-        }
-
-        var exports = {};
-        exports.log = sinon.log = log;
-        exports.logError = sinon.logError = logError;
-
-        return exports;
-    }
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        module.exports = makeApi(sinon);
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend core.js
- * @depend ../extend.js
- * @depend event.js
- * @depend ../log_error.js
- */
-/**
- * Fake XDomainRequest object
- */
-
-if (typeof sinon == "undefined") {
-    this.sinon = {};
-}
-
-// wrapper for global
-(function (global) {
-    var xdr = { XDomainRequest: global.XDomainRequest };
-    xdr.GlobalXDomainRequest = global.XDomainRequest;
-    xdr.supportsXDR = typeof xdr.GlobalXDomainRequest != "undefined";
-    xdr.workingXDR = xdr.supportsXDR ? xdr.GlobalXDomainRequest :  false;
-
-    function makeApi(sinon) {
-        sinon.xdr = xdr;
-
-        function FakeXDomainRequest() {
-            this.readyState = FakeXDomainRequest.UNSENT;
-            this.requestBody = null;
-            this.requestHeaders = {};
-            this.status = 0;
-            this.timeout = null;
-
-            if (typeof FakeXDomainRequest.onCreate == "function") {
-                FakeXDomainRequest.onCreate(this);
-            }
-        }
-
-        function verifyState(xdr) {
-            if (xdr.readyState !== FakeXDomainRequest.OPENED) {
-                throw new Error("INVALID_STATE_ERR");
-            }
-
-            if (xdr.sendFlag) {
-                throw new Error("INVALID_STATE_ERR");
-            }
-        }
-
-        function verifyRequestSent(xdr) {
-            if (xdr.readyState == FakeXDomainRequest.UNSENT) {
-                throw new Error("Request not sent");
-            }
-            if (xdr.readyState == FakeXDomainRequest.DONE) {
-                throw new Error("Request done");
-            }
-        }
-
-        function verifyResponseBodyType(body) {
-            if (typeof body != "string") {
-                var error = new Error("Attempted to respond to fake XDomainRequest with " +
-                                    body + ", which is not a string.");
-                error.name = "InvalidBodyException";
-                throw error;
-            }
-        }
-
-        sinon.extend(FakeXDomainRequest.prototype, sinon.EventTarget, {
-            open: function open(method, url) {
-                this.method = method;
-                this.url = url;
-
-                this.responseText = null;
-                this.sendFlag = false;
-
-                this.readyStateChange(FakeXDomainRequest.OPENED);
-            },
-
-            readyStateChange: function readyStateChange(state) {
-                this.readyState = state;
-                var eventName = "";
-                switch (this.readyState) {
-                case FakeXDomainRequest.UNSENT:
-                    break;
-                case FakeXDomainRequest.OPENED:
-                    break;
-                case FakeXDomainRequest.LOADING:
-                    if (this.sendFlag) {
-                        //raise the progress event
-                        eventName = "onprogress";
-                    }
-                    break;
-                case FakeXDomainRequest.DONE:
-                    if (this.isTimeout) {
-                        eventName = "ontimeout"
-                    } else if (this.errorFlag || (this.status < 200 || this.status > 299)) {
-                        eventName = "onerror";
-                    } else {
-                        eventName = "onload"
-                    }
-                    break;
-                }
-
-                // raising event (if defined)
-                if (eventName) {
-                    if (typeof this[eventName] == "function") {
-                        try {
-                            this[eventName]();
-                        } catch (e) {
-                            sinon.logError("Fake XHR " + eventName + " handler", e);
-                        }
-                    }
-                }
-            },
-
-            send: function send(data) {
-                verifyState(this);
-
-                if (!/^(get|head)$/i.test(this.method)) {
-                    this.requestBody = data;
-                }
-                this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8";
-
-                this.errorFlag = false;
-                this.sendFlag = true;
-                this.readyStateChange(FakeXDomainRequest.OPENED);
-
-                if (typeof this.onSend == "function") {
-                    this.onSend(this);
-                }
-            },
-
-            abort: function abort() {
-                this.aborted = true;
-                this.responseText = null;
-                this.errorFlag = true;
-
-                if (this.readyState > sinon.FakeXDomainRequest.UNSENT && this.sendFlag) {
-                    this.readyStateChange(sinon.FakeXDomainRequest.DONE);
-                    this.sendFlag = false;
-                }
-            },
-
-            setResponseBody: function setResponseBody(body) {
-                verifyRequestSent(this);
-                verifyResponseBodyType(body);
-
-                var chunkSize = this.chunkSize || 10;
-                var index = 0;
-                this.responseText = "";
-
-                do {
-                    this.readyStateChange(FakeXDomainRequest.LOADING);
-                    this.responseText += body.substring(index, index + chunkSize);
-                    index += chunkSize;
-                } while (index < body.length);
-
-                this.readyStateChange(FakeXDomainRequest.DONE);
-            },
-
-            respond: function respond(status, contentType, body) {
-                // content-type ignored, since XDomainRequest does not carry this
-                // we keep the same syntax for respond(...) as for FakeXMLHttpRequest to ease
-                // test integration across browsers
-                this.status = typeof status == "number" ? status : 200;
-                this.setResponseBody(body || "");
-            },
-
-            simulatetimeout: function simulatetimeout() {
-                this.status = 0;
-                this.isTimeout = true;
-                // Access to this should actually throw an error
-                this.responseText = undefined;
-                this.readyStateChange(FakeXDomainRequest.DONE);
-            }
-        });
-
-        sinon.extend(FakeXDomainRequest, {
-            UNSENT: 0,
-            OPENED: 1,
-            LOADING: 3,
-            DONE: 4
-        });
-
-        sinon.useFakeXDomainRequest = function useFakeXDomainRequest() {
-            sinon.FakeXDomainRequest.restore = function restore(keepOnCreate) {
-                if (xdr.supportsXDR) {
-                    global.XDomainRequest = xdr.GlobalXDomainRequest;
-                }
-
-                delete sinon.FakeXDomainRequest.restore;
-
-                if (keepOnCreate !== true) {
-                    delete sinon.FakeXDomainRequest.onCreate;
-                }
-            };
-            if (xdr.supportsXDR) {
-                global.XDomainRequest = sinon.FakeXDomainRequest;
-            }
-            return sinon.FakeXDomainRequest;
-        };
-
-        sinon.FakeXDomainRequest = FakeXDomainRequest;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./core");
-        require("../extend");
-        require("./event");
-        require("../log_error");
-        makeApi(sinon);
-        module.exports = sinon;
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else {
-        makeApi(sinon);
-    }
-})(typeof global !== "undefined" ? global : self);
-
-/**
- * @depend core.js
- * @depend ../extend.js
- * @depend event.js
- * @depend ../log_error.js
- */
-/**
- * Fake XMLHttpRequest object
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (global) {
-
-    var supportsProgress = typeof ProgressEvent !== "undefined";
-    var supportsCustomEvent = typeof CustomEvent !== "undefined";
-    var supportsFormData = typeof FormData !== "undefined";
-    var sinonXhr = { XMLHttpRequest: global.XMLHttpRequest };
-    sinonXhr.GlobalXMLHttpRequest = global.XMLHttpRequest;
-    sinonXhr.GlobalActiveXObject = global.ActiveXObject;
-    sinonXhr.supportsActiveX = typeof sinonXhr.GlobalActiveXObject != "undefined";
-    sinonXhr.supportsXHR = typeof sinonXhr.GlobalXMLHttpRequest != "undefined";
-    sinonXhr.workingXHR = sinonXhr.supportsXHR ? sinonXhr.GlobalXMLHttpRequest : sinonXhr.supportsActiveX
-                                     ? function () {
-                                        return new sinonXhr.GlobalActiveXObject("MSXML2.XMLHTTP.3.0")
-                                    } : false;
-    sinonXhr.supportsCORS = sinonXhr.supportsXHR && "withCredentials" in (new sinonXhr.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 (sinonXhr.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.call(this, 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 addEventListener(event, listener) {
-        this.eventListeners[event].push(listener);
-    };
-
-    UploadProgress.prototype.removeEventListener = function removeEventListener(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 dispatchEvent(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");
-        }
-    }
-
-    function getHeader(headers, header) {
-        header = header.toLowerCase();
-
-        for (var h in headers) {
-            if (h.toLowerCase() == header) {
-                return h;
-            }
-        }
-
-        return null;
-    }
-
-    // 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 addFilter(fn) {
-        this.filters.push(fn)
-    };
-    var IE6Re = /MSIE 6/;
-    FakeXMLHttpRequest.defake = function defake(fakeXhr, xhrArgs) {
-        var xhr = new sinonXhr.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 stateChange() {
-            fakeXhr.readyState = xhr.readyState;
-            if (xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) {
-                copyAttrs(["status", "statusText"]);
-            }
-            if (xhr.readyState >= FakeXMLHttpRequest.LOADING) {
-                copyAttrs(["responseText", "response"]);
-            }
-            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 verifyRequestOpened(xhr) {
-        if (xhr.readyState != FakeXMLHttpRequest.OPENED) {
-            throw new Error("INVALID_STATE_ERR - " + xhr.readyState);
-        }
-    }
-
-    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;
-        }
-    }
-
-    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",
-        207: "Multi-Status",
-        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"
-    };
-
-    function makeApi(sinon) {
-        sinon.xhr = sinonXhr;
-
-        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 (FakeXMLHttpRequest.useFilters === true) {
-                    var xhrArgs = arguments;
-                    var defake = some(FakeXMLHttpRequest.filters, function (filter) {
-                        return filter.apply(this, xhrArgs)
-                    });
-                    if (defake) {
-                        return 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);
-                    }
-                }
-
-                switch (this.readyState) {
-                    case FakeXMLHttpRequest.DONE:
-                        if (supportsProgress) {
-                            this.upload.dispatchEvent(new sinon.ProgressEvent("progress", {loaded: 100, total: 100}));
-                            this.dispatchEvent(new sinon.ProgressEvent("progress", {loaded: 100, total: 100}));
-                        }
-                        this.upload.dispatchEvent(new sinon.Event("load", false, false, this));
-                        this.dispatchEvent(new sinon.Event("load", false, false, this));
-                        this.dispatchEvent(new sinon.Event("loadend", false, false, this));
-                        break;
-                }
-
-                this.dispatchEvent(new sinon.Event("readystatechange"));
-            },
-
-            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) {
-                verifyRequestOpened(this);
-                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)) {
-                    var contentType = getHeader(this.requestHeaders, "Content-Type");
-                    if (this.requestHeaders[contentType]) {
-                        var value = this.requestHeaders[contentType].split(";");
-                        this.requestHeaders[contentType] = value[0] + ";charset=utf-8";
-                    } else if (supportsFormData && !(data instanceof FormData)) {
-                        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 = {};
-                this.responseHeaders = {};
-
-                if (this.readyState > FakeXMLHttpRequest.UNSENT && this.sendFlag) {
-                    this.readyStateChange(FakeXMLHttpRequest.DONE);
-                    this.sendFlag = false;
-                }
-
-                this.readyState = 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 = getHeader(this.responseHeaders, header);
-
-                return this.responseHeaders[header] || 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
-                    }
-                }
-
-                this.readyStateChange(FakeXMLHttpRequest.DONE);
-            },
-
-            respond: function respond(status, headers, body) {
-                this.status = typeof status == "number" ? status : 200;
-                this.statusText = FakeXMLHttpRequest.statusCodes[this.status];
-                this.setResponseHeaders(headers || {});
-                this.setResponseBody(body || "");
-            },
-
-            uploadProgress: function uploadProgress(progressEventRaw) {
-                if (supportsProgress) {
-                    this.upload.dispatchEvent(new sinon.ProgressEvent("progress", progressEventRaw));
-                }
-            },
-
-            downloadProgress: function downloadProgress(progressEventRaw) {
-                if (supportsProgress) {
-                    this.dispatchEvent(new sinon.ProgressEvent("progress", progressEventRaw));
-                }
-            },
-
-            uploadError: function uploadError(error) {
-                if (supportsCustomEvent) {
-                    this.upload.dispatchEvent(new sinon.CustomEvent("error", {detail: error}));
-                }
-            }
-        });
-
-        sinon.extend(FakeXMLHttpRequest, {
-            UNSENT: 0,
-            OPENED: 1,
-            HEADERS_RECEIVED: 2,
-            LOADING: 3,
-            DONE: 4
-        });
-
-        sinon.useFakeXMLHttpRequest = function () {
-            FakeXMLHttpRequest.restore = function restore(keepOnCreate) {
-                if (sinonXhr.supportsXHR) {
-                    global.XMLHttpRequest = sinonXhr.GlobalXMLHttpRequest;
-                }
-
-                if (sinonXhr.supportsActiveX) {
-                    global.ActiveXObject = sinonXhr.GlobalActiveXObject;
-                }
-
-                delete FakeXMLHttpRequest.restore;
-
-                if (keepOnCreate !== true) {
-                    delete FakeXMLHttpRequest.onCreate;
-                }
-            };
-            if (sinonXhr.supportsXHR) {
-                global.XMLHttpRequest = FakeXMLHttpRequest;
-            }
-
-            if (sinonXhr.supportsActiveX) {
-                global.ActiveXObject = function ActiveXObject(objId) {
-                    if (objId == "Microsoft.XMLHTTP" || /^Msxml2\.XMLHTTP/i.test(objId)) {
-
-                        return new FakeXMLHttpRequest();
-                    }
-
-                    return new sinonXhr.GlobalActiveXObject(objId);
-                };
-            }
-
-            return FakeXMLHttpRequest;
-        };
-
-        sinon.FakeXMLHttpRequest = FakeXMLHttpRequest;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./core");
-        require("../extend");
-        require("./event");
-        require("../log_error");
-        makeApi(sinon);
-        module.exports = sinon;
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (typeof sinon === "undefined") {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-
-})(typeof global !== "undefined" ? global : self);
-
-/**
- * @depend fake_xdomain_request.js
- * @depend fake_xml_http_request.js
- * @depend ../format.js
- * @depend ../log_error.js
- */
-/**
- * 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 = {};
-}
-
-(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 makeApi(sinon) {
-        sinon.fakeServer = {
-            create: function () {
-                var server = create(this);
-                if (!sinon.xhr.supportsCORS) {
-                    this.xhr = sinon.useFakeXDomainRequest();
-                } else {
-                    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.respondImmediately) {
-                        server.respond();
-                    } else 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);
-                }
-            },
-
-            log: 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);
-            },
-
-            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, queue.length);
-                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) {
-                        this.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);
-            }
-        };
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./core");
-        require("./fake_xdomain_request");
-        require("./fake_xml_http_request");
-        require("../format");
-        makeApi(sinon);
-        module.exports = sinon;
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else {
-        makeApi(sinon);
-    }
-}());
-
-/**
- * @depend fake_server.js
- * @depend fake_timers.js
- */
-/**
- * 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 makeApi(sinon) {
-        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);
-        };
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require) {
-        var sinon = require("./core");
-        require("./fake_server");
-        require("./fake_timers");
-        makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require);
-    } else {
-        makeApi(sinon);
-    }
-}());
-
-/**
- * @depend util/core.js
- * @depend extend.js
- * @depend collection.js
- * @depend util/fake_timers.js
- * @depend util/fake_server_with_clock.js
- */
-/**
- * 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
- */
-
-(function () {
-    function makeApi(sinon) {
-        var push = [].push;
-
-        function exposeValue(sandbox, config, key, value) {
-            if (!value) {
-                return;
-            }
-
-            if (config.injectInto && !(key in config.injectInto)) {
-                config.injectInto[key] = value;
-                sandbox.injectedKeys.push(key);
-            } 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;
-                }
-
-                obj.match = sinon.match;
-
-                return obj;
-            },
-
-            restore: function () {
-                sinon.collection.restore.apply(this, arguments);
-                this.restoreContext();
-            },
-
-            restoreContext: function () {
-                if (this.injectedKeys) {
-                    for (var i = 0, j = this.injectedKeys.length; i < j; i++) {
-                        delete this.injectInto[this.injectedKeys[i]];
-                    }
-                    this.injectedKeys = [];
-                }
-            },
-
-            create: function (config) {
-                if (!config) {
-                    return sinon.create(sinon.sandbox);
-                }
-
-                var sandbox = prepareSandboxFromConfig(config);
-                sandbox.args = sandbox.args || [];
-                sandbox.injectedKeys = [];
-                sandbox.injectInto = config.injectInto;
-                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;
-            },
-
-            match: sinon.match
-        });
-
-        sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer;
-
-        return sinon.sandbox;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./extend");
-        require("./util/fake_server_with_clock");
-        require("./util/fake_timers");
-        require("./collection");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}());
-
-/**
- * @depend util/core.js
- * @depend sandbox.js
- */
-/**
- * Test function, sandboxes fakes
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    function makeApi(sinon) {
-        var slice = Array.prototype.slice;
-
-        function test(callback) {
-            var type = typeof callback;
-
-            if (type != "function") {
-                throw new TypeError("sinon.test needs to wrap a test function, got " + type);
-            }
-
-            function sinonSandboxedTest() {
-                var config = sinon.getConfig(sinon.config);
-                config.injectInto = config.injectIntoThis && this || config.injectInto;
-                var sandbox = sinon.sandbox.create(config);
-                var args = slice.call(arguments);
-                var oldDone = args.length && args[args.length - 1];
-                var exception, result;
-
-                if (typeof oldDone == "function") {
-                    args[args.length - 1] = function sinonDone(result) {
-                        if (result) {
-                            sandbox.restore();
-                            throw exception;
-                        } else {
-                            sandbox.verifyAndRestore();
-                        }
-                        oldDone(result);
-                    };
-                }
-
-                try {
-                    result = callback.apply(this, args.concat(sandbox.args));
-                } catch (e) {
-                    exception = e;
-                }
-
-                if (typeof oldDone != "function") {
-                    if (typeof exception !== "undefined") {
-                        sandbox.restore();
-                        throw exception;
-                    } else {
-                        sandbox.verifyAndRestore();
-                    }
-                }
-
-                return result;
-            }
-
-            if (callback.length) {
-                return function sinonAsyncSandboxedTest(callback) {
-                    return sinonSandboxedTest.apply(this, arguments);
-                };
-            }
-
-            return sinonSandboxedTest;
-        }
-
-        test.config = {
-            injectIntoThis: true,
-            injectInto: null,
-            properties: ["spy", "stub", "mock", "clock", "server", "requests"],
-            useFakeTimers: true,
-            useFakeServer: true
-        };
-
-        sinon.test = test;
-        return test;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./sandbox");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (sinon) {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend util/core.js
- * @depend test.js
- */
-/**
- * Test case, sandboxes all test functions
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    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 makeApi(sinon) {
-        function testCase(tests, prefix) {
-            if (!tests || typeof tests != "object") {
-                throw new TypeError("sinon.testCase needs an object with test functions");
-            }
-
-            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) && !/^(setUp|tearDown)$/.test(testName)) {
-                    property = tests[testName];
-
-                    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;
-        }
-
-        sinon.testCase = testCase;
-        return testCase;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./test");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend times_in_words.js
- * @depend util/core.js
- * @depend match.js
- * @depend format.js
- */
-/**
- * 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 slice = Array.prototype.slice;
-
-    function makeApi(sinon) {
-        var assert;
-
-        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 (method.proxy && method.proxy.isSinonProxy) {
-                    verifyIsStub(method.proxy);
-                } else {
-                    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 || fake.proxy.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 != "expose" && (includeFail || !/^(fail)/.test(method))) {
-                        target[exposedName(prefix, method)] = this[method];
-                    }
-                }
-
-                return target;
-            },
-
-            match: function match(actual, expectation) {
-                var matcher = sinon.match(expectation);
-                if (matcher.test(actual)) {
-                    assert.pass("match");
-                } else {
-                    var formatted = [
-                        "expected value to match",
-                        "    expected = " + sinon.format(expectation),
-                        "    actual = " + sinon.format(actual)
-                    ]
-                    failAssertion(this, formatted.join("\n"));
-                }
-            }
-        };
-
-        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");
-
-        sinon.assert = assert;
-        return assert;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./match");
-        require("./format");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-
-}(typeof sinon == "object" && sinon || null, typeof window != "undefined" ? window : (typeof self != "undefined") ? self : global));
-
-  return sinon;
-}));
diff --git a/resources/lib/sinonjs/sinon-1.15.4.js b/resources/lib/sinonjs/sinon-1.15.4.js
new file mode 100644 (file)
index 0000000..20bc9e2
--- /dev/null
@@ -0,0 +1,5949 @@
+/**
+ * Sinon.JS 1.15.4, 2015/06/27
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS
+ *
+ * (The BSD License)
+ * 
+ * Copyright (c) 2010-2014, 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.
+ */
+
+(function (root, factory) {
+  'use strict';
+  if (typeof define === 'function' && define.amd) {
+    define('sinon', [], function () {
+      return (root.sinon = factory());
+    });
+  } else if (typeof exports === 'object') {
+    module.exports = factory();
+  } else {
+    root.sinon = factory();
+  }
+}(this, function () {
+  'use strict';
+  var samsam, formatio, lolex;
+  (function () {
+                function define(mod, deps, fn) {
+                  if (mod == "samsam") {
+                    samsam = deps();
+                  } else if (typeof deps === "function" && mod.length === 0) {
+                    lolex = deps();
+                  } else if (typeof fn === "function") {
+                    formatio = fn(samsam);
+                  }
+                }
+    define.amd = {};
+((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 (getClass(object) === 'Arguments') { return true; }
+        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 (typeof(matcher) === "undefined") {
+            return typeof(object) === "undefined";
+        }
+
+        if (matcher === null) {
+            return object === null;
+        }
+
+        if (getClass(object) === "Array" && getClass(matcher) === "Array") {
+            return arrayContains(object, matcher);
+        }
+
+        if (matcher && typeof matcher === "object") {
+            if (matcher === object) {
+                return true;
+            }
+            var prop;
+            for (prop in matcher) {
+                var value = object[prop];
+                if (typeof value === "undefined" &&
+                        typeof object.getAttribute === "function") {
+                    value = object.getAttribute(prop);
+                }
+                if (matcher[prop] === null || typeof matcher[prop] === 'undefined') {
+                    if (value !== matcher[prop]) {
+                        return false;
+                    }
+                } else if (typeof  value === "undefined" || !match(value, 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,
+        limitChildrenCount: 0
+    };
+
+    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 pieces = [];
+        var i, l;
+        l = (this.limitChildrenCount > 0) ? 
+            Math.min(this.limitChildrenCount, array.length) : array.length;
+
+        for (i = 0; i < l; ++i) {
+            pieces.push(ascii(this, array[i], processed));
+        }
+
+        if(l < array.length)
+            pieces.push("[... " + (array.length - l) + " more elements]");
+
+        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, k, l;
+        l = (this.limitChildrenCount > 0) ? 
+            Math.min(this.limitChildrenCount, properties.length) : properties.length;
+
+        for (i = 0; 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, k = indent; i < k; ++i) { is += " "; }
+
+        if(l < properties.length)
+            pieces.push("[... " + (properties.length - l) + " more elements]");
+
+        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;
+});
+!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.lolex=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+(function (global){
+/*jslint eqeqeq: false, plusplus: false, evil: true, onevar: false, browser: true, forin: false*/
+/*global global*/
+/**
+ * @author Christian Johansen (christian@cjohansen.no) and contributors
+ * @license BSD
+ *
+ * Copyright (c) 2010-2014 Christian Johansen
+ */
+
+// node expects setTimeout/setInterval to return a fn object w/ .ref()/.unref()
+// browsers, a number.
+// see https://github.com/cjohansen/Sinon.JS/pull/436
+var timeoutResult = setTimeout(function() {}, 0);
+var addTimerReturnsObject = typeof timeoutResult === "object";
+clearTimeout(timeoutResult);
+
+var NativeDate = Date;
+var id = 1;
+
+/**
+ * Parse strings like "01:10:00" (meaning 1 hour, 10 minutes, 0 seconds) into
+ * number of milliseconds. This is used to support human-readable strings passed
+ * to clock.tick()
+ */
+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;
+}
+
+/**
+ * Used to grok the `now` parameter to createClock.
+ */
+function getEpoch(epoch) {
+    if (!epoch) { return 0; }
+    if (typeof epoch.getTime === "function") { return epoch.getTime(); }
+    if (typeof epoch === "number") { return epoch; }
+    throw new TypeError("now should be milliseconds since UNIX epoch");
+}
+
+function inRange(from, to, timer) {
+    return timer && timer.callAt >= from && timer.callAt <= to;
+}
+
+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;
+}
+
+function createDate() {
+    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 addTimer(clock, timer) {
+    if (typeof timer.func === "undefined") {
+        throw new Error("Callback must be provided to timer calls");
+    }
+
+    if (!clock.timers) {
+        clock.timers = {};
+    }
+
+    timer.id = id++;
+    timer.createdAt = clock.now;
+    timer.callAt = clock.now + (timer.delay || 0);
+
+    clock.timers[timer.id] = timer;
+
+    if (addTimerReturnsObject) {
+        return {
+            id: timer.id,
+            ref: function() {},
+            unref: function() {}
+        };
+    }
+    else {
+        return timer.id;
+    }
+}
+
+function firstTimerInRange(clock, from, to) {
+    var timers = clock.timers, timer = null;
+
+    for (var id in timers) {
+        if (!inRange(from, to, timers[id])) {
+            continue;
+        }
+
+        if (!timer || ~compareTimers(timer, timers[id])) {
+            timer = timers[id];
+        }
+    }
+
+    return timer;
+}
+
+function compareTimers(a, b) {
+    // Sort first by absolute timing
+    if (a.callAt < b.callAt) {
+        return -1;
+    }
+    if (a.callAt > b.callAt) {
+        return 1;
+    }
+
+    // Sort next by immediate, immediate timers take precedence
+    if (a.immediate && !b.immediate) {
+        return -1;
+    }
+    if (!a.immediate && b.immediate) {
+        return 1;
+    }
+
+    // Sort next by creation time, earlier-created timers take precedence
+    if (a.createdAt < b.createdAt) {
+        return -1;
+    }
+    if (a.createdAt > b.createdAt) {
+        return 1;
+    }
+
+    // Sort next by id, lower-id timers take precedence
+    if (a.id < b.id) {
+        return -1;
+    }
+    if (a.id > b.id) {
+        return 1;
+    }
+
+    // As timer ids are unique, no fallback `0` is necessary
+}
+
+function callTimer(clock, timer) {
+    if (typeof timer.interval == "number") {
+        clock.timers[timer.id].callAt += timer.interval;
+    } else {
+        delete clock.timers[timer.id];
+    }
+
+    try {
+        if (typeof timer.func == "function") {
+            timer.func.apply(null, timer.args);
+        } else {
+            eval(timer.func);
+        }
+    } catch (e) {
+        var exception = e;
+    }
+
+    if (!clock.timers[timer.id]) {
+        if (exception) {
+            throw exception;
+        }
+        return;
+    }
+
+    if (exception) {
+        throw exception;
+    }
+}
+
+function uninstall(clock, target) {
+    var method;
+
+    for (var i = 0, l = clock.methods.length; i < l; i++) {
+        method = clock.methods[i];
+
+        if (target[method].hadOwnProperty) {
+            target[method] = clock["_" + method];
+        } else {
+            try {
+                delete target[method];
+            } catch (e) {}
+        }
+    }
+
+    // Prevent multiple executions which will completely remove these props
+    clock.methods = [];
+}
+
+function hijackMethod(target, method, clock) {
+    clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(target, method);
+    clock["_" + method] = target[method];
+
+    if (method == "Date") {
+        var date = mirrorDateProperties(clock[method], target[method]);
+        target[method] = date;
+    } else {
+        target[method] = function () {
+            return clock[method].apply(clock, arguments);
+        };
+
+        for (var prop in clock[method]) {
+            if (clock[method].hasOwnProperty(prop)) {
+                target[method][prop] = clock[method][prop];
+            }
+        }
+    }
+
+    target[method].clock = clock;
+}
+
+var timers = {
+    setTimeout: setTimeout,
+    clearTimeout: clearTimeout,
+    setImmediate: (typeof setImmediate !== "undefined" ? setImmediate : undefined),
+    clearImmediate: (typeof clearImmediate !== "undefined" ? clearImmediate: undefined),
+    setInterval: setInterval,
+    clearInterval: clearInterval,
+    Date: Date
+};
+
+var keys = Object.keys || function (obj) {
+    var ks = [];
+    for (var key in obj) {
+        ks.push(key);
+    }
+    return ks;
+};
+
+exports.timers = timers;
+
+var createClock = exports.createClock = function (now) {
+    var clock = {
+        now: getEpoch(now),
+        timeouts: {},
+        Date: createDate()
+    };
+
+    clock.Date.clock = clock;
+
+    clock.setTimeout = function setTimeout(func, timeout) {
+        return addTimer(clock, {
+            func: func,
+            args: Array.prototype.slice.call(arguments, 2),
+            delay: timeout
+        });
+    };
+
+    clock.clearTimeout = function clearTimeout(timerId) {
+        if (!timerId) {
+            // null appears to be allowed in most browsers, and appears to be
+            // relied upon by some libraries, like Bootstrap carousel
+            return;
+        }
+        if (!clock.timers) {
+            clock.timers = [];
+        }
+        // in Node, timerId is an object with .ref()/.unref(), and
+        // its .id field is the actual timer id.
+        if (typeof timerId === "object") {
+            timerId = timerId.id
+        }
+        if (timerId in clock.timers) {
+            delete clock.timers[timerId];
+        }
+    };
+
+    clock.setInterval = function setInterval(func, timeout) {
+        return addTimer(clock, {
+            func: func,
+            args: Array.prototype.slice.call(arguments, 2),
+            delay: timeout,
+            interval: timeout
+        });
+    };
+
+    clock.clearInterval = function clearInterval(timerId) {
+        clock.clearTimeout(timerId);
+    };
+
+    clock.setImmediate = function setImmediate(func) {
+        return addTimer(clock, {
+            func: func,
+            args: Array.prototype.slice.call(arguments, 1),
+            immediate: true
+        });
+    };
+
+    clock.clearImmediate = function clearImmediate(timerId) {
+        clock.clearTimeout(timerId);
+    };
+
+    clock.tick = function tick(ms) {
+        ms = typeof ms == "number" ? ms : parseTime(ms);
+        var tickFrom = clock.now, tickTo = clock.now + ms, previous = clock.now;
+        var timer = firstTimerInRange(clock, tickFrom, tickTo);
+
+        var firstException;
+        while (timer && tickFrom <= tickTo) {
+            if (clock.timers[timer.id]) {
+                tickFrom = clock.now = timer.callAt;
+                try {
+                    callTimer(clock, timer);
+                } catch (e) {
+                    firstException = firstException || e;
+                }
+            }
+
+            timer = firstTimerInRange(clock, previous, tickTo);
+            previous = tickFrom;
+        }
+
+        clock.now = tickTo;
+
+        if (firstException) {
+            throw firstException;
+        }
+
+        return clock.now;
+    };
+
+    clock.reset = function reset() {
+        clock.timers = {};
+    };
+
+    return clock;
+};
+
+exports.install = function install(target, now, toFake) {
+    if (typeof target === "number") {
+        toFake = now;
+        now = target;
+        target = null;
+    }
+
+    if (!target) {
+        target = global;
+    }
+
+    var clock = createClock(now);
+
+    clock.uninstall = function () {
+        uninstall(clock, target);
+    };
+
+    clock.methods = toFake || [];
+
+    if (clock.methods.length === 0) {
+        clock.methods = keys(timers);
+    }
+
+    for (var i = 0, l = clock.methods.length; i < l; i++) {
+        hijackMethod(target, clock.methods[i], clock);
+    }
+
+    return clock;
+};
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}]},{},[1])(1)
+});
+  })();
+  var define;
+/**
+ * Sinon core utilities. For internal use only.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+var sinon = (function () {
+"use strict";
+
+    var sinon;
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        sinon = module.exports = require("./sinon/util/core");
+        require("./sinon/extend");
+        require("./sinon/typeOf");
+        require("./sinon/times_in_words");
+        require("./sinon/spy");
+        require("./sinon/call");
+        require("./sinon/behavior");
+        require("./sinon/stub");
+        require("./sinon/mock");
+        require("./sinon/collection");
+        require("./sinon/assert");
+        require("./sinon/sandbox");
+        require("./sinon/test");
+        require("./sinon/test_case");
+        require("./sinon/match");
+        require("./sinon/format");
+        require("./sinon/log_error");
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+        sinon = module.exports;
+    } else {
+        sinon = {};
+    }
+
+    return sinon;
+}());
+
+/**
+ * @depend ../../sinon.js
+ */
+/**
+ * Sinon core utilities. For internal use only.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    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 isReallyNaN(val) {
+        return typeof val === "number" && isNaN(val);
+    }
+
+    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;
+    }
+
+    // Cheap way to detect if we have ES5 support.
+    var hasES5Support = "keys" in Object;
+
+    function makeApi(sinon) {
+        sinon.wrapMethod = function wrapMethod(object, property, method) {
+            if (!object) {
+                throw new TypeError("Should wrap property of object");
+            }
+
+            if (typeof method != "function" && typeof method != "object") {
+                throw new TypeError("Method wrapper should be a function or a property descriptor");
+            }
+
+            function checkWrappedMethod(wrappedMethod) {
+                if (!isFunction(wrappedMethod)) {
+                    error = new TypeError("Attempted to wrap " + (typeof wrappedMethod) + " property " +
+                                        property + " as function");
+                } else if (wrappedMethod.restore && wrappedMethod.restore.sinon) {
+                    error = new TypeError("Attempted to wrap " + property + " which is already wrapped");
+                } else 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 && wrappedMethod.stackTrace) {
+                        error.stack += "\n--------------\n" + wrappedMethod.stackTrace;
+                    }
+                    throw error;
+                }
+            }
+
+            var error, wrappedMethod;
+
+            // 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);
+
+            if (hasES5Support) {
+                var methodDesc = (typeof method == "function") ? {value: method} : method,
+                    wrappedMethodDesc = sinon.getPropertyDescriptor(object, property),
+                    i;
+
+                if (!wrappedMethodDesc) {
+                    error = new TypeError("Attempted to wrap " + (typeof wrappedMethod) + " property " +
+                                        property + " as function");
+                } else if (wrappedMethodDesc.restore && wrappedMethodDesc.restore.sinon) {
+                    error = new TypeError("Attempted to wrap " + property + " which is already wrapped");
+                }
+                if (error) {
+                    if (wrappedMethodDesc && wrappedMethodDesc.stackTrace) {
+                        error.stack += "\n--------------\n" + wrappedMethodDesc.stackTrace;
+                    }
+                    throw error;
+                }
+
+                var types = sinon.objectKeys(methodDesc);
+                for (i = 0; i < types.length; i++) {
+                    wrappedMethod = wrappedMethodDesc[types[i]];
+                    checkWrappedMethod(wrappedMethod);
+                }
+
+                mirrorProperties(methodDesc, wrappedMethodDesc);
+                for (i = 0; i < types.length; i++) {
+                    mirrorProperties(methodDesc[types[i]], wrappedMethodDesc[types[i]]);
+                }
+                Object.defineProperty(object, property, methodDesc);
+            } else {
+                wrappedMethod = object[property];
+                checkWrappedMethod(wrappedMethod);
+                object[property] = method;
+                method.displayName = property;
+            }
+
+            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.stackTrace = (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) {
+                    // In some cases `delete` may throw an error
+                    try {
+                        delete object[property];
+                    } catch (e) {}
+                    // For native code functions `delete` fails without throwing an error
+                    // on Chrome < 43, PhantomJS, etc.
+                } else if (hasES5Support) {
+                    Object.defineProperty(object, property, wrappedMethodDesc);
+                }
+
+                // Use strict equality comparison to check failures then force a reset
+                // via direct assignment.
+                if (object[property] === method) {
+                    object[property] = wrappedMethod;
+                }
+            };
+
+            method.restore.sinon = true;
+
+            if (!hasES5Support) {
+                mirrorProperties(method, wrappedMethod);
+            }
+
+            return method;
+        };
+
+        sinon.create = function create(proto) {
+            var F = function () {};
+            F.prototype = proto;
+            return new F();
+        };
+
+        sinon.deepEqual = function deepEqual(a, b) {
+            if (sinon.match && sinon.match.isMatcher(a)) {
+                return a.test(b);
+            }
+
+            if (typeof a != "object" || typeof b != "object") {
+                if (isReallyNaN(a) && isReallyNaN(b)) {
+                    return true;
+                } else {
+                    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;
+            }
+
+            if (a instanceof RegExp && b instanceof RegExp) {
+                return (a.source === b.source) && (a.global === b.global) &&
+                    (a.ignoreCase === b.ignoreCase) && (a.multiline === b.multiline);
+            }
+
+            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 (!(prop in b)) {
+                    return false;
+                }
+
+                if (!deepEqual(a[prop], b[prop])) {
+                    return false;
+                }
+            }
+
+            for (prop in b) {
+                bLength += 1;
+            }
+
+            return aLength == bLength;
+        };
+
+        sinon.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;
+        };
+
+        sinon.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";
+        };
+
+        sinon.objectKeys = function objectKeys(obj) {
+            if (obj !== Object(obj)) {
+                throw new TypeError("sinon.objectKeys called on a non-object");
+            }
+
+            var keys = [];
+            var key;
+            for (key in obj) {
+                if (hasOwn.call(obj, key)) {
+                    keys.push(key);
+                }
+            }
+
+            return keys;
+        };
+
+        sinon.getPropertyDescriptor = function getPropertyDescriptor(object, property) {
+            var proto = object, descriptor;
+            while (proto && !(descriptor = Object.getOwnPropertyDescriptor(proto, property))) {
+                proto = Object.getPrototypeOf(proto);
+            }
+            return descriptor;
+        }
+
+        sinon.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;
+        };
+
+        sinon.defaultConfig = {
+            injectIntoThis: true,
+            injectInto: null,
+            properties: ["spy", "stub", "mock", "clock", "server", "requests"],
+            useFakeTimers: true,
+            useFakeServer: true
+        };
+
+        sinon.timesInWords = function timesInWords(count) {
+            return count == 1 && "once" ||
+                count == 2 && "twice" ||
+                count == 3 && "thrice" ||
+                (count || 0) + " times";
+        };
+
+        sinon.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;
+        };
+
+        sinon.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;
+            });
+        };
+
+        sinon.createStubInstance = function (constructor) {
+            if (typeof constructor !== "function") {
+                throw new TypeError("The constructor should be a function.");
+            }
+            return sinon.stub(sinon.create(constructor.prototype));
+        };
+
+        sinon.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();
+            }
+        };
+
+        return sinon;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports) {
+        makeApi(exports);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports);
+    } else if (!sinon) {
+        return;
+    } else {
+        makeApi(sinon);
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend util/core.js
+ */
+
+(function (sinon) {
+    function makeApi(sinon) {
+
+        // Adapted from https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug
+        var hasDontEnumBug = (function () {
+            var obj = {
+                constructor: function () {
+                    return "0";
+                },
+                toString: function () {
+                    return "1";
+                },
+                valueOf: function () {
+                    return "2";
+                },
+                toLocaleString: function () {
+                    return "3";
+                },
+                prototype: function () {
+                    return "4";
+                },
+                isPrototypeOf: function () {
+                    return "5";
+                },
+                propertyIsEnumerable: function () {
+                    return "6";
+                },
+                hasOwnProperty: function () {
+                    return "7";
+                },
+                length: function () {
+                    return "8";
+                },
+                unique: function () {
+                    return "9"
+                }
+            };
+
+            var result = [];
+            for (var prop in obj) {
+                result.push(obj[prop]());
+            }
+            return result.join("") !== "0123456789";
+        })();
+
+        /* Public: Extend target in place with all (own) properties from sources in-order. Thus, last source will
+         *         override properties in previous sources.
+         *
+         * target - The Object to extend
+         * sources - Objects to copy properties from.
+         *
+         * Returns the extended target
+         */
+        function extend(target /*, sources */) {
+            var sources = Array.prototype.slice.call(arguments, 1),
+                source, i, prop;
+
+            for (i = 0; i < sources.length; i++) {
+                source = sources[i];
+
+                for (prop in source) {
+                    if (source.hasOwnProperty(prop)) {
+                        target[prop] = source[prop];
+                    }
+                }
+
+                // Make sure we copy (own) toString method even when in JScript with DontEnum bug
+                // See https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug
+                if (hasDontEnumBug && source.hasOwnProperty("toString") && source.toString !== target.toString) {
+                    target.toString = source.toString;
+                }
+            }
+
+            return target;
+        };
+
+        sinon.extend = extend;
+        return sinon.extend;
+    }
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        module.exports = makeApi(sinon);
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else if (!sinon) {
+        return;
+    } else {
+        makeApi(sinon);
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend util/core.js
+ */
+
+(function (sinon) {
+    function makeApi(sinon) {
+
+        function timesInWords(count) {
+            switch (count) {
+                case 1:
+                    return "once";
+                case 2:
+                    return "twice";
+                case 3:
+                    return "thrice";
+                default:
+                    return (count || 0) + " times";
+            }
+        }
+
+        sinon.timesInWords = timesInWords;
+        return sinon.timesInWords;
+    }
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        module.exports = makeApi(sinon);
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else if (!sinon) {
+        return;
+    } else {
+        makeApi(sinon);
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend util/core.js
+ */
+/**
+ * Format functions
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2014 Christian Johansen
+ */
+
+(function (sinon, formatio) {
+    function makeApi(sinon) {
+        function typeOf(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();
+        };
+
+        sinon.typeOf = typeOf;
+        return sinon.typeOf;
+    }
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        module.exports = makeApi(sinon);
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else if (!sinon) {
+        return;
+    } else {
+        makeApi(sinon);
+    }
+}(
+    (typeof sinon == "object" && sinon || null),
+    (typeof formatio == "object" && formatio)
+));
+
+/**
+ * @depend util/core.js
+ * @depend typeOf.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) {
+    function makeApi(sinon) {
+        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 (!arguments.length) {
+                throw new TypeError("Matcher expected");
+            } else if (!isMatcher(m2)) {
+                m2 = match(m2);
+            }
+            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 (!arguments.length) {
+                throw new TypeError("Matcher expected");
+            } else if (!isMatcher(m2)) {
+                m2 = match(m2);
+            }
+            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");
+
+        sinon.match = match;
+        return match;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        require("./typeOf");
+        module.exports = makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else if (!sinon) {
+        return;
+    } else {
+        makeApi(sinon);
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend util/core.js
+ */
+/**
+ * Format functions
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2014 Christian Johansen
+ */
+
+(function (sinon, formatio) {
+    function makeApi(sinon) {
+        function valueFormatter(value) {
+            return "" + value;
+        }
+
+        function getFormatioFormatter() {
+            var formatter = formatio.configure({
+                    quoteStrings: false,
+                    limitChildrenCount: 250
+                });
+
+            function format() {
+                return formatter.ascii.apply(formatter, arguments);
+            };
+
+            return format;
+        }
+
+        function getNodeFormatter(value) {
+            function format(value) {
+                return typeof value == "object" && value.toString === Object.prototype.toString ? util.inspect(value) : value;
+            };
+
+            try {
+                var util = require("util");
+            } catch (e) {
+                /* Node, but no util module - would be very old, but better safe than sorry */
+            }
+
+            return util ? format : valueFormatter;
+        }
+
+        var isNode = typeof module !== "undefined" && module.exports && typeof require == "function",
+            formatter;
+
+        if (isNode) {
+            try {
+                formatio = require("formatio");
+            } catch (e) {}
+        }
+
+        if (formatio) {
+            formatter = getFormatioFormatter()
+        } else if (isNode) {
+            formatter = getNodeFormatter();
+        } else {
+            formatter = valueFormatter;
+        }
+
+        sinon.format = formatter;
+        return sinon.format;
+    }
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        module.exports = makeApi(sinon);
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else if (!sinon) {
+        return;
+    } else {
+        makeApi(sinon);
+    }
+}(
+    (typeof sinon == "object" && sinon || null),
+    (typeof formatio == "object" && formatio)
+));
+
+/**
+  * @depend util/core.js
+  * @depend match.js
+  * @depend format.js
+  */
+/**
+  * 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) {
+    function makeApi(sinon) {
+        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() {
+                var l = arguments.length;
+                if (l > this.args.length) {
+                    return false;
+                }
+                for (var i = 0; i < l; i += 1) {
+                    if (!sinon.deepEqual(arguments[i], this.args[i])) {
+                        return false;
+                    }
+                }
+
+                return true;
+            },
+
+            calledWithMatch: function calledWithMatch() {
+                var l = arguments.length;
+                if (l > this.args.length) {
+                    return false;
+                }
+                for (var i = 0; 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.proxy.prototype && 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
+
+        sinon.spyCall = createSpyCall;
+        return createSpyCall;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        require("./match");
+        require("./format");
+        module.exports = makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else if (!sinon) {
+        return;
+    } else {
+        makeApi(sinon);
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+  * @depend times_in_words.js
+  * @depend util/core.js
+  * @depend extend.js
+  * @depend call.js
+  * @depend format.js
+  */
+/**
+  * Spy functions
+  *
+  * @author Christian Johansen (christian@cjohansen.no)
+  * @license BSD
+  *
+  * Copyright (c) 2010-2013 Christian Johansen
+  */
+
+(function (sinon) {
+
+    function makeApi(sinon) {
+        var push = Array.prototype.push;
+        var slice = Array.prototype.slice;
+        var callId = 0;
+
+        function spy(object, property, types) {
+            if (!property && typeof object == "function") {
+                return spy.create(object);
+            }
+
+            if (!object && !property) {
+                return spy.create(function () { });
+            }
+
+            if (types) {
+                var methodDesc = sinon.getPropertyDescriptor(object, property);
+                for (var i = 0; i < types.length; i++) {
+                    methodDesc[types[i]] = spy.create(methodDesc[types[i]]);
+                }
+                return sinon.wrapMethod(object, property, methodDesc);
+            } else {
+                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, proxyLength) {
+            // Retain the function length:
+            var p;
+            if (proxyLength) {
+                eval("p = (function proxy(" + vars.substring(0, proxyLength * 2 - 1) +
+                    ") { return p.invoke(func, this, slice.call(arguments)); });");
+            } else {
+                p = function proxy() {
+                    return p.invoke(func, this, slice.call(arguments));
+                };
+            }
+            p.isSinonProxy = true;
+            return p;
+        }
+
+        var uuid = 0;
+
+        // Public API
+        var spyApi = {
+            reset: function () {
+                if (this.invoking) {
+                    var err = new Error("Cannot reset Sinon function while invoking it. " +
+                                        "Move the call to .reset outside of the callback.");
+                    err.name = "InvalidResetException";
+                    throw err;
+                }
+
+                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();
+                    }
+                }
+
+                return this;
+            },
+
+            create: function create(func, spyLength) {
+                var name;
+
+                if (typeof func != "function") {
+                    func = function () { };
+                } else {
+                    name = sinon.functionName(func);
+                }
+
+                if (!spyLength) {
+                    spyLength = func.length;
+                }
+
+                var proxy = createProxy(func, spyLength);
+
+                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.instantiateFake = 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++);
+
+                // Make call properties available from within the spied function:
+                createCallProperties.call(this);
+
+                try {
+                    this.invoking = true;
+
+                    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;
+                } finally {
+                    delete this.invoking;
+                }
+
+                push.call(this.exceptions, exception);
+                push.call(this.returnValues, returnValue);
+
+                // Make return value and exception available in the calls:
+                createCallProperties.call(this);
+
+                if (exception !== undefined) {
+                    throw exception;
+                }
+
+                return returnValue;
+            },
+
+            named: function named(name) {
+                this.displayName = name;
+                return this;
+            },
+
+            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.instantiateFake();
+                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;
+        sinon.spy = spy;
+
+        return spy;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        require("./call");
+        require("./extend");
+        require("./times_in_words");
+        require("./format");
+        module.exports = makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else if (!sinon) {
+        return;
+    } else {
+        makeApi(sinon);
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend util/core.js
+ * @depend extend.js
+ */
+/**
+ * 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 slice = Array.prototype.slice;
+    var join = Array.prototype.join;
+    var useLeftMostCallback = -1;
+    var useRightMostCallback = -2;
+
+    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) {
+            return args[callArgAt];
+        }
+
+        var argumentList;
+
+        if (callArgAt === useLeftMostCallback) {
+            argumentList = args;
+        }
+
+        if (callArgAt === useRightMostCallback) {
+            argumentList = slice.call(args).reverse();
+        }
+
+        var callArgProp = behavior.callArgProp;
+
+        for (var i = 0, l = argumentList.length; i < l; ++i) {
+            if (!callArgProp && typeof argumentList[i] == "function") {
+                return argumentList[i];
+            }
+
+            if (callArgProp && argumentList[i] &&
+                typeof argumentList[i][callArgProp] == "function") {
+                return argumentList[i][callArgProp];
+            }
+        }
+
+        return null;
+    }
+
+    function makeApi(sinon) {
+        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);
+                }
+            }
+        }
+
+        var proto = {
+            create: function create(stub) {
+                var behavior = sinon.extend({}, sinon.behavior);
+                delete behavior.create;
+                behavior.stub = stub;
+
+                return behavior;
+            },
+
+            isPresent: function isPresent() {
+                return (typeof this.callArgAt == "number" ||
+                        this.exception ||
+                        typeof this.returnArgAt == "number" ||
+                        this.returnThis ||
+                        this.returnValueDefined);
+            },
+
+            invoke: function invoke(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 onCall(index) {
+                return this.stub.onCall(index);
+            },
+
+            onFirstCall: function onFirstCall() {
+                return this.stub.onFirstCall();
+            },
+
+            onSecondCall: function onSecondCall() {
+                return this.stub.onSecondCall();
+            },
+
+            onThirdCall: function onThirdCall() {
+                return this.stub.onThirdCall();
+            },
+
+            withArgs: function withArgs(/* 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 = useLeftMostCallback;
+                this.callbackArguments = slice.call(arguments, 0);
+                this.callbackContext = undefined;
+                this.callArgProp = undefined;
+                this.callbackAsync = false;
+
+                return this;
+            },
+
+            yieldsRight: function () {
+                this.callArgAt = useRightMostCallback;
+                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 = useLeftMostCallback;
+                this.callbackArguments = slice.call(arguments, 1);
+                this.callbackContext = context;
+                this.callArgProp = undefined;
+                this.callbackAsync = false;
+
+                return this;
+            },
+
+            yieldsTo: function (prop) {
+                this.callArgAt = useLeftMostCallback;
+                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 = useLeftMostCallback;
+                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);
+            }
+        }
+
+        sinon.behavior = proto;
+        return proto;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        require("./extend");
+        module.exports = makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else if (!sinon) {
+        return;
+    } else {
+        makeApi(sinon);
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend util/core.js
+ * @depend extend.js
+ * @depend spy.js
+ * @depend behavior.js
+ */
+/**
+ * Stub functions
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    function makeApi(sinon) {
+        function stub(object, property, func) {
+            if (!!func && typeof func != "function" && typeof func != "object") {
+                throw new TypeError("Custom stub should be a function or a property descriptor");
+            }
+
+            var wrapper;
+
+            if (func) {
+                if (typeof func == "function") {
+                    wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func;
+                } else {
+                    wrapper = func;
+                    if (sinon.spy && sinon.spy.create) {
+                        var types = sinon.objectKeys(wrapper);
+                        for (var i = 0; i < types.length; i++) {
+                            wrapper[types[i]] = sinon.spy.create(wrapper[types[i]]);
+                        }
+                    }
+                }
+            } else {
+                var stubLength = 0;
+                if (typeof object == "object" && typeof object[property] == "function") {
+                    stubLength = object[property].length;
+                }
+                wrapper = stub.create(stubLength);
+            }
+
+            if (!object && typeof property === "undefined") {
+                return sinon.stub.create();
+            }
+
+            if (typeof property === "undefined" && typeof object == "object") {
+                for (var prop in object) {
+                    if (typeof sinon.getPropertyDescriptor(object, prop).value === "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;
+
+        var proto = {
+            create: function create(stubLength) {
+                var functionStub = function () {
+                    return getCurrentBehavior(functionStub).invoke(this, arguments);
+                };
+
+                functionStub.id = "stub#" + uuid++;
+                var orig = functionStub;
+                functionStub = sinon.spy.create(functionStub, stubLength);
+                functionStub.func = orig;
+
+                sinon.extend(functionStub, stub);
+                functionStub.instantiateFake = 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 onCall(index) {
+                if (!this.behaviors[index]) {
+                    this.behaviors[index] = sinon.behavior.create(this);
+                }
+
+                return this.behaviors[index];
+            },
+
+            onFirstCall: function onFirstCall() {
+                return this.onCall(0);
+            },
+
+            onSecondCall: function onSecondCall() {
+                return this.onCall(1);
+            },
+
+            onThirdCall: function onThirdCall() {
+                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));
+            }
+        }
+
+        sinon.extend(stub, proto);
+        sinon.stub = stub;
+
+        return stub;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        require("./behavior");
+        require("./spy");
+        require("./extend");
+        module.exports = makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else if (!sinon) {
+        return;
+    } else {
+        makeApi(sinon);
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend times_in_words.js
+ * @depend util/core.js
+ * @depend call.js
+ * @depend extend.js
+ * @depend match.js
+ * @depend spy.js
+ * @depend stub.js
+ * @depend format.js
+ */
+/**
+ * Mock functions.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    function makeApi(sinon) {
+        var push = [].push;
+        var match = sinon.match;
+
+        function mock(object) {
+            // if (typeof console !== undefined && console.warn) {
+            //     console.warn("mock will be removed from Sinon.JS v2.0");
+            // }
+
+            if (!object) {
+                return sinon.expectation.create("Anonymous mock");
+            }
+
+            return mock.create(object);
+        }
+
+        function each(collection, callback) {
+            if (!collection) {
+                return;
+            }
+
+            for (var i = 0, l = collection.length; i < l; i += 1) {
+                callback(collection[i]);
+            }
+        }
+
+        sinon.extend(mock, {
+            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 if (met.length > 0) {
+                    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;
+        var slice = Array.prototype.slice;
+
+        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;
+            }
+        }
+
+        sinon.expectation = {
+            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 sinon.spy.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 pass(message) {
+                sinon.assert.pass(message);
+            },
+
+            fail: function fail(message) {
+                var exception = new Error(message);
+                exception.name = "ExpectationError";
+
+                throw exception;
+            }
+        };
+
+        sinon.mock = mock;
+        return mock;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        require("./times_in_words");
+        require("./call");
+        require("./extend");
+        require("./match");
+        require("./spy");
+        require("./stub");
+        require("./format");
+
+        module.exports = makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else if (!sinon) {
+        return;
+    } else {
+        makeApi(sinon);
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend util/core.js
+ * @depend spy.js
+ * @depend stub.js
+ * @depend mock.js
+ */
+/**
+ * Collections of stubs, spies and mocks.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    var push = [].push;
+    var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+    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);
+        }
+    }
+
+    function makeApi(sinon) {
+        var collection = {
+            verify: function resolve() {
+                each(this, "verify");
+            },
+
+            restore: function restore() {
+                each(this, "restore");
+                compact(this);
+            },
+
+            reset: function restore() {
+                each(this, "reset");
+            },
+
+            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;
+            }
+        };
+
+        sinon.collection = collection;
+        return collection;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        require("./mock");
+        require("./spy");
+        require("./stub");
+        module.exports = makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else if (!sinon) {
+        return;
+    } else {
+        makeApi(sinon);
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/*global lolex */
+
+/**
+ * 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) {
+    function makeApi(sinon, lol) {
+        var llx = typeof lolex !== "undefined" ? lolex : lol;
+
+        sinon.useFakeTimers = function () {
+            var now, methods = Array.prototype.slice.call(arguments);
+
+            if (typeof methods[0] === "string") {
+                now = 0;
+            } else {
+                now = methods.shift();
+            }
+
+            var clock = llx.install(now || 0, methods);
+            clock.restore = clock.uninstall;
+            return clock;
+        };
+
+        sinon.clock = {
+            create: function (now) {
+                return llx.createClock(now);
+            }
+        };
+
+        sinon.timers = {
+            setTimeout: setTimeout,
+            clearTimeout: clearTimeout,
+            setImmediate: (typeof setImmediate !== "undefined" ? setImmediate : undefined),
+            clearImmediate: (typeof clearImmediate !== "undefined" ? clearImmediate : undefined),
+            setInterval: setInterval,
+            clearInterval: clearInterval,
+            Date: Date
+        };
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, epxorts, module, lolex) {
+        var sinon = require("./core");
+        makeApi(sinon, lolex);
+        module.exports = sinon;
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module, require("lolex"));
+    } else {
+        makeApi(sinon);
+    }
+}(typeof global != "undefined" && typeof global !== "function" ? global : this));
+
+/**
+ * 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;
+
+    function makeApi(sinon) {
+        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.ProgressEvent = function ProgressEvent(type, progressEventRaw, target) {
+            this.initEvent(type, false, false, target);
+            this.loaded = progressEventRaw.loaded || null;
+            this.total = progressEventRaw.total || null;
+            this.lengthComputable = !!progressEventRaw.total;
+        };
+
+        sinon.ProgressEvent.prototype = new sinon.Event();
+
+        sinon.ProgressEvent.prototype.constructor =  sinon.ProgressEvent;
+
+        sinon.CustomEvent = function CustomEvent(type, customData, target) {
+            this.initEvent(type, false, false, target);
+            this.detail = customData.detail || null;
+        };
+
+        sinon.CustomEvent.prototype = new sinon.Event();
+
+        sinon.CustomEvent.prototype.constructor =  sinon.CustomEvent;
+
+        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;
+            }
+        };
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require) {
+        var sinon = require("./core");
+        makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require);
+    } else {
+        makeApi(sinon);
+    }
+}());
+
+/**
+ * @depend util/core.js
+ */
+/**
+ * Logs errors
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2014 Christian Johansen
+ */
+
+(function (sinon) {
+    // cache a reference to setTimeout, so that our reference won't be stubbed out
+    // when using fake timers and errors will still get logged
+    // https://github.com/cjohansen/Sinon.JS/issues/381
+    var realSetTimeout = setTimeout;
+
+    function makeApi(sinon) {
+
+        function log() {}
+
+        function logError(label, err) {
+            var msg = label + " threw exception: ";
+
+            sinon.log(msg + "[" + err.name + "] " + err.message);
+
+            if (err.stack) {
+                sinon.log(err.stack);
+            }
+
+            logError.setTimeout(function () {
+                err.message = msg + err.message;
+                throw err;
+            }, 0);
+        };
+
+        // wrap realSetTimeout with something we can stub in tests
+        logError.setTimeout = function (func, timeout) {
+            realSetTimeout(func, timeout);
+        }
+
+        var exports = {};
+        exports.log = sinon.log = log;
+        exports.logError = sinon.logError = logError;
+
+        return exports;
+    }
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        module.exports = makeApi(sinon);
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else if (!sinon) {
+        return;
+    } else {
+        makeApi(sinon);
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend core.js
+ * @depend ../extend.js
+ * @depend event.js
+ * @depend ../log_error.js
+ */
+/**
+ * Fake XDomainRequest object
+ */
+
+if (typeof sinon == "undefined") {
+    this.sinon = {};
+}
+
+// wrapper for global
+(function (global) {
+    var xdr = { XDomainRequest: global.XDomainRequest };
+    xdr.GlobalXDomainRequest = global.XDomainRequest;
+    xdr.supportsXDR = typeof xdr.GlobalXDomainRequest != "undefined";
+    xdr.workingXDR = xdr.supportsXDR ? xdr.GlobalXDomainRequest :  false;
+
+    function makeApi(sinon) {
+        sinon.xdr = xdr;
+
+        function FakeXDomainRequest() {
+            this.readyState = FakeXDomainRequest.UNSENT;
+            this.requestBody = null;
+            this.requestHeaders = {};
+            this.status = 0;
+            this.timeout = null;
+
+            if (typeof FakeXDomainRequest.onCreate == "function") {
+                FakeXDomainRequest.onCreate(this);
+            }
+        }
+
+        function verifyState(xdr) {
+            if (xdr.readyState !== FakeXDomainRequest.OPENED) {
+                throw new Error("INVALID_STATE_ERR");
+            }
+
+            if (xdr.sendFlag) {
+                throw new Error("INVALID_STATE_ERR");
+            }
+        }
+
+        function verifyRequestSent(xdr) {
+            if (xdr.readyState == FakeXDomainRequest.UNSENT) {
+                throw new Error("Request not sent");
+            }
+            if (xdr.readyState == FakeXDomainRequest.DONE) {
+                throw new Error("Request done");
+            }
+        }
+
+        function verifyResponseBodyType(body) {
+            if (typeof body != "string") {
+                var error = new Error("Attempted to respond to fake XDomainRequest with " +
+                                    body + ", which is not a string.");
+                error.name = "InvalidBodyException";
+                throw error;
+            }
+        }
+
+        sinon.extend(FakeXDomainRequest.prototype, sinon.EventTarget, {
+            open: function open(method, url) {
+                this.method = method;
+                this.url = url;
+
+                this.responseText = null;
+                this.sendFlag = false;
+
+                this.readyStateChange(FakeXDomainRequest.OPENED);
+            },
+
+            readyStateChange: function readyStateChange(state) {
+                this.readyState = state;
+                var eventName = "";
+                switch (this.readyState) {
+                case FakeXDomainRequest.UNSENT:
+                    break;
+                case FakeXDomainRequest.OPENED:
+                    break;
+                case FakeXDomainRequest.LOADING:
+                    if (this.sendFlag) {
+                        //raise the progress event
+                        eventName = "onprogress";
+                    }
+                    break;
+                case FakeXDomainRequest.DONE:
+                    if (this.isTimeout) {
+                        eventName = "ontimeout"
+                    } else if (this.errorFlag || (this.status < 200 || this.status > 299)) {
+                        eventName = "onerror";
+                    } else {
+                        eventName = "onload"
+                    }
+                    break;
+                }
+
+                // raising event (if defined)
+                if (eventName) {
+                    if (typeof this[eventName] == "function") {
+                        try {
+                            this[eventName]();
+                        } catch (e) {
+                            sinon.logError("Fake XHR " + eventName + " handler", e);
+                        }
+                    }
+                }
+            },
+
+            send: function send(data) {
+                verifyState(this);
+
+                if (!/^(get|head)$/i.test(this.method)) {
+                    this.requestBody = data;
+                }
+                this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8";
+
+                this.errorFlag = false;
+                this.sendFlag = true;
+                this.readyStateChange(FakeXDomainRequest.OPENED);
+
+                if (typeof this.onSend == "function") {
+                    this.onSend(this);
+                }
+            },
+
+            abort: function abort() {
+                this.aborted = true;
+                this.responseText = null;
+                this.errorFlag = true;
+
+                if (this.readyState > sinon.FakeXDomainRequest.UNSENT && this.sendFlag) {
+                    this.readyStateChange(sinon.FakeXDomainRequest.DONE);
+                    this.sendFlag = false;
+                }
+            },
+
+            setResponseBody: function setResponseBody(body) {
+                verifyRequestSent(this);
+                verifyResponseBodyType(body);
+
+                var chunkSize = this.chunkSize || 10;
+                var index = 0;
+                this.responseText = "";
+
+                do {
+                    this.readyStateChange(FakeXDomainRequest.LOADING);
+                    this.responseText += body.substring(index, index + chunkSize);
+                    index += chunkSize;
+                } while (index < body.length);
+
+                this.readyStateChange(FakeXDomainRequest.DONE);
+            },
+
+            respond: function respond(status, contentType, body) {
+                // content-type ignored, since XDomainRequest does not carry this
+                // we keep the same syntax for respond(...) as for FakeXMLHttpRequest to ease
+                // test integration across browsers
+                this.status = typeof status == "number" ? status : 200;
+                this.setResponseBody(body || "");
+            },
+
+            simulatetimeout: function simulatetimeout() {
+                this.status = 0;
+                this.isTimeout = true;
+                // Access to this should actually throw an error
+                this.responseText = undefined;
+                this.readyStateChange(FakeXDomainRequest.DONE);
+            }
+        });
+
+        sinon.extend(FakeXDomainRequest, {
+            UNSENT: 0,
+            OPENED: 1,
+            LOADING: 3,
+            DONE: 4
+        });
+
+        sinon.useFakeXDomainRequest = function useFakeXDomainRequest() {
+            sinon.FakeXDomainRequest.restore = function restore(keepOnCreate) {
+                if (xdr.supportsXDR) {
+                    global.XDomainRequest = xdr.GlobalXDomainRequest;
+                }
+
+                delete sinon.FakeXDomainRequest.restore;
+
+                if (keepOnCreate !== true) {
+                    delete sinon.FakeXDomainRequest.onCreate;
+                }
+            };
+            if (xdr.supportsXDR) {
+                global.XDomainRequest = sinon.FakeXDomainRequest;
+            }
+            return sinon.FakeXDomainRequest;
+        };
+
+        sinon.FakeXDomainRequest = FakeXDomainRequest;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./core");
+        require("../extend");
+        require("./event");
+        require("../log_error");
+        makeApi(sinon);
+        module.exports = sinon;
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else {
+        makeApi(sinon);
+    }
+})(typeof global !== "undefined" ? global : self);
+
+/**
+ * @depend core.js
+ * @depend ../extend.js
+ * @depend event.js
+ * @depend ../log_error.js
+ */
+/**
+ * Fake XMLHttpRequest object
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (global) {
+
+    var supportsProgress = typeof ProgressEvent !== "undefined";
+    var supportsCustomEvent = typeof CustomEvent !== "undefined";
+    var supportsFormData = typeof FormData !== "undefined";
+    var sinonXhr = { XMLHttpRequest: global.XMLHttpRequest };
+    sinonXhr.GlobalXMLHttpRequest = global.XMLHttpRequest;
+    sinonXhr.GlobalActiveXObject = global.ActiveXObject;
+    sinonXhr.supportsActiveX = typeof sinonXhr.GlobalActiveXObject != "undefined";
+    sinonXhr.supportsXHR = typeof sinonXhr.GlobalXMLHttpRequest != "undefined";
+    sinonXhr.workingXHR = sinonXhr.supportsXHR ? sinonXhr.GlobalXMLHttpRequest : sinonXhr.supportsActiveX
+                                     ? function () {
+                                        return new sinonXhr.GlobalActiveXObject("MSXML2.XMLHTTP.3.0")
+                                    } : false;
+    sinonXhr.supportsCORS = sinonXhr.supportsXHR && "withCredentials" in (new sinonXhr.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*/
+
+    // Note that for FakeXMLHttpRequest to work pre ES5
+    // we lose some of the alignment with the spec.
+    // To ensure as close a match as possible,
+    // set responseType before calling open, send or respond;
+    function FakeXMLHttpRequest() {
+        this.readyState = FakeXMLHttpRequest.UNSENT;
+        this.requestHeaders = {};
+        this.requestBody = null;
+        this.status = 0;
+        this.statusText = "";
+        this.upload = new UploadProgress();
+        this.responseType = "";
+        this.response = "";
+        if (sinonXhr.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.call(this, 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 addEventListener(event, listener) {
+        this.eventListeners[event].push(listener);
+    };
+
+    UploadProgress.prototype.removeEventListener = function removeEventListener(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 dispatchEvent(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");
+        }
+    }
+
+    function getHeader(headers, header) {
+        header = header.toLowerCase();
+
+        for (var h in headers) {
+            if (h.toLowerCase() == header) {
+                return h;
+            }
+        }
+
+        return null;
+    }
+
+    // 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 addFilter(fn) {
+        this.filters.push(fn)
+    };
+    var IE6Re = /MSIE 6/;
+    FakeXMLHttpRequest.defake = function defake(fakeXhr, xhrArgs) {
+        var xhr = new sinonXhr.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 stateChange() {
+            fakeXhr.readyState = xhr.readyState;
+            if (xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) {
+                copyAttrs(["status", "statusText"]);
+            }
+            if (xhr.readyState >= FakeXMLHttpRequest.LOADING) {
+                copyAttrs(["responseText", "response"]);
+            }
+            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 verifyRequestOpened(xhr) {
+        if (xhr.readyState != FakeXMLHttpRequest.OPENED) {
+            throw new Error("INVALID_STATE_ERR - " + xhr.readyState);
+        }
+    }
+
+    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;
+        }
+    }
+
+    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",
+        207: "Multi-Status",
+        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"
+    };
+
+    function makeApi(sinon) {
+        sinon.xhr = sinonXhr;
+
+        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.response = this.responseType === "json" ? null : "";
+                this.responseXML = null;
+                this.requestHeaders = {};
+                this.sendFlag = false;
+
+                if (FakeXMLHttpRequest.useFilters === true) {
+                    var xhrArgs = arguments;
+                    var defake = some(FakeXMLHttpRequest.filters, function (filter) {
+                        return filter.apply(this, xhrArgs)
+                    });
+                    if (defake) {
+                        return 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);
+                    }
+                }
+
+                switch (this.readyState) {
+                    case FakeXMLHttpRequest.DONE:
+                        if (supportsProgress) {
+                            this.upload.dispatchEvent(new sinon.ProgressEvent("progress", {loaded: 100, total: 100}));
+                            this.dispatchEvent(new sinon.ProgressEvent("progress", {loaded: 100, total: 100}));
+                        }
+                        this.upload.dispatchEvent(new sinon.Event("load", false, false, this));
+                        this.dispatchEvent(new sinon.Event("load", false, false, this));
+                        this.dispatchEvent(new sinon.Event("loadend", false, false, this));
+                        break;
+                }
+
+                this.dispatchEvent(new sinon.Event("readystatechange"));
+            },
+
+            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) {
+                verifyRequestOpened(this);
+                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)) {
+                    var contentType = getHeader(this.requestHeaders, "Content-Type");
+                    if (this.requestHeaders[contentType]) {
+                        var value = this.requestHeaders[contentType].split(";");
+                        this.requestHeaders[contentType] = value[0] + ";charset=utf-8";
+                    } else if (supportsFormData && !(data instanceof FormData)) {
+                        this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8";
+                    }
+
+                    this.requestBody = data;
+                }
+
+                this.errorFlag = false;
+                this.sendFlag = this.async;
+                this.response = this.responseType === "json" ? null : "";
+                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.response = this.responseType === "json" ? null : "";
+                this.errorFlag = true;
+                this.requestHeaders = {};
+                this.responseHeaders = {};
+
+                if (this.readyState > FakeXMLHttpRequest.UNSENT && this.sendFlag) {
+                    this.readyStateChange(FakeXMLHttpRequest.DONE);
+                    this.sendFlag = false;
+                }
+
+                this.readyState = 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 = getHeader(this.responseHeaders, header);
+
+                return this.responseHeaders[header] || 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
+                    }
+                }
+
+                this.response = this.responseType === "json" ? JSON.parse(this.responseText) : this.responseText;
+                this.readyStateChange(FakeXMLHttpRequest.DONE);
+            },
+
+            respond: function respond(status, headers, body) {
+                this.status = typeof status == "number" ? status : 200;
+                this.statusText = FakeXMLHttpRequest.statusCodes[this.status];
+                this.setResponseHeaders(headers || {});
+                this.setResponseBody(body || "");
+            },
+
+            uploadProgress: function uploadProgress(progressEventRaw) {
+                if (supportsProgress) {
+                    this.upload.dispatchEvent(new sinon.ProgressEvent("progress", progressEventRaw));
+                }
+            },
+
+            downloadProgress: function downloadProgress(progressEventRaw) {
+                if (supportsProgress) {
+                    this.dispatchEvent(new sinon.ProgressEvent("progress", progressEventRaw));
+                }
+            },
+
+            uploadError: function uploadError(error) {
+                if (supportsCustomEvent) {
+                    this.upload.dispatchEvent(new sinon.CustomEvent("error", {detail: error}));
+                }
+            }
+        });
+
+        sinon.extend(FakeXMLHttpRequest, {
+            UNSENT: 0,
+            OPENED: 1,
+            HEADERS_RECEIVED: 2,
+            LOADING: 3,
+            DONE: 4
+        });
+
+        sinon.useFakeXMLHttpRequest = function () {
+            FakeXMLHttpRequest.restore = function restore(keepOnCreate) {
+                if (sinonXhr.supportsXHR) {
+                    global.XMLHttpRequest = sinonXhr.GlobalXMLHttpRequest;
+                }
+
+                if (sinonXhr.supportsActiveX) {
+                    global.ActiveXObject = sinonXhr.GlobalActiveXObject;
+                }
+
+                delete FakeXMLHttpRequest.restore;
+
+                if (keepOnCreate !== true) {
+                    delete FakeXMLHttpRequest.onCreate;
+                }
+            };
+            if (sinonXhr.supportsXHR) {
+                global.XMLHttpRequest = FakeXMLHttpRequest;
+            }
+
+            if (sinonXhr.supportsActiveX) {
+                global.ActiveXObject = function ActiveXObject(objId) {
+                    if (objId == "Microsoft.XMLHTTP" || /^Msxml2\.XMLHTTP/i.test(objId)) {
+
+                        return new FakeXMLHttpRequest();
+                    }
+
+                    return new sinonXhr.GlobalActiveXObject(objId);
+                };
+            }
+
+            return FakeXMLHttpRequest;
+        };
+
+        sinon.FakeXMLHttpRequest = FakeXMLHttpRequest;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./core");
+        require("../extend");
+        require("./event");
+        require("../log_error");
+        makeApi(sinon);
+        module.exports = sinon;
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else if (typeof sinon === "undefined") {
+        return;
+    } else {
+        makeApi(sinon);
+    }
+
+})(typeof global !== "undefined" ? global : self);
+
+/**
+ * @depend fake_xdomain_request.js
+ * @depend fake_xml_http_request.js
+ * @depend ../format.js
+ * @depend ../log_error.js
+ */
+/**
+ * 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 = {};
+}
+
+(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 makeApi(sinon) {
+        sinon.fakeServer = {
+            create: function () {
+                var server = create(this);
+                if (!sinon.xhr.supportsCORS) {
+                    this.xhr = sinon.useFakeXDomainRequest();
+                } else {
+                    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.respondImmediately) {
+                        server.respond();
+                    } else 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);
+                }
+            },
+
+            log: 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);
+            },
+
+            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, queue.length);
+                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) {
+                        this.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);
+            }
+        };
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./core");
+        require("./fake_xdomain_request");
+        require("./fake_xml_http_request");
+        require("../format");
+        makeApi(sinon);
+        module.exports = sinon;
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else {
+        makeApi(sinon);
+    }
+}());
+
+/**
+ * @depend fake_server.js
+ * @depend fake_timers.js
+ */
+/**
+ * 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 makeApi(sinon) {
+        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);
+        };
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require) {
+        var sinon = require("./core");
+        require("./fake_server");
+        require("./fake_timers");
+        makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require);
+    } else {
+        makeApi(sinon);
+    }
+}());
+
+/**
+ * @depend util/core.js
+ * @depend extend.js
+ * @depend collection.js
+ * @depend util/fake_timers.js
+ * @depend util/fake_server_with_clock.js
+ */
+/**
+ * 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
+ */
+
+(function () {
+    function makeApi(sinon) {
+        var push = [].push;
+
+        function exposeValue(sandbox, config, key, value) {
+            if (!value) {
+                return;
+            }
+
+            if (config.injectInto && !(key in config.injectInto)) {
+                config.injectInto[key] = value;
+                sandbox.injectedKeys.push(key);
+            } 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;
+                }
+
+                obj.match = sinon.match;
+
+                return obj;
+            },
+
+            restore: function () {
+                sinon.collection.restore.apply(this, arguments);
+                this.restoreContext();
+            },
+
+            restoreContext: function () {
+                if (this.injectedKeys) {
+                    for (var i = 0, j = this.injectedKeys.length; i < j; i++) {
+                        delete this.injectInto[this.injectedKeys[i]];
+                    }
+                    this.injectedKeys = [];
+                }
+            },
+
+            create: function (config) {
+                if (!config) {
+                    return sinon.create(sinon.sandbox);
+                }
+
+                var sandbox = prepareSandboxFromConfig(config);
+                sandbox.args = sandbox.args || [];
+                sandbox.injectedKeys = [];
+                sandbox.injectInto = config.injectInto;
+                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;
+            },
+
+            match: sinon.match
+        });
+
+        sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer;
+
+        return sinon.sandbox;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        require("./extend");
+        require("./util/fake_server_with_clock");
+        require("./util/fake_timers");
+        require("./collection");
+        module.exports = makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else if (!sinon) {
+        return;
+    } else {
+        makeApi(sinon);
+    }
+}());
+
+/**
+ * @depend util/core.js
+ * @depend sandbox.js
+ */
+/**
+ * Test function, sandboxes fakes
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    function makeApi(sinon) {
+        var slice = Array.prototype.slice;
+
+        function test(callback) {
+            var type = typeof callback;
+
+            if (type != "function") {
+                throw new TypeError("sinon.test needs to wrap a test function, got " + type);
+            }
+
+            function sinonSandboxedTest() {
+                var config = sinon.getConfig(sinon.config);
+                config.injectInto = config.injectIntoThis && this || config.injectInto;
+                var sandbox = sinon.sandbox.create(config);
+                var args = slice.call(arguments);
+                var oldDone = args.length && args[args.length - 1];
+                var exception, result;
+
+                if (typeof oldDone == "function") {
+                    args[args.length - 1] = function sinonDone(result) {
+                        if (result) {
+                            sandbox.restore();
+                            throw exception;
+                        } else {
+                            sandbox.verifyAndRestore();
+                        }
+                        oldDone(result);
+                    };
+                }
+
+                try {
+                    result = callback.apply(this, args.concat(sandbox.args));
+                } catch (e) {
+                    exception = e;
+                }
+
+                if (typeof oldDone != "function") {
+                    if (typeof exception !== "undefined") {
+                        sandbox.restore();
+                        throw exception;
+                    } else {
+                        sandbox.verifyAndRestore();
+                    }
+                }
+
+                return result;
+            }
+
+            if (callback.length) {
+                return function sinonAsyncSandboxedTest(callback) {
+                    return sinonSandboxedTest.apply(this, arguments);
+                };
+            }
+
+            return sinonSandboxedTest;
+        }
+
+        test.config = {
+            injectIntoThis: true,
+            injectInto: null,
+            properties: ["spy", "stub", "mock", "clock", "server", "requests"],
+            useFakeTimers: true,
+            useFakeServer: true
+        };
+
+        sinon.test = test;
+        return test;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        require("./sandbox");
+        module.exports = makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else if (sinon) {
+        makeApi(sinon);
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend util/core.js
+ * @depend test.js
+ */
+/**
+ * Test case, sandboxes all test functions
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+
+(function (sinon) {
+    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 makeApi(sinon) {
+        function testCase(tests, prefix) {
+            if (!tests || typeof tests != "object") {
+                throw new TypeError("sinon.testCase needs an object with test functions");
+            }
+
+            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) && !/^(setUp|tearDown)$/.test(testName)) {
+                    property = tests[testName];
+
+                    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;
+        }
+
+        sinon.testCase = testCase;
+        return testCase;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        require("./test");
+        module.exports = makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else if (!sinon) {
+        return;
+    } else {
+        makeApi(sinon);
+    }
+}(typeof sinon == "object" && sinon || null));
+
+/**
+ * @depend times_in_words.js
+ * @depend util/core.js
+ * @depend match.js
+ * @depend format.js
+ */
+/**
+ * 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 slice = Array.prototype.slice;
+
+    function makeApi(sinon) {
+        var assert;
+
+        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 (method.proxy && method.proxy.isSinonProxy) {
+                    verifyIsStub(method.proxy);
+                } else {
+                    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 || fake.proxy.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 != "expose" && (includeFail || !/^(fail)/.test(method))) {
+                        target[exposedName(prefix, method)] = this[method];
+                    }
+                }
+
+                return target;
+            },
+
+            match: function match(actual, expectation) {
+                var matcher = sinon.match(expectation);
+                if (matcher.test(actual)) {
+                    assert.pass("match");
+                } else {
+                    var formatted = [
+                        "expected value to match",
+                        "    expected = " + sinon.format(expectation),
+                        "    actual = " + sinon.format(actual)
+                    ]
+                    failAssertion(this, formatted.join("\n"));
+                }
+            }
+        };
+
+        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");
+
+        sinon.assert = assert;
+        return assert;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        require("./match");
+        require("./format");
+        module.exports = makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else if (!sinon) {
+        return;
+    } else {
+        makeApi(sinon);
+    }
+
+}(typeof sinon == "object" && sinon || null, typeof window != "undefined" ? window : (typeof self != "undefined") ? self : global));
+
+  return sinon;
+}));
diff --git a/resources/lib/sinonjs/sinon-ie-1.15.0.js b/resources/lib/sinonjs/sinon-ie-1.15.0.js
deleted file mode 100644 (file)
index 2756321..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/**
- * Sinon.JS 1.15.0, 2015/05/30
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS
- *
- * (The BSD License)
- * 
- * Copyright (c) 2010-2014, 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.
- */
-
-/**
- * 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
- */
-if (typeof window !== "undefined") {
-    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;
-}
-
-/**
- * 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
- */
-if (typeof window !== "undefined") {
-    function XMLHttpRequest() {}
-
-    // Reassign the original function. Now its writable attribute
-    // should be true. Hackish, I know, but it works.
-    XMLHttpRequest = sinon.xhr.XMLHttpRequest || undefined;
-}
-/**
- * Helps IE run the fake XDomainRequest. 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 XDR to work in IE, don't include this file.
- */
-if (typeof window !== "undefined") {
-    function XDomainRequest() {}
-
-    // Reassign the original function. Now its writable attribute
-    // should be true. Hackish, I know, but it works.
-    XDomainRequest = sinon.xdr.XDomainRequest || undefined;
-}
diff --git a/resources/lib/sinonjs/sinon-ie-1.15.4.js b/resources/lib/sinonjs/sinon-ie-1.15.4.js
new file mode 100644 (file)
index 0000000..9eac958
--- /dev/null
@@ -0,0 +1,103 @@
+/**
+ * Sinon.JS 1.15.4, 2015/06/27
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS
+ *
+ * (The BSD License)
+ * 
+ * Copyright (c) 2010-2014, 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.
+ */
+
+/**
+ * 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
+ */
+if (typeof window !== "undefined") {
+    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;
+}
+
+/**
+ * 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
+ */
+if (typeof window !== "undefined") {
+    function XMLHttpRequest() {}
+
+    // Reassign the original function. Now its writable attribute
+    // should be true. Hackish, I know, but it works.
+    XMLHttpRequest = sinon.xhr.XMLHttpRequest || undefined;
+}
+/**
+ * Helps IE run the fake XDomainRequest. 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 XDR to work in IE, don't include this file.
+ */
+if (typeof window !== "undefined") {
+    function XDomainRequest() {}
+
+    // Reassign the original function. Now its writable attribute
+    // should be true. Hackish, I know, but it works.
+    XDomainRequest = sinon.xdr.XDomainRequest || undefined;
+}
index 8deb669..1ec4db0 100644 (file)
@@ -23,8 +23,7 @@
                // scans a node looking for the pattern and wraps a span around each match
                innerHighlight: function ( node, pat ) {
                        var i, match, pos, spannode, middlebit, middleclone;
-                       // if this is a text node
-                       if ( node.nodeType === 3 ) {
+                       if ( node.nodeType === Node.TEXT_NODE ) {
                                // TODO - need to be smarter about the character matching here.
                                // non latin characters can make regex think a new word has begun: do not use \b
                                // http://stackoverflow.com/questions/3787072/regex-wordwrap-with-utf8-characters-in-js
@@ -46,8 +45,8 @@
                                        // replace the matched node, with our span-wrapped clone of the matched node
                                        middlebit.parentNode.replaceChild( spannode, middlebit );
                                }
-                       // if this is an element with childnodes, and not a script, style or an element we created
-                       } else if ( node.nodeType === 1
+                       } else if ( node.nodeType === Node.ELEMENT_NODE
+                               // element with childnodes, and not a script, style or an element we created
                                && node.childNodes
                                && !/(script|style)/i.test( node.tagName )
                                && !( node.tagName.toLowerCase() === 'span'
index f7c4217..19fdb26 100644 (file)
                }
 
                if ( e ) {
-                       if ( e.type === 'click' && options.linksPassthru && $.nodeName( e.target, 'a' ) ) {
-                               // Don't fire if a link was clicked, if requested  (for premade togglers by default)
+                       if (
+                               e.type === 'click' &&
+                               options.linksPassthru &&
+                               $.nodeName( e.target, 'a' ) &&
+                               $( e.target ).attr( 'href' ) !== '#'
+                       ) {
+                               // Don't fire if a link with href !== '#' was clicked, if requested  (for premade togglers by default)
                                return;
                        } else if ( e.type === 'keypress' && e.which !== 13 && e.which !== 32 ) {
                                // Only handle keypresses on the "Enter" or "Space" keys
index c8e3cb3..8efbb1c 100644 (file)
@@ -95,8 +95,7 @@
                                return $node.attr( 'alt' ) || ''; // handle undefined alt
                        } else {
                                return $.map( $.makeArray( node.childNodes ), function ( elem ) {
-                                       // 1 is for document.ELEMENT_NODE (the constant is undefined on old browsers)
-                                       if ( elem.nodeType === 1 ) {
+                                       if ( elem.nodeType === Node.ELEMENT_NODE ) {
                                                return getElementSortKey( elem );
                                        } else {
                                                return $.text( elem );
diff --git a/resources/src/mediawiki.api/mediawiki.api.upload.js b/resources/src/mediawiki.api/mediawiki.api.upload.js
new file mode 100644 (file)
index 0000000..64085e4
--- /dev/null
@@ -0,0 +1,380 @@
+/**
+ * Provides an interface for uploading files to MediaWiki.
+ * @class mw.Api.plugin.upload
+ * @singleton
+ */
+( function ( mw, $ ) {
+       var nonce = 0,
+               fieldsAllowed = {
+                       stash: true,
+                       filekey: true,
+                       filename: true,
+                       comment: true,
+                       text: true,
+                       watchlist: true,
+                       ignorewarnings: true
+               };
+
+       /**
+        * @private
+        * Get nonce for iframe IDs on the page.
+        * @return {number}
+        */
+       function getNonce() {
+               return nonce++;
+       }
+
+       /**
+        * @private
+        * Get new iframe object for an upload.
+        * @return {HTMLIframeElement}
+        */
+       function getNewIframe( id ) {
+               var frame = document.createElement( 'iframe' );
+               frame.id = id;
+               frame.name = id;
+               return frame;
+       }
+
+       /**
+        * @private
+        * Shortcut for getting hidden inputs
+        * @return {jQuery}
+        */
+       function getHiddenInput( name, val ) {
+               return $( '<input type="hidden" />')
+                       .attr( 'name', name )
+                       .val( val );
+       }
+
+       /**
+        * Parse response from an XHR to the server.
+        * @private
+        * @param {Event} e
+        * @return {Object}
+        */
+       function parseXHRResponse( e ) {
+               var response;
+
+               try {
+                       response = $.parseJSON( e.target.responseText );
+               } catch ( error ) {
+                       response = {
+                               error: {
+                                       code: e.target.code,
+                                       info: e.target.responseText
+                               }
+                       };
+               }
+
+               return response;
+       }
+
+       /**
+        * Process the result of the form submission, returned to an iframe.
+        * This is the iframe's onload event.
+        *
+        * @param {HTMLIframeElement} iframe Iframe to extract result from
+        * @return {Object} Response from the server. The return value may or may
+        *   not be an XMLDocument, this code was copied from elsewhere, so if you
+        *   see an unexpected return type, please file a bug.
+        */
+       function processIframeResult( iframe ) {
+               var json,
+                       doc = iframe.contentDocument || frames[iframe.id].document;
+
+               if ( doc.XMLDocument ) {
+                       // The response is a document property in IE
+                       return doc.XMLDocument;
+               }
+
+               if ( doc.body ) {
+                       // Get the json string
+                       // We're actually searching through an HTML doc here --
+                       // according to mdale we need to do this
+                       // because IE does not load JSON properly in an iframe
+                       json = $( doc.body ).find( 'pre' ).text();
+
+                       return JSON.parse( json );
+               }
+
+               // Response is a xml document
+               return doc;
+       }
+
+       function formDataAvailable() {
+               return window.FormData !== undefined &&
+                       window.File !== undefined &&
+                       window.File.prototype.slice !== undefined;
+       }
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Upload a file to MediaWiki.
+                * @param {HTMLInputElement|File} file HTML input type=file element with a file already inside of it, or a File object.
+                * @param {Object} data Other upload options, see action=upload API docs for more
+                * @return {jQuery.Promise}
+                */
+               upload: function ( file, data ) {
+                       var iframe, formData;
+
+                       if ( !file ) {
+                               return $.Deferred().reject( 'No file' );
+                       }
+
+                       iframe = file.nodeType && file.nodeType === Node.ELEMENT_NODE;
+                       formData = formDataAvailable() && file instanceof window.File;
+
+                       if ( !iframe && !formData ) {
+                               return $.Deferred().reject( 'Unsupported argument type passed to mw.Api.upload' );
+                       }
+
+                       if ( formData ) {
+                               return this.uploadWithFormData( file, data );
+                       }
+
+                       return this.uploadWithIframe( file, data );
+               },
+
+               /**
+                * Upload a file to MediaWiki with an iframe and a form.
+                *
+                * This method is necessary for browsers without the File/FormData
+                * APIs, and continues to work in browsers with those APIs.
+                *
+                * The rough sketch of how this method works is as follows:
+                * * An iframe is loaded with no content.
+                * * A form is submitted with the passed-in file input and some extras.
+                * * The MediaWiki API receives that form data, and sends back a response.
+                * * The response is sent to the iframe, because we set target=(iframe id)
+                * * The response is parsed out of the iframe's document, and passed back
+                *   through the promise.
+                * @param {HTMLInputElement} file The file input with a file in it.
+                * @param {Object} data Other upload options, see action=upload API docs for more
+                * @return {jQuery.Promise}
+                */
+               uploadWithIframe: function ( file, data ) {
+                       var tokenPromise = $.Deferred(),
+                               api = this,
+                               filenameFound = false,
+                               deferred = $.Deferred(),
+                               nonce = getNonce(),
+                               id = 'uploadframe-' + nonce,
+                               $form = $( '<form>' ),
+                               iframe = getNewIframe( id ),
+                               $iframe = $( iframe );
+
+                       $form.addClass( 'mw-api-upload-form' );
+
+                       $form.append(
+                               getHiddenInput( 'action', 'upload' ),
+                               getHiddenInput( 'format', 'json' ),
+                               file
+                       );
+
+                       $form.css( 'display', 'none' )
+                               .attr( {
+                                       action: this.defaults.ajax.url,
+                                       method: 'POST',
+                                       target: id,
+                                       enctype: 'multipart/form-data'
+                               } );
+
+                       $iframe.one( 'load', function () {
+                               $iframe.one( 'load', function () {
+                                       var result = processIframeResult( iframe );
+
+                                       if ( !result ) {
+                                               deferred.reject( 'No response from API on upload attempt.' );
+                                       } else if ( result.error || result.warnings ) {
+                                               if ( result.error && result.error.code === 'badtoken' ) {
+                                                       api.badToken( 'edit' );
+                                               }
+
+                                               deferred.reject( result.error || result.warnings );
+                                       } else {
+                                               deferred.notify( 1 );
+                                               deferred.resolve( result );
+                                       }
+                               } );
+                               tokenPromise.done( function () {
+                                       $form.submit();
+                               } );
+                       } );
+
+                       $iframe.error( function ( error ) {
+                               deferred.reject( 'iframe failed to load: ' + error );
+                       } );
+
+                       $iframe.prop( 'src', 'about:blank' ).hide();
+
+                       file.name = 'file';
+
+                       $.each( data, function ( key, val ) {
+                               if ( key === 'filename' ) {
+                                       filenameFound = true;
+                               }
+
+                               if ( fieldsAllowed[key] === true ) {
+                                       $form.append( getHiddenInput( key, val ) );
+                               }
+                       } );
+
+                       if ( !filenameFound && !data.stash ) {
+                               return $.Deferred().reject( 'Filename not included in file data.' );
+                       }
+
+                       if ( this.needToken() ) {
+                               this.getEditToken().then( function ( token ) {
+                                       $form.append( getHiddenInput( 'token', token ) );
+                                       tokenPromise.resolve();
+                               }, tokenPromise.reject );
+                       } else {
+                               tokenPromise.resolve();
+                       }
+
+                       $( 'body' ).append( $form, $iframe );
+
+                       return deferred.promise();
+               },
+
+               /**
+                * Uploads a file using the FormData API.
+                * @param {File} file
+                * @param {Object} data
+                */
+               uploadWithFormData: function ( file, data ) {
+                       var xhr,
+                               api = this,
+                               formData = new FormData(),
+                               deferred = $.Deferred(),
+                               filenameFound = false;
+
+                       formData.append( 'action', 'upload' );
+                       formData.append( 'format', 'json' );
+
+                       $.each( data, function ( key, val ) {
+                               if ( key === 'filename' ) {
+                                       filenameFound = true;
+                               }
+
+                               if ( fieldsAllowed[key] === true ) {
+                                       formData.append( key, val );
+                               }
+                       } );
+
+                       if ( !filenameFound && !data.stash ) {
+                               return $.Deferred().reject( 'Filename not included in file data.' );
+                       }
+
+                       formData.append( 'file', file );
+
+                       xhr = new XMLHttpRequest();
+
+                       xhr.upload.addEventListener( 'progress', function ( e ) {
+                               if ( e.lengthComputable ) {
+                                       deferred.notify( e.loaded / e.total );
+                               }
+                       }, false );
+
+                       xhr.addEventListener( 'abort', function ( e ) {
+                               deferred.reject( parseXHRResponse( e ) );
+                       }, false );
+
+                       xhr.addEventListener( 'load', function ( e ) {
+                               var result = parseXHRResponse( e );
+
+                               if ( result.error || result.warnings ) {
+                                       if ( result.error && result.error.code === 'badtoken' ) {
+                                               api.badToken( 'edit' );
+                                       }
+
+                                       deferred.reject( result.error || result.warnings );
+                               } else {
+                                       deferred.notify( 1 );
+                                       deferred.resolve( result );
+                               }
+                       }, false );
+
+                       xhr.addEventListener( 'error', function ( e ) {
+                               deferred.reject( parseXHRResponse( e ) );
+                       }, false );
+
+                       xhr.open( 'POST', this.defaults.ajax.url, true );
+
+                       if ( this.needToken() ) {
+                               this.getEditToken().then( function ( token ) {
+                                       formData.append( 'token', token );
+                                       xhr.send( formData );
+                               } );
+                       } else {
+                               xhr.send( formData );
+                       }
+
+                       return deferred.promise();
+               },
+
+               /**
+                * Upload a file to the stash.
+                *
+                * This function will return a promise, which when resolved, will pass back a function
+                * to finish the stash upload. You can call that function with an argument containing
+                * more, or conflicting, data to pass to the server. For example:
+                *     // upload a file to the stash with a placeholder filename
+                *     api.uploadToStash( file, { filename: 'testing.png' } ).done( function ( finish ) {
+                *         // finish is now the function we can use to finalize the upload
+                *         // pass it a new filename from user input to override the initial value
+                *         finish( { filename: getFilenameFromUser() } ).done( function ( data ) {
+                *             // the upload is complete, data holds the API response
+                *         } );
+                *     } );
+                * @param {File|HTMLInputElement} file
+                * @param {Object} [data]
+                * @return {jQuery.Promise}
+                * @return {Function} return.finishStashUpload Call this function to finish the upload.
+                * @return {Object} return.finishStashUpload.data Additional data for the upload.
+                * @return {jQuery.Promise} return.finishStashUpload.return API promise for the final upload
+                * @return {Object} return.finishStashUpload.return.data API return value for the final upload
+                */
+               uploadToStash: function ( file, data ) {
+                       var filekey,
+                               api = this;
+
+                       if ( !data.filename ) {
+                               return $.Deferred().reject( 'Filename not included in file data.' );
+                       }
+
+                       function finishUpload( moreData ) {
+                               data = $.extend( data, moreData );
+                               data.filekey = filekey;
+                               data.action = 'upload';
+                               data.format = 'json';
+
+                               if ( !data.filename ) {
+                                       return $.Deferred().reject( 'Filename not included in file data.' );
+                               }
+
+                               return api.postWithEditToken( data );
+                       }
+
+                       return this.upload( file, { stash: true, filename: data.filename } ).then( function ( result ) {
+                               if ( result && result.upload && result.upload.filekey ) {
+                                       filekey = result.upload.filekey;
+                               } else if ( result && ( result.error || result.warning ) ) {
+                                       return $.Deferred().reject( result );
+                               }
+
+                               return finishUpload;
+                       } );
+               },
+
+               needToken: function () {
+                       return true;
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.upload
+        */
+}( mediaWiki, jQuery ) );
index a0861df..e11a2c2 100644 (file)
@@ -951,6 +951,7 @@ ol:lang(fa) li,
 ol:lang(glk) li,
 ol:lang(kk-arab) li,
 ol:lang(lrc) li,
+ol:lang(luz) li,
 ol:lang(mzn) li {
        list-style-type: -moz-persian;
        list-style-type: persian;
index db983a7..1b31956 100644 (file)
 // Button styling
 // ----------------------------------------------------------------------------
 
-.button-colors(@bgColor, @highlightColor) {
+.button-colors(@bgColor, @highlightColor, @activeColor) {
        background: @bgColor;
 
        &:hover {
                // 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%);
-               border-bottom-color: @highlightColor;
+               background-color: @highlightColor;
        }
 
        &:focus {
-               border-color: rgba(0,0,0,0.2);
-               box-shadow: inset 0 0 0 1px rgba(0,0,0,0.2);
+               border-color: @colorWhite;
+               box-shadow: 0 0 0 1px @highlightColor;
 
                outline: none;
                // remove outline in Firefox
 
        &:active,
        &.mw-ui-checked {
-               background: @highlightColor;
+               background: @activeColor;
                box-shadow: none;
        }
 }
 
-.button-colors(@bgColor, @highlightColor) when (lightness(@bgColor) >= 70%) {
+.button-colors(@bgColor, @highlightColor, @activeColor) when (lightness(@bgColor) >= 70%) {
        color: @colorButtonText;
        border: 1px solid @colorGray12;
 
                color: @colorButtonText;
        }
 
+       &:focus {
+               background-color: @highlightColor;
+       }
+
        &:disabled {
                color: @colorDisabledText;
 
@@ -83,7 +86,7 @@
        }
 }
 
-.button-colors(@bgColor, @highlightColor) when (lightness(@bgColor) < 70%) {
+.button-colors(@bgColor, @highlightColor, @activeColor) when (lightness(@bgColor) < 70%) {
        color: #fff;
        // border of the same color as background so that light background and
        // dark background buttons are the same height and width
        }
 }
 
-.button-colors-quiet(@textColor, @highlightColor) {
+.button-colors-quiet(@textColor, @highlightColor, @activeColor) {
        // Quiet buttons all start gray, and reveal
        // constructive/progressive/destructive color on hover and active.
        color: @colorButtonText;
 
        &:hover,
        &:focus {
+               background: transparent;
                color: @textColor;
        }
 
        &:active,
        &.mw-ui-checked {
-               color: @highlightColor;
+               color: @activeColor;
        }
 
        &:disabled {
index dc0a8d3..4b6bb48 100644 (file)
 // Blue; for contextual use of a continuing action
 @colorProgressive: #347bff;
 @colorProgressiveHighlight: #2962CC;
+@colorProgressiveActive: #2962CC;
 // Green; for contextual use of a positive finalizing action
 @colorConstructive: #00af89;
 @colorConstructiveHighlight: #008C6D;
+@colorConstructiveActive: #008C6D;
 // Orange; for contextual use of returning to a past action
 @colorRegressive: #FF5D00;
 // Red; for contextual use of a negative action of high severity
 @colorDestructive: #d11d13;
 @colorDestructiveHighlight: #A7170F;
+@colorDestructiveActive: #A7170F;
 // Orange; for contextual use of a potentially negative action of medium severity
 @colorMediumSevere: #FF5D00;
 // Yellow; for contextual use of a potentially negative action of low severity
@@ -45,6 +48,7 @@
 @colorTextLight: @colorGray6;
 @colorButtonText: @colorGray5;
 @colorButtonTextHighlight: @colorGray7;
+@colorButtonTextActive: @colorGray7;
 @colorDisabledText: @colorGray12;
 @colorErrorText: #CC0000;
 
index 9d28080..ec14f8b 100644 (file)
@@ -67,7 +67,7 @@
                        indexpageids: 1,
                        titles: title.getPrefixedDb()
                } ).then( function ( result ) {
-                       if ( result.query.pageids.length > 0 ) {
+                       if ( result.query.pageids && result.query.pageids.length > 0 ) {
                                pageId = result.query.pageids[0];
                                page = result.query.pages[pageId];
 
index 8ec4cf0..70029a1 100644 (file)
@@ -64,7 +64,7 @@
                if ( $nodes.length ) {
                        mw.loader.using( 'mediawiki.widgets' ).done( function () {
                                $nodes.each( function () {
-                                       OO.ui.infuse( this );
+                                       OO.ui.infuse( this.id );
                                } );
                        } );
                }
index cbc97ab..d706d26 100644 (file)
@@ -64,6 +64,10 @@ a.new:visited, #p-personal a.new:visited {
        color: #b63;
 }
 
+.mw-body a.external.free {
+       word-wrap: break-word;
+}
+
 /* Inline Elements */
 img {
        border: none;
index 53e13b7..77b3f9d 100644 (file)
@@ -47,7 +47,7 @@
        zoom: 1;
 
        // Container styling
-       .button-colors(#FFF, #CCC);
+       .button-colors(#FFF, #CCC, #777);
        border-radius: @borderRadius;
        min-width: 4em;
 
        // Styleguide 2.1.1.
        &.mw-ui-progressive,
        &.mw-ui-primary {
-               .button-colors(@colorProgressive, @colorProgressiveHighlight);
+               .button-colors(@colorProgressive, @colorProgressiveHighlight, @colorProgressiveActive);
 
                &.mw-ui-quiet {
-                       .button-colors-quiet(@colorProgressive, @colorProgressiveHighlight);
+                       .button-colors-quiet(@colorProgressive, @colorProgressiveHighlight, @colorProgressiveActive);
                }
        }
 
        //
        // Styleguide 2.1.2.
        &.mw-ui-constructive {
-               .button-colors(@colorConstructive, @colorConstructiveHighlight);
+               .button-colors(@colorConstructive, @colorConstructiveHighlight, @colorConstructiveActive);
 
                &.mw-ui-quiet {
-                       .button-colors-quiet(@colorConstructive, @colorConstructiveHighlight);
+                       .button-colors-quiet(@colorConstructive, @colorConstructiveHighlight, @colorConstructiveActive);
                }
        }
 
        //
        // Styleguide 2.1.3.
        &.mw-ui-destructive {
-               .button-colors(@colorDestructive, @colorDestructiveHighlight);
+               .button-colors(@colorDestructive, @colorDestructiveHighlight, @colorDestructiveActive);
 
                &.mw-ui-quiet {
-                       .button-colors-quiet(@colorDestructive, @colorDestructiveHighlight);
+                       .button-colors-quiet(@colorDestructive, @colorDestructiveHighlight, @colorDestructiveActive);
                }
        }
 
                background: transparent;
                border: none;
                text-shadow: none;
-               .button-colors-quiet(@colorButtonText, @colorButtonTextHighlight);
+               .button-colors-quiet(@colorButtonText, @colorButtonTextHighlight, @colorButtonTextActive);
 
                &:hover,
                &:focus {
diff --git a/resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.base.css b/resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.base.css
new file mode 100644 (file)
index 0000000..3ce92ef
--- /dev/null
@@ -0,0 +1,26 @@
+/*!
+ * MediaWiki Widgets - base NamespaceInputWidget styles.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+.mw-widget-namespaceInputWidget .oo-ui-dropdownInputWidget,
+.mw-widget-namespaceInputWidget .oo-ui-fieldLayout {
+       display: inline-block;
+       margin-right: 1em;
+}
+
+/* FIXME FieldLayout is not supposed to be used the way we use it here */
+.mw-widget-namespaceInputWidget .oo-ui-fieldLayout {
+       vertical-align: middle;
+       margin-bottom: 0;
+}
+
+.mw-widget-namespaceInputWidget .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+       padding-left: 0.5em;
+}
+
+.mw-widget-namespaceInputWidget .oo-ui-dropdownInputWidget {
+       width: 20em;
+}
diff --git a/resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.js b/resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.js
new file mode 100644 (file)
index 0000000..05e6f27
--- /dev/null
@@ -0,0 +1,68 @@
+/*!
+ * MediaWiki Widgets - NamespaceInputWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * Creates a mw.widgets.NamespaceInputWidget object.
+        *
+        * This is not a complete implementation and is not intended for public usage. It only exists
+        * because of HTMLForm shenanigans.
+        *
+        * @class
+        * @private
+        * @extends OO.ui.Widget
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {OO.ui.DropdownInputWidget} namespace Widget to include
+        * @cfg {OO.ui.CheckboxInputWidget|null} invert Widget to include
+        * @cfg {OO.ui.CheckboxInputWidget|null} associated Widget to include
+        * @cfg {string|null} allValue Value for "all namespaces" option, if any
+        */
+       mw.widgets.NamespaceInputWidget = function MwWidgetsNamespaceInputWidget( config ) {
+               // Parent constructor
+               mw.widgets.NamespaceInputWidget.parent.call( this, config );
+
+               // Properties
+               this.namespace = config.namespace;
+               this.invert = config.invert;
+               this.associated = config.associated;
+               this.allValue = config.allValue;
+
+               // Events
+               this.namespace.connect( this, { change: 'updateCheckboxesState' } );
+
+               // Initialization
+               this.$element
+                       .addClass( 'mw-widget-namespaceInputWidget' )
+                       .append(
+                               this.namespace.$element,
+                               this.invert ? this.invert.$element : '',
+                               this.associated ? this.associated.$element : ''
+                       );
+               this.updateCheckboxesState();
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.widgets.NamespaceInputWidget, OO.ui.Widget );
+
+       /* Methods */
+
+       /**
+        * Update the disabled state of checkboxes when the value of namespace dropdown changes.
+        */
+       mw.widgets.NamespaceInputWidget.prototype.updateCheckboxesState = function () {
+               if ( this.invert ) {
+                       this.invert.getField().setDisabled( this.namespace.getValue() === this.allValue );
+               }
+               if ( this.associated ) {
+                       this.associated.getField().setDisabled( this.namespace.getValue() === this.allValue );
+               }
+       };
+
+}( jQuery, mediaWiki ) );
index 221de0f..66b009f 100644 (file)
@@ -5,6 +5,7 @@
  * @license The MIT License (MIT); see LICENSE.txt
  */
 ( function ( $, mw ) {
+
        /**
         * Creates an mw.widgets.TitleInputWidget object.
         *
@@ -16,6 +17,7 @@
         * @param {Object} [config] Configuration options
         * @cfg {number} [limit=10] Number of results to show
         * @cfg {number} [namespace] Namespace to prepend to queries
+        * @cfg {boolean} [relative=true] If a namespace is set, return a title relative to it
         * @cfg {boolean} [showRedirectTargets=true] Show the targets of redirects
         * @cfg {boolean} [showRedlink] Show red link to exact match if it doesn't exist
         * @cfg {boolean} [showImages] Show page images
                config = config || {};
 
                // Parent constructor
-               OO.ui.TextInputWidget.call( this, config );
+               mw.widgets.TitleInputWidget.parent.call( this, $.extend( {}, config, { autocomplete: false } ) );
 
                // Mixin constructors
                OO.ui.mixin.LookupElement.call( this, config );
 
                // Properties
                this.limit = config.limit || 10;
-               this.namespace = config.namespace || null;
+               this.namespace = config.namespace !== undefined ? config.namespace : null;
+               this.relative = config.relative !== undefined ? config.relative : true;
                this.showRedirectTargets = config.showRedirectTargets !== false;
                this.showRedlink = !!config.showRedlink;
                this.showImages = !!config.showImages;
                } );
        };
 
-       /* Inheritance */
+       /* Setup */
 
        OO.inheritClass( mw.widgets.TitleInputWidget, OO.ui.TextInputWidget );
-
        OO.mixinClass( mw.widgets.TitleInputWidget, OO.ui.mixin.LookupElement );
 
        /* Methods */
@@ -93,7 +95,7 @@
                this.setLookupsDisabled( true );
 
                // Parent method
-               retval = OO.ui.TextInputWidget.prototype.focus.apply( this, arguments );
+               retval = mw.widgets.TitleInputWidget.parent.prototype.focus.apply( this, arguments );
 
                this.setLookupsDisabled( false );
 
         * Get lookup cache item from server response data.
         *
         * @method
-        * @param {Mixed} data Response from server
+        * @param {Mixed} response Response from server
         */
-       mw.widgets.TitleInputWidget.prototype.getLookupCacheDataFromResponse = function ( data ) {
-               return data.query || {};
+       mw.widgets.TitleInputWidget.prototype.getLookupCacheDataFromResponse = function ( response ) {
+               return response.query || {};
        };
 
        /**
                                imageUrl: OO.getProp( suggestionPage, 'thumbnail', 'source' ),
                                description: OO.getProp( suggestionPage, 'terms', 'description' )
                        };
-                       titles.push( suggestionPage.title );
+
+                       // Throw away pages from wrong namespaces. This can happen when 'showRedirectTargets' is true
+                       // and we encounter a cross-namespace redirect.
+                       if ( this.namespace === null || this.namespace === suggestionPage.ns ) {
+                               titles.push( suggestionPage.title );
+                       }
 
                        redirects = redirectsTo[suggestionPage.title] || [];
                        for ( i = 0, len = redirects.length; i < len; i++ ) {
        mw.widgets.TitleInputWidget.prototype.getOptionWidgetData = function ( title, data ) {
                var mwTitle = new mw.Title( title );
                return {
-                       data: this.namespace !== null ? mwTitle.getRelativeText( this.namespace ) : title,
+                       data: this.namespace !== null && this.relative
+                               ? mwTitle.getRelativeText( this.namespace )
+                               : title,
+                       title: mwTitle,
                        imageUrl: this.showImages ? data.imageUrl : null,
                        description: this.showDescriptions ? data.description : null,
                        missing: data.missing,
index 07b81e4..ec0c935 100644 (file)
@@ -14,7 +14,8 @@
         *
         * @constructor
         * @param {Object} [config] Configuration options
-        * @cfg {string} [data] Page title
+        * @cfg {string} [data] Label to display
+        * @cfg {mw.Title} [title] Page title object
         * @cfg {string} [imageUrl] Thumbnail image URL with URL encoding
         * @cfg {string} [description] Page description
         * @cfg {boolean} [missing] Page doesn't exist
@@ -23,7 +24,7 @@
         * @cfg {string} [query] Matching query string
         */
        mw.widgets.TitleOptionWidget = function MwWidgetsTitleOptionWidget( config ) {
-               var icon, title = config.data;
+               var icon;
 
                if ( config.missing ) {
                        icon = 'page-not-found';
                // Config initialization
                config = $.extend( {
                        icon: icon,
-                       label: title,
-                       href: mw.util.getUrl( title ),
+                       label: config.data,
+                       href: config.title.getUrl(),
                        autoFitLabel: false
                }, config );
 
                // Parent constructor
-               OO.ui.MenuOptionWidget.call( this, config );
+               mw.widgets.TitleOptionWidget.parent.call( this, config );
 
-               // Intialization
+               // Initialization
                this.$label.wrap( '<a>' );
                this.$link = this.$label.parent();
                this.$link.attr( 'href', config.href );
@@ -74,7 +75,7 @@
                }
        };
 
-       /* Inheritance */
+       /* Setup */
 
        OO.inheritClass( mw.widgets.TitleOptionWidget, OO.ui.MenuOptionWidget );
 
diff --git a/resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js b/resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js
new file mode 100644 (file)
index 0000000..d540877
--- /dev/null
@@ -0,0 +1,119 @@
+/*!
+ * MediaWiki Widgets - UserInputWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * Creates a mw.widgets.UserInputWidget object.
+        *
+        * @class
+        * @extends OO.ui.TextInputWidget
+        * @mixins OO.ui.mixin.LookupElement
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {number} [limit=10] Number of results to show
+        */
+       mw.widgets.UserInputWidget = function MwWidgetsUserInputWidget( config ) {
+               // Config initialization
+               config = config || {};
+
+               // Parent constructor
+               mw.widgets.UserInputWidget.parent.call( this, $.extend( {}, config, { autocomplete: false } ) );
+
+               // Mixin constructors
+               OO.ui.mixin.LookupElement.call( this, config );
+
+               // Properties
+               this.limit = config.limit || 10;
+
+               // Initialization
+               this.$element.addClass( 'mw-widget-userInputWidget' );
+               this.lookupMenu.$element.addClass( 'mw-widget-userInputWidget-menu' );
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.widgets.UserInputWidget, OO.ui.TextInputWidget );
+       OO.mixinClass( mw.widgets.UserInputWidget, OO.ui.mixin.LookupElement );
+
+       /* Methods */
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.UserInputWidget.prototype.onLookupMenuItemChoose = function ( item ) {
+               this.closeLookupMenu();
+               this.setLookupsDisabled( true );
+               this.setValue( item.getData() );
+               this.setLookupsDisabled( false );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.UserInputWidget.prototype.focus = function () {
+               var retval;
+
+               // Prevent programmatic focus from opening the menu
+               this.setLookupsDisabled( true );
+
+               // Parent method
+               retval = mw.widgets.UserInputWidget.parent.prototype.focus.apply( this, arguments );
+
+               this.setLookupsDisabled( false );
+
+               return retval;
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.UserInputWidget.prototype.getLookupRequest = function () {
+               var inputValue = this.value;
+
+               return new mw.Api().get( {
+                       action: 'query',
+                       list: 'allusers',
+                       // Prefix of list=allusers is case sensitive. Normalise first
+                       // character to uppercase so that "fo" may yield "Foo".
+                       auprefix: inputValue[0].toUpperCase() + inputValue.slice( 1 ),
+                       aulimit: this.limit
+               } );
+       };
+
+       /**
+        * Get lookup cache item from server response data.
+        *
+        * @method
+        * @param {Mixed} response Response from server
+        */
+       mw.widgets.UserInputWidget.prototype.getLookupCacheDataFromResponse = function ( response ) {
+               return response.query.allusers || {};
+       };
+
+       /**
+        * Get list of menu items from a server response.
+        *
+        * @param {Object} data Query result
+        * @returns {OO.ui.MenuOptionWidget[]} Menu items
+        */
+       mw.widgets.UserInputWidget.prototype.getLookupMenuOptionsFromData = function ( data ) {
+               var len, i, user,
+                       items = [];
+
+               for ( i = 0, len = data.length; i < len; i++ ) {
+                       user = data[i] || {};
+                       items.push( new OO.ui.MenuOptionWidget( {
+                               label: user.name,
+                               data: user.name
+                       } ) );
+               }
+
+               return items;
+       };
+
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/mw.widgets.infuse.js b/resources/src/mediawiki.widgets/mw.widgets.infuse.js
deleted file mode 100644 (file)
index 98480bb..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-// HACK: OO.ui.infuse assumes all widgets are in the OO.ui. namespace.
-// Make it so until this is fixed. (T104989)
-jQuery.extend( OO.ui, mediaWiki.widgets );
diff --git a/resources/src/mediawiki/mediawiki.Upload.js b/resources/src/mediawiki/mediawiki.Upload.js
new file mode 100644 (file)
index 0000000..197ea6f
--- /dev/null
@@ -0,0 +1,260 @@
+( function ( mw, $ ) {
+       var UP;
+
+       /**
+        * @class mw.Upload
+        *
+        * Used to represent an upload in progress on the frontend.
+        * Most of the functionality is implemented in mw.Api.plugin.upload,
+        * but this model class will tie it together as well as let you perform
+        * actions in a logical way.
+        *
+        * @constructor
+        * @param {Object} apiconfig Passed to the constructor of mw.Api.
+        */
+       function Upload( apiconfig ) {
+               this.api = new mw.Api( apiconfig );
+
+               this.watchlist = false;
+               this.text = '';
+               this.comment = '';
+               this.filename = null;
+               this.file = null;
+               this.state = Upload.State.NEW;
+       }
+
+       UP = Upload.prototype;
+
+       /**
+        * Set the text of the file page, to be created on file upload.
+        * @param {string} text
+        */
+       UP.setText = function ( text ) {
+               this.text = text;
+       };
+
+       /**
+        * Set the filename, to be finalized on upload.
+        * @param {string} filename
+        */
+       UP.setFilename = function ( filename ) {
+               this.filename = filename;
+       };
+
+       /**
+        * Sets the filename based on the filename as it was on the upload.
+        */
+       UP.setFilenameFromFile = function () {
+               if ( this.file.nodeType && this.file.nodeType === Node.ELEMENT_NODE ) {
+                       // File input element, use getBasename to cut out the path
+                       this.setFilename( this.getBasename( this.file.value ) );
+               } else if ( this.file.name && this.file.lastModified ) {
+                       // HTML5 FileAPI File object, but use getBasename to be safe
+                       this.setFilename( this.getBasename( this.file.name ) );
+               }
+       };
+
+       /**
+        * Set the file to be uploaded.
+        * @param {HTMLInputElement|File} file
+        */
+       UP.setFile = function ( file ) {
+               this.file = file;
+       };
+
+       /**
+        * Set whether the file should be watchlisted after upload.
+        * @param {boolean} watchlist
+        */
+       UP.setWatchlist = function ( watchlist ) {
+               this.watchlist = watchlist;
+       };
+
+       /**
+        * Set the edit comment for the upload.
+        * @param {string} comment
+        */
+       UP.setComment = function ( comment ) {
+               this.comment = comment;
+       };
+
+       /**
+        * Get the text of the file page, to be created on file upload.
+        * @return {string}
+        */
+       UP.getText = function () {
+               return this.text;
+       };
+
+       /**
+        * Get the filename, to be finalized on upload.
+        * @return {string}
+        */
+       UP.getFilename = function () {
+               return this.filename;
+       };
+
+       /**
+        * Get the file being uploaded.
+        * @return {HTMLInputElement|File}
+        */
+       UP.getFile = function () {
+               return this.file;
+       };
+
+       /**
+        * Get the boolean for whether the file will be watchlisted after upload.
+        * @return {boolean}
+        */
+       UP.getWatchlist = function () {
+               return this.watchlist;
+       };
+
+       /**
+        * Get the current value of the edit comment for the upload.
+        * @return {string}
+        */
+       UP.getComment = function () {
+               return this.comment;
+       };
+
+       /**
+        * Gets the base filename from a path name.
+        * @param {string} path
+        * @return {string}
+        */
+       UP.getBasename = function ( path ) {
+               if ( path === undefined || path === null ) {
+                       return '';
+               }
+
+               // Find the index of the last path separator in the
+               // path, and add 1. Then, take the entire string after that.
+               return path.slice(
+                       Math.max(
+                               path.lastIndexOf( '/' ),
+                               path.lastIndexOf( '\\' )
+                       ) + 1
+               );
+       };
+
+       /**
+        * Gets the state of the upload.
+        * @return {mw.Upload.State}
+        */
+       UP.getState = function () {
+               return this.state;
+       };
+
+       /**
+        * Upload the file directly.
+        * @return {jQuery.Promise}
+        */
+       UP.upload = function () {
+               var upload = this;
+
+               if ( !this.file ) {
+                       return $.Deferred().reject( 'No file to upload. Call setFile to add one.' );
+               }
+
+               if ( !this.filename ) {
+                       return $.Deferred().reject( 'No filename set. Call setFilename to add one.' );
+               }
+
+               this.state = Upload.State.UPLOADING;
+
+               return this.api.upload( this.file, {
+                       watchlist: ( this.watchlist === true ) ? 1 : undefined,
+                       comment: this.comment,
+                       filename: this.filename,
+                       text: this.text
+               } ).then( function ( result ) {
+                       upload.state = Upload.State.UPLOADED;
+                       return result;
+               }, function () {
+                       upload.state = Upload.State.ERROR;
+               } );
+       };
+
+       /**
+        * Upload the file to the stash to be completed later.
+        * @return {jQuery.Promise}
+        */
+       UP.uploadToStash = function () {
+               var upload = this;
+
+               if ( !this.file ) {
+                       return $.Deferred().reject( 'No file to upload. Call setFile to add one.' );
+               }
+
+               if ( !this.filename ) {
+                       this.setFilenameFromFile();
+               }
+
+               this.state = Upload.State.UPLOADING;
+
+               this.stashPromise = this.api.uploadToStash( this.file, {
+                       filename: this.filename
+               } ).then( function ( finishStash ) {
+                       upload.state = Upload.State.STASHED;
+                       return finishStash;
+               }, function () {
+                       upload.state = Upload.State.ERROR;
+               } );
+
+               return this.stashPromise;
+       };
+
+       /**
+        * Finish a stash upload.
+        * @return {jQuery.Promise}
+        */
+       UP.finishStashUpload = function () {
+               var upload = this;
+
+               if ( !this.stashPromise ) {
+                       return $.Deferred().reject( 'This upload has not been stashed, please upload it to the stash first.' );
+               }
+
+               return this.stashPromise.then( function ( finishStash ) {
+                       upload.state = Upload.State.UPLOADING;
+
+                       return finishStash( {
+                               watchlist: ( upload.watchlist === true ) ? 1 : undefined,
+                               comment: upload.getComment(),
+                               filename: upload.getFilename(),
+                               text: upload.getText()
+                       } ).then( function () {
+                               upload.state = Upload.State.UPLOADED;
+                       }, function () {
+                               upload.state = Upload.State.ERROR;
+                       } );
+               } );
+       };
+
+       /**
+        * @enum mw.Upload.State
+        * State of uploads represented in simple terms.
+        */
+       Upload.State = {
+               /** Upload not yet started */
+               NEW: 0,
+
+               /** Upload finished, but there was a warning */
+               WARNING: 1,
+
+               /** Upload finished, but there was an error */
+               ERROR: 2,
+
+               /** Upload in progress */
+               UPLOADING: 3,
+
+               /** Upload finished, but not published, call #finishStashUpload */
+               STASHED: 4,
+
+               /** Upload finished and published */
+               UPLOADED: 5
+       };
+
+       mw.Upload = Upload;
+}( mediaWiki, jQuery ) );
index 92294c9..31d9854 100644 (file)
@@ -1,7 +1,8 @@
 /* OOUIHTMLForm styles */
 
-.mw-htmlform-ooui {
+.mw-htmlform-ooui-wrapper {
        width: 50em;
+       margin: 1em 0;
 }
 
 .mw-htmlform-ooui .mw-htmlform-submit-buttons {
index 66d560e..343d516 100644 (file)
                 * @return {string} Other message
                 */
                'int': function ( nodes ) {
-                       return mw.jqueryMsg.getMessageFunction()( nodes[0].toLowerCase() );
+                       var msg = nodes[0];
+                       return mw.jqueryMsg.getMessageFunction()( msg.charAt( 0 ).toLowerCase() + msg.slice( 1 ) );
                },
 
                /**
index 2c88e93..c0b1642 100644 (file)
                        function addEmbeddedCSS( cssText, callback ) {
                                var $style, styleEl;
 
+                               function fireCallbacks() {
+                                       var oldCallbacks = cssCallbacks;
+                                       // Reset cssCallbacks variable so it's not polluted by any calls to
+                                       // addEmbeddedCSS() from one of the callbacks (T105973)
+                                       cssCallbacks = $.Callbacks();
+                                       oldCallbacks.fire().empty();
+                               }
+
                                if ( callback ) {
                                        cssCallbacks.add( callback );
                                }
                                                } else {
                                                        styleEl.appendChild( document.createTextNode( cssText ) );
                                                }
-                                               cssCallbacks.fire().empty();
+                                               fireCallbacks();
                                                return;
                                        }
                                }
 
                                $( newStyleTag( cssText, getMarker() ) ).data( 'ResourceLoaderDynamicStyleTag', true );
 
-                               cssCallbacks.fire().empty();
+                               fireCallbacks();
                        }
 
                        /**
index 1f3b123..5292e80 100644 (file)
@@ -3,7 +3,7 @@
  */
 ( function ( mw, $ ) {
        $( function () {
-               var api, map, resultRenderCache, searchboxesSelectors,
+               var api, map, searchboxesSelectors,
                        // Region where the suggestions box will appear directly below
                        // (using the same width). Can be a container element or the input
                        // itself, depending on what suits best in the environment.
                }
 
                // Compute form data for search suggestions functionality.
-               function computeResultRenderCache( context ) {
+               function getFormData( context ) {
                        var $form, baseHref, linkParams;
 
-                       // Compute common parameters for links' hrefs
-                       $form = context.config.$region.closest( 'form' );
+                       if ( !context.formData ) {
+                               // Compute common parameters for links' hrefs
+                               $form = context.config.$region.closest( 'form' );
 
-                       baseHref = $form.attr( 'action' );
-                       baseHref += baseHref.indexOf( '?' ) > -1 ? '&' : '?';
+                               baseHref = $form.attr( 'action' );
+                               baseHref += baseHref.indexOf( '?' ) > -1 ? '&' : '?';
 
-                       linkParams = $form.serializeObject();
+                               linkParams = $form.serializeObject();
 
-                       return {
-                               textParam: context.data.$textbox.attr( 'name' ),
-                               linkParams: linkParams,
-                               baseHref: baseHref
-                       };
+                               context.formData = {
+                                       textParam: context.data.$textbox.attr( 'name' ),
+                                       linkParams: linkParams,
+                                       baseHref: baseHref
+                               };
+                       }
+
+                       return context.formData;
                }
 
                /**
 
                // The function used to render the suggestions.
                function renderFunction( text, context ) {
-                       if ( !resultRenderCache ) {
-                               resultRenderCache = computeResultRenderCache( context );
-                       }
+                       var formData = getFormData( context );
 
                        // linkParams object is modified and reused
-                       resultRenderCache.linkParams[ resultRenderCache.textParam ] = text;
+                       formData.linkParams[ formData.textParam ] = text;
 
                        // this is the container <div>, jQueryfied
                        this.text( text )
                                .wrap(
                                        $( '<a>' )
-                                               .attr( 'href', resultRenderCache.baseHref + $.param( resultRenderCache.linkParams ) )
+                                               .attr( 'href', formData.baseHref + $.param( formData.linkParams ) )
                                                .attr( 'title', text )
                                                .addClass( 'mw-searchSuggest-link' )
                                );
                }
 
                function specialRenderFunction( query, context ) {
-                       var $el = this;
-
-                       if ( !resultRenderCache ) {
-                               resultRenderCache = computeResultRenderCache( context );
-                       }
+                       var $el = this,
+                               formData = getFormData( context );
 
                        // linkParams object is modified and reused
-                       resultRenderCache.linkParams[ resultRenderCache.textParam ] = query;
+                       formData.linkParams[ formData.textParam ] = query;
 
                        if ( $el.children().length === 0 ) {
                                $el
                        }
 
                        if ( $el.parent().hasClass( 'mw-searchSuggest-link' ) ) {
-                               $el.parent().attr( 'href', resultRenderCache.baseHref + $.param( resultRenderCache.linkParams ) + '&fulltext=1' );
+                               $el.parent().attr( 'href', formData.baseHref + $.param( formData.linkParams ) + '&fulltext=1' );
                        } else {
                                $el.wrap(
                                        $( '<a>' )
-                                               .attr( 'href', resultRenderCache.baseHref + $.param( resultRenderCache.linkParams ) + '&fulltext=1' )
+                                               .attr( 'href', formData.baseHref + $.param( formData.linkParams ) + '&fulltext=1' )
                                                .addClass( 'mw-searchSuggest-link' )
                                );
                        }
index 13bf455..93a1b3b 100644 (file)
@@ -82,6 +82,7 @@
                                .replace( /%29/g, ')' )
                                .replace( /%2C/g, ',' )
                                .replace( /%2F/g, '/' )
+                               .replace( /%7E/g, '~' )
                                .replace( /%3A/g, ':' );
                },
 
index 80cc7d9..5ee295b 100644 (file)
@@ -6,6 +6,14 @@
 
 var mediaWikiLoadStart = ( new Date() ).getTime();
 
+if ( !window.performance ) {
+       window.performance = {};
+}
+if ( !performance.mark ) {
+       performance.mark = function () {};
+}
+performance.mark( 'mediaWikiStartUp' );
+
 /**
  * Returns false for Grade C supported browsers.
  *
index 8f8381e..b2232e6 100644 (file)
@@ -14,7 +14,7 @@
 #   export MEDIAWIKI_USER=Selenium_user2
 #   bundle exec cucumber
 #
-mw-vagrant-host:
+mw-vagrant-host: &default
   mediawiki_url: http://127.0.0.1:8080/wiki/
   mediawiki_user: Selenium_user
   mediawiki_password: vagrant
@@ -33,3 +33,5 @@ test2:
   mediawiki_url: http://test2.wikipedia.org/wiki/
   mediawiki_user: Selenium_user
   # mediawiki_password: SET THIS IN THE ENVIRONMENT!
+
+default: *default
index 3d312f7..98e0f2c 100644 (file)
@@ -22,5 +22,5 @@ When(/^I submit the form$/) do
 end
 
 Then(/^an error message is displayed$/) do
-  expect(on(CreateAccountPage).error_message_element.class_name).to eq "errorbox"
+  expect(on(CreateAccountPage).error_message_element.class_name).to eq 'errorbox'
 end
index 18d9aa8..ab33d89 100644 (file)
@@ -118,6 +118,13 @@ Template:echo_with_div
 <div>{{{1}}}</div>
 !! endarticle
 
+!! article
+Template:blank_param
+!! text
+{{{1}}}
+{{{}}}
+!! endarticle
+
 !! article
 Template:table_attribs
 !! text
@@ -165,6 +172,13 @@ Template:table_cells
 {{table_attribs}}||style='color:red;'|''Bar''||style='color:brown;'|''Foo'' and Baz
 !! endarticle
 
+!! article
+Template:PartialTable
+!! text
+{|
+|-
+!! endarticle
+
 !! article
 Template:image_attribs
 !! text
@@ -1425,6 +1439,16 @@ parsoid=html2wt
 <nowiki>* &lt;/nowiki&gt;</nowiki> tag
 !! end
 
+!! test
+T93824: Put escaped HTML tags inside nowiki
+!! options
+parsoid=html2wt
+!! html
+<p>&lt;h2&gt;foo&lt;/h2&gt;</p>
+!! wikitext
+<nowiki><h2>foo</h2></nowiki>
+!! end
+
 !! test
 T71950: 1. Put nowiki as close to cause as possible, even with non-quote escapable chars
 !! options
@@ -1483,6 +1507,30 @@ parsoid=html2wt
 {{echo|a <nowiki>}</nowiki>}}
 !! end
 
+!! test
+Cases where "!!" needs nowiki protection
+!! options
+parsoid=html2wt
+!! html
+<table>
+<tr><th>this needs protection !! here</th></tr>
+</table>
+
+<table>
+<tr><th>this does not need
+protection !! here</th></tr>
+</table>
+!! wikitext
+{|
+!<nowiki>this needs protection !! here</nowiki>
+|}
+
+{|
+!this does not need
+protection !! here
+|}
+!! end
+
 ###
 ### Comments
 ###
@@ -1587,8 +1635,10 @@ Comment whitespace
 Comment semantics and delimiters
 !! wikitext
 <!-- --><!----><!-----><!------>
-!! html
+!! html/php
 
+!! html/parsoid
+<!-- --><!----><!--&#x2D;--><!--&#x2D;&#x2D;-->
 !! end
 
 !! test
@@ -1596,8 +1646,11 @@ Comment semantics and delimiters, redux
 !! wikitext
 <!-- In SGML every "foo" here would actually show up in the text -- foo -- bar
 -- foo -- funky huh? ... -->
-!! html
+!! html/php
 
+!! html/parsoid
+<!-- In SGML every "foo" here would actually show up in the text &#x2D;&#x2D; foo &#x2D;&#x2D; bar
+&#x2D;&#x2D; foo &#x2D;&#x2D; funky huh? ... -->
 !! end
 
 !! test
@@ -1607,39 +1660,68 @@ Comment semantics and delimiters: directors cut
 everything starting with < followed by !-- until the first -- and > we see,
 that wouldn't be valid XML however, since in XML -- has to terminate a comment
 -->-->
-!! html
+!! html/php
 <p>--&gt;
 </p>
+!! html/parsoid
+<!-- ... However we like to keep things simple and somewhat XML&#x2D;ish so we eat
+everything starting with < followed by !&#x2D;&#x2D; until the first &#x2D;&#x2D; and &#x3E; we see,
+that wouldn't be valid XML however, since in XML &#x2D;&#x2D; has to terminate a comment
+--><p>--></p>
 !! end
 
 !! test
 Comment semantics: nesting
 !! wikitext
 <!--<!-- no, we're not going to do anything fancy here -->-->
-!! html
+!! html/php
 <p>--&gt;
 </p>
+!! html/parsoid
+<!--<!&#x2D;&#x2D; no, we're not going to do anything fancy here --><p>--></p>
 !! end
 
+# Parsoid closes the unclosed comment, even if it means a slight
+# round-trip diff.
 !! test
 Comment semantics: unclosed comment at end
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 <!--This comment will run out to the end of the document
-!! html
+!! html/php
 
+!! html/parsoid
+<!--This comment will run out to the end of the document-->
 !! end
 
-# Bug 58184: document parsoid's behaviour
 !! test
-Suppress comment closing tag in lenient browsers
-!! options
-parsoid=wt2html,html2html
+Comment semantics: normalize comments to play nice with XML and browsers
 !! wikitext
-<!-- Browsers--!> think this is closed -->
+<!-- Browsers --!> think this is closed -->
+<!--> This would normally be text -->
+<!---> As would this -->
+<!-- XML doesn't like trailing dashes -------->
+<!-- Nor doubled hyphens -- anywhere in the data -->
+But this is not a comment.
 !! html/php
+<p>But this is not a comment.
+</p>
+!! html/parsoid
+<!-- Browsers &#x2D;&#x2D;!&#x3E; think this is closed -->
+<!--&#x3E; This would normally be text -->
+<!--&#x2D;&#x3E; As would this -->
+<!-- XML doesn't like trailing dashes &#x2D;&#x2D;&#x2D;&#x2D;&#x2D;&#x2D;-->
+<!-- Nor doubled hyphens &#x2D;&#x2D; anywhere in the data -->
+<p>But this is not a comment.</p>
+!! end
 
+!! test
+Comment semantics: round-trip even text which contains encoded -->
+!! wikitext
+<!-- hello & goodbye - > --&gt; --&amp;gt; --&xx -->
 !! html/parsoid
-<!-- Browsers--¡> think this is closed -->
+<!-- hello &#x26; goodbye &#x2D; &#x3E; &#x2D;&#x2D;&#x3E; &#x2D;&#x2D;&#x26;gt; &#x2D;&#x2D;&#x26;xx -->
 !! end
 
 !! test
@@ -1683,9 +1765,10 @@ parsoid=wt2html,wt2wt
 <!--c1-->*a
 <!--c2--><!--c3--><!--c4-->*b
 !! html
-<ul>
+<!--c1--><ul>
 <li>a
 </li>
+<!--c2--><!--c3--><!--c4-->
 <li>b
 </li>
 </ul>
@@ -1894,7 +1977,7 @@ a [[Category:A1]] [[Category:A2]]
 [[Category:A4]]
 !! html/parsoid
 <p>a</p>
-<link href="Category:A1"/> <link href="Category:A2"/> <link href="Category:A3"/> <link href="Category:A4"/>
+<link rel="mw:PageProp/Category" href="Category:A1"/> <link rel="mw:PageProp/Category" href="Category:A2"/> <link rel="mw:PageProp/Category" href="Category:A3"/> <link rel="mw:PageProp/Category" href="Category:A4"/>
 !! end
 
 !! test
@@ -1904,7 +1987,7 @@ parsoid=wt2html
 !! wikitext
 [[Category:A1]]a
 !! html/parsoid
-<link href="Category:A1"/><p>a</p>
+<link rel="mw:PageProp/Category" href="Category:A1"/><p>a</p>
 !! end
 
 ###
@@ -2671,7 +2754,7 @@ parsoid
 !! wikitext
 {{echo|a : b}}
 !! html
-<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a : b"}},"i":0}}]}'>a<span typeof="mw:Placeholder" data-parsoid='{"isDisplayHack":true}'> </span>: b</p>
+<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a : b"}},"i":0}}]}'>a<span typeof="mw:DisplaySpace mw:Placeholder" data-parsoid='{"isDisplayHack":true}'> </span>: b</p>
 !! end
 
 ## Bug T73412
@@ -2686,6 +2769,19 @@ Templates: Preserve blank parameter names
 <p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"":{"wt":"foo"}},"i":0}}]}'>{{{1}}}</p>
 !! end
 
+!! test
+Templates: Preserve blank parameter names in other positions
+!! wikitext
+{{blank_param|bar|=foo}}
+!! html/php
+<p>bar
+foo
+</p>
+!! html/parsoid
+<p about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]},{"k":"","named":true,"spc":["","","",""]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"blank_param","href":"./Template:Blank_param"},"params":{"1":{"wt":"bar"},"":{"wt":"foo"}},"i":0}}]}'>bar
+foo</p>
+!! end
+
 ###
 ### Parsoid-centric tests for testing RT edge cases for pre
 ###
@@ -3136,9 +3232,9 @@ parsoid=wt2html,wt2wt
 !! wikitext
  [[Category:foo]] <!-- No pre-wrapping -->
 {{echo| [[Category:foo]]}} <!-- No pre-wrapping -->
-!! html
- <link rel="mw:PageProp/Category" href="./Category:Foo"> <!-- No pre-wrapping -->
-<span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":" [[Category:foo]]"}},"i":0}}]}'> </span><link rel="mw:PageProp/Category" href="./Category:Foo" about="#mwt1"> <!-- No pre-wrapping -->
+!! html/parsoid
+ <link rel="mw:PageProp/Category" href="./Category:Foo"> <!-- No pre&#x2D;wrapping -->
+<span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":" [[Category:foo]]"}},"i":0}}]}'> </span><link rel="mw:PageProp/Category" href="./Category:Foo" about="#mwt1"> <!-- No pre&#x2D;wrapping -->
 !! end
 
 !! test
@@ -3149,9 +3245,20 @@ parsoid=wt2html,wt2wt
  [[Category:foo]] a
  [[Category:foo]] {{echo|b}}
 !! html
-<pre>
-<link rel="mw:PageProp/Category" href="./Category:Foo"> a
-<link rel="mw:PageProp/Category" href="./Category:Foo"> <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b"}},"i":0}}]}'>b</span></pre>
+<pre><link rel="mw:PageProp/Category" href="./Category:Foo"> a
+ <link rel="mw:PageProp/Category" href="./Category:Foo"> <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b"}},"i":0}}]}'>b</span></pre>
+!! end
+
+!! test
+Indent-Pre: Newlines in comments shouldn't affect sol state
+!! wikitext
+a <!--
+foo
+--> b
+!! html/parsoid
+<p>a <!--
+foo
+--> b</p>
 !! end
 
 ###
@@ -3570,20 +3677,26 @@ Definition Lists: Hacky use to indent tables, with comment before table
 </tr></table></dd></dl></dd></dl>
 !! end
 
-# Bug 52473
+# The trailing whitespace in this test is to catch a regression in
+# Parsoid after T54473.
 !! test
 Definition Lists: Hacky use to indent tables (WS-insensitive)
-!! options
-parsoid
 !! wikitext
 : {|
 |a
 |} 
-!! html
-<dl>
-<dd> <table><tr><td>a</td></tr></table> </dd>
-</dl>
+!! html/php
+<dl><dd><table>
+<tr>
+<td>a
+</td></tr></table></dd></dl>
+
+!! html/parsoid
+<dl><dd> <table>
+<tbody><tr><td>a</td></tr>
+</tbody></table> </dd></dl>
 !! end
+
 ## The PHP parser treats : items (dd) without a corresponding ; item (dt)
 ## as an empty dt item.  It also ignores all but the last ";" when followed
 ## by ":" later on.  So, ";" are not ignored in ";;;t3" but are ignored  in
@@ -4006,6 +4119,9 @@ Definition Lists: Mixed Lists: Test 11
 
 
 # Another case where tidy converts a <dt> to a <dd> (but Parsoid doesn't).
+# From whitelist:
+# * The test is wrong, there are two colons where there should be :;
+# * The PHP parser is wrong to close the <dl> after the <dt> containing the <ul>.
 !! test
 Definition Lists: Weird Ones: Test 1
 !! wikitext
@@ -4063,7 +4179,7 @@ Definition Lists: Weird Ones: Test 1
 <dl>
 <dt>
 <dl>
-<dt> foo<span typeof="mw:Placeholder">&nbsp;</span></dt>
+<dt> foo<span typeof="mw:DisplaySpace mw:Placeholder" data-parsoid='{"src":" ","isDisplayHack":true}'> </span></dt>
 <dd data-parsoid='{"stx":"row"}'> bar (who uses this?)</dd>
 </dl></dt>
 </dl></dd>
@@ -5208,15 +5324,55 @@ Parenthesis in external links, w/ transclusion or comment
 !! end
 
 !! test
-Replace invalid link targets when serializing
+Serialize <a> tags with invalid link targets as plain text
 !! options
 parsoid=html2wt
 !! html
-<a rel="mw:WikiLink" href="./]] foo [[bar">Manual</a>
+<a rel="mw:WikiLink" href="[[foo]]">text</a>
+<a rel="mw:WikiLink" href="[[foo]]">*text</a>
+<a rel="mw:WikiLink" href="[[foo]]">[[foo]]</a>
+<a rel="mw:WikiLink" href="[[foo]]">*a [[foo]]</a>
+!! wikitext
+text
+<nowiki>*</nowiki>text
+<nowiki>[[foo]]</nowiki>
+<nowiki>*a [[foo]]</nowiki>
+!! end
+
+!! test
+mw:ExtLink -vs- mw:WikiLink (T94723)
+!! options
+parsoid=html2wt
+!! html/parsoid
+<a rel="mw:WikiLink" href="./Foo" title="Foo" data-parsoid='{"stx":"piped","a":{"href":"./Foo"},"sa":{"href":"Foo"},"dsr":[0,11,6,2]}'>Bar</a>
+<a rel="mw:WikiLink" href="./Foo" title="Foo">Bar</a>
+<a rel="mw:WikiLink" href="http://en.wikipedia.org/wiki/Foo" title="Foo">Bar</a>
+<a rel="mw:ExtLink" href="http://en.wikipedia.org/wiki/Foo" title="Foo">Bar</a>
+<p>
+<a rel="mw:ExtLink" href="http://en.wikipedia.org/wiki/European_Robin">European Robin</a>
+<a rel="mw:WikiLink" href="http://en.wikipedia.org/wiki/European_Robin">European Robin</a>
+</p>
+!! wikitext
+[[Foo|Bar]]
+[[Foo|Bar]]
+[[wikipedia:Foo|Bar]]
+[[wikipedia:Foo|Bar]]
+
+[[wikipedia:European_Robin|European Robin]]
+[[wikipedia:European_Robin|European Robin]]
+!! end
+
+!! test
+mw:ExtLink linking to a interwiki URL can be round-tripped losslessly (T94723)
+!! options
+parsoid=wt2wt
 !! wikitext
-[[MediaWiki:Badtitletext|Manual]]
+[http://en.wikipedia.org/wiki/European_Robin European Robin]
+!! html/parsoid
+THIS SECTION IS NOT USED (but Parsoid won't run the test without it)
 !! end
 
+
 ###
 ### Quotes
 ###
@@ -5280,7 +5436,9 @@ Plain ''italic'''s plain
 </p><p><b>Bold tag left open</b>
 </p><p><i>Italic tag left open</i>
 </p><p>Normal text.
-</p><p><b>This year'</b>s election <i>should</i> beat <b>last year'</b>s.
+</p>
+<!-- Unmatching number of opening, closing tags: -->
+<p><b>This year'</b>s election <i>should</i> beat <b>last year'</b>s.
 </p><p><i>Tom<b>s car is bigger than </b></i><b>Susan</b>s.
 </p><p>Plain <i>italic'</i>s plain
 </p>
@@ -5480,6 +5638,7 @@ Simple table but with multiple dashes for row wikitext
 </td></tr></table>
 
 !! end
+
 !! test
 Multiplication table
 !! wikitext
@@ -5600,6 +5759,69 @@ Accept "||" in indented table headings
 
 !! end
 
+!! test
+Accept "!!" in templates
+!! wikitext
+{|
+!a {{echo|b!!c}}
+|}
+!! html/php
+<table>
+<tr>
+<th>a b</th>
+<th>c
+</th></tr></table>
+
+!! html/parsoid
+<table>
+<tbody><tr><th typeof="mw:Transclusion" about="#mwt1" data-parsoid='{"autoInsertedEnd":true,"pi":[[{"k":"1","spc":["","","",""]}]]}' data-mw='{"parts":["!a ",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b!!c"}},"i":0}}]}'>a b</th><th about="#mwt1">c</th></tr>
+!! end
+
+!! test
+Accept "!!" in table headings after newline
+!! wikitext
+{|
+!a
+b!!c
+|}
+!! html/php
+<table>
+<tr>
+<th>a
+<p>b!!c
+</p>
+</th></tr></table>
+
+!! html/parsoid
+<table>
+<tbody><tr><th>a
+<p>b!!c</p></th></tr>
+</tbody></table>
+!! end
+
+!! test
+Accept "!!" in table data of mixed wikitext / html syntax
+!! wikitext
+{|
+!a
+<tr><td>b!!c</td></tr>
+|}
+!! html+tidy
+<table>
+<tr>
+<th>a</th>
+</tr>
+<tr>
+<td>b!!c</td>
+</tr>
+</table>
+!! html/parsoid
+<table>
+<tbody><tr><th>a</th></tr>
+<tr data-parsoid='{"stx":"html"}'><td data-parsoid='{"stx":"html"}'>b!!c</td></tr>
+</tbody></table>
+!! end
+
 !! test
 Accept empty attributes in td/th cells (td/th cells starting with leading ||)
 !! wikitext
@@ -5746,6 +5968,26 @@ Invalid attributes in table cell (bug 1830)
 
 !! end
 
+!! test
+Table cell attributes: Pipes protected by nowikis should be treated as a plain character
+!! wikitext
+{|
+| title="foo" |bar
+| title="foo<nowiki>|</nowiki>" |bar
+| title="foo<nowiki>|</nowiki>" bar
+|}
+!! html
+<table>
+<tr>
+<td title="foo">bar
+</td>
+<td title="foo&#124;">bar
+</td>
+<td> title="foo|" bar
+</td></tr></table>
+
+!! end
+
 # The "|}" to close the table is missing from the input, so parsoid's
 # *2wt modes will fail.
 !! test
@@ -5892,6 +6134,35 @@ Indented table markup mixed with indented pre content (proposed in bug 6200)
 </tbody></table>
 !! end
 
+!! test
+4. Template-generated table cell attributes and cell content inside a templated table
+!! wikitext
+{{tbl-start}}
+!align=center {{table_header_cells}}
+|-
+|align=center {{table_cells}}
+{{tbl-end}}
+!! html/php
+<table>
+<tr>
+<th align="center" style="color:red;">Foo</th>
+<th style="color:red;"><i>Bar</i></th>
+<th style="color:brown;"><i>Foo</i> and Baz
+</th></tr>
+<tr>
+<td align="center" style="color:red;">Foo</td>
+<td style="color:red;"><i>Bar</i></td>
+<td style="color:brown;"><i>Foo</i> and Baz
+</td></tr></table>
+
+!! html/parsoid
+<table about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[],[],[],[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"tbl-start","href":"./Template:Tbl-start"},"params":{},"i":0}},"\n!align=center ",{"template":{"target":{"wt":"table_header_cells","href":"./Template:Table_header_cells"},"params":{},"i":1}},"\n|-\n|align=center ",{"template":{"target":{"wt":"table_cells","href":"./Template:Table_cells"},"params":{},"i":2}},"\n",{"template":{"target":{"wt":"tbl-end","href":"./Template:Tbl-end"},"params":{},"i":3}}]}'>
+<tbody><tr><th align="center" style="color:red;">Foo</th><th style="color:red;"><i>Bar</i></th><th style="color:brown;"><i>Foo</i> and Baz</th></tr>
+<tr>
+<td align="center" style="color:red;">Foo</td><td style="color:red;"><i>Bar</i></td><td style="color:brown;"><i>Foo</i> and Baz</td></tr>
+</tbody></table>
+!! end
+
 !! test
 Table with row followed by newlines and table heading
 !! wikitext
@@ -6810,7 +7081,7 @@ Link containing a tilde
 !! wikitext
 [[Foo~bar]]
 !! html/php
-<p><a href="/wiki/Foo%7Ebar" title="Foo~bar">Foo~bar</a>
+<p><a href="/wiki/Foo~bar" title="Foo~bar">Foo~bar</a>
 </p>
 !! html/parsoid
 <p><a rel="mw:WikiLink" href="./Foo~bar" title="Foo~bar">Foo~bar</a></p>
@@ -7125,7 +7396,7 @@ title=[[User:test/123]]
 <p><a href="#a">b</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="../User:Test/123#a" data-parsoid='{"stx":"piped","a":{"href":"../User:Test/123#a"},"sa":{"href":"#a"}}'>b</a></p>
+<p><a rel="mw:WikiLink" href="./User:Test/123#a" data-parsoid='{"stx":"piped","a":{"href":"./User:Test/123#a"},"sa":{"href":"#a"}}'>b</a></p>
 !! end
 
 !! test
@@ -7515,7 +7786,6 @@ Blah blah blah
 [[   es :Spanish]]
 [[ ZH :Chinese]]
 [[es:Foo_bar]]
-[[es:Foo bar]]
 !! html/php
 <p>Blah blah blah
 </p>
@@ -7524,7 +7794,21 @@ Blah blah blah
 <link rel="mw:PageProp/Language" href="http://es.wikipedia.org/wiki/Spanish" />
 <link rel="mw:PageProp/Language" href="http://zh.wikipedia.org/wiki/Chinese" />
 <link rel="mw:PageProp/Language" href="http://es.wikipedia.org/wiki/Foo_bar" />
-<link rel="mw:PageProp/Language" href="http://es.wikipedia.org/wiki/Foo_bar" />
+!! end
+
+!! test
+Space and question mark encoding in interlanguage links (T95473)
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+Blah blah blah
+[[es:Foo bar?]]
+!! html/php
+<p>Blah blah blah
+</p>
+!! html/parsoid
+<p>Blah blah blah</p>
+<link rel="mw:PageProp/Language" href="http://es.wikipedia.org/wiki/Foo_bar%3F" />
 !! end
 
 !! test
@@ -7702,12 +7986,10 @@ Blah blah blah
 
 !! test
 1. Simple redirect to page
-!! options
-parsoid
 !! wikitext
 #REDIRECT [[Main Page]]
-!! html
-<link rel="mw:PageProp/redirect" href="./Main_Page">
+!! html/parsoid
+<link rel="mw:PageProp/redirect" href="./Main_Page"/>
 !! end
 
 !! test
@@ -7718,12 +8000,22 @@ parsoid
 <link rel="mw:PageProp/redirect" href="./Main_Page" data-parsoid='{"src":"#REDIRECT ","a":{"href":"./Main_Page"},"sa":{"href":"Main_Page"}}'/>
 !! end
 
+# Not a valid redirect in PHP (although perhaps it was, once upon a time)
+# This tests the Parsoid bail-out code.
 !! test
 3. Other redirect variants
 !! wikitext
 #REDIRECT [[<nowiki>[[Bar]]</nowiki>]]
 !! html/parsoid
-<link rel="mw:PageProp/redirect" href="./%5B%5BBar%5D%5D" data-parsoid='{"src":"#REDIRECT ","a":{"href":"./%5B%5BBar%5D%5D"},"sa":{"href":"&lt;nowiki>[[Bar]]&lt;/nowiki>"}}'/>
+<ol><li data-parsoid>REDIRECT [[[[Bar]]]]</li></ol>
+!! end
+
+!! test
+4. Redirect to a templated destination
+!! wikitext
+#REDIRECT [[{{echo|Foo}}bar]]
+!! html/parsoid
+<link typeof="mw:ExpandedAttrs" rel="mw:PageProp/redirect" href="./Foobar" data-mw='{"attribs":[[{"txt":"href"},{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;dsr&amp;quot;:[12,24,null,null]}\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;Foo&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\">Foo&lt;/span>bar"}]]}'/>
 !! end
 
 !! test
@@ -7732,7 +8024,7 @@ Empty redirect
 parsoid=wt2html,wt2wt
 !! wikitext
 #REDIRECT [[]]
-!! html
+!! html/parsoid
 <ol>
 <li>REDIRECT [[]]</li></ol>
 !! end
@@ -7745,8 +8037,8 @@ Optional colon in #REDIRECT
 parsoid=wt2html,html2html
 !! wikitext
 #REDIRECT:[[Main Page]]
-!! html
-<link rel="mw:PageProp/redirect" href="./Main_Page">
+!! html/parsoid
+<link rel="mw:PageProp/redirect" href="./Main_Page"/>
 !! end
 
 !! test
@@ -7761,8 +8053,8 @@ parsoid=wt2html,html2html
  #REDIRECT 
 : 
 [[Main Page]]
-!! html
-<link rel="mw:PageProp/redirect" href="./Main_Page">
+!! html/parsoid
+<link rel="mw:PageProp/redirect" href="./Main_Page"/>
 !! end
 
 !! test
@@ -7773,89 +8065,90 @@ Piped link in #REDIRECT
 parsoid=wt2html
 !! wikitext
 #REDIRECT [[Main Page|bar]]
-!! html
-<link rel="mw:PageProp/redirect" href="./Main_Page">
+!! html/parsoid
+<link rel="mw:PageProp/redirect" href="./Main_Page"/>
 !! end
 
 !! test
-Redirect to category
+Redirect to category (T104502)
 !! options
-parsoid=wt2wt,wt2html
+parsoid=wt2html,wt2wt
 !! wikitext
 #REDIRECT [[Category:Foo]]
-!! html
-<link rel="mw:PageProp/redirect" href="./Category:Foo"><link rel="mw:PageProp/Category" href="./Category:Foo">
+!! html/parsoid
+<link rel="mw:PageProp/redirect" href="./Category:Foo"/>
 !! end
 
 !! test
-Redirect to category with URL encoding
+Redirect to category with URL encoding (T104502)
 !! options
 parsoid=wt2html
 !! wikitext
 #REDIRECT [[Category%3AFoo]]
-!! html
-<link rel="mw:PageProp/redirect" href="./Category:Foo"><link rel="mw:PageProp/Category" href="./Category:Foo">
+!! html/parsoid
+<link rel="mw:PageProp/redirect" href="./Category:Foo"/>
 !! end
 
 !! test
 Redirect to category page
-!! options
-parsoid
 !! wikitext
 #REDIRECT [[:Category:Foo]]
-!! html
-<link rel="mw:PageProp/redirect" href="Category:Foo" title="Category:Foo"/>
+!! html/parsoid
+<link rel="mw:PageProp/redirect" href="./Category:Foo"/>
 !! end
 
 !! test
 Redirect to image page (1)
-!! options
-parsoid
 !! wikitext
 #REDIRECT [[File:Wiki.png]]
-!! html
-<link rel="mw:PageProp/redirect" href="./File:Wiki.png">
+!! html/parsoid
+<link rel="mw:PageProp/redirect" href="./File:Wiki.png"/>
 !! end
 
 !! test
 Redirect to image page (2)
-!! options
-parsoid
 !! wikitext
 #REDIRECT [[Image:Wiki.png]]
-!! html
-<link rel="mw:PageProp/redirect" href="./File:Wiki.png">
+!! html/parsoid
+<link rel="mw:PageProp/redirect" href="./File:Wiki.png"  data-parsoid='{"src":"#REDIRECT ","a":{"href":"./File:Wiki.png"},"sa":{"href":"Image:Wiki.png"}}'/>
 !! end
 
+# html2wt disabled because wts serializes as "#REDIRECT [[:en:File:Wiki.png]]"
+# Next test confirms this.
 !! test
-Redirect to language
+Redirect to language (1) (T104918)
 !! options
-parsoid
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 #REDIRECT [[en:File:Wiki.png]]
-!! html
-<link rel="mw:PageProp/redirect" href="./File:Wiki.png">
+!! html/parsoid
+<link rel="mw:PageProp/redirect" href="//en.wikipedia.org/wiki/File:Wiki.png"/>
 !! end
 
 !! test
-Redirect to interwiki
-!! options
-parsoid
+Redirect to language (2) (T104918)
 !! wikitext
-#REDIRECT [[meatball:File:Wiki.png]]
-!! html
-<link rel="mw:PageProp/redirect" href="./File:Wiki.png">
+#REDIRECT [[:en:File:Wiki.png]]
+!! html/parsoid
+<link rel="mw:PageProp/redirect" href="//en.wikipedia.org/wiki/File:Wiki.png"/>
 !! end
 
 !! test
-Non-English #REDIRECT
+Redirect to interwiki (T104918)
+!! wikitext
+#REDIRECT [[meatball:File:Wiki.png]]
+!! html/parsoid
+<link rel="mw:PageProp/redirect" href="http://www.usemod.com/cgi-bin/mb.pl?File:Wiki.png"/>
+!! end
+
+!! test
+Non-English #REDIRECT
 !! options
-parsoid
 language=is
 !! wikitext
 #TILVÍSUN [[Main Page]]
-!! html
-<link rel="mw:PageProp/redirect" href="./Main_Page">
+!! html/parsoid
+<link rel="mw:PageProp/redirect" href="./Main_Page" data-parsoid='{"src":"#TILVÍSUN ","a":{"href":"./Main_Page"},"sa":{"href":"Main Page"}}'/>
 !! end
 
 !! test
@@ -7874,8 +8167,8 @@ some text
 New redirect
 !! options
 parsoid=html2wt
-!! html
-<p>Foo<link rel="mw:PageProp/redirect" href="./Foo"></p>
+!! html/parsoid
+<p>Foo<link rel="mw:PageProp/redirect" href="./Foo"/></p>
 !! wikitext
 Foo
 #REDIRECT [[Foo]]
@@ -8225,7 +8518,7 @@ parsoid
 !! wikitext
 *<references />
 !! html/parsoid
-<ul><li data-parsoid='{}'><ol class="references" typeof="mw:Extension/references" about="#mwt2" data-parsoid='{}' data-mw='{"name":"references","attrs":{}}'></ol></li></ul>
+<ul><li data-parsoid='{}'><ol class="mw-references" typeof="mw:Extension/references" about="#mwt2" data-parsoid='{}' data-mw='{"name":"references","attrs":{}}'></ol></li></ul>
 !! end
 
 !! test
@@ -8258,11 +8551,15 @@ List items are not parsed correctly following a <pre> block (bug 785)
 * <pre>foo</pre>
 * <pre>bar</pre>
 * zar
-!! html
+!! html/php
 <ul><li> <pre>foo</pre></li>
 <li> <pre>bar</pre></li>
 <li> zar</li></ul>
 
+!! html/parsoid
+<ul><li> <pre data-parsoid='{"stx":"html"}'>foo</pre></li>
+<li> <pre data-parsoid='{"stx":"html"}'>bar</pre></li>
+<li> zar</li></ul>
 !! end
 
 !! test
@@ -9306,7 +9603,7 @@ hi+world%3F%21
 Magic Word: prioritize type info over data-parsoid
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <meta property="mw:PageProp/forcetoc" data-parsoid='{"magicSrc":"__NOTOC__"}'/>
 !! wikitext
 __FORCETOC__
@@ -9642,9 +9939,11 @@ Template with default value (value set)
 Template redirect
 !! wikitext
 {{templateredirect}}
-!! html
+!! html/php
 <p>(test)
 </p>
+!! html/parsoid
+<link rel="mw:PageProp/redirect" href="./Template:Templatesimple" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"templateredirect","href":"./Template:Templateredirect"},"params":{},"i":0}}]}'/>
 !! end
 
 !! test
@@ -9882,6 +10181,24 @@ Template with targets containing wikilinks
 </p>
 !! end
 
+!! article
+Template:''
+!! text
+bar
+!! endarticle
+
+!! test
+Templates: Double quotes as template target
+!! wikitext
+foo {{''}} baz
+!! html/php
+<p>foo bar baz
+</p>
+!! html/parsoid
+<p>foo <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"&#39;&#39;"},"params":{},"i":0}}]}'>bar</span> baz
+</p>
+!! end
+
 !! article
 Template:MSGNW test
 !! text
@@ -10669,6 +10986,24 @@ Templates: Support for templates generating attributes and content
 </tbody></table>
 !! end
 
+!! test
+3. Entities and nowikis inside templated attributes should be handled correctly inside templated tables
+!! wikitext
+{{tbl-start}}
+|{{table_attribs_3}}
+{{tbl-end}}
+!! html/php
+<table>
+<tr>
+<td style="background:#f9f9f9;">Foo
+</td></tr></table>
+
+!! html/parsoid
+<table about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[],[],[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"tbl-start","href":"./Template:Tbl-start"},"params":{},"i":0}},"\n|",{"template":{"target":{"wt":"table_attribs_3","href":"./Template:Table_attribs_3"},"params":{},"i":1}},"\n",{"template":{"target":{"wt":"tbl-end","href":"./Template:Tbl-end"},"params":{},"i":2}}]}'>
+<tbody><tr><td style="background:#f9f9f9;">Foo</td></tr>
+</tbody></table>
+!! end
+
 !!test
 Templates: HTML Tables: 1. Generating start of a HTML table
 !! wikitext
@@ -10896,6 +11231,46 @@ Templates: Wiki Tables: 6. Templated tags, templated td-tags
 
 !!end
 
+## This test case is very specific to Parsoid's internals
+## and is hence only tested for Parsoid's code. Parsoid uses
+## a <meta> marker tag for <ref> tags and they are expanded
+## much later. We are verifying that this <meta> tag usage
+## doesn't prevent foster parenting.
+!!test
+Templates: Wiki Tables: 7. Fosterable <ref>s should get fostered
+!!wikitext
+{{PartialTable}}<ref>foo</ref>
+|}
+
+<references />
+!!html/parsoid
+<span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-mw='{"parts":[{"template":{"target":{"wt":"PartialTable","href":"./Template:PartialTable"},"params":{},"i":0}},"&lt;ref>foo&lt;/ref>\n|}"]}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span><table about="#mwt2">
+<tbody>
+</tbody></table>
+
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
+!!end
+
+!! test
+Templates: Wiki Tables: 8. Fosterable meta-tags should get fostered
+!! wikitext
+{{echo|
+{{{!}}
+{{!}}-}}
+<onlyinclude>
+|foo
+</onlyinclude>
+{{!}}}
+!! html/parsoid
+<span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"\n{{{!}}\n{{!}}-"}},"i":0}},"\n&lt;onlyinclude>\n|foo\n&lt;/onlyinclude>\n{{!}}}"]}'>
+</span><meta typeof="mw:Includes/OnlyInclude" about="#mwt1"/><table about="#mwt1">
+<tbody><tr>
+
+<td>foo
+<meta typeof="mw:Includes/OnlyInclude/End"/></td></tr>
+</tbody></table>
+!! end
+
 !!test
 Templates: Lists: Multi-line list-items via templates
 !! wikitext
@@ -11921,7 +12296,7 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tright"><div class="thumbinner" style="width:139px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" width="137" height="16" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/206px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/274px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is a caption</div></div></div>
 
 !! html/parsoid
-<figure typeof="mw:Image/Thumb mw:ExpandedAttrs" about="#mwt2" data-mw='{"attribs":[["thumbnail",{"html":"thumb"}],["width",{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;dsr&amp;quot;:[24,38,null,null]}\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;137px&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\">137px&lt;/span>"}]]}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="16" width="137"/></a><figcaption>This is a caption</figcaption></figure>
+<figure typeof="mw:Image/Thumb mw:ExpandedAttrs" about="#mwt2" data-mw='{"attribs":[["thumbnail",{"html":"thumb"}],["width",{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;dsr&amp;quot;:[24,38,null,null]}\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;137px&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\">137px&lt;/span>"}]]}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="16" width="137"/></a><figcaption>This is a caption</figcaption></figure>
 !! end
 
 !! test
@@ -11932,7 +12307,7 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tright"><div class="thumbinner" style="width:139px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" width="137" height="16" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/206px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/274px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is a caption</div></div></div>
 
 !! html/parsoid
-<figure typeof="mw:Image/Thumb mw:ExpandedAttrs" about="#mwt3" data-mw='{"attribs":[["thumbnail",{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;dsr&amp;quot;:[18,32,null,null]}\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;thumb&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\">thumb&lt;/span>"}],["width",{"html":"&lt;span about=\"#mwt2\" typeof=\"mw:Transclusion\" data-parsoid=\"{&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;dsr&amp;quot;:[33,47,null,null]}\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;137px&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\">137px&lt;/span>"}]]}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="16" width="137"/></a><figcaption>This is a caption</figcaption></figure>
+<figure typeof="mw:Image/Thumb mw:ExpandedAttrs" about="#mwt3" data-mw='{"attribs":[["thumbnail",{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;dsr&amp;quot;:[18,32,null,null]}\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;thumb&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\">thumb&lt;/span>"}],["width",{"html":"&lt;span about=\"#mwt2\" typeof=\"mw:Transclusion\" data-parsoid=\"{&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;dsr&amp;quot;:[33,47,null,null]}\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;137px&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\">137px&lt;/span>"}]]}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="16" width="137"/></a><figcaption>This is a caption</figcaption></figure>
 !! end
 
 !! test
@@ -11989,7 +12364,7 @@ thumbsize=220
 !! html/parsoid
 <p>123<span class="mw-default-size" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></span>456</p>
 <p>123</p><figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure><p>456</p>
-<p>123</p><figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a></figure><p>456</p>
+<p>123</p><figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a></figure><p>456</p>
 !! end
 
 !! test
@@ -12011,7 +12386,7 @@ Image with multiple widths -- use last
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" width="300" height="34" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/450px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/600px-Foobar.jpg 2x" /></a>
 </p>
 !! html/parsoid
-<p><span typeof="mw:Image" data-mw='{"caption":"caption"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="34" width="300"/></a></span></p>
+<p><span typeof="mw:Image" data-mw='{"caption":"caption"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="34" width="300"/></a></span></p>
 !! end
 
 !! test
@@ -12027,7 +12402,7 @@ thumbsize=220
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" style="vertical-align: middle" /></a>
 </p>
 !! html/parsoid
-<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
 <p><span class="mw-default-size mw-valign-middle" typeof="mw:Image" data-mw='{"caption":"caption"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></span></p>
 !! end
 
@@ -12043,9 +12418,9 @@ Image with width attribute at different positions
 <div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div>
 
 !! html/parsoid
-<figure class="mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="23" width="200"/></a><figcaption>Caption</figcaption></figure>
-<figure class="mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="23" width="200"/></a><figcaption>Caption</figcaption></figure>
-<figure class="mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="23" width="200"/></a><figcaption>Caption</figcaption></figure>
+<figure class="mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="23" width="200"/></a><figcaption>Caption</figcaption></figure>
+<figure class="mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="23" width="200"/></a><figcaption>Caption</figcaption></figure>
+<figure class="mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="23" width="200"/></a><figcaption>Caption</figcaption></figure>
 !! end
 
 # a sad bit of backward-compatibility
@@ -12061,7 +12436,7 @@ parsoid=wt2html,wt2wt,html2html
 <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/177px-Foobar.jpg" width="177" height="20" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/265px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/353px-Foobar.jpg 2x" /></a>
 </p>
 !! html/parsoid
-<p><span typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="2" width="20"/></a></span> <span typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="20" width="177"/></a></span></p>
+<p><span typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="2" width="20"/></a></span> <span typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/177px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="20" width="177"/></a></span></p>
 !! end
 
 !! test
@@ -12187,7 +12562,7 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="http://example.com/"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="http://example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>Title</figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="http://example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>Title</figcaption></figure>
 !! end
 
 !! test
@@ -12334,9 +12709,9 @@ parsoid=wt2html,wt2wt,html2html
 </p><p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>
 </p>
 !! html/parsoid
-<p><span class="mw-default-size" typeof="mw:Image/Frameless" data-mw='{"caption":"caption"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a></span></p>
-<p><span class="mw-default-size" typeof="mw:Image/Frameless" data-mw='{"caption":"caption"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a></span></p>
-<p><span class="mw-default-size" typeof="mw:Image/Frameless" data-mw='{"caption":"caption"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image/Frameless" data-mw='{"caption":"caption"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image/Frameless" data-mw='{"caption":"caption"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image/Frameless" data-mw='{"caption":"caption"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a></span></p>
 !! end
 
 !! test
@@ -12372,9 +12747,9 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
 !! end
 
 ###################
@@ -12401,8 +12776,8 @@ parsoid=wt2html,wt2wt,html2html
 </p><p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="2000" height="227" class="thumbborder" /></a>
 </p>
 !! html/parsoid
-<p><span typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="227" width="2000"/></a></span></p>
-<p><span class="mw-image-border" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="227" width="2000"/></a></span></p>
+<p><span typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/1941px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="227" width="2000"/></a></span></p>
+<p><span class="mw-image-border" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/1941px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="227" width="2000"/></a></span></p>
 !! end
 
 !! test
@@ -12418,8 +12793,8 @@ parsoid=wt2html,wt2wt,html2html
 </p><p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/1000px-Foobar.jpg" width="1000" height="113" class="thumbborder" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/1500px-Foobar.jpg 1.5x, http://example.com/images/3/3a/Foobar.jpg 2x" /></a>
 </p>
 !! html/parsoid
-<p><span typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="113" width="1000"/></a></span></p>
-<p><span class="mw-image-border" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="113" width="1000"/></a></span></p>
+<p><span typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/1000px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="113" width="1000"/></a></span></p>
+<p><span class="mw-image-border" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/1000px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="113" width="1000"/></a></span></p>
 !! end
 
 !! test
@@ -12432,7 +12807,7 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tright"><div class="thumbinner" style="width:52px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" width="50" height="6" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/75px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/100px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div></div></div></div>
 
 !! html/parsoid
-<figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="6" width="50"/></a></figure>
+<figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="6" width="50"/></a></figure>
 !! end
 
 !! test
@@ -12448,8 +12823,8 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tright"><div class="thumbinner" style="width:2002px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="Foobar.svg" src="http://example.com/images/thumb/f/ff/Foobar.svg/2000px-Foobar.svg.png" width="2000" height="1500" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/3000px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/4000px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"></a></div></div></div></div>
 
 !! html/parsoid
-<figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure>
-<figure typeof="mw:Image/Thumb"><a href="./File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/f/ff/Foobar.svg" data-file-width="240" data-file-height="180" data-file-type="drawing" height="1500" width="2000"/></a></figure>
+<figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/1941px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure>
+<figure typeof="mw:Image/Thumb"><a href="./File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/thumb/f/ff/Foobar.svg/240px-Foobar.svg" data-file-width="240" data-file-height="180" data-file-type="drawing" height="1500" width="2000"/></a></figure>
 !! end
 
 !! test
@@ -12462,7 +12837,7 @@ parsoid=wt2html,wt2wt,html2html
 <p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" width="50" height="6" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/75px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/100px-Foobar.jpg 2x" /></a>
 </p>
 !! html/parsoid
-<p><span typeof="mw:Image/Frameless"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="6" width="50"/></a></span></p>
+<p><span typeof="mw:Image/Frameless"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="6" width="50"/></a></span></p>
 !! end
 
 !! test
@@ -12478,8 +12853,8 @@ parsoid=wt2html,wt2wt,html2html
 </p><p><a href="/wiki/File:Foobar.svg" class="image"><img alt="Foobar.svg" src="http://example.com/images/thumb/f/ff/Foobar.svg/2000px-Foobar.svg.png" width="2000" height="1500" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/3000px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/4000px-Foobar.svg.png 2x" /></a>
 </p>
 !! html/parsoid
-<p><span typeof="mw:Image/Frameless"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></span></p>
-<p><span typeof="mw:Image/Frameless"><a href="./File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/f/ff/Foobar.svg" data-file-width="240" data-file-height="180" data-file-type="drawing" height="1500" width="2000"/></a></span></p>
+<p><span typeof="mw:Image/Frameless"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/1941px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></span></p>
+<p><span typeof="mw:Image/Frameless"><a href="./File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/thumb/f/ff/Foobar.svg/240px-Foobar.svg" data-file-width="240" data-file-height="180" data-file-type="drawing" height="1500" width="2000"/></a></span></p>
 !! end
 
 !! test
@@ -12550,7 +12925,7 @@ thumbsize=220
 <div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><a rel="mw:ExtLink" href="http://example.com">http://example.com</a></figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><a rel="mw:ExtLink" href="http://example.com">http://example.com</a></figcaption></figure>
 !! end
 
 !! test
@@ -12564,7 +12939,7 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Alteration" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img alt="Alteration" resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><a rel="mw:ExtLink" href="http://example.com">http://example.com</a></figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img alt="Alteration" resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><a rel="mw:ExtLink" href="http://example.com">http://example.com</a></figcaption></figure>
 !! end
 
 !! test
@@ -12576,7 +12951,7 @@ SVG thumbnails with no language set
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="135" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/f/ff/Foobar.svg" data-file-width="240" data-file-height="180" data-file-type="drawing" height="165" width="220"/></a><figcaption>caption</figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/thumb/f/ff/Foobar.svg/220px-Foobar.svg" data-file-width="240" data-file-height="180" data-file-type="drawing" height="165" width="220"/></a><figcaption>caption</figcaption></figure>
 !! end
 
 !! test
@@ -12589,7 +12964,7 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=File:Foobar.svg&amp;lang=de" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png" width="180" height="135" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/f/ff/Foobar.svg" lang="de" data-file-width="240" data-file-height="180" data-file-type="drawing" height="165" width="220"/></a><figcaption>caption</figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/thumb/f/ff/Foobar.svg/220px-Foobar.svg" lang="de" data-file-width="240" data-file-height="180" data-file-type="drawing" height="165" width="220"/></a><figcaption>caption</figcaption></figure>
 !! end
 
 !! test
@@ -12613,7 +12988,7 @@ BUG 1887: A ISBN with a thumbnail
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a href="/wiki/Special:BookSources/1235467890" class="internal mw-magiclink-isbn">ISBN 1235467890</a></div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><a href="Special:BookSources/1235467890" rel="mw:ExtLink">ISBN 1235467890</a></figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><a href="Special:BookSources/1235467890" rel="mw:ExtLink">ISBN 1235467890</a></figcaption></figure>
 !! end
 
 !! test
@@ -12624,7 +12999,7 @@ BUG 1887: A RFC with a thumbnail
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is <a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc12354">RFC 12354</a></div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>This is <a href="//tools.ietf.org/html/rfc12354" rel="mw:ExtLink">RFC 12354</a></figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>This is <a href="//tools.ietf.org/html/rfc12354" rel="mw:ExtLink">RFC 12354</a></figcaption></figure>
 !! end
 
 !! test
@@ -12635,7 +13010,7 @@ BUG 1887: A mailto link with a thumbnail
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Please <a rel="nofollow" class="external free" href="mailto:nobody@example.com">mailto:nobody@example.com</a></div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>Please <a rel="mw:ExtLink" href="mailto:nobody@example.com">mailto:nobody@example.com</a></figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>Please <a rel="mw:ExtLink" href="mailto:nobody@example.com">mailto:nobody@example.com</a></figcaption></figure>
 !! end
 
 # Pending resolution to bug 368
@@ -12726,7 +13101,7 @@ Image caption containing another image
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is a caption with another <a href="/wiki/File:Thumb.png" class="image" title="image"><img alt="image" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" /></a> inside it!</div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>This is a caption with another <span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"image"}'><a href="./File:Thumb.png"><img resource="./File:Thumb.png" src="//example.com/images/e/ea/Thumb.png" data-file-width="135" data-file-height="135" data-file-type="bitmap" height="135" width="135"/></a></span> inside it!</figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>This is a caption with another <span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"image"}'><a href="./File:Thumb.png"><img resource="./File:Thumb.png" src="//example.com/images/e/ea/Thumb.png" data-file-width="135" data-file-height="135" data-file-type="bitmap" height="135" width="135"/></a></span> inside it!</figcaption></figure>
 !! end
 
 !! test
@@ -12750,7 +13125,7 @@ Image: caption containing leading space
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>bar</div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption> bar</figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption> bar</figcaption></figure>
 !!end
 
 !! test
@@ -12769,7 +13144,7 @@ and some more text.]]
 <div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is an example image thumbnail caption with a table <table> <tr> <th> Foo </th> <th> Bar </th></tr> <tr> <td> Foo1 </td> <td> Bar1 </td></tr></table> and some more text.</div></div></div>
 
 !! html/parsoid
-<figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="23" width="200"/></a><figcaption>This is an example image thumbnail caption with a table
+<figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="23" width="200"/></a><figcaption>This is an example image thumbnail caption with a table
 <table>
 <tbody>
 <tr><th>Foo </th><th>Bar</th></tr>
@@ -12786,7 +13161,7 @@ Bug 3090: External links other than http: in image captions
 <div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This caption has <a rel="nofollow" class="external text" href="irc://example.net">irc</a> and <a rel="nofollow" class="external text" href="https://example.com">Secure</a> ext links in it.</div></div></div>
 
 !! html/parsoid
-<figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="23" width="200"/></a><figcaption>This caption has <a rel="mw:ExtLink" href="irc://example.net">irc</a> and <a rel="mw:ExtLink" href="https://example.com">Secure</a> ext links in it.</figcaption></figure>
+<figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="23" width="200"/></a><figcaption>This caption has <a rel="mw:ExtLink" href="irc://example.net">irc</a> and <a rel="mw:ExtLink" href="https://example.com">Secure</a> ext links in it.</figcaption></figure>
 !! end
 
 !! test
@@ -12828,7 +13203,7 @@ language=es
 <div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/Foo" title="Foo"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/Archivo:Foobar.jpg" class="internal" title="Aumentar"></a></div>caption</div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="./Foo"><img resource="./Archivo:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="Foo"><img resource="./Archivo:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
 !! end
 
 !! test
@@ -12842,7 +13217,7 @@ parsoid=wt2html,wt2wt,html2html
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="extra thumbborder" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>
 </p>
 !! html/parsoid
-<p><span class="mw-default-size mw-image-border extra" typeof="mw:Image/Frameless" data-mw='{"caption":"caption"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a></span></p>
+<p><span class="mw-default-size mw-image-border extra" typeof="mw:Image/Frameless" data-mw='{"caption":"caption"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a></span></p>
 !! end
 
 # Note that 'right' is the default alignment, despite the misspelled 'righ' below
@@ -12863,9 +13238,9 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
-<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
 !! end
 
 !! article
@@ -12910,7 +13285,7 @@ Parsoid-specific image handling - simple image with size and middle alignment
 !! wikitext
 [[File:Foobar.jpg|middle|50px]]
 !! html/parsoid
-<p><span class="mw-valign-middle" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="6" width="50"/></a></span></p>
+<p><span class="mw-valign-middle" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="6" width="50"/></a></span></p>
 !! end
 
 !! test
@@ -12921,7 +13296,7 @@ parsoid=wt2wt,wt2html,html2html
 !! wikitext
 [[Image:Foobar.jpg|middle|50px]]
 !! html/parsoid
-<p><span class="mw-valign-middle" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="6" width="50"/></a></span></p>
+<p><span class="mw-valign-middle" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="6" width="50"/></a></span></p>
 !! end
 
 !! test
@@ -12930,7 +13305,7 @@ Parsoid-specific image handling - simple image with size and middle alignment
 !! wikitext
 [[File:Foobar.jpg|50px|middle]]
 !! html/parsoid
-<p><span class="mw-valign-middle" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"50px"},{"ck":"middle","ak":"middle"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="6" width="50" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"6","width":"50"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
+<p><span class="mw-valign-middle" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"50px"},{"ck":"middle","ak":"middle"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="6" width="50" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"6","width":"50"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
 !! end
 
 !! test
@@ -12941,7 +13316,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[Image:Foobar.jpg|50px|middle]]
 !! html/parsoid
-<p><span class="mw-valign-middle" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="6" width="50"/></a></span></p>
+<p><span class="mw-valign-middle" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="6" width="50"/></a></span></p>
 !! end
 
 !! test
@@ -12965,7 +13340,7 @@ Parsoid-specific image handling - thumbnail with halign, valign, and caption
 !! wikitext
 [[File:Foobar.jpg|left|baseline|thumb|caption content]]
 !! html/parsoid
-<figure class="mw-default-size mw-halign-left mw-valign-baseline" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption content</figcaption></figure>
+<figure class="mw-default-size mw-halign-left mw-valign-baseline" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption content</figcaption></figure>
 !! end
 
 !! test
@@ -12974,7 +13349,7 @@ Parsoid-specific image handling - thumbnail with halign, valign, and caption
 !! wikitext
 [[File:Foobar.jpg|thumb|left|baseline|caption content]]
 !! html/parsoid
-<figure class="mw-default-size mw-halign-left mw-valign-baseline" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"left","ak":"left"},{"ck":"baseline","ak":"baseline"},{"ck":"caption","ak":"caption content"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>caption content</figcaption></figure>
+<figure class="mw-default-size mw-halign-left mw-valign-baseline" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"left","ak":"left"},{"ck":"baseline","ak":"baseline"},{"ck":"caption","ak":"caption content"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>caption content</figcaption></figure>
 !! end
 
 !! test
@@ -12982,7 +13357,7 @@ Parsoid-specific image handling - thumbnail with specific size, halign, valign,
 !! wikitext
 [[Image:Foobar.jpg|right|middle|thumb|50x50px|caption]]
 !! html/parsoid
-<figure class="mw-halign-right mw-valign-middle" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="6" width="50"/></a><figcaption>caption</figcaption></figure>
+<figure class="mw-halign-right mw-valign-middle" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="6" width="50"/></a><figcaption>caption</figcaption></figure>
 !! end
 
 !! test
@@ -13050,7 +13425,7 @@ foo
 bar
 !! html/parsoid
 <p>foo</p>
-<figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="23" width="200"/></a><figcaption>This caption has a <center>unbalanced tag in it.</center></figcaption></figure>
+<figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="23" width="200"/></a><figcaption>This caption has a <center>unbalanced tag in it.</center></figcaption></figure>
 <p>bar</p>
 !! end
 
@@ -13061,7 +13436,7 @@ parsoid=wt2html,wt2wt
 !! wikitext
 [[File:Foobar.jpg|thumb|]]
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption></figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption></figcaption></figure>
 !! end
 
 # empty captions don't get serialized unless we're in the "round trip" case
@@ -13088,7 +13463,7 @@ Parsoid-specific image handling - whitespace caption
 !! wikitext
 [[File:Foobar.jpg|thumb| ]]
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption> </figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption> </figcaption></figure>
 !! end
 
 !! test
@@ -13435,6 +13810,152 @@ Bar
 </p>
 !! end
 
+## The whitespace on the empty line is part of the test. Please do not delete
+!! test
+1. Categories and newlines: All preceding newlines should be suppressed (courtesy bug 87)
+!! options
+parsoid=wt2html,wt2wt
+!! wikitext
+This
+   
+[[Category:Foo]] and this should be part of same paragraph (not an indent-pre)
+   
+{{echo|[[Category:Foo]] and so should this!}}
+!! html
+<p>This and this should be part of same paragraph (not an indent-pre) and so should this!
+</p>
+!! html/parsoid
+<p>This
+   
+<link rel="mw:PageProp/Category" href="./Category:Foo"/> and this should be part of same paragraph (not an indent-pre)
+   
+<link rel="mw:PageProp/Category" href="./Category:Foo" about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Category:Foo]] and so should this!"}},"i":0}}]}'/><span about="#mwt1"> and so should this!</span></p>
+!! end
+
+## Parsoid will not try to wt2wt this while preserving newlines because
+## it suppresses excess newlines within list items -- and we don't want to
+## introduce a special case just for categories, which is, in reality somewhat
+## odd behavior -- categories are unlikely to be used in list items like this
+## in top-level pages and are only likely to show up in template-generated
+## list items where this RT-ing is a non-issue.
+##
+## The whitespace on the empty line is part of the test. Please do not delete
+!! test
+2. Categories and newlines: All preceding newlines should be suppressed (courtesy bug 87)
+!! options
+parsoid=wt2html
+!! wikitext
+* This
+   
+[[Category:Foo]] and this should be part of the same list item
+* So should this
+
+{{echo|[[Category:Foo]] and this should be part of the same list item}}
+!! html
+<ul><li>This and this should be part of the same list item</li>
+<li>So should this and this should be part of the same list item</li></ul>
+!! html/parsoid
+<ul>
+<li>This <link rel="mw:PageProp/Category" href="./Category:Foo"/> and this should be part of the same list item</li>
+<li>So should this <link rel="mw:PageProp/Category" href="Category:Foo" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Category:Foo]] and this should be part of the same list item"}},"i":0}}]}'/><span> and this should be part of the same list item</span></li>
+</ul>
+!! end
+
+## Newlines and categories that follow the last item of a list
+## are treated differently because this (list followed by categories)
+## is an extremely common pattern on wikis.
+!! test
+3. Categories and newlines: newline suppression for last list item should RT properly
+!! wikitext
+* a
+* b 
+   
+[[Category:Foo]]
+   
+[[Category:Bar]]
+[[Category:Baz]]
+!! html/parsoid
+<ul><li> a</li>
+<li> b</li></ul> 
+   
+<link rel="mw:PageProp/Category" href="./Category:Foo" data-parsoid='{"stx":"simple","a":{"href":"./Category:Foo"},"sa":{"href":"Category:Foo"}}'/>
+   
+<link rel="mw:PageProp/Category" href="./Category:Bar" data-parsoid='{"stx":"simple","a":{"href":"./Category:Bar"},"sa":{"href":"Category:Bar"}}'/>
+<link rel="mw:PageProp/Category" href="./Category:Baz" data-parsoid='{"stx":"simple","a":{"href":"./Category:Baz"},"sa":{"href":"Category:Baz"}}'/>
+!! end
+
+!! test
+4. Categories and newlines: newline suppression for last list item should RT properly
+!! wikitext
+* a
+**** b
+
+[[Category:Foo]]
+!! html/parsoid
+<ul><li> a
+<ul><li><ul><li><ul><li> b</li></ul></li></ul></li></ul></li></ul>
+
+<link rel="mw:PageProp/Category" href="./Category:Foo" data-parsoid='{"stx":"simple","a":{"href":"./Category:Foo"},"sa":{"href":"Category:Foo"}}'/>
+!! end
+
+## only wt2html for this to make sure the algo only applies to the rightmost path
+!! test
+5. Categories and newlines: migrateTrailingCategories dom pass should only run on the rightmost path of nested lists
+!! options
+parsoid=wt2html
+!! wikitext
+* a
+** b
+[[Category:Foo]]
+* c
+** d
+[[Category:Foo]]
+!! html/parsoid
+<ul><li> a
+<ul><li> b
+<link rel="mw:PageProp/Category" href="./Category:Foo" data-parsoid='{"stx":"simple","a":{"href":"./Category:Foo"},"sa":{"href":"Category:Foo"}}'/></li></ul></li>
+<li> c
+<ul><li> d</li></ul></li></ul>
+<link rel="mw:PageProp/Category" href="./Category:Foo" data-parsoid='{"stx":"simple","a":{"href":"./Category:Foo"},"sa":{"href":"Category:Foo"}}'/>
+!! end
+
+!! test
+6. Categories and newlines: migrateTrailingCategories dom pass should not migrate categories not preceded by newlines
+!! wikitext
+* a [[Category:Foo]]
+!! html/parsoid
+<ul><li>a <link rel="mw:PageProp/Category" href="./Category:Foo" data-parsoid='{"stx":"simple","a":{"href":"./Category:Foo"},"sa":{"href":"Category:Foo"}}'/></li></ul>
+!! end
+
+# This test also demonstrates because of newline+category tunneling
+# through the list hander, template wrapping doesn't expand to the
+# containing list when the list item swallows the category.
+!! test
+7. Categories and newlines: migrateTrailingCategories dom pass should leave template content alone
+!! wikitext
+* {{echo|a
+[[Category:Foo]]}}
+!! html/parsoid
+<ul><li> <span about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a\n[[Category:Foo]]"}},"i":0}}]}'>a</span><span about="#mwt1">
+</span><link rel="mw:PageProp/Category" href="./Category:Foo" about="#mwt1" data-parsoid='{"stx":"simple","a":{"href":"./Category:Foo"},"sa":{"href":"Category:Foo"}}'/></li></ul>
+!! end
+
+!! test
+8. Categories and newlines: migrateTrailingCategories dom pass should not get tripped by intervening templates
+!! wikitext
+* a
+
+{{echo|[[Category:Foo]]
+[[Category:Bar]]}}
+[[Category:Baz]]
+!! html/parsoid
+<ul><li> a</li></ul>
+
+<link rel="mw:PageProp/Category" href="./Category:Foo" about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"simple","a":{"href":"./Category:Foo"},"sa":{"href":"Category:Foo"},"pi":[[{"k":"1","spc":["","","",""]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Category:Foo]]\n[[Category:Bar]]"}},"i":0}}]}'/><span about="#mwt1">
+</span><link rel="mw:PageProp/Category" href="./Category:Bar" about="#mwt1" data-parsoid='{"stx":"simple","a":{"href":"./Category:Bar"},"sa":{"href":"Category:Bar"}}'/>
+<link rel="mw:PageProp/Category" href="./Category:Baz" data-parsoid='{"stx":"simple","a":{"href":"./Category:Baz"},"sa":{"href":"Category:Baz"}}'/>
+!! end
+
 !! test
 Parsoid: Serialize link to category page with colon escape
 !! options
@@ -13450,15 +13971,21 @@ parsoid
 </p>
 !! end
 
+# html2wt localizes the "Category" namespace.
+# XXX the <link> element needs an empty data-parsoid attribute, or
+# else the html2html test fails because spaces are inserted.
 !! test
-Parsoid: Link prefix/suffixes aren't applied to category links
+Link prefix/suffixes aren't applied to category links
 !! options
 parsoid=wt2html,wt2wt,html2html
 language=is
 !! wikitext
 x[[Category:Foo]]y
-!! html
-<p>x<link rel="mw:PageProp/Category" href="Category:Foo">y</p>
+!! html/php
+<p>xy
+</p>
+!! html/parsoid
+<p>x<link rel="mw:PageProp/Category" href="./Flokkur:Foo" data-parsoid=""/>y</p>
 !! end
 
 !! test
@@ -13630,7 +14157,7 @@ __FORCETOC__
 == Headline ==
 == Headline 2 ==
 == Headline ==
-!! html
+!! html/php
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Headline_2"><span class="tocnumber">1</span> <span class="toctext">Headline 2</span></a></li>
@@ -13744,6 +14271,22 @@ TOC regression (T11764)
 
 !! end
 
+!! test
+TOC for heading containing <span id="..."></span> (T96153)
+!! wikitext
+__FORCETOC__
+==<span id="old-anchor"></span>New title==
+!! html/php
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#New_title"><span class="tocnumber">1</span> <span class="toctext">New title</span></a></li>
+</ul>
+</div>
+
+<h2><span class="mw-headline" id="New_title"><span id="old-anchor"></span>New title</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: New title">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+
+!! end
+
 !! test
 TOC with wgMaxTocLevel=3 (bug 6204)
 !! options
@@ -17343,7 +17886,7 @@ __FORCETOC__ override
 !! wikitext
 __NEWSECTIONLINK__
 __FORCETOC__
-!! html
+!! html/php
 <p><br />
 </p>
 !! end
@@ -17548,7 +18091,7 @@ Images with the "|" character in the comment
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>An <a rel="nofollow" class="external text" href="http://test/?param1=%7Cleft%7C&amp;param2=%7Cx">external</a> URL</div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>An <a rel="mw:ExtLink" href="http://test/?param1=|left|&amp;param2=|x">external</a> URL</figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>An <a rel="mw:ExtLink" href="http://test/?param1=|left|&amp;param2=|x">external</a> URL</figcaption></figure>
 !! end
 
 !! test
@@ -19093,7 +19636,7 @@ percent-encoding and + signs in comments (Bug 26410)
 comment
 !! wikitext
 [[ABC%33D% ++]] [[ABC%33D% ++|+%20]]
-!! html
+!! html/php
 <a href="/index.php?title=ABC3D%25_%2B%2B&amp;action=edit&amp;redlink=1" class="new" title="ABC3D% ++ (page does not exist)">ABC3D% ++</a> <a href="/index.php?title=ABC3D%25_%2B%2B&amp;action=edit&amp;redlink=1" class="new" title="ABC3D% ++ (page does not exist)">+%20</a>
 !! end
 
@@ -19423,7 +19966,10 @@ percent-encoding and + signs in internal links (Bug 26410)
 <a href="/index.php?title=3E&amp;action=edit&amp;redlink=1" class="new" title="3E (page does not exist)">3E</a> <a href="/index.php?title=3E%2B&amp;action=edit&amp;redlink=1" class="new" title="3E+ (page does not exist)">3E+</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="User:+%" title="User:+%">User:+%</a> <a rel="mw:WikiLink" href="Page+title%" title="Page+title%">Page+title%</a> <a rel="mw:WikiLink" href="%+" title="%+">%+</a> <a rel="mw:WikiLink" href="%+" title="%+">%20</a> <a rel="mw:WikiLink" href="%+" title="%+">%+ </a> <a rel="mw:WikiLink" href="%+r" title="%+r">%+r</a> <a rel="mw:WikiLink" href="%" title="%">%</a> <a rel="mw:WikiLink" href="+" title="+">+</a> <span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"[[bar]]"}'><a href="./File:%+abc9"><img resource="./File:%25+abc9" src="./Special:FilePath/%+abc9" height="220" width="220"/></a></span> <a rel="mw:WikiLink" href="3E" title="3E">3E</a> <a rel="mw:WikiLink" href="3E+" title="3E+">3E+</a></p>
+<p><a rel="mw:WikiLink" href="./User:+%25" title="User:+%">User:+%</a> <a rel="mw:WikiLink" href="Page+title%25" title="Page+title%">Page+title%</a>
+<a rel="mw:WikiLink" href="%25+" title="%+">%+</a> <a rel="mw:WikiLink" href="%25+" title="%+">%20</a> <a rel="mw:WikiLink" href="%25+" title="%+">%+ </a> <a rel="mw:WikiLink" href="%25+r" title="%+r">%+r</a>
+<a rel="mw:WikiLink" href="%25" title="%">%</a> <a rel="mw:WikiLink" href="+" title="+">+</a> <span class="mw-default-size" typeof="mw:Error mw:Image" data-parsoid='{"optList":[{"ck":"bogus","ak":"foo"},{"ck":"caption","ak":"[[bar]]"}]}' data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"[[bar]]"}'><a href="./File:%25+abc9" data-parsoid='{"a":{"href":"./File:%25+abc9"},"sa":{}}'><img resource="./File:%25+abc9" src="./Special:FilePath/%25+abc9" height="220" width="220" data-parsoid='{"a":{"resource":"./File:%25+abc9","height":"220","width":"220"},"sa":{"resource":"File:%+abc%39"}}'/></a></span>
+<a rel="mw:WikiLink" href="./3E" title="3E" data-parsoid='{"stx":"simple","a":{"href":"./3E"},"sa":{"href":"%33%45"}}'>3E</a> <a rel="mw:WikiLink" href="./3E+" title="3E+" data-parsoid='{"stx":"simple","a":{"href":"./3E+"},"sa":{"href":"%33%45+"}}'>3E+</a></p>
 !! end
 
 !! test
@@ -19830,10 +20376,12 @@ Strip marker in urlencode
 {{urlencode:x<nowiki/>y}}
 {{urlencode:x<nowiki/>y|wiki}}
 {{urlencode:x<nowiki/>y|path}}
+{{urlencode:x<pre id="one">two</pre>y}}
 !! html
 <p>xy
 xy
 xy
+xy
 </p>
 !! end
 
@@ -20192,10 +20740,11 @@ parsoid=wt2html,wt2wt
 
 <small>[[Image:Foobar.jpg|right|300px]]</small>
 !! html/parsoid
+
 <p><b>foo</b></p>
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><b>caption</b></figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><b>caption</b></figcaption></figure>
 <p><b>bar</b></p>
-<small><figure class="mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="34" width="300"/></a></figure></small>
+<small><figure class="mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="34" width="300"/></a></figure></small>
 !! end
 
 #### ----------------------------------------------------------------
@@ -20214,13 +20763,13 @@ B <ref name="x">foo</ref>
 C <ref name="y" />
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-x_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-2"},"attrs":{"name":"x"}}'><a href="#cite_note-x-2">[2]</a></span>
-C <span about="#mwt6" class="reference" id="cite_ref-y_3-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"y"}}'><a href="#cite_note-y-3">[3]</a></span></p>
-<ol class="references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-x-2" id="cite_note-x-2"><span rel="mw:referencedBy"><a href="#cite_ref-x_2-0">↑</a></span> <span id="mw-reference-text-cite_note-x-2" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-y-3" id="cite_note-y-3"><span rel="mw:referencedBy"><a href="#cite_ref-y_3-0">↑</a></span> <span id="mw-reference-text-cite_note-y-3" class="mw-reference-text"></span></li>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
+B <span about="#mwt4" class="mw-ref" id="cite_ref-x_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-2"},"attrs":{"name":"x"}}'><a href="#cite_note-x-2"><span class="mw-reflink-text">[2]</span></a></span>
+C <span about="#mwt6" class="mw-ref" id="cite_ref-y_3-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"y"}}'><a href="#cite_note-y-3"><span class="mw-reflink-text">[3]</span></a></span></p>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
+<li about="#cite_note-x-2" id="cite_note-x-2"><a href="#cite_ref-x_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-x-2" class="mw-reference-text">foo</span></li>
+<li about="#cite_note-y-3" id="cite_note-y-3"><a href="#cite_ref-y_3-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-y-3" class="mw-reference-text"></span></li>
 </ol>
 !!end
 
@@ -20233,10 +20782,10 @@ A <ref name="x">foo</ref>
 B <ref name="x" />
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-x_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-1"},"attrs":{"name":"x"}}'><a href="#cite_note-x-1">[1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-x_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="#cite_note-x-1">[1]</a></span></p>
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-x-1" id="cite_note-x-1"><span rel="mw:referencedBy">↑ <a href="#cite_ref-x_1-0">1.0</a> <a href="#cite_ref-x_1-1">1.1</a></span> <span id="mw-reference-text-cite_note-x-1" class="mw-reference-text">foo</span></li>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-x_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-1"},"attrs":{"name":"x"}}'><a href="#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
+B <span about="#mwt4" class="mw-ref" id="cite_ref-x_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-x-1" id="cite_note-x-1"><span rel="mw:referencedBy"><a href="#cite_ref-x_1-0"><span class="mw-linkback-text">1 </span></a><a href="#cite_ref-x_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-x-1" class="mw-reference-text">foo</span></li>
 </ol>
 !!end
 
@@ -20250,11 +20799,11 @@ B <ref name=" x " />
 C <ref name= x  />
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-x_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-1"},"attrs":{"name":"x"}}'><a href="#cite_note-x-1">[1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-x_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="#cite_note-x-1">[1]</a></span>
-C <span about="#mwt6" class="reference" id="cite_ref-x_1-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="#cite_note-x-1">[1]</a></span></p>
-<ol class="references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-x-1" id="cite_note-x-1"><span rel="mw:referencedBy">↑ <a href="#cite_ref-x_1-0">1.0</a> <a href="#cite_ref-x_1-1">1.1</a> <a href="#cite_ref-x_1-2">1.2</a></span> <span id="mw-reference-text-cite_note-x-1" class="mw-reference-text">foo</span></li>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-x_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-1"},"attrs":{"name":"x"}}'><a href="#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
+B <span about="#mwt4" class="mw-ref" id="cite_ref-x_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
+C <span about="#mwt6" class="mw-ref" id="cite_ref-x_1-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-x-1" id="cite_note-x-1"><span rel="mw:referencedBy"><a href="#cite_ref-x_1-0"><span class="mw-linkback-text">1 </span></a><a href="#cite_ref-x_1-1"><span class="mw-linkback-text">2 </span></a><a href="#cite_ref-x_1-2"><span class="mw-linkback-text">3 </span></a></span> <span id="mw-reference-text-cite_note-x-1" class="mw-reference-text">foo</span></li>
 </ol>
 !!end
 
@@ -20267,9 +20816,9 @@ parsoid
 A <ref name="constructor">foo</ref>
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-constructor_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-constructor-1"},"attrs":{"name":"constructor"}}'><a href="#cite_note-constructor-1">[1]</a></span></p>
-<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-constructor-1" id="cite_note-constructor-1"><span rel="mw:referencedBy"><a href="#cite_ref-constructor_1-0">↑</a></span> <span id="mw-reference-text-cite_note-constructor-1" class="mw-reference-text">foo</span></li>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-constructor_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-constructor-1"},"attrs":{"name":"constructor"}}'><a href="#cite_note-constructor-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-constructor-1" id="cite_note-constructor-1"><a href="#cite_ref-constructor_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-constructor-1" class="mw-reference-text">foo</span></li>
 </ol>
 !!end
 
@@ -20284,10 +20833,10 @@ A <ref>
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">This is a <b><a rel="mw:WikiLink" href="Bolded_link" title="Bolded link">bolded link</a></b> and this is a <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">This is a <b><a rel="mw:WikiLink" href="Bolded_link" title="Bolded link">bolded link</a></b> and this is a <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
 </span></li>
 </ol>
 !!end
@@ -20305,10 +20854,10 @@ A <ref>
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo
  bar
  baz
 </span></li>
@@ -20335,10 +20884,10 @@ booz
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo
 
 bar
 
@@ -20361,9 +20910,9 @@ A <ref> foo {{echo|</ref> B C}}
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> B C<span typeof="mw:Nowiki">}}</span></p>
-<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo <span typeof="mw:Nowiki" data-parsoid='{"src":"{{","dsr":[12,14,0,0]}'>{{</span>echo|</span></li>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C<span typeof="mw:Nowiki">}}</span></p>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo <span typeof="mw:Nowiki" data-parsoid='{"src":"{{","dsr":[12,14,0,0]}'>{{</span>echo|</span></li>
 </ol>
 !!end
 
@@ -20375,9 +20924,9 @@ parsoid
 A <ref> foo <!--</ref> B C
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> B C</p>
-<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo <!----></span></li>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C</p>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo <!----></span></li>
 </ol>
 !!end
 
@@ -20390,11 +20939,11 @@ A <ref> <b> foo </ref> B C
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> B C</p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C</p>
 
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"><b data-parsoid='{"stx":"html","autoInsertedEnd":true}'> foo </b></span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"><b data-parsoid='{"stx":"html","autoInsertedEnd":true}'> foo </b></span></li>
 </ol>
 !!end
 
@@ -20407,37 +20956,35 @@ A <ref>foo</ref> B
 C <ref>bar</ref> D
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> B
-C <span about="#mwt4" class="reference" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="#cite_note-2">[2]</a></span> D</p>
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2">↑</a></span> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B
+C <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span> D</p>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
+<li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
 </ol>
 !!end
 
 !!test
 Ref: 12. ref-tags act as trailing newline migration barrier
-!!options
-parsoid
 !! wikitext
-<!--the newline at the end of this line moves out of the p-tag-->a
+<!--the newline at the end of this line moves out of the p tag-->a
 
-b<!--the newline at the end of this line stays inside the p-tag--> <ref />
+b<!--the newline at the end of this line stays inside the p tag--> <ref />
 <ref />
 
 c
 <references />
-!! html
-<p><!--the newline at the end of this line moves out of the p-tag-->a</p>
+!! html/parsoid
+<!--the newline at the end of this line moves out of the p tag--><p>a</p>
 
 
-<p>b<!--the newline at the end of this line stays inside the p-tag--> <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a href="#cite_note-1">[1]</a></span>
-<span about="#mwt4" class="reference" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a href="#cite_note-2">[2]</a></span></p>
+<p>b<!--the newline at the end of this line stays inside the p tag--> <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
+<span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a href="#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span></p>
 
 <p>c</p>
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"></span></li>
-<li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2">↑</a></span> <span id="mw-reference-text-cite_note-2" class="mw-reference-text"></span></li></ol>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"></span></li>
+<li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text"></span></li></ol>
 !!end
 
 !!test
@@ -20450,11 +20997,11 @@ parsoid
 </ref> B
 <references />
 !! html
-<p><span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> A
-<span about="#mwt4" class="reference" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="#cite_note-2">[2]</a></span> B</p>
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2">↑</a></span> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar
+<p><span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> A
+<span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span> B</p>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
+<li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar
 </span></li>
 </ol>
 !!end
@@ -20468,10 +21015,10 @@ parsoid
 
 <references />
 !! html
-<p><span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span>
+<p><span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
 </p>
-<ol class="references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo &lt;ref>bar&lt;/ref> baz</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo &lt;ref>bar&lt;/ref> baz</span></li>
 </ol>
 !!end
 
@@ -20485,10 +21032,10 @@ B1 <ref name="b" /> B2 <ref name="b">bar</ref>
 
 <references />
 !! html
-<p>A1 <span about="#mwt3" class="reference" id="cite_ref-a_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a-1"},"attrs":{"name":"a"}}'><a href="#cite_note-a-1">[1]</a></span> A2 <span about="#mwt4" class="reference" id="cite_ref-a_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="#cite_note-a-1">[1]</a></span>
-B1 <span about="#mwt7" class="reference" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"b"}}'><a href="#cite_note-b-2">[2]</a></span> B2 <span about="#mwt8" class="reference" id="cite_ref-b_2-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-b-2"},"attrs":{"name":"b"}}'><a href="#cite_note-b-2">[2]</a></span></p>
+<p>A1 <span about="#mwt3" class="mw-ref" id="cite_ref-a_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a-1"},"attrs":{"name":"a"}}'><a href="#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span> A2 <span about="#mwt4" class="mw-ref" id="cite_ref-a_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span>
+B1 <span about="#mwt7" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"b"}}'><a href="#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span> B2 <span about="#mwt8" class="mw-ref" id="cite_ref-b_2-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-b-2"},"attrs":{"name":"b"}}'><a href="#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy">↑ <a href="#cite_ref-a_1-0">1.0</a> <a href="#cite_ref-a_1-1">1.1</a></span> <span id="mw-reference-text-cite_note-a-1" class="mw-reference-text">foo</span></li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy">↑ <a href="#cite_ref-b_2-0">2.0</a> <a href="#cite_ref-b_2-1">2.1</a></span> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">bar</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy"><a href="#cite_ref-a_1-0"><span class="mw-linkback-text">1 </span></a><a href="#cite_ref-a_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-a-1" class="mw-reference-text">foo</span></li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b_2-0"><span class="mw-linkback-text">1 </span></a><a href="#cite_ref-b_2-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">bar</span></li>
 </ol>
 !!end
 
@@ -20502,9 +21049,9 @@ A <ref >foo</ref >
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
-<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
 !!end
 
 !!test
@@ -20516,11 +21063,11 @@ parsoid
 
 <references />
 !!html
-<p><span class="reference" id="cite_ref-a_b_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a_b-1"},"attrs":{"name":"a b"}}'><a href="#cite_note-a_b-1">[1]</a></span>
+<p><span class="mw-ref" id="cite_ref-a_b_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a_b-1"},"attrs":{"name":"a b"}}'><a href="#cite_note-a_b-1"><span class="mw-reflink-text">[1]</span></a></span>
 </p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-a_b-1" id="cite_note-a_b-1"><span rel="mw:referencedBy"><a href="#cite_ref-a_b_1-0">↑</a></span> <span id="mw-reference-text-cite_note-a_b-1" class="mw-reference-text">foo</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-a_b-1" id="cite_note-a_b-1"><a href="#cite_ref-a_b_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-a_b-1" class="mw-reference-text">foo</span></li>
 </ol>
 !!end
 
@@ -20533,11 +21080,11 @@ parsoid
 
 <references />
 !!html
-<p><span class="reference" id="cite_ref-.7B.7Becho.7Ca.7D.7D_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-.7B.7Becho.7Ca.7D.7D-1"},"attrs":{"name":"{{echo|a}}"}}'><a href="#cite_note-.7B.7Becho.7Ca.7D.7D-1">[1]</a></span>
+<p><span class="mw-ref" id="cite_ref-.7B.7Becho.7Ca.7D.7D_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-.7B.7Becho.7Ca.7D.7D-1"},"attrs":{"name":"{{echo|a}}"}}'><a href="#cite_note-.7B.7Becho.7Ca.7D.7D-1"><span class="mw-reflink-text">[1]</span></a></span>
 </p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-.7B.7Becho.7Ca.7D.7D-1" id="cite_note-.7B.7Becho.7Ca.7D.7D-1"><span rel="mw:referencedBy"><a href="#cite_ref-.7B.7Becho.7Ca.7D.7D_1-0">↑</a></span> <span id="mw-reference-text-cite_note-.7B.7Becho.7Ca.7D.7D-1" class="mw-reference-text">foo</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-.7B.7Becho.7Ca.7D.7D-1" id="cite_note-.7B.7Becho.7Ca.7D.7D-1"><a href="#cite_ref-.7B.7Becho.7Ca.7D.7D_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-.7B.7Becho.7Ca.7D.7D-1" class="mw-reference-text">foo</span></li>
 </ol>
 !!end
 
@@ -20550,10 +21097,10 @@ parsoid
 
 <references />
 !! html
-<p>1 <span about="#mwt3" class="reference" id="cite_ref-a_.26_b_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a_.26_b-1"},"attrs":{"name":"a &amp; b"}}'><a href="#cite_note-a_.26_b-1">[1]</a></span> 2 <span about="#mwt4" class="reference" id="cite_ref-a_.26_b_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a &amp;amp; b"}}'><a href="#cite_note-a_.26_b-1">[1]</a></span>
+<p>1 <span about="#mwt3" class="mw-ref" id="cite_ref-a_.26_b_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a_.26_b-1"},"attrs":{"name":"a &amp; b"}}'><a href="#cite_note-a_.26_b-1"><span class="mw-reflink-text">[1]</span></a></span> 2 <span about="#mwt4" class="mw-ref" id="cite_ref-a_.26_b_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a &amp;amp; b"}}'><a href="#cite_note-a_.26_b-1"><span class="mw-reflink-text">[1]</span></a></span>
 </p>
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-a_.26_b-1" id="cite_note-a_.26_b-1"><span rel="mw:referencedBy">↑ <a href="#cite_ref-a_.26_b_1-0">1.0</a> <a href="#cite_ref-a_.26_b_1-1">1.1</a></span> <span id="mw-reference-text-cite_note-a_.26_b-1" class="mw-reference-text">foo</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-a_.26_b-1" id="cite_note-a_.26_b-1"><span rel="mw:referencedBy"><a href="#cite_ref-a_.26_b_1-0"><span class="mw-linkback-text">1 </span></a><a href="#cite_ref-a_.26_b_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-a_.26_b-1" class="mw-reference-text">foo</span></li>
 </ol>
 !!end
 
@@ -20568,28 +21115,24 @@ C <ref name="foo" />
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-foo_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-foo-1"},"attrs":{"name":"foo"}}'><a href="#cite_note-foo-1">[1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-foo_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"Foo two"},"attrs":{"name":"foo"}}'><a href="#cite_note-foo-1">[1]</a></span>
-C <span about="#mwt6" class="reference" id="cite_ref-foo_1-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"foo"}}'><a href="#cite_note-foo-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-foo_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-foo-1"},"attrs":{"name":"foo"}}'><a href="#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span>
+B <span about="#mwt4" class="mw-ref" id="cite_ref-foo_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"Foo two"},"attrs":{"name":"foo"}}'><a href="#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span>
+C <span about="#mwt6" class="mw-ref" id="cite_ref-foo_1-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"foo"}}'><a href="#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-foo-1" id="cite_note-foo-1"><span rel="mw:referencedBy">↑ <a href="#cite_ref-foo_1-0">1.0</a> <a href="#cite_ref-foo_1-1">1.1</a> <a href="#cite_ref-foo_1-2">1.2</a></span> <span id="mw-reference-text-cite_note-foo-1" class="mw-reference-text">Foo one</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-foo-1" id="cite_note-foo-1"><span rel="mw:referencedBy"><a href="#cite_ref-foo_1-0"><span class="mw-linkback-text">1 </span></a><a href="#cite_ref-foo_1-1"><span class="mw-linkback-text">2 </span></a><a href="#cite_ref-foo_1-2"><span class="mw-linkback-text">3 </span></a></span> <span id="mw-reference-text-cite_note-foo-1" class="mw-reference-text">Foo one</span></li>
 </ol>
 !!end
 
 !!test
 References: 1. references tag without any refs should be handled properly
-!!options
-parsoid
 !! wikitext
 <references />
-!! html
-<ol class="references" typeof="mw:Extension/references" about="#mwt2" data-mw='{"name":"references","attrs":{}}'></ol>
+!! html/parsoid
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt2" data-mw='{"name":"references","attrs":{}}'></ol>
 !!end
 
 !!test
 References: 2. references tag with group only outputs references from that group
-!!options
-parsoid
 !! wikitext
 A <ref group="a">foo</ref>
 B <ref group="b">bar</ref>
@@ -20598,26 +21141,24 @@ C <ref>baz</ref>
 <references group="a" />
 <references />
 <references group="b" />
-!! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{"group":"a"}}'><a href="#cite_note-1">[a 1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{"group":"b"}}'><a href="#cite_note-2">[b 1]</a></span>
-C <span class="reference" id="cite_ref-3" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-3"},"attrs":{}}'><a href="#cite_note-3">[1]</a></span></p>
+!! html/parsoid
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{"group":"a"}}'><a href="#cite_note-1" data-mw-group="a"><span class="mw-reflink-text">[a 1]</span></a></span>
+B <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{"group":"b"}}'><a href="#cite_note-2" data-mw-group="b"><span class="mw-reflink-text">[b 1]</span></a></span>
+C <span class="mw-ref" id="cite_ref-3" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-3"},"attrs":{}}'><a href="#cite_note-3"><span class="mw-reflink-text">[1]</span></a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{"group":"a"}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw-group="a" data-mw='{"name":"references","attrs":{"group":"a"}}'>
+<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" data-mw-group="a" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
 </ol>
-<ol class="references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-3" id="cite_note-3"><span rel="mw:referencedBy"><a href="#cite_ref-3">↑</a></span> <span id="mw-reference-text-cite_note-3" class="mw-reference-text">baz</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-3" id="cite_note-3"><a href="#cite_ref-3" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-3" class="mw-reference-text">baz</span></li>
 </ol>
-<ol class="references" typeof="mw:Extension/references" about="#mwt12" data-mw='{"name":"references","attrs":{"group":"b"}}'>
-<li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2">↑</a></span> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt12" data-mw-group="b" data-mw='{"name":"references","attrs":{"group":"b"}}'>
+<li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" data-mw-group="b" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
 </ol>
 !!end
 
 !!test
 References: 3. ref list should be cleared after processing references
-!!options
-parsoid
 !! wikitext
 A <ref>foo</ref>
 
@@ -20626,23 +21167,21 @@ A <ref>foo</ref>
 B <ref>bar</ref>
 
 <references />
-!! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
+!! html/parsoid
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
 </ol>
 
-<p>B <span about="#mwt6" class="reference" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="#cite_note-2">[1]</a></span></p>
+<p>B <span about="#mwt6" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="#cite_note-2"><span class="mw-reflink-text">[1]</span></a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2">↑</a></span> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
 </ol>
 !!end
 
 !!test
 References: 4. only referenced group should be cleared after processing references
-!!options
-parsoid
 !! wikitext
 A <ref group="a">afoo</ref>
 B <ref>bfoo</ref>
@@ -20652,23 +21191,21 @@ B <ref>bfoo</ref>
 C <ref>cfoo</ref>
 
 <references />
-!! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{"group":"a"}}'><a href="#cite_note-1">[a 1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="#cite_note-2">[1]</a></span></p>
+!! html/parsoid
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{"group":"a"}}'><a href="#cite_note-1" data-mw-group="a"><span class="mw-reflink-text">[a 1]</span></a></span>
+B <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="#cite_note-2"><span class="mw-reflink-text">[1]</span></a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">afoo</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw-group="a" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" data-mw-group="a" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">afoo</span></li>
 </ol>
 
-<p>C <span about="#mwt8" class="reference" id="cite_ref-3" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-3"},"attrs":{}}'><a href="#cite_note-3">[2]</a></span></p>
+<p>C <span about="#mwt8" class="mw-ref" id="cite_ref-3" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-3"},"attrs":{}}'><a href="#cite_note-3"><span class="mw-reflink-text">[2]</span></a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2">↑</a></span> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bfoo</span></li><li about="#cite_note-3" id="cite_note-3"><span rel="mw:referencedBy"><a href="#cite_ref-3">↑</a></span> <span id="mw-reference-text-cite_note-3" class="mw-reference-text">cfoo</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bfoo</span></li><li about="#cite_note-3" id="cite_note-3"><a href="#cite_ref-3" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-3" class="mw-reference-text">cfoo</span></li>
 </ol>
 !!end
 
 !!test
 References: 5. ref tags in references should be processed while ignoring all other content
-!!options
-parsoid
 !! wikitext
 A <ref name="a" />
 B <ref name="b">bar</ref>
@@ -20677,30 +21214,26 @@ B <ref name="b">bar</ref>
 <ref name="a">foo</ref>
 This should just get lost.
 </references>
-!! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-a_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="#cite_note-a-1">[1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-b-2"},"attrs":{"name":"b"}}'><a href="#cite_note-b-2">[2]</a></span></p>
+!! html/parsoid
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-a_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span>
+B <span about="#mwt4" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-b-2"},"attrs":{"name":"b"}}'><a href="#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span></p>
 
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","body":{"extsrc":"&lt;ref name=\"a\">foo&lt;/ref>\nThis should just get lost.","html":"\n&lt;span about=\"#mwt8\" class=\"reference\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[59,82,14,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-a-1\"},\"attrs\":{\"name\":\"a\"}}&#39;>&lt;a href=\"#cite_note-a-1\">[1]&lt;/a>&lt;/span>\n"},"attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy"><a href="#cite_ref-a_1-0">↑</a></span> <span id="mw-reference-text-cite_note-a-1" class="mw-reference-text">foo</span></li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b_2-0">↑</a></span> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">bar</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","body":{"extsrc":"&lt;ref name=\"a\">foo&lt;/ref>\nThis should just get lost.","html":"\n&lt;span about=\"#mwt8\" class=\"mw-ref\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[59,82,14,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-a-1\"},\"attrs\":{\"name\":\"a\"}}&#39;>&lt;a href=\"#cite_note-a-1\" style=\"counter-reset: mw-Ref 1;\">&lt;span class=\"mw-reflink-text\">[1]&lt;/span>&lt;/a>&lt;/span>\n"},"attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><a href="#cite_ref-a_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-a-1" class="mw-reference-text">foo</span></li><li about="#cite_note-b-2" id="cite_note-b-2"><a href="#cite_ref-b_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">bar</span></li>
 </ol>
 !!end
 
 !!test
 References: 6. <references /> from a transclusion
-!!options
-parsoid
 !! wikitext
 <ref>Foo</ref> {{echo|<references />}}
-!! html
-<p><span about="#mwt3" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p> <ol class="references" typeof="mw:Extension/references mw:Transclusion" about="#mwt4" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;references />"}},"i":0}}]}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">Foo</span></li>
+!! html/parsoid
+<p><span about="#mwt3" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p> <ol class="mw-references" typeof="mw:Extension/references mw:Transclusion" about="#mwt4" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;references />"}},"i":0}}]}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">Foo</span></li>
 </ol>
 !!end
 
 !! test
 References: 7. Multiple references tags (one without and one with nested refs) should be correctly handled
-!! options
-parsoid
 !! wikitext
 A <ref>foo bar for a</ref>
 B <ref group="X" name="b" />
@@ -20710,30 +21243,28 @@ B <ref group="X" name="b" />
 <references group="X">
 <ref name="b">foo</ref>
 </references>
-!! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"group":"X","name":"b"}}'><a href="#cite_note-b-2">[X 1]</a></span>
+!! html/parsoid
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
+B <span about="#mwt4" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"group":"X","name":"b"}}'><a href="#cite_note-b-2" data-mw-group="X"><span class="mw-reflink-text">[X 1]</span></a></span>
 </p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo bar for a</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo bar for a</span></li>
 </ol>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","body":{"extsrc":"&lt;ref name=\"b\">foo&lt;/ref>","html":"\n&lt;span about=\"#mwt10\" class=\"reference\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[96,119,14,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-b-2\"},\"attrs\":{\"name\":\"b\"}}&#39;>&lt;a href=\"#cite_note-b-2\">[X 1]&lt;/a>&lt;/span>\n"},"attrs":{"group":"X"}}'>
-<li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b_2-0">↑</a></span> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">foo</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw-group="X" data-mw='{"name":"references","body":{"extsrc":"&lt;ref name=\"b\">foo&lt;/ref>","html":"\n&lt;span about=\"#mwt10\" class=\"mw-ref\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[96,119,14,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-b-2\"},\"attrs\":{\"name\":\"b\"}}&#39;>&lt;a href=\"#cite_note-b-2\" style=\"counter-reset: mw-Ref 1;\" data-mw-group=\"X\">&lt;span class=\"mw-reflink-text\">[X 1]&lt;/span>&lt;/a>&lt;/span>\n"},"attrs":{"group":"X"}}'>
+<li about="#cite_note-b-2" id="cite_note-b-2"><a href="#cite_ref-b_2-0" data-mw-group="X" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">foo</span></li>
 </ol>
 !! end
 
 !! test
 References: 8. T88019: Remove <meta>s from templates inside <ref> that's itself inside a template
-!! options
-parsoid
 !! wikitext
 X{{echo|<ref>foo {{echo|<b>bar</b>}} and {{echo|baz}} boo</ref>}}
 <references />
-!! html
-<p>X<span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;ref>foo {{echo|&lt;b>bar&lt;/b>}} and {{echo|baz}} boo&lt;/ref>"}},"i":0}}]}'><a href="#cite_note-1">[1]</a></span></p>
-<ol class="references" typeof="mw:Extension/references" about="#mwt7" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo <b data-parsoid='{"stx":"html"}'>bar</b> and baz boo</span></li>
+!! html/parsoid
+<p>X<span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;ref>foo {{echo|&lt;b>bar&lt;/b>}} and {{echo|baz}} boo&lt;/ref>"}},"i":0}}]}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt7" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo <b data-parsoid='{"stx":"html"}'>bar</b> and baz boo</span></li>
 </ol>
 !!end
 
@@ -20743,18 +21274,16 @@ X{{echo|<ref>foo {{echo|<b>bar</b>}} and {{echo|baz}} boo</ref>}}
 # wt2wt.
 !! test
 References: 9. Generate missing references list at the end
-!! options
-parsoid
 !! wikitext
 A <ref>foo</ref>
 B <ref group="inexistent">bar</ref>
-!! html
-<p>A <span class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> B <span class="reference" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{"group":"inexistent"}}'><a href="#cite_note-2">[inexistent 1]</a></span></p>
-<ol class="references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
+!! html/parsoid
+<p>A <span class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B <span class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{"group":"inexistent"}}'><a href="#cite_note-2" data-mw-group="inexistent"><span class="mw-reflink-text">[inexistent 1]</span></a></span></p>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
 </ol>
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{"group":"inexistent"}}'>
-<li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2">↑</a></span> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw-group="inexistent" data-mw='{"name":"references","attrs":{"group":"inexistent"}}'>
+<li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" data-mw-group="inexistent" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
 </ol>
 !! end
 
@@ -20776,15 +21305,13 @@ A <ref>foo</ref>
 
 !! test
 Entities in ref name
-!! options
-parsoid
 !! wikitext
 <ref name="test &amp; me">hi</ref>
 <references />
-!! html
-<p><span about="#mwt2" class="reference" id="cite_ref-test_.26_me_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-test_.26_me-1"},"attrs":{"name":"test &amp;amp; me"}}'><a href="#cite_note-test_.26_me-1">[1]</a></span></p>
-<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-test_.26_me-1" id="cite_note-test_.26_me-1"><span rel="mw:referencedBy"><a href="#cite_ref-test_.26_me_1-0">↑</a></span> <span id="mw-reference-text-cite_note-test_.26_me-1" class="mw-reference-text">hi</span></li>
+!! html/parsoid
+<p><span about="#mwt2" class="mw-ref" id="cite_ref-test_.26_me_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-test_.26_me-1"},"attrs":{"name":"test &amp;amp; me"}}'><a href="#cite_note-test_.26_me-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-test_.26_me-1" id="cite_note-test_.26_me-1"><a href="#cite_ref-test_.26_me_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-test_.26_me-1" class="mw-reference-text">hi</span></li>
 </ol>
 !! end
 
@@ -20798,10 +21325,10 @@ parsoid=wt2html
 a<ref>foo</ref>
 
 <references>
-!! html
-<p>a<span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
-<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
+!! html/parsoid
+<p>a<span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
 !! end
 
 !! test
@@ -20811,8 +21338,8 @@ parsoid=wt2wt,html2wt
 !! wikitext
 foo
 <references />
-!! html
-foo<ol class="references" typeof="mw:Extension/references" about="#mwt2" data-mw='{"name":"references","attrs":{}}'></ol>
+!! html/parsoid
+foo<ol class="mw-references" typeof="mw:Extension/references" about="#mwt2" data-mw='{"name":"references","attrs":{}}'></ol>
 !! end
 
 #### ----------------------------------------------------------------
@@ -21045,8 +21572,6 @@ parsoid=html2wt
 
 !! test
 Headings: 5. Empty headings
-!! options
-parsoid
 !! wikitext
 =<nowiki/>=
 
@@ -21059,13 +21584,18 @@ parsoid
 =====<nowiki/>=====
 
 ======<nowiki/>======
-!! html
-<h1></h1>
-<h2></h2>
-<h3></h3>
-<h4></h4>
-<h5></h5>
-<h6></h6>
+!! html/parsoid
+<h1 data-parsoid='{}'><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki/>"}'/></h1>
+
+<h2 data-parsoid='{}'><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki/>"}'/></h2>
+
+<h3 data-parsoid='{}'><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki/>"}'/></h3>
+
+<h4 data-parsoid='{}'><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki/>"}'/></h4>
+
+<h5 data-parsoid='{}'><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki/>"}'/></h5>
+
+<h6 data-parsoid='{}'><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki/>"}'/></h6>
 !!end
 
 !! test
@@ -21711,6 +22241,40 @@ parsoid=wt2html
 </tbody></table>
 !! end
 
+!! test
+T97430: Don't emit empty nowiki pairs around marker meta tags
+!! options
+parsoid=html2wt
+!! html
+<p>*This is a long sentence here that will make the nowiki algo split up the nowikis into multiple pairs
+|** Make this another long long long sentence forcing the nowiki algo to split up the nowikis.</p>
+!! wikitext
+<nowiki>*</nowiki>This is a long sentence here that will make the nowiki algo split up the nowikis into multiple pairs
+<nowiki>|</nowiki>** Make this another long long long sentence forcing the nowiki algo to split up the nowikis.
+!! end
+
+!! test
+Unclosed xmlish element in table line shouldn't eat end delimiters
+!! wikitext
+{|
+| <foo
+| bar>
+|}
+!! html/php
+<table>
+<tr>
+<td> &lt;foo
+</td>
+<td> bar&gt;
+</td></tr></table>
+
+!! html/parsoid
+<table>
+<tbody><tr><td> &lt;foo</td>
+<td> bar></td></tr>
+</tbody></table>
+!! end
+
 #### --------------- Links ----------------
 #### 1. Quote marks in link text
 #### 2. Wikilinks: Escapes needed
@@ -22086,10 +22650,10 @@ parsoid=html2wt,wt2wt
 <i>a'</i> foo <i><a rel="mw:WikiLink" href="Bar" title="Bar">bar</a></i>
 <i>a'</i> foo <b><a rel="mw:WikiLink" href="Bar" title="Bar" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[bar]]"}},"i":0}}]}'>bar</a></b>
 <a rel="mw:WikiLink" href="Foo" title="Foo">foo</a> x'<i><a href="Bar" rel="mw:WikiLink" title="Bar">bar</a></i>
-'<i>foo</i> <span class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span>
+'<i>foo</i> <span class="mw-ref" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
 '<i>foo</i> <div title="name">test</div>
 '<i>foo</i> and <br data-parsoid='{"stx":"html","noClose":true}'/> bar
-<ol class="references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
 <li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">test</span></li>
 </ol>
 !! end
@@ -22207,9 +22771,9 @@ foo <ref>''a''
  b</ref>
 <references />
 !! html
-<p>foo <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
-<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"><i data-parsoid='{"dsr":[9,14,2,2]}'>a</i>
+<p>foo <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"><i data-parsoid='{"dsr":[9,14,2,2]}'>a</i>
  b</span></li>
 </ol>
 !! end
@@ -22240,7 +22804,7 @@ parsoid
 !! wikitext
  [[File:Foobar.jpg|thumb|caption]]
 !! html/parsoid
- <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
+ <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
 !! end
 
 !! test
@@ -22253,16 +22817,31 @@ parsoid=html2wt
  ==foo==
 !! end
 
-#### --------------- Behavior Switches --------------------
-!! test
-1. Valid behavior switches should be escaped
+!!test
+T95794: nowiki escaping should account for leading space at start-of-line in an indent-pre block
 !! options
-parsoid=html2wt
-!! html
-__TOC__
-<i>__TOC__</i>
+parsoid
 !! wikitext
-<nowiki>__TOC__</nowiki>
+ * foo
+ * bar
+!! html
+<pre>
+* foo
+* bar
+</pre>
+!! end
+
+#### --------------- Behavior Switches --------------------
+
+!! test
+1. Valid behavior switches should be escaped
+!! options
+parsoid=html2wt
+!! html
+__TOC__
+<i>__TOC__</i>
+!! wikitext
+<nowiki>__TOC__</nowiki>
 ''<nowiki>__TOC__</nowiki>''
 !! end
 
@@ -22278,6 +22857,29 @@ __TOO__
 __|__
 !! end
 
+# We use indent-pre as an indirect way to test for sol-transparent behavior.
+!! test
+Behavior switches should be SOL-transparent
+!! wikitext
+ __TOC__
+
+ <!-- this one's bogus -->
+ __TOO__
+
+ __TOC__ foo
+
+__TOC__ bar
+!! html/parsoid
+ <meta property="mw:PageProp/toc" />
+
+ <!-- this one's bogus -->
+<pre>__TOO__</pre>
+
+<pre data-parsoid='{}'><meta property="mw:PageProp/toc" data-parsoid='{"src":"__TOC__","magicSrc":"__TOC__"}'/> foo</pre>
+
+<meta property="mw:PageProp/toc" data-parsoid='{"src":"__TOC__","magicSrc":"__TOC__"}'/><pre data-parsoid='{}'>bar</pre>
+!! end
+
 #### --------------- HTML tags ---------------
 #### 1. a tags
 #### 2. other tags
@@ -22599,6 +23201,8 @@ bar
 </tbody></table>
 !!end
 
+# Note that the "style" attribute is really a template parameter here.
+# The = would have to be {{=}} if you wanted the literal.
 !!test
 Empty TD followed by TD with tpl-generated attribute
 !! wikitext
@@ -22759,7 +23363,7 @@ Multi-line image caption generated by templates with/without trailing newlines
 New element inserted (without intervening newlines) after an old sol-transparent node should serialize correctly
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <meta typeof="mw:Includes/IncludeOnly" data-parsoid='{"src":"&lt;includeonly>foo&lt;/includeonly>"}'/><meta typeof="mw:Includes/IncludeOnly/End" data-parsoid='{"src":""}'/><p>new para</p>
 
 <link rel="mw:PageProp/Category" href="./Category:Foo" data-parsoid='{}'/><h1>new heading</h1>
@@ -22776,12 +23380,10 @@ new para
 ## a Parsoid serializer test, marking this Parsoid only
 !!test
 Improperly nested inline or quotes tags with whitespace in between
-!!options
-parsoid
 !! wikitext
 <span> <s>x</span> </s>
 ''' ''x''' ''
-!! html
+!! html/parsoid
 <p><span> <s>x</s></span><s> </s>
 <b> <i>x</i></b><i> </i>
 </p>
@@ -22789,11 +23391,9 @@ parsoid
 
 !!test
 Encapsulate protected attributes from wt
-!!options
-parsoid
 !! wikitext
 <div typeof="mw:placeholder stuff" data-parsoid="weird" data-parsoid-other="no" about="time" rel="mw:true">foo</div>
-!! html
+!! html/parsoid
 <body><div data-x-typeof="mw:placeholder stuff" data-x-data-parsoid="weird" data-x-data-parsoid-other="no" data-x-about="time" data-x-rel="mw:true">foo</div>
 </body>
 !!end
@@ -22807,7 +23407,7 @@ Ensure ParagraphWrapper can deal with stray closing pre tags
 parsoid=wt2html
 !! wikitext
 plain text</pre>
-!! html
+!! html/parsoid
 plain text
 !!end
 
@@ -22817,7 +23417,7 @@ plain text
 parsoid=wt2html
 !! wikitext
 <table>hi</table><table>ho</table>
-!! html
+!! html/parsoid
 <p>hi</p>
 <table></table>
 <p>ho</p>
@@ -22833,7 +23433,7 @@ parsoid=wt2html,wt2wt
 <tr> || ||
 <td> a
 </table>
-!! html
+!! html/parsoid
 <p> || ||
 </p><table>
 <tbody><tr><td> a</td></tr>
@@ -22846,7 +23446,7 @@ Encapsulation properly handles null DSR information from foster box
 parsoid=wt2html,wt2wt
 !! wikitext
 {{echo|<table>foo<tr><td>bar</td></tr></table>}}
-!! html
+!! html/parsoid
 <span typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;<table>foo<tr><td>bar</td></tr></table>&quot;}},&quot;i&quot;:0}}]}">foo</span><table><tbody><tr><td>bar</td></tr></tbody></table>
 !!end
 
@@ -22856,7 +23456,7 @@ parsoid=wt2html,wt2wt
 parsoid=wt2wt,wt2html
 !! wikitext
 <table>{{echo|foo<tr><td>bar</td></tr>}}</table>
-!! html
+!! html/parsoid
 <p typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;<table>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo<tr><td>bar</td></tr>&quot;}},&quot;i&quot;:0}},&quot;</table>&quot;]}">foo</p><table>
 <tbody>
 <tr>
@@ -22872,7 +23472,7 @@ parsoid=wt2wt,wt2html
 parsoid=wt2wt,wt2html
 !! wikitext
 <table><div>{{echo|foo}}</div><tr><td>bar</td></tr></table>
-!! html
+!! html/parsoid
 <div typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;<table><div>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo&quot;}},&quot;i&quot;:0}},&quot;</div><tr><td>bar</td></tr></table>&quot;]}">foo</div>
 <table>
 <tbody>
@@ -22889,7 +23489,7 @@ parsoid=wt2wt,wt2html
 parsoid=wt2wt,wt2html
 !! wikitext
 <table><div><p>{{echo|foo</p></div><tr><td>}}bar</td></tr></table>
-!! html
+!! html/parsoid
 <div typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;<table><div><p>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo</p></div><tr><td>&quot;}},&quot;i&quot;:0}},&quot;bar</td></tr></table>&quot;]}">
 <p>foo</p>
 </div>
@@ -22908,7 +23508,7 @@ parsoid=wt2wt,wt2html
 parsoid=wt2wt,wt2html
 !! wikitext
 <table><div><p>{{echo|foo</p></div><tr><td>}}bar</td></tr></table>
-!! html
+!! html/parsoid
 <div typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;<table><div><p>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo</p></div><tr><td>&quot;}},&quot;i&quot;:0}},&quot;bar</td></tr></table>&quot;]}">
 <p>foo</p>
 </div>
@@ -22927,7 +23527,7 @@ parsoid=wt2wt,wt2html
 parsoid=wt2wt,wt2html
 !! wikitext
 <table><tr><td><div><p>{{echo|foo</p></div></td>foo}}</tr></table>
-!! html
+!! html/parsoid
 <p typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;<table><tr><td><div><p>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo</p></div></td>foo&quot;}},&quot;i&quot;:0}},&quot;</tr></table>&quot;]}">foo</p>
 <table>
 <tbody>
@@ -22948,7 +23548,7 @@ parsoid=wt2wt,wt2html
 parsoid=wt2wt,wt2html
 !! wikitext
 <table><tr><td><div><p>{{echo|foo</p></div></td>foo</tr></table>}}<p>ok</p>
-!! html
+!! html/parsoid
 <p typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;<table><tr><td><div><p>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo</p></div></td>foo</tr></table>&quot;}},&quot;i&quot;:0}}]}">foo</p>
 <table>
 <tbody>
@@ -22970,7 +23570,7 @@ parsoid=wt2wt,wt2html
 parsoid=wt2wt,wt2html
 !! wikitext
 <table>{{echo|<p>foo</p>}}<td>bar</td></table>
-!! html
+!! html/parsoid
 <p typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;<table>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;<p>foo</p>&quot;}},&quot;i&quot;:0}},&quot;<td>bar</td></table>&quot;]}">foo</p>
 <table>
 <tbody>
@@ -22981,6 +23581,8 @@ parsoid=wt2wt,wt2html
 </table>
 !!end
 
+# Note that the wt is broken on purpose: the = should be {{=}} if you
+# don't want it to be a template parameter key.
 !!test
 8. Encapsulate foster-parented transclusion content
 !!options
@@ -22991,8 +23593,11 @@ parsoid=wt2wt,wt2html
 |-
 |b
 |}
-!! html
-<p typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;a\n&quot;}},&quot;i&quot;:0}}]}">a</p><p typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;{|&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;style&quot;:{&quot;wt&quot;:&quot;'color:red'&quot;}},&quot;i&quot;:0}},&quot;\n|-\n|b\n|}&quot;]}">{{{1}}}</p><table>
+!! html/parsoid
+<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a\n"}},"i":0}}]}'>a</p>
+<span> </span>
+<p typeof="mw:Transclusion" data-mw='{"parts":["{|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"style":{"wt":"&#39;color:red&#39;"}},"i":0}},"\n|-\n|b\n|}"]}'>{{{1}}}</p>
+<table>
 <tbody>
 <tr>
 <td>b</td>
@@ -23007,7 +23612,7 @@ parsoid=wt2wt,wt2html
 parsoid=wt2wt,wt2html
 !! wikitext
 <table>{{echo|hi</table>hello}}
-!! html
+!! html/parsoid
 <p about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":["&lt;table>",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"hi&lt;/table>hello"}},"i":0}}]}' data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true,"pi":[[{"k":"1","spc":["","","",""]}]]}'>hi</p><table about="#mwt2" data-parsoid='{"stx":"html"}'></table><p about="#mwt2">hello</p>
 !!end
 
@@ -23022,7 +23627,7 @@ parsoid=wt2html,wt2wt
 |}
 </div>
 |}
-!! html
+!! html/parsoid
 <div about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"OpenTable","href":"./Template:OpenTable"},"params":{},"i":0}},"\n&lt;div>"]}' data-parsoid='{"stx":"html","autoInsertedEnd":true,"pi":[[]]}'></div><span about="#mwt1">
 </span>
 <table about="#mwt1" data-parsoid='{"autoInsertedEnd":true}'></table>
@@ -23050,7 +23655,7 @@ Properly encapsulate empty-content transclusions in fosterable positions
 Support <object> element with .data attribute
 !!options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <object data="test.swf"></object>
 !! wikitext
 <object data="test.swf"></object>
@@ -23327,7 +23932,7 @@ Image: Block level image should have \n before and after
 456
 !! html/parsoid
 <p>123</p>
-<figure class="mw-halign-right" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="17" width="150"/></a></figure>
+<figure class="mw-halign-right" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/150px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="17" width="150"/></a></figure>
 <p>456</p>
 !!end
 
@@ -23345,26 +23950,22 @@ Image: New block level image should have \n before and after (existing content)
 
 !! test
 Image: upright option (parsoid)
-!! options
-parsoid
 !! wikitext
 [[File:Foobar.jpg|thumb|upright|caption]]
 [[File:Foobar.jpg|thumb|upright=0.5|caption]]
 [[File:Foobar.jpg|thumb|500x500px|upright=0.5|caption]]
-!! html
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="19" width="170"/></a><figcaption>caption</figcaption></figure>
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="12" width="110"/></a><figcaption>caption</figcaption></figure>
-<figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="57" width="500"/></a><figcaption>caption</figcaption></figure>
+!! html/parsoid
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/170px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="19" width="170"/></a><figcaption>caption</figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/110px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="12" width="110"/></a><figcaption>caption</figcaption></figure>
+<figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/500px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="57" width="500"/></a><figcaption>caption</figcaption></figure>
 !!end
 
 !! test
 Image: upright option is ignored on inline and frame images (parsoid)
-!! options
-parsoid
 !! wikitext
 [[File:Foobar.jpg|500x500px|upright=0.5|caption]]
-!! html
-<p><span typeof="mw:Image" data-mw='{"caption":"caption"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="57" width="500"/></a></span></p>
+!! html/parsoid
+<p><span typeof="mw:Image" data-mw='{"caption":"caption"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/500px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="57" width="500"/></a></span></p>
 !!end
 
 !! test
@@ -23496,22 +24097,6 @@ foo
 </div>
 !! end
 
-!! test
-Lists: Add space after bullets
-!! options
-parsoid=html2wt
-!! html
-<ul>
-<li>foo</li>
-<li> bar</li>
-<li><span> baz</span></li>
-</ul>
-!! wikitext
-* foo
-* bar
-* <span> baz</span>
-!! end
-
 !! test
 Lists: Dont insert newlines in a serialized list item.
 !! options
@@ -23524,42 +24109,63 @@ parsoid=html2wt
 !! end
 
 !! test
-Headings: Add space before/after == (Bug 51744)
+Headings: Force sol-transparent links and behavior switches to serialize before/after
 !! options
 parsoid=html2wt
 !! html
-<h2>foo</h2>
-<h2> bar</h2>
-<h2>baz </h2>
-<h2><span> baz</span></h2>
+<h2>hello there<link href="Category:A1" rel="mw:PageProp/Category" /></h2>
+<h2><link href="Category:A2" rel="mw:PageProp/Category" />hi pal</h2>
+
+<h2><!--foo-->  <link href="Category:A3" rel="mw:PageProp/Category" />   how goes it</h2>
+<h2>it goes well   <link href="Category:A4" rel="mw:PageProp/Category" />  <!--bar--></h2>
+
+<h2 data-parsoid='{}'>howdy<link href="Category:A5" rel="mw:PageProp/Category" /></h2>
+
+<h2><meta property="mw:PageProp/toc" /> ok</h2>
 !! wikitext
-== foo ==
+== hello there ==
+[[Category:A1]]
+[[Category:A2]]
 
-== bar ==
+== hi pal ==
 
-== baz ==
+<!--foo-->  [[Category:A3]]
 
-== <span> baz</span> ==
+== how goes it ==
+
+== it goes well ==
+[[Category:A4]]  <!--bar-->
+
+==howdy [[Category:A5]] ==
+
+__TOC__
+
+== ok ==
 !! end
 
 !! test
-Headings: Force metas to serialize before/after
+Headings: Don't hoist metas that come from templates
 !! options
 parsoid=html2wt
 !! html
-<h2>hello there<link href="Category:A1" rel="mw:PageProp/Category" /></h2>
-<h2><link href="Category:A2" rel="mw:PageProp/Category" />hi pal</h2>
-
-<h2><!--foo-->  <link href="Category:A3" rel="mw:PageProp/Category" />   how goes it</h2>
+<h2><span about="#mwt1" typeof="mw:Transclusion" data-parsoid="{}" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo [[Category:Foo]]"}},"i":0}}]}'>foo </span><link rel="mw:PageProp/Category" href="./Category:Foo" about="#mwt1" data-parsoid="{}" /></h2>
 !! wikitext
-== hello there ==
-[[Category:A1]]
+== {{echo|foo [[Category:Foo]]}} ==
+!! end
 
-[[Category:A2]]
-== hi pal ==
+!! test
+Headings: Category in ref isn't hoisted
+!! options
+parsoid=html2wt
+!! html
+<h2> foo <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> </h2>
 
-<!--foo-->  [[Category:A3]]
-== how goes it ==
+<ol class="references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">bar <link rel="mw:PageProp/Category" href="./Category:Baz" /> </span></li></ol>
+!! wikitext
+== foo <ref>bar 
+[[Category:Baz]] </ref> ==
+
+<references />
 !! end
 
 !! test
@@ -23639,17 +24245,61 @@ parsoid=html2wt
 <h2>testing
 123</h2>
 
+<h2> hi <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"bogus","href":"./Template:Bogus"},"params":{"1":{"wt":"there\nyou"}},"i":0}}]}'>there</span><span about="#mwt1">
+</span><span about="#mwt1">you</span> </h2>
+
+<h2> foo <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> </h2>
+
+<ol class="references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">hello
+there</span></li></ol>
+
 <ul><li>asd
 sdf</li></ul>
+
+<ul><li>foo
+bar
+baz</li>
+<li>foo <b>bar</b>
+baz</li></ul>
 !! wikitext
 == testing 123 ==
 
+== hi {{bogus|there
+you}} ==
+
+== foo <ref>hello
+there</ref> ==
+
+<references />
+
 * asd sdf
+
+* foo bar baz
+* foo '''bar''' baz
+!! end
+
+!! test
+Serialize new placeholder space without spans
+!! options
+parsoid=html2wt
+!! html
+<p>foo<span typeof="mw:Placeholder"> </span>: bar</p>
+
+<p>foo<span typeof="mw:DisplaySpace mw:Placeholder" data-parsoid='{"src":" ","isDisplayHack":true}'> </span>: bar</p>
+
+<span typeof="mw:Extension/ref" data-mw="{&quot;name&quot;:&quot;ref&quot;,&quot;body&quot;:{&quot;html&quot;:&quot;foo<span typeof=\&quot;mw:Placeholder\&quot;>&amp;nbsp;</span>: bar&quot;}}"><sup>[1]</sup></span>ok</p>
+!! wikitext
+foo : bar
+
+foo : bar
+
+<ref>foo : bar</ref>ok
 !! end
 
-#-----------------------------
-# I/B quote minimization tests
-#-----------------------------
+
+#-----------------------
+# Tag minimization tests
+#-----------------------
 
 !! test
 1. I/B quote minimization: wikitext-only tags should be combined
@@ -23754,9 +24404,52 @@ parsoid={
 ''ac''
 !! end
 
-#------------------------------------
-# End of I/B quote minimization tests
-#------------------------------------
+!! test
+1. Merge adjacent link nodes as long as at least one element is new
+!! options
+parsoid={
+  "modes": ["html2wt"],
+  "scrubWikitext": true
+}
+!! html
+<a rel="mw:WikiLink" href="./Football">Foot</a><a rel="mw:WikiLink" href="./Football">ball</a>
+<a data-parsoid="{}" rel="mw:WikiLink" href="./Football">Foot</a><a rel="mw:WikiLink" href="./Football">ball</a>
+<a data-parsoid="{}" rel="mw:WikiLink" href="./Football">Foot</a><a data-parsoid="{}" rel="mw:WikiLink" href="./Football">ball</a>
+!! wikitext
+[[Football]]
+[[Football]]
+[[Football|Foot]][[Football|ball]]
+!! end
+
+!! test
+2. Merge adjacent link nodes and enable additional normalizations
+!! options
+parsoid={
+  "modes": ["html2wt"],
+  "scrubWikitext": true
+}
+!! html
+<a rel="mw:WikiLink" href="./Football"><i>Foot</i></a><a rel="mw:WikiLink" href="./Football"><i>ball</i></a>
+!! wikitext
+[[Football|''Football'']]
+!! end
+
+!! test
+3. Don't merge adjacent link nodes if scrubWikitext is false
+!! options
+parsoid={
+  "modes": ["html2wt"],
+  "scrubWikitext": false
+}
+!! html
+<a rel="mw:WikiLink" href="./Football">Foot</a><a rel="mw:WikiLink" href="./Football">ball</a>
+!! wikitext
+[[Football|Foot]][[Football|ball]]
+!! end
+
+#------------------------------
+# End of tag minimization tests
+#------------------------------
 
 !!test
 Bug 54262: New entities
@@ -23775,7 +24468,7 @@ parsoid=html2wt
 Magic words
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <meta property='mw:PageProp/toc' />
 <meta property='mw:PageProp/notoc' />
 <meta property='mw:PageProp/forcetoc' />
@@ -24033,6 +24726,151 @@ parsoid=html2wt
 [[Foo]]
 !! end
 
+## SSS FIXME: This is broken output nevertheless.
+## What might be a reasonable non-broken output for this?
+## This is an edge case unlikely to be seen in production
+## that I am not wasting more time on this right now.
+!! test
+Never serialize a-tag as html, no matter what attributes it has
+!! options
+parsoid=html2wt
+!! html
+<a bad='true' href='http://boo.org'><img src='http://boohoo.org' /></a>
+!! wikitext
+[http://boo.org http://boohoo.org]
+!! end
+
+# --------------------------------------------
+# Tests spec'ing wikitext serialization norms |
+# --------------------------------------------
+
+!! test
+Lists: Add space after bullets
+!! options
+parsoid=html2wt
+!! html
+<ul>
+<li>foo</li>
+<li> bar</li>
+<li><span> baz</span></li>
+</ul>
+!! wikitext
+* foo
+* bar
+* <span> baz</span>
+!! end
+
+!! test
+Headings: Add space before/after == (T53744)
+!! options
+parsoid=html2wt
+!! html
+<h2>foo</h2>
+<h2> bar</h2>
+<h2>baz </h2>
+<h2><span> baz</span></h2>
+
+<!-- Even after hoisted content -->
+<h2> <link href="Category:A2" rel="mw:PageProp/Category" />ok</h2>
+!! wikitext
+== foo ==
+
+== bar ==
+
+== baz ==
+
+== <span> baz</span> ==
+
+<!-- Even after hoisted content -->
+ [[Category:A2]]
+
+== ok ==
+!! end
+
+!! test
+1. Headings: suppress newly created empty headings
+!! options
+parsoid={
+  "modes": ["html2wt"],
+  "scrubWikitext": true
+}
+!! html
+<h2></h2>
+!! wikitext
+!! end
+
+!! test
+2. Headings: don't suppress empty headings if scrubWikitext is false
+!! options
+parsoid=html2wt
+!! html
+<h2></h2>
+!! wikitext
+==<nowiki/>==
+!! end
+
+!! test
+3. Headings: don't suppress empty headings for existing headings even if scrubWikitext is true
+!! options
+parsoid={
+  "modes": ["html2wt"],
+  "scrubWikitext": true
+}
+!! html
+<h2 data-parsoid='{}'></h2>
+!! wikitext
+==<nowiki/>==
+!! end
+
+!! test
+1. WT Quote Tags: suppress newly created empty style tags
+!! options
+parsoid={
+  "modes": ["html2wt"],
+  "scrubWikitext": true
+}
+!! html
+<i></i><b></b>
+!! wikitext
+!! end
+
+!! test
+2. WT Quote Tags: don't suppress empty style tags if scrubWikitext is false
+!! options
+parsoid=html2wt
+!! html
+<i></i><b></b>
+!! wikitext
+''<nowiki/>'''''<nowiki/>'''
+!! end
+
+!! test
+1. Indent Pre Nowiki: suppress whitespace at the start of new paragraph
+!! options
+parsoid={
+  "modes": ["html2wt"],
+  "scrubWikitext": true
+}
+!! html
+<p> hi</p>
+!! wikitext
+hi
+!! end
+
+!! test
+2. Indent Pre Nowiki: don't suppress whitespace at the start of new paragraph if scrubWikitext is false
+!! options
+parsoid=html2wt
+!! html
+<p> hi</p>
+!! wikitext
+<nowiki> </nowiki>hi
+!! end
+
+# ---------------------------------------------------
+# End of tests spec'ing wikitext serialization norms |
+# ---------------------------------------------------
+
 # -----------------------------------------------------------------
 # End of section for Parsoid-only html2wt tests for serialization
 # of new content
@@ -24048,7 +24886,7 @@ parsoid=html2wt
 
 ## T90517
 !! test
-1. Selser: New comments should not be lost
+Selser: New comments should not be lost
 !! options
 parsoid={
   "modes": ["selser"],
@@ -24069,7 +24907,7 @@ parsoid={
 
 ## T89383
 !! test
-2. Selser: Check for validity of DSR before using it
+Selser: Check for validity of DSR before using it
 !! options
 parsoid={
   "modes": ["selser"],
@@ -24084,10 +24922,55 @@ parsoid={
 <span id="a">a</span>
 !! end
 
+!! test
+1. DOMDiff: Changes to <ref> content should be looked up using id
+!! options
+parsoid={
+  "modes": ["selser"],
+  "changes": [
+    ["#X", "after", "bar"],
+    ["#Y", "after", "baz"]
+  ]
+}
+!! wikitext
+X <ref><span id="X">foo</span></ref>
+Y <ref name="a" />
+<references>
+<ref name="a"><span id="Y">foo</span></ref>
+</references>
+!! wikitext/edited
+X <ref><span id="X">foo</span>bar</ref>
+Y <ref name="a" />
+<references>
+<ref name="a"><span id="Y">foo</span>baz</ref>
+</references>
+!! end
+
+!! test
+2. DOMDiff: Changes to <ref> content should be looked up using id
+!! options
+parsoid={
+  "modes": ["selser"],
+  "changes": [
+    ["#Z", "after", "bar"]
+  ]
+}
+!! wikitext
+A <ref>foo bar for a</ref>
+B <ref group="X" name="b" />
+
+<references />
+
+<references group="X">
+<ref name="b"><span id="Z">foo</span></ref>
+</references>
+!! wikitext/edited
+A <ref>foo bar for a</ref>
+B <ref group="X" name="b" />
 
-TODO:
-more images
-more tables
-character entities
-and much more
-Try for 100% code coverage
+<references />
+
+<references group="X">
+<ref name="b"><span id="Z">foo</span>bar</ref>
+</references>
+!! end
index 0ce056f..43d8ce8 100644 (file)
@@ -204,9 +204,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        while ( $this->db->trxLevel() > 0 ) {
                                $this->db->rollback();
                        }
-
-                       // don't ignore DB errors
-                       $this->db->ignoreErrors( false );
                }
 
                DeferredUpdates::clearPendingUpdates();
@@ -233,9 +230,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        while ( $this->db->trxLevel() > 0 ) {
                                $this->db->rollback();
                        }
-
-                       // don't ignore DB errors
-                       $this->db->ignoreErrors( false );
                }
 
                // Restore mw globals
diff --git a/tests/phpunit/data/templates/bad_partial.mustache b/tests/phpunit/data/templates/bad_partial.mustache
new file mode 100644 (file)
index 0000000..d2767f0
--- /dev/null
@@ -0,0 +1 @@
+Partial {{>nonexistenttemplate}} in here
diff --git a/tests/phpunit/data/templates/has_partial.mustache b/tests/phpunit/data/templates/has_partial.mustache
new file mode 100644 (file)
index 0000000..504387a
--- /dev/null
@@ -0,0 +1 @@
+Partial {{>foobar_args}} in here
index d11668b..d4df7b0 100644 (file)
@@ -112,6 +112,8 @@ class WfUrlencodeTest extends MediaWikiTestCase {
                        ### Other tests
                        // slash remain unchanged. %2F seems to break things
                        array( '/', '/' ),
+                       // T105265
+                       array( '~', '~' ),
 
                        // Other 'funnies' chars
                        array( '[]', '%5B%5D' ),
index 99ec2e4..9c953a6 100644 (file)
@@ -21,6 +21,17 @@ class MessageTest extends MediaWikiLangTestCase {
                $this->assertEquals( $key, $message->getKey() );
                $this->assertEquals( $params, $message->getParams() );
                $this->assertEquals( $expectedLang, $message->getLanguage() );
+
+               $messageSpecifier = $this->getMockForAbstractClass( 'MessageSpecifier' );
+               $messageSpecifier->expects( $this->any() )
+                       ->method( 'getKey' )->will( $this->returnValue( $key ) );
+               $messageSpecifier->expects( $this->any() )
+                       ->method( 'getParams' )->will( $this->returnValue( $params ) );
+               $message = new Message( $messageSpecifier, array(), $language );
+
+               $this->assertEquals( $key, $message->getKey() );
+               $this->assertEquals( $params, $message->getParams() );
+               $this->assertEquals( $expectedLang, $message->getLanguage() );
        }
 
        public static function provideConstructor() {
@@ -548,4 +559,26 @@ class MessageTest extends MediaWikiLangTestCase {
        public function testInLanguageThrows() {
                wfMessage( 'foo' )->inLanguage( 123 );
        }
+
+       /**
+        * @covers Message::serialize
+        * @covers Message::unserialize
+        */
+       public function testSerialization() {
+               $msg = new Message( 'parentheses' );
+               $msg->rawParams( '<a>foo</a>' );
+               $msg->title( Title::newFromText( 'Testing' ) );
+               $this->assertEquals( '(<a>foo</a>)', $msg->parse(), 'Sanity check' );
+               $msg = unserialize( serialize( $msg ) );
+               $this->assertEquals( '(<a>foo</a>)', $msg->parse() );
+               $title = TestingAccessWrapper::newFromObject( $msg )->title;
+               $this->assertInstanceOf( 'Title', $title );
+               $this->assertEquals( 'Testing', $title->getFullText() );
+
+               $msg = new Message( 'mainpage' );
+               $msg->inLanguage( 'de' );
+               $this->assertEquals( 'Hauptseite', $msg->plain(), 'Sanity check' );
+               $msg = unserialize( serialize( $msg ) );
+               $this->assertEquals( 'Hauptseite', $msg->plain() );
+       }
 }
index 81854ff..3b37f4a 100644 (file)
@@ -57,7 +57,20 @@ class TemplateParserTest extends MediaWikiTestCase {
                                array(),
                                false,
                                'RuntimeException',
-                       )
+                       ),
+                       array(
+                               'has_partial',
+                               array(
+                                       'planet' => 'world',
+                               ),
+                               "Partial hello world!\n in here\n",
+                       ),
+                       array(
+                               'bad_partial',
+                               array(),
+                               false,
+                               'Exception',
+                       ),
                );
        }
 }
index 6c3ce60..08a984e 100644 (file)
@@ -14,9 +14,13 @@ class ApiMessageTest extends MediaWikiTestCase {
 
                $msg = TestingAccessWrapper::newFromObject( $msg );
                $msg2 = TestingAccessWrapper::newFromObject( $msg2 );
-               foreach ( array( 'interface', 'useDatabase', 'title' ) as $key ) {
-                       $this->assertSame( $msg->$key, $msg2->$key, $key );
-               }
+               $this->assertSame( $msg->interface, $msg2->interface, 'interface' );
+               $this->assertSame( $msg->useDatabase, $msg2->useDatabase, 'useDatabase' );
+               $this->assertSame(
+                       $msg->title ? $msg->title->getFullText() : null,
+                       $msg2->title ? $msg2->title->getFullText() : null,
+                       'title'
+               );
        }
 
        /**
@@ -30,6 +34,11 @@ class ApiMessageTest extends MediaWikiTestCase {
                $this->assertEquals( 'code', $msg2->getApiCode() );
                $this->assertEquals( array( 'data' ), $msg2->getApiData() );
 
+               $msg2 = unserialize( serialize( $msg2 ) );
+               $this->compareMessages( $msg, $msg2 );
+               $this->assertEquals( 'code', $msg2->getApiCode() );
+               $this->assertEquals( array( 'data' ), $msg2->getApiData() );
+
                $msg = new Message( array( 'foo', 'bar' ), array( 'baz' ) );
                $msg2 = new ApiMessage( array( array( 'foo', 'bar' ), 'baz' ), 'code', array( 'data' ) );
                $this->compareMessages( $msg, $msg2 );
@@ -63,6 +72,11 @@ class ApiMessageTest extends MediaWikiTestCase {
                $this->assertEquals( 'code', $msg2->getApiCode() );
                $this->assertEquals( array( 'data' ), $msg2->getApiData() );
 
+               $msg2 = unserialize( serialize( $msg2 ) );
+               $this->compareMessages( $msg, $msg2 );
+               $this->assertEquals( 'code', $msg2->getApiCode() );
+               $this->assertEquals( array( 'data' ), $msg2->getApiData() );
+
                $msg = new RawMessage( 'foo', array( 'baz' ) );
                $msg2 = new ApiRawMessage( array( 'foo', 'baz' ), 'code', array( 'data' ) );
                $this->compareMessages( $msg, $msg2 );
index 9c59e65..5302b36 100644 (file)
@@ -124,4 +124,26 @@ class MessageCacheTest extends MediaWikiLangTestCase {
                );
        }
 
+       /**
+        * @dataProvider provideNormalizeKey
+        */
+       public function testNormalizeKey( $key, $expected ) {
+               $actual = MessageCache::normalizeKey( $key );
+               $this->assertEquals( $expected, $actual );
+       }
+
+       public function provideNormalizeKey() {
+               return array(
+                       array( 'Foo', 'foo' ),
+                       array( 'foo', 'foo' ),
+                       array( 'fOo', 'fOo' ),
+                       array( 'FOO', 'fOO' ),
+                       array( 'Foo bar', 'foo_bar' ),
+                       array( 'Ćab', 'ćab' ),
+                       array( 'Ćab_e 3', 'ćab_e_3' ),
+                       array( 'ĆAB', 'ćAB' ),
+                       array( 'ćab', 'ćab' ),
+                       array( 'ćaB', 'ćaB' ),
+               );
+       }
 }
index 40484d3..44427ba 100644 (file)
@@ -4,6 +4,8 @@
  * @group ContentHandler
  * @group Database
  *        ^--- needed, because we do need the database to test link updates
+ *
+ * @FIXME this should not extend JavaScriptContentTest.
  */
 class CssContentTest extends JavaScriptContentTest {
 
@@ -68,7 +70,28 @@ class CssContentTest extends JavaScriptContentTest {
                $this->assertEquals( CONTENT_MODEL_CSS, $content->getContentHandler()->getModelID() );
        }
 
-       public static function dataEquals() {
+       /**
+        * Redirects aren't supported
+        */
+       public static function provideUpdateRedirect() {
+               return array(
+                       array(
+                               '#REDIRECT [[Someplace]]',
+                               '#REDIRECT [[Someplace]]',
+                       ),
+               );
+       }
+
+       /**
+        * Override this since CssContent does not support redirects yet
+        */
+       public static function provideGetRedirectTarget() {
+               return array(
+                       array( null, '' ),
+               );
+       }
+
+               public static function dataEquals() {
                return array(
                        array( new CssContent( 'hallo' ), null, false ),
                        array( new CssContent( 'hallo' ), new CssContent( 'hallo' ), true ),
diff --git a/tests/phpunit/includes/content/JavaScriptContentHandlerTest.php b/tests/phpunit/includes/content/JavaScriptContentHandlerTest.php
new file mode 100644 (file)
index 0000000..0f41020
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+
+class JavaScriptContentHandlerTest extends MediaWikiTestCase {
+
+       /**
+        * @dataProvider provideMakeRedirectContent
+        * @covers JavaScriptContentHandler::makeRedirectContent
+        */
+       public function testMakeRedirectContent( $title, $expected ) {
+               $this->setMwGlobals( array(
+                       'wgServer' => '//example.org',
+                       'wgScript' => '/w/index.php',
+               ) );
+               $ch = new JavaScriptContentHandler();
+               $content = $ch->makeRedirectContent( Title::newFromText( $title ) );
+               $this->assertInstanceOf( 'JavaScriptContent', $content );
+               $this->assertEquals( $expected, $content->serialize( CONTENT_FORMAT_JAVASCRIPT ) );
+       }
+
+       /**
+        * Keep this in sync with JavaScriptContentTest::provideGetRedirectTarget()
+        */
+       public static function provideMakeRedirectContent() {
+               return array(
+                       array( 'MediaWiki:MonoBook.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=MediaWiki:MonoBook.js\u0026action=raw\u0026ctype=text/javascript");' ),
+                       array( 'User:FooBar/common.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=User:FooBar/common.js\u0026action=raw\u0026ctype=text/javascript");' ),
+                       array( 'Gadget:FooBaz.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=Gadget:FooBaz.js\u0026action=raw\u0026ctype=text/javascript");' ),
+               );
+       }
+}
index 7193ec9..0ee2712 100644 (file)
@@ -251,16 +251,31 @@ class JavaScriptContentTest extends TextContentTest {
 
        /**
         * @covers JavaScriptContent::updateRedirect
+        * @dataProvider provideUpdateRedirect
         */
-       public function testUpdateRedirect() {
+       public function testUpdateRedirect( $oldText, $expectedText) {
+               $this->setMwGlobals( array(
+                       'wgServer' => '//example.org',
+                       'wgScriptPath' => '/w/index.php',
+               ) );
                $target = Title::newFromText( "testUpdateRedirect_target" );
 
-               $content = $this->newContent( "#REDIRECT [[Someplace]]" );
+               $content = new JavaScriptContent( $oldText );
                $newContent = $content->updateRedirect( $target );
 
-               $this->assertTrue(
-                       $content->equals( $newContent ),
-                       "content should be unchanged since it's not wikitext"
+               $this->assertEquals( $expectedText, $newContent->getNativeData() );
+       }
+
+       public static function provideUpdateRedirect() {
+               return array(
+                       array(
+                               '#REDIRECT [[Someplace]]',
+                               '#REDIRECT [[Someplace]]',
+                       ),
+                       array(
+                               '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=MediaWiki:MonoBook.js\u0026action=raw\u0026ctype=text/javascript");',
+                               '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=TestUpdateRedirect_target\u0026action=raw\u0026ctype=text/javascript");'
+                       )
                );
        }
 
@@ -290,4 +305,32 @@ class JavaScriptContentTest extends TextContentTest {
                        array( new JavaScriptContent( "hallo" ), new JavaScriptContent( "HALLO" ), false ),
                );
        }
+
+       /**
+        * @dataProvider provideGetRedirectTarget
+        */
+       public function testGetRedirectTarget( $title, $text ) {
+               $this->setMwGlobals( array(
+                       'wgServer' => '//example.org',
+                       'wgScriptPath' => '/w/index.php',
+               ) );
+               $content = new JavaScriptContent( $text );
+               $target = $content->getRedirectTarget();
+               $this->assertEquals( $title, $target ? $target->getPrefixedText() : null );
+       }
+
+       /**
+        * Keep this in sync with JavaScriptContentHandlerTest::provideMakeRedirectContent()
+        */
+       public static function provideGetRedirectTarget() {
+               return array(
+                       array( 'MediaWiki:MonoBook.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=MediaWiki:MonoBook.js\u0026action=raw\u0026ctype=text/javascript");' ),
+                       array( 'User:FooBar/common.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=User:FooBar/common.js\u0026action=raw\u0026ctype=text/javascript");' ),
+                       array( 'Gadget:FooBaz.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=Gadget:FooBaz.js\u0026action=raw\u0026ctype=text/javascript");' ),
+                       // No #REDIRECT comment
+                       array( null, 'mw.loader.load("//example.org/w/index.php?title=MediaWiki:NoRedirect.js\u0026action=raw\u0026ctype=text/javascript");' ),
+                       // Different domain
+                       array( null, '/* #REDIRECT */mw.loader.load("//example.com/w/index.php?title=MediaWiki:OtherWiki.js\u0026action=raw\u0026ctype=text/javascript");' ),
+               );
+       }
 }
index 338d931..764560d 100644 (file)
@@ -68,25 +68,6 @@ class ORMTableTest extends MediaWikiTestCase {
                $this->assertInstanceOf( $class, $class::singleton() );
                $this->assertTrue( $class::singleton() === $class::singleton() );
        }
-
-       /**
-        * @since 1.21
-        */
-       public function testIgnoreErrorsOverride() {
-               $table = $this->getTable();
-
-               $db = $table->getReadDbConnection();
-               $db->ignoreErrors( true );
-
-               try {
-                       $table->rawSelect( "this is invalid" );
-                       $this->fail( "An invalid query should trigger a DBQueryError even if ignoreErrors is enabled." );
-               } catch ( DBQueryError $ex ) {
-                       $this->assertTrue( true, "just making phpunit happy" );
-               }
-
-               $db->ignoreErrors( false );
-       }
 }
 
 /**
diff --git a/tests/phpunit/includes/debug/logger/LegacyLoggerTest.php b/tests/phpunit/includes/debug/logger/LegacyLoggerTest.php
new file mode 100644 (file)
index 0000000..c63ce66
--- /dev/null
@@ -0,0 +1,168 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki\Logger;
+
+use MediaWikiTestCase;
+use Psr\Log\LogLevel;
+
+class LegacyLoggerTest extends MediaWikiTestCase {
+
+       /**
+        * @covers LegacyLogger::interpolate
+        * @dataProvider provideInterpolate
+        */
+       public function testInterpolate( $message, $context, $expect ) {
+               $this->assertEquals(
+                       $expect, LegacyLogger::interpolate( $message, $context ) );
+       }
+
+       public function provideInterpolate() {
+               $e = new \Exception( 'boom!' );
+               $d = new \DateTime();
+               return array(
+                       array(
+                               'no-op',
+                               array(),
+                               'no-op',
+                       ),
+                       array(
+                               'Hello {world}!',
+                               array(
+                                       'world' => 'World',
+                               ),
+                               'Hello World!',
+                       ),
+                       array(
+                               '{greeting} {user}',
+                               array(
+                                       'greeting' => 'Goodnight',
+                                       'user' => 'Moon',
+                               ),
+                               'Goodnight Moon',
+                       ),
+                       array(
+                               'Oops {key_not_set}',
+                               array(),
+                               'Oops {key_not_set}',
+                       ),
+                       array(
+                               '{ not interpolated }',
+                               array(
+                                       'not interpolated' => 'This should NOT show up in the message',
+                               ),
+                               '{ not interpolated }',
+                       ),
+                       array(
+                               '{null}',
+                               array(
+                                       'null' => null,
+                               ),
+                               '[Null]',
+                       ),
+                       array(
+                               '{bool}',
+                               array(
+                                       'bool' => true,
+                               ),
+                               'true',
+                       ),
+                       array(
+                               '{array}',
+                               array(
+                                       'array' => array( 1, 2, 3 ),
+                               ),
+                               '[Array(3)]',
+                       ),
+                       array(
+                               '{exception}',
+                               array(
+                                       'exception' => $e,
+                               ),
+                               '[Exception ' . get_class( $e ) . '( ' .
+                               $e->getFile() . ':' . $e->getLine() . ') ' .
+                               $e->getMessage() . ']',
+                       ),
+                       array(
+                               '{datetime}',
+                               array(
+                                       'datetime' => $d,
+                               ),
+                               $d->format( 'c' ),
+                       ),
+                       array(
+                               '{object}',
+                               array(
+                                       'object' => new \stdClass,
+                               ),
+                               '[Object stdClass]',
+                       ),
+               );
+       }
+
+       /**
+        * @covers LegacyLogger::shouldEmit
+        * @dataProvider provideShouldEmit
+        */
+       public function testShouldEmit( $level, $config, $expected ) {
+               $this->setMwGlobals( 'wgDebugLogGroups', array( 'fakechannel' => $config ) );
+               $this->assertEquals(
+                       $expected,
+                       LegacyLogger::shouldEmit( 'fakechannel', 'some message', $level, array() )
+               );
+       }
+
+       public static function provideShouldEmit() {
+               $dest = array( 'destination' => 'foobar' );
+               $tests = array(
+                       array(
+                               LogLevel::DEBUG,
+                               $dest,
+                               true
+                       ),
+                       array(
+                               LogLevel::WARNING,
+                               $dest + array( 'level' => LogLevel::INFO ),
+                               true,
+                       ),
+                       array(
+                               LogLevel::INFO,
+                               $dest + array( 'level' => LogLevel::CRITICAL ),
+                               false,
+                       ),
+               );
+
+               if ( class_exists( '\Monolog\Logger' ) ) {
+                       $tests[] = array(
+                               \Monolog\Logger::INFO,
+                               $dest + array( 'level' => LogLevel::INFO ),
+                               true,
+                       );
+                       $tests[] = array(
+                               \Monolog\Logger::WARNING,
+                               $dest + array( 'level' => LogLevel::EMERGENCY ),
+                               false,
+                       );
+               }
+
+               return $tests;
+       }
+
+}
diff --git a/tests/phpunit/includes/debug/logger/MonologSpiTest.php b/tests/phpunit/includes/debug/logger/MonologSpiTest.php
new file mode 100644 (file)
index 0000000..aa0a54f
--- /dev/null
@@ -0,0 +1,136 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki\Logger;
+
+use MediaWikiTestCase;
+use TestingAccessWrapper;
+
+class MonologSpiTest extends MediaWikiTestCase {
+
+       /**
+        * @covers MonologSpi::mergeConfig
+        */
+       public function testMergeConfig() {
+               $base = array(
+                       'loggers' => array(
+                               '@default' => array(
+                                       'processors' => array( 'constructor' ),
+                                       'handlers' => array( 'constructor' ),
+                               ),
+                       ),
+                       'processors' => array(
+                               'constructor' => array(
+                                       'class' => 'constructor',
+                               ),
+                       ),
+                       'handlers' => array(
+                               'constructor' => array(
+                                       'class' => 'constructor',
+                                       'formatter' => 'constructor',
+                               ),
+                       ),
+                       'formatters' => array(
+                               'constructor' => array(
+                                       'class' => 'constructor',
+                               ),
+                       ),
+               );
+
+               $fixture = new MonologSpi( $base );
+               $this->assertSame(
+                       $base,
+                       TestingAccessWrapper::newFromObject( $fixture )->config
+               );
+
+               $fixture->mergeConfig( array(
+                       'loggers' => array(
+                               'merged' => array(
+                                       'processors' => array( 'merged' ),
+                                       'handlers' => array( 'merged' ),
+                               ),
+                       ),
+                       'processors' => array(
+                               'merged' => array(
+                                       'class' => 'merged',
+                               ),
+                       ),
+                       'magic' => array(
+                               'idkfa' => array( 'xyzzy' ),
+                       ),
+                       'handlers' => array(
+                               'merged' => array(
+                                       'class' => 'merged',
+                                       'formatter' => 'merged',
+                               ),
+                       ),
+                       'formatters' => array(
+                               'merged' => array(
+                                       'class' => 'merged',
+                               ),
+                       ),
+               ) );
+               $this->assertSame(
+                       array(
+                               'loggers' => array(
+                                       '@default' => array(
+                                               'processors' => array( 'constructor' ),
+                                               'handlers' => array( 'constructor' ),
+                                       ),
+                                       'merged' => array(
+                                               'processors' => array( 'merged' ),
+                                               'handlers' => array( 'merged' ),
+                                       ),
+                               ),
+                               'processors' => array(
+                                       'constructor' => array(
+                                               'class' => 'constructor',
+                                       ),
+                                       'merged' => array(
+                                               'class' => 'merged',
+                                       ),
+                               ),
+                               'handlers' => array(
+                                       'constructor' => array(
+                                               'class' => 'constructor',
+                                               'formatter' => 'constructor',
+                                       ),
+                                       'merged' => array(
+                                               'class' => 'merged',
+                                               'formatter' => 'merged',
+                                       ),
+                               ),
+                               'formatters' => array(
+                                       'constructor' => array(
+                                               'class' => 'constructor',
+                                       ),
+                                       'merged' => array(
+                                               'class' => 'merged',
+                                       ),
+                               ),
+                               'magic' => array(
+                                       'idkfa' => array( 'xyzzy' ),
+                               ),
+                       ),
+                       TestingAccessWrapper::newFromObject( $fixture )->config
+               );
+       }
+
+}
diff --git a/tests/phpunit/includes/debug/logging/LegacyLoggerTest.php b/tests/phpunit/includes/debug/logging/LegacyLoggerTest.php
deleted file mode 100644 (file)
index 415fa04..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-<?php
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-namespace MediaWiki\Logger;
-
-use MediaWikiTestCase;
-use Psr\Log\LogLevel;
-
-class LegacyLoggerTest extends MediaWikiTestCase {
-
-       /**
-        * @covers LegacyLogger::interpolate
-        * @dataProvider provideInterpolate
-        */
-       public function testInterpolate( $message, $context, $expect ) {
-               $this->assertEquals(
-                       $expect, LegacyLogger::interpolate( $message, $context ) );
-       }
-
-       public function provideInterpolate() {
-               return array(
-                       array(
-                               'no-op',
-                               array(),
-                               'no-op',
-                       ),
-                       array(
-                               'Hello {world}!',
-                               array(
-                                       'world' => 'World',
-                               ),
-                               'Hello World!',
-                       ),
-                       array(
-                               '{greeting} {user}',
-                               array(
-                                       'greeting' => 'Goodnight',
-                                       'user' => 'Moon',
-                               ),
-                               'Goodnight Moon',
-                       ),
-                       array(
-                               'Oops {key_not_set}',
-                               array(),
-                               'Oops {key_not_set}',
-                       ),
-                       array(
-                               '{ not interpolated }',
-                               array(
-                                       'not interpolated' => 'This should NOT show up in the message',
-                               ),
-                               '{ not interpolated }',
-                       ),
-               );
-       }
-
-       /**
-        * @covers LegacyLogger::shouldEmit
-        * @dataProvider provideShouldEmit
-        */
-       public function testShouldEmit( $level, $config, $expected ) {
-               $this->setMwGlobals( 'wgDebugLogGroups', array( 'fakechannel' => $config ) );
-               $this->assertEquals(
-                       $expected,
-                       LegacyLogger::shouldEmit( 'fakechannel', 'some message', $level, array() )
-               );
-       }
-
-       public static function provideShouldEmit() {
-               $dest = array( 'destination' => 'foobar' );
-               $tests = array(
-                       array(
-                               LogLevel::DEBUG,
-                               $dest,
-                               true
-                       ),
-                       array(
-                               LogLevel::WARNING,
-                               $dest + array( 'level' => LogLevel::INFO ),
-                               true,
-                       ),
-                       array(
-                               LogLevel::INFO,
-                               $dest + array( 'level' => LogLevel::CRITICAL ),
-                               false,
-                       ),
-               );
-
-               if ( class_exists( '\Monolog\Logger' ) ) {
-                       $tests[] = array(
-                               \Monolog\Logger::INFO,
-                               $dest + array( 'level' => LogLevel::INFO ),
-                               true,
-                       );
-                       $tests[] = array(
-                               \Monolog\Logger::WARNING,
-                               $dest + array( 'level' => LogLevel::EMERGENCY ),
-                               false,
-                       );
-               }
-
-               return $tests;
-       }
-
-}
diff --git a/tests/phpunit/includes/filerepo/FileBackendDBRepoWrapperTest.php b/tests/phpunit/includes/filerepo/FileBackendDBRepoWrapperTest.php
new file mode 100644 (file)
index 0000000..681e368
--- /dev/null
@@ -0,0 +1,138 @@
+<?php
+
+class FileBackendDBRepoWrapperTest extends MediaWikiTestCase {
+       protected $backendName = 'foo-backend';
+       protected $repoName = 'pureTestRepo';
+
+       /**
+        * @dataProvider getBackendPathsProvider
+        * @covers FileBackendDBRepoWrapper::getBackendPaths
+        */
+       public function testGetBackendPaths(
+               $mocks,
+               $latest,
+               $dbReadsExpected,
+               $dbReturnValue,
+               $originalPath,
+               $expectedBackendPath,
+               $message ) {
+               list( $dbMock, $backendMock, $wrapperMock ) = $mocks;
+
+               $dbMock->expects( $dbReadsExpected )
+                       ->method( 'selectField' )
+                       ->will( $this->returnValue( $dbReturnValue ) );
+
+               $newPaths = $wrapperMock->getBackendPaths( array( $originalPath ), $latest );
+
+               $this->assertEquals(
+                       $expectedBackendPath,
+                       $newPaths[0],
+                       $message );
+       }
+
+       public function getBackendPathsProvider() {
+               $prefix = 'mwstore://' . $this->backendName . '/' . $this->repoName;
+               $mocksForCaching = $this->getMocks();
+
+               return array(
+                       array(
+                               $mocksForCaching,
+                               false,
+                               $this->once(),
+                               '96246614d75ba1703bdfd5d7660bb57407aaf5d9',
+                               $prefix . '-public/f/o/foobar.jpg',
+                               $prefix . '-original/9/6/2/96246614d75ba1703bdfd5d7660bb57407aaf5d9',
+                               'Public path translated correctly',
+                       ),
+                       array(
+                               $mocksForCaching,
+                               false,
+                               $this->never(),
+                               '96246614d75ba1703bdfd5d7660bb57407aaf5d9',
+                               $prefix . '-public/f/o/foobar.jpg',
+                               $prefix . '-original/9/6/2/96246614d75ba1703bdfd5d7660bb57407aaf5d9',
+                               'LRU cache leveraged',
+                       ),
+                       array(
+                               $this->getMocks(),
+                               true,
+                               $this->once(),
+                               '96246614d75ba1703bdfd5d7660bb57407aaf5d9',
+                               $prefix . '-public/f/o/foobar.jpg',
+                               $prefix . '-original/9/6/2/96246614d75ba1703bdfd5d7660bb57407aaf5d9',
+                               'Latest obtained',
+                       ),
+                       array(
+                               $this->getMocks(),
+                               true,
+                               $this->never(),
+                               '96246614d75ba1703bdfd5d7660bb57407aaf5d9',
+                               $prefix . '-deleted/f/o/foobar.jpg',
+                               $prefix . '-original/f/o/o/foobar',
+                               'Deleted path translated correctly',
+                       ),
+                       array(
+                               $this->getMocks(),
+                               true,
+                               $this->once(),
+                               null,
+                               $prefix . '-public/b/a/baz.jpg',
+                               $prefix . '-public/b/a/baz.jpg',
+                               'Path left untouched if no sha1 can be found',
+                       ),
+               );
+       }
+
+       /**
+        * @covers FileBackendDBRepoWrapper::getFileContentsMulti
+        */
+       public function testGetFileContentsMulti() {
+               list( $dbMock, $backendMock, $wrapperMock ) = $this->getMocks();
+
+               $sha1Path = 'mwstore://' . $this->backendName . '/' . $this->repoName
+                       . '-original/9/6/2/96246614d75ba1703bdfd5d7660bb57407aaf5d9';
+               $filenamePath = 'mwstore://' . $this->backendName . '/' . $this->repoName
+                       . '-public/f/o/foobar.jpg';
+
+               $dbMock->expects( $this->once() )
+                       ->method( 'selectField' )
+                       ->will( $this->returnValue( '96246614d75ba1703bdfd5d7660bb57407aaf5d9' ) );
+
+               $backendMock->expects( $this->once() )
+                       ->method( 'getFileContentsMulti')
+                       ->will( $this->returnValue( array( $sha1Path => 'foo' ) ) );
+
+               $result = $wrapperMock->getFileContentsMulti( array( 'srcs' => array( $filenamePath ) ) );
+
+               $this->assertEquals(
+                       array( $filenamePath => 'foo' ),
+                       $result,
+                       'File contents paths translated properly'
+               );
+       }
+
+       protected function getMocks() {
+               $dbMock = $this->getMockBuilder( 'DatabaseMysql' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $backendMock = $this->getMock( 'FSFileBackend',
+                       array(),
+                       array( array(
+                               'name' => $this->backendName,
+                               'wikiId' => wfWikiId()
+                       ) ) );
+
+               $wrapperMock = $this->getMock( 'FileBackendDBRepoWrapper',
+                       array( 'getDB' ),
+                       array( array(
+                               'backend' => $backendMock,
+                               'repoName' => $this->repoName,
+                               'dbHandleFactory' => null
+                       ) ) );
+
+               $wrapperMock->expects( $this->any() )->method( 'getDB' )->will( $this->returnValue( $dbMock ) );
+
+               return array( $dbMock, $backendMock, $wrapperMock );
+       }
+}
diff --git a/tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php b/tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php
new file mode 100644 (file)
index 0000000..65db7e4
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+
+class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
+       protected $tmpPrefix;
+       protected $migratorMock;
+       protected $tmpFilepath;
+       protected $text = 'testing';
+
+       protected function setUp() {
+               parent::setUp();
+
+               $filename = 'Foo.png';
+
+               $this->tmpPrefix = wfTempDir() . '/migratefilelayout-test-' . time() . '-' . mt_rand();
+
+               $backend = new FSFileBackend( array(
+                       'name' => 'local-migratefilerepolayouttest',
+                       'wikiId' => wfWikiID(),
+                       'containerPaths' => array(
+                               'migratefilerepolayouttest-original' => "{$this->tmpPrefix}-original",
+                               'migratefilerepolayouttest-public' => "{$this->tmpPrefix}-public",
+                               'migratefilerepolayouttest-thumb' => "{$this->tmpPrefix}-thumb",
+                               'migratefilerepolayouttest-temp' => "{$this->tmpPrefix}-temp",
+                               'migratefilerepolayouttest-deleted' => "{$this->tmpPrefix}-deleted",
+                       )
+               ) );
+
+               $dbMock = $this->getMockBuilder( 'DatabaseMysql' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $imageRow = new stdClass;
+               $imageRow->img_name = $filename;
+               $imageRow->img_sha1 = sha1( $this->text );
+
+               $dbMock->expects( $this->any() )
+                       ->method( 'select' )
+                       ->will( $this->onConsecutiveCalls(
+                               new FakeResultWrapper( array( $imageRow ) ), // image
+                               new FakeResultWrapper( array() ), // image
+                               new FakeResultWrapper( array() ) // filearchive
+                       ) );
+
+               $repoMock = $this->getMock( 'LocalRepo',
+                       array( 'getMasterDB' ),
+                       array( array(
+                               'name' => 'migratefilerepolayouttest',
+                               'backend' => $backend
+                       ) ) );
+
+               $repoMock->expects( $this->any() )->method( 'getMasterDB' )->will( $this->returnValue( $dbMock ) );
+
+               $this->migratorMock = $this->getMock( 'MigrateFileRepoLayout', array( 'getRepo' ) );
+               $this->migratorMock->expects( $this->any() )->method( 'getRepo' )->will( $this->returnValue( $repoMock ) );
+
+               $this->tmpFilepath = TempFSFile::factory( 'migratefilelayout-test-', 'png' )->getPath();
+
+               file_put_contents( $this->tmpFilepath, $this->text );
+
+               $hashPath = $repoMock->getHashPath( $filename );
+
+               $status = $repoMock->store( $this->tmpFilepath, 'public', $hashPath . $filename, FileRepo::OVERWRITE );
+       }
+
+       protected function deleteFilesRecursively( $directory ) {
+               foreach ( glob( $directory . '/*' ) as $file ) {
+               if ( is_dir( $file ) ) {
+                       $this->deleteFilesRecursively( $file );
+               } else {
+                       unlink( $file );
+               }
+               }
+
+               rmdir( $directory );
+       }
+
+       protected function tearDown() {
+       foreach ( glob( $this->tmpPrefix . '*' ) as $directory ) {
+               $this->deleteFilesRecursively( $directory );
+       }
+
+       unlink( $this->tmpFilepath );
+
+               parent::tearDown();
+       }
+
+       public function testMigration() {
+               $this->migratorMock->loadParamsAndArgs( null, array( 'oldlayout' => 'name', 'newlayout' => 'sha1' ) );
+
+               ob_start();
+
+               $this->migratorMock->execute();
+
+               ob_end_clean();
+
+               $sha1 = sha1( $this->text );
+
+               $expectedOriginalFilepath = $this->tmpPrefix
+                       . '-original/'
+                       . substr( $sha1, 0, 1 )
+                       . '/'
+                       . substr( $sha1, 1, 1 )
+                       . '/'
+                       . substr( $sha1, 2, 1 )
+                       . '/'
+                       . $sha1 ;
+
+               $this->assertEquals( file_get_contents( $expectedOriginalFilepath ), $this->text, 'New sha1 file should be exist and have the right contents' );
+
+               $expectedPublicFilepath = $this->tmpPrefix . '-public/f/f8/Foo.png';
+
+               $this->assertEquals( file_get_contents( $expectedPublicFilepath ), $this->text, 'Existing name file should still and have the right contents' );
+       }
+}
index 10f64be..9b4eca7 100644 (file)
@@ -224,6 +224,7 @@ class WANObjectCacheTest extends MediaWikiTestCase {
 
        /**
         * @covers WANObjectCache::touchCheckKey()
+        * @covers WANObjectCache::resetCheckKey()
         * @covers WANObjectCache::getCheckKeyTime()
         */
        public function testTouchKeys() {
@@ -250,5 +251,13 @@ class WANObjectCacheTest extends MediaWikiTestCase {
 
                $t4 = $this->cache->getCheckKeyTime( $key );
                $this->assertEquals( $t3, $t4, 'Check key time did not change' );
+
+               usleep( 1 );
+               $this->cache->resetCheckKey( $key );
+               $t5 = $this->cache->getCheckKeyTime( $key );
+               $this->assertGreaterThan( $t4, $t5, 'Check key time increased' );
+
+               $t6 = $this->cache->getCheckKeyTime( $key );
+               $this->assertEquals( $t5, $t6, 'Check key time did not change' );
        }
 }
index 136ca6e..41653fb 100644 (file)
@@ -3,10 +3,9 @@
 class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
 
        /**
-        * @covers ResourceLoaderModule::getDefinitionSummary
-        * @covers ResourceLoaderFileModule::getDefinitionSummary
+        * @covers ResourceLoaderModule::getVersionHash
         */
-       public function testDefinitionSummary() {
+       public function testGetVersionHash() {
                $context = $this->getResourceLoaderContext();
 
                $baseParams = array(
@@ -16,15 +15,13 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
                );
 
                $module = new ResourceLoaderFileModule( $baseParams );
-
-               $jsonSummary = json_encode( $module->getDefinitionSummary( $context ) );
+               $version = json_encode( $module->getVersionHash( $context ) );
 
                // Exactly the same
                $module = new ResourceLoaderFileModule( $baseParams );
-
                $this->assertEquals(
-                       $jsonSummary,
-                       json_encode( $module->getDefinitionSummary( $context ) ),
+                       $version,
+                       json_encode( $module->getVersionHash( $context ) ),
                        'Instance is insignificant'
                );
 
@@ -32,10 +29,9 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
                $module = new ResourceLoaderFileModule( array(
                        'dependencies' => array( 'mediawiki', 'jquery' ),
                ) + $baseParams );
-
                $this->assertEquals(
-                       $jsonSummary,
-                       json_encode( $module->getDefinitionSummary( $context ) ),
+                       $version,
+                       json_encode( $module->getVersionHash( $context ) ),
                        'Order of dependencies is insignificant'
                );
 
@@ -43,10 +39,9 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
                $module = new ResourceLoaderFileModule( array(
                        'messages' => array( 'world', 'hello' ),
                ) + $baseParams );
-
                $this->assertEquals(
-                       $jsonSummary,
-                       json_encode( $module->getDefinitionSummary( $context ) ),
+                       $version,
+                       json_encode( $module->getVersionHash( $context ) ),
                        'Order of messages is insignificant'
                );
 
@@ -54,19 +49,17 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
                $module = new ResourceLoaderFileModule( array(
                        'scripts' => array( 'bar.js', 'foo.js' ),
                ) + $baseParams );
-
                $this->assertNotEquals(
-                       $jsonSummary,
-                       json_encode( $module->getDefinitionSummary( $context ) ),
+                       $version,
+                       json_encode( $module->getVersionHash( $context ) ),
                        'Order of scripts is significant'
                );
 
                // Subclass
                $module = new ResourceLoaderFileModuleTestModule( $baseParams );
-
                $this->assertNotEquals(
-                       $jsonSummary,
-                       json_encode( $module->getDefinitionSummary( $context ) ),
+                       $version,
+                       json_encode( $module->getVersionHash( $context ) ),
                        'Class is significant'
                );
        }
index 6c4839e..c216864 100644 (file)
@@ -418,7 +418,10 @@ class TextPassDumperDatabaseTest extends DumpTestCase {
        }
 
        /**
+        * Broken per T70653.
+        *
         * @group large
+        * @group Broken
         */
        function testCheckpointPlain() {
                $this->checkpointHelper();
index efde4c0..587d6d0 100755 (executable)
@@ -55,7 +55,7 @@ class PHPUnitMaintClass extends Maintenance {
        public function finalSetup() {
                parent::finalSetup();
 
-               global $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType;
+               global $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType, $wgMainWANCache;
                global $wgLanguageConverterCacheType, $wgUseDatabaseMessages;
                global $wgLocaltimezone, $wgLocalisationCacheConf;
                global $wgDevelopmentWarnings;
@@ -67,6 +67,7 @@ class PHPUnitMaintClass extends Maintenance {
                $wgDevelopmentWarnings = true;
 
                $wgMainCacheType = CACHE_NONE;
+               $wgMainWANCache = CACHE_NONE;
                $wgMessageCacheType = CACHE_NONE;
                $wgParserCacheType = CACHE_NONE;
                $wgLanguageConverterCacheType = CACHE_NONE;
index c6f3a23..3608a53 100644 (file)
@@ -8,14 +8,14 @@ return array(
 
        'test.sinonjs' => array(
                'scripts' => array(
-                       'resources/lib/sinonjs/sinon-1.15.0.js',
+                       'resources/lib/sinonjs/sinon-1.15.4.js',
                        // We want tests to work in IE, but can't include this as it
                        // will break the placeholders in Sinon because the hack it uses
                        // to hijack IE globals relies on running in the global scope
                        // and in ResourceLoader this won't be running in the global scope.
                        // Including it results (among other things) in sandboxed timers
                        // being broken due to Date inheritance being undefined.
-                       // 'resources/lib/sinonjs/sinon-ie-1.15.0.js',
+                       // 'resources/lib/sinonjs/sinon-ie-1.15.4.js',
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
@@ -31,6 +31,7 @@ return array(
                        'mediawiki.page.ready',
                        'mediawiki.page.startup',
                        'test.sinonjs',
+                       'dom-level2-shim',
                ),
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
@@ -79,6 +80,7 @@ return array(
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.category.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.options.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js',
+                       'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.upload.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.watch.test.js',
                        'tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js',
@@ -106,6 +108,7 @@ return array(
                        'mediawiki.api.category',
                        'mediawiki.api.options',
                        'mediawiki.api.parse',
+                       'mediawiki.api.upload',
                        'mediawiki.api.watch',
                        'mediawiki.jqueryMsg',
                        'mediawiki.messagePoster',
index 61ebbf8..0fcaa5f 100644 (file)
@@ -133,8 +133,7 @@ class GenerateJqueryMsgData extends Maintenance {
                                . "// languages, and parser modes. Intended for use by a unit test framework by looping\n"
                                . "// through the object and comparing its parser return value with the 'result' property.\n"
                                . '// Last generated with ' . basename( __FILE__ ) . ' at ' . gmdate( 'r' ) . "\n"
-                               // This file will contain unquoted JSON strings as javascript native object literals,
-                               // flip the quotemark convention for this file.
+                               . "//jscs:disable\n"
                                . "\n"
                                . 'mediaWiki.libs.phpParserData = ' . FormatJson::encode( $phpParserData, true ) . ";\n";
 
index 4ab5f14..498acc1 100644 (file)
@@ -1,7 +1,8 @@
 // This file stores the output from the PHP parser for various messages, arguments,
 // languages, and parser modes. Intended for use by a unit test framework by looping
 // through the object and comparing its parser return value with the 'result' property.
-// Last generated with generateJqueryMsgData.php at Thu, 30 Jan 2014 04:04:41 +0000
+// Last generated with generateJqueryMsgData.php at Fri, 10 Jul 2015 11:44:08 +0000
+//jscs:disable
 
 mediaWiki.libs.phpParserData = {
     "messages": {
index 7c3d699..41754b4 100644 (file)
@@ -3,10 +3,7 @@
 ( function ( $, mw, QUnit ) {
        'use strict';
 
-       var mwTestIgnore, mwTester,
-               addons,
-               ELEMENT_NODE = 1,
-               TEXT_NODE = 3;
+       var mwTestIgnore, mwTester, addons;
 
        /**
         * Add bogus to url to prevent IE crazy caching
                                        }
                                },
                                teardown: function () {
-                                       this.sandbox.verifyAndRestore();
-
                                        if ( localEnv.teardown ) {
                                                localEnv.teardown.call( this );
                                        }
+
+                                       this.sandbox.verifyAndRestore();
                                }
                        } );
                };
        function getDomStructure( node ) {
                var $node, children, processedChildren, i, len, el;
                $node = $( node );
-               if ( node.nodeType === ELEMENT_NODE ) {
+               if ( node.nodeType === Node.ELEMENT_NODE ) {
                        children = $node.contents();
                        processedChildren = [];
                        for ( i = 0, len = children.length; i < len; i++ ) {
                                el = children[i];
-                               if ( el.nodeType === ELEMENT_NODE || el.nodeType === TEXT_NODE ) {
+                               if ( el.nodeType === Node.ELEMENT_NODE || el.nodeType === Node.TEXT_NODE ) {
                                        processedChildren.push( getDomStructure( el ) );
                                }
                        }
index 8040581..c51e409 100644 (file)
                this.clock.tick( 500 );
        } );
 
+       QUnit.test( 'cloned collapsibles can be made collapsible again', 2, function ( assert ) {
+               var test = this,
+                       $collapsible = prepareCollapsible(
+                               '<div class="mw-collapsible">' + loremIpsum + '</div>'
+                       ),
+                       $clone = $collapsible.clone() // clone without data and events
+                               .appendTo( '#qunit-fixture' ).makeCollapsible(),
+                       $content = $clone.find( '.mw-collapsible-content' );
+
+               assert.assertTrue( $content.is( ':visible' ), 'content is visible' );
+
+               $clone.on( 'afterCollapse.mw-collapsible', function () {
+                       assert.assertTrue( $content.is( ':hidden' ), 'after collapsing: content is hidden' );
+               } );
+
+               $clone.find( '.mw-collapsible-toggle a' ).trigger( 'click' );
+               test.clock.tick( 500 );
+       } );
 }( mediaWiki, jQuery ) );
index 4f199bd..de79198 100644 (file)
@@ -2,14 +2,39 @@
        QUnit.module( 'mediawiki.api', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
+                       this.server.respondImmediately = true;
+                       this.clock = this.sandbox.useFakeTimers();
+               },
+               teardown: function () {
+                       // https://github.com/jquery/jquery/issues/2453
+                       this.clock.tick();
                }
        } ) );
 
+       function sequence( responses ) {
+               var i = 0;
+               return function ( request ) {
+                       var response = responses[i];
+                       if ( response ) {
+                               i++;
+                               request.respond.apply( request, response );
+                       }
+               };
+       }
+
+       function sequenceBodies( status, headers, bodies ) {
+               jQuery.each( bodies, function ( i, body ) {
+                       bodies[i] = [ status, headers, body ];
+               } );
+               return sequence( bodies );
+       }
+
        QUnit.test( 'Basic functionality', function ( assert ) {
                QUnit.expect( 2 );
-
                var api = new mw.Api();
 
+               this.server.respond( [ 200, { 'Content-Type': 'application/json' }, '[]' ] );
+
                api.get( {} )
                        .done( function ( data ) {
                                assert.deepEqual( data, [], 'If request succeeds without errors, resolve deferred' );
                        .done( function ( data ) {
                                assert.deepEqual( data, [], 'Simple POST request' );
                        } );
-
-               this.server.respond( function ( request ) {
-                       request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
-               } );
        } );
 
        QUnit.test( 'API error', function ( assert ) {
                QUnit.expect( 1 );
-
                var api = new mw.Api();
 
+               this.server.respond( [ 200, { 'Content-Type': 'application/json' },
+                       '{ "error": { "code": "unknown_action" } }'
+               ] );
+
                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( 'FormData support', function ( assert ) {
                QUnit.expect( 2 );
-
                var api = new mw.Api();
 
-               api.post( { action: 'test' }, { contentType: 'multipart/form-data' } );
-
                this.server.respond( function ( request ) {
                        if ( window.FormData ) {
                                assert.ok( !request.url.match( /action=/ ), 'Request has no query string' );
                        }
                        request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
                } );
+
+               api.post( { action: 'test' }, { contentType: 'multipart/form-data' } );
        } );
 
        QUnit.test( 'Converting arrays to pipe-separated', function ( assert ) {
                QUnit.expect( 1 );
-
                var api = new mw.Api();
-               api.get( { test: [ 'foo', 'bar', 'baz' ] } );
 
                this.server.respond( function ( request ) {
                        assert.ok( request.url.match( /test=foo%7Cbar%7Cbaz/ ), 'Pipe-separated value was submitted' );
                        request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
                } );
+
+               api.get( { test: [ 'foo', 'bar', 'baz' ] } );
        } );
 
-       QUnit.test( 'getToken( pre-populated )', function ( assert ) {
+       QUnit.test( 'getToken() - cached', function ( assert ) {
                QUnit.expect( 2 );
-
                var api = new mw.Api();
 
                // Get editToken for local wiki, this should not make
-               // a request as it should be retrieved from user.tokens.
-               // This means that this test must run before the #badToken test below.
+               // a request as it should be retrieved from mw.user.tokens.
                api.getToken( 'edit' )
                        .done( function ( token ) {
                                assert.ok( token.length, 'Got a token' );
                assert.equal( this.server.requests.length, 0, 'Requests made' );
        } );
 
-       QUnit.test( 'badToken()', function ( assert ) {
-               QUnit.expect( 2 );
-
+       QUnit.test( 'getToken() - uncached', function ( assert ) {
+               QUnit.expect( 3 );
                var api = new mw.Api();
 
-               // Clear the default cached token
-               api.badToken( 'edit' );
-
-               api.getToken( 'edit' )
-                       .done( function ( token ) {
-                               assert.equal( token, '0123abc', 'Got a non-cached token' );
-                       } )
-                       .fail( function ( err ) {
-                               assert.equal( '', err, 'API error' );
-                       } );
-
-               this.server.requests[0].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "tokens": { "edittoken": "0123abc" } }'
-               );
-
-               assert.equal( this.server.requests.length, 1, 'Requests made' );
-       } );
-
-       QUnit.test( 'getToken()', function ( assert ) {
-               QUnit.expect( 5 );
-
-               var test = this,
-                       api = new mw.Api();
+               this.server.respondWith( /type=testuncached/, [ 200, { 'Content-Type': 'application/json' },
+                       '{ "tokens": { "testuncachedtoken": "good" } }'
+               ] );
 
                // Get a token of a type that isn't prepopulated by user.tokens.
                // Could use "block" or "delete" here, but those could in theory
                // be added to user.tokens, use a fake one instead.
-               api.getToken( 'testaction' )
+               api.getToken( 'testuncached' )
                        .done( function ( token ) {
-                               assert.ok( token.length, 'Got testaction token' );
+                               assert.equal( token, 'good', 'The token' );
                        } )
                        .fail( function ( err ) {
                                assert.equal( err, '', 'API error' );
                        } );
-               api.getToken( 'testaction' )
+
+               api.getToken( 'testuncached' )
                        .done( function ( token ) {
-                               assert.ok( token.length, 'Got testaction token (cached)' );
+                               assert.equal( token, 'good', 'The cached token' );
                        } )
                        .fail( function ( err ) {
                                assert.equal( err, '', 'API error' );
                        } );
 
+               assert.equal( this.server.requests.length, 1, 'Requests made' );
+       } );
+
+       QUnit.test( 'getToken() - error', function ( assert ) {
+               QUnit.expect( 2 );
+               var api = new mw.Api();
+
+               this.server.respondWith( /type=testerror/, sequenceBodies( 200, { 'Content-Type': 'application/json' },
+                       [
+                               '{ "error": { "code": "bite-me", "info": "Smite me, O Mighty Smiter" } }',
+                               '{ "tokens": { "testerrortoken": "good" } }'
+                       ]
+               ) );
+
                // Don't cache error (bug 65268)
-               api.getToken( 'testaction2' )
-                       .fail( function ( err ) {
-                               assert.equal( err, 'bite-me', 'Expected error' );
-                       } )
-                       .always( function () {
-                               // Make this request after the first one has finished.
-                               // If we make it simultaneously we still want it to share
-                               // the cache, but as soon as it is fulfilled as error we
-                               // reject it so that the next one tries fresh.
-                               api.getToken( 'testaction2' )
-                                       .done( function ( token ) {
-                                               assert.ok( token.length, 'Got testaction2 token (error was not be cached)' );
-                                       } )
-                                       .fail( function ( err ) {
-                                               assert.equal( err, '', 'API error' );
-                                       } );
-
-                               assert.equal( test.server.requests.length, 3, 'Requests made' );
-
-                               test.server.requests[2].respond( 200, { 'Content-Type': 'application/json' },
-                                       '{ "tokens": { "testaction2token": "0123abc" } }'
-                               );
+               api.getToken( 'testerror' ).fail( function ( err ) {
+                       assert.equal( err, 'bite-me', 'Expected error' );
+
+                       // Make this request after the first one has finished.
+                       // If we make it simultaneously we still want it to share
+                       // the cache, but as soon as it is fulfilled as error we
+                       // reject it so that the next one tries fresh.
+                       api.getToken( 'testerror' ).done( function ( token ) {
+                               assert.equal( token, 'good', 'The token' );
                        } );
+               } );
+       } );
 
-               this.server.requests[0].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "tokens": { "testactiontoken": "0123abc" } }'
-               );
+       QUnit.test( 'badToken()', function ( assert ) {
+               QUnit.expect( 2 );
+               var api = new mw.Api(),
+                       test = this;
+
+               this.server.respondWith( /type=testbad/, sequenceBodies( 200, { 'Content-Type': 'application/json' },
+                       [
+                               '{ "tokens": { "testbadtoken": "bad" } }',
+                               '{ "tokens": { "testbadtoken": "good" } }'
+                       ]
+               ) );
+
+               api.getToken( 'testbad' )
+                       .then( function () {
+                               api.badToken( 'testbad' );
+                               return api.getToken( 'testbad' );
+                       } )
+                       .then( function ( token ) {
+                               assert.equal( token, 'good', 'The token' );
+                               assert.equal( test.server.requests.length, 2, 'Requests made' );
+                       } );
 
-               this.server.requests[1].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "error": { "code": "bite-me", "info": "Smite me, O Mighty Smiter" } }'
-               );
        } );
 
        QUnit.test( 'postWithToken( tokenType, params )', function ( assert ) {
                QUnit.expect( 1 );
-
                var api = new mw.Api( { ajax: { url: '/postWithToken/api.php' } } );
 
-               // - Requests token
-               // - Performs action=example
-               api.postWithToken( 'testsimpletoken', { action: 'example', key: 'foo' } )
+               this.server.respondWith( 'GET', /type=testpost/, [ 200, { 'Content-Type': 'application/json' },
+                       '{ "tokens": { "testposttoken": "good" } }'
+               ] );
+               this.server.respondWith( 'POST', /api/, function ( request ) {
+                       if ( request.requestBody.match( /token=good/ ) ) {
+                               request.respond( 200, { 'Content-Type': 'application/json' },
+                                       '{ "example": { "foo": "quux" } }'
+                               );
+                       }
+               } );
+
+               api.postWithToken( 'testpost', { action: 'example', key: 'foo' } )
                        .done( function ( data ) {
                                assert.deepEqual( data, { example: { foo: 'quux' } } );
                        } );
-
-               this.server.requests[0].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "tokens": { "testsimpletokentoken": "a-bad-token" } }'
-               );
-
-               this.server.requests[1].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "example": { "foo": "quux" } }'
-               );
        } );
 
        QUnit.test( 'postWithToken( tokenType, params with assert )', function ( assert ) {
                QUnit.expect( 2 );
-
                var api = new mw.Api( { ajax: { url: '/postWithToken/api.php' } } );
 
-               api.postWithToken( 'testasserttoken', { action: 'example', key: 'foo', assert: 'user' } )
+               this.server.respondWith( /assert=user/, [ 200, { 'Content-Type': 'application/json' },
+                       '{ "error": { "code": "assertuserfailed", "info": "Assertion failed" } }'
+               ] );
+
+               api.postWithToken( 'testassertpost', { action: 'example', key: 'foo', assert: 'user' } )
                        .fail( function ( errorCode ) {
                                assert.equal( errorCode, 'assertuserfailed', 'getToken fails assert' );
                        } );
 
-               assert.equal( this.server.requests.length, 1, 'Request for token made' );
-               this.server.respondWith( /assert=user/, function ( request ) {
-                       request.respond(
-                               200,
-                               { 'Content-Type': 'application/json' },
-                               '{ "error": { "code": "assertuserfailed", "info": "Assertion failed" } }'
-                       );
-               } );
-
-               this.server.respond();
+               assert.equal( this.server.requests.length, 1, 'Requests made' );
        } );
 
        QUnit.test( 'postWithToken( tokenType, params, ajaxOptions )', function ( assert ) {
                QUnit.expect( 3 );
-
                var api = new mw.Api();
 
+               this.server.respond( [ 200, { 'Content-Type': 'application/json' }, '{ "example": "quux" }' ] );
+
                api.postWithToken(
                        'edit',
                        {
 
                assert.equal( this.server.requests.length, 2, 'Request made' );
                assert.equal( this.server.requests[0].requestHeaders['X-Foo'], 'Bar', 'Header sent' );
-
-               this.server.respond( function ( request ) {
-                       request.respond( 200, { 'Content-Type': 'application/json' }, '{ "example": "quux" }' );
-               } );
        } );
 
        QUnit.test( 'postWithToken() - badtoken', function ( assert ) {
                QUnit.expect( 1 );
-
                var api = new mw.Api();
 
-               // - Request: token
+               this.server.respondWith( /type=testbadtoken/, sequenceBodies( 200, { 'Content-Type': 'application/json' },
+                       [
+                               '{ "tokens": { "testbadtokentoken": "bad" } }',
+                               '{ "tokens": { "testbadtokentoken": "good" } }'
+                       ]
+               ) );
+               this.server.respondWith( 'POST', /api/, function ( request ) {
+                       if ( request.requestBody.match( /token=bad/ ) ) {
+                               request.respond( 200, { 'Content-Type': 'application/json' },
+                                       '{ "error": { "code": "badtoken" } }'
+                               );
+                       }
+                       if ( request.requestBody.match( /token=good/ ) ) {
+                               request.respond( 200, { 'Content-Type': 'application/json' },
+                                       '{ "example": { "foo": "quux" } }'
+                               );
+                       }
+               } );
+
+               // - Request: new token -> bad
                // - Request: action=example -> badtoken error
-               // - Request: new token
-               // - Request: action=example
+               // - Request: new token -> good
+               // - Request: action=example -> success
                api.postWithToken( 'testbadtoken', { action: 'example', key: 'foo' } )
                        .done( function ( data ) {
                                assert.deepEqual( data, { example: { foo: 'quux' } } );
                        } );
-
-               this.server.requests[0].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "tokens": { "testbadtokentoken": "a-bad-token" } }'
-               );
-
-               this.server.requests[1].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "error": { "code": "badtoken" } }'
-               );
-
-               this.server.requests[2].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "tokens": { "testbadtokentoken": "a-good-token" } }'
-               );
-
-               this.server.requests[3].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "example": { "foo": "quux" } }'
-               );
-
        } );
 
        QUnit.test( 'postWithToken() - badtoken-cached', function ( assert ) {
                QUnit.expect( 2 );
+               var sequenceA,
+                       api = new mw.Api();
 
-               var api = new mw.Api();
+               this.server.respondWith( /type=testonce/, sequenceBodies( 200, { 'Content-Type': 'application/json' },
+                       [
+                               '{ "tokens": { "testoncetoken": "good-A" } }',
+                               '{ "tokens": { "testoncetoken": "good-B" } }'
+                       ]
+               ) );
+               sequenceA = sequenceBodies( 200, { 'Content-Type': 'application/json' },
+                       [
+                               '{ "example": { "value": "A" } }',
+                               '{ "error": { "code": "badtoken" } }'
+                       ]
+               );
+               this.server.respondWith( 'POST', /api/, function ( request ) {
+                       if ( request.requestBody.match( /token=good-A/ ) ) {
+                               sequenceA( request );
+                       } else if ( request.requestBody.match( /token=good-B/ ) ) {
+                               request.respond( 200, { 'Content-Type': 'application/json' },
+                                       '{ "example": { "value": "B" } }'
+                               );
+                       }
+               } );
 
-               // - Request: token
+               // - Request: new token -> A
                // - Request: action=example
-               api.postWithToken( 'testbadtokencache', { action: 'example', key: 'foo' } )
+               api.postWithToken( 'testonce', { action: 'example', key: 'foo' } )
                        .done( function ( data ) {
-                               assert.deepEqual( data, { example: { foo: 'quux' } } );
+                               assert.deepEqual( data, { example: { value: 'A' } } );
                        } );
 
-               // - Cache: Try previously cached token
-               // - Request: action=example -> badtoken error
-               // - Request: new token
-               // - Request: action=example
-               api.postWithToken( 'testbadtokencache', { action: 'example', key: 'bar' } )
+               // - Request: action=example w/ token A -> badtoken error
+               // - Request: new token -> B
+               // - Request: action=example w/ token B -> success
+               api.postWithToken( 'testonce', { action: 'example', key: 'bar' } )
                        .done( function ( data ) {
-                               assert.deepEqual( data, { example: { bar: 'quux' } } );
+                               assert.deepEqual( data, { example: { value: 'B' } } );
                        } );
-
-               this.server.requests[0].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "tokens": { "testbadtokencachetoken": "a-good-token-once" } }'
-               );
-
-               this.server.requests[1].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "example": { "foo": "quux" } }'
-               );
-
-               this.server.requests[2].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "error": { "code": "badtoken" } }'
-               );
-
-               this.server.requests[3].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "tokens": { "testbadtokencachetoken": "a-good-new-token" } }'
-               );
-
-               this.server.requests[4].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "example": { "bar": "quux" } }'
-               );
-
        } );
-
 }( mediaWiki ) );
diff --git a/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.upload.test.js b/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.upload.test.js
new file mode 100644 (file)
index 0000000..1afbd35
--- /dev/null
@@ -0,0 +1,34 @@
+( function ( mw, $ ) {
+       QUnit.module( 'mediawiki.api.upload', QUnit.newMwEnvironment( {} ) );
+
+       QUnit.test( 'Basic functionality', function ( assert ) {
+               QUnit.expect( 2 );
+               var api = new mw.Api();
+               assert.ok( api.upload );
+               // The below will return a rejected deferred, but that's OK.
+               assert.ok( api.upload() );
+       } );
+
+       QUnit.test( 'Set up iframe upload', function ( assert ) {
+               QUnit.expect( 5 );
+               var $iframe, $form, $input,
+                       api = new mw.Api();
+
+               this.sandbox.stub( api, 'getEditToken', function () {
+                       return $.Deferred().promise();
+               } );
+
+               api.uploadWithIframe( $( '<input>' )[0], { filename: 'Testing API upload.jpg' } );
+
+               $iframe = $( 'iframe' );
+               $form = $( 'form.mw-api-upload-form' );
+               $input = $form.find( 'input[name=filename]' );
+
+               assert.ok( $form.length > 0 );
+               assert.ok( $input.length > 0 );
+               assert.ok( $iframe.length > 0 );
+               assert.strictEqual( $form.prop( 'target' ), $iframe.prop( 'id' ) );
+               assert.strictEqual( $input.val(), 'Testing API upload.jpg' );
+       } );
+
+}( mediaWiki, jQuery ) );
index 77fecb3..c8f0011 100644 (file)
 
        } );
 
+       QUnit.asyncTest( 'mw.loader.implement( dependency with styles )', 4, function ( assert ) {
+               var $element = $( '<div class="mw-test-implement-e"></div>' ).appendTo( '#qunit-fixture' ),
+                       $element2 = $( '<div class="mw-test-implement-e2"></div>' ).appendTo( '#qunit-fixture' );
+
+               assert.notEqual(
+                       $element.css( 'float' ),
+                       'right',
+                       'style is clear'
+               );
+               assert.notEqual(
+                       $element2.css( 'float' ),
+                       'left',
+                       'style is clear'
+               );
+
+               mw.loader.register( [
+                       [ 'test.implement.e', '0', ['test.implement.e2']],
+                       [ 'test.implement.e2', '0' ]
+               ] );
+
+               mw.loader.implement(
+                       'test.implement.e',
+                       function () {
+                               assert.equal(
+                                       $element.css( 'float' ),
+                                       'right',
+                                       'Depending module\'s style is applied'
+                               );
+                               QUnit.start();
+                       },
+                       {
+                               'all': '.mw-test-implement-e { float: right; }'
+                       }
+               );
+
+               mw.loader.implement(
+                       'test.implement.e2',
+                       function () {
+                               assert.equal(
+                                       $element2.css( 'float' ),
+                                       'left',
+                                       'Dependency\'s style is applied'
+                               );
+                       },
+                       {
+                               'all': '.mw-test-implement-e2 { float: left; }'
+                       }
+               );
+
+               mw.loader.load( [
+                       'test.implement.e'
+               ] );
+       } );
+
        QUnit.test( 'mw.loader.implement( only scripts )', 1, function ( assert ) {
                mw.loader.implement( 'test.onlyscripts', function () {} );
                assert.strictEqual( mw.loader.getState( 'test.onlyscripts' ), 'ready' );
index 8a3e100..b73d2e3 100644 (file)
@@ -92,7 +92,7 @@
                assert.equal( mw.util.rawurlencode( 'Test:A & B/Here' ), 'Test%3AA%20%26%20B%2FHere' );
        } );
 
-       QUnit.test( 'wikiUrlencode', 10, function ( assert ) {
+       QUnit.test( 'wikiUrlencode', 11, function ( assert ) {
                assert.equal( mw.util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' );
                // See also wfUrlencodeTest.php#provideURLS
                $.each( {
                        ':': ':',
                        ';@$-_.!*': ';@$-_.!*',
                        '/': '/',
+                       '~': '~',
                        '[]': '%5B%5D',
                        '<>': '%3C%3E',
                        '\'': '%27'
index c4e690e..3b7ff43 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -301,9 +301,15 @@ function wfStreamThumb( array $params ) {
        // Stream the file if it exists already...
        $thumbPath = $img->getThumbPath( $thumbName );
        if ( $img->getRepo()->fileExists( $thumbPath ) ) {
+               $starttime = microtime( true );
                $success = $img->getRepo()->streamFile( $thumbPath, $headers );
+               $streamtime = microtime( true ) - $starttime;
+
                if ( !$success ) {
                        wfThumbError( 500, 'Could not stream the file' );
+               } else {
+                       RequestContext::getMain()->getStats()->timing( 'media.thumbnail.stream', $streamtime );
+                       wfDebugLog( 'thumbnailaccess', time() . ' ' . $thumbPath . ' ' . ob_get_length() . ' Streamed ' );
                }
                return;
        }
@@ -317,8 +323,8 @@ function wfStreamThumb( array $params ) {
                return;
        }
 
-       // Actually generate a new thumbnail
        list( $thumb, $errorMsg ) = wfGenerateThumbnail( $img, $params, $thumbName, $thumbPath );
+
        /** @var MediaTransformOutput|bool $thumb */
 
        // Check for thumbnail generation errors...
@@ -570,7 +576,7 @@ function wfThumbError( $status, $msg ) {
        } else {
                $debug = '';
        }
-       echo <<<EOT
+       $content = <<<EOT
 <!DOCTYPE html>
 <html><head>
 <meta charset="UTF-8" />
@@ -586,4 +592,6 @@ $debug
 </html>
 
 EOT;
+       header( 'Content-Length: ' . strlen( $content ) );
+       echo $content;
 }